@spartacus/storefront
Version:
Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.
161 lines • 20.6 kB
JavaScript
import { Injectable } from '@angular/core';
import { ImageLoadingStrategy, } from './media.model';
import * as i0 from "@angular/core";
import * as i1 from "@spartacus/core";
/**
* Service which generates media URLs. It leverage the MediaContainer and MediaFormats so
* that URLs and sizes are generated for the same media. This helps to improve performance
* across difference devices and layouts.
*
* Media formats are optional, but highly recommended. The format will help the browser to
* identify the right media for the right experience.
*
* The MediaService will generate absolute URLs in case relative URLs are provided for the Media.
* The baseUrl is read from the `occConfig.backend.media.baseUrl` or
* `occConfig.backend.occ.baseUrl`.
*/
export class MediaService {
constructor(config) {
this.config = config;
}
/**
* Returns a `Media` object with the main media (`src`) and various media (`src`)
* for specific formats.
*/
getMedia(mediaContainer, format, alt, role) {
if (!mediaContainer) {
return;
}
const mainMedia = mediaContainer.url
? mediaContainer
: this.resolveMedia(mediaContainer, format);
return {
src: this.resolveAbsoluteUrl(mainMedia === null || mainMedia === void 0 ? void 0 : mainMedia.url),
alt: alt !== null && alt !== void 0 ? alt : mainMedia === null || mainMedia === void 0 ? void 0 : mainMedia.altText,
role: role !== null && role !== void 0 ? role : mainMedia === null || mainMedia === void 0 ? void 0 : mainMedia.role,
srcset: this.resolveSrcSet(mediaContainer, format),
};
}
/**
* Reads the loading strategy from the `MediaConfig`.
*
* Defaults to `ImageLoadingStrategy.EAGER`.
*/
get loadingStrategy() {
var _a, _b;
return ((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.imageLoadingStrategy) !== null && _b !== void 0 ? _b : ImageLoadingStrategy.EAGER);
}
/**
* Creates the media formats in a logical sorted order. The map contains the
* format key and the format size information. We do this only once for performance
* benefits.
*/
get sortedFormats() {
var _a, _b;
if (!this._sortedFormats && ((_a = this.config) === null || _a === void 0 ? void 0 : _a.mediaFormats)) {
this._sortedFormats = Object.keys(this.config.mediaFormats)
.map((key) => ({
code: key,
size: this.config.mediaFormats[key],
}))
.sort((a, b) => (a.size.width > b.size.width ? 1 : -1));
}
return (_b = this._sortedFormats) !== null && _b !== void 0 ? _b : [];
}
/**
* Creates the media formats in a reversed sorted order.
*/
get reversedFormats() {
if (!this._reversedFormats) {
this._reversedFormats = this.sortedFormats.slice().reverse();
}
return this._reversedFormats;
}
/**
* Resolves the right media for the given format. The fo
*/
resolveMedia(media, format) {
return media[this.resolveFormat(media, format)];
}
/**
* Validates the format against the given mediaContainer. If there is no format available,
* or if the mediaContainer doesn't contain a media for the given media, the most optimal
* format is resolved. If even that is not possible, the first format is returned.
*/
resolveFormat(mediaContainer, format) {
if (format && mediaContainer[format]) {
return format;
}
return (this.resolveBestFormat(mediaContainer) || Object.keys(mediaContainer)[0]);
}
/**
* Returns the media format code with the best size.
*/
resolveBestFormat(media) {
var _a;
return (_a = this.reversedFormats.find((format) => media.hasOwnProperty(format.code))) === null || _a === void 0 ? void 0 : _a.code;
}
/**
* Returns a set of media for the available media formats. Additionally, the configured media
* format width is added to the srcset, so that browsers can select the appropriate media.
*
* The optional maxFormat indicates that only sources till a certain format should be added
* to the srcset.
*/
resolveSrcSet(media, maxFormat) {
if (!media) {
return undefined;
}
// Only create srcset images that are smaller than the given `maxFormat` (if any)
let formats = this.sortedFormats;
const max = formats.findIndex((f) => f.code === maxFormat);
if (max > -1) {
formats = formats.slice(0, max + 1);
}
const srcset = formats.reduce((set, format) => {
if (!!media[format.code]) {
if (set) {
set += ', ';
}
set += `${this.resolveAbsoluteUrl(media[format.code].url)} ${format.size.width}w`;
}
return set;
}, '');
return srcset === '' ? undefined : srcset;
}
/**
* Resolves the absolute URL for the given url. In most cases, this URL represents
* the relative URL on the backend. In that case, we prefix the url with the baseUrl.
*
* When we have receive an absolute URL, we return the URL as-is. An absolute URL might also
* start with double slash, which is used to resolve media cross from http and https.
*/
resolveAbsoluteUrl(url) {
return !url || url.startsWith('http') || url.startsWith('//')
? url
: this.getBaseUrl() + url;
}
/**
* The base URL is either driven by a specific `backend.media.baseUrl`, or by the
* `backend.occ.baseUrl`.
*
* The `backend.media.baseUrl` can be used to load media from a different location.
*
* In Commerce Cloud, a different location could mean a different "aspect".
*
* Defaults to empty string in case no config is provided.
*/
getBaseUrl() {
var _a, _b, _c, _d, _e, _f;
return ((_f = (_c = (_b = (_a = this.config.backend) === null || _a === void 0 ? void 0 : _a.media) === null || _b === void 0 ? void 0 : _b.baseUrl) !== null && _c !== void 0 ? _c : (_e = (_d = this.config.backend) === null || _d === void 0 ? void 0 : _d.occ) === null || _e === void 0 ? void 0 : _e.baseUrl) !== null && _f !== void 0 ? _f : '');
}
}
MediaService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MediaService, deps: [{ token: i1.Config }], target: i0.ɵɵFactoryTarget.Injectable });
MediaService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MediaService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MediaService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.Config }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVkaWEuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0b3JlZnJvbnRsaWIvc2hhcmVkL2NvbXBvbmVudHMvbWVkaWEvbWVkaWEuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFDTCxvQkFBb0IsR0FJckIsTUFBTSxlQUFlLENBQUM7OztBQUV2Qjs7Ozs7Ozs7Ozs7R0FXRztBQUlILE1BQU0sT0FBTyxZQUFZO0lBUXZCLFlBQXNCLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO0lBQUcsQ0FBQztJQUV4Qzs7O09BR0c7SUFDSCxRQUFRLENBQ04sY0FBdUMsRUFDdkMsTUFBZSxFQUNmLEdBQVksRUFDWixJQUFhO1FBRWIsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNuQixPQUFPO1NBQ1I7UUFFRCxNQUFNLFNBQVMsR0FBVSxjQUFjLENBQUMsR0FBRztZQUN6QyxDQUFDLENBQUMsY0FBYztZQUNoQixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFnQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWhFLE9BQU87WUFDTCxHQUFHLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxHQUFHLENBQUM7WUFDNUMsR0FBRyxFQUFFLEdBQUcsYUFBSCxHQUFHLGNBQUgsR0FBRyxHQUFJLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxPQUFPO1lBQzlCLElBQUksRUFBRSxJQUFJLGFBQUosSUFBSSxjQUFKLElBQUksR0FBSSxTQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsSUFBSTtZQUM3QixNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO1NBQ25ELENBQUM7SUFD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eEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb25maWcsIEltYWdlIH0gZnJvbSAnQHNwYXJ0YWN1cy9jb3JlJztcbmltcG9ydCB7IE1lZGlhQ29uZmlnIH0gZnJvbSAnLi9tZWRpYS5jb25maWcnO1xuaW1wb3J0IHtcbiAgSW1hZ2VMb2FkaW5nU3RyYXRlZ3ksXG4gIE1lZGlhLFxuICBNZWRpYUNvbnRhaW5lcixcbiAgTWVkaWFGb3JtYXRTaXplLFxufSBmcm9tICcuL21lZGlhLm1vZGVsJztcblxuLyoqXG4gKiBTZXJ2aWNlIHdoaWNoIGdlbmVyYXRlcyBtZWRpYSBVUkxzLiBJdCBsZXZlcmFnZSB0aGUgTWVkaWFDb250YWluZXIgYW5kIE1lZGlhRm9ybWF0cyBzb1xuICogdGhhdCBVUkxzIGFuZCBzaXplcyBhcmUgZ2VuZXJhdGVkIGZvciB0aGUgc2FtZSBtZWRpYS4gVGhpcyBoZWxwcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlXG4gKiBhY3Jvc3MgZGlmZmVyZW5jZSBkZXZpY2VzIGFuZCBsYXlvdXRzLlxuICpcbiAqIE1lZGlhIGZvcm1hdHMgYXJlIG9wdGlvbmFsLCBidXQgaGlnaGx5IHJlY29tbWVuZGVkLiBUaGUgZm9ybWF0IHdpbGwgaGVscCB0aGUgYnJvd3NlciB0b1xuICogaWRlbnRpZnkgdGhlIHJpZ2h0IG1lZGlhIGZvciB0aGUgcmlnaHQgZXhwZXJpZW5jZS5cbiAqXG4gKiBUaGUgTWVkaWFTZXJ2aWNlIHdpbGwgZ2VuZXJhdGUgYWJzb2x1dGUgVVJMcyBpbiBjYXNlIHJlbGF0aXZlIFVSTHMgYXJlIHByb3ZpZGVkIGZvciB0aGUgTWVkaWEuXG4gKiBUaGUgYmFzZVVybCBpcyByZWFkIGZyb20gdGhlIGBvY2NDb25maWcuYmFja2VuZC5tZWRpYS5iYXNlVXJsYCBvclxuICogYG9jY0NvbmZpZy5iYWNrZW5kLm9jYy5iYXNlVXJsYC5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIE1lZGlhU2VydmljZSB7XG4gIC8qKlxuICAgKiBUaGUgbWVkaWEgZm9ybWF0cyBzb3J0ZWQgYnkgc2l6ZS4gVGhlIG1lZGlhIGZvcm1hdCByZXByZXNlbnRpbmcgdGhlIHNtYWxsZXN0XG4gICAqIHNpemUgaXMgc29ydGVkIG9uIHRvcC5cbiAgICovXG4gIHByaXZhdGUgX3NvcnRlZEZvcm1hdHM6IHsgY29kZTogc3RyaW5nOyBzaXplOiBNZWRpYUZvcm1hdFNpemUgfVtdO1xuICBwcml2YXRlIF9yZXZlcnNlZEZvcm1hdHM6IHsgY29kZTogc3RyaW5nOyBzaXplOiBNZWRpYUZvcm1hdFNpemUgfVtdO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjb25maWc6IENvbmZpZykge31cblxuICAvKipcbiAgICogUmV0dXJucyBhIGBNZWRpYWAgb2JqZWN0IHdpdGggdGhlIG1haW4gbWVkaWEgKGBzcmNgKSBhbmQgdmFyaW91cyBtZWRpYSAoYHNyY2ApXG4gICAqIGZvciBzcGVjaWZpYyBmb3JtYXRzLlxuICAgKi9cbiAgZ2V0TWVkaWEoXG4gICAgbWVkaWFDb250YWluZXI/OiBNZWRpYUNvbnRhaW5lciB8IEltYWdlLFxuICAgIGZvcm1hdD86IHN0cmluZyxcbiAgICBhbHQ/OiBzdHJpbmcsXG4gICAgcm9sZT86IHN0cmluZ1xuICApOiBNZWRpYSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFtZWRpYUNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1haW5NZWRpYTogSW1hZ2UgPSBtZWRpYUNvbnRhaW5lci51cmxcbiAgICAgID8gbWVkaWFDb250YWluZXJcbiAgICAgIDogdGhpcy5yZXNvbHZlTWVkaWEobWVkaWFDb250YWluZXIgYXMgTWVkaWFDb250YWluZXIsIGZvcm1hdCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3JjOiB0aGlzLnJlc29sdmVBYnNvbHV0ZVVybChtYWluTWVkaWE/LnVybCksXG4gICAgICBhbHQ6IGFsdCA/PyBtYWluTWVkaWE/LmFsdFRleHQsXG4gICAgICByb2xlOiByb2xlID8/IG1haW5NZWRpYT8ucm9sZSxcbiAgICAgIHNyY3NldDogdGhpcy5yZXNvbHZlU3JjU2V0KG1lZGlhQ29udGFpbmVyLCBmb3JtYXQpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGxvYWRpbmcgc3RyYXRlZ3kgZnJvbSB0aGUgYE1lZGlhQ29uZmlnYC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYEltYWdlTG9hZGluZ1N0cmF0ZWd5LkVBR0VSYC5cbiAgICovXG4gIGdldCBsb2FkaW5nU3RyYXRlZ3koKTogSW1hZ2VMb2FkaW5nU3RyYXRlZ3kge1xuICAgIHJldHVybiAoXG4gICAgICAodGhpcy5jb25maWcgYXMgTWVkaWFDb25maWcpPy5pbWFnZUxvYWRpbmdTdHJhdGVneSA/P1xuICAgICAgSW1hZ2VMb2FkaW5nU3RyYXRlZ3kuRUFHRVJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIG1lZGlhIGZvcm1hdHMgaW4gYSBsb2dpY2FsIHNvcnRlZCBvcmRlci4gVGhlIG1hcCBjb250YWlucyB0aGVcbiAgICogZm9ybWF0IGtleSBhbmQgdGhlIGZvcm1hdCBzaXplIGluZm9ybWF0aW9uLiBXZSBkbyB0aGlzIG9ubHkgb25jZSBmb3IgcGVyZm9ybWFuY2VcbiAgICogYmVuZWZpdHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHNvcnRlZEZvcm1hdHMoKTogeyBjb2RlOiBzdHJpbmc7IHNpemU6IE1lZGlhRm9ybWF0U2l6ZSB9W10ge1xuICAgIGlmICghdGhpcy5fc29ydGVkRm9ybWF0cyAmJiB0aGlzLmNvbmZpZz8ubWVkaWFGb3JtYXRzKSB7XG4gICAgICB0aGlzLl9zb3J0ZWRGb3JtYXRzID0gT2JqZWN0LmtleXModGhpcy5jb25maWcubWVkaWFGb3JtYXRzKVxuICAgICAgICAubWFwKChrZXkpID0+ICh7XG4gICAgICAgICAgY29kZToga2V5LFxuICAgICAgICAgIHNpemU6IHRoaXMuY29uZmlnLm1lZGlhRm9ybWF0c1trZXldLFxuICAgICAgICB9KSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IChhLnNpemUud2lkdGggPiBiLnNpemUud2lkdGggPyAxIDogLTEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRlZEZvcm1hdHMgPz8gW107XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgbWVkaWEgZm9ybWF0cyBpbiBhIHJldmVyc2VkIHNvcnRlZCBvcmRlci5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcmV2ZXJzZWRGb3JtYXRzKCk6IHsgY29kZTogc3RyaW5nOyBzaXplOiBNZWRpYUZvcm1hdFNpemUgfVtdIHtcbiAgICBpZiAoIXRoaXMuX3JldmVyc2VkRm9ybWF0cykge1xuICAgICAgdGhpcy5fcmV2ZXJzZWRGb3JtYXRzID0gdGhpcy5zb3J0ZWRGb3JtYXRzLnNsaWNlKCkucmV2ZXJzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmV2ZXJzZWRGb3JtYXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSByaWdodCBtZWRpYSBmb3IgdGhlIGdpdmVuIGZvcm1hdC4gVGhlIGZvXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZU1lZGlhKG1lZGlhOiBNZWRpYUNvbnRhaW5lciwgZm9ybWF0Pzogc3RyaW5nKTogSW1hZ2Uge1xuICAgIHJldHVybiBtZWRpYVt0aGlzLnJlc29sdmVGb3JtYXQobWVkaWEsIGZvcm1hdCldO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgZm9ybWF0IGFnYWluc3QgdGhlIGdpdmVuIG1lZGlhQ29udGFpbmVyLiBJZiB0aGVyZSBpcyBubyBmb3JtYXQgYXZhaWxhYmxlLFxuICAgKiBvciBpZiB0aGUgbWVkaWFDb250YWluZXIgZG9lc24ndCBjb250YWluIGEgbWVkaWEgZm9yIHRoZSBnaXZlbiBtZWRpYSwgdGhlIG1vc3Qgb3B0aW1hbFxuICAgKiBmb3JtYXQgaXMgcmVzb2x2ZWQuIElmIGV2ZW4gdGhhdCBpcyBub3QgcG9zc2libGUsIHRoZSBmaXJzdCBmb3JtYXQgaXMgcmV0dXJuZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZUZvcm1hdChcbiAgICBtZWRpYUNvbnRhaW5lcjogTWVkaWFDb250YWluZXIsXG4gICAgZm9ybWF0Pzogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKGZvcm1hdCAmJiBtZWRpYUNvbnRhaW5lcltmb3JtYXRdKSB7XG4gICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5yZXNvbHZlQmVzdEZvcm1hdChtZWRpYUNvbnRhaW5lcikgfHwgT2JqZWN0LmtleXMobWVkaWFDb250YWluZXIpWzBdXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBtZWRpYSBmb3JtYXQgY29kZSB3aXRoIHRoZSBiZXN0IHNpemUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZUJlc3RGb3JtYXQobWVkaWE6IE1lZGlhQ29udGFpbmVyIHwgSW1hZ2UpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJldmVyc2VkRm9ybWF0cy5maW5kKChmb3JtYXQpID0+XG4gICAgICBtZWRpYS5oYXNPd25Qcm9wZXJ0eShmb3JtYXQuY29kZSlcbiAgICApPy5jb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzZXQgb2YgbWVkaWEgZm9yIHRoZSBhdmFpbGFibGUgbWVkaWEgZm9ybWF0cy4gQWRkaXRpb25hbGx5LCB0aGUgY29uZmlndXJlZCBtZWRpYVxuICAgKiBmb3JtYXQgd2lkdGggaXMgYWRkZWQgdG8gdGhlIHNyY3NldCwgc28gdGhhdCBicm93c2VycyBjYW4gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBtZWRpYS5cbiAgICpcbiAgICogVGhlIG9wdGlvbmFsIG1heEZvcm1hdCBpbmRpY2F0ZXMgdGhhdCBvbmx5IHNvdXJjZXMgdGlsbCBhIGNlcnRhaW4gZm9ybWF0IHNob3VsZCBiZSBhZGRlZFxuICAgKiB0byB0aGUgc3Jjc2V0LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVTcmNTZXQoXG4gICAgbWVkaWE6IE1lZGlhQ29udGFpbmVyIHwgSW1hZ2UsXG4gICAgbWF4Rm9ybWF0Pzogc3RyaW5nXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFtZWRpYSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGNyZWF0ZSBzcmNzZXQgaW1hZ2VzIHRoYXQgYXJlIHNtYWxsZXIgdGhhbiB0aGUgZ2l2ZW4gYG1heEZvcm1hdGAgKGlmIGFueSlcbiAgICBsZXQgZm9ybWF0cyA9IHRoaXMuc29ydGVkRm9ybWF0cztcbiAgICBjb25zdCBtYXg6IG51bWJlciA9IGZvcm1hdHMuZmluZEluZGV4KChmKSA9PiBmLmNvZGUgPT09IG1heEZvcm1hdCk7XG4gICAgaWYgKG1heCA+IC0xKSB7XG4gICAgICBmb3JtYXRzID0gZm9ybWF0cy5zbGljZSgwLCBtYXggKyAxKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcmNzZXQgPSBmb3JtYXRzLnJlZHVjZSgoc2V0LCBmb3JtYXQpID0+IHtcbiAgICAgIGlmICghIW1lZGlhW2Zvcm1hdC5jb2RlXSkge1xuICAgICAgICBpZiAoc2V0KSB7XG4gICAgICAgICAgc2V0ICs9ICcsICc7XG4gICAgICAgIH1cbiAgICAgICAgc2V0ICs9IGAke3RoaXMucmVzb2x2ZUFic29sdXRlVXJsKG1lZGlhW2Zvcm1hdC5jb2RlXS51cmwpfSAke1xuICAgICAgICAgIGZvcm1hdC5zaXplLndpZHRoXG4gICAgICAgIH13YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXQ7XG4gICAgfSwgJycpO1xuXG4gICAgcmV0dXJuIHNyY3NldCA9PT0gJycgPyB1bmRlZmluZWQgOiBzcmNzZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGFic29sdXRlIFVSTCBmb3IgdGhlIGdpdmVuIHVybC4gSW4gbW9zdCBjYXNlcywgdGhpcyBVUkwgcmVwcmVzZW50c1xuICAgKiB0aGUgcmVsYXRpdmUgVVJMIG9uIHRoZSBiYWNrZW5kLiBJbiB0aGF0IGNhc2UsIHdlIHByZWZpeCB0aGUgdXJsIHdpdGggdGhlIGJhc2VVcmwuXG4gICAqXG4gICAqIFdoZW4gd2UgaGF2ZSByZWNlaXZlIGFuIGFic29sdXRlIFVSTCwgd2UgcmV0dXJuIHRoZSBVUkwgYXMtaXMuIEFuIGFic29sdXRlIFVSTCBtaWdodCBhbHNvXG4gICAqIHN0YXJ0IHdpdGggZG91YmxlIHNsYXNoLCB3aGljaCBpcyB1c2VkIHRvIHJlc29sdmUgbWVkaWEgY3Jvc3MgZnJvbSBodHRwIGFuZCBodHRwcy5cbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlQWJzb2x1dGVVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAhdXJsIHx8IHVybC5zdGFydHNXaXRoKCdodHRwJykgfHwgdXJsLnN0YXJ0c1dpdGgoJy8vJylcbiAgICAgID8gdXJsXG4gICAgICA6IHRoaXMuZ2V0QmFzZVVybCgpICsgdXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIFVSTCBpcyBlaXRoZXIgZHJpdmVuIGJ5IGEgc3BlY2lmaWMgYGJhY2tlbmQubWVkaWEuYmFzZVVybGAsIG9yIGJ5IHRoZVxuICAgKiBgYmFja2VuZC5vY2MuYmFzZVVybGAuXG4gICAqXG4gICAqIFRoZSBgYmFja2VuZC5tZWRpYS5iYXNlVXJsYCBjYW4gYmUgdXNlZCB0byBsb2FkIG1lZGlhIGZyb20gYSBkaWZmZXJlbnQgbG9jYXRpb24uXG4gICAqXG4gICAqIEluIENvbW1lcmNlIENsb3VkLCBhIGRpZmZlcmVudCBsb2NhdGlvbiBjb3VsZCBtZWFuIGEgZGlmZmVyZW50IFwiYXNwZWN0XCIuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZyBpbiBjYXNlIG5vIGNvbmZpZyBpcyBwcm92aWRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRCYXNlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29uZmlnLmJhY2tlbmQ/Lm1lZGlhPy5iYXNlVXJsID8/XG4gICAgICB0aGlzLmNvbmZpZy5iYWNrZW5kPy5vY2M/LmJhc2VVcmwgPz9cbiAgICAgICcnXG4gICAgKTtcbiAgfVxufVxuIl19