UNPKG

@ngx-i18nsupport/ngx-i18nsupport-lib

Version:

A Typescript library to work with Angular generated i18n files (xliff, xmb)

303 lines 23.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * Created by roobm on 16.05.2017. * Mapping from normalized tag names to placeholder names. */ /* copied from https://github.com/angular/angular/blob/master/packages/compiler/src/i18n/serializers/placeholder.ts */ /** @type {?} */ var TAG_TO_PLACEHOLDER_NAMES = { 'A': 'LINK', 'B': 'BOLD_TEXT', 'BR': 'LINE_BREAK', 'EM': 'EMPHASISED_TEXT', 'H1': 'HEADING_LEVEL1', 'H2': 'HEADING_LEVEL2', 'H3': 'HEADING_LEVEL3', 'H4': 'HEADING_LEVEL4', 'H5': 'HEADING_LEVEL5', 'H6': 'HEADING_LEVEL6', 'HR': 'HORIZONTAL_RULE', 'I': 'ITALIC_TEXT', 'LI': 'LIST_ITEM', 'LINK': 'MEDIA_LINK', 'OL': 'ORDERED_LIST', 'P': 'PARAGRAPH', 'Q': 'QUOTATION', 'S': 'STRIKETHROUGH_TEXT', 'SMALL': 'SMALL_TEXT', 'SUB': 'SUBSTRIPT', 'SUP': 'SUPERSCRIPT', 'TBODY': 'TABLE_BODY', 'TD': 'TABLE_CELL', 'TFOOT': 'TABLE_FOOTER', 'TH': 'TABLE_HEADER_CELL', 'THEAD': 'TABLE_HEADER', 'TR': 'TABLE_ROW', 'TT': 'MONOSPACED_TEXT', 'U': 'UNDERLINED_TEXT', 'UL': 'UNORDERED_LIST', }; /** * HTML Tags (in uppercase) that are empty, they have no content, but do not need a close tag, e.g. <br>, <img>, <hr>. * @type {?} */ var VOID_TAGS = ['BR', 'HR', 'IMG', 'AREA', 'LINK', 'WBR']; var TagMapping = /** @class */ (function () { function TagMapping() { } /** * @param {?} tag * @param {?} id * @return {?} */ TagMapping.prototype.getStartTagPlaceholderName = /** * @param {?} tag * @param {?} id * @return {?} */ function (tag, id) { /** @type {?} */ var upperTag = tag.toUpperCase(); /** @type {?} */ var baseName = TAG_TO_PLACEHOLDER_NAMES[upperTag] || "TAG_" + upperTag; return "START_" + baseName + this.counterString(id); }; /** * @param {?} tag * @return {?} */ TagMapping.prototype.getCloseTagPlaceholderName = /** * @param {?} tag * @return {?} */ function (tag) { /** @type {?} */ var upperTag = tag.toUpperCase(); /** @type {?} */ var baseName = TAG_TO_PLACEHOLDER_NAMES[upperTag] || "TAG_" + upperTag; return "CLOSE_" + baseName; }; /** * @param {?} tag * @param {?} id * @return {?} */ TagMapping.prototype.getEmptyTagPlaceholderName = /** * @param {?} tag * @param {?} id * @return {?} */ function (tag, id) { /** @type {?} */ var upperTag = tag.toUpperCase(); /** @type {?} */ var baseName = TAG_TO_PLACEHOLDER_NAMES[upperTag] || "TAG_" + upperTag; return baseName + this.counterString(id); }; /** * @param {?} tag * @return {?} */ TagMapping.prototype.getCtypeForTag = /** * @param {?} tag * @return {?} */ function (tag) { switch (tag.toLowerCase()) { case 'br': return 'lb'; case 'img': return 'image'; default: return "x-" + tag; } }; /** * @param {?} placeholderName * @return {?} */ TagMapping.prototype.getTagnameFromStartTagPlaceholderName = /** * @param {?} placeholderName * @return {?} */ function (placeholderName) { if (placeholderName.startsWith('START_TAG_')) { return this.stripCounter(placeholderName.substring('START_TAG_'.length)).toLowerCase(); } else if (placeholderName.startsWith('START_')) { /** @type {?} */ var ph_1 = this.stripCounter(placeholderName.substring('START_'.length)); /** @type {?} */ var matchKey = Object.keys(TAG_TO_PLACEHOLDER_NAMES).find((/** * @param {?} key * @return {?} */ function (key) { return TAG_TO_PLACEHOLDER_NAMES[key] === ph_1; })); return matchKey ? matchKey.toLowerCase() : null; } return null; }; /** * @param {?} placeholderName * @return {?} */ TagMapping.prototype.getTagnameFromCloseTagPlaceholderName = /** * @param {?} placeholderName * @return {?} */ function (placeholderName) { if (placeholderName.startsWith('CLOSE_TAG_')) { return this.stripCounter(placeholderName.substring('CLOSE_TAG_'.length)).toLowerCase(); } else if (placeholderName.startsWith('CLOSE_')) { /** @type {?} */ var ph_2 = this.stripCounter(placeholderName.substring('CLOSE_'.length)); /** @type {?} */ var matchKey = Object.keys(TAG_TO_PLACEHOLDER_NAMES).find((/** * @param {?} key * @return {?} */ function (key) { return TAG_TO_PLACEHOLDER_NAMES[key] === ph_2; })); return matchKey ? matchKey.toLowerCase() : null; } return null; }; /** * Test, wether placeholder name stands for empty html tag. * @param placeholderName can be TAG_<name> or just <name> */ /** * Test, wether placeholder name stands for empty html tag. * @param {?} placeholderName can be TAG_<name> or just <name> * @return {?} */ TagMapping.prototype.isEmptyTagPlaceholderName = /** * Test, wether placeholder name stands for empty html tag. * @param {?} placeholderName can be TAG_<name> or just <name> * @return {?} */ function (placeholderName) { /** @type {?} */ var ph = this.stripCounter(placeholderName); /** @type {?} */ var matchKey; if (ph.startsWith('TAG_')) { matchKey = ph.substring(4).toUpperCase(); } else { matchKey = Object.keys(TAG_TO_PLACEHOLDER_NAMES).find((/** * @param {?} key * @return {?} */ function (key) { return TAG_TO_PLACEHOLDER_NAMES[key] === ph; })); } if (matchKey) { if (VOID_TAGS.indexOf(matchKey) >= 0) { return true; } } return false; }; /** * tagname of empty tag placeholder. * @param placeholderName can be TAG_<name> or just <name> */ /** * tagname of empty tag placeholder. * @param {?} placeholderName can be TAG_<name> or just <name> * @return {?} */ TagMapping.prototype.getTagnameFromEmptyTagPlaceholderName = /** * tagname of empty tag placeholder. * @param {?} placeholderName can be TAG_<name> or just <name> * @return {?} */ function (placeholderName) { /** @type {?} */ var ph = this.stripCounter(placeholderName); /** @type {?} */ var matchKey; if (ph.startsWith('TAG_')) { matchKey = ph.substring(4).toUpperCase(); } else { matchKey = Object.keys(TAG_TO_PLACEHOLDER_NAMES).find((/** * @param {?} key * @return {?} */ function (key) { return TAG_TO_PLACEHOLDER_NAMES[key] === ph; })); } if (matchKey) { if (VOID_TAGS.indexOf(matchKey) >= 0) { return matchKey.toLowerCase(); } else { return null; } } return null; }; /** * If placeholder ends with _[0-9]+, strip that number. * @param placeholderName placeholderName * @return placeholderName without counter at end. */ /** * If placeholder ends with _[0-9]+, strip that number. * @private * @param {?} placeholderName placeholderName * @return {?} placeholderName without counter at end. */ TagMapping.prototype.stripCounter = /** * If placeholder ends with _[0-9]+, strip that number. * @private * @param {?} placeholderName placeholderName * @return {?} placeholderName without counter at end. */ function (placeholderName) { if (placeholderName) { /** @type {?} */ var re = /(.*)_[0-9]+$/; if (placeholderName.match(re)) { return placeholderName.replace(re, '$1'); } } return placeholderName; }; /** * String suffix for counter. * If counter is 0, it is empty, otherwise _<id>. * @param id id * @return suffix for counter. */ /** * String suffix for counter. * If counter is 0, it is empty, otherwise _<id>. * @private * @param {?} id id * @return {?} suffix for counter. */ TagMapping.prototype.counterString = /** * String suffix for counter. * If counter is 0, it is empty, otherwise _<id>. * @private * @param {?} id id * @return {?} suffix for counter. */ function (id) { if (id === 0) { return ''; } else { return '_' + id.toString(10); } }; return TagMapping; }()); export { TagMapping }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLW1hcHBpbmcuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4LWkxOG5zdXBwb3J0L25neC1pMThuc3VwcG9ydC1saWIvIiwic291cmNlcyI6WyJpbXBsL3RhZy1tYXBwaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztJQVFNLHdCQUF3QixHQUEwQjtJQUNwRCxHQUFHLEVBQUUsTUFBTTtJQUNYLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLElBQUksRUFBRSxZQUFZO0lBQ2xCLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsSUFBSSxFQUFFLGdCQUFnQjtJQUN0QixJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCLElBQUksRUFBRSxnQkFBZ0I7SUFDdEIsSUFBSSxFQUFFLGdCQUFnQjtJQUN0QixJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCLElBQUksRUFBRSxnQkFBZ0I7SUFDdEIsSUFBSSxFQUFFLGlCQUFpQjtJQUN2QixHQUFHLEVBQUUsYUFBYTtJQUNsQixJQUFJLEVBQUUsV0FBVztJQUNqQixNQUFNLEVBQUUsWUFBWTtJQUNwQixJQUFJLEVBQUUsY0FBYztJQUNwQixHQUFHLEVBQUUsV0FBVztJQUNoQixHQUFHLEVBQUUsV0FBVztJQUNoQixHQUFHLEVBQUUsb0JBQW9CO0lBQ3pCLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLEtBQUssRUFBRSxXQUFXO0lBQ2xCLEtBQUssRUFBRSxhQUFhO0lBQ3BCLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLElBQUksRUFBRSxZQUFZO0lBQ2xCLE9BQU8sRUFBRSxjQUFjO0lBQ3ZCLElBQUksRUFBRSxtQkFBbUI7SUFDekIsT0FBTyxFQUFFLGNBQWM7SUFDdkIsSUFBSSxFQUFFLFdBQVc7SUFDakIsSUFBSSxFQUFFLGlCQUFpQjtJQUN2QixHQUFHLEVBQUUsaUJBQWlCO0lBQ3RCLElBQUksRUFBRSxnQkFBZ0I7Q0FDekI7Ozs7O0lBS0ssU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFB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SCxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLElBQUk7Ozs7WUFBQyxVQUFDLEdBQUcsSUFBSyxPQUFBLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBcEMsQ0FBb0MsRUFBQyxDQUFDO1NBQ3hHO1FBQ0QsSUFBSSxRQUFRLEVBQUU7WUFDVixJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNsQyxPQUFPLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUNqQztpQkFBTTtnQkFDSCxPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRzs7Ozs7OztJQUNLLGlDQUFZOzs7Ozs7SUFBcEIsVUFBcUIsZUFBdUI7UUFDeEMsSUFBSSxlQUFlLEVBQUU7O2dCQUNYLEVBQUUsR0FBRyxjQUFjO1lBQ3pCLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDM0IsT0FBTyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM1QztTQUNKO1FBQ0QsT0FBTyxlQUFlLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7OztJQUNLLGtDQUFhOzs7Ozs7O0lBQXJCLFVBQXNCLEVBQVU7UUFDNUIsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ1YsT0FBTyxFQUFFLENBQUM7U0FDYjthQUFNO1lBQ0gsT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNoQztJQUNMLENBQUM7SUFDTCxpQkFBQztBQUFELENBQUMsQUEzSEQsSUEySEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQ3JlYXRlZCBieSByb29ibSBvbiAxNi4wNS4yMDE3LlxyXG4gKiBNYXBwaW5nIGZyb20gbm9ybWFsaXplZCB0YWcgbmFtZXMgdG8gcGxhY2Vob2xkZXIgbmFtZXMuXHJcbiAqL1xyXG5cclxuLypcclxuY29waWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9wYWNrYWdlcy9jb21waWxlci9zcmMvaTE4bi9zZXJpYWxpemVycy9wbGFjZWhvbGRlci50c1xyXG4gKi9cclxuY29uc3QgVEFHX1RPX1BMQUNFSE9MREVSX05BTUVTOiB7W2s6IHN0cmluZ106IHN0cmluZ30gPSB7XHJcbiAgICAnQSc6ICdMSU5LJyxcclxuICAgICdCJzogJ0JPTERfVEVYVCcsXHJcbiAgICAnQlInOiAnTElORV9CUkVBSycsXHJcbiAgICAnRU0nOiAnRU1QSEFTSVNFRF9URVhUJyxcclxuICAgICdIMSc6ICdIRUFESU5HX0xFVkVMMScsXHJcbiAgICAnSDInOiAnSEVBRElOR19MRVZFTDInLFxyXG4gICAgJ0gzJzogJ0hFQURJTkdfTEVWRUwzJyxcclxuICAgICdINCc6ICdIRUFESU5HX0xFVkVMNCcsXHJcbiAgICAnSDUnOiAnSEVBRElOR19MRVZFTDUnLFxyXG4gICAgJ0g2JzogJ0hFQURJTkdfTEVWRUw2JyxcclxuICAgICdIUic6ICdIT1JJWk9OVEFMX1JVTEUnLFxyXG4gICAgJ0knOiAnSVRBTElDX1RFWFQnLFxyXG4gICAgJ0xJJzogJ0xJU1RfSVRFTScsXHJcbiAgICAnTElOSyc6ICdNRURJQV9MSU5LJyxcclxuICAgICdPTCc6ICdPUkRFUkVEX0xJU1QnLFxyXG4gICAgJ1AnOiAnUEFSQUdSQVBIJyxcclxuICAgICdRJzogJ1FVT1RBVElPTicsXHJcbiAgICAnUyc6ICdTVFJJS0VUSFJPVUdIX1RFWFQnLFxyXG4gICAgJ1NNQUxMJzogJ1NNQUxMX1RFWFQnLFxyXG4gICAgJ1NVQic6ICdTVUJTVFJJUFQnLFxyXG4gICAgJ1NVUCc6ICdTVVBFUlNDUklQVCcsXHJcbiAgICAnVEJPRFknOiAnVEFCTEVfQk9EWScsXHJcbiAgICAnVEQnOiAnVEFCTEVfQ0VMTCcsXHJcbiAgICAnVEZPT1QnOiAnVEFCTEVfRk9PVEVSJyxcclxuICAgICdUSCc6ICdUQUJMRV9IRUFERVJfQ0VMTCcsXHJcbiAgICAnVEhFQUQnOiAnVEFCTEVfSEVBREVSJyxcclxuICAgICdUUic6ICdUQUJMRV9ST1cnLFxyXG4gICAgJ1RUJzogJ01PTk9TUEFDRURfVEVYVCcsXHJcbiAgICAnVSc6ICdVTkRFUkxJTkVEX1RFWFQnLFxyXG4gICAgJ1VMJzogJ1VOT1JERVJFRF9MSVNUJyxcclxufTtcclxuXHJcbi8qKlxyXG4gKiBIVE1MIFRhZ3MgKGluIHVwcGVyY2FzZSkgdGhhdCBhcmUgZW1wdHksIHRoZXkgaGF2ZSBubyBjb250ZW50LCBidXQgZG8gbm90IG5lZWQgYSBjbG9zZSB0YWcsIGUuZy4gPGJyPiwgPGltZz4sIDxocj4uXHJcbiAqL1xyXG5jb25zdCBWT0lEX1RBR1MgPSBbJ0JSJywgJ0hSJywgJ0lNRycsICdBUkVBJywgJ0xJTksnLCAnV0JSJ107XHJcblxyXG5leHBvcnQgY2xhc3MgVGFnTWFwcGluZyB7XHJcblxyXG4gICAgcHVibGljIGdldFN0YXJ0VGFnUGxhY2Vob2xkZXJOYW1lKHRhZzogc3RyaW5nLCBpZDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB1cHBlclRhZyA9IHRhZy50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IGJhc2VOYW1lID0gVEFHX1RPX1BMQUNFSE9MREVSX05BTUVTW3VwcGVyVGFnXSB8fCBgVEFHXyR7dXBwZXJUYWd9YDtcclxuICAgICAgICByZXR1cm4gYFNUQVJUXyR7YmFzZU5hbWV9YCArIHRoaXMuY291bnRlclN0cmluZyhpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENsb3NlVGFnUGxhY2Vob2xkZXJOYW1lKHRhZzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB1cHBlclRhZyA9IHRhZy50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IGJhc2VOYW1lID0gVEFHX1RPX1BMQUNFSE9MREVSX05BTUVTW3VwcGVyVGFnXSB8fCBgVEFHXyR7dXBwZXJUYWd9YDtcclxuICAgICAgICByZXR1cm4gYENMT1NFXyR7YmFzZU5hbWV9YDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RW1wdHlUYWdQbGFjZWhvbGRlck5hbWUodGFnOiBzdHJpbmcsIGlkOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHVwcGVyVGFnID0gdGFnLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3QgYmFzZU5hbWUgPSAgVEFHX1RPX1BMQUNFSE9MREVSX05BTUVTW3VwcGVyVGFnXSB8fCBgVEFHXyR7dXBwZXJUYWd9YDtcclxuICAgICAgICByZXR1cm4gYmFzZU5hbWUgKyB0aGlzLmNvdW50ZXJTdHJpbmcoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDdHlwZUZvclRhZyh0YWc6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgc3dpdGNoICh0YWcudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlICdicic6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2xiJztcclxuICAgICAgICAgICAgY2FzZSAnaW1nJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnaW1hZ2UnO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGB4LSR7dGFnfWA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRUYWduYW1lRnJvbVN0YXJ0VGFnUGxhY2Vob2xkZXJOYW1lKHBsYWNlaG9sZGVyTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAocGxhY2Vob2xkZXJOYW1lLnN0YXJ0c1dpdGgoJ1NUQVJUX1RBR18nKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpcENvdW50ZXIocGxhY2Vob2xkZXJOYW1lLnN1YnN0cmluZygnU1RBUlRfVEFHXycubGVuZ3RoKSkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBsYWNlaG9sZGVyTmFtZS5zdGFydHNXaXRoKCdTVEFSVF8nKSkge1xyXG4gICAgICAgICAgICBjb25zdCBwaCA9IHRoaXMuc3RyaXBDb3VudGVyKHBsYWNlaG9sZGVyTmFtZS5zdWJzdHJpbmcoJ1NUQVJUXycubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoS2V5ID0gT2JqZWN0LmtleXMoVEFHX1RPX1BMQUNFSE9MREVSX05BTUVTKS5maW5kKChrZXkpID0+IFRBR19UT19QTEFDRUhPTERFUl9OQU1FU1trZXldID09PSBwaCk7XHJcbiAgICAgICAgICAgIHJldHVybiBtYXRjaEtleSA/IG1hdGNoS2V5LnRvTG93ZXJDYXNlKCkgOiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VGFnbmFtZUZyb21DbG9zZVRhZ1BsYWNlaG9sZGVyTmFtZShwbGFjZWhvbGRlck5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyTmFtZS5zdGFydHNXaXRoKCdDTE9TRV9UQUdfJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXBDb3VudGVyKHBsYWNlaG9sZGVyTmFtZS5zdWJzdHJpbmcoJ0NMT1NFX1RBR18nLmxlbmd0aCkpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwbGFjZWhvbGRlck5hbWUuc3RhcnRzV2l0aCgnQ0xPU0VfJykpIHtcclxuICAgICAgICAgICAgY29uc3QgcGggPSB0aGlzLnN0cmlwQ291bnRlcihwbGFjZWhvbGRlck5hbWUuc3Vic3RyaW5nKCdDTE9TRV8nLmxlbmd0aCkpO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaEtleSA9IE9iamVjdC5rZXlzKFRBR19UT19QTEFDRUhPTERFUl9OQU1FUykuZmluZCgoa2V5KSA9PiBUQUdfVE9fUExBQ0VIT0xERVJfTkFNRVNba2V5XSA9PT0gcGgpO1xyXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hLZXkgPyBtYXRjaEtleS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXN0LCB3ZXRoZXIgcGxhY2Vob2xkZXIgbmFtZSBzdGFuZHMgZm9yIGVtcHR5IGh0bWwgdGFnLlxyXG4gICAgICogQHBhcmFtIHBsYWNlaG9sZGVyTmFtZSBjYW4gYmUgVEFHXzxuYW1lPiBvciBqdXN0IDxuYW1lPlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNFbXB0eVRhZ1BsYWNlaG9sZGVyTmFtZShwbGFjZWhvbGRlck5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHBoID0gdGhpcy5zdHJpcENvdW50ZXIocGxhY2Vob2xkZXJOYW1lKTtcclxuICAgICAgICBsZXQgbWF0Y2hLZXk7XHJcbiAgICAgICAgaWYgKHBoLnN0YXJ0c1dpdGgoJ1RBR18nKSkge1xyXG4gICAgICAgICAgICBtYXRjaEtleSA9IHBoLnN1YnN0cmluZyg0KS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1hdGNoS2V5ID0gT2JqZWN0LmtleXMoVEFHX1RPX1BMQUNFSE9MREVSX05BTUVTKS5maW5kKChrZXkpID0+IFRBR19UT19QTEFDRUhPTERFUl9OQU1FU1trZXldID09PSBwaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXRjaEtleSkge1xyXG4gICAgICAgICAgICBpZiAoVk9JRF9UQUdTLmluZGV4T2YobWF0Y2hLZXkpID49IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHRhZ25hbWUgb2YgZW1wdHkgdGFnIHBsYWNlaG9sZGVyLlxyXG4gICAgICogQHBhcmFtIHBsYWNlaG9sZGVyTmFtZSBjYW4gYmUgVEFHXzxuYW1lPiBvciBqdXN0IDxuYW1lPlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VGFnbmFtZUZyb21FbXB0eVRhZ1BsYWNlaG9sZGVyTmFtZShwbGFjZWhvbGRlck5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgcGggPSB0aGlzLnN0cmlwQ291bnRlcihwbGFjZWhvbGRlck5hbWUpO1xyXG4gICAgICAgIGxldCBtYXRjaEtleTtcclxuICAgICAgICBpZiAocGguc3RhcnRzV2l0aCgnVEFHXycpKSB7XHJcbiAgICAgICAgICAgIG1hdGNoS2V5ID0gcGguc3Vic3RyaW5nKDQpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWF0Y2hLZXkgPSBPYmplY3Qua2V5cyhUQUdfVE9fUExBQ0VIT0xERVJfTkFNRVMpLmZpbmQoKGtleSkgPT4gVEFHX1RPX1BMQUNFSE9MREVSX05BTUVTW2tleV0gPT09IHBoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1hdGNoS2V5KSB7XHJcbiAgICAgICAgICAgIGlmIChWT0lEX1RBR1MuaW5kZXhPZihtYXRjaEtleSkgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoS2V5LnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHBsYWNlaG9sZGVyIGVuZHMgd2l0aCBfWzAtOV0rLCBzdHJpcCB0aGF0IG51bWJlci5cclxuICAgICAqIEBwYXJhbSBwbGFjZWhvbGRlck5hbWUgcGxhY2Vob2xkZXJOYW1lXHJcbiAgICAgKiBAcmV0dXJuIHBsYWNlaG9sZGVyTmFtZSB3aXRob3V0IGNvdW50ZXIgYXQgZW5kLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0cmlwQ291bnRlcihwbGFjZWhvbGRlck5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyTmFtZSkge1xyXG4gICAgICAgICAgICBjb25zdCByZSA9IC8oLiopX1swLTldKyQvO1xyXG4gICAgICAgICAgICBpZiAocGxhY2Vob2xkZXJOYW1lLm1hdGNoKHJlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyTmFtZS5yZXBsYWNlKHJlLCAnJDEnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXJOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RyaW5nIHN1ZmZpeCBmb3IgY291bnRlci5cclxuICAgICAqIElmIGNvdW50ZXIgaXMgMCwgaXQgaXMgZW1wdHksIG90aGVyd2lzZSBfPGlkPi5cclxuICAgICAqIEBwYXJhbSBpZCBpZFxyXG4gICAgICogQHJldHVybiBzdWZmaXggZm9yIGNvdW50ZXIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY291bnRlclN0cmluZyhpZDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKGlkID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJ18nICsgaWQudG9TdHJpbmcoMTApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=