Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 3204 → Rev 3205

/trunk/widget/modules/saisie2/squelettes/js/main.js
New file
0,0 → 1,1965
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["main"],{
 
/***/ "./dist/tb-geoloc-lib/fesm5/tb-geoloc-lib.js":
/*!***************************************************!*\
!*** ./dist/tb-geoloc-lib/fesm5/tb-geoloc-lib.js ***!
\***************************************************/
/*! exports provided: TbGeolocLibModule, TbGeolocLibComponent, MapComponent, GeocodingService, ElevationService, ɵa */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
 
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TbGeolocLibModule", function() { return TbGeolocLibModule; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TbGeolocLibComponent", function() { return TbGeolocLibComponent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MapComponent", function() { return MapComponent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GeocodingService", function() { return GeocodingService; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ElevationService", function() { return ElevationService; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ɵa", function() { return OsmPlaceReadableAddressPipe; });
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! leaflet */ "./node_modules/leaflet/dist/leaflet-src.js");
/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _angular_common_http__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/common/http */ "./node_modules/@angular/common/fesm5/http.js");
/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! rxjs */ "./node_modules/rxjs/_esm5/index.js");
/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rxjs/operators */ "./node_modules/rxjs/_esm5/operators/index.js");
/* harmony import */ var _angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/compiler/src/util */ "./node_modules/@angular/compiler/src/util.js");
/* harmony import */ var _angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/fesm5/forms.js");
/* harmony import */ var leaflet_draw__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! leaflet-draw */ "./node_modules/leaflet-draw/dist/leaflet.draw.js");
/* harmony import */ var leaflet_draw__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(leaflet_draw__WEBPACK_IMPORTED_MODULE_7__);
/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @angular/common */ "./node_modules/@angular/common/fesm5/common.js");
/* harmony import */ var _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @angular/platform-browser/animations */ "./node_modules/@angular/platform-browser/fesm5/animations.js");
/* harmony import */ var _angular_platform_browser__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @angular/platform-browser */ "./node_modules/@angular/platform-browser/fesm5/platform-browser.js");
/* harmony import */ var _angular_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @angular/material */ "./node_modules/@angular/material/esm5/material.es5.js");
/* harmony import */ var _asymmetrik_ngx_leaflet__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @asymmetrik/ngx-leaflet */ "./node_modules/@asymmetrik/ngx-leaflet/dist/index.js");
/* harmony import */ var _asymmetrik_ngx_leaflet_draw__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @asymmetrik/ngx-leaflet-draw */ "./node_modules/@asymmetrik/ngx-leaflet-draw/dist/index.js");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var TbGeolocLibComponent = /** @class */ (function () {
function TbGeolocLibComponent() {
}
/**
* @return {?}
*/
TbGeolocLibComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
};
TbGeolocLibComponent.decorators = [
{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"], args: [{
selector: 'tb-geoloc-tb-geoloc-lib',
template: "",
styles: []
},] },
];
/** @nocollapse */
TbGeolocLibComponent.ctorParameters = function () { return []; };
return TbGeolocLibComponent;
}());
 
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* GeoPoint
*
* https://github.com/perfectline/geopoint
*
* Authors :
* Tanel Suurhans (http://twitter.com/tanelsuurhans)
* Tarmo Lehtpuu (http://twitter.com/tarmolehtpuu)
*
* License :
* Copyright 2011 by PerfectLine LLC (http://www.perfectline.ee) and is released under the MIT license.
*/
/** @type {?} */
var GeoPoint = function (lon, lat) {
switch (typeof (lon)) {
case 'number':
this.lonDeg = this.dec2deg(lon, this.MAX_LON);
this.lonDec = lon;
break;
case 'string':
if (this.decode(lon)) {
this.lonDeg = lon;
}
this.lonDec = this.deg2dec(lon, this.MAX_LON);
break;
}
switch (typeof (lat)) {
case 'number':
this.latDeg = this.dec2deg(lat, this.MAX_LAT);
this.latDec = lat;
break;
case 'string':
if (this.decode(lat)) {
this.latDeg = lat;
}
this.latDec = this.deg2dec(lat, this.MAX_LAT);
break;
}
};
GeoPoint.prototype = {
CHAR_DEG: '\u00B0',
CHAR_MIN: '\u0027',
CHAR_SEC: '\u0022',
CHAR_SEP: '\u0020',
MAX_LON: 180,
MAX_LAT: 90,
// decimal
lonDec: NaN,
latDec: NaN,
// degrees
lonDeg: NaN,
latDeg: NaN,
dec2deg: function (value, max) {
/** @type {?} */
var sign = value < 0 ? -1 : 1;
/** @type {?} */
var abs = Math.abs(Math.round(value * 1000000));
if (abs > (max * 1000000)) {
return NaN;
}
/** @type {?} */
var dec = abs % 1000000 / 1000000;
/** @type {?} */
var deg = Math.floor(abs / 1000000) * sign;
/** @type {?} */
var min = Math.floor(dec * 60);
/** @type {?} */
var sec = (dec - min / 60) * 3600;
/** @type {?} */
var result = '';
result += deg;
result += this.CHAR_DEG;
result += this.CHAR_SEP;
result += min;
result += this.CHAR_MIN;
result += this.CHAR_SEP;
result += sec.toFixed(2);
result += this.CHAR_SEC;
return result;
},
deg2dec: function (value) {
/** @type {?} */
var matches = this.decode(value);
if (!matches) {
return NaN;
}
/** @type {?} */
var deg = parseFloat(matches[1]);
/** @type {?} */
var min = parseFloat(matches[2]);
/** @type {?} */
var sec = parseFloat(matches[3]);
if (isNaN(deg) || isNaN(min) || isNaN(sec)) {
return NaN;
}
return deg + (min / 60.0) + (sec / 3600);
},
decode: function (value) {
/** @type {?} */
var pattern = '';
// deg
pattern += '(-?\\d+)';
pattern += this.CHAR_DEG;
pattern += '\\s*';
// min
pattern += '(\\d+)';
pattern += this.CHAR_MIN;
pattern += '\\s*';
// sec
pattern += '(\\d+(?:\\.\\d+)?)';
pattern += this.CHAR_SEC;
return value.match(new RegExp(pattern));
},
getLonDec: function () {
return this.lonDec;
},
getLatDec: function () {
return this.latDec;
},
getLonDeg: function () {
return this.lonDeg;
},
getLatDeg: function () {
return this.latDeg;
}
};
 
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/** *
*
* \@param lat
* \@param lng
* \@param dragend callback
@type {?} */
var draggableMarker = function (lat, lng, dragend) {
/** @type {?} */
var simpleIcon = simpleIconMarker();
/** @type {?} */
var marker$$1 = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["marker"])([lat, lng], { icon: simpleIcon, draggable: true });
marker$$1.on('dragend', function (event) { return dragend(event); });
return marker$$1;
};
/** *
*
@type {?} */
var simpleIconMarker = function () {
return Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["icon"])({
iconUrl: './assets/img/map/marker-icon.png',
shadowUrl: './assets/img/map/marker-shadow.png',
iconAnchor: [13, 40]
});
};
/** *
*
@type {?} */
var drawControlPanel = new leaflet__WEBPACK_IMPORTED_MODULE_1__["Control"].Draw({
position: 'topleft',
draw: {
marker: { icon: simpleIconMarker() },
polyline: {},
polygon: { showArea: true, metric: false },
rectangle: false,
circle: false,
circlemarker: false
}
});
/**
*
* @param {?} editedLayer
* @return {?}
*/
function drawControlEditPanel(editedLayer) {
return new leaflet__WEBPACK_IMPORTED_MODULE_1__["Control"].Draw({
position: 'topleft',
draw: {
marker: false,
polyline: false,
polygon: false,
rectangle: false,
circle: false,
circlemarker: false
},
edit: {
featureGroup: editedLayer,
// this panel id editing editedLayer
edit: {},
remove: {}
}
});
}
/** *
*
@type {?} */
var circleMarkerStyle = {
radius: 6,
fillColor: '#ff7800',
color: '#000',
weight: 1,
opacity: 1,
fillOpacity: 0.8
};
/** *
*
@type {?} */
var cityStyle = {
color: '#ff7800',
weight: 5,
opacity: 0.65
};
/** *
*
@type {?} */
var gpsPhotoMarkerIcon = function () {
return Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["icon"])({
iconUrl: './assets/img/map/photo-marker-icon.png',
shadowUrl: './assets/img/map/marker-shadow.png',
iconSize: [33, 41],
// size of the icon
// shadowSize: [50, 64], // size of the shadow
iconAnchor: [13, 40],
// point of the icon which will correspond to marker's location
// shadowAnchor: [4, 62], // the same for the shadow
popupAnchor: [5, -41] // point from which the popup should open relative to the iconAnchor
});
};
 
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* Auto format a DMS coordinates
* eg. user can enter 43 0 14.77
* and the formatter returns 43° 0' 14.77"
* + avoid enter non numeric (or . ,) characters
* + force entire numbers for degrees and minutes
* @param {?} dmsStr
* @return {?}
*/
function dmsFormatter(dmsStr) {
try {
// replace multiples spaces
dmsStr = dmsStr.replace(/\s\s+/g, ' ');
// replace space at first position
if (dmsStr.charAt(0) === ' ') {
dmsStr = dmsStr.slice(1, dmsStr.length - 1);
}
// replace , by .
dmsStr = dmsStr.replace(',', '.');
// delete all non numeric characters
dmsStr = dmsStr.replace(/[^0-9\-.,°\'"\s]/g, '');
/** @type {?} */
var nbSpaces = void 0;
/** @type {?} */
var degChr = '';
/** @type {?} */
var minChr = '';
/** @type {?} */
var secChr = '';
/** @type {?} */
var v = dmsStr.split(' ');
// remove last space od input string
if (dmsStr.charAt(dmsStr.length - 1) === ' ') {
v = v.slice(0, v.length - 1);
}
// remove last item of v array if it's empty
if (v[v.length - 1] === '') {
v = v.slice(0, v.length - 1);
}
if (v.length === 1) {
degChr = v[0];
// degChr must be an entire number
if (degChr.indexOf('.') !== -1) {
degChr = degChr.slice(0, degChr.indexOf('.'));
}
// between -90 & +90
if (Number(degChr) < -90) {
degChr = '-90';
}
if (Number(degChr) > 90) {
degChr = '90';
}
}
if (v.length === 2) {
degChr = v[0];
minChr = v[1];
if (degChr.indexOf('.') !== -1) {
degChr = degChr.slice(0, degChr.indexOf('.'));
}
if (minChr.indexOf('.') !== -1) {
minChr = minChr.slice(0, degChr.indexOf('.'));
}
if (Number(degChr) < -90) {
degChr = '-90';
}
if (Number(degChr) > 90) {
degChr = '90';
}
if (Number(minChr) < -90) {
minChr = '-90';
}
if (Number(minChr) > 90) {
minChr = '90';
}
}
if (v.length === 3) {
degChr = v[0];
minChr = v[1];
secChr = v[2];
if (degChr.indexOf('.') !== -1) {
degChr = degChr.slice(0, degChr.indexOf('.'));
}
if (minChr.indexOf('.') !== -1) {
minChr = minChr.slice(0, degChr.indexOf('.'));
}
if (Number(degChr) < -90) {
degChr = '-90';
}
if (Number(degChr) > 90) {
degChr = '90';
}
if (Number(minChr) < -90) {
minChr = '-90';
}
if (Number(minChr) > 90) {
minChr = '90';
}
}
if (v.length >= 4) {
v = v.slice(0, 2);
if (degChr.indexOf('.') !== -1) {
degChr = degChr.slice(0, degChr.indexOf('.'));
}
if (minChr.indexOf('.') !== -1) {
minChr = minChr.slice(0, degChr.indexOf('.'));
}
if (Number(degChr) < -90) {
degChr = '-90';
}
if (Number(degChr) > 90) {
degChr = '90';
}
if (Number(minChr) < -90) {
minChr = '-90';
}
if (Number(minChr) > 90) {
minChr = '90';
}
}
try {
nbSpaces = dmsStr.match(/\s/g).length;
}
catch (e) {
nbSpaces = 0;
}
if (nbSpaces === 0 && v.length === 1) ;
else if (nbSpaces === 1 && v.length >= 1) {
degChr = degChr.replace(' ', '');
if (degChr.slice(degChr.length - 1, degChr.length) !== '°') {
degChr += '° ';
}
else {
degChr += ' ';
}
}
else if (nbSpaces === 2 && v.length >= 2) {
degChr = degChr.replace(' ', '');
minChr = minChr.replace(' ', '');
if (degChr.slice(degChr.length - 1, degChr.length) !== '°') {
degChr += '° ';
}
else {
degChr += ' ';
}
if (minChr.slice(minChr.length - 1, minChr.length) !== '\'') {
minChr += '\' ';
}
else {
minChr += ' ';
}
}
else if (nbSpaces === 3 && v.length >= 3) {
degChr = degChr.replace(' ', '');
minChr = minChr.replace(' ', '');
secChr = secChr.replace(' ', '');
if (degChr.slice(degChr.length - 1, degChr.length) !== '°') {
degChr += '° ';
}
else {
degChr += ' ';
}
if (minChr.slice(minChr.length - 1, minChr.length) !== '\'') {
minChr += '\' ';
}
else {
minChr += ' ';
}
if (secChr.slice(secChr.length - 1, secChr.length) !== '"') {
secChr += '"';
}
}
else {
throw { error: 'Can\'t manage input string.' };
}
return degChr + minChr + secChr;
}
catch (e) {
return dmsStr;
}
}
 
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var GeocodingService = /** @class */ (function () {
function GeocodingService(http) {
this.http = http;
}
/**
* @param {?} address
* @return {?}
*/
GeocodingService.prototype.geocode = /**
* @param {?} address
* @return {?}
*/
function (address) {
if (address === null) {
return Object(rxjs__WEBPACK_IMPORTED_MODULE_3__["empty"])();
}
/** @type {?} */
var url = "https://nominatim.openstreetmap.org/?format=json&addressdetails=1&q=" + address + "&format=json&limit=10&polygon_geojson=1";
return this.http.get(url).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["map"])(function (obj) { return obj; }));
};
/**
* @param {?} lat
* @param {?} lng
* @return {?}
*/
GeocodingService.prototype.reverse = /**
* @param {?} lat
* @param {?} lng
* @return {?}
*/
function (lat, lng) {
/** @type {?} */
var url = "https://nominatim.openstreetmap.org/reverse?format=json&lat=" + lat + "&lon=" + lng + "&polygon_geojson=1";
return this.http.get(url).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["map"])(function (obj) { return obj; }));
};
/**
* @param {?} osmPlaceResult
* @return {?}
*/
GeocodingService.prototype.getReadbleAddress = /**
* @param {?} osmPlaceResult
* @return {?}
*/
function (osmPlaceResult) {
/** @type {?} */
var locality = null;
/** @type {?} */
var subLocality = null;
/** @type {?} */
var road = null;
/** @type {?} */
var neighbourhood = null;
// Get "city" information (I mean city or something similar like village)
if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.city)) {
locality = osmPlaceResult.address.city;
}
else if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.town)) {
locality = osmPlaceResult.address.town;
}
else if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.village)) {
locality = osmPlaceResult.address.village;
}
else if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.hamlet)) {
locality = osmPlaceResult.address.hamlet;
}
// Get suburbr & if not defined : postcode
if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.suburb) && Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.postcode) && locality !== null) {
subLocality = osmPlaceResult.address.suburb + ', ' + osmPlaceResult.address.postcode;
}
else if (!Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.suburb) && Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.postcode) && locality !== null) {
subLocality = osmPlaceResult.address.postcode;
}
// Get "road"
if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.road)) {
road = osmPlaceResult.address.road;
}
else if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.pedestrian)) {
road = osmPlaceResult.address.pedestrian;
}
// Get neighbourhood
if (Object(_angular_compiler_src_util__WEBPACK_IMPORTED_MODULE_5__["isDefined"])(osmPlaceResult.address.neighbourhood)) {
neighbourhood = osmPlaceResult.address.neighbourhood;
}
// Return
if (road && neighbourhood && subLocality && locality) {
return road + ' (' + neighbourhood + ') ' + subLocality + ' ' + locality;
}
else if (road && !neighbourhood && subLocality && locality) {
return road + ' ' + subLocality + ' ' + locality;
}
else if (!road && neighbourhood && subLocality && locality) {
return neighbourhood + ' ' + subLocality + ' ' + locality;
}
else if (!road && !neighbourhood && subLocality && locality) {
return subLocality + ' ' + locality;
}
else if (!road && !neighbourhood && !subLocality && locality) {
return locality;
}
else {
return osmPlaceResult.display_name;
}
};
/**
* @param {?} osmClassFilter
* @param {?} osmResults
* @return {?}
*/
GeocodingService.prototype.osmClassFilter = /**
* @param {?} osmClassFilter
* @param {?} osmResults
* @return {?}
*/
function (osmClassFilter, osmResults) {
/** @type {?} */
var osmFilteredResults = [];
if (osmClassFilter.length > 0 && osmResults.length > 0) {
osmResults.forEach(function (osmItem) {
/** @type {?} */
var filterMatchOccurence = 0;
/** @type {?} */
var removeOccurence = false;
osmClassFilter.forEach(function (osmFilterItem) {
/** @type {?} */
var _class = osmFilterItem.split(':')[0];
/** @type {?} */
var _type = osmFilterItem.split(':')[1];
if (_type === '*') {
if (osmItem.class === _class) {
filterMatchOccurence++;
}
}
else {
// if !, remove
if (_type.substr(0, 1) === '!') {
if (osmItem.class === _class && '!' + osmItem.type === _type) {
removeOccurence = true;
}
}
else {
if (osmItem.class === _class && osmItem.type === _type) {
filterMatchOccurence++;
}
}
}
});
if (filterMatchOccurence > 0 && !removeOccurence) {
osmFilteredResults.push(osmItem);
}
});
return Object(rxjs__WEBPACK_IMPORTED_MODULE_3__["of"])(osmFilteredResults);
}
else {
return Object(rxjs__WEBPACK_IMPORTED_MODULE_3__["of"])(osmResults);
}
};
/**
* @param {?} coordinatesArray
* @return {?}
*/
GeocodingService.prototype.reverseCorrdinatesArray = /**
* @param {?} coordinatesArray
* @return {?}
*/
function (coordinatesArray) {
if (coordinatesArray.length > 0) {
coordinatesArray.forEach(function (item) {
item.reverse();
});
return coordinatesArray;
}
};
/**
* @param {?} coordinatesArray
* @return {?}
*/
GeocodingService.prototype.simplifyPolyline = /**
* @param {?} coordinatesArray
* @return {?}
*/
function (coordinatesArray) {
if (coordinatesArray.length > 1) {
/** @type {?} */
var firstCoordinate = coordinatesArray[0];
/** @type {?} */
var lastCoordinate = coordinatesArray[coordinatesArray.length - 1];
return [firstCoordinate, lastCoordinate];
}
else {
return coordinatesArray;
}
};
GeocodingService.decorators = [
{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"], args: [{
providedIn: 'root'
},] },
];
/** @nocollapse */
GeocodingService.ctorParameters = function () { return [
{ type: _angular_common_http__WEBPACK_IMPORTED_MODULE_2__["HttpClient"] }
]; };
/** @nocollapse */ GeocodingService.ngInjectableDef = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["defineInjectable"])({ factory: function GeocodingService_Factory() { return new GeocodingService(Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["inject"])(_angular_common_http__WEBPACK_IMPORTED_MODULE_2__["HttpClient"])); }, token: GeocodingService, providedIn: "root" });
return GeocodingService;
}());
 
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var ElevationService = /** @class */ (function () {
function ElevationService(http) {
this.http = http;
}
/**
* @param {?} lat
* @param {?} lng
* @return {?}
*/
ElevationService.prototype.getElevation = /**
* @param {?} lat
* @param {?} lng
* @return {?}
*/
function (lat, lng) {
/** @type {?} */
var apiUrl = "https://api.open-elevation.com/api/v1/lookup?locations=" + lat + "," + lng;
return this.http.get(apiUrl).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["map"])(function (obj) { return obj.results[0].elevation; }));
};
ElevationService.decorators = [
{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"], args: [{
providedIn: 'root'
},] },
];
/** @nocollapse */
ElevationService.ctorParameters = function () { return [
{ type: _angular_common_http__WEBPACK_IMPORTED_MODULE_2__["HttpClient"] }
]; };
/** @nocollapse */ ElevationService.ngInjectableDef = Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["defineInjectable"])({ factory: function ElevationService_Factory() { return new ElevationService(Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["inject"])(_angular_common_http__WEBPACK_IMPORTED_MODULE_2__["HttpClient"])); }, token: ElevationService, providedIn: "root" });
return ElevationService;
}());
 
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var MapComponent = /** @class */ (function () {
// ----
// CODE
// ----
function MapComponent(fb, geocodeService, elevationService) {
this.fb = fb;
this.geocodeService = geocodeService;
this.elevationService = elevationService;
// --------------
// INPUT / OUTPUT
// --------------
this.layersToAdd = ['osm'];
this.osmClassFilter = [];
this.location = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
this.coordFormat = 'dms';
// ---------
// VARIABLES
// ---------
this._location = /** @type {?} */ ({});
this.geolocatedPhotoLatLngData = [];
this.geolocatedPhotoLatLngDisplayedColumnsTable = ['select', 'photoName', 'lat', 'lng', 'altitude'];
this.isLoadingAddress = false;
this.isLoadingLatitude = false;
this.isLoadingLongitude = false;
this.isLoadingElevation = false;
// -------------
// SUBSCRIPTIONS
// -------------
this.geoSearchSubscription = new rxjs__WEBPACK_IMPORTED_MODULE_3__["Subscription"];
this.latDmsInputSubscription = new rxjs__WEBPACK_IMPORTED_MODULE_3__["Subscription"];
this.lngDmsInputSubscription = new rxjs__WEBPACK_IMPORTED_MODULE_3__["Subscription"];
this.mapLat = 0;
this.mapLng = 0;
this.osmLayer = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["tileLayer"])('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 18, attribution: 'Open Street map' });
this.googleSatelliteLayer = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["tileLayer"])('http://{s}.google.com/vt/lyrs=s&x={x}&y={y}&z={z}', { maxZoom: 20, subdomains: ['mt0', 'mt1', 'mt2', 'mt3'], attribution: 'Google maps' });
this.googleHybridLayer = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["tileLayer"])('http://{s}.google.com/vt/lyrs=s,h&x={x}&y={y}&z={z}', { maxZoom: 20, subdomains: ['mt0', 'mt1', 'mt2', 'mt3'], attribution: 'Google maps' });
this.brgmLayer = leaflet__WEBPACK_IMPORTED_MODULE_1__["tileLayer"].wms('http://geoservices.brgm.fr/geologie', { version: '1.3.0', layers: 'Geologie' });
this.mapLayers = {
'Google': this.googleHybridLayer,
'OSM': this.osmLayer,
'BRGM': this.brgmLayer
};
this.geoResultsLayer = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["geoJSON"])(null, { style: function () { return { color: '#ff7800', weight: 5, opacity: 0.65 }; } });
this.geolocatedPhotoLatLngLayer = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["geoJSON"])();
// map options
this.options = {
layers: [this.osmLayer],
zoom: 4,
center: Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["latLng"])({ lat: 46.55886030311719, lng: 2.9882812500000004 })
};
// Leaflet map configuration
this.drawnItems = new leaflet__WEBPACK_IMPORTED_MODULE_1__["FeatureGroup"]();
this.drawControlFull = drawControlPanel;
this.drawControlEdit = drawControlEditPanel(this.drawnItems);
this.circleMarkerOpt = circleMarkerStyle;
this.geoResultsOpt = cityStyle;
}
/**
* - Create the forms
* - Set up subscriptions (geo search, geolocated photos, lat / lng inputs)
*/
/**
* - Create the forms
* - Set up subscriptions (geo search, geolocated photos, lat / lng inputs)
* @return {?}
*/
MapComponent.prototype.ngOnInit = /**
* - Create the forms
* - Set up subscriptions (geo search, geolocated photos, lat / lng inputs)
* @return {?}
*/
function () {
var _this = this;
// Create forms
this.latlngFormGroup = this.fb.group({
latInput: this.fb.control('', [_angular_forms__WEBPACK_IMPORTED_MODULE_6__["Validators"].required, this.latLngDecValidator]),
lngInput: this.fb.control('', [_angular_forms__WEBPACK_IMPORTED_MODULE_6__["Validators"].required, this.latLngDecValidator]),
dmsLatInput: this.fb.control('', [_angular_forms__WEBPACK_IMPORTED_MODULE_6__["Validators"].required, this.latLngDmsValidator]),
dmsLngInput: this.fb.control('', [_angular_forms__WEBPACK_IMPORTED_MODULE_6__["Validators"].required, this.latLngDmsValidator])
});
this.elevationFormGroup = this.fb.group({
elevationInput: this.fb.control('', null)
});
this.geoSearchFormGroup = this.fb.group({
placeInput: this.fb.control('', null)
});
// Watch placeInput changes
this.geoSearchSubscription = this.geoSearchFormGroup.controls["placeInput"].valueChanges
.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["debounceTime"])(400), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["distinctUntilChanged"])(), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_4__["switchMap"])(function (value) {
_this.isLoadingAddress = true;
return _this.geocodeService.geocode(value);
})).subscribe(function (results) {
_this.isLoadingAddress = false;
// filter results if needed
if (_this.osmClassFilter.length > 0) {
_this.geocodeService.osmClassFilter(_this.osmClassFilter, results).subscribe(function (filteredResults) {
_this.geoSearchResults = filteredResults;
});
}
else {
_this.geoSearchResults = results;
}
}, function (error) {
// @toto manage error
// @toto manage error
_this.isLoadingAddress = false;
});
// Watch geolocated photo input changes
this.geolocatedPhotoLatLng.subscribe(function (photoLatLng) {
// @todo clear this.geolocatedPhotoLatLngLayer
// @todo clear this.geolocatedPhotoLatLngLayer
_this.geolocatedPhotoLatLngData = photoLatLng;
// For each geolocated photo, add marker and bind mouse event on thoses markers
// For each geolocated photo, add marker and bind mouse event on thoses markers
_this.geolocatedPhotoLatLngData.forEach(function (data) {
/** @type {?} */
var _latDms = data.lat.deg + '° ' + data.lat.min + '\'' + data.lat.sec + '"';
/** @type {?} */
var _lngDms = data.lng.deg + '° ' + data.lng.min + '\'' + data.lng.sec + '"';
/** @type {?} */
var g = new GeoPoint(_lngDms, _latDms);
data.latDec = g.latDec;
data.lngDec = g.lonDec;
/** @type {?} */
var latLng$$1 = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["latLng"])(data.latDec, data.lngDec);
/** @type {?} */
var gpsPhotoMarker = new leaflet__WEBPACK_IMPORTED_MODULE_1__["Marker"](latLng$$1, { icon: gpsPhotoMarkerIcon() });
/** @type {?} */
var html = "\n <b>Fichier \"" + data.photoName + "\"</b><br>\n Lat. : " + g.latDeg + "<br />\n Lng. : " + g.lonDeg + "<br />\n Alt. : " + data.altitude + " m<br /><br />\n <b>Cliquez sur le point pour utiliser ces coordonn\u00E9es</b>";
gpsPhotoMarker.bindPopup(html).openPopup();
// Marker mouse events
gpsPhotoMarker.on('click', (function (event) { _this.gpsMarkerSetValues(data.latDec, data.lngDec, data.altitude); }));
gpsPhotoMarker.on('mouseover', function (event) { gpsPhotoMarker.openPopup(); });
gpsPhotoMarker.on('mouseout', (function (event) { gpsPhotoMarker.closePopup(); }));
// Add the marker to the map
gpsPhotoMarker.addTo(_this.geolocatedPhotoLatLngLayer);
});
// Fit map to geolocated photos markers
// Fit map to geolocated photos markers
_this.flyToGeolocatedPhotoItems();
});
// Watch lat & lng DMS inputs changes and set up the DMS formatter
// The DMS formatter restricts the keyboard input of the user : only number, comma, dot and '-', deg and min must be between -90 and +90
// The formatter auto fill the ° ' and " characters to help the user input
this.latDmsInputSubscription = this.latlngFormGroup.controls["dmsLatInput"].valueChanges.subscribe(function (value) {
_this.latlngFormGroup.controls["dmsLatInput"].setValue(dmsFormatter(value), { emitEvent: false });
});
this.lngDmsInputSubscription = this.latlngFormGroup.controls["dmsLngInput"].valueChanges.subscribe(function (value) {
_this.latlngFormGroup.controls["dmsLngInput"].setValue(dmsFormatter(value), { emitEvent: false });
});
};
/**
* Unsubscribe
*/
/**
* Unsubscribe
* @return {?}
*/
MapComponent.prototype.ngOnDestroy = /**
* Unsubscribe
* @return {?}
*/
function () {
this.geoSearchSubscription.unsubscribe();
this.latDmsInputSubscription.unsubscribe();
this.lngDmsInputSubscription.unsubscribe();
};
/**
* Add layers and events listeners
*/
/**
* Add layers and events listeners
* @param {?} map
* @return {?}
*/
MapComponent.prototype.onMapReady = /**
* Add layers and events listeners
* @param {?} map
* @return {?}
*/
function (map$$1) {
var _this = this;
this.map = map$$1;
this.map.addControl(leaflet__WEBPACK_IMPORTED_MODULE_1__["control"].layers(null, this.mapLayers, { position: 'topright' }));
this.map.addLayer(this.drawnItems);
this.map.addLayer(this.geoResultsLayer);
this.map.addLayer(this.geolocatedPhotoLatLngLayer);
this.map.addControl(this.drawControlFull);
this.map.on('draw:created', function (e) {
_this.drawnItem = e['layer'];
_this.drawType = e['layerType'];
// If it's a marker, it must be draggable. By default, leaflet.draw module does not provide a draggable marker
// So, we don't do a this.drawnItems.addLayer(layer);
// We just draw a new draggableMarker instead
if (_this.drawType === 'marker') {
/** @type {?} */
var latlng = _this.drawnItem._latlng;
draggableMarker(latlng.lat, latlng.lng, function (dragEnd) { _this.callGeolocElevationApisUsingLatLngInputsValues(); }).addTo(_this.drawnItems);
}
else {
_this.drawnItems.addLayer(_this.drawnItem);
}
// Show / hide control panels
// if ONE item is drawn, set place and elevation inputs (call API)
if (_this.drawnItems.getLayers().length > 0) {
_this.setMapEditMode();
}
if (_this.drawnItems.getLayers().length === 1) {
_this.callGeolocElevationApisUsingLatLngInputsValues();
}
_this.flyToDrawnItems();
});
this.map.on('draw:edited', function (e) {
_this.drawnItem = e['layer'];
_this.drawType = e['layerType'];
// this.drawnItems.addLayer(this.drawnItem);
if (_this.drawnItems.getLayers().length === 1) {
_this.callGeolocElevationApisUsingLatLngInputsValues();
}
_this.flyToDrawnItems();
});
this.map.on('draw:deleted', function (e) {
_this.clearGeoResultsLayer();
_this.clearDrawnItemsLayer();
_this.setMapDrawMode();
_this.clearForm();
});
this.redrawMap(100);
};
/**
* When the map parent's div size change (eg. panel width), have to redraw the map
* Sometimes (when opening / closing a tab), size change is detected too earlier, need to set a delay (about 10-100ms seems to be convenient)
*/
/**
* When the map parent's div size change (eg. panel width), have to redraw the map
* Sometimes (when opening / closing a tab), size change is detected too earlier, need to set a delay (about 10-100ms seems to be convenient)
* @param {?=} delay
* @return {?}
*/
MapComponent.prototype.redrawMap = /**
* When the map parent's div size change (eg. panel width), have to redraw the map
* Sometimes (when opening / closing a tab), size change is detected too earlier, need to set a delay (about 10-100ms seems to be convenient)
* @param {?=} delay
* @return {?}
*/
function (delay) {
var _this = this;
if (delay) {
window.setTimeout(function () { return _this.map.invalidateSize(); }, delay);
}
else {
this.map.invalidateSize();
}
};
/**
* Show the "edit" toolbar inside map
*/
/**
* Show the "edit" toolbar inside map
* @return {?}
*/
MapComponent.prototype.setMapEditMode = /**
* Show the "edit" toolbar inside map
* @return {?}
*/
function () {
this.map.removeControl(this.drawControlFull);
this.map.addControl(this.drawControlEdit);
};
/**
* Show the "draw" toolbar inside map
*/
/**
* Show the "draw" toolbar inside map
* @return {?}
*/
MapComponent.prototype.setMapDrawMode = /**
* Show the "draw" toolbar inside map
* @return {?}
*/
function () {
this.map.removeControl(this.drawControlEdit);
this.map.addControl(this.drawControlFull);
};
/**
* Set map bounds to drawn items
*/
/**
* Set map bounds to drawn items
* @param {?=} _maxZoom
* @return {?}
*/
MapComponent.prototype.flyToDrawnItems = /**
* Set map bounds to drawn items
* @param {?=} _maxZoom
* @return {?}
*/
function (_maxZoom) {
if (_maxZoom === void 0) { _maxZoom = 14; }
/** @type {?} */
var b = this.drawnItems.getBounds();
this.map.flyToBounds(b, { maxZoom: _maxZoom, animate: false });
};
/**
* Set map bounds to geo reults items
*/
/**
* Set map bounds to geo reults items
* @return {?}
*/
MapComponent.prototype.flyToGeoResultsItems = /**
* Set map bounds to geo reults items
* @return {?}
*/
function () {
/** @type {?} */
var b = this.geoResultsLayer.getBounds();
this.map.flyToBounds(b, { maxZoom: 14, animate: false });
};
/**
* Set map bounds to geolocated photos items
*/
/**
* Set map bounds to geolocated photos items
* @return {?}
*/
MapComponent.prototype.flyToGeolocatedPhotoItems = /**
* Set map bounds to geolocated photos items
* @return {?}
*/
function () {
/** @type {?} */
var b = this.geolocatedPhotoLatLngLayer.getBounds();
this.map.flyToBounds(b, { maxZoom: 14, animate: false });
};
/**
* Draw a marker on drawItems featureGroup with DMS input values
*/
/**
* Draw a marker on drawItems featureGroup with DMS input values
* @return {?}
*/
MapComponent.prototype.addMarkerFromDmsCoord = /**
* Draw a marker on drawItems featureGroup with DMS input values
* @return {?}
*/
function () {
// clear drawn items layer
this.clearDrawnItemsLayer();
// update map toolbar
this.setMapEditMode();
/** @type {?} */
var geopoint = new GeoPoint(this.latlngFormGroup.controls["dmsLngInput"].value, this.latlngFormGroup.controls["dmsLatInput"].value);
draggableMarker(geopoint.getLatDec(), geopoint.getLonDec(), function (e) {
/* dragend callback fn */
}).addTo(this.drawnItems);
// Set (decimal) latLng inputs
this.latlngFormGroup.controls["latInput"].setValue(geopoint.getLatDec(), { emitEvent: false });
this.latlngFormGroup.controls["lngInput"].setValue(geopoint.getLatDec(), { emitEvent: false });
// Fly
this.flyToDrawnItems();
};
/**
* Draw a marker on drawItems featureGroup with decimal input values
*/
/**
* Draw a marker on drawItems featureGroup with decimal input values
* @return {?}
*/
MapComponent.prototype.addMarkerFromLatLngCoord = /**
* Draw a marker on drawItems featureGroup with decimal input values
* @return {?}
*/
function () {
// clear drawn items layer
this.clearDrawnItemsLayer();
// update map toolbar
this.setMapEditMode();
/** @type {?} */
var geopoint = new GeoPoint(Number(this.latlngFormGroup.controls["lngInput"].value), Number(this.latlngFormGroup.controls["latInput"].value));
draggableMarker(geopoint.getLatDec(), geopoint.getLonDec(), function (dragEnd) {
/* dragend callback fn */
}).addTo(this.drawnItems);
// Set dmsLatLng inputs
this.latlngFormGroup.controls["dmsLatInput"].setValue(geopoint.getLatDeg(), { emitEvent: false });
this.latlngFormGroup.controls["dmsLngInput"].setValue(geopoint.getLonDeg(), { emitEvent: false });
// Fly
this.flyToDrawnItems();
};
/**
*
*/
/**
*
* @param {?} coordinates
* @return {?}
*/
MapComponent.prototype.addPolyline = /**
*
* @param {?} coordinates
* @return {?}
*/
function (coordinates) {
// clear drawn items layer
this.clearDrawnItemsLayer();
// update map toolbar
this.setMapEditMode();
/** @type {?} */
var polyline$$1 = Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["polyline"])(coordinates);
polyline$$1.addTo(this.drawnItems);
// fly with max zoom
this.flyToDrawnItems(18);
};
/**
* Take latitude and longitude input values and call geocoding and elevation API
* Sometimes you may want to force the elevation value and avoid calling elevation API (eg. elevation come from gps photo metadata)
* then, you cas use the avoidCallingElevationApi option
*
* What is done inside this function :
* - create an observable that zip all required observables
* - do a switchmap on the main observable so that if one one the sub-observable change, old data are ignored
* - when the main observable is finished, can send new location Output
*
* Several if / else avoidCallingElevationApi are used because when
* avoidCallingElevationApi === false, httpTasks returns a single value (osmPlace)
* whereas if avoidCallingElevationApi === true, httpTasks returns an array of 2 values [elevation, osmPlace]
*/
/**
* Take latitude and longitude input values and call geocoding and elevation API
* Sometimes you may want to force the elevation value and avoid calling elevation API (eg. elevation come from gps photo metadata)
* then, you cas use the avoidCallingElevationApi option
*
* What is done inside this function :
* - create an observable that zip all required observables
* - do a switchmap on the main observable so that if one one the sub-observable change, old data are ignored
* - when the main observable is finished, can send new location Output
*
* Several if / else avoidCallingElevationApi are used because when
* avoidCallingElevationApi === false, httpTasks returns a single value (osmPlace)
* whereas if avoidCallingElevationApi === true, httpTasks returns an array of 2 values [elevation, osmPlace]
* @param {?=} avoidCallingElevationApi
* @param {?=} avoidCallingGeolocApi
* @return {?}
*/
MapComponent.prototype.callGeolocElevationApisUsingLatLngInputsValues = /**
* Take latitude and longitude input values and call geocoding and elevation API
* Sometimes you may want to force the elevation value and avoid calling elevation API (eg. elevation come from gps photo metadata)
* then, you cas use the avoidCallingElevationApi option
*
* What is done inside this function :
* - create an observable that zip all required observables
* - do a switchmap on the main observable so that if one one the sub-observable change, old data are ignored
* - when the main observable is finished, can send new location Output
*
* Several if / else avoidCallingElevationApi are used because when
* avoidCallingElevationApi === false, httpTasks returns a single value (osmPlace)
* whereas if avoidCallingElevationApi === true, httpTasks returns an array of 2 values [elevation, osmPlace]
* @param {?=} avoidCallingElevationApi
* @param {?=} avoidCallingGeolocApi
* @return {?}
*/
function (avoidCallingElevationApi, avoidCallingGeolocApi) {
var _this = this;
if (avoidCallingElevationApi === void 0) { avoidCallingElevationApi = false; }
if (avoidCallingGeolocApi === void 0) { avoidCallingGeolocApi = false; }
this.setLatLngInputFromDrawnItems();
this.setLatLngDmsInputFromDrawnItems();
/** @type {?} */
var httpTasks;
/** @type {?} */
var elevation;
/** @type {?} */
var osmPlace;
if (avoidCallingElevationApi && !avoidCallingGeolocApi) {
httpTasks = this.reverseGeocodingFromInputValue();
}
else if (avoidCallingGeolocApi && !avoidCallingElevationApi) {
httpTasks = this.getElevationFromInputValue();
}
else if (!avoidCallingElevationApi && !avoidCallingGeolocApi) {
httpTasks = Object(rxjs__WEBPACK_IMPORTED_MODULE_3__["zip"])(this.getElevationFromInputValue(), this.reverseGeocodingFromInputValue());
}
else if (avoidCallingElevationApi && avoidCallingGeolocApi) {
// nothing to do ; throw or log an error ?
return;
}
// spinnners on
this.isLoadingAddress = !avoidCallingGeolocApi;
this.isLoadingElevation = !avoidCallingElevationApi;
httpTasks.subscribe(function (result) {
_this.isLoadingElevation = false;
_this.isLoadingAddress = false;
if (avoidCallingElevationApi && !avoidCallingGeolocApi) {
elevation = null;
osmPlace = result;
}
else if (avoidCallingGeolocApi && !avoidCallingElevationApi) {
elevation = result;
osmPlace = null;
elevation = result;
}
else if (!avoidCallingGeolocApi && !avoidCallingGeolocApi) {
elevation = result[0];
osmPlace = result[1];
}
// Set elevation input
if (!avoidCallingElevationApi) {
_this.elevationFormGroup.controls["elevationInput"].setValue(elevation);
}
// Patch place input value
if (!avoidCallingGeolocApi) {
_this.geoSearchFormGroup.controls["placeInput"].patchValue(_this.geocodeService.getReadbleAddress(osmPlace), { emitEvent: false });
}
// bind _location & emit location
if (avoidCallingElevationApi) {
_this.bindLocationOutput([_this.elevationFormGroup.controls["elevationInput"].value, osmPlace]);
}
else {
_this.bindLocationOutput(result);
}
}, function (error) {
// Manage error
// spinnners off
// Manage error
// spinnners off
_this.isLoadingAddress = false;
_this.isLoadingElevation = false;
});
};
/**
* Should be improved for complex polygons / polylines ?
* Could use turf.js
*/
/**
* Should be improved for complex polygons / polylines ?
* Could use turf.js
* @return {?}
*/
MapComponent.prototype.setLatLngInputFromDrawnItems = /**
* Should be improved for complex polygons / polylines ?
* Could use turf.js
* @return {?}
*/
function () {
/** @type {?} */
var centroid = this.drawnItems.getBounds().getCenter();
this.latlngFormGroup.controls["latInput"].setValue(centroid.lat);
this.latlngFormGroup.controls["lngInput"].setValue(centroid.lng);
};
/**
*
*/
/**
*
* @return {?}
*/
MapComponent.prototype.setLatLngDmsInputFromDrawnItems = /**
*
* @return {?}
*/
function () {
/** @type {?} */
var centroid = this.drawnItems.getBounds().getCenter();
/** @type {?} */
var geopoint = new GeoPoint(centroid.lng, centroid.lat);
this.latlngFormGroup.controls["dmsLatInput"].patchValue(geopoint.getLatDeg());
this.latlngFormGroup.controls["dmsLngInput"].patchValue(geopoint.getLonDeg());
};
/**
*
*/
/**
*
* @return {?}
*/
MapComponent.prototype.getElevationFromInputValue = /**
*
* @return {?}
*/
function () {
return this.elevationService.getElevation(this.latlngFormGroup.controls["latInput"].value, this.latlngFormGroup.controls["lngInput"].value);
};
/**
* Reverse geocoding from lat / lng inputs values
*/
/**
* Reverse geocoding from lat / lng inputs values
* @return {?}
*/
MapComponent.prototype.reverseGeocodingFromInputValue = /**
* Reverse geocoding from lat / lng inputs values
* @return {?}
*/
function () {
return this.geocodeService.reverse(this.latlngFormGroup.controls["latInput"].value, this.latlngFormGroup.controls["lngInput"].value);
};
/**
* Latitude / longitude DMS form Validator
*/
/**
* Latitude / longitude DMS form Validator
* @param {?} control
* @return {?}
*/
MapComponent.prototype.latLngDmsValidator = /**
* Latitude / longitude DMS form Validator
* @param {?} control
* @return {?}
*/
function (control$$1) {
/** @type {?} */
var regexp = new RegExp('^(\\-)?[0-9]{1,2}\\° [0-9]{1,2}\\\' [0-9]{1,2}\\.[0-9]{1,12}\\"');
return regexp.test(control$$1.value) ? null : { malformedLatLngDmsFormat: true };
};
/**
* Latitude / longitude decimal form validator
*/
/**
* Latitude / longitude decimal form validator
* @param {?} control
* @return {?}
*/
MapComponent.prototype.latLngDecValidator = /**
* Latitude / longitude decimal form validator
* @param {?} control
* @return {?}
*/
function (control$$1) {
/** @type {?} */
var regexp = new RegExp('^(\\-)?[0-9]{1,2}\\.[0-9]{1,20}');
return regexp.test(control$$1.value) ? null : { malformedLatLngDecFormat: true };
};
/**
* When user select an address within the autocomplete results list
*
* Call the geoloc API 2 times :
* - first call is for reverse geocoding
* - second call is for geoconding, so the address input (placeInput) is updated
*/
/**
* When user select an address within the autocomplete results list
*
* Call the geoloc API 2 times :
* - first call is for reverse geocoding
* - second call is for geoconding, so the address input (placeInput) is updated
* @param {?} event
* @return {?}
*/
MapComponent.prototype.addressSelectedChanged = /**
* When user select an address within the autocomplete results list
*
* Call the geoloc API 2 times :
* - first call is for reverse geocoding
* - second call is for geoconding, so the address input (placeInput) is updated
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var osmPlace = event.option.value;
/** @type {?} */
var southWest = new leaflet__WEBPACK_IMPORTED_MODULE_1__["LatLng"](osmPlace.boundingbox[0], osmPlace.boundingbox[2]);
/** @type {?} */
var northEast = new leaflet__WEBPACK_IMPORTED_MODULE_1__["LatLng"](osmPlace.boundingbox[1], osmPlace.boundingbox[3]);
this.map.fitBounds(Object(leaflet__WEBPACK_IMPORTED_MODULE_1__["latLngBounds"])(southWest, northEast));
// Add geojson to the map (if user enter a city, draw the administrative shape on the map)
this.clearGeoResultsLayer();
this.geoResultsLayer.addData(osmPlace.geojson);
// Fly
this.flyToGeoResultsItems();
// Patch input value
this.geoSearchFormGroup.controls["placeInput"].patchValue(this.geocodeService.getReadbleAddress(osmPlace), { emitEvent: false });
/** @type {?} */
var g = new GeoPoint(Number(osmPlace.lon), Number(osmPlace.lat));
this.latlngFormGroup.controls["latInput"].setValue(osmPlace.lat, { emitEvent: false });
this.latlngFormGroup.controls["lngInput"].setValue(osmPlace.lon, { emitEvent: false });
this.latlngFormGroup.controls["dmsLatInput"].setValue(g.getLatDeg(), { emitEvent: false });
this.latlngFormGroup.controls["dmsLngInput"].setValue(g.getLonDeg(), { emitEvent: false });
this.elevationFormGroup.controls["elevationInput"].setValue(osmPlace.elevation, { emitEvent: false });
// Draw a polyline or place a marker at the center of a polygon
if (osmPlace.geojson.type === 'LineString') {
// osm geojson coordinates is like [[long, lat], [long, lat], ...]
// but leaflet needs [[lat, long], [lat, long], ...] format !
this.geocodeService.simplifyPolyline(osmPlace.geojson.coordinates);
this.addPolyline(/** @type {?} */ (this.geocodeService.reverseCorrdinatesArray(this.geocodeService.simplifyPolyline(osmPlace.geojson.coordinates))));
this.clearGeoResultsLayer();
}
else {
this.addMarkerFromLatLngCoord();
}
// Call geoloc and elevation APIs
this.callGeolocElevationApisUsingLatLngInputsValues(false, false);
};
/**
* Clear the form when nedded : 'draw:deleted', etc.
*/
/**
* Clear the form when nedded : 'draw:deleted', etc.
* @return {?}
*/
MapComponent.prototype.clearForm = /**
* Clear the form when nedded : 'draw:deleted', etc.
* @return {?}
*/
function () {
this.latlngFormGroup.controls["latInput"].setValue('', { emitEvent: false });
this.latlngFormGroup.controls["lngInput"].setValue('', { emitEvent: false });
this.latlngFormGroup.controls["dmsLatInput"].setValue('', { emitEvent: false });
this.latlngFormGroup.controls["dmsLngInput"].setValue('', { emitEvent: false });
this.latlngFormGroup.reset();
this.elevationFormGroup.controls["elevationInput"].setValue('', { emitEvent: false });
this.elevationFormGroup.reset();
this.geoSearchFormGroup.controls["placeInput"].setValue('', { emitEvent: false });
};
/**
* Clear geoResults layer (eg this layer contains administrative polygons -- "commune")
*/
/**
* Clear geoResults layer (eg this layer contains administrative polygons -- "commune")
* @return {?}
*/
MapComponent.prototype.clearGeoResultsLayer = /**
* Clear geoResults layer (eg this layer contains administrative polygons -- "commune")
* @return {?}
*/
function () {
this.geoResultsLayer.clearLayers();
};
/**
*
*/
/**
*
* @return {?}
*/
MapComponent.prototype.clearDrawnItemsLayer = /**
*
* @return {?}
*/
function () {
this.drawnItems.clearLayers();
};
/**
*
*/
/**
*
* @return {?}
*/
MapComponent.prototype.resetLocation = /**
*
* @return {?}
*/
function () {
this.location = null;
};
/**
* Bind data from elevation and OSM http results to this._location
* Perform some verifications to ensure data integrity
* @param data data[0] = elevation, data[1] = osm data | data = osm data
*/
/**
* Bind data from elevation and OSM http results to this._location
* Perform some verifications to ensure data integrity
* @param {?} data data[0] = elevation, data[1] = osm data | data = osm data
* @return {?}
*/
MapComponent.prototype.bindLocationOutput = /**
* Bind data from elevation and OSM http results to this._location
* Perform some verifications to ensure data integrity
* @param {?} data data[0] = elevation, data[1] = osm data | data = osm data
* @return {?}
*/
function (data) {
/** @type {?} */
var elevation;
/** @type {?} */
var osmPlace;
if (Array.isArray(data)) {
elevation = data[0];
osmPlace = data[1];
}
else {
elevation = this.elevationFormGroup.controls["elevationInput"].value;
osmPlace = data;
}
this._location.geometry = this.drawnItems.toGeoJSON();
// geodatum
this._location.elevation = elevation;
this._location.localityConsistency = this._location.localityConsistency ? true : null; // perform : Cohérence entre les coordonnées et la localité
this._location.locationAccuracy = this._location.locationAccuracy ? 0 : null; // perform : Précision (ou incertitude) de la localisation, en mètres --> voir le nombre de décimales pour decLatInput ou decLngInput si point, sinon, demi-longeur de la bounding-box
// published_location : Précision géographique à laquelle est publiée l'obs, permet de gérer le floutage - Précise, Localité, Maille 10x10km
this._location.osmCountry = osmPlace.address.country;
this._location.osmCountryCode = osmPlace.address.country_code;
this._location.osmCounty = osmPlace.address.county;
this._location.osmPostcode = osmPlace.address.postcode;
if (osmPlace.address.city) {
this._location.locality = osmPlace.address.city;
}
if (osmPlace.address.town) {
this._location.locality = osmPlace.address.town;
}
if (osmPlace.address.village) {
this._location.locality = osmPlace.address.village;
}
this._location.sublocality = osmPlace.hamlet;
this._location.osmRoad = osmPlace.address.road;
this._location.osmState = osmPlace.address.state;
this._location.osmSuburb = osmPlace.address.suburb;
this._location.osmId = osmPlace.osm_id;
this._location.osmNeighbourhood = null; // not provided by nominatim
this._location.osmPlaceId = osmPlace.place_id;
this._location.publishedLocation = null; // perform
this._location.station = null; // perform
// Verifications
// @todo
// Emit
this.location.next(this._location);
};
/**
* Change the form coordinates format : 'decimal' or 'dms'
*/
/**
* Change the form coordinates format : 'decimal' or 'dms'
* @param {?} format
* @return {?}
*/
MapComponent.prototype.setLatLngInputFormat = /**
* Change the form coordinates format : 'decimal' or 'dms'
* @param {?} format
* @return {?}
*/
function (format) {
if (format !== 'decimal' && format !== 'dms') {
return;
}
this.coordFormat = format;
};
/**
* Set inputs values, add a marker and call API for a geolocated photo
*/
/**
* Set inputs values, add a marker and call API for a geolocated photo
* @param {?} latDec
* @param {?} lngDec
* @param {?} elevation
* @return {?}
*/
MapComponent.prototype.gpsMarkerSetValues = /**
* Set inputs values, add a marker and call API for a geolocated photo
* @param {?} latDec
* @param {?} lngDec
* @param {?} elevation
* @return {?}
*/
function (latDec, lngDec, elevation) {
// set inputs values
this.latlngFormGroup.controls["latInput"].setValue(latDec);
this.latlngFormGroup.controls["lngInput"].setValue(lngDec);
this.elevationFormGroup.controls["elevationInput"].setValue(elevation);
// add marker
this.addMarkerFromLatLngCoord();
// call APIs
this.callGeolocElevationApisUsingLatLngInputsValues(true, false);
// clear geolocated photos layer
this.geolocatedPhotoLatLngLayer.clearLayers();
};
/**
* @param {?} value
* @return {?}
*/
MapComponent.prototype.latLngDmsAutoFormatter = /**
* @param {?} value
* @return {?}
*/
function (value) {
return '';
};
MapComponent.decorators = [
{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"], args: [{
selector: 'tb-geoloc-map',
template: "<h1>O\u00F9 ?</h1>\n \n<div id=\"geoloc-map\">\n <div id=\"geoloc-map-meta\">\n <!-- geosearch autocomplete -->\n <mat-form-field style=\"width: 100%;\">\n <input matInput [formControl]=\"geoSearchFormGroup.controls.placeInput\" placeholder=\"Trouver un lieu\" aria-label=\"Trouver un lieu\" [matAutocomplete]=\"auto\">\n <mat-spinner *ngIf=\"isLoadingAddress\" diameter=\"20\" matSuffix></mat-spinner>\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"addressSelectedChanged($event)\">\n <mat-option *ngFor=\"let address of geoSearchResults\" [value]=\"address\">\n <span>{{ address | osmPlaceReadableAddress }}</span>\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n \n <div class=\"geolocationInputs\">\n <div [formGroup]=\"latlngFormGroup\">\n <div class=\"latLngMenuInputs\">\n <!-- latitude / longitude decimal format -->\n <div *ngIf=\"coordFormat=='decimal'\">\n <!-- latitude / longitude format selection --> \n <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n\n <mat-form-field>\n <input matInput formControlName=\"latInput\" placeholder=\"latitude\">\n <mat-spinner *ngIf=\"isLoadingLatitude\" diameter=\"20\" matSuffix></mat-spinner>\n <mat-error *ngIf=\"latlngFormGroup.controls.latInput.dirty && latlngFormGroup.controls.latInput.hasError('malformedLatLngDecFormat')\">Format non valide</mat-error>\n </mat-form-field>\n <mat-form-field>\n <input matInput formControlName=\"lngInput\" placeholder=\"longitude\">\n <mat-spinner *ngIf=\"isLoadingLongitude\" diameter=\"20\" matSuffix></mat-spinner>\n <mat-error *ngIf=\"latlngFormGroup.controls.latInput.dirty && latlngFormGroup.controls.latInput.hasError('malformedLatLngDecFormat')\">Format non valide</mat-error>\n </mat-form-field>\n \n <button mat-icon-button (click)=\"addMarkerFromLatLngCoord(); callGeolocElevationApisUsingLatLngInputsValues();\" [disabled]=\"!latlngFormGroup.controls.latInput.valid || !latlngFormGroup.controls.lngInput.valid\" color=\"primary\">\n <mat-icon matTooltip=\"Utiliser ces coordonn\u00E9es\">where_to_vote</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- menu format decimal / dms-->\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"setLatLngInputFormat('dms')\">Degr\u00E9s minutes secondes</button>\n <button mat-menu-item (click)=\"setLatLngInputFormat('decimal')\">D\u00E9cimal</button>\n </mat-menu>\n\n <!-- latitude / longitude DMS format -->\n <div *ngIf=\"coordFormat=='dms'\">\n <!-- latitude / longitude format selection --> \n <button mat-icon-button [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n\n <mat-form-field>\n <input matInput formControlName=\"dmsLatInput\" placeholder=\"(deg)\u00B0 (min)' (sec)&quot;\">\n <span matPrefix>N&nbsp;</span>\n <mat-spinner *ngIf=\"isLoadingLatitude\" diameter=\"20\" matSuffix></mat-spinner>\n <mat-error *ngIf=\"latlngFormGroup.controls.dmsLatInput.dirty && latlngFormGroup.controls.dmsLatInput.hasError('malformedLatLngDmsFormat')\">Format non valide</mat-error>\n </mat-form-field>\n\n <mat-form-field>\n <input matInput formControlName=\"dmsLngInput\" placeholder=\"(deg)\u00B0 (min)' (sec)&quot;\">\n <span matPrefix>E&nbsp;</span>\n <mat-spinner *ngIf=\"isLoadingLongitude\" diameter=\"20\" matSuffix></mat-spinner>\n <mat-error *ngIf=\"latlngFormGroup.controls.dmsLatInput.dirty && latlngFormGroup.controls.dmsLatInput.hasError('malformedLatLngDmsFormat')\">Format non valide</mat-error>\n </mat-form-field>\n\n <button mat-icon-button (click)=\"addMarkerFromDmsCoord(); callGeolocElevationApisUsingLatLngInputsValues();\" [disabled]=\"!latlngFormGroup.controls.dmsLatInput.valid || !latlngFormGroup.controls.dmsLngInput.valid\" color=\"primary\">\n <mat-icon matTooltip=\"Utiliser ces coordonn\u00E9es\">where_to_vote</mat-icon>\n </button>\n </div>\n </div>\n \n <!-- elevation -->\n <div [formGroup]=\"elevationFormGroup\">\n <mat-form-field style=\"width: 100px;\">\n <input matInput formControlName=\"elevationInput\" placeholder=\"altitude\">\n <mat-spinner *ngIf=\"isLoadingElevation\" diameter=\"20\" matSuffix></mat-spinner>\n <span *ngIf=\"!isLoadingElevation\" matSuffix>m</span>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <div id=\"geoloc-map-draw\" style=\"height: 400px;\"\n leaflet \n [leafletOptions]=\"options\"\n (leafletMapReady)=\"onMapReady($event)\">\n </div>\n</div>",
styles: ["[hidden]{display:none!important}#geoloc-map{display:flex;flex-direction:column;min-height:200px}#geoloc-map #geoloc-map-meta{flex:1;padding:15px}#geoloc-map #geoloc-map-meta .geolocationInputs{display:flex;flex-direction:row;justify-content:space-between}#geoloc-map #geoloc-map-draw{position:relative;flex:3}#geoloc-map #httpTasksRunningSpinner{flex:1}button .mini{min-width:0;line-height:30px}.geolocatedPhotoMetadataTable{width:100%}"]
},] },
];
/** @nocollapse */
MapComponent.ctorParameters = function () { return [
{ type: _angular_forms__WEBPACK_IMPORTED_MODULE_6__["FormBuilder"] },
{ type: GeocodingService },
{ type: ElevationService }
]; };
MapComponent.propDecorators = {
layersToAdd: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
geolocatedPhotoLatLng: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
osmClassFilter: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"] }],
location: [{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"] }]
};
return MapComponent;
}());
 
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* To show an address to the user, we could use the display_name attribute returned by nominatim
* This attribute is far complicated to read (road, neighbourhood, suburb, town, city, postcode, county, country, etc.)
* This pipe use the getReadbleAddress() function of geocode service to show minimal information about the address returned by nominatim API
*/
var OsmPlaceReadableAddressPipe = /** @class */ (function () {
function OsmPlaceReadableAddressPipe(geocodeService) {
this.geocodeService = geocodeService;
}
/**
* @param {?} value
* @param {?=} args
* @return {?}
*/
OsmPlaceReadableAddressPipe.prototype.transform = /**
* @param {?} value
* @param {?=} args
* @return {?}
*/
function (value, args) {
return this.geocodeService.getReadbleAddress(value);
};
OsmPlaceReadableAddressPipe.decorators = [
{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["Pipe"], args: [{
name: 'osmPlaceReadableAddress'
},] },
];
/** @nocollapse */
OsmPlaceReadableAddressPipe.ctorParameters = function () { return [
{ type: GeocodingService }
]; };
return OsmPlaceReadableAddressPipe;
}());
 
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var TbGeolocLibModule = /** @class */ (function () {
function TbGeolocLibModule() {
}
TbGeolocLibModule.decorators = [
{ type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["NgModule"], args: [{
imports: [
_angular_common__WEBPACK_IMPORTED_MODULE_8__["CommonModule"],
_angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_9__["BrowserAnimationsModule"],
_angular_platform_browser__WEBPACK_IMPORTED_MODULE_10__["BrowserModule"],
_angular_common_http__WEBPACK_IMPORTED_MODULE_2__["HttpClientModule"],
_angular_material__WEBPACK_IMPORTED_MODULE_11__["MatSelectModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatInputModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatAutocompleteModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatProgressSpinnerModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatTooltipModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatChipsModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatIconModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatButtonModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatRadioModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatProgressBarModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatMenuModule"], _angular_material__WEBPACK_IMPORTED_MODULE_11__["MatTableModule"],
_asymmetrik_ngx_leaflet__WEBPACK_IMPORTED_MODULE_12__["LeafletModule"].forRoot(), _asymmetrik_ngx_leaflet_draw__WEBPACK_IMPORTED_MODULE_13__["LeafletDrawModule"].forRoot(),
_angular_forms__WEBPACK_IMPORTED_MODULE_6__["FormsModule"],
_angular_forms__WEBPACK_IMPORTED_MODULE_6__["ReactiveFormsModule"]
],
declarations: [TbGeolocLibComponent, MapComponent, OsmPlaceReadableAddressPipe],
exports: [TbGeolocLibComponent, MapComponent]
},] },
];
return TbGeolocLibModule;
}());
 
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
 
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
 
 
 
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGItZ2VvbG9jLWxpYi5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vdGItZ2VvbG9jLWxpYi9saWIvdGItZ2VvbG9jLWxpYi5jb21wb25lbnQudHMiLCJuZzovL3RiLWdlb2xvYy1saWIvbGliL19oZWxwZXJzL2dlb0NvbnZlcnQudHMiLCJuZzovL3RiLWdlb2xvYy1saWIvbGliL19oZWxwZXJzL2xlYWZsZXRPYmplY3RzLnRzIiwibmc6Ly90Yi1nZW9sb2MtbGliL2xpYi9faGVscGVycy9kbXNUb29scy50cyIsIm5nOi8vdGItZ2VvbG9jLWxpYi9saWIvX3NlcnZpY2VzL2dlb2NvZGluZy5zZXJ2aWNlLnRzIiwibmc6Ly90Yi1nZW9sb2MtbGliL2xpYi9fc2VydmljZXMvZWxldmF0aW9uLnNlcnZpY2UudHMiLCJuZzovL3RiLWdlb2xvYy1saWIvbGliL21hcC9tYXAuY29tcG9uZW50LnRzIiwibmc6Ly90Yi1nZW9sb2MtbGliL2xpYi9fcGlwZXMvb3NtLXBsYWNlLXJlYWRhYmxlLWFkZHJlc3MucGlwZS50cyIsIm5nOi8vdGItZ2VvbG9jLWxpYi9saWIvdGItZ2VvbG9jLWxpYi5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGItZ2VvbG9jLXRiLWdlb2xvYy1saWInLFxuICB0ZW1wbGF0ZTogYGAsXG4gIHN0eWxlczogW11cbn0pXG5leHBvcnQgY2xhc3MgVGJHZW9sb2NMaWJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gIH1cblxufVxuIiwiLyoqXG4gKiBHZW9Qb2ludFxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9wZXJmZWN0bGluZS9nZW9wb2ludFxuICpcbiAqIEF1dGhvcnMgOlxuICogVGFuZWwgU3V1cmhhbnMgKGh0dHA6Ly90d2l0dGVyLmNvbS90YW5lbHN1dXJoYW5zKVxuICogVGFybW8gTGVodHB1dSAoaHR0cDovL3R3aXR0ZXIuY29tL3Rhcm1vbGVodHB1dSlcbiAqXG4gKiBMaWNlbnNlIDpcbiAqIENvcHlyaWdodCAyMDExIGJ5IFBlcmZlY3RMaW5lIExMQyAoaHR0cDovL3d3dy5wZXJmZWN0bGluZS5lZSkgYW5kIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuXG5leHBvcnQgY29uc3QgR2VvUG9pbnQgPSBmdW5jdGlvbihsb24sIGxhdCkge1xuXG5cbiAgc3dpdGNoICh0eXBlb2YobG9uKSkge1xuXG4gICAgICBjYXNlICdudW1iZXInOlxuXG4gICAgICAgICAgdGhpcy5sb25EZWcgPSB0aGlzLmRlYzJkZWcobG9uLCB0aGlzLk1BWF9MT04pO1xuICAgICAgICAgIHRoaXMubG9uRGVjID0gbG9uO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3N0cmluZyc6XG5cbiAgICAgICAgICBpZiAodGhpcy5kZWNvZGUobG9uKSkge1xuICAgICAgICAgICAgICB0aGlzLmxvbkRlZyA9IGxvbjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmxvbkRlYyA9IHRoaXMuZGVnMmRlYyhsb24sIHRoaXMuTUFYX0xPTik7XG5cbiAgICAgICAgICBicmVhaztcbiAgfVxuXG4gIHN3aXRjaCAodHlwZW9mKGxhdCkpIHtcblxuICAgICAgY2FzZSAnbnVtYmVyJzpcblxuICAgICAgICAgIHRoaXMubGF0RGVnID0gdGhpcy5kZWMyZGVnKGxhdCwgdGhpcy5NQVhfTEFUKTtcbiAgICAgICAgICB0aGlzLmxhdERlYyA9IGxhdDtcblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzdHJpbmcnOlxuXG4gICAgICAgICAgaWYgKHRoaXMuZGVjb2RlKGxhdCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5sYXREZWcgPSBsYXQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5sYXREZWMgPSB0aGlzLmRlZzJkZWMobGF0LCB0aGlzLk1BWF9MQVQpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgfVxufTtcblxuR2VvUG9pbnQucHJvdG90eXBlID0ge1xuXG4gIENIQVJfREVHIDogJ1xcdTAwQjAnLFxuICBDSEFSX01JTiA6ICdcXHUwMDI3JyxcbiAgQ0hBUl9TRUMgOiAnXFx1MDAyMicsXG4gIENIQVJfU0VQIDogJ1xcdTAwMjAnLFxuXG4gIE1BWF9MT046IDE4MCxcbiAgTUFYX0xBVDogOTAsXG5cbiAgLy8gZGVjaW1hbFxuICBsb25EZWM6IE5hTixcbiAgbGF0RGVjOiBOYU4sXG5cbiAgLy8gZGVncmVlc1xuICBsb25EZWc6IE5hTixcbiAgbGF0RGVnOiBOYU4sXG5cbiAgZGVjMmRlZzogZnVuY3Rpb24odmFsdWUsIG1heCkge1xuXG4gICAgICBjb25zdCBzaWduID0gdmFsdWUgPCAwID8gLTEgOiAxO1xuXG4gICAgICBjb25zdCBhYnMgPSBNYXRoLmFicyhNYXRoLnJvdW5kKHZhbHVlICogMTAwMDAwMCkpO1xuXG4gICAgICBpZiAoYWJzID4gKG1heCAqIDEwMDAwMDApKSB7XG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVjID0gYWJzICUgMTAwMDAwMCAvIDEwMDAwMDA7XG4gICAgICBjb25zdCBkZWcgPSBNYXRoLmZsb29yKGFicyAvIDEwMDAwMDApICogc2lnbjtcbiAgICAgIGNvbnN0IG1pbiA9IE1hdGguZmxvb3IoZGVjICogNjApO1xuICAgICAgY29uc3Qgc2VjID0gKGRlYyAtIG1pbiAvIDYwKSAqIDM2MDA7XG5cbiAgICAgIGxldCByZXN1bHQgPSAnJztcblxuICAgICAgcmVzdWx0ICs9IGRlZztcbiAgICAgIHJlc3VsdCArPSB0aGlzLkNIQVJfREVHO1xuICAgICAgcmVzdWx0ICs9IHRoaXMuQ0hBUl9TRVA7XG4gICAgICByZXN1bHQgKz0gbWluO1xuICAgICAgcmVzdWx0ICs9IHRoaXMuQ0hBUl9NSU47XG4gICAgICByZXN1bHQgKz0gdGhpcy5DSEFSX1NFUDtcbiAgICAgIHJlc3VsdCArPSBzZWMudG9GaXhlZCgyKTtcbiAgICAgIHJlc3VsdCArPSB0aGlzLkNIQVJfU0VDO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gIH0sXG5cbiAgZGVnMmRlYzogZnVuY3Rpb24odmFsdWUpIHtcblxuICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuZGVjb2RlKHZhbHVlKTtcblxuICAgICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVnID0gcGFyc2VGbG9hdChtYXRjaGVzWzFdKTtcbiAgICAgIGNvbnN0IG1pbiA9IHBhcnNlRmxvYXQobWF0Y2hlc1syXSk7XG4gICAgICBjb25zdCBzZWMgPSBwYXJzZUZsb2F0KG1hdGNoZXNbM10pO1xuXG4gICAgICBpZiAoaXNOYU4oZGVnKSB8fCBpc05hTihtaW4pIHx8IGlzTmFOKHNlYykpIHtcbiAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVnICsgKG1pbiAvIDYwLjApICsgKHNlYyAvIDM2MDApO1xuICB9LFxuXG4gIGRlY29kZTogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGxldCBwYXR0ZXJuID0gJyc7XG5cbiAgICAgIC8vIGRlZ1xuICAgICAgcGF0dGVybiArPSAnKC0/XFxcXGQrKSc7XG4gICAgICBwYXR0ZXJuICs9IHRoaXMuQ0hBUl9ERUc7XG4gICAgICBwYXR0ZXJuICs9ICdcXFxccyonO1xuXG4gICAgICAvLyBtaW5cbiAgICAgIHBhdHRlcm4gKz0gJyhcXFxcZCspJztcbiAgICAgIHBhdHRlcm4gKz0gdGhpcy5DSEFSX01JTjtcbiAgICAgIHBhdHRlcm4gKz0gJ1xcXFxzKic7XG5cbiAgICAgIC8vIHNlY1xuICAgICAgcGF0dGVybiArPSAnKFxcXFxkKyg/OlxcXFwuXFxcXGQrKT8pJztcbiAgICAgIHBhdHRlcm4gKz0gdGhpcy5DSEFSX1NFQztcblxuICAgICAgcmV0dXJuIHZhbHVlLm1hdGNoKG5ldyBSZWdFeHAocGF0dGVybikpO1xuICB9LFxuXG4gIGdldExvbkRlYzogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb25EZWM7XG4gIH0sXG5cbiAgZ2V0TGF0RGVjOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhdERlYztcbiAgfSxcblxuICBnZXRMb25EZWc6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubG9uRGVnO1xuICB9LFxuXG4gIGdldExhdERlZzogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYXREZWc7XG4gIH1cblxufTtcbiIsIi8qKlxuICpcbiAqL1xuXG5pbXBvcnQgKiBhcyBMIGZyb20gJ2xlYWZsZXQnO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gbGF0XG4gKiBAcGFyYW0gbG5nXG4gKiBAcGFyYW0gZHJhZ2VuZCBjYWxsYmFja1xuICovXG5leHBvcnQgY29uc3QgZHJhZ2dhYmxlTWFya2VyID0gZnVuY3Rpb24obGF0OiBudW1iZXIsIGxuZzogbnVtYmVyLCBkcmFnZW5kOiBGdW5jdGlvbik6IEwuTWFya2VyIHtcbiAgY29uc3Qgc2ltcGxlSWNvbiA9IHNpbXBsZUljb25NYXJrZXIoKTtcbiAgY29uc3QgbWFya2VyID0gTC5tYXJrZXIoW2xhdCwgbG5nXSwge2ljb246IHNpbXBsZUljb24sIGRyYWdnYWJsZTogdHJ1ZX0pO1xuICBtYXJrZXIub24oJ2RyYWdlbmQnLCBmdW5jdGlvbihldmVudCkgeyByZXR1cm4gZHJhZ2VuZChldmVudCk7IH0pO1xuICByZXR1cm4gbWFya2VyO1xufTtcblxuLyoqXG4gKlxuICovXG5leHBvcnQgY29uc3Qgc2ltcGxlSWNvbk1hcmtlciA9IGZ1bmN0aW9uKCk6IEwuSWNvbiB7XG4gIHJldHVybiBMLmljb24oe1xuICAgIGljb25Vcmw6ICcuL2Fzc2V0cy9pbWcvbWFwL21hcmtlci1pY29uLnBuZycsXG4gICAgc2hhZG93VXJsOiAnLi9hc3NldHMvaW1nL21hcC9tYXJrZXItc2hhZG93LnBuZycsXG4gICAgaWNvbkFuY2hvcjogWzEzLCA0MF1cbiAgfSk7XG59O1xuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBkcmF3Q29udHJvbFBhbmVsID0gbmV3IEwuQ29udHJvbC5EcmF3KHtcbiAgcG9zaXRpb246ICd0b3BsZWZ0JyxcbiAgZHJhdzoge1xuICAgIG1hcmtlcjogeyBpY29uOiBzaW1wbGVJY29uTWFya2VyKCkgfSxcbiAgICBwb2x5bGluZToge30sXG4gICAgcG9seWdvbjogeyBzaG93QXJlYTogdHJ1ZSwgbWV0cmljOiBmYWxzZSB9LFxuICAgIHJlY3RhbmdsZTogZmFsc2UsXG4gICAgY2lyY2xlOiBmYWxzZSxcbiAgICBjaXJjbGVtYXJrZXI6IGZhbHNlXG4gIH1cbn0pO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gZWRpdGVkTGF5ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyYXdDb250cm9sRWRpdFBhbmVsKGVkaXRlZExheWVyKSB7XG4gIHJldHVybiBuZXcgTC5Db250cm9sLkRyYXcoe1xuICAgIHBvc2l0aW9uOiAndG9wbGVmdCcsXG4gICAgZHJhdzoge1xuICAgICAgbWFya2VyOiBmYWxzZSxcbiAgICAgIHBvbHlsaW5lOiBmYWxzZSxcbiAgICAgIHBvbHlnb246IGZhbHNlLFxuICAgICAgcmVjdGFuZ2xlOiBmYWxzZSxcbiAgICAgIGNpcmNsZTogZmFsc2UsXG4gICAgICBjaXJjbGVtYXJrZXI6IGZhbHNlXG4gICAgfSxcbiAgICBlZGl0OiB7XG4gICAgICBmZWF0dXJlR3JvdXA6IGVkaXRlZExheWVyLCAvLyB0aGlzIHBhbmVsIGlkIGVkaXRpbmcgZWRpdGVkTGF5ZXJcbiAgICAgIGVkaXQ6IHt9LFxuICAgICAgcmVtb3ZlOiB7fVxuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IGNpcmNsZU1hcmtlclN0eWxlID0ge1xuICByYWRpdXM6IDYsXG4gIGZpbGxDb2xvcjogJyNmZjc4MDAnLFxuICBjb2xvcjogJyMwMDAnLFxuICB3ZWlnaHQ6IDEsXG4gIG9wYWNpdHk6IDEsXG4gIGZpbGxPcGFjaXR5OiAwLjhcbn07XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IGNpdHlTdHlsZSA9IHtcbiAgY29sb3I6ICcjZmY3ODAwJyxcbiAgICB3ZWlnaHQ6IDUsXG4gICAgb3BhY2l0eTogMC42NVxufTtcblxuLyoqXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ3BzUGhvdG9NYXJrZXJJY29uID0gKCk6IEwuSWNvbiA9PiB7XG4gIHJldHVybiBMLmljb24oe1xuICAgIGljb25Vcmw6ICcuL2Fzc2V0cy9pbWcvbWFwL3Bob3RvLW1hcmtlci1pY29uLnBuZycsXG4gICAgc2hhZG93VXJsOiAnLi9hc3NldHMvaW1nL21hcC9tYXJrZXItc2hhZG93LnBuZycsXG5cbiAgICBpY29uU2l6ZTogICAgIFszMywgNDFdLCAvLyBzaXplIG9mIHRoZSBpY29uXG4gICAgLy8gc2hhZG93U2l6ZTogICBbNTAsIDY0XSwgLy8gc2l6ZSBvZiB0aGUgc2hhZG93XG4gICAgaWNvbkFuY2hvcjogICBbMTMsIDQwXSwgLy8gcG9pbnQgb2YgdGhlIGljb24gd2hpY2ggd2lsbCBjb3JyZXNwb25kIHRvIG1hcmtlcidzIGxvY2F0aW9uXG4gICAgLy8gc2hhZG93QW5jaG9yOiBbNCwgNjJdLCAgLy8gdGhlIHNhbWUgZm9yIHRoZSBzaGFkb3dcbiAgICBwb3B1cEFuY2hvcjogIFs1LCAtNDFdIC8vIHBvaW50IGZyb20gd2hpY2ggdGhlIHBvcHVwIHNob3VsZCBvcGVuIHJlbGF0aXZlIHRvIHRoZSBpY29uQW5jaG9yXG4gIH0pO1xufTtcblxuLyoqXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ3BzUGhvdG9NYXJrZXJJY29uSGlnaGxpZ2h0ID0gKCk6IEwuSWNvbiA9PiB7XG4gIHJldHVybiBMLmljb24oe1xuICAgIGljb25Vcmw6ICcuL2Fzc2V0cy9pbWcvbWFwL3Bob3RvLW1hcmtlci1pY29uLnBuZycsXG4gICAgc2hhZG93VXJsOiAnLi9hc3NldHMvaW1nL21hcC9tYXJrZXItc2hhZG93LnBuZycsXG5cbiAgICBpY29uU2l6ZTogICAgIFs0MywgNTRdLCAvLyBzaXplIG9mIHRoZSBpY29uXG4gICAgLy8gc2hhZG93U2l6ZTogICBbNTAsIDY0XSwgLy8gc2l6ZSBvZiB0aGUgc2hhZG93XG4gICAgaWNvbkFuY2hvcjogICBbMTMsIDQwXSwgLy8gcG9pbnQgb2YgdGhlIGljb24gd2hpY2ggd2lsbCBjb3JyZXNwb25kIHRvIG1hcmtlcidzIGxvY2F0aW9uXG4gICAgLy8gc2hhZG93QW5jaG9yOiBbNCwgNjJdLCAgLy8gdGhlIHNhbWUgZm9yIHRoZSBzaGFkb3dcbiAgICBwb3B1cEFuY2hvcjogIFswLCAtNzZdIC8vIHBvaW50IGZyb20gd2hpY2ggdGhlIHBvcHVwIHNob3VsZCBvcGVuIHJlbGF0aXZlIHRvIHRoZSBpY29uQW5jaG9yXG4gIH0pO1xufTtcbiIsIi8qKlxuICogQXV0byBmb3JtYXQgYSBETVMgY29vcmRpbmF0ZXNcbiAqIGVnLiB1c2VyIGNhbiBlbnRlciA0MyAwIDE0Ljc3XG4gKiBhbmQgdGhlIGZvcm1hdHRlciByZXR1cm5zIDQzw4LCsCAwJyAxNC43N1wiXG4gKiArIGF2b2lkIGVudGVyIG5vbiBudW1lcmljIChvciAuICwpIGNoYXJhY3RlcnNcbiAqICsgZm9yY2UgZW50aXJlIG51bWJlcnMgZm9yIGRlZ3JlZXMgYW5kIG1pbnV0ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRtc0Zvcm1hdHRlcihkbXNTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgLy8gcmVwbGFjZSBtdWx0aXBsZXMgc3BhY2VzXG4gICAgZG1zU3RyID0gZG1zU3RyLnJlcGxhY2UoL1xcc1xccysvZywgJyAnKTtcbiAgICAvLyByZXBsYWNlIHNwYWNlIGF0IGZpcnN0IHBvc2l0aW9uXG4gICAgaWYgKGRtc1N0ci5jaGFyQXQoMCkgPT09ICcgJykgeyBkbXNTdHIgPSBkbXNTdHIuc2xpY2UoMSwgZG1zU3RyLmxlbmd0aCAtIDEpOyB9XG4gICAgLy8gcmVwbGFjZSAsIGJ5IC5cbiAgICBkbXNTdHIgPSBkbXNTdHIucmVwbGFjZSgnLCcsICcuJyk7XG4gICAgLy8gZGVsZXRlIGFsbCBub24gbnVtZXJpYyBjaGFyYWN0ZXJzXG4gICAgZG1zU3RyID0gZG1zU3RyLnJlcGxhY2UoL1teMC05XFwtLizDgsKwXFwnXCJcXHNdL2csICcnKTtcblxuICAgIGxldCBuYlNwYWNlczogbnVtYmVyO1xuICAgIGxldCBkZWdDaHIgPSAnJztcbiAgICBsZXQgbWluQ2hyID0gJyc7XG4gICAgbGV0IHNlY0NociA9ICcnO1xuXG4gICAgbGV0IHYgPSBkbXNTdHIuc3BsaXQoJyAnKTtcbiAgICAvLyByZW1vdmUgbGFzdCBzcGFjZSBvZCBpbnB1dCBzdHJpbmdcbiAgICBpZiAoZG1zU3RyLmNoYXJBdChkbXNTdHIubGVuZ3RoIC0gMSkgPT09ICcgJykge1xuICAgICAgdiA9IHYuc2xpY2UoMCAsIHYubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSBsYXN0IGl0ZW0gb2YgdiBhcnJheSBpZiBpdCdzIGVtcHR5XG4gICAgaWYgKHZbdi5sZW5ndGggLSAxXSA9PT0gJycpIHtcbiAgICAgIHYgPSB2LnNsaWNlKDAgLCB2Lmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBpZiAodi5sZW5ndGggPT09IDEpIHtcbiAgICAgIGRlZ0NociA9IHZbMF07XG4gICAgICAvLyBkZWdDaHIgbXVzdCBiZSBhbiBlbnRpcmUgbnVtYmVyXG4gICAgICBpZiAoZGVnQ2hyLmluZGV4T2YoJy4nKSAhPT0gLTEpIHsgZGVnQ2hyID0gZGVnQ2hyLnNsaWNlKDAsIGRlZ0Noci5pbmRleE9mKCcuJykpOyB9XG4gICAgICAvLyBiZXR3ZWVuIC05MCAmICs5MFxuICAgICAgaWYgKE51bWJlcihkZWdDaHIpIDwgLTkwKSB7IGRlZ0NociA9ICctOTAnOyB9XG4gICAgICBpZiAoTnVtYmVyKGRlZ0NocikgPiA5MCkgeyBkZWdDaHIgPSAnOTAnOyB9XG4gICAgfVxuICAgIGlmICh2Lmxlbmd0aCA9PT0gMikge1xuICAgICAgZGVnQ2hyID0gdlswXTsgbWluQ2hyID0gdlsxXTtcbiAgICAgIGlmIChkZWdDaHIuaW5kZXhPZignLicpICE9PSAtMSkgeyBkZWdDaHIgPSBkZWdDaHIuc2xpY2UoMCwgZGVnQ2hyLmluZGV4T2YoJy4nKSk7IH1cbiAgICAgIGlmIChtaW5DaHIuaW5kZXhPZignLicpICE9PSAtMSkgeyBtaW5DaHIgPSBtaW5DaHIuc2xpY2UoMCwgZGVnQ2hyLmluZGV4T2YoJy4nKSk7IH1cbiAgICAgIGlmIChOdW1iZXIoZGVnQ2hyKSA8IC05MCkgeyBkZWdDaHIgPSAnLTkwJzsgfVxuICAgICAgaWYgKE51bWJlcihkZWdDaHIpID4gOTApIHsgZGVnQ2hyID0gJzkwJzsgfVxuICAgICAgaWYgKE51bWJlcihtaW5DaHIpIDwgLTkwKSB7IG1pbkNociA9ICctOTAnOyB9XG4gICAgICBpZiAoTnVtYmVyKG1pbkNocikgPiA5MCkgeyBtaW5DaHIgPSAnOTAnOyB9XG4gICAgICB9XG4gICAgaWYgKHYubGVuZ3RoID09PSAzKSB7XG4gICAgICBkZWdDaHIgPSB2WzBdOyBtaW5DaHIgPSB2WzFdOyBzZWNDaHIgPSB2WzJdO1xuICAgICAgaWYgKGRlZ0Noci5pbmRleE9mKCcuJykgIT09IC0xKSB7IGRlZ0NociA9IGRlZ0Noci5zbGljZSgwLCBkZWdDaHIuaW5kZXhPZignLicpKTsgfVxuICAgICAgaWYgKG1pbkNoci5pbmRleE9mKCcuJykgIT09IC0xKSB7IG1pbkNociA9IG1pbkNoci5zbGljZSgwLCBkZWdDaHIuaW5kZXhPZignLicpKTsgfVxuICAgICAgaWYgKE51bWJlcihkZWdDaHIpIDwgLTkwKSB7IGRlZ0NociA9ICctOTAnOyB9XG4gICAgICBpZiAoTnVtYmVyKGRlZ0NocikgPiA5MCkgeyBkZWdDaHIgPSAnOTAnOyB9XG4gICAgICBpZiAoTnVtYmVyKG1pbkNocikgPCAtOTApIHsgbWluQ2hyID0gJy05MCc7IH1cbiAgICAgIGlmIChOdW1iZXIobWluQ2hyKSA+IDkwKSB7IG1pbkNociA9ICc5MCc7IH1cbiAgICAgIH1cbiAgICBpZiAodi5sZW5ndGggPj0gNCkge1xuICAgICAgdiA9IHYuc2xpY2UoMCwgMik7XG4gICAgICBpZiAoZGVnQ2hyLmluZGV4T2YoJy4nKSAhPT0gLTEpIHsgZGVnQ2hyID0gZGVnQ2hyLnNsaWNlKDAsIGRlZ0Noci5pbmRleE9mKCcuJykpOyB9XG4gICAgICBpZiAobWluQ2hyLmluZGV4T2YoJy4nKSAhPT0gLTEpIHsgbWluQ2hyID0gbWluQ2hyLnNsaWNlKDAsIGRlZ0Noci5pbmRleE9mKCcuJykpOyB9XG4gICAgICBpZiAoTnVtYmVyKGRlZ0NocikgPCAtOTApIHsgZGVnQ2hyID0gJy05MCc7IH1cbiAgICAgIGlmIChOdW1iZXIoZGVnQ2hyKSA+IDkwKSB7IGRlZ0NociA9ICc5MCc7IH1cbiAgICAgIGlmIChOdW1iZXIobWluQ2hyKSA8IC05MCkgeyBtaW5DaHIgPSAnLTkwJzsgfVxuICAgICAgaWYgKE51bWJlcihtaW5DaHIpID4gOTApIHsgbWluQ2hyID0gJzkwJzsgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBuYlNwYWNlcyA9IGRtc1N0ci5tYXRjaCgvXFxzL2cpLmxlbmd0aDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBuYlNwYWNlcyA9IDA7XG4gICAgfVxuICAgIGlmIChuYlNwYWNlcyA9PT0gMCAmJiB2Lmxlbmd0aCA9PT0gMSnDgsKge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAobmJTcGFjZXMgPT09IDEgJiYgdi5sZW5ndGggPj0gMSkge1xuICAgICAgZGVnQ2hyID0gZGVnQ2hyLnJlcGxhY2UoJyAnLCAnJyk7XG4gICAgICBpZiAoZGVnQ2hyLnNsaWNlKGRlZ0Noci5sZW5ndGggLSAxLCBkZWdDaHIubGVuZ3RoKSAhPT0gJ8OCwrAnKSB7IGRlZ0NociArPSAnw4LCsCAnOyB9IGVsc2UgeyBkZWdDaHIgKz0gJyAnOyB9XG4gICAgfSBlbHNlIGlmIChuYlNwYWNlcyA9PT0gMiAmJiB2Lmxlbmd0aCA+PSAyKSB7XG4gICAgICBkZWdDaHIgPSBkZWdDaHIucmVwbGFjZSgnICcsICcnKTtcbiAgICAgIG1pbkNociA9IG1pbkNoci5yZXBsYWNlKCcgJywgJycpO1xuICAgICAgaWYgKGRlZ0Noci5zbGljZShkZWdDaHIubGVuZ3RoIC0gMSwgZGVnQ2hyLmxlbmd0aCkgIT09ICfDgsKwJykgeyBkZWdDaHIgKz0gJ8OCwrAgJzsgfSBlbHNlIHsgZGVnQ2hyICs9ICcgJzsgfVxuICAgICAgaWYgKG1pbkNoci5zbGljZShtaW5DaHIubGVuZ3RoIC0gMSwgbWluQ2hyLmxlbmd0aCkgIT09ICdcXCcnKSB7IG1pbkNociArPSAnXFwnICc7IH0gZWxzZSB7IG1pbkNociArPSAnICc7IH1cbiAgICB9IGVsc2UgaWYgKG5iU3BhY2VzID09PSAzICYmIHYubGVuZ3RoID49IDMpIHtcbiAgICAgIGRlZ0NociA9IGRlZ0Noci5yZXBsYWNlKCcgJywgJycpO1xuICAgICAgbWluQ2hyID0gbWluQ2hyLnJlcGxhY2UoJyAnLCAnJyk7XG4gICAgICBzZWNDaHIgPSBzZWNDaHIucmVwbGFjZSgnICcsICcnKTtcbiAgICAgIGlmIChkZWdDaHIuc2xpY2UoZGVnQ2hyLmxlbmd0aCAtIDEsIGRlZ0Noci5sZW5ndGgpICE9PSAnw4LCsCcpIHsgZGVnQ2hyICs9ICfDgsKwICc7IH0gZWxzZSB7IGRlZ0NociArPSAnICc7IH1cbiAgICAgIGlmIChtaW5DaHIuc2xpY2UobWluQ2hyLmxlbmd0aCAtIDEsIG1pbkNoci5sZW5ndGgpICE9PSAnXFwnJykgeyBtaW5DaHIgKz0gJ1xcJyAnOyB9IGVsc2UgeyBtaW5DaHIgKz0gJyAnOyB9XG4gICAgICBpZiAoc2VjQ2hyLnNsaWNlKHNlY0Noci5sZW5ndGggLSAxLCBzZWNDaHIubGVuZ3RoKSAhPT0gJ1wiJykgeyBzZWNDaHIgKz0gJ1wiJzsgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyB7IGVycm9yOiAnQ2FuXFwndCBtYW5hZ2UgaW5wdXQgc3RyaW5nLicgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVnQ2hyICsgbWluQ2hyICsgc2VjQ2hyO1xuXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZG1zU3RyO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZW1wdHksIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBOb21pbmF0aW1PYmplY3QgfSBmcm9tICcuLi9fbW9kZWxzL25vbWluYXRpbU9iai5tb2RlbCc7XG5pbXBvcnQgeyBPc21QbGFjZU1vZGVsIH0gZnJvbSAnLi4vX21vZGVscy9vc21QbGFjZS5tb2RlbCc7XG5pbXBvcnQgeyBpc0RlZmluZWQgfSBmcm9tICdAYW5ndWxhci9jb21waWxlci9zcmMvdXRpbCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEdlb2NvZGluZ1NlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkgeyB9XG5cbiAgZ2VvY29kZShhZGRyZXNzOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmIChhZGRyZXNzID09PSBudWxsKSB7IHJldHVybiBlbXB0eSgpOyB9IC8vIEF2b2lkIHNlbmRpbmcgcmVxdWVzdCBvbiBmb3JtIHJlc2V0XG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vbm9taW5hdGltLm9wZW5zdHJlZXRtYXAub3JnLz9mb3JtYXQ9anNvbiZhZGRyZXNzZGV0YWlscz0xJnE9JHthZGRyZXNzfSZmb3JtYXQ9anNvbiZsaW1pdD0xMCZwb2x5Z29uX2dlb2pzb249MWA7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsKS5waXBlKFxuICAgICAgbWFwKChvYmo6IE5vbWluYXRpbU9iamVjdCkgPT4gb2JqKVxuICAgICk7XG4gIH1cblxuICByZXZlcnNlKGxhdDogbnVtYmVyLCBsbmc6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vbm9taW5hdGltLm9wZW5zdHJlZXRtYXAub3JnL3JldmVyc2U/Zm9ybWF0PWpzb24mbGF0PSR7bGF0fSZsb249JHtsbmd9JnBvbHlnb25fZ2VvanNvbj0xYDtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwpLnBpcGUoXG4gICAgICBtYXAoKG9iajogTm9taW5hdGltT2JqZWN0KSA9PiBvYmopXG4gICAgKTtcbiAgfVxuXG4gIGdldFJlYWRibGVBZGRyZXNzKG9zbVBsYWNlUmVzdWx0OiBPc21QbGFjZU1vZGVsKTogc3RyaW5nIHtcbiAgICBsZXQgbG9jYWxpdHk6IHN0cmluZyA9IG51bGw7ICAgIC8vIGNpdHkgb3IgdmlsbGFnZSBvciAuLi5cbiAgICBsZXQgc3ViTG9jYWxpdHk6IHN0cmluZyA9IG51bGw7IC8vIGRpc3RyaWN0IG9yXG4gICAgbGV0IHJvYWQ6IHN0cmluZyA9IG51bGw7XG4gICAgbGV0IG5laWdoYm91cmhvb2Q6IHN0cmluZyA9IG51bGw7XG5cbiAgICAvLyBHZXQgXCJjaXR5XCIgaW5mb3JtYXRpb24gKEkgbWVhbiBjaXR5IG9yIHNvbWV0aGluZyBzaW1pbGFyIGxpa2UgdmlsbGFnZSlcbiAgICBpZiAoaXNEZWZpbmVkKG9zbVBsYWNlUmVzdWx0LmFkZHJlc3MuY2l0eSkpIHsgbG9jYWxpdHkgPSBvc21QbGFjZVJlc3VsdC5hZGRyZXNzLmNpdHk7XG4gICAgfSBlbHNlIGlmIChpc0RlZmluZWQob3NtUGxhY2VSZXN1bHQuYWRkcmVzcy50b3duKSkgeyBsb2NhbGl0eSA9IG9zbVBsYWNlUmVzdWx0LmFkZHJlc3MudG93bjtcbiAgICB9IGVsc2UgaWYgKGlzRGVmaW5lZChvc21QbGFjZVJlc3VsdC5hZGRyZXNzLnZpbGxhZ2UpKSB7IGxvY2FsaXR5ID0gb3NtUGxhY2VSZXN1bHQuYWRkcmVzcy52aWxsYWdlO1xuICAgIH0gZWxzZSBpZiAoaXNEZWZpbmVkKG9zbVBsYWNlUmVzdWx0LmFkZHJlc3MuaGFtbGV0KSkgeyBsb2NhbGl0eSA9IG9zbVBsYWNlUmVzdWx0LmFkZHJlc3MuaGFtbGV0OyB9XG5cbiAgICAvLyBHZXQgc3VidXJiciAmIGlmIG5vdCBkZWZpbmVkIDogcG9zdGNvZGVcbiAgICBpZiAoaXNEZWZpbmVkKG9zbVBsYWNlUmVzdWx0LmFkZHJlc3Muc3VidXJiKSAmJiBpc0RlZmluZWQob3NtUGxhY2VSZXN1bHQuYWRkcmVzcy5wb3N0Y29kZSkgJiYgbG9jYWxpdHkgIT09IG51bGwpIHtcbiAgICAgIHN1YkxvY2FsaXR5ID0gb3NtUGxhY2VSZXN1bHQuYWRkcmVzcy5zdWJ1cmIgKyAnLCAnICsgb3NtUGxhY2VSZXN1bHQuYWRkcmVzcy5wb3N0Y29kZTtcbiAgICB9IGVsc2UgaWYgKCFpc0RlZmluZWQob3NtUGxhY2VSZXN1bHQuYWRkcmVzcy5zdWJ1cmIpICYmIGlzRGVmaW5lZChvc21QbGFjZVJlc3VsdC5hZGRyZXNzLnBvc3Rjb2RlKSAmJiBsb2NhbGl0eSAhPT0gbnVsbCkge1xuICAgICAgc3ViTG9jYWxpdHkgPSBvc21QbGFjZVJlc3VsdC5hZGRyZXNzLnBvc3Rjb2RlO1xuICAgIH1cblxuICAgIC8vIEdldCBcInJvYWRcIlxuICAgIGlmIChpc0RlZmluZWQob3NtUGxhY2VSZXN1bHQuYWRkcmVzcy5yb2FkKSkge1xuICAgICAgcm9hZCA9IG9zbVBsYWNlUmVzdWx0LmFkZHJlc3Mucm9hZDtcbiAgICB9IGVsc2UgaWYgKGlzRGVmaW5lZChvc21QbGFjZVJlc3VsdC5hZGRyZXNzLnBlZGVzdHJpYW4pKSB7XG4gICAgICByb2FkID0gb3NtUGxhY2VSZXN1bHQuYWRkcmVzcy5wZWRlc3RyaWFuO1xuICAgIH1cblxuICAgIC8vIEdldCBuZWlnaGJvdXJob29kXG4gICAgaWYgKGlzRGVmaW5lZChvc21QbGFjZVJlc3VsdC5hZGRyZXNzLm5laWdoYm91cmhvb2QpKSB7XG4gICAgICBuZWlnaGJvdXJob29kID0gb3NtUGxhY2VSZXN1bHQuYWRkcmVzcy5uZWlnaGJvdXJob29kO1xuICAgIH1cblxuICAgIC8vIFJldHVyblxuICAgIGlmIChyb2FkICYmIG5laWdoYm91cmhvb2QgJiYgc3ViTG9jYWxpdHkgJiYgbG9jYWxpdHkpIHtcbiAgICAgIHJldHVybiByb2FkICsgJyAoJyArIG5laWdoYm91cmhvb2QgKyAnKSAnICsgc3ViTG9jYWxpdHkgKyAnICcgKyBsb2NhbGl0eTtcbiAgICB9IGVsc2UgaWYgKHJvYWQgJiYgIW5laWdoYm91cmhvb2QgJiYgc3ViTG9jYWxpdHkgJiYgbG9jYWxpdHkpIHtcbiAgICAgIHJldHVybiByb2FkICsgJyAnICsgc3ViTG9jYWxpdHkgKyAnICcgKyBsb2NhbGl0eTtcbiAgICB9IGVsc2UgaWYgKCFyb2FkICYmIG5laWdoYm91cmhvb2QgJiYgc3ViTG9jYWxpdHkgJiYgbG9jYWxpdHkpIHtcbiAgICAgIHJldHVybiBuZWlnaGJvdXJob29kICsgJyAnICsgc3ViTG9jYWxpdHkgKyAnICcgKyBsb2NhbGl0eTtcbiAgICB9IGVsc2UgaWYgKCFyb2FkICYmICFuZWlnaGJvdXJob29kICYmIHN1YkxvY2FsaXR5ICYmIGxvY2FsaXR5KSB7XG4gICAgICByZXR1cm4gc3ViTG9jYWxpdHkgKyAnICcgKyBsb2NhbGl0eTtcbiAgICB9IGVsc2UgaWYgKCFyb2FkICYmICFuZWlnaGJvdXJob29kICYmICFzdWJMb2NhbGl0eSAmJiBsb2NhbGl0eSkge1xuICAgICAgcmV0dXJuIGxvY2FsaXR5O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3NtUGxhY2VSZXN1bHQuZGlzcGxheV9uYW1lO1xuICAgIH1cblxuICB9XG5cbiAgb3NtQ2xhc3NGaWx0ZXIob3NtQ2xhc3NGaWx0ZXI6IEFycmF5PHN0cmluZz4sIG9zbVJlc3VsdHM6IEFycmF5PE5vbWluYXRpbU9iamVjdD4pIHtcbiAgICBjb25zdCBvc21GaWx0ZXJlZFJlc3VsdHM6IEFycmF5PE5vbWluYXRpbU9iamVjdD4gPSBbXTtcbiAgICBpZiAob3NtQ2xhc3NGaWx0ZXIubGVuZ3RoID4gMCAmJiBvc21SZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9zbVJlc3VsdHMuZm9yRWFjaChvc21JdGVtID0+IHtcbiAgICAgICAgbGV0IGZpbHRlck1hdGNoT2NjdXJlbmNlID0gMDtcbiAgICAgICAgbGV0IHJlbW92ZU9jY3VyZW5jZSAgID0gZmFsc2U7XG4gICAgICAgIG9zbUNsYXNzRmlsdGVyLmZvckVhY2gob3NtRmlsdGVySXRlbSA9PiB7XG4gICAgICAgICAgY29uc3QgX2NsYXNzID0gb3NtRmlsdGVySXRlbS5zcGxpdCgnOicpWzBdO1xuICAgICAgICAgIGNvbnN0IF90eXBlID0gb3NtRmlsdGVySXRlbS5zcGxpdCgnOicpWzFdO1xuICAgICAgICAgIGlmIChfdHlwZSA9PT0gJyonKSB7XG4gICAgICAgICAgICBpZiAob3NtSXRlbS5jbGFzcyA9PT0gX2NsYXNzKSB7IGZpbHRlck1hdGNoT2NjdXJlbmNlKys7IH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgISwgcmVtb3ZlXG4gICAgICAgICAgICBpZiAoX3R5cGUuc3Vic3RyKDAsIDEpID09PSAnIScpIHtcbiAgICAgICAgICAgICAgaWYgKG9zbUl0ZW0uY2xhc3MgPT09IF9jbGFzcyAmJiAnIScgKyBvc21JdGVtLnR5cGUgPT09IF90eXBlKSB7IHJlbW92ZU9jY3VyZW5jZSA9IHRydWU7IH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChvc21JdGVtLmNsYXNzID09PSBfY2xhc3MgJiYgb3NtSXRlbS50eXBlID09PSBfdHlwZSkgeyBmaWx0ZXJNYXRjaE9jY3VyZW5jZSsrOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGZpbHRlck1hdGNoT2NjdXJlbmNlID4gMCAmJiAhcmVtb3ZlT2NjdXJlbmNlKSB7XG4gICAgICAgICAgb3NtRmlsdGVyZWRSZXN1bHRzLnB1c2gob3NtSXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9mKG9zbUZpbHRlcmVkUmVzdWx0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvZihvc21SZXN1bHRzKTtcbiAgICB9XG4gIH1cblxuICByZXZlcnNlQ29ycmRpbmF0ZXNBcnJheShjb29yZGluYXRlc0FycmF5OiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPikge1xuICAgIGlmIChjb29yZGluYXRlc0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvb3JkaW5hdGVzQXJyYXkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaXRlbS5yZXZlcnNlKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb29yZGluYXRlc0FycmF5O1xuICAgIH1cbiAgfVxuXG4gIHNpbXBsaWZ5UG9seWxpbmUoY29vcmRpbmF0ZXNBcnJheTogQXJyYXk8W251bWJlciwgbnVtYmVyXT4pOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiB7XG4gICAgaWYgKGNvb3JkaW5hdGVzQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgZmlyc3RDb29yZGluYXRlID0gY29vcmRpbmF0ZXNBcnJheVswXTtcbiAgICAgIGNvbnN0IGxhc3RDb29yZGluYXRlID0gY29vcmRpbmF0ZXNBcnJheVtjb29yZGluYXRlc0FycmF5Lmxlbmd0aCAtIDFdO1xuICAgICAgcmV0dXJuIFtmaXJzdENvb3JkaW5hdGUsIGxhc3RDb29yZGluYXRlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNvb3JkaW5hdGVzQXJyYXk7XG4gICAgfVxuICB9XG59XG5cblxuXG5cbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEVsZXZhdGlvblNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkgeyB9XG5cbiAgZ2V0RWxldmF0aW9uKGxhdDogbnVtYmVyLCBsbmc6IG51bWJlcik6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgY29uc3QgYXBpVXJsID0gYGh0dHBzOi8vYXBpLm9wZW4tZWxldmF0aW9uLmNvbS9hcGkvdjEvbG9va3VwP2xvY2F0aW9ucz0ke2xhdH0sJHtsbmd9YDtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChhcGlVcmwpLnBpcGUoXG4gICAgICBtYXAoKG9iajogT3BlbkVsZXZhdGlvbkFwaU9iamVjdCkgPT4gb2JqLnJlc3VsdHNbMF0uZWxldmF0aW9uKVxuICAgICk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIE9wZW5FbGV2YXRpb25BcGlPYmplY3Qge1xuICByZXN1bHRzOiBBcnJheTx7XG4gICAgZWxldmF0aW9uOiBudW1iZXIsXG4gICAgbGF0aXR1ZGU6IG51bWJlcixcbiAgICBsb25naXR1ZGU6IG51bWJlclxuICB9Pjtcbn1cbiIsIi8qKlxuICogQHRvZG8gbGltaXQgcG9seWdvbiBhcmVhIC8gcG9seWxpbmUgbGVuZ2h0XG4gKiBAdG9kbyBmaXggZm9ybSBpbnB1dCBub3QgdXBkYXRlZCBhZnRlciAuc2V0VmFsdWUgKGV4Y2VwdCBmb3IgdGhlIGdwc01hcmtlclNldFZhbHVlcyBtZXRob2QpXG4gKiBzZWUgOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9tYXRlcmlhbDIvaXNzdWVzLzc2MDEjaXNzdWVjb21tZW50LTMzNDk0NzI4MCxcbiAqICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL21hdGVyaWFsMi9pc3N1ZXMvMjQzNCxcbiAqICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL21hdGVyaWFsMi9pc3N1ZXMvMjM2MyxcbiAqICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL21hdGVyaWFsMi9wdWxsLzI0NTUsXG4gKiAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9tYXRlcmlhbDIvaXNzdWVzLzI4MzcjaXNzdWVjb21tZW50LTI3NjUzODYxNixcbiAqICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL21hdGVyaWFsMi9pc3N1ZXMvNzYwMSxcbiAqICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL21hdGVyaWFsMi9pc3N1ZXMvMjQ0MVxuICovXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgT2JzZXJ2YWJsZSwgemlwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgKiBhcyBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0ICdsZWFmbGV0LWRyYXcnO1xuaW1wb3J0IHsgTGF0TG5nRXhwcmVzc2lvbiB9IGZyb20gJ2xlYWZsZXQnO1xuXG5pbXBvcnQgeyBHZW9Qb2ludCB9IGZyb20gJy4uL19oZWxwZXJzL2dlb0NvbnZlcnQnO1xuaW1wb3J0ICogYXMgbGVhZmxldE9iamVjdHMgZnJvbSAnLi4vX2hlbHBlcnMvbGVhZmxldE9iamVjdHMnO1xuaW1wb3J0IHsgZG1zRm9ybWF0dGVyIH0gZnJvbSAnLi4vX2hlbHBlcnMvZG1zVG9vbHMnO1xuXG5pbXBvcnQgeyBHZW9jb2RpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vX3NlcnZpY2VzL2dlb2NvZGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEVsZXZhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9fc2VydmljZXMvZWxldmF0aW9uLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBMb2NhdGlvbk1vZGVsIH0gZnJvbSAnLi4vX21vZGVscy9sb2NhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBOb21pbmF0aW1PYmplY3QgfSBmcm9tICcuLi9fbW9kZWxzL25vbWluYXRpbU9iai5tb2RlbCc7XG5pbXBvcnQgeyBMYXRMbmdETVNBbHRpdHVkZVBob3RvTmFtZSB9IGZyb20gJy4uL19tb2RlbHMvZ3BzTGF0TG5nJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGItZ2VvbG9jLW1hcCcsXG4gIHRlbXBsYXRlOiBgPGgxPk/Dg8K5ID88L2gxPlxuICBcbjxkaXYgaWQ9XCJnZW9sb2MtbWFwXCI+XG4gIDxkaXYgaWQ9XCJnZW9sb2MtbWFwLW1ldGFcIj5cbiAgICA8IS0tIGdlb3NlYXJjaCBhdXRvY29tcGxldGUgLS0+XG4gICAgPG1hdC1mb3JtLWZpZWxkIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XG4gICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImdlb1NlYXJjaEZvcm1Hcm91cC5jb250cm9scy5wbGFjZUlucHV0XCIgcGxhY2Vob2xkZXI9XCJUcm91dmVyIHVuIGxpZXVcIiBhcmlhLWxhYmVsPVwiVHJvdXZlciB1biBsaWV1XCIgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCI+XG4gICAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCJpc0xvYWRpbmdBZGRyZXNzXCIgZGlhbWV0ZXI9XCIyMFwiIG1hdFN1ZmZpeD48L21hdC1zcGlubmVyPlxuICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwiYWRkcmVzc1NlbGVjdGVkQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBhZGRyZXNzIG9mIGdlb1NlYXJjaFJlc3VsdHNcIiBbdmFsdWVdPVwiYWRkcmVzc1wiPlxuICAgICAgICAgIDxzcGFuPnt7IGFkZHJlc3MgfCBvc21QbGFjZVJlYWRhYmxlQWRkcmVzcyB9fTwvc3Bhbj5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgXG4gICAgPGRpdiBjbGFzcz1cImdlb2xvY2F0aW9uSW5wdXRzXCI+XG4gICAgICA8ZGl2IFtmb3JtR3JvdXBdPVwibGF0bG5nRm9ybUdyb3VwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYXRMbmdNZW51SW5wdXRzXCI+XG4gICAgICAgICAgPCEtLSBsYXRpdHVkZSAvIGxvbmdpdHVkZSBkZWNpbWFsIGZvcm1hdCAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29vcmRGb3JtYXQ9PSdkZWNpbWFsJ1wiPlxuICAgICAgICAgICAgPCEtLSBsYXRpdHVkZSAvIGxvbmdpdHVkZSBmb3JtYXQgc2VsZWN0aW9uIC0tPiAgXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJsYXRJbnB1dFwiIHBsYWNlaG9sZGVyPVwibGF0aXR1ZGVcIj5cbiAgICAgICAgICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiaXNMb2FkaW5nTGF0aXR1ZGVcIiBkaWFtZXRlcj1cIjIwXCIgbWF0U3VmZml4PjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJsYXRsbmdGb3JtR3JvdXAuY29udHJvbHMubGF0SW5wdXQuZGlydHkgJiYgbGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxhdElucHV0Lmhhc0Vycm9yKCdtYWxmb3JtZWRMYXRMbmdEZWNGb3JtYXQnKVwiPkZvcm1hdCBub24gdmFsaWRlPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibG5nSW5wdXRcIiBwbGFjZWhvbGRlcj1cImxvbmdpdHVkZVwiPlxuICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCJpc0xvYWRpbmdMb25naXR1ZGVcIiBkaWFtZXRlcj1cIjIwXCIgbWF0U3VmZml4PjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJsYXRsbmdGb3JtR3JvdXAuY29udHJvbHMubGF0SW5wdXQuZGlydHkgJiYgbGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxhdElucHV0Lmhhc0Vycm9yKCdtYWxmb3JtZWRMYXRMbmdEZWNGb3JtYXQnKVwiPkZvcm1hdCBub24gdmFsaWRlPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiYWRkTWFya2VyRnJvbUxhdExuZ0Nvb3JkKCk7IGNhbGxHZW9sb2NFbGV2YXRpb25BcGlzVXNpbmdMYXRMbmdJbnB1dHNWYWx1ZXMoKTtcIiBbZGlzYWJsZWRdPVwiIWxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5sYXRJbnB1dC52YWxpZCB8fCAhbGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxuZ0lucHV0LnZhbGlkXCIgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRUb29sdGlwPVwiVXRpbGlzZXIgY2VzIGNvb3Jkb25uw4PCqWVzXCI+d2hlcmVfdG9fdm90ZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBtZW51IGZvcm1hdCBkZWNpbWFsIC8gZG1zLS0+XG4gICAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInNldExhdExuZ0lucHV0Rm9ybWF0KCdkbXMnKVwiPkRlZ3LDg8KpcyBtaW51dGVzIHNlY29uZGVzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzZXRMYXRMbmdJbnB1dEZvcm1hdCgnZGVjaW1hbCcpXCI+RMODwqljaW1hbDwvYnV0dG9uPlxuICAgICAgICA8L21hdC1tZW51PlxuXG4gICAgICAgIDwhLS0gbGF0aXR1ZGUgLyBsb25naXR1ZGUgRE1TIGZvcm1hdCAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNvb3JkRm9ybWF0PT0nZG1zJ1wiPlxuICAgICAgICAgIDwhLS0gbGF0aXR1ZGUgLyBsb25naXR1ZGUgZm9ybWF0IHNlbGVjdGlvbiAtLT4gIFxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCI+XG4gICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkbXNMYXRJbnB1dFwiIHBsYWNlaG9sZGVyPVwiKGRlZynDgsKwICAobWluKScgIChzZWMpJnF1b3Q7XCI+XG4gICAgICAgICAgICA8c3BhbiBtYXRQcmVmaXg+TiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImlzTG9hZGluZ0xhdGl0dWRlXCIgZGlhbWV0ZXI9XCIyMFwiIG1hdFN1ZmZpeD48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMYXRJbnB1dC5kaXJ0eSAmJiBsYXRsbmdGb3JtR3JvdXAuY29udHJvbHMuZG1zTGF0SW5wdXQuaGFzRXJyb3IoJ21hbGZvcm1lZExhdExuZ0Rtc0Zvcm1hdCcpXCI+Rm9ybWF0IG5vbiB2YWxpZGU8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRtc0xuZ0lucHV0XCIgcGxhY2Vob2xkZXI9XCIoZGVnKcOCwrAgIChtaW4pJyAgKHNlYykmcXVvdDtcIj5cbiAgICAgICAgICAgIDxzcGFuIG1hdFByZWZpeD5FJm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiaXNMb2FkaW5nTG9uZ2l0dWRlXCIgZGlhbWV0ZXI9XCIyMFwiIG1hdFN1ZmZpeD48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMYXRJbnB1dC5kaXJ0eSAmJiBsYXRsbmdGb3JtR3JvdXAuY29udHJvbHMuZG1zTGF0SW5wdXQuaGFzRXJyb3IoJ21hbGZvcm1lZExhdExuZ0Rtc0Zvcm1hdCcpXCI+Rm9ybWF0IG5vbiB2YWxpZGU8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImFkZE1hcmtlckZyb21EbXNDb29yZCgpOyBjYWxsR2VvbG9jRWxldmF0aW9uQXBpc1VzaW5nTGF0TG5nSW5wdXRzVmFsdWVzKCk7XCIgW2Rpc2FibGVkXT1cIiFsYXRsbmdGb3JtR3JvdXAuY29udHJvbHMuZG1zTGF0SW5wdXQudmFsaWQgfHwgIWxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMbmdJbnB1dC52YWxpZFwiIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIG1hdFRvb2x0aXA9XCJVdGlsaXNlciBjZXMgY29vcmRvbm7Dg8KpZXNcIj53aGVyZV90b192b3RlPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDwhLS0gZWxldmF0aW9uIC0tPlxuICAgICAgPGRpdiBbZm9ybUdyb3VwXT1cImVsZXZhdGlvbkZvcm1Hcm91cFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgc3R5bGU9XCJ3aWR0aDogMTAwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImVsZXZhdGlvbklucHV0XCIgcGxhY2Vob2xkZXI9XCJhbHRpdHVkZVwiPlxuICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImlzTG9hZGluZ0VsZXZhdGlvblwiIGRpYW1ldGVyPVwiMjBcIiBtYXRTdWZmaXg+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0xvYWRpbmdFbGV2YXRpb25cIiBtYXRTdWZmaXg+bTwvc3Bhbj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGlkPVwiZ2VvbG9jLW1hcC1kcmF3XCIgc3R5bGU9XCJoZWlnaHQ6IDQwMHB4O1wiXG4gICAgICBsZWFmbGV0IFxuICAgICAgW2xlYWZsZXRPcHRpb25zXT1cIm9wdGlvbnNcIlxuICAgICAgKGxlYWZsZXRNYXBSZWFkeSk9XCJvbk1hcFJlYWR5KCRldmVudClcIj5cbiAgPC9kaXY+XG48L2Rpdj5gLFxuICBzdHlsZXM6IFtgW2hpZGRlbl17ZGlzcGxheTpub25lIWltcG9ydGFudH0jZ2VvbG9jLW1hcHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi1oZWlnaHQ6MjAwcHh9I2dlb2xvYy1tYXAgI2dlb2xvYy1tYXAtbWV0YXtmbGV4OjE7cGFkZGluZzoxNXB4fSNnZW9sb2MtbWFwICNnZW9sb2MtbWFwLW1ldGEgLmdlb2xvY2F0aW9uSW5wdXRze2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59I2dlb2xvYy1tYXAgI2dlb2xvYy1tYXAtZHJhd3twb3NpdGlvbjpyZWxhdGl2ZTtmbGV4OjN9I2dlb2xvYy1tYXAgI2h0dHBUYXNrc1J1bm5pbmdTcGlubmVye2ZsZXg6MX1idXR0b24gLm1pbml7bWluLXdpZHRoOjA7bGluZS1oZWlnaHQ6MzBweH0uZ2VvbG9jYXRlZFBob3RvTWV0YWRhdGFUYWJsZXt3aWR0aDoxMDAlfWBdXG59KVxuZXhwb3J0IGNsYXNzIE1hcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvLyAtLS0tLS0tLS0tLS0tLVxuICAvLyBJTlBVVCAvIE9VVFBVVFxuICAvLyAtLS0tLS0tLS0tLS0tLVxuICBASW5wdXQoKSBsYXllcnNUb0FkZDogQXJyYXk8c3RyaW5nPiA9IFsnb3NtJ107XG4gIEBJbnB1dCgpIGdlb2xvY2F0ZWRQaG90b0xhdExuZzogT2JzZXJ2YWJsZTxBcnJheTxMYXRMbmdETVNBbHRpdHVkZVBob3RvTmFtZT4+O1xuICBASW5wdXQoKSBvc21DbGFzc0ZpbHRlcjogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gIEBPdXRwdXQoKSBsb2NhdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8TG9jYXRpb25Nb2RlbD4oKTsgLy8gb2JqZWN0IHRvIHJldHVyblxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gRk9STVMgJiBSRUxBVEVEIFZBUklBQkxFU1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGxhdGxuZ0Zvcm1Hcm91cDogRm9ybUdyb3VwO1xuICBlbGV2YXRpb25Gb3JtR3JvdXA6IEZvcm1Hcm91cDtcbiAgZ2VvU2VhcmNoRm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gIGdlb1NlYXJjaFJlc3VsdHM6IEFycmF5PE5vbWluYXRpbU9iamVjdD47XG4gIGNvb3JkRm9ybWF0ID0gJ2Rtcyc7ICAgICAgICAgICAgLy8gJ2RlY2ltYWwnIHwgJ2RtcydcblxuICAvLyAtLS0tLS0tLS1cbiAgLy8gVkFSSUFCTEVTXG4gIC8vIC0tLS0tLS0tLVxuICBfbG9jYXRpb24gPSA8TG9jYXRpb25Nb2RlbD57fTtcbiAgZ2VvbG9jYXRlZFBob3RvTGF0TG5nRGF0YTogQXJyYXk8TGF0TG5nRE1TQWx0aXR1ZGVQaG90b05hbWU+ID0gW107XG4gIGdlb2xvY2F0ZWRQaG90b0xhdExuZ0Rpc3BsYXllZENvbHVtbnNUYWJsZTogQXJyYXk8c3RyaW5nPiA9IFsnc2VsZWN0JywgJ3Bob3RvTmFtZScsICdsYXQnLCAnbG5nJywgJ2FsdGl0dWRlJ107XG4gIGlzTG9hZGluZ0FkZHJlc3MgPSBmYWxzZTtcbiAgaXNMb2FkaW5nTGF0aXR1ZGUgPSBmYWxzZTtcbiAgaXNMb2FkaW5nTG9uZ2l0dWRlID0gZmFsc2U7XG4gIGlzTG9hZGluZ0VsZXZhdGlvbiA9IGZhbHNlO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS1cbiAgLy8gU1VCU0NSSVBUSU9OU1xuICAvLyAtLS0tLS0tLS0tLS0tXG4gIGdlb1NlYXJjaFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb247XG4gIGxhdERtc0lucHV0U3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbjtcbiAgbG5nRG1zSW5wdXRTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gTEVBRkxFVCBWQVJJQUJMRVMsIExBWUVSUyBBTkQgTUFQIENPTkZJR1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHByaXZhdGUgbWFwOiBMLk1hcDtcbiAgcHVibGljIG1hcExhdCA9IDA7XG4gIHB1YmxpYyBtYXBMbmcgPSAwO1xuICBwcml2YXRlIGRyYXdUeXBlOiBzdHJpbmc7XG4gIHByaXZhdGUgZHJhd25JdGVtOiBhbnk7XG5cbiAgcHJpdmF0ZSBvc21MYXllciA9IEwudGlsZUxheWVyKCdodHRwOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywgeyBtYXhab29tOiAxOCwgYXR0cmlidXRpb246ICdPcGVuIFN0cmVldCBtYXAnIH0pO1xuICBwcml2YXRlIGdvb2dsZVNhdGVsbGl0ZUxheWVyID0gTC50aWxlTGF5ZXIoJ2h0dHA6Ly97c30uZ29vZ2xlLmNvbS92dC9seXJzPXMmeD17eH0meT17eX0mej17en0nLCB7IG1heFpvb206IDIwLCBzdWJkb21haW5zOiBbJ210MCcsICdtdDEnLCAnbXQyJywgJ210MyddLCBhdHRyaWJ1dGlvbjogJ0dvb2dsZSBtYXBzJyB9KTtcbiAgcHJpdmF0ZSBnb29nbGVIeWJyaWRMYXllciA9IEwudGlsZUxheWVyKCdodHRwOi8ve3N9Lmdvb2dsZS5jb20vdnQvbHlycz1zLGgmeD17eH0meT17eX0mej17en0nLCB7IG1heFpvb206IDIwLCBzdWJkb21haW5zOiBbJ210MCcsICdtdDEnLCAnbXQyJywgJ210MyddLCBhdHRyaWJ1dGlvbjogJ0dvb2dsZSBtYXBzJyB9KTtcbiAgcHJpdmF0ZSBicmdtTGF5ZXIgPSBMLnRpbGVMYXllci53bXMoJ2h0dHA6Ly9nZW9zZXJ2aWNlcy5icmdtLmZyL2dlb2xvZ2llJywgeyB2ZXJzaW9uOiAnMS4zLjAnLCBsYXllcnM6ICdHZW9sb2dpZSd9KTtcbiAgcHJpdmF0ZSBtYXBMYXllcnMgPSB7XG4gICAgJ0dvb2dsZSc6IHRoaXMuZ29vZ2xlSHlicmlkTGF5ZXIsXG4gICAgJ09TTSc6IHRoaXMub3NtTGF5ZXIsXG4gICAgJ0JSR00nOiB0aGlzLmJyZ21MYXllclxuICB9O1xuICBwcml2YXRlIGdlb1Jlc3VsdHNMYXllciA9IEwuZ2VvSlNPTihudWxsLCB7c3R5bGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4geyBjb2xvcjogJyNmZjc4MDAnLCB3ZWlnaHQ6IDUsIG9wYWNpdHk6IDAuNjUgfTsgfX0pO1xuICBwcml2YXRlIGdlb2xvY2F0ZWRQaG90b0xhdExuZ0xheWVyID0gTC5nZW9KU09OKCk7XG5cbiAgLy8gbWFwIG9wdGlvbnNcbiAgb3B0aW9ucyA9IHtcbiAgICBsYXllcnM6IFsgdGhpcy5vc21MYXllciBdLFxuICAgIHpvb206IDQsXG4gICAgY2VudGVyOiBMLmxhdExuZyh7IGxhdDogNDYuNTU4ODYwMzAzMTE3MTksIGxuZzogMi45ODgyODEyNTAwMDAwMDA0IH0pXG4gIH07XG5cbiAgLy8gTGVhZmxldCBtYXAgY29uZmlndXJhdGlvblxuICBkcmF3bkl0ZW1zID0gbmV3IEwuRmVhdHVyZUdyb3VwKCk7ICAvLyBhbGwgZHJhd24gaXRlbXNcbiAgZHJhd0NvbnRyb2xGdWxsID0gbGVhZmxldE9iamVjdHMuZHJhd0NvbnRyb2xQYW5lbDsgICAgICAvLyBkcmF3IHBhbmVsXG4gIGRyYXdDb250cm9sRWRpdCA9IGxlYWZsZXRPYmplY3RzLmRyYXdDb250cm9sRWRpdFBhbmVsKHRoaXMuZHJhd25JdGVtcyk7ICAvLyBlZGl0IHBhbmVsXG4gIGNpcmNsZU1hcmtlck9wdCA9IGxlYWZsZXRPYmplY3RzLmNpcmNsZU1hcmtlclN0eWxlOyAgICAgLy8gbWFya2VyIG9wdGlvbnNcbiAgZ2VvUmVzdWx0c09wdCA9IGxlYWZsZXRPYmplY3RzLmNpdHlTdHlsZTtcblxuXG5cbiAgLy8gLS0tLVxuICAvLyBDT0RFXG4gIC8vIC0tLS1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGdlb2NvZGVTZXJ2aWNlOiBHZW9jb2RpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWxldmF0aW9uU2VydmljZTogRWxldmF0aW9uU2VydmljZSkgeyB9XG5cbiAgLyoqXG4gICAqIC0gQ3JlYXRlIHRoZSBmb3Jtc1xuICAgKiAtIFNldCB1cCBzdWJzY3JpcHRpb25zIChnZW8gc2VhcmNoLCBnZW9sb2NhdGVkIHBob3RvcywgbGF0IC8gbG5nIGlucHV0cylcbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIENyZWF0ZSBmb3Jtc1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBsYXRJbnB1dDogdGhpcy5mYi5jb250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5sYXRMbmdEZWNWYWxpZGF0b3JdKSxcbiAgICAgIGxuZ0lucHV0OiB0aGlzLmZiLmNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmxhdExuZ0RlY1ZhbGlkYXRvcl0pLFxuICAgICAgZG1zTGF0SW5wdXQ6IHRoaXMuZmIuY29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMubGF0TG5nRG1zVmFsaWRhdG9yXSksXG4gICAgICBkbXNMbmdJbnB1dDogdGhpcy5mYi5jb250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5sYXRMbmdEbXNWYWxpZGF0b3JdKVxuICAgIH0pO1xuXG4gICAgdGhpcy5lbGV2YXRpb25Gb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGVsZXZhdGlvbklucHV0OiB0aGlzLmZiLmNvbnRyb2woJycsIG51bGwpXG4gICAgfSk7XG5cbiAgICB0aGlzLmdlb1NlYXJjaEZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgcGxhY2VJbnB1dDogdGhpcy5mYi5jb250cm9sKCcnLCBudWxsKVxuICAgIH0pO1xuXG4gICAgLy8gV2F0Y2ggcGxhY2VJbnB1dCBjaGFuZ2VzXG4gICAgdGhpcy5nZW9TZWFyY2hTdWJzY3JpcHRpb24gPSB0aGlzLmdlb1NlYXJjaEZvcm1Hcm91cC5jb250cm9scy5wbGFjZUlucHV0LnZhbHVlQ2hhbmdlc1xuICAgIC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKDQwMCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgc3dpdGNoTWFwKHZhbHVlID0+IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdBZGRyZXNzID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VvY29kZVNlcnZpY2UuZ2VvY29kZSh2YWx1ZSk7XG4gICAgICB9KVxuICAgICkuc3Vic2NyaWJlKHJlc3VsdHMgPT4ge1xuICAgICAgdGhpcy5pc0xvYWRpbmdBZGRyZXNzID0gZmFsc2U7XG4gICAgICAvLyBmaWx0ZXIgcmVzdWx0cyBpZiBuZWVkZWRcbiAgICAgIGlmICh0aGlzLm9zbUNsYXNzRmlsdGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5nZW9jb2RlU2VydmljZS5vc21DbGFzc0ZpbHRlcih0aGlzLm9zbUNsYXNzRmlsdGVyLCByZXN1bHRzKS5zdWJzY3JpYmUoZmlsdGVyZWRSZXN1bHRzID0+IHtcbiAgICAgICAgICB0aGlzLmdlb1NlYXJjaFJlc3VsdHMgPSBmaWx0ZXJlZFJlc3VsdHM7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nZW9TZWFyY2hSZXN1bHRzID0gcmVzdWx0cztcbiAgICAgIH1cbiAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgIC8vIEB0b3RvIG1hbmFnZSBlcnJvclxuICAgICAgdGhpcy5pc0xvYWRpbmdBZGRyZXNzID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICAvLyBXYXRjaCBnZW9sb2NhdGVkIHBob3RvIGlucHV0IGNoYW5nZXNcbiAgICB0aGlzLmdlb2xvY2F0ZWRQaG90b0xhdExuZy5zdWJzY3JpYmUocGhvdG9MYXRMbmcgPT4ge1xuICAgICAgLy8gQHRvZG8gY2xlYXIgdGhpcy5nZW9sb2NhdGVkUGhvdG9MYXRMbmdMYXllclxuXG4gICAgICB0aGlzLmdlb2xvY2F0ZWRQaG90b0xhdExuZ0RhdGEgPSBwaG90b0xhdExuZztcblxuICAgICAgLy8gRm9yIGVhY2ggZ2VvbG9jYXRlZCBwaG90bywgYWRkIG1hcmtlciBhbmQgYmluZCBtb3VzZSBldmVudCBvbiB0aG9zZXMgbWFya2Vyc1xuICAgICAgdGhpcy5nZW9sb2NhdGVkUGhvdG9MYXRMbmdEYXRhLmZvckVhY2goZGF0YSA9PiB7XG4gICAgICAgIC8vIEdldCBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIChnZW9sb2NhdGVkIGRhdGEgYXJlIGluIERNUyBmb3JtYXQpXG4gICAgICAgIGNvbnN0IF9sYXREbXMgPSBkYXRhLmxhdC5kZWcgKyAnw4LCsCAnICsgZGF0YS5sYXQubWluICsgJ1xcJycgKyBkYXRhLmxhdC5zZWMgKyAnXCInO1xuICAgICAgICBjb25zdCBfbG5nRG1zID0gZGF0YS5sbmcuZGVnICsgJ8OCwrAgJyArIGRhdGEubG5nLm1pbiArICdcXCcnICsgZGF0YS5sbmcuc2VjICsgJ1wiJztcbiAgICAgICAgY29uc3QgZyA9IG5ldyBHZW9Qb2ludChfbG5nRG1zLCBfbGF0RG1zKTtcbiAgICAgICAgZGF0YS5sYXREZWMgPSBnLmxhdERlYztcbiAgICAgICAgZGF0YS5sbmdEZWMgPSBnLmxvbkRlYztcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIG1hcmtlclxuICAgICAgICBjb25zdCBsYXRMbmcgPSBMLmxhdExuZyhkYXRhLmxhdERlYywgZGF0YS5sbmdEZWMpO1xuICAgICAgICBjb25zdCBncHNQaG90b01hcmtlciA9IG5ldyBMLk1hcmtlcihsYXRMbmcsIHsgaWNvbjogbGVhZmxldE9iamVjdHMuZ3BzUGhvdG9NYXJrZXJJY29uKCkgfSk7XG4gICAgICAgIC8vIE1hcmtlciBwb3B1cFxuICAgICAgICBjb25zdCBodG1sID0gYFxuICAgICAgICAgIDxiPkZpY2hpZXIgXCIke2RhdGEucGhvdG9OYW1lfVwiPC9iPjxicj5cbiAgICAgICAgICBMYXQuIDogJHtnLmxhdERlZ308YnIgLz5cbiAgICAgICAgICBMbmcuIDogJHtnLmxvbkRlZ308YnIgLz5cbiAgICAgICAgICBBbHQuIDogJHtkYXRhLmFsdGl0dWRlfSBtPGJyIC8+PGJyIC8+XG4gICAgICAgICAgPGI+Q2xpcXVleiBzdXIgbGUgcG9pbnQgcG91ciB1dGlsaXNlciBjZXMgY29vcmRvbm7Dg8KpZXM8L2I+YDtcbiAgICAgICAgZ3BzUGhvdG9NYXJrZXIuYmluZFBvcHVwKGh0bWwpLm9wZW5Qb3B1cCgpO1xuICAgICAgICAvLyBNYXJrZXIgbW91c2UgZXZlbnRzXG4gICAgICAgIGdwc1Bob3RvTWFya2VyLm9uKCdjbGljaycsIChldmVudCA9PiB7IHRoaXMuZ3BzTWFya2VyU2V0VmFsdWVzKGRhdGEubGF0RGVjLCBkYXRhLmxuZ0RlYywgZGF0YS5hbHRpdHVkZSk7IH0pKTtcbiAgICAgICAgZ3BzUGhvdG9NYXJrZXIub24oJ21vdXNlb3ZlcicsIChldmVudCkgPT4geyBncHNQaG90b01hcmtlci5vcGVuUG9wdXAoKTsgfSk7XG4gICAgICAgIGdwc1Bob3RvTWFya2VyLm9uKCdtb3VzZW91dCcsIChldmVudCA9PiB7IGdwc1Bob3RvTWFya2VyLmNsb3NlUG9wdXAoKTsgfSkpO1xuICAgICAgICAvLyBBZGQgdGhlIG1hcmtlciB0byB0aGUgbWFwXG4gICAgICAgIGdwc1Bob3RvTWFya2VyLmFkZFRvKHRoaXMuZ2VvbG9jYXRlZFBob3RvTGF0TG5nTGF5ZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEZpdCBtYXAgdG8gZ2VvbG9jYXRlZCBwaG90b3MgbWFya2Vyc1xuICAgICAgdGhpcy5mbHlUb0dlb2xvY2F0ZWRQaG90b0l0ZW1zKCk7XG4gICAgfSk7XG5cbiAgICAvLyBXYXRjaCBsYXQgJiBsbmcgRE1TIGlucHV0cyBjaGFuZ2VzIGFuZCBzZXQgdXAgdGhlIERNUyBmb3JtYXR0ZXJcbiAgICAvLyBUaGUgRE1TIGZvcm1hdHRlciByZXN0cmljdHMgdGhlIGtleWJvYXJkIGlucHV0IG9mIHRoZSB1c2VyIDogb25seSBudW1iZXIsIGNvbW1hLCBkb3QgYW5kICctJywgZGVnIGFuZCBtaW4gbXVzdCBiZSBiZXR3ZWVuIC05MCBhbmQgKzkwXG4gICAgLy8gVGhlIGZvcm1hdHRlciBhdXRvIGZpbGwgdGhlIMOCwrAgJyBhbmQgXCIgY2hhcmFjdGVycyB0byBoZWxwIHRoZSB1c2VyIGlucHV0XG4gICAgdGhpcy5sYXREbXNJbnB1dFN1YnNjcmlwdGlvbiA9IHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmRtc0xhdElucHV0LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgdGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMuZG1zTGF0SW5wdXQuc2V0VmFsdWUoZG1zRm9ybWF0dGVyKHZhbHVlKSwgeyBlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgfSk7XG4gICAgdGhpcy5sbmdEbXNJbnB1dFN1YnNjcmlwdGlvbiA9IHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmRtc0xuZ0lucHV0LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgdGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMuZG1zTG5nSW5wdXQuc2V0VmFsdWUoZG1zRm9ybWF0dGVyKHZhbHVlKSwgeyBlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVcbiAgICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZ2VvU2VhcmNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5sYXREbXNJbnB1dFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubG5nRG1zSW5wdXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbGF5ZXJzIGFuZCBldmVudHMgbGlzdGVuZXJzXG4gICAqL1xuICBvbk1hcFJlYWR5KG1hcDogTC5NYXApIHtcbiAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB0aGlzLm1hcC5hZGRDb250cm9sKEwuY29udHJvbC5sYXllcnMobnVsbCwgdGhpcy5tYXBMYXllcnMsIHsgcG9zaXRpb246ICd0b3ByaWdodCd9KSk7XG4gICAgdGhpcy5tYXAuYWRkTGF5ZXIodGhpcy5kcmF3bkl0ZW1zKTtcbiAgICB0aGlzLm1hcC5hZGRMYXllcih0aGlzLmdlb1Jlc3VsdHNMYXllcik7XG4gICAgdGhpcy5tYXAuYWRkTGF5ZXIodGhpcy5nZW9sb2NhdGVkUGhvdG9MYXRMbmdMYXllcik7XG4gICAgdGhpcy5tYXAuYWRkQ29udHJvbCh0aGlzLmRyYXdDb250cm9sRnVsbCk7XG4gICAgdGhpcy5tYXAub24oJ2RyYXc6Y3JlYXRlZCcsIChlKSA9PiB7XG4gICAgICB0aGlzLmRyYXduSXRlbSA9IGVbJ2xheWVyJ107XG4gICAgICB0aGlzLmRyYXdUeXBlID0gZVsnbGF5ZXJUeXBlJ107XG4gICAgICAvLyBJZiBpdCdzIGEgbWFya2VyLCBpdCBtdXN0IGJlIGRyYWdnYWJsZS4gQnkgZGVmYXVsdCwgbGVhZmxldC5kcmF3IG1vZHVsZSBkb2VzIG5vdCBwcm92aWRlIGEgZHJhZ2dhYmxlIG1hcmtlclxuICAgICAgLy8gU28sIHdlIGRvbid0IGRvIGEgdGhpcy5kcmF3bkl0ZW1zLmFkZExheWVyKGxheWVyKTtcbiAgICAgIC8vIFdlIGp1c3QgZHJhdyBhIG5ldyBkcmFnZ2FibGVNYXJrZXIgaW5zdGVhZFxuICAgICAgaWYgKHRoaXMuZHJhd1R5cGUgPT09ICdtYXJrZXInKSB7XG4gICAgICAgIGNvbnN0IGxhdGxuZyA9IHRoaXMuZHJhd25JdGVtLl9sYXRsbmc7XG4gICAgICAgIGxlYWZsZXRPYmplY3RzLmRyYWdnYWJsZU1hcmtlcihsYXRsbmcubGF0LCBsYXRsbmcubG5nLCAoZHJhZ0VuZCkgPT4geyB0aGlzLmNhbGxHZW9sb2NFbGV2YXRpb25BcGlzVXNpbmdMYXRMbmdJbnB1dHNWYWx1ZXMoKTsgfSkuYWRkVG8odGhpcy5kcmF3bkl0ZW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZHJhd25JdGVtcy5hZGRMYXllcih0aGlzLmRyYXduSXRlbSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cgLyBoaWRlIGNvbnRyb2wgcGFuZWxzXG4gICAgICAvLyBpZiBPTkUgaXRlbSBpcyBkcmF3biwgc2V0IHBsYWNlIGFuZCBlbGV2YXRpb24gaW5wdXRzIChjYWxsIEFQSSlcbiAgICAgIGlmICh0aGlzLmRyYXduSXRlbXMuZ2V0TGF5ZXJzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnNldE1hcEVkaXRNb2RlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kcmF3bkl0ZW1zLmdldExheWVycygpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0aGlzLmNhbGxHZW9sb2NFbGV2YXRpb25BcGlzVXNpbmdMYXRMbmdJbnB1dHNWYWx1ZXMoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5mbHlUb0RyYXduSXRlbXMoKTtcbiAgICB9KTtcblxuICAgIHRoaXMubWFwLm9uKCdkcmF3OmVkaXRlZCcsIChlKSA9PiB7XG4gICAgICB0aGlzLmRyYXduSXRlbSA9IGVbJ2xheWVyJ107XG4gICAgICB0aGlzLmRyYXdUeXBlID0gZVsnbGF5ZXJUeXBlJ107XG5cbi8vICAgICAgdGhpcy5kcmF3bkl0ZW1zLmFkZExheWVyKHRoaXMuZHJhd25JdGVtKTtcblxuICAgICAgaWYgKHRoaXMuZHJhd25JdGVtcy5nZXRMYXllcnMoKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdGhpcy5jYWxsR2VvbG9jRWxldmF0aW9uQXBpc1VzaW5nTGF0TG5nSW5wdXRzVmFsdWVzKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmx5VG9EcmF3bkl0ZW1zKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm1hcC5vbignZHJhdzpkZWxldGVkJywgKGUpID0+IHtcbiAgICAgIHRoaXMuY2xlYXJHZW9SZXN1bHRzTGF5ZXIoKTtcbiAgICAgIHRoaXMuY2xlYXJEcmF3bkl0ZW1zTGF5ZXIoKTtcbiAgICAgIHRoaXMuc2V0TWFwRHJhd01vZGUoKTtcbiAgICAgIHRoaXMuY2xlYXJGb3JtKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZHJhd01hcCgxMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIG1hcCBwYXJlbnQncyBkaXYgc2l6ZSBjaGFuZ2UgKGVnLiBwYW5lbCB3aWR0aCksIGhhdmUgdG8gcmVkcmF3IHRoZSBtYXBcbiAgICogU29tZXRpbWVzICh3aGVuIG9wZW5pbmcgLyBjbG9zaW5nIGEgdGFiKSwgc2l6ZSBjaGFuZ2UgaXMgZGV0ZWN0ZWQgdG9vIGVhcmxpZXIsIG5lZWQgdG8gc2V0IGEgZGVsYXkgKGFib3V0IDEwLTEwMG1zIHNlZW1zIHRvIGJlIGNvbnZlbmllbnQpXG4gICAqL1xuICByZWRyYXdNYXAoZGVsYXk/OiBudW1iZXIpIHtcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMubWFwLmludmFsaWRhdGVTaXplKCksIGRlbGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXAuaW52YWxpZGF0ZVNpemUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvdyB0aGUgXCJlZGl0XCIgdG9vbGJhciBpbnNpZGUgbWFwXG4gICAqL1xuICBzZXRNYXBFZGl0TW9kZSgpIHtcbiAgICB0aGlzLm1hcC5yZW1vdmVDb250cm9sKHRoaXMuZHJhd0NvbnRyb2xGdWxsKTtcbiAgICB0aGlzLm1hcC5hZGRDb250cm9sKHRoaXMuZHJhd0NvbnRyb2xFZGl0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZSBcImRyYXdcIiB0b29sYmFyIGluc2lkZSBtYXBcbiAgICovXG4gIHNldE1hcERyYXdNb2RlKCkge1xuICAgIHRoaXMubWFwLnJlbW92ZUNvbnRyb2wodGhpcy5kcmF3Q29udHJvbEVkaXQpO1xuICAgIHRoaXMubWFwLmFkZENvbnRyb2wodGhpcy5kcmF3Q29udHJvbEZ1bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtYXAgYm91bmRzIHRvIGRyYXduIGl0ZW1zXG4gICAqL1xuICBmbHlUb0RyYXduSXRlbXMoX21heFpvb20gPSAxNCkge1xuICAgIGNvbnN0IGIgPSB0aGlzLmRyYXduSXRlbXMuZ2V0Qm91bmRzKCk7XG4gICAgdGhpcy5tYXAuZmx5VG9Cb3VuZHMoYiwgeyBtYXhab29tOiBfbWF4Wm9vbSwgYW5pbWF0ZTogZmFsc2UgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1hcCBib3VuZHMgdG8gZ2VvIHJldWx0cyBpdGVtc1xuICAgKi9cbiAgZmx5VG9HZW9SZXN1bHRzSXRlbXMoKSB7XG4gICAgY29uc3QgYiA9IHRoaXMuZ2VvUmVzdWx0c0xheWVyLmdldEJvdW5kcygpO1xuICAgIHRoaXMubWFwLmZseVRvQm91bmRzKGIsIHsgbWF4Wm9vbTogMTQsIGFuaW1hdGU6IGZhbHNlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtYXAgYm91bmRzIHRvIGdlb2xvY2F0ZWQgcGhvdG9zIGl0ZW1zXG4gICAqL1xuICBmbHlUb0dlb2xvY2F0ZWRQaG90b0l0ZW1zKCkge1xuICAgIGNvbnN0IGIgPSB0aGlzLmdlb2xvY2F0ZWRQaG90b0xhdExuZ0xheWVyLmdldEJvdW5kcygpO1xuICAgIHRoaXMubWFwLmZseVRvQm91bmRzKGIsIHsgbWF4Wm9vbTogMTQsIGFuaW1hdGU6IGZhbHNlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgYSBtYXJrZXIgb24gZHJhd0l0ZW1zIGZlYXR1cmVHcm91cCB3aXRoIERNUyBpbnB1dCB2YWx1ZXNcbiAgICovXG4gIGFkZE1hcmtlckZyb21EbXNDb29yZCgpIHtcbiAgICAvLyBjbGVhciBkcmF3biBpdGVtcyBsYXllclxuICAgIHRoaXMuY2xlYXJEcmF3bkl0ZW1zTGF5ZXIoKTtcblxuICAgIC8vIHVwZGF0ZSBtYXAgdG9vbGJhclxuICAgIHRoaXMuc2V0TWFwRWRpdE1vZGUoKTtcbiAgICAvLyBAVE9ETyBjaGVjayBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIHZhbHVlcyAoZm9ybWF0ICsgbGltaXRzKVxuICAgIGNvbnN0IGdlb3BvaW50ID0gbmV3IEdlb1BvaW50KHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmRtc0xuZ0lucHV0LnZhbHVlLCB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMYXRJbnB1dC52YWx1ZSk7XG4gICAgbGVhZmxldE9iamVjdHMuZHJhZ2dhYmxlTWFya2VyKGdlb3BvaW50LmdldExhdERlYygpLCBnZW9wb2ludC5nZXRMb25EZWMoKSwgKGUpID0+IHsgLyogZHJhZ2VuZCBjYWxsYmFjayBmbiAqLyB9KS5hZGRUbyh0aGlzLmRyYXduSXRlbXMpO1xuXG4gICAgLy8gU2V0IChkZWNpbWFsKSBsYXRMbmcgaW5wdXRzXG4gICAgdGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMubGF0SW5wdXQuc2V0VmFsdWUoZ2VvcG9pbnQuZ2V0TGF0RGVjKCksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5sbmdJbnB1dC5zZXRWYWx1ZShnZW9wb2ludC5nZXRMYXREZWMoKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgLy8gRmx5XG4gICAgdGhpcy5mbHlUb0RyYXduSXRlbXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IGEgbWFya2VyIG9uIGRyYXdJdGVtcyBmZWF0dXJlR3JvdXAgd2l0aCBkZWNpbWFsIGlucHV0IHZhbHVlc1xuICAgKi9cbiAgYWRkTWFya2VyRnJvbUxhdExuZ0Nvb3JkKCkge1xuICAgIC8vIGNsZWFyIGRyYXduIGl0ZW1zIGxheWVyXG4gICAgdGhpcy5jbGVhckRyYXduSXRlbXNMYXllcigpO1xuXG4gICAgLy8gdXBkYXRlIG1hcCB0b29sYmFyXG4gICAgdGhpcy5zZXRNYXBFZGl0TW9kZSgpO1xuXG4gICAgLy8gVE9ETyBjaGVjayBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIHZhbHVlcyAoZm9ybWF0ICsgbGltaXRzKVxuICAgIGNvbnN0IGdlb3BvaW50ID0gbmV3IEdlb1BvaW50KE51bWJlcih0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5sbmdJbnB1dC52YWx1ZSksIE51bWJlcih0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5sYXRJbnB1dC52YWx1ZSkpO1xuICAgIGxlYWZsZXRPYmplY3RzLmRyYWdnYWJsZU1hcmtlcihnZW9wb2ludC5nZXRMYXREZWMoKSwgZ2VvcG9pbnQuZ2V0TG9uRGVjKCksIChkcmFnRW5kKSA9PiB7IC8qIGRyYWdlbmQgY2FsbGJhY2sgZm4gKi8gfSkuYWRkVG8odGhpcy5kcmF3bkl0ZW1zKTtcblxuICAgIC8vIFNldCBkbXNMYXRMbmcgaW5wdXRzXG4gICAgdGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMuZG1zTGF0SW5wdXQuc2V0VmFsdWUoZ2VvcG9pbnQuZ2V0TGF0RGVnKCksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMbmdJbnB1dC5zZXRWYWx1ZShnZW9wb2ludC5nZXRMb25EZWcoKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgLy8gRmx5XG4gICAgdGhpcy5mbHlUb0RyYXduSXRlbXMoKTtcbiAgfVxuXG4gIC8qKlxuICAqXG4gICovXG4gIGFkZFBvbHlsaW5lKGNvb3JkaW5hdGVzOiBMYXRMbmdFeHByZXNzaW9uW10pIHtcbiAgICAvLyBjbGVhciBkcmF3biBpdGVtcyBsYXllclxuICAgIHRoaXMuY2xlYXJEcmF3bkl0ZW1zTGF5ZXIoKTtcblxuICAgIC8vIHVwZGF0ZSBtYXAgdG9vbGJhclxuICAgIHRoaXMuc2V0TWFwRWRpdE1vZGUoKTtcblxuICAgIC8vIGRyYXdcbiAgICBjb25zdCBwb2x5bGluZSA9IEwucG9seWxpbmUoY29vcmRpbmF0ZXMpO1xuICAgIHBvbHlsaW5lLmFkZFRvKHRoaXMuZHJhd25JdGVtcyk7XG5cbiAgICAvLyBmbHkgd2l0aCBtYXggem9vbVxuICAgIHRoaXMuZmx5VG9EcmF3bkl0ZW1zKDE4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgaW5wdXQgdmFsdWVzIGFuZCBjYWxsIGdlb2NvZGluZyBhbmQgZWxldmF0aW9uIEFQSVxuICAgKiBTb21ldGltZXMgeW91IG1heSB3YW50IHRvIGZvcmNlIHRoZSBlbGV2YXRpb24gdmFsdWUgYW5kIGF2b2lkIGNhbGxpbmcgZWxldmF0aW9uIEFQSSAoZWcuIGVsZXZhdGlvbiBjb21lIGZyb20gZ3BzIHBob3RvIG1ldGFkYXRhKVxuICAgKiB0aGVuLCB5b3UgY2FzIHVzZSB0aGUgYXZvaWRDYWxsaW5nRWxldmF0aW9uQXBpIG9wdGlvblxuICAgKlxuICAgKiBXaGF0IGlzIGRvbmUgaW5zaWRlIHRoaXMgZnVuY3Rpb24gOlxuICAgKiAtIGNyZWF0ZSBhbiBvYnNlcnZhYmxlIHRoYXQgemlwIGFsbCByZXF1aXJlZCBvYnNlcnZhYmxlc1xuICAgKiAtIGRvIGEgc3dpdGNobWFwIG9uIHRoZSBtYWluIG9ic2VydmFibGUgc28gdGhhdCBpZiBvbmUgb25lIHRoZSBzdWItb2JzZXJ2YWJsZSBjaGFuZ2UsIG9sZCBkYXRhIGFyZSBpZ25vcmVkXG4gICAqIC0gd2hlbiB0aGUgbWFpbiBvYnNlcnZhYmxlIGlzIGZpbmlzaGVkLCBjYW4gc2VuZCBuZXcgbG9jYXRpb24gT3V0cHV0XG4gICAqXG4gICAqIFNldmVyYWwgaWYgLyBlbHNlIGF2b2lkQ2FsbGluZ0VsZXZhdGlvbkFwaSBhcmUgdXNlZCBiZWNhdXNlIHdoZW5cbiAgICogYXZvaWRDYWxsaW5nRWxldmF0aW9uQXBpID09PSBmYWxzZSwgaHR0cFRhc2tzIHJldHVybnMgYSBzaW5nbGUgdmFsdWUgKG9zbVBsYWNlKVxuICAgKiB3aGVyZWFzIGlmIGF2b2lkQ2FsbGluZ0VsZXZhdGlvbkFwaSA9PT0gdHJ1ZSwgaHR0cFRhc2tzIHJldHVybnMgYW4gYXJyYXkgb2YgMiB2YWx1ZXMgW2VsZXZhdGlvbiwgb3NtUGxhY2VdXG4gICAqL1xuICBjYWxsR2VvbG9jRWxldmF0aW9uQXBpc1VzaW5nTGF0TG5nSW5wdXRzVmFsdWVzKGF2b2lkQ2FsbGluZ0VsZXZhdGlvbkFwaSA9IGZhbHNlLCBhdm9pZENhbGxpbmdHZW9sb2NBcGkgPSBmYWxzZSk6IHZvaWQge1xuXG4gICAgdGhpcy5zZXRMYXRMbmdJbnB1dEZyb21EcmF3bkl0ZW1zKCk7XG4gICAgdGhpcy5zZXRMYXRMbmdEbXNJbnB1dEZyb21EcmF3bkl0ZW1zKCk7XG4gICAgbGV0IGh0dHBUYXNrczogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIGxldCBlbGV2YXRpb246IGFueTtcbiAgICBsZXQgb3NtUGxhY2U6IGFueTtcblxuICAgIGlmIChhdm9pZENhbGxpbmdFbGV2YXRpb25BcGkgJiYgIWF2b2lkQ2FsbGluZ0dlb2xvY0FwaSkge1xuICAgICAgaHR0cFRhc2tzID0gdGhpcy5yZXZlcnNlR2VvY29kaW5nRnJvbUlucHV0VmFsdWUoKTtcbiAgICB9IGVsc2UgaWYgKGF2b2lkQ2FsbGluZ0dlb2xvY0FwaSAmJiAhYXZvaWRDYWxsaW5nRWxldmF0aW9uQXBpKSB7XG4gICAgICBodHRwVGFza3MgPSB0aGlzLmdldEVsZXZhdGlvbkZyb21JbnB1dFZhbHVlKCk7XG4gICAgfSBlbHNlIGlmICghYXZvaWRDYWxsaW5nRWxldmF0aW9uQXBpICYmICFhdm9pZENhbGxpbmdHZW9sb2NBcGkpIHtcbiAgICAgIGh0dHBUYXNrcyA9IHppcChcbiAgICAgICAgdGhpcy5nZXRFbGV2YXRpb25Gcm9tSW5wdXRWYWx1ZSgpLFxuICAgICAgICB0aGlzLnJldmVyc2VHZW9jb2RpbmdGcm9tSW5wdXRWYWx1ZSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoYXZvaWRDYWxsaW5nRWxldmF0aW9uQXBpICYmIGF2b2lkQ2FsbGluZ0dlb2xvY0FwaSkge1xuICAgICAgLy8gbm90aGluZyB0byBkbyA7IHRocm93IG9yIGxvZyBhbiBlcnJvciA/XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc3Bpbm5uZXJzIG9uXG4gICAgdGhpcy5pc0xvYWRpbmdBZGRyZXNzID0gIWF2b2lkQ2FsbGluZ0dlb2xvY0FwaTtcbiAgICB0aGlzLmlzTG9hZGluZ0VsZXZhdGlvbiA9ICFhdm9pZENhbGxpbmdFbGV2YXRpb25BcGk7XG5cbiAgICBodHRwVGFza3Muc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICB0aGlzLmlzTG9hZGluZ0VsZXZhdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0xvYWRpbmdBZGRyZXNzID0gZmFsc2U7XG4gICAgICBpZiAoYXZvaWRDYWxsaW5nRWxldmF0aW9uQXBpICYmICFhdm9pZENhbGxpbmdHZW9sb2NBcGkpIHtcbiAgICAgICAgZWxldmF0aW9uID0gbnVsbDtcbiAgICAgICAgb3NtUGxhY2UgPSByZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKGF2b2lkQ2FsbGluZ0dlb2xvY0FwaSAmJiAhYXZvaWRDYWxsaW5nRWxldmF0aW9uQXBpKSB7XG4gICAgICAgIGVsZXZhdGlvbiA9IHJlc3VsdDtcbiAgICAgICAgb3NtUGxhY2UgPSBudWxsO1xuICAgICAgICBlbGV2YXRpb24gPSByZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKCFhdm9pZENhbGxpbmdHZW9sb2NBcGkgJiYgIWF2b2lkQ2FsbGluZ0dlb2xvY0FwaSkge1xuICAgICAgICBlbGV2YXRpb24gPSByZXN1bHRbMF07XG4gICAgICAgIG9zbVBsYWNlID0gcmVzdWx0WzFdO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgZWxldmF0aW9uIGlucHV0XG4gICAgICBpZiAoIWF2b2lkQ2FsbGluZ0VsZXZhdGlvbkFwaSkgeyB0aGlzLmVsZXZhdGlvbkZvcm1Hcm91cC5jb250cm9scy5lbGV2YXRpb25JbnB1dC5zZXRWYWx1ZShlbGV2YXRpb24pOyB9XG5cbiAgICAgIC8vIFBhdGNoIHBsYWNlIGlucHV0IHZhbHVlXG4gICAgICBpZiAoIWF2b2lkQ2FsbGluZ0dlb2xvY0FwaSkge1xuICAgICAgICB0aGlzLmdlb1NlYXJjaEZvcm1Hcm91cC5jb250cm9scy5wbGFjZUlucHV0LnBhdGNoVmFsdWUodGhpcy5nZW9jb2RlU2VydmljZS5nZXRSZWFkYmxlQWRkcmVzcyhvc21QbGFjZSksIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGJpbmQgX2xvY2F0aW9uICYgZW1pdCBsb2NhdGlvblxuICAgICAgaWYgKGF2b2lkQ2FsbGluZ0VsZXZhdGlvbkFwaSkge1xuICAgICAgICB0aGlzLmJpbmRMb2NhdGlvbk91dHB1dChbdGhpcy5lbGV2YXRpb25Gb3JtR3JvdXAuY29udHJvbHMuZWxldmF0aW9uSW5wdXQudmFsdWUsIG9zbVBsYWNlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJpbmRMb2NhdGlvbk91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuXG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgLy8gTWFuYWdlIGVycm9yXG4gICAgICAvLyBzcGlubm5lcnMgb2ZmXG4gICAgICB0aGlzLmlzTG9hZGluZ0FkZHJlc3MgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNMb2FkaW5nRWxldmF0aW9uID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdWxkIGJlIGltcHJvdmVkIGZvciBjb21wbGV4IHBvbHlnb25zIC8gcG9seWxpbmVzID9cbiAgICogQ291bGQgdXNlIHR1cmYuanNcbiAgICovXG4gIHNldExhdExuZ0lucHV0RnJvbURyYXduSXRlbXMoKTogdm9pZCB7XG4gICAgY29uc3QgY2VudHJvaWQgPSB0aGlzLmRyYXduSXRlbXMuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7XG4gICAgdGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMubGF0SW5wdXQuc2V0VmFsdWUoY2VudHJvaWQubGF0KTtcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5sbmdJbnB1dC5zZXRWYWx1ZShjZW50cm9pZC5sbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBzZXRMYXRMbmdEbXNJbnB1dEZyb21EcmF3bkl0ZW1zKCk6IHZvaWQge1xuICAgIGNvbnN0IGNlbnRyb2lkID0gdGhpcy5kcmF3bkl0ZW1zLmdldEJvdW5kcygpLmdldENlbnRlcigpO1xuICAgIGNvbnN0IGdlb3BvaW50ID0gbmV3IEdlb1BvaW50KGNlbnRyb2lkLmxuZywgY2VudHJvaWQubGF0KTtcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMYXRJbnB1dC5wYXRjaFZhbHVlKGdlb3BvaW50LmdldExhdERlZygpKTtcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMbmdJbnB1dC5wYXRjaFZhbHVlKGdlb3BvaW50LmdldExvbkRlZygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgZ2V0RWxldmF0aW9uRnJvbUlucHV0VmFsdWUoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5lbGV2YXRpb25TZXJ2aWNlLmdldEVsZXZhdGlvbih0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5sYXRJbnB1dC52YWx1ZSwgdGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMubG5nSW5wdXQudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVyc2UgZ2VvY29kaW5nIGZyb20gbGF0IC8gbG5nIGlucHV0cyB2YWx1ZXNcbiAgICovXG4gIHJldmVyc2VHZW9jb2RpbmdGcm9tSW5wdXRWYWx1ZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdlb2NvZGVTZXJ2aWNlLnJldmVyc2UodGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMubGF0SW5wdXQudmFsdWUsIHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxuZ0lucHV0LnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXRpdHVkZSAvIGxvbmdpdHVkZSBETVMgZm9ybSBWYWxpZGF0b3JcbiAgICovXG4gIGxhdExuZ0Rtc1ZhbGlkYXRvcihjb250cm9sOiBGb3JtQ29udHJvbCkge1xuICAgIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoJ14oXFxcXC0pP1swLTldezEsMn1cXFxcw4LCsCBbMC05XXsxLDJ9XFxcXFxcJyBbMC05XXsxLDJ9XFxcXC5bMC05XXsxLDEyfVxcXFxcIicpO1xuICAgIHJldHVybiByZWdleHAudGVzdChjb250cm9sLnZhbHVlKSA/IG51bGwgOiB7IG1hbGZvcm1lZExhdExuZ0Rtc0Zvcm1hdDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExhdGl0dWRlIC8gbG9uZ2l0dWRlIGRlY2ltYWwgZm9ybSB2YWxpZGF0b3JcbiAgICovXG4gIGxhdExuZ0RlY1ZhbGlkYXRvcihjb250cm9sOiBGb3JtQ29udHJvbCkge1xuICAgIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoJ14oXFxcXC0pP1swLTldezEsMn1cXFxcLlswLTldezEsMjB9Jyk7XG4gICAgcmV0dXJuIHJlZ2V4cC50ZXN0KGNvbnRyb2wudmFsdWUpID8gbnVsbCA6IHsgbWFsZm9ybWVkTGF0TG5nRGVjRm9ybWF0OiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogV2hlbiB1c2VyIHNlbGVjdCBhbiBhZGRyZXNzIHdpdGhpbiB0aGUgYXV0b2NvbXBsZXRlIHJlc3VsdHMgbGlzdFxuICAgKlxuICAgKiBDYWxsIHRoZSBnZW9sb2MgQVBJIDIgdGltZXMgOlxuICAgKiAgLSBmaXJzdCBjYWxsIGlzIGZvciByZXZlcnNlIGdlb2NvZGluZ1xuICAgKiAgLSBzZWNvbmQgY2FsbCBpcyBmb3IgZ2VvY29uZGluZywgc28gdGhlIGFkZHJlc3MgaW5wdXQgKHBsYWNlSW5wdXQpIGlzIHVwZGF0ZWRcbiAgICovXG4gIGFkZHJlc3NTZWxlY3RlZENoYW5nZWQoZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpIHtcbiAgICBjb25zdCBvc21QbGFjZSA9IGV2ZW50Lm9wdGlvbi52YWx1ZTtcbiAgICAvLyBGaXQgbWFwIGJvdW5kc1xuICAgIGNvbnN0IHNvdXRoV2VzdCA9IG5ldyBMLkxhdExuZyhvc21QbGFjZS5ib3VuZGluZ2JveFswXSwgb3NtUGxhY2UuYm91bmRpbmdib3hbMl0pO1xuICAgIGNvbnN0IG5vcnRoRWFzdCA9IG5ldyBMLkxhdExuZyhvc21QbGFjZS5ib3VuZGluZ2JveFsxXSwgb3NtUGxhY2UuYm91bmRpbmdib3hbM10pO1xuICAgIHRoaXMubWFwLmZpdEJvdW5kcyhMLmxhdExuZ0JvdW5kcyhzb3V0aFdlc3QsIG5vcnRoRWFzdCkpO1xuXG4gICAgLy8gQWRkIGdlb2pzb24gdG8gdGhlIG1hcCAoaWYgdXNlciBlbnRlciBhIGNpdHksIGRyYXcgdGhlIGFkbWluaXN0cmF0aXZlIHNoYXBlIG9uIHRoZSBtYXApXG4gICAgdGhpcy5jbGVhckdlb1Jlc3VsdHNMYXllcigpO1xuICAgIHRoaXMuZ2VvUmVzdWx0c0xheWVyLmFkZERhdGEob3NtUGxhY2UuZ2VvanNvbik7XG5cbiAgICAvLyBGbHlcbiAgICB0aGlzLmZseVRvR2VvUmVzdWx0c0l0ZW1zKCk7XG5cbiAgICAvLyBQYXRjaCBpbnB1dCB2YWx1ZVxuICAgIHRoaXMuZ2VvU2VhcmNoRm9ybUdyb3VwLmNvbnRyb2xzLnBsYWNlSW5wdXQucGF0Y2hWYWx1ZSh0aGlzLmdlb2NvZGVTZXJ2aWNlLmdldFJlYWRibGVBZGRyZXNzKG9zbVBsYWNlKSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAvLyBGaWxsIGxhdGl0dWRlLCBsb25naXR1ZGUgJiBhbHRpdHVkZSBpbnB1dHNcbiAgICBjb25zdCBnID0gbmV3IEdlb1BvaW50KE51bWJlcihvc21QbGFjZS5sb24pLCBOdW1iZXIob3NtUGxhY2UubGF0KSk7XG4gICAgdGhpcy5sYXRsbmdGb3JtR3JvdXAuY29udHJvbHMubGF0SW5wdXQuc2V0VmFsdWUob3NtUGxhY2UubGF0LCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxuZ0lucHV0LnNldFZhbHVlKG9zbVBsYWNlLmxvbiwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMYXRJbnB1dC5zZXRWYWx1ZShnLmdldExhdERlZygpICwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5kbXNMbmdJbnB1dC5zZXRWYWx1ZShnLmdldExvbkRlZygpLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMuZWxldmF0aW9uRm9ybUdyb3VwLmNvbnRyb2xzLmVsZXZhdGlvbklucHV0LnNldFZhbHVlKG9zbVBsYWNlLmVsZXZhdGlvbiwge2VtaXRFdmVudDogZmFsc2V9KTtcblxuICAgIC8vIERyYXcgYSBwb2x5bGluZSBvciBwbGFjZSBhIG1hcmtlciBhdCB0aGUgY2VudGVyIG9mIGEgcG9seWdvblxuICAgIGlmIChvc21QbGFjZS5nZW9qc29uLnR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgLy8gb3NtIGdlb2pzb24gY29vcmRpbmF0ZXMgaXMgbGlrZSBbW2xvbmcsIGxhdF0sIFtsb25nLCBsYXRdLCAuLi5dXG4gICAgICAvLyBidXQgbGVhZmxldCBuZWVkcyBbW2xhdCwgbG9uZ10sIFtsYXQsIGxvbmddLCAuLi5dIGZvcm1hdCAhXG4gICAgICB0aGlzLmdlb2NvZGVTZXJ2aWNlLnNpbXBsaWZ5UG9seWxpbmUob3NtUGxhY2UuZ2VvanNvbi5jb29yZGluYXRlcyk7XG4gICAgICB0aGlzLmFkZFBvbHlsaW5lKHRoaXMuZ2VvY29kZVNlcnZpY2UucmV2ZXJzZUNvcnJkaW5hdGVzQXJyYXkoXG4gICAgICAgIHRoaXMuZ2VvY29kZVNlcnZpY2Uuc2ltcGxpZnlQb2x5bGluZShvc21QbGFjZS5nZW9qc29uLmNvb3JkaW5hdGVzKSkgYXMgTGF0TG5nRXhwcmVzc2lvbltdXG4gICAgICApO1xuICAgICAgdGhpcy5jbGVhckdlb1Jlc3VsdHNMYXllcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZE1hcmtlckZyb21MYXRMbmdDb29yZCgpO1xuICAgIH1cblxuICAgIC8vIENhbGwgZ2VvbG9jIGFuZCBlbGV2YXRpb24gQVBJc1xuICAgIHRoaXMuY2FsbEdlb2xvY0VsZXZhdGlvbkFwaXNVc2luZ0xhdExuZ0lucHV0c1ZhbHVlcyhmYWxzZSwgZmFsc2UpO1xuXG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGZvcm0gd2hlbiBuZWRkZWQgOiAnZHJhdzpkZWxldGVkJywgZXRjLlxuICAgKi9cbiAgY2xlYXJGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxhdElucHV0LnNldFZhbHVlKCcnLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxuZ0lucHV0LnNldFZhbHVlKCcnLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmRtc0xhdElucHV0LnNldFZhbHVlKCcnLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmRtc0xuZ0lucHV0LnNldFZhbHVlKCcnLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwLnJlc2V0KCk7XG5cbiAgICB0aGlzLmVsZXZhdGlvbkZvcm1Hcm91cC5jb250cm9scy5lbGV2YXRpb25JbnB1dC5zZXRWYWx1ZSgnJywge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB0aGlzLmVsZXZhdGlvbkZvcm1Hcm91cC5yZXNldCgpO1xuXG4gICAgdGhpcy5nZW9TZWFyY2hGb3JtR3JvdXAuY29udHJvbHMucGxhY2VJbnB1dC5zZXRWYWx1ZSgnJywge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBnZW9SZXN1bHRzIGxheWVyIChlZyB0aGlzIGxheWVyIGNvbnRhaW5zIGFkbWluaXN0cmF0aXZlIHBvbHlnb25zIC0tIFwiY29tbXVuZVwiKVxuICAgKi9cbiAgY2xlYXJHZW9SZXN1bHRzTGF5ZXIoKSB7XG4gICAgdGhpcy5nZW9SZXN1bHRzTGF5ZXIuY2xlYXJMYXllcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgY2xlYXJEcmF3bkl0ZW1zTGF5ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5kcmF3bkl0ZW1zLmNsZWFyTGF5ZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIHJlc2V0TG9jYXRpb24oKSB7XG4gICAgdGhpcy5sb2NhdGlvbiA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQmluZCBkYXRhIGZyb20gZWxldmF0aW9uIGFuZCBPU00gaHR0cCByZXN1bHRzIHRvIHRoaXMuX2xvY2F0aW9uXG4gICAqIFBlcmZvcm0gc29tZSB2ZXJpZmljYXRpb25zIHRvIGVuc3VyZSBkYXRhIGludGVncml0eVxuICAgKiBAcGFyYW0gZGF0YSBkYXRhWzBdID0gZWxldmF0aW9uLCBkYXRhWzFdID0gb3NtIGRhdGEgfCBkYXRhID0gb3NtIGRhdGFcbiAgICovXG4gIGJpbmRMb2NhdGlvbk91dHB1dChkYXRhOiBBcnJheTxhbnk+IHwgYW55KTogdm9pZCB7XG4gICAgLy8gaWYgZWxldmF0aW9uID0gMCBvciBudWxsID9cbiAgICAvLyBpZiBvc20gZGF0YSBpbmNvbXBsZXRlID9cbiAgICBsZXQgZWxldmF0aW9uOiBhbnk7XG4gICAgbGV0IG9zbVBsYWNlOiBhbnk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGVsZXZhdGlvbiA9IGRhdGFbMF07XG4gICAgICBvc21QbGFjZSA9IGRhdGFbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZXZhdGlvbiA9IHRoaXMuZWxldmF0aW9uRm9ybUdyb3VwLmNvbnRyb2xzLmVsZXZhdGlvbklucHV0LnZhbHVlO1xuICAgICAgb3NtUGxhY2UgPSBkYXRhO1xuICAgIH1cbiAgICB0aGlzLl9sb2NhdGlvbi5nZW9tZXRyeSA9IHRoaXMuZHJhd25JdGVtcy50b0dlb0pTT04oKTtcbiAgICAvLyBnZW9kYXR1bVxuICAgIHRoaXMuX2xvY2F0aW9uLmVsZXZhdGlvbiA9IGVsZXZhdGlvbjtcbiAgICB0aGlzLl9sb2NhdGlvbi5sb2NhbGl0eUNvbnNpc3RlbmN5ID0gdGhpcy5fbG9jYXRpb24ubG9jYWxpdHlDb25zaXN0ZW5jeSA/IHRydWUgOiBudWxsOyAgIC8vIHBlcmZvcm0gOiBDb2jDg8KpcmVuY2UgZW50cmUgbGVzIGNvb3Jkb25uw4PCqWVzIGV0IGxhIGxvY2FsaXTDg8KpXG4gICAgdGhpcy5fbG9jYXRpb24ubG9jYXRpb25BY2N1cmFjeSA9IHRoaXMuX2xvY2F0aW9uLmxvY2F0aW9uQWNjdXJhY3kgPyAwIDogbnVsbDsgICAgICAgICAvLyBwZXJmb3JtIDogUHLDg8KpY2lzaW9uIChvdSBpbmNlcnRpdHVkZSkgZGUgbGEgbG9jYWxpc2F0aW9uLCBlbiBtw4PCqHRyZXMgLS0+IHZvaXIgbGUgbm9tYnJlIGRlIGTDg8KpY2ltYWxlcyBwb3VyIGRlY0xhdElucHV0IG91IGRlY0xuZ0lucHV0IHNpIHBvaW50LCBzaW5vbiwgZGVtaS1sb25nZXVyIGRlIGxhIGJvdW5kaW5nLWJveFxuICAgIC8vIHB1Ymxpc2hlZF9sb2NhdGlvbiA6IFByw4PCqWNpc2lvbiBnw4PCqW9ncmFwaGlxdWUgw4PCoCBsYXF1ZWxsZSBlc3QgcHVibGnDg8KpZSBsJ29icywgcGVybWV0IGRlIGfDg8KpcmVyIGxlIGZsb3V0YWdlIC0gUHLDg8KpY2lzZSwgTG9jYWxpdMODwqksIE1haWxsZSAxMHgxMGttXG5cbiAgICB0aGlzLl9sb2NhdGlvbi5vc21Db3VudHJ5ID0gb3NtUGxhY2UuYWRkcmVzcy5jb3VudHJ5O1xuICAgIHRoaXMuX2xvY2F0aW9uLm9zbUNvdW50cnlDb2RlID0gb3NtUGxhY2UuYWRkcmVzcy5jb3VudHJ5X2NvZGU7XG4gICAgdGhpcy5fbG9jYXRpb24ub3NtQ291bnR5ID0gb3NtUGxhY2UuYWRkcmVzcy5jb3VudHk7XG4gICAgdGhpcy5fbG9jYXRpb24ub3NtUG9zdGNvZGUgPSBvc21QbGFjZS5hZGRyZXNzLnBvc3Rjb2RlO1xuICAgIGlmIChvc21QbGFjZS5hZGRyZXNzLmNpdHkpIHsgdGhpcy5fbG9jYXRpb24ubG9jYWxpdHkgPSBvc21QbGFjZS5hZGRyZXNzLmNpdHk7IH1cbiAgICBpZiAob3NtUGxhY2UuYWRkcmVzcy50b3duKSB7IHRoaXMuX2xvY2F0aW9uLmxvY2FsaXR5ID0gb3NtUGxhY2UuYWRkcmVzcy50b3duOyB9XG4gICAgaWYgKG9zbVBsYWNlLmFkZHJlc3MudmlsbGFnZSkgeyB0aGlzLl9sb2NhdGlvbi5sb2NhbGl0eSA9IG9zbVBsYWNlLmFkZHJlc3MudmlsbGFnZTsgfVxuXG4gICAgdGhpcy5fbG9jYXRpb24uc3VibG9jYWxpdHkgPSBvc21QbGFjZS5oYW1sZXQ7XG5cbiAgICB0aGlzLl9sb2NhdGlvbi5vc21Sb2FkID0gb3NtUGxhY2UuYWRkcmVzcy5yb2FkO1xuICAgIHRoaXMuX2xvY2F0aW9uLm9zbVN0YXRlID0gb3NtUGxhY2UuYWRkcmVzcy5zdGF0ZTtcbiAgICB0aGlzLl9sb2NhdGlvbi5vc21TdWJ1cmIgPSBvc21QbGFjZS5hZGRyZXNzLnN1YnVyYjtcblxuICAgIHRoaXMuX2xvY2F0aW9uLm9zbUlkID0gb3NtUGxhY2Uub3NtX2lkO1xuICAgIHRoaXMuX2xvY2F0aW9uLm9zbU5laWdoYm91cmhvb2QgPSBudWxsOyAgICAgIC8vIG5vdCBwcm92aWRlZCBieSBub21pbmF0aW1cbiAgICB0aGlzLl9sb2NhdGlvbi5vc21QbGFjZUlkID0gb3NtUGxhY2UucGxhY2VfaWQ7XG4gICAgdGhpcy5fbG9jYXRpb24ucHVibGlzaGVkTG9jYXRpb24gPSBudWxsOyAgICAgLy8gcGVyZm9ybVxuICAgIHRoaXMuX2xvY2F0aW9uLnN0YXRpb24gPSBudWxsOyAgICAgICAgICAgICAgIC8vIHBlcmZvcm1cblxuICAgIC8vIFZlcmlmaWNhdGlvbnNcbiAgICAvLyBAdG9kb1xuXG4gICAgLy8gRW1pdFxuICAgIHRoaXMubG9jYXRpb24ubmV4dCh0aGlzLl9sb2NhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBmb3JtIGNvb3JkaW5hdGVzIGZvcm1hdCA6ICdkZWNpbWFsJyBvciAnZG1zJ1xuICAgKi9cbiAgc2V0TGF0TG5nSW5wdXRGb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoZm9ybWF0ICE9PSAnZGVjaW1hbCcgJiYgZm9ybWF0ICE9PSAnZG1zJykgeyByZXR1cm47IH1cbiAgICB0aGlzLmNvb3JkRm9ybWF0ID0gZm9ybWF0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpbnB1dHMgdmFsdWVzLCBhZGQgYSBtYXJrZXIgYW5kIGNhbGwgQVBJIGZvciBhIGdlb2xvY2F0ZWQgcGhvdG9cbiAgICovXG4gIGdwc01hcmtlclNldFZhbHVlcyhsYXREZWMsIGxuZ0RlYywgZWxldmF0aW9uKSB7XG4gICAgLy8gc2V0IGlucHV0cyB2YWx1ZXNcbiAgICB0aGlzLmxhdGxuZ0Zvcm1Hcm91cC5jb250cm9scy5sYXRJbnB1dC5zZXRWYWx1ZShsYXREZWMpO1xuICAgIHRoaXMubGF0bG5nRm9ybUdyb3VwLmNvbnRyb2xzLmxuZ0lucHV0LnNldFZhbHVlKGxuZ0RlYyk7XG4gICAgdGhpcy5lbGV2YXRpb25Gb3JtR3JvdXAuY29udHJvbHMuZWxldmF0aW9uSW5wdXQuc2V0VmFsdWUoZWxldmF0aW9uKTtcblxuICAgIC8vIGFkZCBtYXJrZXJcbiAgICB0aGlzLmFkZE1hcmtlckZyb21MYXRMbmdDb29yZCgpO1xuXG4gICAgLy8gY2FsbCBBUElzXG4gICAgdGhpcy5jYWxsR2VvbG9jRWxldmF0aW9uQXBpc1VzaW5nTGF0TG5nSW5wdXRzVmFsdWVzKHRydWUsIGZhbHNlKTtcblxuICAgIC8vIGNsZWFyIGdlb2xvY2F0ZWQgcGhvdG9zIGxheWVyXG4gICAgdGhpcy5nZW9sb2NhdGVkUGhvdG9MYXRMbmdMYXllci5jbGVhckxheWVycygpO1xuICB9XG5cbiAgbGF0TG5nRG1zQXV0b0Zvcm1hdHRlcih2YWx1ZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPc21QbGFjZU1vZGVsIH0gZnJvbSAnLi4vX21vZGVscy9vc21QbGFjZS5tb2RlbCc7XG5pbXBvcnQgeyBHZW9jb2RpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vX3NlcnZpY2VzL2dlb2NvZGluZy5zZXJ2aWNlJztcblxuLyoqXG4gKiBUbyBzaG93IGFuIGFkZHJlc3MgdG8gdGhlIHVzZXIsIHdlIGNvdWxkIHVzZSB0aGUgZGlzcGxheV9uYW1lIGF0dHJpYnV0ZSByZXR1cm5lZCBieSBub21pbmF0aW1cbiAqIFRoaXMgYXR0cmlidXRlIGlzIGZhciBjb21wbGljYXRlZCB0byByZWFkIChyb2FkLCBuZWlnaGJvdXJob29kLCBzdWJ1cmIsIHRvd24sIGNpdHksIHBvc3Rjb2RlLCBjb3VudHksIGNvdW50cnksIGV0Yy4pXG4gKiBUaGlzIHBpcGUgdXNlIHRoZSBnZXRSZWFkYmxlQWRkcmVzcygpIGZ1bmN0aW9uIG9mIGdlb2NvZGUgc2VydmljZSB0byBzaG93IG1pbmltYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFkZHJlc3MgcmV0dXJuZWQgYnkgbm9taW5hdGltIEFQSVxuICovXG5AUGlwZSh7XG4gIG5hbWU6ICdvc21QbGFjZVJlYWRhYmxlQWRkcmVzcydcbn0pXG5leHBvcnQgY2xhc3MgT3NtUGxhY2VSZWFkYWJsZUFkZHJlc3NQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBnZW9jb2RlU2VydmljZTogR2VvY29kaW5nU2VydmljZSkgeyB9XG5cbiAgdHJhbnNmb3JtKHZhbHVlOiBPc21QbGFjZU1vZGVsLCBhcmdzPzogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZW9jb2RlU2VydmljZS5nZXRSZWFkYmxlQWRkcmVzcyh2YWx1ZSk7XG4gIH1cblxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLCBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsIE1hdFRvb2x0aXBNb2R1bGUsIE1hdENoaXBzTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdFJhZGlvTW9kdWxlLCBNYXRQcm9ncmVzc0Jhck1vZHVsZSwgTWF0TWVudU1vZHVsZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XG5pbXBvcnQgeyBMZWFmbGV0TW9kdWxlIH0gZnJvbSAnQGFzeW1tZXRyaWsvbmd4LWxlYWZsZXQnO1xuaW1wb3J0IHsgTGVhZmxldERyYXdNb2R1bGUgfSBmcm9tICdAYXN5bW1ldHJpay9uZ3gtbGVhZmxldC1kcmF3JztcblxuaW1wb3J0IHsgVGJHZW9sb2NMaWJDb21wb25lbnQgfSBmcm9tICcuL3RiLWdlb2xvYy1saWIuY29tcG9uZW50JztcbmltcG9ydCB7IE1hcENvbXBvbmVudCB9IGZyb20gJy4vbWFwL21hcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvY29kaW5nU2VydmljZSB9IGZyb20gJy4vX3NlcnZpY2VzL2dlb2NvZGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEVsZXZhdGlvblNlcnZpY2UgfSBmcm9tICcuL19zZXJ2aWNlcy9lbGV2YXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPc21QbGFjZVJlYWRhYmxlQWRkcmVzc1BpcGUgfSBmcm9tICcuL19waXBlcy9vc20tcGxhY2UtcmVhZGFibGUtYWRkcmVzcy5waXBlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSxcbiAgICBCcm93c2VyTW9kdWxlLFxuICAgIEh0dHBDbGllbnRNb2R1bGUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLCBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsIE1hdFRvb2x0aXBNb2R1bGUsIE1hdENoaXBzTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdFJhZGlvTW9kdWxlLCBNYXRQcm9ncmVzc0Jhck1vZHVsZSwgTWF0TWVudU1vZHVsZSwgTWF0VGFibGVNb2R1bGUsXG4gICAgTGVhZmxldE1vZHVsZS5mb3JSb290KCksIExlYWZsZXREcmF3TW9kdWxlLmZvclJvb3QoKSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbIFRiR2VvbG9jTGliQ29tcG9uZW50LCBNYXBDb21wb25lbnQsIE9zbVBsYWNlUmVhZGFibGVBZGRyZXNzUGlwZSBdLFxuICBleHBvcnRzOiBbIFRiR2VvbG9jTGliQ29tcG9uZW50LCBNYXBDb21wb25lbnQgXVxufSlcbmV4cG9ydCBjbGFzcyBUYkdlb2xvY0xpYk1vZHVsZSB7XG4gIHByb3ZpZGVyczogW1xuICAgIEdlb2NvZGluZ1NlcnZpY2UsIEVsZXZhdGlvblNlcnZpY2VcbiAgXTtcbn1cbiJdLCJuYW1lcyI6WyJtYXJrZXIiLCJMLm1hcmtlciIsIkwuaWNvbiIsIkwuQ29udHJvbCIsIkwudGlsZUxheWVyIiwiTC5nZW9KU09OIiwiTC5sYXRMbmciLCJMLkZlYXR1cmVHcm91cCIsImxlYWZsZXRPYmplY3RzLmRyYXdDb250cm9sUGFuZWwiLCJsZWFmbGV0T2JqZWN0cy5kcmF3Q29udHJvbEVkaXRQYW5lbCIsImxlYWZsZXRPYmplY3RzLmNpcmNsZU1hcmtlclN0eWxlIiwibGVhZmxldE9iamVjdHMuY2l0eVN0eWxlIiwibGF0TG5nIiwiTC5NYXJrZXIiLCJsZWFmbGV0T2JqZWN0cy5ncHNQaG90b01hcmtlckljb24iLCJtYXAiLCJMLmNvbnRyb2wiLCJsZWFmbGV0T2JqZWN0cy5kcmFnZ2FibGVNYXJrZXIiLCJwb2x5bGluZSIsIkwucG9seWxpbmUiLCJjb250cm9sIiwiTC5MYXRMbmciLCJMLmxhdExuZ0JvdW5kcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0lBU0U7S0FBaUI7Ozs7SUFFakIsdUNBQVE7OztJQUFSO0tBQ0M7O2dCQVZGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUseUJBQXlCO29CQUNuQyxRQUFRLEVBQUUsRUFBRTtvQkFDWixNQUFNLEVBQUUsRUFBRTtpQkFDWDs7OzsrQkFORDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNhQSxJQUFhLFFBQVEsR0FBRyxVQUFTLEdBQUcsRUFBRSxHQUFHO0lBR3ZDLFFBQVEsUUFBTyxHQUFHLENBQUM7UUFFZixLQUFLLFFBQVE7WUFFVCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUVsQixNQUFNO1FBRVYsS0FBSyxR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QUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFBRTs7WUFFbEYsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7Z0JBQUUsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUFFO1lBQzdDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQUU7U0FDNUM7UUFDRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2xCLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQUU7WUFDbEYsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFBRTtZQUNsRixJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtnQkFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQUU7WUFDN0MsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFBRTtZQUMzQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtnQkFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQUU7WUFDN0MsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFBRTtTQUMxQztRQUNILElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEIsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQUU7WUFDbEYsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFBRTtZQUNsRixJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtnQkFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQUU7WUFDN0MsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFBRTtZQUMzQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtnQkFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQUU7WUFDN0MsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFBRTtTQUMxQztRQUNILElB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
 
