diff --git a/dist/flipclock.js b/dist/flipclock.js index 72c76495..b435590c 100644 --- a/dist/flipclock.js +++ b/dist/flipclock.js @@ -1,4 +1,3 @@ -(function(l, i, v, e) { v = l.createElement(i); v.async = 1; v.src = '//' + (location.host || 'localhost').split(':')[0] + ':35730/livereload.js?snipver=1'; e = l.getElementsByTagName(i)[0]; e.parentNode.insertBefore(v, e)})(document, 'script'); (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : @@ -1076,13 +1075,13 @@ this.increment(instance); } - callback.call(this, fn); + callback.call(instance, fn); if (this.shouldStop(instance)) { instance.stop(); } - return this.emit('interval'); + return instance.emit('interval'); } /** * Determines if the clock should stop or not. @@ -3149,7 +3148,7 @@ }, { key: "format", value: function format(instance, value) { - var started = instance.timer.isRunning ? instance.timer.started : new Date(Date.now() - 50); + var started = instance.timer.isRunning ? instance.timer.started : new Date(); return [[this.getMinutes(value, started)], this.showSeconds ? [this.getSeconds(value, started)] : null].filter(noop); } }, { @@ -3208,8 +3207,8 @@ _createClass(HourCounter, [{ key: "format", value: function format(instance, value) { - var now = !instance.timer.started ? new Date() : value; - var originalValue = instance.originalValue || value; + var now = !instance.timer.started ? new Date() : instance.timer.started; + var originalValue = value || instance.originalValue; var a = !this.countdown ? now : originalValue; var b = !this.countdown ? originalValue : now; var data = [[this.getHours(a, b)], [this.getMinutes(a, b)]]; @@ -3271,7 +3270,7 @@ key: "format", value: function format(instance, value) { var now = !instance.started ? new Date() : value; - var originalValue = instance.originalValue || value; + var originalValue = value || instance.originalValue; var a = !this.countdown ? now : originalValue; var b = !this.countdown ? originalValue : now; var data = [[this.getDays(a, b)], [this.getHours(a, b)], [this.getMinutes(a, b)]]; @@ -3477,7 +3476,7 @@ key: "format", value: function format(instance, value) { var now = !instance.timer.started ? new Date() : value; - var originalValue = instance.originalValue || value; + var originalValue = value || instance.originalValue; var a = !this.countdown ? now : originalValue; var b = !this.countdown ? originalValue : now; var data = [[this.getWeeks(a, b)], [this.getDays(a, b)], [this.getHours(a, b)], [this.getMinutes(a, b)]]; @@ -3539,7 +3538,7 @@ key: "format", value: function format(instance, value) { var now = !instance.timer.started ? new Date() : value; - var originalValue = instance.originalValue || value; + var originalValue = value || instance.originalValue; var a = !this.countdown ? now : originalValue; var b = !this.countdown ? originalValue : now; var data = [[this.getYears(a, b)], [this.getWeeks(a, b)], [this.getDays(a, b)], [this.getHours(a, b)], [this.getMinutes(a, b)]]; @@ -4278,4 +4277,4 @@ return FlipClock$1; }))); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxpcGNsb2NrLmpzIiwic291cmNlcyI6WyIuLi9zcmMvanMvSGVscGVycy9GdW5jdGlvbnMuanMiLCIuLi9zcmMvanMvQ29tcG9uZW50cy9Db21wb25lbnQuanMiLCIuLi9zcmMvanMvSGVscGVycy9EaWdpdGl6ZS5qcyIsIi4uL3NyYy9qcy9IZWxwZXJzL1ZhbHVlLmpzIiwiLi4vc3JjL2pzL0NvbXBvbmVudHMvRmFjZVZhbHVlLmpzIiwiLi4vc3JjL2pzL0hlbHBlcnMvVmFsaWRhdGUuanMiLCIuLi9zcmMvanMvQ29uZmlnL0NvbnNvbGVNZXNzYWdlcy5qcyIsIi4uL3NyYy9qcy9Db21wb25lbnRzL0ZhY2UuanMiLCIuLi9zcmMvanMvTGFuZ3VhZ2VzL2FyLWFyLmpzIiwiLi4vc3JjL2pzL0xhbmd1YWdlcy9jYS1lcy5qcyIsIi4uL3NyYy9qcy9MYW5ndWFnZXMvY3MtY3ouanMiLCIuLi9zcmMvanMvTGFuZ3VhZ2VzL2RhLWRrLmpzIiwiLi4vc3JjL2pzL0xhbmd1YWdlcy9kZS1kZS5qcyIsIi4uL3NyYy9qcy9MYW5ndWFnZXMvZW4tdXMuanMiLCIuLi9zcmMvanMvTGFuZ3VhZ2VzL2VzLWVzLmpzIiwiLi4vc3JjL2pzL0xhbmd1YWdlcy9mYS1pci5qcyIsIi4uL3NyYy9qcy9MYW5ndWFnZXMvZmktZmkuanMiLCIuLi9zcmMvanMvTGFuZ3VhZ2VzL2ZyLWNhLmpzIiwiLi4vc3JjL2pzL0xhbmd1YWdlcy9oZS1pbC5qcyIsIi4uL3NyYy9qcy9MYW5ndWFnZXMvaHUtaHUuanMiLCIuLi9zcmMvanMvTGFuZ3VhZ2VzL2l0LWl0LmpzIiwiLi4vc3JjL2pzL0xhbmd1YWdlcy9qYS1qcC5qcyIsIi4uL3NyYy9qcy9MYW5ndWFnZXMva28ta3IuanMiLCIuLi9zcmMvanMvTGFuZ3VhZ2VzL2x2LWx2LmpzIiwiLi4vc3JjL2pzL0xhbmd1YWdlcy9ubC1iZS5qcyIsIi4uL3NyYy9qcy9MYW5ndWFnZXMvbm8tbmIuanMiLCIuLi9zcmMvanMvTGFuZ3VhZ2VzL3BsLXBsLmpzIiwiLi4vc3JjL2pzL0xhbmd1YWdlcy9wdC1ici5qcyIsIi4uL3NyYy9qcy9MYW5ndWFnZXMvcm8tcm8uanMiLCIuLi9zcmMvanMvTGFuZ3VhZ2VzL3J1LXJ1LmpzIiwiLi4vc3JjL2pzL0xhbmd1YWdlcy9zay1zay5qcyIsIi4uL3NyYy9qcy9MYW5ndWFnZXMvc3Ytc2UuanMiLCIuLi9zcmMvanMvTGFuZ3VhZ2VzL3RoLXRoLmpzIiwiLi4vc3JjL2pzL0xhbmd1YWdlcy90ci10ci5qcyIsIi4uL3NyYy9qcy9MYW5ndWFnZXMvdWEtdWEuanMiLCIuLi9zcmMvanMvTGFuZ3VhZ2VzL3ZuLXZuLmpzIiwiLi4vc3JjL2pzL0xhbmd1YWdlcy96aC1jbi5qcyIsIi4uL3NyYy9qcy9MYW5ndWFnZXMvemgtdHcuanMiLCIuLi9zcmMvanMvTGFuZ3VhZ2VzL2luZGV4LmpzIiwiLi4vc3JjL2pzL0hlbHBlcnMvTGFuZ3VhZ2UuanMiLCIuLi9zcmMvanMvSGVscGVycy9UcmFuc2xhdGUuanMiLCIuLi9zcmMvanMvSGVscGVycy9UZW1wbGF0ZS5qcyIsIi4uL3NyYy9qcy9Db21wb25lbnRzL0RvbUNvbXBvbmVudC5qcyIsIi4uL3NyYy9qcy9Db21wb25lbnRzL0RpdmlkZXIuanMiLCIuLi9zcmMvanMvQ29tcG9uZW50cy9MaXN0SXRlbS5qcyIsIi4uL3NyYy9qcy9Db21wb25lbnRzL0xpc3QuanMiLCIuLi9zcmMvanMvQ29tcG9uZW50cy9Hcm91cC5qcyIsIi4uL3NyYy9qcy9Db21wb25lbnRzL0xhYmVsLmpzIiwiLi4vc3JjL2pzL0NvbXBvbmVudHMvVGltZXIuanMiLCIuLi9zcmMvanMvRmFjZXMvQ291bnRlci5qcyIsIi4uL3NyYy9qcy9GYWNlcy9NaW51dGVDb3VudGVyLmpzIiwiLi4vc3JjL2pzL0ZhY2VzL0hvdXJDb3VudGVyLmpzIiwiLi4vc3JjL2pzL0ZhY2VzL0RheUNvdW50ZXIuanMiLCIuLi9zcmMvanMvRmFjZXMvVHdlbnR5Rm91ckhvdXJDbG9jay5qcyIsIi4uL3NyYy9qcy9GYWNlcy9Ud2VsdmVIb3VyQ2xvY2suanMiLCIuLi9zcmMvanMvRmFjZXMvV2Vla0NvdW50ZXIuanMiLCIuLi9zcmMvanMvRmFjZXMvWWVhckNvdW50ZXIuanMiLCIuLi9zcmMvanMvRmFjZXMvaW5kZXguanMiLCIuLi9zcmMvanMvVGhlbWVzL09yaWdpbmFsL0RpdmlkZXIuanMiLCIuLi9zcmMvanMvVGhlbWVzL09yaWdpbmFsL0ZsaXBDbG9jay5qcyIsIi4uL3NyYy9qcy9UaGVtZXMvT3JpZ2luYWwvR3JvdXAuanMiLCIuLi9zcmMvanMvVGhlbWVzL09yaWdpbmFsL0xhYmVsLmpzIiwiLi4vc3JjL2pzL1RoZW1lcy9PcmlnaW5hbC9MaXN0LmpzIiwiLi4vc3JjL2pzL1RoZW1lcy9PcmlnaW5hbC9MaXN0SXRlbS5qcyIsIi4uL3NyYy9qcy9UaGVtZXMvT3JpZ2luYWwvRmFjZXMvRGF5Q291bnRlci5qcyIsIi4uL3NyYy9qcy9UaGVtZXMvT3JpZ2luYWwvRmFjZXMvSG91ckNvdW50ZXIuanMiLCIuLi9zcmMvanMvVGhlbWVzL09yaWdpbmFsL0ZhY2VzL01pbnV0ZUNvdW50ZXIuanMiLCIuLi9zcmMvanMvVGhlbWVzL09yaWdpbmFsL0ZhY2VzL1R3ZW50eUZvdXJIb3VyQ2xvY2suanMiLCIuLi9zcmMvanMvVGhlbWVzL09yaWdpbmFsL0ZhY2VzL1R3ZWx2ZUhvdXJDbG9jay5qcyIsIi4uL3NyYy9qcy9UaGVtZXMvT3JpZ2luYWwvRmFjZXMvV2Vla0NvdW50ZXIuanMiLCIuLi9zcmMvanMvVGhlbWVzL09yaWdpbmFsL0ZhY2VzL1llYXJDb3VudGVyLmpzIiwiLi4vc3JjL2pzL1RoZW1lcy9PcmlnaW5hbC9pbmRleC5qcyIsIi4uL3NyYy9qcy9Db25maWcvRGVmYXVsdFZhbHVlcy5qcyIsIi4uL3NyYy9qcy9Db21wb25lbnRzL0ZsaXBDbG9jay5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZXNlIGFyZSBhIGNvbGxlY3Rpb24gb2YgaGVscGVyIGZ1bmN0aW9ucywgc29tZSBib3Jyb3dlZCBmcm9tIExvZGFzaCxcbiAqIFVuZGVyc2NvcmUsIGV0YywgdG8gcHJvdmlkZSBjb21tb24gZnVuY3Rpb25hbGl0eSB3aXRob3V0IHRoZSBuZWVkIGZvciB1c2luZ1xuICogYSBkZXBlbmRlbmN5LiBBbGwgb2YgdGhpcyBpcyBhbiBhdHRlbXB0IHRvIHJlZHVjZSB0aGUgZmlsZSBzaXplIG9mIHRoZVxuICogbGlicmFyeS5cbiAqXG4gKiBAbmFtZXNwYWNlIEhlbHBlcnMuRnVuY3Rpb25zXG4gKi9cblxuLyoqXG4gKiBUaHJvdyBhIHN0cmluZyBhcyBhbiBFcnJvciBleGNlcHRpb24uXG4gKlxuICogQGZ1bmN0aW9uIGVycm9yXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHN0cmluZyAtIFRoZSBlcnJvciBtZXNzYWdlLlxuICogQHJldHVybiB7dm9pZH1cbiAqIEBtZW1iZXJvZiBIZWxwZXJzLkZ1bmN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3Ioc3RyaW5nKSB7XG4gICAgdGhyb3cgRXJyb3Ioc3RyaW5nKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgZm5gIGlzIGEgZnVuY3Rpb24sIGFuZCBjYWxsIGl0IHdpdGggYHRoaXNgIGNvbnRleHQgYW5kIHBhc3MgdGhlXG4gKiBhcmd1bWVudHMuXG4gKlxuICogQGZ1bmN0aW9uIGNhbGxiYWNrXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHN0cmluZyAtIFRoZSBjYWxsYmFjayBmbi5cbiAqIEBwYXJhbSAgey4uLip9IGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MuXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQG1lbWJlcm9mIEhlbHBlcnMuRnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxsYmFjayhmbiwgLi4uYXJncykge1xuICAgIGlmKGlzRnVuY3Rpb24oZm4pKSB7XG4gICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSb3VuZCB0aGUgdmFsdWUgdG8gdGhlIGNvcnJlY3QgdmFsdWUuIFRha2VzIGludG8gYWNjb3VudCBuZWdhdGl2ZSBudW1iZXJzLlxuICpcbiAqIEBmdW5jdGlvbiByb3VuZFxuICogQHBhcmFtICB7dmFsdWV9IHN0cmluZyAtIFRoZSB2YWx1ZSB0byByb3VuZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBUaGUgcm91bmRlZCB2YWx1ZS5cbiAqIEBtZW1iZXJvZiBIZWxwZXJzLkZ1bmN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcm91bmQodmFsdWUpIHtcbiAgICByZXR1cm4gaXNOZWdhdGl2ZVplcm8oXG4gICAgICAgIHZhbHVlID0gaXNOZWdhdGl2ZSh2YWx1ZSkgPyBNYXRoLmNlaWwodmFsdWUpIDogTWF0aC5mbG9vcih2YWx1ZSlcbiAgICApID8gKCctJyArIHZhbHVlKS50b1N0cmluZygpIDogdmFsdWU7XG59XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgYHVuZGVmaW5lZCBvciBgbnVsbGAuXG4gKlxuICogQGZ1bmN0aW9uIG5vb3BcbiAqIEBwYXJhbSAge3ZhbHVlfSBzdHJpbmcgLSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiBgdW5kZWZpbmVkIG9yIGBudWxsYC5cbiAqIEBtZW1iZXJvZiBIZWxwZXJzLkZ1bmN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbm9vcCh2YWx1ZSkge1xuICAgIHJldHVybiAhaXNVbmRlZmluZWQodmFsdWUpICYmICFpc051bGwodmFsdWUpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBgYmVmb3JlYCBhdHRyaWJ1dGUgYW5kIHBhc3NlcyB0aGF0IHZhbHVlXG4gKiB0byBgYWZ0ZXJgIGFuZCB0aGUgc3Vic2VxdWVudCB2YWx1ZSBpcyByZXR1cm5lZC5cbiAqXG4gKiBAZnVuY3Rpb24gY2hhaW5cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBiZWZvcmUgLSBUaGUgZmlyc3QgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBhZnRlciAtIFRoZSBzdWJzZXF1ZW50IGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gLSBBIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgdGhlIGNoYWluLlxuICogQG1lbWJlcm9mIEhlbHBlcnMuRnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbihiZWZvcmUsIGFmdGVyKSB7XG4gICAgcmV0dXJuICgpID0+IGFmdGVyKGJlZm9yZSgpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIG1hcHMgdGhlIHZhbHVlcyBiZWZvcmUgY29uY2F0ZW5hdGluZyB0aGVtLlxuICpcbiAqIEBmdW5jdGlvbiBjb25jYXRNYXBcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBmbiAtIFRoZSBtYXAgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gLSBBIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgdGhlIG1hcCBhbmQgY29uY2F0ZW5hdGlvbi5cbiAqIEBtZW1iZXJvZiBIZWxwZXJzLkZ1bmN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0TWFwKGZuKSB7XG4gICAgcmV0dXJuIHggPT4ge1xuICAgICAgICByZXR1cm4geC5tYXAoZm4pLnJlZHVjZSgoeCwgeSkgPT4geC5jb25jYXQoeSksIFtdKTtcbiAgICB9XG59XG5cbi8qKlxuICogRmxhdHRlbiBhbiBhcnJheS5cbiAqXG4gKiBAZnVuY3Rpb24gZmxhdHRlblxuICogQHBhcmFtICB7YXJyYXl9IHZhbHVlIC0gVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcmV0dXJuIHthcnJheX0gLSBUaGUgZmxhdHRlbmVkIGFycmF5LlxuICogQG1lbWJlcm9mIEhlbHBlcnMuRnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKHZhbHVlKSB7XG4gICAgcmV0dXJuIGNvbmNhdE1hcCh2YWx1ZSA9PiB2YWx1ZSkodmFsdWUpXG59XG5cbi8qKlxuICogRGVlcCBmbGF0dGVuIGFuIGFycmF5LlxuICpcbiAqIEBmdW5jdGlvbiBkZWVwRmxhdHRlblxuICogQHBhcmFtICB7YXJyYXl9IHZhbHVlIC0gVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcmV0dXJuIHthcnJheX0gLSBUaGUgZmxhdHRlbmVkIGFycmF5LlxuICogQG1lbWJlcm9mIEhlbHBlcnMuRnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRmxhdHRlbih4KSB7XG4gICAgcmV0dXJuIGNvbmNhdE1hcCh4ID0+IEFycmF5LmlzQXJyYXkoeCkgPyBkZWVwRmxhdHRlbiAoeCkgOiB4KSh4KTtcbn1cblxuLyoqXG4gKiBDYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIgaW4gYSBzdHJpbmcuXG4gKlxuICogQGZ1bmN0aW9uIHVjZmlyc3RcbiAqIEBwYXJhbSAge3N0cmluZ30gc3RyaW5nIC0gVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLlxuICogQHJldHVybiB7c3RyaW5nfSAtIFRoZSBjYXBpdGFsaXplZCBzdHJpbmcuXG4gKiBAbWVtYmVyb2YgSGVscGVycy5GdW5jdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVjZmlyc3Qoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgYSBkZWVwIGZsYXR0ZW4gYXJyYXkuXG4gKlxuICogQGZ1bmN0aW9uIGxlbmd0aFxuICogQHBhcmFtICB7YXJyYXl9IHZhbHVlIC0gVGhlIGFycmF5IHRvIGNvdW50LlxuICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBsZW5ndGggb2YgdGhlIGRlZXAgZmxhdHRlbmVkIGFycmF5LlxuICogQG1lbWJlcm9mIEhlbHBlcnMuRnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGgodmFsdWUpIHtcbiAgICByZXR1cm4gZGVlcEZsYXR0ZW4odmFsdWUpLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGEgdmFsdWUgaXMgYSBuZWdhdGl2ZSB6ZXJvLlxuICpcbiAqIEBmdW5jdGlvbiBpc05lZ2F0aXZlWmVyb1xuICogQHBhcmFtICB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IC0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGlzIGEgbmVnYXRpdmUgemVybyAoYC0wYCkuXG4gKiBAbWVtYmVyb2YgSGVscGVycy5GdW5jdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTmVnYXRpdmVaZXJvKHZhbHVlKSB7XG4gICAgcmV0dXJuIDEgLyBNYXRoLnJvdW5kKHZhbHVlKSA9PT0gLUluZmluaXR5O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSB2YWx1ZSBpcyBhIG5lZ2F0aXZlLlxuICpcbiAqIEBmdW5jdGlvbiBpc05lZ2F0aXZlXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybiB7Ym9vbGVhbn0gLSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYSBuZWdhdGl2ZS5cbiAqIEBtZW1iZXJvZiBIZWxwZXJzLkZ1bmN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOZWdhdGl2ZSh2YWx1ZSkge1xuICAgIHJldHVybiBpc05lZ2F0aXZlWmVybyh2YWx1ZSkgfHwgdmFsdWUgPCAwO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSB2YWx1ZSBpcyBgbnVsbGAuXG4gKlxuICogQGZ1bmN0aW9uIGlzTnVsbFxuICogQHBhcmFtICB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtib29sZWFufSAtIFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBhIGBudWxsYC5cbiAqIEBtZW1iZXJvZiBIZWxwZXJzLkZ1bmN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsOy8vIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bGwnO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSB2YWx1ZSBpcyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAZnVuY3Rpb24gaXNOdWxsXG4gKiBAcGFyYW0gIHsqfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IC0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGlzIGEgYHVuZGVmaW5lZGAuXG4gKiBAbWVtYmVyb2YgSGVscGVycy5GdW5jdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIHZhbHVlIGlzIGEgY29uc3RydWN0b3IuXG4gKlxuICogQGZ1bmN0aW9uIGlzQ29uc3RydWN0b3JcbiAqIEBwYXJhbSAgeyp9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybiB7Ym9vbGVhbn0gLSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYSBjb25zdHJ1Y3Rvci5cbiAqIEBtZW1iZXJvZiBIZWxwZXJzLkZ1bmN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikgJiYgISF2YWx1ZS5uYW1lO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZy5cbiAqXG4gKiBAZnVuY3Rpb24gaXNTdHJpbmdcbiAqIEBwYXJhbSAgeyp9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybiB7Ym9vbGVhbn0gLSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmcuXG4gKiBAbWVtYmVyb2YgSGVscGVycy5GdW5jdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIHZhbHVlIGlzIGEgYXJyYXkuXG4gKlxuICogQGZ1bmN0aW9uIGlzU3RyaW5nXG4gKiBAcGFyYW0gIHsqfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IC0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLlxuICogQG1lbWJlcm9mIEhlbHBlcnMuRnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgQXJyYXk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIHZhbHVlIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAZnVuY3Rpb24gaXNPYmplY3RcbiAqIEBwYXJhbSAgeyp9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybiB7Ym9vbGVhbn0gLSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LlxuICogQG1lbWJlcm9mIEhlbHBlcnMuRnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgIWlzQXJyYXkodmFsdWUpICYmIChcbiAgICAgICAgdHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbidcbiAgICApO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSB2YWx1ZSBpcyBhIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpc09iamVjdFxuICogQHBhcmFtICB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtib29sZWFufSAtIFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uLlxuICogQG1lbWJlcm9mIEhlbHBlcnMuRnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb247XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIHZhbHVlIGlzIGEgbnVtYmVyLlxuICpcbiAqIEBmdW5jdGlvbiBpc09iamVjdFxuICogQHBhcmFtICB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtib29sZWFufSAtIFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEBtZW1iZXJvZiBIZWxwZXJzLkZ1bmN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gIWlzTmFOKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyBpbnRvIGtlYmFiIGNhc2UuXG4gKlxuICogQGZ1bmN0aW9uIGtlYmFiQ2FzZVxuICogQHBhcmFtICB7c3RyaW5nfSBzdHJpbmcgLSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gVGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAbWVtYmVyb2YgSGVscGVycy5GdW5jdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGtlYmFiQ2FzZShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMS0kMicpLnJlcGxhY2UoL1xccysvZywgJy0nKS50b0xvd2VyQ2FzZSgpO1xufVxuIiwiaW1wb3J0IHsgY2hhaW4sIGVycm9yLCBjYWxsYmFjaywgaXNPYmplY3QsIGtlYmFiQ2FzZSB9IGZyb20gJy4uL0hlbHBlcnMvRnVuY3Rpb25zJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29tcG9uZW50IHtcblxuICAgIC8qKlxuICAgICAqIEFic3RyYWN0IGJhc2UgY2xhc3MuXG4gICAgICpcbiAgICAgKiBAY2xhc3MgQ29tcG9uZW50XG4gICAgICogQHBhcmFtIHsob2JqZWN0fHVuZGVmaW5lZCl9IFthdHRyaWJ1dGVzXSAtIFRoZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBldmVudHM6IHt9XG4gICAgICAgIH0sIGF0dHJpYnV0ZXMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGBuYW1lYCBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldCBuYW1lKCkge1xuICAgICAgICBpZighKHRoaXMuY29uc3RydWN0b3IuZGVmaW5lTmFtZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgZXJyb3IoJ0V2ZXJ5IGNsYXNzIG11c3QgZGVmaW5lIGl0cyBuYW1lLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuZGVmaW5lTmFtZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgZXZlbnRzYCBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqL1xuICAgIGdldCBldmVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRldmVudHMgfHwge307XG4gICAgfVxuXG4gICAgc2V0IGV2ZW50cyh2YWx1ZSkge1xuICAgICAgICB0aGlzLiRldmVudHMgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0IGFuIGV2ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBrZXkgLSBUaGUgZXZlbnQgaWQva2V5LlxuICAgICAqIEByZXR1cm4ge0NvbXBvbmVudH0gLSBSZXR1cm5zIGB0aGlzYCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBlbWl0KGtleSwgLi4uYXJncykge1xuICAgICAgICBpZih0aGlzLmV2ZW50c1trZXldKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50c1trZXldLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdGFydCBsaXN0ZW5pbmcgdG8gYW4gZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGtleSAtIFRoZSBldmVudCBpZC9rZXkuXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGZuIC0gVGhlIGxpc3RlbmVyIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSAge2Jvb2xlYW59IFtvbmNlPWZhbHNlXSAtIFNob3VsZCB0aGUgZXZlbnQgaGFuZGxlciBiZSBmaXJlZCBhXG4gICAgICogICAgIHNpbmdsZSB0aW1lLlxuICAgICAqIEByZXR1cm4ge0NvbXBvbmVudH0gLSBSZXR1cm5zIGB0aGlzYCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBvbihrZXksIGZuLCBvbmNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYoIXRoaXMuZXZlbnRzW2tleV0pIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzW2tleV0gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRzW2tleV0ucHVzaChmbik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcCBsaXN0ZW5pbmcgdG8gYW4gZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGV2ZW50IGlkL2tleS5cbiAgICAgKiBAcGFyYW0geyhGdW5jdGlvbnx1bmRlZmluZWQpfSBmbiAtIFRoZSBsaXN0ZW5lciBjYWxsYmFjayBmdW5jdGlvbi4gSWYgbm9cbiAgICAgKiAgICAgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYWxsIGV2ZW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgaWQva2V5IHdpbGwgYmVcbiAgICAgKiAgICAgcmVtb3ZlZC4gT3RoZXJ3aXNlLCBvbmx5IHRoZSBldmVudCBsaXN0ZW5lcnMgbWF0Y2hpbmcgdGhlIGlkL2tleSBBTkRcbiAgICAgKiAgICAgY2FsbGJhY2sgd2lsbCBiZSByZW1vdmVkLlxuICAgICAqIEByZXR1cm4ge0NvbXBvbmVudH0gLSBSZXR1cm5zIGB0aGlzYCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBvZmYoa2V5LCBmbikge1xuICAgICAgICBpZih0aGlzLmV2ZW50c1trZXldICYmIGZuKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50c1trZXldID0gdGhpcy5ldmVudHNba2V5XS5maWx0ZXIoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmVudCAhPT0gZm47XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzW2tleV0gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbiB0byBhbiBldmVudCBvbmx5IG9uZSB0aW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBrZXkgLSBUaGUgZXZlbnQgaWQva2V5LlxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiAtIFRoZSBsaXN0ZW5lciBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtDb21wb25lbnR9IC0gUmV0dXJucyBgdGhpc2AgaW5zdGFuY2UuXG4gICAgICovXG4gICAgb25jZShrZXksIGZuKSB7XG4gICAgICAgIGZuID0gY2hhaW4oZm4sICgpID0+IHRoaXMub2ZmKGtleSwgZm4pKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5vbihrZXksIGZuLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYW4gYXR0cmlidXRlLiBSZXR1cm5zIG51bGwgaWYgbm8gYXR0cmlidXRlIGlzIGRlZmluZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGtleSAtIFRoZSBhdHRyaWJ1dGUgbmFtZS5cbiAgICAgKiBAcmV0dXJuIHsqfSAtIFRoZSBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICovXG4gICAgZ2V0QXR0cmlidXRlKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpID8gdGhpc1trZXldIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIHRoZSBhdHR0cmlidXRlcyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge29iamVjdH0gLSBUaGUgYXR0cmlidXRlIGRpY3Rpb25hcnkuXG4gICAgICovXG4gICAgZ2V0QXR0cmlidXRlcygpIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHt9O1xuXG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXNba2V5XSA9IHRoaXMuZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBvbmx5IHB1YmxpYyB0aGUgYXR0dHJpYnV0ZXMgZm9yIHRoaXMgaW5zdGFuY2UuIE9taXRzIGFueSBhdHRyaWJ1dGVcbiAgICAgKiB0aGF0IHN0YXJ0cyB3aXRoIGAkYCwgd2hpY2ggaXMgdXNlZCBpbnRlcm5hbGx5LlxuICAgICAqXG4gICAgICogQHJldHVybiB7b2JqZWN0fSAtIFRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeS5cbiAgICAgKi9cbiAgICBnZXRQdWJsaWNBdHRyaWJ1dGVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5nZXRBdHRyaWJ1dGVzKCkpXG4gICAgICAgICAgICAuZmlsdGVyKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFrZXkubWF0Y2goL15cXCQvKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucmVkdWNlKChvYmosIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIG9ialtrZXldID0gdGhpcy5nZXRBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBhbiBhdHRyaWJ1dGUga2V5IGFuZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30ga2V5IC0gVGhlIGF0dHJpYnV0ZSBuYW1lLlxuICAgICAqIEBwYXJhbSAgeyp9IHZhbHVlIC0gVGhlIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICAqL1xuICAgIHNldEF0dHJpYnV0ZShrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmKGlzT2JqZWN0KGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlcyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpc1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYW4gYXR0cmlidXRlcyBieSBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7b2JqZWN0fSB2YWx1ZXMgLSBUaGUgb2JqZWN0IGRpY3Rpb25hcnkuXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKi9cbiAgICBzZXRBdHRyaWJ1dGVzKHZhbHVlcykge1xuICAgICAgICBmb3IoY29uc3QgaSBpbiB2YWx1ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGksIHZhbHVlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGV4ZWN1dGUgdGhlIGBjYWxsYmFjaygpYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgdGhlIGV4ZWN1dGVkIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGNhbGxiYWNrKGZuKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIGZuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGYWN0b3IgbWV0aG9kIHRvIHN0YXRpYyBpbnN0YW50aWF0ZSBuZXcgaW5zdGFuY2VzLiBVc2VmdWwgZm9yIHdyaXRpbmdcbiAgICAgKiBjbGVhbiBleHByZXNzaXZlIHN5bnRheCB3aXRoIGNoYWluZWQgbWV0aG9kcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAgey4uLip9IGFyZ3MgLSBUaGUgY2FsbGJhY2sgYXJndW1lbnRzLlxuICAgICAqIEByZXR1cm4geyp9IC0gVGhlIG5ldyBjb21wb25lbnQgaW5zdGFuY2UuXG4gICAgICovXG4gICAgc3RhdGljIG1ha2UoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgfVxuXG59XG4iLCIvKipcbiAqIEBuYW1lc3BhY2UgSGVscGVycy5EaWdpdGl6ZVxuICovXG5pbXBvcnQgeyBmbGF0dGVuIH0gZnJvbSAnLi9GdW5jdGlvbnMnO1xuaW1wb3J0IHsgZGVlcEZsYXR0ZW4gfSBmcm9tICcuL0Z1bmN0aW9ucyc7XG5cbi8qKlxuICogRGlnaXRpemUgYSBudW1iZXIsIHN0cmluZywgb3IgYW4gYXJyYXkgaW50byBhIGRpZ2l0aXplZCBhcnJheS4gVGhpcyBmdW5jdGlvblxuICogdXNlIGJ5IHRoZSBgRmFjZWAsIHdoaWNoIGNvbnZlcnQgdGhlIGRpZ2l0aXplZCBhcnJheSBpbnRvIGFuIGFycmF5IG9mIGBMaXN0YFxuICogaW5zdGFuY2VzLlxuICpcbiAqIEBmdW5jdGlvbiBkaWdpdGl6ZVxuICogQHBhcmFtICB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZGlnaXRpemUuXG4gKiBAcGFyYW0gIHsoT2JqZWN0fHVuZGVmaW5lZCl9IFtvcHRpb25zXSAtIFRoZSBkaWdpdGl6ZXIgb3B0aW9ucy5cbiAqIEByZXR1cm4ge2FycmF5fSAtIFRoZSBkaWdpdGl6ZWQgYXJyYXkuXG4gKiBAbWVtYmVyb2YgSGVscGVycy5EaWdpdGl6ZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkaWdpdGl6ZSh2YWx1ZSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgbWluaW11bURpZ2l0czogMCxcbiAgICAgICAgcHJlcGVuZExlYWRpbmdaZXJvOiB0cnVlXG4gICAgfSwgb3B0aW9ucyk7XG5cbiAgICBmdW5jdGlvbiBwcmVwZW5kKG51bWJlcikge1xuICAgICAgICBjb25zdCBzaG91bGRQcmVwZW5kWmVybyA9IG9wdGlvbnMucHJlcGVuZExlYWRpbmdaZXJvICYmXG4gICAgICAgICAgICBudW1iZXIudG9TdHJpbmcoKS5zcGxpdCgnJykubGVuZ3RoID09PSAxO1xuXG4gICAgICAgIHJldHVybiAoc2hvdWxkUHJlcGVuZFplcm8gPyAnMCcgOiAnJykuY29uY2F0KG51bWJlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGlnaXRzKGFyciwgbWluKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGRlZXBGbGF0dGVuKGFycikubGVuZ3RoO1xuXG4gICAgICAgIGlmKGxlbmd0aCA8IG1pbikge1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IG1pbiAtIGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJyWzBdLnVuc2hpZnQoJzAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpZ2l0cyhmbGF0dGVuKFt2YWx1ZV0pLm1hcChudW1iZXIgPT4ge1xuICAgICAgICByZXR1cm4gZmxhdHRlbihkZWVwRmxhdHRlbihbbnVtYmVyXSkubWFwKG51bWJlciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJlcGVuZChudW1iZXIpLnNwbGl0KCcnKTtcbiAgICAgICAgfSkpO1xuICAgIH0pLCBvcHRpb25zLm1pbmltdW1EaWdpdHMgfHwgMCk7XG59XG4iLCIvKipcbiAqIEBuYW1lc3BhY2UgSGVscGVycy5WYWx1ZVxuICovXG5cbi8qKlxuICogQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG1pbi9tYXggcmFuZ2VzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7YXJyYXl9XG4gKi9cbmNvbnN0IFJBTkdFUyA9IFt7XG4gICAgLy8gMC05XG4gICAgbWluOiA0OCxcbiAgICBtYXg6IDU3XG59LHtcbiAgICAvLyBhLXpcbiAgICBtaW46IDY1LFxuICAgIG1heDogOTBcbn0se1xuICAgIC8vIEEtWlxuICAgIG1pbjogOTcsXG4gICAgbWF4OiAxMjJcbn1dO1xuXG4vKipcbiAqIEZvcm1hdCBhIHN0cmluZyBpbnRvIGEgbmV3IGRhdGEgdHlwZS4gQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgc3RyaW5nIHRvXG4gKiBudW1iZXIgY29udmVyc2lvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGZvcm1hdFxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAtIFRoZSBzdHJpbmcgdG8gZm9ybWF0LlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgZGF0YSB0eXBlIChyZXByZXNlbnRlZCBhcyBhIHN0cmluZykgdXNlZCB0b1xuICogICAgIGNvbnZlcnQgdGhlIHN0cmluZy5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IC0gUmV0dXJucyB0aGUgZm9ybWF0dGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0KHN0cmluZywgdHlwZSkge1xuICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChzdHJpbmcpO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmluZCB0aGUgcmFuZ2Ugb2JqZWN0IGZyb20gdGhlIGBSQU5HRVNgIGNvbnN0YW50IGZyb20gdGhlIGNoYXJhY3RlciBnaXZlbi5cbiAqIFRoaXMgaXMgbWFpbmx5IGFuIGludGVydmFsIG1ldGhvZCwgYnV0IGNhbiBiZSB1c2VkIGJ5IGZhY2VzIHRvIGhlbHBcbiAqIGRldGVybWluZSB3aGF0IHRoZSBuZXh0IHZhbHVlIG9mIGEgc3RyaW5nIHNob3VsZCBiZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGZvcm1hdFxuICogQHBhcmFtIHtzdHJpbmd9IGNoYXIgLSBUaGUgY2hhciB1c2VkIHRvIGRldGVybWluZSB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBkYXRhIHR5cGUgKHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nKSB1c2VkIHRvXG4gKiAgICAgY29udmVydCB0aGUgc3RyaW5nLlxuICogQHJldHVybiB7Ym9vbGVhbn0gLSBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBmaW5kUmFuZ2UoY2hhcikge1xuICAgIGZvcihjb25zdCBpIGluIFJBTkdFUykge1xuICAgICAgICBjb25zdCBjb2RlID0gY2hhci50b1N0cmluZygpLmNoYXJDb2RlQXQoMCk7XG5cbiAgICAgICAgaWYoUkFOR0VTW2ldLm1pbiA8PSBjb2RlICYmIFJBTkdFU1tpXS5tYXggPj0gY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJBTkdFU1tpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN0cmluZyBmcm9tIGEgY2hhcmFjdGVyIGNvZGUsIHdoaWNoIGlzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjay5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhbGxiYWNrIHN0cmluZ0Zyb21DaGFyQ29kZUJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhciAtIFRoZSBjaGFyIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGZuIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHJlY2VpdmVzIGByYW5nZWAgYW5kIGBjb2RlYFxuICogICAgIGFyZ3VtZW50cy4gVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgY2hhcmFjdGVyIGNvZGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gQ3JlYXRlcyBhIHN0cmluZyBmcm9tIHRoZSBjaGFyYWN0ZXIgY29kZSByZXR1cm5lZCBieSB0aGVcbiAqICAgICBjYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nRnJvbUNoYXJDb2RlQnkoY2hhciwgZm4pIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgZm4oZmluZFJhbmdlKGNoYXIpLCBjaGFyLmNoYXJDb2RlQXQoMCkpXG4gICAgKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG5leHQgdmFsdWUgZm9yIGEgc3RyaW5nLiAnYScgYmVjb21lcyAnYicuICdBJyBiZWNvbWVzICdCJy4gMVxuICogYmVjb21lcyAyLCBldGMuIElmIG11bHRpcGxlIGNoYXJhY3RlciBzdHJpbmdzIGFyZSBwYXNzZWQsICdhYScgd291bGQgYmVjb21lXG4gKiAnYmInLlxuICpcbiAqIEBmdW5jdGlvbiBuZXh0XG4gKiBAcGFyYW0gIHsoc3RyaW5nfG51bWJlcil9IHZhbHVlIC0gVGhlIHN0cmluZyBvciBudW1iZXIgdG8gY29udmVydC5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIHN0cmluZ1xuICogQG1lbWJlcm9mIEhlbHBlcnMuVmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5leHQodmFsdWUpIHtcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSAodmFsdWUpXG4gICAgICAgIC50b1N0cmluZygpXG4gICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgLm1hcChjaGFyID0+IHN0cmluZ0Zyb21DaGFyQ29kZUJ5KGNoYXIsIChyYW5nZSwgY29kZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFyYW5nZSB8fCBjb2RlIDwgcmFuZ2UubWF4ID8gY29kZSArIDEgOiByYW5nZS5taW5cbiAgICAgICAgfSkpXG4gICAgICAgIC5qb2luKCcnKTtcblxuICAgIHJldHVybiBmb3JtYXQoY29udmVydGVkLCB0eXBlb2YgdmFsdWUpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgcHJldiB2YWx1ZSBmb3IgYSBzdHJpbmcuICdiJyBiZWNvbWVzICdhJy4gJ0InIGJlY29tZXMgJ0EnLiAyXG4gKiBiZWNvbWVzIDEsIDAgYmVjb21lcyA5LCBldGMuIElmIG11bHRpcGxlIGNoYXJhY3RlciBzdHJpbmdzIGFyZSBwYXNzZWQsICdiYidcbiAqIHdvdWxkIGJlY29tZSAnYWEnLlxuICpcbiAqIEBmdW5jdGlvbiBwcmV2XG4gKiBAcGFyYW0gIHsoc3RyaW5nfG51bWJlcil9IHZhbHVlIC0gVGhlIHN0cmluZyBvciBudW1iZXIgdG8gY29udmVydC5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIHN0cmluZ1xuICogQG1lbWJlcm9mIEhlbHBlcnMuVmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXYodmFsdWUpIHtcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSAodmFsdWUpXG4gICAgICAgIC50b1N0cmluZygpXG4gICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgLm1hcChjaGFyID0+IHN0cmluZ0Zyb21DaGFyQ29kZUJ5KGNoYXIsIChyYW5nZSwgY29kZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFyYW5nZSB8fCBjb2RlID4gcmFuZ2UubWluID8gY29kZSAtIDEgOiByYW5nZS5tYXhcbiAgICAgICAgfSkpXG4gICAgICAgIC5qb2luKCcnKTtcblxuICAgIHJldHVybiBmb3JtYXQoY29udmVydGVkLCB0eXBlb2YgdmFsdWUpO1xufVxuIiwiaW1wb3J0IENvbXBvbmVudCBmcm9tICcuL0NvbXBvbmVudCc7XG5pbXBvcnQgZGlnaXRpemUgZnJvbSAnLi4vSGVscGVycy9EaWdpdGl6ZSc7XG5pbXBvcnQgeyBuZXh0LCBwcmV2IH0gZnJvbSAnLi4vSGVscGVycy9WYWx1ZSc7XG5pbXBvcnQgeyBsZW5ndGgsIGlzT2JqZWN0LCBpc051bWJlciB9IGZyb20gJy4uL0hlbHBlcnMvRnVuY3Rpb25zJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmFjZVZhbHVlIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBgRmFjZVZhbHVlYCBjbGFzcyBoYW5kbGVzIGFsbCB0aGUgZGlnaXRpemluZyBmb3IgdGhlIGBGYWNlYC5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBGYWNlVmFsdWVcbiAgICAgKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIC0gVGhlIGBGYWNlVmFsdWVgJ3MgYWN0dWFsIHZhbHVlLiBNb3N0IGxpa2VseSBzaG91bGRcbiAgICAgKiAgICAgc3RyaW5nLCBudW1iZXIsIG9yIERhdGUuIEJ1dCBzaW5jZSB0aGUgRmFjZSBoYW5kbGVzIHRoZSB2YWx1ZSwgaXRcbiAgICAgKiAgICAgY291bGQgYmUgYW55dGhpbmcuXG4gICAgICogQHBhcmFtIHsob2JqZWN0fHVuZGVmaW5lZCl9IFthdHRyaWJ1dGVzXSAtIFRoZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlLCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgZm9ybWF0OiB2YWx1ZSA9PiB2YWx1ZSxcbiAgICAgICAgICAgIHByZXBlbmRMZWFkaW5nWmVybzogdHJ1ZSxcbiAgICAgICAgICAgIG1pbmltdW1EaWdpdHM6IDBcbiAgICAgICAgfSwgYXR0cmlidXRlcykpO1xuXG4gICAgICAgIGlmKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGRpZ2l0c2AgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQHR5cGUgeyhBcnJheXx1bmRlZmluZWQpfVxuICAgICAqL1xuICAgIGdldCBkaWdpdHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRkaWdpdHM7XG4gICAgfVxuXG4gICAgc2V0IGRpZ2l0cyh2YWx1ZSkge1xuICAgICAgICB0aGlzLiRkaWdpdHMgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5taW5pbXVtRGlnaXRzID0gTWF0aC5tYXgodGhpcy5taW5pbXVtRGlnaXRzLCBsZW5ndGgodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYHZhbHVlYCBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7Kn1cbiAgICAgKi9cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiR2YWx1ZTtcbiAgICB9XG5cbiAgICBzZXQgdmFsdWUodmFsdWUpIHtcbiAgICAgICAgdGhpcy4kdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5kaWdpdHMgPSBkaWdpdGl6ZSh0aGlzLmZvcm1hdCh2YWx1ZSksIHtcbiAgICAgICAgICAgIG1pbmltdW1EaWdpdHM6IHRoaXMubWluaW11bURpZ2l0cyxcbiAgICAgICAgICAgIHByZXBlbmRMZWFkaW5nWmVybzogdGhpcy5wcmVwZW5kTGVhZGluZ1plcm9cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgYXR0cmlidXRlIGlzIG5vdCBhIG51bWJlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC0gYHRydWVgIGlzIHRoZSB2YWx1ZSBpcyBub3QgYSBudW1iZXIuXG4gICAgICovXG4gICAgaXNOYU4oKSB7XG4gICAgICAgIHJldHVybiBpc05hTih0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBhdHRyaWJ1dGUgaXMgYSBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpcyB0aGUgdmFsdWUgaXMgYSBudW1iZXIuXG4gICAgICovXG4gICAgaXNOdW1iZXIoKSB7XG4gICAgICAgIHJldHVybiBpc051bWJlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb25lcyB0aGUgY3VycmVudCBgRmFjZVZhbHVlYCBpbnN0YW5jZSwgYnV0IHNldHMgYSBuZXcgdmFsdWUgdG8gdGhlXG4gICAgICogY2xvbmVkIGluc3RhbmNlLiBVc2VkIGZvciBjb3B5aW5nIHRoZSBjdXJyZW50IGluc3RhbmNlIG9wdGlvbnMgYW5kXG4gICAgICogbWV0aG9kcywgYnV0IHNldHRpbmcgYSBuZXcgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHsqfSB2YWx1ZSAtIFRoZSBuXG4gICAgICogQHBhcmFtIHsob2JqZWN0fHVuZGVmaW5lZCl9IFthdHRyaWJ1dGVzXSAtIFRoZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLlxuICAgICAqIEByZXR1cm4ge0ZhY2VWYWx1ZX0gLSBUaGUgY2xvbmVkIGBGYWNlVmFsdWVgLlxuICAgICAqL1xuICAgIGNsb25lKHZhbHVlLCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih2YWx1ZSwgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHRoaXMuZ2V0UHVibGljQXR0cmlidXRlcygpLCBhdHRyaWJ1dGVzXG4gICAgICAgICkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGRlZmluZU5hbWUoKSB7XG4gICAgICAgIHJldHVybiAnRmFjZVZhbHVlJztcbiAgICB9XG5cbn1cbiIsIi8qKlxuICogQG5hbWVzcGFjZSBIZWxwZXJzLlZhbGlkYXRlXG4gKi9cbmltcG9ydCB7IGlzTnVsbCB9IGZyb20gJy4vRnVuY3Rpb25zJztcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuL0Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4vRnVuY3Rpb25zJztcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnLi9GdW5jdGlvbnMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4vRnVuY3Rpb25zJztcbmltcG9ydCB7IGlzQ29uc3RydWN0b3IgfSBmcm9tICcuL0Z1bmN0aW9ucyc7XG5cbi8qKlxuICogVmFsaWRhdGUgdGhlIGRhdGEgdHlwZSBvZiBhIHZhcmlhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiB2YWxpZGF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZS5cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyAtIFRoZSBkYXRhIHR5cGVzIHRvIHVzZSBmb3IgdmFsaWRhdGUuXG4gKiBAcmV0dXJuIHtib29sZWFufSAtIFJldHVybnMgYHRydWVgaXMgdGhlIHZhbHVlIGhhcyBhIHZhbGlkIGRhdGEgdHlwZS5cbiAqIEBtZW1iZXJvZiBIZWxwZXJzLlZhbGlkYXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlKHZhbHVlLCAuLi5hcmdzKSB7XG4gICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgIGZsYXR0ZW4oYXJncykuZm9yRWFjaChhcmcgPT4ge1xuICAgICAgICBpZiggKGlzTnVsbCh2YWx1ZSkgJiYgaXNOdWxsKGFyZykpIHx8XG4gICAgICAgICAgICAoaXNPYmplY3QoYXJnKSAmJiAodmFsdWUgaW5zdGFuY2VvZiBhcmcpKSB8fFxuICAgICAgICAgICAgKGlzRnVuY3Rpb24oYXJnKSAmJiAhaXNDb25zdHJ1Y3RvcihhcmcpICYmIGFyZyh2YWx1ZSkgPT09IHRydWUpIHx8XG4gICAgICAgICAgICAoaXNTdHJpbmcoYXJnKSAmJiAodHlwZW9mIHZhbHVlID09PSBhcmcpKSkge1xuICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzdWNjZXNzO1xufVxuIiwiLyoqXG4gKiBAYWxpYXMgQ29uc29sZU1lc3NhZ2VzXG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQG1lbWJlcm9mIG1vZHVsZTpDb25maWcvQ29uc29sZU1lc3NhZ2VzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBjbGFzc05hbWU6ICdUaGUgY2xhc3NOYW1lKCkgaXMgbm90IGRlZmluZWQuJyxcbiAgICBpdGVtczogJ1RoZSBpdGVtcyBwcm9wZXJ0eSBtdXN0IGJlIGFuIGFycmF5LicsXG4gICAgdGhlbWU6ICdUaGUgdGhlbWUgcHJvcGVydHkgbXVzdCBiZSBhbiBvYmplY3QuJyxcbiAgICBsYW5ndWFnZTogJ1RoZSBsYW5ndWFnZSBtdXN0IGJlIGFuIG9iamVjdC4nLFxuICAgIGRhdGU6ICdUaGUgdmFsdWUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBhIERhdGUuJyxcbiAgICBmYWNlOiAnVGhlIGZhY2UgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBhIEZhY2UgY2xhc3MuJyxcbiAgICBlbGVtZW50OiAnVGhlIGVsZW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBhbiBIVE1MRWxlbWVudCcsXG4gICAgZmFjZVZhbHVlOiAnVGhlIGZhY2UgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBhIEZhY2VWYWx1ZSBjbGFzcy4nLFxuICAgIHRpbWVyOiAnVGhlIHRpbWVyIHByb3BlcnR5IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgYSBUaW1lciBjbGFzcy4nXG59O1xuIiwiaW1wb3J0IENvbXBvbmVudCBmcm9tICcuL0NvbXBvbmVudCc7XG5pbXBvcnQgRmFjZVZhbHVlIGZyb20gJy4vRmFjZVZhbHVlJztcbmltcG9ydCB2YWxpZGF0ZSBmcm9tICcuLi9IZWxwZXJzL1ZhbGlkYXRlJztcbmltcG9ydCBDb25zb2xlTWVzc2FnZXMgZnJvbSAnLi4vQ29uZmlnL0NvbnNvbGVNZXNzYWdlcyc7XG5pbXBvcnQgeyBlcnJvciwgaXNOdWxsLCBpc1VuZGVmaW5lZCwgaXNPYmplY3QsIGlzQXJyYXksIGlzRnVuY3Rpb24sIGNhbGxiYWNrIH0gZnJvbSAnLi4vSGVscGVycy9GdW5jdGlvbnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGYWNlIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgY2xhc3MgaXMgbWVhbnQgdG8gYmUgcHJvdmlkZSBhbiBpbnRlcmZhY2UgZm9yIGFsbCBvdGhlciBmYWNlcyB0b1xuICAgICAqIGV4dGVuZC5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBGYWNlXG4gICAgICogQGV4dGVuZHMgQ29tcG9uZW50XG4gICAgICogQHBhcmFtIHsoRmFjZVZhbHVlfG9iamVjdCl9IHZhbHVlIC0gVGhlIGBGYWNlYCB2YWx1ZS4gSWYgbm90IGFuIGluc3RhbmNlXG4gICAgICogICAgIG9mIEZhY2VWYWx1ZSwgdGhpcyBhcmd1bWVudCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLlxuICAgICAqIEBwYXJhbSB7KG9iamVjdHx1bmRlZmluZWQpfSBbYXR0cmlidXRlc10gLSBUaGUgaW5zdGFuY2UgYXR0cmlidXRlcy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSwgYXR0cmlidXRlcykge1xuICAgICAgICBpZighKHZhbHVlIGluc3RhbmNlb2YgRmFjZVZhbHVlKSAmJiBpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSB2YWx1ZTtcbiAgICAgICAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZXMoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBhdXRvU3RhcnQ6IHRydWUsXG4gICAgICAgICAgICBjb3VudGRvd246IGZhbHNlLFxuICAgICAgICAgICAgYW5pbWF0aW9uUmF0ZTogNTAwXG4gICAgICAgIH0sIHRoaXMuZGVmYXVsdEF0dHJpYnV0ZXMoKSwgYXR0cmlidXRlcyB8fCB7fSkpO1xuXG4gICAgICAgIGlmKGlzTnVsbCh2YWx1ZSkgfHwgaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZih2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGBkYXRhVHlwZWAgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQHR5cGUgeyp9XG4gICAgICovXG4gICAgZ2V0IGRhdGFUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0RGF0YVR5cGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYHZhbHVlYCBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7Kn1cbiAgICAgKi9cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiR2YWx1ZTtcbiAgICB9XG5cbiAgICBzZXQgdmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYoISh2YWx1ZSBpbnN0YW5jZW9mIEZhY2VWYWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jcmVhdGVGYWNlVmFsdWUodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4kdmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYHN0b3BBdGAgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQHR5cGUgeyp9XG4gICAgICovXG4gICAgZ2V0IHN0b3BBdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJHN0b3BBdDtcbiAgICB9XG5cbiAgICBzZXQgc3RvcEF0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuJHN0b3BBdCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgb3JpZ2luYWxWYWx1ZWAgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQHR5cGUgeyp9XG4gICAgICovXG4gICAgZ2V0IG9yaWdpbmFsVmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRvcmlnaW5hbFZhbHVlO1xuICAgIH1cblxuICAgIHNldCBvcmlnaW5hbFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuJG9yaWdpbmFsVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBldmVyeSBpbnRlcnZhbCwgb3IgZXZlcnkgdGltZSB0aGUgY2xvY2tcbiAgICAgKiBzaG91bGQgY2hhbmdlLCBhbmQgaGFuZGxlcyB0aGUgYWN0dWFsIGluY3JlbWVudGluZyBhbmQgZGVjcmVtZW50aW5nIHRoZVxuICAgICAqIGNsb2NrJ3MgYEZhY2VWYWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtGbGlwQ2xvY2t9IGluc3RhbmNlIC0gVGhlIGBGbGlwQ2xvY2tgIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiAtIFRoZSBpbnRlcnZhbCBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJuIHtGYWNlfSAtIFRoaXMgYEZhY2VgIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGludGVydmFsKGluc3RhbmNlLCBmbikge1xuICAgICAgICBpZih0aGlzLmNvdW50ZG93bikge1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnQoaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnQoaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBmbik7XG5cbiAgICAgICAgaWYodGhpcy5zaG91bGRTdG9wKGluc3RhbmNlKSkge1xuICAgICAgICAgICAgaW5zdGFuY2Uuc3RvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnaW50ZXJ2YWwnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjbG9jayBzaG91bGQgc3RvcCBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtGbGlwQ2xvY2t9IGluc3RhbmNlIC0gVGhlIGBGbGlwQ2xvY2tgIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGNsb2NrIHNob3VsZCBzdG9wLlxuICAgICAqL1xuICAgIHNob3VsZFN0b3AoaW5zdGFuY2UpIHtcbiAgICAgICAgcmV0dXJuICFpc1VuZGVmaW5lZCh0aGlzLnN0b3BBdCkgPyB0aGlzLnN0b3BBdCA9PT0gaW5zdGFuY2UudmFsdWUudmFsdWUgOiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0IHRoaXMganVzdCByZXR1cm5zIHRoZSB2YWx1ZSB1bmZvcm1hdHRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge0ZsaXBDbG9ja30gaW5zdGFuY2UgLSBUaGUgYEZsaXBDbG9ja2AgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtICB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZm9ybWF0LlxuICAgICAqIEByZXR1cm4geyp9IC0gVGhlIGZvcm1hdHRlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmb3JtYXQoaW5zdGFuY2UsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGBGYWNlYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyp9IC0gVGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgICovXG4gICAgZGVmYXVsdFZhbHVlKCkge1xuICAgICAgICAvL1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBgRmFjZWAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsoT2JqZWN0fHVuZGVmaW5lZCl9IC0gVGhlIGRlZmF1bHQgYXR0cmlidXRlcy5cbiAgICAgKi9cbiAgICBkZWZhdWx0QXR0cmlidXRlcygpIHtcbiAgICAgICAgLy9cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBkYXRhIHR5cGUgZm9yIHRoZSBgRmFjZWAgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsoT2JqZWN0fHVuZGVmaW5lZCl9IC0gVGhlIGRlZmF1bHQgZGF0YSB0eXBlLlxuICAgICAqL1xuICAgIGRlZmF1bHREYXRhVHlwZSgpIHtcbiAgICAgICAgLy9cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNyZW1lbnQgdGhlIGNsb2NrLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7RmxpcENsb2NrfSBpbnN0YW5jZSAtIFRoZSBgRmxpcENsb2NrYCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IFthbW91bnRdIC0gVGhlIGFtb3VudCB0byBpbmNyZW1lbnQuIElmIHRoZSBhbW91bnQgaXMgbm90XG4gICAgICogICAgIGRlZmluZWQsIGl0IGlzIGxlZnQgdXAgdG8gdGhlIGBGYWNlYCB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKi9cbiAgICBpbmNyZW1lbnQoaW5zdGFuY2UsIGFtb3VudCkge1xuICAgICAgICAvL1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlY3JlbWVudCB0aGUgY2xvY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtGbGlwQ2xvY2t9IGluc3RhbmNlIC0gVGhlIGBGbGlwQ2xvY2tgIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gW2Ftb3VudF0gLSBUaGUgYW1vdW50IHRvIGRlY3JlbWVudC4gSWYgdGhlIGFtb3VudCBpcyBub3RcbiAgICAgKiAgICAgZGVmaW5lZCwgaXQgaXMgbGVmdCB1cCB0byB0aGUgYEZhY2VgIHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICAqL1xuICAgIGRlY3JlbWVudChpbnN0YW5jZSwgYW1vdW50KSB7XG4gICAgICAgIC8vXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIGNsb2NrIGhhcyBzdGFydGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7RmxpcENsb2NrfSBpbnN0YW5jZSAtIFRoZSBgRmxpcENsb2NrYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICAqL1xuICAgIHN0YXJ0ZWQoaW5zdGFuY2UpIHtcbiAgICAgICAgLy9cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgcmlnaHQgYWZ0ZXIgY2xvY2sgaGFzIHN0b3BwZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtGbGlwQ2xvY2t9IGluc3RhbmNlIC0gVGhlIGBGbGlwQ2xvY2tgIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgc3RvcHBlZChpbnN0YW5jZSkge1xuICAgICAgICAvL1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCByaWdodCBhZnRlciBjbG9jayBoYXMgcmVzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtGbGlwQ2xvY2t9IGluc3RhbmNlIC0gVGhlIGBGbGlwQ2xvY2tgIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgcmVzZXQoaW5zdGFuY2UpIHtcbiAgICAgICAgLy9cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgcmlnaHQgYWZ0ZXIgYEZhY2VgIGhhcyBpbml0aWFsaXplZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge0ZsaXBDbG9ja30gaW5zdGFuY2UgLSBUaGUgYEZsaXBDbG9ja2AgaW5zdGFuY2UuXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKi9cbiAgICBpbml0aWFsaXplZChpbnN0YW5jZSkge1xuICAgICAgICAvL1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCByaWdodCBhZnRlciBgRmFjZWAgaGFzIHJlbmRlcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7RmxpcENsb2NrfSBpbnN0YW5jZSAtIFRoZSBgRmxpcENsb2NrYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICAqL1xuICAgIHJlbmRlcmVkKGluc3RhbmNlKSB7XG4gICAgICAgIC8vXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIGBGYWNlYCBoYXMgbW91bnRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge0ZsaXBDbG9ja30gaW5zdGFuY2UgLSBUaGUgYEZsaXBDbG9ja2AgaW5zdGFuY2UuXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKi9cbiAgICBtb3VudGVkKGluc3RhbmNlKSB7XG4gICAgICAgIGlmKHRoaXMuYXV0b1N0YXJ0ICYmIGluc3RhbmNlLnRpbWVyLmlzU3RvcHBlZCkge1xuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBpbnN0YW5jZS5zdGFydChpbnN0YW5jZSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBpbnN0YW50aWF0ZSBhIG5ldyBgRmFjZVZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge0ZsaXBDbG9ja30gaW5zdGFuY2UgLSBUaGUgYEZsaXBDbG9ja2AgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtICB7b2JqZWN0fHVuZGVmaW5lZH0gW2F0dHJpYnV0ZXNdIC0gVGhlIGF0dHJpYnV0ZXMgcGFzc2VkIHRvIHRoZVxuICAgICAqICAgICBgRmFjZVZhbHVlYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIHtEaXZpZGVyfSAtIFRoZSBpbnN0YW50aWF0ZWQgYEZhY2VWYWx1ZWAuXG4gICAgICovXG4gICAgY3JlYXRlRmFjZVZhbHVlKGluc3RhbmNlLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gRmFjZVZhbHVlLm1ha2UoXG4gICAgICAgICAgICBpc0Z1bmN0aW9uKHZhbHVlKSAmJiAhdmFsdWUubmFtZSA/IHZhbHVlKCkgOiB2YWx1ZSwge1xuICAgICAgICAgICAgICAgIG1pbmltdW1EaWdpdHM6IHRoaXMubWluaW11bURpZ2l0cyxcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IHZhbHVlID0+IHRoaXMuZm9ybWF0KGluc3RhbmNlLCB2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbn1cbiIsIi8qKlxuICogQGNsYXNzZGVzYyBBcmFiaWMgTGFuZ3VhZ2UgUGFja1xuICogQGRlc2MgVGhpcyBjbGFzcyB3aWxsIGJlIHVzZWQgdG8gdHJhbnNsYXRlIHRva2VucyBpbnRvIHRoZSBBcmFiaWMgbGFuZ3VhZ2UuXG4gKiBAbmFtZXNwYWNlIExhbmd1YWdlcy5BcmFiaWNcbiAqL1xuXG4vKipcbiAqIEBjb25zdGFudCBkaWN0aW9uYXJ5XG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5BcmFiaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGRpY3Rpb25hcnkgPSB7XG4gICAgJ3llYXJzJyAgIDogJ9iz2YbZiNin2KonLFxuICAgICdtb250aHMnICA6ICfYtNmH2YjYsScsXG4gICAgJ2RheXMnICAgIDogJ9ij2YrYp9mFJyxcbiAgICAnaG91cnMnICAgOiAn2LPYp9i52KfYqicsXG4gICAgJ21pbnV0ZXMnIDogJ9iv2YLYp9im2YInLFxuICAgICdzZWNvbmRzJyA6ICfYq9mI2KfZhtmKJ1xufTtcblxuLyoqXG4gKiBAY29uc3RhbnQgYWxpYXNlc1xuICogQHR5cGUge2FycmF5fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5BcmFiaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ2FyJywgJ2FyLWFyJywgJ2FyYWJpYyddO1xuIiwiLyoqXG4gKiBAY2xhc3NkZXNjIENhdGFsYW4gTGFuZ3VhZ2UgUGFja1xuICogQGRlc2MgVGhpcyBjbGFzcyB3aWxsIHVzZWQgdG8gdHJhbnNsYXRlIHRva2VucyBpbnRvIHRoZSBDYXRhbGFuIGxhbmd1YWdlLlxuICogQG5hbWVzcGFjZSBMYW5ndWFnZXMuQ2F0YWxhblxuICovXG5cbi8qKlxuICogQGNvbnN0YW50IGRpY3Rpb25hcnlcbiAqIEB0eXBlIHtvYmplY3R9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLkNhdGFsYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGRpY3Rpb25hcnkgPSB7XG4gICAgJ3llYXJzJyA6ICdBbnlzJyxcbiAgICAnbW9udGhzJyA6ICdNZXNvcycsXG4gICAgJ2RheXMnIDogJ0RpZXMnLFxuICAgICdob3VycycgOiAnSG9yZXMnLFxuICAgICdtaW51dGVzJyA6ICdNaW51dHMnLFxuICAgICdzZWNvbmRzJyA6ICdTZWdvbnMnXG59O1xuXG4vKipcbiAqIEBjb25zdGFudCBhbGlhc2VzXG4gKiBAdHlwZSB7YXJyYXl9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLkNhdGFsYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ2NhJywgJ2NhLWVzJywgJ2NhdGFsYW4nXTtcbiIsIi8qKlxuICogQGNsYXNzZGVzYyBDemVjaCBMYW5ndWFnZSBQYWNrXG4gKiBAZGVzYyBUaGlzIGNsYXNzIHdpbGwgdXNlZCB0byB0cmFuc2xhdGUgdG9rZW5zIGludG8gdGhlIEN6ZWNoIGxhbmd1YWdlLlxuICogQG5hbWVzcGFjZSBMYW5ndWFnZXMuQ3plY2hcbiAqL1xuXG4vKipcbiAqIEBjb25zdGFudCBkaWN0aW9uYXJ5XG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5DemVjaFxuICovXG5leHBvcnQgY29uc3QgZGljdGlvbmFyeSA9IHtcbiAgICAneWVhcnMnICAgOiAnUm9reScsXG4gICAgJ21vbnRocycgIDogJ03Em3PDrWNlJyxcbiAgICAnZGF5cycgICAgOiAnRG55JyxcbiAgICAnaG91cnMnICAgOiAnSG9kaW55JyxcbiAgICAnbWludXRlcycgOiAnTWludXR5JyxcbiAgICAnc2Vjb25kcycgOiAnU2VrdW5keSdcbn07XG5cbi8qKlxuICogQGNvbnN0YW50IGFsaWFzZXNcbiAqIEB0eXBlIHthcnJheX1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuQ3plY2hcbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ2NzJywgJ2NzLWN6JywgJ2N6JywgJ2N6LWNzJywgJ2N6ZWNoJ107XG4iLCIvKipcbiAqIEBjbGFzc2Rlc2MgRGFuaXNoIExhbmd1YWdlIFBhY2tcbiAqIEBkZXNjIFRoaXMgY2xhc3Mgd2lsbCB1c2VkIHRvIHRyYW5zbGF0ZSB0b2tlbnMgaW50byB0aGUgRGFuaXNoIGxhbmd1YWdlLlxuICogQG5hbWVzcGFjZSBMYW5ndWFnZXMuRGFuaXNoXG4gKi9cblxuLyoqXG4gKiBAY29uc3RhbnQgZGljdGlvbmFyeVxuICogQHR5cGUge29iamVjdH1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuRGFuaXNoXG4gKi9cbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5ID0ge1xuXHQneWVhcnMnICAgOiAnw4VyJyxcblx0J21vbnRocycgIDogJ03DpW5lZGVyJyxcblx0J2RheXMnICAgIDogJ0RhZ2UnLFxuXHQnaG91cnMnICAgOiAnVGltZXInLFxuXHQnbWludXRlcycgOiAnTWludXR0ZXInLFxuXHQnc2Vjb25kcycgOiAnU2VrdW5kZXInXG59O1xuXG4vKipcbiAqIEBjb25zdGFudCBhbGlhc2VzXG4gKiBAdHlwZSB7YXJyYXl9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLkRhbmlzaFxuICovXG5leHBvcnQgY29uc3QgYWxpYXNlcyA9IFsnZGEnLCAnZGEtZGsnLCAnZGFuaXNoJ107XG4iLCIvKipcbiAqIEBjbGFzc2Rlc2MgR2VybWFuIExhbmd1YWdlIFBhY2tcbiAqIEBkZXNjIFRoaXMgY2xhc3Mgd2lsbCB1c2VkIHRvIHRyYW5zbGF0ZSB0b2tlbnMgaW50byB0aGUgR2VybWFuIGxhbmd1YWdlLlxuICogQG5hbWVzcGFjZSBMYW5ndWFnZXMuR2VybWFuXG4gKi9cblxuLyoqXG4gKiBAY29uc3RhbnQgZGljdGlvbmFyeVxuICogQHR5cGUge29iamVjdH1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuR2VybWFuXG4gKi9cbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5ID0ge1xuXHQneWVhcnMnICAgOiAnSmFocmUnLFxuXHQnbW9udGhzJyAgOiAnTW9uYXRlJyxcblx0J2RheXMnICAgIDogJ1RhZ2UnLFxuXHQnaG91cnMnICAgOiAnU3R1bmRlbicsXG5cdCdtaW51dGVzJyA6ICdNaW51dGVuJyxcblx0J3NlY29uZHMnIDogJ1Nla3VuZGVuJ1xufTtcblxuLyoqXG4gKiBAY29uc3RhbnQgYWxpYXNlc1xuICogQHR5cGUge2FycmF5fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5HZXJtYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ2RlJywgJ2RlLWRlJywgJ2dlcm1hbiddO1xuIiwiLyoqXG4gKiBAY2xhc3NkZXNjIEVuZ2xpc2ggTGFuZ3VhZ2UgUGFja1xuICogQGRlc2MgVGhpcyBjbGFzcyB3aWxsIHVzZWQgdG8gdHJhbnNsYXRlIHRva2VucyBpbnRvIHRoZSBFbmdsaXNoIGxhbmd1YWdlLlxuICogQG5hbWVzcGFjZSBMYW5ndWFnZXMuRW5nbGlzaFxuICovXG5cbi8qKlxuICogQGNvbnN0YW50IGRpY3Rpb25hcnlcbiAqIEB0eXBlIHtvYmplY3R9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLkVuZ2xpc2hcbiAqL1xuZXhwb3J0IGNvbnN0IGRpY3Rpb25hcnkgPSB7XG5cdCd5ZWFycycgICA6ICdZZWFycycsXG5cdCdtb250aHMnICA6ICdNb250aHMnLFxuXHQnZGF5cycgICAgOiAnRGF5cycsXG5cdCdob3VycycgICA6ICdIb3VycycsXG5cdCdtaW51dGVzJyA6ICdNaW51dGVzJyxcblx0J3NlY29uZHMnIDogJ1NlY29uZHMnXG59O1xuXG4vKipcbiAqIEBjb25zdGFudCBhbGlhc2VzXG4gKiBAdHlwZSB7YXJyYXl9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLkVuZ2xpc2hcbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ2VuJywgJ2VuLXVzJywgJ2VuZ2xpc2gnXTtcbiIsIi8qKlxuICogQGNsYXNzZGVzYyBTcGFuaXNoIExhbmd1YWdlIFBhY2tcbiAqIEBkZXNjIFRoaXMgY2xhc3Mgd2lsbCB1c2VkIHRvIHRyYW5zbGF0ZSB0b2tlbnMgaW50byB0aGUgU3BhbmlzaCBsYW5ndWFnZS5cbiAqIEBuYW1lc3BhY2UgTGFuZ3VhZ2VzLlNwYW5pc2hcbiAqL1xuXG4vKipcbiAqIEBjb25zdGFudCBkaWN0aW9uYXJ5XG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5TcGFuaXNoXG4gKi9cbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5ID0ge1xuXHQneWVhcnMnICAgOiAnQcOxb3MnLFxuXHQnbW9udGhzJyAgOiAnTWVzZXMnLFxuXHQnZGF5cycgICAgOiAnRMOtYXMnLFxuXHQnaG91cnMnICAgOiAnSG9yYXMnLFxuXHQnbWludXRlcycgOiAnTWludXRvcycsXG5cdCdzZWNvbmRzJyA6ICdTZWd1bmRvcydcbn07XG5cbi8qKlxuICogQGNvbnN0YW50IGFsaWFzZXNcbiAqIEB0eXBlIHthcnJheX1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuU3BhbmlzaFxuICovXG5leHBvcnQgY29uc3QgYWxpYXNlcyA9IFsnZXMnLCAnZXMtZXMnLCAnc3BhbmlzaCddO1xuIiwiLyoqXG4gKiBAY2xhc3NkZXNjIFBlcnNpYW4gTGFuZ3VhZ2UgUGFja1xuICogQGRlc2MgVGhpcyBjbGFzcyB3aWxsIHVzZWQgdG8gdHJhbnNsYXRlIHRva2VucyBpbnRvIHRoZSBQZXJzaWFuIGxhbmd1YWdlLlxuICogQG5hbWVzcGFjZSBMYW5ndWFnZXMuUGVyc2lhblxuICovXG5cbi8qKlxuICogQGNvbnN0YW50IGRpY3Rpb25hcnlcbiAqIEB0eXBlIHtvYmplY3R9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLlBlcnNpYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGRpY3Rpb25hcnkgPSB7XG5cdCd5ZWFycycgICA6ICfYs9in2YQnLFxuXHQnbW9udGhzJyAgOiAn2YXYp9mHJyxcblx0J2RheXMnICAgIDogJ9ix2YjYsicsXG5cdCdob3VycycgICA6ICfYs9in2LnYqicsXG5cdCdtaW51dGVzJyA6ICfYr9mC24zZgtmHJyxcblx0J3NlY29uZHMnIDogJ9ir2KfZhtuM2YcnXG59O1xuXG4vKipcbiAqIEBjb25zdGFudCBhbGlhc2VzXG4gKiBAdHlwZSB7YXJyYXl9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLlBlcnNpYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ2ZhJywgJ2ZhLWlyJywgJ3BlcnNpYW4nXTtcbiIsIi8qKlxuICogQGNsYXNzZGVzYyBGaW5uaXNoIExhbmd1YWdlIFBhY2tcbiAqIEBkZXNjIFRoaXMgY2xhc3Mgd2lsbCB1c2VkIHRvIHRyYW5zbGF0ZSB0b2tlbnMgaW50byB0aGUgRmlubmlzaCBsYW5ndWFnZS5cbiAqIEBuYW1lc3BhY2UgTGFuZ3VhZ2VzLkZpbm5pc2hcbiAqL1xuXG4vKipcbiAqIEBjb25zdGFudCBkaWN0aW9uYXJ5XG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5GaW5uaXNoXG4gKi9cbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5ID0ge1xuXHQneWVhcnMnICAgOiAnVnVvdHRhJyxcblx0J21vbnRocycgIDogJ0t1dWthdXR0YScsXG5cdCdkYXlzJyAgICA6ICdQw6RpdsOkw6QnLFxuXHQnaG91cnMnICAgOiAnVHVudGlhJyxcblx0J21pbnV0ZXMnIDogJ01pbnV1dHRpYScsXG5cdCdzZWNvbmRzJyA6ICdTZWt1bnRpYSdcbn07XG5cbi8qKlxuICogQGNvbnN0YW50IGFsaWFzZXNcbiAqIEB0eXBlIHthcnJheX1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuRmlubmlzaFxuICovXG5leHBvcnQgY29uc3QgYWxpYXNlcyA9IFsnZmknLCAnZmktZmknLCAnZmlubmlzaCddO1xuIiwiLyoqXG4gKiBAY2xhc3NkZXNjIENhbmFkaWFuIEZyZW5jaCBMYW5ndWFnZSBQYWNrXG4gKiBAZGVzYyBUaGlzIGNsYXNzIHdpbGwgdXNlZCB0byB0cmFuc2xhdGUgdG9rZW5zIGludG8gdGhlIENhbmFkaWFuIEZyZW5jaCBsYW5ndWFnZS5cbiAqIEBuYW1lc3BhY2UgTGFuZ3VhZ2VzLkNhbmFkaWFuRnJlbmNoXG4gKi9cblxuLyoqXG4gKiBAY29uc3RhbnQgZGljdGlvbmFyeVxuICogQHR5cGUge29iamVjdH1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuQ2FuYWRpYW5GcmVuY2hcbiAqL1xuZXhwb3J0IGNvbnN0IGRpY3Rpb25hcnkgPSB7XG4gICAgJ3llYXJzJyAgIDogJ0FucycsXG4gICAgJ21vbnRocycgIDogJ01vaXMnLFxuICAgICdkYXlzJyAgICA6ICdKb3VycycsXG4gICAgJ2hvdXJzJyAgIDogJ0hldXJlcycsXG4gICAgJ21pbnV0ZXMnIDogJ01pbnV0ZXMnLFxuICAgICdzZWNvbmRzJyA6ICdTZWNvbmRlcydcbn07XG5cbi8qKlxuICogQGNvbnN0YW50IGFsaWFzZXNcbiAqIEB0eXBlIHthcnJheX1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuQ2FuYWRpYW5GcmVuY2hcbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ2ZyJywgJ2ZyLWNhJywgJ2ZyZW5jaCddO1xuIiwiLyoqXG4gKiBAY2xhc3NkZXNjIEhlYnJldyBMYW5ndWFnZSBQYWNrXG4gKiBAZGVzYyBUaGlzIGNsYXNzIHdpbGwgdXNlZCB0byB0cmFuc2xhdGUgdG9rZW5zIGludG8gdGhlIEhlYnJldyBsYW5ndWFnZS5cbiAqIEBuYW1lc3BhY2UgTGFuZ3VhZ2VzLkhlYnJld1xuICovXG5cbi8qKlxuICogQGNvbnN0YW50IGRpY3Rpb25hcnlcbiAqIEB0eXBlIHtvYmplY3R9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLkhlYnJld1xuICovXG5leHBvcnQgY29uc3QgZGljdGlvbmFyeSA9IHtcblx0J3llYXJzJyAgIDogJ9ep16DXmdedJyxcblx0J21vbnRocycgIDogJ9eX15XXk9epJyxcblx0J2RheXMnICAgIDogJ9eZ157XmdedJyxcblx0J2hvdXJzJyAgIDogJ9ep16LXldeqJyxcblx0J21pbnV0ZXMnIDogJ9eT16fXldeqJyxcblx0J3NlY29uZHMnIDogJ9ep16DXmdeV16onXG59O1xuXG4vKipcbiAqIEBjb25zdGFudCBhbGlhc2VzXG4gKiBAdHlwZSB7YXJyYXl9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLkhlYnJld1xuICovXG5leHBvcnQgY29uc3QgYWxpYXNlcyA9IFsnaWwnLCAnaGUtaWwnLCAnaGVicmV3J107XG4iLCIvKipcbiAqIEBjbGFzc2Rlc2MgSHVuZ2FyaWFuIExhbmd1YWdlIFBhY2tcbiAqIEBkZXNjIFRoaXMgY2xhc3Mgd2lsbCB1c2VkIHRvIHRyYW5zbGF0ZSB0b2tlbnMgaW50byB0aGUgSHVuZ2FyaWFuIGxhbmd1YWdlLlxuICogQG5hbWVzcGFjZSBMYW5ndWFnZXMuSHVuZ2FyaWFuXG4gKi9cblxuLyoqXG4gKiBAY29uc3RhbnQgZGljdGlvbmFyeVxuICogQHR5cGUge29iamVjdH1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuSHVuZ2FyaWFuXG4gKi9cbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5ID0ge1xuXHQneWVhcnMnICAgOiAnw4l2JyxcbiAgICAnbW9udGhzJyAgOiAnSMOzbmFwJyxcbiAgICAnZGF5cycgICAgOiAnTmFwJyxcbiAgICAnaG91cnMnICAgOiAnw5NyYScsXG4gICAgJ21pbnV0ZXMnIDogJ1BlcmMnLFxuICAgICdzZWNvbmRzJyA6ICdNw6Fzb2RwZXJjJ1xufTtcblxuLyoqXG4gKiBAY29uc3RhbnQgYWxpYXNlc1xuICogQHR5cGUge2FycmF5fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5IdW5nYXJpYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ2h1JywgJ2h1LWh1JywgJ2h1bmdhcmlhbiddO1xuIiwiLyoqXG4gKiBAY2xhc3NkZXNjIEl0YWxpYW4gTGFuZ3VhZ2UgUGFja1xuICogQGRlc2MgVGhpcyBjbGFzcyB3aWxsIHVzZWQgdG8gdHJhbnNsYXRlIHRva2VucyBpbnRvIHRoZSBJdGFsaWFuIGxhbmd1YWdlLlxuICogQG5hbWVzcGFjZSBMYW5ndWFnZXMuSXRhbGlhblxuICovXG5cbi8qKlxuICogQGNvbnN0YW50IGRpY3Rpb25hcnlcbiAqIEB0eXBlIHtvYmplY3R9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLkl0YWxpYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGRpY3Rpb25hcnkgPSB7XG5cdCd5ZWFycycgICA6ICdBbm5pJyxcblx0J21vbnRocycgIDogJ01lc2knLFxuXHQnZGF5cycgICAgOiAnR2lvcm5pJyxcblx0J2hvdXJzJyAgIDogJ09yZScsXG5cdCdtaW51dGVzJyA6ICdNaW51dGknLFxuXHQnc2Vjb25kcycgOiAnU2Vjb25kaSdcbn07XG5cbi8qKlxuICogQGNvbnN0YW50IGFsaWFzZXNcbiAqIEB0eXBlIHthcnJheX1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuSXRhbGlhblxuICovXG5leHBvcnQgY29uc3QgYWxpYXNlcyA9IFsnZGEnLCAnZGEtZGsnLCAnZGFuaXNoJ107XG4iLCIvKipcbiAqIEBjbGFzc2Rlc2MgSmFwYW5lc2UgTGFuZ3VhZ2UgUGFja1xuICogQGRlc2MgVGhpcyBjbGFzcyB3aWxsIHVzZWQgdG8gdHJhbnNsYXRlIHRva2VucyBpbnRvIHRoZSBKYXBhbmVzZSBsYW5ndWFnZS5cbiAqIEBuYW1lc3BhY2UgTGFuZ3VhZ2VzLkphcGFuZXNlXG4gKi9cblxuLyoqXG4gKiBAY29uc3RhbnQgZGljdGlvbmFyeVxuICogQHR5cGUge29iamVjdH1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuSmFwYW5lc2VcbiAqL1xuZXhwb3J0IGNvbnN0IGRpY3Rpb25hcnkgPSB7XG5cdCd5ZWFycycgICA6ICflubQnLFxuXHQnbW9udGhzJyAgOiAn5pyIJyxcblx0J2RheXMnICAgIDogJ+aXpScsXG5cdCdob3VycycgICA6ICfmmYInLFxuXHQnbWludXRlcycgOiAn5YiGJyxcblx0J3NlY29uZHMnIDogJ+enkidcbn07XG5cbi8qKlxuICogQGNvbnN0YW50IGFsaWFzZXNcbiAqIEB0eXBlIHthcnJheX1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuSmFwYW5lc2VcbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ2pwJywgJ2phLWpwJywgJ2phcGFuZXNlJ107XG4iLCIvKipcbiAqIEBjbGFzc2Rlc2MgS29yZWFuIExhbmd1YWdlIFBhY2tcbiAqIEBkZXNjIFRoaXMgY2xhc3Mgd2lsbCB1c2VkIHRvIHRyYW5zbGF0ZSB0b2tlbnMgaW50byB0aGUgS29yZWFuIGxhbmd1YWdlLlxuICogQG5hbWVzcGFjZSBMYW5ndWFnZXMuS29yZWFuXG4gKi9cblxuLyoqXG4gKiBAY29uc3RhbnQgZGljdGlvbmFyeVxuICogQHR5cGUge29iamVjdH1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuS29yZWFuXG4gKi9cbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5ID0ge1xuXHQneWVhcnMnICAgOiAn64WEJyxcblx0J21vbnRocycgIDogJ+yblCcsXG5cdCdkYXlzJyAgICA6ICfsnbwnLFxuXHQnaG91cnMnICAgOiAn7IucJyxcblx0J21pbnV0ZXMnIDogJ+u2hCcsXG5cdCdzZWNvbmRzJyA6ICfstIgnXG59O1xuXG4vKipcbiAqIEBjb25zdGFudCBhbGlhc2VzXG4gKiBAdHlwZSB7YXJyYXl9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLktvcmVhblxuICovXG5leHBvcnQgY29uc3QgYWxpYXNlcyA9IFsna28nLCAna28ta3InLCAna29yZWFuJ107XG4iLCIvKipcbiAqIEBjbGFzc2Rlc2MgTGF0dmlhbiBMYW5ndWFnZSBQYWNrXG4gKiBAZGVzYyBUaGlzIGNsYXNzIHdpbGwgdXNlZCB0byB0cmFuc2xhdGUgdG9rZW5zIGludG8gdGhlIExhdHZpYW4gbGFuZ3VhZ2UuXG4gKiBAbmFtZXNwYWNlIExhbmd1YWdlcy5MYXR2aWFuXG4gKi9cblxuLyoqXG4gKiBAY29uc3RhbnQgZGljdGlvbmFyeVxuICogQHR5cGUge29iamVjdH1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuTGF0dmlhblxuICovXG5leHBvcnQgY29uc3QgZGljdGlvbmFyeSA9IHtcbiAgICAneWVhcnMnICAgOiAnR2FkaScsXG4gICAgJ21vbnRocycgIDogJ03Ek25lxaFpJyxcbiAgICAnZGF5cycgICAgOiAnRGllbmFzJyxcbiAgICAnaG91cnMnICAgOiAnU3R1bmRhcycsXG4gICAgJ21pbnV0ZXMnIDogJ01pbsWrdGVzJyxcbiAgICAnc2Vjb25kcycgOiAnU2VrdW5kZXMnXG59O1xuXG4vKipcbiAqIEBjb25zdGFudCBhbGlhc2VzXG4gKiBAdHlwZSB7YXJyYXl9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLkxhdHZpYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ2x2JywgJ2x2LWx2JywgJ2xhdHZpYW4nXTtcbiIsIi8qKlxuICogQGNsYXNzZGVzYyBEdXRjaCBMYW5ndWFnZSBQYWNrXG4gKiBAZGVzYyBUaGlzIGNsYXNzIHdpbGwgdXNlZCB0byB0cmFuc2xhdGUgdG9rZW5zIGludG8gdGhlIER1dGNoIGxhbmd1YWdlLlxuICogQG5hbWVzcGFjZSBMYW5ndWFnZXMuRHV0Y2hcbiAqL1xuXG4vKipcbiAqIEBjb25zdGFudCBkaWN0aW9uYXJ5XG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5EdXRjaFxuICovXG5leHBvcnQgY29uc3QgZGljdGlvbmFyeSA9IHtcbiAgICAneWVhcnMnICAgOiAnSmFyZW4nLFxuICAgICdtb250aHMnICA6ICdNYWFuZGVuJyxcbiAgICAnZGF5cycgICAgOiAnRGFnZW4nLFxuICAgICdob3VycycgICA6ICdVcmVuJyxcbiAgICAnbWludXRlcycgOiAnTWludXRlbicsXG4gICAgJ3NlY29uZHMnIDogJ1NlY29uZGVuJ1xufTtcblxuLyoqXG4gKiBAY29uc3RhbnQgYWxpYXNlc1xuICogQHR5cGUge2FycmF5fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5EdXRjaFxuICovXG5leHBvcnQgY29uc3QgYWxpYXNlcyA9IFsnbmwnLCAnbmwtYmUnLCAnZHV0Y2gnXTtcbiIsIi8qKlxuICogQGNsYXNzZGVzYyBOb3J3ZWdpYW4tQm9rbcOlbCBMYW5ndWFnZSBQYWNrXG4gKiBAZGVzYyBUaGlzIGNsYXNzIHdpbGwgdXNlZCB0byB0cmFuc2xhdGUgdG9rZW5zIGludG8gdGhlIE5vcndlZ2lhbi1Cb2ttw6VsIGxhbmd1YWdlLlxuICogQG5hbWVzcGFjZSBMYW5ndWFnZXMuTm9yd2VnaWFuXG4gKi9cblxuLyoqXG4gKiBAY29uc3RhbnQgZGljdGlvbmFyeVxuICogQHR5cGUge29iamVjdH1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuTm9yd2VnaWFuXG4gKi9cbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5ID0ge1xuXHQneWVhcnMnICAgOiAnw4VyJyxcblx0J21vbnRocycgIDogJ03DpW5lZGVyJyxcblx0J2RheXMnICAgIDogJ0RhZ2VyJyxcblx0J2hvdXJzJyAgIDogJ1RpbWVyJyxcblx0J21pbnV0ZXMnIDogJ01pbnV0dGVyJyxcblx0J3NlY29uZHMnIDogJ1Nla3VuZGVyJ1xufTtcblxuLyoqXG4gKiBAY29uc3RhbnQgYWxpYXNlc1xuICogQHR5cGUge2FycmF5fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5Ob3J3ZWdpYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ25vJywgJ25iJywgJ25vLW5iJywgJ25vcndlZ2lhbiddO1xuIiwiLyoqXG4gKiBAY2xhc3NkZXNjIFBvbGlzaCBMYW5ndWFnZSBQYWNrXG4gKiBAZGVzYyBUaGlzIGNsYXNzIHdpbGwgdXNlZCB0byB0cmFuc2xhdGUgdG9rZW5zIGludG8gdGhlIFBvbGlzaCBsYW5ndWFnZS5cbiAqIEBuYW1lc3BhY2UgTGFuZ3VhZ2VzLlBvbGlzaFxuICovXG5cbi8qKlxuICogQGNvbnN0YW50IGRpY3Rpb25hcnlcbiAqIEB0eXBlIHtvYmplY3R9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLlBvbGlzaFxuICovXG5leHBvcnQgY29uc3QgZGljdGlvbmFyeSA9IHtcblx0J3llYXJzJyAgIDogJ0xhdCcsXG5cdCdtb250aHMnICA6ICdNaWVzacSZY3knLFxuXHQnZGF5cycgICAgOiAnRG5pJyxcblx0J2hvdXJzJyAgIDogJ0dvZHppbnknLFxuXHQnbWludXRlcycgOiAnTWludXR5Jyxcblx0J3NlY29uZHMnIDogJ1Nla3VuZHknXG59O1xuXG4vKipcbiAqIEBjb25zdGFudCBhbGlhc2VzXG4gKiBAdHlwZSB7YXJyYXl9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLlBvbGlzaFxuICovXG5leHBvcnQgY29uc3QgYWxpYXNlcyA9IFsncGwnLCAncGwtcGwnLCAncG9saXNoJ107XG4iLCIvKipcbiAqIEBjbGFzc2Rlc2MgUG9ydHVndWVzZSBMYW5ndWFnZSBQYWNrXG4gKiBAZGVzYyBUaGlzIGNsYXNzIHdpbGwgdXNlZCB0byB0cmFuc2xhdGUgdG9rZW5zIGludG8gdGhlIFBvcnR1Z3Vlc2UgbGFuZ3VhZ2UuXG4gKiBAbmFtZXNwYWNlIExhbmd1YWdlcy5Qb3J0dWd1ZXNlXG4gKi9cblxuLyoqXG4gKiBAY29uc3RhbnQgZGljdGlvbmFyeVxuICogQHR5cGUge29iamVjdH1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuUG9ydHVndWVzZVxuICovXG5leHBvcnQgY29uc3QgZGljdGlvbmFyeSA9IHtcblx0J3llYXJzJyAgIDogJ0Fub3MnLFxuXHQnbW9udGhzJyAgOiAnTWVzZXMnLFxuXHQnZGF5cycgICAgOiAnRGlhcycsXG5cdCdob3VycycgICA6ICdIb3JhcycsXG5cdCdtaW51dGVzJyA6ICdNaW51dG9zJyxcblx0J3NlY29uZHMnIDogJ1NlZ3VuZG9zJ1xufTtcblxuLyoqXG4gKiBAY29uc3RhbnQgYWxpYXNlc1xuICogQHR5cGUge2FycmF5fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5Qb3J0dWd1ZXNlXG4gKi9cbmV4cG9ydCBjb25zdCBhbGlhc2VzID0gWydwdCcsICdwdC1icicsICdwb3J0dWd1ZXNlJ107XG4iLCIvKipcbiAqIEBjbGFzc2Rlc2MgUm9tYW5pYW4gTGFuZ3VhZ2UgUGFja1xuICogQGRlc2MgVGhpcyBjbGFzcyB3aWxsIHVzZWQgdG8gdHJhbnNsYXRlIHRva2VucyBpbnRvIHRoZSBSb21hbmlhbiBsYW5ndWFnZS5cbiAqIEBuYW1lc3BhY2UgTGFuZ3VhZ2VzLlJvbWFuaWFuXG4gKi9cblxuLyoqXG4gKiBAY29uc3RhbnQgZGljdGlvbmFyeVxuICogQHR5cGUge29iamVjdH1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuUm9tYW5pYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGRpY3Rpb25hcnkgPSB7XG5cdCd5ZWFycyc6ICdBbmknLFxuXHQnbW9udGhzJzogJ0x1bmknLFxuXHQnZGF5cyc6ICdaaWxlJyxcblx0J2hvdXJzJzogJ09yZScsXG5cdCdtaW51dGVzJzogJ01pbnV0ZScsXG5cdCdzZWNvbmRzJzogJ3NTZWN1bmRlJ1xufTtcblxuLyoqXG4gKiBAY29uc3RhbnQgYWxpYXNlc1xuICogQHR5cGUge2FycmF5fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5Sb21hbmlhblxuICovXG5leHBvcnQgY29uc3QgYWxpYXNlcyA9IFsncm8nLCAncm8tcm8nLCAncm9tYW5hJ107XG4iLCIvKipcbiAqIEBjbGFzc2Rlc2MgUnVzc2lhbiBMYW5ndWFnZSBQYWNrXG4gKiBAZGVzYyBUaGlzIGNsYXNzIHdpbGwgdXNlZCB0byB0cmFuc2xhdGUgdG9rZW5zIGludG8gdGhlIFJ1c3NpYW4gbGFuZ3VhZ2UuXG4gKiBAbmFtZXNwYWNlIExhbmd1YWdlcy5SdXNzaWFuXG4gKi9cblxuLyoqXG4gKiBAY29uc3RhbnQgZGljdGlvbmFyeVxuICogQHR5cGUge29iamVjdH1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuUnVzc2lhblxuICovXG5leHBvcnQgY29uc3QgZGljdGlvbmFyeSA9IHtcbiAgICAneWVhcnMnICAgOiAn0LvQtdGCJyxcbiAgICAnbW9udGhzJyAgOiAn0LzQtdGB0Y/RhtC10LInLFxuICAgICdkYXlzJyAgICA6ICfQtNC90LXQuScsXG4gICAgJ2hvdXJzJyAgIDogJ9GH0LDRgdC+0LInLFxuICAgICdtaW51dGVzJyA6ICfQvNC40L3Rg9GCJyxcbiAgICAnc2Vjb25kcycgOiAn0YHQtdC60YPQvdC0J1xufTtcblxuLyoqXG4gKiBAY29uc3RhbnQgYWxpYXNlc1xuICogQHR5cGUge2FycmF5fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5SdXNzaWFuXG4gKi9cbmV4cG9ydCBjb25zdCBhbGlhc2VzID0gWydydScsICdydS1ydScsICdydXNzaWFuJ107XG4iLCIvKipcbiAqIEBjbGFzc2Rlc2MgU2xvdmFrIExhbmd1YWdlIFBhY2tcbiAqIEBkZXNjIFRoaXMgY2xhc3Mgd2lsbCB1c2VkIHRvIHRyYW5zbGF0ZSB0b2tlbnMgaW50byB0aGUgU2xvdmFrIGxhbmd1YWdlLlxuICogQG5hbWVzcGFjZSBMYW5ndWFnZXMuU2xvdmFrXG4gKi9cblxuLyoqXG4gKiBAY29uc3RhbnQgZGljdGlvbmFyeVxuICogQHR5cGUge29iamVjdH1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuU2xvdmFrXG4gKi9cbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5ID0ge1xuXHQneWVhcnMnICAgOiAnUm9reScsXG5cdCdtb250aHMnICA6ICdNZXNpYWNlJyxcblx0J2RheXMnICAgIDogJ0RuaScsXG5cdCdob3VycycgICA6ICdIb2RpbnknLFxuXHQnbWludXRlcycgOiAnTWluw7p0eScsXG5cdCdzZWNvbmRzJyA6ICdTZWt1bmR5J1xufTtcblxuLyoqXG4gKiBAY29uc3RhbnQgYWxpYXNlc1xuICogQHR5cGUge2FycmF5fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5TbG92YWtcbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ3NrJywgJ3NrLXNrJywgJ3Nsb3ZhayddO1xuIiwiLyoqXG4gKiBAY2xhc3NkZXNjIFN3ZWRpc2ggTGFuZ3VhZ2UgUGFja1xuICogQGRlc2MgVGhpcyBjbGFzcyB3aWxsIHVzZWQgdG8gdHJhbnNsYXRlIHRva2VucyBpbnRvIHRoZSBTd2VkaXNoIGxhbmd1YWdlLlxuICogQG5hbWVzcGFjZSBMYW5ndWFnZXMuU3dlZGlzaFxuICovXG5cbi8qKlxuICogQGNvbnN0YW50IGRpY3Rpb25hcnlcbiAqIEB0eXBlIHtvYmplY3R9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLlN3ZWRpc2hcbiAqL1xuZXhwb3J0IGNvbnN0IGRpY3Rpb25hcnkgPSB7XG5cdCd5ZWFycycgICA6ICfDhXInLFxuXHQnbW9udGhzJyAgOiAnTcOlbmFkZXInLFxuXHQnZGF5cycgICAgOiAnRGFnYXInLFxuXHQnaG91cnMnICAgOiAnVGltbWFyJyxcblx0J21pbnV0ZXMnIDogJ01pbnV0ZXInLFxuXHQnc2Vjb25kcycgOiAnU2VrdW5kZXInXG59O1xuXG4vKipcbiAqIEBjb25zdGFudCBhbGlhc2VzXG4gKiBAdHlwZSB7YXJyYXl9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLlN3ZWRpc2hcbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ3N2JywgJ3N2LXNlJywgJ3N3ZWRpc2gnXTtcbiIsIi8qKlxuICogQGNsYXNzZGVzYyBUaGFpIExhbmd1YWdlIFBhY2tcbiAqIEBkZXNjIFRoaXMgY2xhc3Mgd2lsbCB1c2VkIHRvIHRyYW5zbGF0ZSB0b2tlbnMgaW50byB0aGUgVGhhaSBsYW5ndWFnZS5cbiAqIEBuYW1lc3BhY2UgTGFuZ3VhZ2VzLlRoYWlcbiAqL1xuXG4vKipcbiAqIEBjb25zdGFudCBkaWN0aW9uYXJ5XG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5UaGFpXG4gKi9cbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5ID0ge1xuXHQneWVhcnMnICAgOiAn4Lib4Li1Jyxcblx0J21vbnRocycgIDogJ+C5gOC4lOC4t+C4reC4mScsXG5cdCdkYXlzJyAgICA6ICfguKfguLHguJknLFxuXHQnaG91cnMnICAgOiAn4LiK4Lix4LmI4Lin4LmC4Lih4LiHJyxcblx0J21pbnV0ZXMnIDogJ+C4meC4suC4l+C4tScsXG5cdCdzZWNvbmRzJyA6ICfguKfguLTguJnguLLguJfguLUnXG59O1xuXG4vKipcbiAqIEBjb25zdGFudCBhbGlhc2VzXG4gKiBAdHlwZSB7YXJyYXl9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLlRoYWlcbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ3RoJywgJ3RoLXRoJywgJ3RoYWknXTtcbiIsIi8qKlxuICogQGNsYXNzZGVzYyBUdXJraXNoIExhbmd1YWdlIFBhY2tcbiAqIEBkZXNjIFRoaXMgY2xhc3Mgd2lsbCB1c2VkIHRvIHRyYW5zbGF0ZSB0b2tlbnMgaW50byB0aGUgVHVya2lzaCBsYW5ndWFnZS5cbiAqIEBuYW1lc3BhY2UgTGFuZ3VhZ2VzLlR1cmtpc2hcbiAqL1xuXG4vKipcbiAqIEBjb25zdGFudCBkaWN0aW9uYXJ5XG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5UdXJraXNoXG4gKi9cbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5ID0ge1xuXHQneWVhcnMnICAgOiAnWcSxbCcsXG5cdCdtb250aHMnICA6ICdBeScsXG5cdCdkYXlzJyAgICA6ICdHw7xuJyxcblx0J2hvdXJzJyAgIDogJ1NhYXQnLFxuXHQnbWludXRlcycgOiAnRGFraWthJyxcblx0J3NlY29uZHMnIDogJ1Nhbml5ZSdcbn07XG5cbi8qKlxuICogQGNvbnN0YW50IGFsaWFzZXNcbiAqIEB0eXBlIHthcnJheX1cbiAqIEBtZW1iZXJvZiBMYW5ndWFnZXMuVHVya2lzaFxuICovXG5leHBvcnQgY29uc3QgYWxpYXNlcyA9IFsndHInLCAndHItdHInLCAndHVya2lzaCddO1xuIiwiLyoqXG4gKiBAY2xhc3NkZXNjIFVrcmFpbmlhbiBMYW5ndWFnZSBQYWNrXG4gKiBAZGVzYyBUaGlzIGNsYXNzIHdpbGwgdXNlZCB0byB0cmFuc2xhdGUgdG9rZW5zIGludG8gdGhlIFVrcmFpbmlhbiBsYW5ndWFnZS5cbiAqIEBuYW1lc3BhY2UgTGFuZ3VhZ2VzLlVrcmFpbmlhblxuICovXG5cbi8qKlxuICogQGNvbnN0YW50IGRpY3Rpb25hcnlcbiAqIEB0eXBlIHtvYmplY3R9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLlVrcmFpbmlhblxuICovXG5leHBvcnQgY29uc3QgZGljdGlvbmFyeSA9IHtcbiAgICAneWVhcnMnICAgOiAn0YDQvtC60LgnLFxuICAgICdtb250aHMnICA6ICfQvNGW0YHRj9GG0ZYnLFxuICAgICdkYXlzJyAgICA6ICfQtNC90ZYnLFxuICAgICdob3VycycgICA6ICfQs9C+0LTQuNC90LgnLFxuICAgICdtaW51dGVzJyA6ICfRhdCy0LjQu9C40L3QuCcsXG4gICAgJ3NlY29uZHMnIDogJ9GB0LXQutGD0L3QtNC4J1xufTtcblxuLyoqXG4gKiBAY29uc3RhbnQgYWxpYXNlc1xuICogQHR5cGUge2FycmF5fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5Va3JhaW5pYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ3VhJywgJ3VhLXVhJywgJ3VrcmFpbmUnXTtcbiIsIi8qKlxuICogQGNsYXNzZGVzYyBWaWV0bmFtZXNlIExhbmd1YWdlIFBhY2tcbiAqIEBkZXNjIFRoaXMgY2xhc3Mgd2lsbCB1c2VkIHRvIHRyYW5zbGF0ZSB0b2tlbnMgaW50byB0aGUgVmlldG5hbWVzZSBsYW5ndWFnZS5cbiAqIEBuYW1lc3BhY2UgTGFuZ3VhZ2VzLlZpZXRuYW1lc2VcbiAqL1xuXG4vKipcbiAqIEBjb25zdGFudCBkaWN0aW9uYXJ5XG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5WaWV0bmFtZXNlXG4gKi9cbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5ID0ge1xuXHQneWVhcnMnICAgOiAnTsSDbScsXG5cdCdtb250aHMnICA6ICdUaMOhbmcnLFxuXHQnZGF5cycgICAgOiAnTmfDoHknLFxuXHQnaG91cnMnICAgOiAnR2nhu50nLFxuXHQnbWludXRlcycgOiAnUGjDunQnLFxuXHQnc2Vjb25kcycgOiAnR2nDonknXG59O1xuXG4vKipcbiAqIEBjb25zdGFudCBhbGlhc2VzXG4gKiBAdHlwZSB7YXJyYXl9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLlZpZXRuYW1lc2VcbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ3ZuJywgJ3ZuLXZuJywgJ3ZpZXRuYW1lc2UnXTtcbiIsIi8qKlxuICogQGNsYXNzZGVzYyBDaGluZXNlIExhbmd1YWdlIFBhY2tcbiAqIEBkZXNjIFRoaXMgY2xhc3Mgd2lsbCB1c2VkIHRvIHRyYW5zbGF0ZSB0b2tlbnMgaW50byB0aGUgQ2hpbmVzZSBsYW5ndWFnZS5cbiAqIEBuYW1lc3BhY2UgTGFuZ3VhZ2VzLkNoaW5lc2VcbiAqL1xuXG4vKipcbiAqIEBjb25zdGFudCBkaWN0aW9uYXJ5XG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5DaGluZXNlXG4gKi9cbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5ID0ge1xuXHQneWVhcnMnICAgOiAn5bm0Jyxcblx0J21vbnRocycgIDogJ+aciCcsXG5cdCdkYXlzJyAgICA6ICfml6UnLFxuXHQnaG91cnMnICAgOiAn5pe2Jyxcblx0J21pbnV0ZXMnIDogJ+WIhicsXG5cdCdzZWNvbmRzJyA6ICfnp5InXG59O1xuXG4vKipcbiAqIEBjb25zdGFudCBhbGlhc2VzXG4gKiBAdHlwZSB7YXJyYXl9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLkNoaW5lc2VcbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ3poJywgJ3poLWNuJywgJ2NoaW5lc2UnXTtcbiIsIi8qKlxuICogQGNsYXNzZGVzYyBUcmFkaXRpb25hbCBDaGluZXNlIExhbmd1YWdlIFBhY2tcbiAqIEBkZXNjIFRoaXMgY2xhc3Mgd2lsbCB1c2VkIHRvIHRyYW5zbGF0ZSB0b2tlbnMgaW50byB0aGUgVHJhZGl0aW9uYWwgQ2hpbmVzZSBsYW5ndWFnZS5cbiAqIEBuYW1lc3BhY2UgTGFuZ3VhZ2VzLlRyYWRpdGlvbmFsQ2hpbmVzZVxuICovXG5cbi8qKlxuICogQGNvbnN0YW50IGRpY3Rpb25hcnlcbiAqIEB0eXBlIHtvYmplY3R9XG4gKiBAbWVtYmVyb2YgTGFuZ3VhZ2VzLlRyYWRpdGlvbmFsQ2hpbmVzZVxuICovXG5leHBvcnQgY29uc3QgZGljdGlvbmFyeSA9IHtcblx0J3llYXJzJyAgIDogJ+W5tCcsXG5cdCdtb250aHMnICA6ICfmnIgnLFxuXHQnZGF5cycgICAgOiAn5pelJyxcblx0J2hvdXJzJyAgIDogJ+aZgicsXG5cdCdtaW51dGVzJyA6ICfliIYnLFxuXHQnc2Vjb25kcycgOiAn56eSJ1xufTtcblxuLyoqXG4gKiBAY29uc3RhbnQgYWxpYXNlc1xuICogQHR5cGUge2FycmF5fVxuICogQG1lbWJlcm9mIExhbmd1YWdlcy5UcmFkaXRpb25hbENoaW5lc2VcbiAqL1xuZXhwb3J0IGNvbnN0IGFsaWFzZXMgPSBbJ3poLXR3J107XG4iLCIvKipcbiAqIEBuYW1lc3BhY2UgTGFuZ3VhZ2VzXG4gKi9cbmltcG9ydCAqIGFzIEFyYWJpYyBmcm9tICcuL2FyLWFyJztcbmltcG9ydCAqIGFzIENhdGFsYW4gZnJvbSAnLi9jYS1lcyc7XG5pbXBvcnQgKiBhcyBDemVjaCBmcm9tICcuL2NzLWN6JztcbmltcG9ydCAqIGFzIERhbmlzaCBmcm9tICcuL2RhLWRrJztcbmltcG9ydCAqIGFzIEdlcm1hbiBmcm9tICcuL2RlLWRlJztcbmltcG9ydCAqIGFzIEVuZ2xpc2ggZnJvbSAnLi9lbi11cyc7XG5pbXBvcnQgKiBhcyBTcGFuaXNoIGZyb20gJy4vZXMtZXMnO1xuaW1wb3J0ICogYXMgUGVyc2lhbiBmcm9tICcuL2ZhLWlyJztcbmltcG9ydCAqIGFzIEZpbm5pc2ggZnJvbSAnLi9maS1maSc7XG5pbXBvcnQgKiBhcyBGcmVuY2ggZnJvbSAnLi9mci1jYSc7XG5pbXBvcnQgKiBhcyBIZWJyZXcgZnJvbSAnLi9oZS1pbCc7XG5pbXBvcnQgKiBhcyBIdW5nYXJpYW4gZnJvbSAnLi9odS1odSc7XG5pbXBvcnQgKiBhcyBJdGFsaWFuIGZyb20gJy4vaXQtaXQnO1xuaW1wb3J0ICogYXMgSmFwYW5lc2UgZnJvbSAnLi9qYS1qcCc7XG5pbXBvcnQgKiBhcyBLb3JlYW4gZnJvbSAnLi9rby1rcic7XG5pbXBvcnQgKiBhcyBMYXR2aWFuIGZyb20gJy4vbHYtbHYnO1xuaW1wb3J0ICogYXMgRHV0Y2ggZnJvbSAnLi9ubC1iZSc7XG5pbXBvcnQgKiBhcyBOb3J3ZWdpYW4gZnJvbSAnLi9uby1uYic7XG5pbXBvcnQgKiBhcyBQb2xpc2ggZnJvbSAnLi9wbC1wbCc7XG5pbXBvcnQgKiBhcyBQb3J0dWd1ZXNlIGZyb20gJy4vcHQtYnInO1xuaW1wb3J0ICogYXMgUm9tYW5pYW4gZnJvbSAnLi9yby1ybyc7XG5pbXBvcnQgKiBhcyBSdXNzaWFuIGZyb20gJy4vcnUtcnUnO1xuaW1wb3J0ICogYXMgU2xvdmFrIGZyb20gJy4vc2stc2snO1xuaW1wb3J0ICogYXMgU3dlZGlzaCBmcm9tICcuL3N2LXNlJztcbmltcG9ydCAqIGFzIFRoYWkgZnJvbSAnLi90aC10aCc7XG5pbXBvcnQgKiBhcyBUdXJraXNoIGZyb20gJy4vdHItdHInO1xuaW1wb3J0ICogYXMgVWtyYWluaWFuIGZyb20gJy4vdWEtdWEnO1xuaW1wb3J0ICogYXMgVmlldG5hbWVzZSBmcm9tICcuL3ZuLXZuJztcbmltcG9ydCAqIGFzIENoaW5lc2UgZnJvbSAnLi96aC1jbic7XG5pbXBvcnQgKiBhcyBUcmFkaXRpb25hbENoaW5lc2UgZnJvbSAnLi96aC10dyc7XG5cbmV4cG9ydCB7XG4gICAgQXJhYmljLFxuICAgIENhdGFsYW4sXG4gICAgQ3plY2gsXG4gICAgRGFuaXNoLFxuICAgIEdlcm1hbixcbiAgICBFbmdsaXNoLFxuICAgIFNwYW5pc2gsXG4gICAgUGVyc2lhbixcbiAgICBGaW5uaXNoLFxuICAgIEZyZW5jaCxcbiAgICBIZWJyZXcsXG4gICAgSHVuZ2FyaWFuLFxuICAgIEl0YWxpYW4sXG4gICAgSmFwYW5lc2UsXG4gICAgS29yZWFuLFxuICAgIExhdHZpYW4sXG4gICAgRHV0Y2gsXG4gICAgTm9yd2VnaWFuLFxuICAgIFBvbGlzaCxcbiAgICBQb3J0dWd1ZXNlLFxuICAgIFJvbWFuaWFuLFxuICAgIFJ1c3NpYW4sXG4gICAgU2xvdmFrLFxuICAgIFN3ZWRpc2gsXG4gICAgVGhhaSxcbiAgICBUdXJraXNoLFxuICAgIFVrcmFpbmlhbixcbiAgICBWaWV0bmFtZXNlLFxuICAgIENoaW5lc2UsXG4gICAgVHJhZGl0aW9uYWxDaGluZXNlXG59XG4iLCIvKipcbiAqIEBuYW1lc3BhY2UgSGVscGVycy5MYW5ndWFnZVxuICovXG5pbXBvcnQgKiBhcyBMQU5HVUFHRVMgZnJvbSAnLi4vTGFuZ3VhZ2VzJztcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxhbmd1YWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LiBSZXR1cm5zIGBudWxsYCBpZiBubyBsYW5ndWFnZSBpc1xuICogZm91bmQuXG4gKiBcbiAqIEBmdW5jdGlvbiBsYW5ndWFnZVxuICogQHBhcmFtICB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb3IgaWQgb2YgdGhlIGxhbmd1YWdlLlxuICogQHJldHVybiB7b2JqZWN0fG51bGx9IC0gVGhlIGxhbmd1YWdlIGRpY3Rpb25hcnksIG9yIG51bGwgaWYgbm90IGZvdW5kLlxuICogQG1lbWJlcm9mIEhlbHBlcnMuTGFuZ3VhZ2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGFuZ3VhZ2UobmFtZSkge1xuICAgIHJldHVybiBuYW1lID8gTEFOR1VBR0VTW25hbWUudG9Mb3dlckNhc2UoKV0gfHwgT2JqZWN0LnZhbHVlcyhMQU5HVUFHRVMpLmZpbmQodmFsdWUgPT4ge1xuICAgICAgICByZXR1cm4gdmFsdWUuYWxpYXNlcy5pbmRleE9mKG5hbWUpICE9PSAtMTtcbiAgICB9KSA6IG51bGw7XG59XG4iLCIvKipcbiAqIEBuYW1lc3BhY2UgSGVscGVycy5UcmFuc2xhdGVcbiAqL1xuaW1wb3J0IGxhbmd1YWdlIGZyb20gJy4vTGFuZ3VhZ2UnO1xuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICcuL0Z1bmN0aW9ucyc7XG5cbi8qKlxuICogVHJhbnNsYXRlIGFuIEVuZ2xpc2ggc3RyaW5nIGludG8gYW5vdGhlciBsYW5ndWFnZS5cbiAqIFxuICogQGZ1bmN0aW9uIHRyYW5zbGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAtIFRoZSBzdHJpbmcgdG8gdHJhbnNsYXRlLlxuICogQHBhcmFtIHsoc3RyaW5nfG9iamVjdCl9IGZyb20gLSBUaGUgbGFuZ3VhZ2UgdXNlZCB0byB0cmFuc2xhdGUuIElmIGEgc3RyaW5nLFxuICogICAgIHRoZSBsYW5ndWFnZSBpcyBsb2FkZWQgaW50byBhbiBvYmplY3QuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gSWYgbm8gZGljdGlvbiBrZXkgaXMgZm91bmQsIHRoZSB1bnRyYW5zbGF0ZWQgc3RyaW5nIGlzXG4gKiAgICAgcmV0dXJuZWQuXG4gKiBAbWVtYmVyb2YgSGVscGVycy5UcmFuc2xhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNsYXRlKHN0cmluZywgZnJvbSkge1xuICAgIGNvbnN0IGxhbmcgPSBpc1N0cmluZyhmcm9tKSA/IGxhbmd1YWdlKGZyb20pIDogZnJvbTtcbiAgICBjb25zdCBkaWN0aW9uYXJ5ID0gbGFuZy5kaWN0aW9uYXJ5IHx8IGxhbmc7XG4gICAgcmV0dXJuIGRpY3Rpb25hcnlbc3RyaW5nXSB8fCBzdHJpbmc7XG59O1xuIiwiLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zIHRvIG1hbmFnZSBET00gbm9kZXMgYW5kIHRoZW1lIHRlbXBsYXRlcy5cbiAqXG4gKiBAbmFtZXNwYWNlIEhlbHBlcnMuVGVtcGxhdGVcbiAqL1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4vRnVuY3Rpb25zJztcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICcuL0Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gJy4vRnVuY3Rpb25zJztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi9GdW5jdGlvbnMnO1xuaW1wb3J0IHsgZGVlcEZsYXR0ZW4gfSBmcm9tICcuL0Z1bmN0aW9ucyc7XG5cbi8qKlxuICogU3dhcCBhIG5ldyBET00gbm9kZSB3aXRoIGFuIGV4aXN0aW5nIG9uZS5cbiAqXG4gKiBAZnVuY3Rpb24gc3dhcFxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IHN1YmplY3QgLSBUaGUgbmV3IERPTSBub2RlLlxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGV4aXN0aW5nIC0gVGhlIGV4aXN0aW5nIERPTSBub2RlLlxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9IC0gUmV0dXJucyB0aGUgbmV3IGVsZW1lbnQgaWYgaXQgd2FzIG1vdW50ZWQsIG90aGVyd2lzZVxuICogICAgdGhlIGV4aXN0aW5nIG5vZGUgaXMgcmV0dXJuZWQuXG4gKiBAbWVtYmVyb2YgSGVscGVycy5UZW1wbGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3dhcChzdWJqZWN0LCBleGlzdGluZykge1xuXHRpZihleGlzdGluZy5wYXJlbnROb2RlKSB7XG5cdFx0ZXhpc3RpbmcucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoc3ViamVjdCwgZXhpc3RpbmcpO1xuXG5cdFx0cmV0dXJuIHN1YmplY3Q7XG5cdH1cblxuXHRyZXR1cm4gZXhpc3Rpbmc7XG59XG5cbi8qKlxuICogU2V0IHRoZSBhdHRyaWJ1dGUgb2YgYW4gZWxlbWVudC5cbiAqXG4gKiBAZnVuY3Rpb24gc2V0QXR0cmlidXRlc1xuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsIC0gVGhlIERPTSBub2RlIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBhdHRyaWJ1dGVzLlxuICogQHBhcmFtICB7T2JqZWN0fHVuZGVmaW5lZH0gW2F0dHJpYnV0ZXNdIC0gVGhlIGF0dHJpYnV0ZSBvYmplY3QsIG9yIGlmIG5vIG9iamVjdFxuICogICAgIGlzIHBhc3NlZCwgdGhlbiB0aGUgYWN0aW9uIGlzIGlnbm9yZWQuXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gZWwgLSBUaGUgRE9NIG5vZGUgdGhhdCByZWNlaXZlZCB0aGUgYXR0cmlidXRlcy5cbiAqIEBtZW1iZXJvZiBIZWxwZXJzLlRlbXBsYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRBdHRyaWJ1dGVzKGVsLCBhdHRyaWJ1dGVzKSB7XG5cdGlmKGlzT2JqZWN0KGF0dHJpYnV0ZXMpKSB7XG5cdFx0Zm9yKGNvbnN0IGkgaW4gYXR0cmlidXRlcykge1xuXHRcdFx0ZWwuc2V0QXR0cmlidXRlKGksIGF0dHJpYnV0ZXNbaV0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbDtcbn1cblxuLyoqXG4gKiBBcHBlbmQgYW4gYXJyYXkgb2YgRE9NIG5vZGVzIHRvIGEgcGFyZW50LlxuICpcbiAqIEBmdW5jdGlvbiBhcHBlbmRDaGlsZHJlblxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsIC0gVGhlIHBhcmVudCBET00gbm9kZS5cbiAqIEBwYXJhbSAge0FycmF5fHVuZGVmaW5lZH0gW2NoaWxkcmVuXSAtIFRoZSBhcnJheSBvZiBjaGlsZHJlbi4gSWYgbm8gYXJyYXlcbiAqICAgICBpcyBwYXNzZWQsIHRoZW4gdGhlIG1ldGhvZCBzaWxlbnRseSBmYWlscyB0byBydW4uXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gZWwgLSBUaGUgRE9NIG5vZGUgdGhhdCByZWNlaXZlZCB0aGUgYXR0cmlidXRlcy5cbiAqIEBtZW1iZXJvZiBIZWxwZXJzLlRlbXBsYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRDaGlsZHJlbihlbCwgY2hpbGRyZW4pIHtcblx0aWYoaXNBcnJheShjaGlsZHJlbikpIHtcblx0XHRjaGlsZHJlbi5maWx0ZXIobm9vcCkuZm9yRWFjaChjaGlsZCA9PiB7XG5cdFx0XHRpZihjaGlsZCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cdFx0XHRcdGVsLmFwcGVuZENoaWxkKGNoaWxkKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiBlbDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgSFRNTEVsZW1lbnQgaW5zdGFuY2UuXG4gKlxuICogQGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbCAtIFRoZSBwYXJlbnQgRE9NIG5vZGUuXG4gKiBAcGFyYW0gIHtBcnJheXx1bmRlZmluZWR9IFtjaGlsZHJlbl0gLSBUaGUgYXJyYXkgb2YgY2hpbGRyZW4uIElmIG5vIGFycmF5XG4gKiAgICAgaXMgcGFzc2VkLCB0aGVuIHRoZSBtZXRob2Qgc2lsZW50bHkgZmFpbHMgdG8gcnVuLlxuICogQHBhcmFtICB7T2JqZWN0fHVuZGVmaW5lZH0gW2F0dHJpYnV0ZXNdIC0gVGhlIGF0dHJpYnV0ZXMgb2JqZWN0LlxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9IGVsIC0gVGhlIERPTSBub2RlIHRoYXQgcmVjZWl2ZWQgdGhlIGF0dHJpYnV0ZXMuXG4gKiBAbWVtYmVyb2YgSGVscGVycy5UZW1wbGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRWxlbWVudChlbCwgY2hpbGRyZW4sIGF0dHJpYnV0ZXMpIHtcblx0aWYoIShlbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuXHRcdGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbCk7XG5cdH1cblxuXHRzZXRBdHRyaWJ1dGVzKGVsLCBpc09iamVjdChjaGlsZHJlbikgPyBjaGlsZHJlbiA6IGF0dHJpYnV0ZXMpO1xuXG5cdGlmKCFpc09iamVjdChjaGlsZHJlbikgJiYgIWlzQXJyYXkoY2hpbGRyZW4pKSB7XG5cdFx0ZWwuaW5uZXJIVE1MID0gY2hpbGRyZW47XG5cdH1cblx0ZWxzZSB7XG5cdFx0YXBwZW5kQ2hpbGRyZW4oZWwsIGNoaWxkcmVuKVxuXHR9XG5cblx0cmV0dXJuIGVsO1xufVxuIiwiaW1wb3J0IENvbXBvbmVudCBmcm9tICcuL0NvbXBvbmVudCc7XG5pbXBvcnQgbGFuZ3VhZ2UgZnJvbSAnLi4vSGVscGVycy9MYW5ndWFnZSc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi4vSGVscGVycy9WYWxpZGF0ZSc7XG5pbXBvcnQgdHJhbnNsYXRlIGZyb20gJy4uL0hlbHBlcnMvVHJhbnNsYXRlJztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi4vSGVscGVycy9GdW5jdGlvbnMnO1xuaW1wb3J0IENvbnNvbGVNZXNzYWdlcyBmcm9tICcuLi9Db25maWcvQ29uc29sZU1lc3NhZ2VzJztcbmltcG9ydCB7IGVycm9yLCBrZWJhYkNhc2UgfSBmcm9tICcuLi9IZWxwZXJzL0Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBzd2FwLCBjcmVhdGVFbGVtZW50IH0gZnJvbSAnLi4vSGVscGVycy9UZW1wbGF0ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvbUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhYnN0cmFjdCBjbGFzcyB0aGF0IGFsbCBvdGhlciBET00gY29tcG9uZW50cyBjYW4gZXh0ZW5kLlxuICAgICAqXG4gICAgICogQGNsYXNzIERvbUNvbXBvbmVudFxuICAgICAqIEBleHRlbmRzIENvbXBvbmVudFxuICAgICAqIEBwYXJhbSB7KG9iamVjdHx1bmRlZmluZWQpfSBbYXR0cmlidXRlc10gLSBUaGUgaW5zdGFuY2UgYXR0cmlidXRlcy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgcGFyZW50OiBudWxsXG4gICAgICAgIH0sIGF0dHJpYnV0ZXMpKTtcblxuICAgICAgICBpZighdGhpcy50aGVtZSkge1xuICAgICAgICAgICAgZXJyb3IoYCR7dGhpcy5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgdGhlbWUgZGVmaW5lZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCF0aGlzLmxhbmd1YWdlKSB7XG4gICAgICAgICAgICBlcnJvcihgJHt0aGlzLm5hbWV9IGRvZXMgbm90IGhhdmUgYSBsYW5ndWFnZSBkZWZpbmVkLmApO1xuICAgICAgICB9XG5cblx0XHRpZighdGhpcy50aGVtZVt0aGlzLm5hbWVdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYCR7dGhpcy5uYW1lfSBjYW5ub3QgYmUgcmVuZGVyZWQgYmVjYXVzZSBpdCBoYXMgbm8gdGVtcGxhdGUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgY2xhc3NOYW1lYCBhdHRyaWJ1dGUuIFVzZWQgZm9yIENTUy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIGtlYmFiQ2FzZSh0aGlzLmNvbnN0cnVjdG9yLmRlZmluZU5hbWUoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGBlbGAgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQHR5cGUge0hUTUxFbGVtZW50fVxuICAgICAqL1xuICAgIGdldCBlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJGVsO1xuICAgIH1cblxuICAgIHNldCBlbCh2YWx1ZSkge1xuICAgICAgICBpZighdmFsaWRhdGUodmFsdWUsIG51bGwsIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgZXJyb3IoQ29uc29sZU1lc3NhZ2VzLmVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4kZWwgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYHBhcmVudGAgYXR0cmlidXRlLiBQYXJlbnQgaXMgc2V0IHdoZW4gYERvbUNvbXBvbmVudGAgaW5zdGFuY2VzIGFyZVxuICAgICAqIG1vdW50ZWQuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7RG9tQ29tcG9uZW50fVxuICAgICAqL1xuICAgIGdldCBwYXJlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQ7XG4gICAgfVxuXG4gICAgc2V0IHBhcmVudChwYXJlbnQpIHtcbiAgICAgICAgdGhpcy4kcGFyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgdGhlbWVgIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICovXG4gICAgZ2V0IHRoZW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kdGhlbWU7XG4gICAgfVxuXG4gICAgc2V0IHRoZW1lKHZhbHVlKSB7XG4gICAgICAgIGlmKCF2YWxpZGF0ZSh2YWx1ZSwgJ29iamVjdCcpKSB7XG4gICAgICAgICAgICBlcnJvcihDb25zb2xlTWVzc2FnZXMudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4kdGhlbWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGxhbmd1YWdlIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICovXG4gICAgZ2V0IGxhbmd1YWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kbGFuZ3VhZ2U7XG4gICAgfVxuXG4gICAgc2V0IGxhbmd1YWdlKHZhbHVlKSB7XG4gICAgICAgIGlmKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUgPSBsYW5ndWFnZSh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighdmFsaWRhdGUodmFsdWUsICdvYmplY3QnKSkge1xuICAgICAgICAgICAgZXJyb3IoQ29uc29sZU1lc3NhZ2VzLmxhbmd1YWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuJGxhbmd1YWdlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNsYXRlIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBzdHJpbmcgLSBUaGUgc3RyaW5nIHRvIHRyYW5zbGF0ZS5cbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gVGhlIHRyYW5zbGF0ZWQgc3RyaW5nLiBJZiBubyB0cmFubGF0aW9uIGZvdW5kLCB0aGVcbiAgICAgKiAgICAgdW50cmFuc2xhdGVkIHN0cmluZyBpcyByZXR1cm5lZC5cbiAgICAgKi9cbiAgICB0cmFuc2xhdGUoc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGUoc3RyaW5nLCB0aGlzLmxhbmd1YWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyB0byB0cmFuc2xhdGUoc3RyaW5nKTtcbiAgICAgKlxuICAgICAqIEBhbGlhcyBEb21Db21wb25lbnQudHJhbnNsYXRlXG4gICAgICovXG4gICAgdChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlKHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVyIHRoZSBET00gY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9IC0gVGhlIGBlbGAgYXR0cmlidXRlLlxuICAgICAqL1xuXHRyZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IGVsID0gY3JlYXRlRWxlbWVudCgnZGl2Jywge1xuICAgICAgICAgICAgY2xhc3M6IHRoaXMuY2xhc3NOYW1lID09PSAnZmxpcC1jbG9jaycgPyB0aGlzLmNsYXNzTmFtZSA6ICdmbGlwLWNsb2NrLScgKyB0aGlzLmNsYXNzTmFtZVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRoZW1lW3RoaXMubmFtZV0oZWwsIHRoaXMpO1xuXG4gICAgICAgIGlmKCF0aGlzLmVsKSB7XG4gICAgICAgICAgICB0aGlzLmVsID0gZWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZih0aGlzLmVsLmlubmVySFRNTCAhPT0gZWwuaW5uZXJIVE1MKSB7XG4gICAgICAgICAgICB0aGlzLmVsID0gc3dhcChlbCwgdGhpcy5lbCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5lbDtcblx0fVxuXG4gICAgLyoqXG4gICAgICogTW91bnQgYSBET00gY29tcG9uZW50IHRvIGEgcGFyZW50IG5vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gcGFyZW50IC0gVGhlIHBhcmVudCBET00gbm9kZS5cbiAgICAgKiBAcGFyYW0gIHsoZmFsc2V8SFRNTEVsZW1lbnQpfSBbYmVmb3JlPWZhbHNlXSAtIElmIGBmYWxzZWAsIGVsZW1lbnQgaXNcbiAgICAgKiAgICAgYXBwZW5kZWQgdG8gdGhlIHBhcmVudCBub2RlLiBJZiBhbiBpbnN0YW5jZSBvZiBhbiBgSFRNTEVsZW1lbnRgLFxuICAgICAqICAgICB0aGUgY29tcG9uZW50IHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gLSBUaGUgYGVsYCBhdHRyaWJ1dGUuXG4gICAgICovXG4gICAgbW91bnQocGFyZW50LCBiZWZvcmUgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcblxuICAgICAgICBpZighYmVmb3JlKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmVsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Lmluc2VydEJlZm9yZSh0aGlzLmVsLCBiZWZvcmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZWw7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgRG9tQ29tcG9uZW50IGZyb20gJy4vRG9tQ29tcG9uZW50JztcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgYERpdmlkZXJgIGluc3RhbmNlLlxuICpcbiAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gcmV0dXJuIGEgdW5pcXVlIGNsYXNzIG5hbWUgc28gdGhlIHRoZW1lIGNhblxuICogcmVuZGVyIGl0IGFwcHJvcHJpYXRlbHksIHNpbmNlIGVhY2ggYERvbUNvbXBvbmVudGAgY2FuIHJlY2VpdmUgaXRzIG93biB0ZW1wbGF0ZVxuICogZnJvbSB0aGUgdGhlbWUuXG4gKlxuICogQGNsYXNzIERpdmlkZXJcbiAqIEBleHRlbmRzIERvbUNvbXBvbmVudFxuICogQHBhcmFtIHsob2JqZWN0fHVuZGVmaW5lZCl9IFthdHRyaWJ1dGVzXSAtIFRoZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaXZpZGVyIGV4dGVuZHMgRG9tQ29tcG9uZW50IHtcblxuICAgIC8qKlxuICAgICAqIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGRlZmluZU5hbWUoKSB7XG4gICAgICAgIHJldHVybiAnRGl2aWRlcic7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgRG9tQ29tcG9uZW50IGZyb20gJy4vRG9tQ29tcG9uZW50JztcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnLi4vSGVscGVycy9GdW5jdGlvbnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXN0SXRlbSBleHRlbmRzIERvbUNvbXBvbmVudCB7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVwcmVzZW50IGEgc2luZ2xlIGRpZ2l0cyBpbiBhIGBMaXN0YC5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBMaXN0SXRlbVxuICAgICAqIEBleHRlbmRzIERvbUNvbXBvbmVudFxuICAgICAqIEBwYXJhbSB7KE51bWJlcnxTdHJpbmcpfSB2YWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgYExpc3RJdGVtYC5cbiAgICAgKiBAcGFyYW0ge29iamVjdHx1bmRlZmluZWR9IFthdHRyaWJ1dGVzXSAtIFRoZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlLCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHN1cGVyKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH0sIGlzT2JqZWN0KHZhbHVlKSA/IHZhbHVlIDogbnVsbCwgYXR0cmlidXRlcykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGRlZmluZU5hbWUoKSB7XG4gICAgICAgIHJldHVybiAnTGlzdEl0ZW0nO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IERpdmlkZXIgZnJvbSAnLi9EaXZpZGVyJztcbmltcG9ydCBMaXN0SXRlbSBmcm9tICcuL0xpc3RJdGVtJztcbmltcG9ydCBEb21Db21wb25lbnQgZnJvbSAnLi9Eb21Db21wb25lbnQnO1xuaW1wb3J0IHsgbmV4dCwgcHJldiwgIH0gZnJvbSAnLi4vSGVscGVycy9WYWx1ZSc7XG5pbXBvcnQgeyBpc09iamVjdCwgIH0gZnJvbSAnLi4vSGVscGVycy9GdW5jdGlvbnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXN0IGV4dGVuZHMgRG9tQ29tcG9uZW50IHtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBhZGQgYSBkaWdpdCB0byB0aGUgY2xvY2sgZmFjZS4gVGhpcyBjbGFzcyBpcyBjYWxsZWRcbiAgICAgKiBgTGlzdGAgYmVjYXVzZSBpdCBjb250YWlucyBhIGxpc3Qgb2YgYExpc3RJdGVtYCdzIHdoaWNoIGFyZSB1c2VkIHRvXG4gICAgICogY3JlYXRlIGZsaXAgZWZmZWN0cy4gSW4gdGhlIGNvbnRleHQgb2YgRmxpcENsb2NrLmpzIGEgYExpc3RgIHJlcHJlc2VudHNcbiAgICAgKiBvbmUgc2luZ2xlIGRpZ2l0LlxuICAgICAqXG4gICAgICogQGNsYXNzIExpc3RcbiAgICAgKiBAZXh0ZW5kcyBEb21Db21wb25lbnRcbiAgICAgKiBAcGFyYW0ge051bWJlcnxTdHJpbmd8T2JqZWN0fSBsYWJlbCAtIFRoZSBhY3RpdmUgdmFsdWUuIElmIGFuIG9iamVjdCwgaXRcbiAgICAgKiBpcyBhc3N1bWVkIHRoYXQgaXQgaXMgdGhlIGluc3RhbmNlIGF0dHJpYnV0ZXMuXG4gICAgICogQHBhcmFtIHtvYmplY3R8dW5kZWZpbmVkfSBbYXR0cmlidXRlc10gLSBUaGUgaW5zdGFuY2UgYXR0cmlidXRlcy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSwgYXR0cmlidXRlcykge1xuICAgICAgICBzdXBlcihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgfSwgaXNPYmplY3QodmFsdWUpID8gdmFsdWUgOiBudWxsLCBhdHRyaWJ1dGVzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBgdmFsdWVgIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHsoTnVtYmVyfFN0cmluZyl9XG4gICAgICovXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kdmFsdWU7XG4gICAgfVxuICAgIHNldCB2YWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLiR2YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYGl0ZW1zYCBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7KE51bWJlcnxTdHJpbmcpfVxuICAgICAqL1xuICAgIGdldCBpdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJGl0ZW1zO1xuICAgIH1cblxuICAgIHNldCBpdGVtcyh2YWx1ZSkge1xuICAgICAgICB0aGlzLiRpdGVtcyA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBtZXRob2QgdG8gaW5zdGFudGlhdGUgYSBuZXcgYExpc3RJdGVtYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAgeyhOdW1iZXJ8U3RyaW5nKX0gdmFsdWUgLSBUaGUgYExpc3RJdGVtYCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gIHsoT2JqZWN0fHVuZGVmaW5lZCl9IFthdHRyaWJ1dGVzXSAtIFRoZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLlxuICAgICAqIEByZXR1cm4ge0xpc3RJdGVtfSAtIFRoZSBpbnN0YW50aWF0ZWQgYExpc3RJdGVtYC5cbiAgICAgKi9cbiAgICBjcmVhdGVMaXN0SXRlbSh2YWx1ZSwgYXR0cmlidXRlcykge1xuICAgICAgICBjb25zdCBpdGVtID0gbmV3IExpc3RJdGVtKHZhbHVlLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIHRoZW1lOiB0aGlzLnRoZW1lLFxuICAgICAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2VcbiAgICAgICAgfSwgYXR0cmlidXRlcykpO1xuXG4gICAgICAgIHRoaXMuJGl0ZW1zLnB1c2goaXRlbSk7XG5cbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICdMaXN0JztcbiAgICB9XG5cbn1cbiIsImltcG9ydCBEb21Db21wb25lbnQgZnJvbSAnLi9Eb21Db21wb25lbnQnO1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzQXJyYXkgfSBmcm9tICcuLi9IZWxwZXJzL0Z1bmN0aW9ucyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyb3VwIGV4dGVuZHMgRG9tQ29tcG9uZW50IHtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBncm91cCB2YWx1ZXMgd2l0aGluIGEgY2xvY2sgZmFjZS4gSG93IHRoZSBncm91cHNcbiAgICAgKiBhcmUgZGlzcGxheWVkIGlzIGRldGVybWluZWQgYnkgdGhlIHRoZW1lLlxuICAgICAqXG4gICAgICogQGNsYXNzIEdyb3VwXG4gICAgICogQGV4dGVuZHMgRG9tQ29tcG9uZW50XG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGl0ZW1zIC0gQW4gYXJyYXkgYExpc3RgIGluc3RhbmNlcyBvciBhbiBvYmplY3Qgb2ZcbiAgICAgKiAgICAgYXR0cmlidXRlcy4gSWYgbm90IGFuIGFycmF5LCBhc3N1bWVkIHRvIGJlIHRoZSBhdHRyaWJ1dGVzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fHVuZGVmaW5lZH0gW2F0dHJpYnV0ZXNdIC0gVGhlIGluc3RhbmNlIGF0dHJpYnV0ZXMuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoaXRlbXMsIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgc3VwZXIoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBpdGVtczogaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtdXG4gICAgICAgIH0sIChpc09iamVjdChpdGVtcykgPyBpdGVtcyA6IG51bGwpLCBhdHRyaWJ1dGVzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICdHcm91cCc7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgRG9tQ29tcG9uZW50IGZyb20gJy4vRG9tQ29tcG9uZW50JztcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnLi4vSGVscGVycy9GdW5jdGlvbnMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWJlbCBleHRlbmRzIERvbUNvbXBvbmVudCB7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gYWRkIGEgbGFiZWwgdG8gdGhlIGNsb2NrIGZhY2UuXG4gICAgICpcbiAgICAgKiBAY2xhc3MgTGFiZWxcbiAgICAgKiBAZXh0ZW5kcyBEb21Db21wb25lbnRcbiAgICAgKiBAcGFyYW0ge051bWJlcnxTdHJpbmd8T2JqZWN0fSBsYWJlbCAtIFRoZSBsYWJlbCBhdHRyaWJ1dGUuIElmIGFuIG9iamVjdCxcbiAgICAgKiAgICAgaXQgaXMgYXNzdW1lZCB0aGF0IGl0IGlzIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fHVuZGVmaW5lZH0gW2F0dHJpYnV0ZXNdIC0gVGhlIGluc3RhbmNlIGF0dHJpYnV0ZXMuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobGFiZWwsIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgc3VwZXIoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBsYWJlbDogbGFiZWxcbiAgICAgICAgfSwgKGlzT2JqZWN0KGxhYmVsKSA/IGxhYmVsIDogbnVsbCksIGF0dHJpYnV0ZXMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmVOYW1lKCkge1xuICAgICAgICByZXR1cm4gJ0xhYmVsJztcbiAgICB9XG5cbn1cbiIsImltcG9ydCBDb21wb25lbnQgZnJvbSAnLi9Db21wb25lbnQnO1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzTnVtYmVyLCBjYWxsYmFjayB9IGZyb20gJy4uL0hlbHBlcnMvRnVuY3Rpb25zJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGBUaW1lcmAgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAY2xhc3MgVGltZXJcbiAgICAgKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAgICAgKiBAcGFyYW0geyhPYmplY3R8TnVtYmVyKX0gaW50ZXJ2YWwgLSBUaGUgaW50ZXJ2YWwgcGFzc2VkIGFzIGEgYE51bWJlcmAsXG4gICAgICogICAgIG9yIGNhbiBzZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgY2xhc3Mgd2l0aCBhbiBvYmplY3QuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoaW50ZXJ2YWwpIHtcbiAgICAgICAgc3VwZXIoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBjb3VudDogMCxcbiAgICAgICAgICAgIGhhbmRsZTogbnVsbCxcbiAgICAgICAgICAgIHN0YXJ0ZWQ6IG51bGwsXG4gICAgICAgICAgICBydW5uaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGludGVydmFsOiBpc051bWJlcihpbnRlcnZhbCkgPyBpbnRlcnZhbCA6IG51bGwsXG4gICAgICAgIH0sIGlzT2JqZWN0KGludGVydmFsKSA/IGludGVydmFsIDogbnVsbCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgZWxhcHNlZGAgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQHR5cGUge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgZWxhcHNlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmxhc3RMb29wID8gMCA6IHRoaXMubGFzdExvb3AgLSAoXG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPyB0aGlzLnN0YXJ0ZWQuZ2V0VGltZSgpIDogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGlzUnVubmluZ2AgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0IGlzUnVubmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVubmluZyA9PT0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGlzU3RvcHBlZGAgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0IGlzU3RvcHBlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVubmluZyA9PT0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSB0aW1lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAgeyhGdW5jdGlvbnx1bmRlZmluZWQpfSBmbiAtIFRoZSBpbnRlcnZhbCBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJuIHtUaW1lcn0gLSBUaGUgYFRpbWVyYCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICByZXNldChmbikge1xuICAgICAgICB0aGlzLnN0b3AoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb3VudCA9IDA7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0KCgpID0+IGNhbGxiYWNrLmNhbGwodGhpcywgZm4pKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVzZXQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRoZSB0aW1lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiAtIFRoZSBpbnRlcnZhbCBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJuIHtUaW1lcn0gLSBUaGUgYFRpbWVyYCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBzdGFydChmbikge1xuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBuZXcgRGF0ZTtcbiAgICAgICAgdGhpcy5sYXN0TG9vcCA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMucnVubmluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuZW1pdCgnc3RhcnQnKTtcblxuICAgICAgICBjb25zdCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYoRGF0ZS5ub3coKSAtIHRoaXMubGFzdExvb3AgPj0gdGhpcy5pbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgZm4pO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdExvb3AgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnaW50ZXJ2YWwnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGxvb3AoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9wcyB0aGUgdGltZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gZm4gLSBUaGUgc3RvcCBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJuIHtUaW1lcn0gLSBUaGUgYFRpbWVyYCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBzdG9wKGZuKSB7XG4gICAgICAgIGlmKHRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5oYW5kbGUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIGZuKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc3RvcCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmVOYW1lKCkge1xuICAgICAgICByZXR1cm4gJ1RpbWVyJztcbiAgICB9XG59XG4iLCJpbXBvcnQgRmFjZSBmcm9tICcuLi9Db21wb25lbnRzL0ZhY2UnO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2MgVGhpcyBmYWNlIGlzIGRlc2lnbmVkIHRvIGluY3JlbWVudCBhbmQgZGVjcmVtZW50IG51bWJlcmljIHZhbHVlcyxcbiAqICAgICBub3QgYERhdGVgIG9iamVjdHMuXG4gKiBAZXh0ZW5kcyBGYWNlXG4gKiBAcGFyYW0geyhGYWNlVmFsdWV8b2JqZWN0KX0gdmFsdWUgLSBUaGUgYEZhY2VgIHZhbHVlLiBJZiBub3QgYW4gaW5zdGFuY2VcbiAqICAgICBvZiBGYWNlVmFsdWUsIHRoaXMgYXJndW1lbnQgaXMgYXNzdW1lZCB0byBiZSB0aGUgaW5zdGFuY2UgYXR0cmlidXRlcy5cbiAqIEBwYXJhbSB7KG9iamVjdHx1bmRlZmluZWQpfSBbYXR0cmlidXRlc10gLSBUaGUgaW5zdGFuY2UgYXR0cmlidXRlcy5cbiAqIEBtZW1iZXJvZiBGYWNlc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb3VudGVyIGV4dGVuZHMgRmFjZSB7XG5cbiAgICBpbmNyZW1lbnQoaW5zdGFuY2UsIHZhbHVlID0gMSkge1xuICAgICAgICBpbnN0YW5jZS52YWx1ZSA9IHRoaXMudmFsdWUudmFsdWUgKyB2YWx1ZTtcbiAgICB9XG5cbiAgICBkZWNyZW1lbnQoaW5zdGFuY2UsIHZhbHVlID0gMSkge1xuICAgICAgICBpbnN0YW5jZS52YWx1ZSA9IHRoaXMudmFsdWUudmFsdWUgLSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmVOYW1lKCkge1xuICAgICAgICByZXR1cm4gJ0NvdW50ZXInO1xuICAgIH1cbn1cbiIsImltcG9ydCBGYWNlIGZyb20gJy4uL0NvbXBvbmVudHMvRmFjZSc7XG5pbXBvcnQgeyBub29wLCByb3VuZCwgaXNOdWxsLCBpc1VuZGVmaW5lZCwgaXNOdW1iZXIsIGNhbGxiYWNrIH0gZnJvbSAnLi4vSGVscGVycy9GdW5jdGlvbnMnO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2MgVGhpcyBmYWNlIGlzIG1lYW50IHRvIGRpc3BsYXkgYSBjbG9jayB0aGF0IHNob3dzIG1pbnV0ZXMsIGFuZFxuICogICAgIHNlY29uZHMuXG4gKiBAZXh0ZW5kcyBGYWNlXG4gKiBAcGFyYW0geyhGYWNlVmFsdWV8b2JqZWN0KX0gdmFsdWUgLSBUaGUgYEZhY2VgIHZhbHVlLiBJZiBub3QgYW4gaW5zdGFuY2VcbiAqICAgICBvZiBGYWNlVmFsdWUsIHRoaXMgYXJndW1lbnQgaXMgYXNzdW1lZCB0byBiZSB0aGUgaW5zdGFuY2UgYXR0cmlidXRlcy5cbiAqIEBwYXJhbSB7KG9iamVjdHx1bmRlZmluZWQpfSBbYXR0cmlidXRlc10gLSBUaGUgaW5zdGFuY2UgYXR0cmlidXRlcy5cbiAqIEBtZW1iZXJvZiBGYWNlc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNaW51dGVDb3VudGVyIGV4dGVuZHMgRmFjZSB7XG5cbiAgICBkZWZhdWx0RGF0YVR5cGUoKSB7XG4gICAgICAgIHJldHVybiBEYXRlO1xuICAgIH1cblxuICAgIGRlZmF1bHRBdHRyaWJ1dGVzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2hvd1NlY29uZHM6IHRydWUsXG4gICAgICAgICAgICBzaG93TGFiZWxzOiB0cnVlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc2hvdWxkU3RvcChpbnN0YW5jZSkge1xuICAgICAgICBpZihpc051bGwoaW5zdGFuY2Uuc3RvcEF0KSB8fCBpc1VuZGVmaW5lZChpbnN0YW5jZS5zdG9wQXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLnN0b3BBdCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvdW50ZG93biA/XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wQXQuZ2V0VGltZSgpID49IHRoaXMudmFsdWUudmFsdWUuZ2V0VGltZSgpOlxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcEF0LmdldFRpbWUoKSA8PSB0aGlzLnZhbHVlLnZhbHVlLmdldFRpbWUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKGlzTnVtYmVyKHRoaXMuc3RvcEF0KSkge1xuICAgICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguZmxvb3IoKHRoaXMudmFsdWUudmFsdWUuZ2V0VGltZSgpIC0gdGhpcy5vcmlnaW5hbFZhbHVlLmdldFRpbWUoKSkgLyAxMDAwKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY291bnRkb3duID9cbiAgICAgICAgICAgICAgICB0aGlzLnN0b3BBdCA+PSBkaWZmOlxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcEF0IDw9IGRpZmY7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRoZSBzdG9wQXQgcHJvcGVydHkgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBEYXRlIG9yIE51bWJlci5gKTtcbiAgICB9XG5cbiAgICBpbmNyZW1lbnQoaW5zdGFuY2UsIHZhbHVlID0gMCkge1xuICAgICAgICBpbnN0YW5jZS52YWx1ZSA9IG5ldyBEYXRlKHRoaXMudmFsdWUudmFsdWUuZ2V0VGltZSgpICsgdmFsdWUgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBpbnN0YW5jZS50aW1lci5sYXN0TG9vcCkpO1xuICAgIH1cblxuICAgIGRlY3JlbWVudChpbnN0YW5jZSwgdmFsdWUgPSAwKSB7XG4gICAgICAgIGluc3RhbmNlLnZhbHVlID0gbmV3IERhdGUodGhpcy52YWx1ZS52YWx1ZS5nZXRUaW1lKCkgLSB2YWx1ZSAtIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGluc3RhbmNlLnRpbWVyLmxhc3RMb29wKSk7XG4gICAgfVxuXG4gICAgZm9ybWF0KGluc3RhbmNlLCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBzdGFydGVkID0gaW5zdGFuY2UudGltZXIuaXNSdW5uaW5nID8gaW5zdGFuY2UudGltZXIuc3RhcnRlZCA6IG5ldyBEYXRlKERhdGUubm93KCkgLSA1MCk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIFt0aGlzLmdldE1pbnV0ZXModmFsdWUsIHN0YXJ0ZWQpXSxcbiAgICAgICAgICAgIHRoaXMuc2hvd1NlY29uZHMgPyBbdGhpcy5nZXRTZWNvbmRzKHZhbHVlLCBzdGFydGVkKV0gOiBudWxsXG4gICAgICAgIF0uZmlsdGVyKG5vb3ApO1xuICAgIH1cblxuICAgIGdldE1pbnV0ZXMoYSwgYikge1xuICAgICAgICByZXR1cm4gcm91bmQodGhpcy5nZXRUb3RhbFNlY29uZHMoYSwgYikgLyA2MCk7XG4gICAgfVxuXG4gICAgZ2V0U2Vjb25kcyhhLCBiKSB7XG4gICAgICAgIGNvbnN0IHRvdGFsU2Vjb25kcyA9IHRoaXMuZ2V0VG90YWxTZWNvbmRzKGEsIGIpO1xuXG4gICAgICAgIHJldHVybiBNYXRoLmFicyhNYXRoLmNlaWwodG90YWxTZWNvbmRzID09PSA2MCA/IDAgOiB0b3RhbFNlY29uZHMgJSA2MCkpO1xuICAgIH1cblxuICAgIGdldFRvdGFsU2Vjb25kcyhhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLmdldFRpbWUoKSA9PT0gYi5nZXRUaW1lKCkgPyAwIDogTWF0aC5yb3VuZCgoYS5nZXRUaW1lKCkgLSBiLmdldFRpbWUoKSkgLyAxMDAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmVOYW1lKCkge1xuICAgICAgICByZXR1cm4gJ01pbnV0ZUNvdW50ZXInO1xuICAgIH1cbn1cbiIsImltcG9ydCBNaW51dGVDb3VudGVyIGZyb20gJy4vTWludXRlQ291bnRlcic7XG5cbi8qKlxuICogQGNsYXNzZGVzYyBUaGlzIGZhY2UgaXMgbWVhbnQgdG8gZGlzcGxheSBhIGNsb2NrIHRoYXQgc2hvd3NcbiAqICAgICBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMuXG4gKiBAZXh0ZW5kcyBGYWNlXG4gKiBAcGFyYW0geyhGYWNlVmFsdWV8b2JqZWN0KX0gdmFsdWUgLSBUaGUgYEZhY2VgIHZhbHVlLiBJZiBub3QgYW4gaW5zdGFuY2VcbiAqICAgICBvZiBGYWNlVmFsdWUsIHRoaXMgYXJndW1lbnQgaXMgYXNzdW1lZCB0byBiZSB0aGUgaW5zdGFuY2UgYXR0cmlidXRlcy5cbiAqIEBwYXJhbSB7KG9iamVjdHx1bmRlZmluZWQpfSBbYXR0cmlidXRlc10gLSBUaGUgaW5zdGFuY2UgYXR0cmlidXRlcy5cbiAqIEBtZW1iZXJvZiBGYWNlc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIb3VyQ291bnRlciBleHRlbmRzIE1pbnV0ZUNvdW50ZXIge1xuXG4gICAgZm9ybWF0KGluc3RhbmNlLCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBub3cgPSAhaW5zdGFuY2UudGltZXIuc3RhcnRlZCA/IG5ldyBEYXRlIDogdmFsdWU7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSBpbnN0YW5jZS5vcmlnaW5hbFZhbHVlIHx8IHZhbHVlO1xuICAgICAgICBjb25zdCBhID0gIXRoaXMuY291bnRkb3duID8gbm93IDogb3JpZ2luYWxWYWx1ZTtcbiAgICAgICAgY29uc3QgYiA9ICF0aGlzLmNvdW50ZG93biA/IG9yaWdpbmFsVmFsdWUgOiBub3c7XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IFtcbiAgICAgICAgICAgIFt0aGlzLmdldEhvdXJzKGEsIGIpXSxcbiAgICAgICAgICAgIFt0aGlzLmdldE1pbnV0ZXMoYSwgYildXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYodGhpcy5zaG93U2Vjb25kcykge1xuICAgICAgICAgICAgZGF0YS5wdXNoKFt0aGlzLmdldFNlY29uZHMoYSwgYildKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGdldE1pbnV0ZXMoYSwgYikge1xuICAgICAgICByZXR1cm4gTWF0aC5hYnMoc3VwZXIuZ2V0TWludXRlcyhhLCBiKSAlIDYwKTtcbiAgICB9XG5cbiAgICBnZXRIb3VycyhhLCBiKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMuZ2V0VG90YWxTZWNvbmRzKGEsIGIpIC8gNjAgLyA2MCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICdIb3VyQ291bnRlcic7XG4gICAgfVxufVxuIiwiaW1wb3J0IEhvdXJDb3VudGVyIGZyb20gJy4vSG91ckNvdW50ZXInO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2MgVGhpcyBmYWNlIGlzIG1lYW50IHRvIGRpc3BsYXkgYSBjbG9jayB0aGF0IHNob3dzIGRheXMsIGhvdXJzLFxuICogICAgIG1pbnV0ZXMsIGFuZCBzZWNvbmRzLlxuICogQGV4dGVuZHMgSG91ckNvdW50ZXJcbiAqIEBwYXJhbSB7KEZhY2VWYWx1ZXxvYmplY3QpfSB2YWx1ZSAtIFRoZSBgRmFjZWAgdmFsdWUuIElmIG5vdCBhbiBpbnN0YW5jZVxuICogICAgIG9mIEZhY2VWYWx1ZSwgdGhpcyBhcmd1bWVudCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIHsob2JqZWN0fHVuZGVmaW5lZCl9IFthdHRyaWJ1dGVzXSAtIFRoZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLlxuICogQG1lbWJlcm9mIEZhY2VzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERheUNvdW50ZXIgZXh0ZW5kcyBIb3VyQ291bnRlciB7XG5cbiAgICBmb3JtYXQoaW5zdGFuY2UsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9ICFpbnN0YW5jZS5zdGFydGVkID8gbmV3IERhdGUgOiB2YWx1ZTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IGluc3RhbmNlLm9yaWdpbmFsVmFsdWUgfHwgdmFsdWU7XG4gICAgICAgIGNvbnN0IGEgPSAhdGhpcy5jb3VudGRvd24gPyBub3cgOiBvcmlnaW5hbFZhbHVlO1xuICAgICAgICBjb25zdCBiID0gIXRoaXMuY291bnRkb3duID8gb3JpZ2luYWxWYWx1ZSA6IG5vdztcblxuICAgICAgICBjb25zdCBkYXRhID0gW1xuICAgICAgICAgICAgW3RoaXMuZ2V0RGF5cyhhLCBiKV0sXG4gICAgICAgICAgICBbdGhpcy5nZXRIb3VycyhhLCBiKV0sXG4gICAgICAgICAgICBbdGhpcy5nZXRNaW51dGVzKGEsIGIpXVxuICAgICAgICBdO1xuXG4gICAgICAgIGlmKHRoaXMuc2hvd1NlY29uZHMpIHtcbiAgICAgICAgICAgIGRhdGEucHVzaChbdGhpcy5nZXRTZWNvbmRzKGEsIGIpXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBnZXREYXlzKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5nZXRUb3RhbFNlY29uZHMoYSwgYikgLyA2MCAvIDYwIC8gMjQpO1xuICAgIH1cblxuICAgIGdldEhvdXJzKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHN1cGVyLmdldEhvdXJzKGEsIGIpICUgMjQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGRlZmluZU5hbWUoKSB7XG4gICAgICAgIHJldHVybiAnRGF5Q291bnRlcic7XG4gICAgfVxufVxuIiwiaW1wb3J0IEZhY2UgZnJvbSAnLi4vQ29tcG9uZW50cy9GYWNlJztcbmltcG9ydCB7IGNhbGxiYWNrIH0gZnJvbSAnLi4vSGVscGVycy9GdW5jdGlvbnMnO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2MgVGhpcyBmYWNlIHNob3dzIHRoZSBjdXJyZW50IHRpbWUgaW4gdHdlbnR5LWZvdXIgaG91ciBmb3JtYXQuXG4gKiBAZXh0ZW5kcyBGYWNlXG4gKiBAcGFyYW0geyhGYWNlVmFsdWV8b2JqZWN0KX0gdmFsdWUgLSBUaGUgYEZhY2VgIHZhbHVlLiBJZiBub3QgYW4gaW5zdGFuY2VcbiAqICAgICBvZiBGYWNlVmFsdWUsIHRoaXMgYXJndW1lbnQgaXMgYXNzdW1lZCB0byBiZSB0aGUgaW5zdGFuY2UgYXR0cmlidXRlcy5cbiAqIEBwYXJhbSB7KG9iamVjdHx1bmRlZmluZWQpfSBbYXR0cmlidXRlc10gLSBUaGUgaW5zdGFuY2UgYXR0cmlidXRlcy5cbiAqIEBtZW1iZXJvZiBGYWNlc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUd2VudHlGb3VySG91ckNsb2NrIGV4dGVuZHMgRmFjZSB7XG5cbiAgICBkZWZhdWx0RGF0YVR5cGUoKSB7XG4gICAgICAgIHJldHVybiBEYXRlO1xuICAgIH1cblxuICAgIGRlZmF1bHRWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlO1xuICAgIH1cblxuICAgIGRlZmF1bHRBdHRyaWJ1dGVzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2hvd1NlY29uZHM6IHRydWUsXG4gICAgICAgICAgICBzaG93TGFiZWxzOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZvcm1hdChpbnN0YW5jZSwgdmFsdWUpIHtcbiAgICAgICAgaWYoIXZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ3JvdXBzID0gW1xuICAgICAgICAgICAgW3ZhbHVlLmdldEhvdXJzKCldLFxuICAgICAgICAgICAgW3ZhbHVlLmdldE1pbnV0ZXMoKV1cbiAgICAgICAgXTtcblxuICAgICAgICBpZih0aGlzLnNob3dTZWNvbmRzKSB7XG4gICAgICAgICAgICBncm91cHMucHVzaChbdmFsdWUuZ2V0U2Vjb25kcygpXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ3JvdXBzO1xuICAgIH1cblxuICAgIGluY3JlbWVudChpbnN0YW5jZSwgb2Zmc2V0ID0gMCkge1xuICAgICAgICBpbnN0YW5jZS52YWx1ZSA9IG5ldyBEYXRlKHRoaXMudmFsdWUudmFsdWUuZ2V0VGltZSgpICsgb2Zmc2V0ICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gaW5zdGFuY2UudGltZXIubGFzdExvb3ApKTtcbiAgICB9XG5cbiAgICBkZWNyZW1lbnQoaW5zdGFuY2UsIG9mZnNldCA9IDApIHtcbiAgICAgICAgaW5zdGFuY2UudmFsdWUgPSBuZXcgRGF0ZSh0aGlzLnZhbHVlLnZhbHVlLmdldFRpbWUoKSAtIG9mZnNldCAtIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGluc3RhbmNlLnRpbWVyLmxhc3RMb29wKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICdUd2VudHlGb3VySG91ckNsb2NrJztcbiAgICB9XG59XG4iLCJpbXBvcnQgVHdlbnR5Rm91ckhvdXJDbG9jayBmcm9tICcuL1R3ZW50eUZvdXJIb3VyQ2xvY2snO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2MgVGhpcyBmYWNlIHNob3dzIHRoZSBjdXJyZW50IHRpbWUgaW4gdHdlbHZlIGhvdXIgZm9ybWF0LCB3aXRoIEFNXG4gKiAgICAgYW5kIFBNLlxuICogQGV4dGVuZHMgRmFjZVxuICogQHBhcmFtIHsoRmFjZVZhbHVlfG9iamVjdCl9IHZhbHVlIC0gVGhlIGBGYWNlYCB2YWx1ZS4gSWYgbm90IGFuIGluc3RhbmNlXG4gKiAgICAgb2YgRmFjZVZhbHVlLCB0aGlzIGFyZ3VtZW50IGlzIGFzc3VtZWQgdG8gYmUgdGhlIGluc3RhbmNlIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0geyhvYmplY3R8dW5kZWZpbmVkKX0gW2F0dHJpYnV0ZXNdIC0gVGhlIGluc3RhbmNlIGF0dHJpYnV0ZXMuXG4gKiBAbWVtYmVyb2YgRmFjZXNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHdlbHZlSG91ckNsb2NrIGV4dGVuZHMgVHdlbnR5Rm91ckhvdXJDbG9jayB7XG5cbiAgICBkZWZhdWx0QXR0cmlidXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNob3dMYWJlbHM6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd1NlY29uZHM6IHRydWUsXG4gICAgICAgICAgICBzaG93TWVyaWRpdW06IHRydWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmb3JtYXQoaW5zdGFuY2UsIHZhbHVlKSB7XG4gICAgICAgIGlmKCF2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhvdXJzID0gdmFsdWUuZ2V0SG91cnMoKTtcblx0XHRjb25zdCBncm91cHMgPSBbXG5cdFx0XHRob3VycyA+IDEyID8gaG91cnMgLSAxMiA6IChob3VycyA9PT0gMCA/IDEyIDogaG91cnMpLFxuXHRcdFx0dmFsdWUuZ2V0TWludXRlcygpXG5cdFx0XTtcblxuICAgICAgICB0aGlzLm1lcmlkaXVtID0gaG91cnMgPiAxMiA/ICdwbScgOiAnYW0nO1xuXG5cdFx0aWYodGhpcy5zaG93U2Vjb25kcykge1xuXHRcdFx0Z3JvdXBzLnB1c2godmFsdWUuZ2V0U2Vjb25kcygpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZ3JvdXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGRlZmluZU5hbWUoKSB7XG4gICAgICAgIHJldHVybiAnVHdlbHZlSG91ckNsb2NrJztcbiAgICB9XG59XG4iLCJpbXBvcnQgRGF5Q291bnRlciBmcm9tICcuL0RheUNvdW50ZXInO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2MgVGhpcyBmYWNlIGlzIG1lYW50IHRvIGRpc3BsYXkgYSBjbG9jayB0aGF0IHNob3dzIHdlZWtzLCBkYXlzLFxuICogICAgIGhvdXJzLCBtaW51dGVzLCBhbmQgc2Vjb25kcy5cbiAqIEBleHRlbmRzIEZhY2VcbiAqIEBwYXJhbSB7KEZhY2VWYWx1ZXxvYmplY3QpfSB2YWx1ZSAtIFRoZSBgRmFjZWAgdmFsdWUuIElmIG5vdCBhbiBpbnN0YW5jZVxuICogICAgIG9mIEZhY2VWYWx1ZSwgdGhpcyBhcmd1bWVudCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIHsob2JqZWN0fHVuZGVmaW5lZCl9IFthdHRyaWJ1dGVzXSAtIFRoZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLlxuICogQG1lbWJlcm9mIEZhY2VzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlZWtDb3VudGVyIGV4dGVuZHMgRGF5Q291bnRlciB7XG5cbiAgICBmb3JtYXQoaW5zdGFuY2UsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9ICFpbnN0YW5jZS50aW1lci5zdGFydGVkID8gbmV3IERhdGUgOiB2YWx1ZTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IGluc3RhbmNlLm9yaWdpbmFsVmFsdWUgfHwgdmFsdWU7XG4gICAgICAgIGNvbnN0IGEgPSAhdGhpcy5jb3VudGRvd24gPyBub3cgOiBvcmlnaW5hbFZhbHVlO1xuICAgICAgICBjb25zdCBiID0gIXRoaXMuY291bnRkb3duID8gb3JpZ2luYWxWYWx1ZSA6IG5vdztcblxuICAgICAgICBjb25zdCBkYXRhID0gW1xuICAgICAgICAgICAgW3RoaXMuZ2V0V2Vla3MoYSwgYildLFxuICAgICAgICAgICAgW3RoaXMuZ2V0RGF5cyhhLCBiKV0sXG4gICAgICAgICAgICBbdGhpcy5nZXRIb3VycyhhLCBiKV0sXG4gICAgICAgICAgICBbdGhpcy5nZXRNaW51dGVzKGEsIGIpXVxuICAgICAgICBdO1xuXG4gICAgICAgIGlmKHRoaXMuc2hvd1NlY29uZHMpIHtcbiAgICAgICAgICAgIGRhdGEucHVzaChbdGhpcy5nZXRTZWNvbmRzKGEsIGIpXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBnZXRXZWVrcyhhLCBiKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMuZ2V0VG90YWxTZWNvbmRzKGEsIGIpIC8gNjAgLyA2MCAvIDI0IC8gNyk7XG4gICAgfVxuXG4gICAgZ2V0RGF5cyhhLCBiKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyhzdXBlci5nZXREYXlzKGEsIGIpICUgNyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICdXZWVrQ291bnRlcic7XG4gICAgfVxufVxuIiwiaW1wb3J0IFdlZWtDb3VudGVyIGZyb20gJy4vV2Vla0NvdW50ZXInO1xuXG4vKipcbiAqIEBjbGFzc2Rlc2MgVGhpcyBmYWNlIGlzIG1lYW50IHRvIGRpc3BsYXkgYSBjbG9jayB0aGF0IHNob3dzIHllYXJzLCB3ZWVrcyxcbiAqICAgICBkYXlzLCBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMuXG4gKiBAZXh0ZW5kcyBGYWNlXG4gKiBAcGFyYW0geyhGYWNlVmFsdWV8b2JqZWN0KX0gdmFsdWUgLSBUaGUgYEZhY2VgIHZhbHVlLiBJZiBub3QgYW4gaW5zdGFuY2VcbiAqICAgICBvZiBGYWNlVmFsdWUsIHRoaXMgYXJndW1lbnQgaXMgYXNzdW1lZCB0byBiZSB0aGUgaW5zdGFuY2UgYXR0cmlidXRlcy5cbiAqIEBwYXJhbSB7KG9iamVjdHx1bmRlZmluZWQpfSBbYXR0cmlidXRlc10gLSBUaGUgaW5zdGFuY2UgYXR0cmlidXRlcy5cbiAqIEBtZW1iZXJvZiBGYWNlc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBZZWFyQ291bnRlciBleHRlbmRzIFdlZWtDb3VudGVyIHtcblxuICAgIGZvcm1hdChpbnN0YW5jZSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3Qgbm93ID0gIWluc3RhbmNlLnRpbWVyLnN0YXJ0ZWQgPyBuZXcgRGF0ZSA6IHZhbHVlO1xuICAgICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gaW5zdGFuY2Uub3JpZ2luYWxWYWx1ZSB8fCB2YWx1ZTtcbiAgICAgICAgY29uc3QgYSA9ICF0aGlzLmNvdW50ZG93biA/IG5vdyA6IG9yaWdpbmFsVmFsdWU7XG4gICAgICAgIGNvbnN0IGIgPSAhdGhpcy5jb3VudGRvd24gPyBvcmlnaW5hbFZhbHVlIDogbm93O1xuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBbXG4gICAgICAgICAgICBbdGhpcy5nZXRZZWFycyhhLCBiKV0sXG4gICAgICAgICAgICBbdGhpcy5nZXRXZWVrcyhhLCBiKV0sXG4gICAgICAgICAgICBbdGhpcy5nZXREYXlzKGEsIGIpXSxcbiAgICAgICAgICAgIFt0aGlzLmdldEhvdXJzKGEsIGIpXSxcbiAgICAgICAgICAgIFt0aGlzLmdldE1pbnV0ZXMoYSwgYildXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYodGhpcy5zaG93U2Vjb25kcykge1xuICAgICAgICAgICAgZGF0YS5wdXNoKFt0aGlzLmdldFNlY29uZHMoYSwgYildKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGdldFllYXJzKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5tYXgoMCwgdGhpcy5nZXRUb3RhbFNlY29uZHMoYSwgYikgLyA2MCAvIDYwIC8gMjQgLyA3IC8gNTIpKTtcbiAgICB9XG5cbiAgICBnZXRXZWVrcyhhLCBiKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyhzdXBlci5nZXRXZWVrcyhhLCBiKSAlIDUyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmVOYW1lKCkge1xuICAgICAgICByZXR1cm4gJ1llYXJDb3VudGVyJztcbiAgICB9XG59XG4iLCIvKipcbiAqIEZhY2VzIGFyZSBjbGFzc2VzIHRoYXQgaG9vayBpbnRvIHRoZSBjb3JlIG9mIEZsaXBjbG9jayB0byBwcm92aWRlIHVuaXF1ZVxuICogZnVuY3Rpb25hbGl0eS4gVGhlIGNvcmUgZG9lc24ndCBkbyBhIGxvdCwgZXhjZXB0IGZhY2lsaXRhdGUgdGhlIGludGVyYWN0aW9uXG4gKiBiZXR3ZWVuIGFsbCB0aGUgY29tcG9uZW50cy4gVGhlIEZhY2UgaXMgd2hhdCBtYWtlcyB0aGUgY2xvY2sgXCJ0aWNrXCIuXG4gKlxuICogQG5hbWVzcGFjZSBGYWNlc1xuICovXG5cbmltcG9ydCBDb3VudGVyIGZyb20gJy4vQ291bnRlcic7XG5pbXBvcnQgRGF5Q291bnRlciBmcm9tICcuL0RheUNvdW50ZXInO1xuaW1wb3J0IEhvdXJDb3VudGVyIGZyb20gJy4vSG91ckNvdW50ZXInO1xuaW1wb3J0IE1pbnV0ZUNvdW50ZXIgZnJvbSAnLi9NaW51dGVDb3VudGVyJztcbmltcG9ydCBUd2VsdmVIb3VyQ2xvY2sgZnJvbSAnLi9Ud2VsdmVIb3VyQ2xvY2snO1xuaW1wb3J0IFR3ZW50eUZvdXJIb3VyQ2xvY2sgZnJvbSAnLi9Ud2VudHlGb3VySG91ckNsb2NrJztcbmltcG9ydCBXZWVrQ291bnRlciBmcm9tICcuL1dlZWtDb3VudGVyJztcbmltcG9ydCBZZWFyQ291bnRlciBmcm9tICcuL1llYXJDb3VudGVyJztcblxuZXhwb3J0IHtcbiAgICBDb3VudGVyLFxuICAgIERheUNvdW50ZXIsXG4gICAgTWludXRlQ291bnRlcixcbiAgICBIb3VyQ291bnRlcixcbiAgICBUd2VsdmVIb3VyQ2xvY2ssXG4gICAgVHdlbnR5Rm91ckhvdXJDbG9jayxcbiAgICBXZWVrQ291bnRlcixcbiAgICBZZWFyQ291bnRlclxufTtcbiIsImltcG9ydCB7IGFwcGVuZENoaWxkcmVuLCBjcmVhdGVFbGVtZW50IH0gZnJvbSAnLi4vLi4vSGVscGVycy9UZW1wbGF0ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsLCBpbnN0YW5jZSkge1xuICAgIGFwcGVuZENoaWxkcmVuKGVsLCBbXG4gICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2RpdicsIHtjbGFzczogJ2ZsaXAtY2xvY2stZG90IHRvcCd9KSxcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZGl2Jywge2NsYXNzOiAnZmxpcC1jbG9jay1kb3QgYm90dG9tJ30pXG4gICAgXSk7XG59XG4iLCJpbXBvcnQgeyBuZXh0IH0gZnJvbSAnLi4vLi4vSGVscGVycy9WYWx1ZSc7XG5pbXBvcnQgeyBhcHBlbmRDaGlsZHJlbiB9IGZyb20gJy4uLy4uL0hlbHBlcnMvVGVtcGxhdGUnO1xuXG5mdW5jdGlvbiBjaGlsZChlbCwgaW5kZXgpIHtcbiAgICByZXR1cm4gZWwgPyAoZWwuY2hpbGROb2RlcyA/IGVsLmNoaWxkTm9kZXNbaW5kZXhdIDogZWxbaW5kZXhdKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNoYXIoZWwpIHtcbiAgICByZXR1cm4gZWwgPyBlbC5xdWVyeVNlbGVjdG9yKCcuZmxpcC1jbG9jay1saXN0LWl0ZW06Zmlyc3QtY2hpbGQgLnRvcCcpLmlubmVySFRNTCA6IG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsLCBpbnN0YW5jZSkge1xuICAgIGNvbnN0IHBhcnRzID0gaW5zdGFuY2UudmFsdWUuZGlnaXRzLm1hcCgoZ3JvdXAsIHgpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXBFbCA9IGNoaWxkKGluc3RhbmNlLmVsID8gaW5zdGFuY2UuZWwucXVlcnlTZWxlY3RvckFsbCgnLmZsaXAtY2xvY2stZ3JvdXAnKSA6IG51bGwsIHgpO1xuXG4gICAgICAgIGNvbnN0IGxpc3RzID0gZ3JvdXAubWFwKCh2YWx1ZSwgeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGlzdEVsID0gY2hpbGQoZ3JvdXBFbCA/IGdyb3VwRWwucXVlcnlTZWxlY3RvckFsbCgnLmZsaXAtY2xvY2stbGlzdCcpIDogbnVsbCwgeSk7XG4gICAgICAgICAgICBjb25zdCBsaXN0VmFsdWUgPSBjaGFyKGxpc3RFbCk7XG5cbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5jcmVhdGVMaXN0KHZhbHVlLCB7XG4gICAgICAgICAgICAgICAgZG9tVmFsdWU6IGxpc3RWYWx1ZSxcbiAgICAgICAgICAgICAgICBjb3VudGRvd246IGluc3RhbmNlLmNvdW50ZG93bixcbiAgICAgICAgICAgICAgICBhbmltYXRpb25SYXRlOiBpbnN0YW5jZS5mYWNlLmFuaW1hdGlvblJhdGUgfHwgaW5zdGFuY2UuZmFjZS5kZWxheVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5jcmVhdGVHcm91cChsaXN0cyk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBub2RlcyA9IHBhcnRzLm1hcChncm91cCA9PiB7XG4gICAgICAgIHJldHVybiBncm91cC5yZW5kZXIoKTtcbiAgICB9KTtcblxuICAgIGFwcGVuZENoaWxkcmVuKGVsLCBub2Rlcyk7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBhcHBlbmRDaGlsZHJlbiB9IGZyb20gJy4uLy4uL0hlbHBlcnMvVGVtcGxhdGUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbCwgaW5zdGFuY2UpIHtcbiAgICBjb25zdCBpdGVtcyA9IGluc3RhbmNlLml0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ucmVuZGVyKCk7XG4gICAgfSk7XG5cbiAgICBhcHBlbmRDaGlsZHJlbihlbCwgaXRlbXMpO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCB9IGZyb20gJy4uLy4uL0hlbHBlcnMvVGVtcGxhdGUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbCwgaW5zdGFuY2UpIHtcbiAgICBlbC5pbm5lckhUTUwgPSBpbnN0YW5jZS50KGluc3RhbmNlLmxhYmVsKTtcbn1cbiIsImltcG9ydCB7IG5leHQsIHByZXYgfSBmcm9tICcuLi8uLi9IZWxwZXJzL1ZhbHVlJztcbmltcG9ydCBMaXN0SXRlbSBmcm9tICcuLi8uLi9Db21wb25lbnRzL0xpc3RJdGVtJztcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIGFwcGVuZENoaWxkcmVuIH0gZnJvbSAnLi4vLi4vSGVscGVycy9UZW1wbGF0ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsLCBpbnN0YW5jZSkge1xuICAgIGNvbnN0IGJlZm9yZVZhbHVlID0gaW5zdGFuY2UuZG9tVmFsdWUgfHwgKFxuICAgICAgICAhaW5zdGFuY2UuY291bnRkb3duID8gcHJldihpbnN0YW5jZS52YWx1ZSkgOiBuZXh0KGluc3RhbmNlLnZhbHVlKVxuICAgICk7XG5cbiAgICBpZiggaW5zdGFuY2UuZG9tVmFsdWUgJiYgaW5zdGFuY2UuZG9tVmFsdWUgIT09IGluc3RhbmNlLnZhbHVlKSB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2ZsaXAnKTtcbiAgICB9XG5cbiAgICBlbC5zdHlsZS5hbmltYXRpb25EZWxheSA9IGAke2luc3RhbmNlLmFuaW1hdGlvblJhdGUgLyAyfW1zYDtcbiAgICBlbC5zdHlsZS5hbmltYXRpb25EdXJhdGlvbiA9IGAke2luc3RhbmNlLmFuaW1hdGlvblJhdGUgLyAyfW1zYDtcblxuICAgIGluc3RhbmNlLml0ZW1zID0gW1xuICAgICAgICBpbnN0YW5jZS5jcmVhdGVMaXN0SXRlbShpbnN0YW5jZS52YWx1ZSwge1xuICAgICAgICAgICAgYWN0aXZlOiB0cnVlXG4gICAgICAgIH0pLFxuICAgICAgICBpbnN0YW5jZS5jcmVhdGVMaXN0SXRlbShiZWZvcmVWYWx1ZSwge1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZVxuICAgICAgICB9KVxuICAgIF07XG5cbiAgICBhcHBlbmRDaGlsZHJlbihlbCwgaW5zdGFuY2UuaXRlbXMubWFwKGl0ZW0gPT4gaXRlbS5yZW5kZXIoKSkpO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgYXBwZW5kQ2hpbGRyZW4gfSBmcm9tICcuLi8uLi9IZWxwZXJzL1RlbXBsYXRlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWwsIGluc3RhbmNlKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaW5zdGFuY2UuYWN0aXZlID09PSB0cnVlID8gJ2FjdGl2ZScgOiAoXG4gICAgICAgIGluc3RhbmNlLmFjdGl2ZSA9PT0gZmFsc2UgPyAnYmVmb3JlJyA6IG51bGxcbiAgICApO1xuXG4gICAgZWwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuXG4gICAgYXBwZW5kQ2hpbGRyZW4oZWwsIFtcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnZGl2JywgW1xuICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZGl2JywgaW5zdGFuY2UudmFsdWUsIHtjbGFzczogJ3RvcCd9KSxcbiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2RpdicsIGluc3RhbmNlLnZhbHVlLCB7Y2xhc3M6ICdib3R0b20nfSlcbiAgICAgICAgXSwge2NsYXNzOiAnZmxpcC1jbG9jay1saXN0LWl0ZW0taW5uZXInfSlcbiAgICBdKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsLCBpbnN0YW5jZSkge1xuICAgIGluc3RhbmNlLmNyZWF0ZURpdmlkZXIoKS5tb3VudChlbCwgZWwuY2hpbGROb2Rlc1sxXSk7XG4gICAgaW5zdGFuY2UuY3JlYXRlRGl2aWRlcigpLm1vdW50KGVsLCBlbC5jaGlsZE5vZGVzWzNdKTtcblxuICAgIGlmKGluc3RhbmNlLmZhY2Uuc2hvd1NlY29uZHMpIHtcbiAgICAgICAgaW5zdGFuY2UuY3JlYXRlRGl2aWRlcigpLm1vdW50KGVsLCBlbC5jaGlsZE5vZGVzWzVdKTtcbiAgICB9XG5cbiAgICBpZihpbnN0YW5jZS5mYWNlLnNob3dMYWJlbHMpIHtcbiAgICAgICAgaW5zdGFuY2UuY3JlYXRlTGFiZWwoJ2RheXMnKS5tb3VudChlbC5jaGlsZE5vZGVzWzBdKTtcbiAgICAgICAgaW5zdGFuY2UuY3JlYXRlTGFiZWwoJ2hvdXJzJykubW91bnQoZWwuY2hpbGROb2Rlc1syXSk7XG4gICAgICAgIGluc3RhbmNlLmNyZWF0ZUxhYmVsKCdtaW51dGVzJykubW91bnQoZWwuY2hpbGROb2Rlc1s0XSk7XG5cbiAgICAgICAgaWYoaW5zdGFuY2UuZmFjZS5zaG93U2Vjb25kcykge1xuICAgICAgICAgICAgaW5zdGFuY2UuY3JlYXRlTGFiZWwoJ3NlY29uZHMnKS5tb3VudChlbC5jaGlsZE5vZGVzWzZdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVsLCBpbnN0YW5jZSkge1xuICAgIGluc3RhbmNlLmNyZWF0ZURpdmlkZXIoKS5tb3VudChlbCwgZWwuY2hpbGROb2Rlc1sxXSk7XG5cbiAgICBpZihpbnN0YW5jZS5mYWNlLnNob3dTZWNvbmRzKSB7XG4gICAgICAgIGluc3RhbmNlLmNyZWF0ZURpdmlkZXIoKS5tb3VudChlbCwgZWwuY2hpbGROb2Rlc1szXSk7XG4gICAgfVxuICAgIFxuICAgIGlmKGluc3RhbmNlLmZhY2Uuc2hvd0xhYmVscykge1xuICAgICAgICBpbnN0YW5jZS5jcmVhdGVMYWJlbCgnaG91cnMnKS5tb3VudChlbC5jaGlsZE5vZGVzWzBdKTtcbiAgICAgICAgaW5zdGFuY2UuY3JlYXRlTGFiZWwoJ21pbnV0ZXMnKS5tb3VudChlbC5jaGlsZE5vZGVzWzJdKTtcblxuICAgICAgICBpZihpbnN0YW5jZS5mYWNlLnNob3dTZWNvbmRzKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jcmVhdGVMYWJlbCgnc2Vjb25kcycpLm1vdW50KGVsLmNoaWxkTm9kZXNbNF0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWwsIGluc3RhbmNlKSB7XG4gICAgaWYoaW5zdGFuY2UuZmFjZS5zaG93U2Vjb25kcykge1xuICAgICAgICBpbnN0YW5jZS5jcmVhdGVEaXZpZGVyKCkubW91bnQoZWwsIGVsLmNoaWxkTm9kZXNbMV0pO1xuICAgIH1cblxuICAgIGlmKGluc3RhbmNlLmZhY2Uuc2hvd0xhYmVscykge1xuICAgICAgICBpbnN0YW5jZS5jcmVhdGVMYWJlbCgnbWludXRlcycpLm1vdW50KGVsLmNoaWxkTm9kZXNbMF0pO1xuXG4gICAgICAgIGlmKGluc3RhbmNlLmZhY2Uuc2hvd1NlY29uZHMpIHtcbiAgICAgICAgICAgIGluc3RhbmNlLmNyZWF0ZUxhYmVsKCdzZWNvbmRzJykubW91bnQoZWwuY2hpbGROb2Rlc1syXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlbCwgaW5zdGFuY2UpIHtcbiAgICBpbnN0YW5jZS5jcmVhdGVEaXZpZGVyKCkubW91bnQoZWwsIGVsLmNoaWxkTm9kZXNbMV0pO1xuXG4gICAgaWYoaW5zdGFuY2UuZmFjZS5zaG93U2Vjb25kcykge1xuICAgICAgICBpbnN0YW5jZS5jcmVhdGVEaXZpZGVyKCkubW91bnQoZWwsIGVsLmNoaWxkTm9kZXNbM10pO1xuICAgIH1cbiAgICBcbiAgICBpZihpbnN0YW5jZS5mYWNlLnNob3dMYWJlbHMpIHtcbiAgICAgICAgaW5zdGFuY2UuY3JlYXRlTGFiZWwoJ2hvdXJzJykubW91bnQoZWwuY2hpbGROb2Rlc1swXSk7XG4gICAgICAgIGluc3RhbmNlLmNyZWF0ZUxhYmVsKCdtaW51dGVzJykubW91bnQoZWwuY2hpbGROb2Rlc1syXSk7XG5cbiAgICAgICAgaWYoaW5zdGFuY2UuZmFjZS5zaG93U2Vjb25kcykge1xuICAgICAgICAgICAgaW5zdGFuY2UuY3JlYXRlTGFiZWwoJ3NlY29uZHMnKS5tb3VudChlbC5jaGlsZE5vZGVzWzRdKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuIiwiaW1wb3J0IFR3ZW50eUZvdXJIb3VyQ2xvY2sgZnJvbSAnLi9Ud2VudHlGb3VySG91ckNsb2NrJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWwsIGluc3RhbmNlKSB7XG4gICAgVHdlbnR5Rm91ckhvdXJDbG9jayhlbCwgaW5zdGFuY2UpO1xuXG4gICAgaWYoaW5zdGFuY2UuZmFjZS5zaG93TWVyaWRpdW0gJiYgaW5zdGFuY2UuZmFjZS5tZXJpZGl1bSkge1xuICAgICAgICBjb25zdCBsYWJlbCA9IGluc3RhbmNlLmNyZWF0ZUxhYmVsKGluc3RhbmNlLmZhY2UubWVyaWRpdW0pO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBlbC5jaGlsZE5vZGVzW2VsLmNoaWxkTm9kZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgbGFiZWwubW91bnQocGFyZW50KS5jbGFzc0xpc3QuYWRkKCdmbGlwLWNsb2NrLW1lcmlkaXVtJyk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWwsIGluc3RhbmNlKSB7XG4gICAgaW5zdGFuY2UuY3JlYXRlRGl2aWRlcigpLm1vdW50KGVsLCBlbC5jaGlsZE5vZGVzWzFdKTtcbiAgICBpbnN0YW5jZS5jcmVhdGVEaXZpZGVyKCkubW91bnQoZWwsIGVsLmNoaWxkTm9kZXNbM10pO1xuICAgIGluc3RhbmNlLmNyZWF0ZURpdmlkZXIoKS5tb3VudChlbCwgZWwuY2hpbGROb2Rlc1s1XSk7XG5cbiAgICBpZihpbnN0YW5jZS5mYWNlLnNob3dTZWNvbmRzKSB7XG4gICAgICAgIGluc3RhbmNlLmNyZWF0ZURpdmlkZXIoKS5tb3VudChlbCwgZWwuY2hpbGROb2Rlc1s3XSk7XG4gICAgfVxuXG4gICAgaWYoaW5zdGFuY2UuZmFjZS5zaG93TGFiZWxzKSB7XG4gICAgICAgIGluc3RhbmNlLmNyZWF0ZUxhYmVsKCd3ZWVrcycpLm1vdW50KGVsLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgICBpbnN0YW5jZS5jcmVhdGVMYWJlbCgnZGF5cycpLm1vdW50KGVsLmNoaWxkTm9kZXNbMl0pO1xuICAgICAgICBpbnN0YW5jZS5jcmVhdGVMYWJlbCgnaG91cnMnKS5tb3VudChlbC5jaGlsZE5vZGVzWzRdKTtcbiAgICAgICAgaW5zdGFuY2UuY3JlYXRlTGFiZWwoJ21pbnV0ZXMnKS5tb3VudChlbC5jaGlsZE5vZGVzWzZdKTtcblxuICAgICAgICBpZihpbnN0YW5jZS5mYWNlLnNob3dTZWNvbmRzKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jcmVhdGVMYWJlbCgnc2Vjb25kcycpLm1vdW50KGVsLmNoaWxkTm9kZXNbOF0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWwsIGluc3RhbmNlKSB7XG4gICAgaW5zdGFuY2UuY3JlYXRlRGl2aWRlcigpLm1vdW50KGVsLCBlbC5jaGlsZE5vZGVzWzFdKTtcbiAgICBpbnN0YW5jZS5jcmVhdGVEaXZpZGVyKCkubW91bnQoZWwsIGVsLmNoaWxkTm9kZXNbM10pO1xuICAgIGluc3RhbmNlLmNyZWF0ZURpdmlkZXIoKS5tb3VudChlbCwgZWwuY2hpbGROb2Rlc1s1XSk7XG4gICAgaW5zdGFuY2UuY3JlYXRlRGl2aWRlcigpLm1vdW50KGVsLCBlbC5jaGlsZE5vZGVzWzddKTtcblxuICAgIGlmKGluc3RhbmNlLmZhY2Uuc2hvd1NlY29uZHMpIHtcbiAgICAgICAgaW5zdGFuY2UuY3JlYXRlRGl2aWRlcigpLm1vdW50KGVsLCBlbC5jaGlsZE5vZGVzWzldKTtcbiAgICB9XG5cbiAgICBpZihpbnN0YW5jZS5mYWNlLnNob3dMYWJlbHMpIHtcbiAgICAgICAgaW5zdGFuY2UuY3JlYXRlTGFiZWwoJ3llYXJzJykubW91bnQoZWwuY2hpbGROb2Rlc1swXSk7XG4gICAgICAgIGluc3RhbmNlLmNyZWF0ZUxhYmVsKCd3ZWVrcycpLm1vdW50KGVsLmNoaWxkTm9kZXNbMl0pO1xuICAgICAgICBpbnN0YW5jZS5jcmVhdGVMYWJlbCgnZGF5cycpLm1vdW50KGVsLmNoaWxkTm9kZXNbNF0pO1xuICAgICAgICBpbnN0YW5jZS5jcmVhdGVMYWJlbCgnaG91cnMnKS5tb3VudChlbC5jaGlsZE5vZGVzWzZdKTtcbiAgICAgICAgaW5zdGFuY2UuY3JlYXRlTGFiZWwoJ21pbnV0ZXMnKS5tb3VudChlbC5jaGlsZE5vZGVzWzhdKTtcblxuICAgICAgICBpZihpbnN0YW5jZS5mYWNlLnNob3dTZWNvbmRzKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jcmVhdGVMYWJlbCgnc2Vjb25kcycpLm1vdW50KGVsLmNoaWxkTm9kZXNbMTBdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBEaXZpZGVyIGZyb20gJy4vRGl2aWRlcic7XG5pbXBvcnQgRmxpcENsb2NrIGZyb20gJy4vRmxpcENsb2NrJztcbmltcG9ydCBHcm91cCBmcm9tICcuL0dyb3VwJztcbmltcG9ydCBMYWJlbCBmcm9tICcuL0xhYmVsJztcbmltcG9ydCBMaXN0IGZyb20gJy4vTGlzdCc7XG5pbXBvcnQgTGlzdEl0ZW0gZnJvbSAnLi9MaXN0SXRlbSc7XG5pbXBvcnQgKiBhcyBmYWNlcyBmcm9tICcuL0ZhY2VzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIERpdmlkZXIsXG4gICAgRmxpcENsb2NrLFxuICAgIEdyb3VwLFxuICAgIExhYmVsLFxuICAgIExpc3QsXG4gICAgTGlzdEl0ZW0sXG4gICAgZmFjZXNcbn07XG4iLCJpbXBvcnQgeyBDb3VudGVyIH0gZnJvbSAnLi4vRmFjZXMnO1xuaW1wb3J0IHsgT3JpZ2luYWwgfSBmcm9tICcuLi9UaGVtZXMnO1xuaW1wb3J0IHsgRW5nbGlzaCB9IGZyb20gJy4uL0xhbmd1YWdlcyc7XG5cbi8qKlxuICogQGFsaWFzIERlZmF1bHRWYWx1ZXNcbiAqIEB0eXBlIHtvYmplY3R9XG4gKiBAbWVtYmVyb2YgbW9kdWxlOkNvbmZpZy9EZWZhdWx0VmFsdWVzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBmYWNlOiBDb3VudGVyLFxuICAgIHRoZW1lOiBPcmlnaW5hbCxcbiAgICBsYW5ndWFnZTogRW5nbGlzaFxufTtcbiIsImltcG9ydCBGYWNlIGZyb20gJy4vRmFjZSc7XG5pbXBvcnQgTGlzdCBmcm9tICcuL0xpc3QnO1xuaW1wb3J0IEdyb3VwIGZyb20gJy4vR3JvdXAnO1xuaW1wb3J0IExhYmVsIGZyb20gJy4vTGFiZWwnO1xuaW1wb3J0IFRpbWVyIGZyb20gJy4vVGltZXInO1xuaW1wb3J0IERpdmlkZXIgZnJvbSAnLi9EaXZpZGVyJztcbmltcG9ydCAqIGFzIEZhY2VzIGZyb20gJy4uL0ZhY2VzJztcbmltcG9ydCBGYWNlVmFsdWUgZnJvbSAnLi9GYWNlVmFsdWUnO1xuaW1wb3J0IERvbUNvbXBvbmVudCBmcm9tICcuL0RvbUNvbXBvbmVudCc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi4vSGVscGVycy9WYWxpZGF0ZSc7XG5pbXBvcnQgRGVmYXVsdFZhbHVlcyBmcm9tICcuLi9Db25maWcvRGVmYXVsdFZhbHVlcyc7XG5pbXBvcnQgQ29uc29sZU1lc3NhZ2VzIGZyb20gJy4uL0NvbmZpZy9Db25zb2xlTWVzc2FnZXMnO1xuaW1wb3J0IHsgZmxhdHRlbiwgaXNOdWxsLCBpc1N0cmluZywgaXNPYmplY3QsIGlzVW5kZWZpbmVkLCBpc0Z1bmN0aW9uLCBlcnJvciB9IGZyb20gJy4uL0hlbHBlcnMvRnVuY3Rpb25zJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmxpcENsb2NrIGV4dGVuZHMgRG9tQ29tcG9uZW50IHtcbiAgIFxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBgRmxpcENsb2NrYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBjbGFzcyBGbGlwQ2xvY2tcbiAgICAgKiBAZXh0ZW5kcyBEb21Db21wb25lbnRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCAtIFRoZSBIVE1MIGVsZW1lbnQgdXNlZCB0byBiaW5kIGNsb2NrIERPTSBub2RlLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGNsb2NrIGZhY2UuXG4gICAgICogQHBhcmFtIHtvYmplY3R8dW5kZWZpbmVkfSBhdHRyaWJ1dGVzIC0ge0BsaW5rIEZsaXBDbG9jay5PcHRpb25zfSBwYXNzZWQgYW4gb2JqZWN0IHdpdGgga2V5L3ZhbHVlLlxuICAgICAqL1xuICAgICAgICBcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlIEZsaXBDbG9jay5PcHRpb25zXG4gICAgICogQGNsYXNzZGVzYyBBbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHNldCB0aGUgYXR0cmlidXRlcy5cbiAgICAgKiBcbiAgICAgKiAjIyMjIyBFeGFtcGxlOlxuICAgICAqIFxuICAgICAqICAgICB7XG4gICAgICogICAgICAgIGZhY2U6ICdEYXlDb3VudGVyJyxcbiAgICAgKiAgICAgICAgbGFuZ3VhZ2U6ICdlcycsXG4gICAgICogICAgICAgIHRpbWVyOiBUaW1lci5tYWtlKDUwMClcbiAgICAgKiAgICAgfVxuICAgICAqIFxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfEZhY2V9IFtmYWNlPXtAbGluayBGYWNlcy5EYXlDb3VudGVyfV0gLSBUaGUgY2xvY2sncyB7QGxpbmsgRmFjZX0gaW5zdGFuY2UuXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtpbnRlcnZhbD0xMDAwXSAtIFRoZSBjbG9jaydzIGludGVydmFsIHJhdGUgKGluIG1pbGxpc2Vjb25kcykuXG4gICAgICogQHByb3BlcnR5IHtvYmplY3R9IFt0aGVtZT17QGxpbmsgVGhlbWVzLk9yaWdpbmFsfV0gLSBUaGUgY2xvY2sncyB0aGVtZS5cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ3xvYmplY3R9IFtsYW5ndWFnZT17QGxpbmsgTGFuZ3VhZ2VzLkVuZ2xpc2h9XSAtIFRoZSBjbG9jaydzIGxhbmd1YWdlLlxuICAgICAqIEBwcm9wZXJ0eSB7VGltZXJ9IFt0aW1lcj17QGxpbmsgVGltZXJ9XSAtIFRoZSBjbG9jaydzIHRpbWVyLlxuICAgICAqL1xuICAgIFxuICAgIGNvbnN0cnVjdG9yKGVsLCB2YWx1ZSwgYXR0cmlidXRlcykge1xuICAgICAgICBpZighdmFsaWRhdGUoZWwsIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgZXJyb3IoQ29uc29sZU1lc3NhZ2VzLmVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoaXNPYmplY3QodmFsdWUpICYmICFhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzID0gdmFsdWU7XG4gICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZhY2UgPSBhdHRyaWJ1dGVzLmZhY2UgfHwgRGVmYXVsdFZhbHVlcy5mYWNlO1xuXG4gICAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVzLmZhY2U7XG5cbiAgICAgICAgc3VwZXIoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBvcmlnaW5hbFZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIHRoZW1lOiBEZWZhdWx0VmFsdWVzLnRoZW1lLFxuICAgICAgICAgICAgbGFuZ3VhZ2U6IERlZmF1bHRWYWx1ZXMubGFuZ3VhZ2UsXG4gICAgICAgICAgICB0aW1lcjogVGltZXIubWFrZShhdHRyaWJ1dGVzLmludGVydmFsIHx8IDEwMDApLFxuICAgICAgICB9LCBhdHRyaWJ1dGVzKSk7XG5cbiAgICAgICAgaWYoIXRoaXMuZmFjZSkge1xuICAgICAgICAgICAgdGhpcy5mYWNlID0gZmFjZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW91bnQoZWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjbG9jayBgRmFjZWAuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7RmFjZX1cbiAgICAgKi9cbiAgICBnZXQgZmFjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJGZhY2U7XG4gICAgfVxuXG4gICAgc2V0IGZhY2UodmFsdWUpIHtcbiAgICAgICAgaWYoIXZhbGlkYXRlKHZhbHVlLCBbRmFjZSwgJ3N0cmluZycsICdmdW5jdGlvbiddKSkge1xuICAgICAgICAgICAgZXJyb3IoQ29uc29sZU1lc3NhZ2VzLmZhY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4kZmFjZSA9IChGYWNlc1t2YWx1ZV0gfHwgdmFsdWUpLm1ha2UoT2JqZWN0LmFzc2lnbih0aGlzLmdldFB1YmxpY0F0dHJpYnV0ZXMoKSwge1xuICAgICAgICAgICAgb3JpZ2luYWxWYWx1ZTogdGhpcy5mYWNlID8gdGhpcy5mYWNlLm9yaWdpbmFsVmFsdWUgOiB1bmRlZmluZWRcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHRoaXMuJGZhY2UuaW5pdGlhbGl6ZWQodGhpcyk7XG5cbiAgICAgICAgaWYodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy4kZmFjZS52YWx1ZSA9IHRoaXMuZmFjZS5jcmVhdGVGYWNlVmFsdWUodGhpcywgdGhpcy52YWx1ZS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZighdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMub3JpZ2luYWxWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWwgJiYgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYHN0b3BBdGAgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQHR5cGUgeyp9XG4gICAgICovXG4gICAgZ2V0IHN0b3BBdCgpIHtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24odGhpcy4kc3RvcEF0KSA/IHRoaXMuJHN0b3BBdCh0aGlzKSA6IHRoaXMuJHN0b3BBdDtcbiAgICB9XG5cbiAgICBzZXQgc3RvcEF0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuJHN0b3BBdCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgdGltZXJgIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHR5cGUge1RpbWVyfVxuICAgICAqL1xuICAgIGdldCB0aW1lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJHRpbWVyO1xuICAgIH1cblxuICAgIHNldCB0aW1lcih0aW1lcikge1xuICAgICAgICBpZighdmFsaWRhdGUodGltZXIsIFRpbWVyKSkge1xuICAgICAgICAgICAgZXJyb3IoQ29uc29sZU1lc3NhZ2VzLnRpbWVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuJHRpbWVyID0gdGltZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBUaGUgY2xvY2sncyBgRmFjZVZhbHVlYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtGYWNlVmFsdWV8bnVsbH1cbiAgICAgKi9cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZhY2UgPyB0aGlzLmZhY2UudmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIHNldCB2YWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZighdGhpcy5mYWNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgZmFjZSBtdXN0IGJlIHNldCBiZWZvcmUgc2V0dGluZyBhIHZhbHVlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodmFsdWUgaW5zdGFuY2VvZiBGYWNlVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZmFjZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5mYWNlLnZhbHVlID0gdGhpcy5mYWNlLnZhbHVlLmNsb25lKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmFjZS52YWx1ZSA9IHRoaXMuZmFjZS5jcmVhdGVGYWNlVmFsdWUodGhpcywgdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbCAmJiB0aGlzLnJlbmRlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgb3JpZ2luYWxWYWx1ZWAgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQHR5cGUgeyp9XG4gICAgICovXG4gICAgZ2V0IG9yaWdpbmFsVmFsdWUoKSB7XG4gICAgICAgIGlmKGlzRnVuY3Rpb24odGhpcy4kb3JpZ2luYWxWYWx1ZSkgJiYgIXRoaXMuJG9yaWdpbmFsVmFsdWUubmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuJG9yaWdpbmFsVmFsdWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc1VuZGVmaW5lZCh0aGlzLiRvcmlnaW5hbFZhbHVlKSAmJiAhaXNOdWxsKHRoaXMuJG9yaWdpbmFsVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4kb3JpZ2luYWxWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZhY2UgPyB0aGlzLmZhY2UuZGVmYXVsdFZhbHVlKCkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgc2V0IG9yaWdpbmFsVmFsdWUodmFsdWUpIHtcbiAgICAgICAgdGhpcy4kb3JpZ2luYWxWYWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdW50IHRoZSBjbG9jayB0byB0aGUgcGFyZW50IERPTSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsIC0gVGhlIHBhcmVudCBgSFRNTEVsZW1lbnRgLlxuICAgICAqIEByZXR1cm4ge0ZsaXBDbG9ja30gLSBUaGUgYEZsaXBDbG9ja2AgaW5zdGFuY2UuXG4gICAgICovXG4gICAgbW91bnQoZWwpIHtcbiAgICAgICAgc3VwZXIubW91bnQoZWwpO1xuXG4gICAgICAgIHRoaXMuZmFjZS5tb3VudGVkKHRoaXMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlciB0aGUgY2xvY2sncyBET00gbm9kZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gLSBUaGUgcGFyZW50IGBIVE1MRWxlbWVudGAuXG4gICAgICovXG4gICAgcmVuZGVyKCkge1xuICAgICAgICAvLyBDYWxsIHRoZSBwYXJlbnQgcmVuZGVyIGZ1bmN0aW9uXG4gICAgICAgIHN1cGVyLnJlbmRlcigpO1xuXG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgZmFjZSBoYXMgYSByZW5kZXIgZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGUgdGhlbWUuXG4gICAgICAgIC8vIFRoaXMgYWxsb3dzIGEgZmFjZSB0byBjb21wbGV0ZWx5IHJlLXJlbmRlciBvciBhZGQgdG8gdGhlIHRoZW1lLlxuICAgICAgICAvLyBUaGlzIGFsbG93cyBmYWNlIHNwZWNpZmljIGludGVyZmFjZXMgZm9yIGEgdGhlbWUuXG4gICAgICAgIGlmKHRoaXMudGhlbWUuZmFjZXNbdGhpcy5mYWNlLm5hbWVdKSB7XG4gICAgICAgICAgICB0aGlzLnRoZW1lLmZhY2VzW3RoaXMuZmFjZS5uYW1lXSh0aGlzLmVsLCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhc3MgdGhlIGNsb2NrIGluc3RhbmNlIHRvIHRoZSByZW5kZXJlZCgpIGZ1bmN0aW9uIG9uIHRoZSBmYWNlLlxuICAgICAgICAvLyBUaGlzIGFsbG93cyBnbG9iYWwgbW9kaWZpY2F0aW9ucyB0byB0aGUgcmVuZGVyZWQgdGVtcGxhdGVzIG5vdFxuICAgICAgICAvLyB0aGVtZSBzcGVjaWZpYy5cbiAgICAgICAgdGhpcy5mYWNlLnJlbmRlcmVkKHRoaXMpO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgcmVuZGVyZWQgYEhUTUxFbGVtZW50YC5cbiAgICAgICAgcmV0dXJuIHRoaXMuZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgdGhlIGNsb2NrLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGZuIC0gVGhlIGludGVydmFsIGNhbGxiYWNrLlxuICAgICAqIEByZXR1cm4ge0ZsaXBDbG9ja30gLSBUaGUgYEZsaXBDbG9ja2AgaW5zdGFuY2UuXG4gICAgICovXG4gICAgc3RhcnQoZm4pIHtcbiAgICAgICAgaWYoIXRoaXMudGltZXIuc3RhcnRlZCkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMub3JpZ2luYWxWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlzVW5kZWZpbmVkKHRoaXMuZmFjZS5zdG9wQXQpICYmICh0aGlzLmZhY2Uuc3RvcEF0ID0gdGhpcy5zdG9wQXQpO1xuICAgICAgICBpc1VuZGVmaW5lZCh0aGlzLmZhY2Uub3JpZ2luYWxWYWx1ZSkgJiYgKHRoaXMuZmFjZS5vcmlnaW5hbFZhbHVlID0gdGhpcy5vcmlnaW5hbFZhbHVlKTtcblxuICAgICAgICB0aGlzLnRpbWVyLnN0YXJ0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmFjZS5pbnRlcnZhbCh0aGlzLCBmbik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZmFjZS5zdGFydGVkKHRoaXMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ3N0YXJ0Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcCB0aGUgY2xvY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gZm4gLSBUaGUgc3RvcCBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJuIHtGbGlwQ2xvY2t9IC0gVGhlIGBGbGlwQ2xvY2tgIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHN0b3AoZm4pIHtcbiAgICAgICAgdGhpcy50aW1lci5zdG9wKGZuKTtcbiAgICAgICAgdGhpcy5mYWNlLnN0b3BwZWQodGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnc3RvcCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0IHRoZSBjbG9jayB0byB0aGUgb3JpZ2luYWwgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gZm4gLSBUaGUgaW50ZXJ2YWwgY2FsbGJhY2suXG4gICAgICogQHJldHVybiB7RmxpcENsb2NrfSAtIFRoZSBgRmxpcENsb2NrYCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICByZXNldChmbikge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5vcmlnaW5hbFZhbHVlO1xuICAgICAgICB0aGlzLnRpbWVyLnJlc2V0KCgpID0+IHRoaXMuaW50ZXJ2YWwodGhpcywgZm4pKTtcbiAgICAgICAgdGhpcy5mYWNlLnJlc2V0KHRoaXMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ3Jlc2V0Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBpbmNyZW1lbnQgdGhlIGNsb2NrJ3MgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHsqfHVuZGVmaW5lZH0gdmFsdWUgLSBJbmNyZW1lbnQgdGhlIGNsb2NrIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUuXG4gICAgICogICAgIElmIG5vIHZhbHVlIGlzIHBhc3NlZCwgdGhlbiB0aGUgZGVmYXVsdCBpbmNyZW1lbnQgaXMgZGV0ZXJtaW5lZCBieVxuICAgICAqICAgICB0aGUgRmFjZSwgd2hpY2ggaXMgdXN1YWxseSBgMWAuXG4gICAgICogQHJldHVybiB7RmxpcENsb2NrfSAtIFRoZSBgRmxpcENsb2NrYCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBpbmNyZW1lbnQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5mYWNlLmluY3JlbWVudCh0aGlzLCB2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBkZWNyZW1lbnQgdGhlIGNsb2NrJ3MgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHsqfHVuZGVmaW5lZH0gdmFsdWUgLSBEZWNyZW1lbnQgdGhlIGNsb2NrIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUuXG4gICAgICogICAgIElmIG5vIHZhbHVlIGlzIHBhc3NlZCwgdGhlbiB0aGUgZGVmYXVsdCBkZWNyZW1lbnQgaXMgZGV0ZXJtaW5lZCBieVxuICAgICAqICAgICB0aGUgYEZhY2VgLCB3aGljaCBpcyB1c3VhbGx5IGAxYC5cbiAgICAgKiBAcmV0dXJuIHtGbGlwQ2xvY2t9IC0gVGhlIGBGbGlwQ2xvY2tgIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGRlY3JlbWVudCh2YWx1ZSkge1xuICAgICAgICB0aGlzLmZhY2UuZGVjcmVtZW50KHRoaXMsIHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGluc3RhbnRpYXRlIGEgbmV3IGBEaXZpZGVyYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge29iamVjdHx1bmRlZmluZWR9IFthdHRyaWJ1dGVzXSAtIFRoZSBhdHRyaWJ1dGVzIHBhc3NlZCB0byB0aGVcbiAgICAgKiAgICAgYERpdmlkZXJgIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4ge0RpdmlkZXJ9IC0gVGhlIGluc3RhbnRpYXRlZCBEaXZpZGVyLlxuICAgICAqL1xuICAgIGNyZWF0ZURpdmlkZXIoYXR0cmlidXRlcykge1xuICAgICAgICByZXR1cm4gRGl2aWRlci5tYWtlKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgdGhlbWU6IHRoaXMudGhlbWUsXG4gICAgICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZVxuICAgICAgICB9LCBhdHRyaWJ1dGVzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBpbnN0YW50aWF0ZSBhIG5ldyBgTGlzdGAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHsqfSB2YWx1ZSAtIFRoZSBgTGlzdGAgdmFsdWUuXG4gICAgICogQHBhcmFtICB7b2JqZWN0fHVuZGVmaW5lZH0gW2F0dHJpYnV0ZXNdIC0gVGhlIGF0dHJpYnV0ZXMgcGFzc2VkIHRvIHRoZVxuICAgICAqICAgICBgTGlzdGAgaW5zdGFuY2UuXG4gICAgICogQHJldHVybiB7TGlzdH0gLSBUaGUgaW5zdGFudGlhdGVkIGBMaXN0YC5cbiAgICAgKi9cbiAgICBjcmVhdGVMaXN0KHZhbHVlLCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybiBMaXN0Lm1ha2UodmFsdWUsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgdGhlbWU6IHRoaXMudGhlbWUsXG4gICAgICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZVxuICAgICAgICB9LCBhdHRyaWJ1dGVzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBpbnN0YW50aWF0ZSBhIG5ldyBgTGFiZWxgLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7Kn0gdmFsdWUgLSBUaGUgYExhYmVsYCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gIHtvYmplY3R8dW5kZWZpbmVkfSBbYXR0cmlidXRlc10gLSBUaGUgYXR0cmlidXRlcyBwYXNzZWQgdG8gdGhlXG4gICAgICogICAgIGBMYWJlbGAgaW5zdGFuY2UuXG4gICAgICogQHJldHVybiB7TGFiZWx9IC0gVGhlIGluc3RhbnRpYXRlZCBgTGFiZWxgLlxuICAgICAqL1xuICAgIGNyZWF0ZUxhYmVsKHZhbHVlLCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybiBMYWJlbC5tYWtlKHZhbHVlLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIHRoZW1lOiB0aGlzLnRoZW1lLFxuICAgICAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2VcbiAgICAgICAgfSwgYXR0cmlidXRlcykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBtZXRob2QgdG8gaW5zdGFudGlhdGUgYSBuZXcgYEdyb3VwYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge2FycmF5fSBpdGVtcyAtIEFuIGFycmF5IG9mIGBMaXN0YCBpdGVtcyB0byBncm91cC5cbiAgICAgKiBAcGFyYW0gIHtHcm91cHx1bmRlZmluZWR9IFthdHRyaWJ1dGVzXSAtIFRoZSBhdHRyaWJ1dGVzIHBhc3NlZCB0byB0aGVcbiAgICAgKiAgICAgYEdyb3VwYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJuIHtHcm91cH0gLSBUaGUgaW5zdGFudGlhdGVkIGBHcm91cGAuXG4gICAgICovXG4gICAgY3JlYXRlR3JvdXAoaXRlbXMsIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmV0dXJuIEdyb3VwLm1ha2UoaXRlbXMsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgdGhlbWU6IHRoaXMudGhlbWUsXG4gICAgICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZVxuICAgICAgICB9LCBhdHRyaWJ1dGVzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGBkZWZhdWx0c2AgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IGRlZmF1bHRzKCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdFZhbHVlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmVOYW1lKCkge1xuICAgICAgICByZXR1cm4gJ0ZsaXBDbG9jayc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byBzZXQgdGhlIGRlZmF1bHQgYEZhY2VgIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7RmFjZX0gdmFsdWUgLSBUaGUgZGVmYXVsdCBgRmFjZWAgY2xhc3MuVGhpcyBzaG91bGQgYmUgYVxuICAgICAqICAgICBjb25zdHJ1Y3Rvci5cbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICAqL1xuICAgIHN0YXRpYyBzZXREZWZhdWx0RmFjZSh2YWx1ZSkge1xuICAgICAgICBpZighdmFsaWRhdGUodmFsdWUsIEZhY2UpKSB7XG4gICAgICAgICAgICBlcnJvcihDb25zb2xlTWVzc2FnZXMuZmFjZSk7XG4gICAgICAgIH1cblxuICAgICAgICBEZWZhdWx0VmFsdWVzLmZhY2UgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHNldCB0aGUgZGVmYXVsdCB0aGVtZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZSAtIFRoZSBkZWZhdWx0IHRoZW1lLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgc3RhdGljIHNldERlZmF1bHRUaGVtZSh2YWx1ZSkge1xuICAgICAgICBpZighdmFsaWRhdGUodmFsdWUsICdvYmplY3QnKSkge1xuICAgICAgICAgICAgZXJyb3IoQ29uc29sZU1lc3NhZ2VzLnRoZW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIERlZmF1bHRWYWx1ZXMudGhlbWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHNldCB0aGUgZGVmYXVsdCBsYW5ndWFnZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZSAtIFRoZSBkZWZhdWx0IGxhbmd1YWdlLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgc3RhdGljIHNldERlZmF1bHRMYW5ndWFnZSh2YWx1ZSkge1xuICAgICAgICBpZighdmFsaWRhdGUodmFsdWUsICdvYmplY3QnKSkge1xuICAgICAgICAgICAgZXJyb3IoQ29uc29sZU1lc3NhZ2VzLmxhbmd1YWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIERlZmF1bHRWYWx1ZXMubGFuZ3VhZ2UgPSB2YWx1ZTtcbiAgICB9XG5cbn1cbiJdLCJuYW1lcyI6WyJlcnJvciIsInN0cmluZyIsIkVycm9yIiwiY2FsbGJhY2siLCJmbiIsImlzRnVuY3Rpb24iLCJhcmdzIiwiY2FsbCIsInJvdW5kIiwidmFsdWUiLCJpc05lZ2F0aXZlWmVybyIsImlzTmVnYXRpdmUiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwidG9TdHJpbmciLCJub29wIiwiaXNVbmRlZmluZWQiLCJpc051bGwiLCJjaGFpbiIsImJlZm9yZSIsImFmdGVyIiwiY29uY2F0TWFwIiwieCIsIm1hcCIsInJlZHVjZSIsInkiLCJjb25jYXQiLCJmbGF0dGVuIiwiZGVlcEZsYXR0ZW4iLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJJbmZpbml0eSIsImlzQ29uc3RydWN0b3IiLCJGdW5jdGlvbiIsIm5hbWUiLCJpc1N0cmluZyIsImlzT2JqZWN0IiwidHlwZSIsImlzTnVtYmVyIiwiaXNOYU4iLCJrZWJhYkNhc2UiLCJyZXBsYWNlIiwidG9Mb3dlckNhc2UiLCJDb21wb25lbnQiLCJhdHRyaWJ1dGVzIiwic2V0QXR0cmlidXRlIiwiT2JqZWN0IiwiYXNzaWduIiwiZXZlbnRzIiwia2V5IiwiZm9yRWFjaCIsImV2ZW50IiwiYXBwbHkiLCJwdXNoIiwiZmlsdGVyIiwib2ZmIiwib24iLCJoYXNPd25Qcm9wZXJ0eSIsImdldE93blByb3BlcnR5TmFtZXMiLCJnZXRBdHRyaWJ1dGUiLCJrZXlzIiwiZ2V0QXR0cmlidXRlcyIsIm1hdGNoIiwib2JqIiwic2V0QXR0cmlidXRlcyIsInZhbHVlcyIsImkiLCJjb25zdHJ1Y3RvciIsImRlZmluZU5hbWUiLCIkZXZlbnRzIiwiZGlnaXRpemUiLCJvcHRpb25zIiwibWluaW11bURpZ2l0cyIsInByZXBlbmRMZWFkaW5nWmVybyIsInByZXBlbmQiLCJudW1iZXIiLCJzaG91bGRQcmVwZW5kWmVybyIsInNwbGl0IiwiZGlnaXRzIiwiYXJyIiwibWluIiwidW5zaGlmdCIsIlJBTkdFUyIsIm1heCIsImZvcm1hdCIsInBhcnNlRmxvYXQiLCJmaW5kUmFuZ2UiLCJjaGFyIiwiY29kZSIsImNoYXJDb2RlQXQiLCJzdHJpbmdGcm9tQ2hhckNvZGVCeSIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsIm5leHQiLCJjb252ZXJ0ZWQiLCJyYW5nZSIsImpvaW4iLCJwcmV2IiwiRmFjZVZhbHVlIiwiZ2V0UHVibGljQXR0cmlidXRlcyIsIiRkaWdpdHMiLCIkdmFsdWUiLCJ2YWxpZGF0ZSIsInN1Y2Nlc3MiLCJhcmciLCJjbGFzc05hbWUiLCJpdGVtcyIsInRoZW1lIiwibGFuZ3VhZ2UiLCJkYXRlIiwiZmFjZSIsImVsZW1lbnQiLCJmYWNlVmFsdWUiLCJ0aW1lciIsIkZhY2UiLCJ1bmRlZmluZWQiLCJhdXRvU3RhcnQiLCJjb3VudGRvd24iLCJhbmltYXRpb25SYXRlIiwiZGVmYXVsdEF0dHJpYnV0ZXMiLCJkZWZhdWx0VmFsdWUiLCJpbnN0YW5jZSIsImRlY3JlbWVudCIsImluY3JlbWVudCIsInNob3VsZFN0b3AiLCJzdG9wIiwiZW1pdCIsInN0b3BBdCIsImFtb3VudCIsImlzU3RvcHBlZCIsIndpbmRvdyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInN0YXJ0IiwibWFrZSIsImRlZmF1bHREYXRhVHlwZSIsImNyZWF0ZUZhY2VWYWx1ZSIsIiRzdG9wQXQiLCIkb3JpZ2luYWxWYWx1ZSIsImRpY3Rpb25hcnkiLCJhbGlhc2VzIiwiTEFOR1VBR0VTIiwiZmluZCIsImluZGV4T2YiLCJ0cmFuc2xhdGUiLCJmcm9tIiwibGFuZyIsInN3YXAiLCJzdWJqZWN0IiwiZXhpc3RpbmciLCJwYXJlbnROb2RlIiwicmVwbGFjZUNoaWxkIiwiZWwiLCJhcHBlbmRDaGlsZHJlbiIsImNoaWxkcmVuIiwiY2hpbGQiLCJIVE1MRWxlbWVudCIsImFwcGVuZENoaWxkIiwiY3JlYXRlRWxlbWVudCIsImRvY3VtZW50IiwiaW5uZXJIVE1MIiwiRG9tQ29tcG9uZW50IiwicGFyZW50IiwicmVuZGVyIiwiaW5zZXJ0QmVmb3JlIiwiJGVsIiwiQ29uc29sZU1lc3NhZ2VzIiwiJHBhcmVudCIsIiR0aGVtZSIsIiRsYW5ndWFnZSIsIkRpdmlkZXIiLCJMaXN0SXRlbSIsIkxpc3QiLCJpdGVtIiwiJGl0ZW1zIiwiR3JvdXAiLCJMYWJlbCIsImxhYmVsIiwiVGltZXIiLCJpbnRlcnZhbCIsImNvdW50IiwiaGFuZGxlIiwic3RhcnRlZCIsInJ1bm5pbmciLCJEYXRlIiwibGFzdExvb3AiLCJub3ciLCJsb29wIiwiaXNSdW5uaW5nIiwic2V0VGltZW91dCIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwiZ2V0VGltZSIsIkNvdW50ZXIiLCJNaW51dGVDb3VudGVyIiwic2hvd1NlY29uZHMiLCJzaG93TGFiZWxzIiwiZGlmZiIsIm9yaWdpbmFsVmFsdWUiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImEiLCJiIiwiZ2V0VG90YWxTZWNvbmRzIiwidG90YWxTZWNvbmRzIiwiYWJzIiwiSG91ckNvdW50ZXIiLCJkYXRhIiwiZ2V0SG91cnMiLCJEYXlDb3VudGVyIiwiZ2V0RGF5cyIsIlR3ZW50eUZvdXJIb3VyQ2xvY2siLCJncm91cHMiLCJvZmZzZXQiLCJUd2VsdmVIb3VyQ2xvY2siLCJzaG93TWVyaWRpdW0iLCJob3VycyIsIm1lcmlkaXVtIiwiV2Vla0NvdW50ZXIiLCJnZXRXZWVrcyIsIlllYXJDb3VudGVyIiwiZ2V0WWVhcnMiLCJpbmRleCIsImNoaWxkTm9kZXMiLCJxdWVyeVNlbGVjdG9yIiwicGFydHMiLCJncm91cCIsImdyb3VwRWwiLCJxdWVyeVNlbGVjdG9yQWxsIiwibGlzdHMiLCJsaXN0RWwiLCJsaXN0VmFsdWUiLCJjcmVhdGVMaXN0IiwiZG9tVmFsdWUiLCJkZWxheSIsImNyZWF0ZUdyb3VwIiwibm9kZXMiLCJ0IiwiYmVmb3JlVmFsdWUiLCJjbGFzc0xpc3QiLCJhZGQiLCJzdHlsZSIsImFuaW1hdGlvbkRlbGF5IiwiYW5pbWF0aW9uRHVyYXRpb24iLCJjcmVhdGVMaXN0SXRlbSIsImFjdGl2ZSIsImNyZWF0ZURpdmlkZXIiLCJtb3VudCIsImNyZWF0ZUxhYmVsIiwiRmxpcENsb2NrIiwiZmFjZXMiLCJPcmlnaW5hbCIsIkVuZ2xpc2giLCJEZWZhdWx0VmFsdWVzIiwibW91bnRlZCIsInJlbmRlcmVkIiwic3RvcHBlZCIsInJlc2V0IiwiJGZhY2UiLCJGYWNlcyIsImluaXRpYWxpemVkIiwiJHRpbWVyIiwiY2xvbmUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFBOzs7Ozs7Ozs7SUFTQTs7Ozs7Ozs7QUFRQSxJQUFPLFNBQVNBLEtBQVQsQ0FBZUMsTUFBZixFQUF1QjtJQUMxQixRQUFNQyxLQUFLLENBQUNELE1BQUQsQ0FBWDtJQUNIO0lBRUQ7Ozs7Ozs7Ozs7O0FBVUEsSUFBTyxTQUFTRSxRQUFULENBQWtCQyxFQUFsQixFQUErQjtJQUNsQyxNQUFHQyxVQUFVLENBQUNELEVB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 +//# sourceMappingURL=flipclock.js.map diff --git a/dist/flipclock.js.map b/dist/flipclock.js.map index dcc766c9..5c13e6c7 100644 --- a/dist/flipclock.js.map +++ b/dist/flipclock.js.map @@ -1 +1 @@ -{"version":3,"file":"flipclock.js","sources":["../src/js/Helpers/Functions.js","../src/js/Components/Component.js","../src/js/Helpers/Digitize.js","../src/js/Helpers/Value.js","../src/js/Components/FaceValue.js","../src/js/Helpers/Validate.js","../src/js/Config/ConsoleMessages.js","../src/js/Components/Face.js","../src/js/Languages/ar-ar.js","../src/js/Languages/ca-es.js","../src/js/Languages/cs-cz.js","../src/js/Languages/da-dk.js","../src/js/Languages/de-de.js","../src/js/Languages/en-us.js","../src/js/Languages/es-es.js","../src/js/Languages/fa-ir.js","../src/js/Languages/fi-fi.js","../src/js/Languages/fr-ca.js","../src/js/Languages/he-il.js","../src/js/Languages/hu-hu.js","../src/js/Languages/it-it.js","../src/js/Languages/ja-jp.js","../src/js/Languages/ko-kr.js","../src/js/Languages/lv-lv.js","../src/js/Languages/nl-be.js","../src/js/Languages/no-nb.js","../src/js/Languages/pl-pl.js","../src/js/Languages/pt-br.js","../src/js/Languages/ro-ro.js","../src/js/Languages/ru-ru.js","../src/js/Languages/sk-sk.js","../src/js/Languages/sv-se.js","../src/js/Languages/th-th.js","../src/js/Languages/tr-tr.js","../src/js/Languages/ua-ua.js","../src/js/Languages/vn-vn.js","../src/js/Languages/zh-cn.js","../src/js/Languages/zh-tw.js","../src/js/Languages/index.js","../src/js/Helpers/Language.js","../src/js/Helpers/Translate.js","../src/js/Helpers/Template.js","../src/js/Components/DomComponent.js","../src/js/Components/Divider.js","../src/js/Components/ListItem.js","../src/js/Components/List.js","../src/js/Components/Group.js","../src/js/Components/Label.js","../src/js/Components/Timer.js","../src/js/Faces/Counter.js","../src/js/Faces/MinuteCounter.js","../src/js/Faces/HourCounter.js","../src/js/Faces/DayCounter.js","../src/js/Faces/TwentyFourHourClock.js","../src/js/Faces/TwelveHourClock.js","../src/js/Faces/WeekCounter.js","../src/js/Faces/YearCounter.js","../src/js/Faces/index.js","../src/js/Themes/Original/Divider.js","../src/js/Themes/Original/FlipClock.js","../src/js/Themes/Original/Group.js","../src/js/Themes/Original/Label.js","../src/js/Themes/Original/List.js","../src/js/Themes/Original/ListItem.js","../src/js/Themes/Original/Faces/DayCounter.js","../src/js/Themes/Original/Faces/HourCounter.js","../src/js/Themes/Original/Faces/MinuteCounter.js","../src/js/Themes/Original/Faces/TwentyFourHourClock.js","../src/js/Themes/Original/Faces/TwelveHourClock.js","../src/js/Themes/Original/Faces/WeekCounter.js","../src/js/Themes/Original/Faces/YearCounter.js","../src/js/Themes/Original/index.js","../src/js/Config/DefaultValues.js","../src/js/Components/FlipClock.js"],"sourcesContent":["/**\n * These are a collection of helper functions, some borrowed from Lodash,\n * Underscore, etc, to provide common functionality without the need for using\n * a dependency. All of this is an attempt to reduce the file size of the\n * library.\n *\n * @namespace Helpers.Functions\n */\n\n/**\n * Throw a string as an Error exception.\n *\n * @function error\n * @param {string} string - The error message.\n * @return {void}\n * @memberof Helpers.Functions\n */\nexport function error(string) {\n throw Error(string);\n}\n\n/**\n * Check if `fn` is a function, and call it with `this` context and pass the\n * arguments.\n *\n * @function callback\n * @param {string} string - The callback fn.\n * @param {...*} args - The arguments to pass.\n * @return {void}\n * @memberof Helpers.Functions\n */\nexport function callback(fn, ...args) {\n if(isFunction(fn)) {\n return fn.call(this, ...args);\n }\n}\n\n/**\n * Round the value to the correct value. Takes into account negative numbers.\n *\n * @function round\n * @param {value} string - The value to round.\n * @return {string} - The rounded value.\n * @memberof Helpers.Functions\n */\nexport function round(value) {\n return isNegativeZero(\n value = isNegative(value) ? Math.ceil(value) : Math.floor(value)\n ) ? ('-' + value).toString() : value;\n}\n\n/**\n * Returns `true` if `undefined or `null`.\n *\n * @function noop\n * @param {value} string - The value to check.\n * @return {boolean} - `true` if `undefined or `null`.\n * @memberof Helpers.Functions\n */\nexport function noop(value) {\n return !isUndefined(value) && !isNull(value);\n}\n\n/**\n * Returns a function that executes the `before` attribute and passes that value\n * to `after` and the subsequent value is returned.\n *\n * @function chain\n * @param {function} before - The first function to execute.\n * @param {function} after - The subsequent function to execute.\n * @return {function} - A function that executes the chain.\n * @memberof Helpers.Functions\n */\nexport function chain(before, after) {\n return () => after(before());\n}\n\n/**\n * Returns a function that returns maps the values before concatenating them.\n *\n * @function concatMap\n * @param {function} fn - The map callback function.\n * @return {function} - A function that executes the map and concatenation.\n * @memberof Helpers.Functions\n */\nexport function concatMap(fn) {\n return x => {\n return x.map(fn).reduce((x, y) => x.concat(y), []);\n }\n}\n\n/**\n * Flatten an array.\n *\n * @function flatten\n * @param {array} value - The array to flatten.\n * @return {array} - The flattened array.\n * @memberof Helpers.Functions\n */\nexport function flatten(value) {\n return concatMap(value => value)(value)\n}\n\n/**\n * Deep flatten an array.\n *\n * @function deepFlatten\n * @param {array} value - The array to flatten.\n * @return {array} - The flattened array.\n * @memberof Helpers.Functions\n */\nexport function deepFlatten(x) {\n return concatMap(x => Array.isArray(x) ? deepFlatten (x) : x)(x);\n}\n\n/**\n * Capitalize the first letter in a string.\n *\n * @function ucfirst\n * @param {string} string - The string to capitalize.\n * @return {string} - The capitalized string.\n * @memberof Helpers.Functions\n */\nexport function ucfirst(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n/**\n * Returns the length of a deep flatten array.\n *\n * @function length\n * @param {array} value - The array to count.\n * @return {number} - The length of the deep flattened array.\n * @memberof Helpers.Functions\n */\nexport function length(value) {\n return deepFlatten(value).length;\n}\n\n/**\n * Determines if a value is a negative zero.\n *\n * @function isNegativeZero\n * @param {number} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a negative zero (`-0`).\n * @memberof Helpers.Functions\n */\nexport function isNegativeZero(value) {\n return 1 / Math.round(value) === -Infinity;\n}\n\n/**\n * Determines if a value is a negative.\n *\n * @function isNegative\n * @param {number} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a negative.\n * @memberof Helpers.Functions\n */\nexport function isNegative(value) {\n return isNegativeZero(value) || value < 0;\n}\n\n/**\n * Determines if a value is `null`.\n *\n * @function isNull\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a `null`.\n * @memberof Helpers.Functions\n */\nexport function isNull(value) {\n return value === null;// || typeof value === 'null';\n}\n\n/**\n * Determines if a value is `undefined`.\n *\n * @function isNull\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a `undefined`.\n * @memberof Helpers.Functions\n */\nexport function isUndefined(value) {\n return typeof value === 'undefined';\n}\n\n/**\n * Determines if a value is a constructor.\n *\n * @function isConstructor\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a constructor.\n * @memberof Helpers.Functions\n */\nexport function isConstructor(value) {\n return (value instanceof Function) && !!value.name;\n}\n\n/**\n * Determines if a value is a string.\n *\n * @function isString\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a string.\n * @memberof Helpers.Functions\n */\nexport function isString(value) {\n return typeof value === 'string';\n}\n\n/**\n * Determines if a value is a array.\n *\n * @function isString\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a string.\n * @memberof Helpers.Functions\n */\nexport function isArray(value) {\n return value instanceof Array;\n}\n\n/**\n * Determines if a value is an object.\n *\n * @function isObject\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is an object.\n * @memberof Helpers.Functions\n */\nexport function isObject(value) {\n const type = typeof value;\n return value != null && !isArray(value) && (\n type == 'object' || type == 'function'\n );\n}\n\n/**\n * Determines if a value is a function.\n *\n * @function isObject\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a function.\n * @memberof Helpers.Functions\n */\nexport function isFunction(value) {\n return value instanceof Function;\n}\n\n/**\n * Determines if a value is a number.\n *\n * @function isObject\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a number.\n * @memberof Helpers.Functions\n */\nexport function isNumber(value) {\n return !isNaN(value);\n}\n\n/**\n * Converts a string into kebab case.\n *\n * @function kebabCase\n * @param {string} string - The string to convert.\n * @return {string} - The converted string.\n * @memberof Helpers.Functions\n */\nexport function kebabCase(string) {\n return string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\\s+/g, '-').toLowerCase();\n}\n","import { chain, error, callback, isObject, kebabCase } from '../Helpers/Functions';\n\nexport default class Component {\n\n /**\n * Abstract base class.\n *\n * @class Component\n * @param {(object|undefined)} [attributes] - The instance attributes.\n */\n constructor(attributes) {\n this.setAttribute(Object.assign({\n events: {}\n }, attributes));\n }\n\n /**\n * Get the `name` attribute.\n *\n * @type {string}\n */\n get name() {\n if(!(this.constructor.defineName instanceof Function)) {\n error('Every class must define its name.');\n }\n\n return this.constructor.defineName();\n }\n\n /**\n * The `events` attribute.\n *\n * @type {object}\n */\n get events() {\n return this.$events || {};\n }\n\n set events(value) {\n this.$events = value;\n }\n\n /**\n * Emit an event.\n *\n * @param {string} key - The event id/key.\n * @return {Component} - Returns `this` instance.\n */\n emit(key, ...args) {\n if(this.events[key]) {\n this.events[key].forEach(event => {\n event.apply(this, args);\n });\n }\n\n return this;\n }\n\n /**\n * Start listening to an event.\n *\n * @param {string} key - The event id/key.\n * @param {Function} fn - The listener callback function.\n * @param {boolean} [once=false] - Should the event handler be fired a\n * single time.\n * @return {Component} - Returns `this` instance.\n */\n on(key, fn, once = false) {\n if(!this.events[key]) {\n this.events[key] = [];\n }\n\n this.events[key].push(fn);\n\n return this;\n }\n\n /**\n * Stop listening to an event.\n *\n * @param {string} key - The event id/key.\n * @param {(Function|undefined)} fn - The listener callback function. If no\n * function is defined, all events with the specified id/key will be\n * removed. Otherwise, only the event listeners matching the id/key AND\n * callback will be removed.\n * @return {Component} - Returns `this` instance.\n */\n off(key, fn) {\n if(this.events[key] && fn) {\n this.events[key] = this.events[key].filter(event => {\n return event !== fn;\n });\n }\n else {\n this.events[key] = [];\n }\n\n return this;\n }\n\n /**\n * Listen to an event only one time.\n *\n * @param {string} key - The event id/key.\n * @param {Function} fn - The listener callback function.\n * @return {Component} - Returns `this` instance.\n */\n once(key, fn) {\n fn = chain(fn, () => this.off(key, fn));\n\n return this.on(key, fn, true);\n }\n\n /**\n * Get an attribute. Returns null if no attribute is defined.\n *\n * @param {string} key - The attribute name.\n * @return {*} - The attribute value.\n */\n getAttribute(key) {\n return this.hasOwnProperty(key) ? this[key] : null;\n }\n\n /**\n * Get all the atttributes for this instance.\n *\n * @return {object} - The attribute dictionary.\n */\n getAttributes() {\n const attributes = {};\n\n Object.getOwnPropertyNames(this).forEach(key => {\n attributes[key] = this.getAttribute(key);\n });\n\n return attributes;\n }\n\n /**\n * Get only public the atttributes for this instance. Omits any attribute\n * that starts with `$`, which is used internally.\n *\n * @return {object} - The attribute dictionary.\n */\n getPublicAttributes() {\n return Object.keys(this.getAttributes())\n .filter(key => {\n return !key.match(/^\\$/);\n })\n .reduce((obj, key) => {\n obj[key] = this.getAttribute(key);\n return obj;\n }, {});\n }\n\n /**\n * Set an attribute key and value.\n *\n * @param {string} key - The attribute name.\n * @param {*} value - The attribute value.\n * @return {void}\n */\n setAttribute(key, value) {\n if(isObject(key)) {\n this.setAttributes(key);\n }\n else {\n this[key] = value;\n }\n }\n\n /**\n * Set an attributes by object of key/value pairs.\n *\n * @param {object} values - The object dictionary.\n * @return {void}\n */\n setAttributes(values) {\n for(const i in values) {\n this.setAttribute(i, values[i]);\n }\n }\n\n /**\n * Helper method to execute the `callback()` function.\n *\n * @param {Function} fn - The callback function.\n * @return {*} - Returns the executed callback function.\n */\n callback(fn) {\n return callback.call(this, fn);\n }\n\n /**\n * Factor method to static instantiate new instances. Useful for writing\n * clean expressive syntax with chained methods.\n *\n * @param {...*} args - The callback arguments.\n * @return {*} - The new component instance.\n */\n static make(...args) {\n return new this(...args);\n }\n\n}\n","/**\n * @namespace Helpers.Digitize\n */\nimport { flatten } from './Functions';\nimport { deepFlatten } from './Functions';\n\n/**\n * Digitize a number, string, or an array into a digitized array. This function\n * use by the `Face`, which convert the digitized array into an array of `List`\n * instances.\n *\n * @function digitize\n * @param {*} value - The value to digitize.\n * @param {(Object|undefined)} [options] - The digitizer options.\n * @return {array} - The digitized array.\n * @memberof Helpers.Digitize\n */\nexport default function digitize(value, options) {\n options = Object.assign({\n minimumDigits: 0,\n prependLeadingZero: true\n }, options);\n\n function prepend(number) {\n const shouldPrependZero = options.prependLeadingZero &&\n number.toString().split('').length === 1;\n\n return (shouldPrependZero ? '0' : '').concat(number);\n }\n\n function digits(arr, min) {\n const length = deepFlatten(arr).length;\n\n if(length < min) {\n for(let i = 0; i < min - length; i++) {\n arr[0].unshift('0');\n }\n }\n\n return arr;\n }\n\n return digits(flatten([value]).map(number => {\n return flatten(deepFlatten([number]).map(number => {\n return prepend(number).split('');\n }));\n }), options.minimumDigits || 0);\n}\n","/**\n * @namespace Helpers.Value\n */\n\n/**\n * An array of objects with min/max ranges.\n *\n * @private\n * @type {array}\n */\nconst RANGES = [{\n // 0-9\n min: 48,\n max: 57\n},{\n // a-z\n min: 65,\n max: 90\n},{\n // A-Z\n min: 97,\n max: 122\n}];\n\n/**\n * Format a string into a new data type. Currently only supports string to\n * number conversion.\n *\n * @private\n * @function format\n * @param {string} string - The string to format.\n * @param {string} type - The data type (represented as a string) used to\n * convert the string.\n * @return {boolean} - Returns the formatted string.\n */\nfunction format(string, type) {\n switch(type) {\n case 'number':\n return parseFloat(string);\n }\n\n return string;\n}\n\n/**\n * Find the range object from the `RANGES` constant from the character given.\n * This is mainly an interval method, but can be used by faces to help\n * determine what the next value of a string should be.\n *\n * @private\n * @function format\n * @param {string} char - The char used to determine the range.\n * @param {string} type - The data type (represented as a string) used to\n * convert the string.\n * @return {boolean} - Returns the formatted string.\n */\nfunction findRange(char) {\n for(const i in RANGES) {\n const code = char.toString().charCodeAt(0);\n\n if(RANGES[i].min <= code && RANGES[i].max >= code) {\n return RANGES[i];\n }\n }\n\n return null;\n}\n\n/**\n * Create a string from a character code, which is returned by the callback.\n *\n * @private\n * @callback stringFromCharCodeBy\n * @param {string} char - The char used to determine the range.\n * @param {function} fn - The callback function receives `range` and `code`\n * arguments. This function should return a character code.\n * @return {string} - Creates a string from the character code returned by the\n * callback function.\n */\nfunction stringFromCharCodeBy(char, fn) {\n return String.fromCharCode(\n fn(findRange(char), char.charCodeAt(0))\n );\n}\n\n/**\n * Calculate the next value for a string. 'a' becomes 'b'. 'A' becomes 'B'. 1\n * becomes 2, etc. If multiple character strings are passed, 'aa' would become\n * 'bb'.\n *\n * @function next\n * @param {(string|number)} value - The string or number to convert.\n * @return {string} - The formatted string\n * @memberof Helpers.Value\n */\nexport function next(value) {\n const converted = (value)\n .toString()\n .split('')\n .map(char => stringFromCharCodeBy(char, (range, code) => {\n return !range || code < range.max ? code + 1 : range.min\n }))\n .join('');\n\n return format(converted, typeof value);\n}\n\n/**\n * Calculate the prev value for a string. 'b' becomes 'a'. 'B' becomes 'A'. 2\n * becomes 1, 0 becomes 9, etc. If multiple character strings are passed, 'bb'\n * would become 'aa'.\n *\n * @function prev\n * @param {(string|number)} value - The string or number to convert.\n * @return {string} - The formatted string\n * @memberof Helpers.Value\n */\nexport function prev(value) {\n const converted = (value)\n .toString()\n .split('')\n .map(char => stringFromCharCodeBy(char, (range, code) => {\n return !range || code > range.min ? code - 1 : range.max\n }))\n .join('');\n\n return format(converted, typeof value);\n}\n","import Component from './Component';\nimport digitize from '../Helpers/Digitize';\nimport { next, prev } from '../Helpers/Value';\nimport { length, isObject, isNumber } from '../Helpers/Functions';\n\nexport default class FaceValue extends Component {\n\n /**\n * The `FaceValue` class handles all the digitizing for the `Face`.\n *\n * @class FaceValue\n * @extends Component\n * @param {*} value - The `FaceValue`'s actual value. Most likely should\n * string, number, or Date. But since the Face handles the value, it\n * could be anything.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n */\n constructor(value, attributes) {\n super(Object.assign({\n format: value => value,\n prependLeadingZero: true,\n minimumDigits: 0\n }, attributes));\n\n if(!this.value) {\n this.value = value;\n }\n }\n\n /**\n * The `digits` attribute.\n *\n * @type {(Array|undefined)}\n */\n get digits() {\n return this.$digits;\n }\n\n set digits(value) {\n this.$digits = value;\n this.minimumDigits = Math.max(this.minimumDigits, length(value));\n }\n\n /**\n * The `value` attribute.\n *\n * @type {*}\n */\n get value() {\n return this.$value;\n }\n\n set value(value) {\n this.$value = value;\n this.digits = digitize(this.format(value), {\n minimumDigits: this.minimumDigits,\n prependLeadingZero: this.prependLeadingZero\n });\n }\n\n /**\n * Returns `true` if the `value` attribute is not a number.\n *\n * @return {boolean} - `true` is the value is not a number.\n */\n isNaN() {\n return isNaN(this.value);\n }\n\n /**\n * Returns `true` if the `value` attribute is a number.\n *\n * @return {boolean} - `true` is the value is a number.\n */\n isNumber() {\n return isNumber();\n }\n\n /**\n * Clones the current `FaceValue` instance, but sets a new value to the\n * cloned instance. Used for copying the current instance options and\n * methods, but setting a new value.\n *\n * @param {*} value - The n\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @return {FaceValue} - The cloned `FaceValue`.\n */\n clone(value, attributes) {\n return new this.constructor(value, Object.assign(\n this.getPublicAttributes(), attributes\n ));\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'FaceValue';\n }\n\n}\n","/**\n * @namespace Helpers.Validate\n */\nimport { isNull } from './Functions';\nimport { flatten } from './Functions';\nimport { isString } from './Functions';\nimport { isObject } from './Functions';\nimport { isFunction } from './Functions';\nimport { isConstructor } from './Functions';\n\n/**\n * Validate the data type of a variable.\n *\n * @function validate\n * @param {*} value - The value to validate.\n * @param {...*} args - The data types to use for validate.\n * @return {boolean} - Returns `true`is the value has a valid data type.\n * @memberof Helpers.Validate\n */\nexport default function validate(value, ...args) {\n let success = false;\n\n flatten(args).forEach(arg => {\n if( (isNull(value) && isNull(arg)) ||\n (isObject(arg) && (value instanceof arg)) ||\n (isFunction(arg) && !isConstructor(arg) && arg(value) === true) ||\n (isString(arg) && (typeof value === arg))) {\n success = true;\n }\n });\n\n return success;\n}\n","/**\n * @alias ConsoleMessages\n * @type {object}\n * @memberof module:Config/ConsoleMessages\n */\nexport default {\n className: 'The className() is not defined.',\n items: 'The items property must be an array.',\n theme: 'The theme property must be an object.',\n language: 'The language must be an object.',\n date: 'The value must be an instance of a Date.',\n face: 'The face must be an instance of a Face class.',\n element: 'The element must be an instance of an HTMLElement',\n faceValue: 'The face must be an instance of a FaceValue class.',\n timer: 'The timer property must be an instance of a Timer class.'\n};\n","import Component from './Component';\nimport FaceValue from './FaceValue';\nimport validate from '../Helpers/Validate';\nimport ConsoleMessages from '../Config/ConsoleMessages';\nimport { error, isNull, isUndefined, isObject, isArray, isFunction, callback } from '../Helpers/Functions';\n\nexport default class Face extends Component {\n\n /**\n * This class is meant to be provide an interface for all other faces to\n * extend.\n *\n * @class Face\n * @extends Component\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n */\n constructor(value, attributes) {\n if(!(value instanceof FaceValue) && isObject(value)) {\n attributes = value;\n value = undefined;\n }\n\n super();\n\n this.setAttributes(Object.assign({\n autoStart: true,\n countdown: false,\n animationRate: 500\n }, this.defaultAttributes(), attributes || {}));\n\n if(isNull(value) || isUndefined(value)) {\n value = this.defaultValue();\n }\n\n if(value) {\n this.value = value;\n }\n }\n\n /**\n * The `dataType` attribute.\n *\n * @type {*}\n */\n get dataType() {\n return this.defaultDataType();\n }\n\n /**\n * The `value` attribute.\n *\n * @type {*}\n */\n get value() {\n return this.$value;\n }\n\n set value(value) {\n if(!(value instanceof FaceValue)) {\n value = this.createFaceValue(value);\n }\n\n this.$value = value;\n }\n\n /**\n * The `stopAt` attribute.\n *\n * @type {*}\n */\n get stopAt() {\n return this.$stopAt;\n }\n\n set stopAt(value) {\n this.$stopAt = value;\n }\n\n /**\n * The `originalValue` attribute.\n *\n * @type {*}\n */\n get originalValue() {\n return this.$originalValue;\n }\n\n set originalValue(value) {\n this.$originalValue = value;\n }\n\n /**\n * This method is called with every interval, or every time the clock\n * should change, and handles the actual incrementing and decrementing the\n * clock's `FaceValue`.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @param {Function} fn - The interval callback.\n * @return {Face} - This `Face` instance.\n */\n interval(instance, fn) {\n if(this.countdown) {\n this.decrement(instance);\n }\n else {\n this.increment(instance);\n }\n\n callback.call(this, fn);\n\n if(this.shouldStop(instance)) {\n instance.stop();\n }\n\n return this.emit('interval');\n }\n\n /**\n * Determines if the clock should stop or not.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @return {boolean} - Returns `true` if the clock should stop.\n */\n shouldStop(instance) {\n return !isUndefined(this.stopAt) ? this.stopAt === instance.value.value : false;\n }\n\n /**\n * By default this just returns the value unformatted.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @param {*} value - The value to format.\n * @return {*} - The formatted value.\n */\n format(instance, value) {\n return value;\n }\n\n /**\n * The default value for the `Face`.\n *\n * @return {*} - The default value.\n */\n defaultValue() {\n //\n }\n\n /**\n * The default attributes for the `Face`.\n *\n * @return {(Object|undefined)} - The default attributes.\n */\n defaultAttributes() {\n //\n }\n\n /**\n * The default data type for the `Face` value.\n *\n * @return {(Object|undefined)} - The default data type.\n */\n defaultDataType() {\n //\n }\n\n /**\n * Increment the clock.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @param {Number} [amount] - The amount to increment. If the amount is not\n * defined, it is left up to the `Face` to determine the default value.\n * @return {void}\n */\n increment(instance, amount) {\n //\n }\n\n /**\n * Decrement the clock.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @param {Number} [amount] - The amount to decrement. If the amount is not\n * defined, it is left up to the `Face` to determine the default value.\n * @return {void}\n */\n decrement(instance, amount) {\n //\n }\n\n /**\n * This method is called right after clock has started.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @return {void}\n */\n started(instance) {\n //\n }\n\n /**\n * This method is called right after clock has stopped.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @return {void}\n */\n stopped(instance) {\n //\n }\n\n /**\n * This method is called right after clock has reset.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @return {void}\n */\n reset(instance) {\n //\n }\n\n /**\n * This method is called right after `Face` has initialized.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @return {void}\n */\n initialized(instance) {\n //\n }\n\n /**\n * This method is called right after `Face` has rendered.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @return {void}\n */\n rendered(instance) {\n //\n }\n\n /**\n * This method is called right after `Face` has mounted.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @return {void}\n */\n mounted(instance) {\n if(this.autoStart && instance.timer.isStopped) {\n window.requestAnimationFrame(() => instance.start(instance));\n }\n }\n\n /**\n * Helper method to instantiate a new `FaceValue`.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @param {object|undefined} [attributes] - The attributes passed to the\n * `FaceValue` instance.\n * @return {Divider} - The instantiated `FaceValue`.\n */\n createFaceValue(instance, value) {\n return FaceValue.make(\n isFunction(value) && !value.name ? value() : value, {\n minimumDigits: this.minimumDigits,\n format: value => this.format(instance, value)\n }\n );\n }\n\n}\n","/**\n * @classdesc Arabic Language Pack\n * @desc This class will be used to translate tokens into the Arabic language.\n * @namespace Languages.Arabic\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Arabic\n */\nexport const dictionary = {\n 'years' : 'سنوات',\n 'months' : 'شهور',\n 'days' : 'أيام',\n 'hours' : 'ساعات',\n 'minutes' : 'دقائق',\n 'seconds' : 'ثواني'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Arabic\n */\nexport const aliases = ['ar', 'ar-ar', 'arabic'];\n","/**\n * @classdesc Catalan Language Pack\n * @desc This class will used to translate tokens into the Catalan language.\n * @namespace Languages.Catalan\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Catalan\n */\nexport const dictionary = {\n 'years' : 'Anys',\n 'months' : 'Mesos',\n 'days' : 'Dies',\n 'hours' : 'Hores',\n 'minutes' : 'Minuts',\n 'seconds' : 'Segons'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Catalan\n */\nexport const aliases = ['ca', 'ca-es', 'catalan'];\n","/**\n * @classdesc Czech Language Pack\n * @desc This class will used to translate tokens into the Czech language.\n * @namespace Languages.Czech\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Czech\n */\nexport const dictionary = {\n 'years' : 'Roky',\n 'months' : 'Měsíce',\n 'days' : 'Dny',\n 'hours' : 'Hodiny',\n 'minutes' : 'Minuty',\n 'seconds' : 'Sekundy'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Czech\n */\nexport const aliases = ['cs', 'cs-cz', 'cz', 'cz-cs', 'czech'];\n","/**\n * @classdesc Danish Language Pack\n * @desc This class will used to translate tokens into the Danish language.\n * @namespace Languages.Danish\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Danish\n */\nexport const dictionary = {\n\t'years' : 'År',\n\t'months' : 'Måneder',\n\t'days' : 'Dage',\n\t'hours' : 'Timer',\n\t'minutes' : 'Minutter',\n\t'seconds' : 'Sekunder'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Danish\n */\nexport const aliases = ['da', 'da-dk', 'danish'];\n","/**\n * @classdesc German Language Pack\n * @desc This class will used to translate tokens into the German language.\n * @namespace Languages.German\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.German\n */\nexport const dictionary = {\n\t'years' : 'Jahre',\n\t'months' : 'Monate',\n\t'days' : 'Tage',\n\t'hours' : 'Stunden',\n\t'minutes' : 'Minuten',\n\t'seconds' : 'Sekunden'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.German\n */\nexport const aliases = ['de', 'de-de', 'german'];\n","/**\n * @classdesc English Language Pack\n * @desc This class will used to translate tokens into the English language.\n * @namespace Languages.English\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.English\n */\nexport const dictionary = {\n\t'years' : 'Years',\n\t'months' : 'Months',\n\t'days' : 'Days',\n\t'hours' : 'Hours',\n\t'minutes' : 'Minutes',\n\t'seconds' : 'Seconds'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.English\n */\nexport const aliases = ['en', 'en-us', 'english'];\n","/**\n * @classdesc Spanish Language Pack\n * @desc This class will used to translate tokens into the Spanish language.\n * @namespace Languages.Spanish\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Spanish\n */\nexport const dictionary = {\n\t'years' : 'Años',\n\t'months' : 'Meses',\n\t'days' : 'Días',\n\t'hours' : 'Horas',\n\t'minutes' : 'Minutos',\n\t'seconds' : 'Segundos'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Spanish\n */\nexport const aliases = ['es', 'es-es', 'spanish'];\n","/**\n * @classdesc Persian Language Pack\n * @desc This class will used to translate tokens into the Persian language.\n * @namespace Languages.Persian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Persian\n */\nexport const dictionary = {\n\t'years' : 'سال',\n\t'months' : 'ماه',\n\t'days' : 'روز',\n\t'hours' : 'ساعت',\n\t'minutes' : 'دقیقه',\n\t'seconds' : 'ثانیه'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Persian\n */\nexport const aliases = ['fa', 'fa-ir', 'persian'];\n","/**\n * @classdesc Finnish Language Pack\n * @desc This class will used to translate tokens into the Finnish language.\n * @namespace Languages.Finnish\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Finnish\n */\nexport const dictionary = {\n\t'years' : 'Vuotta',\n\t'months' : 'Kuukautta',\n\t'days' : 'Päivää',\n\t'hours' : 'Tuntia',\n\t'minutes' : 'Minuuttia',\n\t'seconds' : 'Sekuntia'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Finnish\n */\nexport const aliases = ['fi', 'fi-fi', 'finnish'];\n","/**\n * @classdesc Canadian French Language Pack\n * @desc This class will used to translate tokens into the Canadian French language.\n * @namespace Languages.CanadianFrench\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.CanadianFrench\n */\nexport const dictionary = {\n 'years' : 'Ans',\n 'months' : 'Mois',\n 'days' : 'Jours',\n 'hours' : 'Heures',\n 'minutes' : 'Minutes',\n 'seconds' : 'Secondes'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.CanadianFrench\n */\nexport const aliases = ['fr', 'fr-ca', 'french'];\n","/**\n * @classdesc Hebrew Language Pack\n * @desc This class will used to translate tokens into the Hebrew language.\n * @namespace Languages.Hebrew\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Hebrew\n */\nexport const dictionary = {\n\t'years' : 'שנים',\n\t'months' : 'חודש',\n\t'days' : 'ימים',\n\t'hours' : 'שעות',\n\t'minutes' : 'דקות',\n\t'seconds' : 'שניות'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Hebrew\n */\nexport const aliases = ['il', 'he-il', 'hebrew'];\n","/**\n * @classdesc Hungarian Language Pack\n * @desc This class will used to translate tokens into the Hungarian language.\n * @namespace Languages.Hungarian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Hungarian\n */\nexport const dictionary = {\n\t'years' : 'Év',\n 'months' : 'Hónap',\n 'days' : 'Nap',\n 'hours' : 'Óra',\n 'minutes' : 'Perc',\n 'seconds' : 'Másodperc'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Hungarian\n */\nexport const aliases = ['hu', 'hu-hu', 'hungarian'];\n","/**\n * @classdesc Italian Language Pack\n * @desc This class will used to translate tokens into the Italian language.\n * @namespace Languages.Italian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Italian\n */\nexport const dictionary = {\n\t'years' : 'Anni',\n\t'months' : 'Mesi',\n\t'days' : 'Giorni',\n\t'hours' : 'Ore',\n\t'minutes' : 'Minuti',\n\t'seconds' : 'Secondi'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Italian\n */\nexport const aliases = ['da', 'da-dk', 'danish'];\n","/**\n * @classdesc Japanese Language Pack\n * @desc This class will used to translate tokens into the Japanese language.\n * @namespace Languages.Japanese\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Japanese\n */\nexport const dictionary = {\n\t'years' : '年',\n\t'months' : '月',\n\t'days' : '日',\n\t'hours' : '時',\n\t'minutes' : '分',\n\t'seconds' : '秒'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Japanese\n */\nexport const aliases = ['jp', 'ja-jp', 'japanese'];\n","/**\n * @classdesc Korean Language Pack\n * @desc This class will used to translate tokens into the Korean language.\n * @namespace Languages.Korean\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Korean\n */\nexport const dictionary = {\n\t'years' : '년',\n\t'months' : '월',\n\t'days' : '일',\n\t'hours' : '시',\n\t'minutes' : '분',\n\t'seconds' : '초'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Korean\n */\nexport const aliases = ['ko', 'ko-kr', 'korean'];\n","/**\n * @classdesc Latvian Language Pack\n * @desc This class will used to translate tokens into the Latvian language.\n * @namespace Languages.Latvian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Latvian\n */\nexport const dictionary = {\n 'years' : 'Gadi',\n 'months' : 'Mēneši',\n 'days' : 'Dienas',\n 'hours' : 'Stundas',\n 'minutes' : 'Minūtes',\n 'seconds' : 'Sekundes'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Latvian\n */\nexport const aliases = ['lv', 'lv-lv', 'latvian'];\n","/**\n * @classdesc Dutch Language Pack\n * @desc This class will used to translate tokens into the Dutch language.\n * @namespace Languages.Dutch\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Dutch\n */\nexport const dictionary = {\n 'years' : 'Jaren',\n 'months' : 'Maanden',\n 'days' : 'Dagen',\n 'hours' : 'Uren',\n 'minutes' : 'Minuten',\n 'seconds' : 'Seconden'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Dutch\n */\nexport const aliases = ['nl', 'nl-be', 'dutch'];\n","/**\n * @classdesc Norwegian-Bokmål Language Pack\n * @desc This class will used to translate tokens into the Norwegian-Bokmål language.\n * @namespace Languages.Norwegian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Norwegian\n */\nexport const dictionary = {\n\t'years' : 'År',\n\t'months' : 'Måneder',\n\t'days' : 'Dager',\n\t'hours' : 'Timer',\n\t'minutes' : 'Minutter',\n\t'seconds' : 'Sekunder'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Norwegian\n */\nexport const aliases = ['no', 'nb', 'no-nb', 'norwegian'];\n","/**\n * @classdesc Polish Language Pack\n * @desc This class will used to translate tokens into the Polish language.\n * @namespace Languages.Polish\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Polish\n */\nexport const dictionary = {\n\t'years' : 'Lat',\n\t'months' : 'Miesięcy',\n\t'days' : 'Dni',\n\t'hours' : 'Godziny',\n\t'minutes' : 'Minuty',\n\t'seconds' : 'Sekundy'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Polish\n */\nexport const aliases = ['pl', 'pl-pl', 'polish'];\n","/**\n * @classdesc Portuguese Language Pack\n * @desc This class will used to translate tokens into the Portuguese language.\n * @namespace Languages.Portuguese\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Portuguese\n */\nexport const dictionary = {\n\t'years' : 'Anos',\n\t'months' : 'Meses',\n\t'days' : 'Dias',\n\t'hours' : 'Horas',\n\t'minutes' : 'Minutos',\n\t'seconds' : 'Segundos'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Portuguese\n */\nexport const aliases = ['pt', 'pt-br', 'portuguese'];\n","/**\n * @classdesc Romanian Language Pack\n * @desc This class will used to translate tokens into the Romanian language.\n * @namespace Languages.Romanian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Romanian\n */\nexport const dictionary = {\n\t'years': 'Ani',\n\t'months': 'Luni',\n\t'days': 'Zile',\n\t'hours': 'Ore',\n\t'minutes': 'Minute',\n\t'seconds': 'sSecunde'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Romanian\n */\nexport const aliases = ['ro', 'ro-ro', 'romana'];\n","/**\n * @classdesc Russian Language Pack\n * @desc This class will used to translate tokens into the Russian language.\n * @namespace Languages.Russian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Russian\n */\nexport const dictionary = {\n 'years' : 'лет',\n 'months' : 'месяцев',\n 'days' : 'дней',\n 'hours' : 'часов',\n 'minutes' : 'минут',\n 'seconds' : 'секунд'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Russian\n */\nexport const aliases = ['ru', 'ru-ru', 'russian'];\n","/**\n * @classdesc Slovak Language Pack\n * @desc This class will used to translate tokens into the Slovak language.\n * @namespace Languages.Slovak\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Slovak\n */\nexport const dictionary = {\n\t'years' : 'Roky',\n\t'months' : 'Mesiace',\n\t'days' : 'Dni',\n\t'hours' : 'Hodiny',\n\t'minutes' : 'Minúty',\n\t'seconds' : 'Sekundy'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Slovak\n */\nexport const aliases = ['sk', 'sk-sk', 'slovak'];\n","/**\n * @classdesc Swedish Language Pack\n * @desc This class will used to translate tokens into the Swedish language.\n * @namespace Languages.Swedish\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Swedish\n */\nexport const dictionary = {\n\t'years' : 'År',\n\t'months' : 'Månader',\n\t'days' : 'Dagar',\n\t'hours' : 'Timmar',\n\t'minutes' : 'Minuter',\n\t'seconds' : 'Sekunder'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Swedish\n */\nexport const aliases = ['sv', 'sv-se', 'swedish'];\n","/**\n * @classdesc Thai Language Pack\n * @desc This class will used to translate tokens into the Thai language.\n * @namespace Languages.Thai\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Thai\n */\nexport const dictionary = {\n\t'years' : 'ปี',\n\t'months' : 'เดือน',\n\t'days' : 'วัน',\n\t'hours' : 'ชั่วโมง',\n\t'minutes' : 'นาที',\n\t'seconds' : 'วินาที'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Thai\n */\nexport const aliases = ['th', 'th-th', 'thai'];\n","/**\n * @classdesc Turkish Language Pack\n * @desc This class will used to translate tokens into the Turkish language.\n * @namespace Languages.Turkish\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Turkish\n */\nexport const dictionary = {\n\t'years' : 'Yıl',\n\t'months' : 'Ay',\n\t'days' : 'Gün',\n\t'hours' : 'Saat',\n\t'minutes' : 'Dakika',\n\t'seconds' : 'Saniye'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Turkish\n */\nexport const aliases = ['tr', 'tr-tr', 'turkish'];\n","/**\n * @classdesc Ukrainian Language Pack\n * @desc This class will used to translate tokens into the Ukrainian language.\n * @namespace Languages.Ukrainian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Ukrainian\n */\nexport const dictionary = {\n 'years' : 'роки',\n 'months' : 'місяці',\n 'days' : 'дні',\n 'hours' : 'години',\n 'minutes' : 'хвилини',\n 'seconds' : 'секунди'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Ukrainian\n */\nexport const aliases = ['ua', 'ua-ua', 'ukraine'];\n","/**\n * @classdesc Vietnamese Language Pack\n * @desc This class will used to translate tokens into the Vietnamese language.\n * @namespace Languages.Vietnamese\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Vietnamese\n */\nexport const dictionary = {\n\t'years' : 'Năm',\n\t'months' : 'Tháng',\n\t'days' : 'Ngày',\n\t'hours' : 'Giờ',\n\t'minutes' : 'Phút',\n\t'seconds' : 'Giây'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Vietnamese\n */\nexport const aliases = ['vn', 'vn-vn', 'vietnamese'];\n","/**\n * @classdesc Chinese Language Pack\n * @desc This class will used to translate tokens into the Chinese language.\n * @namespace Languages.Chinese\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Chinese\n */\nexport const dictionary = {\n\t'years' : '年',\n\t'months' : '月',\n\t'days' : '日',\n\t'hours' : '时',\n\t'minutes' : '分',\n\t'seconds' : '秒'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Chinese\n */\nexport const aliases = ['zh', 'zh-cn', 'chinese'];\n","/**\n * @classdesc Traditional Chinese Language Pack\n * @desc This class will used to translate tokens into the Traditional Chinese language.\n * @namespace Languages.TraditionalChinese\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.TraditionalChinese\n */\nexport const dictionary = {\n\t'years' : '年',\n\t'months' : '月',\n\t'days' : '日',\n\t'hours' : '時',\n\t'minutes' : '分',\n\t'seconds' : '秒'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.TraditionalChinese\n */\nexport const aliases = ['zh-tw'];\n","/**\n * @namespace Languages\n */\nimport * as Arabic from './ar-ar';\nimport * as Catalan from './ca-es';\nimport * as Czech from './cs-cz';\nimport * as Danish from './da-dk';\nimport * as German from './de-de';\nimport * as English from './en-us';\nimport * as Spanish from './es-es';\nimport * as Persian from './fa-ir';\nimport * as Finnish from './fi-fi';\nimport * as French from './fr-ca';\nimport * as Hebrew from './he-il';\nimport * as Hungarian from './hu-hu';\nimport * as Italian from './it-it';\nimport * as Japanese from './ja-jp';\nimport * as Korean from './ko-kr';\nimport * as Latvian from './lv-lv';\nimport * as Dutch from './nl-be';\nimport * as Norwegian from './no-nb';\nimport * as Polish from './pl-pl';\nimport * as Portuguese from './pt-br';\nimport * as Romanian from './ro-ro';\nimport * as Russian from './ru-ru';\nimport * as Slovak from './sk-sk';\nimport * as Swedish from './sv-se';\nimport * as Thai from './th-th';\nimport * as Turkish from './tr-tr';\nimport * as Ukrainian from './ua-ua';\nimport * as Vietnamese from './vn-vn';\nimport * as Chinese from './zh-cn';\nimport * as TraditionalChinese from './zh-tw';\n\nexport {\n Arabic,\n Catalan,\n Czech,\n Danish,\n German,\n English,\n Spanish,\n Persian,\n Finnish,\n French,\n Hebrew,\n Hungarian,\n Italian,\n Japanese,\n Korean,\n Latvian,\n Dutch,\n Norwegian,\n Polish,\n Portuguese,\n Romanian,\n Russian,\n Slovak,\n Swedish,\n Thai,\n Turkish,\n Ukrainian,\n Vietnamese,\n Chinese,\n TraditionalChinese\n}\n","/**\n * @namespace Helpers.Language\n */\nimport * as LANGUAGES from '../Languages';\n\n/**\n * Return the language associated with the key. Returns `null` if no language is\n * found.\n * \n * @function language\n * @param {string} name - The name or id of the language.\n * @return {object|null} - The language dictionary, or null if not found.\n * @memberof Helpers.Language\n */\nexport default function language(name) {\n return name ? LANGUAGES[name.toLowerCase()] || Object.values(LANGUAGES).find(value => {\n return value.aliases.indexOf(name) !== -1;\n }) : null;\n}\n","/**\n * @namespace Helpers.Translate\n */\nimport language from './Language';\nimport { isString } from './Functions';\n\n/**\n * Translate an English string into another language.\n * \n * @function translate\n * @param {string} string - The string to translate.\n * @param {(string|object)} from - The language used to translate. If a string,\n * the language is loaded into an object.\n * @return {string} - If no diction key is found, the untranslated string is\n * returned.\n * @memberof Helpers.Translate\n */\nexport default function translate(string, from) {\n const lang = isString(from) ? language(from) : from;\n const dictionary = lang.dictionary || lang;\n return dictionary[string] || string;\n};\n","/**\n * A collection of functions to manage DOM nodes and theme templates.\n *\n * @namespace Helpers.Template\n */\nimport { noop } from './Functions';\nimport { isArray } from './Functions';\nimport { isObject } from './Functions';\nimport { isString } from './Functions';\nimport { deepFlatten } from './Functions';\n\n/**\n * Swap a new DOM node with an existing one.\n *\n * @function swap\n * @param {HTMLElement} subject - The new DOM node.\n * @param {HTMLElement} existing - The existing DOM node.\n * @return {HTMLElement} - Returns the new element if it was mounted, otherwise\n * the existing node is returned.\n * @memberof Helpers.Template\n */\nexport function swap(subject, existing) {\n\tif(existing.parentNode) {\n\t\texisting.parentNode.replaceChild(subject, existing);\n\n\t\treturn subject;\n\t}\n\n\treturn existing;\n}\n\n/**\n * Set the attribute of an element.\n *\n * @function setAttributes\n * @param {HTMLElement} el - The DOM node that will receive the attributes.\n * @param {Object|undefined} [attributes] - The attribute object, or if no object\n * is passed, then the action is ignored.\n * @return {HTMLElement} el - The DOM node that received the attributes.\n * @memberof Helpers.Template\n */\nexport function setAttributes(el, attributes) {\n\tif(isObject(attributes)) {\n\t\tfor(const i in attributes) {\n\t\t\tel.setAttribute(i, attributes[i]);\n\t\t}\n\t}\n\n\treturn el;\n}\n\n/**\n * Append an array of DOM nodes to a parent.\n *\n * @function appendChildren\n * @param {HTMLElement} el - The parent DOM node.\n * @param {Array|undefined} [children] - The array of children. If no array\n * is passed, then the method silently fails to run.\n * @return {HTMLElement} el - The DOM node that received the attributes.\n * @memberof Helpers.Template\n */\nexport function appendChildren(el, children) {\n\tif(isArray(children)) {\n\t\tchildren.filter(noop).forEach(child => {\n\t\t\tif(child instanceof HTMLElement) {\n\t\t\t\tel.appendChild(child);\n\t\t\t}\n\t\t});\n\t}\n\n\treturn el;\n}\n\n/**\n * Create a new HTMLElement instance.\n *\n * @function createElement\n * @param {HTMLElement} el - The parent DOM node.\n * @param {Array|undefined} [children] - The array of children. If no array\n * is passed, then the method silently fails to run.\n * @param {Object|undefined} [attributes] - The attributes object.\n * @return {HTMLElement} el - The DOM node that received the attributes.\n * @memberof Helpers.Template\n */\nexport function createElement(el, children, attributes) {\n\tif(!(el instanceof HTMLElement)) {\n\t\tel = document.createElement(el);\n\t}\n\n\tsetAttributes(el, isObject(children) ? children : attributes);\n\n\tif(!isObject(children) && !isArray(children)) {\n\t\tel.innerHTML = children;\n\t}\n\telse {\n\t\tappendChildren(el, children)\n\t}\n\n\treturn el;\n}\n","import Component from './Component';\nimport language from '../Helpers/Language';\nimport validate from '../Helpers/Validate';\nimport translate from '../Helpers/Translate';\nimport { isString } from '../Helpers/Functions';\nimport ConsoleMessages from '../Config/ConsoleMessages';\nimport { error, kebabCase } from '../Helpers/Functions';\nimport { swap, createElement } from '../Helpers/Template';\n\nexport default class DomComponent extends Component {\n\n /**\n * An abstract class that all other DOM components can extend.\n *\n * @class DomComponent\n * @extends Component\n * @param {(object|undefined)} [attributes] - The instance attributes.\n */\n constructor(attributes) {\n super(Object.assign({\n parent: null\n }, attributes));\n\n if(!this.theme) {\n error(`${this.name} does not have a theme defined.`);\n }\n\n if(!this.language) {\n error(`${this.name} does not have a language defined.`);\n }\n\n\t\tif(!this.theme[this.name]) {\n throw new Error(\n `${this.name} cannot be rendered because it has no template.`\n );\n }\n }\n\n /**\n * The `className` attribute. Used for CSS.\n *\n * @type {string}\n */\n get className() {\n return kebabCase(this.constructor.defineName());\n }\n\n /**\n * The `el` attribute.\n *\n * @type {HTMLElement}\n */\n get el() {\n return this.$el;\n }\n\n set el(value) {\n if(!validate(value, null, HTMLElement)) {\n error(ConsoleMessages.element);\n }\n\n this.$el = value;\n }\n\n /**\n * The `parent` attribute. Parent is set when `DomComponent` instances are\n * mounted.\n *\n * @type {DomComponent}\n */\n get parent() {\n return this.$parent;\n }\n\n set parent(parent) {\n this.$parent = parent;\n }\n\n /**\n * The `theme` attribute.\n *\n * @type {object}\n */\n get theme() {\n return this.$theme;\n }\n\n set theme(value) {\n if(!validate(value, 'object')) {\n error(ConsoleMessages.value);\n }\n\n this.$theme = value;\n }\n\n /**\n * Get the language attribute.\n *\n * @type {object}\n */\n get language() {\n return this.$language;\n }\n\n set language(value) {\n if(isString(value)) {\n value = language(value);\n }\n\n if(!validate(value, 'object')) {\n error(ConsoleMessages.language);\n }\n\n this.$language = value;\n }\n\n /**\n * Translate a string.\n *\n * @param {string} string - The string to translate.\n * @return {string} - The translated string. If no tranlation found, the\n * untranslated string is returned.\n */\n translate(string) {\n return translate(string, this.language);\n }\n\n /**\n * Alias to translate(string);\n *\n * @alias DomComponent.translate\n */\n t(string) {\n return this.translate(string);\n }\n\n /**\n * Render the DOM component.\n *\n * @return {HTMLElement} - The `el` attribute.\n */\n\trender() {\n const el = createElement('div', {\n class: this.className === 'flip-clock' ? this.className : 'flip-clock-' + this.className\n });\n\n this.theme[this.name](el, this);\n\n if(!this.el) {\n this.el = el;\n }\n else if(this.el.innerHTML !== el.innerHTML) {\n this.el = swap(el, this.el);\n }\n\n return this.el;\n\t}\n\n /**\n * Mount a DOM component to a parent node.\n *\n * @param {HTMLElement} parent - The parent DOM node.\n * @param {(false|HTMLElement)} [before=false] - If `false`, element is\n * appended to the parent node. If an instance of an `HTMLElement`,\n * the component will be inserted before the specified element.\n * @return {HTMLElement} - The `el` attribute.\n */\n mount(parent, before = false) {\n this.render();\n this.parent = parent;\n\n if(!before) {\n this.parent.appendChild(this.el);\n }\n else {\n this.parent.insertBefore(this.el, before);\n }\n\n return this.el;\n }\n\n}\n","import DomComponent from './DomComponent';\n\n/**\n * Create a new `Divider` instance.\n *\n * The purpose of this class is to return a unique class name so the theme can\n * render it appropriately, since each `DomComponent` can receive its own template\n * from the theme.\n *\n * @class Divider\n * @extends DomComponent\n * @param {(object|undefined)} [attributes] - The instance attributes.\n */\nexport default class Divider extends DomComponent {\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'Divider';\n }\n\n}\n","import DomComponent from './DomComponent';\nimport { isObject } from '../Helpers/Functions';\n\nexport default class ListItem extends DomComponent {\n\n /**\n * This class is used to represent a single digits in a `List`.\n *\n * @class ListItem\n * @extends DomComponent\n * @param {(Number|String)} value - The value of the `ListItem`.\n * @param {object|undefined} [attributes] - The instance attributes.\n */\n constructor(value, attributes) {\n super(Object.assign({\n value: value\n }, isObject(value) ? value : null, attributes));\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'ListItem';\n }\n\n}\n","import Divider from './Divider';\nimport ListItem from './ListItem';\nimport DomComponent from './DomComponent';\nimport { next, prev, } from '../Helpers/Value';\nimport { isObject, } from '../Helpers/Functions';\n\nexport default class List extends DomComponent {\n\n /**\n * This class is used to add a digit to the clock face. This class is called\n * `List` because it contains a list of `ListItem`'s which are used to\n * create flip effects. In the context of FlipClock.js a `List` represents\n * one single digit.\n *\n * @class List\n * @extends DomComponent\n * @param {Number|String|Object} label - The active value. If an object, it\n * is assumed that it is the instance attributes.\n * @param {object|undefined} [attributes] - The instance attributes.\n */\n constructor(value, attributes) {\n super(Object.assign({\n value: value,\n items: [],\n }, isObject(value) ? value : null, attributes));\n }\n\n /**\n * Get the `value` attribute.\n *\n * @type {(Number|String)}\n */\n get value() {\n return this.$value;\n }\n set value(value) {\n this.$value = value;\n }\n\n /**\n * Get the `items` attribute.\n *\n * @type {(Number|String)}\n */\n get items() {\n return this.$items;\n }\n\n set items(value) {\n this.$items = value;\n }\n\n /**\n * Helper method to instantiate a new `ListItem`.\n *\n * @param {(Number|String)} value - The `ListItem` value.\n * @param {(Object|undefined)} [attributes] - The instance attributes.\n * @return {ListItem} - The instantiated `ListItem`.\n */\n createListItem(value, attributes) {\n const item = new ListItem(value, Object.assign({\n theme: this.theme,\n language: this.language\n }, attributes));\n\n this.$items.push(item);\n\n return item;\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'List';\n }\n\n}\n","import DomComponent from './DomComponent';\nimport { isObject, isArray } from '../Helpers/Functions';\n\nexport default class Group extends DomComponent {\n\n /**\n * This class is used to group values within a clock face. How the groups\n * are displayed is determined by the theme.\n *\n * @class Group\n * @extends DomComponent\n * @param {Array|Object} items - An array `List` instances or an object of\n * attributes. If not an array, assumed to be the attributes.\n * @param {object|undefined} [attributes] - The instance attributes.\n */\n constructor(items, attributes) {\n super(Object.assign({\n items: isArray(items) ? items : []\n }, (isObject(items) ? items : null), attributes));\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'Group';\n }\n\n}\n","import DomComponent from './DomComponent';\nimport { isObject } from '../Helpers/Functions';\n\nexport default class Label extends DomComponent {\n\n /**\n * This class is used to add a label to the clock face.\n *\n * @class Label\n * @extends DomComponent\n * @param {Number|String|Object} label - The label attribute. If an object,\n * it is assumed that it is the instance attributes.\n * @param {object|undefined} [attributes] - The instance attributes.\n */\n constructor(label, attributes) {\n super(Object.assign({\n label: label\n }, (isObject(label) ? label : null), attributes));\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'Label';\n }\n\n}\n","import Component from './Component';\nimport { isObject, isNumber, callback } from '../Helpers/Functions';\n\nexport default class Timer extends Component {\n\n /**\n * Create a new `Timer` instance.\n *\n * @class Timer\n * @extends Component\n * @param {(Object|Number)} interval - The interval passed as a `Number`,\n * or can set the attribute of the class with an object.\n */\n constructor(interval) {\n super(Object.assign({\n count: 0,\n handle: null,\n started: null,\n running: false,\n interval: isNumber(interval) ? interval : null,\n }, isObject(interval) ? interval : null));\n }\n\n /**\n * The `elapsed` attribute.\n *\n * @type {Number}\n */\n get elapsed() {\n return !this.lastLoop ? 0 : this.lastLoop - (\n this.started ? this.started.getTime() : new Date().getTime()\n );\n }\n\n /**\n * The `isRunning` attribute.\n *\n * @type {boolean}\n */\n get isRunning() {\n return this.running === true;\n }\n\n /**\n * The `isStopped` attribute.\n *\n * @type {boolean}\n */\n get isStopped() {\n return this.running === false;\n }\n\n /**\n * Resets the timer.\n *\n * @param {(Function|undefined)} fn - The interval callback.\n * @return {Timer} - The `Timer` instance.\n */\n reset(fn) {\n this.stop(() => {\n this.count = 0;\n this.start(() => callback.call(this, fn));\n this.emit('reset');\n });\n\n return this;\n }\n\n /**\n * Starts the timer.\n *\n * @param {Function} fn - The interval callback.\n * @return {Timer} - The `Timer` instance.\n */\n start(fn) {\n this.started = new Date;\n this.lastLoop = Date.now();\n this.running = true;\n this.emit('start');\n\n const loop = () => {\n if(Date.now() - this.lastLoop >= this.interval) {\n callback.call(this, fn);\n this.lastLoop = Date.now();\n this.emit('interval');\n this.count++;\n }\n\n this.handle = window.requestAnimationFrame(loop);\n\n return this;\n };\n\n return loop();\n }\n\n /**\n * Stops the timer.\n *\n * @param {Function} fn - The stop callback.\n * @return {Timer} - The `Timer` instance.\n */\n stop(fn) {\n if(this.isRunning) {\n setTimeout(() => {\n window.cancelAnimationFrame(this.handle);\n\n this.running = false;\n\n callback.call(this, fn);\n\n this.emit('stop');\n });\n }\n\n return this;\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'Timer';\n }\n}\n","import Face from '../Components/Face';\n\n/**\n * @classdesc This face is designed to increment and decrement numberic values,\n * not `Date` objects.\n * @extends Face\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class Counter extends Face {\n\n increment(instance, value = 1) {\n instance.value = this.value.value + value;\n }\n\n decrement(instance, value = 1) {\n instance.value = this.value.value - value;\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'Counter';\n }\n}\n","import Face from '../Components/Face';\nimport { noop, round, isNull, isUndefined, isNumber, callback } from '../Helpers/Functions';\n\n/**\n * @classdesc This face is meant to display a clock that shows minutes, and\n * seconds.\n * @extends Face\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class MinuteCounter extends Face {\n\n defaultDataType() {\n return Date;\n }\n\n defaultAttributes() {\n return {\n showSeconds: true,\n showLabels: true\n };\n }\n\n shouldStop(instance) {\n if(isNull(instance.stopAt) || isUndefined(instance.stopAt)) {\n return false;\n }\n\n if(this.stopAt instanceof Date) {\n return this.countdown ?\n this.stopAt.getTime() >= this.value.value.getTime():\n this.stopAt.getTime() <= this.value.value.getTime();\n }\n else if(isNumber(this.stopAt)) {\n const diff = Math.floor((this.value.value.getTime() - this.originalValue.getTime()) / 1000);\n\n return this.countdown ?\n this.stopAt >= diff:\n this.stopAt <= diff;\n }\n\n throw new Error(`the stopAt property must be an instance of Date or Number.`);\n }\n\n increment(instance, value = 0) {\n instance.value = new Date(this.value.value.getTime() + value + (new Date().getTime() - instance.timer.lastLoop));\n }\n\n decrement(instance, value = 0) {\n instance.value = new Date(this.value.value.getTime() - value - (new Date().getTime() - instance.timer.lastLoop));\n }\n\n format(instance, value) {\n const started = instance.timer.isRunning ? instance.timer.started : new Date(Date.now() - 50);\n\n return [\n [this.getMinutes(value, started)],\n this.showSeconds ? [this.getSeconds(value, started)] : null\n ].filter(noop);\n }\n\n getMinutes(a, b) {\n return round(this.getTotalSeconds(a, b) / 60);\n }\n\n getSeconds(a, b) {\n const totalSeconds = this.getTotalSeconds(a, b);\n\n return Math.abs(Math.ceil(totalSeconds === 60 ? 0 : totalSeconds % 60));\n }\n\n getTotalSeconds(a, b) {\n return a.getTime() === b.getTime() ? 0 : Math.round((a.getTime() - b.getTime()) / 1000);\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'MinuteCounter';\n }\n}\n","import MinuteCounter from './MinuteCounter';\n\n/**\n * @classdesc This face is meant to display a clock that shows\n * hours, minutes, and seconds.\n * @extends Face\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class HourCounter extends MinuteCounter {\n\n format(instance, value) {\n const now = !instance.timer.started ? new Date : value;\n const originalValue = instance.originalValue || value;\n const a = !this.countdown ? now : originalValue;\n const b = !this.countdown ? originalValue : now;\n\n const data = [\n [this.getHours(a, b)],\n [this.getMinutes(a, b)]\n ];\n\n if(this.showSeconds) {\n data.push([this.getSeconds(a, b)]);\n }\n\n return data;\n }\n\n getMinutes(a, b) {\n return Math.abs(super.getMinutes(a, b) % 60);\n }\n\n getHours(a, b) {\n return Math.floor(this.getTotalSeconds(a, b) / 60 / 60);\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'HourCounter';\n }\n}\n","import HourCounter from './HourCounter';\n\n/**\n * @classdesc This face is meant to display a clock that shows days, hours,\n * minutes, and seconds.\n * @extends HourCounter\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class DayCounter extends HourCounter {\n\n format(instance, value) {\n const now = !instance.started ? new Date : value;\n const originalValue = instance.originalValue || value;\n const a = !this.countdown ? now : originalValue;\n const b = !this.countdown ? originalValue : now;\n\n const data = [\n [this.getDays(a, b)],\n [this.getHours(a, b)],\n [this.getMinutes(a, b)]\n ];\n\n if(this.showSeconds) {\n data.push([this.getSeconds(a, b)]);\n }\n\n return data;\n }\n\n getDays(a, b) {\n return Math.floor(this.getTotalSeconds(a, b) / 60 / 60 / 24);\n }\n\n getHours(a, b) {\n return Math.abs(super.getHours(a, b) % 24);\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'DayCounter';\n }\n}\n","import Face from '../Components/Face';\nimport { callback } from '../Helpers/Functions';\n\n/**\n * @classdesc This face shows the current time in twenty-four hour format.\n * @extends Face\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class TwentyFourHourClock extends Face {\n\n defaultDataType() {\n return Date;\n }\n\n defaultValue() {\n return new Date;\n }\n\n defaultAttributes() {\n return {\n showSeconds: true,\n showLabels: false\n };\n }\n\n format(instance, value) {\n if(!value) {\n value = new Date;\n }\n\n const groups = [\n [value.getHours()],\n [value.getMinutes()]\n ];\n\n if(this.showSeconds) {\n groups.push([value.getSeconds()]);\n }\n\n return groups;\n }\n\n increment(instance, offset = 0) {\n instance.value = new Date(this.value.value.getTime() + offset + (new Date().getTime() - instance.timer.lastLoop));\n }\n\n decrement(instance, offset = 0) {\n instance.value = new Date(this.value.value.getTime() - offset - (new Date().getTime() - instance.timer.lastLoop));\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'TwentyFourHourClock';\n }\n}\n","import TwentyFourHourClock from './TwentyFourHourClock';\n\n/**\n * @classdesc This face shows the current time in twelve hour format, with AM\n * and PM.\n * @extends Face\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class TwelveHourClock extends TwentyFourHourClock {\n\n defaultAttributes() {\n return {\n showLabels: false,\n showSeconds: true,\n showMeridium: true\n };\n }\n\n format(instance, value) {\n if(!value) {\n value = new Date;\n }\n\n const hours = value.getHours();\n\t\tconst groups = [\n\t\t\thours > 12 ? hours - 12 : (hours === 0 ? 12 : hours),\n\t\t\tvalue.getMinutes()\n\t\t];\n\n this.meridium = hours > 12 ? 'pm' : 'am';\n\n\t\tif(this.showSeconds) {\n\t\t\tgroups.push(value.getSeconds());\n\t\t}\n\n\t\treturn groups;\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'TwelveHourClock';\n }\n}\n","import DayCounter from './DayCounter';\n\n/**\n * @classdesc This face is meant to display a clock that shows weeks, days,\n * hours, minutes, and seconds.\n * @extends Face\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class WeekCounter extends DayCounter {\n\n format(instance, value) {\n const now = !instance.timer.started ? new Date : value;\n const originalValue = instance.originalValue || value;\n const a = !this.countdown ? now : originalValue;\n const b = !this.countdown ? originalValue : now;\n\n const data = [\n [this.getWeeks(a, b)],\n [this.getDays(a, b)],\n [this.getHours(a, b)],\n [this.getMinutes(a, b)]\n ];\n\n if(this.showSeconds) {\n data.push([this.getSeconds(a, b)]);\n }\n\n return data;\n }\n\n getWeeks(a, b) {\n return Math.floor(this.getTotalSeconds(a, b) / 60 / 60 / 24 / 7);\n }\n\n getDays(a, b) {\n return Math.abs(super.getDays(a, b) % 7);\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'WeekCounter';\n }\n}\n","import WeekCounter from './WeekCounter';\n\n/**\n * @classdesc This face is meant to display a clock that shows years, weeks,\n * days, hours, minutes, and seconds.\n * @extends Face\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class YearCounter extends WeekCounter {\n\n format(instance, value) {\n const now = !instance.timer.started ? new Date : value;\n const originalValue = instance.originalValue || value;\n const a = !this.countdown ? now : originalValue;\n const b = !this.countdown ? originalValue : now;\n\n const data = [\n [this.getYears(a, b)],\n [this.getWeeks(a, b)],\n [this.getDays(a, b)],\n [this.getHours(a, b)],\n [this.getMinutes(a, b)]\n ];\n\n if(this.showSeconds) {\n data.push([this.getSeconds(a, b)]);\n }\n\n return data;\n }\n\n getYears(a, b) {\n return Math.floor(Math.max(0, this.getTotalSeconds(a, b) / 60 / 60 / 24 / 7 / 52));\n }\n\n getWeeks(a, b) {\n return Math.abs(super.getWeeks(a, b) % 52);\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'YearCounter';\n }\n}\n","/**\n * Faces are classes that hook into the core of Flipclock to provide unique\n * functionality. The core doesn't do a lot, except facilitate the interaction\n * between all the components. The Face is what makes the clock \"tick\".\n *\n * @namespace Faces\n */\n\nimport Counter from './Counter';\nimport DayCounter from './DayCounter';\nimport HourCounter from './HourCounter';\nimport MinuteCounter from './MinuteCounter';\nimport TwelveHourClock from './TwelveHourClock';\nimport TwentyFourHourClock from './TwentyFourHourClock';\nimport WeekCounter from './WeekCounter';\nimport YearCounter from './YearCounter';\n\nexport {\n Counter,\n DayCounter,\n MinuteCounter,\n HourCounter,\n TwelveHourClock,\n TwentyFourHourClock,\n WeekCounter,\n YearCounter\n};\n","import { appendChildren, createElement } from '../../Helpers/Template';\n\nexport default function(el, instance) {\n appendChildren(el, [\n createElement('div', {class: 'flip-clock-dot top'}),\n createElement('div', {class: 'flip-clock-dot bottom'})\n ]);\n}\n","import { next } from '../../Helpers/Value';\nimport { appendChildren } from '../../Helpers/Template';\n\nfunction child(el, index) {\n return el ? (el.childNodes ? el.childNodes[index] : el[index]) : null;\n}\n\nfunction char(el) {\n return el ? el.querySelector('.flip-clock-list-item:first-child .top').innerHTML : null;\n}\n\nexport default function(el, instance) {\n const parts = instance.value.digits.map((group, x) => {\n const groupEl = child(instance.el ? instance.el.querySelectorAll('.flip-clock-group') : null, x);\n\n const lists = group.map((value, y) => {\n const listEl = child(groupEl ? groupEl.querySelectorAll('.flip-clock-list') : null, y);\n const listValue = char(listEl);\n\n return instance.createList(value, {\n domValue: listValue,\n countdown: instance.countdown,\n animationRate: instance.face.animationRate || instance.face.delay\n });\n });\n\n return instance.createGroup(lists);\n });\n\n const nodes = parts.map(group => {\n return group.render();\n });\n\n appendChildren(el, nodes);\n}\n","import { createElement, appendChildren } from '../../Helpers/Template';\n\nexport default function(el, instance) {\n const items = instance.items.map(item => {\n return item.render();\n });\n\n appendChildren(el, items);\n}\n","import { createElement } from '../../Helpers/Template';\n\nexport default function(el, instance) {\n el.innerHTML = instance.t(instance.label);\n}\n","import { next, prev } from '../../Helpers/Value';\nimport ListItem from '../../Components/ListItem';\nimport { createElement, appendChildren } from '../../Helpers/Template';\n\nexport default function(el, instance) {\n const beforeValue = instance.domValue || (\n !instance.countdown ? prev(instance.value) : next(instance.value)\n );\n\n if( instance.domValue && instance.domValue !== instance.value) {\n el.classList.add('flip');\n }\n\n el.style.animationDelay = `${instance.animationRate / 2}ms`;\n el.style.animationDuration = `${instance.animationRate / 2}ms`;\n\n instance.items = [\n instance.createListItem(instance.value, {\n active: true\n }),\n instance.createListItem(beforeValue, {\n active: false\n })\n ];\n\n appendChildren(el, instance.items.map(item => item.render()));\n}\n","import { createElement, appendChildren } from '../../Helpers/Template';\n\nexport default function(el, instance) {\n const className = instance.active === true ? 'active' : (\n instance.active === false ? 'before' : null\n );\n\n el.classList.add(className);\n\n appendChildren(el, [\n createElement('div', [\n createElement('div', instance.value, {class: 'top'}),\n createElement('div', instance.value, {class: 'bottom'})\n ], {class: 'flip-clock-list-item-inner'})\n ]);\n}\n","export default function(el, instance) {\n instance.createDivider().mount(el, el.childNodes[1]);\n instance.createDivider().mount(el, el.childNodes[3]);\n\n if(instance.face.showSeconds) {\n instance.createDivider().mount(el, el.childNodes[5]);\n }\n\n if(instance.face.showLabels) {\n instance.createLabel('days').mount(el.childNodes[0]);\n instance.createLabel('hours').mount(el.childNodes[2]);\n instance.createLabel('minutes').mount(el.childNodes[4]);\n\n if(instance.face.showSeconds) {\n instance.createLabel('seconds').mount(el.childNodes[6]);\n }\n }\n}\n","export default function(el, instance) {\n instance.createDivider().mount(el, el.childNodes[1]);\n\n if(instance.face.showSeconds) {\n instance.createDivider().mount(el, el.childNodes[3]);\n }\n \n if(instance.face.showLabels) {\n instance.createLabel('hours').mount(el.childNodes[0]);\n instance.createLabel('minutes').mount(el.childNodes[2]);\n\n if(instance.face.showSeconds) {\n instance.createLabel('seconds').mount(el.childNodes[4]);\n }\n }\n}\n","export default function(el, instance) {\n if(instance.face.showSeconds) {\n instance.createDivider().mount(el, el.childNodes[1]);\n }\n\n if(instance.face.showLabels) {\n instance.createLabel('minutes').mount(el.childNodes[0]);\n\n if(instance.face.showSeconds) {\n instance.createLabel('seconds').mount(el.childNodes[2]);\n }\n }\n}\n","export default function(el, instance) {\n instance.createDivider().mount(el, el.childNodes[1]);\n\n if(instance.face.showSeconds) {\n instance.createDivider().mount(el, el.childNodes[3]);\n }\n \n if(instance.face.showLabels) {\n instance.createLabel('hours').mount(el.childNodes[0]);\n instance.createLabel('minutes').mount(el.childNodes[2]);\n\n if(instance.face.showSeconds) {\n instance.createLabel('seconds').mount(el.childNodes[4]);\n }\n }\n\n}\n","import TwentyFourHourClock from './TwentyFourHourClock';\n\nexport default function(el, instance) {\n TwentyFourHourClock(el, instance);\n\n if(instance.face.showMeridium && instance.face.meridium) {\n const label = instance.createLabel(instance.face.meridium);\n const parent = el.childNodes[el.childNodes.length - 1];\n\n label.mount(parent).classList.add('flip-clock-meridium');\n }\n}\n","export default function(el, instance) {\n instance.createDivider().mount(el, el.childNodes[1]);\n instance.createDivider().mount(el, el.childNodes[3]);\n instance.createDivider().mount(el, el.childNodes[5]);\n\n if(instance.face.showSeconds) {\n instance.createDivider().mount(el, el.childNodes[7]);\n }\n\n if(instance.face.showLabels) {\n instance.createLabel('weeks').mount(el.childNodes[0]);\n instance.createLabel('days').mount(el.childNodes[2]);\n instance.createLabel('hours').mount(el.childNodes[4]);\n instance.createLabel('minutes').mount(el.childNodes[6]);\n\n if(instance.face.showSeconds) {\n instance.createLabel('seconds').mount(el.childNodes[8]);\n }\n }\n}\n","export default function(el, instance) {\n instance.createDivider().mount(el, el.childNodes[1]);\n instance.createDivider().mount(el, el.childNodes[3]);\n instance.createDivider().mount(el, el.childNodes[5]);\n instance.createDivider().mount(el, el.childNodes[7]);\n\n if(instance.face.showSeconds) {\n instance.createDivider().mount(el, el.childNodes[9]);\n }\n\n if(instance.face.showLabels) {\n instance.createLabel('years').mount(el.childNodes[0]);\n instance.createLabel('weeks').mount(el.childNodes[2]);\n instance.createLabel('days').mount(el.childNodes[4]);\n instance.createLabel('hours').mount(el.childNodes[6]);\n instance.createLabel('minutes').mount(el.childNodes[8]);\n\n if(instance.face.showSeconds) {\n instance.createLabel('seconds').mount(el.childNodes[10]);\n }\n }\n}\n","import Divider from './Divider';\nimport FlipClock from './FlipClock';\nimport Group from './Group';\nimport Label from './Label';\nimport List from './List';\nimport ListItem from './ListItem';\nimport * as faces from './Faces';\n\nexport default {\n Divider,\n FlipClock,\n Group,\n Label,\n List,\n ListItem,\n faces\n};\n","import { Counter } from '../Faces';\nimport { Original } from '../Themes';\nimport { English } from '../Languages';\n\n/**\n * @alias DefaultValues\n * @type {object}\n * @memberof module:Config/DefaultValues\n */\nexport default {\n face: Counter,\n theme: Original,\n language: English\n};\n","import Face from './Face';\nimport List from './List';\nimport Group from './Group';\nimport Label from './Label';\nimport Timer from './Timer';\nimport Divider from './Divider';\nimport * as Faces from '../Faces';\nimport FaceValue from './FaceValue';\nimport DomComponent from './DomComponent';\nimport validate from '../Helpers/Validate';\nimport DefaultValues from '../Config/DefaultValues';\nimport ConsoleMessages from '../Config/ConsoleMessages';\nimport { flatten, isNull, isString, isObject, isUndefined, isFunction, error } from '../Helpers/Functions';\n\nexport default class FlipClock extends DomComponent {\n \n /**\n * Create a new `FlipClock` instance.\n *\n * @class FlipClock\n * @extends DomComponent\n * @param {HTMLElement} el - The HTML element used to bind clock DOM node.\n * @param {*} value - The value that is passed to the clock face.\n * @param {object|undefined} attributes - {@link FlipClock.Options} passed an object with key/value.\n */\n \n /**\n * @namespace FlipClock.Options\n * @classdesc An object of key/value pairs that will be used to set the attributes.\n * \n * ##### Example:\n * \n * {\n * face: 'DayCounter',\n * language: 'es',\n * timer: Timer.make(500)\n * }\n * \n * @property {string|Face} [face={@link Faces.DayCounter}] - The clock's {@link Face} instance.\n * @property {number} [interval=1000] - The clock's interval rate (in milliseconds).\n * @property {object} [theme={@link Themes.Original}] - The clock's theme.\n * @property {string|object} [language={@link Languages.English}] - The clock's language.\n * @property {Timer} [timer={@link Timer}] - The clock's timer.\n */\n \n constructor(el, value, attributes) {\n if(!validate(el, HTMLElement)) {\n error(ConsoleMessages.element);\n }\n\n if(isObject(value) && !attributes) {\n attributes = value;\n value = undefined;\n }\n\n const face = attributes.face || DefaultValues.face;\n\n delete attributes.face;\n\n super(Object.assign({\n originalValue: value,\n theme: DefaultValues.theme,\n language: DefaultValues.language,\n timer: Timer.make(attributes.interval || 1000),\n }, attributes));\n\n if(!this.face) {\n this.face = face;\n }\n\n this.mount(el);\n }\n\n /**\n * The clock `Face`.\n *\n * @type {Face}\n */\n get face() {\n return this.$face;\n }\n\n set face(value) {\n if(!validate(value, [Face, 'string', 'function'])) {\n error(ConsoleMessages.face);\n }\n\n this.$face = (Faces[value] || value).make(Object.assign(this.getPublicAttributes(), {\n originalValue: this.face ? this.face.originalValue : undefined\n }));\n\n this.$face.initialized(this);\n\n if(this.value) {\n this.$face.value = this.face.createFaceValue(this, this.value.value);\n }\n else if(!this.value) {\n this.value = this.originalValue;\n }\n\n this.el && this.render();\n }\n\n /**\n * The `stopAt` attribute.\n *\n * @type {*}\n */\n get stopAt() {\n return isFunction(this.$stopAt) ? this.$stopAt(this) : this.$stopAt;\n }\n\n set stopAt(value) {\n this.$stopAt = value;\n }\n\n /**\n * The `timer` instance.\n *\n * @type {Timer}\n */\n get timer() {\n return this.$timer;\n }\n\n set timer(timer) {\n if(!validate(timer, Timer)) {\n error(ConsoleMessages.timer);\n }\n\n this.$timer = timer;\n }\n\n /**\n * Helper method to The clock's `FaceValue` instance.\n *\n * @type {FaceValue|null}\n */\n get value() {\n return this.face ? this.face.value : null;\n }\n\n set value(value) {\n if(!this.face) {\n throw new Error('A face must be set before setting a value.');\n }\n\n if(value instanceof FaceValue) {\n this.face.value = value;\n }\n else if(this.value) {\n this.face.value = this.face.value.clone(value);\n }\n else {\n this.face.value = this.face.createFaceValue(this, value);\n }\n\n this.el && this.render();\n }\n\n /**\n * The `originalValue` attribute.\n *\n * @type {*}\n */\n get originalValue() {\n if(isFunction(this.$originalValue) && !this.$originalValue.name) {\n return this.$originalValue();\n }\n\n if(!isUndefined(this.$originalValue) && !isNull(this.$originalValue)) {\n return this.$originalValue;\n }\n\n return this.face ? this.face.defaultValue() : undefined;\n }\n\n set originalValue(value) {\n this.$originalValue = value;\n }\n\n /**\n * Mount the clock to the parent DOM element.\n *\n * @param {HTMLElement} el - The parent `HTMLElement`.\n * @return {FlipClock} - The `FlipClock` instance.\n */\n mount(el) {\n super.mount(el);\n\n this.face.mounted(this);\n\n return this;\n }\n\n /**\n * Render the clock's DOM nodes.\n *\n * @return {HTMLElement} - The parent `HTMLElement`.\n */\n render() {\n // Call the parent render function\n super.render();\n\n // Check to see if the face has a render function defined in the theme.\n // This allows a face to completely re-render or add to the theme.\n // This allows face specific interfaces for a theme.\n if(this.theme.faces[this.face.name]) {\n this.theme.faces[this.face.name](this.el, this);\n }\n\n // Pass the clock instance to the rendered() function on the face.\n // This allows global modifications to the rendered templates not\n // theme specific.\n this.face.rendered(this);\n\n // Return the rendered `HTMLElement`.\n return this.el;\n }\n\n /**\n * Start the clock.\n *\n * @param {Function} fn - The interval callback.\n * @return {FlipClock} - The `FlipClock` instance.\n */\n start(fn) {\n if(!this.timer.started) {\n this.value = this.originalValue;\n }\n\n isUndefined(this.face.stopAt) && (this.face.stopAt = this.stopAt);\n isUndefined(this.face.originalValue) && (this.face.originalValue = this.originalValue);\n\n this.timer.start(() => {\n this.face.interval(this, fn);\n });\n\n this.face.started(this);\n\n return this.emit('start');\n }\n\n /**\n * Stop the clock.\n *\n * @param {Function} fn - The stop callback.\n * @return {FlipClock} - The `FlipClock` instance.\n */\n stop(fn) {\n this.timer.stop(fn);\n this.face.stopped(this);\n\n return this.emit('stop');\n }\n\n /**\n * Reset the clock to the original value.\n *\n * @param {Function} fn - The interval callback.\n * @return {FlipClock} - The `FlipClock` instance.\n */\n reset(fn) {\n this.value = this.originalValue;\n this.timer.reset(() => this.interval(this, fn));\n this.face.reset(this);\n\n return this.emit('reset');\n }\n\n /**\n * Helper method to increment the clock's value.\n *\n * @param {*|undefined} value - Increment the clock by the specified value.\n * If no value is passed, then the default increment is determined by\n * the Face, which is usually `1`.\n * @return {FlipClock} - The `FlipClock` instance.\n */\n increment(value) {\n this.face.increment(this, value);\n\n return this;\n }\n\n /**\n * Helper method to decrement the clock's value.\n *\n * @param {*|undefined} value - Decrement the clock by the specified value.\n * If no value is passed, then the default decrement is determined by\n * the `Face`, which is usually `1`.\n * @return {FlipClock} - The `FlipClock` instance.\n */\n decrement(value) {\n this.face.decrement(this, value);\n\n return this;\n }\n\n /**\n * Helper method to instantiate a new `Divider`.\n *\n * @param {object|undefined} [attributes] - The attributes passed to the\n * `Divider` instance.\n * @return {Divider} - The instantiated Divider.\n */\n createDivider(attributes) {\n return Divider.make(Object.assign({\n theme: this.theme,\n language: this.language\n }, attributes));\n }\n\n /**\n * Helper method to instantiate a new `List`.\n *\n * @param {*} value - The `List` value.\n * @param {object|undefined} [attributes] - The attributes passed to the\n * `List` instance.\n * @return {List} - The instantiated `List`.\n */\n createList(value, attributes) {\n return List.make(value, Object.assign({\n theme: this.theme,\n language: this.language\n }, attributes));\n }\n\n /**\n * Helper method to instantiate a new `Label`.\n *\n * @param {*} value - The `Label` value.\n * @param {object|undefined} [attributes] - The attributes passed to the\n * `Label` instance.\n * @return {Label} - The instantiated `Label`.\n */\n createLabel(value, attributes) {\n return Label.make(value, Object.assign({\n theme: this.theme,\n language: this.language\n }, attributes));\n }\n\n /**\n * Helper method to instantiate a new `Group`.\n *\n * @param {array} items - An array of `List` items to group.\n * @param {Group|undefined} [attributes] - The attributes passed to the\n * `Group` instance.\n * @return {Group} - The instantiated `Group`.\n */\n createGroup(items, attributes) {\n return Group.make(items, Object.assign({\n theme: this.theme,\n language: this.language\n }, attributes));\n }\n\n /**\n * The `defaults` attribute.\n *\n * @type {object}\n */\n static get defaults() {\n return DefaultValues;\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'FlipClock';\n }\n\n /**\n * Helper method to set the default `Face` value.\n *\n * @param {Face} value - The default `Face` class.This should be a\n * constructor.\n * @return {void}\n */\n static setDefaultFace(value) {\n if(!validate(value, Face)) {\n error(ConsoleMessages.face);\n }\n\n DefaultValues.face = value;\n }\n\n /**\n * Helper method to set the default theme.\n *\n * @param {object} value - The default theme.\n * @return {void}\n */\n static setDefaultTheme(value) {\n if(!validate(value, 'object')) {\n error(ConsoleMessages.theme);\n }\n\n DefaultValues.theme = value;\n }\n\n /**\n * Helper method to set the default language.\n *\n * @param {object} value - The default language.\n * @return {void}\n */\n static setDefaultLanguage(value) {\n if(!validate(value, 'object')) {\n error(ConsoleMessages.language);\n }\n\n DefaultValues.language = value;\n }\n\n}\n"],"names":["error","string","Error","callback","fn","isFunction","args","call","round","value","isNegativeZero","isNegative","Math","ceil","floor","toString","noop","isUndefined","isNull","chain","before","after","concatMap","x","map","reduce","y","concat","flatten","deepFlatten","Array","isArray","length","Infinity","isConstructor","Function","name","isString","isObject","type","isNumber","isNaN","kebabCase","replace","toLowerCase","Component","attributes","setAttribute","Object","assign","events","key","forEach","event","apply","push","filter","off","on","hasOwnProperty","getOwnPropertyNames","getAttribute","keys","getAttributes","match","obj","setAttributes","values","i","constructor","defineName","$events","digitize","options","minimumDigits","prependLeadingZero","prepend","number","shouldPrependZero","split","digits","arr","min","unshift","RANGES","max","format","parseFloat","findRange","char","code","charCodeAt","stringFromCharCodeBy","String","fromCharCode","next","converted","range","join","prev","FaceValue","getPublicAttributes","$digits","$value","validate","success","arg","className","items","theme","language","date","face","element","faceValue","timer","Face","undefined","autoStart","countdown","animationRate","defaultAttributes","defaultValue","instance","decrement","increment","shouldStop","stop","emit","stopAt","amount","isStopped","window","requestAnimationFrame","start","make","defaultDataType","createFaceValue","$stopAt","$originalValue","dictionary","aliases","LANGUAGES","find","indexOf","translate","from","lang","swap","subject","existing","parentNode","replaceChild","el","appendChildren","children","child","HTMLElement","appendChild","createElement","document","innerHTML","DomComponent","parent","render","insertBefore","$el","ConsoleMessages","$parent","$theme","$language","Divider","ListItem","List","item","$items","Group","Label","label","Timer","interval","count","handle","started","running","Date","lastLoop","now","loop","isRunning","setTimeout","cancelAnimationFrame","getTime","Counter","MinuteCounter","showSeconds","showLabels","diff","originalValue","getMinutes","getSeconds","a","b","getTotalSeconds","totalSeconds","abs","HourCounter","data","getHours","DayCounter","getDays","TwentyFourHourClock","groups","offset","TwelveHourClock","showMeridium","hours","meridium","WeekCounter","getWeeks","YearCounter","getYears","index","childNodes","querySelector","parts","group","groupEl","querySelectorAll","lists","listEl","listValue","createList","domValue","delay","createGroup","nodes","t","beforeValue","classList","add","style","animationDelay","animationDuration","createListItem","active","createDivider","mount","createLabel","FlipClock","faces","Original","English","DefaultValues","mounted","rendered","stopped","reset","$face","Faces","initialized","$timer","clone"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"flipclock.js","sources":["../src/js/Helpers/Functions.js","../src/js/Components/Component.js","../src/js/Helpers/Digitize.js","../src/js/Helpers/Value.js","../src/js/Components/FaceValue.js","../src/js/Helpers/Validate.js","../src/js/Config/ConsoleMessages.js","../src/js/Components/Face.js","../src/js/Languages/ar-ar.js","../src/js/Languages/ca-es.js","../src/js/Languages/cs-cz.js","../src/js/Languages/da-dk.js","../src/js/Languages/de-de.js","../src/js/Languages/en-us.js","../src/js/Languages/es-es.js","../src/js/Languages/fa-ir.js","../src/js/Languages/fi-fi.js","../src/js/Languages/fr-ca.js","../src/js/Languages/he-il.js","../src/js/Languages/hu-hu.js","../src/js/Languages/it-it.js","../src/js/Languages/ja-jp.js","../src/js/Languages/ko-kr.js","../src/js/Languages/lv-lv.js","../src/js/Languages/nl-be.js","../src/js/Languages/no-nb.js","../src/js/Languages/pl-pl.js","../src/js/Languages/pt-br.js","../src/js/Languages/ro-ro.js","../src/js/Languages/ru-ru.js","../src/js/Languages/sk-sk.js","../src/js/Languages/sv-se.js","../src/js/Languages/th-th.js","../src/js/Languages/tr-tr.js","../src/js/Languages/ua-ua.js","../src/js/Languages/vn-vn.js","../src/js/Languages/zh-cn.js","../src/js/Languages/zh-tw.js","../src/js/Languages/index.js","../src/js/Helpers/Language.js","../src/js/Helpers/Translate.js","../src/js/Helpers/Template.js","../src/js/Components/DomComponent.js","../src/js/Components/Divider.js","../src/js/Components/ListItem.js","../src/js/Components/List.js","../src/js/Components/Group.js","../src/js/Components/Label.js","../src/js/Components/Timer.js","../src/js/Faces/Counter.js","../src/js/Faces/MinuteCounter.js","../src/js/Faces/HourCounter.js","../src/js/Faces/DayCounter.js","../src/js/Faces/TwentyFourHourClock.js","../src/js/Faces/TwelveHourClock.js","../src/js/Faces/WeekCounter.js","../src/js/Faces/YearCounter.js","../src/js/Faces/index.js","../src/js/Themes/Original/Divider.js","../src/js/Themes/Original/FlipClock.js","../src/js/Themes/Original/Group.js","../src/js/Themes/Original/Label.js","../src/js/Themes/Original/List.js","../src/js/Themes/Original/ListItem.js","../src/js/Themes/Original/Faces/DayCounter.js","../src/js/Themes/Original/Faces/HourCounter.js","../src/js/Themes/Original/Faces/MinuteCounter.js","../src/js/Themes/Original/Faces/TwentyFourHourClock.js","../src/js/Themes/Original/Faces/TwelveHourClock.js","../src/js/Themes/Original/Faces/WeekCounter.js","../src/js/Themes/Original/Faces/YearCounter.js","../src/js/Themes/Original/index.js","../src/js/Config/DefaultValues.js","../src/js/Components/FlipClock.js"],"sourcesContent":["/**\r\n * These are a collection of helper functions, some borrowed from Lodash,\r\n * Underscore, etc, to provide common functionality without the need for using\r\n * a dependency. All of this is an attempt to reduce the file size of the\r\n * library.\r\n *\r\n * @namespace Helpers.Functions\r\n */\r\n\r\n/**\r\n * Throw a string as an Error exception.\r\n *\r\n * @function error\r\n * @param {string} string - The error message.\r\n * @return {void}\r\n * @memberof Helpers.Functions\r\n */\r\nexport function error(string) {\r\n throw Error(string);\r\n}\r\n\r\n/**\r\n * Check if `fn` is a function, and call it with `this` context and pass the\r\n * arguments.\r\n *\r\n * @function callback\r\n * @param {string} string - The callback fn.\r\n * @param {...*} args - The arguments to pass.\r\n * @return {void}\r\n * @memberof Helpers.Functions\r\n */\r\nexport function callback(fn, ...args) {\r\n if(isFunction(fn)) {\r\n return fn.call(this, ...args);\r\n }\r\n}\r\n\r\n/**\r\n * Round the value to the correct value. Takes into account negative numbers.\r\n *\r\n * @function round\r\n * @param {value} string - The value to round.\r\n * @return {string} - The rounded value.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function round(value) {\r\n return isNegativeZero(\r\n value = isNegative(value) ? Math.ceil(value) : Math.floor(value)\r\n ) ? ('-' + value).toString() : value;\r\n}\r\n\r\n/**\r\n * Returns `true` if `undefined or `null`.\r\n *\r\n * @function noop\r\n * @param {value} string - The value to check.\r\n * @return {boolean} - `true` if `undefined or `null`.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function noop(value) {\r\n return !isUndefined(value) && !isNull(value);\r\n}\r\n\r\n/**\r\n * Returns a function that executes the `before` attribute and passes that value\r\n * to `after` and the subsequent value is returned.\r\n *\r\n * @function chain\r\n * @param {function} before - The first function to execute.\r\n * @param {function} after - The subsequent function to execute.\r\n * @return {function} - A function that executes the chain.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function chain(before, after) {\r\n return () => after(before());\r\n}\r\n\r\n/**\r\n * Returns a function that returns maps the values before concatenating them.\r\n *\r\n * @function concatMap\r\n * @param {function} fn - The map callback function.\r\n * @return {function} - A function that executes the map and concatenation.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function concatMap(fn) {\r\n return x => {\r\n return x.map(fn).reduce((x, y) => x.concat(y), []);\r\n }\r\n}\r\n\r\n/**\r\n * Flatten an array.\r\n *\r\n * @function flatten\r\n * @param {array} value - The array to flatten.\r\n * @return {array} - The flattened array.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function flatten(value) {\r\n return concatMap(value => value)(value)\r\n}\r\n\r\n/**\r\n * Deep flatten an array.\r\n *\r\n * @function deepFlatten\r\n * @param {array} value - The array to flatten.\r\n * @return {array} - The flattened array.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function deepFlatten(x) {\r\n return concatMap(x => Array.isArray(x) ? deepFlatten (x) : x)(x);\r\n}\r\n\r\n/**\r\n * Capitalize the first letter in a string.\r\n *\r\n * @function ucfirst\r\n * @param {string} string - The string to capitalize.\r\n * @return {string} - The capitalized string.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function ucfirst(string) {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n}\r\n\r\n/**\r\n * Returns the length of a deep flatten array.\r\n *\r\n * @function length\r\n * @param {array} value - The array to count.\r\n * @return {number} - The length of the deep flattened array.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function length(value) {\r\n return deepFlatten(value).length;\r\n}\r\n\r\n/**\r\n * Determines if a value is a negative zero.\r\n *\r\n * @function isNegativeZero\r\n * @param {number} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a negative zero (`-0`).\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isNegativeZero(value) {\r\n return 1 / Math.round(value) === -Infinity;\r\n}\r\n\r\n/**\r\n * Determines if a value is a negative.\r\n *\r\n * @function isNegative\r\n * @param {number} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a negative.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isNegative(value) {\r\n return isNegativeZero(value) || value < 0;\r\n}\r\n\r\n/**\r\n * Determines if a value is `null`.\r\n *\r\n * @function isNull\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a `null`.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isNull(value) {\r\n return value === null;// || typeof value === 'null';\r\n}\r\n\r\n/**\r\n * Determines if a value is `undefined`.\r\n *\r\n * @function isNull\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a `undefined`.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isUndefined(value) {\r\n return typeof value === 'undefined';\r\n}\r\n\r\n/**\r\n * Determines if a value is a constructor.\r\n *\r\n * @function isConstructor\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a constructor.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isConstructor(value) {\r\n return (value instanceof Function) && !!value.name;\r\n}\r\n\r\n/**\r\n * Determines if a value is a string.\r\n *\r\n * @function isString\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a string.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isString(value) {\r\n return typeof value === 'string';\r\n}\r\n\r\n/**\r\n * Determines if a value is a array.\r\n *\r\n * @function isString\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a string.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isArray(value) {\r\n return value instanceof Array;\r\n}\r\n\r\n/**\r\n * Determines if a value is an object.\r\n *\r\n * @function isObject\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is an object.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isObject(value) {\r\n const type = typeof value;\r\n return value != null && !isArray(value) && (\r\n type == 'object' || type == 'function'\r\n );\r\n}\r\n\r\n/**\r\n * Determines if a value is a function.\r\n *\r\n * @function isObject\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a function.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isFunction(value) {\r\n return value instanceof Function;\r\n}\r\n\r\n/**\r\n * Determines if a value is a number.\r\n *\r\n * @function isObject\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a number.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isNumber(value) {\r\n return !isNaN(value);\r\n}\r\n\r\n/**\r\n * Converts a string into kebab case.\r\n *\r\n * @function kebabCase\r\n * @param {string} string - The string to convert.\r\n * @return {string} - The converted string.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function kebabCase(string) {\r\n return string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\\s+/g, '-').toLowerCase();\r\n}\r\n","import { chain, error, callback, isObject, kebabCase } from '../Helpers/Functions';\r\n\r\nexport default class Component {\r\n\r\n /**\r\n * Abstract base class.\r\n *\r\n * @class Component\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n */\r\n constructor(attributes) {\r\n this.setAttribute(Object.assign({\r\n events: {}\r\n }, attributes));\r\n }\r\n\r\n /**\r\n * Get the `name` attribute.\r\n *\r\n * @type {string}\r\n */\r\n get name() {\r\n if(!(this.constructor.defineName instanceof Function)) {\r\n error('Every class must define its name.');\r\n }\r\n\r\n return this.constructor.defineName();\r\n }\r\n\r\n /**\r\n * The `events` attribute.\r\n *\r\n * @type {object}\r\n */\r\n get events() {\r\n return this.$events || {};\r\n }\r\n\r\n set events(value) {\r\n this.$events = value;\r\n }\r\n\r\n /**\r\n * Emit an event.\r\n *\r\n * @param {string} key - The event id/key.\r\n * @return {Component} - Returns `this` instance.\r\n */\r\n emit(key, ...args) {\r\n if(this.events[key]) {\r\n this.events[key].forEach(event => {\r\n event.apply(this, args);\r\n });\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Start listening to an event.\r\n *\r\n * @param {string} key - The event id/key.\r\n * @param {Function} fn - The listener callback function.\r\n * @param {boolean} [once=false] - Should the event handler be fired a\r\n * single time.\r\n * @return {Component} - Returns `this` instance.\r\n */\r\n on(key, fn, once = false) {\r\n if(!this.events[key]) {\r\n this.events[key] = [];\r\n }\r\n\r\n this.events[key].push(fn);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Stop listening to an event.\r\n *\r\n * @param {string} key - The event id/key.\r\n * @param {(Function|undefined)} fn - The listener callback function. If no\r\n * function is defined, all events with the specified id/key will be\r\n * removed. Otherwise, only the event listeners matching the id/key AND\r\n * callback will be removed.\r\n * @return {Component} - Returns `this` instance.\r\n */\r\n off(key, fn) {\r\n if(this.events[key] && fn) {\r\n this.events[key] = this.events[key].filter(event => {\r\n return event !== fn;\r\n });\r\n }\r\n else {\r\n this.events[key] = [];\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Listen to an event only one time.\r\n *\r\n * @param {string} key - The event id/key.\r\n * @param {Function} fn - The listener callback function.\r\n * @return {Component} - Returns `this` instance.\r\n */\r\n once(key, fn) {\r\n fn = chain(fn, () => this.off(key, fn));\r\n\r\n return this.on(key, fn, true);\r\n }\r\n\r\n /**\r\n * Get an attribute. Returns null if no attribute is defined.\r\n *\r\n * @param {string} key - The attribute name.\r\n * @return {*} - The attribute value.\r\n */\r\n getAttribute(key) {\r\n return this.hasOwnProperty(key) ? this[key] : null;\r\n }\r\n\r\n /**\r\n * Get all the atttributes for this instance.\r\n *\r\n * @return {object} - The attribute dictionary.\r\n */\r\n getAttributes() {\r\n const attributes = {};\r\n\r\n Object.getOwnPropertyNames(this).forEach(key => {\r\n attributes[key] = this.getAttribute(key);\r\n });\r\n\r\n return attributes;\r\n }\r\n\r\n /**\r\n * Get only public the atttributes for this instance. Omits any attribute\r\n * that starts with `$`, which is used internally.\r\n *\r\n * @return {object} - The attribute dictionary.\r\n */\r\n getPublicAttributes() {\r\n return Object.keys(this.getAttributes())\r\n .filter(key => {\r\n return !key.match(/^\\$/);\r\n })\r\n .reduce((obj, key) => {\r\n obj[key] = this.getAttribute(key);\r\n return obj;\r\n }, {});\r\n }\r\n\r\n /**\r\n * Set an attribute key and value.\r\n *\r\n * @param {string} key - The attribute name.\r\n * @param {*} value - The attribute value.\r\n * @return {void}\r\n */\r\n setAttribute(key, value) {\r\n if(isObject(key)) {\r\n this.setAttributes(key);\r\n }\r\n else {\r\n this[key] = value;\r\n }\r\n }\r\n\r\n /**\r\n * Set an attributes by object of key/value pairs.\r\n *\r\n * @param {object} values - The object dictionary.\r\n * @return {void}\r\n */\r\n setAttributes(values) {\r\n for(const i in values) {\r\n this.setAttribute(i, values[i]);\r\n }\r\n }\r\n\r\n /**\r\n * Helper method to execute the `callback()` function.\r\n *\r\n * @param {Function} fn - The callback function.\r\n * @return {*} - Returns the executed callback function.\r\n */\r\n callback(fn) {\r\n return callback.call(this, fn);\r\n }\r\n\r\n /**\r\n * Factor method to static instantiate new instances. Useful for writing\r\n * clean expressive syntax with chained methods.\r\n *\r\n * @param {...*} args - The callback arguments.\r\n * @return {*} - The new component instance.\r\n */\r\n static make(...args) {\r\n return new this(...args);\r\n }\r\n\r\n}\r\n","/**\r\n * @namespace Helpers.Digitize\r\n */\r\nimport { flatten } from './Functions';\r\nimport { deepFlatten } from './Functions';\r\n\r\n/**\r\n * Digitize a number, string, or an array into a digitized array. This function\r\n * use by the `Face`, which convert the digitized array into an array of `List`\r\n * instances.\r\n *\r\n * @function digitize\r\n * @param {*} value - The value to digitize.\r\n * @param {(Object|undefined)} [options] - The digitizer options.\r\n * @return {array} - The digitized array.\r\n * @memberof Helpers.Digitize\r\n */\r\nexport default function digitize(value, options) {\r\n options = Object.assign({\r\n minimumDigits: 0,\r\n prependLeadingZero: true\r\n }, options);\r\n\r\n function prepend(number) {\r\n const shouldPrependZero = options.prependLeadingZero &&\r\n number.toString().split('').length === 1;\r\n\r\n return (shouldPrependZero ? '0' : '').concat(number);\r\n }\r\n\r\n function digits(arr, min) {\r\n const length = deepFlatten(arr).length;\r\n\r\n if(length < min) {\r\n for(let i = 0; i < min - length; i++) {\r\n arr[0].unshift('0');\r\n }\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n return digits(flatten([value]).map(number => {\r\n return flatten(deepFlatten([number]).map(number => {\r\n return prepend(number).split('');\r\n }));\r\n }), options.minimumDigits || 0);\r\n}\r\n","/**\r\n * @namespace Helpers.Value\r\n */\r\n\r\n/**\r\n * An array of objects with min/max ranges.\r\n *\r\n * @private\r\n * @type {array}\r\n */\r\nconst RANGES = [{\r\n // 0-9\r\n min: 48,\r\n max: 57\r\n},{\r\n // a-z\r\n min: 65,\r\n max: 90\r\n},{\r\n // A-Z\r\n min: 97,\r\n max: 122\r\n}];\r\n\r\n/**\r\n * Format a string into a new data type. Currently only supports string to\r\n * number conversion.\r\n *\r\n * @private\r\n * @function format\r\n * @param {string} string - The string to format.\r\n * @param {string} type - The data type (represented as a string) used to\r\n * convert the string.\r\n * @return {boolean} - Returns the formatted string.\r\n */\r\nfunction format(string, type) {\r\n switch(type) {\r\n case 'number':\r\n return parseFloat(string);\r\n }\r\n\r\n return string;\r\n}\r\n\r\n/**\r\n * Find the range object from the `RANGES` constant from the character given.\r\n * This is mainly an interval method, but can be used by faces to help\r\n * determine what the next value of a string should be.\r\n *\r\n * @private\r\n * @function format\r\n * @param {string} char - The char used to determine the range.\r\n * @param {string} type - The data type (represented as a string) used to\r\n * convert the string.\r\n * @return {boolean} - Returns the formatted string.\r\n */\r\nfunction findRange(char) {\r\n for(const i in RANGES) {\r\n const code = char.toString().charCodeAt(0);\r\n\r\n if(RANGES[i].min <= code && RANGES[i].max >= code) {\r\n return RANGES[i];\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Create a string from a character code, which is returned by the callback.\r\n *\r\n * @private\r\n * @callback stringFromCharCodeBy\r\n * @param {string} char - The char used to determine the range.\r\n * @param {function} fn - The callback function receives `range` and `code`\r\n * arguments. This function should return a character code.\r\n * @return {string} - Creates a string from the character code returned by the\r\n * callback function.\r\n */\r\nfunction stringFromCharCodeBy(char, fn) {\r\n return String.fromCharCode(\r\n fn(findRange(char), char.charCodeAt(0))\r\n );\r\n}\r\n\r\n/**\r\n * Calculate the next value for a string. 'a' becomes 'b'. 'A' becomes 'B'. 1\r\n * becomes 2, etc. If multiple character strings are passed, 'aa' would become\r\n * 'bb'.\r\n *\r\n * @function next\r\n * @param {(string|number)} value - The string or number to convert.\r\n * @return {string} - The formatted string\r\n * @memberof Helpers.Value\r\n */\r\nexport function next(value) {\r\n const converted = (value)\r\n .toString()\r\n .split('')\r\n .map(char => stringFromCharCodeBy(char, (range, code) => {\r\n return !range || code < range.max ? code + 1 : range.min\r\n }))\r\n .join('');\r\n\r\n return format(converted, typeof value);\r\n}\r\n\r\n/**\r\n * Calculate the prev value for a string. 'b' becomes 'a'. 'B' becomes 'A'. 2\r\n * becomes 1, 0 becomes 9, etc. If multiple character strings are passed, 'bb'\r\n * would become 'aa'.\r\n *\r\n * @function prev\r\n * @param {(string|number)} value - The string or number to convert.\r\n * @return {string} - The formatted string\r\n * @memberof Helpers.Value\r\n */\r\nexport function prev(value) {\r\n const converted = (value)\r\n .toString()\r\n .split('')\r\n .map(char => stringFromCharCodeBy(char, (range, code) => {\r\n return !range || code > range.min ? code - 1 : range.max\r\n }))\r\n .join('');\r\n\r\n return format(converted, typeof value);\r\n}\r\n","import Component from './Component';\r\nimport digitize from '../Helpers/Digitize';\r\nimport { next, prev } from '../Helpers/Value';\r\nimport { length, isObject, isNumber } from '../Helpers/Functions';\r\n\r\nexport default class FaceValue extends Component {\r\n\r\n /**\r\n * The `FaceValue` class handles all the digitizing for the `Face`.\r\n *\r\n * @class FaceValue\r\n * @extends Component\r\n * @param {*} value - The `FaceValue`'s actual value. Most likely should\r\n * string, number, or Date. But since the Face handles the value, it\r\n * could be anything.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n */\r\n constructor(value, attributes) {\r\n super(Object.assign({\r\n format: value => value,\r\n prependLeadingZero: true,\r\n minimumDigits: 0\r\n }, attributes));\r\n\r\n if(!this.value) {\r\n this.value = value;\r\n }\r\n }\r\n\r\n /**\r\n * The `digits` attribute.\r\n *\r\n * @type {(Array|undefined)}\r\n */\r\n get digits() {\r\n return this.$digits;\r\n }\r\n\r\n set digits(value) {\r\n this.$digits = value;\r\n this.minimumDigits = Math.max(this.minimumDigits, length(value));\r\n }\r\n\r\n /**\r\n * The `value` attribute.\r\n *\r\n * @type {*}\r\n */\r\n get value() {\r\n return this.$value;\r\n }\r\n\r\n set value(value) {\r\n this.$value = value;\r\n this.digits = digitize(this.format(value), {\r\n minimumDigits: this.minimumDigits,\r\n prependLeadingZero: this.prependLeadingZero\r\n });\r\n }\r\n\r\n /**\r\n * Returns `true` if the `value` attribute is not a number.\r\n *\r\n * @return {boolean} - `true` is the value is not a number.\r\n */\r\n isNaN() {\r\n return isNaN(this.value);\r\n }\r\n\r\n /**\r\n * Returns `true` if the `value` attribute is a number.\r\n *\r\n * @return {boolean} - `true` is the value is a number.\r\n */\r\n isNumber() {\r\n return isNumber();\r\n }\r\n\r\n /**\r\n * Clones the current `FaceValue` instance, but sets a new value to the\r\n * cloned instance. Used for copying the current instance options and\r\n * methods, but setting a new value.\r\n *\r\n * @param {*} value - The n\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @return {FaceValue} - The cloned `FaceValue`.\r\n */\r\n clone(value, attributes) {\r\n return new this.constructor(value, Object.assign(\r\n this.getPublicAttributes(), attributes\r\n ));\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'FaceValue';\r\n }\r\n\r\n}\r\n","/**\r\n * @namespace Helpers.Validate\r\n */\r\nimport { isNull } from './Functions';\r\nimport { flatten } from './Functions';\r\nimport { isString } from './Functions';\r\nimport { isObject } from './Functions';\r\nimport { isFunction } from './Functions';\r\nimport { isConstructor } from './Functions';\r\n\r\n/**\r\n * Validate the data type of a variable.\r\n *\r\n * @function validate\r\n * @param {*} value - The value to validate.\r\n * @param {...*} args - The data types to use for validate.\r\n * @return {boolean} - Returns `true`is the value has a valid data type.\r\n * @memberof Helpers.Validate\r\n */\r\nexport default function validate(value, ...args) {\r\n let success = false;\r\n\r\n flatten(args).forEach(arg => {\r\n if( (isNull(value) && isNull(arg)) ||\r\n (isObject(arg) && (value instanceof arg)) ||\r\n (isFunction(arg) && !isConstructor(arg) && arg(value) === true) ||\r\n (isString(arg) && (typeof value === arg))) {\r\n success = true;\r\n }\r\n });\r\n\r\n return success;\r\n}\r\n","/**\r\n * @alias ConsoleMessages\r\n * @type {object}\r\n * @memberof module:Config/ConsoleMessages\r\n */\r\nexport default {\r\n className: 'The className() is not defined.',\r\n items: 'The items property must be an array.',\r\n theme: 'The theme property must be an object.',\r\n language: 'The language must be an object.',\r\n date: 'The value must be an instance of a Date.',\r\n face: 'The face must be an instance of a Face class.',\r\n element: 'The element must be an instance of an HTMLElement',\r\n faceValue: 'The face must be an instance of a FaceValue class.',\r\n timer: 'The timer property must be an instance of a Timer class.'\r\n};\r\n","import Component from './Component';\r\nimport FaceValue from './FaceValue';\r\nimport validate from '../Helpers/Validate';\r\nimport ConsoleMessages from '../Config/ConsoleMessages';\r\nimport { error, isNull, isUndefined, isObject, isArray, isFunction, callback } from '../Helpers/Functions';\r\n\r\nexport default class Face extends Component {\r\n\r\n /**\r\n * This class is meant to be provide an interface for all other faces to\r\n * extend.\r\n *\r\n * @class Face\r\n * @extends Component\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n */\r\n constructor(value, attributes) {\r\n if(!(value instanceof FaceValue) && isObject(value)) {\r\n attributes = value;\r\n value = undefined;\r\n }\r\n\r\n super();\r\n\r\n this.setAttributes(Object.assign({\r\n autoStart: true,\r\n countdown: false,\r\n animationRate: 500\r\n }, this.defaultAttributes(), attributes || {}));\r\n\r\n if(isNull(value) || isUndefined(value)) {\r\n value = this.defaultValue();\r\n }\r\n\r\n if(value) {\r\n this.value = value;\r\n }\r\n }\r\n\r\n /**\r\n * The `dataType` attribute.\r\n *\r\n * @type {*}\r\n */\r\n get dataType() {\r\n return this.defaultDataType();\r\n }\r\n\r\n /**\r\n * The `value` attribute.\r\n *\r\n * @type {*}\r\n */\r\n get value() {\r\n return this.$value;\r\n }\r\n\r\n set value(value) {\r\n if(!(value instanceof FaceValue)) {\r\n value = this.createFaceValue(value);\r\n }\r\n\r\n this.$value = value;\r\n }\r\n\r\n /**\r\n * The `stopAt` attribute.\r\n *\r\n * @type {*}\r\n */\r\n get stopAt() {\r\n return this.$stopAt;\r\n }\r\n\r\n set stopAt(value) {\r\n this.$stopAt = value;\r\n }\r\n\r\n /**\r\n * The `originalValue` attribute.\r\n *\r\n * @type {*}\r\n */\r\n get originalValue() {\r\n return this.$originalValue;\r\n }\r\n\r\n set originalValue(value) {\r\n this.$originalValue = value;\r\n }\r\n\r\n /**\r\n * This method is called with every interval, or every time the clock\r\n * should change, and handles the actual incrementing and decrementing the\r\n * clock's `FaceValue`.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @param {Function} fn - The interval callback.\r\n * @return {Face} - This `Face` instance.\r\n */\r\n interval(instance, fn) {\r\n if(this.countdown) {\r\n this.decrement(instance);\r\n }\r\n else {\r\n this.increment(instance);\r\n }\r\n\r\n callback.call(instance, fn);\r\n\r\n if(this.shouldStop(instance)) {\r\n instance.stop();\r\n }\r\n\r\n return instance.emit('interval');\r\n }\r\n\r\n /**\r\n * Determines if the clock should stop or not.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @return {boolean} - Returns `true` if the clock should stop.\r\n */\r\n shouldStop(instance) {\r\n return !isUndefined(this.stopAt) ? this.stopAt === instance.value.value : false;\r\n }\r\n\r\n /**\r\n * By default this just returns the value unformatted.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @param {*} value - The value to format.\r\n * @return {*} - The formatted value.\r\n */\r\n format(instance, value) {\r\n return value;\r\n }\r\n\r\n /**\r\n * The default value for the `Face`.\r\n *\r\n * @return {*} - The default value.\r\n */\r\n defaultValue() {\r\n //\r\n }\r\n\r\n /**\r\n * The default attributes for the `Face`.\r\n *\r\n * @return {(Object|undefined)} - The default attributes.\r\n */\r\n defaultAttributes() {\r\n //\r\n }\r\n\r\n /**\r\n * The default data type for the `Face` value.\r\n *\r\n * @return {(Object|undefined)} - The default data type.\r\n */\r\n defaultDataType() {\r\n //\r\n }\r\n\r\n /**\r\n * Increment the clock.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @param {Number} [amount] - The amount to increment. If the amount is not\r\n * defined, it is left up to the `Face` to determine the default value.\r\n * @return {void}\r\n */\r\n increment(instance, amount) {\r\n //\r\n }\r\n\r\n /**\r\n * Decrement the clock.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @param {Number} [amount] - The amount to decrement. If the amount is not\r\n * defined, it is left up to the `Face` to determine the default value.\r\n * @return {void}\r\n */\r\n decrement(instance, amount) {\r\n //\r\n }\r\n\r\n /**\r\n * This method is called right after clock has started.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @return {void}\r\n */\r\n started(instance) {\r\n //\r\n }\r\n\r\n /**\r\n * This method is called right after clock has stopped.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @return {void}\r\n */\r\n stopped(instance) {\r\n //\r\n }\r\n\r\n /**\r\n * This method is called right after clock has reset.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @return {void}\r\n */\r\n reset(instance) {\r\n //\r\n }\r\n\r\n /**\r\n * This method is called right after `Face` has initialized.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @return {void}\r\n */\r\n initialized(instance) {\r\n //\r\n }\r\n\r\n /**\r\n * This method is called right after `Face` has rendered.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @return {void}\r\n */\r\n rendered(instance) {\r\n //\r\n }\r\n\r\n /**\r\n * This method is called right after `Face` has mounted.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @return {void}\r\n */\r\n mounted(instance) {\r\n if(this.autoStart && instance.timer.isStopped) {\r\n window.requestAnimationFrame(() => instance.start(instance));\r\n }\r\n }\r\n\r\n /**\r\n * Helper method to instantiate a new `FaceValue`.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @param {object|undefined} [attributes] - The attributes passed to the\r\n * `FaceValue` instance.\r\n * @return {Divider} - The instantiated `FaceValue`.\r\n */\r\n createFaceValue(instance, value) {\r\n return FaceValue.make(\r\n isFunction(value) && !value.name ? value() : value, {\r\n minimumDigits: this.minimumDigits,\r\n format: value => this.format(instance, value)\r\n }\r\n );\r\n }\r\n\r\n}\r\n","/**\r\n * @classdesc Arabic Language Pack\r\n * @desc This class will be used to translate tokens into the Arabic language.\r\n * @namespace Languages.Arabic\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Arabic\r\n */\r\nexport const dictionary = {\r\n 'years' : 'سنوات',\r\n 'months' : 'شهور',\r\n 'days' : 'أيام',\r\n 'hours' : 'ساعات',\r\n 'minutes' : 'دقائق',\r\n 'seconds' : 'ثواني'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Arabic\r\n */\r\nexport const aliases = ['ar', 'ar-ar', 'arabic'];\r\n","/**\r\n * @classdesc Catalan Language Pack\r\n * @desc This class will used to translate tokens into the Catalan language.\r\n * @namespace Languages.Catalan\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Catalan\r\n */\r\nexport const dictionary = {\r\n 'years' : 'Anys',\r\n 'months' : 'Mesos',\r\n 'days' : 'Dies',\r\n 'hours' : 'Hores',\r\n 'minutes' : 'Minuts',\r\n 'seconds' : 'Segons'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Catalan\r\n */\r\nexport const aliases = ['ca', 'ca-es', 'catalan'];\r\n","/**\r\n * @classdesc Czech Language Pack\r\n * @desc This class will used to translate tokens into the Czech language.\r\n * @namespace Languages.Czech\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Czech\r\n */\r\nexport const dictionary = {\r\n 'years' : 'Roky',\r\n 'months' : 'Měsíce',\r\n 'days' : 'Dny',\r\n 'hours' : 'Hodiny',\r\n 'minutes' : 'Minuty',\r\n 'seconds' : 'Sekundy'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Czech\r\n */\r\nexport const aliases = ['cs', 'cs-cz', 'cz', 'cz-cs', 'czech'];\r\n","/**\r\n * @classdesc Danish Language Pack\r\n * @desc This class will used to translate tokens into the Danish language.\r\n * @namespace Languages.Danish\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Danish\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'År',\r\n\t'months' : 'Måneder',\r\n\t'days' : 'Dage',\r\n\t'hours' : 'Timer',\r\n\t'minutes' : 'Minutter',\r\n\t'seconds' : 'Sekunder'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Danish\r\n */\r\nexport const aliases = ['da', 'da-dk', 'danish'];\r\n","/**\r\n * @classdesc German Language Pack\r\n * @desc This class will used to translate tokens into the German language.\r\n * @namespace Languages.German\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.German\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Jahre',\r\n\t'months' : 'Monate',\r\n\t'days' : 'Tage',\r\n\t'hours' : 'Stunden',\r\n\t'minutes' : 'Minuten',\r\n\t'seconds' : 'Sekunden'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.German\r\n */\r\nexport const aliases = ['de', 'de-de', 'german'];\r\n","/**\r\n * @classdesc English Language Pack\r\n * @desc This class will used to translate tokens into the English language.\r\n * @namespace Languages.English\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.English\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Years',\r\n\t'months' : 'Months',\r\n\t'days' : 'Days',\r\n\t'hours' : 'Hours',\r\n\t'minutes' : 'Minutes',\r\n\t'seconds' : 'Seconds'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.English\r\n */\r\nexport const aliases = ['en', 'en-us', 'english'];\r\n","/**\r\n * @classdesc Spanish Language Pack\r\n * @desc This class will used to translate tokens into the Spanish language.\r\n * @namespace Languages.Spanish\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Spanish\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Años',\r\n\t'months' : 'Meses',\r\n\t'days' : 'Días',\r\n\t'hours' : 'Horas',\r\n\t'minutes' : 'Minutos',\r\n\t'seconds' : 'Segundos'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Spanish\r\n */\r\nexport const aliases = ['es', 'es-es', 'spanish'];\r\n","/**\r\n * @classdesc Persian Language Pack\r\n * @desc This class will used to translate tokens into the Persian language.\r\n * @namespace Languages.Persian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Persian\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'سال',\r\n\t'months' : 'ماه',\r\n\t'days' : 'روز',\r\n\t'hours' : 'ساعت',\r\n\t'minutes' : 'دقیقه',\r\n\t'seconds' : 'ثانیه'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Persian\r\n */\r\nexport const aliases = ['fa', 'fa-ir', 'persian'];\r\n","/**\r\n * @classdesc Finnish Language Pack\r\n * @desc This class will used to translate tokens into the Finnish language.\r\n * @namespace Languages.Finnish\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Finnish\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Vuotta',\r\n\t'months' : 'Kuukautta',\r\n\t'days' : 'Päivää',\r\n\t'hours' : 'Tuntia',\r\n\t'minutes' : 'Minuuttia',\r\n\t'seconds' : 'Sekuntia'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Finnish\r\n */\r\nexport const aliases = ['fi', 'fi-fi', 'finnish'];\r\n","/**\r\n * @classdesc Canadian French Language Pack\r\n * @desc This class will used to translate tokens into the Canadian French language.\r\n * @namespace Languages.CanadianFrench\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.CanadianFrench\r\n */\r\nexport const dictionary = {\r\n 'years' : 'Ans',\r\n 'months' : 'Mois',\r\n 'days' : 'Jours',\r\n 'hours' : 'Heures',\r\n 'minutes' : 'Minutes',\r\n 'seconds' : 'Secondes'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.CanadianFrench\r\n */\r\nexport const aliases = ['fr', 'fr-ca', 'french'];\r\n","/**\r\n * @classdesc Hebrew Language Pack\r\n * @desc This class will used to translate tokens into the Hebrew language.\r\n * @namespace Languages.Hebrew\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Hebrew\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'שנים',\r\n\t'months' : 'חודש',\r\n\t'days' : 'ימים',\r\n\t'hours' : 'שעות',\r\n\t'minutes' : 'דקות',\r\n\t'seconds' : 'שניות'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Hebrew\r\n */\r\nexport const aliases = ['il', 'he-il', 'hebrew'];\r\n","/**\r\n * @classdesc Hungarian Language Pack\r\n * @desc This class will used to translate tokens into the Hungarian language.\r\n * @namespace Languages.Hungarian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Hungarian\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Év',\r\n 'months' : 'Hónap',\r\n 'days' : 'Nap',\r\n 'hours' : 'Óra',\r\n 'minutes' : 'Perc',\r\n 'seconds' : 'Másodperc'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Hungarian\r\n */\r\nexport const aliases = ['hu', 'hu-hu', 'hungarian'];\r\n","/**\r\n * @classdesc Italian Language Pack\r\n * @desc This class will used to translate tokens into the Italian language.\r\n * @namespace Languages.Italian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Italian\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Anni',\r\n\t'months' : 'Mesi',\r\n\t'days' : 'Giorni',\r\n\t'hours' : 'Ore',\r\n\t'minutes' : 'Minuti',\r\n\t'seconds' : 'Secondi'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Italian\r\n */\r\nexport const aliases = ['da', 'da-dk', 'danish'];\r\n","/**\r\n * @classdesc Japanese Language Pack\r\n * @desc This class will used to translate tokens into the Japanese language.\r\n * @namespace Languages.Japanese\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Japanese\r\n */\r\nexport const dictionary = {\r\n\t'years' : '年',\r\n\t'months' : '月',\r\n\t'days' : '日',\r\n\t'hours' : '時',\r\n\t'minutes' : '分',\r\n\t'seconds' : '秒'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Japanese\r\n */\r\nexport const aliases = ['jp', 'ja-jp', 'japanese'];\r\n","/**\r\n * @classdesc Korean Language Pack\r\n * @desc This class will used to translate tokens into the Korean language.\r\n * @namespace Languages.Korean\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Korean\r\n */\r\nexport const dictionary = {\r\n\t'years' : '년',\r\n\t'months' : '월',\r\n\t'days' : '일',\r\n\t'hours' : '시',\r\n\t'minutes' : '분',\r\n\t'seconds' : '초'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Korean\r\n */\r\nexport const aliases = ['ko', 'ko-kr', 'korean'];\r\n","/**\r\n * @classdesc Latvian Language Pack\r\n * @desc This class will used to translate tokens into the Latvian language.\r\n * @namespace Languages.Latvian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Latvian\r\n */\r\nexport const dictionary = {\r\n 'years' : 'Gadi',\r\n 'months' : 'Mēneši',\r\n 'days' : 'Dienas',\r\n 'hours' : 'Stundas',\r\n 'minutes' : 'Minūtes',\r\n 'seconds' : 'Sekundes'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Latvian\r\n */\r\nexport const aliases = ['lv', 'lv-lv', 'latvian'];\r\n","/**\r\n * @classdesc Dutch Language Pack\r\n * @desc This class will used to translate tokens into the Dutch language.\r\n * @namespace Languages.Dutch\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Dutch\r\n */\r\nexport const dictionary = {\r\n 'years' : 'Jaren',\r\n 'months' : 'Maanden',\r\n 'days' : 'Dagen',\r\n 'hours' : 'Uren',\r\n 'minutes' : 'Minuten',\r\n 'seconds' : 'Seconden'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Dutch\r\n */\r\nexport const aliases = ['nl', 'nl-be', 'dutch'];\r\n","/**\r\n * @classdesc Norwegian-Bokmål Language Pack\r\n * @desc This class will used to translate tokens into the Norwegian-Bokmål language.\r\n * @namespace Languages.Norwegian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Norwegian\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'År',\r\n\t'months' : 'Måneder',\r\n\t'days' : 'Dager',\r\n\t'hours' : 'Timer',\r\n\t'minutes' : 'Minutter',\r\n\t'seconds' : 'Sekunder'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Norwegian\r\n */\r\nexport const aliases = ['no', 'nb', 'no-nb', 'norwegian'];\r\n","/**\r\n * @classdesc Polish Language Pack\r\n * @desc This class will used to translate tokens into the Polish language.\r\n * @namespace Languages.Polish\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Polish\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Lat',\r\n\t'months' : 'Miesięcy',\r\n\t'days' : 'Dni',\r\n\t'hours' : 'Godziny',\r\n\t'minutes' : 'Minuty',\r\n\t'seconds' : 'Sekundy'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Polish\r\n */\r\nexport const aliases = ['pl', 'pl-pl', 'polish'];\r\n","/**\r\n * @classdesc Portuguese Language Pack\r\n * @desc This class will used to translate tokens into the Portuguese language.\r\n * @namespace Languages.Portuguese\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Portuguese\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Anos',\r\n\t'months' : 'Meses',\r\n\t'days' : 'Dias',\r\n\t'hours' : 'Horas',\r\n\t'minutes' : 'Minutos',\r\n\t'seconds' : 'Segundos'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Portuguese\r\n */\r\nexport const aliases = ['pt', 'pt-br', 'portuguese'];\r\n","/**\r\n * @classdesc Romanian Language Pack\r\n * @desc This class will used to translate tokens into the Romanian language.\r\n * @namespace Languages.Romanian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Romanian\r\n */\r\nexport const dictionary = {\r\n\t'years': 'Ani',\r\n\t'months': 'Luni',\r\n\t'days': 'Zile',\r\n\t'hours': 'Ore',\r\n\t'minutes': 'Minute',\r\n\t'seconds': 'sSecunde'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Romanian\r\n */\r\nexport const aliases = ['ro', 'ro-ro', 'romana'];\r\n","/**\r\n * @classdesc Russian Language Pack\r\n * @desc This class will used to translate tokens into the Russian language.\r\n * @namespace Languages.Russian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Russian\r\n */\r\nexport const dictionary = {\r\n 'years' : 'лет',\r\n 'months' : 'месяцев',\r\n 'days' : 'дней',\r\n 'hours' : 'часов',\r\n 'minutes' : 'минут',\r\n 'seconds' : 'секунд'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Russian\r\n */\r\nexport const aliases = ['ru', 'ru-ru', 'russian'];\r\n","/**\r\n * @classdesc Slovak Language Pack\r\n * @desc This class will used to translate tokens into the Slovak language.\r\n * @namespace Languages.Slovak\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Slovak\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Roky',\r\n\t'months' : 'Mesiace',\r\n\t'days' : 'Dni',\r\n\t'hours' : 'Hodiny',\r\n\t'minutes' : 'Minúty',\r\n\t'seconds' : 'Sekundy'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Slovak\r\n */\r\nexport const aliases = ['sk', 'sk-sk', 'slovak'];\r\n","/**\r\n * @classdesc Swedish Language Pack\r\n * @desc This class will used to translate tokens into the Swedish language.\r\n * @namespace Languages.Swedish\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Swedish\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'År',\r\n\t'months' : 'Månader',\r\n\t'days' : 'Dagar',\r\n\t'hours' : 'Timmar',\r\n\t'minutes' : 'Minuter',\r\n\t'seconds' : 'Sekunder'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Swedish\r\n */\r\nexport const aliases = ['sv', 'sv-se', 'swedish'];\r\n","/**\r\n * @classdesc Thai Language Pack\r\n * @desc This class will used to translate tokens into the Thai language.\r\n * @namespace Languages.Thai\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Thai\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'ปี',\r\n\t'months' : 'เดือน',\r\n\t'days' : 'วัน',\r\n\t'hours' : 'ชั่วโมง',\r\n\t'minutes' : 'นาที',\r\n\t'seconds' : 'วินาที'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Thai\r\n */\r\nexport const aliases = ['th', 'th-th', 'thai'];\r\n","/**\r\n * @classdesc Turkish Language Pack\r\n * @desc This class will used to translate tokens into the Turkish language.\r\n * @namespace Languages.Turkish\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Turkish\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Yıl',\r\n\t'months' : 'Ay',\r\n\t'days' : 'Gün',\r\n\t'hours' : 'Saat',\r\n\t'minutes' : 'Dakika',\r\n\t'seconds' : 'Saniye'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Turkish\r\n */\r\nexport const aliases = ['tr', 'tr-tr', 'turkish'];\r\n","/**\r\n * @classdesc Ukrainian Language Pack\r\n * @desc This class will used to translate tokens into the Ukrainian language.\r\n * @namespace Languages.Ukrainian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Ukrainian\r\n */\r\nexport const dictionary = {\r\n 'years' : 'роки',\r\n 'months' : 'місяці',\r\n 'days' : 'дні',\r\n 'hours' : 'години',\r\n 'minutes' : 'хвилини',\r\n 'seconds' : 'секунди'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Ukrainian\r\n */\r\nexport const aliases = ['ua', 'ua-ua', 'ukraine'];\r\n","/**\r\n * @classdesc Vietnamese Language Pack\r\n * @desc This class will used to translate tokens into the Vietnamese language.\r\n * @namespace Languages.Vietnamese\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Vietnamese\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Năm',\r\n\t'months' : 'Tháng',\r\n\t'days' : 'Ngày',\r\n\t'hours' : 'Giờ',\r\n\t'minutes' : 'Phút',\r\n\t'seconds' : 'Giây'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Vietnamese\r\n */\r\nexport const aliases = ['vn', 'vn-vn', 'vietnamese'];\r\n","/**\r\n * @classdesc Chinese Language Pack\r\n * @desc This class will used to translate tokens into the Chinese language.\r\n * @namespace Languages.Chinese\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Chinese\r\n */\r\nexport const dictionary = {\r\n\t'years' : '年',\r\n\t'months' : '月',\r\n\t'days' : '日',\r\n\t'hours' : '时',\r\n\t'minutes' : '分',\r\n\t'seconds' : '秒'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Chinese\r\n */\r\nexport const aliases = ['zh', 'zh-cn', 'chinese'];\r\n","/**\r\n * @classdesc Traditional Chinese Language Pack\r\n * @desc This class will used to translate tokens into the Traditional Chinese language.\r\n * @namespace Languages.TraditionalChinese\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.TraditionalChinese\r\n */\r\nexport const dictionary = {\r\n\t'years' : '年',\r\n\t'months' : '月',\r\n\t'days' : '日',\r\n\t'hours' : '時',\r\n\t'minutes' : '分',\r\n\t'seconds' : '秒'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.TraditionalChinese\r\n */\r\nexport const aliases = ['zh-tw'];\r\n","/**\r\n * @namespace Languages\r\n */\r\nimport * as Arabic from './ar-ar';\r\nimport * as Catalan from './ca-es';\r\nimport * as Czech from './cs-cz';\r\nimport * as Danish from './da-dk';\r\nimport * as German from './de-de';\r\nimport * as English from './en-us';\r\nimport * as Spanish from './es-es';\r\nimport * as Persian from './fa-ir';\r\nimport * as Finnish from './fi-fi';\r\nimport * as French from './fr-ca';\r\nimport * as Hebrew from './he-il';\r\nimport * as Hungarian from './hu-hu';\r\nimport * as Italian from './it-it';\r\nimport * as Japanese from './ja-jp';\r\nimport * as Korean from './ko-kr';\r\nimport * as Latvian from './lv-lv';\r\nimport * as Dutch from './nl-be';\r\nimport * as Norwegian from './no-nb';\r\nimport * as Polish from './pl-pl';\r\nimport * as Portuguese from './pt-br';\r\nimport * as Romanian from './ro-ro';\r\nimport * as Russian from './ru-ru';\r\nimport * as Slovak from './sk-sk';\r\nimport * as Swedish from './sv-se';\r\nimport * as Thai from './th-th';\r\nimport * as Turkish from './tr-tr';\r\nimport * as Ukrainian from './ua-ua';\r\nimport * as Vietnamese from './vn-vn';\r\nimport * as Chinese from './zh-cn';\r\nimport * as TraditionalChinese from './zh-tw';\r\n\r\nexport {\r\n Arabic,\r\n Catalan,\r\n Czech,\r\n Danish,\r\n German,\r\n English,\r\n Spanish,\r\n Persian,\r\n Finnish,\r\n French,\r\n Hebrew,\r\n Hungarian,\r\n Italian,\r\n Japanese,\r\n Korean,\r\n Latvian,\r\n Dutch,\r\n Norwegian,\r\n Polish,\r\n Portuguese,\r\n Romanian,\r\n Russian,\r\n Slovak,\r\n Swedish,\r\n Thai,\r\n Turkish,\r\n Ukrainian,\r\n Vietnamese,\r\n Chinese,\r\n TraditionalChinese\r\n}\r\n","/**\r\n * @namespace Helpers.Language\r\n */\r\nimport * as LANGUAGES from '../Languages';\r\n\r\n/**\r\n * Return the language associated with the key. Returns `null` if no language is\r\n * found.\r\n * \r\n * @function language\r\n * @param {string} name - The name or id of the language.\r\n * @return {object|null} - The language dictionary, or null if not found.\r\n * @memberof Helpers.Language\r\n */\r\nexport default function language(name) {\r\n return name ? LANGUAGES[name.toLowerCase()] || Object.values(LANGUAGES).find(value => {\r\n return value.aliases.indexOf(name) !== -1;\r\n }) : null;\r\n}\r\n","/**\r\n * @namespace Helpers.Translate\r\n */\r\nimport language from './Language';\r\nimport { isString } from './Functions';\r\n\r\n/**\r\n * Translate an English string into another language.\r\n * \r\n * @function translate\r\n * @param {string} string - The string to translate.\r\n * @param {(string|object)} from - The language used to translate. If a string,\r\n * the language is loaded into an object.\r\n * @return {string} - If no diction key is found, the untranslated string is\r\n * returned.\r\n * @memberof Helpers.Translate\r\n */\r\nexport default function translate(string, from) {\r\n const lang = isString(from) ? language(from) : from;\r\n const dictionary = lang.dictionary || lang;\r\n return dictionary[string] || string;\r\n};\r\n","/**\r\n * A collection of functions to manage DOM nodes and theme templates.\r\n *\r\n * @namespace Helpers.Template\r\n */\r\nimport { noop } from './Functions';\r\nimport { isArray } from './Functions';\r\nimport { isObject } from './Functions';\r\nimport { isString } from './Functions';\r\nimport { deepFlatten } from './Functions';\r\n\r\n/**\r\n * Swap a new DOM node with an existing one.\r\n *\r\n * @function swap\r\n * @param {HTMLElement} subject - The new DOM node.\r\n * @param {HTMLElement} existing - The existing DOM node.\r\n * @return {HTMLElement} - Returns the new element if it was mounted, otherwise\r\n * the existing node is returned.\r\n * @memberof Helpers.Template\r\n */\r\nexport function swap(subject, existing) {\r\n\tif(existing.parentNode) {\r\n\t\texisting.parentNode.replaceChild(subject, existing);\r\n\r\n\t\treturn subject;\r\n\t}\r\n\r\n\treturn existing;\r\n}\r\n\r\n/**\r\n * Set the attribute of an element.\r\n *\r\n * @function setAttributes\r\n * @param {HTMLElement} el - The DOM node that will receive the attributes.\r\n * @param {Object|undefined} [attributes] - The attribute object, or if no object\r\n * is passed, then the action is ignored.\r\n * @return {HTMLElement} el - The DOM node that received the attributes.\r\n * @memberof Helpers.Template\r\n */\r\nexport function setAttributes(el, attributes) {\r\n\tif(isObject(attributes)) {\r\n\t\tfor(const i in attributes) {\r\n\t\t\tel.setAttribute(i, attributes[i]);\r\n\t\t}\r\n\t}\r\n\r\n\treturn el;\r\n}\r\n\r\n/**\r\n * Append an array of DOM nodes to a parent.\r\n *\r\n * @function appendChildren\r\n * @param {HTMLElement} el - The parent DOM node.\r\n * @param {Array|undefined} [children] - The array of children. If no array\r\n * is passed, then the method silently fails to run.\r\n * @return {HTMLElement} el - The DOM node that received the attributes.\r\n * @memberof Helpers.Template\r\n */\r\nexport function appendChildren(el, children) {\r\n\tif(isArray(children)) {\r\n\t\tchildren.filter(noop).forEach(child => {\r\n\t\t\tif(child instanceof HTMLElement) {\r\n\t\t\t\tel.appendChild(child);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\treturn el;\r\n}\r\n\r\n/**\r\n * Create a new HTMLElement instance.\r\n *\r\n * @function createElement\r\n * @param {HTMLElement} el - The parent DOM node.\r\n * @param {Array|undefined} [children] - The array of children. If no array\r\n * is passed, then the method silently fails to run.\r\n * @param {Object|undefined} [attributes] - The attributes object.\r\n * @return {HTMLElement} el - The DOM node that received the attributes.\r\n * @memberof Helpers.Template\r\n */\r\nexport function createElement(el, children, attributes) {\r\n\tif(!(el instanceof HTMLElement)) {\r\n\t\tel = document.createElement(el);\r\n\t}\r\n\r\n\tsetAttributes(el, isObject(children) ? children : attributes);\r\n\r\n\tif(!isObject(children) && !isArray(children)) {\r\n\t\tel.innerHTML = children;\r\n\t}\r\n\telse {\r\n\t\tappendChildren(el, children)\r\n\t}\r\n\r\n\treturn el;\r\n}\r\n","import Component from './Component';\r\nimport language from '../Helpers/Language';\r\nimport validate from '../Helpers/Validate';\r\nimport translate from '../Helpers/Translate';\r\nimport { isString } from '../Helpers/Functions';\r\nimport ConsoleMessages from '../Config/ConsoleMessages';\r\nimport { error, kebabCase } from '../Helpers/Functions';\r\nimport { swap, createElement } from '../Helpers/Template';\r\n\r\nexport default class DomComponent extends Component {\r\n\r\n /**\r\n * An abstract class that all other DOM components can extend.\r\n *\r\n * @class DomComponent\r\n * @extends Component\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n */\r\n constructor(attributes) {\r\n super(Object.assign({\r\n parent: null\r\n }, attributes));\r\n\r\n if(!this.theme) {\r\n error(`${this.name} does not have a theme defined.`);\r\n }\r\n\r\n if(!this.language) {\r\n error(`${this.name} does not have a language defined.`);\r\n }\r\n\r\n\t\tif(!this.theme[this.name]) {\r\n throw new Error(\r\n `${this.name} cannot be rendered because it has no template.`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * The `className` attribute. Used for CSS.\r\n *\r\n * @type {string}\r\n */\r\n get className() {\r\n return kebabCase(this.constructor.defineName());\r\n }\r\n\r\n /**\r\n * The `el` attribute.\r\n *\r\n * @type {HTMLElement}\r\n */\r\n get el() {\r\n return this.$el;\r\n }\r\n\r\n set el(value) {\r\n if(!validate(value, null, HTMLElement)) {\r\n error(ConsoleMessages.element);\r\n }\r\n\r\n this.$el = value;\r\n }\r\n\r\n /**\r\n * The `parent` attribute. Parent is set when `DomComponent` instances are\r\n * mounted.\r\n *\r\n * @type {DomComponent}\r\n */\r\n get parent() {\r\n return this.$parent;\r\n }\r\n\r\n set parent(parent) {\r\n this.$parent = parent;\r\n }\r\n\r\n /**\r\n * The `theme` attribute.\r\n *\r\n * @type {object}\r\n */\r\n get theme() {\r\n return this.$theme;\r\n }\r\n\r\n set theme(value) {\r\n if(!validate(value, 'object')) {\r\n error(ConsoleMessages.value);\r\n }\r\n\r\n this.$theme = value;\r\n }\r\n\r\n /**\r\n * Get the language attribute.\r\n *\r\n * @type {object}\r\n */\r\n get language() {\r\n return this.$language;\r\n }\r\n\r\n set language(value) {\r\n if(isString(value)) {\r\n value = language(value);\r\n }\r\n\r\n if(!validate(value, 'object')) {\r\n error(ConsoleMessages.language);\r\n }\r\n\r\n this.$language = value;\r\n }\r\n\r\n /**\r\n * Translate a string.\r\n *\r\n * @param {string} string - The string to translate.\r\n * @return {string} - The translated string. If no tranlation found, the\r\n * untranslated string is returned.\r\n */\r\n translate(string) {\r\n return translate(string, this.language);\r\n }\r\n\r\n /**\r\n * Alias to translate(string);\r\n *\r\n * @alias DomComponent.translate\r\n */\r\n t(string) {\r\n return this.translate(string);\r\n }\r\n\r\n /**\r\n * Render the DOM component.\r\n *\r\n * @return {HTMLElement} - The `el` attribute.\r\n */\r\n\trender() {\r\n const el = createElement('div', {\r\n class: this.className === 'flip-clock' ? this.className : 'flip-clock-' + this.className\r\n });\r\n\r\n this.theme[this.name](el, this);\r\n\r\n if(!this.el) {\r\n this.el = el;\r\n }\r\n else if(this.el.innerHTML !== el.innerHTML) {\r\n this.el = swap(el, this.el);\r\n }\r\n\r\n return this.el;\r\n\t}\r\n\r\n /**\r\n * Mount a DOM component to a parent node.\r\n *\r\n * @param {HTMLElement} parent - The parent DOM node.\r\n * @param {(false|HTMLElement)} [before=false] - If `false`, element is\r\n * appended to the parent node. If an instance of an `HTMLElement`,\r\n * the component will be inserted before the specified element.\r\n * @return {HTMLElement} - The `el` attribute.\r\n */\r\n mount(parent, before = false) {\r\n this.render();\r\n this.parent = parent;\r\n\r\n if(!before) {\r\n this.parent.appendChild(this.el);\r\n }\r\n else {\r\n this.parent.insertBefore(this.el, before);\r\n }\r\n\r\n return this.el;\r\n }\r\n\r\n}\r\n","import DomComponent from './DomComponent';\r\n\r\n/**\r\n * Create a new `Divider` instance.\r\n *\r\n * The purpose of this class is to return a unique class name so the theme can\r\n * render it appropriately, since each `DomComponent` can receive its own template\r\n * from the theme.\r\n *\r\n * @class Divider\r\n * @extends DomComponent\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n */\r\nexport default class Divider extends DomComponent {\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'Divider';\r\n }\r\n\r\n}\r\n","import DomComponent from './DomComponent';\r\nimport { isObject } from '../Helpers/Functions';\r\n\r\nexport default class ListItem extends DomComponent {\r\n\r\n /**\r\n * This class is used to represent a single digits in a `List`.\r\n *\r\n * @class ListItem\r\n * @extends DomComponent\r\n * @param {(Number|String)} value - The value of the `ListItem`.\r\n * @param {object|undefined} [attributes] - The instance attributes.\r\n */\r\n constructor(value, attributes) {\r\n super(Object.assign({\r\n value: value\r\n }, isObject(value) ? value : null, attributes));\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'ListItem';\r\n }\r\n\r\n}\r\n","import Divider from './Divider';\r\nimport ListItem from './ListItem';\r\nimport DomComponent from './DomComponent';\r\nimport { next, prev, } from '../Helpers/Value';\r\nimport { isObject, } from '../Helpers/Functions';\r\n\r\nexport default class List extends DomComponent {\r\n\r\n /**\r\n * This class is used to add a digit to the clock face. This class is called\r\n * `List` because it contains a list of `ListItem`'s which are used to\r\n * create flip effects. In the context of FlipClock.js a `List` represents\r\n * one single digit.\r\n *\r\n * @class List\r\n * @extends DomComponent\r\n * @param {Number|String|Object} label - The active value. If an object, it\r\n * is assumed that it is the instance attributes.\r\n * @param {object|undefined} [attributes] - The instance attributes.\r\n */\r\n constructor(value, attributes) {\r\n super(Object.assign({\r\n value: value,\r\n items: [],\r\n }, isObject(value) ? value : null, attributes));\r\n }\r\n\r\n /**\r\n * Get the `value` attribute.\r\n *\r\n * @type {(Number|String)}\r\n */\r\n get value() {\r\n return this.$value;\r\n }\r\n set value(value) {\r\n this.$value = value;\r\n }\r\n\r\n /**\r\n * Get the `items` attribute.\r\n *\r\n * @type {(Number|String)}\r\n */\r\n get items() {\r\n return this.$items;\r\n }\r\n\r\n set items(value) {\r\n this.$items = value;\r\n }\r\n\r\n /**\r\n * Helper method to instantiate a new `ListItem`.\r\n *\r\n * @param {(Number|String)} value - The `ListItem` value.\r\n * @param {(Object|undefined)} [attributes] - The instance attributes.\r\n * @return {ListItem} - The instantiated `ListItem`.\r\n */\r\n createListItem(value, attributes) {\r\n const item = new ListItem(value, Object.assign({\r\n theme: this.theme,\r\n language: this.language\r\n }, attributes));\r\n\r\n this.$items.push(item);\r\n\r\n return item;\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'List';\r\n }\r\n\r\n}\r\n","import DomComponent from './DomComponent';\r\nimport { isObject, isArray } from '../Helpers/Functions';\r\n\r\nexport default class Group extends DomComponent {\r\n\r\n /**\r\n * This class is used to group values within a clock face. How the groups\r\n * are displayed is determined by the theme.\r\n *\r\n * @class Group\r\n * @extends DomComponent\r\n * @param {Array|Object} items - An array `List` instances or an object of\r\n * attributes. If not an array, assumed to be the attributes.\r\n * @param {object|undefined} [attributes] - The instance attributes.\r\n */\r\n constructor(items, attributes) {\r\n super(Object.assign({\r\n items: isArray(items) ? items : []\r\n }, (isObject(items) ? items : null), attributes));\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'Group';\r\n }\r\n\r\n}\r\n","import DomComponent from './DomComponent';\r\nimport { isObject } from '../Helpers/Functions';\r\n\r\nexport default class Label extends DomComponent {\r\n\r\n /**\r\n * This class is used to add a label to the clock face.\r\n *\r\n * @class Label\r\n * @extends DomComponent\r\n * @param {Number|String|Object} label - The label attribute. If an object,\r\n * it is assumed that it is the instance attributes.\r\n * @param {object|undefined} [attributes] - The instance attributes.\r\n */\r\n constructor(label, attributes) {\r\n super(Object.assign({\r\n label: label\r\n }, (isObject(label) ? label : null), attributes));\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'Label';\r\n }\r\n\r\n}\r\n","import Component from './Component';\r\nimport { isObject, isNumber, callback } from '../Helpers/Functions';\r\n\r\nexport default class Timer extends Component {\r\n\r\n /**\r\n * Create a new `Timer` instance.\r\n *\r\n * @class Timer\r\n * @extends Component\r\n * @param {(Object|Number)} interval - The interval passed as a `Number`,\r\n * or can set the attribute of the class with an object.\r\n */\r\n constructor(interval) {\r\n super(Object.assign({\r\n count: 0,\r\n handle: null,\r\n started: null,\r\n running: false,\r\n interval: isNumber(interval) ? interval : null,\r\n }, isObject(interval) ? interval : null));\r\n }\r\n\r\n /**\r\n * The `elapsed` attribute.\r\n *\r\n * @type {Number}\r\n */\r\n get elapsed() {\r\n return !this.lastLoop ? 0 : this.lastLoop - (\r\n this.started ? this.started.getTime() : new Date().getTime()\r\n );\r\n }\r\n\r\n /**\r\n * The `isRunning` attribute.\r\n *\r\n * @type {boolean}\r\n */\r\n get isRunning() {\r\n return this.running === true;\r\n }\r\n\r\n /**\r\n * The `isStopped` attribute.\r\n *\r\n * @type {boolean}\r\n */\r\n get isStopped() {\r\n return this.running === false;\r\n }\r\n\r\n /**\r\n * Resets the timer.\r\n *\r\n * @param {(Function|undefined)} fn - The interval callback.\r\n * @return {Timer} - The `Timer` instance.\r\n */\r\n reset(fn) {\r\n this.stop(() => {\r\n this.count = 0;\r\n this.start(() => callback.call(this, fn));\r\n this.emit('reset');\r\n });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Starts the timer.\r\n *\r\n * @param {Function} fn - The interval callback.\r\n * @return {Timer} - The `Timer` instance.\r\n */\r\n start(fn) {\r\n this.started = new Date;\r\n this.lastLoop = Date.now();\r\n this.running = true;\r\n this.emit('start');\r\n\r\n const loop = () => {\r\n if(Date.now() - this.lastLoop >= this.interval) {\r\n callback.call(this, fn);\r\n this.lastLoop = Date.now();\r\n this.emit('interval');\r\n this.count++;\r\n }\r\n\r\n this.handle = window.requestAnimationFrame(loop);\r\n\r\n return this;\r\n };\r\n\r\n return loop();\r\n }\r\n\r\n /**\r\n * Stops the timer.\r\n *\r\n * @param {Function} fn - The stop callback.\r\n * @return {Timer} - The `Timer` instance.\r\n */\r\n stop(fn) {\r\n if(this.isRunning) {\r\n setTimeout(() => {\r\n window.cancelAnimationFrame(this.handle);\r\n\r\n this.running = false;\r\n\r\n callback.call(this, fn);\r\n\r\n this.emit('stop');\r\n });\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'Timer';\r\n }\r\n}\r\n","import Face from '../Components/Face';\r\n\r\n/**\r\n * @classdesc This face is designed to increment and decrement numberic values,\r\n * not `Date` objects.\r\n * @extends Face\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class Counter extends Face {\r\n\r\n increment(instance, value = 1) {\r\n instance.value = this.value.value + value;\r\n }\r\n\r\n decrement(instance, value = 1) {\r\n instance.value = this.value.value - value;\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'Counter';\r\n }\r\n}\r\n","import Face from '../Components/Face';\r\nimport {isNull, isNumber, isUndefined, noop, round} from '../Helpers/Functions';\r\n\r\n/**\r\n * @classdesc This face is meant to display a clock that shows minutes, and\r\n * seconds.\r\n * @extends Face\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class MinuteCounter extends Face {\r\n\r\n defaultDataType() {\r\n return Date;\r\n }\r\n\r\n defaultAttributes() {\r\n return {\r\n showSeconds: true,\r\n showLabels: true\r\n };\r\n }\r\n\r\n shouldStop(instance) {\r\n if(isNull(instance.stopAt) || isUndefined(instance.stopAt)) {\r\n return false;\r\n }\r\n\r\n if(this.stopAt instanceof Date) {\r\n return this.countdown ?\r\n this.stopAt.getTime() >= this.value.value.getTime():\r\n this.stopAt.getTime() <= this.value.value.getTime();\r\n }\r\n else if(isNumber(this.stopAt)) {\r\n const diff = Math.floor((this.value.value.getTime() - this.originalValue.getTime()) / 1000);\r\n\r\n return this.countdown ?\r\n this.stopAt >= diff:\r\n this.stopAt <= diff;\r\n }\r\n\r\n throw new Error(`the stopAt property must be an instance of Date or Number.`);\r\n }\r\n\r\n increment(instance, value = 0) {\r\n instance.value = new Date(this.value.value.getTime() + value + (new Date().getTime() - instance.timer.lastLoop));\r\n }\r\n\r\n decrement(instance, value = 0) {\r\n instance.value = new Date(this.value.value.getTime() - value - (new Date().getTime() - instance.timer.lastLoop));\r\n }\r\n\r\n format(instance, value) {\r\n const started = instance.timer.isRunning ? instance.timer.started : new Date;\r\n\r\n return [\r\n [this.getMinutes(value, started)],\r\n this.showSeconds ? [this.getSeconds(value, started)] : null\r\n ].filter(noop);\r\n }\r\n\r\n getMinutes(a, b) {\r\n return round(this.getTotalSeconds(a, b) / 60);\r\n }\r\n\r\n getSeconds(a, b) {\r\n const totalSeconds = this.getTotalSeconds(a, b);\r\n\r\n return Math.abs(Math.ceil(totalSeconds === 60 ? 0 : totalSeconds % 60));\r\n }\r\n\r\n getTotalSeconds(a, b) {\r\n return a.getTime() === b.getTime() ? 0 : Math.round((a.getTime() - b.getTime()) / 1000);\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'MinuteCounter';\r\n }\r\n}\r\n","import MinuteCounter from './MinuteCounter';\r\n\r\n/**\r\n * @classdesc This face is meant to display a clock that shows\r\n * hours, minutes, and seconds.\r\n * @extends Face\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class HourCounter extends MinuteCounter {\r\n\r\n format(instance, value) {\r\n const now = !instance.timer.started ? new Date : instance.timer.started;\r\n const originalValue = value || instance.originalValue;\r\n const a = !this.countdown ? now : originalValue;\r\n const b = !this.countdown ? originalValue : now;\r\n\r\n const data = [\r\n [this.getHours(a, b)],\r\n [this.getMinutes(a, b)]\r\n ];\r\n\r\n if(this.showSeconds) {\r\n data.push([this.getSeconds(a, b)]);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n getMinutes(a, b) {\r\n return Math.abs(super.getMinutes(a, b) % 60);\r\n }\r\n\r\n getHours(a, b) {\r\n return Math.floor(this.getTotalSeconds(a, b) / 60 / 60);\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'HourCounter';\r\n }\r\n}\r\n","import HourCounter from './HourCounter';\r\n\r\n/**\r\n * @classdesc This face is meant to display a clock that shows days, hours,\r\n * minutes, and seconds.\r\n * @extends HourCounter\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class DayCounter extends HourCounter {\r\n\r\n format(instance, value) {\r\n const now = !instance.started ? new Date : value;\r\n const originalValue = value || instance.originalValue;\r\n const a = !this.countdown ? now : originalValue;\r\n const b = !this.countdown ? originalValue : now;\r\n\r\n const data = [\r\n [this.getDays(a, b)],\r\n [this.getHours(a, b)],\r\n [this.getMinutes(a, b)]\r\n ];\r\n\r\n if(this.showSeconds) {\r\n data.push([this.getSeconds(a, b)]);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n getDays(a, b) {\r\n return Math.floor(this.getTotalSeconds(a, b) / 60 / 60 / 24);\r\n }\r\n\r\n getHours(a, b) {\r\n return Math.abs(super.getHours(a, b) % 24);\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'DayCounter';\r\n }\r\n}\r\n","import Face from '../Components/Face';\r\nimport { callback } from '../Helpers/Functions';\r\n\r\n/**\r\n * @classdesc This face shows the current time in twenty-four hour format.\r\n * @extends Face\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class TwentyFourHourClock extends Face {\r\n\r\n defaultDataType() {\r\n return Date;\r\n }\r\n\r\n defaultValue() {\r\n return new Date;\r\n }\r\n\r\n defaultAttributes() {\r\n return {\r\n showSeconds: true,\r\n showLabels: false\r\n };\r\n }\r\n\r\n format(instance, value) {\r\n if(!value) {\r\n value = new Date;\r\n }\r\n\r\n const groups = [\r\n [value.getHours()],\r\n [value.getMinutes()]\r\n ];\r\n\r\n if(this.showSeconds) {\r\n groups.push([value.getSeconds()]);\r\n }\r\n\r\n return groups;\r\n }\r\n\r\n increment(instance, offset = 0) {\r\n instance.value = new Date(this.value.value.getTime() + offset + (new Date().getTime() - instance.timer.lastLoop));\r\n }\r\n\r\n decrement(instance, offset = 0) {\r\n instance.value = new Date(this.value.value.getTime() - offset - (new Date().getTime() - instance.timer.lastLoop));\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'TwentyFourHourClock';\r\n }\r\n}\r\n","import TwentyFourHourClock from './TwentyFourHourClock';\r\n\r\n/**\r\n * @classdesc This face shows the current time in twelve hour format, with AM\r\n * and PM.\r\n * @extends Face\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class TwelveHourClock extends TwentyFourHourClock {\r\n\r\n defaultAttributes() {\r\n return {\r\n showLabels: false,\r\n showSeconds: true,\r\n showMeridium: true\r\n };\r\n }\r\n\r\n format(instance, value) {\r\n if(!value) {\r\n value = new Date;\r\n }\r\n\r\n const hours = value.getHours();\r\n\t\tconst groups = [\r\n\t\t\thours > 12 ? hours - 12 : (hours === 0 ? 12 : hours),\r\n\t\t\tvalue.getMinutes()\r\n\t\t];\r\n\r\n this.meridium = hours > 12 ? 'pm' : 'am';\r\n\r\n\t\tif(this.showSeconds) {\r\n\t\t\tgroups.push(value.getSeconds());\r\n\t\t}\r\n\r\n\t\treturn groups;\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'TwelveHourClock';\r\n }\r\n}\r\n","import DayCounter from './DayCounter';\r\n\r\n/**\r\n * @classdesc This face is meant to display a clock that shows weeks, days,\r\n * hours, minutes, and seconds.\r\n * @extends Face\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class WeekCounter extends DayCounter {\r\n\r\n format(instance, value) {\r\n const now = !instance.timer.started ? new Date : value;\r\n const originalValue = value || instance.originalValue;\r\n const a = !this.countdown ? now : originalValue;\r\n const b = !this.countdown ? originalValue : now;\r\n\r\n const data = [\r\n [this.getWeeks(a, b)],\r\n [this.getDays(a, b)],\r\n [this.getHours(a, b)],\r\n [this.getMinutes(a, b)]\r\n ];\r\n\r\n if(this.showSeconds) {\r\n data.push([this.getSeconds(a, b)]);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n getWeeks(a, b) {\r\n return Math.floor(this.getTotalSeconds(a, b) / 60 / 60 / 24 / 7);\r\n }\r\n\r\n getDays(a, b) {\r\n return Math.abs(super.getDays(a, b) % 7);\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'WeekCounter';\r\n }\r\n}\r\n","import WeekCounter from './WeekCounter';\r\n\r\n/**\r\n * @classdesc This face is meant to display a clock that shows years, weeks,\r\n * days, hours, minutes, and seconds.\r\n * @extends Face\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class YearCounter extends WeekCounter {\r\n\r\n format(instance, value) {\r\n const now = !instance.timer.started ? new Date : value;\r\n const originalValue = value || instance.originalValue;\r\n const a = !this.countdown ? now : originalValue;\r\n const b = !this.countdown ? originalValue : now;\r\n\r\n const data = [\r\n [this.getYears(a, b)],\r\n [this.getWeeks(a, b)],\r\n [this.getDays(a, b)],\r\n [this.getHours(a, b)],\r\n [this.getMinutes(a, b)]\r\n ];\r\n\r\n if(this.showSeconds) {\r\n data.push([this.getSeconds(a, b)]);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n getYears(a, b) {\r\n return Math.floor(Math.max(0, this.getTotalSeconds(a, b) / 60 / 60 / 24 / 7 / 52));\r\n }\r\n\r\n getWeeks(a, b) {\r\n return Math.abs(super.getWeeks(a, b) % 52);\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'YearCounter';\r\n }\r\n}\r\n","/**\r\n * Faces are classes that hook into the core of Flipclock to provide unique\r\n * functionality. The core doesn't do a lot, except facilitate the interaction\r\n * between all the components. The Face is what makes the clock \"tick\".\r\n *\r\n * @namespace Faces\r\n */\r\n\r\nimport Counter from './Counter';\r\nimport DayCounter from './DayCounter';\r\nimport HourCounter from './HourCounter';\r\nimport MinuteCounter from './MinuteCounter';\r\nimport TwelveHourClock from './TwelveHourClock';\r\nimport TwentyFourHourClock from './TwentyFourHourClock';\r\nimport WeekCounter from './WeekCounter';\r\nimport YearCounter from './YearCounter';\r\n\r\nexport {\r\n Counter,\r\n DayCounter,\r\n MinuteCounter,\r\n HourCounter,\r\n TwelveHourClock,\r\n TwentyFourHourClock,\r\n WeekCounter,\r\n YearCounter\r\n};\r\n","import { appendChildren, createElement } from '../../Helpers/Template';\r\n\r\nexport default function(el, instance) {\r\n appendChildren(el, [\r\n createElement('div', {class: 'flip-clock-dot top'}),\r\n createElement('div', {class: 'flip-clock-dot bottom'})\r\n ]);\r\n}\r\n","import { next } from '../../Helpers/Value';\r\nimport { appendChildren } from '../../Helpers/Template';\r\n\r\nfunction child(el, index) {\r\n return el ? (el.childNodes ? el.childNodes[index] : el[index]) : null;\r\n}\r\n\r\nfunction char(el) {\r\n return el ? el.querySelector('.flip-clock-list-item:first-child .top').innerHTML : null;\r\n}\r\n\r\nexport default function(el, instance) {\r\n const parts = instance.value.digits.map((group, x) => {\r\n const groupEl = child(instance.el ? instance.el.querySelectorAll('.flip-clock-group') : null, x);\r\n\r\n const lists = group.map((value, y) => {\r\n const listEl = child(groupEl ? groupEl.querySelectorAll('.flip-clock-list') : null, y);\r\n const listValue = char(listEl);\r\n\r\n return instance.createList(value, {\r\n domValue: listValue,\r\n countdown: instance.countdown,\r\n animationRate: instance.face.animationRate || instance.face.delay\r\n });\r\n });\r\n\r\n return instance.createGroup(lists);\r\n });\r\n\r\n const nodes = parts.map(group => {\r\n return group.render();\r\n });\r\n\r\n appendChildren(el, nodes);\r\n}\r\n","import { createElement, appendChildren } from '../../Helpers/Template';\r\n\r\nexport default function(el, instance) {\r\n const items = instance.items.map(item => {\r\n return item.render();\r\n });\r\n\r\n appendChildren(el, items);\r\n}\r\n","import { createElement } from '../../Helpers/Template';\r\n\r\nexport default function(el, instance) {\r\n el.innerHTML = instance.t(instance.label);\r\n}\r\n","import { next, prev } from '../../Helpers/Value';\r\nimport ListItem from '../../Components/ListItem';\r\nimport { createElement, appendChildren } from '../../Helpers/Template';\r\n\r\nexport default function(el, instance) {\r\n const beforeValue = instance.domValue || (\r\n !instance.countdown ? prev(instance.value) : next(instance.value)\r\n );\r\n\r\n if( instance.domValue && instance.domValue !== instance.value) {\r\n el.classList.add('flip');\r\n }\r\n\r\n el.style.animationDelay = `${instance.animationRate / 2}ms`;\r\n el.style.animationDuration = `${instance.animationRate / 2}ms`;\r\n\r\n instance.items = [\r\n instance.createListItem(instance.value, {\r\n active: true\r\n }),\r\n instance.createListItem(beforeValue, {\r\n active: false\r\n })\r\n ];\r\n\r\n appendChildren(el, instance.items.map(item => item.render()));\r\n}\r\n","import { createElement, appendChildren } from '../../Helpers/Template';\r\n\r\nexport default function(el, instance) {\r\n const className = instance.active === true ? 'active' : (\r\n instance.active === false ? 'before' : null\r\n );\r\n\r\n el.classList.add(className);\r\n\r\n appendChildren(el, [\r\n createElement('div', [\r\n createElement('div', instance.value, {class: 'top'}),\r\n createElement('div', instance.value, {class: 'bottom'})\r\n ], {class: 'flip-clock-list-item-inner'})\r\n ]);\r\n}\r\n","export default function(el, instance) {\r\n instance.createDivider().mount(el, el.childNodes[1]);\r\n instance.createDivider().mount(el, el.childNodes[3]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createDivider().mount(el, el.childNodes[5]);\r\n }\r\n\r\n if(instance.face.showLabels) {\r\n instance.createLabel('days').mount(el.childNodes[0]);\r\n instance.createLabel('hours').mount(el.childNodes[2]);\r\n instance.createLabel('minutes').mount(el.childNodes[4]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createLabel('seconds').mount(el.childNodes[6]);\r\n }\r\n }\r\n}\r\n","export default function(el, instance) {\r\n instance.createDivider().mount(el, el.childNodes[1]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createDivider().mount(el, el.childNodes[3]);\r\n }\r\n \r\n if(instance.face.showLabels) {\r\n instance.createLabel('hours').mount(el.childNodes[0]);\r\n instance.createLabel('minutes').mount(el.childNodes[2]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createLabel('seconds').mount(el.childNodes[4]);\r\n }\r\n }\r\n}\r\n","export default function(el, instance) {\r\n if(instance.face.showSeconds) {\r\n instance.createDivider().mount(el, el.childNodes[1]);\r\n }\r\n\r\n if(instance.face.showLabels) {\r\n instance.createLabel('minutes').mount(el.childNodes[0]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createLabel('seconds').mount(el.childNodes[2]);\r\n }\r\n }\r\n}\r\n","export default function(el, instance) {\r\n instance.createDivider().mount(el, el.childNodes[1]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createDivider().mount(el, el.childNodes[3]);\r\n }\r\n \r\n if(instance.face.showLabels) {\r\n instance.createLabel('hours').mount(el.childNodes[0]);\r\n instance.createLabel('minutes').mount(el.childNodes[2]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createLabel('seconds').mount(el.childNodes[4]);\r\n }\r\n }\r\n\r\n}\r\n","import TwentyFourHourClock from './TwentyFourHourClock';\r\n\r\nexport default function(el, instance) {\r\n TwentyFourHourClock(el, instance);\r\n\r\n if(instance.face.showMeridium && instance.face.meridium) {\r\n const label = instance.createLabel(instance.face.meridium);\r\n const parent = el.childNodes[el.childNodes.length - 1];\r\n\r\n label.mount(parent).classList.add('flip-clock-meridium');\r\n }\r\n}\r\n","export default function(el, instance) {\r\n instance.createDivider().mount(el, el.childNodes[1]);\r\n instance.createDivider().mount(el, el.childNodes[3]);\r\n instance.createDivider().mount(el, el.childNodes[5]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createDivider().mount(el, el.childNodes[7]);\r\n }\r\n\r\n if(instance.face.showLabels) {\r\n instance.createLabel('weeks').mount(el.childNodes[0]);\r\n instance.createLabel('days').mount(el.childNodes[2]);\r\n instance.createLabel('hours').mount(el.childNodes[4]);\r\n instance.createLabel('minutes').mount(el.childNodes[6]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createLabel('seconds').mount(el.childNodes[8]);\r\n }\r\n }\r\n}\r\n","export default function(el, instance) {\r\n instance.createDivider().mount(el, el.childNodes[1]);\r\n instance.createDivider().mount(el, el.childNodes[3]);\r\n instance.createDivider().mount(el, el.childNodes[5]);\r\n instance.createDivider().mount(el, el.childNodes[7]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createDivider().mount(el, el.childNodes[9]);\r\n }\r\n\r\n if(instance.face.showLabels) {\r\n instance.createLabel('years').mount(el.childNodes[0]);\r\n instance.createLabel('weeks').mount(el.childNodes[2]);\r\n instance.createLabel('days').mount(el.childNodes[4]);\r\n instance.createLabel('hours').mount(el.childNodes[6]);\r\n instance.createLabel('minutes').mount(el.childNodes[8]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createLabel('seconds').mount(el.childNodes[10]);\r\n }\r\n }\r\n}\r\n","import Divider from './Divider';\r\nimport FlipClock from './FlipClock';\r\nimport Group from './Group';\r\nimport Label from './Label';\r\nimport List from './List';\r\nimport ListItem from './ListItem';\r\nimport * as faces from './Faces';\r\n\r\nexport default {\r\n Divider,\r\n FlipClock,\r\n Group,\r\n Label,\r\n List,\r\n ListItem,\r\n faces\r\n};\r\n","import { Counter } from '../Faces';\r\nimport { Original } from '../Themes';\r\nimport { English } from '../Languages';\r\n\r\n/**\r\n * @alias DefaultValues\r\n * @type {object}\r\n * @memberof module:Config/DefaultValues\r\n */\r\nexport default {\r\n face: Counter,\r\n theme: Original,\r\n language: English\r\n};\r\n","import Face from './Face';\r\nimport List from './List';\r\nimport Group from './Group';\r\nimport Label from './Label';\r\nimport Timer from './Timer';\r\nimport Divider from './Divider';\r\nimport * as Faces from '../Faces';\r\nimport FaceValue from './FaceValue';\r\nimport DomComponent from './DomComponent';\r\nimport validate from '../Helpers/Validate';\r\nimport DefaultValues from '../Config/DefaultValues';\r\nimport ConsoleMessages from '../Config/ConsoleMessages';\r\nimport { flatten, isNull, isString, isObject, isUndefined, isFunction, error } from '../Helpers/Functions';\r\n\r\nexport default class FlipClock extends DomComponent {\r\n \r\n /**\r\n * Create a new `FlipClock` instance.\r\n *\r\n * @class FlipClock\r\n * @extends DomComponent\r\n * @param {HTMLElement} el - The HTML element used to bind clock DOM node.\r\n * @param {*} value - The value that is passed to the clock face.\r\n * @param {object|undefined} attributes - {@link FlipClock.Options} passed an object with key/value.\r\n */\r\n \r\n /**\r\n * @namespace FlipClock.Options\r\n * @classdesc An object of key/value pairs that will be used to set the attributes.\r\n * \r\n * ##### Example:\r\n * \r\n * {\r\n * face: 'DayCounter',\r\n * language: 'es',\r\n * timer: Timer.make(500)\r\n * }\r\n * \r\n * @property {string|Face} [face={@link Faces.DayCounter}] - The clock's {@link Face} instance.\r\n * @property {number} [interval=1000] - The clock's interval rate (in milliseconds).\r\n * @property {object} [theme={@link Themes.Original}] - The clock's theme.\r\n * @property {string|object} [language={@link Languages.English}] - The clock's language.\r\n * @property {Timer} [timer={@link Timer}] - The clock's timer.\r\n */\r\n \r\n constructor(el, value, attributes) {\r\n if(!validate(el, HTMLElement)) {\r\n error(ConsoleMessages.element);\r\n }\r\n\r\n if(isObject(value) && !attributes) {\r\n attributes = value;\r\n value = undefined;\r\n }\r\n\r\n const face = attributes.face || DefaultValues.face;\r\n\r\n delete attributes.face;\r\n\r\n super(Object.assign({\r\n originalValue: value,\r\n theme: DefaultValues.theme,\r\n language: DefaultValues.language,\r\n timer: Timer.make(attributes.interval || 1000),\r\n }, attributes));\r\n\r\n if(!this.face) {\r\n this.face = face;\r\n }\r\n\r\n this.mount(el);\r\n }\r\n\r\n /**\r\n * The clock `Face`.\r\n *\r\n * @type {Face}\r\n */\r\n get face() {\r\n return this.$face;\r\n }\r\n\r\n set face(value) {\r\n if(!validate(value, [Face, 'string', 'function'])) {\r\n error(ConsoleMessages.face);\r\n }\r\n\r\n this.$face = (Faces[value] || value).make(Object.assign(this.getPublicAttributes(), {\r\n originalValue: this.face ? this.face.originalValue : undefined\r\n }));\r\n\r\n this.$face.initialized(this);\r\n\r\n if(this.value) {\r\n this.$face.value = this.face.createFaceValue(this, this.value.value);\r\n }\r\n else if(!this.value) {\r\n this.value = this.originalValue;\r\n }\r\n\r\n this.el && this.render();\r\n }\r\n\r\n /**\r\n * The `stopAt` attribute.\r\n *\r\n * @type {*}\r\n */\r\n get stopAt() {\r\n return isFunction(this.$stopAt) ? this.$stopAt(this) : this.$stopAt;\r\n }\r\n\r\n set stopAt(value) {\r\n this.$stopAt = value;\r\n }\r\n\r\n /**\r\n * The `timer` instance.\r\n *\r\n * @type {Timer}\r\n */\r\n get timer() {\r\n return this.$timer;\r\n }\r\n\r\n set timer(timer) {\r\n if(!validate(timer, Timer)) {\r\n error(ConsoleMessages.timer);\r\n }\r\n\r\n this.$timer = timer;\r\n }\r\n\r\n /**\r\n * Helper method to The clock's `FaceValue` instance.\r\n *\r\n * @type {FaceValue|null}\r\n */\r\n get value() {\r\n return this.face ? this.face.value : null;\r\n }\r\n\r\n set value(value) {\r\n if(!this.face) {\r\n throw new Error('A face must be set before setting a value.');\r\n }\r\n\r\n if(value instanceof FaceValue) {\r\n this.face.value = value;\r\n }\r\n else if(this.value) {\r\n this.face.value = this.face.value.clone(value);\r\n }\r\n else {\r\n this.face.value = this.face.createFaceValue(this, value);\r\n }\r\n\r\n this.el && this.render();\r\n }\r\n\r\n /**\r\n * The `originalValue` attribute.\r\n *\r\n * @type {*}\r\n */\r\n get originalValue() {\r\n if(isFunction(this.$originalValue) && !this.$originalValue.name) {\r\n return this.$originalValue();\r\n }\r\n\r\n if(!isUndefined(this.$originalValue) && !isNull(this.$originalValue)) {\r\n return this.$originalValue;\r\n }\r\n\r\n return this.face ? this.face.defaultValue() : undefined;\r\n }\r\n\r\n set originalValue(value) {\r\n this.$originalValue = value;\r\n }\r\n\r\n /**\r\n * Mount the clock to the parent DOM element.\r\n *\r\n * @param {HTMLElement} el - The parent `HTMLElement`.\r\n * @return {FlipClock} - The `FlipClock` instance.\r\n */\r\n mount(el) {\r\n super.mount(el);\r\n\r\n this.face.mounted(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Render the clock's DOM nodes.\r\n *\r\n * @return {HTMLElement} - The parent `HTMLElement`.\r\n */\r\n render() {\r\n // Call the parent render function\r\n super.render();\r\n\r\n // Check to see if the face has a render function defined in the theme.\r\n // This allows a face to completely re-render or add to the theme.\r\n // This allows face specific interfaces for a theme.\r\n if(this.theme.faces[this.face.name]) {\r\n this.theme.faces[this.face.name](this.el, this);\r\n }\r\n\r\n // Pass the clock instance to the rendered() function on the face.\r\n // This allows global modifications to the rendered templates not\r\n // theme specific.\r\n this.face.rendered(this);\r\n\r\n // Return the rendered `HTMLElement`.\r\n return this.el;\r\n }\r\n\r\n /**\r\n * Start the clock.\r\n *\r\n * @param {Function} fn - The interval callback.\r\n * @return {FlipClock} - The `FlipClock` instance.\r\n */\r\n start(fn) {\r\n if(!this.timer.started) {\r\n this.value = this.originalValue;\r\n }\r\n\r\n isUndefined(this.face.stopAt) && (this.face.stopAt = this.stopAt);\r\n isUndefined(this.face.originalValue) && (this.face.originalValue = this.originalValue);\r\n\r\n this.timer.start(() => {\r\n this.face.interval(this, fn);\r\n });\r\n\r\n this.face.started(this);\r\n\r\n return this.emit('start');\r\n }\r\n\r\n /**\r\n * Stop the clock.\r\n *\r\n * @param {Function} fn - The stop callback.\r\n * @return {FlipClock} - The `FlipClock` instance.\r\n */\r\n stop(fn) {\r\n this.timer.stop(fn);\r\n this.face.stopped(this);\r\n\r\n return this.emit('stop');\r\n }\r\n\r\n /**\r\n * Reset the clock to the original value.\r\n *\r\n * @param {Function} fn - The interval callback.\r\n * @return {FlipClock} - The `FlipClock` instance.\r\n */\r\n reset(fn) {\r\n this.value = this.originalValue;\r\n this.timer.reset(() => this.interval(this, fn));\r\n this.face.reset(this);\r\n\r\n return this.emit('reset');\r\n }\r\n\r\n /**\r\n * Helper method to increment the clock's value.\r\n *\r\n * @param {*|undefined} value - Increment the clock by the specified value.\r\n * If no value is passed, then the default increment is determined by\r\n * the Face, which is usually `1`.\r\n * @return {FlipClock} - The `FlipClock` instance.\r\n */\r\n increment(value) {\r\n this.face.increment(this, value);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Helper method to decrement the clock's value.\r\n *\r\n * @param {*|undefined} value - Decrement the clock by the specified value.\r\n * If no value is passed, then the default decrement is determined by\r\n * the `Face`, which is usually `1`.\r\n * @return {FlipClock} - The `FlipClock` instance.\r\n */\r\n decrement(value) {\r\n this.face.decrement(this, value);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Helper method to instantiate a new `Divider`.\r\n *\r\n * @param {object|undefined} [attributes] - The attributes passed to the\r\n * `Divider` instance.\r\n * @return {Divider} - The instantiated Divider.\r\n */\r\n createDivider(attributes) {\r\n return Divider.make(Object.assign({\r\n theme: this.theme,\r\n language: this.language\r\n }, attributes));\r\n }\r\n\r\n /**\r\n * Helper method to instantiate a new `List`.\r\n *\r\n * @param {*} value - The `List` value.\r\n * @param {object|undefined} [attributes] - The attributes passed to the\r\n * `List` instance.\r\n * @return {List} - The instantiated `List`.\r\n */\r\n createList(value, attributes) {\r\n return List.make(value, Object.assign({\r\n theme: this.theme,\r\n language: this.language\r\n }, attributes));\r\n }\r\n\r\n /**\r\n * Helper method to instantiate a new `Label`.\r\n *\r\n * @param {*} value - The `Label` value.\r\n * @param {object|undefined} [attributes] - The attributes passed to the\r\n * `Label` instance.\r\n * @return {Label} - The instantiated `Label`.\r\n */\r\n createLabel(value, attributes) {\r\n return Label.make(value, Object.assign({\r\n theme: this.theme,\r\n language: this.language\r\n }, attributes));\r\n }\r\n\r\n /**\r\n * Helper method to instantiate a new `Group`.\r\n *\r\n * @param {array} items - An array of `List` items to group.\r\n * @param {Group|undefined} [attributes] - The attributes passed to the\r\n * `Group` instance.\r\n * @return {Group} - The instantiated `Group`.\r\n */\r\n createGroup(items, attributes) {\r\n return Group.make(items, Object.assign({\r\n theme: this.theme,\r\n language: this.language\r\n }, attributes));\r\n }\r\n\r\n /**\r\n * The `defaults` attribute.\r\n *\r\n * @type {object}\r\n */\r\n static get defaults() {\r\n return DefaultValues;\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'FlipClock';\r\n }\r\n\r\n /**\r\n * Helper method to set the default `Face` value.\r\n *\r\n * @param {Face} value - The default `Face` class.This should be a\r\n * constructor.\r\n * @return {void}\r\n */\r\n static setDefaultFace(value) {\r\n if(!validate(value, Face)) {\r\n error(ConsoleMessages.face);\r\n }\r\n\r\n DefaultValues.face = value;\r\n }\r\n\r\n /**\r\n * Helper method to set the default theme.\r\n *\r\n * @param {object} value - The default theme.\r\n * @return {void}\r\n */\r\n static setDefaultTheme(value) {\r\n if(!validate(value, 'object')) {\r\n error(ConsoleMessages.theme);\r\n }\r\n\r\n DefaultValues.theme = value;\r\n }\r\n\r\n /**\r\n * Helper method to set the default language.\r\n *\r\n * @param {object} value - The default language.\r\n * @return {void}\r\n */\r\n static setDefaultLanguage(value) {\r\n if(!validate(value, 'object')) {\r\n error(ConsoleMessages.language);\r\n }\r\n\r\n DefaultValues.language = value;\r\n }\r\n\r\n}\r\n"],"names":["error","string","Error","callback","fn","isFunction","args","call","round","value","isNegativeZero","isNegative","Math","ceil","floor","toString","noop","isUndefined","isNull","chain","before","after","concatMap","x","map","reduce","y","concat","flatten","deepFlatten","Array","isArray","length","Infinity","isConstructor","Function","name","isString","isObject","type","isNumber","isNaN","kebabCase","replace","toLowerCase","Component","attributes","setAttribute","Object","assign","events","key","forEach","event","apply","push","filter","off","on","hasOwnProperty","getOwnPropertyNames","getAttribute","keys","getAttributes","match","obj","setAttributes","values","i","constructor","defineName","$events","digitize","options","minimumDigits","prependLeadingZero","prepend","number","shouldPrependZero","split","digits","arr","min","unshift","RANGES","max","format","parseFloat","findRange","char","code","charCodeAt","stringFromCharCodeBy","String","fromCharCode","next","converted","range","join","prev","FaceValue","getPublicAttributes","$digits","$value","validate","success","arg","className","items","theme","language","date","face","element","faceValue","timer","Face","undefined","autoStart","countdown","animationRate","defaultAttributes","defaultValue","instance","decrement","increment","shouldStop","stop","emit","stopAt","amount","isStopped","window","requestAnimationFrame","start","make","defaultDataType","createFaceValue","$stopAt","$originalValue","dictionary","aliases","LANGUAGES","find","indexOf","translate","from","lang","swap","subject","existing","parentNode","replaceChild","el","appendChildren","children","child","HTMLElement","appendChild","createElement","document","innerHTML","DomComponent","parent","render","insertBefore","$el","ConsoleMessages","$parent","$theme","$language","Divider","ListItem","List","item","$items","Group","Label","label","Timer","interval","count","handle","started","running","Date","lastLoop","now","loop","isRunning","setTimeout","cancelAnimationFrame","getTime","Counter","MinuteCounter","showSeconds","showLabels","diff","originalValue","getMinutes","getSeconds","a","b","getTotalSeconds","totalSeconds","abs","HourCounter","data","getHours","DayCounter","getDays","TwentyFourHourClock","groups","offset","TwelveHourClock","showMeridium","hours","meridium","WeekCounter","getWeeks","YearCounter","getYears","index","childNodes","querySelector","parts","group","groupEl","querySelectorAll","lists","listEl","listValue","createList","domValue","delay","createGroup","nodes","t","beforeValue","classList","add","style","animationDelay","animationDuration","createListItem","active","createDivider","mount","createLabel","FlipClock","faces","Original","English","DefaultValues","mounted","rendered","stopped","reset","$face","Faces","initialized","$timer","clone"],"mappings":"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"} \ No newline at end of file diff --git a/dist/flipclock.min.js b/dist/flipclock.min.js index ff8eb9c6..de314c56 100644 --- a/dist/flipclock.min.js +++ b/dist/flipclock.min.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.FlipClock=t()}(this,function(){"use strict";function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var n=0;n1?t-1:0),i=1;i=i)return t[n]}return null}function stringFromCharCodeBy(e,t){return String.fromCharCode(t(findRange(e),e.charCodeAt(0)))}function next(e){return format(e.toString().split("").map(function(e){return stringFromCharCodeBy(e,function(e,t){return!e||te.min?t-1:e.max})}).join(""),_typeof(e))}function validate(e){for(var t=!1,n=arguments.length,i=new Array(n>1?n-1:0),r=1;r1?n-1:0),r=1;r1&&void 0!==arguments[1]&&arguments[1];return this.render(),this.parent=e,t?this.parent.insertBefore(this.el,t):this.parent.appendChild(this.el),this.el}},{key:"className",get:function get(){return kebabCase(this.constructor.defineName())}},{key:"el",get:function get(){return this.$el},set:function set(e){validate(e,null,HTMLElement)||error(i.element),this.$el=e}},{key:"parent",get:function get(){return this.$parent},set:function set(e){this.$parent=e}},{key:"theme",get:function get(){return this.$theme},set:function set(e){validate(e,"object")||error(i.value),this.$theme=e}},{key:"language",get:function get(){return this.$language},set:function set(e){isString(e)&&(e=language(e)),validate(e,"object")||error(i.language),this.$language=e}}]),DomComponent}(e),Ie=function(e){function Divider(){return _classCallCheck(this,Divider),_possibleConstructorReturn(this,_getPrototypeOf(Divider).apply(this,arguments))}return _inherits(Divider,e),_createClass(Divider,null,[{key:"defineName",value:function defineName(){return"Divider"}}]),Divider}(We),Ye=function(e){function ListItem(e,t){return _classCallCheck(this,ListItem),_possibleConstructorReturn(this,_getPrototypeOf(ListItem).call(this,Object.assign({value:e},isObject(e)?e:null,t)))}return _inherits(ListItem,e),_createClass(ListItem,null,[{key:"defineName",value:function defineName(){return"ListItem"}}]),ListItem}(We),xe=function(e){function List(e,t){return _classCallCheck(this,List),_possibleConstructorReturn(this,_getPrototypeOf(List).call(this,Object.assign({value:e,items:[]},isObject(e)?e:null,t)))}return _inherits(List,e),_createClass(List,[{key:"createListItem",value:function createListItem(e,t){var n=new Ye(e,Object.assign({theme:this.theme,language:this.language},t));return this.$items.push(n),n}},{key:"value",get:function get(){return this.$value},set:function set(e){this.$value=e}},{key:"items",get:function get(){return this.$items},set:function set(e){this.$items=e}}],[{key:"defineName",value:function defineName(){return"List"}}]),List}(We),Ue=function(e){function Group(e,t){return _classCallCheck(this,Group),_possibleConstructorReturn(this,_getPrototypeOf(Group).call(this,Object.assign({items:isArray(e)?e:[]},isObject(e)?e:null,t)))}return _inherits(Group,e),_createClass(Group,null,[{key:"defineName",value:function defineName(){return"Group"}}]),Group}(We),Ze=function(e){function Label(e,t){return _classCallCheck(this,Label),_possibleConstructorReturn(this,_getPrototypeOf(Label).call(this,Object.assign({label:e},isObject(e)?e:null,t)))}return _inherits(Label,e),_createClass(Label,null,[{key:"defineName",value:function defineName(){return"Label"}}]),Label}(We),Be=function(e){function Timer(e){return _classCallCheck(this,Timer),_possibleConstructorReturn(this,_getPrototypeOf(Timer).call(this,Object.assign({count:0,handle:null,started:null,running:!1,interval:isNumber(e)?e:null},isObject(e)?e:null)))}return _inherits(Timer,e),_createClass(Timer,[{key:"reset",value:function reset(e){var t=this;return this.stop(function(){t.count=0,t.start(function(){return callback.call(t,e)}),t.emit("reset")}),this}},{key:"start",value:function start(e){var t=this;this.started=new Date,this.lastLoop=Date.now(),this.running=!0,this.emit("start");return function loop(){return Date.now()-t.lastLoop>=t.interval&&(callback.call(t,e),t.lastLoop=Date.now(),t.emit("interval"),t.count++),t.handle=window.requestAnimationFrame(loop),t}()}},{key:"stop",value:function stop(e){var t=this;return this.isRunning&&setTimeout(function(){window.cancelAnimationFrame(t.handle),t.running=!1,callback.call(t,e),t.emit("stop")}),this}},{key:"elapsed",get:function get(){return this.lastLoop?this.lastLoop-(this.started?this.started.getTime():(new Date).getTime()):0}},{key:"isRunning",get:function get(){return!0===this.running}},{key:"isStopped",get:function get(){return!1===this.running}}],[{key:"defineName",value:function defineName(){return"Timer"}}]),Timer}(e),qe=function(e){function Counter(){return _classCallCheck(this,Counter),_possibleConstructorReturn(this,_getPrototypeOf(Counter).apply(this,arguments))}return _inherits(Counter,e),_createClass(Counter,[{key:"increment",value:function increment(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;e.value=this.value.value+t}},{key:"decrement",value:function decrement(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;e.value=this.value.value-t}}],[{key:"defineName",value:function defineName(){return"Counter"}}]),Counter}(r),Je=function(e){function MinuteCounter(){return _classCallCheck(this,MinuteCounter),_possibleConstructorReturn(this,_getPrototypeOf(MinuteCounter).apply(this,arguments))}return _inherits(MinuteCounter,e),_createClass(MinuteCounter,[{key:"defaultDataType",value:function defaultDataType(){return Date}},{key:"defaultAttributes",value:function defaultAttributes(){return{showSeconds:!0,showLabels:!0}}},{key:"shouldStop",value:function shouldStop(e){if(isNull(e.stopAt)||isUndefined(e.stopAt))return!1;if(this.stopAt instanceof Date)return this.countdown?this.stopAt.getTime()>=this.value.value.getTime():this.stopAt.getTime()<=this.value.value.getTime();if(isNumber(this.stopAt)){var t=Math.floor((this.value.value.getTime()-this.originalValue.getTime())/1e3);return this.countdown?this.stopAt>=t:this.stopAt<=t}throw new Error("the stopAt property must be an instance of Date or Number.")}},{key:"increment",value:function increment(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;e.value=new Date(this.value.value.getTime()+t+((new Date).getTime()-e.timer.lastLoop))}},{key:"decrement",value:function decrement(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;e.value=new Date(this.value.value.getTime()-t-((new Date).getTime()-e.timer.lastLoop))}},{key:"format",value:function format(e,t){var n=e.timer.isRunning?e.timer.started:new Date(Date.now()-50);return[[this.getMinutes(t,n)],this.showSeconds?[this.getSeconds(t,n)]:null].filter(noop)}},{key:"getMinutes",value:function getMinutes(e,t){return round(this.getTotalSeconds(e,t)/60)}},{key:"getSeconds",value:function getSeconds(e,t){var n=this.getTotalSeconds(e,t);return Math.abs(Math.ceil(60===n?0:n%60))}},{key:"getTotalSeconds",value:function getTotalSeconds(e,t){return e.getTime()===t.getTime()?0:Math.round((e.getTime()-t.getTime())/1e3)}}],[{key:"defineName",value:function defineName(){return"MinuteCounter"}}]),MinuteCounter}(r),Ke=function(e){function HourCounter(){return _classCallCheck(this,HourCounter),_possibleConstructorReturn(this,_getPrototypeOf(HourCounter).apply(this,arguments))}return _inherits(HourCounter,e),_createClass(HourCounter,[{key:"format",value:function format(e,t){var n=e.timer.started?t:new Date,i=e.originalValue||t,r=this.countdown?i:n,s=this.countdown?n:i,a=[[this.getHours(r,s)],[this.getMinutes(r,s)]];return this.showSeconds&&a.push([this.getSeconds(r,s)]),a}},{key:"getMinutes",value:function getMinutes(e,t){return Math.abs(_get(_getPrototypeOf(HourCounter.prototype),"getMinutes",this).call(this,e,t)%60)}},{key:"getHours",value:function getHours(e,t){return Math.floor(this.getTotalSeconds(e,t)/60/60)}}],[{key:"defineName",value:function defineName(){return"HourCounter"}}]),HourCounter}(Je),Qe=function(e){function DayCounter(){return _classCallCheck(this,DayCounter),_possibleConstructorReturn(this,_getPrototypeOf(DayCounter).apply(this,arguments))}return _inherits(DayCounter,e),_createClass(DayCounter,[{key:"format",value:function format(e,t){var n=e.started?t:new Date,i=e.originalValue||t,r=this.countdown?i:n,s=this.countdown?n:i,a=[[this.getDays(r,s)],[this.getHours(r,s)],[this.getMinutes(r,s)]];return this.showSeconds&&a.push([this.getSeconds(r,s)]),a}},{key:"getDays",value:function getDays(e,t){return Math.floor(this.getTotalSeconds(e,t)/60/60/24)}},{key:"getHours",value:function getHours(e,t){return Math.abs(_get(_getPrototypeOf(DayCounter.prototype),"getHours",this).call(this,e,t)%24)}}],[{key:"defineName",value:function defineName(){return"DayCounter"}}]),DayCounter}(Ke),Xe=function(e){function TwentyFourHourClock(){return _classCallCheck(this,TwentyFourHourClock),_possibleConstructorReturn(this,_getPrototypeOf(TwentyFourHourClock).apply(this,arguments))}return _inherits(TwentyFourHourClock,e),_createClass(TwentyFourHourClock,[{key:"defaultDataType",value:function defaultDataType(){return Date}},{key:"defaultValue",value:function defaultValue(){return new Date}},{key:"defaultAttributes",value:function defaultAttributes(){return{showSeconds:!0,showLabels:!1}}},{key:"format",value:function format(e,t){t||(t=new Date);var n=[[t.getHours()],[t.getMinutes()]];return this.showSeconds&&n.push([t.getSeconds()]),n}},{key:"increment",value:function increment(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;e.value=new Date(this.value.value.getTime()+t+((new Date).getTime()-e.timer.lastLoop))}},{key:"decrement",value:function decrement(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;e.value=new Date(this.value.value.getTime()-t-((new Date).getTime()-e.timer.lastLoop))}}],[{key:"defineName",value:function defineName(){return"TwentyFourHourClock"}}]),TwentyFourHourClock}(r),et=function(e){function TwelveHourClock(){return _classCallCheck(this,TwelveHourClock),_possibleConstructorReturn(this,_getPrototypeOf(TwelveHourClock).apply(this,arguments))}return _inherits(TwelveHourClock,e),_createClass(TwelveHourClock,[{key:"defaultAttributes",value:function defaultAttributes(){return{showLabels:!1,showSeconds:!0,showMeridium:!0}}},{key:"format",value:function format(e,t){t||(t=new Date);var n=t.getHours(),i=[n>12?n-12:0===n?12:n,t.getMinutes()];return this.meridium=n>12?"pm":"am",this.showSeconds&&i.push(t.getSeconds()),i}}],[{key:"defineName",value:function defineName(){return"TwelveHourClock"}}]),TwelveHourClock}(Xe),tt=function(e){function WeekCounter(){return _classCallCheck(this,WeekCounter),_possibleConstructorReturn(this,_getPrototypeOf(WeekCounter).apply(this,arguments))}return _inherits(WeekCounter,e),_createClass(WeekCounter,[{key:"format",value:function format(e,t){var n=e.timer.started?t:new Date,i=e.originalValue||t,r=this.countdown?i:n,s=this.countdown?n:i,a=[[this.getWeeks(r,s)],[this.getDays(r,s)],[this.getHours(r,s)],[this.getMinutes(r,s)]];return this.showSeconds&&a.push([this.getSeconds(r,s)]),a}},{key:"getWeeks",value:function getWeeks(e,t){return Math.floor(this.getTotalSeconds(e,t)/60/60/24/7)}},{key:"getDays",value:function getDays(e,t){return Math.abs(_get(_getPrototypeOf(WeekCounter.prototype),"getDays",this).call(this,e,t)%7)}}],[{key:"defineName",value:function defineName(){return"WeekCounter"}}]),WeekCounter}(Qe),nt=function(e){function YearCounter(){return _classCallCheck(this,YearCounter),_possibleConstructorReturn(this,_getPrototypeOf(YearCounter).apply(this,arguments))}return _inherits(YearCounter,e),_createClass(YearCounter,[{key:"format",value:function format(e,t){var n=e.timer.started?t:new Date,i=e.originalValue||t,r=this.countdown?i:n,s=this.countdown?n:i,a=[[this.getYears(r,s)],[this.getWeeks(r,s)],[this.getDays(r,s)],[this.getHours(r,s)],[this.getMinutes(r,s)]];return this.showSeconds&&a.push([this.getSeconds(r,s)]),a}},{key:"getYears",value:function getYears(e,t){return Math.floor(Math.max(0,this.getTotalSeconds(e,t)/60/60/24/7/52))}},{key:"getWeeks",value:function getWeeks(e,t){return Math.abs(_get(_getPrototypeOf(YearCounter.prototype),"getWeeks",this).call(this,e,t)%52)}}],[{key:"defineName",value:function defineName(){return"YearCounter"}}]),YearCounter}(tt),it=Object.freeze({Counter:qe,DayCounter:Qe,MinuteCounter:Je,HourCounter:Ke,TwelveHourClock:et,TwentyFourHourClock:Xe,WeekCounter:tt,YearCounter:nt}),rt={face:qe,theme:{Divider:Divider$1,FlipClock:FlipClock,Group:Group$1,Label:Label$1,List:List$1,ListItem:ListItem$1,faces:Object.freeze({DayCounter:DayCounter$1,HourCounter:HourCounter$1,MinuteCounter:MinuteCounter$1,TwelveHourClock:TwelveHourClock$1,TwentyFourHourClock:TwentyFourHourClock$1,WeekCounter:WeekCounter$1,YearCounter:YearCounter$1})},language:_};return function(e){function FlipClock(e,t,n){var r;_classCallCheck(this,FlipClock),validate(e,HTMLElement)||error(i.element),isObject(t)&&!n&&(n=t,t=void 0);var s=n.face||rt.face;return delete n.face,(r=_possibleConstructorReturn(this,_getPrototypeOf(FlipClock).call(this,Object.assign({originalValue:t,theme:rt.theme,language:rt.language,timer:Be.make(n.interval||1e3)},n)))).face||(r.face=s),r.mount(e),r}return _inherits(FlipClock,e),_createClass(FlipClock,[{key:"mount",value:function mount(e){return _get(_getPrototypeOf(FlipClock.prototype),"mount",this).call(this,e),this.face.mounted(this),this}},{key:"render",value:function render(){return _get(_getPrototypeOf(FlipClock.prototype),"render",this).call(this),this.theme.faces[this.face.name]&&this.theme.faces[this.face.name](this.el,this),this.face.rendered(this),this.el}},{key:"start",value:function start(e){var t=this;return this.timer.started||(this.value=this.originalValue),isUndefined(this.face.stopAt)&&(this.face.stopAt=this.stopAt),isUndefined(this.face.originalValue)&&(this.face.originalValue=this.originalValue),this.timer.start(function(){t.face.interval(t,e)}),this.face.started(this),this.emit("start")}},{key:"stop",value:function stop(e){return this.timer.stop(e),this.face.stopped(this),this.emit("stop")}},{key:"reset",value:function reset(e){var t=this;return this.value=this.originalValue,this.timer.reset(function(){return t.interval(t,e)}),this.face.reset(this),this.emit("reset")}},{key:"increment",value:function increment(e){return this.face.increment(this,e),this}},{key:"decrement",value:function decrement(e){return this.face.decrement(this,e),this}},{key:"createDivider",value:function createDivider(e){return Ie.make(Object.assign({theme:this.theme,language:this.language},e))}},{key:"createList",value:function createList(e,t){return xe.make(e,Object.assign({theme:this.theme,language:this.language},t))}},{key:"createLabel",value:function createLabel(e,t){return Ze.make(e,Object.assign({theme:this.theme,language:this.language},t))}},{key:"createGroup",value:function createGroup(e,t){return Ue.make(e,Object.assign({theme:this.theme,language:this.language},t))}},{key:"face",get:function get$$1(){return this.$face},set:function set(e){validate(e,[r,"string","function"])||error(i.face),this.$face=(it[e]||e).make(Object.assign(this.getPublicAttributes(),{originalValue:this.face?this.face.originalValue:void 0})),this.$face.initialized(this),this.value?this.$face.value=this.face.createFaceValue(this,this.value.value):this.value||(this.value=this.originalValue),this.el&&this.render()}},{key:"stopAt",get:function get$$1(){return isFunction(this.$stopAt)?this.$stopAt(this):this.$stopAt},set:function set(e){this.$stopAt=e}},{key:"timer",get:function get$$1(){return this.$timer},set:function set(e){validate(e,Be)||error(i.timer),this.$timer=e}},{key:"value",get:function get$$1(){return this.face?this.face.value:null},set:function set(e){if(!this.face)throw new Error("A face must be set before setting a value.");e instanceof n?this.face.value=e:this.value?this.face.value=this.face.value.clone(e):this.face.value=this.face.createFaceValue(this,e),this.el&&this.render()}},{key:"originalValue",get:function get$$1(){return isFunction(this.$originalValue)&&!this.$originalValue.name?this.$originalValue():isUndefined(this.$originalValue)||isNull(this.$originalValue)?this.face?this.face.defaultValue():void 0:this.$originalValue},set:function set(e){this.$originalValue=e}}],[{key:"defineName",value:function defineName(){return"FlipClock"}},{key:"setDefaultFace",value:function setDefaultFace(e){validate(e,r)||error(i.face),rt.face=e}},{key:"setDefaultTheme",value:function setDefaultTheme(e){validate(e,"object")||error(i.theme),rt.theme=e}},{key:"setDefaultLanguage",value:function setDefaultLanguage(e){validate(e,"object")||error(i.language),rt.language=e}},{key:"defaults",get:function get$$1(){return rt}}]),FlipClock}(We)}); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.FlipClock=t()}(this,function(){"use strict";function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var n=0;n1?t-1:0),i=1;i=i)return t[n]}return null}function stringFromCharCodeBy(e,t){return String.fromCharCode(t(findRange(e),e.charCodeAt(0)))}function next(e){return format(e.toString().split("").map(function(e){return stringFromCharCodeBy(e,function(e,t){return!e||te.min?t-1:e.max})}).join(""),_typeof(e))}function validate(e){for(var t=!1,n=arguments.length,i=new Array(n>1?n-1:0),r=1;r1?n-1:0),r=1;r1&&void 0!==arguments[1]&&arguments[1];return this.render(),this.parent=e,t?this.parent.insertBefore(this.el,t):this.parent.appendChild(this.el),this.el}},{key:"className",get:function get(){return kebabCase(this.constructor.defineName())}},{key:"el",get:function get(){return this.$el},set:function set(e){validate(e,null,HTMLElement)||error(i.element),this.$el=e}},{key:"parent",get:function get(){return this.$parent},set:function set(e){this.$parent=e}},{key:"theme",get:function get(){return this.$theme},set:function set(e){validate(e,"object")||error(i.value),this.$theme=e}},{key:"language",get:function get(){return this.$language},set:function set(e){isString(e)&&(e=language(e)),validate(e,"object")||error(i.language),this.$language=e}}]),DomComponent}(e),Ie=function(e){function Divider(){return _classCallCheck(this,Divider),_possibleConstructorReturn(this,_getPrototypeOf(Divider).apply(this,arguments))}return _inherits(Divider,e),_createClass(Divider,null,[{key:"defineName",value:function defineName(){return"Divider"}}]),Divider}(We),Ye=function(e){function ListItem(e,t){return _classCallCheck(this,ListItem),_possibleConstructorReturn(this,_getPrototypeOf(ListItem).call(this,Object.assign({value:e},isObject(e)?e:null,t)))}return _inherits(ListItem,e),_createClass(ListItem,null,[{key:"defineName",value:function defineName(){return"ListItem"}}]),ListItem}(We),xe=function(e){function List(e,t){return _classCallCheck(this,List),_possibleConstructorReturn(this,_getPrototypeOf(List).call(this,Object.assign({value:e,items:[]},isObject(e)?e:null,t)))}return _inherits(List,e),_createClass(List,[{key:"createListItem",value:function createListItem(e,t){var n=new Ye(e,Object.assign({theme:this.theme,language:this.language},t));return this.$items.push(n),n}},{key:"value",get:function get(){return this.$value},set:function set(e){this.$value=e}},{key:"items",get:function get(){return this.$items},set:function set(e){this.$items=e}}],[{key:"defineName",value:function defineName(){return"List"}}]),List}(We),Ue=function(e){function Group(e,t){return _classCallCheck(this,Group),_possibleConstructorReturn(this,_getPrototypeOf(Group).call(this,Object.assign({items:isArray(e)?e:[]},isObject(e)?e:null,t)))}return _inherits(Group,e),_createClass(Group,null,[{key:"defineName",value:function defineName(){return"Group"}}]),Group}(We),Ze=function(e){function Label(e,t){return _classCallCheck(this,Label),_possibleConstructorReturn(this,_getPrototypeOf(Label).call(this,Object.assign({label:e},isObject(e)?e:null,t)))}return _inherits(Label,e),_createClass(Label,null,[{key:"defineName",value:function defineName(){return"Label"}}]),Label}(We),Be=function(e){function Timer(e){return _classCallCheck(this,Timer),_possibleConstructorReturn(this,_getPrototypeOf(Timer).call(this,Object.assign({count:0,handle:null,started:null,running:!1,interval:isNumber(e)?e:null},isObject(e)?e:null)))}return _inherits(Timer,e),_createClass(Timer,[{key:"reset",value:function reset(e){var t=this;return this.stop(function(){t.count=0,t.start(function(){return callback.call(t,e)}),t.emit("reset")}),this}},{key:"start",value:function start(e){var t=this;this.started=new Date,this.lastLoop=Date.now(),this.running=!0,this.emit("start");return function loop(){return Date.now()-t.lastLoop>=t.interval&&(callback.call(t,e),t.lastLoop=Date.now(),t.emit("interval"),t.count++),t.handle=window.requestAnimationFrame(loop),t}()}},{key:"stop",value:function stop(e){var t=this;return this.isRunning&&setTimeout(function(){window.cancelAnimationFrame(t.handle),t.running=!1,callback.call(t,e),t.emit("stop")}),this}},{key:"elapsed",get:function get(){return this.lastLoop?this.lastLoop-(this.started?this.started.getTime():(new Date).getTime()):0}},{key:"isRunning",get:function get(){return!0===this.running}},{key:"isStopped",get:function get(){return!1===this.running}}],[{key:"defineName",value:function defineName(){return"Timer"}}]),Timer}(e),qe=function(e){function Counter(){return _classCallCheck(this,Counter),_possibleConstructorReturn(this,_getPrototypeOf(Counter).apply(this,arguments))}return _inherits(Counter,e),_createClass(Counter,[{key:"increment",value:function increment(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;e.value=this.value.value+t}},{key:"decrement",value:function decrement(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;e.value=this.value.value-t}}],[{key:"defineName",value:function defineName(){return"Counter"}}]),Counter}(r),Je=function(e){function MinuteCounter(){return _classCallCheck(this,MinuteCounter),_possibleConstructorReturn(this,_getPrototypeOf(MinuteCounter).apply(this,arguments))}return _inherits(MinuteCounter,e),_createClass(MinuteCounter,[{key:"defaultDataType",value:function defaultDataType(){return Date}},{key:"defaultAttributes",value:function defaultAttributes(){return{showSeconds:!0,showLabels:!0}}},{key:"shouldStop",value:function shouldStop(e){if(isNull(e.stopAt)||isUndefined(e.stopAt))return!1;if(this.stopAt instanceof Date)return this.countdown?this.stopAt.getTime()>=this.value.value.getTime():this.stopAt.getTime()<=this.value.value.getTime();if(isNumber(this.stopAt)){var t=Math.floor((this.value.value.getTime()-this.originalValue.getTime())/1e3);return this.countdown?this.stopAt>=t:this.stopAt<=t}throw new Error("the stopAt property must be an instance of Date or Number.")}},{key:"increment",value:function increment(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;e.value=new Date(this.value.value.getTime()+t+((new Date).getTime()-e.timer.lastLoop))}},{key:"decrement",value:function decrement(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;e.value=new Date(this.value.value.getTime()-t-((new Date).getTime()-e.timer.lastLoop))}},{key:"format",value:function format(e,t){var n=e.timer.isRunning?e.timer.started:new Date;return[[this.getMinutes(t,n)],this.showSeconds?[this.getSeconds(t,n)]:null].filter(noop)}},{key:"getMinutes",value:function getMinutes(e,t){return round(this.getTotalSeconds(e,t)/60)}},{key:"getSeconds",value:function getSeconds(e,t){var n=this.getTotalSeconds(e,t);return Math.abs(Math.ceil(60===n?0:n%60))}},{key:"getTotalSeconds",value:function getTotalSeconds(e,t){return e.getTime()===t.getTime()?0:Math.round((e.getTime()-t.getTime())/1e3)}}],[{key:"defineName",value:function defineName(){return"MinuteCounter"}}]),MinuteCounter}(r),Ke=function(e){function HourCounter(){return _classCallCheck(this,HourCounter),_possibleConstructorReturn(this,_getPrototypeOf(HourCounter).apply(this,arguments))}return _inherits(HourCounter,e),_createClass(HourCounter,[{key:"format",value:function format(e,t){var n=e.timer.started?e.timer.started:new Date,i=t||e.originalValue,r=this.countdown?i:n,s=this.countdown?n:i,a=[[this.getHours(r,s)],[this.getMinutes(r,s)]];return this.showSeconds&&a.push([this.getSeconds(r,s)]),a}},{key:"getMinutes",value:function getMinutes(e,t){return Math.abs(_get(_getPrototypeOf(HourCounter.prototype),"getMinutes",this).call(this,e,t)%60)}},{key:"getHours",value:function getHours(e,t){return Math.floor(this.getTotalSeconds(e,t)/60/60)}}],[{key:"defineName",value:function defineName(){return"HourCounter"}}]),HourCounter}(Je),Qe=function(e){function DayCounter(){return _classCallCheck(this,DayCounter),_possibleConstructorReturn(this,_getPrototypeOf(DayCounter).apply(this,arguments))}return _inherits(DayCounter,e),_createClass(DayCounter,[{key:"format",value:function format(e,t){var n=e.started?t:new Date,i=t||e.originalValue,r=this.countdown?i:n,s=this.countdown?n:i,a=[[this.getDays(r,s)],[this.getHours(r,s)],[this.getMinutes(r,s)]];return this.showSeconds&&a.push([this.getSeconds(r,s)]),a}},{key:"getDays",value:function getDays(e,t){return Math.floor(this.getTotalSeconds(e,t)/60/60/24)}},{key:"getHours",value:function getHours(e,t){return Math.abs(_get(_getPrototypeOf(DayCounter.prototype),"getHours",this).call(this,e,t)%24)}}],[{key:"defineName",value:function defineName(){return"DayCounter"}}]),DayCounter}(Ke),Xe=function(e){function TwentyFourHourClock(){return _classCallCheck(this,TwentyFourHourClock),_possibleConstructorReturn(this,_getPrototypeOf(TwentyFourHourClock).apply(this,arguments))}return _inherits(TwentyFourHourClock,e),_createClass(TwentyFourHourClock,[{key:"defaultDataType",value:function defaultDataType(){return Date}},{key:"defaultValue",value:function defaultValue(){return new Date}},{key:"defaultAttributes",value:function defaultAttributes(){return{showSeconds:!0,showLabels:!1}}},{key:"format",value:function format(e,t){t||(t=new Date);var n=[[t.getHours()],[t.getMinutes()]];return this.showSeconds&&n.push([t.getSeconds()]),n}},{key:"increment",value:function increment(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;e.value=new Date(this.value.value.getTime()+t+((new Date).getTime()-e.timer.lastLoop))}},{key:"decrement",value:function decrement(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;e.value=new Date(this.value.value.getTime()-t-((new Date).getTime()-e.timer.lastLoop))}}],[{key:"defineName",value:function defineName(){return"TwentyFourHourClock"}}]),TwentyFourHourClock}(r),et=function(e){function TwelveHourClock(){return _classCallCheck(this,TwelveHourClock),_possibleConstructorReturn(this,_getPrototypeOf(TwelveHourClock).apply(this,arguments))}return _inherits(TwelveHourClock,e),_createClass(TwelveHourClock,[{key:"defaultAttributes",value:function defaultAttributes(){return{showLabels:!1,showSeconds:!0,showMeridium:!0}}},{key:"format",value:function format(e,t){t||(t=new Date);var n=t.getHours(),i=[n>12?n-12:0===n?12:n,t.getMinutes()];return this.meridium=n>12?"pm":"am",this.showSeconds&&i.push(t.getSeconds()),i}}],[{key:"defineName",value:function defineName(){return"TwelveHourClock"}}]),TwelveHourClock}(Xe),tt=function(e){function WeekCounter(){return _classCallCheck(this,WeekCounter),_possibleConstructorReturn(this,_getPrototypeOf(WeekCounter).apply(this,arguments))}return _inherits(WeekCounter,e),_createClass(WeekCounter,[{key:"format",value:function format(e,t){var n=e.timer.started?t:new Date,i=t||e.originalValue,r=this.countdown?i:n,s=this.countdown?n:i,a=[[this.getWeeks(r,s)],[this.getDays(r,s)],[this.getHours(r,s)],[this.getMinutes(r,s)]];return this.showSeconds&&a.push([this.getSeconds(r,s)]),a}},{key:"getWeeks",value:function getWeeks(e,t){return Math.floor(this.getTotalSeconds(e,t)/60/60/24/7)}},{key:"getDays",value:function getDays(e,t){return Math.abs(_get(_getPrototypeOf(WeekCounter.prototype),"getDays",this).call(this,e,t)%7)}}],[{key:"defineName",value:function defineName(){return"WeekCounter"}}]),WeekCounter}(Qe),nt=function(e){function YearCounter(){return _classCallCheck(this,YearCounter),_possibleConstructorReturn(this,_getPrototypeOf(YearCounter).apply(this,arguments))}return _inherits(YearCounter,e),_createClass(YearCounter,[{key:"format",value:function format(e,t){var n=e.timer.started?t:new Date,i=t||e.originalValue,r=this.countdown?i:n,s=this.countdown?n:i,a=[[this.getYears(r,s)],[this.getWeeks(r,s)],[this.getDays(r,s)],[this.getHours(r,s)],[this.getMinutes(r,s)]];return this.showSeconds&&a.push([this.getSeconds(r,s)]),a}},{key:"getYears",value:function getYears(e,t){return Math.floor(Math.max(0,this.getTotalSeconds(e,t)/60/60/24/7/52))}},{key:"getWeeks",value:function getWeeks(e,t){return Math.abs(_get(_getPrototypeOf(YearCounter.prototype),"getWeeks",this).call(this,e,t)%52)}}],[{key:"defineName",value:function defineName(){return"YearCounter"}}]),YearCounter}(tt),it=Object.freeze({Counter:qe,DayCounter:Qe,MinuteCounter:Je,HourCounter:Ke,TwelveHourClock:et,TwentyFourHourClock:Xe,WeekCounter:tt,YearCounter:nt}),rt={face:qe,theme:{Divider:Divider$1,FlipClock:FlipClock,Group:Group$1,Label:Label$1,List:List$1,ListItem:ListItem$1,faces:Object.freeze({DayCounter:DayCounter$1,HourCounter:HourCounter$1,MinuteCounter:MinuteCounter$1,TwelveHourClock:TwelveHourClock$1,TwentyFourHourClock:TwentyFourHourClock$1,WeekCounter:WeekCounter$1,YearCounter:YearCounter$1})},language:_};return function(e){function FlipClock(e,t,n){var r;_classCallCheck(this,FlipClock),validate(e,HTMLElement)||error(i.element),isObject(t)&&!n&&(n=t,t=void 0);var s=n.face||rt.face;return delete n.face,(r=_possibleConstructorReturn(this,_getPrototypeOf(FlipClock).call(this,Object.assign({originalValue:t,theme:rt.theme,language:rt.language,timer:Be.make(n.interval||1e3)},n)))).face||(r.face=s),r.mount(e),r}return _inherits(FlipClock,e),_createClass(FlipClock,[{key:"mount",value:function mount(e){return _get(_getPrototypeOf(FlipClock.prototype),"mount",this).call(this,e),this.face.mounted(this),this}},{key:"render",value:function render(){return _get(_getPrototypeOf(FlipClock.prototype),"render",this).call(this),this.theme.faces[this.face.name]&&this.theme.faces[this.face.name](this.el,this),this.face.rendered(this),this.el}},{key:"start",value:function start(e){var t=this;return this.timer.started||(this.value=this.originalValue),isUndefined(this.face.stopAt)&&(this.face.stopAt=this.stopAt),isUndefined(this.face.originalValue)&&(this.face.originalValue=this.originalValue),this.timer.start(function(){t.face.interval(t,e)}),this.face.started(this),this.emit("start")}},{key:"stop",value:function stop(e){return this.timer.stop(e),this.face.stopped(this),this.emit("stop")}},{key:"reset",value:function reset(e){var t=this;return this.value=this.originalValue,this.timer.reset(function(){return t.interval(t,e)}),this.face.reset(this),this.emit("reset")}},{key:"increment",value:function increment(e){return this.face.increment(this,e),this}},{key:"decrement",value:function decrement(e){return this.face.decrement(this,e),this}},{key:"createDivider",value:function createDivider(e){return Ie.make(Object.assign({theme:this.theme,language:this.language},e))}},{key:"createList",value:function createList(e,t){return xe.make(e,Object.assign({theme:this.theme,language:this.language},t))}},{key:"createLabel",value:function createLabel(e,t){return Ze.make(e,Object.assign({theme:this.theme,language:this.language},t))}},{key:"createGroup",value:function createGroup(e,t){return Ue.make(e,Object.assign({theme:this.theme,language:this.language},t))}},{key:"face",get:function get$$1(){return this.$face},set:function set(e){validate(e,[r,"string","function"])||error(i.face),this.$face=(it[e]||e).make(Object.assign(this.getPublicAttributes(),{originalValue:this.face?this.face.originalValue:void 0})),this.$face.initialized(this),this.value?this.$face.value=this.face.createFaceValue(this,this.value.value):this.value||(this.value=this.originalValue),this.el&&this.render()}},{key:"stopAt",get:function get$$1(){return isFunction(this.$stopAt)?this.$stopAt(this):this.$stopAt},set:function set(e){this.$stopAt=e}},{key:"timer",get:function get$$1(){return this.$timer},set:function set(e){validate(e,Be)||error(i.timer),this.$timer=e}},{key:"value",get:function get$$1(){return this.face?this.face.value:null},set:function set(e){if(!this.face)throw new Error("A face must be set before setting a value.");e instanceof n?this.face.value=e:this.value?this.face.value=this.face.value.clone(e):this.face.value=this.face.createFaceValue(this,e),this.el&&this.render()}},{key:"originalValue",get:function get$$1(){return isFunction(this.$originalValue)&&!this.$originalValue.name?this.$originalValue():isUndefined(this.$originalValue)||isNull(this.$originalValue)?this.face?this.face.defaultValue():void 0:this.$originalValue},set:function set(e){this.$originalValue=e}}],[{key:"defineName",value:function defineName(){return"FlipClock"}},{key:"setDefaultFace",value:function setDefaultFace(e){validate(e,r)||error(i.face),rt.face=e}},{key:"setDefaultTheme",value:function setDefaultTheme(e){validate(e,"object")||error(i.theme),rt.theme=e}},{key:"setDefaultLanguage",value:function setDefaultLanguage(e){validate(e,"object")||error(i.language),rt.language=e}},{key:"defaults",get:function get$$1(){return rt}}]),FlipClock}(We)}); //# sourceMappingURL=flipclock.min.js.map diff --git a/dist/flipclock.min.js.map b/dist/flipclock.min.js.map index cd8f8045..f0ed3316 100644 --- a/dist/flipclock.min.js.map +++ b/dist/flipclock.min.js.map @@ -1 +1 @@ -{"version":3,"file":"flipclock.min.js","sources":["../src/js/Helpers/Functions.js","../src/js/Helpers/Digitize.js","../src/js/Helpers/Value.js","../src/js/Helpers/Validate.js","../src/js/Helpers/Language.js","../src/js/Helpers/Translate.js","../src/js/Helpers/Template.js","../src/js/Themes/Original/Divider.js","../src/js/Themes/Original/FlipClock.js","../src/js/Themes/Original/Group.js","../src/js/Themes/Original/Label.js","../src/js/Themes/Original/List.js","../src/js/Themes/Original/ListItem.js","../src/js/Themes/Original/Faces/DayCounter.js","../src/js/Themes/Original/Faces/HourCounter.js","../src/js/Themes/Original/Faces/MinuteCounter.js","../src/js/Themes/Original/Faces/TwentyFourHourClock.js","../src/js/Themes/Original/Faces/TwelveHourClock.js","../src/js/Themes/Original/Faces/WeekCounter.js","../src/js/Themes/Original/Faces/YearCounter.js","../src/js/Components/Component.js","../src/js/Components/FaceValue.js","../src/js/Config/ConsoleMessages.js","../src/js/Components/Face.js","../src/js/Languages/ar-ar.js","../src/js/Languages/ca-es.js","../src/js/Languages/cs-cz.js","../src/js/Languages/da-dk.js","../src/js/Languages/de-de.js","../src/js/Languages/en-us.js","../src/js/Languages/es-es.js","../src/js/Languages/fa-ir.js","../src/js/Languages/fi-fi.js","../src/js/Languages/fr-ca.js","../src/js/Languages/he-il.js","../src/js/Languages/hu-hu.js","../src/js/Languages/it-it.js","../src/js/Languages/ja-jp.js","../src/js/Languages/ko-kr.js","../src/js/Languages/lv-lv.js","../src/js/Languages/nl-be.js","../src/js/Languages/no-nb.js","../src/js/Languages/pl-pl.js","../src/js/Languages/pt-br.js","../src/js/Languages/ro-ro.js","../src/js/Languages/ru-ru.js","../src/js/Languages/sk-sk.js","../src/js/Languages/sv-se.js","../src/js/Languages/th-th.js","../src/js/Languages/tr-tr.js","../src/js/Languages/ua-ua.js","../src/js/Languages/vn-vn.js","../src/js/Languages/zh-cn.js","../src/js/Languages/zh-tw.js","../src/js/Components/DomComponent.js","../src/js/Components/Divider.js","../src/js/Components/ListItem.js","../src/js/Components/List.js","../src/js/Components/Group.js","../src/js/Components/Label.js","../src/js/Components/Timer.js","../src/js/Faces/Counter.js","../src/js/Faces/MinuteCounter.js","../src/js/Faces/HourCounter.js","../src/js/Faces/DayCounter.js","../src/js/Faces/TwentyFourHourClock.js","../src/js/Faces/TwelveHourClock.js","../src/js/Faces/WeekCounter.js","../src/js/Faces/YearCounter.js","../src/js/Config/DefaultValues.js","../src/js/Themes/Original/index.js","../src/js/Components/FlipClock.js"],"sourcesContent":["/**\n * These are a collection of helper functions, some borrowed from Lodash,\n * Underscore, etc, to provide common functionality without the need for using\n * a dependency. All of this is an attempt to reduce the file size of the\n * library.\n *\n * @namespace Helpers.Functions\n */\n\n/**\n * Throw a string as an Error exception.\n *\n * @function error\n * @param {string} string - The error message.\n * @return {void}\n * @memberof Helpers.Functions\n */\nexport function error(string) {\n throw Error(string);\n}\n\n/**\n * Check if `fn` is a function, and call it with `this` context and pass the\n * arguments.\n *\n * @function callback\n * @param {string} string - The callback fn.\n * @param {...*} args - The arguments to pass.\n * @return {void}\n * @memberof Helpers.Functions\n */\nexport function callback(fn, ...args) {\n if(isFunction(fn)) {\n return fn.call(this, ...args);\n }\n}\n\n/**\n * Round the value to the correct value. Takes into account negative numbers.\n *\n * @function round\n * @param {value} string - The value to round.\n * @return {string} - The rounded value.\n * @memberof Helpers.Functions\n */\nexport function round(value) {\n return isNegativeZero(\n value = isNegative(value) ? Math.ceil(value) : Math.floor(value)\n ) ? ('-' + value).toString() : value;\n}\n\n/**\n * Returns `true` if `undefined or `null`.\n *\n * @function noop\n * @param {value} string - The value to check.\n * @return {boolean} - `true` if `undefined or `null`.\n * @memberof Helpers.Functions\n */\nexport function noop(value) {\n return !isUndefined(value) && !isNull(value);\n}\n\n/**\n * Returns a function that executes the `before` attribute and passes that value\n * to `after` and the subsequent value is returned.\n *\n * @function chain\n * @param {function} before - The first function to execute.\n * @param {function} after - The subsequent function to execute.\n * @return {function} - A function that executes the chain.\n * @memberof Helpers.Functions\n */\nexport function chain(before, after) {\n return () => after(before());\n}\n\n/**\n * Returns a function that returns maps the values before concatenating them.\n *\n * @function concatMap\n * @param {function} fn - The map callback function.\n * @return {function} - A function that executes the map and concatenation.\n * @memberof Helpers.Functions\n */\nexport function concatMap(fn) {\n return x => {\n return x.map(fn).reduce((x, y) => x.concat(y), []);\n }\n}\n\n/**\n * Flatten an array.\n *\n * @function flatten\n * @param {array} value - The array to flatten.\n * @return {array} - The flattened array.\n * @memberof Helpers.Functions\n */\nexport function flatten(value) {\n return concatMap(value => value)(value)\n}\n\n/**\n * Deep flatten an array.\n *\n * @function deepFlatten\n * @param {array} value - The array to flatten.\n * @return {array} - The flattened array.\n * @memberof Helpers.Functions\n */\nexport function deepFlatten(x) {\n return concatMap(x => Array.isArray(x) ? deepFlatten (x) : x)(x);\n}\n\n/**\n * Capitalize the first letter in a string.\n *\n * @function ucfirst\n * @param {string} string - The string to capitalize.\n * @return {string} - The capitalized string.\n * @memberof Helpers.Functions\n */\nexport function ucfirst(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n/**\n * Returns the length of a deep flatten array.\n *\n * @function length\n * @param {array} value - The array to count.\n * @return {number} - The length of the deep flattened array.\n * @memberof Helpers.Functions\n */\nexport function length(value) {\n return deepFlatten(value).length;\n}\n\n/**\n * Determines if a value is a negative zero.\n *\n * @function isNegativeZero\n * @param {number} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a negative zero (`-0`).\n * @memberof Helpers.Functions\n */\nexport function isNegativeZero(value) {\n return 1 / Math.round(value) === -Infinity;\n}\n\n/**\n * Determines if a value is a negative.\n *\n * @function isNegative\n * @param {number} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a negative.\n * @memberof Helpers.Functions\n */\nexport function isNegative(value) {\n return isNegativeZero(value) || value < 0;\n}\n\n/**\n * Determines if a value is `null`.\n *\n * @function isNull\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a `null`.\n * @memberof Helpers.Functions\n */\nexport function isNull(value) {\n return value === null;// || typeof value === 'null';\n}\n\n/**\n * Determines if a value is `undefined`.\n *\n * @function isNull\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a `undefined`.\n * @memberof Helpers.Functions\n */\nexport function isUndefined(value) {\n return typeof value === 'undefined';\n}\n\n/**\n * Determines if a value is a constructor.\n *\n * @function isConstructor\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a constructor.\n * @memberof Helpers.Functions\n */\nexport function isConstructor(value) {\n return (value instanceof Function) && !!value.name;\n}\n\n/**\n * Determines if a value is a string.\n *\n * @function isString\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a string.\n * @memberof Helpers.Functions\n */\nexport function isString(value) {\n return typeof value === 'string';\n}\n\n/**\n * Determines if a value is a array.\n *\n * @function isString\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a string.\n * @memberof Helpers.Functions\n */\nexport function isArray(value) {\n return value instanceof Array;\n}\n\n/**\n * Determines if a value is an object.\n *\n * @function isObject\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is an object.\n * @memberof Helpers.Functions\n */\nexport function isObject(value) {\n const type = typeof value;\n return value != null && !isArray(value) && (\n type == 'object' || type == 'function'\n );\n}\n\n/**\n * Determines if a value is a function.\n *\n * @function isObject\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a function.\n * @memberof Helpers.Functions\n */\nexport function isFunction(value) {\n return value instanceof Function;\n}\n\n/**\n * Determines if a value is a number.\n *\n * @function isObject\n * @param {*} value - The value to check.\n * @return {boolean} - Returns `true` if the value is a number.\n * @memberof Helpers.Functions\n */\nexport function isNumber(value) {\n return !isNaN(value);\n}\n\n/**\n * Converts a string into kebab case.\n *\n * @function kebabCase\n * @param {string} string - The string to convert.\n * @return {string} - The converted string.\n * @memberof Helpers.Functions\n */\nexport function kebabCase(string) {\n return string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\\s+/g, '-').toLowerCase();\n}\n","/**\n * @namespace Helpers.Digitize\n */\nimport { flatten } from './Functions';\nimport { deepFlatten } from './Functions';\n\n/**\n * Digitize a number, string, or an array into a digitized array. This function\n * use by the `Face`, which convert the digitized array into an array of `List`\n * instances.\n *\n * @function digitize\n * @param {*} value - The value to digitize.\n * @param {(Object|undefined)} [options] - The digitizer options.\n * @return {array} - The digitized array.\n * @memberof Helpers.Digitize\n */\nexport default function digitize(value, options) {\n options = Object.assign({\n minimumDigits: 0,\n prependLeadingZero: true\n }, options);\n\n function prepend(number) {\n const shouldPrependZero = options.prependLeadingZero &&\n number.toString().split('').length === 1;\n\n return (shouldPrependZero ? '0' : '').concat(number);\n }\n\n function digits(arr, min) {\n const length = deepFlatten(arr).length;\n\n if(length < min) {\n for(let i = 0; i < min - length; i++) {\n arr[0].unshift('0');\n }\n }\n\n return arr;\n }\n\n return digits(flatten([value]).map(number => {\n return flatten(deepFlatten([number]).map(number => {\n return prepend(number).split('');\n }));\n }), options.minimumDigits || 0);\n}\n","/**\n * @namespace Helpers.Value\n */\n\n/**\n * An array of objects with min/max ranges.\n *\n * @private\n * @type {array}\n */\nconst RANGES = [{\n // 0-9\n min: 48,\n max: 57\n},{\n // a-z\n min: 65,\n max: 90\n},{\n // A-Z\n min: 97,\n max: 122\n}];\n\n/**\n * Format a string into a new data type. Currently only supports string to\n * number conversion.\n *\n * @private\n * @function format\n * @param {string} string - The string to format.\n * @param {string} type - The data type (represented as a string) used to\n * convert the string.\n * @return {boolean} - Returns the formatted string.\n */\nfunction format(string, type) {\n switch(type) {\n case 'number':\n return parseFloat(string);\n }\n\n return string;\n}\n\n/**\n * Find the range object from the `RANGES` constant from the character given.\n * This is mainly an interval method, but can be used by faces to help\n * determine what the next value of a string should be.\n *\n * @private\n * @function format\n * @param {string} char - The char used to determine the range.\n * @param {string} type - The data type (represented as a string) used to\n * convert the string.\n * @return {boolean} - Returns the formatted string.\n */\nfunction findRange(char) {\n for(const i in RANGES) {\n const code = char.toString().charCodeAt(0);\n\n if(RANGES[i].min <= code && RANGES[i].max >= code) {\n return RANGES[i];\n }\n }\n\n return null;\n}\n\n/**\n * Create a string from a character code, which is returned by the callback.\n *\n * @private\n * @callback stringFromCharCodeBy\n * @param {string} char - The char used to determine the range.\n * @param {function} fn - The callback function receives `range` and `code`\n * arguments. This function should return a character code.\n * @return {string} - Creates a string from the character code returned by the\n * callback function.\n */\nfunction stringFromCharCodeBy(char, fn) {\n return String.fromCharCode(\n fn(findRange(char), char.charCodeAt(0))\n );\n}\n\n/**\n * Calculate the next value for a string. 'a' becomes 'b'. 'A' becomes 'B'. 1\n * becomes 2, etc. If multiple character strings are passed, 'aa' would become\n * 'bb'.\n *\n * @function next\n * @param {(string|number)} value - The string or number to convert.\n * @return {string} - The formatted string\n * @memberof Helpers.Value\n */\nexport function next(value) {\n const converted = (value)\n .toString()\n .split('')\n .map(char => stringFromCharCodeBy(char, (range, code) => {\n return !range || code < range.max ? code + 1 : range.min\n }))\n .join('');\n\n return format(converted, typeof value);\n}\n\n/**\n * Calculate the prev value for a string. 'b' becomes 'a'. 'B' becomes 'A'. 2\n * becomes 1, 0 becomes 9, etc. If multiple character strings are passed, 'bb'\n * would become 'aa'.\n *\n * @function prev\n * @param {(string|number)} value - The string or number to convert.\n * @return {string} - The formatted string\n * @memberof Helpers.Value\n */\nexport function prev(value) {\n const converted = (value)\n .toString()\n .split('')\n .map(char => stringFromCharCodeBy(char, (range, code) => {\n return !range || code > range.min ? code - 1 : range.max\n }))\n .join('');\n\n return format(converted, typeof value);\n}\n","/**\n * @namespace Helpers.Validate\n */\nimport { isNull } from './Functions';\nimport { flatten } from './Functions';\nimport { isString } from './Functions';\nimport { isObject } from './Functions';\nimport { isFunction } from './Functions';\nimport { isConstructor } from './Functions';\n\n/**\n * Validate the data type of a variable.\n *\n * @function validate\n * @param {*} value - The value to validate.\n * @param {...*} args - The data types to use for validate.\n * @return {boolean} - Returns `true`is the value has a valid data type.\n * @memberof Helpers.Validate\n */\nexport default function validate(value, ...args) {\n let success = false;\n\n flatten(args).forEach(arg => {\n if( (isNull(value) && isNull(arg)) ||\n (isObject(arg) && (value instanceof arg)) ||\n (isFunction(arg) && !isConstructor(arg) && arg(value) === true) ||\n (isString(arg) && (typeof value === arg))) {\n success = true;\n }\n });\n\n return success;\n}\n","/**\n * @namespace Helpers.Language\n */\nimport * as LANGUAGES from '../Languages';\n\n/**\n * Return the language associated with the key. Returns `null` if no language is\n * found.\n * \n * @function language\n * @param {string} name - The name or id of the language.\n * @return {object|null} - The language dictionary, or null if not found.\n * @memberof Helpers.Language\n */\nexport default function language(name) {\n return name ? LANGUAGES[name.toLowerCase()] || Object.values(LANGUAGES).find(value => {\n return value.aliases.indexOf(name) !== -1;\n }) : null;\n}\n","/**\n * @namespace Helpers.Translate\n */\nimport language from './Language';\nimport { isString } from './Functions';\n\n/**\n * Translate an English string into another language.\n * \n * @function translate\n * @param {string} string - The string to translate.\n * @param {(string|object)} from - The language used to translate. If a string,\n * the language is loaded into an object.\n * @return {string} - If no diction key is found, the untranslated string is\n * returned.\n * @memberof Helpers.Translate\n */\nexport default function translate(string, from) {\n const lang = isString(from) ? language(from) : from;\n const dictionary = lang.dictionary || lang;\n return dictionary[string] || string;\n};\n","/**\n * A collection of functions to manage DOM nodes and theme templates.\n *\n * @namespace Helpers.Template\n */\nimport { noop } from './Functions';\nimport { isArray } from './Functions';\nimport { isObject } from './Functions';\nimport { isString } from './Functions';\nimport { deepFlatten } from './Functions';\n\n/**\n * Swap a new DOM node with an existing one.\n *\n * @function swap\n * @param {HTMLElement} subject - The new DOM node.\n * @param {HTMLElement} existing - The existing DOM node.\n * @return {HTMLElement} - Returns the new element if it was mounted, otherwise\n * the existing node is returned.\n * @memberof Helpers.Template\n */\nexport function swap(subject, existing) {\n\tif(existing.parentNode) {\n\t\texisting.parentNode.replaceChild(subject, existing);\n\n\t\treturn subject;\n\t}\n\n\treturn existing;\n}\n\n/**\n * Set the attribute of an element.\n *\n * @function setAttributes\n * @param {HTMLElement} el - The DOM node that will receive the attributes.\n * @param {Object|undefined} [attributes] - The attribute object, or if no object\n * is passed, then the action is ignored.\n * @return {HTMLElement} el - The DOM node that received the attributes.\n * @memberof Helpers.Template\n */\nexport function setAttributes(el, attributes) {\n\tif(isObject(attributes)) {\n\t\tfor(const i in attributes) {\n\t\t\tel.setAttribute(i, attributes[i]);\n\t\t}\n\t}\n\n\treturn el;\n}\n\n/**\n * Append an array of DOM nodes to a parent.\n *\n * @function appendChildren\n * @param {HTMLElement} el - The parent DOM node.\n * @param {Array|undefined} [children] - The array of children. If no array\n * is passed, then the method silently fails to run.\n * @return {HTMLElement} el - The DOM node that received the attributes.\n * @memberof Helpers.Template\n */\nexport function appendChildren(el, children) {\n\tif(isArray(children)) {\n\t\tchildren.filter(noop).forEach(child => {\n\t\t\tif(child instanceof HTMLElement) {\n\t\t\t\tel.appendChild(child);\n\t\t\t}\n\t\t});\n\t}\n\n\treturn el;\n}\n\n/**\n * Create a new HTMLElement instance.\n *\n * @function createElement\n * @param {HTMLElement} el - The parent DOM node.\n * @param {Array|undefined} [children] - The array of children. If no array\n * is passed, then the method silently fails to run.\n * @param {Object|undefined} [attributes] - The attributes object.\n * @return {HTMLElement} el - The DOM node that received the attributes.\n * @memberof Helpers.Template\n */\nexport function createElement(el, children, attributes) {\n\tif(!(el instanceof HTMLElement)) {\n\t\tel = document.createElement(el);\n\t}\n\n\tsetAttributes(el, isObject(children) ? children : attributes);\n\n\tif(!isObject(children) && !isArray(children)) {\n\t\tel.innerHTML = children;\n\t}\n\telse {\n\t\tappendChildren(el, children)\n\t}\n\n\treturn el;\n}\n","import { appendChildren, createElement } from '../../Helpers/Template';\n\nexport default function(el, instance) {\n appendChildren(el, [\n createElement('div', {class: 'flip-clock-dot top'}),\n createElement('div', {class: 'flip-clock-dot bottom'})\n ]);\n}\n","import { next } from '../../Helpers/Value';\nimport { appendChildren } from '../../Helpers/Template';\n\nfunction child(el, index) {\n return el ? (el.childNodes ? el.childNodes[index] : el[index]) : null;\n}\n\nfunction char(el) {\n return el ? el.querySelector('.flip-clock-list-item:first-child .top').innerHTML : null;\n}\n\nexport default function(el, instance) {\n const parts = instance.value.digits.map((group, x) => {\n const groupEl = child(instance.el ? instance.el.querySelectorAll('.flip-clock-group') : null, x);\n\n const lists = group.map((value, y) => {\n const listEl = child(groupEl ? groupEl.querySelectorAll('.flip-clock-list') : null, y);\n const listValue = char(listEl);\n\n return instance.createList(value, {\n domValue: listValue,\n countdown: instance.countdown,\n animationRate: instance.face.animationRate || instance.face.delay\n });\n });\n\n return instance.createGroup(lists);\n });\n\n const nodes = parts.map(group => {\n return group.render();\n });\n\n appendChildren(el, nodes);\n}\n","import { createElement, appendChildren } from '../../Helpers/Template';\n\nexport default function(el, instance) {\n const items = instance.items.map(item => {\n return item.render();\n });\n\n appendChildren(el, items);\n}\n","import { createElement } from '../../Helpers/Template';\n\nexport default function(el, instance) {\n el.innerHTML = instance.t(instance.label);\n}\n","import { next, prev } from '../../Helpers/Value';\nimport ListItem from '../../Components/ListItem';\nimport { createElement, appendChildren } from '../../Helpers/Template';\n\nexport default function(el, instance) {\n const beforeValue = instance.domValue || (\n !instance.countdown ? prev(instance.value) : next(instance.value)\n );\n\n if( instance.domValue && instance.domValue !== instance.value) {\n el.classList.add('flip');\n }\n\n el.style.animationDelay = `${instance.animationRate / 2}ms`;\n el.style.animationDuration = `${instance.animationRate / 2}ms`;\n\n instance.items = [\n instance.createListItem(instance.value, {\n active: true\n }),\n instance.createListItem(beforeValue, {\n active: false\n })\n ];\n\n appendChildren(el, instance.items.map(item => item.render()));\n}\n","import { createElement, appendChildren } from '../../Helpers/Template';\n\nexport default function(el, instance) {\n const className = instance.active === true ? 'active' : (\n instance.active === false ? 'before' : null\n );\n\n el.classList.add(className);\n\n appendChildren(el, [\n createElement('div', [\n createElement('div', instance.value, {class: 'top'}),\n createElement('div', instance.value, {class: 'bottom'})\n ], {class: 'flip-clock-list-item-inner'})\n ]);\n}\n","export default function(el, instance) {\n instance.createDivider().mount(el, el.childNodes[1]);\n instance.createDivider().mount(el, el.childNodes[3]);\n\n if(instance.face.showSeconds) {\n instance.createDivider().mount(el, el.childNodes[5]);\n }\n\n if(instance.face.showLabels) {\n instance.createLabel('days').mount(el.childNodes[0]);\n instance.createLabel('hours').mount(el.childNodes[2]);\n instance.createLabel('minutes').mount(el.childNodes[4]);\n\n if(instance.face.showSeconds) {\n instance.createLabel('seconds').mount(el.childNodes[6]);\n }\n }\n}\n","export default function(el, instance) {\n instance.createDivider().mount(el, el.childNodes[1]);\n\n if(instance.face.showSeconds) {\n instance.createDivider().mount(el, el.childNodes[3]);\n }\n \n if(instance.face.showLabels) {\n instance.createLabel('hours').mount(el.childNodes[0]);\n instance.createLabel('minutes').mount(el.childNodes[2]);\n\n if(instance.face.showSeconds) {\n instance.createLabel('seconds').mount(el.childNodes[4]);\n }\n }\n}\n","export default function(el, instance) {\n if(instance.face.showSeconds) {\n instance.createDivider().mount(el, el.childNodes[1]);\n }\n\n if(instance.face.showLabels) {\n instance.createLabel('minutes').mount(el.childNodes[0]);\n\n if(instance.face.showSeconds) {\n instance.createLabel('seconds').mount(el.childNodes[2]);\n }\n }\n}\n","export default function(el, instance) {\n instance.createDivider().mount(el, el.childNodes[1]);\n\n if(instance.face.showSeconds) {\n instance.createDivider().mount(el, el.childNodes[3]);\n }\n \n if(instance.face.showLabels) {\n instance.createLabel('hours').mount(el.childNodes[0]);\n instance.createLabel('minutes').mount(el.childNodes[2]);\n\n if(instance.face.showSeconds) {\n instance.createLabel('seconds').mount(el.childNodes[4]);\n }\n }\n\n}\n","import TwentyFourHourClock from './TwentyFourHourClock';\n\nexport default function(el, instance) {\n TwentyFourHourClock(el, instance);\n\n if(instance.face.showMeridium && instance.face.meridium) {\n const label = instance.createLabel(instance.face.meridium);\n const parent = el.childNodes[el.childNodes.length - 1];\n\n label.mount(parent).classList.add('flip-clock-meridium');\n }\n}\n","export default function(el, instance) {\n instance.createDivider().mount(el, el.childNodes[1]);\n instance.createDivider().mount(el, el.childNodes[3]);\n instance.createDivider().mount(el, el.childNodes[5]);\n\n if(instance.face.showSeconds) {\n instance.createDivider().mount(el, el.childNodes[7]);\n }\n\n if(instance.face.showLabels) {\n instance.createLabel('weeks').mount(el.childNodes[0]);\n instance.createLabel('days').mount(el.childNodes[2]);\n instance.createLabel('hours').mount(el.childNodes[4]);\n instance.createLabel('minutes').mount(el.childNodes[6]);\n\n if(instance.face.showSeconds) {\n instance.createLabel('seconds').mount(el.childNodes[8]);\n }\n }\n}\n","export default function(el, instance) {\n instance.createDivider().mount(el, el.childNodes[1]);\n instance.createDivider().mount(el, el.childNodes[3]);\n instance.createDivider().mount(el, el.childNodes[5]);\n instance.createDivider().mount(el, el.childNodes[7]);\n\n if(instance.face.showSeconds) {\n instance.createDivider().mount(el, el.childNodes[9]);\n }\n\n if(instance.face.showLabels) {\n instance.createLabel('years').mount(el.childNodes[0]);\n instance.createLabel('weeks').mount(el.childNodes[2]);\n instance.createLabel('days').mount(el.childNodes[4]);\n instance.createLabel('hours').mount(el.childNodes[6]);\n instance.createLabel('minutes').mount(el.childNodes[8]);\n\n if(instance.face.showSeconds) {\n instance.createLabel('seconds').mount(el.childNodes[10]);\n }\n }\n}\n","import { chain, error, callback, isObject, kebabCase } from '../Helpers/Functions';\n\nexport default class Component {\n\n /**\n * Abstract base class.\n *\n * @class Component\n * @param {(object|undefined)} [attributes] - The instance attributes.\n */\n constructor(attributes) {\n this.setAttribute(Object.assign({\n events: {}\n }, attributes));\n }\n\n /**\n * Get the `name` attribute.\n *\n * @type {string}\n */\n get name() {\n if(!(this.constructor.defineName instanceof Function)) {\n error('Every class must define its name.');\n }\n\n return this.constructor.defineName();\n }\n\n /**\n * The `events` attribute.\n *\n * @type {object}\n */\n get events() {\n return this.$events || {};\n }\n\n set events(value) {\n this.$events = value;\n }\n\n /**\n * Emit an event.\n *\n * @param {string} key - The event id/key.\n * @return {Component} - Returns `this` instance.\n */\n emit(key, ...args) {\n if(this.events[key]) {\n this.events[key].forEach(event => {\n event.apply(this, args);\n });\n }\n\n return this;\n }\n\n /**\n * Start listening to an event.\n *\n * @param {string} key - The event id/key.\n * @param {Function} fn - The listener callback function.\n * @param {boolean} [once=false] - Should the event handler be fired a\n * single time.\n * @return {Component} - Returns `this` instance.\n */\n on(key, fn, once = false) {\n if(!this.events[key]) {\n this.events[key] = [];\n }\n\n this.events[key].push(fn);\n\n return this;\n }\n\n /**\n * Stop listening to an event.\n *\n * @param {string} key - The event id/key.\n * @param {(Function|undefined)} fn - The listener callback function. If no\n * function is defined, all events with the specified id/key will be\n * removed. Otherwise, only the event listeners matching the id/key AND\n * callback will be removed.\n * @return {Component} - Returns `this` instance.\n */\n off(key, fn) {\n if(this.events[key] && fn) {\n this.events[key] = this.events[key].filter(event => {\n return event !== fn;\n });\n }\n else {\n this.events[key] = [];\n }\n\n return this;\n }\n\n /**\n * Listen to an event only one time.\n *\n * @param {string} key - The event id/key.\n * @param {Function} fn - The listener callback function.\n * @return {Component} - Returns `this` instance.\n */\n once(key, fn) {\n fn = chain(fn, () => this.off(key, fn));\n\n return this.on(key, fn, true);\n }\n\n /**\n * Get an attribute. Returns null if no attribute is defined.\n *\n * @param {string} key - The attribute name.\n * @return {*} - The attribute value.\n */\n getAttribute(key) {\n return this.hasOwnProperty(key) ? this[key] : null;\n }\n\n /**\n * Get all the atttributes for this instance.\n *\n * @return {object} - The attribute dictionary.\n */\n getAttributes() {\n const attributes = {};\n\n Object.getOwnPropertyNames(this).forEach(key => {\n attributes[key] = this.getAttribute(key);\n });\n\n return attributes;\n }\n\n /**\n * Get only public the atttributes for this instance. Omits any attribute\n * that starts with `$`, which is used internally.\n *\n * @return {object} - The attribute dictionary.\n */\n getPublicAttributes() {\n return Object.keys(this.getAttributes())\n .filter(key => {\n return !key.match(/^\\$/);\n })\n .reduce((obj, key) => {\n obj[key] = this.getAttribute(key);\n return obj;\n }, {});\n }\n\n /**\n * Set an attribute key and value.\n *\n * @param {string} key - The attribute name.\n * @param {*} value - The attribute value.\n * @return {void}\n */\n setAttribute(key, value) {\n if(isObject(key)) {\n this.setAttributes(key);\n }\n else {\n this[key] = value;\n }\n }\n\n /**\n * Set an attributes by object of key/value pairs.\n *\n * @param {object} values - The object dictionary.\n * @return {void}\n */\n setAttributes(values) {\n for(const i in values) {\n this.setAttribute(i, values[i]);\n }\n }\n\n /**\n * Helper method to execute the `callback()` function.\n *\n * @param {Function} fn - The callback function.\n * @return {*} - Returns the executed callback function.\n */\n callback(fn) {\n return callback.call(this, fn);\n }\n\n /**\n * Factor method to static instantiate new instances. Useful for writing\n * clean expressive syntax with chained methods.\n *\n * @param {...*} args - The callback arguments.\n * @return {*} - The new component instance.\n */\n static make(...args) {\n return new this(...args);\n }\n\n}\n","import Component from './Component';\nimport digitize from '../Helpers/Digitize';\nimport { next, prev } from '../Helpers/Value';\nimport { length, isObject, isNumber } from '../Helpers/Functions';\n\nexport default class FaceValue extends Component {\n\n /**\n * The `FaceValue` class handles all the digitizing for the `Face`.\n *\n * @class FaceValue\n * @extends Component\n * @param {*} value - The `FaceValue`'s actual value. Most likely should\n * string, number, or Date. But since the Face handles the value, it\n * could be anything.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n */\n constructor(value, attributes) {\n super(Object.assign({\n format: value => value,\n prependLeadingZero: true,\n minimumDigits: 0\n }, attributes));\n\n if(!this.value) {\n this.value = value;\n }\n }\n\n /**\n * The `digits` attribute.\n *\n * @type {(Array|undefined)}\n */\n get digits() {\n return this.$digits;\n }\n\n set digits(value) {\n this.$digits = value;\n this.minimumDigits = Math.max(this.minimumDigits, length(value));\n }\n\n /**\n * The `value` attribute.\n *\n * @type {*}\n */\n get value() {\n return this.$value;\n }\n\n set value(value) {\n this.$value = value;\n this.digits = digitize(this.format(value), {\n minimumDigits: this.minimumDigits,\n prependLeadingZero: this.prependLeadingZero\n });\n }\n\n /**\n * Returns `true` if the `value` attribute is not a number.\n *\n * @return {boolean} - `true` is the value is not a number.\n */\n isNaN() {\n return isNaN(this.value);\n }\n\n /**\n * Returns `true` if the `value` attribute is a number.\n *\n * @return {boolean} - `true` is the value is a number.\n */\n isNumber() {\n return isNumber();\n }\n\n /**\n * Clones the current `FaceValue` instance, but sets a new value to the\n * cloned instance. Used for copying the current instance options and\n * methods, but setting a new value.\n *\n * @param {*} value - The n\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @return {FaceValue} - The cloned `FaceValue`.\n */\n clone(value, attributes) {\n return new this.constructor(value, Object.assign(\n this.getPublicAttributes(), attributes\n ));\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'FaceValue';\n }\n\n}\n","/**\n * @alias ConsoleMessages\n * @type {object}\n * @memberof module:Config/ConsoleMessages\n */\nexport default {\n className: 'The className() is not defined.',\n items: 'The items property must be an array.',\n theme: 'The theme property must be an object.',\n language: 'The language must be an object.',\n date: 'The value must be an instance of a Date.',\n face: 'The face must be an instance of a Face class.',\n element: 'The element must be an instance of an HTMLElement',\n faceValue: 'The face must be an instance of a FaceValue class.',\n timer: 'The timer property must be an instance of a Timer class.'\n};\n","import Component from './Component';\nimport FaceValue from './FaceValue';\nimport validate from '../Helpers/Validate';\nimport ConsoleMessages from '../Config/ConsoleMessages';\nimport { error, isNull, isUndefined, isObject, isArray, isFunction, callback } from '../Helpers/Functions';\n\nexport default class Face extends Component {\n\n /**\n * This class is meant to be provide an interface for all other faces to\n * extend.\n *\n * @class Face\n * @extends Component\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n */\n constructor(value, attributes) {\n if(!(value instanceof FaceValue) && isObject(value)) {\n attributes = value;\n value = undefined;\n }\n\n super();\n\n this.setAttributes(Object.assign({\n autoStart: true,\n countdown: false,\n animationRate: 500\n }, this.defaultAttributes(), attributes || {}));\n\n if(isNull(value) || isUndefined(value)) {\n value = this.defaultValue();\n }\n\n if(value) {\n this.value = value;\n }\n }\n\n /**\n * The `dataType` attribute.\n *\n * @type {*}\n */\n get dataType() {\n return this.defaultDataType();\n }\n\n /**\n * The `value` attribute.\n *\n * @type {*}\n */\n get value() {\n return this.$value;\n }\n\n set value(value) {\n if(!(value instanceof FaceValue)) {\n value = this.createFaceValue(value);\n }\n\n this.$value = value;\n }\n\n /**\n * The `stopAt` attribute.\n *\n * @type {*}\n */\n get stopAt() {\n return this.$stopAt;\n }\n\n set stopAt(value) {\n this.$stopAt = value;\n }\n\n /**\n * The `originalValue` attribute.\n *\n * @type {*}\n */\n get originalValue() {\n return this.$originalValue;\n }\n\n set originalValue(value) {\n this.$originalValue = value;\n }\n\n /**\n * This method is called with every interval, or every time the clock\n * should change, and handles the actual incrementing and decrementing the\n * clock's `FaceValue`.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @param {Function} fn - The interval callback.\n * @return {Face} - This `Face` instance.\n */\n interval(instance, fn) {\n if(this.countdown) {\n this.decrement(instance);\n }\n else {\n this.increment(instance);\n }\n\n callback.call(this, fn);\n\n if(this.shouldStop(instance)) {\n instance.stop();\n }\n\n return this.emit('interval');\n }\n\n /**\n * Determines if the clock should stop or not.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @return {boolean} - Returns `true` if the clock should stop.\n */\n shouldStop(instance) {\n return !isUndefined(this.stopAt) ? this.stopAt === instance.value.value : false;\n }\n\n /**\n * By default this just returns the value unformatted.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @param {*} value - The value to format.\n * @return {*} - The formatted value.\n */\n format(instance, value) {\n return value;\n }\n\n /**\n * The default value for the `Face`.\n *\n * @return {*} - The default value.\n */\n defaultValue() {\n //\n }\n\n /**\n * The default attributes for the `Face`.\n *\n * @return {(Object|undefined)} - The default attributes.\n */\n defaultAttributes() {\n //\n }\n\n /**\n * The default data type for the `Face` value.\n *\n * @return {(Object|undefined)} - The default data type.\n */\n defaultDataType() {\n //\n }\n\n /**\n * Increment the clock.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @param {Number} [amount] - The amount to increment. If the amount is not\n * defined, it is left up to the `Face` to determine the default value.\n * @return {void}\n */\n increment(instance, amount) {\n //\n }\n\n /**\n * Decrement the clock.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @param {Number} [amount] - The amount to decrement. If the amount is not\n * defined, it is left up to the `Face` to determine the default value.\n * @return {void}\n */\n decrement(instance, amount) {\n //\n }\n\n /**\n * This method is called right after clock has started.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @return {void}\n */\n started(instance) {\n //\n }\n\n /**\n * This method is called right after clock has stopped.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @return {void}\n */\n stopped(instance) {\n //\n }\n\n /**\n * This method is called right after clock has reset.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @return {void}\n */\n reset(instance) {\n //\n }\n\n /**\n * This method is called right after `Face` has initialized.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @return {void}\n */\n initialized(instance) {\n //\n }\n\n /**\n * This method is called right after `Face` has rendered.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @return {void}\n */\n rendered(instance) {\n //\n }\n\n /**\n * This method is called right after `Face` has mounted.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @return {void}\n */\n mounted(instance) {\n if(this.autoStart && instance.timer.isStopped) {\n window.requestAnimationFrame(() => instance.start(instance));\n }\n }\n\n /**\n * Helper method to instantiate a new `FaceValue`.\n *\n * @param {FlipClock} instance - The `FlipClock` instance.\n * @param {object|undefined} [attributes] - The attributes passed to the\n * `FaceValue` instance.\n * @return {Divider} - The instantiated `FaceValue`.\n */\n createFaceValue(instance, value) {\n return FaceValue.make(\n isFunction(value) && !value.name ? value() : value, {\n minimumDigits: this.minimumDigits,\n format: value => this.format(instance, value)\n }\n );\n }\n\n}\n","/**\n * @classdesc Arabic Language Pack\n * @desc This class will be used to translate tokens into the Arabic language.\n * @namespace Languages.Arabic\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Arabic\n */\nexport const dictionary = {\n 'years' : 'سنوات',\n 'months' : 'شهور',\n 'days' : 'أيام',\n 'hours' : 'ساعات',\n 'minutes' : 'دقائق',\n 'seconds' : 'ثواني'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Arabic\n */\nexport const aliases = ['ar', 'ar-ar', 'arabic'];\n","/**\n * @classdesc Catalan Language Pack\n * @desc This class will used to translate tokens into the Catalan language.\n * @namespace Languages.Catalan\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Catalan\n */\nexport const dictionary = {\n 'years' : 'Anys',\n 'months' : 'Mesos',\n 'days' : 'Dies',\n 'hours' : 'Hores',\n 'minutes' : 'Minuts',\n 'seconds' : 'Segons'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Catalan\n */\nexport const aliases = ['ca', 'ca-es', 'catalan'];\n","/**\n * @classdesc Czech Language Pack\n * @desc This class will used to translate tokens into the Czech language.\n * @namespace Languages.Czech\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Czech\n */\nexport const dictionary = {\n 'years' : 'Roky',\n 'months' : 'Měsíce',\n 'days' : 'Dny',\n 'hours' : 'Hodiny',\n 'minutes' : 'Minuty',\n 'seconds' : 'Sekundy'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Czech\n */\nexport const aliases = ['cs', 'cs-cz', 'cz', 'cz-cs', 'czech'];\n","/**\n * @classdesc Danish Language Pack\n * @desc This class will used to translate tokens into the Danish language.\n * @namespace Languages.Danish\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Danish\n */\nexport const dictionary = {\n\t'years' : 'År',\n\t'months' : 'Måneder',\n\t'days' : 'Dage',\n\t'hours' : 'Timer',\n\t'minutes' : 'Minutter',\n\t'seconds' : 'Sekunder'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Danish\n */\nexport const aliases = ['da', 'da-dk', 'danish'];\n","/**\n * @classdesc German Language Pack\n * @desc This class will used to translate tokens into the German language.\n * @namespace Languages.German\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.German\n */\nexport const dictionary = {\n\t'years' : 'Jahre',\n\t'months' : 'Monate',\n\t'days' : 'Tage',\n\t'hours' : 'Stunden',\n\t'minutes' : 'Minuten',\n\t'seconds' : 'Sekunden'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.German\n */\nexport const aliases = ['de', 'de-de', 'german'];\n","/**\n * @classdesc English Language Pack\n * @desc This class will used to translate tokens into the English language.\n * @namespace Languages.English\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.English\n */\nexport const dictionary = {\n\t'years' : 'Years',\n\t'months' : 'Months',\n\t'days' : 'Days',\n\t'hours' : 'Hours',\n\t'minutes' : 'Minutes',\n\t'seconds' : 'Seconds'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.English\n */\nexport const aliases = ['en', 'en-us', 'english'];\n","/**\n * @classdesc Spanish Language Pack\n * @desc This class will used to translate tokens into the Spanish language.\n * @namespace Languages.Spanish\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Spanish\n */\nexport const dictionary = {\n\t'years' : 'Años',\n\t'months' : 'Meses',\n\t'days' : 'Días',\n\t'hours' : 'Horas',\n\t'minutes' : 'Minutos',\n\t'seconds' : 'Segundos'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Spanish\n */\nexport const aliases = ['es', 'es-es', 'spanish'];\n","/**\n * @classdesc Persian Language Pack\n * @desc This class will used to translate tokens into the Persian language.\n * @namespace Languages.Persian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Persian\n */\nexport const dictionary = {\n\t'years' : 'سال',\n\t'months' : 'ماه',\n\t'days' : 'روز',\n\t'hours' : 'ساعت',\n\t'minutes' : 'دقیقه',\n\t'seconds' : 'ثانیه'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Persian\n */\nexport const aliases = ['fa', 'fa-ir', 'persian'];\n","/**\n * @classdesc Finnish Language Pack\n * @desc This class will used to translate tokens into the Finnish language.\n * @namespace Languages.Finnish\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Finnish\n */\nexport const dictionary = {\n\t'years' : 'Vuotta',\n\t'months' : 'Kuukautta',\n\t'days' : 'Päivää',\n\t'hours' : 'Tuntia',\n\t'minutes' : 'Minuuttia',\n\t'seconds' : 'Sekuntia'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Finnish\n */\nexport const aliases = ['fi', 'fi-fi', 'finnish'];\n","/**\n * @classdesc Canadian French Language Pack\n * @desc This class will used to translate tokens into the Canadian French language.\n * @namespace Languages.CanadianFrench\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.CanadianFrench\n */\nexport const dictionary = {\n 'years' : 'Ans',\n 'months' : 'Mois',\n 'days' : 'Jours',\n 'hours' : 'Heures',\n 'minutes' : 'Minutes',\n 'seconds' : 'Secondes'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.CanadianFrench\n */\nexport const aliases = ['fr', 'fr-ca', 'french'];\n","/**\n * @classdesc Hebrew Language Pack\n * @desc This class will used to translate tokens into the Hebrew language.\n * @namespace Languages.Hebrew\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Hebrew\n */\nexport const dictionary = {\n\t'years' : 'שנים',\n\t'months' : 'חודש',\n\t'days' : 'ימים',\n\t'hours' : 'שעות',\n\t'minutes' : 'דקות',\n\t'seconds' : 'שניות'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Hebrew\n */\nexport const aliases = ['il', 'he-il', 'hebrew'];\n","/**\n * @classdesc Hungarian Language Pack\n * @desc This class will used to translate tokens into the Hungarian language.\n * @namespace Languages.Hungarian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Hungarian\n */\nexport const dictionary = {\n\t'years' : 'Év',\n 'months' : 'Hónap',\n 'days' : 'Nap',\n 'hours' : 'Óra',\n 'minutes' : 'Perc',\n 'seconds' : 'Másodperc'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Hungarian\n */\nexport const aliases = ['hu', 'hu-hu', 'hungarian'];\n","/**\n * @classdesc Italian Language Pack\n * @desc This class will used to translate tokens into the Italian language.\n * @namespace Languages.Italian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Italian\n */\nexport const dictionary = {\n\t'years' : 'Anni',\n\t'months' : 'Mesi',\n\t'days' : 'Giorni',\n\t'hours' : 'Ore',\n\t'minutes' : 'Minuti',\n\t'seconds' : 'Secondi'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Italian\n */\nexport const aliases = ['da', 'da-dk', 'danish'];\n","/**\n * @classdesc Japanese Language Pack\n * @desc This class will used to translate tokens into the Japanese language.\n * @namespace Languages.Japanese\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Japanese\n */\nexport const dictionary = {\n\t'years' : '年',\n\t'months' : '月',\n\t'days' : '日',\n\t'hours' : '時',\n\t'minutes' : '分',\n\t'seconds' : '秒'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Japanese\n */\nexport const aliases = ['jp', 'ja-jp', 'japanese'];\n","/**\n * @classdesc Korean Language Pack\n * @desc This class will used to translate tokens into the Korean language.\n * @namespace Languages.Korean\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Korean\n */\nexport const dictionary = {\n\t'years' : '년',\n\t'months' : '월',\n\t'days' : '일',\n\t'hours' : '시',\n\t'minutes' : '분',\n\t'seconds' : '초'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Korean\n */\nexport const aliases = ['ko', 'ko-kr', 'korean'];\n","/**\n * @classdesc Latvian Language Pack\n * @desc This class will used to translate tokens into the Latvian language.\n * @namespace Languages.Latvian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Latvian\n */\nexport const dictionary = {\n 'years' : 'Gadi',\n 'months' : 'Mēneši',\n 'days' : 'Dienas',\n 'hours' : 'Stundas',\n 'minutes' : 'Minūtes',\n 'seconds' : 'Sekundes'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Latvian\n */\nexport const aliases = ['lv', 'lv-lv', 'latvian'];\n","/**\n * @classdesc Dutch Language Pack\n * @desc This class will used to translate tokens into the Dutch language.\n * @namespace Languages.Dutch\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Dutch\n */\nexport const dictionary = {\n 'years' : 'Jaren',\n 'months' : 'Maanden',\n 'days' : 'Dagen',\n 'hours' : 'Uren',\n 'minutes' : 'Minuten',\n 'seconds' : 'Seconden'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Dutch\n */\nexport const aliases = ['nl', 'nl-be', 'dutch'];\n","/**\n * @classdesc Norwegian-Bokmål Language Pack\n * @desc This class will used to translate tokens into the Norwegian-Bokmål language.\n * @namespace Languages.Norwegian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Norwegian\n */\nexport const dictionary = {\n\t'years' : 'År',\n\t'months' : 'Måneder',\n\t'days' : 'Dager',\n\t'hours' : 'Timer',\n\t'minutes' : 'Minutter',\n\t'seconds' : 'Sekunder'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Norwegian\n */\nexport const aliases = ['no', 'nb', 'no-nb', 'norwegian'];\n","/**\n * @classdesc Polish Language Pack\n * @desc This class will used to translate tokens into the Polish language.\n * @namespace Languages.Polish\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Polish\n */\nexport const dictionary = {\n\t'years' : 'Lat',\n\t'months' : 'Miesięcy',\n\t'days' : 'Dni',\n\t'hours' : 'Godziny',\n\t'minutes' : 'Minuty',\n\t'seconds' : 'Sekundy'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Polish\n */\nexport const aliases = ['pl', 'pl-pl', 'polish'];\n","/**\n * @classdesc Portuguese Language Pack\n * @desc This class will used to translate tokens into the Portuguese language.\n * @namespace Languages.Portuguese\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Portuguese\n */\nexport const dictionary = {\n\t'years' : 'Anos',\n\t'months' : 'Meses',\n\t'days' : 'Dias',\n\t'hours' : 'Horas',\n\t'minutes' : 'Minutos',\n\t'seconds' : 'Segundos'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Portuguese\n */\nexport const aliases = ['pt', 'pt-br', 'portuguese'];\n","/**\n * @classdesc Romanian Language Pack\n * @desc This class will used to translate tokens into the Romanian language.\n * @namespace Languages.Romanian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Romanian\n */\nexport const dictionary = {\n\t'years': 'Ani',\n\t'months': 'Luni',\n\t'days': 'Zile',\n\t'hours': 'Ore',\n\t'minutes': 'Minute',\n\t'seconds': 'sSecunde'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Romanian\n */\nexport const aliases = ['ro', 'ro-ro', 'romana'];\n","/**\n * @classdesc Russian Language Pack\n * @desc This class will used to translate tokens into the Russian language.\n * @namespace Languages.Russian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Russian\n */\nexport const dictionary = {\n 'years' : 'лет',\n 'months' : 'месяцев',\n 'days' : 'дней',\n 'hours' : 'часов',\n 'minutes' : 'минут',\n 'seconds' : 'секунд'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Russian\n */\nexport const aliases = ['ru', 'ru-ru', 'russian'];\n","/**\n * @classdesc Slovak Language Pack\n * @desc This class will used to translate tokens into the Slovak language.\n * @namespace Languages.Slovak\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Slovak\n */\nexport const dictionary = {\n\t'years' : 'Roky',\n\t'months' : 'Mesiace',\n\t'days' : 'Dni',\n\t'hours' : 'Hodiny',\n\t'minutes' : 'Minúty',\n\t'seconds' : 'Sekundy'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Slovak\n */\nexport const aliases = ['sk', 'sk-sk', 'slovak'];\n","/**\n * @classdesc Swedish Language Pack\n * @desc This class will used to translate tokens into the Swedish language.\n * @namespace Languages.Swedish\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Swedish\n */\nexport const dictionary = {\n\t'years' : 'År',\n\t'months' : 'Månader',\n\t'days' : 'Dagar',\n\t'hours' : 'Timmar',\n\t'minutes' : 'Minuter',\n\t'seconds' : 'Sekunder'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Swedish\n */\nexport const aliases = ['sv', 'sv-se', 'swedish'];\n","/**\n * @classdesc Thai Language Pack\n * @desc This class will used to translate tokens into the Thai language.\n * @namespace Languages.Thai\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Thai\n */\nexport const dictionary = {\n\t'years' : 'ปี',\n\t'months' : 'เดือน',\n\t'days' : 'วัน',\n\t'hours' : 'ชั่วโมง',\n\t'minutes' : 'นาที',\n\t'seconds' : 'วินาที'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Thai\n */\nexport const aliases = ['th', 'th-th', 'thai'];\n","/**\n * @classdesc Turkish Language Pack\n * @desc This class will used to translate tokens into the Turkish language.\n * @namespace Languages.Turkish\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Turkish\n */\nexport const dictionary = {\n\t'years' : 'Yıl',\n\t'months' : 'Ay',\n\t'days' : 'Gün',\n\t'hours' : 'Saat',\n\t'minutes' : 'Dakika',\n\t'seconds' : 'Saniye'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Turkish\n */\nexport const aliases = ['tr', 'tr-tr', 'turkish'];\n","/**\n * @classdesc Ukrainian Language Pack\n * @desc This class will used to translate tokens into the Ukrainian language.\n * @namespace Languages.Ukrainian\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Ukrainian\n */\nexport const dictionary = {\n 'years' : 'роки',\n 'months' : 'місяці',\n 'days' : 'дні',\n 'hours' : 'години',\n 'minutes' : 'хвилини',\n 'seconds' : 'секунди'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Ukrainian\n */\nexport const aliases = ['ua', 'ua-ua', 'ukraine'];\n","/**\n * @classdesc Vietnamese Language Pack\n * @desc This class will used to translate tokens into the Vietnamese language.\n * @namespace Languages.Vietnamese\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Vietnamese\n */\nexport const dictionary = {\n\t'years' : 'Năm',\n\t'months' : 'Tháng',\n\t'days' : 'Ngày',\n\t'hours' : 'Giờ',\n\t'minutes' : 'Phút',\n\t'seconds' : 'Giây'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Vietnamese\n */\nexport const aliases = ['vn', 'vn-vn', 'vietnamese'];\n","/**\n * @classdesc Chinese Language Pack\n * @desc This class will used to translate tokens into the Chinese language.\n * @namespace Languages.Chinese\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.Chinese\n */\nexport const dictionary = {\n\t'years' : '年',\n\t'months' : '月',\n\t'days' : '日',\n\t'hours' : '时',\n\t'minutes' : '分',\n\t'seconds' : '秒'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.Chinese\n */\nexport const aliases = ['zh', 'zh-cn', 'chinese'];\n","/**\n * @classdesc Traditional Chinese Language Pack\n * @desc This class will used to translate tokens into the Traditional Chinese language.\n * @namespace Languages.TraditionalChinese\n */\n\n/**\n * @constant dictionary\n * @type {object}\n * @memberof Languages.TraditionalChinese\n */\nexport const dictionary = {\n\t'years' : '年',\n\t'months' : '月',\n\t'days' : '日',\n\t'hours' : '時',\n\t'minutes' : '分',\n\t'seconds' : '秒'\n};\n\n/**\n * @constant aliases\n * @type {array}\n * @memberof Languages.TraditionalChinese\n */\nexport const aliases = ['zh-tw'];\n","import Component from './Component';\nimport language from '../Helpers/Language';\nimport validate from '../Helpers/Validate';\nimport translate from '../Helpers/Translate';\nimport { isString } from '../Helpers/Functions';\nimport ConsoleMessages from '../Config/ConsoleMessages';\nimport { error, kebabCase } from '../Helpers/Functions';\nimport { swap, createElement } from '../Helpers/Template';\n\nexport default class DomComponent extends Component {\n\n /**\n * An abstract class that all other DOM components can extend.\n *\n * @class DomComponent\n * @extends Component\n * @param {(object|undefined)} [attributes] - The instance attributes.\n */\n constructor(attributes) {\n super(Object.assign({\n parent: null\n }, attributes));\n\n if(!this.theme) {\n error(`${this.name} does not have a theme defined.`);\n }\n\n if(!this.language) {\n error(`${this.name} does not have a language defined.`);\n }\n\n\t\tif(!this.theme[this.name]) {\n throw new Error(\n `${this.name} cannot be rendered because it has no template.`\n );\n }\n }\n\n /**\n * The `className` attribute. Used for CSS.\n *\n * @type {string}\n */\n get className() {\n return kebabCase(this.constructor.defineName());\n }\n\n /**\n * The `el` attribute.\n *\n * @type {HTMLElement}\n */\n get el() {\n return this.$el;\n }\n\n set el(value) {\n if(!validate(value, null, HTMLElement)) {\n error(ConsoleMessages.element);\n }\n\n this.$el = value;\n }\n\n /**\n * The `parent` attribute. Parent is set when `DomComponent` instances are\n * mounted.\n *\n * @type {DomComponent}\n */\n get parent() {\n return this.$parent;\n }\n\n set parent(parent) {\n this.$parent = parent;\n }\n\n /**\n * The `theme` attribute.\n *\n * @type {object}\n */\n get theme() {\n return this.$theme;\n }\n\n set theme(value) {\n if(!validate(value, 'object')) {\n error(ConsoleMessages.value);\n }\n\n this.$theme = value;\n }\n\n /**\n * Get the language attribute.\n *\n * @type {object}\n */\n get language() {\n return this.$language;\n }\n\n set language(value) {\n if(isString(value)) {\n value = language(value);\n }\n\n if(!validate(value, 'object')) {\n error(ConsoleMessages.language);\n }\n\n this.$language = value;\n }\n\n /**\n * Translate a string.\n *\n * @param {string} string - The string to translate.\n * @return {string} - The translated string. If no tranlation found, the\n * untranslated string is returned.\n */\n translate(string) {\n return translate(string, this.language);\n }\n\n /**\n * Alias to translate(string);\n *\n * @alias DomComponent.translate\n */\n t(string) {\n return this.translate(string);\n }\n\n /**\n * Render the DOM component.\n *\n * @return {HTMLElement} - The `el` attribute.\n */\n\trender() {\n const el = createElement('div', {\n class: this.className === 'flip-clock' ? this.className : 'flip-clock-' + this.className\n });\n\n this.theme[this.name](el, this);\n\n if(!this.el) {\n this.el = el;\n }\n else if(this.el.innerHTML !== el.innerHTML) {\n this.el = swap(el, this.el);\n }\n\n return this.el;\n\t}\n\n /**\n * Mount a DOM component to a parent node.\n *\n * @param {HTMLElement} parent - The parent DOM node.\n * @param {(false|HTMLElement)} [before=false] - If `false`, element is\n * appended to the parent node. If an instance of an `HTMLElement`,\n * the component will be inserted before the specified element.\n * @return {HTMLElement} - The `el` attribute.\n */\n mount(parent, before = false) {\n this.render();\n this.parent = parent;\n\n if(!before) {\n this.parent.appendChild(this.el);\n }\n else {\n this.parent.insertBefore(this.el, before);\n }\n\n return this.el;\n }\n\n}\n","import DomComponent from './DomComponent';\n\n/**\n * Create a new `Divider` instance.\n *\n * The purpose of this class is to return a unique class name so the theme can\n * render it appropriately, since each `DomComponent` can receive its own template\n * from the theme.\n *\n * @class Divider\n * @extends DomComponent\n * @param {(object|undefined)} [attributes] - The instance attributes.\n */\nexport default class Divider extends DomComponent {\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'Divider';\n }\n\n}\n","import DomComponent from './DomComponent';\nimport { isObject } from '../Helpers/Functions';\n\nexport default class ListItem extends DomComponent {\n\n /**\n * This class is used to represent a single digits in a `List`.\n *\n * @class ListItem\n * @extends DomComponent\n * @param {(Number|String)} value - The value of the `ListItem`.\n * @param {object|undefined} [attributes] - The instance attributes.\n */\n constructor(value, attributes) {\n super(Object.assign({\n value: value\n }, isObject(value) ? value : null, attributes));\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'ListItem';\n }\n\n}\n","import Divider from './Divider';\nimport ListItem from './ListItem';\nimport DomComponent from './DomComponent';\nimport { next, prev, } from '../Helpers/Value';\nimport { isObject, } from '../Helpers/Functions';\n\nexport default class List extends DomComponent {\n\n /**\n * This class is used to add a digit to the clock face. This class is called\n * `List` because it contains a list of `ListItem`'s which are used to\n * create flip effects. In the context of FlipClock.js a `List` represents\n * one single digit.\n *\n * @class List\n * @extends DomComponent\n * @param {Number|String|Object} label - The active value. If an object, it\n * is assumed that it is the instance attributes.\n * @param {object|undefined} [attributes] - The instance attributes.\n */\n constructor(value, attributes) {\n super(Object.assign({\n value: value,\n items: [],\n }, isObject(value) ? value : null, attributes));\n }\n\n /**\n * Get the `value` attribute.\n *\n * @type {(Number|String)}\n */\n get value() {\n return this.$value;\n }\n set value(value) {\n this.$value = value;\n }\n\n /**\n * Get the `items` attribute.\n *\n * @type {(Number|String)}\n */\n get items() {\n return this.$items;\n }\n\n set items(value) {\n this.$items = value;\n }\n\n /**\n * Helper method to instantiate a new `ListItem`.\n *\n * @param {(Number|String)} value - The `ListItem` value.\n * @param {(Object|undefined)} [attributes] - The instance attributes.\n * @return {ListItem} - The instantiated `ListItem`.\n */\n createListItem(value, attributes) {\n const item = new ListItem(value, Object.assign({\n theme: this.theme,\n language: this.language\n }, attributes));\n\n this.$items.push(item);\n\n return item;\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'List';\n }\n\n}\n","import DomComponent from './DomComponent';\nimport { isObject, isArray } from '../Helpers/Functions';\n\nexport default class Group extends DomComponent {\n\n /**\n * This class is used to group values within a clock face. How the groups\n * are displayed is determined by the theme.\n *\n * @class Group\n * @extends DomComponent\n * @param {Array|Object} items - An array `List` instances or an object of\n * attributes. If not an array, assumed to be the attributes.\n * @param {object|undefined} [attributes] - The instance attributes.\n */\n constructor(items, attributes) {\n super(Object.assign({\n items: isArray(items) ? items : []\n }, (isObject(items) ? items : null), attributes));\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'Group';\n }\n\n}\n","import DomComponent from './DomComponent';\nimport { isObject } from '../Helpers/Functions';\n\nexport default class Label extends DomComponent {\n\n /**\n * This class is used to add a label to the clock face.\n *\n * @class Label\n * @extends DomComponent\n * @param {Number|String|Object} label - The label attribute. If an object,\n * it is assumed that it is the instance attributes.\n * @param {object|undefined} [attributes] - The instance attributes.\n */\n constructor(label, attributes) {\n super(Object.assign({\n label: label\n }, (isObject(label) ? label : null), attributes));\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'Label';\n }\n\n}\n","import Component from './Component';\nimport { isObject, isNumber, callback } from '../Helpers/Functions';\n\nexport default class Timer extends Component {\n\n /**\n * Create a new `Timer` instance.\n *\n * @class Timer\n * @extends Component\n * @param {(Object|Number)} interval - The interval passed as a `Number`,\n * or can set the attribute of the class with an object.\n */\n constructor(interval) {\n super(Object.assign({\n count: 0,\n handle: null,\n started: null,\n running: false,\n interval: isNumber(interval) ? interval : null,\n }, isObject(interval) ? interval : null));\n }\n\n /**\n * The `elapsed` attribute.\n *\n * @type {Number}\n */\n get elapsed() {\n return !this.lastLoop ? 0 : this.lastLoop - (\n this.started ? this.started.getTime() : new Date().getTime()\n );\n }\n\n /**\n * The `isRunning` attribute.\n *\n * @type {boolean}\n */\n get isRunning() {\n return this.running === true;\n }\n\n /**\n * The `isStopped` attribute.\n *\n * @type {boolean}\n */\n get isStopped() {\n return this.running === false;\n }\n\n /**\n * Resets the timer.\n *\n * @param {(Function|undefined)} fn - The interval callback.\n * @return {Timer} - The `Timer` instance.\n */\n reset(fn) {\n this.stop(() => {\n this.count = 0;\n this.start(() => callback.call(this, fn));\n this.emit('reset');\n });\n\n return this;\n }\n\n /**\n * Starts the timer.\n *\n * @param {Function} fn - The interval callback.\n * @return {Timer} - The `Timer` instance.\n */\n start(fn) {\n this.started = new Date;\n this.lastLoop = Date.now();\n this.running = true;\n this.emit('start');\n\n const loop = () => {\n if(Date.now() - this.lastLoop >= this.interval) {\n callback.call(this, fn);\n this.lastLoop = Date.now();\n this.emit('interval');\n this.count++;\n }\n\n this.handle = window.requestAnimationFrame(loop);\n\n return this;\n };\n\n return loop();\n }\n\n /**\n * Stops the timer.\n *\n * @param {Function} fn - The stop callback.\n * @return {Timer} - The `Timer` instance.\n */\n stop(fn) {\n if(this.isRunning) {\n setTimeout(() => {\n window.cancelAnimationFrame(this.handle);\n\n this.running = false;\n\n callback.call(this, fn);\n\n this.emit('stop');\n });\n }\n\n return this;\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'Timer';\n }\n}\n","import Face from '../Components/Face';\n\n/**\n * @classdesc This face is designed to increment and decrement numberic values,\n * not `Date` objects.\n * @extends Face\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class Counter extends Face {\n\n increment(instance, value = 1) {\n instance.value = this.value.value + value;\n }\n\n decrement(instance, value = 1) {\n instance.value = this.value.value - value;\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'Counter';\n }\n}\n","import Face from '../Components/Face';\nimport { noop, round, isNull, isUndefined, isNumber, callback } from '../Helpers/Functions';\n\n/**\n * @classdesc This face is meant to display a clock that shows minutes, and\n * seconds.\n * @extends Face\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class MinuteCounter extends Face {\n\n defaultDataType() {\n return Date;\n }\n\n defaultAttributes() {\n return {\n showSeconds: true,\n showLabels: true\n };\n }\n\n shouldStop(instance) {\n if(isNull(instance.stopAt) || isUndefined(instance.stopAt)) {\n return false;\n }\n\n if(this.stopAt instanceof Date) {\n return this.countdown ?\n this.stopAt.getTime() >= this.value.value.getTime():\n this.stopAt.getTime() <= this.value.value.getTime();\n }\n else if(isNumber(this.stopAt)) {\n const diff = Math.floor((this.value.value.getTime() - this.originalValue.getTime()) / 1000);\n\n return this.countdown ?\n this.stopAt >= diff:\n this.stopAt <= diff;\n }\n\n throw new Error(`the stopAt property must be an instance of Date or Number.`);\n }\n\n increment(instance, value = 0) {\n instance.value = new Date(this.value.value.getTime() + value + (new Date().getTime() - instance.timer.lastLoop));\n }\n\n decrement(instance, value = 0) {\n instance.value = new Date(this.value.value.getTime() - value - (new Date().getTime() - instance.timer.lastLoop));\n }\n\n format(instance, value) {\n const started = instance.timer.isRunning ? instance.timer.started : new Date(Date.now() - 50);\n\n return [\n [this.getMinutes(value, started)],\n this.showSeconds ? [this.getSeconds(value, started)] : null\n ].filter(noop);\n }\n\n getMinutes(a, b) {\n return round(this.getTotalSeconds(a, b) / 60);\n }\n\n getSeconds(a, b) {\n const totalSeconds = this.getTotalSeconds(a, b);\n\n return Math.abs(Math.ceil(totalSeconds === 60 ? 0 : totalSeconds % 60));\n }\n\n getTotalSeconds(a, b) {\n return a.getTime() === b.getTime() ? 0 : Math.round((a.getTime() - b.getTime()) / 1000);\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'MinuteCounter';\n }\n}\n","import MinuteCounter from './MinuteCounter';\n\n/**\n * @classdesc This face is meant to display a clock that shows\n * hours, minutes, and seconds.\n * @extends Face\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class HourCounter extends MinuteCounter {\n\n format(instance, value) {\n const now = !instance.timer.started ? new Date : value;\n const originalValue = instance.originalValue || value;\n const a = !this.countdown ? now : originalValue;\n const b = !this.countdown ? originalValue : now;\n\n const data = [\n [this.getHours(a, b)],\n [this.getMinutes(a, b)]\n ];\n\n if(this.showSeconds) {\n data.push([this.getSeconds(a, b)]);\n }\n\n return data;\n }\n\n getMinutes(a, b) {\n return Math.abs(super.getMinutes(a, b) % 60);\n }\n\n getHours(a, b) {\n return Math.floor(this.getTotalSeconds(a, b) / 60 / 60);\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'HourCounter';\n }\n}\n","import HourCounter from './HourCounter';\n\n/**\n * @classdesc This face is meant to display a clock that shows days, hours,\n * minutes, and seconds.\n * @extends HourCounter\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class DayCounter extends HourCounter {\n\n format(instance, value) {\n const now = !instance.started ? new Date : value;\n const originalValue = instance.originalValue || value;\n const a = !this.countdown ? now : originalValue;\n const b = !this.countdown ? originalValue : now;\n\n const data = [\n [this.getDays(a, b)],\n [this.getHours(a, b)],\n [this.getMinutes(a, b)]\n ];\n\n if(this.showSeconds) {\n data.push([this.getSeconds(a, b)]);\n }\n\n return data;\n }\n\n getDays(a, b) {\n return Math.floor(this.getTotalSeconds(a, b) / 60 / 60 / 24);\n }\n\n getHours(a, b) {\n return Math.abs(super.getHours(a, b) % 24);\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'DayCounter';\n }\n}\n","import Face from '../Components/Face';\nimport { callback } from '../Helpers/Functions';\n\n/**\n * @classdesc This face shows the current time in twenty-four hour format.\n * @extends Face\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class TwentyFourHourClock extends Face {\n\n defaultDataType() {\n return Date;\n }\n\n defaultValue() {\n return new Date;\n }\n\n defaultAttributes() {\n return {\n showSeconds: true,\n showLabels: false\n };\n }\n\n format(instance, value) {\n if(!value) {\n value = new Date;\n }\n\n const groups = [\n [value.getHours()],\n [value.getMinutes()]\n ];\n\n if(this.showSeconds) {\n groups.push([value.getSeconds()]);\n }\n\n return groups;\n }\n\n increment(instance, offset = 0) {\n instance.value = new Date(this.value.value.getTime() + offset + (new Date().getTime() - instance.timer.lastLoop));\n }\n\n decrement(instance, offset = 0) {\n instance.value = new Date(this.value.value.getTime() - offset - (new Date().getTime() - instance.timer.lastLoop));\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'TwentyFourHourClock';\n }\n}\n","import TwentyFourHourClock from './TwentyFourHourClock';\n\n/**\n * @classdesc This face shows the current time in twelve hour format, with AM\n * and PM.\n * @extends Face\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class TwelveHourClock extends TwentyFourHourClock {\n\n defaultAttributes() {\n return {\n showLabels: false,\n showSeconds: true,\n showMeridium: true\n };\n }\n\n format(instance, value) {\n if(!value) {\n value = new Date;\n }\n\n const hours = value.getHours();\n\t\tconst groups = [\n\t\t\thours > 12 ? hours - 12 : (hours === 0 ? 12 : hours),\n\t\t\tvalue.getMinutes()\n\t\t];\n\n this.meridium = hours > 12 ? 'pm' : 'am';\n\n\t\tif(this.showSeconds) {\n\t\t\tgroups.push(value.getSeconds());\n\t\t}\n\n\t\treturn groups;\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'TwelveHourClock';\n }\n}\n","import DayCounter from './DayCounter';\n\n/**\n * @classdesc This face is meant to display a clock that shows weeks, days,\n * hours, minutes, and seconds.\n * @extends Face\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class WeekCounter extends DayCounter {\n\n format(instance, value) {\n const now = !instance.timer.started ? new Date : value;\n const originalValue = instance.originalValue || value;\n const a = !this.countdown ? now : originalValue;\n const b = !this.countdown ? originalValue : now;\n\n const data = [\n [this.getWeeks(a, b)],\n [this.getDays(a, b)],\n [this.getHours(a, b)],\n [this.getMinutes(a, b)]\n ];\n\n if(this.showSeconds) {\n data.push([this.getSeconds(a, b)]);\n }\n\n return data;\n }\n\n getWeeks(a, b) {\n return Math.floor(this.getTotalSeconds(a, b) / 60 / 60 / 24 / 7);\n }\n\n getDays(a, b) {\n return Math.abs(super.getDays(a, b) % 7);\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'WeekCounter';\n }\n}\n","import WeekCounter from './WeekCounter';\n\n/**\n * @classdesc This face is meant to display a clock that shows years, weeks,\n * days, hours, minutes, and seconds.\n * @extends Face\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\n * of FaceValue, this argument is assumed to be the instance attributes.\n * @param {(object|undefined)} [attributes] - The instance attributes.\n * @memberof Faces\n */\nexport default class YearCounter extends WeekCounter {\n\n format(instance, value) {\n const now = !instance.timer.started ? new Date : value;\n const originalValue = instance.originalValue || value;\n const a = !this.countdown ? now : originalValue;\n const b = !this.countdown ? originalValue : now;\n\n const data = [\n [this.getYears(a, b)],\n [this.getWeeks(a, b)],\n [this.getDays(a, b)],\n [this.getHours(a, b)],\n [this.getMinutes(a, b)]\n ];\n\n if(this.showSeconds) {\n data.push([this.getSeconds(a, b)]);\n }\n\n return data;\n }\n\n getYears(a, b) {\n return Math.floor(Math.max(0, this.getTotalSeconds(a, b) / 60 / 60 / 24 / 7 / 52));\n }\n\n getWeeks(a, b) {\n return Math.abs(super.getWeeks(a, b) % 52);\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'YearCounter';\n }\n}\n","import { Counter } from '../Faces';\nimport { Original } from '../Themes';\nimport { English } from '../Languages';\n\n/**\n * @alias DefaultValues\n * @type {object}\n * @memberof module:Config/DefaultValues\n */\nexport default {\n face: Counter,\n theme: Original,\n language: English\n};\n","import Divider from './Divider';\nimport FlipClock from './FlipClock';\nimport Group from './Group';\nimport Label from './Label';\nimport List from './List';\nimport ListItem from './ListItem';\nimport * as faces from './Faces';\n\nexport default {\n Divider,\n FlipClock,\n Group,\n Label,\n List,\n ListItem,\n faces\n};\n","import Face from './Face';\nimport List from './List';\nimport Group from './Group';\nimport Label from './Label';\nimport Timer from './Timer';\nimport Divider from './Divider';\nimport * as Faces from '../Faces';\nimport FaceValue from './FaceValue';\nimport DomComponent from './DomComponent';\nimport validate from '../Helpers/Validate';\nimport DefaultValues from '../Config/DefaultValues';\nimport ConsoleMessages from '../Config/ConsoleMessages';\nimport { flatten, isNull, isString, isObject, isUndefined, isFunction, error } from '../Helpers/Functions';\n\nexport default class FlipClock extends DomComponent {\n \n /**\n * Create a new `FlipClock` instance.\n *\n * @class FlipClock\n * @extends DomComponent\n * @param {HTMLElement} el - The HTML element used to bind clock DOM node.\n * @param {*} value - The value that is passed to the clock face.\n * @param {object|undefined} attributes - {@link FlipClock.Options} passed an object with key/value.\n */\n \n /**\n * @namespace FlipClock.Options\n * @classdesc An object of key/value pairs that will be used to set the attributes.\n * \n * ##### Example:\n * \n * {\n * face: 'DayCounter',\n * language: 'es',\n * timer: Timer.make(500)\n * }\n * \n * @property {string|Face} [face={@link Faces.DayCounter}] - The clock's {@link Face} instance.\n * @property {number} [interval=1000] - The clock's interval rate (in milliseconds).\n * @property {object} [theme={@link Themes.Original}] - The clock's theme.\n * @property {string|object} [language={@link Languages.English}] - The clock's language.\n * @property {Timer} [timer={@link Timer}] - The clock's timer.\n */\n \n constructor(el, value, attributes) {\n if(!validate(el, HTMLElement)) {\n error(ConsoleMessages.element);\n }\n\n if(isObject(value) && !attributes) {\n attributes = value;\n value = undefined;\n }\n\n const face = attributes.face || DefaultValues.face;\n\n delete attributes.face;\n\n super(Object.assign({\n originalValue: value,\n theme: DefaultValues.theme,\n language: DefaultValues.language,\n timer: Timer.make(attributes.interval || 1000),\n }, attributes));\n\n if(!this.face) {\n this.face = face;\n }\n\n this.mount(el);\n }\n\n /**\n * The clock `Face`.\n *\n * @type {Face}\n */\n get face() {\n return this.$face;\n }\n\n set face(value) {\n if(!validate(value, [Face, 'string', 'function'])) {\n error(ConsoleMessages.face);\n }\n\n this.$face = (Faces[value] || value).make(Object.assign(this.getPublicAttributes(), {\n originalValue: this.face ? this.face.originalValue : undefined\n }));\n\n this.$face.initialized(this);\n\n if(this.value) {\n this.$face.value = this.face.createFaceValue(this, this.value.value);\n }\n else if(!this.value) {\n this.value = this.originalValue;\n }\n\n this.el && this.render();\n }\n\n /**\n * The `stopAt` attribute.\n *\n * @type {*}\n */\n get stopAt() {\n return isFunction(this.$stopAt) ? this.$stopAt(this) : this.$stopAt;\n }\n\n set stopAt(value) {\n this.$stopAt = value;\n }\n\n /**\n * The `timer` instance.\n *\n * @type {Timer}\n */\n get timer() {\n return this.$timer;\n }\n\n set timer(timer) {\n if(!validate(timer, Timer)) {\n error(ConsoleMessages.timer);\n }\n\n this.$timer = timer;\n }\n\n /**\n * Helper method to The clock's `FaceValue` instance.\n *\n * @type {FaceValue|null}\n */\n get value() {\n return this.face ? this.face.value : null;\n }\n\n set value(value) {\n if(!this.face) {\n throw new Error('A face must be set before setting a value.');\n }\n\n if(value instanceof FaceValue) {\n this.face.value = value;\n }\n else if(this.value) {\n this.face.value = this.face.value.clone(value);\n }\n else {\n this.face.value = this.face.createFaceValue(this, value);\n }\n\n this.el && this.render();\n }\n\n /**\n * The `originalValue` attribute.\n *\n * @type {*}\n */\n get originalValue() {\n if(isFunction(this.$originalValue) && !this.$originalValue.name) {\n return this.$originalValue();\n }\n\n if(!isUndefined(this.$originalValue) && !isNull(this.$originalValue)) {\n return this.$originalValue;\n }\n\n return this.face ? this.face.defaultValue() : undefined;\n }\n\n set originalValue(value) {\n this.$originalValue = value;\n }\n\n /**\n * Mount the clock to the parent DOM element.\n *\n * @param {HTMLElement} el - The parent `HTMLElement`.\n * @return {FlipClock} - The `FlipClock` instance.\n */\n mount(el) {\n super.mount(el);\n\n this.face.mounted(this);\n\n return this;\n }\n\n /**\n * Render the clock's DOM nodes.\n *\n * @return {HTMLElement} - The parent `HTMLElement`.\n */\n render() {\n // Call the parent render function\n super.render();\n\n // Check to see if the face has a render function defined in the theme.\n // This allows a face to completely re-render or add to the theme.\n // This allows face specific interfaces for a theme.\n if(this.theme.faces[this.face.name]) {\n this.theme.faces[this.face.name](this.el, this);\n }\n\n // Pass the clock instance to the rendered() function on the face.\n // This allows global modifications to the rendered templates not\n // theme specific.\n this.face.rendered(this);\n\n // Return the rendered `HTMLElement`.\n return this.el;\n }\n\n /**\n * Start the clock.\n *\n * @param {Function} fn - The interval callback.\n * @return {FlipClock} - The `FlipClock` instance.\n */\n start(fn) {\n if(!this.timer.started) {\n this.value = this.originalValue;\n }\n\n isUndefined(this.face.stopAt) && (this.face.stopAt = this.stopAt);\n isUndefined(this.face.originalValue) && (this.face.originalValue = this.originalValue);\n\n this.timer.start(() => {\n this.face.interval(this, fn);\n });\n\n this.face.started(this);\n\n return this.emit('start');\n }\n\n /**\n * Stop the clock.\n *\n * @param {Function} fn - The stop callback.\n * @return {FlipClock} - The `FlipClock` instance.\n */\n stop(fn) {\n this.timer.stop(fn);\n this.face.stopped(this);\n\n return this.emit('stop');\n }\n\n /**\n * Reset the clock to the original value.\n *\n * @param {Function} fn - The interval callback.\n * @return {FlipClock} - The `FlipClock` instance.\n */\n reset(fn) {\n this.value = this.originalValue;\n this.timer.reset(() => this.interval(this, fn));\n this.face.reset(this);\n\n return this.emit('reset');\n }\n\n /**\n * Helper method to increment the clock's value.\n *\n * @param {*|undefined} value - Increment the clock by the specified value.\n * If no value is passed, then the default increment is determined by\n * the Face, which is usually `1`.\n * @return {FlipClock} - The `FlipClock` instance.\n */\n increment(value) {\n this.face.increment(this, value);\n\n return this;\n }\n\n /**\n * Helper method to decrement the clock's value.\n *\n * @param {*|undefined} value - Decrement the clock by the specified value.\n * If no value is passed, then the default decrement is determined by\n * the `Face`, which is usually `1`.\n * @return {FlipClock} - The `FlipClock` instance.\n */\n decrement(value) {\n this.face.decrement(this, value);\n\n return this;\n }\n\n /**\n * Helper method to instantiate a new `Divider`.\n *\n * @param {object|undefined} [attributes] - The attributes passed to the\n * `Divider` instance.\n * @return {Divider} - The instantiated Divider.\n */\n createDivider(attributes) {\n return Divider.make(Object.assign({\n theme: this.theme,\n language: this.language\n }, attributes));\n }\n\n /**\n * Helper method to instantiate a new `List`.\n *\n * @param {*} value - The `List` value.\n * @param {object|undefined} [attributes] - The attributes passed to the\n * `List` instance.\n * @return {List} - The instantiated `List`.\n */\n createList(value, attributes) {\n return List.make(value, Object.assign({\n theme: this.theme,\n language: this.language\n }, attributes));\n }\n\n /**\n * Helper method to instantiate a new `Label`.\n *\n * @param {*} value - The `Label` value.\n * @param {object|undefined} [attributes] - The attributes passed to the\n * `Label` instance.\n * @return {Label} - The instantiated `Label`.\n */\n createLabel(value, attributes) {\n return Label.make(value, Object.assign({\n theme: this.theme,\n language: this.language\n }, attributes));\n }\n\n /**\n * Helper method to instantiate a new `Group`.\n *\n * @param {array} items - An array of `List` items to group.\n * @param {Group|undefined} [attributes] - The attributes passed to the\n * `Group` instance.\n * @return {Group} - The instantiated `Group`.\n */\n createGroup(items, attributes) {\n return Group.make(items, Object.assign({\n theme: this.theme,\n language: this.language\n }, attributes));\n }\n\n /**\n * The `defaults` attribute.\n *\n * @type {object}\n */\n static get defaults() {\n return DefaultValues;\n }\n\n /**\n * Define the name of the class.\n *\n * @return {string}\n */\n static defineName() {\n return 'FlipClock';\n }\n\n /**\n * Helper method to set the default `Face` value.\n *\n * @param {Face} value - The default `Face` class.This should be a\n * constructor.\n * @return {void}\n */\n static setDefaultFace(value) {\n if(!validate(value, Face)) {\n error(ConsoleMessages.face);\n }\n\n DefaultValues.face = value;\n }\n\n /**\n * Helper method to set the default theme.\n *\n * @param {object} value - The default theme.\n * @return {void}\n */\n static setDefaultTheme(value) {\n if(!validate(value, 'object')) {\n error(ConsoleMessages.theme);\n }\n\n DefaultValues.theme = value;\n }\n\n /**\n * Helper method to set the default language.\n *\n * @param {object} value - The default language.\n * @return {void}\n */\n static setDefaultLanguage(value) {\n if(!validate(value, 'object')) {\n error(ConsoleMessages.language);\n }\n\n DefaultValues.language = value;\n }\n\n}\n"],"names":["error","string","Error","callback","fn","isFunction","args","call","this","round","value","isNegativeZero","isNegative","Math","ceil","floor","toString","noop","isUndefined","isNull","chain","before","after","concatMap","x","map","reduce","y","concat","flatten","deepFlatten","Array","isArray","length","Infinity","isConstructor","Function","name","isString","isObject","type","isNumber","isNaN","kebabCase","replace","toLowerCase","digitize","options","prepend","number","prependLeadingZero","split","Object","assign","minimumDigits","digits","arr","min","i","unshift","format","parseFloat","findRange","char","RANGES","code","charCodeAt","max","stringFromCharCodeBy","String","fromCharCode","next","range","join","prev","validate","success","forEach","arg","_typeof","language","LANGUAGES","values","find","aliases","indexOf","translate","from","lang","dictionary","swap","subject","existing","parentNode","replaceChild","setAttributes","el","attributes","setAttribute","appendChildren","children","filter","child","HTMLElement","appendChild","createElement","document","innerHTML","instance","index","childNodes","querySelector","group","groupEl","querySelectorAll","lists","listValue","createList","domValue","countdown","animationRate","face","delay","createGroup","render","items","item","t","label","beforeValue","classList","add","style","animationDelay","animationDuration","createListItem","active","className","createDivider","mount","showSeconds","showLabels","createLabel","TwentyFourHourClock","showMeridium","meridium","parent","Component","events","key","event","apply","_this","push","_this2","off","on","hasOwnProperty","getOwnPropertyNames","_this3","getAttribute","keys","getAttributes","match","obj","_this4","constructor","defineName","$events","FaceValue","getPublicAttributes","$digits","$value","theme","date","element","faceValue","timer","Face","undefined","autoStart","defaultAttributes","defaultValue","decrement","increment","shouldStop","stop","emit","stopAt","amount","isStopped","window","requestAnimationFrame","start","make","defaultDataType","createFaceValue","$stopAt","$originalValue","DomComponent","insertBefore","$el","ConsoleMessages","$parent","$theme","$language","Divider","ListItem","List","$items","Group","Label","Timer","interval","count","handle","started","running","Date","lastLoop","now","loop","isRunning","setTimeout","cancelAnimationFrame","getTime","Counter","MinuteCounter","diff","originalValue","getMinutes","getSeconds","a","b","getTotalSeconds","totalSeconds","abs","HourCounter","data","getHours","_get","DayCounter","getDays","groups","offset","TwelveHourClock","hours","WeekCounter","getWeeks","YearCounter","getYears","FlipClock","faces","English","DefaultValues","mounted","rendered","stopped","reset","$face","Faces","initialized","$timer","clone"],"mappings":"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AW,KAAM,QAAS,oDCd1BK,SACA,eACA,cACA,aACA,gBACA,kBACA,WAQAL,GAAW,KAAM,QAAS,qDCd1BK,SACA,cACA,aACA,aACA,gBACA,kBACA,YAQAL,GAAW,KAAM,QAAS,qDCd1BK,SACA,aACA,WACA,YACA,eACA,gBACA,SAQAL,GAAW,KAAM,QAAS,qDCd1BK,SACA,gBACA,iBACA,eACA,iBACA,oBACA,YAQAL,GAAW,KAAM,QAAS,qDCd1BK,SACG,aACA,YACA,cACA,iBACA,kBACA,YAQHL,GAAW,KAAM,QAAS,oDCd1BK,SACA,cACA,YACA,aACA,eACA,eACA,SAQAL,GAAW,KAAM,QAAS,oDCd1BK,SACA,YACG,aACA,YACA,cACA,eACA,aAQHL,GAAW,KAAM,QAAS,uDCd1BK,SACA,cACA,YACA,eACA,cACA,iBACA,WAQAL,GAAW,KAAM,QAAS,oDCd1BK,SACA,WACA,SACA,UACA,YACA,YACA,KAQAL,GAAW,KAAM,QAAS,sDCd1BK,SACA,WACA,SACA,UACA,YACA,YACA,KAQAL,GAAW,KAAM,QAAS,oDCd1BK,SACG,cACA,cACA,eACA,kBACA,kBACA,YAQHL,GAAW,KAAM,QAAS,qDCd1BK,SACG,eACA,eACA,cACA,eACA,kBACA,YAQHL,IAAW,KAAM,QAAS,qDCd1BK,UACA,YACA,eACA,cACA,gBACA,mBACA,YAQAL,IAAW,KAAM,KAAM,QAAS,0DCdhCK,UACA,aACA,gBACA,YACA,kBACA,iBACA,WAQAL,IAAW,KAAM,QAAS,uDCd1BK,UACA,cACA,aACA,aACA,gBACA,kBACA,YAQAL,IAAW,KAAM,QAAS,2DCd1BK,UACH,aACC,YACF,aACC,cACE,iBACA,YAQCL,IAAW,KAAM,QAAS,uDCd1BK,UACG,aACA,eACA,aACA,gBACA,gBACA,UAQHL,IAAW,KAAM,QAAS,wDCd1BK,UACA,cACA,eACA,YACA,iBACA,iBACA,WAQAL,IAAW,KAAM,QAAS,uDCd1BK,UACA,YACA,eACA,cACA,iBACA,kBACA,YAQAL,IAAW,KAAM,QAAS,wDCd1BK,UACA,YACA,aACA,YACA,kBAC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"} \ No newline at end of file +{"version":3,"file":"flipclock.min.js","sources":["../src/js/Helpers/Functions.js","../src/js/Helpers/Digitize.js","../src/js/Helpers/Value.js","../src/js/Helpers/Validate.js","../src/js/Helpers/Language.js","../src/js/Helpers/Translate.js","../src/js/Helpers/Template.js","../src/js/Themes/Original/Divider.js","../src/js/Themes/Original/FlipClock.js","../src/js/Themes/Original/Group.js","../src/js/Themes/Original/Label.js","../src/js/Themes/Original/List.js","../src/js/Themes/Original/ListItem.js","../src/js/Themes/Original/Faces/DayCounter.js","../src/js/Themes/Original/Faces/HourCounter.js","../src/js/Themes/Original/Faces/MinuteCounter.js","../src/js/Themes/Original/Faces/TwentyFourHourClock.js","../src/js/Themes/Original/Faces/TwelveHourClock.js","../src/js/Themes/Original/Faces/WeekCounter.js","../src/js/Themes/Original/Faces/YearCounter.js","../src/js/Components/Component.js","../src/js/Components/FaceValue.js","../src/js/Config/ConsoleMessages.js","../src/js/Components/Face.js","../src/js/Languages/ar-ar.js","../src/js/Languages/ca-es.js","../src/js/Languages/cs-cz.js","../src/js/Languages/da-dk.js","../src/js/Languages/de-de.js","../src/js/Languages/en-us.js","../src/js/Languages/es-es.js","../src/js/Languages/fa-ir.js","../src/js/Languages/fi-fi.js","../src/js/Languages/fr-ca.js","../src/js/Languages/he-il.js","../src/js/Languages/hu-hu.js","../src/js/Languages/it-it.js","../src/js/Languages/ja-jp.js","../src/js/Languages/ko-kr.js","../src/js/Languages/lv-lv.js","../src/js/Languages/nl-be.js","../src/js/Languages/no-nb.js","../src/js/Languages/pl-pl.js","../src/js/Languages/pt-br.js","../src/js/Languages/ro-ro.js","../src/js/Languages/ru-ru.js","../src/js/Languages/sk-sk.js","../src/js/Languages/sv-se.js","../src/js/Languages/th-th.js","../src/js/Languages/tr-tr.js","../src/js/Languages/ua-ua.js","../src/js/Languages/vn-vn.js","../src/js/Languages/zh-cn.js","../src/js/Languages/zh-tw.js","../src/js/Components/DomComponent.js","../src/js/Components/Divider.js","../src/js/Components/ListItem.js","../src/js/Components/List.js","../src/js/Components/Group.js","../src/js/Components/Label.js","../src/js/Components/Timer.js","../src/js/Faces/Counter.js","../src/js/Faces/MinuteCounter.js","../src/js/Faces/HourCounter.js","../src/js/Faces/DayCounter.js","../src/js/Faces/TwentyFourHourClock.js","../src/js/Faces/TwelveHourClock.js","../src/js/Faces/WeekCounter.js","../src/js/Faces/YearCounter.js","../src/js/Config/DefaultValues.js","../src/js/Themes/Original/index.js","../src/js/Components/FlipClock.js"],"sourcesContent":["/**\r\n * These are a collection of helper functions, some borrowed from Lodash,\r\n * Underscore, etc, to provide common functionality without the need for using\r\n * a dependency. All of this is an attempt to reduce the file size of the\r\n * library.\r\n *\r\n * @namespace Helpers.Functions\r\n */\r\n\r\n/**\r\n * Throw a string as an Error exception.\r\n *\r\n * @function error\r\n * @param {string} string - The error message.\r\n * @return {void}\r\n * @memberof Helpers.Functions\r\n */\r\nexport function error(string) {\r\n throw Error(string);\r\n}\r\n\r\n/**\r\n * Check if `fn` is a function, and call it with `this` context and pass the\r\n * arguments.\r\n *\r\n * @function callback\r\n * @param {string} string - The callback fn.\r\n * @param {...*} args - The arguments to pass.\r\n * @return {void}\r\n * @memberof Helpers.Functions\r\n */\r\nexport function callback(fn, ...args) {\r\n if(isFunction(fn)) {\r\n return fn.call(this, ...args);\r\n }\r\n}\r\n\r\n/**\r\n * Round the value to the correct value. Takes into account negative numbers.\r\n *\r\n * @function round\r\n * @param {value} string - The value to round.\r\n * @return {string} - The rounded value.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function round(value) {\r\n return isNegativeZero(\r\n value = isNegative(value) ? Math.ceil(value) : Math.floor(value)\r\n ) ? ('-' + value).toString() : value;\r\n}\r\n\r\n/**\r\n * Returns `true` if `undefined or `null`.\r\n *\r\n * @function noop\r\n * @param {value} string - The value to check.\r\n * @return {boolean} - `true` if `undefined or `null`.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function noop(value) {\r\n return !isUndefined(value) && !isNull(value);\r\n}\r\n\r\n/**\r\n * Returns a function that executes the `before` attribute and passes that value\r\n * to `after` and the subsequent value is returned.\r\n *\r\n * @function chain\r\n * @param {function} before - The first function to execute.\r\n * @param {function} after - The subsequent function to execute.\r\n * @return {function} - A function that executes the chain.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function chain(before, after) {\r\n return () => after(before());\r\n}\r\n\r\n/**\r\n * Returns a function that returns maps the values before concatenating them.\r\n *\r\n * @function concatMap\r\n * @param {function} fn - The map callback function.\r\n * @return {function} - A function that executes the map and concatenation.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function concatMap(fn) {\r\n return x => {\r\n return x.map(fn).reduce((x, y) => x.concat(y), []);\r\n }\r\n}\r\n\r\n/**\r\n * Flatten an array.\r\n *\r\n * @function flatten\r\n * @param {array} value - The array to flatten.\r\n * @return {array} - The flattened array.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function flatten(value) {\r\n return concatMap(value => value)(value)\r\n}\r\n\r\n/**\r\n * Deep flatten an array.\r\n *\r\n * @function deepFlatten\r\n * @param {array} value - The array to flatten.\r\n * @return {array} - The flattened array.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function deepFlatten(x) {\r\n return concatMap(x => Array.isArray(x) ? deepFlatten (x) : x)(x);\r\n}\r\n\r\n/**\r\n * Capitalize the first letter in a string.\r\n *\r\n * @function ucfirst\r\n * @param {string} string - The string to capitalize.\r\n * @return {string} - The capitalized string.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function ucfirst(string) {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n}\r\n\r\n/**\r\n * Returns the length of a deep flatten array.\r\n *\r\n * @function length\r\n * @param {array} value - The array to count.\r\n * @return {number} - The length of the deep flattened array.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function length(value) {\r\n return deepFlatten(value).length;\r\n}\r\n\r\n/**\r\n * Determines if a value is a negative zero.\r\n *\r\n * @function isNegativeZero\r\n * @param {number} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a negative zero (`-0`).\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isNegativeZero(value) {\r\n return 1 / Math.round(value) === -Infinity;\r\n}\r\n\r\n/**\r\n * Determines if a value is a negative.\r\n *\r\n * @function isNegative\r\n * @param {number} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a negative.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isNegative(value) {\r\n return isNegativeZero(value) || value < 0;\r\n}\r\n\r\n/**\r\n * Determines if a value is `null`.\r\n *\r\n * @function isNull\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a `null`.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isNull(value) {\r\n return value === null;// || typeof value === 'null';\r\n}\r\n\r\n/**\r\n * Determines if a value is `undefined`.\r\n *\r\n * @function isNull\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a `undefined`.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isUndefined(value) {\r\n return typeof value === 'undefined';\r\n}\r\n\r\n/**\r\n * Determines if a value is a constructor.\r\n *\r\n * @function isConstructor\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a constructor.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isConstructor(value) {\r\n return (value instanceof Function) && !!value.name;\r\n}\r\n\r\n/**\r\n * Determines if a value is a string.\r\n *\r\n * @function isString\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a string.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isString(value) {\r\n return typeof value === 'string';\r\n}\r\n\r\n/**\r\n * Determines if a value is a array.\r\n *\r\n * @function isString\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a string.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isArray(value) {\r\n return value instanceof Array;\r\n}\r\n\r\n/**\r\n * Determines if a value is an object.\r\n *\r\n * @function isObject\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is an object.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isObject(value) {\r\n const type = typeof value;\r\n return value != null && !isArray(value) && (\r\n type == 'object' || type == 'function'\r\n );\r\n}\r\n\r\n/**\r\n * Determines if a value is a function.\r\n *\r\n * @function isObject\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a function.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isFunction(value) {\r\n return value instanceof Function;\r\n}\r\n\r\n/**\r\n * Determines if a value is a number.\r\n *\r\n * @function isObject\r\n * @param {*} value - The value to check.\r\n * @return {boolean} - Returns `true` if the value is a number.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function isNumber(value) {\r\n return !isNaN(value);\r\n}\r\n\r\n/**\r\n * Converts a string into kebab case.\r\n *\r\n * @function kebabCase\r\n * @param {string} string - The string to convert.\r\n * @return {string} - The converted string.\r\n * @memberof Helpers.Functions\r\n */\r\nexport function kebabCase(string) {\r\n return string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\\s+/g, '-').toLowerCase();\r\n}\r\n","/**\r\n * @namespace Helpers.Digitize\r\n */\r\nimport { flatten } from './Functions';\r\nimport { deepFlatten } from './Functions';\r\n\r\n/**\r\n * Digitize a number, string, or an array into a digitized array. This function\r\n * use by the `Face`, which convert the digitized array into an array of `List`\r\n * instances.\r\n *\r\n * @function digitize\r\n * @param {*} value - The value to digitize.\r\n * @param {(Object|undefined)} [options] - The digitizer options.\r\n * @return {array} - The digitized array.\r\n * @memberof Helpers.Digitize\r\n */\r\nexport default function digitize(value, options) {\r\n options = Object.assign({\r\n minimumDigits: 0,\r\n prependLeadingZero: true\r\n }, options);\r\n\r\n function prepend(number) {\r\n const shouldPrependZero = options.prependLeadingZero &&\r\n number.toString().split('').length === 1;\r\n\r\n return (shouldPrependZero ? '0' : '').concat(number);\r\n }\r\n\r\n function digits(arr, min) {\r\n const length = deepFlatten(arr).length;\r\n\r\n if(length < min) {\r\n for(let i = 0; i < min - length; i++) {\r\n arr[0].unshift('0');\r\n }\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n return digits(flatten([value]).map(number => {\r\n return flatten(deepFlatten([number]).map(number => {\r\n return prepend(number).split('');\r\n }));\r\n }), options.minimumDigits || 0);\r\n}\r\n","/**\r\n * @namespace Helpers.Value\r\n */\r\n\r\n/**\r\n * An array of objects with min/max ranges.\r\n *\r\n * @private\r\n * @type {array}\r\n */\r\nconst RANGES = [{\r\n // 0-9\r\n min: 48,\r\n max: 57\r\n},{\r\n // a-z\r\n min: 65,\r\n max: 90\r\n},{\r\n // A-Z\r\n min: 97,\r\n max: 122\r\n}];\r\n\r\n/**\r\n * Format a string into a new data type. Currently only supports string to\r\n * number conversion.\r\n *\r\n * @private\r\n * @function format\r\n * @param {string} string - The string to format.\r\n * @param {string} type - The data type (represented as a string) used to\r\n * convert the string.\r\n * @return {boolean} - Returns the formatted string.\r\n */\r\nfunction format(string, type) {\r\n switch(type) {\r\n case 'number':\r\n return parseFloat(string);\r\n }\r\n\r\n return string;\r\n}\r\n\r\n/**\r\n * Find the range object from the `RANGES` constant from the character given.\r\n * This is mainly an interval method, but can be used by faces to help\r\n * determine what the next value of a string should be.\r\n *\r\n * @private\r\n * @function format\r\n * @param {string} char - The char used to determine the range.\r\n * @param {string} type - The data type (represented as a string) used to\r\n * convert the string.\r\n * @return {boolean} - Returns the formatted string.\r\n */\r\nfunction findRange(char) {\r\n for(const i in RANGES) {\r\n const code = char.toString().charCodeAt(0);\r\n\r\n if(RANGES[i].min <= code && RANGES[i].max >= code) {\r\n return RANGES[i];\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Create a string from a character code, which is returned by the callback.\r\n *\r\n * @private\r\n * @callback stringFromCharCodeBy\r\n * @param {string} char - The char used to determine the range.\r\n * @param {function} fn - The callback function receives `range` and `code`\r\n * arguments. This function should return a character code.\r\n * @return {string} - Creates a string from the character code returned by the\r\n * callback function.\r\n */\r\nfunction stringFromCharCodeBy(char, fn) {\r\n return String.fromCharCode(\r\n fn(findRange(char), char.charCodeAt(0))\r\n );\r\n}\r\n\r\n/**\r\n * Calculate the next value for a string. 'a' becomes 'b'. 'A' becomes 'B'. 1\r\n * becomes 2, etc. If multiple character strings are passed, 'aa' would become\r\n * 'bb'.\r\n *\r\n * @function next\r\n * @param {(string|number)} value - The string or number to convert.\r\n * @return {string} - The formatted string\r\n * @memberof Helpers.Value\r\n */\r\nexport function next(value) {\r\n const converted = (value)\r\n .toString()\r\n .split('')\r\n .map(char => stringFromCharCodeBy(char, (range, code) => {\r\n return !range || code < range.max ? code + 1 : range.min\r\n }))\r\n .join('');\r\n\r\n return format(converted, typeof value);\r\n}\r\n\r\n/**\r\n * Calculate the prev value for a string. 'b' becomes 'a'. 'B' becomes 'A'. 2\r\n * becomes 1, 0 becomes 9, etc. If multiple character strings are passed, 'bb'\r\n * would become 'aa'.\r\n *\r\n * @function prev\r\n * @param {(string|number)} value - The string or number to convert.\r\n * @return {string} - The formatted string\r\n * @memberof Helpers.Value\r\n */\r\nexport function prev(value) {\r\n const converted = (value)\r\n .toString()\r\n .split('')\r\n .map(char => stringFromCharCodeBy(char, (range, code) => {\r\n return !range || code > range.min ? code - 1 : range.max\r\n }))\r\n .join('');\r\n\r\n return format(converted, typeof value);\r\n}\r\n","/**\r\n * @namespace Helpers.Validate\r\n */\r\nimport { isNull } from './Functions';\r\nimport { flatten } from './Functions';\r\nimport { isString } from './Functions';\r\nimport { isObject } from './Functions';\r\nimport { isFunction } from './Functions';\r\nimport { isConstructor } from './Functions';\r\n\r\n/**\r\n * Validate the data type of a variable.\r\n *\r\n * @function validate\r\n * @param {*} value - The value to validate.\r\n * @param {...*} args - The data types to use for validate.\r\n * @return {boolean} - Returns `true`is the value has a valid data type.\r\n * @memberof Helpers.Validate\r\n */\r\nexport default function validate(value, ...args) {\r\n let success = false;\r\n\r\n flatten(args).forEach(arg => {\r\n if( (isNull(value) && isNull(arg)) ||\r\n (isObject(arg) && (value instanceof arg)) ||\r\n (isFunction(arg) && !isConstructor(arg) && arg(value) === true) ||\r\n (isString(arg) && (typeof value === arg))) {\r\n success = true;\r\n }\r\n });\r\n\r\n return success;\r\n}\r\n","/**\r\n * @namespace Helpers.Language\r\n */\r\nimport * as LANGUAGES from '../Languages';\r\n\r\n/**\r\n * Return the language associated with the key. Returns `null` if no language is\r\n * found.\r\n * \r\n * @function language\r\n * @param {string} name - The name or id of the language.\r\n * @return {object|null} - The language dictionary, or null if not found.\r\n * @memberof Helpers.Language\r\n */\r\nexport default function language(name) {\r\n return name ? LANGUAGES[name.toLowerCase()] || Object.values(LANGUAGES).find(value => {\r\n return value.aliases.indexOf(name) !== -1;\r\n }) : null;\r\n}\r\n","/**\r\n * @namespace Helpers.Translate\r\n */\r\nimport language from './Language';\r\nimport { isString } from './Functions';\r\n\r\n/**\r\n * Translate an English string into another language.\r\n * \r\n * @function translate\r\n * @param {string} string - The string to translate.\r\n * @param {(string|object)} from - The language used to translate. If a string,\r\n * the language is loaded into an object.\r\n * @return {string} - If no diction key is found, the untranslated string is\r\n * returned.\r\n * @memberof Helpers.Translate\r\n */\r\nexport default function translate(string, from) {\r\n const lang = isString(from) ? language(from) : from;\r\n const dictionary = lang.dictionary || lang;\r\n return dictionary[string] || string;\r\n};\r\n","/**\r\n * A collection of functions to manage DOM nodes and theme templates.\r\n *\r\n * @namespace Helpers.Template\r\n */\r\nimport { noop } from './Functions';\r\nimport { isArray } from './Functions';\r\nimport { isObject } from './Functions';\r\nimport { isString } from './Functions';\r\nimport { deepFlatten } from './Functions';\r\n\r\n/**\r\n * Swap a new DOM node with an existing one.\r\n *\r\n * @function swap\r\n * @param {HTMLElement} subject - The new DOM node.\r\n * @param {HTMLElement} existing - The existing DOM node.\r\n * @return {HTMLElement} - Returns the new element if it was mounted, otherwise\r\n * the existing node is returned.\r\n * @memberof Helpers.Template\r\n */\r\nexport function swap(subject, existing) {\r\n\tif(existing.parentNode) {\r\n\t\texisting.parentNode.replaceChild(subject, existing);\r\n\r\n\t\treturn subject;\r\n\t}\r\n\r\n\treturn existing;\r\n}\r\n\r\n/**\r\n * Set the attribute of an element.\r\n *\r\n * @function setAttributes\r\n * @param {HTMLElement} el - The DOM node that will receive the attributes.\r\n * @param {Object|undefined} [attributes] - The attribute object, or if no object\r\n * is passed, then the action is ignored.\r\n * @return {HTMLElement} el - The DOM node that received the attributes.\r\n * @memberof Helpers.Template\r\n */\r\nexport function setAttributes(el, attributes) {\r\n\tif(isObject(attributes)) {\r\n\t\tfor(const i in attributes) {\r\n\t\t\tel.setAttribute(i, attributes[i]);\r\n\t\t}\r\n\t}\r\n\r\n\treturn el;\r\n}\r\n\r\n/**\r\n * Append an array of DOM nodes to a parent.\r\n *\r\n * @function appendChildren\r\n * @param {HTMLElement} el - The parent DOM node.\r\n * @param {Array|undefined} [children] - The array of children. If no array\r\n * is passed, then the method silently fails to run.\r\n * @return {HTMLElement} el - The DOM node that received the attributes.\r\n * @memberof Helpers.Template\r\n */\r\nexport function appendChildren(el, children) {\r\n\tif(isArray(children)) {\r\n\t\tchildren.filter(noop).forEach(child => {\r\n\t\t\tif(child instanceof HTMLElement) {\r\n\t\t\t\tel.appendChild(child);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\treturn el;\r\n}\r\n\r\n/**\r\n * Create a new HTMLElement instance.\r\n *\r\n * @function createElement\r\n * @param {HTMLElement} el - The parent DOM node.\r\n * @param {Array|undefined} [children] - The array of children. If no array\r\n * is passed, then the method silently fails to run.\r\n * @param {Object|undefined} [attributes] - The attributes object.\r\n * @return {HTMLElement} el - The DOM node that received the attributes.\r\n * @memberof Helpers.Template\r\n */\r\nexport function createElement(el, children, attributes) {\r\n\tif(!(el instanceof HTMLElement)) {\r\n\t\tel = document.createElement(el);\r\n\t}\r\n\r\n\tsetAttributes(el, isObject(children) ? children : attributes);\r\n\r\n\tif(!isObject(children) && !isArray(children)) {\r\n\t\tel.innerHTML = children;\r\n\t}\r\n\telse {\r\n\t\tappendChildren(el, children)\r\n\t}\r\n\r\n\treturn el;\r\n}\r\n","import { appendChildren, createElement } from '../../Helpers/Template';\r\n\r\nexport default function(el, instance) {\r\n appendChildren(el, [\r\n createElement('div', {class: 'flip-clock-dot top'}),\r\n createElement('div', {class: 'flip-clock-dot bottom'})\r\n ]);\r\n}\r\n","import { next } from '../../Helpers/Value';\r\nimport { appendChildren } from '../../Helpers/Template';\r\n\r\nfunction child(el, index) {\r\n return el ? (el.childNodes ? el.childNodes[index] : el[index]) : null;\r\n}\r\n\r\nfunction char(el) {\r\n return el ? el.querySelector('.flip-clock-list-item:first-child .top').innerHTML : null;\r\n}\r\n\r\nexport default function(el, instance) {\r\n const parts = instance.value.digits.map((group, x) => {\r\n const groupEl = child(instance.el ? instance.el.querySelectorAll('.flip-clock-group') : null, x);\r\n\r\n const lists = group.map((value, y) => {\r\n const listEl = child(groupEl ? groupEl.querySelectorAll('.flip-clock-list') : null, y);\r\n const listValue = char(listEl);\r\n\r\n return instance.createList(value, {\r\n domValue: listValue,\r\n countdown: instance.countdown,\r\n animationRate: instance.face.animationRate || instance.face.delay\r\n });\r\n });\r\n\r\n return instance.createGroup(lists);\r\n });\r\n\r\n const nodes = parts.map(group => {\r\n return group.render();\r\n });\r\n\r\n appendChildren(el, nodes);\r\n}\r\n","import { createElement, appendChildren } from '../../Helpers/Template';\r\n\r\nexport default function(el, instance) {\r\n const items = instance.items.map(item => {\r\n return item.render();\r\n });\r\n\r\n appendChildren(el, items);\r\n}\r\n","import { createElement } from '../../Helpers/Template';\r\n\r\nexport default function(el, instance) {\r\n el.innerHTML = instance.t(instance.label);\r\n}\r\n","import { next, prev } from '../../Helpers/Value';\r\nimport ListItem from '../../Components/ListItem';\r\nimport { createElement, appendChildren } from '../../Helpers/Template';\r\n\r\nexport default function(el, instance) {\r\n const beforeValue = instance.domValue || (\r\n !instance.countdown ? prev(instance.value) : next(instance.value)\r\n );\r\n\r\n if( instance.domValue && instance.domValue !== instance.value) {\r\n el.classList.add('flip');\r\n }\r\n\r\n el.style.animationDelay = `${instance.animationRate / 2}ms`;\r\n el.style.animationDuration = `${instance.animationRate / 2}ms`;\r\n\r\n instance.items = [\r\n instance.createListItem(instance.value, {\r\n active: true\r\n }),\r\n instance.createListItem(beforeValue, {\r\n active: false\r\n })\r\n ];\r\n\r\n appendChildren(el, instance.items.map(item => item.render()));\r\n}\r\n","import { createElement, appendChildren } from '../../Helpers/Template';\r\n\r\nexport default function(el, instance) {\r\n const className = instance.active === true ? 'active' : (\r\n instance.active === false ? 'before' : null\r\n );\r\n\r\n el.classList.add(className);\r\n\r\n appendChildren(el, [\r\n createElement('div', [\r\n createElement('div', instance.value, {class: 'top'}),\r\n createElement('div', instance.value, {class: 'bottom'})\r\n ], {class: 'flip-clock-list-item-inner'})\r\n ]);\r\n}\r\n","export default function(el, instance) {\r\n instance.createDivider().mount(el, el.childNodes[1]);\r\n instance.createDivider().mount(el, el.childNodes[3]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createDivider().mount(el, el.childNodes[5]);\r\n }\r\n\r\n if(instance.face.showLabels) {\r\n instance.createLabel('days').mount(el.childNodes[0]);\r\n instance.createLabel('hours').mount(el.childNodes[2]);\r\n instance.createLabel('minutes').mount(el.childNodes[4]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createLabel('seconds').mount(el.childNodes[6]);\r\n }\r\n }\r\n}\r\n","export default function(el, instance) {\r\n instance.createDivider().mount(el, el.childNodes[1]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createDivider().mount(el, el.childNodes[3]);\r\n }\r\n \r\n if(instance.face.showLabels) {\r\n instance.createLabel('hours').mount(el.childNodes[0]);\r\n instance.createLabel('minutes').mount(el.childNodes[2]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createLabel('seconds').mount(el.childNodes[4]);\r\n }\r\n }\r\n}\r\n","export default function(el, instance) {\r\n if(instance.face.showSeconds) {\r\n instance.createDivider().mount(el, el.childNodes[1]);\r\n }\r\n\r\n if(instance.face.showLabels) {\r\n instance.createLabel('minutes').mount(el.childNodes[0]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createLabel('seconds').mount(el.childNodes[2]);\r\n }\r\n }\r\n}\r\n","export default function(el, instance) {\r\n instance.createDivider().mount(el, el.childNodes[1]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createDivider().mount(el, el.childNodes[3]);\r\n }\r\n \r\n if(instance.face.showLabels) {\r\n instance.createLabel('hours').mount(el.childNodes[0]);\r\n instance.createLabel('minutes').mount(el.childNodes[2]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createLabel('seconds').mount(el.childNodes[4]);\r\n }\r\n }\r\n\r\n}\r\n","import TwentyFourHourClock from './TwentyFourHourClock';\r\n\r\nexport default function(el, instance) {\r\n TwentyFourHourClock(el, instance);\r\n\r\n if(instance.face.showMeridium && instance.face.meridium) {\r\n const label = instance.createLabel(instance.face.meridium);\r\n const parent = el.childNodes[el.childNodes.length - 1];\r\n\r\n label.mount(parent).classList.add('flip-clock-meridium');\r\n }\r\n}\r\n","export default function(el, instance) {\r\n instance.createDivider().mount(el, el.childNodes[1]);\r\n instance.createDivider().mount(el, el.childNodes[3]);\r\n instance.createDivider().mount(el, el.childNodes[5]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createDivider().mount(el, el.childNodes[7]);\r\n }\r\n\r\n if(instance.face.showLabels) {\r\n instance.createLabel('weeks').mount(el.childNodes[0]);\r\n instance.createLabel('days').mount(el.childNodes[2]);\r\n instance.createLabel('hours').mount(el.childNodes[4]);\r\n instance.createLabel('minutes').mount(el.childNodes[6]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createLabel('seconds').mount(el.childNodes[8]);\r\n }\r\n }\r\n}\r\n","export default function(el, instance) {\r\n instance.createDivider().mount(el, el.childNodes[1]);\r\n instance.createDivider().mount(el, el.childNodes[3]);\r\n instance.createDivider().mount(el, el.childNodes[5]);\r\n instance.createDivider().mount(el, el.childNodes[7]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createDivider().mount(el, el.childNodes[9]);\r\n }\r\n\r\n if(instance.face.showLabels) {\r\n instance.createLabel('years').mount(el.childNodes[0]);\r\n instance.createLabel('weeks').mount(el.childNodes[2]);\r\n instance.createLabel('days').mount(el.childNodes[4]);\r\n instance.createLabel('hours').mount(el.childNodes[6]);\r\n instance.createLabel('minutes').mount(el.childNodes[8]);\r\n\r\n if(instance.face.showSeconds) {\r\n instance.createLabel('seconds').mount(el.childNodes[10]);\r\n }\r\n }\r\n}\r\n","import { chain, error, callback, isObject, kebabCase } from '../Helpers/Functions';\r\n\r\nexport default class Component {\r\n\r\n /**\r\n * Abstract base class.\r\n *\r\n * @class Component\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n */\r\n constructor(attributes) {\r\n this.setAttribute(Object.assign({\r\n events: {}\r\n }, attributes));\r\n }\r\n\r\n /**\r\n * Get the `name` attribute.\r\n *\r\n * @type {string}\r\n */\r\n get name() {\r\n if(!(this.constructor.defineName instanceof Function)) {\r\n error('Every class must define its name.');\r\n }\r\n\r\n return this.constructor.defineName();\r\n }\r\n\r\n /**\r\n * The `events` attribute.\r\n *\r\n * @type {object}\r\n */\r\n get events() {\r\n return this.$events || {};\r\n }\r\n\r\n set events(value) {\r\n this.$events = value;\r\n }\r\n\r\n /**\r\n * Emit an event.\r\n *\r\n * @param {string} key - The event id/key.\r\n * @return {Component} - Returns `this` instance.\r\n */\r\n emit(key, ...args) {\r\n if(this.events[key]) {\r\n this.events[key].forEach(event => {\r\n event.apply(this, args);\r\n });\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Start listening to an event.\r\n *\r\n * @param {string} key - The event id/key.\r\n * @param {Function} fn - The listener callback function.\r\n * @param {boolean} [once=false] - Should the event handler be fired a\r\n * single time.\r\n * @return {Component} - Returns `this` instance.\r\n */\r\n on(key, fn, once = false) {\r\n if(!this.events[key]) {\r\n this.events[key] = [];\r\n }\r\n\r\n this.events[key].push(fn);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Stop listening to an event.\r\n *\r\n * @param {string} key - The event id/key.\r\n * @param {(Function|undefined)} fn - The listener callback function. If no\r\n * function is defined, all events with the specified id/key will be\r\n * removed. Otherwise, only the event listeners matching the id/key AND\r\n * callback will be removed.\r\n * @return {Component} - Returns `this` instance.\r\n */\r\n off(key, fn) {\r\n if(this.events[key] && fn) {\r\n this.events[key] = this.events[key].filter(event => {\r\n return event !== fn;\r\n });\r\n }\r\n else {\r\n this.events[key] = [];\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Listen to an event only one time.\r\n *\r\n * @param {string} key - The event id/key.\r\n * @param {Function} fn - The listener callback function.\r\n * @return {Component} - Returns `this` instance.\r\n */\r\n once(key, fn) {\r\n fn = chain(fn, () => this.off(key, fn));\r\n\r\n return this.on(key, fn, true);\r\n }\r\n\r\n /**\r\n * Get an attribute. Returns null if no attribute is defined.\r\n *\r\n * @param {string} key - The attribute name.\r\n * @return {*} - The attribute value.\r\n */\r\n getAttribute(key) {\r\n return this.hasOwnProperty(key) ? this[key] : null;\r\n }\r\n\r\n /**\r\n * Get all the atttributes for this instance.\r\n *\r\n * @return {object} - The attribute dictionary.\r\n */\r\n getAttributes() {\r\n const attributes = {};\r\n\r\n Object.getOwnPropertyNames(this).forEach(key => {\r\n attributes[key] = this.getAttribute(key);\r\n });\r\n\r\n return attributes;\r\n }\r\n\r\n /**\r\n * Get only public the atttributes for this instance. Omits any attribute\r\n * that starts with `$`, which is used internally.\r\n *\r\n * @return {object} - The attribute dictionary.\r\n */\r\n getPublicAttributes() {\r\n return Object.keys(this.getAttributes())\r\n .filter(key => {\r\n return !key.match(/^\\$/);\r\n })\r\n .reduce((obj, key) => {\r\n obj[key] = this.getAttribute(key);\r\n return obj;\r\n }, {});\r\n }\r\n\r\n /**\r\n * Set an attribute key and value.\r\n *\r\n * @param {string} key - The attribute name.\r\n * @param {*} value - The attribute value.\r\n * @return {void}\r\n */\r\n setAttribute(key, value) {\r\n if(isObject(key)) {\r\n this.setAttributes(key);\r\n }\r\n else {\r\n this[key] = value;\r\n }\r\n }\r\n\r\n /**\r\n * Set an attributes by object of key/value pairs.\r\n *\r\n * @param {object} values - The object dictionary.\r\n * @return {void}\r\n */\r\n setAttributes(values) {\r\n for(const i in values) {\r\n this.setAttribute(i, values[i]);\r\n }\r\n }\r\n\r\n /**\r\n * Helper method to execute the `callback()` function.\r\n *\r\n * @param {Function} fn - The callback function.\r\n * @return {*} - Returns the executed callback function.\r\n */\r\n callback(fn) {\r\n return callback.call(this, fn);\r\n }\r\n\r\n /**\r\n * Factor method to static instantiate new instances. Useful for writing\r\n * clean expressive syntax with chained methods.\r\n *\r\n * @param {...*} args - The callback arguments.\r\n * @return {*} - The new component instance.\r\n */\r\n static make(...args) {\r\n return new this(...args);\r\n }\r\n\r\n}\r\n","import Component from './Component';\r\nimport digitize from '../Helpers/Digitize';\r\nimport { next, prev } from '../Helpers/Value';\r\nimport { length, isObject, isNumber } from '../Helpers/Functions';\r\n\r\nexport default class FaceValue extends Component {\r\n\r\n /**\r\n * The `FaceValue` class handles all the digitizing for the `Face`.\r\n *\r\n * @class FaceValue\r\n * @extends Component\r\n * @param {*} value - The `FaceValue`'s actual value. Most likely should\r\n * string, number, or Date. But since the Face handles the value, it\r\n * could be anything.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n */\r\n constructor(value, attributes) {\r\n super(Object.assign({\r\n format: value => value,\r\n prependLeadingZero: true,\r\n minimumDigits: 0\r\n }, attributes));\r\n\r\n if(!this.value) {\r\n this.value = value;\r\n }\r\n }\r\n\r\n /**\r\n * The `digits` attribute.\r\n *\r\n * @type {(Array|undefined)}\r\n */\r\n get digits() {\r\n return this.$digits;\r\n }\r\n\r\n set digits(value) {\r\n this.$digits = value;\r\n this.minimumDigits = Math.max(this.minimumDigits, length(value));\r\n }\r\n\r\n /**\r\n * The `value` attribute.\r\n *\r\n * @type {*}\r\n */\r\n get value() {\r\n return this.$value;\r\n }\r\n\r\n set value(value) {\r\n this.$value = value;\r\n this.digits = digitize(this.format(value), {\r\n minimumDigits: this.minimumDigits,\r\n prependLeadingZero: this.prependLeadingZero\r\n });\r\n }\r\n\r\n /**\r\n * Returns `true` if the `value` attribute is not a number.\r\n *\r\n * @return {boolean} - `true` is the value is not a number.\r\n */\r\n isNaN() {\r\n return isNaN(this.value);\r\n }\r\n\r\n /**\r\n * Returns `true` if the `value` attribute is a number.\r\n *\r\n * @return {boolean} - `true` is the value is a number.\r\n */\r\n isNumber() {\r\n return isNumber();\r\n }\r\n\r\n /**\r\n * Clones the current `FaceValue` instance, but sets a new value to the\r\n * cloned instance. Used for copying the current instance options and\r\n * methods, but setting a new value.\r\n *\r\n * @param {*} value - The n\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @return {FaceValue} - The cloned `FaceValue`.\r\n */\r\n clone(value, attributes) {\r\n return new this.constructor(value, Object.assign(\r\n this.getPublicAttributes(), attributes\r\n ));\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'FaceValue';\r\n }\r\n\r\n}\r\n","/**\r\n * @alias ConsoleMessages\r\n * @type {object}\r\n * @memberof module:Config/ConsoleMessages\r\n */\r\nexport default {\r\n className: 'The className() is not defined.',\r\n items: 'The items property must be an array.',\r\n theme: 'The theme property must be an object.',\r\n language: 'The language must be an object.',\r\n date: 'The value must be an instance of a Date.',\r\n face: 'The face must be an instance of a Face class.',\r\n element: 'The element must be an instance of an HTMLElement',\r\n faceValue: 'The face must be an instance of a FaceValue class.',\r\n timer: 'The timer property must be an instance of a Timer class.'\r\n};\r\n","import Component from './Component';\r\nimport FaceValue from './FaceValue';\r\nimport validate from '../Helpers/Validate';\r\nimport ConsoleMessages from '../Config/ConsoleMessages';\r\nimport { error, isNull, isUndefined, isObject, isArray, isFunction, callback } from '../Helpers/Functions';\r\n\r\nexport default class Face extends Component {\r\n\r\n /**\r\n * This class is meant to be provide an interface for all other faces to\r\n * extend.\r\n *\r\n * @class Face\r\n * @extends Component\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n */\r\n constructor(value, attributes) {\r\n if(!(value instanceof FaceValue) && isObject(value)) {\r\n attributes = value;\r\n value = undefined;\r\n }\r\n\r\n super();\r\n\r\n this.setAttributes(Object.assign({\r\n autoStart: true,\r\n countdown: false,\r\n animationRate: 500\r\n }, this.defaultAttributes(), attributes || {}));\r\n\r\n if(isNull(value) || isUndefined(value)) {\r\n value = this.defaultValue();\r\n }\r\n\r\n if(value) {\r\n this.value = value;\r\n }\r\n }\r\n\r\n /**\r\n * The `dataType` attribute.\r\n *\r\n * @type {*}\r\n */\r\n get dataType() {\r\n return this.defaultDataType();\r\n }\r\n\r\n /**\r\n * The `value` attribute.\r\n *\r\n * @type {*}\r\n */\r\n get value() {\r\n return this.$value;\r\n }\r\n\r\n set value(value) {\r\n if(!(value instanceof FaceValue)) {\r\n value = this.createFaceValue(value);\r\n }\r\n\r\n this.$value = value;\r\n }\r\n\r\n /**\r\n * The `stopAt` attribute.\r\n *\r\n * @type {*}\r\n */\r\n get stopAt() {\r\n return this.$stopAt;\r\n }\r\n\r\n set stopAt(value) {\r\n this.$stopAt = value;\r\n }\r\n\r\n /**\r\n * The `originalValue` attribute.\r\n *\r\n * @type {*}\r\n */\r\n get originalValue() {\r\n return this.$originalValue;\r\n }\r\n\r\n set originalValue(value) {\r\n this.$originalValue = value;\r\n }\r\n\r\n /**\r\n * This method is called with every interval, or every time the clock\r\n * should change, and handles the actual incrementing and decrementing the\r\n * clock's `FaceValue`.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @param {Function} fn - The interval callback.\r\n * @return {Face} - This `Face` instance.\r\n */\r\n interval(instance, fn) {\r\n if(this.countdown) {\r\n this.decrement(instance);\r\n }\r\n else {\r\n this.increment(instance);\r\n }\r\n\r\n callback.call(instance, fn);\r\n\r\n if(this.shouldStop(instance)) {\r\n instance.stop();\r\n }\r\n\r\n return instance.emit('interval');\r\n }\r\n\r\n /**\r\n * Determines if the clock should stop or not.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @return {boolean} - Returns `true` if the clock should stop.\r\n */\r\n shouldStop(instance) {\r\n return !isUndefined(this.stopAt) ? this.stopAt === instance.value.value : false;\r\n }\r\n\r\n /**\r\n * By default this just returns the value unformatted.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @param {*} value - The value to format.\r\n * @return {*} - The formatted value.\r\n */\r\n format(instance, value) {\r\n return value;\r\n }\r\n\r\n /**\r\n * The default value for the `Face`.\r\n *\r\n * @return {*} - The default value.\r\n */\r\n defaultValue() {\r\n //\r\n }\r\n\r\n /**\r\n * The default attributes for the `Face`.\r\n *\r\n * @return {(Object|undefined)} - The default attributes.\r\n */\r\n defaultAttributes() {\r\n //\r\n }\r\n\r\n /**\r\n * The default data type for the `Face` value.\r\n *\r\n * @return {(Object|undefined)} - The default data type.\r\n */\r\n defaultDataType() {\r\n //\r\n }\r\n\r\n /**\r\n * Increment the clock.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @param {Number} [amount] - The amount to increment. If the amount is not\r\n * defined, it is left up to the `Face` to determine the default value.\r\n * @return {void}\r\n */\r\n increment(instance, amount) {\r\n //\r\n }\r\n\r\n /**\r\n * Decrement the clock.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @param {Number} [amount] - The amount to decrement. If the amount is not\r\n * defined, it is left up to the `Face` to determine the default value.\r\n * @return {void}\r\n */\r\n decrement(instance, amount) {\r\n //\r\n }\r\n\r\n /**\r\n * This method is called right after clock has started.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @return {void}\r\n */\r\n started(instance) {\r\n //\r\n }\r\n\r\n /**\r\n * This method is called right after clock has stopped.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @return {void}\r\n */\r\n stopped(instance) {\r\n //\r\n }\r\n\r\n /**\r\n * This method is called right after clock has reset.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @return {void}\r\n */\r\n reset(instance) {\r\n //\r\n }\r\n\r\n /**\r\n * This method is called right after `Face` has initialized.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @return {void}\r\n */\r\n initialized(instance) {\r\n //\r\n }\r\n\r\n /**\r\n * This method is called right after `Face` has rendered.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @return {void}\r\n */\r\n rendered(instance) {\r\n //\r\n }\r\n\r\n /**\r\n * This method is called right after `Face` has mounted.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @return {void}\r\n */\r\n mounted(instance) {\r\n if(this.autoStart && instance.timer.isStopped) {\r\n window.requestAnimationFrame(() => instance.start(instance));\r\n }\r\n }\r\n\r\n /**\r\n * Helper method to instantiate a new `FaceValue`.\r\n *\r\n * @param {FlipClock} instance - The `FlipClock` instance.\r\n * @param {object|undefined} [attributes] - The attributes passed to the\r\n * `FaceValue` instance.\r\n * @return {Divider} - The instantiated `FaceValue`.\r\n */\r\n createFaceValue(instance, value) {\r\n return FaceValue.make(\r\n isFunction(value) && !value.name ? value() : value, {\r\n minimumDigits: this.minimumDigits,\r\n format: value => this.format(instance, value)\r\n }\r\n );\r\n }\r\n\r\n}\r\n","/**\r\n * @classdesc Arabic Language Pack\r\n * @desc This class will be used to translate tokens into the Arabic language.\r\n * @namespace Languages.Arabic\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Arabic\r\n */\r\nexport const dictionary = {\r\n 'years' : 'سنوات',\r\n 'months' : 'شهور',\r\n 'days' : 'أيام',\r\n 'hours' : 'ساعات',\r\n 'minutes' : 'دقائق',\r\n 'seconds' : 'ثواني'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Arabic\r\n */\r\nexport const aliases = ['ar', 'ar-ar', 'arabic'];\r\n","/**\r\n * @classdesc Catalan Language Pack\r\n * @desc This class will used to translate tokens into the Catalan language.\r\n * @namespace Languages.Catalan\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Catalan\r\n */\r\nexport const dictionary = {\r\n 'years' : 'Anys',\r\n 'months' : 'Mesos',\r\n 'days' : 'Dies',\r\n 'hours' : 'Hores',\r\n 'minutes' : 'Minuts',\r\n 'seconds' : 'Segons'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Catalan\r\n */\r\nexport const aliases = ['ca', 'ca-es', 'catalan'];\r\n","/**\r\n * @classdesc Czech Language Pack\r\n * @desc This class will used to translate tokens into the Czech language.\r\n * @namespace Languages.Czech\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Czech\r\n */\r\nexport const dictionary = {\r\n 'years' : 'Roky',\r\n 'months' : 'Měsíce',\r\n 'days' : 'Dny',\r\n 'hours' : 'Hodiny',\r\n 'minutes' : 'Minuty',\r\n 'seconds' : 'Sekundy'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Czech\r\n */\r\nexport const aliases = ['cs', 'cs-cz', 'cz', 'cz-cs', 'czech'];\r\n","/**\r\n * @classdesc Danish Language Pack\r\n * @desc This class will used to translate tokens into the Danish language.\r\n * @namespace Languages.Danish\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Danish\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'År',\r\n\t'months' : 'Måneder',\r\n\t'days' : 'Dage',\r\n\t'hours' : 'Timer',\r\n\t'minutes' : 'Minutter',\r\n\t'seconds' : 'Sekunder'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Danish\r\n */\r\nexport const aliases = ['da', 'da-dk', 'danish'];\r\n","/**\r\n * @classdesc German Language Pack\r\n * @desc This class will used to translate tokens into the German language.\r\n * @namespace Languages.German\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.German\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Jahre',\r\n\t'months' : 'Monate',\r\n\t'days' : 'Tage',\r\n\t'hours' : 'Stunden',\r\n\t'minutes' : 'Minuten',\r\n\t'seconds' : 'Sekunden'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.German\r\n */\r\nexport const aliases = ['de', 'de-de', 'german'];\r\n","/**\r\n * @classdesc English Language Pack\r\n * @desc This class will used to translate tokens into the English language.\r\n * @namespace Languages.English\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.English\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Years',\r\n\t'months' : 'Months',\r\n\t'days' : 'Days',\r\n\t'hours' : 'Hours',\r\n\t'minutes' : 'Minutes',\r\n\t'seconds' : 'Seconds'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.English\r\n */\r\nexport const aliases = ['en', 'en-us', 'english'];\r\n","/**\r\n * @classdesc Spanish Language Pack\r\n * @desc This class will used to translate tokens into the Spanish language.\r\n * @namespace Languages.Spanish\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Spanish\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Años',\r\n\t'months' : 'Meses',\r\n\t'days' : 'Días',\r\n\t'hours' : 'Horas',\r\n\t'minutes' : 'Minutos',\r\n\t'seconds' : 'Segundos'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Spanish\r\n */\r\nexport const aliases = ['es', 'es-es', 'spanish'];\r\n","/**\r\n * @classdesc Persian Language Pack\r\n * @desc This class will used to translate tokens into the Persian language.\r\n * @namespace Languages.Persian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Persian\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'سال',\r\n\t'months' : 'ماه',\r\n\t'days' : 'روز',\r\n\t'hours' : 'ساعت',\r\n\t'minutes' : 'دقیقه',\r\n\t'seconds' : 'ثانیه'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Persian\r\n */\r\nexport const aliases = ['fa', 'fa-ir', 'persian'];\r\n","/**\r\n * @classdesc Finnish Language Pack\r\n * @desc This class will used to translate tokens into the Finnish language.\r\n * @namespace Languages.Finnish\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Finnish\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Vuotta',\r\n\t'months' : 'Kuukautta',\r\n\t'days' : 'Päivää',\r\n\t'hours' : 'Tuntia',\r\n\t'minutes' : 'Minuuttia',\r\n\t'seconds' : 'Sekuntia'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Finnish\r\n */\r\nexport const aliases = ['fi', 'fi-fi', 'finnish'];\r\n","/**\r\n * @classdesc Canadian French Language Pack\r\n * @desc This class will used to translate tokens into the Canadian French language.\r\n * @namespace Languages.CanadianFrench\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.CanadianFrench\r\n */\r\nexport const dictionary = {\r\n 'years' : 'Ans',\r\n 'months' : 'Mois',\r\n 'days' : 'Jours',\r\n 'hours' : 'Heures',\r\n 'minutes' : 'Minutes',\r\n 'seconds' : 'Secondes'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.CanadianFrench\r\n */\r\nexport const aliases = ['fr', 'fr-ca', 'french'];\r\n","/**\r\n * @classdesc Hebrew Language Pack\r\n * @desc This class will used to translate tokens into the Hebrew language.\r\n * @namespace Languages.Hebrew\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Hebrew\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'שנים',\r\n\t'months' : 'חודש',\r\n\t'days' : 'ימים',\r\n\t'hours' : 'שעות',\r\n\t'minutes' : 'דקות',\r\n\t'seconds' : 'שניות'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Hebrew\r\n */\r\nexport const aliases = ['il', 'he-il', 'hebrew'];\r\n","/**\r\n * @classdesc Hungarian Language Pack\r\n * @desc This class will used to translate tokens into the Hungarian language.\r\n * @namespace Languages.Hungarian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Hungarian\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Év',\r\n 'months' : 'Hónap',\r\n 'days' : 'Nap',\r\n 'hours' : 'Óra',\r\n 'minutes' : 'Perc',\r\n 'seconds' : 'Másodperc'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Hungarian\r\n */\r\nexport const aliases = ['hu', 'hu-hu', 'hungarian'];\r\n","/**\r\n * @classdesc Italian Language Pack\r\n * @desc This class will used to translate tokens into the Italian language.\r\n * @namespace Languages.Italian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Italian\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Anni',\r\n\t'months' : 'Mesi',\r\n\t'days' : 'Giorni',\r\n\t'hours' : 'Ore',\r\n\t'minutes' : 'Minuti',\r\n\t'seconds' : 'Secondi'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Italian\r\n */\r\nexport const aliases = ['da', 'da-dk', 'danish'];\r\n","/**\r\n * @classdesc Japanese Language Pack\r\n * @desc This class will used to translate tokens into the Japanese language.\r\n * @namespace Languages.Japanese\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Japanese\r\n */\r\nexport const dictionary = {\r\n\t'years' : '年',\r\n\t'months' : '月',\r\n\t'days' : '日',\r\n\t'hours' : '時',\r\n\t'minutes' : '分',\r\n\t'seconds' : '秒'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Japanese\r\n */\r\nexport const aliases = ['jp', 'ja-jp', 'japanese'];\r\n","/**\r\n * @classdesc Korean Language Pack\r\n * @desc This class will used to translate tokens into the Korean language.\r\n * @namespace Languages.Korean\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Korean\r\n */\r\nexport const dictionary = {\r\n\t'years' : '년',\r\n\t'months' : '월',\r\n\t'days' : '일',\r\n\t'hours' : '시',\r\n\t'minutes' : '분',\r\n\t'seconds' : '초'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Korean\r\n */\r\nexport const aliases = ['ko', 'ko-kr', 'korean'];\r\n","/**\r\n * @classdesc Latvian Language Pack\r\n * @desc This class will used to translate tokens into the Latvian language.\r\n * @namespace Languages.Latvian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Latvian\r\n */\r\nexport const dictionary = {\r\n 'years' : 'Gadi',\r\n 'months' : 'Mēneši',\r\n 'days' : 'Dienas',\r\n 'hours' : 'Stundas',\r\n 'minutes' : 'Minūtes',\r\n 'seconds' : 'Sekundes'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Latvian\r\n */\r\nexport const aliases = ['lv', 'lv-lv', 'latvian'];\r\n","/**\r\n * @classdesc Dutch Language Pack\r\n * @desc This class will used to translate tokens into the Dutch language.\r\n * @namespace Languages.Dutch\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Dutch\r\n */\r\nexport const dictionary = {\r\n 'years' : 'Jaren',\r\n 'months' : 'Maanden',\r\n 'days' : 'Dagen',\r\n 'hours' : 'Uren',\r\n 'minutes' : 'Minuten',\r\n 'seconds' : 'Seconden'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Dutch\r\n */\r\nexport const aliases = ['nl', 'nl-be', 'dutch'];\r\n","/**\r\n * @classdesc Norwegian-Bokmål Language Pack\r\n * @desc This class will used to translate tokens into the Norwegian-Bokmål language.\r\n * @namespace Languages.Norwegian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Norwegian\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'År',\r\n\t'months' : 'Måneder',\r\n\t'days' : 'Dager',\r\n\t'hours' : 'Timer',\r\n\t'minutes' : 'Minutter',\r\n\t'seconds' : 'Sekunder'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Norwegian\r\n */\r\nexport const aliases = ['no', 'nb', 'no-nb', 'norwegian'];\r\n","/**\r\n * @classdesc Polish Language Pack\r\n * @desc This class will used to translate tokens into the Polish language.\r\n * @namespace Languages.Polish\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Polish\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Lat',\r\n\t'months' : 'Miesięcy',\r\n\t'days' : 'Dni',\r\n\t'hours' : 'Godziny',\r\n\t'minutes' : 'Minuty',\r\n\t'seconds' : 'Sekundy'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Polish\r\n */\r\nexport const aliases = ['pl', 'pl-pl', 'polish'];\r\n","/**\r\n * @classdesc Portuguese Language Pack\r\n * @desc This class will used to translate tokens into the Portuguese language.\r\n * @namespace Languages.Portuguese\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Portuguese\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Anos',\r\n\t'months' : 'Meses',\r\n\t'days' : 'Dias',\r\n\t'hours' : 'Horas',\r\n\t'minutes' : 'Minutos',\r\n\t'seconds' : 'Segundos'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Portuguese\r\n */\r\nexport const aliases = ['pt', 'pt-br', 'portuguese'];\r\n","/**\r\n * @classdesc Romanian Language Pack\r\n * @desc This class will used to translate tokens into the Romanian language.\r\n * @namespace Languages.Romanian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Romanian\r\n */\r\nexport const dictionary = {\r\n\t'years': 'Ani',\r\n\t'months': 'Luni',\r\n\t'days': 'Zile',\r\n\t'hours': 'Ore',\r\n\t'minutes': 'Minute',\r\n\t'seconds': 'sSecunde'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Romanian\r\n */\r\nexport const aliases = ['ro', 'ro-ro', 'romana'];\r\n","/**\r\n * @classdesc Russian Language Pack\r\n * @desc This class will used to translate tokens into the Russian language.\r\n * @namespace Languages.Russian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Russian\r\n */\r\nexport const dictionary = {\r\n 'years' : 'лет',\r\n 'months' : 'месяцев',\r\n 'days' : 'дней',\r\n 'hours' : 'часов',\r\n 'minutes' : 'минут',\r\n 'seconds' : 'секунд'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Russian\r\n */\r\nexport const aliases = ['ru', 'ru-ru', 'russian'];\r\n","/**\r\n * @classdesc Slovak Language Pack\r\n * @desc This class will used to translate tokens into the Slovak language.\r\n * @namespace Languages.Slovak\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Slovak\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Roky',\r\n\t'months' : 'Mesiace',\r\n\t'days' : 'Dni',\r\n\t'hours' : 'Hodiny',\r\n\t'minutes' : 'Minúty',\r\n\t'seconds' : 'Sekundy'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Slovak\r\n */\r\nexport const aliases = ['sk', 'sk-sk', 'slovak'];\r\n","/**\r\n * @classdesc Swedish Language Pack\r\n * @desc This class will used to translate tokens into the Swedish language.\r\n * @namespace Languages.Swedish\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Swedish\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'År',\r\n\t'months' : 'Månader',\r\n\t'days' : 'Dagar',\r\n\t'hours' : 'Timmar',\r\n\t'minutes' : 'Minuter',\r\n\t'seconds' : 'Sekunder'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Swedish\r\n */\r\nexport const aliases = ['sv', 'sv-se', 'swedish'];\r\n","/**\r\n * @classdesc Thai Language Pack\r\n * @desc This class will used to translate tokens into the Thai language.\r\n * @namespace Languages.Thai\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Thai\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'ปี',\r\n\t'months' : 'เดือน',\r\n\t'days' : 'วัน',\r\n\t'hours' : 'ชั่วโมง',\r\n\t'minutes' : 'นาที',\r\n\t'seconds' : 'วินาที'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Thai\r\n */\r\nexport const aliases = ['th', 'th-th', 'thai'];\r\n","/**\r\n * @classdesc Turkish Language Pack\r\n * @desc This class will used to translate tokens into the Turkish language.\r\n * @namespace Languages.Turkish\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Turkish\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Yıl',\r\n\t'months' : 'Ay',\r\n\t'days' : 'Gün',\r\n\t'hours' : 'Saat',\r\n\t'minutes' : 'Dakika',\r\n\t'seconds' : 'Saniye'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Turkish\r\n */\r\nexport const aliases = ['tr', 'tr-tr', 'turkish'];\r\n","/**\r\n * @classdesc Ukrainian Language Pack\r\n * @desc This class will used to translate tokens into the Ukrainian language.\r\n * @namespace Languages.Ukrainian\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Ukrainian\r\n */\r\nexport const dictionary = {\r\n 'years' : 'роки',\r\n 'months' : 'місяці',\r\n 'days' : 'дні',\r\n 'hours' : 'години',\r\n 'minutes' : 'хвилини',\r\n 'seconds' : 'секунди'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Ukrainian\r\n */\r\nexport const aliases = ['ua', 'ua-ua', 'ukraine'];\r\n","/**\r\n * @classdesc Vietnamese Language Pack\r\n * @desc This class will used to translate tokens into the Vietnamese language.\r\n * @namespace Languages.Vietnamese\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Vietnamese\r\n */\r\nexport const dictionary = {\r\n\t'years' : 'Năm',\r\n\t'months' : 'Tháng',\r\n\t'days' : 'Ngày',\r\n\t'hours' : 'Giờ',\r\n\t'minutes' : 'Phút',\r\n\t'seconds' : 'Giây'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Vietnamese\r\n */\r\nexport const aliases = ['vn', 'vn-vn', 'vietnamese'];\r\n","/**\r\n * @classdesc Chinese Language Pack\r\n * @desc This class will used to translate tokens into the Chinese language.\r\n * @namespace Languages.Chinese\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.Chinese\r\n */\r\nexport const dictionary = {\r\n\t'years' : '年',\r\n\t'months' : '月',\r\n\t'days' : '日',\r\n\t'hours' : '时',\r\n\t'minutes' : '分',\r\n\t'seconds' : '秒'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.Chinese\r\n */\r\nexport const aliases = ['zh', 'zh-cn', 'chinese'];\r\n","/**\r\n * @classdesc Traditional Chinese Language Pack\r\n * @desc This class will used to translate tokens into the Traditional Chinese language.\r\n * @namespace Languages.TraditionalChinese\r\n */\r\n\r\n/**\r\n * @constant dictionary\r\n * @type {object}\r\n * @memberof Languages.TraditionalChinese\r\n */\r\nexport const dictionary = {\r\n\t'years' : '年',\r\n\t'months' : '月',\r\n\t'days' : '日',\r\n\t'hours' : '時',\r\n\t'minutes' : '分',\r\n\t'seconds' : '秒'\r\n};\r\n\r\n/**\r\n * @constant aliases\r\n * @type {array}\r\n * @memberof Languages.TraditionalChinese\r\n */\r\nexport const aliases = ['zh-tw'];\r\n","import Component from './Component';\r\nimport language from '../Helpers/Language';\r\nimport validate from '../Helpers/Validate';\r\nimport translate from '../Helpers/Translate';\r\nimport { isString } from '../Helpers/Functions';\r\nimport ConsoleMessages from '../Config/ConsoleMessages';\r\nimport { error, kebabCase } from '../Helpers/Functions';\r\nimport { swap, createElement } from '../Helpers/Template';\r\n\r\nexport default class DomComponent extends Component {\r\n\r\n /**\r\n * An abstract class that all other DOM components can extend.\r\n *\r\n * @class DomComponent\r\n * @extends Component\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n */\r\n constructor(attributes) {\r\n super(Object.assign({\r\n parent: null\r\n }, attributes));\r\n\r\n if(!this.theme) {\r\n error(`${this.name} does not have a theme defined.`);\r\n }\r\n\r\n if(!this.language) {\r\n error(`${this.name} does not have a language defined.`);\r\n }\r\n\r\n\t\tif(!this.theme[this.name]) {\r\n throw new Error(\r\n `${this.name} cannot be rendered because it has no template.`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * The `className` attribute. Used for CSS.\r\n *\r\n * @type {string}\r\n */\r\n get className() {\r\n return kebabCase(this.constructor.defineName());\r\n }\r\n\r\n /**\r\n * The `el` attribute.\r\n *\r\n * @type {HTMLElement}\r\n */\r\n get el() {\r\n return this.$el;\r\n }\r\n\r\n set el(value) {\r\n if(!validate(value, null, HTMLElement)) {\r\n error(ConsoleMessages.element);\r\n }\r\n\r\n this.$el = value;\r\n }\r\n\r\n /**\r\n * The `parent` attribute. Parent is set when `DomComponent` instances are\r\n * mounted.\r\n *\r\n * @type {DomComponent}\r\n */\r\n get parent() {\r\n return this.$parent;\r\n }\r\n\r\n set parent(parent) {\r\n this.$parent = parent;\r\n }\r\n\r\n /**\r\n * The `theme` attribute.\r\n *\r\n * @type {object}\r\n */\r\n get theme() {\r\n return this.$theme;\r\n }\r\n\r\n set theme(value) {\r\n if(!validate(value, 'object')) {\r\n error(ConsoleMessages.value);\r\n }\r\n\r\n this.$theme = value;\r\n }\r\n\r\n /**\r\n * Get the language attribute.\r\n *\r\n * @type {object}\r\n */\r\n get language() {\r\n return this.$language;\r\n }\r\n\r\n set language(value) {\r\n if(isString(value)) {\r\n value = language(value);\r\n }\r\n\r\n if(!validate(value, 'object')) {\r\n error(ConsoleMessages.language);\r\n }\r\n\r\n this.$language = value;\r\n }\r\n\r\n /**\r\n * Translate a string.\r\n *\r\n * @param {string} string - The string to translate.\r\n * @return {string} - The translated string. If no tranlation found, the\r\n * untranslated string is returned.\r\n */\r\n translate(string) {\r\n return translate(string, this.language);\r\n }\r\n\r\n /**\r\n * Alias to translate(string);\r\n *\r\n * @alias DomComponent.translate\r\n */\r\n t(string) {\r\n return this.translate(string);\r\n }\r\n\r\n /**\r\n * Render the DOM component.\r\n *\r\n * @return {HTMLElement} - The `el` attribute.\r\n */\r\n\trender() {\r\n const el = createElement('div', {\r\n class: this.className === 'flip-clock' ? this.className : 'flip-clock-' + this.className\r\n });\r\n\r\n this.theme[this.name](el, this);\r\n\r\n if(!this.el) {\r\n this.el = el;\r\n }\r\n else if(this.el.innerHTML !== el.innerHTML) {\r\n this.el = swap(el, this.el);\r\n }\r\n\r\n return this.el;\r\n\t}\r\n\r\n /**\r\n * Mount a DOM component to a parent node.\r\n *\r\n * @param {HTMLElement} parent - The parent DOM node.\r\n * @param {(false|HTMLElement)} [before=false] - If `false`, element is\r\n * appended to the parent node. If an instance of an `HTMLElement`,\r\n * the component will be inserted before the specified element.\r\n * @return {HTMLElement} - The `el` attribute.\r\n */\r\n mount(parent, before = false) {\r\n this.render();\r\n this.parent = parent;\r\n\r\n if(!before) {\r\n this.parent.appendChild(this.el);\r\n }\r\n else {\r\n this.parent.insertBefore(this.el, before);\r\n }\r\n\r\n return this.el;\r\n }\r\n\r\n}\r\n","import DomComponent from './DomComponent';\r\n\r\n/**\r\n * Create a new `Divider` instance.\r\n *\r\n * The purpose of this class is to return a unique class name so the theme can\r\n * render it appropriately, since each `DomComponent` can receive its own template\r\n * from the theme.\r\n *\r\n * @class Divider\r\n * @extends DomComponent\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n */\r\nexport default class Divider extends DomComponent {\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'Divider';\r\n }\r\n\r\n}\r\n","import DomComponent from './DomComponent';\r\nimport { isObject } from '../Helpers/Functions';\r\n\r\nexport default class ListItem extends DomComponent {\r\n\r\n /**\r\n * This class is used to represent a single digits in a `List`.\r\n *\r\n * @class ListItem\r\n * @extends DomComponent\r\n * @param {(Number|String)} value - The value of the `ListItem`.\r\n * @param {object|undefined} [attributes] - The instance attributes.\r\n */\r\n constructor(value, attributes) {\r\n super(Object.assign({\r\n value: value\r\n }, isObject(value) ? value : null, attributes));\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'ListItem';\r\n }\r\n\r\n}\r\n","import Divider from './Divider';\r\nimport ListItem from './ListItem';\r\nimport DomComponent from './DomComponent';\r\nimport { next, prev, } from '../Helpers/Value';\r\nimport { isObject, } from '../Helpers/Functions';\r\n\r\nexport default class List extends DomComponent {\r\n\r\n /**\r\n * This class is used to add a digit to the clock face. This class is called\r\n * `List` because it contains a list of `ListItem`'s which are used to\r\n * create flip effects. In the context of FlipClock.js a `List` represents\r\n * one single digit.\r\n *\r\n * @class List\r\n * @extends DomComponent\r\n * @param {Number|String|Object} label - The active value. If an object, it\r\n * is assumed that it is the instance attributes.\r\n * @param {object|undefined} [attributes] - The instance attributes.\r\n */\r\n constructor(value, attributes) {\r\n super(Object.assign({\r\n value: value,\r\n items: [],\r\n }, isObject(value) ? value : null, attributes));\r\n }\r\n\r\n /**\r\n * Get the `value` attribute.\r\n *\r\n * @type {(Number|String)}\r\n */\r\n get value() {\r\n return this.$value;\r\n }\r\n set value(value) {\r\n this.$value = value;\r\n }\r\n\r\n /**\r\n * Get the `items` attribute.\r\n *\r\n * @type {(Number|String)}\r\n */\r\n get items() {\r\n return this.$items;\r\n }\r\n\r\n set items(value) {\r\n this.$items = value;\r\n }\r\n\r\n /**\r\n * Helper method to instantiate a new `ListItem`.\r\n *\r\n * @param {(Number|String)} value - The `ListItem` value.\r\n * @param {(Object|undefined)} [attributes] - The instance attributes.\r\n * @return {ListItem} - The instantiated `ListItem`.\r\n */\r\n createListItem(value, attributes) {\r\n const item = new ListItem(value, Object.assign({\r\n theme: this.theme,\r\n language: this.language\r\n }, attributes));\r\n\r\n this.$items.push(item);\r\n\r\n return item;\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'List';\r\n }\r\n\r\n}\r\n","import DomComponent from './DomComponent';\r\nimport { isObject, isArray } from '../Helpers/Functions';\r\n\r\nexport default class Group extends DomComponent {\r\n\r\n /**\r\n * This class is used to group values within a clock face. How the groups\r\n * are displayed is determined by the theme.\r\n *\r\n * @class Group\r\n * @extends DomComponent\r\n * @param {Array|Object} items - An array `List` instances or an object of\r\n * attributes. If not an array, assumed to be the attributes.\r\n * @param {object|undefined} [attributes] - The instance attributes.\r\n */\r\n constructor(items, attributes) {\r\n super(Object.assign({\r\n items: isArray(items) ? items : []\r\n }, (isObject(items) ? items : null), attributes));\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'Group';\r\n }\r\n\r\n}\r\n","import DomComponent from './DomComponent';\r\nimport { isObject } from '../Helpers/Functions';\r\n\r\nexport default class Label extends DomComponent {\r\n\r\n /**\r\n * This class is used to add a label to the clock face.\r\n *\r\n * @class Label\r\n * @extends DomComponent\r\n * @param {Number|String|Object} label - The label attribute. If an object,\r\n * it is assumed that it is the instance attributes.\r\n * @param {object|undefined} [attributes] - The instance attributes.\r\n */\r\n constructor(label, attributes) {\r\n super(Object.assign({\r\n label: label\r\n }, (isObject(label) ? label : null), attributes));\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'Label';\r\n }\r\n\r\n}\r\n","import Component from './Component';\r\nimport { isObject, isNumber, callback } from '../Helpers/Functions';\r\n\r\nexport default class Timer extends Component {\r\n\r\n /**\r\n * Create a new `Timer` instance.\r\n *\r\n * @class Timer\r\n * @extends Component\r\n * @param {(Object|Number)} interval - The interval passed as a `Number`,\r\n * or can set the attribute of the class with an object.\r\n */\r\n constructor(interval) {\r\n super(Object.assign({\r\n count: 0,\r\n handle: null,\r\n started: null,\r\n running: false,\r\n interval: isNumber(interval) ? interval : null,\r\n }, isObject(interval) ? interval : null));\r\n }\r\n\r\n /**\r\n * The `elapsed` attribute.\r\n *\r\n * @type {Number}\r\n */\r\n get elapsed() {\r\n return !this.lastLoop ? 0 : this.lastLoop - (\r\n this.started ? this.started.getTime() : new Date().getTime()\r\n );\r\n }\r\n\r\n /**\r\n * The `isRunning` attribute.\r\n *\r\n * @type {boolean}\r\n */\r\n get isRunning() {\r\n return this.running === true;\r\n }\r\n\r\n /**\r\n * The `isStopped` attribute.\r\n *\r\n * @type {boolean}\r\n */\r\n get isStopped() {\r\n return this.running === false;\r\n }\r\n\r\n /**\r\n * Resets the timer.\r\n *\r\n * @param {(Function|undefined)} fn - The interval callback.\r\n * @return {Timer} - The `Timer` instance.\r\n */\r\n reset(fn) {\r\n this.stop(() => {\r\n this.count = 0;\r\n this.start(() => callback.call(this, fn));\r\n this.emit('reset');\r\n });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Starts the timer.\r\n *\r\n * @param {Function} fn - The interval callback.\r\n * @return {Timer} - The `Timer` instance.\r\n */\r\n start(fn) {\r\n this.started = new Date;\r\n this.lastLoop = Date.now();\r\n this.running = true;\r\n this.emit('start');\r\n\r\n const loop = () => {\r\n if(Date.now() - this.lastLoop >= this.interval) {\r\n callback.call(this, fn);\r\n this.lastLoop = Date.now();\r\n this.emit('interval');\r\n this.count++;\r\n }\r\n\r\n this.handle = window.requestAnimationFrame(loop);\r\n\r\n return this;\r\n };\r\n\r\n return loop();\r\n }\r\n\r\n /**\r\n * Stops the timer.\r\n *\r\n * @param {Function} fn - The stop callback.\r\n * @return {Timer} - The `Timer` instance.\r\n */\r\n stop(fn) {\r\n if(this.isRunning) {\r\n setTimeout(() => {\r\n window.cancelAnimationFrame(this.handle);\r\n\r\n this.running = false;\r\n\r\n callback.call(this, fn);\r\n\r\n this.emit('stop');\r\n });\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'Timer';\r\n }\r\n}\r\n","import Face from '../Components/Face';\r\n\r\n/**\r\n * @classdesc This face is designed to increment and decrement numberic values,\r\n * not `Date` objects.\r\n * @extends Face\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class Counter extends Face {\r\n\r\n increment(instance, value = 1) {\r\n instance.value = this.value.value + value;\r\n }\r\n\r\n decrement(instance, value = 1) {\r\n instance.value = this.value.value - value;\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'Counter';\r\n }\r\n}\r\n","import Face from '../Components/Face';\r\nimport {isNull, isNumber, isUndefined, noop, round} from '../Helpers/Functions';\r\n\r\n/**\r\n * @classdesc This face is meant to display a clock that shows minutes, and\r\n * seconds.\r\n * @extends Face\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class MinuteCounter extends Face {\r\n\r\n defaultDataType() {\r\n return Date;\r\n }\r\n\r\n defaultAttributes() {\r\n return {\r\n showSeconds: true,\r\n showLabels: true\r\n };\r\n }\r\n\r\n shouldStop(instance) {\r\n if(isNull(instance.stopAt) || isUndefined(instance.stopAt)) {\r\n return false;\r\n }\r\n\r\n if(this.stopAt instanceof Date) {\r\n return this.countdown ?\r\n this.stopAt.getTime() >= this.value.value.getTime():\r\n this.stopAt.getTime() <= this.value.value.getTime();\r\n }\r\n else if(isNumber(this.stopAt)) {\r\n const diff = Math.floor((this.value.value.getTime() - this.originalValue.getTime()) / 1000);\r\n\r\n return this.countdown ?\r\n this.stopAt >= diff:\r\n this.stopAt <= diff;\r\n }\r\n\r\n throw new Error(`the stopAt property must be an instance of Date or Number.`);\r\n }\r\n\r\n increment(instance, value = 0) {\r\n instance.value = new Date(this.value.value.getTime() + value + (new Date().getTime() - instance.timer.lastLoop));\r\n }\r\n\r\n decrement(instance, value = 0) {\r\n instance.value = new Date(this.value.value.getTime() - value - (new Date().getTime() - instance.timer.lastLoop));\r\n }\r\n\r\n format(instance, value) {\r\n const started = instance.timer.isRunning ? instance.timer.started : new Date;\r\n\r\n return [\r\n [this.getMinutes(value, started)],\r\n this.showSeconds ? [this.getSeconds(value, started)] : null\r\n ].filter(noop);\r\n }\r\n\r\n getMinutes(a, b) {\r\n return round(this.getTotalSeconds(a, b) / 60);\r\n }\r\n\r\n getSeconds(a, b) {\r\n const totalSeconds = this.getTotalSeconds(a, b);\r\n\r\n return Math.abs(Math.ceil(totalSeconds === 60 ? 0 : totalSeconds % 60));\r\n }\r\n\r\n getTotalSeconds(a, b) {\r\n return a.getTime() === b.getTime() ? 0 : Math.round((a.getTime() - b.getTime()) / 1000);\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'MinuteCounter';\r\n }\r\n}\r\n","import MinuteCounter from './MinuteCounter';\r\n\r\n/**\r\n * @classdesc This face is meant to display a clock that shows\r\n * hours, minutes, and seconds.\r\n * @extends Face\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class HourCounter extends MinuteCounter {\r\n\r\n format(instance, value) {\r\n const now = !instance.timer.started ? new Date : instance.timer.started;\r\n const originalValue = value || instance.originalValue;\r\n const a = !this.countdown ? now : originalValue;\r\n const b = !this.countdown ? originalValue : now;\r\n\r\n const data = [\r\n [this.getHours(a, b)],\r\n [this.getMinutes(a, b)]\r\n ];\r\n\r\n if(this.showSeconds) {\r\n data.push([this.getSeconds(a, b)]);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n getMinutes(a, b) {\r\n return Math.abs(super.getMinutes(a, b) % 60);\r\n }\r\n\r\n getHours(a, b) {\r\n return Math.floor(this.getTotalSeconds(a, b) / 60 / 60);\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'HourCounter';\r\n }\r\n}\r\n","import HourCounter from './HourCounter';\r\n\r\n/**\r\n * @classdesc This face is meant to display a clock that shows days, hours,\r\n * minutes, and seconds.\r\n * @extends HourCounter\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class DayCounter extends HourCounter {\r\n\r\n format(instance, value) {\r\n const now = !instance.started ? new Date : value;\r\n const originalValue = value || instance.originalValue;\r\n const a = !this.countdown ? now : originalValue;\r\n const b = !this.countdown ? originalValue : now;\r\n\r\n const data = [\r\n [this.getDays(a, b)],\r\n [this.getHours(a, b)],\r\n [this.getMinutes(a, b)]\r\n ];\r\n\r\n if(this.showSeconds) {\r\n data.push([this.getSeconds(a, b)]);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n getDays(a, b) {\r\n return Math.floor(this.getTotalSeconds(a, b) / 60 / 60 / 24);\r\n }\r\n\r\n getHours(a, b) {\r\n return Math.abs(super.getHours(a, b) % 24);\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'DayCounter';\r\n }\r\n}\r\n","import Face from '../Components/Face';\r\nimport { callback } from '../Helpers/Functions';\r\n\r\n/**\r\n * @classdesc This face shows the current time in twenty-four hour format.\r\n * @extends Face\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class TwentyFourHourClock extends Face {\r\n\r\n defaultDataType() {\r\n return Date;\r\n }\r\n\r\n defaultValue() {\r\n return new Date;\r\n }\r\n\r\n defaultAttributes() {\r\n return {\r\n showSeconds: true,\r\n showLabels: false\r\n };\r\n }\r\n\r\n format(instance, value) {\r\n if(!value) {\r\n value = new Date;\r\n }\r\n\r\n const groups = [\r\n [value.getHours()],\r\n [value.getMinutes()]\r\n ];\r\n\r\n if(this.showSeconds) {\r\n groups.push([value.getSeconds()]);\r\n }\r\n\r\n return groups;\r\n }\r\n\r\n increment(instance, offset = 0) {\r\n instance.value = new Date(this.value.value.getTime() + offset + (new Date().getTime() - instance.timer.lastLoop));\r\n }\r\n\r\n decrement(instance, offset = 0) {\r\n instance.value = new Date(this.value.value.getTime() - offset - (new Date().getTime() - instance.timer.lastLoop));\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'TwentyFourHourClock';\r\n }\r\n}\r\n","import TwentyFourHourClock from './TwentyFourHourClock';\r\n\r\n/**\r\n * @classdesc This face shows the current time in twelve hour format, with AM\r\n * and PM.\r\n * @extends Face\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class TwelveHourClock extends TwentyFourHourClock {\r\n\r\n defaultAttributes() {\r\n return {\r\n showLabels: false,\r\n showSeconds: true,\r\n showMeridium: true\r\n };\r\n }\r\n\r\n format(instance, value) {\r\n if(!value) {\r\n value = new Date;\r\n }\r\n\r\n const hours = value.getHours();\r\n\t\tconst groups = [\r\n\t\t\thours > 12 ? hours - 12 : (hours === 0 ? 12 : hours),\r\n\t\t\tvalue.getMinutes()\r\n\t\t];\r\n\r\n this.meridium = hours > 12 ? 'pm' : 'am';\r\n\r\n\t\tif(this.showSeconds) {\r\n\t\t\tgroups.push(value.getSeconds());\r\n\t\t}\r\n\r\n\t\treturn groups;\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'TwelveHourClock';\r\n }\r\n}\r\n","import DayCounter from './DayCounter';\r\n\r\n/**\r\n * @classdesc This face is meant to display a clock that shows weeks, days,\r\n * hours, minutes, and seconds.\r\n * @extends Face\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class WeekCounter extends DayCounter {\r\n\r\n format(instance, value) {\r\n const now = !instance.timer.started ? new Date : value;\r\n const originalValue = value || instance.originalValue;\r\n const a = !this.countdown ? now : originalValue;\r\n const b = !this.countdown ? originalValue : now;\r\n\r\n const data = [\r\n [this.getWeeks(a, b)],\r\n [this.getDays(a, b)],\r\n [this.getHours(a, b)],\r\n [this.getMinutes(a, b)]\r\n ];\r\n\r\n if(this.showSeconds) {\r\n data.push([this.getSeconds(a, b)]);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n getWeeks(a, b) {\r\n return Math.floor(this.getTotalSeconds(a, b) / 60 / 60 / 24 / 7);\r\n }\r\n\r\n getDays(a, b) {\r\n return Math.abs(super.getDays(a, b) % 7);\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'WeekCounter';\r\n }\r\n}\r\n","import WeekCounter from './WeekCounter';\r\n\r\n/**\r\n * @classdesc This face is meant to display a clock that shows years, weeks,\r\n * days, hours, minutes, and seconds.\r\n * @extends Face\r\n * @param {(FaceValue|object)} value - The `Face` value. If not an instance\r\n * of FaceValue, this argument is assumed to be the instance attributes.\r\n * @param {(object|undefined)} [attributes] - The instance attributes.\r\n * @memberof Faces\r\n */\r\nexport default class YearCounter extends WeekCounter {\r\n\r\n format(instance, value) {\r\n const now = !instance.timer.started ? new Date : value;\r\n const originalValue = value || instance.originalValue;\r\n const a = !this.countdown ? now : originalValue;\r\n const b = !this.countdown ? originalValue : now;\r\n\r\n const data = [\r\n [this.getYears(a, b)],\r\n [this.getWeeks(a, b)],\r\n [this.getDays(a, b)],\r\n [this.getHours(a, b)],\r\n [this.getMinutes(a, b)]\r\n ];\r\n\r\n if(this.showSeconds) {\r\n data.push([this.getSeconds(a, b)]);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n getYears(a, b) {\r\n return Math.floor(Math.max(0, this.getTotalSeconds(a, b) / 60 / 60 / 24 / 7 / 52));\r\n }\r\n\r\n getWeeks(a, b) {\r\n return Math.abs(super.getWeeks(a, b) % 52);\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'YearCounter';\r\n }\r\n}\r\n","import { Counter } from '../Faces';\r\nimport { Original } from '../Themes';\r\nimport { English } from '../Languages';\r\n\r\n/**\r\n * @alias DefaultValues\r\n * @type {object}\r\n * @memberof module:Config/DefaultValues\r\n */\r\nexport default {\r\n face: Counter,\r\n theme: Original,\r\n language: English\r\n};\r\n","import Divider from './Divider';\r\nimport FlipClock from './FlipClock';\r\nimport Group from './Group';\r\nimport Label from './Label';\r\nimport List from './List';\r\nimport ListItem from './ListItem';\r\nimport * as faces from './Faces';\r\n\r\nexport default {\r\n Divider,\r\n FlipClock,\r\n Group,\r\n Label,\r\n List,\r\n ListItem,\r\n faces\r\n};\r\n","import Face from './Face';\r\nimport List from './List';\r\nimport Group from './Group';\r\nimport Label from './Label';\r\nimport Timer from './Timer';\r\nimport Divider from './Divider';\r\nimport * as Faces from '../Faces';\r\nimport FaceValue from './FaceValue';\r\nimport DomComponent from './DomComponent';\r\nimport validate from '../Helpers/Validate';\r\nimport DefaultValues from '../Config/DefaultValues';\r\nimport ConsoleMessages from '../Config/ConsoleMessages';\r\nimport { flatten, isNull, isString, isObject, isUndefined, isFunction, error } from '../Helpers/Functions';\r\n\r\nexport default class FlipClock extends DomComponent {\r\n \r\n /**\r\n * Create a new `FlipClock` instance.\r\n *\r\n * @class FlipClock\r\n * @extends DomComponent\r\n * @param {HTMLElement} el - The HTML element used to bind clock DOM node.\r\n * @param {*} value - The value that is passed to the clock face.\r\n * @param {object|undefined} attributes - {@link FlipClock.Options} passed an object with key/value.\r\n */\r\n \r\n /**\r\n * @namespace FlipClock.Options\r\n * @classdesc An object of key/value pairs that will be used to set the attributes.\r\n * \r\n * ##### Example:\r\n * \r\n * {\r\n * face: 'DayCounter',\r\n * language: 'es',\r\n * timer: Timer.make(500)\r\n * }\r\n * \r\n * @property {string|Face} [face={@link Faces.DayCounter}] - The clock's {@link Face} instance.\r\n * @property {number} [interval=1000] - The clock's interval rate (in milliseconds).\r\n * @property {object} [theme={@link Themes.Original}] - The clock's theme.\r\n * @property {string|object} [language={@link Languages.English}] - The clock's language.\r\n * @property {Timer} [timer={@link Timer}] - The clock's timer.\r\n */\r\n \r\n constructor(el, value, attributes) {\r\n if(!validate(el, HTMLElement)) {\r\n error(ConsoleMessages.element);\r\n }\r\n\r\n if(isObject(value) && !attributes) {\r\n attributes = value;\r\n value = undefined;\r\n }\r\n\r\n const face = attributes.face || DefaultValues.face;\r\n\r\n delete attributes.face;\r\n\r\n super(Object.assign({\r\n originalValue: value,\r\n theme: DefaultValues.theme,\r\n language: DefaultValues.language,\r\n timer: Timer.make(attributes.interval || 1000),\r\n }, attributes));\r\n\r\n if(!this.face) {\r\n this.face = face;\r\n }\r\n\r\n this.mount(el);\r\n }\r\n\r\n /**\r\n * The clock `Face`.\r\n *\r\n * @type {Face}\r\n */\r\n get face() {\r\n return this.$face;\r\n }\r\n\r\n set face(value) {\r\n if(!validate(value, [Face, 'string', 'function'])) {\r\n error(ConsoleMessages.face);\r\n }\r\n\r\n this.$face = (Faces[value] || value).make(Object.assign(this.getPublicAttributes(), {\r\n originalValue: this.face ? this.face.originalValue : undefined\r\n }));\r\n\r\n this.$face.initialized(this);\r\n\r\n if(this.value) {\r\n this.$face.value = this.face.createFaceValue(this, this.value.value);\r\n }\r\n else if(!this.value) {\r\n this.value = this.originalValue;\r\n }\r\n\r\n this.el && this.render();\r\n }\r\n\r\n /**\r\n * The `stopAt` attribute.\r\n *\r\n * @type {*}\r\n */\r\n get stopAt() {\r\n return isFunction(this.$stopAt) ? this.$stopAt(this) : this.$stopAt;\r\n }\r\n\r\n set stopAt(value) {\r\n this.$stopAt = value;\r\n }\r\n\r\n /**\r\n * The `timer` instance.\r\n *\r\n * @type {Timer}\r\n */\r\n get timer() {\r\n return this.$timer;\r\n }\r\n\r\n set timer(timer) {\r\n if(!validate(timer, Timer)) {\r\n error(ConsoleMessages.timer);\r\n }\r\n\r\n this.$timer = timer;\r\n }\r\n\r\n /**\r\n * Helper method to The clock's `FaceValue` instance.\r\n *\r\n * @type {FaceValue|null}\r\n */\r\n get value() {\r\n return this.face ? this.face.value : null;\r\n }\r\n\r\n set value(value) {\r\n if(!this.face) {\r\n throw new Error('A face must be set before setting a value.');\r\n }\r\n\r\n if(value instanceof FaceValue) {\r\n this.face.value = value;\r\n }\r\n else if(this.value) {\r\n this.face.value = this.face.value.clone(value);\r\n }\r\n else {\r\n this.face.value = this.face.createFaceValue(this, value);\r\n }\r\n\r\n this.el && this.render();\r\n }\r\n\r\n /**\r\n * The `originalValue` attribute.\r\n *\r\n * @type {*}\r\n */\r\n get originalValue() {\r\n if(isFunction(this.$originalValue) && !this.$originalValue.name) {\r\n return this.$originalValue();\r\n }\r\n\r\n if(!isUndefined(this.$originalValue) && !isNull(this.$originalValue)) {\r\n return this.$originalValue;\r\n }\r\n\r\n return this.face ? this.face.defaultValue() : undefined;\r\n }\r\n\r\n set originalValue(value) {\r\n this.$originalValue = value;\r\n }\r\n\r\n /**\r\n * Mount the clock to the parent DOM element.\r\n *\r\n * @param {HTMLElement} el - The parent `HTMLElement`.\r\n * @return {FlipClock} - The `FlipClock` instance.\r\n */\r\n mount(el) {\r\n super.mount(el);\r\n\r\n this.face.mounted(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Render the clock's DOM nodes.\r\n *\r\n * @return {HTMLElement} - The parent `HTMLElement`.\r\n */\r\n render() {\r\n // Call the parent render function\r\n super.render();\r\n\r\n // Check to see if the face has a render function defined in the theme.\r\n // This allows a face to completely re-render or add to the theme.\r\n // This allows face specific interfaces for a theme.\r\n if(this.theme.faces[this.face.name]) {\r\n this.theme.faces[this.face.name](this.el, this);\r\n }\r\n\r\n // Pass the clock instance to the rendered() function on the face.\r\n // This allows global modifications to the rendered templates not\r\n // theme specific.\r\n this.face.rendered(this);\r\n\r\n // Return the rendered `HTMLElement`.\r\n return this.el;\r\n }\r\n\r\n /**\r\n * Start the clock.\r\n *\r\n * @param {Function} fn - The interval callback.\r\n * @return {FlipClock} - The `FlipClock` instance.\r\n */\r\n start(fn) {\r\n if(!this.timer.started) {\r\n this.value = this.originalValue;\r\n }\r\n\r\n isUndefined(this.face.stopAt) && (this.face.stopAt = this.stopAt);\r\n isUndefined(this.face.originalValue) && (this.face.originalValue = this.originalValue);\r\n\r\n this.timer.start(() => {\r\n this.face.interval(this, fn);\r\n });\r\n\r\n this.face.started(this);\r\n\r\n return this.emit('start');\r\n }\r\n\r\n /**\r\n * Stop the clock.\r\n *\r\n * @param {Function} fn - The stop callback.\r\n * @return {FlipClock} - The `FlipClock` instance.\r\n */\r\n stop(fn) {\r\n this.timer.stop(fn);\r\n this.face.stopped(this);\r\n\r\n return this.emit('stop');\r\n }\r\n\r\n /**\r\n * Reset the clock to the original value.\r\n *\r\n * @param {Function} fn - The interval callback.\r\n * @return {FlipClock} - The `FlipClock` instance.\r\n */\r\n reset(fn) {\r\n this.value = this.originalValue;\r\n this.timer.reset(() => this.interval(this, fn));\r\n this.face.reset(this);\r\n\r\n return this.emit('reset');\r\n }\r\n\r\n /**\r\n * Helper method to increment the clock's value.\r\n *\r\n * @param {*|undefined} value - Increment the clock by the specified value.\r\n * If no value is passed, then the default increment is determined by\r\n * the Face, which is usually `1`.\r\n * @return {FlipClock} - The `FlipClock` instance.\r\n */\r\n increment(value) {\r\n this.face.increment(this, value);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Helper method to decrement the clock's value.\r\n *\r\n * @param {*|undefined} value - Decrement the clock by the specified value.\r\n * If no value is passed, then the default decrement is determined by\r\n * the `Face`, which is usually `1`.\r\n * @return {FlipClock} - The `FlipClock` instance.\r\n */\r\n decrement(value) {\r\n this.face.decrement(this, value);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Helper method to instantiate a new `Divider`.\r\n *\r\n * @param {object|undefined} [attributes] - The attributes passed to the\r\n * `Divider` instance.\r\n * @return {Divider} - The instantiated Divider.\r\n */\r\n createDivider(attributes) {\r\n return Divider.make(Object.assign({\r\n theme: this.theme,\r\n language: this.language\r\n }, attributes));\r\n }\r\n\r\n /**\r\n * Helper method to instantiate a new `List`.\r\n *\r\n * @param {*} value - The `List` value.\r\n * @param {object|undefined} [attributes] - The attributes passed to the\r\n * `List` instance.\r\n * @return {List} - The instantiated `List`.\r\n */\r\n createList(value, attributes) {\r\n return List.make(value, Object.assign({\r\n theme: this.theme,\r\n language: this.language\r\n }, attributes));\r\n }\r\n\r\n /**\r\n * Helper method to instantiate a new `Label`.\r\n *\r\n * @param {*} value - The `Label` value.\r\n * @param {object|undefined} [attributes] - The attributes passed to the\r\n * `Label` instance.\r\n * @return {Label} - The instantiated `Label`.\r\n */\r\n createLabel(value, attributes) {\r\n return Label.make(value, Object.assign({\r\n theme: this.theme,\r\n language: this.language\r\n }, attributes));\r\n }\r\n\r\n /**\r\n * Helper method to instantiate a new `Group`.\r\n *\r\n * @param {array} items - An array of `List` items to group.\r\n * @param {Group|undefined} [attributes] - The attributes passed to the\r\n * `Group` instance.\r\n * @return {Group} - The instantiated `Group`.\r\n */\r\n createGroup(items, attributes) {\r\n return Group.make(items, Object.assign({\r\n theme: this.theme,\r\n language: this.language\r\n }, attributes));\r\n }\r\n\r\n /**\r\n * The `defaults` attribute.\r\n *\r\n * @type {object}\r\n */\r\n static get defaults() {\r\n return DefaultValues;\r\n }\r\n\r\n /**\r\n * Define the name of the class.\r\n *\r\n * @return {string}\r\n */\r\n static defineName() {\r\n return 'FlipClock';\r\n }\r\n\r\n /**\r\n * Helper method to set the default `Face` value.\r\n *\r\n * @param {Face} value - The default `Face` class.This should be a\r\n * constructor.\r\n * @return {void}\r\n */\r\n static setDefaultFace(value) {\r\n if(!validate(value, Face)) {\r\n error(ConsoleMessages.face);\r\n }\r\n\r\n DefaultValues.face = value;\r\n }\r\n\r\n /**\r\n * Helper method to set the default theme.\r\n *\r\n * @param {object} value - The default theme.\r\n * @return {void}\r\n */\r\n static setDefaultTheme(value) {\r\n if(!validate(value, 'object')) {\r\n error(ConsoleMessages.theme);\r\n }\r\n\r\n DefaultValues.theme = value;\r\n }\r\n\r\n /**\r\n * Helper method to set the default language.\r\n *\r\n * @param {object} value - The default language.\r\n * @return {void}\r\n */\r\n static setDefaultLanguage(value) {\r\n if(!validate(value, 'object')) {\r\n error(ConsoleMessages.language);\r\n }\r\n\r\n DefaultValues.language = value;\r\n }\r\n\r\n}\r\n"],"names":["error","string","Error","callback","fn","isFunction","args","call","this","round","value","isNegativeZero","isNegative","Math","ceil","floor","toString","noop","isUndefined","isNull","chain","before","after","concatMap","x","map","reduce","y","concat","flatten","deepFlatten","Array","isArray","length","Infinity","isConstructor","Function","name","isString","isObject","type","isNumber","isNaN","kebabCase","replace","toLowerCase","digitize","options","prepend","number","prependLeadingZero","split","Object","assign","minimumDigits","digits","arr","min","i","unshift","format","parseFloat","findRange","char","RANGES","code","charCodeAt","max","stringFromCharCodeBy","String","fromCharCode","next","range","join","prev","validate","success","forEach","arg","_typeof","language","LANGUAGES","values","find","aliases","indexOf","translate","from","lang","dictionary","swap","subject","existing","parentNode","replaceChild","setAttributes","el","attributes","setAttribute","appendChildren","children","filter","child","HTMLElement","appendChild","createElement","document","innerHTML","instance","index","childNodes","querySelector","group","groupEl","querySelectorAll","lists","listValue","createList","domValue","countdown","animationRate","face","delay","createGroup","render","items","item","t","label","beforeValue","classList","add","style","animationDelay","animationDuration","createListItem","active","className","createDivider","mount","showSeconds","showLabels","createLabel","TwentyFourHourClock","showMeridium","meridium","parent","Component","events","key","event","apply","_this","push","_this2","off","on","hasOwnProperty","getOwnPropertyNames","_this3","getAttribute","keys","getAttributes","match","obj","_this4","constructor","defineName","$events","FaceValue","getPublicAttributes","$digits","$value","theme","date","element","faceValue","timer","Face","undefined","autoStart","defaultAttributes","defaultValue","decrement","increment","shouldStop","stop","emit","stopAt","amount","isStopped","window","requestAnimationFrame","start","make","defaultDataType","createFaceValue","$stopAt","$originalValue","DomComponent","insertBefore","$el","ConsoleMessages","$parent","$theme","$language","Divider","ListItem","List","$items","Group","Label","Timer","interval","count","handle","started","running","Date","lastLoop","now","loop","isRunning","setTimeout","cancelAnimationFrame","getTime","Counter","MinuteCounter","diff","originalValue","getMinutes","getSeconds","a","b","getTotalSeconds","totalSeconds","abs","HourCounter","data","getHours","_get","DayCounter","getDays","groups","offset","TwelveHourClock","hours","WeekCounter","getWeeks","YearCounter","getYears","FlipClock","faces","English","DefaultValues","mounted","rendered","stopped","reset","$face","Faces","initialized","$timer","clone"],"mappings":"08EAiBO,QAASA,OAAMC,QACZC,OAAMD,GAaT,QAASE,UAASC,MAClBC,WAAWD,GAAK,4BADSE,mCAAAA,0BAEjBF,GAAGG,WAAHH,GAAQI,aAASF,KAYzB,QAASG,OAAMC,SACXC,gBACHD,EAAQE,WAAWF,GAASG,KAAKC,KAAKJ,GAASG,KAAKE,MAAML,KACzD,IAAMA,GAAOM,WAAaN,EAW5B,QAASO,MAAKP,UACTQ,YAAYR,KAAWS,OAAOT,GAanC,QAASU,OAAMC,EAAQC,SACnB,kBAAMA,GAAMD,MAWhB,QAASE,WAAUnB,SACf,UAAAoB,SACIA,GAAEC,IAAIrB,GAAIsB,OAAO,SAACF,EAAGG,SAAMH,GAAEI,OAAOD,SAY5C,QAASE,SAAQnB,SACba,WAAU,SAAAb,SAASA,KAAOA,GAW9B,QAASoB,aAAYN,SACjBD,WAAU,SAAAC,SAAKO,OAAMC,QAAQR,GAAKM,YAAaN,GAAKA,IAAGA,GAuB3D,QAASS,QAAOvB,SACZoB,aAAYpB,GAAOuB,OAWvB,QAAStB,gBAAeD,SACpB,GAAIG,KAAKJ,MAAMC,KAAYwB,EAAAA,EAW/B,QAAStB,YAAWF,SAChBC,gBAAeD,IAAUA,EAAQ,EAWrC,QAASS,QAAOT,SACF,QAAVA,EAWJ,QAASQ,aAAYR,cACA,KAAVA,EAWX,QAASyB,eAAczB,SAClBA,aAAiB0B,aAAe1B,EAAM2B,KAW3C,QAASC,UAAS5B,SACG,gBAAVA,GAWX,QAASsB,SAAQtB,SACbA,aAAiBqB,OAWrB,QAASQ,UAAS7B,MACf8B,WAAc9B,SACJ,OAATA,IAAkBsB,QAAQtB,KACrB,UAAR8B,GAA4B,YAARA,GAYrB,QAASnC,YAAWK,SAChBA,aAAiB0B,UAWrB,QAASK,UAAS/B,UACbgC,MAAMhC,GAWX,QAASiC,WAAU1C,SACfA,GAAO2C,QAAQ,kBAAmB,SAASA,QAAQ,OAAQ,KAAKC,cC9P5D,QAASC,UAASpC,EAAOqC,WAM3BC,SAAQC,UACaF,EAAQG,oBACS,IAAvCD,EAAOjC,WAAWmC,MAAM,IAAIlB,OAEJ,IAAM,IAAIL,OAAOqB,SATjDF,GAAUK,OAAOC,QACbC,cAAe,EACfJ,oBAAoB,GACrBH,WASMQ,QAAOC,EAAKC,MACXxB,GAASH,YAAY0B,GAAKvB,UAE7BA,EAASwB,MACJ,GAAIC,GAAI,EAAGA,EAAID,EAAMxB,EAAQyB,IAC7BF,EAAI,GAAGG,QAAQ,WAIhBH,IAGG3B,SAASnB,IAAQe,IAAI,SAAAwB,SACxBpB,SAAQC,aAAamB,IAASxB,IAAI,SAAAwB,SAC9BD,SAAQC,GAAQE,MAAM,SAEjCJ,EAAQO,eAAiB,GCXjC,QAASM,QAAO3D,EAAQuC,UACbA,OACE,eACMqB,YAAW5D,SAGnBA,GAeX,QAAS6D,WAAUC,OACX,GAAML,KAAKM,GAAQ,IACbC,GAAOF,EAAK/C,WAAWkD,WAAW,MAErCF,EAAON,GAAGD,KAAOQ,GAAQD,EAAON,GAAGS,KAAOF,QAClCD,GAAON,SAIf,MAcX,QAASU,sBAAqBL,EAAM3D,SACzBiE,QAAOC,aACVlE,EAAG0D,UAAUC,GAAOA,EAAKG,WAAW,KAcrC,QAASK,MAAK7D,SASVkD,QARYlD,EACdM,WACAmC,MAAM,IACN1B,IAAI,SAAAsC,SAAQK,sBAAqBL,EAAM,SAACS,EAAOP,UACpCO,GAASP,EAAOO,EAAML,IAAMF,EAAO,EAAIO,EAAMf,QAExDgB,KAAK,YAEsB/D,IAa7B,QAASgE,MAAKhE,SASVkD,QARYlD,EACdM,WACAmC,MAAM,IACN1B,IAAI,SAAAsC,SAAQK,sBAAqBL,EAAM,SAACS,EAAOP,UACpCO,GAASP,EAAOO,EAAMf,IAAMQ,EAAO,EAAIO,EAAML,QAExDM,KAAK,YAEsB/D,IC3GrB,QAASiE,UAASjE,UACzBkE,IAAU,qBADyBtE,mCAAAA,0BAGvCuB,SAAQvB,GAAMuE,QAAQ,SAAAC,IACb3D,OAAOT,IAAUS,OAAO2D,IACxBvC,SAASuC,IAASpE,YAAiBoE,IACnCzE,WAAWyE,KAAS3C,cAAc2C,KAAuB,IAAfA,EAAIpE,IAC9C4B,SAASwC,IAASC,QAAOrE,KAAUoE,KACpCF,GAAU,KAIXA,ECjBI,QAASI,UAAS3C,SACtBA,GAAO4C,GAAU5C,EAAKQ,gBAAkBO,OAAO8B,OAAOD,IAAWE,KAAK,SAAAzE,UACjC,IAAjCA,EAAM0E,QAAQC,QAAQhD,KAC5B,KCAM,QAASiD,WAAUrF,EAAQsF,MAChCC,GAAOlD,SAASiD,GAAQP,SAASO,GAAQA,SAC5BC,EAAKC,YAAcD,GACpBvF,IAAWA,ECC1B,QAASyF,MAAKC,EAASC,SAC1BA,GAASC,YACXD,EAASC,WAAWC,aAAaH,EAASC,GAEnCD,GAGDC,EAaD,QAASG,eAAcC,EAAIC,MAC9B1D,SAAS0D,OACP,GAAMvC,KAAKuC,GACdD,EAAGE,aAAaxC,EAAGuC,EAAWvC,UAIzBsC,GAaD,QAASG,gBAAeH,EAAII,SAC/BpE,SAAQoE,IACVA,EAASC,OAAOpF,MAAM4D,QAAQ,SAAAyB,GAC1BA,YAAiBC,cACnBP,EAAGQ,YAAYF,KAKXN,EAcD,QAASS,eAAcT,EAAII,EAAUH,SACtCD,aAAcO,eAClBP,EAAKU,SAASD,cAAcT,IAG7BD,cAAcC,EAAIzD,SAAS6D,GAAYA,EAAWH,GAE9C1D,SAAS6D,IAAcpE,QAAQoE,GAIlCD,eAAeH,EAAII,GAHnBJ,EAAGW,UAAYP,EAMTJ,EChGO,mBAASA,EAAIY,GACxBT,eAAeH,GACXS,cAAc,aAAe,uBAC7BA,cAAc,aAAe,oCCF5BH,OAAMN,EAAIa,SACRb,GAAMA,EAAGc,WAAad,EAAGc,WAAWD,GAASb,EAAGa,GAAU,KAGrE,QAAS9C,OAAKiC,SACHA,GAAKA,EAAGe,cAAc,0CAA0CJ,UAAY,KAGxE,mBAASX,EAAIY,GAsBxBT,eAAeH,EArBDY,EAASlG,MAAM6C,OAAO9B,IAAI,SAACuF,EAAOxF,MACtCyF,GAAUX,MAAMM,EAASZ,GAAKY,EAASZ,GAAGkB,iBAAiB,qBAAuB,KAAM1F,GAExF2F,EAAQH,EAAMvF,IAAI,SAACf,EAAOiB,MAEtByF,GAAYrD,MADHuC,MAAMW,EAAUA,EAAQC,iBAAiB,oBAAsB,KAAMvF,UAG7EiF,GAASS,WAAW3G,GACvB4G,SAAUF,EACVG,UAAWX,EAASW,UACpBC,cAAeZ,EAASa,KAAKD,eAAiBZ,EAASa,KAAKC,gBAI7Dd,GAASe,YAAYR,KAGZ1F,IAAI,SAAAuF,SACbA,GAAMY,6BC5BG5B,EAAIY,GAKxBT,eAAeH,EAJDY,EAASiB,MAAMpG,IAAI,SAAAqG,SACtBA,GAAKF,6BCFI5B,EAAIY,GACxBZ,EAAGW,UAAYC,EAASmB,EAAEnB,EAASoB,uBCCfhC,EAAIY,MAClBqB,GAAcrB,EAASU,WACxBV,EAASW,UAAmChD,KAAKqC,EAASlG,OAArCgE,KAAKkC,EAASlG,OAGpCkG,GAASU,UAAYV,EAASU,WAAaV,EAASlG,OACpDsF,EAAGkC,UAAUC,IAAI,QAGrBnC,EAAGoC,MAAMC,yBAAoBzB,EAASY,cAAgB,QACtDxB,EAAGoC,MAAME,4BAAuB1B,EAASY,cAAgB,QAEzDZ,EAASiB,OACLjB,EAAS2B,eAAe3B,EAASlG,OAC7B8H,QAAQ,IAEZ5B,EAAS2B,eAAeN,GACpBO,QAAQ,KAIhBrC,eAAeH,EAAIY,EAASiB,MAAMpG,IAAI,SAAAqG,SAAQA,GAAKF,gCCvB/B5B,EAAIY,MAClB6B,IAAgC,IAApB7B,EAAS4B,OAAkB,UACrB,IAApB5B,EAAS4B,OAAmB,SAAW,IAG3CxC,GAAGkC,UAAUC,IAAIM,GAEjBtC,eAAeH,GACXS,cAAc,OACVA,cAAc,MAAOG,EAASlG,aAAe,QAC7C+F,cAAc,MAAOG,EAASlG,aAAe,mBACtC,uDCbKsF,EAAIY,GACxBA,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IACjDF,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IAE9CF,EAASa,KAAKmB,aACbhC,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IAGlDF,EAASa,KAAKoB,aACbjC,EAASkC,YAAY,QAAQH,MAAM3C,EAAGc,WAAW,IACjDF,EAASkC,YAAY,SAASH,MAAM3C,EAAGc,WAAW,IAClDF,EAASkC,YAAY,WAAWH,MAAM3C,EAAGc,WAAW,IAEjDF,EAASa,KAAKmB,aACbhC,EAASkC,YAAY,WAAWH,MAAM3C,EAAGc,WAAW,4BCdxCd,EAAIY,GACxBA,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IAE9CF,EAASa,KAAKmB,aACbhC,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IAGlDF,EAASa,KAAKoB,aACbjC,EAASkC,YAAY,SAASH,MAAM3C,EAAGc,WAAW,IAClDF,EAASkC,YAAY,WAAWH,MAAM3C,EAAGc,WAAW,IAEjDF,EAASa,KAAKmB,aACbhC,EAASkC,YAAY,WAAWH,MAAM3C,EAAGc,WAAW,8BCZxCd,EAAIY,GACrBA,EAASa,KAAKmB,aACbhC,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IAGlDF,EAASa,KAAKoB,aACbjC,EAASkC,YAAY,WAAWH,MAAM3C,EAAGc,WAAW,IAEjDF,EAASa,KAAKmB,aACbhC,EAASkC,YAAY,WAAWH,MAAM3C,EAAGc,WAAW,oCCTxCd,EAAIY,GACxBA,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IAE9CF,EAASa,KAAKmB,aACbhC,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IAGlDF,EAASa,KAAKoB,aACbjC,EAASkC,YAAY,SAASH,MAAM3C,EAAGc,WAAW,IAClDF,EAASkC,YAAY,WAAWH,MAAM3C,EAAGc,WAAW,IAEjDF,EAASa,KAAKmB,aACbhC,EAASkC,YAAY,WAAWH,MAAM3C,EAAGc,WAAW,gCCVxCd,EAAIY,MACxBmC,sBAAoB/C,EAAIY,GAErBA,EAASa,KAAKuB,cAAgBpC,EAASa,KAAKwB,SAAU,IAC/CjB,GAAQpB,EAASkC,YAAYlC,EAASa,KAAKwB,UAC3CC,EAASlD,EAAGc,WAAWd,EAAGc,WAAW7E,OAAS,EAEpD+F,GAAMW,MAAMO,GAAQhB,UAAUC,IAAI,+CCTlBnC,EAAIY,GACxBA,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IACjDF,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IACjDF,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IAE9CF,EAASa,KAAKmB,aACbhC,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IAGlDF,EAASa,KAAKoB,aACbjC,EAASkC,YAAY,SAASH,MAAM3C,EAAGc,WAAW,IAClDF,EAASkC,YAAY,QAAQH,MAAM3C,EAAGc,WAAW,IACjDF,EAASkC,YAAY,SAASH,MAAM3C,EAAGc,WAAW,IAClDF,EAASkC,YAAY,WAAWH,MAAM3C,EAAGc,WAAW,IAEjDF,EAASa,KAAKmB,aACbhC,EAASkC,YAAY,WAAWH,MAAM3C,EAAGc,WAAW,4BChBxCd,EAAIY,GACxBA,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IACjDF,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IACjDF,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IACjDF,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IAE9CF,EAASa,KAAKmB,aACbhC,EAAS8B,gBAAgBC,MAAM3C,EAAIA,EAAGc,WAAW,IAGlDF,EAASa,KAAKoB,aACbjC,EAASkC,YAAY,SAASH,MAAM3C,EAAGc,WAAW,IAClDF,EAASkC,YAAY,SAASH,MAAM3C,EAAGc,WAAW,IAClDF,EAASkC,YAAY,QAAQH,MAAM3C,EAAGc,WAAW,IACjDF,EAASkC,YAAY,SAASH,MAAM3C,EAAGc,WAAW,IAClDF,EAASkC,YAAY,WAAWH,MAAM3C,EAAGc,WAAW,IAEjDF,EAASa,KAAKmB,aACbhC,EAASkC,YAAY,WAAWH,MAAM3C,EAAGc,WAAW,SChB3CqC,iCAQLlD,wCACHC,aAAa9C,OAAOC,QACrB+F,WACDnD,mEAmCFoD,qCAAQ/I,mCAAAA,0BACNE,MAAK4I,OAAOC,SACND,OAAOC,GAAKxE,QAAQ,SAAAyE,GACrBA,EAAMC,MAAMC,EAAMlJ,KAInBE,mCAYR6I,EAAKjJ,SACAI,MAAK4I,OAAOC,UACPD,OAAOC,YAGXD,OAAOC,GAAKI,KAAKrJ,GAEfI,qCAaP6I,EAAKjJ,SACFI,MAAK4I,OAAOC,IAAQjJ,OACdgJ,OAAOC,GAAO7I,KAAK4I,OAAOC,GAAKhD,OAAO,SAAAiD,SAChCA,KAAUlJ,SAIhBgJ,OAAOC,MAGT7I,uCAUN6I,EAAKjJ,oBACNA,GAAKgB,MAAMhB,EAAI,iBAAMsJ,GAAKC,IAAIN,EAAKjJ,KAE5BI,KAAKoJ,GAAGP,EAAKjJ,GAAI,qDASfiJ,SACF7I,MAAKqJ,eAAeR,GAAO7I,KAAK6I,GAAO,sEASxCpD,WAEN7C,QAAO0G,oBAAoBtJ,MAAMqE,QAAQ,SAAAwE,GACrCpD,EAAWoD,GAAOU,EAAKC,aAAaX,KAGjCpD,qFAUA7C,QAAO6G,KAAKzJ,KAAK0J,iBACnB7D,OAAO,SAAAgD,UACIA,EAAIc,MAAM,SAErBzI,OAAO,SAAC0I,EAAKf,SACVe,GAAIf,GAAOgB,EAAKL,aAAaX,GACtBe,yDAWNf,EAAK3I,GACX6B,SAAS8G,QACHtD,cAAcsD,QAGdA,GAAO3I,sDAUNwE,OACN,GAAMxB,KAAKwB,QACNgB,aAAaxC,EAAGwB,EAAOxB,iDAU3BtD,SACED,UAASI,KAAKC,KAAMJ,0CAxKtBI,MAAK8J,YAAYC,qBAAsBnI,WACxCpC,MAAM,qCAGHQ,KAAK8J,YAAYC,sDASjB/J,MAAKgK,8BAGL9J,QACF8J,QAAU9J,mEAiKJJ,2BAAAA,oCACAE,KAAQF,oBlB/LrB0D,IAEFP,IAAK,GACLU,IAAK,KAGLV,IAAK,GACLU,IAAK,KAGLV,IAAK,GACLU,IAAK,MmBhBYsG,iCAYL/J,EAAOuF,wHACT7C,OAAOC,QACTO,OAAQ,gBAAAlD,SAASA,IACjBwC,oBAAoB,EACpBI,cAAe,GAChB2C,MAEMvF,UACAA,MAAQA,wNAyCVgC,OAAMlC,KAAKE,6DASX+B,gDAYL/B,EAAOuF,SACF,IAAIzF,MAAK8J,YAAY5J,EAAO0C,OAAOC,OACtC7C,KAAKkK,sBAAuBzE,6CAtDzBzF,MAAKmK,0BAGLjK,QACFiK,QAAUjK,OACV4C,cAAgBzC,KAAKsD,IAAI3D,KAAK8C,cAAerB,OAAOvB,4CASlDF,MAAKoK,yBAGNlK,QACDkK,OAASlK,OACT6C,OAAST,SAAStC,KAAKoD,OAAOlD,IAC/B4C,cAAe9C,KAAK8C,cACpBJ,mBAAoB1C,KAAK0C,6EA2CtB,2BA9FwBiG,MCCnCV,UAAW,kCACXZ,MAAO,uCACPgD,MAAO,wCACP7F,SAAU,kCACV8F,KAAM,2CACNrD,KAAM,gDACNsD,QAAS,oDACTC,UAAW,qDACXC,MAAO,4DCRUC,4BAYLxK,EAAOuF,2CACVvF,YAAiB+J,KAAclI,SAAS7B,KACzCuF,EAAavF,EACbA,MAAQyK,0EAKPpF,cAAc3C,OAAOC,QACtB+H,WAAW,EACX7D,WAAW,EACXC,cAAe,KAChBgC,EAAK6B,oBAAqBpF,SAE1B9E,OAAOT,IAAUQ,YAAYR,MAC5BA,EAAQ8I,EAAK8B,gBAGd5K,MACMA,MAAQA,yFAiEZkG,EAAUxG,SACZI,MAAK+G,eACCgE,UAAU3E,QAGV4E,UAAU5E,GAGnBzG,SAASI,KAAKqG,EAAUxG,GAErBI,KAAKiL,WAAW7E,IACfA,EAAS8E,OAGN9E,EAAS+E,KAAK,0DASd/E,UACC1F,YAAYV,KAAKoL,SAAUpL,KAAKoL,SAAWhF,EAASlG,MAAMA,4CAU/DkG,EAAUlG,SACNA,8NAsCDkG,EAAUiF,gDAYVjF,EAAUiF,4CAUZjF,4CAUAA,wCAUFA,oDAUMA,8CAUHA,4CAUDA,GACDpG,KAAK4K,WAAaxE,EAASqE,MAAMa,WAChCC,OAAOC,sBAAsB,iBAAMpF,GAASqF,MAAMrF,6DAY1CA,EAAUlG,oBACf+J,GAAUyB,KACb7L,WAAWK,KAAWA,EAAM2B,KAAO3B,IAAUA,GACzC4C,cAAe9C,KAAK8C,cACpBM,OAAQ,gBAAAlD,SAASgJ,GAAK9F,OAAOgD,EAAUlG,iDA1NxCF,MAAK2L,0DASL3L,MAAKoK,yBAGNlK,GACDA,YAAiB+J,KAClB/J,EAAQF,KAAK4L,gBAAgB1L,SAG5BkK,OAASlK,2CASPF,MAAK6L,0BAGL3L,QACF2L,QAAU3L,kDASRF,MAAK8L,iCAGE5L,QACT4L,eAAiB5L,YApFIyI,GCKrB1D,SACG,eACA,YACA,aACA,gBACA,gBACA,SAQHL,GAAW,KAAM,QAAS,oDCd1BK,SACC,cACC,aACF,aACC,gBACE,iBACA,UAQHL,GAAW,KAAM,QAAS,qDCd1BK,SACG,cACA,cACA,YACA,iBACA,iBACA,WAQHL,GAAW,KAAM,QAAS,KAAM,QAAS,mDCdzCK,SACA,YACA,eACA,aACA,gBACA,mBACA,YAQAL,GAAW,KAAM,QAAS,oDCd1BK,SACA,eACA,cACA,aACA,kBACA,kBACA,YAQAL,GAAW,KAAM,QAAS,oDCd1BK,SACA,eACA,cACA,aACA,gBACA,kBACA,WAQAL,GAAW,KAAM,QAAS,qDCd1BK,SACA,cACA,aACA,aACA,gBACA,kBACA,YAQAL,GAAW,KAAM,QAAS,qDCd1BK,SACA,aACA,WACA,YACA,eACA,gBACA,SAQAL,GAAW,KAAM,QAAS,qDCd1BK,SACA,gBACA,iBACA,eACA,iBACA,oBACA,YAQAL,GAAW,KAAM,QAAS,qDCd1BK,SACG,aACA,YACA,cACA,iBACA,kBACA,YAQHL,GAAW,KAAM,QAAS,oDCd1BK,SACA,cACA,YACA,aACA,eACA,eACA,SAQAL,GAAW,KAAM,QAAS,oDCd1BK,SACA,YACG,aACA,YACA,cACA,eACA,aAQHL,GAAW,KAAM,QAAS,uDCd1BK,SACA,cACA,YACA,eACA,cACA,iBACA,WAQAL,GAAW,KAAM,QAAS,oDCd1BK,SACA,WACA,SACA,UACA,YACA,YACA,KAQAL,GAAW,KAAM,QAAS,sDCd1BK,SACA,WACA,SACA,UACA,YACA,YACA,KAQAL,GAAW,KAAM,QAAS,oDCd1BK,SACG,cACA,cACA,eACA,kBACA,kBACA,YAQHL,GAAW,KAAM,QAAS,qDCd1BK,SACG,eACA,eACA,cACA,eACA,kBACA,YAQHL,IAAW,KAAM,QAAS,qDCd1BK,UACA,YACA,eACA,cACA,gBACA,mBACA,YAQAL,IAAW,KAAM,KAAM,QAAS,0DCdhCK,UACA,aACA,gBACA,YACA,kBACA,iBACA,WAQAL,IAAW,KAAM,QAAS,uDCd1BK,UACA,cACA,aACA,aACA,gBACA,kBACA,YAQAL,IAAW,KAAM,QAAS,2DCd1BK,UACH,aACC,YACF,aACC,cACE,iBACA,YAQCL,IAAW,KAAM,QAAS,uDCd1BK,UACG,aACA,eACA,aACA,gBACA,gBACA,UAQHL,IAAW,KAAM,QAAS,wDCd1BK,UACA,cACA,eACA,YACA,iBACA,iBACA,WAQAL,IAAW,KAAM,QAAS,uDCd1BK,UACA,YACA,eACA,cACA,iBACA,kBACA,YAQAL,IAAW,KAAM,QAAS,wDCd1BK,UACA,YACA,aACA,YACA,kB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"} \ No newline at end of file diff --git a/public/Faces_DayCounter.js.html b/public/Faces_DayCounter.js.html index cb220c7d..cbe3653e 100644 --- a/public/Faces_DayCounter.js.html +++ b/public/Faces_DayCounter.js.html @@ -75,7 +75,7 @@

FlipClock.jsFlipClock.jsFlipClock.jsFlipClock.js