@hurbis/comum
Version:
Biblioteca contendo rotinas e utilitários para desenvolvimento em Angular.
721 lines (703 loc) • 64.2 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@ngx-translate/core')) :
typeof define === 'function' && define.amd ? define('@hurbis/comum', ['exports', '@angular/core', '@ngx-translate/core'], factory) :
(factory((global.hurbis = global.hurbis || {}, global.hurbis.comum = {}),global.ng.core,global.i1));
}(this, (function (exports,i0,i1) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var CNPJ = /** @class */ (function () {
function CNPJ() {
}
/**
* @param {?} numeros
* @return {?}
*/
CNPJ.retornarDigito = /**
* @param {?} numeros
* @return {?}
*/
function (numeros) {
/** @type {?} */
var invertido = numeros.split("").reduce(function (buffer, number) {
return [parseInt(number, 10)].concat(buffer);
}, []);
/** @type {?} */
var indice = 2;
/** @type {?} */
var soma = invertido.reduce(function (buffer, numero) {
buffer += numero * indice;
indice = (indice === 9 ? 2 : indice + 1);
return buffer;
}, 0);
/** @type {?} */
var mod = soma % 11;
return (mod < 2 ? 0 : 11 - mod);
};
/**
* @param {?} numero
* @return {?}
*/
CNPJ.formatar = /**
* @param {?} numero
* @return {?}
*/
function (numero) {
/** @type {?} */
var regex = new RegExp("^(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})$");
return this.limpar(numero).replace(regex, "$1.$2.$3/$4-$5");
};
/**
* @param {?} numero
* @param {?=} strict
* @return {?}
*/
CNPJ.limpar = /**
* @param {?} numero
* @param {?=} strict
* @return {?}
*/
function (numero, strict) {
/** @type {?} */
var regex = strict ? this.STRICT_STRIP_REGEX : this.LOOSE_STRIP_REGEX;
return (numero || "").toString().replace(regex, "");
};
/**
* @param {?} numeroSemDV
* @return {?}
*/
CNPJ.atualizarComDV = /**
* @param {?} numeroSemDV
* @return {?}
*/
function (numeroSemDV) {
numeroSemDV += this.retornarDigito(numeroSemDV); // 13
numeroSemDV += this.retornarDigito(numeroSemDV); // 14
return numeroSemDV;
};
/**
* @param {?} numero
* @param {?=} strict
* @return {?}
*/
CNPJ.validar = /**
* @param {?} numero
* @param {?=} strict
* @return {?}
*/
function (numero, strict) {
/** @type {?} */
var numeroLimpo = this.limpar(numero, strict);
if (!numeroLimpo) {
return false;
}
if (numeroLimpo.length !== 14) {
return false;
}
if (this.LISTA_IGNORADA.indexOf(numeroLimpo) >= 0) {
return false;
}
/** @type {?} */
var numeroComDV = this.atualizarComDV(numeroLimpo.substr(0, 12));
return numeroComDV.substr(-2) === numeroLimpo.substr(-2);
};
/**
* @param {?} formatado
* @return {?}
*/
CNPJ.gerar = /**
* @param {?} formatado
* @return {?}
*/
function (formatado) {
/** @type {?} */
var numeroSemDV = "";
for (var i = 0; i < 12; i++) {
numeroSemDV += Math.floor(Math.random() * 9);
}
/** @type {?} */
var numeroComDV = this.atualizarComDV(numeroSemDV);
return (formatado ? this.formatar(numeroComDV) : numeroComDV);
};
CNPJ.LISTA_IGNORADA = [
"00000000000000",
"11111111111111",
"22222222222222",
"33333333333333",
"44444444444444",
"55555555555555",
"66666666666666",
"77777777777777",
"88888888888888",
"99999999999999"
];
CNPJ.STRICT_STRIP_REGEX = new RegExp("[-\/.]/g");
CNPJ.LOOSE_STRIP_REGEX = new RegExp("[^\\d]/g");
return CNPJ;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var CPF = /** @class */ (function () {
function CPF() {
}
/**
* @param {?} numeros
* @return {?}
*/
CPF.retornarDigito = /**
* @param {?} numeros
* @return {?}
*/
function (numeros) {
/** @type {?} */
var listaNumero = numeros
.split("")
.map(function (numero) { return parseInt(numero, 10); });
/** @type {?} */
var modulo = listaNumero.length + 1;
/** @type {?} */
var multiplificador = listaNumero.map(function (numero, indice) {
return numero * (modulo - indice);
});
/** @type {?} */
var resto = multiplificador.reduce(function (buffer, numero) {
return buffer + numero;
}) % 11;
return (resto < 2 ? 0 : 11 - resto);
};
/**
* @param {?} numero
* @return {?}
*/
CPF.formatar = /**
* @param {?} numero
* @return {?}
*/
function (numero) {
/** @type {?} */
var regex = new RegExp("^(\\d{3})(\\d{3})(\\d{3})(\\d{2})$");
return this.limpar(numero).replace(regex, "$1.$2.$3-$4");
};
/**
* @param {?} numero
* @param {?=} strict
* @return {?}
*/
CPF.limpar = /**
* @param {?} numero
* @param {?=} strict
* @return {?}
*/
function (numero, strict) {
/** @type {?} */
var regex = strict ? this.STRICT_STRIP_REGEX : this.LOOSE_STRIP_REGEX;
return (numero || "").toString().replace(regex, "");
};
/**
* @param {?} numeroSemDV
* @return {?}
*/
CPF.atualizarComDV = /**
* @param {?} numeroSemDV
* @return {?}
*/
function (numeroSemDV) {
numeroSemDV += this.retornarDigito(numeroSemDV); // 10
numeroSemDV += this.retornarDigito(numeroSemDV); // 11
return numeroSemDV;
};
/**
* @param {?} numero
* @param {?=} strict
* @return {?}
*/
CPF.validar = /**
* @param {?} numero
* @param {?=} strict
* @return {?}
*/
function (numero, strict) {
/** @type {?} */
var numeroLimpo = this.limpar(numero, strict);
if (!numeroLimpo) {
return false;
}
if (numeroLimpo.length !== 11) {
return false;
}
if (this.LISTA_IGNORADA.indexOf(numeroLimpo) >= 0) {
return false;
}
/** @type {?} */
var numeroComDV = this.atualizarComDV(numeroLimpo.substr(0, 9));
return numeroComDV.substr(-2) === numeroLimpo.substr(-2);
};
/**
* @param {?} formatado
* @return {?}
*/
CPF.gerar = /**
* @param {?} formatado
* @return {?}
*/
function (formatado) {
/** @type {?} */
var numeroSemDV = "";
for (var i = 0; i < 9; i++) {
numeroSemDV += Math.floor(Math.random() * 9);
}
/** @type {?} */
var numeroComDV = this.atualizarComDV(numeroSemDV);
return (formatado ? this.formatar(numeroComDV) : numeroComDV);
};
CPF.LISTA_IGNORADA = [
"00000000000",
"11111111111",
"22222222222",
"33333333333",
"44444444444",
"55555555555",
"66666666666",
"77777777777",
"88888888888",
"99999999999",
"12345678909"
];
CPF.STRICT_STRIP_REGEX = new RegExp("[.-]/g");
CPF.LOOSE_STRIP_REGEX = new RegExp("[^\d]/g");
return CPF;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var Arquivo = /** @class */ (function () {
function Arquivo() {
}
/**
* @param {?} conteudo
* @param {?=} sliceSize
* @return {?}
*/
Arquivo.fromBase64ToByteArray = /**
* @param {?} conteudo
* @param {?=} sliceSize
* @return {?}
*/
function (conteudo, sliceSize) {
if (sliceSize === void 0) {
sliceSize = 512;
}
/** @type {?} */
var byteString = window.atob(conteudo);
/** @type {?} */
var byteArrays = [];
for (var offset = 0; offset < byteString.length; offset += sliceSize) {
/** @type {?} */
var slice = byteString.slice(offset, offset + sliceSize);
/** @type {?} */
var byteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
/** @type {?} */
var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
return byteArrays;
};
/**
* @param {?} conteudo
* @param {?} tipo
* @return {?}
*/
Arquivo.fromByteArrayToBlob = /**
* @param {?} conteudo
* @param {?} tipo
* @return {?}
*/
function (conteudo, tipo) {
return new Blob(conteudo, { type: tipo });
};
/**
* @param {?} conteudo
* @param {?=} tipo
* @param {?=} sliceSize
* @return {?}
*/
Arquivo.fromBase64ToBlob = /**
* @param {?} conteudo
* @param {?=} tipo
* @param {?=} sliceSize
* @return {?}
*/
function (conteudo, tipo, sliceSize) {
if (tipo === void 0) {
tipo = "";
}
if (sliceSize === void 0) {
sliceSize = 512;
}
/** @type {?} */
var bytes = Arquivo.fromBase64ToByteArray(conteudo);
return Arquivo.fromByteArrayToBlob(bytes, tipo);
};
/**
* @param {?} arquivo
* @return {?}
*/
Arquivo.toBlob = /**
* @param {?} arquivo
* @return {?}
*/
function (arquivo) {
return Arquivo.fromBase64ToBlob(arquivo.conteudo, arquivo.tipo);
};
return Arquivo;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var Gerador = /** @class */ (function () {
function Gerador() {
}
/**
* Gera um código aleatório.
* @param tamanho Tamanho do código desejado.
*/
/**
* Gera um código aleatório.
* @param {?} tamanho Tamanho do código desejado.
* @return {?}
*/
Gerador.gerarCodigoAleatorio = /**
* Gera um código aleatório.
* @param {?} tamanho Tamanho do código desejado.
* @return {?}
*/
function (tamanho) {
/** @type {?} */
var texto = "";
/** @type {?} */
var possibilidades = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < tamanho; i++)
texto += possibilidades.charAt(Math.floor(Math.random() * possibilidades.length));
return texto;
};
/** Gera código utilizando lógica e formato GUID. */
/**
* Gera código utilizando lógica e formato GUID.
* @return {?}
*/
Gerador.gerarGUID = /**
* Gera código utilizando lógica e formato GUID.
* @return {?}
*/
function () {
/** @type {?} */
var s4 = function () {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
};
return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
};
return Gerador;
}());
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
function __read(o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m)
return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
ar.push(r.value);
}
catch (error) {
e = { error: error };
}
finally {
try {
if (r && !r.done && (m = i["return"]))
m.call(i);
}
finally {
if (e)
throw e.error;
}
}
return ar;
}
function __spread() {
for (var ar = [], i = 0; i < arguments.length; i++)
ar = ar.concat(__read(arguments[i]));
return ar;
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var LocalizacaoService = /** @class */ (function () {
function LocalizacaoService(translate, translatePipe) {
this.translate = translate;
this.translatePipe = translatePipe;
}
/**
* @param {?} linguagem
* @return {?}
*/
LocalizacaoService.prototype.definirLinguagemPadrao = /**
* @param {?} linguagem
* @return {?}
*/
function (linguagem) {
this.translate.setDefaultLang(linguagem);
};
/**
* @param {...?} traducoes
* @return {?}
*/
LocalizacaoService.prototype.carregar = /**
* @param {...?} traducoes
* @return {?}
*/
function () {
var _this = this;
var traducoes = [];
for (var _i = 0; _i < arguments.length; _i++) {
traducoes[_i] = arguments[_i];
}
/** @type {?} */
var traducoesAux = __spread(traducoes);
traducoesAux.forEach(function (localizacao) {
_this.translate.setTranslation(localizacao.idioma, localizacao.traducao, true);
});
};
/**
* @param {?} linguagens
* @return {?}
*/
LocalizacaoService.prototype.adicionar = /**
* @param {?} linguagens
* @return {?}
*/
function (linguagens) {
this.translate.addLangs(linguagens);
};
/**
* @param {?=} linguagem
* @return {?}
*/
LocalizacaoService.prototype.traduzir = /**
* @param {?=} linguagem
* @return {?}
*/
function (linguagem) {
this.translate.use((linguagem) ? linguagem : this.sugerida()).subscribe();
};
/**
* @param {?} chave
* @return {?}
*/
LocalizacaoService.prototype.traducaoSimples = /**
* @param {?} chave
* @return {?}
*/
function (chave) {
return this.translatePipe.transform(chave);
};
/**
* @param {?} chaves
* @return {?}
*/
LocalizacaoService.prototype.traducao = /**
* @param {?} chaves
* @return {?}
*/
function (chaves) {
return this.translate.get(chaves);
};
/**
* @return {?}
*/
LocalizacaoService.prototype.selecionada = /**
* @return {?}
*/
function () {
return this.translate.currentLang;
};
/**
* @return {?}
*/
LocalizacaoService.prototype.sugerida = /**
* @return {?}
*/
function () {
return this.translate.getBrowserLang() || this.translate.getDefaultLang();
};
LocalizacaoService.decorators = [
{ type: i0.Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
LocalizacaoService.ctorParameters = function () {
return [
{ type: i1.TranslateService },
{ type: i1.TranslatePipe }
];
};
/** @nocollapse */ LocalizacaoService.ngInjectableDef = i0.defineInjectable({ factory: function LocalizacaoService_Factory() { return new LocalizacaoService(i0.inject(i1.TranslateService), i0.inject(i1.TranslatePipe)); }, token: LocalizacaoService, providedIn: "root" });
return LocalizacaoService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var ComumModule = /** @class */ (function () {
function ComumModule(injector) {
ComumModule._injector = injector;
}
/**
* @return {?}
*/
ComumModule.getInjector = /**
* @return {?}
*/
function () {
return ComumModule._injector;
};
ComumModule._injector = null;
ComumModule.decorators = [
{ type: i0.NgModule, args: [{
imports: [
i1.TranslateModule.forRoot()
],
providers: [
LocalizacaoService
]
},] }
];
/** @nocollapse */
ComumModule.ctorParameters = function () {
return [
{ type: i0.Injector }
];
};
return ComumModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var Objeto = /** @class */ (function () {
function Objeto() {
}
/**
* @template T
* @param {?} origem
* @return {?}
*/
Objeto.copiar = /**
* @template T
* @param {?} origem
* @return {?}
*/
function (origem) {
return Object.assign({}, origem);
};
/**
* @param {?} destino
* @param {...?} fontes
* @return {?}
*/
Objeto.estender = /**
* @param {?} destino
* @param {...?} fontes
* @return {?}
*/
function (destino) {
var fontes = [];
for (var _i = 1; _i < arguments.length; _i++) {
fontes[_i - 1] = arguments[_i];
}
Object.assign(destino, fontes);
};
/**
* Recupera a instância de uma classe registrada.
* @param tipoInstancia Tipo do serviço a ser recuperado.
*/
/**
* Recupera a instância de uma classe registrada.
* @template T
* @param {?} tipoInstancia Tipo do serviço a ser recuperado.
* @return {?}
*/
Objeto.recuperarInstancia = /**
* Recupera a instância de uma classe registrada.
* @template T
* @param {?} tipoInstancia Tipo do serviço a ser recuperado.
* @return {?}
*/
function (tipoInstancia) {
if (ComumModule.getInjector() == null) {
this.excecaoObjetoNaoCarregado("injector");
return;
}
return ComumModule.getInjector().get(tipoInstancia);
};
/**
* @param {?} objeto
* @return {?}
*/
Objeto.excecaoObjetoNaoCarregado = /**
* @param {?} objeto
* @return {?}
*/
function (objeto) {
throw objeto + " não carregado.";
};
return Objeto;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
exports.CNPJ = CNPJ;
exports.CPF = CPF;
exports.Arquivo = Arquivo;
exports.Gerador = Gerador;
exports.Objeto = Objeto;
exports.LocalizacaoService = LocalizacaoService;
exports.ComumModule = ComumModule;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHVyYmlzLWNvbXVtLnVtZC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQGh1cmJpcy9jb211bS9saWIvdXRpbC92YWxpZGFkb3IvY25wai50cyIsIm5nOi8vQGh1cmJpcy9jb211bS9saWIvdXRpbC92YWxpZGFkb3IvY3BmLnRzIiwibmc6Ly9AaHVyYmlzL2NvbXVtL2xpYi91dGlsL2FycXVpdm8udHMiLCJuZzovL0BodXJiaXMvY29tdW0vbGliL3V0aWwvZ2VyYWRvci50cyIsIm5vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCJuZzovL0BodXJiaXMvY29tdW0vbGliL3V0aWwvbG9jYWxpemFjYW8uc2VydmljZS50cyIsIm5nOi8vQGh1cmJpcy9jb211bS9saWIvY29tdW0ubW9kdWxlLnRzIiwibmc6Ly9AaHVyYmlzL2NvbXVtL2xpYi91dGlsL29iamV0by50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgQ05QSiB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgTElTVEFfSUdOT1JBREE6IHN0cmluZ1tdID0gW1xyXG4gICAgXCIwMDAwMDAwMDAwMDAwMFwiLFxyXG4gICAgXCIxMTExMTExMTExMTExMVwiLFxyXG4gICAgXCIyMjIyMjIyMjIyMjIyMlwiLFxyXG4gICAgXCIzMzMzMzMzMzMzMzMzM1wiLFxyXG4gICAgXCI0NDQ0NDQ0NDQ0NDQ0NFwiLFxyXG4gICAgXCI1NTU1NTU1NTU1NTU1NVwiLFxyXG4gICAgXCI2NjY2NjY2NjY2NjY2NlwiLFxyXG4gICAgXCI3Nzc3Nzc3Nzc3Nzc3N1wiLFxyXG4gICAgXCI4ODg4ODg4ODg4ODg4OFwiLFxyXG4gICAgXCI5OTk5OTk5OTk5OTk5OVwiXHJcbiAgXTtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgU1RSSUNUX1NUUklQX1JFR0VYOiBSZWdFeHAgPSBuZXcgUmVnRXhwKFwiWy1cXC8uXS9nXCIpO1xyXG4gIHByaXZhdGUgc3RhdGljIExPT1NFX1NUUklQX1JFR0VYOiBSZWdFeHAgPSBuZXcgUmVnRXhwKFwiW15cXFxcZF0vZ1wiKTtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmV0b3JuYXJEaWdpdG8obnVtZXJvczogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBpbnZlcnRpZG86IG51bWJlcltdID0gbnVtZXJvcy5zcGxpdChcIlwiKS5yZWR1Y2U8bnVtYmVyW10+KFxyXG4gICAgICAoYnVmZmVyOiBudW1iZXJbXSwgbnVtYmVyOiBzdHJpbmcpID0+IHtcclxuICAgICAgICByZXR1cm4gW3BhcnNlSW50KG51bWJlciwgMTApXS5jb25jYXQoYnVmZmVyKTtcclxuICAgICAgfSwgW10pO1xyXG5cclxuICAgIGxldCBpbmRpY2U6IG51bWJlciA9IDI7XHJcbiAgICBsZXQgc29tYTogbnVtYmVyID0gaW52ZXJ0aWRvLnJlZHVjZShcclxuICAgICAgKGJ1ZmZlcjogbnVtYmVyLCBudW1lcm86IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGJ1ZmZlciArPSBudW1lcm8gKiBpbmRpY2U7XHJcbiAgICAgICAgaW5kaWNlID0gKGluZGljZSA9PT0gOSA/IDIgOiBpbmRpY2UgKyAxKTtcclxuICAgICAgICByZXR1cm4gYnVmZmVyO1xyXG4gICAgICB9LCAwKTtcclxuXHJcbiAgICBsZXQgbW9kOiBudW1iZXIgPSBzb21hICUgMTE7XHJcbiAgICByZXR1cm4gKG1vZCA8IDIgPyAwIDogMTEgLSBtb2QpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGZvcm1hdGFyKG51bWVybzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCByZWdleDogUmVnRXhwID0gbmV3IFJlZ0V4cChcIl4oXFxcXGR7Mn0pKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7NH0pKFxcXFxkezJ9KSRcIik7XHJcbiAgICByZXR1cm4gdGhpcy5saW1wYXIobnVtZXJvKS5yZXBsYWNlKHJlZ2V4LCBcIiQxLiQyLiQzLyQ0LSQ1XCIpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGxpbXBhcihudW1lcm86IHN0cmluZywgc3RyaWN0PzogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgcmVnZXg6IFJlZ0V4cCA9IHN0cmljdCA/IHRoaXMuU1RSSUNUX1NUUklQX1JFR0VYIDogdGhpcy5MT09TRV9TVFJJUF9SRUdFWDtcclxuICAgIHJldHVybiAobnVtZXJvIHx8IFwiXCIpLnRvU3RyaW5nKCkucmVwbGFjZShyZWdleCwgXCJcIik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBhdHVhbGl6YXJDb21EVihudW1lcm9TZW1EVjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIG51bWVyb1NlbURWICs9IHRoaXMucmV0b3JuYXJEaWdpdG8obnVtZXJvU2VtRFYpOyAvLyAxM1xyXG4gICAgbnVtZXJvU2VtRFYgKz0gdGhpcy5yZXRvcm5hckRpZ2l0byhudW1lcm9TZW1EVik7IC8vIDE0XHJcbiAgICByZXR1cm4gbnVtZXJvU2VtRFY7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgdmFsaWRhcihudW1lcm86IHN0cmluZywgc3RyaWN0PzogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IG51bWVyb0xpbXBvOiBzdHJpbmcgPSB0aGlzLmxpbXBhcihudW1lcm8sIHN0cmljdCk7XHJcblxyXG4gICAgaWYgKCFudW1lcm9MaW1wbykgeyByZXR1cm4gZmFsc2U7IH1cclxuXHJcbiAgICBpZiAobnVtZXJvTGltcG8ubGVuZ3RoICE9PSAxNCkgeyByZXR1cm4gZmFsc2U7IH1cclxuXHJcbiAgICBpZiAodGhpcy5MSVNUQV9JR05PUkFEQS5pbmRleE9mKG51bWVyb0xpbXBvKSA+PSAwKSB7IHJldHVybiBmYWxzZTsgfVxyXG5cclxuICAgIGxldCBudW1lcm9Db21EVjogc3RyaW5nID0gdGhpcy5hdHVhbGl6YXJDb21EVihudW1lcm9MaW1wby5zdWJzdHIoMCwgMTIpKTtcclxuXHJcbiAgICByZXR1cm4gbnVtZXJvQ29tRFYuc3Vic3RyKC0yKSA9PT0gbnVtZXJvTGltcG8uc3Vic3RyKC0yKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXJhcihmb3JtYXRhZG86IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgbGV0IG51bWVyb1NlbURWOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCAxMjsgaSsrKSB7XHJcbiAgICAgIG51bWVyb1NlbURWICs9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDkpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBudW1lcm9Db21EVjogc3RyaW5nID0gdGhpcy5hdHVhbGl6YXJDb21EVihudW1lcm9TZW1EVik7XHJcblxyXG4gICAgcmV0dXJuIChmb3JtYXRhZG8gPyB0aGlzLmZvcm1hdGFyKG51bWVyb0NvbURWKSA6IG51bWVyb0NvbURWKTtcclxuICB9XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIENQRiB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgTElTVEFfSUdOT1JBREE6IHN0cmluZ1tdID0gW1xyXG4gICAgXCIwMDAwMDAwMDAwMFwiLFxyXG4gICAgXCIxMTExMTExMTExMVwiLFxyXG4gICAgXCIyMjIyMjIyMjIyMlwiLFxyXG4gICAgXCIzMzMzMzMzMzMzM1wiLFxyXG4gICAgXCI0NDQ0NDQ0NDQ0NFwiLFxyXG4gICAgXCI1NTU1NTU1NTU1NVwiLFxyXG4gICAgXCI2NjY2NjY2NjY2NlwiLFxyXG4gICAgXCI3Nzc3Nzc3Nzc3N1wiLFxyXG4gICAgXCI4ODg4ODg4ODg4OFwiLFxyXG4gICAgXCI5OTk5OTk5OTk5OVwiLFxyXG4gICAgXCIxMjM0NTY3ODkwOVwiXHJcbiAgXTtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgU1RSSUNUX1NUUklQX1JFR0VYOiBSZWdFeHAgPSBuZXcgUmVnRXhwKFwiWy4tXS9nXCIpO1xyXG4gIHByaXZhdGUgc3RhdGljIExPT1NFX1NUUklQX1JFR0VYOiBSZWdFeHAgPSBuZXcgUmVnRXhwKFwiW15cXGRdL2dcIik7XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHJldG9ybmFyRGlnaXRvKG51bWVyb3M6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgbGlzdGFOdW1lcm86IG51bWJlcltdID0gbnVtZXJvc1xyXG4gICAgICAuc3BsaXQoXCJcIilcclxuICAgICAgLm1hcCgobnVtZXJvOiBzdHJpbmcpID0+IHsgcmV0dXJuIHBhcnNlSW50KG51bWVybywgMTApOyB9KTtcclxuXHJcbiAgICB2YXIgbW9kdWxvOiBudW1iZXIgPSBsaXN0YU51bWVyby5sZW5ndGggKyAxO1xyXG5cclxuICAgIHZhciBtdWx0aXBsaWZpY2Fkb3I6IG51bWJlcltdID0gbGlzdGFOdW1lcm8ubWFwKFxyXG4gICAgICAobnVtZXJvOiBudW1iZXIsIGluZGljZTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG51bWVybyAqIChtb2R1bG8gLSBpbmRpY2UpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB2YXIgcmVzdG86IG51bWJlciA9IG11bHRpcGxpZmljYWRvci5yZWR1Y2UoXHJcbiAgICAgIChidWZmZXI6IG51bWJlciwgbnVtZXJvOiBudW1iZXIpID0+IHtcclxuICAgICAgICByZXR1cm4gYnVmZmVyICsgbnVtZXJvO1xyXG4gICAgICB9KSAlIDExO1xyXG5cclxuICAgIHJldHVybiAocmVzdG8gPCAyID8gMCA6IDExIC0gcmVzdG8pO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGZvcm1hdGFyKG51bWVybzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCByZWdleDogUmVnRXhwID0gbmV3IFJlZ0V4cChcIl4oXFxcXGR7M30pKFxcXFxkezN9KShcXFxcZHszfSkoXFxcXGR7Mn0pJFwiKTtcclxuICAgIHJldHVybiB0aGlzLmxpbXBhcihudW1lcm8pLnJlcGxhY2UocmVnZXgsIFwiJDEuJDIuJDMtJDRcIik7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgbGltcGFyKG51bWVybzogc3RyaW5nLCBzdHJpY3Q/OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCByZWdleDogUmVnRXhwID0gc3RyaWN0ID8gdGhpcy5TVFJJQ1RfU1RSSVBfUkVHRVggOiB0aGlzLkxPT1NFX1NUUklQX1JFR0VYO1xyXG4gICAgcmV0dXJuIChudW1lcm8gfHwgXCJcIikudG9TdHJpbmcoKS5yZXBsYWNlKHJlZ2V4LCBcIlwiKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGF0dWFsaXphckNvbURWKG51bWVyb1NlbURWOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbnVtZXJvU2VtRFYgKz0gdGhpcy5yZXRvcm5hckRpZ2l0byhudW1lcm9TZW1EVik7IC8vIDEwXHJcbiAgICBudW1lcm9TZW1EViArPSB0aGlzLnJldG9ybmFyRGlnaXRvKG51bWVyb1NlbURWKTsgLy8gMTFcclxuICAgIHJldHVybiBudW1lcm9TZW1EVjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB2YWxpZGFyKG51bWVybzogc3RyaW5nLCBzdHJpY3Q/OiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgbnVtZXJvTGltcG86IHN0cmluZyA9IHRoaXMubGltcGFyKG51bWVybywgc3RyaWN0KTtcclxuXHJcbiAgICBpZiAoIW51bWVyb0xpbXBvKSB7IHJldHVybiBmYWxzZTsgfVxyXG5cclxuICAgIGlmIChudW1lcm9MaW1wby5sZW5ndGggIT09IDExKSB7IHJldHVybiBmYWxzZTsgfVxyXG5cclxuICAgIGlmICh0aGlzLkxJU1RBX0lHTk9SQURBLmluZGV4T2YobnVtZXJvTGltcG8pID49IDApIHsgcmV0dXJuIGZhbHNlOyB9XHJcblxyXG4gICAgbGV0IG51bWVyb0NvbURWOiBzdHJpbmcgPSB0aGlzLmF0dWFsaXphckNvbURWKG51bWVyb0xpbXBvLnN1YnN0cigwLCA5KSk7XHJcblxyXG4gICAgcmV0dXJuIG51bWVyb0NvbURWLnN1YnN0cigtMikgPT09IG51bWVyb0xpbXBvLnN1YnN0cigtMik7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2VyYXIoZm9ybWF0YWRvOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBudW1lcm9TZW1EVjogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgOTsgaSsrKSB7XHJcbiAgICAgIG51bWVyb1NlbURWICs9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDkpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBudW1lcm9Db21EVjogc3RyaW5nID0gdGhpcy5hdHVhbGl6YXJDb21EVihudW1lcm9TZW1EVik7XHJcblxyXG4gICAgcmV0dXJuIChmb3JtYXRhZG8gPyB0aGlzLmZvcm1hdGFyKG51bWVyb0NvbURWKSA6IG51bWVyb0NvbURWKTtcclxuICB9XHJcbn1cclxuIiwiZXhwb3J0IGludGVyZmFjZSBJQXJxdWl2byB7XHJcbiAgICBub21lOiBzdHJpbmc7XHJcbiAgICB0aXBvOiBzdHJpbmc7XHJcbiAgICBjb250ZXVkbzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQXJxdWl2byB7XHJcbiAgICBzdGF0aWMgZnJvbUJhc2U2NFRvQnl0ZUFycmF5KGNvbnRldWRvOiBzdHJpbmcsIHNsaWNlU2l6ZTogbnVtYmVyID0gNTEyKTogVWludDhBcnJheVtdIHtcclxuICAgICAgICBsZXQgYnl0ZVN0cmluZyA9IHdpbmRvdy5hdG9iKGNvbnRldWRvKTtcclxuICAgICAgICBsZXQgYnl0ZUFycmF5czogVWludDhBcnJheVtdID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBvZmZzZXQgKz0gc2xpY2VTaXplKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNsaWNlID0gYnl0ZVN0cmluZy5zbGljZShvZmZzZXQsIG9mZnNldCArIHNsaWNlU2l6ZSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBieXRlTnVtYmVycyA9IG5ldyBBcnJheShzbGljZS5sZW5ndGgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsaWNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBieXRlTnVtYmVyc1tpXSA9IHNsaWNlLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ5dGVOdW1iZXJzKTtcclxuXHJcbiAgICAgICAgICAgIGJ5dGVBcnJheXMucHVzaChieXRlQXJyYXkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJ5dGVBcnJheXM7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGZyb21CeXRlQXJyYXlUb0Jsb2IoY29udGV1ZG86IFVpbnQ4QXJyYXlbXSwgdGlwbzogc3RyaW5nKTogQmxvYiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKGNvbnRldWRvLCB7IHR5cGU6IHRpcG8gfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGZyb21CYXNlNjRUb0Jsb2IoY29udGV1ZG86IHN0cmluZywgdGlwbzogc3RyaW5nID0gXCJcIiwgc2xpY2VTaXplID0gNTEyKTogQmxvYiB7XHJcbiAgICAgICAgdmFyIGJ5dGVzOiBVaW50OEFycmF5W10gPSBBcnF1aXZvLmZyb21CYXNlNjRUb0J5dGVBcnJheShjb250ZXVkbyk7XHJcblxyXG4gICAgICAgIHJldHVybiBBcnF1aXZvLmZyb21CeXRlQXJyYXlUb0Jsb2IoYnl0ZXMsIHRpcG8pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB0b0Jsb2IoYXJxdWl2bzogSUFycXVpdm8pOiBCbG9iIHtcclxuICAgICAgICByZXR1cm4gQXJxdWl2by5mcm9tQmFzZTY0VG9CbG9iKGFycXVpdm8uY29udGV1ZG8sIGFycXVpdm8udGlwbyk7XHJcbiAgICB9XHJcblxyXG59IiwiZXhwb3J0IGNsYXNzIEdlcmFkb3Ige1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VyYSB1bSBjw4PCs2RpZ28gYWxlYXTDg8KzcmlvLlxyXG4gICAgICogQHBhcmFtIHRhbWFuaG8gVGFtYW5obyBkbyBjw4PCs2RpZ28gZGVzZWphZG8uXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXJhckNvZGlnb0FsZWF0b3Jpbyh0YW1hbmhvOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCB0ZXh0byA9IFwiXCI7XHJcbiAgICAgICAgbGV0IHBvc3NpYmlsaWRhZGVzID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OVwiO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhbWFuaG87IGkrKylcclxuICAgICAgICAgICAgdGV4dG8gKz0gcG9zc2liaWxpZGFkZXMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHBvc3NpYmlsaWRhZGVzLmxlbmd0aCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dG87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEdlcmEgY8ODwrNkaWdvIHV0aWxpemFuZG8gbMODwrNnaWNhIGUgZm9ybWF0byBHVUlELiAqL1xyXG4gICAgc3RhdGljIGdlcmFyR1VJRCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzNCA9ICgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKDEgKyBNYXRoLnJhbmRvbSgpKSAqIDB4MTAwMDApXHJcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoMTYpXHJcbiAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBzNCgpICsgczQoKSArICctJyArIHM0KCkgKyAnLScgKyBzNCgpICsgJy0nICsgczQoKSArICctJyArIHM0KCkgKyBzNCgpICsgczQoKTtcclxuICAgIH1cclxuXHJcbn0iLCIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxyXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxyXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG5cclxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxyXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXHJcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXHJcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXHJcblxyXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcclxuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDApXHJcbiAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgZXhwb3J0cykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAoIWV4cG9ydHMuaGFzT3duUHJvcGVydHkocCkpIGV4cG9ydHNbcF0gPSBtW3BdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XHJcbiAgICByZXN1bHQuZGVmYXVsdCA9IG1vZDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlLCBUcmFuc2xhdGVQaXBlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsaXphY2FvIHtcclxuICBpZGlvbWE6IHN0cmluZztcclxuICB0cmFkdWNhbzogT2JqZWN0O1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcclxuZXhwb3J0IGNsYXNzIExvY2FsaXphY2FvU2VydmljZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLCBwcml2YXRlIHRyYW5zbGF0ZVBpcGU6IFRyYW5zbGF0ZVBpcGUpIHtcclxuICB9XHJcblxyXG4gIGRlZmluaXJMaW5ndWFnZW1QYWRyYW8obGluZ3VhZ2VtOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMudHJhbnNsYXRlLnNldERlZmF1bHRMYW5nKGxpbmd1YWdlbSk7XHJcbiAgfVxyXG5cclxuICBjYXJyZWdhciguLi50cmFkdWNvZXM6IExvY2FsaXphY2FvW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IHRyYWR1Y29lc0F1eCA9IFsuLi50cmFkdWNvZXNdO1xyXG5cclxuICAgIHRyYWR1Y29lc0F1eC5mb3JFYWNoKChsb2NhbGl6YWNhbykgPT4ge1xyXG4gICAgICB0aGlzLnRyYW5zbGF0ZS5zZXRUcmFuc2xhdGlvbihsb2NhbGl6YWNhby5pZGlvbWEsIGxvY2FsaXphY2FvLnRyYWR1Y2FvLCB0cnVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRpY2lvbmFyKGxpbmd1YWdlbnM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZS5hZGRMYW5ncyhsaW5ndWFnZW5zKTtcclxuICB9XHJcblxyXG4gIHRyYWR1emlyKGxpbmd1YWdlbT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy50cmFuc2xhdGUudXNlKChsaW5ndWFnZW0pID8gbGluZ3VhZ2VtIDogdGhpcy5zdWdlcmlkYSgpKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHRyYWR1Y2FvU2ltcGxlcyhjaGF2ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVBpcGUudHJhbnNmb3JtKGNoYXZlKTtcclxuICB9XHJcblxyXG4gIHRyYWR1Y2FvKGNoYXZlczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmdldChjaGF2ZXMpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWNpb25hZGEoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcclxuICB9XHJcblxyXG4gIHN1Z2VyaWRhKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuZ2V0QnJvd3NlckxhbmcoKSB8fCB0aGlzLnRyYW5zbGF0ZS5nZXREZWZhdWx0TGFuZygpO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBMb2NhbGl6YWNhb1NlcnZpY2UgfSBmcm9tICcuL3V0aWwvbG9jYWxpemFjYW8uc2VydmljZSc7XHJcbmltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtcclxuICAgIFRyYW5zbGF0ZU1vZHVsZS5mb3JSb290KClcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAgTG9jYWxpemFjYW9TZXJ2aWNlXHJcbiAgXVxyXG59KVxyXG5