/***/ }),
 
/***/ "./node_modules/@angular/compiler/src sync recursive":
/*!*************************************************!*\
!*** ./node_modules/@angular/compiler/src sync ***!
\*************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
 
function webpackEmptyContext(req) {
var e = new Error('Cannot find module "' + req + '".');
e.code = 'MODULE_NOT_FOUND';
throw e;
}
webpackEmptyContext.keys = function() { return []; };
webpackEmptyContext.resolve = webpackEmptyContext;
module.exports = webpackEmptyContext;
webpackEmptyContext.id = "./node_modules/@angular/compiler/src sync recursive";
 
/***/ }),
 
/***/ "./src/$$_lazy_route_resource lazy recursive":
/*!**********************************************************!*\
!*** ./src/$$_lazy_route_resource lazy namespace object ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
 
function webpackEmptyAsyncContext(req) {
// Here Promise.resolve().then() is used instead of new Promise() to prevent
// uncaught exception popping up in devtools
return Promise.resolve().then(function() {
var e = new Error('Cannot find module "' + req + '".');
e.code = 'MODULE_NOT_FOUND';
throw e;
});
}
webpackEmptyAsyncContext.keys = function() { return []; };
webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;
module.exports = webpackEmptyAsyncContext;
webpackEmptyAsyncContext.id = "./src/$$_lazy_route_resource lazy recursive";
 
/***/ }),
 
