@ngez/core
Version:
A collection of minimalistic, easy-to-use and fully customizable Angular components, directives and services
235 lines • 25.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { FormGroup } from '@angular/forms';
// @dynamic
export class NgEzValidators {
/**
* @param {?} c1
* @param {?} c2
* @return {?}
*/
static equals(c1, c2) {
return (control) => {
const { value } = control;
if (!value || !(control instanceof FormGroup))
return null;
/** @type {?} */
const formControl1 = control.get(c1);
/** @type {?} */
const formControl2 = control.get(c2);
if (!formControl1 || !formControl2)
return null;
return formControl1.value == formControl2.value
? null
: {
equals: true
};
};
}
/**
* @param {?} control
* @return {?}
*/
static url(control) {
if (!control.value)
return null;
/** @type {?} */
const urlRegex = new RegExp("^" +
// protocol identifier (optional)
// short syntax // still required
"(?:(?:(?:https?|ftp):)?\\/\\/)" +
// user:pass BasicAuth (optional)
"(?:\\S+(?::\\S*)?@)?" +
"(?:" +
// IP address exclusion
// private & local networks
"(?!(?:10|127)(?:\\.\\d{1,3}){3})" +
"(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})" +
"(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})" +
// IP address dotted notation octets
// excludes loopback network 0.0.0.0
// excludes reserved space >= 224.0.0.0
// excludes network & broacast addresses
// (first & last IP address of each class)
"(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" +
"(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" +
"(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" +
"|" +
// host & domain names, may end with dot
// can be replaced by a shortest alternative
// (?![-_])(?:[-\\w\\u00a1-\\uffff]{0,63}[^-_]\\.)+
"(?:" +
"(?:" +
"[a-z0-9\\u00a1-\\uffff]" +
"[a-z0-9\\u00a1-\\uffff_-]{0,62}" +
")?" +
"[a-z0-9\\u00a1-\\uffff]\\." +
")+" +
// TLD identifier name, may end with dot
"(?:[a-z\\u00a1-\\uffff]{2,}\\.?)" +
")" +
// port number (optional)
"(?::\\d{2,5})?" +
// resource path (optional)
"(?:[/?#]\\S*)?" +
"$", "i");
return urlRegex.test(control.value) ? null : { url: true };
}
/**
* @param {?} accept
* @return {?}
*/
static fileType(accept) {
if (!accept)
return (control) => null;
/** @type {?} */
const AUDIO_WILDCARD = "audio/*";
/** @type {?} */
const VIDEO_WILDCARD = "video/*";
/** @type {?} */
const IMAGE_WILDCARD = "image/*";
/** @type {?} */
const extensions = [];
/** @type {?} */
const mimeTypes = [];
/** @type {?} */
let anyAudio = false;
/** @type {?} */
let anyVideo = false;
/** @type {?} */
let anyImage = false;
accept
.split(",")
.map(accept => accept.trim())
.filter(accept => accept)
.forEach(accept => {
//is an extension
if (/^\./.test(accept))
return extensions.push(accept);
//is a wildcard
switch (accept) {
case AUDIO_WILDCARD:
return (anyAudio = true);
case VIDEO_WILDCARD:
return (anyVideo = true);
case IMAGE_WILDCARD:
return (anyImage = true);
}
//anything else is a mime-type
return mimeTypes.push(accept);
});
/** @type {?} */
const validate = (file) => {
if ((anyImage && this.getMimeTypeRegex(IMAGE_WILDCARD).test(file.type)) ||
(anyAudio && this.getMimeTypeRegex(AUDIO_WILDCARD).test(file.type)) ||
(anyVideo && this.getMimeTypeRegex(VIDEO_WILDCARD).test(file.type)) ||
mimeTypes.some(type => file.type == type))
return null;
/** @type {?} */
const name = file.name.split(".");
/** @type {?} */
const fileExtension = name[name.length - 1];
if (extensions.some(extension => extension.toLowerCase().includes(fileExtension.toLowerCase())))
return null;
return {
fileType: {
accept,
actualFile: file
}
};
};
return (control) => {
const { value } = control;
if (!value ||
!(value instanceof File ||
(Array.isArray(value) &&
value.every(value => value instanceof File)) ||
value instanceof FileList))
return null;
if (value instanceof File)
return validate(value);
/** @type {?} */
const files = value instanceof FileList ? Array.from(value) : value;
/** @type {?} */
const errors = files.map(file => validate(file)).filter(file => file);
return errors.length ? errors : null;
};
}
/**
* @param {?} bytes
* @return {?}
*/
static maxSize(bytes) {
/** @type {?} */
const validate = (file) => {
return file.size > bytes
? {
maxSize: {
requiredSize: bytes,
actualFile: file
}
}
: null;
};
return (control) => {
const { value } = control;
if (!value ||
!bytes ||
!(value instanceof File ||
(Array.isArray(value) &&
value.every(value => value instanceof File)) ||
value instanceof FileList))
return null;
if (value instanceof File)
return validate(value);
/** @type {?} */
const files = value instanceof FileList ? Array.from(value) : value;
/** @type {?} */
const errors = files.map(file => validate(file)).filter(file => file);
return errors.length ? errors : null;
};
}
/**
* @param {?} bytes
* @return {?}
*/
static totalSize(bytes) {
return (control) => {
const { value } = control;
if (!value ||
!bytes ||
!(value instanceof File ||
(Array.isArray(value) &&
value.every(value => value instanceof File)) ||
value instanceof FileList))
return null;
/** @type {?} */
const files = value instanceof FileList
? Array.from(value)
: Array.isArray(value)
? value
: [value];
/** @type {?} */
const totalBytes = files.reduce((total, file) => total + file.size, 0);
return totalBytes <= bytes
? null
: {
totalSize: {
requiredTotal: bytes,
actualTotal: totalBytes
}
};
};
}
/**
* @private
* @param {?} str
* @return {?}
*/
static getMimeTypeRegex(str) {
return new RegExp(str.replace("*", ".*"), "i");
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZ2V6L2NvcmUvIiwic291cmNlcyI6WyJmb3Jtcy92YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQW1CLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUc1RCxNQUFNLE9BQU8sY0FBYzs7Ozs7O0lBQ3pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBcUIsRUFBRSxFQUFxQjtRQUN4RCxPQUFPLENBQUMsT0FBa0IsRUFBRSxFQUFFO2tCQUN0QixFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU87WUFFekIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsT0FBTyxZQUFZLFNBQVMsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQzs7a0JBRXJELFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7a0JBQzlCLFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUVwQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsWUFBWTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUVoRCxPQUFPLFlBQVksQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDLEtBQUs7Z0JBQzdDLENBQUMsQ0FBQyxJQUFJO2dCQUNOLENBQUMsQ0FBQztvQkFDRSxNQUFNLEVBQUUsSUFBSTtpQkFDYixDQUFDO1FBQ1IsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs7Ozs7SUFFRCxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQXdCO1FBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDOztjQUUxQixRQUFRLEdBQUcsSUFBSSxNQUFNLENBQ3pCLEdBQUc7WUFDRCxpQ0FBaUM7WUFDakMsaUNBQWlDO1lBQ2pDLGdDQUFnQztZQUNoQyxpQ0FBaUM7WUFDakMsc0JBQXNCO1lBQ3RCLEtBQUs7WUFDTCx1QkFBdUI7WUFDdkIsMkJBQTJC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QUFDLEdBQVc7UUFDekMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBOZ0V6VmFsaWRhdG9ycyB7XHJcbiAgc3RhdGljIGVxdWFscyhjMTogc3RyaW5nIHwgc3RyaW5nW10sIGMyOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBGb3JtR3JvdXApID0+IHtcclxuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gY29udHJvbDtcclxuXHJcbiAgICAgIGlmICghdmFsdWUgfHwgIShjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBmb3JtQ29udHJvbDEgPSBjb250cm9sLmdldChjMSk7XHJcbiAgICAgIGNvbnN0IGZvcm1Db250cm9sMiA9IGNvbnRyb2wuZ2V0KGMyKTtcclxuXHJcbiAgICAgIGlmICghZm9ybUNvbnRyb2wxIHx8ICFmb3JtQ29udHJvbDIpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgcmV0dXJuIGZvcm1Db250cm9sMS52YWx1ZSA9PSBmb3JtQ29udHJvbDIudmFsdWVcclxuICAgICAgICA/IG51bGxcclxuICAgICAgICA6IHtcclxuICAgICAgICAgICAgZXF1YWxzOiB0cnVlXHJcbiAgICAgICAgICB9O1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB1cmwoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IHVybFJlZ2V4ID0gbmV3IFJlZ0V4cChcclxuICAgICAgXCJeXCIgK1xyXG4gICAgICAgIC8vIHByb3RvY29sIGlkZW50aWZpZXIgKG9wdGlvbmFsKVxyXG4gICAgICAgIC8vIHNob3J0IHN5bnRheCAvLyBzdGlsbCByZXF1aXJlZFxyXG4gICAgICAgIFwiKD86KD86KD86aHR0cHM/fGZ0cCk6KT9cXFxcL1xcXFwvKVwiICtcclxuICAgICAgICAvLyB1c2VyOnBhc3MgQmFzaWNBdXRoIChvcHRpb25hbClcclxuICAgICAgICBcIig/OlxcXFxTKyg/OjpcXFxcUyopP0ApP1wiICtcclxuICAgICAgICBcIig/OlwiICtcclxuICAgICAgICAvLyBJUCBhZGRyZXNzIGV4Y2x1c2lvblxyXG4gICAgICAgIC8vIHByaXZhdGUgJiBsb2NhbCBuZXR3b3Jrc1xyXG4gICAgICAgIFwiKD8hKD86MTB8MTI3KSg/OlxcXFwuXFxcXGR7MSwzfSl7M30pXCIgK1xyXG4gICAgICAgIFwiKD8hKD86MTY5XFxcXC4yNTR8MTkyXFxcXC4xNjgpKD86XFxcXC5cXFxcZHsxLDN9KXsyfSlcIiArXHJcbiAgICAgICAgXCIoPyExNzJcXFxcLig/OjFbNi05XXwyXFxcXGR8M1swLTFdKSg/OlxcXFwuXFxcXGR7MSwzfSl7Mn0pXCIgK1xyXG4gICAgICAgIC8vIElQIGFkZHJlc3MgZG90dGVkIG5vdGF0aW9uIG9jdGV0c1xyXG4gICAgICAgIC8vIGV4Y2x1ZGVzIGxvb3BiYWNrIG5ldHdvcmsgMC4wLjAuMFxyXG4gICAgICAgIC8vIGV4Y2x1ZGVzIHJlc2VydmVkIHNwYWNlID49IDIyNC4wLjAuMFxyXG4gICAgICAgIC8vIGV4Y2x1ZGVzIG5ldHdvcmsgJiBicm9hY2FzdCBhZGRyZXNzZXNcclxuICAgICAgICAvLyAoZmlyc3QgJiBsYXN0IElQIGFkZHJlc3Mgb2YgZWFjaCBjbGFzcylcclxuICAgICAgICBcIig/OlsxLTldXFxcXGQ/fDFcXFxcZFxcXFxkfDJbMDFdXFxcXGR8MjJbMC0zXSlcIiArXHJcbiAgICAgICAgXCIoPzpcXFxcLig/OjE/XFxcXGR7MSwyfXwyWzAtNF1cXFxcZHwyNVswLTVdKSl7Mn1cIiArXHJcbiAgICAgICAgXCIoPzpcXFxcLig/OlsxLTldXFxcXGQ/fDFcXFxcZFxcXFxkfDJbMC00XVxcXFxkfDI1WzAtNF0pKVwiICtcclxuICAgICAgICBcInxcIiArXHJcbiAgICAgICAgLy8gaG9zdCAmIGRvbWFpbiBuYW1lcywgbWF5IGVuZCB3aXRoIGRvdFxyXG4gICAgICAgIC8vIGNhbiBiZSByZXBsYWNlZCBieSBhIHNob3J0ZXN0IGFsdGVybmF0aXZlXHJcbiAgICAgICAgLy8gKD8hWy1fXSkoPzpbLVxcXFx3XFxcXHUwMGExLVxcXFx1ZmZmZl17MCw2M31bXi1fXVxcXFwuKStcclxuICAgICAgICBcIig/OlwiICtcclxuICAgICAgICBcIig/OlwiICtcclxuICAgICAgICBcIlthLXowLTlcXFxcdTAwYTEtXFxcXHVmZmZmXVwiICtcclxuICAgICAgICBcIlthLXowLTlcXFxcdTAwYTEtXFxcXHVmZmZmXy1dezAsNjJ9XCIgK1xyXG4gICAgICAgIFwiKT9cIiArXHJcbiAgICAgICAgXCJbYS16MC05XFxcXHUwMGExLVxcXFx1ZmZmZl1cXFxcLlwiICtcclxuICAgICAgICBcIikrXCIgK1xyXG4gICAgICAgIC8vIFRMRCBpZGVudGlmaWVyIG5hbWUsIG1heSBlbmQgd2l0aCBkb3RcclxuICAgICAgICBcIig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmXXsyLH1cXFxcLj8pXCIgK1xyXG4gICAgICAgIFwiKVwiICtcclxuICAgICAgICAvLyBwb3J0IG51bWJlciAob3B0aW9uYWwpXHJcbiAgICAgICAgXCIoPzo6XFxcXGR7Miw1fSk/XCIgK1xyXG4gICAgICAgIC8vIHJlc291cmNlIHBhdGggKG9wdGlvbmFsKVxyXG4gICAgICAgIFwiKD86Wy8/I11cXFxcUyopP1wiICtcclxuICAgICAgICBcIiRcIixcclxuICAgICAgXCJpXCJcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHVybFJlZ2V4LnRlc3QoY29udHJvbC52YWx1ZSkgPyBudWxsIDogeyB1cmw6IHRydWUgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBmaWxlVHlwZShhY2NlcHQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFhY2NlcHQpIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBudWxsO1xyXG5cclxuICAgIGNvbnN0IEFVRElPX1dJTERDQVJEID0gXCJhdWRpby8qXCI7XHJcbiAgICBjb25zdCBWSURFT19XSUxEQ0FSRCA9IFwidmlkZW8vKlwiO1xyXG4gICAgY29uc3QgSU1BR0VfV0lMRENBUkQgPSBcImltYWdlLypcIjtcclxuICAgIGNvbnN0IGV4dGVuc2lvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBtaW1lVHlwZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBsZXQgYW55QXVkaW8gPSBmYWxzZTtcclxuICAgIGxldCBhbnlWaWRlbyA9IGZhbHNlO1xyXG4gICAgbGV0IGFueUltYWdlID0gZmFsc2U7XHJcblxyXG4gICAgYWNjZXB0XHJcbiAgICAgIC5zcGxpdChcIixcIilcclxuICAgICAgLm1hcChhY2NlcHQgPT4gYWNjZXB0LnRyaW0oKSlcclxuICAgICAgLmZpbHRlcihhY2NlcHQgPT4gYWNjZXB0KVxyXG4gICAgICAuZm9yRWFjaChhY2NlcHQgPT4ge1xyXG4gICAgICAgIC8vaXMgYW4gZXh0ZW5zaW9uXHJcbiAgICAgICAgaWYgKC9eXFwuLy50ZXN0KGFjY2VwdCkpIHJldHVybiBleHRlbnNpb25zLnB1c2goYWNjZXB0KTtcclxuXHJcbiAgICAgICAgLy9pcyBhIHdpbGRjYXJkXHJcbiAgICAgICAgc3dpdGNoIChhY2NlcHQpIHtcclxuICAgICAgICAgIGNhc2UgQVVESU9fV0lMRENBUkQ6XHJcbiAgICAgICAgICAgIHJldHVybiAoYW55QXVkaW8gPSB0cnVlKTtcclxuICAgICAgICAgIGNhc2UgVklERU9fV0lMRENBUkQ6XHJcbiAgICAgICAgICAgIHJldHVybiAoYW55VmlkZW8gPSB0cnVlKTtcclxuICAgICAgICAgIGNhc2UgSU1BR0VfV0lMRENBUkQ6XHJcbiAgICAgICAgICAgIHJldHVybiAoYW55SW1hZ2UgPSB0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vYW55dGhpbmcgZWxzZSBpcyBhIG1pbWUtdHlwZVxyXG4gICAgICAgIHJldHVybiBtaW1lVHlwZXMucHVzaChhY2NlcHQpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBjb25zdCB2YWxpZGF0ZSA9IChmaWxlOiBGaWxlKSA9PiB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAoYW55SW1hZ2UgJiYgdGhpcy5nZXRNaW1lVHlwZVJlZ2V4KElNQUdFX1dJTERDQVJEKS50ZXN0KGZpbGUudHlwZSkpIHx8XHJcbiAgICAgICAgKGFueUF1ZGlvICYmIHRoaXMuZ2V0TWltZVR5cGVSZWdleChBVURJT19XSUxEQ0FSRCkudGVzdChmaWxlLnR5cGUpKSB8fFxyXG4gICAgICAgIChhbnlWaWRlbyAmJiB0aGlzLmdldE1pbWVUeXBlUmVnZXgoVklERU9fV0lMRENBUkQpLnRlc3QoZmlsZS50eXBlKSkgfHxcclxuICAgICAgICBtaW1lVHlwZXMuc29tZSh0eXBlID0+IGZpbGUudHlwZSA9PSB0eXBlKVxyXG4gICAgICApXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBuYW1lID0gZmlsZS5uYW1lLnNwbGl0KFwiLlwiKTtcclxuICAgICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IG5hbWVbbmFtZS5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICBleHRlbnNpb25zLnNvbWUoZXh0ZW5zaW9uID0+XHJcbiAgICAgICAgICBleHRlbnNpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWxlRXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgKVxyXG4gICAgICApXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGZpbGVUeXBlOiB7XHJcbiAgICAgICAgICBhY2NlcHQsXHJcbiAgICAgICAgICBhY3R1YWxGaWxlOiBmaWxlXHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBjb250cm9sO1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgICF2YWx1ZSB8fFxyXG4gICAgICAgICEoXHJcbiAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIEZpbGUgfHxcclxuICAgICAgICAgIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxyXG4gICAgICAgICAgICB2YWx1ZS5ldmVyeSh2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpKSB8fFxyXG4gICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBGaWxlTGlzdFxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkgcmV0dXJuIHZhbGlkYXRlKHZhbHVlKTtcclxuXHJcbiAgICAgIGNvbnN0IGZpbGVzOiBGaWxlW10gPVxyXG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgRmlsZUxpc3QgPyBBcnJheS5mcm9tKHZhbHVlKSA6IHZhbHVlO1xyXG5cclxuICAgICAgY29uc3QgZXJyb3JzID0gZmlsZXMubWFwKGZpbGUgPT4gdmFsaWRhdGUoZmlsZSkpLmZpbHRlcihmaWxlID0+IGZpbGUpO1xyXG5cclxuICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyBlcnJvcnMgOiBudWxsO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBtYXhTaXplKGJ5dGVzOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHZhbGlkYXRlID0gKGZpbGU6IEZpbGUpID0+IHtcclxuICAgICAgcmV0dXJuIGZpbGUuc2l6ZSA+IGJ5dGVzXHJcbiAgICAgICAgPyB7XHJcbiAgICAgICAgICAgIG1heFNpemU6IHtcclxuICAgICAgICAgICAgICByZXF1aXJlZFNpemU6IGJ5dGVzLFxyXG4gICAgICAgICAgICAgIGFjdHVhbEZpbGU6IGZpbGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDogbnVsbDtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gY29udHJvbDtcclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICAhdmFsdWUgfHxcclxuICAgICAgICAhYnl0ZXMgfHxcclxuICAgICAgICAhKFxyXG4gICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBGaWxlIHx8XHJcbiAgICAgICAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcclxuICAgICAgICAgICAgdmFsdWUuZXZlcnkodmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBGaWxlKSkgfHxcclxuICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgRmlsZUxpc3RcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHJldHVybiB2YWxpZGF0ZSh2YWx1ZSk7XHJcblxyXG4gICAgICBjb25zdCBmaWxlcyA9IHZhbHVlIGluc3RhbmNlb2YgRmlsZUxpc3QgPyBBcnJheS5mcm9tKHZhbHVlKSA6IHZhbHVlO1xyXG5cclxuICAgICAgY29uc3QgZXJyb3JzID0gZmlsZXMubWFwKGZpbGUgPT4gdmFsaWRhdGUoZmlsZSkpLmZpbHRlcihmaWxlID0+IGZpbGUpO1xyXG5cclxuICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyBlcnJvcnMgOiBudWxsO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB0b3RhbFNpemUoYnl0ZXM6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gY29udHJvbDtcclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICAhdmFsdWUgfHxcclxuICAgICAgICAhYnl0ZXMgfHxcclxuICAgICAgICAhKFxyXG4gICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBGaWxlIHx8XHJcbiAgICAgICAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcclxuICAgICAgICAgICAgdmFsdWUuZXZlcnkodmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBGaWxlKSkgfHxcclxuICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgRmlsZUxpc3RcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGNvbnN0IGZpbGVzOiBGaWxlW10gPVxyXG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgRmlsZUxpc3RcclxuICAgICAgICAgID8gQXJyYXkuZnJvbSh2YWx1ZSlcclxuICAgICAgICAgIDogQXJyYXkuaXNBcnJheSh2YWx1ZSlcclxuICAgICAgICAgID8gdmFsdWVcclxuICAgICAgICAgIDogW3ZhbHVlXTtcclxuXHJcbiAgICAgIGNvbnN0IHRvdGFsQnl0ZXMgPSBmaWxlcy5yZWR1Y2UoKHRvdGFsLCBmaWxlKSA9PiB0b3RhbCArIGZpbGUuc2l6ZSwgMCk7XHJcblxyXG4gICAgICByZXR1cm4gdG90YWxCeXRlcyA8PSBieXRlc1xyXG4gICAgICAgID8gbnVsbFxyXG4gICAgICAgIDoge1xyXG4gICAgICAgICAgICB0b3RhbFNpemU6IHtcclxuICAgICAgICAgICAgICByZXF1aXJlZFRvdGFsOiBieXRlcyxcclxuICAgICAgICAgICAgICBhY3R1YWxUb3RhbDogdG90YWxCeXRlc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGdldE1pbWVUeXBlUmVnZXgoc3RyOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBuZXcgUmVnRXhwKHN0ci5yZXBsYWNlKFwiKlwiLCBcIi4qXCIpLCBcImlcIik7XHJcbiAgfVxyXG59XHJcbiJdfQ==