Housekeeping

This commit is contained in:
Sam Potts 2019-03-16 11:57:15 +11:00
parent 4c3bf25b8a
commit 5b7a025d26
19 changed files with 625 additions and 493 deletions

83
demo/dist/demo.js vendored
View File

@ -5883,7 +5883,7 @@ typeof navigator === "object" && (function () {
list.appendChild(menuItem);
},
// Format a time for display
formatTime: function formatTime$$1() {
formatTime: function formatTime$1() {
var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
@ -6003,8 +6003,8 @@ typeof navigator === "object" && (function () {
range.setAttribute('aria-valuenow', this.currentTime);
var currentTime = controls.formatTime(this.currentTime);
var duration = controls.formatTime(this.duration);
var format$$1 = i18n.get('seekLabel', this.config);
range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration));
var format = i18n.get('seekLabel', this.config);
range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));
} else if (matches$1(range, this.config.selectors.inputs.volume)) {
var percent = range.value * 100;
range.setAttribute('aria-valuenow', percent);
@ -8236,13 +8236,13 @@ typeof navigator === "object" && (function () {
},
// Toggle controls based on state and `force` argument
toggleControls: function toggleControls(force) {
var controls$$1 = this.elements.controls;
var controls = this.elements.controls;
if (controls$$1 && this.config.hideControls) {
if (controls && this.config.hideControls) {
// Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)
var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide
this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover || recentTouchSeek));
this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover || recentTouchSeek));
}
}
};
@ -8548,11 +8548,11 @@ typeof navigator === "object" && (function () {
on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
var controls$$1 = elements.controls; // Remove button states for fullscreen
var controls = elements.controls; // Remove button states for fullscreen
if (controls$$1 && event.type === 'enterfullscreen') {
controls$$1.pressed = false;
controls$$1.hover = false;
if (controls && event.type === 'enterfullscreen') {
controls.pressed = false;
controls.hover = false;
} // Show, then hide after a timeout unless another control event occurs
@ -8807,7 +8807,7 @@ typeof navigator === "object" && (function () {
}, {
key: "controls",
value: function controls$$1() {
value: function controls$1() {
var _this3 = this;
var player = this.player;
@ -9170,16 +9170,23 @@ typeof navigator === "object" && (function () {
maxTries = (args.numRetries || 0) + 1,
beforeCallbackFn = args.before || devnull,
pathStripped = path.replace(/^(css|img)!/, ''),
isCss,
isLegacyIECss,
e;
numTries = numTries || 0;
if (/(^css!|\.css$)/.test(path)) {
isCss = true; // css
// css
e = doc.createElement('link');
e.rel = 'stylesheet';
e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix
e.href = pathStripped; // tag IE9+
isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)
if (isLegacyIECss && e.relList) {
isLegacyIECss = 0;
e.rel = 'preload';
e.as = 'style';
}
} else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
// image
e = doc.createElement('img');
@ -9192,10 +9199,10 @@ typeof navigator === "object" && (function () {
}
e.onload = e.onerror = e.onbeforeload = function (ev) {
var result = ev.type[0]; // Note: The following code isolates IE using `hideFocus` and treats empty
// stylesheets as failures to get around lack of onerror support
var result = ev.type[0]; // treat empty stylesheets as failures to get around lack of onerror
// support in IE9-11
if (isCss && 'hideFocus' in e) {
if (isLegacyIECss) {
try {
if (!e.sheet.cssText.length) result = 'e';
} catch (x) {
@ -9213,6 +9220,9 @@ typeof navigator === "object" && (function () {
if (numTries < maxTries) {
return loadFile(path, callbackFn, args, numTries);
}
} else if (e.rel == 'preload' && e.as == 'style') {
// activate preloaded stylesheets
return e.rel = 'stylesheet'; // jshint ignore:line
} // execute callback
@ -9278,16 +9288,27 @@ typeof navigator === "object" && (function () {
} else {
bundleIdCache[bundleId] = true;
}
} // load scripts
}
function loadFn(resolve, reject) {
loadFiles(paths, function (pathsNotFound) {
// execute callbacks
executeCallbacks(args, pathsNotFound); // publish bundle load event
executeCallbacks(args, pathsNotFound); // resolve Promise
if (resolve) {
executeCallbacks({
success: resolve,
error: reject
}, pathsNotFound);
} // publish bundle load event
publish(bundleId, pathsNotFound);
}, args);
}
if (args.returnPromise) return new Promise(loadFn);else loadFn();
}
/**
* Execute callbacks when dependencies have been satisfied.
* @param {(string|string[])} deps - List of bundle ids
@ -9392,7 +9413,7 @@ typeof navigator === "object" && (function () {
}
},
// API Ready
ready: function ready$$1() {
ready: function ready() {
var _this2 = this;
var player = this;
@ -9771,7 +9792,7 @@ typeof navigator === "object" && (function () {
}
},
// API ready
ready: function ready$$1() {
ready: function ready() {
var player = this; // Ignore already setup (race condition)
var currentId = player.media.getAttribute('id');
@ -9799,8 +9820,8 @@ typeof navigator === "object" && (function () {
});
player.media = replaceElement(container, player.media); // Id to poster wrapper
var posterSrc = function posterSrc(format$$1) {
return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format$$1, "default.jpg");
var posterSrc = function posterSrc(format) {
return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format, "default.jpg");
}; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
@ -10193,7 +10214,7 @@ typeof navigator === "object" && (function () {
}, {
key: "ready",
value: function ready$$1() {
value: function ready() {
var _this3 = this;
// Start ticking our safety timer. If the whole advertisement
@ -10677,7 +10698,7 @@ typeof navigator === "object" && (function () {
}, {
key: "on",
value: function on$$1(event, callback) {
value: function on(event, callback) {
if (!is$1.array(this.events[event])) {
this.events[event] = [];
}
@ -12025,7 +12046,7 @@ typeof navigator === "object" && (function () {
}, {
key: "on",
value: function on$$1(event, callback) {
value: function on$1(event, callback) {
on.call(this, this.elements.container, event, callback);
}
/**
@ -12036,7 +12057,7 @@ typeof navigator === "object" && (function () {
}, {
key: "once",
value: function once$$1(event, callback) {
value: function once$1(event, callback) {
once.call(this, this.elements.container, event, callback);
}
/**
@ -12047,7 +12068,7 @@ typeof navigator === "object" && (function () {
}, {
key: "off",
value: function off$$1(event, callback) {
value: function off$1(event, callback) {
off(this.elements.container, event, callback);
}
/**
@ -12706,7 +12727,7 @@ typeof navigator === "object" && (function () {
}, {
key: "loadSprite",
value: function loadSprite$$1(url, id) {
value: function loadSprite$1(url, id) {
return loadSprite(url, id);
}
/**

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

89
dist/plyr.js vendored
View File

@ -1,8 +1,8 @@
typeof navigator === "object" && (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define('Plyr', factory) :
(global.Plyr = factory());
}(this, (function () { 'use strict';
(global = global || self, global.Plyr = factory());
}(this, function () { 'use strict';
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
@ -2033,7 +2033,7 @@ typeof navigator === "object" && (function (global, factory) {
list.appendChild(menuItem);
},
// Format a time for display
formatTime: function formatTime$$1() {
formatTime: function formatTime$1() {
var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
@ -2153,8 +2153,8 @@ typeof navigator === "object" && (function (global, factory) {
range.setAttribute('aria-valuenow', this.currentTime);
var currentTime = controls.formatTime(this.currentTime);
var duration = controls.formatTime(this.duration);
var format$$1 = i18n.get('seekLabel', this.config);
range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration));
var format = i18n.get('seekLabel', this.config);
range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));
} else if (matches$1(range, this.config.selectors.inputs.volume)) {
var percent = range.value * 100;
range.setAttribute('aria-valuenow', percent);
@ -4386,13 +4386,13 @@ typeof navigator === "object" && (function (global, factory) {
},
// Toggle controls based on state and `force` argument
toggleControls: function toggleControls(force) {
var controls$$1 = this.elements.controls;
var controls = this.elements.controls;
if (controls$$1 && this.config.hideControls) {
if (controls && this.config.hideControls) {
// Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)
var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide
this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover || recentTouchSeek));
this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover || recentTouchSeek));
}
}
};
@ -4698,11 +4698,11 @@ typeof navigator === "object" && (function (global, factory) {
on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
var controls$$1 = elements.controls; // Remove button states for fullscreen
var controls = elements.controls; // Remove button states for fullscreen
if (controls$$1 && event.type === 'enterfullscreen') {
controls$$1.pressed = false;
controls$$1.hover = false;
if (controls && event.type === 'enterfullscreen') {
controls.pressed = false;
controls.hover = false;
} // Show, then hide after a timeout unless another control event occurs
@ -4957,7 +4957,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "controls",
value: function controls$$1() {
value: function controls$1() {
var _this3 = this;
var player = this.player;
@ -5326,16 +5326,23 @@ typeof navigator === "object" && (function (global, factory) {
maxTries = (args.numRetries || 0) + 1,
beforeCallbackFn = args.before || devnull,
pathStripped = path.replace(/^(css|img)!/, ''),
isCss,
isLegacyIECss,
e;
numTries = numTries || 0;
if (/(^css!|\.css$)/.test(path)) {
isCss = true; // css
// css
e = doc.createElement('link');
e.rel = 'stylesheet';
e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix
e.href = pathStripped; // tag IE9+
isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)
if (isLegacyIECss && e.relList) {
isLegacyIECss = 0;
e.rel = 'preload';
e.as = 'style';
}
} else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
// image
e = doc.createElement('img');
@ -5348,10 +5355,10 @@ typeof navigator === "object" && (function (global, factory) {
}
e.onload = e.onerror = e.onbeforeload = function (ev) {
var result = ev.type[0]; // Note: The following code isolates IE using `hideFocus` and treats empty
// stylesheets as failures to get around lack of onerror support
var result = ev.type[0]; // treat empty stylesheets as failures to get around lack of onerror
// support in IE9-11
if (isCss && 'hideFocus' in e) {
if (isLegacyIECss) {
try {
if (!e.sheet.cssText.length) result = 'e';
} catch (x) {
@ -5369,6 +5376,9 @@ typeof navigator === "object" && (function (global, factory) {
if (numTries < maxTries) {
return loadFile(path, callbackFn, args, numTries);
}
} else if (e.rel == 'preload' && e.as == 'style') {
// activate preloaded stylesheets
return e.rel = 'stylesheet'; // jshint ignore:line
} // execute callback
@ -5434,16 +5444,27 @@ typeof navigator === "object" && (function (global, factory) {
} else {
bundleIdCache[bundleId] = true;
}
} // load scripts
}
function loadFn(resolve, reject) {
loadFiles(paths, function (pathsNotFound) {
// execute callbacks
executeCallbacks(args, pathsNotFound); // publish bundle load event
executeCallbacks(args, pathsNotFound); // resolve Promise
if (resolve) {
executeCallbacks({
success: resolve,
error: reject
}, pathsNotFound);
} // publish bundle load event
publish(bundleId, pathsNotFound);
}, args);
}
if (args.returnPromise) return new Promise(loadFn);else loadFn();
}
/**
* Execute callbacks when dependencies have been satisfied.
* @param {(string|string[])} deps - List of bundle ids
@ -5548,7 +5569,7 @@ typeof navigator === "object" && (function (global, factory) {
}
},
// API Ready
ready: function ready$$1() {
ready: function ready() {
var _this2 = this;
var player = this;
@ -5927,7 +5948,7 @@ typeof navigator === "object" && (function (global, factory) {
}
},
// API ready
ready: function ready$$1() {
ready: function ready() {
var player = this; // Ignore already setup (race condition)
var currentId = player.media.getAttribute('id');
@ -5955,8 +5976,8 @@ typeof navigator === "object" && (function (global, factory) {
});
player.media = replaceElement(container, player.media); // Id to poster wrapper
var posterSrc = function posterSrc(format$$1) {
return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format$$1, "default.jpg");
var posterSrc = function posterSrc(format) {
return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format, "default.jpg");
}; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
@ -6349,7 +6370,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "ready",
value: function ready$$1() {
value: function ready() {
var _this3 = this;
// Start ticking our safety timer. If the whole advertisement
@ -6833,7 +6854,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "on",
value: function on$$1(event, callback) {
value: function on(event, callback) {
if (!is$1.array(this.events[event])) {
this.events[event] = [];
}
@ -8181,7 +8202,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "on",
value: function on$$1(event, callback) {
value: function on$1(event, callback) {
on.call(this, this.elements.container, event, callback);
}
/**
@ -8192,7 +8213,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "once",
value: function once$$1(event, callback) {
value: function once$1(event, callback) {
once.call(this, this.elements.container, event, callback);
}
/**
@ -8203,7 +8224,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "off",
value: function off$$1(event, callback) {
value: function off$1(event, callback) {
off(this.elements.container, event, callback);
}
/**
@ -8862,7 +8883,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "loadSprite",
value: function loadSprite$$1(url, id) {
value: function loadSprite$1(url, id) {
return loadSprite(url, id);
}
/**
@ -8902,4 +8923,4 @@ typeof navigator === "object" && (function (global, factory) {
return Plyr;
})));
}));

2
dist/plyr.min.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
dist/plyr.min.mjs vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

83
dist/plyr.mjs vendored
View File

@ -2027,7 +2027,7 @@ var controls = {
list.appendChild(menuItem);
},
// Format a time for display
formatTime: function formatTime$$1() {
formatTime: function formatTime$1() {
var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
@ -2147,8 +2147,8 @@ var controls = {
range.setAttribute('aria-valuenow', this.currentTime);
var currentTime = controls.formatTime(this.currentTime);
var duration = controls.formatTime(this.duration);
var format$$1 = i18n.get('seekLabel', this.config);
range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration));
var format = i18n.get('seekLabel', this.config);
range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));
} else if (matches$1(range, this.config.selectors.inputs.volume)) {
var percent = range.value * 100;
range.setAttribute('aria-valuenow', percent);
@ -4380,13 +4380,13 @@ var ui = {
},
// Toggle controls based on state and `force` argument
toggleControls: function toggleControls(force) {
var controls$$1 = this.elements.controls;
var controls = this.elements.controls;
if (controls$$1 && this.config.hideControls) {
if (controls && this.config.hideControls) {
// Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)
var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide
this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover || recentTouchSeek));
this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover || recentTouchSeek));
}
}
};
@ -4692,11 +4692,11 @@ function () {
on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
var controls$$1 = elements.controls; // Remove button states for fullscreen
var controls = elements.controls; // Remove button states for fullscreen
if (controls$$1 && event.type === 'enterfullscreen') {
controls$$1.pressed = false;
controls$$1.hover = false;
if (controls && event.type === 'enterfullscreen') {
controls.pressed = false;
controls.hover = false;
} // Show, then hide after a timeout unless another control event occurs
@ -4951,7 +4951,7 @@ function () {
}, {
key: "controls",
value: function controls$$1() {
value: function controls$1() {
var _this3 = this;
var player = this.player;
@ -5320,16 +5320,23 @@ var loadjs_umd = createCommonjsModule(function (module, exports) {
maxTries = (args.numRetries || 0) + 1,
beforeCallbackFn = args.before || devnull,
pathStripped = path.replace(/^(css|img)!/, ''),
isCss,
isLegacyIECss,
e;
numTries = numTries || 0;
if (/(^css!|\.css$)/.test(path)) {
isCss = true; // css
// css
e = doc.createElement('link');
e.rel = 'stylesheet';
e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix
e.href = pathStripped; // tag IE9+
isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)
if (isLegacyIECss && e.relList) {
isLegacyIECss = 0;
e.rel = 'preload';
e.as = 'style';
}
} else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
// image
e = doc.createElement('img');
@ -5342,10 +5349,10 @@ var loadjs_umd = createCommonjsModule(function (module, exports) {
}
e.onload = e.onerror = e.onbeforeload = function (ev) {
var result = ev.type[0]; // Note: The following code isolates IE using `hideFocus` and treats empty
// stylesheets as failures to get around lack of onerror support
var result = ev.type[0]; // treat empty stylesheets as failures to get around lack of onerror
// support in IE9-11
if (isCss && 'hideFocus' in e) {
if (isLegacyIECss) {
try {
if (!e.sheet.cssText.length) result = 'e';
} catch (x) {
@ -5363,6 +5370,9 @@ var loadjs_umd = createCommonjsModule(function (module, exports) {
if (numTries < maxTries) {
return loadFile(path, callbackFn, args, numTries);
}
} else if (e.rel == 'preload' && e.as == 'style') {
// activate preloaded stylesheets
return e.rel = 'stylesheet'; // jshint ignore:line
} // execute callback
@ -5428,16 +5438,27 @@ var loadjs_umd = createCommonjsModule(function (module, exports) {
} else {
bundleIdCache[bundleId] = true;
}
} // load scripts
}
function loadFn(resolve, reject) {
loadFiles(paths, function (pathsNotFound) {
// execute callbacks
executeCallbacks(args, pathsNotFound); // publish bundle load event
executeCallbacks(args, pathsNotFound); // resolve Promise
if (resolve) {
executeCallbacks({
success: resolve,
error: reject
}, pathsNotFound);
} // publish bundle load event
publish(bundleId, pathsNotFound);
}, args);
}
if (args.returnPromise) return new Promise(loadFn);else loadFn();
}
/**
* Execute callbacks when dependencies have been satisfied.
* @param {(string|string[])} deps - List of bundle ids
@ -5542,7 +5563,7 @@ var vimeo = {
}
},
// API Ready
ready: function ready$$1() {
ready: function ready() {
var _this2 = this;
var player = this;
@ -5921,7 +5942,7 @@ var youtube = {
}
},
// API ready
ready: function ready$$1() {
ready: function ready() {
var player = this; // Ignore already setup (race condition)
var currentId = player.media.getAttribute('id');
@ -5949,8 +5970,8 @@ var youtube = {
});
player.media = replaceElement(container, player.media); // Id to poster wrapper
var posterSrc = function posterSrc(format$$1) {
return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format$$1, "default.jpg");
var posterSrc = function posterSrc(format) {
return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format, "default.jpg");
}; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
@ -6343,7 +6364,7 @@ function () {
}, {
key: "ready",
value: function ready$$1() {
value: function ready() {
var _this3 = this;
// Start ticking our safety timer. If the whole advertisement
@ -6827,7 +6848,7 @@ function () {
}, {
key: "on",
value: function on$$1(event, callback) {
value: function on(event, callback) {
if (!is$1.array(this.events[event])) {
this.events[event] = [];
}
@ -8175,7 +8196,7 @@ function () {
}, {
key: "on",
value: function on$$1(event, callback) {
value: function on$1(event, callback) {
on.call(this, this.elements.container, event, callback);
}
/**
@ -8186,7 +8207,7 @@ function () {
}, {
key: "once",
value: function once$$1(event, callback) {
value: function once$1(event, callback) {
once.call(this, this.elements.container, event, callback);
}
/**
@ -8197,7 +8218,7 @@ function () {
}, {
key: "off",
value: function off$$1(event, callback) {
value: function off$1(event, callback) {
off(this.elements.container, event, callback);
}
/**
@ -8856,7 +8877,7 @@ function () {
}, {
key: "loadSprite",
value: function loadSprite$$1(url, id) {
value: function loadSprite$1(url, id) {
return loadSprite(url, id);
}
/**

View File

@ -1,8 +1,8 @@
typeof navigator === "object" && (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define('Plyr', factory) :
(global.Plyr = factory());
}(this, (function () { 'use strict';
(global = global || self, global.Plyr = factory());
}(this, function () { 'use strict';
// Polyfill for creating CustomEvents on IE9/10/11
// code pulled from:
@ -1763,7 +1763,7 @@ typeof navigator === "object" && (function (global, factory) {
};
var deserializeParam = function deserializeParam(value) {
return decodeURIComponent(value).replace(/\+/g, ' ');
return decodeURIComponent(String(value).replace(/\+/g, ' '));
};
var polyfillURLSearchParams = function polyfillURLSearchParams() {
@ -1891,11 +1891,11 @@ typeof navigator === "object" && (function (global, factory) {
global.URLSearchParams = URLSearchParams;
};
if (!('URLSearchParams' in global) || new URLSearchParams('?a=1').toString() !== 'a=1') {
if (!('URLSearchParams' in global) || new global.URLSearchParams('?a=1').toString() !== 'a=1') {
polyfillURLSearchParams();
}
var proto = URLSearchParams.prototype;
var proto = global.URLSearchParams.prototype;
if (typeof proto.sort !== 'function') {
proto.sort = function () {
@ -1971,7 +1971,7 @@ typeof navigator === "object" && (function (global, factory) {
*/
var checkIfURLIsSupported = function checkIfURLIsSupported() {
try {
var u = new URL('b', 'http://a');
var u = new global.URL('b', 'http://a');
u.pathname = 'c%20d';
return u.href === 'http://a/c%20d' && u.searchParams;
} catch (e) {
@ -2017,7 +2017,7 @@ typeof navigator === "object" && (function (global, factory) {
value: anchorElement
}); // create a linked searchParams which reflect its changes on URL
var searchParams = new URLSearchParams(this.search);
var searchParams = new global.URLSearchParams(this.search);
var enableSearchUpdate = true;
var enableSearchParamsUpdate = true;
@ -2642,7 +2642,7 @@ typeof navigator === "object" && (function (global, factory) {
var arrayFind = _arrayMethods(5);
var arrayFindIndex = _arrayMethods(6);
var id$2 = 0;
var id$1 = 0;
// fallback for uncaught frozen keys
var uncaughtFrozenStore = function (that) {
@ -2683,7 +2683,7 @@ typeof navigator === "object" && (function (global, factory) {
var C = wrapper(function (that, iterable) {
_anInstance(that, C, NAME, '_i');
that._t = NAME; // collection type
that._i = id$2++; // collection id
that._i = id$1++; // collection id
that._l = undefined; // leak store for uncaught frozen objects
if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
});
@ -5421,7 +5421,7 @@ typeof navigator === "object" && (function (global, factory) {
list.appendChild(menuItem);
},
// Format a time for display
formatTime: function formatTime$$1() {
formatTime: function formatTime$1() {
var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
@ -5541,8 +5541,8 @@ typeof navigator === "object" && (function (global, factory) {
range.setAttribute('aria-valuenow', this.currentTime);
var currentTime = controls.formatTime(this.currentTime);
var duration = controls.formatTime(this.duration);
var format$$1 = i18n.get('seekLabel', this.config);
range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration));
var format = i18n.get('seekLabel', this.config);
range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));
} else if (matches$1(range, this.config.selectors.inputs.volume)) {
var percent = range.value * 100;
range.setAttribute('aria-valuenow', percent);
@ -7784,13 +7784,13 @@ typeof navigator === "object" && (function (global, factory) {
},
// Toggle controls based on state and `force` argument
toggleControls: function toggleControls(force) {
var controls$$1 = this.elements.controls;
var controls = this.elements.controls;
if (controls$$1 && this.config.hideControls) {
if (controls && this.config.hideControls) {
// Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)
var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide
this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover || recentTouchSeek));
this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover || recentTouchSeek));
}
}
};
@ -8096,11 +8096,11 @@ typeof navigator === "object" && (function (global, factory) {
on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
var controls$$1 = elements.controls; // Remove button states for fullscreen
var controls = elements.controls; // Remove button states for fullscreen
if (controls$$1 && event.type === 'enterfullscreen') {
controls$$1.pressed = false;
controls$$1.hover = false;
if (controls && event.type === 'enterfullscreen') {
controls.pressed = false;
controls.hover = false;
} // Show, then hide after a timeout unless another control event occurs
@ -8355,7 +8355,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "controls",
value: function controls$$1() {
value: function controls$1() {
var _this3 = this;
var player = this.player;
@ -8718,16 +8718,23 @@ typeof navigator === "object" && (function (global, factory) {
maxTries = (args.numRetries || 0) + 1,
beforeCallbackFn = args.before || devnull,
pathStripped = path.replace(/^(css|img)!/, ''),
isCss,
isLegacyIECss,
e;
numTries = numTries || 0;
if (/(^css!|\.css$)/.test(path)) {
isCss = true; // css
// css
e = doc.createElement('link');
e.rel = 'stylesheet';
e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix
e.href = pathStripped; // tag IE9+
isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)
if (isLegacyIECss && e.relList) {
isLegacyIECss = 0;
e.rel = 'preload';
e.as = 'style';
}
} else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
// image
e = doc.createElement('img');
@ -8740,10 +8747,10 @@ typeof navigator === "object" && (function (global, factory) {
}
e.onload = e.onerror = e.onbeforeload = function (ev) {
var result = ev.type[0]; // Note: The following code isolates IE using `hideFocus` and treats empty
// stylesheets as failures to get around lack of onerror support
var result = ev.type[0]; // treat empty stylesheets as failures to get around lack of onerror
// support in IE9-11
if (isCss && 'hideFocus' in e) {
if (isLegacyIECss) {
try {
if (!e.sheet.cssText.length) result = 'e';
} catch (x) {
@ -8761,6 +8768,9 @@ typeof navigator === "object" && (function (global, factory) {
if (numTries < maxTries) {
return loadFile(path, callbackFn, args, numTries);
}
} else if (e.rel == 'preload' && e.as == 'style') {
// activate preloaded stylesheets
return e.rel = 'stylesheet'; // jshint ignore:line
} // execute callback
@ -8826,16 +8836,27 @@ typeof navigator === "object" && (function (global, factory) {
} else {
bundleIdCache[bundleId] = true;
}
} // load scripts
}
function loadFn(resolve, reject) {
loadFiles(paths, function (pathsNotFound) {
// execute callbacks
executeCallbacks(args, pathsNotFound); // publish bundle load event
executeCallbacks(args, pathsNotFound); // resolve Promise
if (resolve) {
executeCallbacks({
success: resolve,
error: reject
}, pathsNotFound);
} // publish bundle load event
publish(bundleId, pathsNotFound);
}, args);
}
if (args.returnPromise) return new Promise(loadFn);else loadFn();
}
/**
* Execute callbacks when dependencies have been satisfied.
* @param {(string|string[])} deps - List of bundle ids
@ -8939,7 +8960,7 @@ typeof navigator === "object" && (function (global, factory) {
}
},
// API Ready
ready: function ready$$1() {
ready: function ready() {
var _this2 = this;
var player = this;
@ -9316,7 +9337,7 @@ typeof navigator === "object" && (function (global, factory) {
}
},
// API ready
ready: function ready$$1() {
ready: function ready() {
var player = this; // Ignore already setup (race condition)
var currentId = player.media.getAttribute('id');
@ -9344,8 +9365,8 @@ typeof navigator === "object" && (function (global, factory) {
});
player.media = replaceElement(container, player.media); // Id to poster wrapper
var posterSrc = function posterSrc(format$$1) {
return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format$$1, "default.jpg");
var posterSrc = function posterSrc(format) {
return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format, "default.jpg");
}; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
@ -9737,7 +9758,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "ready",
value: function ready$$1() {
value: function ready() {
var _this3 = this;
// Start ticking our safety timer. If the whole advertisement
@ -10221,7 +10242,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "on",
value: function on$$1(event, callback) {
value: function on(event, callback) {
if (!is$2.array(this.events[event])) {
this.events[event] = [];
}
@ -11583,7 +11604,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "on",
value: function on$$1(event, callback) {
value: function on$1(event, callback) {
on.call(this, this.elements.container, event, callback);
}
/**
@ -11594,7 +11615,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "once",
value: function once$$1(event, callback) {
value: function once$1(event, callback) {
once.call(this, this.elements.container, event, callback);
}
/**
@ -11605,7 +11626,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "off",
value: function off$$1(event, callback) {
value: function off$1(event, callback) {
off(this.elements.container, event, callback);
}
/**
@ -12264,7 +12285,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "loadSprite",
value: function loadSprite$$1(url, id) {
value: function loadSprite$1(url, id) {
return loadSprite(url, id);
}
/**
@ -12306,4 +12327,4 @@ typeof navigator === "object" && (function (global, factory) {
return Plyr;
})));
}));

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1757,7 +1757,7 @@ _setToStringTag(_global.JSON, 'JSON', true);
};
var deserializeParam = function deserializeParam(value) {
return decodeURIComponent(value).replace(/\+/g, ' ');
return decodeURIComponent(String(value).replace(/\+/g, ' '));
};
var polyfillURLSearchParams = function polyfillURLSearchParams() {
@ -1885,11 +1885,11 @@ _setToStringTag(_global.JSON, 'JSON', true);
global.URLSearchParams = URLSearchParams;
};
if (!('URLSearchParams' in global) || new URLSearchParams('?a=1').toString() !== 'a=1') {
if (!('URLSearchParams' in global) || new global.URLSearchParams('?a=1').toString() !== 'a=1') {
polyfillURLSearchParams();
}
var proto = URLSearchParams.prototype;
var proto = global.URLSearchParams.prototype;
if (typeof proto.sort !== 'function') {
proto.sort = function () {
@ -1965,7 +1965,7 @@ _setToStringTag(_global.JSON, 'JSON', true);
*/
var checkIfURLIsSupported = function checkIfURLIsSupported() {
try {
var u = new URL('b', 'http://a');
var u = new global.URL('b', 'http://a');
u.pathname = 'c%20d';
return u.href === 'http://a/c%20d' && u.searchParams;
} catch (e) {
@ -2011,7 +2011,7 @@ _setToStringTag(_global.JSON, 'JSON', true);
value: anchorElement
}); // create a linked searchParams which reflect its changes on URL
var searchParams = new URLSearchParams(this.search);
var searchParams = new global.URLSearchParams(this.search);
var enableSearchUpdate = true;
var enableSearchParamsUpdate = true;
@ -2636,7 +2636,7 @@ var getWeak = _meta.getWeak;
var arrayFind = _arrayMethods(5);
var arrayFindIndex = _arrayMethods(6);
var id$2 = 0;
var id$1 = 0;
// fallback for uncaught frozen keys
var uncaughtFrozenStore = function (that) {
@ -2677,7 +2677,7 @@ var _collectionWeak = {
var C = wrapper(function (that, iterable) {
_anInstance(that, C, NAME, '_i');
that._t = NAME; // collection type
that._i = id$2++; // collection id
that._i = id$1++; // collection id
that._l = undefined; // leak store for uncaught frozen objects
if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
});
@ -5415,7 +5415,7 @@ var controls = {
list.appendChild(menuItem);
},
// Format a time for display
formatTime: function formatTime$$1() {
formatTime: function formatTime$1() {
var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
@ -5535,8 +5535,8 @@ var controls = {
range.setAttribute('aria-valuenow', this.currentTime);
var currentTime = controls.formatTime(this.currentTime);
var duration = controls.formatTime(this.duration);
var format$$1 = i18n.get('seekLabel', this.config);
range.setAttribute('aria-valuetext', format$$1.replace('{currentTime}', currentTime).replace('{duration}', duration));
var format = i18n.get('seekLabel', this.config);
range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));
} else if (matches$1(range, this.config.selectors.inputs.volume)) {
var percent = range.value * 100;
range.setAttribute('aria-valuenow', percent);
@ -7778,13 +7778,13 @@ var ui = {
},
// Toggle controls based on state and `force` argument
toggleControls: function toggleControls(force) {
var controls$$1 = this.elements.controls;
var controls = this.elements.controls;
if (controls$$1 && this.config.hideControls) {
if (controls && this.config.hideControls) {
// Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)
var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide
this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover || recentTouchSeek));
this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover || recentTouchSeek));
}
}
};
@ -8090,11 +8090,11 @@ function () {
on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
var controls$$1 = elements.controls; // Remove button states for fullscreen
var controls = elements.controls; // Remove button states for fullscreen
if (controls$$1 && event.type === 'enterfullscreen') {
controls$$1.pressed = false;
controls$$1.hover = false;
if (controls && event.type === 'enterfullscreen') {
controls.pressed = false;
controls.hover = false;
} // Show, then hide after a timeout unless another control event occurs
@ -8349,7 +8349,7 @@ function () {
}, {
key: "controls",
value: function controls$$1() {
value: function controls$1() {
var _this3 = this;
var player = this.player;
@ -8712,16 +8712,23 @@ var loadjs_umd = createCommonjsModule(function (module, exports) {
maxTries = (args.numRetries || 0) + 1,
beforeCallbackFn = args.before || devnull,
pathStripped = path.replace(/^(css|img)!/, ''),
isCss,
isLegacyIECss,
e;
numTries = numTries || 0;
if (/(^css!|\.css$)/.test(path)) {
isCss = true; // css
// css
e = doc.createElement('link');
e.rel = 'stylesheet';
e.href = pathStripped; //.replace(/^css!/, ''); // remove "css!" prefix
e.href = pathStripped; // tag IE9+
isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)
if (isLegacyIECss && e.relList) {
isLegacyIECss = 0;
e.rel = 'preload';
e.as = 'style';
}
} else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
// image
e = doc.createElement('img');
@ -8734,10 +8741,10 @@ var loadjs_umd = createCommonjsModule(function (module, exports) {
}
e.onload = e.onerror = e.onbeforeload = function (ev) {
var result = ev.type[0]; // Note: The following code isolates IE using `hideFocus` and treats empty
// stylesheets as failures to get around lack of onerror support
var result = ev.type[0]; // treat empty stylesheets as failures to get around lack of onerror
// support in IE9-11
if (isCss && 'hideFocus' in e) {
if (isLegacyIECss) {
try {
if (!e.sheet.cssText.length) result = 'e';
} catch (x) {
@ -8755,6 +8762,9 @@ var loadjs_umd = createCommonjsModule(function (module, exports) {
if (numTries < maxTries) {
return loadFile(path, callbackFn, args, numTries);
}
} else if (e.rel == 'preload' && e.as == 'style') {
// activate preloaded stylesheets
return e.rel = 'stylesheet'; // jshint ignore:line
} // execute callback
@ -8820,16 +8830,27 @@ var loadjs_umd = createCommonjsModule(function (module, exports) {
} else {
bundleIdCache[bundleId] = true;
}
} // load scripts
}
function loadFn(resolve, reject) {
loadFiles(paths, function (pathsNotFound) {
// execute callbacks
executeCallbacks(args, pathsNotFound); // publish bundle load event
executeCallbacks(args, pathsNotFound); // resolve Promise
if (resolve) {
executeCallbacks({
success: resolve,
error: reject
}, pathsNotFound);
} // publish bundle load event
publish(bundleId, pathsNotFound);
}, args);
}
if (args.returnPromise) return new Promise(loadFn);else loadFn();
}
/**
* Execute callbacks when dependencies have been satisfied.
* @param {(string|string[])} deps - List of bundle ids
@ -8933,7 +8954,7 @@ var vimeo = {
}
},
// API Ready
ready: function ready$$1() {
ready: function ready() {
var _this2 = this;
var player = this;
@ -9310,7 +9331,7 @@ var youtube = {
}
},
// API ready
ready: function ready$$1() {
ready: function ready() {
var player = this; // Ignore already setup (race condition)
var currentId = player.media.getAttribute('id');
@ -9338,8 +9359,8 @@ var youtube = {
});
player.media = replaceElement(container, player.media); // Id to poster wrapper
var posterSrc = function posterSrc(format$$1) {
return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format$$1, "default.jpg");
var posterSrc = function posterSrc(format) {
return "https://img.youtube.com/vi/".concat(videoId, "/").concat(format, "default.jpg");
}; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
@ -9731,7 +9752,7 @@ function () {
}, {
key: "ready",
value: function ready$$1() {
value: function ready() {
var _this3 = this;
// Start ticking our safety timer. If the whole advertisement
@ -10215,7 +10236,7 @@ function () {
}, {
key: "on",
value: function on$$1(event, callback) {
value: function on(event, callback) {
if (!is$2.array(this.events[event])) {
this.events[event] = [];
}
@ -11577,7 +11598,7 @@ function () {
}, {
key: "on",
value: function on$$1(event, callback) {
value: function on$1(event, callback) {
on.call(this, this.elements.container, event, callback);
}
/**
@ -11588,7 +11609,7 @@ function () {
}, {
key: "once",
value: function once$$1(event, callback) {
value: function once$1(event, callback) {
once.call(this, this.elements.container, event, callback);
}
/**
@ -11599,7 +11620,7 @@ function () {
}, {
key: "off",
value: function off$$1(event, callback) {
value: function off$1(event, callback) {
off(this.elements.container, event, callback);
}
/**
@ -12258,7 +12279,7 @@ function () {
}, {
key: "loadSprite",
value: function loadSprite$$1(url, id) {
value: function loadSprite$1(url, id) {
return loadSprite(url, id);
}
/**

View File

@ -35,15 +35,15 @@
"deploy": "yarn lint && gulp deploy"
},
"devDependencies": {
"ansi-colors": "^3.2.3",
"aws-sdk": "^2.409.0",
"@babel/core": "^7.3.3",
"@babel/preset-env": "^7.3.1",
"ansi-colors": "^3.2.4",
"aws-sdk": "^2.422.0",
"@babel/core": "^7.3.4",
"@babel/preset-env": "^7.3.4",
"babel-eslint": "^10.0.1",
"del": "^3.0.0",
"eslint": "^5.14.1",
"del": "^4.0.0",
"eslint": "^5.15.2",
"eslint-config-airbnb-base": "^13.1.0",
"eslint-config-prettier": "^4.0.0",
"eslint-config-prettier": "^4.1.0",
"eslint-plugin-import": "^2.16.0",
"fancy-log": "^1.3.3",
"fastly-purge": "^1.0.1",
@ -51,7 +51,7 @@
"gulp": "^4.0.0",
"gulp-autoprefixer": "^6.0.0",
"gulp-awspublish": "^4.0.0",
"gulp-better-rollup": "^3.4.0",
"gulp-better-rollup": "^4.0.1",
"gulp-clean-css": "^4.0.0",
"gulp-filter": "^5.1.0",
"gulp-header": "^2.0.7",
@ -70,7 +70,8 @@
"prettier-eslint": "^8.8.2",
"prettier-stylelint": "^0.4.2",
"remark-cli": "^6.0.1",
"remark-validate-links": "^8.0.0",
"remark-validate-links": "^8.0.1",
"rollup": "^1.6.0",
"rollup-plugin-babel": "^4.3.2",
"rollup-plugin-commonjs": "^9.2.1",
"rollup-plugin-node-resolve": "^4.0.1",
@ -78,17 +79,17 @@
"stylelint-config-prettier": "^5.0.0",
"stylelint-config-recommended": "^2.1.0",
"stylelint-config-sass-guidelines": "^5.3.0",
"stylelint-order": "^2.0.0",
"stylelint-order": "^2.1.0",
"stylelint-scss": "^3.5.4",
"stylelint-selector-bem-pattern": "^2.0.0",
"through2": "^3.0.0"
"through2": "^3.0.1"
},
"dependencies": {
"core-js": "^2.6.5",
"custom-event-polyfill": "^1.0.6",
"loadjs": "^3.5.5",
"loadjs": "^3.6.0",
"rangetouch": "^2.0.0",
"raven-js": "^3.27.0",
"url-polyfill": "^1.1.3"
"url-polyfill": "^1.1.5"
}
}

View File

@ -5,6 +5,10 @@
}
],
"settings": {
"search.exclude": {
"**/node_modules": true,
"**/dist": true
},
// Linting
"stylelint.enable": true,
"css.validate": false,

View File

@ -296,7 +296,7 @@ Note the single quotes encapsulating the JSON and double quotes on the object ke
| `ratio` | String | `16:9` | The aspect ratio you want to use for embedded players. |
| `storage` | Object | `{ enabled: true, key: 'plyr' }` | `enabled`: Allow use of local storage to store user settings. `key`: The key name to use. |
| `speed` | Object | `{ selected: 1, options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] }` | `selected`: The default speed for playback. `options`: Options to display in the menu. Most browsers will refuse to play slower than 0.5. |
| `quality` | Object | `{ default: 'default', options: ['hd2160', 'hd1440', 'hd1080', 'hd720', 'large', 'medium', 'small', 'tiny', 'default'] }` | Currently only supported by YouTube. `default` is the default quality level, determined by YouTube. `options` are the options to display. |
| `quality` | Object | `{ default: 576, options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240] }` | `default` is the default quality level (if it exists in your sources). `options` are the options to display. This is used to filter the available sources. |
| `loop` | Object | `{ active: false }` | `active`: Whether to loop the current video. If the `loop` attribute is present on a `<video>` or `<audio>` element, this will be automatically set to true This is an object to support future functionality. |
| `ads` | Object | `{ enabled: false, publisherId: '' }` | `enabled`: Whether to enable advertisements. `publisherId`: Your unique [vi.ai](https://vi.ai/publisher-video-monetization/?aid=plyrio) publisher ID. |
| `urls` | Object | See source. | If you wish to override any API URLs then you can do so here. You can also set a custom download URL for the download button. |

580
yarn.lock

File diff suppressed because it is too large Load Diff