/***/ "./src/app/app.component.css":
/*!***********************************!*\
!*** ./src/app/app.component.css ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
 
module.exports = ""
 
/***/ }),
 
/***/ "./src/app/app.component.html":
/*!************************************!*\
!*** ./src/app/app.component.html ***!
\************************************/
/*! no static exports found */
/***/ (function(module, exports) {
 
module.exports = "<tb-geoloc-map\n [geolocatedPhotoLatLng]=testLatLngData\n [osmClassFilter]=osmClassFilter\n (location)=locationChange($event)>\n</tb-geoloc-map>\n\n\n<div (click)=\"emitLatLngData()\">Simuler l'import de photos géolocalisées</div>"
 
/***/ }),
 
/***/ "./src/app/app.component.ts":
/*!**********************************!*\
!*** ./src/app/app.component.ts ***!
\**********************************/
/*! exports provided: AppComponent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
 
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AppComponent", function() { return AppComponent; });
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
 
var AppComponent = /** @class */ (function () {
function AppComponent() {
this.testLatLngData = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"]();
this.osmClassFilter = ['highway:*'];
}
AppComponent.prototype.locationChange = function (data) {
console.log(data);
};
AppComponent.prototype.emitLatLngData = function () {
var data = [
{
lat: { deg: 44, min: 27, sec: 8.976 },
lng: { deg: 1, min: 9, sec: 24.84 },
altitude: 187.6,
photoName: 'PA050156.JPG'
},
{
lat: { deg: 46, min: 27, sec: 5.432 },
lng: { deg: 3, min: 12, sec: 24.84 },
altitude: 187.6,
photoName: 'PA050234.JPG'
},
{
lat: { deg: 48, min: 25, sec: 8.765 },
lng: { deg: 6, min: 15, sec: 24.84 },
altitude: 187.6,
photoName: 'PA050789.JPG'
}
];
console.log('app emit gps data...');
this.testLatLngData.next(data);
};
AppComponent = __decorate([
Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({
selector: 'app-root',
template: __webpack_require__(/*! ./app.component.html */ "./src/app/app.component.html"),
styles: [__webpack_require__(/*! ./app.component.css */ "./src/app/app.component.css")]
})
], AppComponent);
return AppComponent;
}());
 
 
 
