UNPKG

@cabinfo.eu/astrophysics-library

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.

971 lines 58.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * This class define physics constants and calculated physics constants. * * Instanciation example : * * ```typescript * const instance = new CPhysicsConstants(); * ``` * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @author Alain Deseine * * @copyright CEI Alain Deseine 1992-2019 * * @beta * * Copyright (C) 2019 Alain Deseine * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * */ var CConstant = /** @class */ (function () { /** * Constructor. * * The constructor of this class calculate calculated physics constants. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ function CConstant(name, symbol, value, unit, description) { // Set physics constants this.name = name; this.symbol = symbol; this.value = value; this.unit = unit; this.description = description; } // eo constructor return CConstant; }()); // eo CConstant class export { CConstant }; if (false) { /** @type {?} */ CConstant.prototype.name; /** @type {?} */ CConstant.prototype.symbol; /** @type {?} */ CConstant.prototype.value; /** @type {?} */ CConstant.prototype.unit; /** @type {?} */ CConstant.prototype.description; } // eo CConstant class var // eo CConstant class CPhysicsConstants = /** @class */ (function () { /** * Constructor. * * The constructor of this class calculate calculated physics constants. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ function CPhysicsConstants() { var _this = this; this.constants = []; // Set physics constants this.constants.push(new CConstant('PI constant', 'π', Math.PI, 'None', '')); this.constants.push(new CConstant('Celerity', 'c', 299792458, 'm.s-1', 'Celerity of light in vaccum')); this.constants.push(new CConstant('Planck constant', 'h', 6.62607015e-34, 'J.s', 'The Planck constant is a physical constant that is the quantum of electromagnetic action, which relates the energy carried by a photon to its frequency')); this.constants.push(new CConstant('Boltzmann constant', 'k', 1.38064852e-23, 'J.K-1', 'The Boltzmann constant (kB or k) is a physical constant which relates the average relative kinetic energy of particles in a gas with the temperature of the gas and occurs in Planck\'s law of black-body radiation and in Boltzmann\'s entropy formula.')); this.constants.push(new CConstant('Gravitational constant', 'G', 6.67408e-11, 'N.m2.kg-2', 'Gravitational constant is an empirical physical constant involved in the calculation of gravitational effects in Isaac Newton\'s law of universal gravitation and in Albert Einstein\'s general theory of relativity.')); // TODO Alain : Vérifier unité this.constants.push(new CConstant('Elementary charge', 'e', 1.602176634e-19, 'A.s', '')); this.constants.push(new CConstant('Coulomb', 'C', 1, 'A.s', '')); this.constants.push(new CConstant('Avogadro constant', 'NA', 6.022140857, 'mol-1', '')); this.constants.push(new CConstant('Standard acceleration', 'g', 9.80665, 'm.s-2', 'Standard acceleration due to gravity on earth')); this.constants.push(new CConstant('Bohr radius', 'a0', 0.52917721092, 'Å', 'The Bohr radius is approximately equal to the most probable distance between the nucleus and the electron in a hydrogen atom in its ground state. ')); this.constants.push(new CConstant('Ideal gas constant', 'R', 8.3144598, 'J.K-1.mol-1', '')); this.constants.push(new CConstant('Unified mass unit (dalton)', 'u', 1.660538921e-27, 'kg', 'Standard unit of mass that quantifies mass on an atomic or molecular scale')); this.constants.push(new CConstant('Vacuum permeability', 'µ0', 1.2566e-6, 'T.m.A-1', 'Vacuum permeability is the magnetic permeability in a classical vacuum.')); this.constants.push(new CConstant('Vacuum permittivity', 'ε0', 8.85418782e-12, 'F.m-1', 'Vacuum permittivity is an ideal, (baseline) physical constant, which is the value of the absolute dielectric permittivity of classical vacuum.')); this.constants.push(new CConstant('Impedance of free space', 'Z0', 376.730, 'Ω', 'The impedance of free space equals the product of the vacuum permeability μ0 and the speed of light in vacuum c0.')); this.constants.push(new CConstant('Astronomical unit', 'au', 149597870700, 'm', 'Astronomical unit is the distance from Earth to the Sun')); this.constants.push(new CConstant('Parsec', 'pc', 648000 / Math.PI * 149597870700, 'm', 'The parsec is a unit of length used to measure large distances to astronomical objects outside the Solar System. A parsec is defined as the distance at which one astronomical unit subtends an angle of one arcsecond,[1] which corresponds to 648000/π astronomical units.')); this.constants.push(new CConstant('Light year', 'lr', 9460730472580800, 'm', 'Light-year is the distance that light travels in vacuum in one Julian year (365.25 days).')); this.constants.push(new CConstant('Electronvolt', 'eV', 1.602176565e-19, 'J', '')); // Set physical quantities /** Solar system object mass */ this.constants.push(new CConstant('Solar mass', 'M☉', 1.9884e30, 'kg', '')); this.constants.push(new CConstant('Earth mass', 'M⊕', 5.9722e24, 'kg', '')); this.constants.push(new CConstant('Lunar mass', 'ML', 7.342e22, 'kg', '')); this.constants.push(new CConstant('Jupiter mass', 'MJ', 1.8986e27, 'kg', '')); /** Solar system object radius */ this.constants.push(new CConstant('Solar radius', 'R☉', 696342000, 'm', '')); this.constants.push(new CConstant('Earth radius', 'R⊕', 6378137, 'm', '')); this.constants.push(new CConstant('Lunar radius', 'RL', 1737400, 'm', '')); /** Particle mass */ this.constants.push(new CConstant('Electron mass', 'ML', 9.10938291e-31, 'kg', '')); this.constants.push(new CConstant('Neutron mass', 'ML', 1.67493e-27, 'kg', '')); this.constants.push(new CConstant('Proton mass', 'ML', 1.672649e-27, 'kg', '')); this.constants.forEach((/** * @param {?} element * @return {?} */ function (element) { _this[element.symbol] = element.value; })); } /** * getConstantInfo method. * * this method simply log to the console class properties and methods. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ /** * getConstantInfo method. * * this method simply log to the console class properties and methods. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} name * @return {?} */ CPhysicsConstants.prototype.getConstantInfo = /** * getConstantInfo method. * * this method simply log to the console class properties and methods. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} name * @return {?} */ function (name) { return this.constants.find((/** * @param {?} i * @return {?} */ function (i) { return i.symbol === name; })); }; // eo getConstantInfo method /** * logConstants method. * * this method simply log to the console class properties and methods. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo getConstantInfo method /** * logConstants method. * * this method simply log to the console class properties and methods. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @return {?} */ CPhysicsConstants.prototype.logConstants = // eo getConstantInfo method /** * logConstants method. * * this method simply log to the console class properties and methods. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @return {?} */ function () { console.log(this.constants); }; // eo logConstants method /** * toJSON method. * * this method return the public and protected object properties. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo logConstants method /** * toJSON method. * * this method return the public and protected object properties. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @return {?} */ CPhysicsConstants.prototype.toJSON = // eo logConstants method /** * toJSON method. * * this method return the public and protected object properties. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @return {?} */ function () { /** @type {?} */ var properties = Object.getOwnPropertyNames(this); return properties; }; // eo toJSON method /** * * Conversion helpers * */ /** * unit of length conversion helpers */ /** * meter2au method. * * this method convert meters to astronomical unit. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo toJSON method /** * * Conversion helpers * */ /** * unit of length conversion helpers */ /** * meter2au method. * * this method convert meters to astronomical unit. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.meter2au = // eo toJSON method /** * * Conversion helpers * */ /** * unit of length conversion helpers */ /** * meter2au method. * * this method convert meters to astronomical unit. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return Math.round(value / this.au * 1000000) / 1000000; }; // eo meter2au method /** * au2meter method. * * this method convert astronomical unit to meters. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo meter2au method /** * au2meter method. * * this method convert astronomical unit to meters. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.au2meter = // eo meter2au method /** * au2meter method. * * this method convert astronomical unit to meters. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return value * this.au; }; // eo au2meter method /** * au2kilometer method. * * this method convert astronomical unit to kilometers. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo au2meter method /** * au2kilometer method. * * this method convert astronomical unit to kilometers. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.au2kilometer = // eo au2meter method /** * au2kilometer method. * * this method convert astronomical unit to kilometers. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return value * this.au / 1000; }; // eo au2kilometer method /** * meter2pc method. * * this method convert meters to parsec. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo au2kilometer method /** * meter2pc method. * * this method convert meters to parsec. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.meter2pc = // eo au2kilometer method /** * meter2pc method. * * this method convert meters to parsec. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return Math.round(value / this.pc * 1000000) / 1000000; }; // eo meter2pc method /** * pc2meter method. * * this method convert parsec to meters. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo meter2pc method /** * pc2meter method. * * this method convert parsec to meters. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.pc2meter = // eo meter2pc method /** * pc2meter method. * * this method convert parsec to meters. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return value * this.pc; }; // eo pc2meter method /** * pc2kilometer method. * * this method convert parsec to kilometers. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo pc2meter method /** * pc2kilometer method. * * this method convert parsec to kilometers. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.pc2kilometer = // eo pc2meter method /** * pc2kilometer method. * * this method convert parsec to kilometers. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return value * this.pc / 1000; }; // eo pc2kilometer method /** * pc2au method. * * this method convert parsec to astronomical unit. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo pc2kilometer method /** * pc2au method. * * this method convert parsec to astronomical unit. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.pc2au = // eo pc2kilometer method /** * pc2au method. * * this method convert parsec to astronomical unit. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return this.meter2au(this.pc2meter(value)); }; // eo pc2au method /** * au2pc method. * * this method convert astronomical unit to parsec. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo pc2au method /** * au2pc method. * * this method convert astronomical unit to parsec. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.au2pc = // eo pc2au method /** * au2pc method. * * this method convert astronomical unit to parsec. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return this.meter2pc(this.au2meter(value)); }; // eo au2pc method /** * lr2pc method. * * this method convert light year unit to parsec. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo au2pc method /** * lr2pc method. * * this method convert light year unit to parsec. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.lr2pc = // eo au2pc method /** * lr2pc method. * * this method convert light year unit to parsec. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return this.meter2pc(this.lr2meter(value)); }; // eo lr2pc method /** * lr2au method. * * this method convert light year to astronomical unit. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo lr2pc method /** * lr2au method. * * this method convert light year to astronomical unit. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.lr2au = // eo lr2pc method /** * lr2au method. * * this method convert light year to astronomical unit. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return this.meter2au(this.lr2meter(value)); }; // eo lr2au method /** * lr2meter method. * * this method convert light year to meter. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo lr2au method /** * lr2meter method. * * this method convert light year to meter. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.lr2meter = // eo lr2au method /** * lr2meter method. * * this method convert light year to meter. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return value * this.lr; }; // eo lr2meter method /** * lr2kilometer method. * * this method convert light year to kilometer. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo lr2meter method /** * lr2kilometer method. * * this method convert light year to kilometer. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.lr2kilometer = // eo lr2meter method /** * lr2kilometer method. * * this method convert light year to kilometer. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return value * this.lr / 1000; }; // eo lr2kilometer method /** * meter2lr method. * * this method convert meter to light year. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo lr2kilometer method /** * meter2lr method. * * this method convert meter to light year. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.meter2lr = // eo lr2kilometer method /** * meter2lr method. * * this method convert meter to light year. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return Math.round(value / this.lr * 1000000) / 1000000; }; // eo meter2lr method /** * au2lr method. * * this method convert astronomical unit to light year. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo meter2lr method /** * au2lr method. * * this method convert astronomical unit to light year. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.au2lr = // eo meter2lr method /** * au2lr method. * * this method convert astronomical unit to light year. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return this.meter2lr(this.au2meter(value)); }; // eo au2lr method /** * pc2lr method. * * this method convert parsec to light year. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo au2lr method /** * pc2lr method. * * this method convert parsec to light year. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.pc2lr = // eo au2lr method /** * pc2lr method. * * this method convert parsec to light year. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return this.meter2lr(this.pc2meter(value)); }; // eo pc2lr method /** * unit of mass conversion helpers */ /** * kg2ev method. * * this method convert kilogram to electronvolt. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo pc2lr method /** * unit of mass conversion helpers */ /** * kg2ev method. * * this method convert kilogram to electronvolt. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.kg2ev = // eo pc2lr method /** * unit of mass conversion helpers */ /** * kg2ev method. * * this method convert kilogram to electronvolt. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return Math.round((value / this.eV * Math.pow(this.c, 2)) * 1000000) / 1000000; }; // eo kg2ev method /** * ev2kg method. * * this method convert kilogram to electronvolt using Albert Einstein formula E=mc2. * * @remarks * This method is part of the {@link core-library#Statistics | Statistics subsystem}. * * @beta */ // eo kg2ev method /** * ev2kg method. * * this method convert kilogram to electronvolt using Albert Einstein formula E=mc2. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ CPhysicsConstants.prototype.ev2kg = // eo kg2ev method /** * ev2kg method. * * this method convert kilogram to electronvolt using Albert Einstein formula E=mc2. * * \@remarks * This method is part of the {\@link core-library#Statistics | Statistics subsystem}. * * \@beta * @param {?} value * @return {?} */ function (value) { return value * this.eV / Math.pow(this.c, 2); }; // eo ev2kg method return CPhysicsConstants; }()); // eo CConstant class export { CPhysicsConstants }; if (false) { /** @type {?} */ CPhysicsConstants.prototype.constants; /* Skipping unhandled member: [index: string]: any;*/ } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN0cm9waHlzaWNzLWxpYnJhcnkucGh5c2ljcy1jb25zdGFudHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY2FiaW5mby5ldS9hc3Ryb3BoeXNpY3MtbGlicmFyeS8iLCJzb3VyY2VzIjpbImxpYi9hc3Ryb3BoeXNpY3MtbGlicmFyeS5waHlzaWNzLWNvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQ0E7SUFPSTs7Ozs7Ozs7O09BU0c7SUFFSCxtQkFBYyxJQUFZLEVBQUUsTUFBYyxFQUFFLEtBQWEsRUFBRSxJQUFZLEVBQUUsV0FBbUI7UUFDeEYsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQWEsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQVcsTUFBTSxDQUFDO1FBQzdCLElBQUksQ0FBQyxLQUFLLEdBQVksS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLEdBQWEsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQU0sV0FBVyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxpQkFBaUI7SUFDdkIsZ0JBQUM7QUFBRCxDQUFDLEFBMUJELElBMEJDLENBQUMscUJBQXFCOzs7O0lBekJuQix5QkFBb0I7O0lBQ3BCLDJCQUFzQjs7SUFDdEIsMEJBQXFCOztJQUNyQix5QkFBb0I7O0lBQ3BCLGdDQUEyQjs7O0FBdUIvQjs7O0lBS0k7Ozs7Ozs7OztPQVNHO0lBRUg7UUFBQSxpQkE2Q0M7UUExRE0sY0FBUyxHQUFrQixFQUFFLENBQUM7UUFjakMsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFFLElBQUksU0FBUyxDQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFFLENBQUUsQ0FBQztRQUNoRixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBRSxJQUFJ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Ozs7Ozs7Ozs7O0lBRUksaUNBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQVosVUFBYyxLQUFhO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBRSxDQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUUsQ0FBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUN4RixDQUFDLEVBQUMsa0JBQWtCO0lBR3BCOzs7Ozs7Ozs7T0FTRzs7Ozs7Ozs7Ozs7Ozs7SUFFSSxpQ0FBSzs7Ozs7Ozs7Ozs7Ozs7SUFBWixVQUFjLEtBQWE7UUFDdkIsT0FBTyxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFFLENBQUM7SUFDbkQsQ0FBQyxFQUFDLGtCQUFrQjtJQUd4Qix3QkFBQztBQUFELENBQUMsQUFoWkQsSUFnWkM7Ozs7O0lBN1lHLHNDQUFxQyIsInNvdXJjZXNDb250ZW50IjpbIiAgLyoqXG4gICAqIFRoaXMgY2xhc3MgZGVmaW5lIHBoeXNpY3MgY29uc3RhbnRzIGFuZCBjYWxjdWxhdGVkIHBoeXNpY3MgY29uc3RhbnRzLlxuICAgKlxuICAgKiBJbnN0YW5jaWF0aW9uIGV4YW1wbGUgOiBcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgaW5zdGFuY2UgPSBuZXcgQ1BoeXNpY3NDb25zdGFudHMoKTtcbiAgICogYGBgXG4gICAqIFxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAqICBcbiAgICogQGF1dGhvciBBbGFpbiBEZXNlaW5lXG4gICAqIFxuICAgKiBAY29weXJpZ2h0IENFSSBBbGFpbiBEZXNlaW5lIDE5OTItMjAxOVxuICAgKiBcbiAgICogQGJldGEgXG4gICAqIFxuICAgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQWxhaW4gRGVzZWluZVxuICAgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcbiAgICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZVxuICAgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLlxuICAgKiBcbiAgICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVNcbiAgICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRlxuICAgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUlxuICAgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTXG4gICAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT05cbiAgICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTlxuICAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxuICAgKiBcbiAgICovXG5cbmV4cG9ydCBjbGFzcyBDQ29uc3RhbnQge1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIHN5bWJvbDogc3RyaW5nO1xuICAgIHB1YmxpYyB2YWx1ZTogbnVtYmVyO1xuICAgIHB1YmxpYyB1bml0OiBzdHJpbmc7XG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3Rvci4gXG4gICAgICogXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoaXMgY2xhc3MgY2FsY3VsYXRlIGNhbGN1bGF0ZWQgcGh5c2ljcyBjb25zdGFudHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIHtAbGluayBjb3JlLWxpYnJhcnkjU3RhdGlzdGljcyB8IFN0YXRpc3RpY3Mgc3Vic3lzdGVtfS5cbiAgICAgKlxuICAgICAqIEBiZXRhXG4gICAgICovXG5cbiAgICBjb25zdHJ1Y3RvciAoIG5hbWU6IHN0cmluZywgc3ltYm9sOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIsIHVuaXQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyApIHtcbiAgICAgICAgLy8gU2V0IHBoeXNpY3MgY29uc3RhbnRzXG4gICAgICAgIHRoaXMubmFtZSAgICAgICAgICAgPSBuYW1lO1xuICAgICAgICB0aGlzLnN5bWJvbCAgICAgICAgID0gc3ltYm9sO1xuICAgICAgICB0aGlzLnZhbHVlICAgICAgICAgID0gdmFsdWU7XG4gICAgICAgIHRoaXMudW5pdCAgICAgICAgICAgPSB1bml0O1xuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uICAgID0gZGVzY3JpcHRpb247XG4gICAgfSAvLyBlbyBjb25zdHJ1Y3RvclxufSAvLyBlbyBDQ29uc3RhbnQgY2xhc3NcblxuZXhwb3J0IGNsYXNzIENQaHlzaWNzQ29uc3RhbnRzIHtcblxuICAgIFtpbmRleDogc3RyaW5nXTogYW55O1xuICAgIHB1YmxpYyBjb25zdGFudHM6IENDb25zdGFudFtdICAgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLiBcbiAgICAgKiBcbiAgICAgKiBUaGUgY29uc3RydWN0b3Igb2YgdGhpcyBjbGFzcyBjYWxjdWxhdGUgY2FsY3VsYXRlZCBwaHlzaWNzIGNvbnN0YW50cy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgLy8gU2V0IHBoeXNpY3MgY29uc3RhbnRzXG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdQSSBjb25zdGFudCcsICfPgCcsIE1hdGguUEksICdOb25lJywgJycgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnQ2VsZXJpdHknLCAnYycsIDI5OTc5MjQ1OCwgJ20ucy0xJywgJ0NlbGVyaXR5IG9mIGxpZ2h0IGluIHZhY2N1bScgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnUGxhbmNrIGNvbnN0YW50JywgJ2gnLCA2LjYyNjA3MDE1ZS0zNCwgJ0oucycsICdUaGUgUGxhbmNrIGNvbnN0YW50IGlzIGEgcGh5c2ljYWwgY29uc3RhbnQgdGhhdCBpcyB0aGUgcXVhbnR1bSBvZiBlbGVjdHJvbWFnbmV0aWMgYWN0aW9uLCB3aGljaCByZWxhdGVzIHRoZSBlbmVyZ3kgY2FycmllZCBieSBhIHBob3RvbiB0byBpdHMgZnJlcXVlbmN5JyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdCb2x0em1hbm4gY29uc3RhbnQnLCAnaycsIDEuMzgwNjQ4NTJlLTIzLCAnSi5LLTEnLCAnVGhlIEJvbHR6bWFubiBjb25zdGFudCAoa0Igb3IgaykgaXMgYSBwaHlzaWNhbCBjb25zdGFudCB3aGljaCByZWxhdGVzIHRoZSBhdmVyYWdlIHJlbGF0aXZlIGtpbmV0aWMgZW5lcmd5IG9mIHBhcnRpY2xlcyBpbiBhIGdhcyB3aXRoIHRoZSB0ZW1wZXJhdHVyZSBvZiB0aGUgZ2FzIGFuZCBvY2N1cnMgaW4gUGxhbmNrXFwncyBsYXcgb2YgYmxhY2stYm9keSByYWRpYXRpb24gYW5kIGluIEJvbHR6bWFublxcJ3MgZW50cm9weSBmb3JtdWxhLicgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnR3Jhdml0YXRpb25hbCBjb25zdGFudCcsICdHJywgNi42NzQwOGUtMTEsICdOLm0yLmtnLTInLCAnR3Jhdml0YXRpb25hbCBjb25zdGFudCBpcyBhbiBlbXBpcmljYWwgcGh5c2ljYWwgY29uc3RhbnQgaW52b2x2ZWQgaW4gdGhlIGNhbGN1bGF0aW9uIG9mIGdyYXZpdGF0aW9uYWwgZWZmZWN0cyBpbiBJc2FhYyBOZXd0b25cXCdzIGxhdyBvZiB1bml2ZXJzYWwgZ3Jhdml0YXRpb24gYW5kIGluIEFsYmVydCBFaW5zdGVpblxcJ3MgZ2VuZXJhbCB0aGVvcnkgb2YgcmVsYXRpdml0eS4nICkgKTsgLy8gVE9ETyBBbGFpbiA6IFbDqXJpZmllciB1bml0w6lcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0VsZW1lbnRhcnkgY2hhcmdlJywnZScsIDEuNjAyMTc2NjM0ZS0xOSwgJ0EucycsICcnICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0NvdWxvbWInLCdDJywgMSwgJ0EucycsICcnICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0F2b2dhZHJvIGNvbnN0YW50JywnTkEnLCA2LjAyMjE0MDg1NywgJ21vbC0xJywgJycgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnU3RhbmRhcmQgYWNjZWxlcmF0aW9uJywnZycsIDkuODA2NjUsICdtLnMtMicsICdTdGFuZGFyZCBhY2NlbGVyYXRpb24gZHVlIHRvIGdyYXZpdHkgb24gZWFydGgnICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0JvaHIgcmFkaXVzJywnYTAnLCAwLjUyOTE3NzIxMDkyLCAnw4UnLCAnVGhlIEJvaHIgcmFkaXVzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gdGhlIG1vc3QgcHJvYmFibGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgbnVjbGV1cyBhbmQgdGhlIGVsZWN0cm9uIGluIGEgaHlkcm9nZW4gYXRvbSBpbiBpdHMgZ3JvdW5kIHN0YXRlLiAnICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0lkZWFsIGdhcyBjb25zdGFudCcsJ1InLCA4LjMxNDQ1OTgsICdKLkstMS5tb2wtMScsICcnICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ1VuaWZpZWQgbWFzcyB1bml0IChkYWx0b24pJywndScsIDEuNjYwNTM4OTIxZS0yNywgJ2tnJywgJ1N0YW5kYXJkIHVuaXQgb2YgbWFzcyB0aGF0IHF1YW50aWZpZXMgbWFzcyBvbiBhbiBhdG9taWMgb3IgbW9sZWN1bGFyIHNjYWxlJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdWYWN1dW0gcGVybWVhYmlsaXR5JywnwrUwJywgMS4yNTY2ZS02LCAnVC5tLkEtMScsICdWYWN1dW0gcGVybWVhYmlsaXR5IGlzIHRoZSBtYWduZXRpYyBwZXJtZWFiaWxpdHkgaW4gYSBjbGFzc2ljYWwgdmFjdXVtLicgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnVmFjdXVtIHBlcm1pdHRpdml0eScsJ861MCcsIDguODU0MTg3ODJlLTEyLCAnRi5tLTEnLCAnVmFjdXVtIHBlcm1pdHRpdml0eSBpcyBhbiBpZGVhbCwgKGJhc2VsaW5lKSBwaHlzaWNhbCBjb25zdGFudCwgd2hpY2ggaXMgdGhlIHZhbHVlIG9mIHRoZSBhYnNvbHV0ZSBkaWVsZWN0cmljIHBlcm1pdHRpdml0eSBvZiBjbGFzc2ljYWwgdmFjdXVtLicgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnSW1wZWRhbmNlIG9mIGZyZWUgc3BhY2UnLCdaMCcsIDM3Ni43MzAsICfOqScsICdUaGUgaW1wZWRhbmNlIG9mIGZyZWUgc3BhY2UgZXF1YWxzIHRoZSBwcm9kdWN0IG9mIHRoZSB2YWN1dW0gcGVybWVhYmlsaXR5IM68MCBhbmQgdGhlIHNwZWVkIG9mIGxpZ2h0IGluIHZhY3V1bSBjMC4nICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0FzdHJvbm9taWNhbCB1bml0JywnYXUnLCAxNDk1OTc4NzA3MDAsICdtJywgJ0FzdHJvbm9taWNhbCB1bml0IGlzIHRoZSBkaXN0YW5jZSBmcm9tIEVhcnRoIHRvIHRoZSBTdW4nICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ1BhcnNlYycsJ3BjJywgNjQ4MDAwIC8gTWF0aC5QSSAqIDE0OTU5Nzg3MDcwMCwgJ20nLCAnVGhlIHBhcnNlYyBpcyBhIHVuaXQgb2YgbGVuZ3RoIHVzZWQgdG8gbWVhc3VyZSBsYXJnZSBkaXN0YW5jZXMgdG8gYXN0cm9ub21pY2FsIG9iamVjdHMgb3V0c2lkZSB0aGUgU29sYXIgU3lzdGVtLiBBIHBhcnNlYyBpcyBkZWZpbmVkIGFzIHRoZSBkaXN0YW5jZSBhdCB3aGljaCBvbmUgYXN0cm9ub21pY2FsIHVuaXQgc3VidGVuZHMgYW4gYW5nbGUgb2Ygb25lIGFyY3NlY29uZCxbMV0gd2hpY2ggY29ycmVzcG9uZHMgdG8gNjQ4MDAwL8+AIGFzdHJvbm9taWNhbCB1bml0cy4nICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0xpZ2h0IHllYXInLCdscicsIDk0NjA3MzA0NzI1ODA4MDAsICdtJywgJ0xpZ2h0LXllYXIgaXMgdGhlIGRpc3RhbmNlIHRoYXQgbGlnaHQgdHJhdmVscyBpbiB2YWN1dW0gaW4gb25lIEp1bGlhbiB5ZWFyICgzNjUuMjUgZGF5cykuJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdFbGVjdHJvbnZvbHQnLCdlVicsIDEuNjAyMTc2NTY1ZS0xOSwgJ0onLCAnJyApICk7XG5cbiAgICAgICAgLy8gU2V0IHBoeXNpY2FsIHF1YW50aXRpZXNcblxuICAgICAgICAvKiogU29sYXIgc3lzdGVtIG9iamVjdCBtYXNzICovXG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdTb2xhciBtYXNzJywnTeKYiScsIDEuOTg4NGUzMCwgJ2tnJywgJycgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnRWFydGggbWFzcycsJ03iipUnLCA1Ljk3MjJlMjQsICdrZycsICcnICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0x1bmFyIG1hc3MnLCdNTCcsIDcuMzQyZTIyLCAna2cnLCAnJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdKdXBpdGVyIG1hc3MnLCdNSicsIDEuODk4NmUyNywgJ2tnJywgJycgKSApO1xuXG4gICAgICAgIC8qKiBTb2xhciBzeXN0ZW0gb2JqZWN0IHJhZGl1cyAqL1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnU29sYXIgcmFkaXVzJywnUuKYiScsIDY5NjM0MjAwMCwgJ20nLCAnJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdFYXJ0aCByYWRpdXMnLCdS4oqVJywgNjM3ODEzNywgJ20nLCAnJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdMdW5hciByYWRpdXMnLCdSTCcsIDE3Mzc0MDAsICdtJywgJycgKSApO1xuXG4gICAgICAgIC8qKiBQYXJ0aWNsZSBtYXNzICovXG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdFbGVjdHJvbiBtYXNzJywnTUwnLCA5LjEwOTM4MjkxZS0zMSwgJ2tnJywgJycgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnTmV1dHJvbiBtYXNzJywnTUwnLCAxLjY3NDkzZS0yNywgJ2tnJywgJycgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnUHJvdG9uIG1hc3MnLCdNTCcsIDEuNjcyNjQ5ZS0yNywgJ2tnJywgJycgKSApO1xuXG5cbiAgICAgICAgdGhpcy5jb25zdGFudHMuZm9yRWFjaCggZWxlbWVudCA9PiB7XG4gICAgICAgICAgICB0aGlzW2VsZW1lbnQuc3ltYm9sXSAgICA9IGVsZW1lbnQudmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0Q29uc3RhbnRJbmZvIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2Qgc2ltcGx5IGxvZyB0byB0aGUgY29uc29sZSBjbGFzcyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgcHVibGljIGdldENvbnN0YW50SW5mbyggbmFtZTogc3RyaW5nICk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN0YW50cy5maW5kKCBpID0+IGkuc3ltYm9sID09PSBuYW1lICk7XG4gICAgfSAvLyBlbyBnZXRDb25zdGFudEluZm8gbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIGxvZ0NvbnN0YW50cyBtZXRob2QuIFxuICAgICAqIFxuICAgICAqIHRoaXMgbWV0aG9kIHNpbXBseSBsb2cgdG8gdGhlIGNvbnNvbGUgY2xhc3MgcHJvcGVydGllcyBhbmQgbWV0aG9kcy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgICBwdWJsaWMgbG9nQ29uc3RhbnRzKCk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZyggdGhpcy5jb25zdGFudHMgKTtcbiAgICB9IC8vIGVvIGxvZ0NvbnN0YW50cyBtZXRob2RcblxuXG4gICAgLyoqXG4gICAgICogdG9KU09OIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJuIHRoZSBwdWJsaWMgYW5kIHByb3RlY3RlZCBvYmplY3QgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyB0b0pTT04oKTogT2JqZWN0IHtcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoIHRoaXMgKTtcbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgfSAvLyBlbyB0b0pTT04gbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIENvbnZlcnNpb24gaGVscGVyc1xuICAgICAqIFxuIC