anylang
Version:
A translator's kit that uses the free APIs of Google Translate, Yandex, Bing, ChatGPT, and other LLMs
166 lines (164 loc) • 24.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.MicrosoftTranslator = void 0;
var _zod = require("zod");
var _LanguageAliases = require("../../languages/LanguageAliases");
var _BaseTranslator = require("../BaseTranslator");
var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function (resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
const ResponseScheme = _zod.z.object({
translations: _zod.z.object({
text: _zod.z.string()
}).array()
}).array().or(_zod.z.object({
error: _zod.z.object({
code: _zod.z.number(),
message: _zod.z.string()
})
}));
// eslint-disable
// prettier-ignore
const supportedLanguagesMap = new _LanguageAliases.LanguageAliases(["ace", "af", "sq", "am", "ar", "arz", "ary", "arb", "hy", "as", "ast", "az", "ban", "bn", "ba", "eu", "bbc", "be", "bho", "bik", "brx", "bs", "bg", "yue", "ca", "ceb", "hne", "lzh", "zh-Hans", "zh-Hant", "co", "hr", "cs", "da", "prs", "dv", "doi", "nl", "en", "en-GB", "epo", "et", "fo", "fj", "fil", "fi", "fr", "fr-CA", "fy", "fur", "gl", "lug", "ka", "de", "el", "gu", "ht", "ha", "he", "hil", "hi", "mww", "hu", "iba", "is", "ig", "ilo", "id", "ikt", "iu", "iu-Latn", "ga", "it", "jam", "ja", "jav", "kea", "kn", "pam", "ks", "kk", "km", "rw", "tlh-Latn", "gom", "ko", "kri", "ku", "kmr", "ky", "lo", "la", "lv", "lij", "lim", "ln", "lt", "lmo", "dsb", "lb", "mk", "mai", "mg", "ms", "ml", "mt", "mr", "mwr", "mfe", "min", "mn-Cyrl", "mn-Mong", "my", "mi", "ne", "nb", "nno", "nya", "oc", "or", "pap", "ps", "fa", "pl", "pt", "pt-PT", "pa", "pnb", "otq", "ro", "run", "ru", "sm", "sa", "srd", "sr-Cyrl", "sr-Latn", "st", "nso", "tn", "crs", "sn", "scn", "sd", "si", "sk", "sl", "so", "es", "su", "sw", "sv", "ty", "tgk", "ta", "tt", "te", "tet", "th", "bo", "ti", "tpi", "to", "tr", "tk", "uk", "hsb", "ur", "ug", "uz", "vec", "vi", "war", "cy", "xh", "ydd", "yo", "yua", "zu"]);
// eslint-enable
class MicrosoftTranslator extends _BaseTranslator.BaseTranslator {
constructor() {
super(...arguments);
this.token = null;
}
static getSupportedLanguages() {
return supportedLanguagesMap.getAll();
}
getLengthLimit() {
return 50000;
}
getRequestsTimeout() {
return 300;
}
checkLimitExceeding(text) {
if (Array.isArray(text)) {
const arrayLen = text.reduce((acc, text) => acc + text.length, 0);
const extra = arrayLen - this.getLengthLimit();
return extra > 0 ? extra : 0;
} else {
const extra = text.length - this.getLengthLimit();
return extra > 0 ? extra : 0;
}
}
translate(text, from, to) {
return __awaiter(this, void 0, void 0, function* () {
return this.translateBatch([text], from, to).then(resp => resp[0]);
});
}
translateBatch(text, from, to) {
return __awaiter(this, void 0, void 0, function* () {
const sourceLanguage = from === 'auto' ? 'auto' : supportedLanguagesMap.get(from);
const targetLanguage = supportedLanguagesMap.get(to);
if (!sourceLanguage) throw new TypeError(`Unsupported source language ${from}`);
if (!targetLanguage) throw new TypeError(`Unsupported source language ${to}`);
const token = yield this.getToken();
const url = 'https://api-edge.cognitive.microsofttranslator.com/translate?' + (
// Omit `from` parameter for auto detection of language
sourceLanguage !== 'auto' ? `from=${encodeURIComponent(sourceLanguage)}&` : '') + `to=${encodeURIComponent(targetLanguage)}&api-version=3.0&includeSentenceLength=true`;
return this.fetch(url, {
responseType: 'json',
method: 'POST',
headers: {
accept: '*/*',
'accept-language': 'zh-TW,zh;q=0.9,ja;q=0.8,zh-CN;q=0.7,en-US;q=0.6,en;q=0.5',
authorization: `Bearer ${token}`,
'cache-control': 'no-cache',
'content-type': 'application/json',
pragma: 'no-cache',
priority: 'u=1, i',
'referrer-policy': 'strict-origin-when-cross-origin',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'none',
'sec-fetch-storage-access': 'active'
},
body: JSON.stringify(text.map(text => ({
Text: text
})))
}).then(rawResult => {
const result = ResponseScheme.parse(rawResult.data);
if ('error' in result) {
throw new Error(`Code ${result.error.code}: ${result.error.message}`);
}
// Transform translations array
return result.map(translationItem =>
// Build translation for single text
translationItem.translations.map(translationSegment => translationSegment.text).join(' '));
});
});
}
getToken() {
return __awaiter(this, void 0, void 0, function* () {
var _a;
// Wait resolution if pending
if (this.token instanceof Promise) return this.token;
// Fetch new token
const tokenLifetime = (_a = this.options.tokenLifetime) !== null && _a !== void 0 ? _a : 30000;
if (!this.token || Date.now() - this.token.issuedAt > tokenLifetime) {
this.token = this.fetch('https://edge.microsoft.com/translate/auth', {
responseType: 'text',
method: 'GET',
headers: {
accept: '*/*',
'accept-language': 'zh-TW,zh;q=0.9,ja;q=0.8,zh-CN;q=0.7,en-US;q=0.6,en;q=0.5',
'cache-control': 'no-cache',
pragma: 'no-cache',
priority: 'u=1, i',
'referrer-policy': 'strict-origin-when-cross-origin',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'none',
'sec-fetch-storage-access': 'active'
},
body: null
}).then(({
data: token
}) => {
this.token = {
value: token,
issuedAt: Date.now()
};
return token;
});
return yield this.token;
}
// Use cached value
return this.token.value;
});
}
}
exports.MicrosoftTranslator = MicrosoftTranslator;
MicrosoftTranslator.translatorName = 'MicrosoftTranslator';
MicrosoftTranslator.isSupportedAutoFrom = () => true;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRvcnMvTWljcm9zb2Z0VHJhbnNsYXRvci9pbmRleC5qcyIsIm5hbWVzIjpbIl96b2QiLCJyZXF1aXJlIiwiX0xhbmd1YWdlQWxpYXNlcyIsIl9CYXNlVHJhbnNsYXRvciIsIlJlc3BvbnNlU2NoZW1lIiwieiIsIm9iamVjdCIsInRyYW5zbGF0aW9ucyIsInRleHQiLCJzdHJpbmciLCJhcnJheSIsIm9yIiwiZXJyb3IiLCJjb2RlIiwibnVtYmVyIiwibWVzc2FnZSIsInN1cHBvcnRlZExhbmd1YWdlc01hcCIsIkxhbmd1YWdlQWxpYXNlcyIsIk1pY3Jvc29mdFRyYW5zbGF0b3IiLCJCYXNlVHJhbnNsYXRvciIsImNvbnN0cnVjdG9yIiwidG9rZW4iLCJnZXRTdXBwb3J0ZWRMYW5ndWFnZXMiLCJnZXRBbGwiLCJnZXRMZW5ndGhMaW1pdCIsImdldFJlcXVlc3RzVGltZW91dCIsImNoZWNrTGltaXRFeGNlZWRpbmciLCJBcnJheSIsImlzQXJyYXkiLCJhcnJheUxlbiIsInJlZHVjZSIsImFjYyIsImxlbmd0aCIsImV4dHJhIiwidHJhbnNsYXRlIiwiZnJvbSIsInRvIiwidHJhbnNsYXRlQmF0Y2giLCJ0aGVuIiwicmVzcCIsInNvdXJjZUxhbmd1YWdlIiwiZ2V0IiwidGFyZ2V0TGFuZ3VhZ2UiLCJUeXBlRXJyb3IiLCJnZXRUb2tlbiIsInVybCIsImVuY29kZVVSSUNvbXBvbmVudCIsImZldGNoIiwicmVzcG9uc2VUeXBlIiwibWV0aG9kIiwiaGVhZGVycyIsImFjY2VwdCIsImF1dGhvcml6YXRpb24iLCJwcmFnbWEiLCJwcmlvcml0eSIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwibWFwIiwiVGV4dCIsInJhd1Jlc3VsdCIsInJlc3VsdCIsInBhcnNlIiwiZGF0YSIsIkVycm9yIiwidHJhbnNsYXRpb25JdGVtIiwidHJhbnNsYXRpb25TZWdtZW50Iiwiam9pbiIsIlByb21pc2UiLCJ0b2tlbkxpZmV0aW1lIiwiX2EiLCJvcHRpb25zIiwiRGF0ZSIsIm5vdyIsImlzc3VlZEF0IiwidmFsdWUiLCJ0cmFuc2xhdG9yTmFtZSIsImlzU3VwcG9ydGVkQXV0b0Zyb20iXSwic291cmNlcyI6WyJ0cmFuc2xhdG9ycy9NaWNyb3NvZnRUcmFuc2xhdG9yL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBMYW5ndWFnZUFsaWFzZXMgfSBmcm9tICcuLi8uLi9sYW5ndWFnZXMvTGFuZ3VhZ2VBbGlhc2VzJztcblxuaW1wb3J0IHsgQmFzZVRyYW5zbGF0b3IgfSBmcm9tICcuLi9CYXNlVHJhbnNsYXRvcic7XG5cbmNvbnN0IFJlc3BvbnNlU2NoZW1lID0gelxuXHQub2JqZWN0KHtcblx0XHR0cmFuc2xhdGlvbnM6IHpcblx0XHRcdC5vYmplY3Qoe1xuXHRcdFx0XHR0ZXh0OiB6LnN0cmluZygpLFxuXHRcdFx0fSlcblx0XHRcdC5hcnJheSgpLFxuXHR9KVxuXHQuYXJyYXkoKVxuXHQub3IoXG5cdFx0ei5vYmplY3Qoe1xuXHRcdFx0ZXJyb3I6IHoub2JqZWN0KHtcblx0XHRcdFx0Y29kZTogei5udW1iZXIoKSxcblx0XHRcdFx0bWVzc2FnZTogei5zdHJpbmcoKSxcblx0XHRcdH0pLFxuXHRcdH0pLFxuXHQpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZVxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBzdXBwb3J0ZWRMYW5ndWFnZXNNYXAgPSBuZXcgTGFuZ3VhZ2VBbGlhc2VzKFtcblx0XCJhY2VcIiwgXCJhZlwiLCBcInNxXCIsIFwiYW1cIiwgXCJhclwiLCBcImFyelwiLCBcImFyeVwiLCBcImFyYlwiLCBcImh5XCIsIFwiYXNcIixcblx0XCJhc3RcIiwgXCJhelwiLCBcImJhblwiLCBcImJuXCIsIFwiYmFcIiwgXCJldVwiLCBcImJiY1wiLCBcImJlXCIsIFwiYmhvXCIsIFwiYmlrXCIsXG5cdFwiYnJ4XCIsIFwiYnNcIiwgXCJiZ1wiLCBcInl1ZVwiLCBcImNhXCIsIFwiY2ViXCIsIFwiaG5lXCIsIFwibHpoXCIsIFwiemgtSGFuc1wiLFxuXHRcInpoLUhhbnRcIiwgXCJjb1wiLCBcImhyXCIsIFwiY3NcIiwgXCJkYVwiLCBcInByc1wiLCBcImR2XCIsIFwiZG9pXCIsIFwibmxcIiwgXCJlblwiLFxuXHRcImVuLUdCXCIsIFwiZXBvXCIsIFwiZXRcIiwgXCJmb1wiLCBcImZqXCIsIFwiZmlsXCIsIFwiZmlcIiwgXCJmclwiLCBcImZyLUNBXCIsIFwiZnlcIixcblx0XCJmdXJcIiwgXCJnbFwiLCBcImx1Z1wiLCBcImthXCIsIFwiZGVcIiwgXCJlbFwiLCBcImd1XCIsIFwiaHRcIiwgXCJoYVwiLCBcImhlXCIsIFwiaGlsXCIsXG5cdFwiaGlcIiwgXCJtd3dcIiwgXCJodVwiLCBcImliYVwiLCBcImlzXCIsIFwiaWdcIiwgXCJpbG9cIiwgXCJpZFwiLCBcImlrdFwiLCBcIml1XCIsIFwiaXUtTGF0blwiLFxuXHRcImdhXCIsIFwiaXRcIiwgXCJqYW1cIiwgXCJqYVwiLCBcImphdlwiLCBcImtlYVwiLCBcImtuXCIsIFwicGFtXCIsIFwia3NcIiwgXCJra1wiLCBcImttXCIsXG5cdFwicndcIiwgXCJ0bGgtTGF0blwiLCBcImdvbVwiLCBcImtvXCIsIFwia3JpXCIsIFwia3VcIiwgXCJrbXJcIiwgXCJreVwiLCBcImxvXCIsIFwibGFcIiwgXCJsdlwiLFxuXHRcImxpalwiLCBcImxpbVwiLCBcImxuXCIsIFwibHRcIiwgXCJsbW9cIiwgXCJkc2JcIiwgXCJsYlwiLCBcIm1rXCIsIFwibWFpXCIsIFwibWdcIiwgXCJtc1wiLFxuXHRcIm1sXCIsIFwibXRcIiwgXCJtclwiLCBcIm13clwiLCBcIm1mZVwiLCBcIm1pblwiLCBcIm1uLUN5cmxcIiwgXCJtbi1Nb25nXCIsIFwibXlcIiwgXCJtaVwiLFxuXHRcIm5lXCIsIFwibmJcIiwgXCJubm9cIiwgXCJueWFcIiwgXCJvY1wiLCBcIm9yXCIsIFwicGFwXCIsIFwicHNcIiwgXCJmYVwiLCBcInBsXCIsIFwicHRcIixcblx0XCJwdC1QVFwiLCBcInBhXCIsIFwicG5iXCIsIFwib3RxXCIsIFwicm9cIiwgXCJydW5cIiwgXCJydVwiLCBcInNtXCIsIFwic2FcIiwgXCJzcmRcIixcblx0XCJzci1DeXJsXCIsIFwic3ItTGF0blwiLCBcInN0XCIsIFwibnNvXCIsIFwidG5cIiwgXCJjcnNcIiwgXCJzblwiLCBcInNjblwiLCBcInNkXCIsIFwic2lcIixcblx0XCJza1wiLCBcInNsXCIsIFwic29cIiwgXCJlc1wiLCBcInN1XCIsIFwic3dcIiwgXCJzdlwiLCBcInR5XCIsIFwidGdrXCIsIFwidGFcIiwgXCJ0dFwiLCBcInRlXCIsXG5cdFwidGV0XCIsIFwidGhcIiwgXCJib1wiLCBcInRpXCIsIFwidHBpXCIsIFwidG9cIiwgXCJ0clwiLCBcInRrXCIsIFwidWtcIiwgXCJoc2JcIiwgXCJ1clwiLCBcInVnXCIsXG5cdFwidXpcIiwgXCJ2ZWNcIiwgXCJ2aVwiLCBcIndhclwiLCBcImN5XCIsIFwieGhcIiwgXCJ5ZGRcIiwgXCJ5b1wiLCBcInl1YVwiLCBcInp1XCJcbl0pO1xuLy8gZXNsaW50LWVuYWJsZVxuXG5leHBvcnQgY2xhc3MgTWljcm9zb2Z0VHJhbnNsYXRvciBleHRlbmRzIEJhc2VUcmFuc2xhdG9yPHsgdG9rZW5MaWZldGltZT86IG51bWJlciB9PiB7XG5cdHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHJhbnNsYXRvck5hbWUgPSAnTWljcm9zb2Z0VHJhbnNsYXRvcic7XG5cblx0cHVibGljIHN0YXRpYyBpc1N1cHBvcnRlZEF1dG9Gcm9tID0gKCkgPT4gdHJ1ZTtcblxuXHRwdWJsaWMgc3RhdGljIGdldFN1cHBvcnRlZExhbmd1YWdlcygpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIHN1cHBvcnRlZExhbmd1YWdlc01hcC5nZXRBbGwoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRMZW5ndGhMaW1pdCgpIHtcblx0XHRyZXR1cm4gNTBfMDAwO1xuXHR9XG5cblx0cHVibGljIGdldFJlcXVlc3RzVGltZW91dCgpIHtcblx0XHRyZXR1cm4gMzAwO1xuXHR9XG5cblx0cHVibGljIGNoZWNrTGltaXRFeGNlZWRpbmcodGV4dDogc3RyaW5nIHwgc3RyaW5nW10pIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh0ZXh0KSkge1xuXHRcdFx0Y29uc3QgYXJyYXlMZW4gPSB0ZXh0LnJlZHVjZSgoYWNjLCB0ZXh0KSA9PiBhY2MgKyB0ZXh0Lmxlbmd0aCwgMCk7XG5cdFx0XHRjb25zdCBleHRyYSA9IGFycmF5TGVuIC0gdGhpcy5nZXRMZW5ndGhMaW1pdCgpO1xuXHRcdFx0cmV0dXJuIGV4dHJhID4gMCA/IGV4dHJhIDogMDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgZXh0cmEgPSB0ZXh0Lmxlbmd0aCAtIHRoaXMuZ2V0TGVuZ3RoTGltaXQoKTtcblx0XHRcdHJldHVybiBleHRyYSA+IDAgPyBleHRyYSA6IDA7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGFzeW5jIHRyYW5zbGF0ZSh0ZXh0OiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZykge1xuXHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZUJhdGNoKFt0ZXh0XSwgZnJvbSwgdG8pLnRoZW4oKHJlc3ApID0+IHJlc3BbMF0pO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIHRyYW5zbGF0ZUJhdGNoKHRleHQ6IHN0cmluZ1tdLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpIHtcblx0XHRjb25zdCBzb3VyY2VMYW5ndWFnZSA9IGZyb20gPT09ICdhdXRvJyA/ICdhdXRvJyA6IHN1cHBvcnRlZExhbmd1YWdlc01hcC5nZXQoZnJvbSk7XG5cdFx0Y29uc3QgdGFyZ2V0TGFuZ3VhZ2UgPSBzdXBwb3J0ZWRMYW5ndWFnZXNNYXAuZ2V0KHRvKTtcblxuXHRcdGlmICghc291cmNlTGFuZ3VhZ2UpIHRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHNvdXJjZSBsYW5ndWFnZSAke2Zyb219YCk7XG5cdFx0aWYgKCF0YXJnZXRMYW5ndWFnZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgc291cmNlIGxhbmd1YWdlICR7dG99YCk7XG5cblx0XHRjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuZ2V0VG9rZW4oKTtcblxuXHRcdGNvbnN0IHVybCA9XG5cdFx0XHQnaHR0cHM6Ly9hcGktZWRnZS5jb2duaXRpdmUubWljcm9zb2Z0dHJhbnNsYXRvci5jb20vdHJhbnNsYXRlPycgK1xuXHRcdFx0Ly8gT21pdCBgZnJvbWAgcGFyYW1ldGVyIGZvciBhdXRvIGRldGVjdGlvbiBvZiBsYW5ndWFnZVxuXHRcdFx0KHNvdXJjZUxhbmd1YWdlICE9PSAnYXV0bydcblx0XHRcdFx0PyBgZnJvbT0ke2VuY29kZVVSSUNvbXBvbmVudChzb3VyY2VMYW5ndWFnZSl9JmBcblx0XHRcdFx0OiAnJykgK1xuXHRcdFx0YHRvPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuXHRcdFx0XHR0YXJnZXRMYW5ndWFnZSxcblx0XHRcdCl9JmFwaS12ZXJzaW9uPTMuMCZpbmNsdWRlU2VudGVuY2VMZW5ndGg9dHJ1ZWA7XG5cblx0XHRyZXR1cm4gdGhpcy5mZXRjaCh1cmwsIHtcblx0XHRcdHJlc3BvbnNlVHlwZTogJ2pzb24nLFxuXHRcdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdGFjY2VwdDogJyovKicsXG5cdFx0XHRcdCdhY2NlcHQtbGFuZ3VhZ2UnOlxuXHRcdFx0XHRcdCd6aC1UVyx6aDtxPTAuOSxqYTtxPTAuOCx6aC1DTjtxPTAuNyxlbi1VUztxPTAuNixlbjtxPTAuNScsXG5cdFx0XHRcdGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuXHRcdFx0XHQnY2FjaGUtY29udHJvbCc6ICduby1jYWNoZScsXG5cdFx0XHRcdCdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG5cdFx0XHRcdHByYWdtYTogJ25vLWNhY2hlJyxcblx0XHRcdFx0cHJpb3JpdHk6ICd1PTEsIGknLFxuXHRcdFx0XHQncmVmZXJyZXItcG9saWN5JzogJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nLFxuXHRcdFx0XHQnc2VjLWZldGNoLWRlc3QnOiAnZW1wdHknLFxuXHRcdFx0XHQnc2VjLWZldGNoLW1vZGUnOiAnY29ycycsXG5cdFx0XHRcdCdzZWMtZmV0Y2gtc2l0ZSc6ICdub25lJyxcblx0XHRcdFx0J3NlYy1mZXRjaC1zdG9yYWdlLWFjY2Vzcyc6ICdhY3RpdmUnLFxuXHRcdFx0fSxcblx0XHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KHRleHQubWFwKCh0ZXh0KSA9PiAoeyBUZXh0OiB0ZXh0IH0pKSksXG5cdFx0fSkudGhlbigocmF3UmVzdWx0KSA9PiB7XG5cdFx0XHRjb25zdCByZXN1bHQgPSBSZXNwb25zZVNjaGVtZS5wYXJzZShyYXdSZXN1bHQuZGF0YSk7XG5cblx0XHRcdGlmICgnZXJyb3InIGluIHJlc3VsdCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENvZGUgJHtyZXN1bHQuZXJyb3IuY29kZX06ICR7cmVzdWx0LmVycm9yLm1lc3NhZ2V9YCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRyYW5zZm9ybSB0cmFuc2xhdGlvbnMgYXJyYXlcblx0XHRcdHJldHVybiByZXN1bHQubWFwKCh0cmFuc2xhdGlvbkl0ZW0pID0+XG5cdFx0XHRcdC8vIEJ1aWxkIHRyYW5zbGF0aW9uIGZvciBzaW5nbGUgdGV4dFxuXHRcdFx0XHR0cmFuc2xhdGlvbkl0ZW0udHJhbnNsYXRpb25zXG5cdFx0XHRcdFx0Lm1hcCgodHJhbnNsYXRpb25TZWdtZW50KSA9PiB0cmFuc2xhdGlvblNlZ21lbnQudGV4dClcblx0XHRcdFx0XHQuam9pbignICcpLFxuXHRcdFx0KTtcblx0XHR9KTtcblx0fVxuXG5cdHByb3RlY3RlZCB0b2tlbjpcblx0XHR8IHtcblx0XHRcdFx0dmFsdWU6IHN0cmluZztcblx0XHRcdFx0aXNzdWVkQXQ6IG51bWJlcjtcblx0XHQgIH1cblx0XHR8IFByb21pc2U8c3RyaW5nPlxuXHRcdHwgbnVsbCA9IG51bGw7XG5cdHByb3RlY3RlZCBhc3luYyBnZXRUb2tlbigpIHtcblx0XHQvLyBXYWl0IHJlc29sdXRpb24gaWYgcGVuZGluZ1xuXHRcdGlmICh0aGlzLnRva2VuIGluc3RhbmNlb2YgUHJvbWlzZSkgcmV0dXJuIHRoaXMudG9rZW47XG5cblx0XHQvLyBGZXRjaCBuZXcgdG9rZW5cblx0XHRjb25zdCB0b2tlbkxpZmV0aW1lID0gdGhpcy5vcHRpb25zLnRva2VuTGlmZXRpbWUgPz8gMzBfMDAwO1xuXHRcdGlmICghdGhpcy50b2tlbiB8fCBEYXRlLm5vdygpIC0gdGhpcy50b2tlbi5pc3N1ZWRBdCA+IHRva2VuTGlmZXRpbWUpIHtcblx0XHRcdHRoaXMudG9rZW4gPSB0aGlzLmZldGNoKCdodHRwczovL2VkZ2UubWljcm9zb2Z0LmNvbS90cmFuc2xhdGUvYXV0aCcsIHtcblx0XHRcdFx0cmVzcG9uc2VUeXBlOiAndGV4dCcsXG5cdFx0XHRcdG1ldGhvZDogJ0dFVCcsXG5cdFx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0XHRhY2NlcHQ6ICcqLyonLFxuXHRcdFx0XHRcdCdhY2NlcHQtbGFuZ3VhZ2UnOlxuXHRcdFx0XHRcdFx0J3poLVRXLHpoO3E9MC45LGphO3E9MC44LHpoLUNOO3E9MC43LGVuLVVTO3E9MC42LGVuO3E9MC41Jyxcblx0XHRcdFx0XHQnY2FjaGUtY29udHJvbCc6ICduby1jYWNoZScsXG5cdFx0XHRcdFx0cHJhZ21hOiAnbm8tY2FjaGUnLFxuXHRcdFx0XHRcdHByaW9yaXR5OiAndT0xLCBpJyxcblx0XHRcdFx0XHQncmVmZXJyZXItcG9saWN5JzogJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nLFxuXHRcdFx0XHRcdCdzZWMtZmV0Y2gtZGVzdCc6ICdlbXB0eScsXG5cdFx0XHRcdFx0J3NlYy1mZXRjaC1tb2RlJzogJ2NvcnMnLFxuXHRcdFx0XHRcdCdzZWMtZmV0Y2gtc2l0ZSc6ICdub25lJyxcblx0XHRcdFx0XHQnc2VjLWZldGNoLXN0b3JhZ2UtYWNjZXNzJzogJ2FjdGl2ZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGJvZHk6IG51bGwsXG5cdFx0XHR9KS50aGVuKCh7IGRhdGE6IHRva2VuIH0pID0+IHtcblx0XHRcdFx0dGhpcy50b2tlbiA9IHsgdmFsdWU6IHRva2VuLCBpc3N1ZWRBdDogRGF0ZS5ub3coKSB9O1xuXHRcdFx0XHRyZXR1cm4gdG9rZW47XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIGF3YWl0IHRoaXMudG9rZW47XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIGNhY2hlZCB2YWx1ZVxuXHRcdHJldHVybiB0aGlzLnRva2VuLnZhbHVlO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLElBQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLGdCQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxlQUFBLEdBQUFGLE9BQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxNQUFNRyxjQUFjLEdBQUdDLE1BQUMsQ0FDdEJDLE1BQU0sQ0FBQztFQUNQQyxZQUFZLEVBQUVGLE1BQUMsQ0FDYkMsTUFBTSxDQUFDO0lBQ1BFLElBQUksRUFBRUgsTUFBQyxDQUFDSSxNQUFNO0dBQ2QsQ0FBQyxDQUNEQyxLQUFLO0NBQ1AsQ0FBQyxDQUNEQSxLQUFLLEVBQUUsQ0FDUEMsRUFBRSxDQUNGTixNQUFDLENBQUNDLE1BQU0sQ0FBQztFQUNSTSxLQUFLLEVBQUVQLE1BQUMsQ0FBQ0MsTUFBTSxDQUFDO0lBQ2ZPLElBQUksRUFBRVIsTUFBQyxDQUFDUyxNQUFNLEVBQUU7SUFDaEJDLE9BQU8sRUFBRVYsTUFBQyxDQUFDSSxNQUFNO0dBQ2pCO0NBQ0QsQ0FBQyxDQUNGO0FBRUY7QUFDQTtBQUNBLE1BQU1PLHFCQUFxQixHQUFHLElBQUlDLGdDQUFlLENBQUMsQ0FDakQsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUM5RCxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQy9ELEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUM5RCxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQ2pFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDbEUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFDbkUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFDekUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDcEUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDekUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVB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