UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

246 lines (245 loc) 33.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { DataUtils } from '../share/utils/DataUtils'; import { ArrayUtils } from '../share/utils/ArrayUtils'; /** * @param {?=} options * @return {?} */ export function I18N(options) { // Set default option values var /** @type {?} */ bypass = false; var /** @type {?} */ key = undefined; var /** @type {?} */ init = true; if (options !== null && typeof options !== 'undefined') { if (typeof options === 'object') { if (!Array.isArray(options)) { if (options.key !== null && typeof options.key === 'string') { key = options.key; } if (options.bypass !== null && typeof options.bypass === 'boolean') { bypass = options.bypass; } if (options.init !== null && typeof options.init === 'boolean') { init = options.init; } } } else if (typeof options === 'string') { key = options; } else if (typeof options === 'boolean') { bypass = options; } } return function (target, propertyKey, descriptor) { var /** @type {?} */ propKey = key || propertyKey; var /** @type {?} */ i18nProxyMap = target['_i18nProxies_']; if (!Object.prototype.hasOwnProperty.call(target, '_i18nProxies_')) { var /** @type {?} */ parentProxiesMap = i18nProxyMap; if (typeof parentProxiesMap === 'object') { i18nProxyMap = JSON.parse(JSON.stringify(parentProxiesMap)); } else { i18nProxyMap = {}; } Object.defineProperty(target, '_i18nProxies_', { value: i18nProxyMap, enumerable: false, writable: false }); } var /** @type {?} */ proxy = { applyI18N: function (i18n, initMode) { if (initMode === void 0) { initMode = false; } if (initMode && !init) { // This method is called during ngOnInit (initMode=true) but // field's auto init is set to false. So, do nothing. return; } if (typeof i18n === 'undefined') { return; } if (this['_i18nValues_'] === null || typeof this['_i18nValues_'] === 'undefined' || typeof this['_i18nValues_'] !== 'object') { Object.defineProperty(this, '_i18nValues_', { value: {}, enumerable: false, writable: false }); } var /** @type {?} */ i18nValue = this['_i18nValues_'][propKey]; if (i18nValue === null || typeof i18nValue === 'undefined' || typeof i18nValue !== 'object' || typeof i18nValue['applyI18N'] !== 'function') { // This field is not I18NApplicable var /** @type {?} */ childProxyMap = undefined; if (i18nValue !== null && typeof i18nValue !== 'undefined') { childProxyMap = i18nValue['_i18nProxies_']; } if (typeof childProxyMap === 'object') { // It has inner @I18N to be chained for (var /** @type {?} */ childKey in childProxyMap) { if (typeof childProxyMap[childKey].applyI18N !== 'function') { continue; } var /** @type {?} */ childBypass = false; if (typeof childProxyMap[childKey].isBypassKey === 'function') { childBypass = childProxyMap[childKey].isBypassKey(); } if (i18n === null) { childProxyMap[childKey].applyI18N.apply(i18nValue, [null]); } else { if (childBypass) { childProxyMap[childKey].applyI18N.apply(i18nValue, [i18n]); } else { // We use DataUtils.getDataValue() here to support dot notation (.) format: // foo.bar ... if (DataUtils.containsDataKey(childKey, i18n)) { childProxyMap[childKey].applyI18N.apply(i18nValue, [DataUtils.getDataValue(childKey, i18n)]); } else { childProxyMap[childKey].applyI18N.apply(i18nValue, [undefined]); } } } } } else if (Array.isArray(i18nValue) && ArrayUtils.isAllMemberHasPropertyTypeOf(i18nValue, 'applyI18N', 'function')) { // It is an array of II18NApplicable. // We're going to applyI18N() on each member of i18nValue. if (i18n !== null && Array.isArray(i18n)) { // If the given "i18n" is an array, we'll applyI18N 1-by-1. var /** @type {?} */ idx = void 0; for (idx = 0; idx < i18nValue.length && idx < i18n.length; idx++) { i18nValue[idx].applyI18N(i18n[idx]); } for (; idx < i18nValue.length; idx++) { // Apply "null" for all members left. i18nValue[idx].applyI18N(null); } } else { try { // Apply all members with the same "i18n" value. for (var i18nValue_1 = tslib_1.__values(i18nValue), i18nValue_1_1 = i18nValue_1.next(); !i18nValue_1_1.done; i18nValue_1_1 = i18nValue_1.next()) { var member = i18nValue_1_1.value; member.applyI18N(i18n); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (i18nValue_1_1 && !i18nValue_1_1.done && (_a = i18nValue_1.return)) _a.call(i18nValue_1); } finally { if (e_1) throw e_1.error; } } } } else { // It has no inner @I18N to be chained. // So, set value into it directly. this['_i18nValues_'][propKey] = i18n; } } else { // Delegate method call to I18NApplicable i18nValue.applyI18N(i18n); } var e_1, _a; }, getValue: function () { if (this['_i18nValues_'] === null || typeof this['_i18nValues_'] === 'undefined' || typeof this['_i18nValues_'] !== 'object') { return undefined; } return this['_i18nValues_'][propKey]; }, setValue: function (value) { if (this['_i18nValues_'] === null || typeof this['_i18nValues_'] === 'undefined' || typeof this['_i18nValues_'] !== 'object') { Object.defineProperty(this, '_i18nValues_', { value: {}, enumerable: false, writable: false }); } this['_i18nValues_'][propKey] = value; }, getI18NKey: function () { return propKey; }, isBypassKey: function () { return bypass; } }; delete target[propertyKey]; Object.defineProperty(target, propertyKey, { get: function () { return proxy.getValue.apply(this, []); }, set: function (value) { proxy.setValue.apply(this, [value]); }, enumerable: true }); i18nProxyMap[propKey] = proxy; // Wrap ngOnInit() to automatically call applyI18N() method. if (typeof target['ngOnInit'] === 'function' && !target['_i18nNgOnInitWrapped_']) { // Keep original ngOnInit() function to call it before resolving I18N field values. var /** @type {?} */ originalInit_1 = target['ngOnInit']; // Re-implement the ngOnInit() function. target['ngOnInit'] = function () { // Call original ngOnInit() first // Call original ngOnInit() first originalInit_1.call(this); // We've to check the flag "_i18nNgOnInitExecuted_" to make sure that it will be executed only once. if (!this['_i18nNgOnInitExecuted_']) { var /** @type {?} */ value = this.i18nValue; var /** @type {?} */ i18nProxyMap_1 = this['_i18nProxies_']; if (typeof i18nProxyMap_1 === 'object') { for (var /** @type {?} */ childKey in i18nProxyMap_1) { if (typeof i18nProxyMap_1[childKey].applyI18N !== 'function') { continue; } // check bypass var /** @type {?} */ childBypass = false; if (typeof i18nProxyMap_1[childKey].isBypassKey === 'function') { childBypass = i18nProxyMap_1[childKey].isBypassKey(); } if (childBypass) { // Passing initMode = true // Passing initMode = true i18nProxyMap_1[childKey].applyI18N.apply(this, [value, true]); } else { if (value === null) { // Passing initMode = true // Passing initMode = true i18nProxyMap_1[childKey].applyI18N.apply(this, [null, true]); } else { // We use DataUtils.getDataValue() here to support i18nKey in dot notation (.) format: // foo.bar ... if (DataUtils.containsDataKey(childKey, value)) { // Passing initMode = true // Passing initMode = true i18nProxyMap_1[childKey].applyI18N.apply(this, [DataUtils.getDataValue(childKey, value), true]); } else { // Passing initMode = true // Passing initMode = true i18nProxyMap_1[childKey].applyI18N.apply(this, [undefined, true]); } } } } } this['_i18nNgOnInitExecuted_'] = true; } }; target['_i18nNgOnInitWrapped_'] = true; } }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSTE4Ti5kZWNvcmF0b3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9kZWNvcmF0b3IvSTE4Ti5kZWNvcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7OztBQUV2RCxNQUFNLGVBQWUsT0FBYTs7SUFFaEMscUJBQUksTUFBTSxHQUFZLEtBQUssQ0FBQztJQUM1QixxQkFBSSxHQUFHLEdBQVcsU0FBUyxDQUFDO0lBQzVCLHFCQUFJLElBQUksR0FBWSxJQUFJLENBQUM7SUFFekIsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLE9BQU8sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELEVBQUUsQ0FBQyxDQUFDLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDaEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxJQUFJLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQzVELEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO2lCQUNuQjtnQkFDRCxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFDbkUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7aUJBQ3pCO2dCQUNELEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sT0FBTyxD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LENBQUM7O3dDQUVOLEFBREEsMEJBQTBCO3dDQUMxQixjQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztxQ0FDakU7aUNBQ0Y7NkJBQ0Y7eUJBQ0Y7cUJBQ0Y7b0JBRUQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsSUFBSSxDQUFDO2lCQUN2QzthQUNGLENBQUE7WUFFRCxNQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDeEM7S0FDRixDQUFBO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVXRpbHMgfSBmcm9tICcuLi9zaGFyZS91dGlscy9EYXRhVXRpbHMnO1xuaW1wb3J0IHsgQXJyYXlVdGlscyB9IGZyb20gJy4uL3NoYXJlL3V0aWxzL0FycmF5VXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gSTE4TihvcHRpb25zPzogYW55KTogYW55IHtcbiAgLy8gU2V0IGRlZmF1bHQgb3B0aW9uIHZhbHVlc1xuICBsZXQgYnlwYXNzOiBib29sZWFuID0gZmFsc2U7XG4gIGxldCBrZXk6IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgbGV0IGluaXQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zICE9PSBudWxsICYmIHR5cGVvZiBvcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgICBpZiAob3B0aW9ucy5rZXkgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMua2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGtleSA9IG9wdGlvbnMua2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmJ5cGFzcyAhPT0gbnVsbCAmJiB0eXBlb2Ygb3B0aW9ucy5ieXBhc3MgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIGJ5cGFzcyA9IG9wdGlvbnMuYnlwYXNzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluaXQgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMuaW5pdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgaW5pdCA9IG9wdGlvbnMuaW5pdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBrZXkgPSBvcHRpb25zO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdib29sZWFuJykge1xuICAgICAgYnlwYXNzID0gb3B0aW9ucztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24odGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnksIGRlc2NyaXB0b3I6IGFueSkge1xuICAgIGxldCBwcm9wS2V5OiBzdHJpbmcgPSBrZXkgfHwgcHJvcGVydHlLZXk7XG5cbiAgICBsZXQgaTE4blByb3h5TWFwID0gdGFyZ2V0WydfaTE4blByb3hpZXNfJ107XG5cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsICdfaTE4blByb3hpZXNfJykpIHtcbiAgICAgIGxldCBwYXJlbnRQcm94aWVzTWFwID0gaTE4blByb3h5TWFwO1xuXG4gICAgICBpZiAodHlwZW9mIHBhcmVudFByb3hpZXNNYXAgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGkxOG5Qcm94eU1hcCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocGFyZW50UHJveGllc01hcCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaTE4blByb3h5TWFwID0ge307XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsICdfaTE4blByb3hpZXNfJywge1xuICAgICAgICB2YWx1ZTogaTE4blByb3h5TWFwLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cblxuICAgIGxldCBwcm94eTogYW55ID0ge1xuICAgICAgYXBwbHlJMThOOiBmdW5jdGlvbihpMThuOiBhbnksIGluaXRNb2RlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGluaXRNb2RlICYmICFpbml0KSB7XG4gICAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBuZ09uSW5pdCAoaW5pdE1vZGU9dHJ1ZSkgYnV0XG4gICAgICAgICAgLy8gZmllbGQncyBhdXRvIGluaXQgaXMgc2V0IHRvIGZhbHNlLiBTbywgZG8gbm90aGluZy5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpMThuID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpc1snX2kxOG5WYWx1ZXNfJ10gPT09IG51bGwgfHwgdHlwZW9mIHRoaXNbJ19pMThuVmFsdWVzXyddID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgdGhpc1snX2kxOG5WYWx1ZXNfJ10gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdfaTE4blZhbHVlc18nLCB7XG4gICAgICAgICAgICB2YWx1ZToge30sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGkxOG5WYWx1ZTogYW55ID0gdGhpc1snX2kxOG5WYWx1ZXNfJ11bcHJvcEtleV07XG5cbiAgICAgICAgaWYgKGkxOG5WYWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgaTE4blZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgaTE4blZhbHVlICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgaTE4blZhbHVlWydhcHBseUkxOE4nXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIFRoaXMgZmllbGQgaXMgbm90IEkxOE5BcHBsaWNhYmxlXG4gICAgICAgICAgbGV0IGNoaWxkUHJveHlNYXAgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKGkxOG5WYWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgaTE4blZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY2hpbGRQcm94eU1hcCA9IGkxOG5WYWx1ZVsnX2kxOG5Qcm94aWVzXyddO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGRQcm94eU1hcCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIEl0IGhhcyBpbm5lciBASTE4TiB0byBiZSBjaGFpbmVkXG4gICAgICAgICAgICBmb3IgKGxldCBjaGlsZEtleSBpbiBjaGlsZFByb3h5TWFwKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGRQcm94eU1hcFtjaGlsZEtleV0uYXBwbHlJMThOICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxldCBjaGlsZEJ5cGFzczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGRQcm94eU1hcFtjaGlsZEtleV0uaXNCeXBhc3NLZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjaGlsZEJ5cGFzcyA9IGNoaWxkUHJveHlNYXBbY2hpbGRLZXldLmlzQnlwYXNzS2V5KCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoaTE4biA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNoaWxkUHJveHlNYXBbY2hpbGRLZXldLmFwcGx5STE4Ti5hcHBseShpMThuVmFsdWUsIFtudWxsXSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkQnlwYXNzKSB7XG4gICAgICAgICAgICAgICAgICBjaGlsZFByb3h5TWFwW2NoaWxkS2V5XS5hcHBseUkxOE4uYXBwbHkoaTE4blZhbHVlLCBbaTE4bl0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBXZSB1c2UgRGF0YVV0aWxzLmdldERhdGFWYWx1ZSgpIGhlcmUgdG8gc3VwcG9ydCBkb3Qgbm90YXRpb24gKC4pIGZvcm1hdDpcbiAgICAgICAgICAgICAgICAgIC8vIGZvby5iYXIgLi4uXG4gICAgICAgICAgICAgICAgICBpZiAoRGF0YVV0aWxzLmNvbnRhaW5zRGF0YUtleShjaGlsZEtleSwgaTE4bikpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRQcm94eU1hcFtjaGlsZEtleV0uYXBwbHlJMThOLmFwcGx5KGkxOG5WYWx1ZSwgW0RhdGFVdGlscy5nZXREYXRhVmFsdWUoY2hpbGRLZXksIGkxOG4pXSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZFByb3h5TWFwW2NoaWxkS2V5XS5hcHBseUkxOE4uYXBwbHkoaTE4blZhbHVlLCBbdW5kZWZpbmVkXSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGkxOG5WYWx1ZSkgJiYgQXJyYXlVdGlscy5pc0FsbE1lbWJlckhhc1Byb3BlcnR5VHlwZU9mKGkxOG5WYWx1ZSwgJ2FwcGx5STE4TicsICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgICAvLyBJdCBpcyBhbiBhcnJheSBvZiBJSTE4TkFwcGxpY2FibGUuXG4gICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBhcHBseUkxOE4oKSBvbiBlYWNoIG1lbWJlciBvZiBpMThuVmFsdWUuXG4gICAgICAgICAgICBpZiAoaTE4biAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KGkxOG4pKSB7XG4gICAgICAgICAgICAgIC8vIElmIHRoZSBnaXZlbiBcImkxOG5cIiBpcyBhbiBhcnJheSwgd2UnbGwgYXBwbHlJMThOIDEtYnktMS5cbiAgICAgICAgICAgICAgbGV0IGlkeDogbnVtYmVyO1xuICAgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGkxOG5WYWx1ZS5sZW5ndGggJiYgaWR4IDwgaTE4bi5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgaTE4blZhbHVlW2lkeF0uYXBwbHlJMThOKGkxOG5baWR4XSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yICg7IGlkeCA8IGkxOG5WYWx1ZS5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgLy8gQXBwbHkgXCJudWxsXCIgZm9yIGFsbCBtZW1iZXJzIGxlZnQuXG4gICAgICAgICAgICAgICAgaTE4blZhbHVlW2lkeF0uYXBwbHlJMThOKG51bGwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBBcHBseSBhbGwgbWVtYmVycyB3aXRoIHRoZSBzYW1lIFwiaTE4blwiIHZhbHVlLlxuICAgICAgICAgICAgICBmb3IgKGxldCBtZW1iZXIgb2YgaTE4blZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbWVtYmVyLmFwcGx5STE4TihpMThuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJdCBoYXMgbm8gaW5uZXIgQEkxOE4gdG8gYmUgY2hhaW5lZC5cbiAgICAgICAgICAgIC8vIFNvLCBzZXQgdmFsdWUgaW50byBpdCBkaXJlY3RseS5cbiAgICAgICAgICAgIHRoaXNbJ19pMThuVmFsdWVzXyddW3Byb3BLZXldID0gaTE4bjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGVsZWdhdGUgbWV0aG9kIGNhbGwgdG8gSTE4TkFwcGxpY2FibGVcbiAgICAgICAgICBpMThuVmFsdWUuYXBwbHlJMThOKGkxOG4pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCk6IGFueSB7XG4gICAgICAgIGlmICh0aGlzWydfaTE4blZhbHVlc18nXSA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpc1snX2kxOG5WYWx1ZXNfJ10gPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB0aGlzWydfaTE4blZhbHVlc18nXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXNbJ19pMThuVmFsdWVzXyddW3Byb3BLZXldO1xuICAgICAgfSxcbiAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzWydfaTE4blZhbHVlc18nXSA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpc1snX2kxOG5WYWx1ZXNfJ10gPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB0aGlzWydfaTE4blZhbHVlc18nXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ19pMThuVmFsdWVzXycsIHtcbiAgICAgICAgICAgIHZhbHVlOiB7fSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzWydfaTE4blZhbHVlc18nXVtwcm9wS2V5XSA9IHZhbHVlO1xuICAgICAgfSxcbiAgICAgIGdldEkxOE5LZXk6IGZ1bmN0aW9uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBwcm9wS2V5O1xuICAgICAgfSxcbiAgICAgIGlzQnlwYXNzS2V5OiBmdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGJ5cGFzcztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZGVsZXRlIHRhcmdldFtwcm9wZXJ0eUtleV07XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHByb3h5LmdldFZhbHVlLmFwcGx5KHRoaXMsIFtdKTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgcHJveHkuc2V0VmFsdWUuYXBwbHkodGhpcywgW3ZhbHVlXSk7XG4gICAgICB9LFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgaTE4blByb3h5TWFwW3Byb3BLZXldID0gcHJveHk7XG5cblxuICAgIC8vIFdyYXAgbmdPbkluaXQoKSB0byBhdXRvbWF0aWNhbGx5IGNhbGwgYXBwbHlJMThOKCkgbWV0aG9kLlxuICAgIGlmICh0eXBlb2YgdGFyZ2V0WyduZ09uSW5pdCddID09PSAnZnVuY3Rpb24nICYmICF0YXJnZXRbJ19pMThuTmdPbkluaXRXcmFwcGVkXyddKSB7XG4gICAgICAvLyBLZWVwIG9yaWdpbmFsIG5nT25Jbml0KCkgZnVuY3Rpb24gdG8gY2FsbCBpdCBiZWZvcmUgcmVzb2x2aW5nIEkxOE4gZmllbGQgdmFsdWVzLlxuICAgICAgbGV0IG9yaWdpbmFsSW5pdCA9IHRhcmdldFsnbmdPbkluaXQnXTtcblxuICAgICAgLy8gUmUtaW1wbGVtZW50IHRoZSBuZ09uSW5pdCgpIGZ1bmN0aW9uLlxuICAgICAgdGFyZ2V0WyduZ09uSW5pdCddID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIENhbGwgb3JpZ2luYWwgbmdPbkluaXQoKSBmaXJzdFxuICAgICAgICBvcmlnaW5hbEluaXQuY2FsbCh0aGlzKTtcblxuICAgICAgICAvLyBXZSd2ZSB0byBjaGVjayB0aGUgZmxhZyBcIl9pMThuTmdPbkluaXRFeGVjdXRlZF9cIiB0byBtYWtlIHN1cmUgdGhhdCBpdCB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgb25jZS5cbiAgICAgICAgaWYgKCF0aGlzWydfaTE4bk5nT25Jbml0RXhlY3V0ZWRfJ10pIHtcbiAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmkxOG5WYWx1ZTtcbiAgICAgICAgICBsZXQgaTE4blByb3h5TWFwID0gdGhpc1snX2kxOG5Qcm94aWVzXyddO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpMThuUHJveHlNYXAgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjaGlsZEtleSBpbiBpMThuUHJveHlNYXApIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpMThuUHJveHlNYXBbY2hpbGRLZXldLmFwcGx5STE4TiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBjaGVjayBieXBhc3NcbiAgICAgICAgICAgICAgbGV0IGNoaWxkQnlwYXNzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpMThuUHJveHlNYXBbY2hpbGRLZXldLmlzQnlwYXNzS2V5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRCeXBhc3MgPSBpMThuUHJveHlNYXBbY2hpbGRLZXldLmlzQnlwYXNzS2V5KCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoY2hpbGRCeXBhc3MpIHtcbiAgICAgICAgICAgICAgICAvLyBQYXNzaW5nIGluaXRNb2RlID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGkxOG5Qcm94eU1hcFtjaGlsZEtleV0uYXBwbHlJMThOLmFwcGx5KHRoaXMsIFt2YWx1ZSwgdHJ1ZV0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmKHZhbHVlID09PSBudWxsKXtcbiAgICAgICAgICAgICAgICAgIC8vIFBhc3NpbmcgaW5pdE1vZGUgPSB0cnVlXG4gICAgICAgICAgICAgICAgICBpMThuUHJveHlNYXBbY2hpbGRLZXldLmFwcGx5STE4Ti5hcHBseSh0aGlzLCBbbnVsbCwgdHJ1ZV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBXZSB1c2UgRGF0YVV0aWxzLmdldERhdGFWYWx1ZSgpIGhlcmUgdG8gc3VwcG9ydCBpMThuS2V5IGluIGRvdCBub3RhdGlvbiAoLikgZm9ybWF0OlxuICAgICAgICAgICAgICAgICAgLy8gZm9vLmJhciAuLi5cbiAgICAgICAgICAgICAgICAgIGlmIChEYXRhVXRpbHMuY29udGFpbnNEYXRhS2V5KGNoaWxkS2V5LCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGFzc2luZyBpbml0TW9kZSA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgaTE4blByb3h5TWFwW2NoaWxkS2V5XS5hcHBseUkxOE4uYXBwbHkodGhpcywgW0RhdGFVdGlscy5nZXREYXRhVmFsdWUoY2hpbGRLZXksIHZhbHVlKSwgdHJ1ZV0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGFzc2luZyBpbml0TW9kZSA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgaTE4blByb3h5TWFwW2NoaWxkS2V5XS5hcHBseUkxOE4uYXBwbHkodGhpcywgW3VuZGVmaW5lZCwgdHJ1ZV0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXNbJ19pMThuTmdPbkluaXRFeGVjdXRlZF8nXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGFyZ2V0WydfaTE4bk5nT25Jbml0V3JhcHBlZF8nXSA9IHRydWU7XG4gICAgfVxuICB9XG59XG4iXX0=