/***/ }),
 
/***/ "./src/app/app.module.ts":
/*!*******************************!*\
!*** ./src/app/app.module.ts ***!
\*******************************/
/*! exports provided: AppModule */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
 
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AppModule", function() { return AppModule; });
/* harmony import */ var _angular_platform_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/platform-browser */ "./node_modules/@angular/platform-browser/fesm5/platform-browser.js");
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/* harmony import */ var _app_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./app.component */ "./src/app/app.component.ts");
/* harmony import */ var tb_geoloc_lib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tb-geoloc-lib */ "./dist/tb-geoloc-lib/fesm5/tb-geoloc-lib.js");
var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
 
 
 
 
var AppModule = /** @class */ (function () {
function AppModule() {
}
AppModule = __decorate([
Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgModule"])({
declarations: [
_app_component__WEBPACK_IMPORTED_MODULE_2__["AppComponent"]
],
imports: [
_angular_platform_browser__WEBPACK_IMPORTED_MODULE_0__["BrowserModule"],
tb_geoloc_lib__WEBPACK_IMPORTED_MODULE_3__["TbGeolocLibModule"]
],
providers: [],
bootstrap: [_app_component__WEBPACK_IMPORTED_MODULE_2__["AppComponent"]]
})
], AppModule);
return AppModule;
}());
 
 
 
