UNPKG

@asoftwareworld/form-builder-pro

Version:

ASW Form Builder Pro helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same b

134 lines 30.1 kB
import { ObjectUtils } from '@asoftwareworld/form-builder-pro/utils'; import { SHA256 } from './algo/sha256'; import { Base64Decode } from './encode/base64Decode'; import { Base64Encode } from './encode/base64Encode'; export class AswLicense { static licenseKey; static watermarkMessage = undefined; static extractExpiry(license) { const restrictionHashed = license.substring(license.lastIndexOf('-') + 1, license.length); return new Date(parseInt(Base64Decode.decode(restrictionHashed), 10)); } static extractLicenseKey(licenseKey) { // when users copy the license key from a PDF extra zero width characters are sometimes copied too // carriage returns and line feeds are problematic too // all of which causes license key validation to fail - strip these out let cleanedLicenseKey = licenseKey.replace(/[\u200B-\u200D\uFEFF]/g, ''); cleanedLicenseKey = cleanedLicenseKey.replace(/\r?\n|\r/g, ''); const hashStart = cleanedLicenseKey.length - 64; const sha256 = cleanedLicenseKey.substring(hashStart); const license = cleanedLicenseKey.substring(0, hashStart); return { sha256, license }; } static formatDate(date) { const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; const day = date.getDate(); const monthIndex = date.getMonth(); const year = date.getFullYear(); return day + ' ' + monthNames[monthIndex] + ' ' + year; } static registerLicenseKey(licenseKey) { AswLicense.licenseKey = licenseKey; this.validateLicense(); } static validateLicense() { if (ObjectUtils.missingOrEmpty(AswLicense.licenseKey)) { this.outputMissingLicenseKey(); } else if (AswLicense.licenseKey.length > 64) { const { sha256, license } = AswLicense.extractLicenseKey(AswLicense.licenseKey); const lic = Base64Encode.encode(license); if (sha256 === SHA256.hash(lic)) { this.validateExpiryDate(license); } else { this.outputInvalidLicenseKey(); } } else { this.outputInvalidLicenseKey(); } } static validateExpiryDate(license) { const expiry = AswLicense.extractExpiry(license); const now = new Date(); let valid = false; let current = false; if (!isNaN(expiry.getTime())) { valid = true; current = expiry > now; } if (!valid) { this.outputInvalidLicenseKey(); } else if (!current) { const formattedExpiryDate = AswLicense.formatDate(expiry); if (license.indexOf('Trail') > -1) { this.outputExpiredTrialKey(formattedExpiryDate); } else { this.outputExpiredLicenseKey(formattedExpiryDate); } } } static isDisplayWatermark() { if (ObjectUtils.missingOrEmpty(AswLicense.licenseKey)) { this.outputInvalidLicenseKey(); } return !ObjectUtils.missingOrEmpty(this.watermarkMessage); } static getWatermarkMessage() { return this.watermarkMessage || ''; } static outputInvalidLicenseKey() { console.error('**********************************************************************************************************************************'); console.error('**********************************************************************************************************************************'); console.error('* ASW Form Builder pro License *'); console.error('* Invalid License *'); console.error('* Your license for ASW Form Builder pro is not valid - please contact asoftwareworld@gmail.com to obtain a valid license. *'); console.error('**********************************************************************************************************************************'); console.error('**********************************************************************************************************************************'); this.watermarkMessage = 'Invalid License'; } static outputExpiredTrialKey(formattedExpiryDate) { console.error('**********************************************************************************************************************************'); console.error('**********************************************************************************************************************************'); console.error('* ASW Form Builder pro License *'); console.error('* Trial Period Expired. *'); console.error(`* Your license for ASW Form Builder pro expired on ${formattedExpiryDate}. *`); console.error('* Please email asoftwareworld@gmail.com to purchase a license. *'); console.error('**********************************************************************************************************************************'); console.error('**********************************************************************************************************************************'); this.watermarkMessage = 'Trial Period Expired'; } static outputMissingLicenseKey() { console.error('*************************************************************************************************************************'); console.error('*************************************************************************************************************************'); console.error('* ASW Form Builder pro License *'); console.error('* License Key Not Found *'); console.error('* All ASW Form Builder pro features are unlocked. *'); console.error('* This is an evaluation only version, it is not licensed for development projects intended for production. *'); console.error('* If you want to hide the watermark, please email asoftwareworld@gmail.com for a trial license. *'); console.error('*************************************************************************************************************************'); console.error('*************************************************************************************************************************'); this.watermarkMessage = 'For Trial Use Only'; } static outputExpiredLicenseKey(formattedExpiryDate) { console.error('**********************************************************************************************************************************************'); console.error('**********************************************************************************************************************************************'); console.error('* ASW Form Builder pro License *'); console.error('* License key is expired. *'); console.error('* *'); console.error(`* Your ASW Form Builder License entitles you to all versions of ASW Form Builder that we release within the time covered by your license *`); console.error(`* - typically we provide one year licenses which entitles you to all releases / updates of ASW Form Builder within that year. *`); console.error(`* Your license has an end (expiry) date which stops the license key working with versions of ASW Form Builder released after the *`); console.error(`* license end date. The license key that you have expires on ${formattedExpiryDate}, however the version of ASW Form Builder you *`); console.error(`* are trying to use was released on *`); console.error('* *'); console.error('* Please contact asoftwareworld@gmail.com to renew your license key to work with this ASW Form Builder. *'); console.error('**********************************************************************************************************************************************'); console.error('**********************************************************************************************************************************************'); this.watermarkMessage = 'License Expired'; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGljZW5zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvcmUvbGljZW5zZS9saWNlbnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsTUFBTSxPQUFPLFVBQVU7SUFDWCxNQUFNLENBQUMsVUFBVSxDQUFTO0lBQzFCLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBdUIsU0FBUyxDQUFDO0lBRXhELE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBZTtRQUN4QyxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFGLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFTyxNQUFNLENBQUMsaUJBQWlCLENBQUMsVUFBa0I7UUFDL0Msa0dBQWtHO1FBQ2xHLHNEQUFzRDtRQUN0RCx1RUFBdUU7UUFDdkUsSUFBSSxpQkFBaUIsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFL0QsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztR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QUMsS0FBSyxDQUFDLGdKQUFnSixDQUFDLENBQUM7UUFDaEssT0FBTyxDQUFDLEtBQUssQ0FBQyx5SUFBeUksQ0FBQyxDQUFDO1FBQ3pKLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0pBQWdKLENBQUMsQ0FBQztRQUNoSyxPQUFPLENBQUMsS0FBSyxDQUFDLGdKQUFnSixDQUFDLENBQUM7UUFDaEssT0FBTyxDQUFDLEtBQUssQ0FBQyxnSkFBZ0osQ0FBQyxDQUFDO1FBQ2hLLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0pBQWdKLENBQUMsQ0FBQztRQUNoSyxPQUFPLENBQUMsS0FBSyxDQUFDLGdKQUFnSixDQUFDLENBQUM7UUFDaEssT0FBTyxDQUFDLEtBQUssQ0FBQyxnRUFBZ0UsbUJBQW1CLDZEQUE2RCxDQUFDLENBQUM7UUFDaEssT0FBTyxDQUFDLEtBQUssQ0FBQyx1SEFBdUgsQ0FBQyxDQUFDO1FBQ3ZJLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0pBQWdKLENBQUMsQ0FBQztRQUNoSyxPQUFPLENBQUMsS0FBSyxDQUFDLGdKQUFnSixDQUFDLENBQUM7UUFDaEssT0FBTyxDQUFDLEtBQUssQ0FBQyxnSkFBZ0osQ0FBQyxDQUFDO1FBQ2hLLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0pBQWdKLENBQUMsQ0FBQztRQUVoSyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsaUJBQWlCLENBQUM7SUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSAnQGFzb2Z0d2FyZXdvcmxkL2Zvcm0tYnVpbGRlci1wcm8vdXRpbHMnO1xuaW1wb3J0IHsgU0hBMjU2IH0gZnJvbSAnLi9hbGdvL3NoYTI1Nic7XG5pbXBvcnQgeyBCYXNlNjREZWNvZGUgfSBmcm9tICcuL2VuY29kZS9iYXNlNjREZWNvZGUnO1xuaW1wb3J0IHsgQmFzZTY0RW5jb2RlIH0gZnJvbSAnLi9lbmNvZGUvYmFzZTY0RW5jb2RlJztcblxuZXhwb3J0IGNsYXNzIEFzd0xpY2Vuc2Uge1xuICAgIHByaXZhdGUgc3RhdGljIGxpY2Vuc2VLZXk6IHN0cmluZztcbiAgICBwcml2YXRlIHN0YXRpYyB3YXRlcm1hcmtNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBleHRyYWN0RXhwaXJ5KGxpY2Vuc2U6IHN0cmluZyk6IERhdGUge1xuICAgICAgICBjb25zdCByZXN0cmljdGlvbkhhc2hlZCA9IGxpY2Vuc2Uuc3Vic3RyaW5nKGxpY2Vuc2UubGFzdEluZGV4T2YoJy0nKSArIDEsIGxpY2Vuc2UubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHBhcnNlSW50KEJhc2U2NERlY29kZS5kZWNvZGUocmVzdHJpY3Rpb25IYXNoZWQpLCAxMCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGV4dHJhY3RMaWNlbnNlS2V5KGxpY2Vuc2VLZXk6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIC8vIHdoZW4gdXNlcnMgY29weSB0aGUgbGljZW5zZSBrZXkgZnJvbSBhIFBERiBleHRyYSB6ZXJvIHdpZHRoIGNoYXJhY3RlcnMgYXJlIHNvbWV0aW1lcyBjb3BpZWQgdG9vXG4gICAgICAgIC8vIGNhcnJpYWdlIHJldHVybnMgYW5kIGxpbmUgZmVlZHMgYXJlIHByb2JsZW1hdGljIHRvb1xuICAgICAgICAvLyBhbGwgb2Ygd2hpY2ggY2F1c2VzIGxpY2Vuc2Uga2V5IHZhbGlkYXRpb24gdG8gZmFpbCAtIHN0cmlwIHRoZXNlIG91dFxuICAgICAgICBsZXQgY2xlYW5lZExpY2Vuc2VLZXkgPSBsaWNlbnNlS2V5LnJlcGxhY2UoL1tcXHUyMDBCLVxcdTIwMERcXHVGRUZGXS9nLCAnJyk7XG4gICAgICAgIGNsZWFuZWRMaWNlbnNlS2V5ID0gY2xlYW5lZExpY2Vuc2VLZXkucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgJycpO1xuXG4gICAgICAgIGNvbnN0IGhhc2hTdGFydCA9IGNsZWFuZWRMaWNlbnNlS2V5Lmxlbmd0aCAtIDY0O1xuICAgICAgICBjb25zdCBzaGEyNTYgPSBjbGVhbmVkTGljZW5zZUtleS5zdWJzdHJpbmcoaGFzaFN0YXJ0KTtcbiAgICAgICAgY29uc3QgbGljZW5zZSA9IGNsZWFuZWRMaWNlbnNlS2V5LnN1YnN0cmluZygwLCBoYXNoU3RhcnQpO1xuICAgICAgICByZXR1cm4geyBzaGEyNTYsIGxpY2Vuc2UgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmb3JtYXREYXRlKGRhdGU6IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG1vbnRoTmFtZXM6IHN0cmluZ1tdID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4gICAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICBjb25zdCBtb250aEluZGV4ID0gZGF0ZS5nZXRNb250aCgpO1xuICAgICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gICAgICAgIHJldHVybiBkYXkgKyAnICcgKyBtb250aE5hbWVzW21vbnRoSW5kZXhdICsgJyAnICsgeWVhcjtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVnaXN0ZXJMaWNlbnNlS2V5KGxpY2Vuc2VLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBBc3dMaWNlbnNlLmxpY2Vuc2VLZXkgPSBsaWNlbnNlS2V5O1xuICAgICAgICB0aGlzLnZhbGlkYXRlTGljZW5zZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVMaWNlbnNlKCk6IHZvaWQge1xuICAgICAgICBpZiAoT2JqZWN0VXRpbHMubWlzc2luZ09yRW1wdHkoQXN3TGljZW5zZS5saWNlbnNlS2V5KSkge1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRNaXNzaW5nTGljZW5zZUtleSgpO1xuICAgICAgICB9IGVsc2UgaWYgKEFzd0xpY2Vuc2UubGljZW5zZUtleS5sZW5ndGggPiA2NCkge1xuICAgICAgICAgICAgY29uc3QgeyBzaGEyNTYsIGxpY2Vuc2UgfSA9IEFzd0xpY2Vuc2UuZXh0cmFjdExpY2Vuc2VLZXkoQXN3TGljZW5zZS5saWNlbnNlS2V5KTtcbiAgICAgICAgICAgIGNvbnN0IGxpYyA9IEJhc2U2NEVuY29kZS5lbmNvZGUobGljZW5zZSk7XG4gICAgICAgICAgICBpZiAoc2hhMjU2ID09PSBTSEEyNTYuaGFzaChsaWMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZUV4cGlyeURhdGUobGljZW5zZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0SW52YWxpZExpY2Vuc2VLZXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0SW52YWxpZExpY2Vuc2VLZXkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHZhbGlkYXRlRXhwaXJ5RGF0ZShsaWNlbnNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXhwaXJ5ID0gQXN3TGljZW5zZS5leHRyYWN0RXhwaXJ5KGxpY2Vuc2UpO1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIGxldCB2YWxpZCA9IGZhbHNlO1xuICAgICAgICBsZXQgY3VycmVudCA9IGZhbHNlO1xuICAgICAgICBpZiAoIWlzTmFOKGV4cGlyeS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICB2YWxpZCA9IHRydWU7XG4gICAgICAgICAgICBjdXJyZW50ID0gZXhwaXJ5ID4gbm93O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRJbnZhbGlkTGljZW5zZUtleSgpO1xuICAgICAgICB9IGVsc2UgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRFeHBpcnlEYXRlID0gQXN3TGljZW5zZS5mb3JtYXREYXRlKGV4cGlyeSk7XG4gICAgICAgICAgICBpZiAobGljZW5zZS5pbmRleE9mKCdUcmFpbCcpID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm91dHB1dEV4cGlyZWRUcmlhbEtleShmb3JtYXR0ZWRFeHBpcnlEYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdXRwdXRFeHBpcmVkTGljZW5zZUtleShmb3JtYXR0ZWRFeHBpcnlEYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEaXNwbGF5V2F0ZXJtYXJrKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoT2JqZWN0VXRpbHMubWlzc2luZ09yRW1wdHkoQXN3TGljZW5zZS5saWNlbnNlS2V5KSkge1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRJbnZhbGlkTGljZW5zZUtleSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhT2JqZWN0VXRpbHMubWlzc2luZ09yRW1wdHkodGhpcy53YXRlcm1hcmtNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFdhdGVybWFya01lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2F0ZXJtYXJrTWVzc2FnZSB8fCAnJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBvdXRwdXRJbnZhbGlkTGljZW5zZUtleSgpOiB2b2lkIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNXIEZvcm0gQnVpbGRlciBwcm8gTGljZW5zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZCBMaWNlbnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyogWW91ciBsaWNlbnNlIGZvciBBU1cgRm9ybSBCdWlsZGVyIHBybyBpcyBub3QgdmFsaWQgLSBwbGVhc2UgY29udGFjdCBhc29mdHdhcmV3b3JsZEBnbWFpbC5jb20gdG8gb2J0YWluIGEgdmFsaWQgbGljZW5zZS4gKicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKionKTtcblxuICAgICAgICB0aGlzLndhdGVybWFya01lc3NhZ2UgPSAnSW52YWxpZCBMaWNlbnNlJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBvdXRwdXRFeHBpcmVkVHJpYWxLZXkoZm9ybWF0dGVkRXhwaXJ5RGF0ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKionKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1cgRm9ybSBCdWlsZGVyIHBybyBMaWNlbnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIConKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpYWwgUGVyaW9kIEV4cGlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGAqICAgICAgICAgICAgICAgICAgICBZb3VyIGxpY2Vuc2UgZm9yIEFTVyBGb3JtIEJ1aWxkZXIgcHJvIGV4cGlyZWQgb24gJHtmb3JtYXR0ZWRFeHBpcnlEYXRlfS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICpgKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBlbWFpbCBhc29mdHdhcmV3b3JsZEBnbWFpbC5jb20gdG8gcHVyY2hhc2UgYSBsaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKionKTtcblxuICAgICAgICB0aGlzLndhdGVybWFya01lc3NhZ2UgPSAnVHJpYWwgUGVyaW9kIEV4cGlyZWQnO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG91dHB1dE1pc3NpbmdMaWNlbnNlS2V5KCk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmVycm9yKCcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKionKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVyBGb3JtIEJ1aWxkZXIgcHJvIExpY2Vuc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWNlbnNlIEtleSBOb3QgRm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIConKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBBU1cgRm9ybSBCdWlsZGVyIHBybyBmZWF0dXJlcyBhcmUgdW5sb2NrZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyogICAgICAgIFRoaXMgaXMgYW4gZXZhbHVhdGlvbiBvbmx5IHZlcnNpb24sIGl0IGlzIG5vdCBsaWNlbnNlZCBmb3IgZGV2ZWxvcG1lbnQgcHJvamVjdHMgaW50ZW5kZWQgZm9yIHByb2R1Y3Rpb24uICAgICAgIConKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignKiAgICAgICAgICAgSWYgeW91IHdhbnQgdG8gaGlkZSB0aGUgd2F0ZXJtYXJrLCBwbGVhc2UgZW1haWwgYXNvZnR3YXJld29ybGRAZ21haWwuY29tIGZvciBhIHRyaWFsIGxpY2Vuc2UuICAgICAgICAgICAgICAgKicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKionKTtcblxuICAgICAgICB0aGlzLndhdGVybWFya01lc3NhZ2UgPSAnRm9yIFRyaWFsIFVzZSBPbmx5JztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBvdXRwdXRFeHBpcmVkTGljZW5zZUtleShmb3JtYXR0ZWRFeHBpcnlEYXRlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1cgRm9ybSBCdWlsZGVyIHBybyBMaWNlbnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGljZW5zZSBrZXkgaXMgZXhwaXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIConKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgKiBZb3VyIEFTVyBGb3JtIEJ1aWxkZXIgTGljZW5zZSBlbnRpdGxlcyB5b3UgdG8gYWxsIHZlcnNpb25zIG9mIEFTVyBGb3JtIEJ1aWxkZXIgdGhhdCB3ZSByZWxlYXNlIHdpdGhpbiB0aGUgdGltZSBjb3ZlcmVkIGJ5IHlvdXIgbGljZW5zZSAgICAgKmApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGAqIC0gdHlwaWNhbGx5IHdlIHByb3ZpZGUgb25lIHllYXIgbGljZW5zZXMgd2hpY2ggZW50aXRsZXMgeW91IHRvIGFsbCByZWxlYXNlcyAvIHVwZGF0ZXMgb2YgQVNXIEZvcm0gQnVpbGRlciB3aXRoaW4gdGhhdCB5ZWFyLiAgICAgICAgICAgICAgICAqYCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCogWW91ciBsaWNlbnNlIGhhcyBhbiBlbmQgKGV4cGlyeSkgZGF0ZSB3aGljaCBzdG9wcyB0aGUgbGljZW5zZSBrZXkgd29ya2luZyB3aXRoIHZlcnNpb25zIG9mIEFTVyBGb3JtIEJ1aWxkZXIgcmVsZWFzZWQgYWZ0ZXIgdGhlICAgICAgICAgICAgICpgKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgKiBsaWNlbnNlIGVuZCBkYXRlLiBUaGUgbGljZW5zZSBrZXkgdGhhdCB5b3UgaGF2ZSBleHBpcmVzIG9uICR7Zm9ybWF0dGVkRXhwaXJ5RGF0ZX0sIGhvd2V2ZXIgdGhlIHZlcnNpb24gb2YgQVNXIEZvcm0gQnVpbGRlciB5b3UgICAgICAgICAgICAgKmApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGAqIGFyZSB0cnlpbmcgdG8gdXNlIHdhcyByZWxlYXNlZCBvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpgKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcqICAgICAgICAgICAgICAgICBQbGVhc2UgY29udGFjdCBhc29mdHdhcmV3b3JsZEBnbWFpbC5jb20gdG8gcmVuZXcgeW91ciBsaWNlbnNlIGtleSB0byB3b3JrIHdpdGggdGhpcyBBU1cgRm9ybSBCdWlsZGVyLiAgICAgICAgICAgICAgICAgICAgICAqJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKionKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKicpO1xuXG4gICAgICAgIHRoaXMud2F0ZXJtYXJrTWVzc2FnZSA9ICdMaWNlbnNlIEV4cGlyZWQnO1xuICAgIH1cbn1cbiJdfQ==