/***/ }),
 
/***/ "./src/environments/environment.ts":
/*!*****************************************!*\
!*** ./src/environments/environment.ts ***!
\*****************************************/
/*! exports provided: environment */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
 
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "environment", function() { return environment; });
// This file can be replaced during build by using the `fileReplacements` array.
// `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`.
// The list of file replacements can be found in `angular.json`.
var environment = {
production: false
};
/*
* In development mode, to ignore zone related error stack frames such as
* `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can
* import the following file, but please comment it out in production mode
* because it will have performance impact when throw error
*/
// import 'zone.js/dist/zone-error'; // Included with Angular CLI.
 
 
/***/ }),
 
/***/ "./src/main.ts":
/*!*********************!*\
!*** ./src/main.ts ***!
\*********************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
 
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js");
/* harmony import */ var _angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/platform-browser-dynamic */ "./node_modules/@angular/platform-browser-dynamic/fesm5/platform-browser-dynamic.js");
/* harmony import */ var _app_app_module__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./app/app.module */ "./src/app/app.module.ts");
/* harmony import */ var _environments_environment__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./environments/environment */ "./src/environments/environment.ts");
 
 
 
 
if (_environments_environment__WEBPACK_IMPORTED_MODULE_3__["environment"].production) {
Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["enableProdMode"])();
}
Object(_angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_1__["platformBrowserDynamic"])().bootstrapModule(_app_app_module__WEBPACK_IMPORTED_MODULE_2__["AppModule"])
.catch(function (err) { return console.log(err); });
 
 
/***/ }),
 
/***/ 0:
/*!***************************!*\
!*** multi ./src/main.ts ***!
\***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
 
module.exports = __webpack_require__(/*! /home/stephane/dev/tb-geoloc-lib/src/main.ts */"./src/main.ts");
 
 
/***/ })
 
},[[0,"runtime","vendor"]]]);
//# sourceMappingURL=main.js.map