From dd8284c8d9efa6a6a7759a01f2f1b753f085902f Mon Sep 17 00:00:00 2001 From: john gravois Date: Fri, 9 Mar 2018 18:28:27 -0800 Subject: [PATCH] build 2.1.4 --- dist/eachActiveFeature.zip | Bin 0 -> 159600 bytes dist/esri-leaflet-debug.js | 4167 ++++++++++++++++++++++++++++++++++++ dist/esri-leaflet.js | 5 + dist/esri-leaflet.js.map | 1 + 4 files changed, 4173 insertions(+) create mode 100644 dist/eachActiveFeature.zip create mode 100644 dist/esri-leaflet-debug.js create mode 100644 dist/esri-leaflet.js create mode 100644 dist/esri-leaflet.js.map diff --git a/dist/eachActiveFeature.zip b/dist/eachActiveFeature.zip new file mode 100644 index 0000000000000000000000000000000000000000..844ecb4b182b10ef18273b59e24ff43988cb1986 GIT binary patch literal 159600 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

J+Af- z9nSNMQCC_R`vNuiZ0L<$L#t{odn6qtzXVR%`EsfNn7PqX$?)&X)4oi9g3jn?IK5qp$-mkw5mZOHT&--LA{25)Z06Gy#%EG=9n8=q-)f$rwmL{}l>3Uf1B87;Rh9!l#KO7bW<1(s+3UT8wIqSnMi$yq80 zFiMA5eH)CoJ0)|t*vk5Xx=2boA<;s!#-OdqLZ#EURNN8emr`f>_6=|_hRnr~FJ4xQ zVjKJn*PKsj5lxX+x?Fa|{p7gMyW#M=RC^8hwGJhfOkSiw&=kNrNt8b(iSqKK=k%T% z@AYX8!j?5DbVDA=EyA_|_I5qf)(?N<6EDo%i7T=7m_RRUG6s^el~p$Z)-Q4nm8!&J ze;-@=$I)PjfUduo1Tw47k|a1Rluz<1WaR5-k2z9i^eu+1iC+PP-p z*l$r)K3)rjYh}fXv$YAQXmEW)M=?~q1)mC!jwBhUQzxLCx%FIx&b?g{>fTRW4=at? zVL~qso(hB`inb9mq1M((q100NULIR{65i&^eb?suZG_yodESK$sML#Yw)EkyQ@I!| zuZW_-l!skur5ULm1lAO?T&kX^1l3qcaMYuCARa1&^cihpzgao#2ur0^`x|4Bc8gTw zB*ONF_?^!YQ)~uy{HZB>w$2K{Q4^>8Tg|;Hb=Z(K?@4mHB6H0z+;AP(0NE1im_ptz z@vM#`FDm=}$&lbK{oeNs3ljAs|d%45~c`XbxYzIo^9wzXYy!en4nO@ ze|JrVqW9{?siQ;lLTMpq!(I~w4Q58^&nBZ0fb51y-H+s41&C{k`les z)QT|q@%UXq@RQ62((oKf#1v&BH@u2OCr{-FV7Y9mF|Zoz`T-V0hF< zx^d7NUmguDQLjiF;|$k4)?>&r;k`td^mvKntP;P4;nCJQIVU!)uFT!TUp>7C(}PT<$rCVt0i9dFmM zi4;$9d_qASBja4pzeKBHl(enS$@>F4ifS!6ZY_l!o?9(8Tmvx^9 zXDa$@6?NLzJf0}#RAOeLO|vE+px>WNM=fx1`!0rY#qITcy=>+TEL{JEl68ALP5Ob8 z4P4Jz^|R-%lzpZ$ppgm!X3aMyU2IKR$Tpi4j$UT&`Z>H4M3e?Ev>`^ucv!||*!|9@ zg|^iGI+o51WZe8D%Um}oNRAO~8SotCEfD*vMY&?-S-@d5jZcvAMOVCzQcmjXbIgDyQ#wx`7lz==9|G3e%JPXfU*PeE-iS%9@))V$yRB4(fQ%z^V8l)P zolB_j$I~aIiaZ=VeYoH(`XB^EJZ)9lq!~{+s`e1OLON>pK-r z3qU}~10f(#{}=A<-zEQz`yWts-lvY!{|EHnIb;4W5N6%~17dM7asE$M{}%=W`=9io P{>9 2000 && Support.cors) { + httpRequest.open('POST', url); + httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); + } + + if (typeof context !== 'undefined' && context !== null) { + if (typeof context.options !== 'undefined') { + httpRequest.timeout = context.options.timeout; + } + } + + // request is less than 2000 characters and the browser supports CORS, make GET request with XMLHttpRequest + if (requestLength <= 2000 && Support.cors) { + httpRequest.send(null); + + // request is more than 2000 characters and the browser supports CORS, make POST request with XMLHttpRequest + } else if (requestLength > 2000 && Support.cors) { + httpRequest.send(paramString); + + // request is less than 2000 characters and the browser does not support CORS, make a JSONP request + } else if (requestLength <= 2000 && !Support.cors) { + return jsonp(url, params, callback, context); + + // request is longer then 2000 characters and the browser does not support CORS, log a warning + } else { + warn('a request to ' + url + ' was longer then 2000 characters and this browser cannot make a cross-domain post request. Please use a proxy http://esri.github.io/esri-leaflet/api-reference/request.html'); + return; + } + + return httpRequest; +} + +function jsonp (url, params, callback, context) { + window._EsriLeafletCallbacks = window._EsriLeafletCallbacks || {}; + var callbackId = 'c' + callbacks; + params.callback = 'window._EsriLeafletCallbacks.' + callbackId; + + window._EsriLeafletCallbacks[callbackId] = function (response) { + if (window._EsriLeafletCallbacks[callbackId] !== true) { + var error; + var responseType = Object.prototype.toString.call(response); + + if (!(responseType === '[object Object]' || responseType === '[object Array]')) { + error = { + error: { + code: 500, + message: 'Expected array or object as JSONP response' + } + }; + response = null; + } + + if (!error && response.error) { + error = response; + response = null; + } + + callback.call(context, error, response); + window._EsriLeafletCallbacks[callbackId] = true; + } + }; + + var script = leaflet.DomUtil.create('script', null, document.body); + script.type = 'text/javascript'; + script.src = url + '?' + serialize(params); + script.id = callbackId; + leaflet.DomUtil.addClass(script, 'esri-leaflet-jsonp'); + + callbacks++; + + return { + id: callbackId, + url: script.src, + abort: function () { + window._EsriLeafletCallbacks._callback[callbackId]({ + code: 0, + message: 'Request aborted.' + }); + } + }; +} + +var get = ((Support.cors) ? xmlHttpGet : jsonp); +get.CORS = xmlHttpGet; +get.JSONP = jsonp; + +// export the Request object to call the different handlers for debugging +var Request = { + request: request, + get: get, + post: xmlHttpPost +}; + +/* + * Copyright 2017 Esri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// checks if 2 x,y points are equal +function pointsEqual (a, b) { + for (var i = 0; i < a.length; i++) { + if (a[i] !== b[i]) { + return false; + } + } + return true; +} + +// checks if the first and last points of a ring are equal and closes the ring +function closeRing (coordinates) { + if (!pointsEqual(coordinates[0], coordinates[coordinates.length - 1])) { + coordinates.push(coordinates[0]); + } + return coordinates; +} + +// determine if polygon ring coordinates are clockwise. clockwise signifies outer ring, counter-clockwise an inner ring +// or hole. this logic was found at http://stackoverflow.com/questions/1165647/how-to-determine-if-a-list-of-polygon- +// points-are-in-clockwise-order +function ringIsClockwise (ringToTest) { + var total = 0; + var i = 0; + var rLength = ringToTest.length; + var pt1 = ringToTest[i]; + var pt2; + for (i; i < rLength - 1; i++) { + pt2 = ringToTest[i + 1]; + total += (pt2[0] - pt1[0]) * (pt2[1] + pt1[1]); + pt1 = pt2; + } + return (total >= 0); +} + +// ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L504-L519 +function vertexIntersectsVertex (a1, a2, b1, b2) { + var uaT = ((b2[0] - b1[0]) * (a1[1] - b1[1])) - ((b2[1] - b1[1]) * (a1[0] - b1[0])); + var ubT = ((a2[0] - a1[0]) * (a1[1] - b1[1])) - ((a2[1] - a1[1]) * (a1[0] - b1[0])); + var uB = ((b2[1] - b1[1]) * (a2[0] - a1[0])) - ((b2[0] - b1[0]) * (a2[1] - a1[1])); + + if (uB !== 0) { + var ua = uaT / uB; + var ub = ubT / uB; + + if (ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1) { + return true; + } + } + + return false; +} + +// ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L521-L531 +function arrayIntersectsArray (a, b) { + for (var i = 0; i < a.length - 1; i++) { + for (var j = 0; j < b.length - 1; j++) { + if (vertexIntersectsVertex(a[i], a[i + 1], b[j], b[j + 1])) { + return true; + } + } + } + + return false; +} + +// ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L470-L480 +function coordinatesContainPoint (coordinates, point) { + var contains = false; + for (var i = -1, l = coordinates.length, j = l - 1; ++i < l; j = i) { + if (((coordinates[i][1] <= point[1] && point[1] < coordinates[j][1]) || + (coordinates[j][1] <= point[1] && point[1] < coordinates[i][1])) && + (point[0] < (((coordinates[j][0] - coordinates[i][0]) * (point[1] - coordinates[i][1])) / (coordinates[j][1] - coordinates[i][1])) + coordinates[i][0])) { + contains = !contains; + } + } + return contains; +} + +// ported from terraformer-arcgis-parser.js https://github.com/Esri/terraformer-arcgis-parser/blob/master/terraformer-arcgis-parser.js#L106-L113 +function coordinatesContainCoordinates (outer, inner) { + var intersects = arrayIntersectsArray(outer, inner); + var contains = coordinatesContainPoint(outer, inner[0]); + if (!intersects && contains) { + return true; + } + return false; +} + +// do any polygons in this array contain any other polygons in this array? +// used for checking for holes in arcgis rings +// ported from terraformer-arcgis-parser.js https://github.com/Esri/terraformer-arcgis-parser/blob/master/terraformer-arcgis-parser.js#L117-L172 +function convertRingsToGeoJSON (rings) { + var outerRings = []; + var holes = []; + var x; // iterator + var outerRing; // current outer ring being evaluated + var hole; // current hole being evaluated + + // for each ring + for (var r = 0; r < rings.length; r++) { + var ring = closeRing(rings[r].slice(0)); + if (ring.length < 4) { + continue; + } + // is this ring an outer ring? is it clockwise? + if (ringIsClockwise(ring)) { + var polygon = [ ring.slice().reverse() ]; // wind outer rings counterclockwise for RFC 7946 compliance + outerRings.push(polygon); // push to outer rings + } else { + holes.push(ring.slice().reverse()); // wind inner rings clockwise for RFC 7946 compliance + } + } + + var uncontainedHoles = []; + + // while there are holes left... + while (holes.length) { + // pop a hole off out stack + hole = holes.pop(); + + // loop over all outer rings and see if they contain our hole. + var contained = false; + for (x = outerRings.length - 1; x >= 0; x--) { + outerRing = outerRings[x][0]; + if (coordinatesContainCoordinates(outerRing, hole)) { + // the hole is contained push it into our polygon + outerRings[x].push(hole); + contained = true; + break; + } + } + + // ring is not contained in any outer ring + // sometimes this happens https://github.com/Esri/esri-leaflet/issues/320 + if (!contained) { + uncontainedHoles.push(hole); + } + } + + // if we couldn't match any holes using contains we can try intersects... + while (uncontainedHoles.length) { + // pop a hole off out stack + hole = uncontainedHoles.pop(); + + // loop over all outer rings and see if any intersect our hole. + var intersects = false; + + for (x = outerRings.length - 1; x >= 0; x--) { + outerRing = outerRings[x][0]; + if (arrayIntersectsArray(outerRing, hole)) { + // the hole is contained push it into our polygon + outerRings[x].push(hole); + intersects = true; + break; + } + } + + if (!intersects) { + outerRings.push([hole.reverse()]); + } + } + + if (outerRings.length === 1) { + return { + type: 'Polygon', + coordinates: outerRings[0] + }; + } else { + return { + type: 'MultiPolygon', + coordinates: outerRings + }; + } +} + +// This function ensures that rings are oriented in the right directions +// outer rings are clockwise, holes are counterclockwise +// used for converting GeoJSON Polygons to ArcGIS Polygons +function orientRings (poly) { + var output = []; + var polygon = poly.slice(0); + var outerRing = closeRing(polygon.shift().slice(0)); + if (outerRing.length >= 4) { + if (!ringIsClockwise(outerRing)) { + outerRing.reverse(); + } + + output.push(outerRing); + + for (var i = 0; i < polygon.length; i++) { + var hole = closeRing(polygon[i].slice(0)); + if (hole.length >= 4) { + if (ringIsClockwise(hole)) { + hole.reverse(); + } + output.push(hole); + } + } + } + + return output; +} + +// This function flattens holes in multipolygons to one array of polygons +// used for converting GeoJSON Polygons to ArcGIS Polygons +function flattenMultiPolygonRings (rings) { + var output = []; + for (var i = 0; i < rings.length; i++) { + var polygon = orientRings(rings[i]); + for (var x = polygon.length - 1; x >= 0; x--) { + var ring = polygon[x].slice(0); + output.push(ring); + } + } + return output; +} + +// shallow object clone for feature properties and attributes +// from http://jsperf.com/cloning-an-object/2 +function shallowClone (obj) { + var target = {}; + for (var i in obj) { + if (obj.hasOwnProperty(i)) { + target[i] = obj[i]; + } + } + return target; +} + +function getId (attributes, idAttribute) { + var keys = idAttribute ? [idAttribute, 'OBJECTID', 'FID'] : ['OBJECTID', 'FID']; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if ( + key in attributes && + (typeof attributes[key] === 'string' || + typeof attributes[key] === 'number') + ) { + return attributes[key]; + } + } + throw Error('No valid id attribute found'); +} + +function arcgisToGeoJSON (arcgis, idAttribute) { + var geojson = {}; + + if (typeof arcgis.x === 'number' && typeof arcgis.y === 'number') { + geojson.type = 'Point'; + geojson.coordinates = [arcgis.x, arcgis.y]; + if (typeof arcgis.z === 'number') { + geojson.coordinates.push(arcgis.z); + } + } + + if (arcgis.points) { + geojson.type = 'MultiPoint'; + geojson.coordinates = arcgis.points.slice(0); + } + + if (arcgis.paths) { + if (arcgis.paths.length === 1) { + geojson.type = 'LineString'; + geojson.coordinates = arcgis.paths[0].slice(0); + } else { + geojson.type = 'MultiLineString'; + geojson.coordinates = arcgis.paths.slice(0); + } + } + + if (arcgis.rings) { + geojson = convertRingsToGeoJSON(arcgis.rings.slice(0)); + } + + if (arcgis.geometry || arcgis.attributes) { + geojson.type = 'Feature'; + geojson.geometry = (arcgis.geometry) ? arcgisToGeoJSON(arcgis.geometry) : null; + geojson.properties = (arcgis.attributes) ? shallowClone(arcgis.attributes) : null; + if (arcgis.attributes) { + try { + geojson.id = getId(arcgis.attributes, idAttribute); + } catch (err) { + // don't set an id + } + } + } + + // if no valid geometry was encountered + if (JSON.stringify(geojson.geometry) === JSON.stringify({})) { + geojson.geometry = null; + } + + if ( + arcgis.spatialReference && + arcgis.spatialReference.wkid && + arcgis.spatialReference.wkid !== 4326 + ) { + console.warn('Object converted in non-standard crs - ' + JSON.stringify(arcgis.spatialReference)); + } + + return geojson; +} + +function geojsonToArcGIS (geojson, idAttribute) { + idAttribute = idAttribute || 'OBJECTID'; + var spatialReference = { wkid: 4326 }; + var result = {}; + var i; + + switch (geojson.type) { + case 'Point': + result.x = geojson.coordinates[0]; + result.y = geojson.coordinates[1]; + result.spatialReference = spatialReference; + break; + case 'MultiPoint': + result.points = geojson.coordinates.slice(0); + result.spatialReference = spatialReference; + break; + case 'LineString': + result.paths = [geojson.coordinates.slice(0)]; + result.spatialReference = spatialReference; + break; + case 'MultiLineString': + result.paths = geojson.coordinates.slice(0); + result.spatialReference = spatialReference; + break; + case 'Polygon': + result.rings = orientRings(geojson.coordinates.slice(0)); + result.spatialReference = spatialReference; + break; + case 'MultiPolygon': + result.rings = flattenMultiPolygonRings(geojson.coordinates.slice(0)); + result.spatialReference = spatialReference; + break; + case 'Feature': + if (geojson.geometry) { + result.geometry = geojsonToArcGIS(geojson.geometry, idAttribute); + } + result.attributes = (geojson.properties) ? shallowClone(geojson.properties) : {}; + if (geojson.id) { + result.attributes[idAttribute] = geojson.id; + } + break; + case 'FeatureCollection': + result = []; + for (i = 0; i < geojson.features.length; i++) { + result.push(geojsonToArcGIS(geojson.features[i], idAttribute)); + } + break; + case 'GeometryCollection': + result = []; + for (i = 0; i < geojson.geometries.length; i++) { + result.push(geojsonToArcGIS(geojson.geometries[i], idAttribute)); + } + break; + } + + return result; +} + +function geojsonToArcGIS$1 (geojson, idAttr) { + return geojsonToArcGIS(geojson, idAttr); +} + +function arcgisToGeoJSON$1 (arcgis, idAttr) { + return arcgisToGeoJSON(arcgis, idAttr); +} + +// convert an extent (ArcGIS) to LatLngBounds (Leaflet) +function extentToBounds (extent) { + // "NaN" coordinates from ArcGIS Server indicate a null geometry + if (extent.xmin !== 'NaN' && extent.ymin !== 'NaN' && extent.xmax !== 'NaN' && extent.ymax !== 'NaN') { + var sw = leaflet.latLng(extent.ymin, extent.xmin); + var ne = leaflet.latLng(extent.ymax, extent.xmax); + return leaflet.latLngBounds(sw, ne); + } else { + return null; + } +} + +// convert an LatLngBounds (Leaflet) to extent (ArcGIS) +function boundsToExtent (bounds) { + bounds = leaflet.latLngBounds(bounds); + return { + 'xmin': bounds.getSouthWest().lng, + 'ymin': bounds.getSouthWest().lat, + 'xmax': bounds.getNorthEast().lng, + 'ymax': bounds.getNorthEast().lat, + 'spatialReference': { + 'wkid': 4326 + } + }; +} + +var knownFieldNames = /^(OBJECTID|FID|OID|ID)$/i; + +// Attempts to find the ID Field from response +function _findIdAttributeFromResponse (response) { + var result; + + if (response.objectIdFieldName) { + // Find Id Field directly + result = response.objectIdFieldName; + } else if (response.fields) { + // Find ID Field based on field type + for (var j = 0; j <= response.fields.length - 1; j++) { + if (response.fields[j].type === 'esriFieldTypeOID') { + result = response.fields[j].name; + break; + } + } + if (!result) { + // If no field was marked as being the esriFieldTypeOID try well known field names + for (j = 0; j <= response.fields.length - 1; j++) { + if (response.fields[j].name.match(knownFieldNames)) { + result = response.fields[j].name; + break; + } + } + } + } + return result; +} + +// This is the 'last' resort, find the Id field from the specified feature +function _findIdAttributeFromFeature (feature) { + for (var key in feature.attributes) { + if (key.match(knownFieldNames)) { + return key; + } + } +} + +function responseToFeatureCollection (response, idAttribute) { + var objectIdField; + var features = response.features || response.results; + var count = features.length; + + if (idAttribute) { + objectIdField = idAttribute; + } else { + objectIdField = _findIdAttributeFromResponse(response); + } + + var featureCollection = { + type: 'FeatureCollection', + features: [] + }; + + if (count) { + for (var i = features.length - 1; i >= 0; i--) { + var feature = arcgisToGeoJSON$1(features[i], objectIdField || _findIdAttributeFromFeature(features[i])); + featureCollection.features.push(feature); + } + } + + return featureCollection; +} + + // trim url whitespace and add a trailing slash if needed +function cleanUrl (url) { + // trim leading and trailing spaces, but not spaces inside the url + url = leaflet.Util.trim(url); + + // add a trailing slash to the url if the user omitted it + if (url[url.length - 1] !== '/') { + url += '/'; + } + + return url; +} + +/* Extract url params if any and store them in requestParams attribute. + Return the options params updated */ +function getUrlParams (options$$1) { + if (options$$1.url.indexOf('?') !== -1) { + options$$1.requestParams = options$$1.requestParams || {}; + var queryString = options$$1.url.substring(options$$1.url.indexOf('?') + 1); + options$$1.url = options$$1.url.split('?')[0]; + options$$1.requestParams = JSON.parse('{"' + decodeURI(queryString).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') + '"}'); + } + options$$1.url = cleanUrl(options$$1.url.split('?')[0]); + return options$$1; +} + +function isArcgisOnline (url) { + /* hosted feature services support geojson as an output format + utility.arcgis.com services are proxied from a variety of ArcGIS Server vintages, and may not */ + return (/^(?!.*utility\.arcgis\.com).*\.arcgis\.com.*FeatureServer/i).test(url); +} + +function geojsonTypeToArcGIS (geoJsonType) { + var arcgisGeometryType; + switch (geoJsonType) { + case 'Point': + arcgisGeometryType = 'esriGeometryPoint'; + break; + case 'MultiPoint': + arcgisGeometryType = 'esriGeometryMultipoint'; + break; + case 'LineString': + arcgisGeometryType = 'esriGeometryPolyline'; + break; + case 'MultiLineString': + arcgisGeometryType = 'esriGeometryPolyline'; + break; + case 'Polygon': + arcgisGeometryType = 'esriGeometryPolygon'; + break; + case 'MultiPolygon': + arcgisGeometryType = 'esriGeometryPolygon'; + break; + } + + return arcgisGeometryType; +} + +function warn () { + if (console && console.warn) { + console.warn.apply(console, arguments); + } +} + +function calcAttributionWidth (map) { + // either crop at 55px or user defined buffer + return (map.getSize().x - options.attributionWidthOffset) + 'px'; +} + +function setEsriAttribution (map) { + if (map.attributionControl && !map.attributionControl._esriAttributionAdded) { + map.attributionControl.setPrefix('Leaflet | Powered by Esri'); + + var hoverAttributionStyle = document.createElement('style'); + hoverAttributionStyle.type = 'text/css'; + hoverAttributionStyle.innerHTML = '.esri-truncated-attribution:hover {' + + 'white-space: normal;' + + '}'; + + document.getElementsByTagName('head')[0].appendChild(hoverAttributionStyle); + leaflet.DomUtil.addClass(map.attributionControl._container, 'esri-truncated-attribution:hover'); + + // define a new css class in JS to trim attribution into a single line + var attributionStyle = document.createElement('style'); + attributionStyle.type = 'text/css'; + attributionStyle.innerHTML = '.esri-truncated-attribution {' + + 'vertical-align: -3px;' + + 'white-space: nowrap;' + + 'overflow: hidden;' + + 'text-overflow: ellipsis;' + + 'display: inline-block;' + + 'transition: 0s white-space;' + + 'transition-delay: 1s;' + + 'max-width: ' + calcAttributionWidth(map) + ';' + + '}'; + + document.getElementsByTagName('head')[0].appendChild(attributionStyle); + leaflet.DomUtil.addClass(map.attributionControl._container, 'esri-truncated-attribution'); + + // update the width used to truncate when the map itself is resized + map.on('resize', function (e) { + map.attributionControl._container.style.maxWidth = calcAttributionWidth(e.target); + }); + + // remove injected scripts and style tags + map.on('unload', function () { + hoverAttributionStyle.parentNode.removeChild(hoverAttributionStyle); + attributionStyle.parentNode.removeChild(attributionStyle); + var nodeList = document.querySelectorAll('.esri-leaflet-jsonp'); + for (var i = 0; i < nodeList.length; i++) { + nodeList.item(i).parentNode.removeChild(nodeList.item(i)); + } + }); + + map.attributionControl._esriAttributionAdded = true; + } +} + +function _setGeometry (geometry) { + var params = { + geometry: null, + geometryType: null + }; + + // convert bounds to extent and finish + if (geometry instanceof leaflet.LatLngBounds) { + // set geometry + geometryType + params.geometry = boundsToExtent(geometry); + params.geometryType = 'esriGeometryEnvelope'; + return params; + } + + // convert L.Marker > L.LatLng + if (geometry.getLatLng) { + geometry = geometry.getLatLng(); + } + + // convert L.LatLng to a geojson point and continue; + if (geometry instanceof leaflet.LatLng) { + geometry = { + type: 'Point', + coordinates: [geometry.lng, geometry.lat] + }; + } + + // handle L.GeoJSON, pull out the first geometry + if (geometry instanceof leaflet.GeoJSON) { + // reassign geometry to the GeoJSON value (we are assuming that only one feature is present) + geometry = geometry.getLayers()[0].feature.geometry; + params.geometry = geojsonToArcGIS$1(geometry); + params.geometryType = geojsonTypeToArcGIS(geometry.type); + } + + // Handle L.Polyline and L.Polygon + if (geometry.toGeoJSON) { + geometry = geometry.toGeoJSON(); + } + + // handle GeoJSON feature by pulling out the geometry + if (geometry.type === 'Feature') { + // get the geometry of the geojson feature + geometry = geometry.geometry; + } + + // confirm that our GeoJSON is a point, line or polygon + if (geometry.type === 'Point' || geometry.type === 'LineString' || geometry.type === 'Polygon' || geometry.type === 'MultiPolygon') { + params.geometry = geojsonToArcGIS$1(geometry); + params.geometryType = geojsonTypeToArcGIS(geometry.type); + return params; + } + + // warn the user if we havn't found an appropriate object + warn('invalid geometry passed to spatial query. Should be L.LatLng, L.LatLngBounds, L.Marker or a GeoJSON Point, Line, Polygon or MultiPolygon object'); + + return; +} + +function _getAttributionData (url, map) { + jsonp(url, {}, leaflet.Util.bind(function (error, attributions) { + if (error) { return; } + map._esriAttributions = []; + for (var c = 0; c < attributions.contributors.length; c++) { + var contributor = attributions.contributors[c]; + + for (var i = 0; i < contributor.coverageAreas.length; i++) { + var coverageArea = contributor.coverageAreas[i]; + var southWest = leaflet.latLng(coverageArea.bbox[0], coverageArea.bbox[1]); + var northEast = leaflet.latLng(coverageArea.bbox[2], coverageArea.bbox[3]); + map._esriAttributions.push({ + attribution: contributor.attribution, + score: coverageArea.score, + bounds: leaflet.latLngBounds(southWest, northEast), + minZoom: coverageArea.zoomMin, + maxZoom: coverageArea.zoomMax + }); + } + } + + map._esriAttributions.sort(function (a, b) { + return b.score - a.score; + }); + + // pass the same argument as the map's 'moveend' event + var obj = { target: map }; + _updateMapAttribution(obj); + }, this)); +} + +function _updateMapAttribution (evt) { + var map = evt.target; + var oldAttributions = map._esriAttributions; + + if (map && map.attributionControl && oldAttributions) { + var newAttributions = ''; + var bounds = map.getBounds(); + var wrappedBounds = leaflet.latLngBounds( + bounds.getSouthWest().wrap(), + bounds.getNorthEast().wrap() + ); + var zoom = map.getZoom(); + + for (var i = 0; i < oldAttributions.length; i++) { + var attribution = oldAttributions[i]; + var text = attribution.attribution; + + if (!newAttributions.match(text) && attribution.bounds.intersects(wrappedBounds) && zoom >= attribution.minZoom && zoom <= attribution.maxZoom) { + newAttributions += (', ' + text); + } + } + + newAttributions = newAttributions.substr(2); + var attributionElement = map.attributionControl._container.querySelector('.esri-dynamic-attribution'); + + attributionElement.innerHTML = newAttributions; + attributionElement.style.maxWidth = calcAttributionWidth(map); + + map.fire('attributionupdated', { + attribution: newAttributions + }); + } +} + +var EsriUtil = { + warn: warn, + cleanUrl: cleanUrl, + getUrlParams: getUrlParams, + isArcgisOnline: isArcgisOnline, + geojsonTypeToArcGIS: geojsonTypeToArcGIS, + responseToFeatureCollection: responseToFeatureCollection, + geojsonToArcGIS: geojsonToArcGIS$1, + arcgisToGeoJSON: arcgisToGeoJSON$1, + boundsToExtent: boundsToExtent, + extentToBounds: extentToBounds, + calcAttributionWidth: calcAttributionWidth, + setEsriAttribution: setEsriAttribution, + _setGeometry: _setGeometry, + _getAttributionData: _getAttributionData, + _updateMapAttribution: _updateMapAttribution, + _findIdAttributeFromFeature: _findIdAttributeFromFeature, + _findIdAttributeFromResponse: _findIdAttributeFromResponse +}; + +var Task = leaflet.Class.extend({ + + options: { + proxy: false, + useCors: cors + }, + + // Generate a method for each methodName:paramName in the setters for this task. + generateSetter: function (param, context) { + return leaflet.Util.bind(function (value) { + this.params[param] = value; + return this; + }, context); + }, + + initialize: function (endpoint) { + // endpoint can be either a url (and options) for an ArcGIS Rest Service or an instance of EsriLeaflet.Service + if (endpoint.request && endpoint.options) { + this._service = endpoint; + leaflet.Util.setOptions(this, endpoint.options); + } else { + leaflet.Util.setOptions(this, endpoint); + this.options.url = cleanUrl(endpoint.url); + } + + // clone default params into this object + this.params = leaflet.Util.extend({}, this.params || {}); + + // generate setter methods based on the setters object implimented a child class + if (this.setters) { + for (var setter in this.setters) { + var param = this.setters[setter]; + this[setter] = this.generateSetter(param, this); + } + } + }, + + token: function (token) { + if (this._service) { + this._service.authenticate(token); + } else { + this.params.token = token; + } + return this; + }, + + // ArcGIS Server Find/Identify 10.5+ + format: function (boolean) { + // use double negative to expose a more intuitive positive method name + this.params.returnUnformattedValues = !boolean; + return this; + }, + + request: function (callback, context) { + if (this.options.requestParams) { + leaflet.Util.extend(this.params, this.options.requestParams); + } + if (this._service) { + return this._service.request(this.path, this.params, callback, context); + } + + return this._request('request', this.path, this.params, callback, context); + }, + + _request: function (method, path, params, callback, context) { + var url = (this.options.proxy) ? this.options.proxy + '?' + this.options.url + path : this.options.url + path; + + if ((method === 'get' || method === 'request') && !this.options.useCors) { + return Request.get.JSONP(url, params, callback, context); + } + + return Request[method](url, params, callback, context); + } +}); + +function task (options) { + options = getUrlParams(options); + return new Task(options); +} + +var Query = Task.extend({ + setters: { + 'offset': 'resultOffset', + 'limit': 'resultRecordCount', + 'fields': 'outFields', + 'precision': 'geometryPrecision', + 'featureIds': 'objectIds', + 'returnGeometry': 'returnGeometry', + 'returnM': 'returnM', + 'transform': 'datumTransformation', + 'token': 'token' + }, + + path: 'query', + + params: { + returnGeometry: true, + where: '1=1', + outSr: 4326, + outFields: '*' + }, + + // Returns a feature if its shape is wholly contained within the search geometry. Valid for all shape type combinations. + within: function (geometry) { + this._setGeometryParams(geometry); + this.params.spatialRel = 'esriSpatialRelContains'; // to the REST api this reads geometry **contains** layer + return this; + }, + + // Returns a feature if any spatial relationship is found. Applies to all shape type combinations. + intersects: function (geometry) { + this._setGeometryParams(geometry); + this.params.spatialRel = 'esriSpatialRelIntersects'; + return this; + }, + + // Returns a feature if its shape wholly contains the search geometry. Valid for all shape type combinations. + contains: function (geometry) { + this._setGeometryParams(geometry); + this.params.spatialRel = 'esriSpatialRelWithin'; // to the REST api this reads geometry **within** layer + return this; + }, + + // Returns a feature if the intersection of the interiors of the two shapes is not empty and has a lower dimension than the maximum dimension of the two shapes. Two lines that share an endpoint in common do not cross. Valid for Line/Line, Line/Area, Multi-point/Area, and Multi-point/Line shape type combinations. + crosses: function (geometry) { + this._setGeometryParams(geometry); + this.params.spatialRel = 'esriSpatialRelCrosses'; + return this; + }, + + // Returns a feature if the two shapes share a common boundary. However, the intersection of the interiors of the two shapes must be empty. In the Point/Line case, the point may touch an endpoint only of the line. Applies to all combinations except Point/Point. + touches: function (geometry) { + this._setGeometryParams(geometry); + this.params.spatialRel = 'esriSpatialRelTouches'; + return this; + }, + + // Returns a feature if the intersection of the two shapes results in an object of the same dimension, but different from both of the shapes. Applies to Area/Area, Line/Line, and Multi-point/Multi-point shape type combinations. + overlaps: function (geometry) { + this._setGeometryParams(geometry); + this.params.spatialRel = 'esriSpatialRelOverlaps'; + return this; + }, + + // Returns a feature if the envelope of the two shapes intersects. + bboxIntersects: function (geometry) { + this._setGeometryParams(geometry); + this.params.spatialRel = 'esriSpatialRelEnvelopeIntersects'; + return this; + }, + + // if someone can help decipher the ArcObjects explanation and translate to plain speak, we should mention this method in the doc + indexIntersects: function (geometry) { + this._setGeometryParams(geometry); + this.params.spatialRel = 'esriSpatialRelIndexIntersects'; // Returns a feature if the envelope of the query geometry intersects the index entry for the target geometry + return this; + }, + + // only valid for Feature Services running on ArcGIS Server 10.3+ or ArcGIS Online + nearby: function (latlng, radius) { + latlng = leaflet.latLng(latlng); + this.params.geometry = [latlng.lng, latlng.lat]; + this.params.geometryType = 'esriGeometryPoint'; + this.params.spatialRel = 'esriSpatialRelIntersects'; + this.params.units = 'esriSRUnit_Meter'; + this.params.distance = radius; + this.params.inSr = 4326; + return this; + }, + + where: function (string) { + // instead of converting double-quotes to single quotes, pass as is, and provide a more informative message if a 400 is encountered + this.params.where = string; + return this; + }, + + between: function (start, end) { + this.params.time = [start.valueOf(), end.valueOf()]; + return this; + }, + + simplify: function (map, factor) { + var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast()); + this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor; + return this; + }, + + orderBy: function (fieldName, order) { + order = order || 'ASC'; + this.params.orderByFields = (this.params.orderByFields) ? this.params.orderByFields + ',' : ''; + this.params.orderByFields += ([fieldName, order]).join(' '); + return this; + }, + + run: function (callback, context) { + this._cleanParams(); + + // services hosted on ArcGIS Online and ArcGIS Server 10.3.1+ support requesting geojson directly + if (this.options.isModern || isArcgisOnline(this.options.url)) { + this.params.f = 'geojson'; + + return this.request(function (error, response) { + this._trapSQLerrors(error); + callback.call(context, error, response, response); + }, this); + + // otherwise convert it in the callback then pass it on + } else { + return this.request(function (error, response) { + this._trapSQLerrors(error); + callback.call(context, error, (response && responseToFeatureCollection(response)), response); + }, this); + } + }, + + count: function (callback, context) { + this._cleanParams(); + this.params.returnCountOnly = true; + return this.request(function (error, response) { + callback.call(this, error, (response && response.count), response); + }, context); + }, + + ids: function (callback, context) { + this._cleanParams(); + this.params.returnIdsOnly = true; + return this.request(function (error, response) { + callback.call(this, error, (response && response.objectIds), response); + }, context); + }, + + // only valid for Feature Services running on ArcGIS Server 10.3+ or ArcGIS Online + bounds: function (callback, context) { + this._cleanParams(); + this.params.returnExtentOnly = true; + return this.request(function (error, response) { + if (response && response.extent && extentToBounds(response.extent)) { + callback.call(context, error, extentToBounds(response.extent), response); + } else { + error = { + message: 'Invalid Bounds' + }; + callback.call(context, error, null, response); + } + }, context); + }, + + distinct: function () { + // geometry must be omitted for queries requesting distinct values + this.params.returnGeometry = false; + this.params.returnDistinctValues = true; + return this; + }, + + // only valid for image services + pixelSize: function (rawPoint) { + var castPoint = leaflet.point(rawPoint); + this.params.pixelSize = [castPoint.x, castPoint.y]; + return this; + }, + + // only valid for map services + layer: function (layer) { + this.path = layer + '/query'; + return this; + }, + + _trapSQLerrors: function (error) { + if (error) { + if (error.code === '400') { + warn('one common syntax error in query requests is encasing string values in double quotes instead of single quotes'); + } + } + }, + + _cleanParams: function () { + delete this.params.returnIdsOnly; + delete this.params.returnExtentOnly; + delete this.params.returnCountOnly; + }, + + _setGeometryParams: function (geometry) { + this.params.inSr = 4326; + var converted = _setGeometry(geometry); + this.params.geometry = converted.geometry; + this.params.geometryType = converted.geometryType; + } + +}); + +function query (options) { + return new Query(options); +} + +var Find = Task.extend({ + setters: { + // method name > param name + 'contains': 'contains', + 'text': 'searchText', + 'fields': 'searchFields', // denote an array or single string + 'spatialReference': 'sr', + 'sr': 'sr', + 'layers': 'layers', + 'returnGeometry': 'returnGeometry', + 'maxAllowableOffset': 'maxAllowableOffset', + 'precision': 'geometryPrecision', + 'dynamicLayers': 'dynamicLayers', + 'returnZ': 'returnZ', + 'returnM': 'returnM', + 'gdbVersion': 'gdbVersion', + // skipped implementing this (for now) because the REST service implementation isnt consistent between operations + // 'transform': 'datumTransformations', + 'token': 'token' + }, + + path: 'find', + + params: { + sr: 4326, + contains: true, + returnGeometry: true, + returnZ: true, + returnM: false + }, + + layerDefs: function (id, where) { + this.params.layerDefs = (this.params.layerDefs) ? this.params.layerDefs + ';' : ''; + this.params.layerDefs += ([id, where]).join(':'); + return this; + }, + + simplify: function (map, factor) { + var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast()); + this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor; + return this; + }, + + run: function (callback, context) { + return this.request(function (error, response) { + callback.call(context, error, (response && responseToFeatureCollection(response)), response); + }, context); + } +}); + +function find (options) { + return new Find(options); +} + +var Identify = Task.extend({ + path: 'identify', + + between: function (start, end) { + this.params.time = [start.valueOf(), end.valueOf()]; + return this; + } +}); + +function identify (options) { + return new Identify(options); +} + +var IdentifyFeatures = Identify.extend({ + setters: { + 'layers': 'layers', + 'precision': 'geometryPrecision', + 'tolerance': 'tolerance', + // skipped implementing this (for now) because the REST service implementation isnt consistent between operations. + // 'transform': 'datumTransformations' + 'returnGeometry': 'returnGeometry' + }, + + params: { + sr: 4326, + layers: 'all', + tolerance: 3, + returnGeometry: true + }, + + on: function (map) { + var extent = boundsToExtent(map.getBounds()); + var size = map.getSize(); + this.params.imageDisplay = [size.x, size.y, 96]; + this.params.mapExtent = [extent.xmin, extent.ymin, extent.xmax, extent.ymax]; + return this; + }, + + at: function (geometry) { + // cast lat, long pairs in raw array form manually + if (geometry.length === 2) { + geometry = leaflet.latLng(geometry); + } + this._setGeometryParams(geometry); + return this; + }, + + layerDef: function (id, where) { + this.params.layerDefs = (this.params.layerDefs) ? this.params.layerDefs + ';' : ''; + this.params.layerDefs += ([id, where]).join(':'); + return this; + }, + + simplify: function (map, factor) { + var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast()); + this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor; + return this; + }, + + run: function (callback, context) { + return this.request(function (error, response) { + // immediately invoke with an error + if (error) { + callback.call(context, error, undefined, response); + return; + + // ok no error lets just assume we have features... + } else { + var featureCollection = responseToFeatureCollection(response); + response.results = response.results.reverse(); + for (var i = 0; i < featureCollection.features.length; i++) { + var feature = featureCollection.features[i]; + feature.layerId = response.results[i].layerId; + } + callback.call(context, undefined, featureCollection, response); + } + }); + }, + + _setGeometryParams: function (geometry) { + var converted = _setGeometry(geometry); + this.params.geometry = converted.geometry; + this.params.geometryType = converted.geometryType; + } +}); + +function identifyFeatures (options) { + return new IdentifyFeatures(options); +} + +var IdentifyImage = Identify.extend({ + setters: { + 'setMosaicRule': 'mosaicRule', + 'setRenderingRule': 'renderingRule', + 'setPixelSize': 'pixelSize', + 'returnCatalogItems': 'returnCatalogItems', + 'returnGeometry': 'returnGeometry' + }, + + params: { + returnGeometry: false + }, + + at: function (latlng) { + latlng = leaflet.latLng(latlng); + this.params.geometry = JSON.stringify({ + x: latlng.lng, + y: latlng.lat, + spatialReference: { + wkid: 4326 + } + }); + this.params.geometryType = 'esriGeometryPoint'; + return this; + }, + + getMosaicRule: function () { + return this.params.mosaicRule; + }, + + getRenderingRule: function () { + return this.params.renderingRule; + }, + + getPixelSize: function () { + return this.params.pixelSize; + }, + + run: function (callback, context) { + return this.request(function (error, response) { + callback.call(context, error, (response && this._responseToGeoJSON(response)), response); + }, this); + }, + + // get pixel data and return as geoJSON point + // populate catalog items (if any) + // merging in any catalogItemVisibilities as a propery of each feature + _responseToGeoJSON: function (response) { + var location = response.location; + var catalogItems = response.catalogItems; + var catalogItemVisibilities = response.catalogItemVisibilities; + var geoJSON = { + 'pixel': { + 'type': 'Feature', + 'geometry': { + 'type': 'Point', + 'coordinates': [location.x, location.y] + }, + 'crs': { + 'type': 'EPSG', + 'properties': { + 'code': location.spatialReference.wkid + } + }, + 'properties': { + 'OBJECTID': response.objectId, + 'name': response.name, + 'value': response.value + }, + 'id': response.objectId + } + }; + + if (response.properties && response.properties.Values) { + geoJSON.pixel.properties.values = response.properties.Values; + } + + if (catalogItems && catalogItems.features) { + geoJSON.catalogItems = responseToFeatureCollection(catalogItems); + if (catalogItemVisibilities && catalogItemVisibilities.length === geoJSON.catalogItems.features.length) { + for (var i = catalogItemVisibilities.length - 1; i >= 0; i--) { + geoJSON.catalogItems.features[i].properties.catalogItemVisibility = catalogItemVisibilities[i]; + } + } + } + return geoJSON; + } + +}); + +function identifyImage (params) { + return new IdentifyImage(params); +} + +var Service = leaflet.Evented.extend({ + + options: { + proxy: false, + useCors: cors, + timeout: 0 + }, + + initialize: function (options) { + options = options || {}; + this._requestQueue = []; + this._authenticating = false; + leaflet.Util.setOptions(this, options); + this.options.url = cleanUrl(this.options.url); + }, + + get: function (path, params, callback, context) { + return this._request('get', path, params, callback, context); + }, + + post: function (path, params, callback, context) { + return this._request('post', path, params, callback, context); + }, + + request: function (path, params, callback, context) { + return this._request('request', path, params, callback, context); + }, + + metadata: function (callback, context) { + return this._request('get', '', {}, callback, context); + }, + + authenticate: function (token) { + this._authenticating = false; + this.options.token = token; + this._runQueue(); + return this; + }, + + getTimeout: function () { + return this.options.timeout; + }, + + setTimeout: function (timeout) { + this.options.timeout = timeout; + }, + + _request: function (method, path, params, callback, context) { + this.fire('requeststart', { + url: this.options.url + path, + params: params, + method: method + }, true); + + var wrappedCallback = this._createServiceCallback(method, path, params, callback, context); + + if (this.options.token) { + params.token = this.options.token; + } + if (this.options.requestParams) { + leaflet.Util.extend(params, this.options.requestParams); + } + if (this._authenticating) { + this._requestQueue.push([method, path, params, callback, context]); + return; + } else { + var url = (this.options.proxy) ? this.options.proxy + '?' + this.options.url + path : this.options.url + path; + + if ((method === 'get' || method === 'request') && !this.options.useCors) { + return Request.get.JSONP(url, params, wrappedCallback, context); + } else { + return Request[method](url, params, wrappedCallback, context); + } + } + }, + + _createServiceCallback: function (method, path, params, callback, context) { + return leaflet.Util.bind(function (error, response) { + if (error && (error.code === 499 || error.code === 498)) { + this._authenticating = true; + + this._requestQueue.push([method, path, params, callback, context]); + + // fire an event for users to handle and re-authenticate + this.fire('authenticationrequired', { + authenticate: leaflet.Util.bind(this.authenticate, this) + }, true); + + // if the user has access to a callback they can handle the auth error + error.authenticate = leaflet.Util.bind(this.authenticate, this); + } + + callback.call(context, error, response); + + if (error) { + this.fire('requesterror', { + url: this.options.url + path, + params: params, + message: error.message, + code: error.code, + method: method + }, true); + } else { + this.fire('requestsuccess', { + url: this.options.url + path, + params: params, + response: response, + method: method + }, true); + } + + this.fire('requestend', { + url: this.options.url + path, + params: params, + method: method + }, true); + }, this); + }, + + _runQueue: function () { + for (var i = this._requestQueue.length - 1; i >= 0; i--) { + var request$$1 = this._requestQueue[i]; + var method = request$$1.shift(); + this[method].apply(this, request$$1); + } + this._requestQueue = []; + } +}); + +function service (options) { + options = getUrlParams(options); + return new Service(options); +} + +var MapService = Service.extend({ + + identify: function () { + return identifyFeatures(this); + }, + + find: function () { + return find(this); + }, + + query: function () { + return query(this); + } + +}); + +function mapService (options) { + return new MapService(options); +} + +var ImageService = Service.extend({ + + query: function () { + return query(this); + }, + + identify: function () { + return identifyImage(this); + } +}); + +function imageService (options) { + return new ImageService(options); +} + +var FeatureLayerService = Service.extend({ + + options: { + idAttribute: 'OBJECTID' + }, + + query: function () { + return query(this); + }, + + addFeature: function (feature, callback, context) { + delete feature.id; + + feature = geojsonToArcGIS$1(feature); + + return this.post('addFeatures', { + features: [feature] + }, function (error, response) { + var result = (response && response.addResults) ? response.addResults[0] : undefined; + if (callback) { + callback.call(context, error || response.addResults[0].error, result); + } + }, context); + }, + + updateFeature: function (feature, callback, context) { + feature = geojsonToArcGIS$1(feature, this.options.idAttribute); + + return this.post('updateFeatures', { + features: [feature] + }, function (error, response) { + var result = (response && response.updateResults) ? response.updateResults[0] : undefined; + if (callback) { + callback.call(context, error || response.updateResults[0].error, result); + } + }, context); + }, + + deleteFeature: function (id, callback, context) { + return this.post('deleteFeatures', { + objectIds: id + }, function (error, response) { + var result = (response && response.deleteResults) ? response.deleteResults[0] : undefined; + if (callback) { + callback.call(context, error || response.deleteResults[0].error, result); + } + }, context); + }, + + deleteFeatures: function (ids, callback, context) { + return this.post('deleteFeatures', { + objectIds: ids + }, function (error, response) { + // pass back the entire array + var result = (response && response.deleteResults) ? response.deleteResults : undefined; + if (callback) { + callback.call(context, error || response.deleteResults[0].error, result); + } + }, context); + } +}); + +function featureLayerService (options) { + return new FeatureLayerService(options); +} + +var tileProtocol = (window.location.protocol !== 'https:') ? 'http:' : 'https:'; + +var BasemapLayer = leaflet.TileLayer.extend({ + statics: { + TILES: { + Streets: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 19, + subdomains: ['server', 'services'], + attribution: 'USGS, NOAA', + attributionUrl: 'https://static.arcgis.com/attribution/World_Street_Map' + } + }, + Topographic: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 19, + subdomains: ['server', 'services'], + attribution: 'USGS, NOAA', + attributionUrl: 'https://static.arcgis.com/attribution/World_Topo_Map' + } + }, + Oceans: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 16, + subdomains: ['server', 'services'], + attribution: 'USGS, NOAA', + attributionUrl: 'https://static.arcgis.com/attribution/Ocean_Basemap' + } + }, + OceansLabels: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Reference/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 16, + subdomains: ['server', 'services'], + pane: (pointerEvents) ? 'esri-labels' : 'tilePane' + } + }, + NationalGeographic: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 16, + subdomains: ['server', 'services'], + attribution: 'National Geographic, DeLorme, HERE, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, increment P Corp.' + } + }, + DarkGray: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 16, + subdomains: ['server', 'services'], + attribution: 'HERE, DeLorme, MapmyIndia, © OpenStreetMap contributors' + } + }, + DarkGrayLabels: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Reference/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 16, + subdomains: ['server', 'services'], + pane: (pointerEvents) ? 'esri-labels' : 'tilePane', + attribution: '' + + } + }, + Gray: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 16, + subdomains: ['server', 'services'], + attribution: 'HERE, DeLorme, MapmyIndia, © OpenStreetMap contributors' + } + }, + GrayLabels: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 16, + subdomains: ['server', 'services'], + pane: (pointerEvents) ? 'esri-labels' : 'tilePane', + attribution: '' + } + }, + Imagery: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 19, + subdomains: ['server', 'services'], + attribution: 'DigitalGlobe, GeoEye, i-cubed, USDA, USGS, AEX, Getmapping, Aerogrid, IGN, IGP, swisstopo, and the GIS User Community', + attributionUrl: 'https://static.arcgis.com/attribution/World_Imagery' + } + }, + ImageryLabels: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 19, + subdomains: ['server', 'services'], + pane: (pointerEvents) ? 'esri-labels' : 'tilePane', + attribution: '' + } + }, + ImageryTransportation: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Transportation/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 19, + subdomains: ['server', 'services'], + pane: (pointerEvents) ? 'esri-labels' : 'tilePane' + } + }, + ShadedRelief: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 13, + subdomains: ['server', 'services'], + attribution: 'USGS' + } + }, + ShadedReliefLabels: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places_Alternate/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 12, + subdomains: ['server', 'services'], + pane: (pointerEvents) ? 'esri-labels' : 'tilePane', + attribution: '' + } + }, + Terrain: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 13, + subdomains: ['server', 'services'], + attribution: 'USGS, NOAA' + } + }, + TerrainLabels: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Reference_Overlay/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 13, + subdomains: ['server', 'services'], + pane: (pointerEvents) ? 'esri-labels' : 'tilePane', + attribution: '' + } + }, + USATopo: { + urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/USA_Topo_Maps/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 15, + subdomains: ['server', 'services'], + attribution: 'USGS, National Geographic Society, i-cubed' + } + }, + ImageryClarity: { + urlTemplate: tileProtocol + '//clarity.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', + options: { + minZoom: 1, + maxZoom: 19, + attribution: 'Esri, DigitalGlobe, GeoEye, Earthstar Geographics, CNES/Airbus DS, USDA, USGS, AeroGRID, IGN, and the GIS User Community' + } + } + } + }, + + initialize: function (key, options) { + var config; + + // set the config variable with the appropriate config object + if (typeof key === 'object' && key.urlTemplate && key.options) { + config = key; + } else if (typeof key === 'string' && BasemapLayer.TILES[key]) { + config = BasemapLayer.TILES[key]; + } else { + throw new Error('L.esri.BasemapLayer: Invalid parameter. Use one of "Streets", "Topographic", "Oceans", "OceansLabels", "NationalGeographic", "Gray", "GrayLabels", "DarkGray", "DarkGrayLabels", "Imagery", "ImageryLabels", "ImageryTransportation", "ImageryClarity", "ShadedRelief", "ShadedReliefLabels", "Terrain", "TerrainLabels" or "USATopo"'); + } + + // merge passed options into the config options + var tileOptions = leaflet.Util.extend(config.options, options); + + leaflet.Util.setOptions(this, tileOptions); + + if (this.options.token) { + config.urlTemplate += ('?token=' + this.options.token); + } + + // call the initialize method on L.TileLayer to set everything up + leaflet.TileLayer.prototype.initialize.call(this, config.urlTemplate, tileOptions); + }, + + onAdd: function (map) { + // include 'Powered by Esri' in map attribution + setEsriAttribution(map); + + if (this.options.pane === 'esri-labels') { + this._initPane(); + } + // some basemaps can supply dynamic attribution + if (this.options.attributionUrl) { + _getAttributionData(this.options.attributionUrl, map); + } + + map.on('moveend', _updateMapAttribution); + + leaflet.TileLayer.prototype.onAdd.call(this, map); + }, + + onRemove: function (map) { + map.off('moveend', _updateMapAttribution); + leaflet.TileLayer.prototype.onRemove.call(this, map); + }, + + _initPane: function () { + if (!this._map.getPane(this.options.pane)) { + var pane = this._map.createPane(this.options.pane); + pane.style.pointerEvents = 'none'; + pane.style.zIndex = 500; + } + }, + + getAttribution: function () { + if (this.options.attribution) { + var attribution = '' + this.options.attribution + ''; + } + return attribution; + } +}); + +function basemapLayer (key, options) { + return new BasemapLayer(key, options); +} + +var TiledMapLayer = leaflet.TileLayer.extend({ + options: { + zoomOffsetAllowance: 0.1, + errorTileUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEABAMAAACuXLVVAAAAA1BMVEUzNDVszlHHAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAAAAAAAAAB6mUWpAAAADZJREFUeJztwQEBAAAAgiD/r25IQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7waBAAABw08RwAAAAABJRU5ErkJggg==' + }, + + statics: { + MercatorZoomLevels: { + '0': 156543.03392799999, + '1': 78271.516963999893, + '2': 39135.758482000099, + '3': 19567.879240999901, + '4': 9783.9396204999593, + '5': 4891.9698102499797, + '6': 2445.9849051249898, + '7': 1222.9924525624899, + '8': 611.49622628138002, + '9': 305.74811314055802, + '10': 152.874056570411, + '11': 76.437028285073197, + '12': 38.218514142536598, + '13': 19.109257071268299, + '14': 9.5546285356341496, + '15': 4.7773142679493699, + '16': 2.38865713397468, + '17': 1.1943285668550501, + '18': 0.59716428355981699, + '19': 0.29858214164761698, + '20': 0.14929107082381, + '21': 0.07464553541191, + '22': 0.0373227677059525, + '23': 0.0186613838529763 + } + }, + + initialize: function (options) { + options = leaflet.Util.setOptions(this, options); + + // set the urls + options = getUrlParams(options); + this.tileUrl = (options.proxy ? options.proxy + '?' : '') + options.url + 'tile/{z}/{y}/{x}' + (options.requestParams && Object.keys(options.requestParams).length > 0 ? leaflet.Util.getParamString(options.requestParams) : ''); + // Remove subdomain in url + // https://github.com/Esri/esri-leaflet/issues/991 + if (options.url.indexOf('{s}') !== -1 && options.subdomains) { + options.url = options.url.replace('{s}', options.subdomains[0]); + } + this.service = mapService(options); + this.service.addEventParent(this); + + var arcgisonline = new RegExp(/tiles.arcgis(online)?\.com/g); + if (arcgisonline.test(options.url)) { + this.tileUrl = this.tileUrl.replace('://tiles', '://tiles{s}'); + options.subdomains = ['1', '2', '3', '4']; + } + + if (this.options.token) { + this.tileUrl += ('?token=' + this.options.token); + } + + // init layer by calling TileLayers initialize method + leaflet.TileLayer.prototype.initialize.call(this, this.tileUrl, options); + }, + + getTileUrl: function (tilePoint) { + var zoom = this._getZoomForUrl(); + + return leaflet.Util.template(this.tileUrl, leaflet.Util.extend({ + s: this._getSubdomain(tilePoint), + x: tilePoint.x, + y: tilePoint.y, + // try lod map first, then just default to zoom level + z: (this._lodMap && this._lodMap[zoom]) ? this._lodMap[zoom] : zoom + }, this.options)); + }, + + createTile: function (coords, done) { + var tile = document.createElement('img'); + + leaflet.DomEvent.on(tile, 'load', leaflet.Util.bind(this._tileOnLoad, this, done, tile)); + leaflet.DomEvent.on(tile, 'error', leaflet.Util.bind(this._tileOnError, this, done, tile)); + + if (this.options.crossOrigin) { + tile.crossOrigin = ''; + } + + /* + Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons + http://www.w3.org/TR/WCAG20-TECHS/H67 + */ + tile.alt = ''; + + // if there is no lod map or an lod map with a proper zoom load the tile + // otherwise wait for the lod map to become available + if (!this._lodMap || (this._lodMap && this._lodMap[this._getZoomForUrl()])) { + tile.src = this.getTileUrl(coords); + } else { + this.once('lodmap', function () { + tile.src = this.getTileUrl(coords); + }, this); + } + + return tile; + }, + + onAdd: function (map) { + // include 'Powered by Esri' in map attribution + setEsriAttribution(map); + + if (!this._lodMap) { + this.metadata(function (error, metadata) { + if (!error && metadata.spatialReference) { + var sr = metadata.spatialReference.latestWkid || metadata.spatialReference.wkid; + // display the copyright text from the service using leaflet's attribution control + if (!this.options.attribution && map.attributionControl && metadata.copyrightText) { + this.options.attribution = metadata.copyrightText; + map.attributionControl.addAttribution(this.getAttribution()); + } + + // if the service tiles were published in web mercator using conventional LODs but missing levels, we can try and remap them + if (map.options.crs === leaflet.CRS.EPSG3857 && (sr === 102100 || sr === 3857)) { + this._lodMap = {}; + // create the zoom level data + var arcgisLODs = metadata.tileInfo.lods; + var correctResolutions = TiledMapLayer.MercatorZoomLevels; + + for (var i = 0; i < arcgisLODs.length; i++) { + var arcgisLOD = arcgisLODs[i]; + for (var ci in correctResolutions) { + var correctRes = correctResolutions[ci]; + + if (this._withinPercentage(arcgisLOD.resolution, correctRes, this.options.zoomOffsetAllowance)) { + this._lodMap[ci] = arcgisLOD.level; + break; + } + } + } + + this.fire('lodmap'); + } else if (map.options.crs && map.options.crs.code && (map.options.crs.code.indexOf(sr) > -1)) { + // if the projection is WGS84, or the developer is using Proj4 to define a custom CRS, no action is required + } else { + // if the service was cached in a custom projection and an appropriate LOD hasn't been defined in the map, guide the developer to our Proj4 sample + warn('L.esri.TiledMapLayer is using a non-mercator spatial reference. Support may be available through Proj4Leaflet http://esri.github.io/esri-leaflet/examples/non-mercator-projection.html'); + } + } + }, this); + } + + leaflet.TileLayer.prototype.onAdd.call(this, map); + }, + + metadata: function (callback, context) { + this.service.metadata(callback, context); + return this; + }, + + identify: function () { + return this.service.identify(); + }, + + find: function () { + return this.service.find(); + }, + + query: function () { + return this.service.query(); + }, + + authenticate: function (token) { + var tokenQs = '?token=' + token; + this.tileUrl = (this.options.token) ? this.tileUrl.replace(/\?token=(.+)/g, tokenQs) : this.tileUrl + tokenQs; + this.options.token = token; + this.service.authenticate(token); + return this; + }, + + _withinPercentage: function (a, b, percentage) { + var diff = Math.abs((a / b) - 1); + return diff < percentage; + } +}); + +function tiledMapLayer (url, options) { + return new TiledMapLayer(url, options); +} + +var Overlay = leaflet.ImageOverlay.extend({ + onAdd: function (map) { + this._topLeft = map.getPixelBounds().min; + leaflet.ImageOverlay.prototype.onAdd.call(this, map); + }, + _reset: function () { + if (this._map.options.crs === leaflet.CRS.EPSG3857) { + leaflet.ImageOverlay.prototype._reset.call(this); + } else { + leaflet.DomUtil.setPosition(this._image, this._topLeft.subtract(this._map.getPixelOrigin())); + } + } +}); + +var RasterLayer = leaflet.Layer.extend({ + options: { + opacity: 1, + position: 'front', + f: 'image', + useCors: cors, + attribution: null, + interactive: false, + alt: '' + }, + + onAdd: function (map) { + // include 'Powered by Esri' in map attribution + setEsriAttribution(map); + + this._update = leaflet.Util.throttle(this._update, this.options.updateInterval, this); + + map.on('moveend', this._update, this); + + // if we had an image loaded and it matches the + // current bounds show the image otherwise remove it + if (this._currentImage && this._currentImage._bounds.equals(this._map.getBounds())) { + map.addLayer(this._currentImage); + } else if (this._currentImage) { + this._map.removeLayer(this._currentImage); + this._currentImage = null; + } + + this._update(); + + if (this._popup) { + this._map.on('click', this._getPopupData, this); + this._map.on('dblclick', this._resetPopupState, this); + } + + // add copyright text listed in service metadata + this.metadata(function (err, metadata) { + if (!err && !this.options.attribution && map.attributionControl && metadata.copyrightText) { + this.options.attribution = metadata.copyrightText; + map.attributionControl.addAttribution(this.getAttribution()); + } + }, this); + }, + + onRemove: function (map) { + if (this._currentImage) { + this._map.removeLayer(this._currentImage); + } + + if (this._popup) { + this._map.off('click', this._getPopupData, this); + this._map.off('dblclick', this._resetPopupState, this); + } + + this._map.off('moveend', this._update, this); + }, + + bindPopup: function (fn, popupOptions) { + this._shouldRenderPopup = false; + this._lastClick = false; + this._popup = leaflet.popup(popupOptions); + this._popupFunction = fn; + if (this._map) { + this._map.on('click', this._getPopupData, this); + this._map.on('dblclick', this._resetPopupState, this); + } + return this; + }, + + unbindPopup: function () { + if (this._map) { + this._map.closePopup(this._popup); + this._map.off('click', this._getPopupData, this); + this._map.off('dblclick', this._resetPopupState, this); + } + this._popup = false; + return this; + }, + + bringToFront: function () { + this.options.position = 'front'; + if (this._currentImage) { + this._currentImage.bringToFront(); + } + return this; + }, + + bringToBack: function () { + this.options.position = 'back'; + if (this._currentImage) { + this._currentImage.bringToBack(); + } + return this; + }, + + getAttribution: function () { + return this.options.attribution; + }, + + getOpacity: function () { + return this.options.opacity; + }, + + setOpacity: function (opacity) { + this.options.opacity = opacity; + if (this._currentImage) { + this._currentImage.setOpacity(opacity); + } + return this; + }, + + getTimeRange: function () { + return [this.options.from, this.options.to]; + }, + + setTimeRange: function (from, to) { + this.options.from = from; + this.options.to = to; + this._update(); + return this; + }, + + metadata: function (callback, context) { + this.service.metadata(callback, context); + return this; + }, + + authenticate: function (token) { + this.service.authenticate(token); + return this; + }, + + redraw: function () { + this._update(); + }, + + _renderImage: function (url, bounds, contentType) { + if (this._map) { + // if no output directory has been specified for a service, MIME data will be returned + if (contentType) { + url = 'data:' + contentType + ';base64,' + url; + } + // create a new image overlay and add it to the map + // to start loading the image + // opacity is 0 while the image is loading + var image = new Overlay(url, bounds, { + opacity: 0, + crossOrigin: this.options.useCors, + alt: this.options.alt, + pane: this.options.pane || this.getPane(), + interactive: this.options.interactive + }).addTo(this._map); + + var onOverlayError = function () { + this._map.removeLayer(image); + this.fire('error'); + image.off('load', onOverlayLoad, this); + }; + + var onOverlayLoad = function (e) { + image.off('error', onOverlayLoad, this); + if (this._map) { + var newImage = e.target; + var oldImage = this._currentImage; + + // if the bounds of this image matches the bounds that + // _renderImage was called with and we have a map with the same bounds + // hide the old image if there is one and set the opacity + // of the new image otherwise remove the new image + if (newImage._bounds.equals(bounds) && newImage._bounds.equals(this._map.getBounds())) { + this._currentImage = newImage; + + if (this.options.position === 'front') { + this.bringToFront(); + } else { + this.bringToBack(); + } + + if (this._map && this._currentImage._map) { + this._currentImage.setOpacity(this.options.opacity); + } else { + this._currentImage._map.removeLayer(this._currentImage); + } + + if (oldImage && this._map) { + this._map.removeLayer(oldImage); + } + + if (oldImage && oldImage._map) { + oldImage._map.removeLayer(oldImage); + } + } else { + this._map.removeLayer(newImage); + } + } + + this.fire('load', { + bounds: bounds + }); + }; + + // If loading the image fails + image.once('error', onOverlayError, this); + + // once the image loads + image.once('load', onOverlayLoad, this); + + this.fire('loading', { + bounds: bounds + }); + } + }, + + _update: function () { + if (!this._map) { + return; + } + + var zoom = this._map.getZoom(); + var bounds = this._map.getBounds(); + + if (this._animatingZoom) { + return; + } + + if (this._map._panTransition && this._map._panTransition._inProgress) { + return; + } + + if (zoom > this.options.maxZoom || zoom < this.options.minZoom) { + if (this._currentImage) { + this._currentImage._map.removeLayer(this._currentImage); + this._currentImage = null; + } + return; + } + + var params = this._buildExportParams(); + leaflet.Util.extend(params, this.options.requestParams); + + if (params) { + this._requestExport(params, bounds); + } else if (this._currentImage) { + this._currentImage._map.removeLayer(this._currentImage); + this._currentImage = null; + } + }, + + _renderPopup: function (latlng, error, results, response) { + latlng = leaflet.latLng(latlng); + if (this._shouldRenderPopup && this._lastClick.equals(latlng)) { + // add the popup to the map where the mouse was clicked at + var content = this._popupFunction(error, results, response); + if (content) { + this._popup.setLatLng(latlng).setContent(content).openOn(this._map); + } + } + }, + + _resetPopupState: function (e) { + this._shouldRenderPopup = false; + this._lastClick = e.latlng; + }, + + _calculateBbox: function () { + var pixelBounds = this._map.getPixelBounds(); + + var sw = this._map.unproject(pixelBounds.getBottomLeft()); + var ne = this._map.unproject(pixelBounds.getTopRight()); + + var neProjected = this._map.options.crs.project(ne); + var swProjected = this._map.options.crs.project(sw); + + // this ensures ne/sw are switched in polar maps where north/top bottom/south is inverted + var boundsProjected = leaflet.bounds(neProjected, swProjected); + + return [boundsProjected.getBottomLeft().x, boundsProjected.getBottomLeft().y, boundsProjected.getTopRight().x, boundsProjected.getTopRight().y].join(','); + }, + + _calculateImageSize: function () { + // ensure that we don't ask ArcGIS Server for a taller image than we have actual map displaying within the div + var bounds = this._map.getPixelBounds(); + var size = this._map.getSize(); + + var sw = this._map.unproject(bounds.getBottomLeft()); + var ne = this._map.unproject(bounds.getTopRight()); + + var top = this._map.latLngToLayerPoint(ne).y; + var bottom = this._map.latLngToLayerPoint(sw).y; + + if (top > 0 || bottom < size.y) { + size.y = bottom - top; + } + + return size.x + ',' + size.y; + } +}); + +var ImageMapLayer = RasterLayer.extend({ + + options: { + updateInterval: 150, + format: 'jpgpng', + transparent: true, + f: 'image' + }, + + query: function () { + return this.service.query(); + }, + + identify: function () { + return this.service.identify(); + }, + + initialize: function (options) { + options = getUrlParams(options); + this.service = imageService(options); + this.service.addEventParent(this); + + leaflet.Util.setOptions(this, options); + }, + + setPixelType: function (pixelType) { + this.options.pixelType = pixelType; + this._update(); + return this; + }, + + getPixelType: function () { + return this.options.pixelType; + }, + + setBandIds: function (bandIds) { + if (leaflet.Util.isArray(bandIds)) { + this.options.bandIds = bandIds.join(','); + } else { + this.options.bandIds = bandIds.toString(); + } + this._update(); + return this; + }, + + getBandIds: function () { + return this.options.bandIds; + }, + + setNoData: function (noData, noDataInterpretation) { + if (leaflet.Util.isArray(noData)) { + this.options.noData = noData.join(','); + } else { + this.options.noData = noData.toString(); + } + if (noDataInterpretation) { + this.options.noDataInterpretation = noDataInterpretation; + } + this._update(); + return this; + }, + + getNoData: function () { + return this.options.noData; + }, + + getNoDataInterpretation: function () { + return this.options.noDataInterpretation; + }, + + setRenderingRule: function (renderingRule) { + this.options.renderingRule = renderingRule; + this._update(); + }, + + getRenderingRule: function () { + return this.options.renderingRule; + }, + + setMosaicRule: function (mosaicRule) { + this.options.mosaicRule = mosaicRule; + this._update(); + }, + + getMosaicRule: function () { + return this.options.mosaicRule; + }, + + _getPopupData: function (e) { + var callback = leaflet.Util.bind(function (error, results, response) { + if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire + setTimeout(leaflet.Util.bind(function () { + this._renderPopup(e.latlng, error, results, response); + }, this), 300); + }, this); + + var identifyRequest = this.identify().at(e.latlng); + + // set mosaic rule for identify task if it is set for layer + if (this.options.mosaicRule) { + identifyRequest.setMosaicRule(this.options.mosaicRule); + // @TODO: force return catalog items too? + } + + // @TODO: set rendering rule? Not sure, + // sometimes you want raw pixel values + // if (this.options.renderingRule) { + // identifyRequest.setRenderingRule(this.options.renderingRule); + // } + + identifyRequest.run(callback); + + // set the flags to show the popup + this._shouldRenderPopup = true; + this._lastClick = e.latlng; + }, + + _buildExportParams: function () { + var sr = parseInt(this._map.options.crs.code.split(':')[1], 10); + + var params = { + bbox: this._calculateBbox(), + size: this._calculateImageSize(), + format: this.options.format, + transparent: this.options.transparent, + bboxSR: sr, + imageSR: sr + }; + + if (this.options.from && this.options.to) { + params.time = this.options.from.valueOf() + ',' + this.options.to.valueOf(); + } + + if (this.options.pixelType) { + params.pixelType = this.options.pixelType; + } + + if (this.options.interpolation) { + params.interpolation = this.options.interpolation; + } + + if (this.options.compressionQuality) { + params.compressionQuality = this.options.compressionQuality; + } + + if (this.options.bandIds) { + params.bandIds = this.options.bandIds; + } + + // 0 is falsy *and* a valid input parameter + if (this.options.noData === 0 || this.options.noData) { + params.noData = this.options.noData; + } + + if (this.options.noDataInterpretation) { + params.noDataInterpretation = this.options.noDataInterpretation; + } + + if (this.service.options.token) { + params.token = this.service.options.token; + } + + if (this.options.renderingRule) { + params.renderingRule = JSON.stringify(this.options.renderingRule); + } + + if (this.options.mosaicRule) { + params.mosaicRule = JSON.stringify(this.options.mosaicRule); + } + + return params; + }, + + _requestExport: function (params, bounds) { + if (this.options.f === 'json') { + this.service.request('exportImage', params, function (error, response) { + if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire + if (this.options.token) { + response.href += ('?token=' + this.options.token); + } + this._renderImage(response.href, bounds); + }, this); + } else { + params.f = 'image'; + this._renderImage(this.options.url + 'exportImage' + leaflet.Util.getParamString(params), bounds); + } + } +}); + +function imageMapLayer (url, options) { + return new ImageMapLayer(url, options); +} + +var DynamicMapLayer = RasterLayer.extend({ + + options: { + updateInterval: 150, + layers: false, + layerDefs: false, + timeOptions: false, + format: 'png24', + transparent: true, + f: 'json' + }, + + initialize: function (options) { + options = getUrlParams(options); + this.service = mapService(options); + this.service.addEventParent(this); + + if ((options.proxy || options.token) && options.f !== 'json') { + options.f = 'json'; + } + + leaflet.Util.setOptions(this, options); + }, + + getDynamicLayers: function () { + return this.options.dynamicLayers; + }, + + setDynamicLayers: function (dynamicLayers) { + this.options.dynamicLayers = dynamicLayers; + this._update(); + return this; + }, + + getLayers: function () { + return this.options.layers; + }, + + setLayers: function (layers) { + this.options.layers = layers; + this._update(); + return this; + }, + + getLayerDefs: function () { + return this.options.layerDefs; + }, + + setLayerDefs: function (layerDefs) { + this.options.layerDefs = layerDefs; + this._update(); + return this; + }, + + getTimeOptions: function () { + return this.options.timeOptions; + }, + + setTimeOptions: function (timeOptions) { + this.options.timeOptions = timeOptions; + this._update(); + return this; + }, + + query: function () { + return this.service.query(); + }, + + identify: function () { + return this.service.identify(); + }, + + find: function () { + return this.service.find(); + }, + + _getPopupData: function (e) { + var callback = leaflet.Util.bind(function (error, featureCollection, response) { + if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire + setTimeout(leaflet.Util.bind(function () { + this._renderPopup(e.latlng, error, featureCollection, response); + }, this), 300); + }, this); + + var identifyRequest; + if (this.options.popup) { + identifyRequest = this.options.popup.on(this._map).at(e.latlng); + } else { + identifyRequest = this.identify().on(this._map).at(e.latlng); + } + + // remove extraneous vertices from response features if it has not already been done + identifyRequest.params.maxAllowableOffset ? true : identifyRequest.simplify(this._map, 0.5); + + if (!(this.options.popup && this.options.popup.params && this.options.popup.params.layers)) { + if (this.options.layers) { + identifyRequest.layers('visible:' + this.options.layers.join(',')); + } else { + identifyRequest.layers('visible'); + } + } + + // if present, pass layer ids and sql filters through to the identify task + if (this.options.layerDefs && typeof this.options.layerDefs !== 'string' && !identifyRequest.params.layerDefs) { + for (var id in this.options.layerDefs) { + if (this.options.layerDefs.hasOwnProperty(id)) { + identifyRequest.layerDef(id, this.options.layerDefs[id]); + } + } + } + + identifyRequest.run(callback); + + // set the flags to show the popup + this._shouldRenderPopup = true; + this._lastClick = e.latlng; + }, + + _buildExportParams: function () { + var sr = parseInt(this._map.options.crs.code.split(':')[1], 10); + + var params = { + bbox: this._calculateBbox(), + size: this._calculateImageSize(), + dpi: 96, + format: this.options.format, + transparent: this.options.transparent, + bboxSR: sr, + imageSR: sr + }; + + if (this.options.dynamicLayers) { + params.dynamicLayers = this.options.dynamicLayers; + } + + if (this.options.layers) { + if (this.options.layers.length === 0) { + return; + } else { + params.layers = 'show:' + this.options.layers.join(','); + } + } + + if (this.options.layerDefs) { + params.layerDefs = typeof this.options.layerDefs === 'string' ? this.options.layerDefs : JSON.stringify(this.options.layerDefs); + } + + if (this.options.timeOptions) { + params.timeOptions = JSON.stringify(this.options.timeOptions); + } + + if (this.options.from && this.options.to) { + params.time = this.options.from.valueOf() + ',' + this.options.to.valueOf(); + } + + if (this.service.options.token) { + params.token = this.service.options.token; + } + + if (this.options.proxy) { + params.proxy = this.options.proxy; + } + + // use a timestamp to bust server cache + if (this.options.disableCache) { + params._ts = Date.now(); + } + + return params; + }, + + _requestExport: function (params, bounds) { + if (this.options.f === 'json') { + this.service.request('export', params, function (error, response) { + if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire + + if (this.options.token) { + response.href += ('?token=' + this.options.token); + } + if (this.options.proxy) { + response.href = this.options.proxy + '?' + response.href; + } + if (response.href) { + this._renderImage(response.href, bounds); + } else { + this._renderImage(response.imageData, bounds, response.contentType); + } + }, this); + } else { + params.f = 'image'; + this._renderImage(this.options.url + 'export' + leaflet.Util.getParamString(params), bounds); + } + } +}); + +function dynamicMapLayer (url, options) { + return new DynamicMapLayer(url, options); +} + +var VirtualGrid = leaflet.Layer.extend({ + + options: { + cellSize: 512, + updateInterval: 150 + }, + + initialize: function (options) { + options = leaflet.setOptions(this, options); + this._zooming = false; + }, + + onAdd: function (map) { + this._map = map; + this._update = leaflet.Util.throttle(this._update, this.options.updateInterval, this); + this._reset(); + this._update(); + }, + + onRemove: function () { + this._map.removeEventListener(this.getEvents(), this); + this._removeCells(); + }, + + getEvents: function () { + var events = { + moveend: this._update, + zoomstart: this._zoomstart, + zoomend: this._reset + }; + + return events; + }, + + addTo: function (map) { + map.addLayer(this); + return this; + }, + + removeFrom: function (map) { + map.removeLayer(this); + return this; + }, + + _zoomstart: function () { + this._zooming = true; + }, + + _reset: function () { + this._removeCells(); + + this._cells = {}; + this._activeCells = {}; + this._cellsToLoad = 0; + this._cellsTotal = 0; + this._cellNumBounds = this._getCellNumBounds(); + + this._resetWrap(); + this._zooming = false; + }, + + _resetWrap: function () { + var map = this._map; + var crs = map.options.crs; + + if (crs.infinite) { return; } + + var cellSize = this._getCellSize(); + + if (crs.wrapLng) { + this._wrapLng = [ + Math.floor(map.project([0, crs.wrapLng[0]]).x / cellSize), + Math.ceil(map.project([0, crs.wrapLng[1]]).x / cellSize) + ]; + } + + if (crs.wrapLat) { + this._wrapLat = [ + Math.floor(map.project([crs.wrapLat[0], 0]).y / cellSize), + Math.ceil(map.project([crs.wrapLat[1], 0]).y / cellSize) + ]; + } + }, + + _getCellSize: function () { + return this.options.cellSize; + }, + + _update: function () { + if (!this._map) { + return; + } + + var mapBounds = this._map.getPixelBounds(); + var cellSize = this._getCellSize(); + + // cell coordinates range for the current view + var cellBounds = leaflet.bounds( + mapBounds.min.divideBy(cellSize).floor(), + mapBounds.max.divideBy(cellSize).floor()); + + this._removeOtherCells(cellBounds); + this._addCells(cellBounds); + + this.fire('cellsupdated'); + }, + + _addCells: function (cellBounds) { + var queue = []; + var center = cellBounds.getCenter(); + var zoom = this._map.getZoom(); + + var j, i, coords; + // create a queue of coordinates to load cells from + for (j = cellBounds.min.y; j <= cellBounds.max.y; j++) { + for (i = cellBounds.min.x; i <= cellBounds.max.x; i++) { + coords = leaflet.point(i, j); + coords.z = zoom; + + if (this._isValidCell(coords)) { + queue.push(coords); + } + } + } + + var cellsToLoad = queue.length; + + if (cellsToLoad === 0) { return; } + + this._cellsToLoad += cellsToLoad; + this._cellsTotal += cellsToLoad; + + // sort cell queue to load cells in order of their distance to center + queue.sort(function (a, b) { + return a.distanceTo(center) - b.distanceTo(center); + }); + + for (i = 0; i < cellsToLoad; i++) { + this._addCell(queue[i]); + } + }, + + _isValidCell: function (coords) { + var crs = this._map.options.crs; + + if (!crs.infinite) { + // don't load cell if it's out of bounds and not wrapped + var cellNumBounds = this._cellNumBounds; + if ( + (!crs.wrapLng && (coords.x < cellNumBounds.min.x || coords.x > cellNumBounds.max.x)) || + (!crs.wrapLat && (coords.y < cellNumBounds.min.y || coords.y > cellNumBounds.max.y)) + ) { + return false; + } + } + + if (!this.options.bounds) { + return true; + } + + // don't load cell if it doesn't intersect the bounds in options + var cellBounds = this._cellCoordsToBounds(coords); + return leaflet.latLngBounds(this.options.bounds).intersects(cellBounds); + }, + + // converts cell coordinates to its geographical bounds + _cellCoordsToBounds: function (coords) { + var map = this._map; + var cellSize = this.options.cellSize; + var nwPoint = coords.multiplyBy(cellSize); + var sePoint = nwPoint.add([cellSize, cellSize]); + var nw = map.wrapLatLng(map.unproject(nwPoint, coords.z)); + var se = map.wrapLatLng(map.unproject(sePoint, coords.z)); + + return leaflet.latLngBounds(nw, se); + }, + + // converts cell coordinates to key for the cell cache + _cellCoordsToKey: function (coords) { + return coords.x + ':' + coords.y; + }, + + // converts cell cache key to coordiantes + _keyToCellCoords: function (key) { + var kArr = key.split(':'); + var x = parseInt(kArr[0], 10); + var y = parseInt(kArr[1], 10); + + return leaflet.point(x, y); + }, + + // remove any present cells that are off the specified bounds + _removeOtherCells: function (bounds) { + for (var key in this._cells) { + if (!bounds.contains(this._keyToCellCoords(key))) { + this._removeCell(key); + } + } + }, + + _removeCell: function (key) { + var cell = this._activeCells[key]; + + if (cell) { + delete this._activeCells[key]; + + if (this.cellLeave) { + this.cellLeave(cell.bounds, cell.coords); + } + + this.fire('cellleave', { + bounds: cell.bounds, + coords: cell.coords + }); + } + }, + + _removeCells: function () { + for (var key in this._cells) { + var cellBounds = this._cells[key].bounds; + var coords = this._cells[key].coords; + + if (this.cellLeave) { + this.cellLeave(cellBounds, coords); + } + + this.fire('cellleave', { + bounds: cellBounds, + coords: coords + }); + } + }, + + _addCell: function (coords) { + // wrap cell coords if necessary (depending on CRS) + this._wrapCoords(coords); + + // generate the cell key + var key = this._cellCoordsToKey(coords); + + // get the cell from the cache + var cell = this._cells[key]; + // if this cell should be shown as isnt active yet (enter) + + if (cell && !this._activeCells[key]) { + if (this.cellEnter) { + this.cellEnter(cell.bounds, coords); + } + + this.fire('cellenter', { + bounds: cell.bounds, + coords: coords + }); + + this._activeCells[key] = cell; + } + + // if we dont have this cell in the cache yet (create) + if (!cell) { + cell = { + coords: coords, + bounds: this._cellCoordsToBounds(coords) + }; + + this._cells[key] = cell; + this._activeCells[key] = cell; + + if (this.createCell) { + this.createCell(cell.bounds, coords); + } + + this.fire('cellcreate', { + bounds: cell.bounds, + coords: coords + }); + } + }, + + _wrapCoords: function (coords) { + coords.x = this._wrapLng ? leaflet.Util.wrapNum(coords.x, this._wrapLng) : coords.x; + coords.y = this._wrapLat ? leaflet.Util.wrapNum(coords.y, this._wrapLat) : coords.y; + }, + + // get the global cell coordinates range for the current zoom + _getCellNumBounds: function () { + var worldBounds = this._map.getPixelWorldBounds(); + var size = this._getCellSize(); + + return worldBounds ? leaflet.bounds( + worldBounds.min.divideBy(size).floor(), + worldBounds.max.divideBy(size).ceil().subtract([1, 1])) : null; + } +}); + +function BinarySearchIndex (values) { + this.values = [].concat(values || []); +} + +BinarySearchIndex.prototype.query = function (value) { + var index = this.getIndex(value); + return this.values[index]; +}; + +BinarySearchIndex.prototype.getIndex = function getIndex (value) { + if (this.dirty) { + this.sort(); + } + + var minIndex = 0; + var maxIndex = this.values.length - 1; + var currentIndex; + var currentElement; + + while (minIndex <= maxIndex) { + currentIndex = (minIndex + maxIndex) / 2 | 0; + currentElement = this.values[Math.round(currentIndex)]; + if (+currentElement.value < +value) { + minIndex = currentIndex + 1; + } else if (+currentElement.value > +value) { + maxIndex = currentIndex - 1; + } else { + return currentIndex; + } + } + + return Math.abs(~maxIndex); +}; + +BinarySearchIndex.prototype.between = function between (start, end) { + var startIndex = this.getIndex(start); + var endIndex = this.getIndex(end); + + if (startIndex === 0 && endIndex === 0) { + return []; + } + + while (this.values[startIndex - 1] && this.values[startIndex - 1].value === start) { + startIndex--; + } + + while (this.values[endIndex + 1] && this.values[endIndex + 1].value === end) { + endIndex++; + } + + if (this.values[endIndex] && this.values[endIndex].value === end && this.values[endIndex + 1]) { + endIndex++; + } + + return this.values.slice(startIndex, endIndex); +}; + +BinarySearchIndex.prototype.insert = function insert (item) { + this.values.splice(this.getIndex(item.value), 0, item); + return this; +}; + +BinarySearchIndex.prototype.bulkAdd = function bulkAdd (items, sort) { + this.values = this.values.concat([].concat(items || [])); + + if (sort) { + this.sort(); + } else { + this.dirty = true; + } + + return this; +}; + +BinarySearchIndex.prototype.sort = function sort () { + this.values.sort(function (a, b) { + return +b.value - +a.value; + }).reverse(); + this.dirty = false; + return this; +}; + +var FeatureManager = VirtualGrid.extend({ + /** + * Options + */ + + options: { + attribution: null, + where: '1=1', + fields: ['*'], + from: false, + to: false, + timeField: false, + timeFilterMode: 'server', + simplifyFactor: 0, + precision: 6 + }, + + /** + * Constructor + */ + + initialize: function (options) { + VirtualGrid.prototype.initialize.call(this, options); + + options = getUrlParams(options); + options = leaflet.Util.setOptions(this, options); + + this.service = featureLayerService(options); + this.service.addEventParent(this); + + // use case insensitive regex to look for common fieldnames used for indexing + if (this.options.fields[0] !== '*') { + var oidCheck = false; + for (var i = 0; i < this.options.fields.length; i++) { + if (this.options.fields[i].match(/^(OBJECTID|FID|OID|ID)$/i)) { + oidCheck = true; + } + } + if (oidCheck === false) { + warn('no known esriFieldTypeOID field detected in fields Array. Please add an attribute field containing unique IDs to ensure the layer can be drawn correctly.'); + } + } + + if (this.options.timeField.start && this.options.timeField.end) { + this._startTimeIndex = new BinarySearchIndex(); + this._endTimeIndex = new BinarySearchIndex(); + } else if (this.options.timeField) { + this._timeIndex = new BinarySearchIndex(); + } + + this._cache = {}; + this._currentSnapshot = []; // cache of what layers should be active + this._activeRequests = 0; + }, + + /** + * Layer Interface + */ + + onAdd: function (map) { + // include 'Powered by Esri' in map attribution + setEsriAttribution(map); + + this.service.metadata(function (err, metadata) { + if (!err) { + var supportedFormats = metadata.supportedQueryFormats; + + // Check if someone has requested that we don't use geoJSON, even if it's available + var forceJsonFormat = false; + if (this.service.options.isModern === false) { + forceJsonFormat = true; + } + + // Unless we've been told otherwise, check to see whether service can emit GeoJSON natively + if (!forceJsonFormat && supportedFormats && supportedFormats.indexOf('geoJSON') !== -1) { + this.service.options.isModern = true; + } + + // add copyright text listed in service metadata + if (!this.options.attribution && map.attributionControl && metadata.copyrightText) { + this.options.attribution = metadata.copyrightText; + map.attributionControl.addAttribution(this.getAttribution()); + } + } + }, this); + + map.on('zoomend', this._handleZoomChange, this); + + return VirtualGrid.prototype.onAdd.call(this, map); + }, + + onRemove: function (map) { + map.off('zoomend', this._handleZoomChange, this); + + return VirtualGrid.prototype.onRemove.call(this, map); + }, + + getAttribution: function () { + return this.options.attribution; + }, + + /** + * Feature Management + */ + + createCell: function (bounds, coords) { + // dont fetch features outside the scale range defined for the layer + if (this._visibleZoom()) { + this._requestFeatures(bounds, coords); + } + }, + + _requestFeatures: function (bounds, coords, callback) { + this._activeRequests++; + + // our first active request fires loading + if (this._activeRequests === 1) { + this.fire('loading', { + bounds: bounds + }, true); + } + + return this._buildQuery(bounds).run(function (error, featureCollection, response) { + if (response && response.exceededTransferLimit) { + this.fire('drawlimitexceeded'); + } + + // no error, features + if (!error && featureCollection && featureCollection.features.length) { + // schedule adding features until the next animation frame + leaflet.Util.requestAnimFrame(leaflet.Util.bind(function () { + this._addFeatures(featureCollection.features, coords); + this._postProcessFeatures(bounds); + }, this)); + } + + // no error, no features + if (!error && featureCollection && !featureCollection.features.length) { + this._postProcessFeatures(bounds); + } + + if (error) { + this._postProcessFeatures(bounds); + } + + if (callback) { + callback.call(this, error, featureCollection); + } + }, this); + }, + + _postProcessFeatures: function (bounds) { + // deincrement the request counter now that we have processed features + this._activeRequests--; + + // if there are no more active requests fire a load event for this view + if (this._activeRequests <= 0) { + this.fire('load', { + bounds: bounds + }); + } + }, + + _cacheKey: function (coords) { + return coords.z + ':' + coords.x + ':' + coords.y; + }, + + _addFeatures: function (features, coords) { + var key = this._cacheKey(coords); + this._cache[key] = this._cache[key] || []; + + for (var i = features.length - 1; i >= 0; i--) { + var id = features[i].id; + + if (this._currentSnapshot.indexOf(id) === -1) { + this._currentSnapshot.push(id); + } + if (this._cache[key].indexOf(id) === -1) { + this._cache[key].push(id); + } + } + + if (this.options.timeField) { + this._buildTimeIndexes(features); + } + + this.createLayers(features); + }, + + _buildQuery: function (bounds) { + var query = this.service.query() + .intersects(bounds) + .where(this.options.where) + .fields(this.options.fields) + .precision(this.options.precision); + + if (this.options.requestParams) { + leaflet.Util.extend(query.params, this.options.requestParams); + } + + if (this.options.simplifyFactor) { + query.simplify(this._map, this.options.simplifyFactor); + } + + if (this.options.timeFilterMode === 'server' && this.options.from && this.options.to) { + query.between(this.options.from, this.options.to); + } + + return query; + }, + + /** + * Where Methods + */ + + setWhere: function (where, callback, context) { + this.options.where = (where && where.length) ? where : '1=1'; + + var oldSnapshot = []; + var newSnapshot = []; + var pendingRequests = 0; + var requestError = null; + var requestCallback = leaflet.Util.bind(function (error, featureCollection) { + if (error) { + requestError = error; + } + + if (featureCollection) { + for (var i = featureCollection.features.length - 1; i >= 0; i--) { + newSnapshot.push(featureCollection.features[i].id); + } + } + + pendingRequests--; + + if (pendingRequests <= 0 && this._visibleZoom()) { + this._currentSnapshot = newSnapshot; + // schedule adding features for the next animation frame + leaflet.Util.requestAnimFrame(leaflet.Util.bind(function () { + this.removeLayers(oldSnapshot); + this.addLayers(newSnapshot); + if (callback) { + callback.call(context, requestError); + } + }, this)); + } + }, this); + + for (var i = this._currentSnapshot.length - 1; i >= 0; i--) { + oldSnapshot.push(this._currentSnapshot[i]); + } + + for (var key in this._activeCells) { + pendingRequests++; + var coords = this._keyToCellCoords(key); + var bounds = this._cellCoordsToBounds(coords); + this._requestFeatures(bounds, key, requestCallback); + } + + return this; + }, + + getWhere: function () { + return this.options.where; + }, + + /** + * Time Range Methods + */ + + getTimeRange: function () { + return [this.options.from, this.options.to]; + }, + + setTimeRange: function (from, to, callback, context) { + var oldFrom = this.options.from; + var oldTo = this.options.to; + var pendingRequests = 0; + var requestError = null; + var requestCallback = leaflet.Util.bind(function (error) { + if (error) { + requestError = error; + } + this._filterExistingFeatures(oldFrom, oldTo, from, to); + + pendingRequests--; + + if (callback && pendingRequests <= 0) { + callback.call(context, requestError); + } + }, this); + + this.options.from = from; + this.options.to = to; + + this._filterExistingFeatures(oldFrom, oldTo, from, to); + + if (this.options.timeFilterMode === 'server') { + for (var key in this._activeCells) { + pendingRequests++; + var coords = this._keyToCellCoords(key); + var bounds = this._cellCoordsToBounds(coords); + this._requestFeatures(bounds, key, requestCallback); + } + } + + return this; + }, + + refresh: function () { + for (var key in this._activeCells) { + var coords = this._keyToCellCoords(key); + var bounds = this._cellCoordsToBounds(coords); + this._requestFeatures(bounds, key); + } + + if (this.redraw) { + this.once('load', function () { + this.eachFeature(function (layer) { + this._redraw(layer.feature.id); + }, this); + }, this); + } + }, + + _filterExistingFeatures: function (oldFrom, oldTo, newFrom, newTo) { + var layersToRemove = (oldFrom && oldTo) ? this._getFeaturesInTimeRange(oldFrom, oldTo) : this._currentSnapshot; + var layersToAdd = this._getFeaturesInTimeRange(newFrom, newTo); + + if (layersToAdd.indexOf) { + for (var i = 0; i < layersToAdd.length; i++) { + var shouldRemoveLayer = layersToRemove.indexOf(layersToAdd[i]); + if (shouldRemoveLayer >= 0) { + layersToRemove.splice(shouldRemoveLayer, 1); + } + } + } + + // schedule adding features until the next animation frame + leaflet.Util.requestAnimFrame(leaflet.Util.bind(function () { + this.removeLayers(layersToRemove); + this.addLayers(layersToAdd); + }, this)); + }, + + _getFeaturesInTimeRange: function (start, end) { + var ids = []; + var search; + + if (this.options.timeField.start && this.options.timeField.end) { + var startTimes = this._startTimeIndex.between(start, end); + var endTimes = this._endTimeIndex.between(start, end); + search = startTimes.concat(endTimes); + } else { + search = this._timeIndex.between(start, end); + } + + for (var i = search.length - 1; i >= 0; i--) { + ids.push(search[i].id); + } + + return ids; + }, + + _buildTimeIndexes: function (geojson) { + var i; + var feature; + if (this.options.timeField.start && this.options.timeField.end) { + var startTimeEntries = []; + var endTimeEntries = []; + for (i = geojson.length - 1; i >= 0; i--) { + feature = geojson[i]; + startTimeEntries.push({ + id: feature.id, + value: new Date(feature.properties[this.options.timeField.start]) + }); + endTimeEntries.push({ + id: feature.id, + value: new Date(feature.properties[this.options.timeField.end]) + }); + } + this._startTimeIndex.bulkAdd(startTimeEntries); + this._endTimeIndex.bulkAdd(endTimeEntries); + } else { + var timeEntries = []; + for (i = geojson.length - 1; i >= 0; i--) { + feature = geojson[i]; + timeEntries.push({ + id: feature.id, + value: new Date(feature.properties[this.options.timeField]) + }); + } + + this._timeIndex.bulkAdd(timeEntries); + } + }, + + _featureWithinTimeRange: function (feature) { + if (!this.options.from || !this.options.to) { + return true; + } + + var from = +this.options.from.valueOf(); + var to = +this.options.to.valueOf(); + + if (typeof this.options.timeField === 'string') { + var date = +feature.properties[this.options.timeField]; + return (date >= from) && (date <= to); + } + + if (this.options.timeField.start && this.options.timeField.end) { + var startDate = +feature.properties[this.options.timeField.start]; + var endDate = +feature.properties[this.options.timeField.end]; + return ((startDate >= from) && (startDate <= to)) || ((endDate >= from) && (endDate <= to)); + } + }, + + _visibleZoom: function () { + // check to see whether the current zoom level of the map is within the optional limit defined for the FeatureLayer + if (!this._map) { + return false; + } + var zoom = this._map.getZoom(); + if (zoom > this.options.maxZoom || zoom < this.options.minZoom) { + return false; + } else { return true; } + }, + + _handleZoomChange: function () { + if (!this._visibleZoom()) { + this.removeLayers(this._currentSnapshot); + this._currentSnapshot = []; + } else { + /* + for every cell in this._activeCells + 1. Get the cache key for the coords of the cell + 2. If this._cache[key] exists it will be an array of feature IDs. + 3. Call this.addLayers(this._cache[key]) to instruct the feature layer to add the layers back. + */ + for (var i in this._activeCells) { + var coords = this._activeCells[i].coords; + var key = this._cacheKey(coords); + if (this._cache[key]) { + this.addLayers(this._cache[key]); + } + } + } + }, + + /** + * Service Methods + */ + + authenticate: function (token) { + this.service.authenticate(token); + return this; + }, + + metadata: function (callback, context) { + this.service.metadata(callback, context); + return this; + }, + + query: function () { + return this.service.query(); + }, + + _getMetadata: function (callback) { + if (this._metadata) { + var error; + callback(error, this._metadata); + } else { + this.metadata(leaflet.Util.bind(function (error, response) { + this._metadata = response; + callback(error, this._metadata); + }, this)); + } + }, + + addFeature: function (feature, callback, context) { + this._getMetadata(leaflet.Util.bind(function (error, metadata) { + if (error) { + if (callback) { callback.call(this, error, null); } + return; + } + + this.service.addFeature(feature, leaflet.Util.bind(function (error, response) { + if (!error) { + // assign ID from result to appropriate objectid field from service metadata + feature.properties[metadata.objectIdField] = response.objectId; + + // we also need to update the geojson id for createLayers() to function + feature.id = response.objectId; + this.createLayers([feature]); + } + + if (callback) { + callback.call(context, error, response); + } + }, this)); + }, this)); + }, + + updateFeature: function (feature, callback, context) { + this.service.updateFeature(feature, function (error, response) { + if (!error) { + this.removeLayers([feature.id], true); + this.createLayers([feature]); + } + + if (callback) { + callback.call(context, error, response); + } + }, this); + }, + + deleteFeature: function (id, callback, context) { + this.service.deleteFeature(id, function (error, response) { + if (!error && response.objectId) { + this.removeLayers([response.objectId], true); + } + if (callback) { + callback.call(context, error, response); + } + }, this); + }, + + deleteFeatures: function (ids, callback, context) { + return this.service.deleteFeatures(ids, function (error, response) { + if (!error && response.length > 0) { + for (var i = 0; i < response.length; i++) { + this.removeLayers([response[i].objectId], true); + } + } + if (callback) { + callback.call(context, error, response); + } + }, this); + } +}); + +var FeatureLayer = FeatureManager.extend({ + + options: { + cacheLayers: true + }, + + /** + * Constructor + */ + initialize: function (options) { + FeatureManager.prototype.initialize.call(this, options); + this._originalStyle = this.options.style; + this._layers = {}; + }, + + /** + * Layer Interface + */ + + onRemove: function (map) { + for (var i in this._layers) { + map.removeLayer(this._layers[i]); + // trigger the event when the entire featureLayer is removed from the map + this.fire('removefeature', { + feature: this._layers[i].feature, + permanent: false + }, true); + } + + return FeatureManager.prototype.onRemove.call(this, map); + }, + + createNewLayer: function (geojson) { + var layer = leaflet.GeoJSON.geometryToLayer(geojson, this.options); + layer.defaultOptions = layer.options; + return layer; + }, + + _updateLayer: function (layer, geojson) { + // convert the geojson coordinates into a Leaflet LatLng array/nested arrays + // pass it to setLatLngs to update layer geometries + var latlngs = []; + var coordsToLatLng = this.options.coordsToLatLng || leaflet.GeoJSON.coordsToLatLng; + + // copy new attributes, if present + if (geojson.properties) { + layer.feature.properties = geojson.properties; + } + + switch (geojson.geometry.type) { + case 'Point': + latlngs = leaflet.GeoJSON.coordsToLatLng(geojson.geometry.coordinates); + layer.setLatLng(latlngs); + break; + case 'LineString': + latlngs = leaflet.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 0, coordsToLatLng); + layer.setLatLngs(latlngs); + break; + case 'MultiLineString': + latlngs = leaflet.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1, coordsToLatLng); + layer.setLatLngs(latlngs); + break; + case 'Polygon': + latlngs = leaflet.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1, coordsToLatLng); + layer.setLatLngs(latlngs); + break; + case 'MultiPolygon': + latlngs = leaflet.GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 2, coordsToLatLng); + layer.setLatLngs(latlngs); + break; + } + }, + + /** + * Feature Management Methods + */ + + createLayers: function (features) { + for (var i = features.length - 1; i >= 0; i--) { + var geojson = features[i]; + + var layer = this._layers[geojson.id]; + var newLayer; + + if (this._visibleZoom() && layer && !this._map.hasLayer(layer)) { + this._map.addLayer(layer); + this.fire('addfeature', { + feature: layer.feature + }, true); + } + + // update geometry if necessary + if (layer && this.options.simplifyFactor > 0 && (layer.setLatLngs || layer.setLatLng)) { + this._updateLayer(layer, geojson); + } + + if (!layer) { + newLayer = this.createNewLayer(geojson); + newLayer.feature = geojson; + + // bubble events from individual layers to the feature layer + newLayer.addEventParent(this); + + if (this.options.onEachFeature) { + this.options.onEachFeature(newLayer.feature, newLayer); + } + + // cache the layer + this._layers[newLayer.feature.id] = newLayer; + + // style the layer + this.setFeatureStyle(newLayer.feature.id, this.options.style); + + this.fire('createfeature', { + feature: newLayer.feature + }, true); + + // add the layer if the current zoom level is inside the range defined for the layer, it is within the current time bounds or our layer is not time enabled + if (this._visibleZoom() && (!this.options.timeField || (this.options.timeField && this._featureWithinTimeRange(geojson)))) { + this._map.addLayer(newLayer); + } + } + } + }, + + addLayers: function (ids) { + for (var i = ids.length - 1; i >= 0; i--) { + var layer = this._layers[ids[i]]; + if (layer) { + this._map.addLayer(layer); + } + } + }, + + removeLayers: function (ids, permanent) { + for (var i = ids.length - 1; i >= 0; i--) { + var id = ids[i]; + var layer = this._layers[id]; + if (layer) { + this.fire('removefeature', { + feature: layer.feature, + permanent: permanent + }, true); + this._map.removeLayer(layer); + } + if (layer && permanent) { + delete this._layers[id]; + } + } + }, + + cellEnter: function (bounds, coords) { + if (this._visibleZoom() && !this._zooming && this._map) { + leaflet.Util.requestAnimFrame(leaflet.Util.bind(function () { + var cacheKey = this._cacheKey(coords); + var cellKey = this._cellCoordsToKey(coords); + var layers = this._cache[cacheKey]; + if (this._activeCells[cellKey] && layers) { + this.addLayers(layers); + } + }, this)); + } + }, + + cellLeave: function (bounds, coords) { + if (!this._zooming) { + leaflet.Util.requestAnimFrame(leaflet.Util.bind(function () { + if (this._map) { + var cacheKey = this._cacheKey(coords); + var cellKey = this._cellCoordsToKey(coords); + var layers = this._cache[cacheKey]; + var mapBounds = this._map.getBounds(); + if (!this._activeCells[cellKey] && layers) { + var removable = true; + + for (var i = 0; i < layers.length; i++) { + var layer = this._layers[layers[i]]; + if (layer && layer.getBounds && mapBounds.intersects(layer.getBounds())) { + removable = false; + } + } + + if (removable) { + this.removeLayers(layers, !this.options.cacheLayers); + } + + if (!this.options.cacheLayers && removable) { + delete this._cache[cacheKey]; + delete this._cells[cellKey]; + delete this._activeCells[cellKey]; + } + } + } + }, this)); + } + }, + + /** + * Styling Methods + */ + + resetStyle: function () { + this.options.style = this._originalStyle; + this.eachFeature(function (layer) { + this.resetFeatureStyle(layer.feature.id); + }, this); + return this; + }, + + setStyle: function (style) { + this.options.style = style; + this.eachFeature(function (layer) { + this.setFeatureStyle(layer.feature.id, style); + }, this); + return this; + }, + + resetFeatureStyle: function (id) { + var layer = this._layers[id]; + var style = this._originalStyle || leaflet.Path.prototype.options; + if (layer) { + leaflet.Util.extend(layer.options, layer.defaultOptions); + this.setFeatureStyle(id, style); + } + return this; + }, + + setFeatureStyle: function (id, style) { + var layer = this._layers[id]; + if (typeof style === 'function') { + style = style(layer.feature); + } + if (layer.setStyle) { + layer.setStyle(style); + } + return this; + }, + + /** + * Utility Methods + */ + + eachActiveFeature: function (fn, context) { + // figure out (roughly) which layers are in view + if (this._map) { + var activeBounds = this._map.getBounds(); + for (var i in this._layers) { + if (this._currentSnapshot.indexOf(this._layers[i].feature.id) !== -1) { + // a simple point in poly test for point geometries + if (typeof this._layers[i].getLatLng === 'function' && activeBounds.contains(this._layers[i].getLatLng())) { + fn.call(context, this._layers[i]); + } else if (typeof this._layers[i].getBounds === 'function' && activeBounds.intersects(this._layers[i].getBounds())) { + // intersecting bounds check for polyline and polygon geometries + fn.call(context, this._layers[i]); + } + } + } + } + return this; + }, + + eachFeature: function (fn, context) { + for (var i in this._layers) { + fn.call(context, this._layers[i]); + } + return this; + }, + + getFeature: function (id) { + return this._layers[id]; + }, + + bringToBack: function () { + this.eachFeature(function (layer) { + if (layer.bringToBack) { + layer.bringToBack(); + } + }); + }, + + bringToFront: function () { + this.eachFeature(function (layer) { + if (layer.bringToFront) { + layer.bringToFront(); + } + }); + }, + + redraw: function (id) { + if (id) { + this._redraw(id); + } + return this; + }, + + _redraw: function (id) { + var layer = this._layers[id]; + var geojson = layer.feature; + + // if this looks like a marker + if (layer && layer.setIcon && this.options.pointToLayer) { + // update custom symbology, if necessary + if (this.options.pointToLayer) { + var getIcon = this.options.pointToLayer(geojson, leaflet.latLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0])); + var updatedIcon = getIcon.options.icon; + layer.setIcon(updatedIcon); + } + } + + // looks like a vector marker (circleMarker) + if (layer && layer.setStyle && this.options.pointToLayer) { + var getStyle = this.options.pointToLayer(geojson, leaflet.latLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0])); + var updatedStyle = getStyle.options; + this.setFeatureStyle(geojson.id, updatedStyle); + } + + // looks like a path (polygon/polyline) + if (layer && layer.setStyle && this.options.style) { + this.resetStyle(geojson.id); + } + } +}); + +function featureLayer (options) { + return new FeatureLayer(options); +} + +// export version + +exports.VERSION = version; +exports.Support = Support; +exports.options = options; +exports.Util = EsriUtil; +exports.get = get; +exports.post = xmlHttpPost; +exports.request = request; +exports.Task = Task; +exports.task = task; +exports.Query = Query; +exports.query = query; +exports.Find = Find; +exports.find = find; +exports.Identify = Identify; +exports.identify = identify; +exports.IdentifyFeatures = IdentifyFeatures; +exports.identifyFeatures = identifyFeatures; +exports.IdentifyImage = IdentifyImage; +exports.identifyImage = identifyImage; +exports.Service = Service; +exports.service = service; +exports.MapService = MapService; +exports.mapService = mapService; +exports.ImageService = ImageService; +exports.imageService = imageService; +exports.FeatureLayerService = FeatureLayerService; +exports.featureLayerService = featureLayerService; +exports.BasemapLayer = BasemapLayer; +exports.basemapLayer = basemapLayer; +exports.TiledMapLayer = TiledMapLayer; +exports.tiledMapLayer = tiledMapLayer; +exports.RasterLayer = RasterLayer; +exports.ImageMapLayer = ImageMapLayer; +exports.imageMapLayer = imageMapLayer; +exports.DynamicMapLayer = DynamicMapLayer; +exports.dynamicMapLayer = dynamicMapLayer; +exports.FeatureManager = FeatureManager; +exports.FeatureLayer = FeatureLayer; +exports.featureLayer = featureLayer; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1sZWFmbGV0LWRlYnVnLmpzIiwic291cmNlcyI6WyIuLi9zcmMvU3VwcG9ydC5qcyIsIi4uL3NyYy9PcHRpb25zLmpzIiwiLi4vc3JjL1JlcXVlc3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQGVzcmkvYXJjZ2lzLXRvLWdlb2pzb24tdXRpbHMvaW5kZXguanMiLCIuLi9zcmMvVXRpbC5qcyIsIi4uL3NyYy9UYXNrcy9UYXNrLmpzIiwiLi4vc3JjL1Rhc2tzL1F1ZXJ5LmpzIiwiLi4vc3JjL1Rhc2tzL0ZpbmQuanMiLCIuLi9zcmMvVGFza3MvSWRlbnRpZnkuanMiLCIuLi9zcmMvVGFza3MvSWRlbnRpZnlGZWF0dXJlcy5qcyIsIi4uL3NyYy9UYXNrcy9JZGVudGlmeUltYWdlLmpzIiwiLi4vc3JjL1NlcnZpY2VzL1NlcnZpY2UuanMiLCIuLi9zcmMvU2VydmljZXMvTWFwU2VydmljZS5qcyIsIi4uL3NyYy9TZXJ2aWNlcy9JbWFnZVNlcnZpY2UuanMiLCIuLi9zcmMvU2VydmljZXMvRmVhdHVyZUxheWVyU2VydmljZS5qcyIsIi4uL3NyYy9MYXllcnMvQmFzZW1hcExheWVyLmpzIiwiLi4vc3JjL0xheWVycy9UaWxlZE1hcExheWVyLmpzIiwiLi4vc3JjL0xheWVycy9SYXN0ZXJMYXllci5qcyIsIi4uL3NyYy9MYXllcnMvSW1hZ2VNYXBMYXllci5qcyIsIi4uL3NyYy9MYXllcnMvRHluYW1pY01hcExheWVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xlYWZsZXQtdmlydHVhbC1ncmlkL3NyYy92aXJ0dWFsLWdyaWQuanMiLCIuLi9ub2RlX21vZHVsZXMvdGlueS1iaW5hcnktc2VhcmNoL2luZGV4LmpzIiwiLi4vc3JjL0xheWVycy9GZWF0dXJlTGF5ZXIvRmVhdHVyZU1hbmFnZXIuanMiLCIuLi9zcmMvTGF5ZXJzL0ZlYXR1cmVMYXllci9GZWF0dXJlTGF5ZXIuanMiLCIuLi9zcmMvRXNyaUxlYWZsZXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHZhciBjb3JzID0gKCh3aW5kb3cuWE1MSHR0cFJlcXVlc3QgJiYgJ3dpdGhDcmVkZW50aWFscycgaW4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpKSk7XG5leHBvcnQgdmFyIHBvaW50ZXJFdmVudHMgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9PT0gJyc7XG5cbmV4cG9ydCB2YXIgU3VwcG9ydCA9IHtcbiAgY29yczogY29ycyxcbiAgcG9pbnRlckV2ZW50czogcG9pbnRlckV2ZW50c1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU3VwcG9ydDtcbiIsImV4cG9ydCB2YXIgb3B0aW9ucyA9IHtcbiAgYXR0cmlidXRpb25XaWR0aE9mZnNldDogNTVcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG9wdGlvbnM7XG4iLCJpbXBvcnQgeyBVdGlsLCBEb21VdGlsIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgU3VwcG9ydCBmcm9tICcuL1N1cHBvcnQnO1xuaW1wb3J0IHsgd2FybiB9IGZyb20gJy4vVXRpbCc7XG5cbnZhciBjYWxsYmFja3MgPSAwO1xuXG5mdW5jdGlvbiBzZXJpYWxpemUgKHBhcmFtcykge1xuICB2YXIgZGF0YSA9ICcnO1xuXG4gIHBhcmFtcy5mID0gcGFyYW1zLmYgfHwgJ2pzb24nO1xuXG4gIGZvciAodmFyIGtleSBpbiBwYXJhbXMpIHtcbiAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1trZXldO1xuICAgICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocGFyYW0pO1xuICAgICAgdmFyIHZhbHVlO1xuXG4gICAgICBpZiAoZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgZGF0YSArPSAnJic7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgICAgIHZhbHVlID0gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwYXJhbVswXSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSA/IEpTT04uc3RyaW5naWZ5KHBhcmFtKSA6IHBhcmFtLmpvaW4oJywnKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeShwYXJhbSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgICAgICB2YWx1ZSA9IHBhcmFtLnZhbHVlT2YoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gcGFyYW07XG4gICAgICB9XG5cbiAgICAgIGRhdGEgKz0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSZXF1ZXN0IChjYWxsYmFjaywgY29udGV4dCkge1xuICB2YXIgaHR0cFJlcXVlc3QgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgaHR0cFJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgaHR0cFJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gVXRpbC5mYWxzZUZuO1xuXG4gICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiA1MDAsXG4gICAgICAgIG1lc3NhZ2U6ICdYTUxIdHRwUmVxdWVzdCBlcnJvcidcbiAgICAgIH1cbiAgICB9LCBudWxsKTtcbiAgfTtcblxuICBodHRwUmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3BvbnNlO1xuICAgIHZhciBlcnJvcjtcblxuICAgIGlmIChodHRwUmVxdWVzdC5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UoaHR0cFJlcXVlc3QucmVzcG9uc2VUZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVzcG9uc2UgPSBudWxsO1xuICAgICAgICBlcnJvciA9IHtcbiAgICAgICAgICBjb2RlOiA1MDAsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvdWxkIG5vdCBwYXJzZSByZXNwb25zZSBhcyBKU09OLiBUaGlzIGNvdWxkIGFsc28gYmUgY2F1c2VkIGJ5IGEgQ09SUyBvciBYTUxIdHRwUmVxdWVzdCBlcnJvci4nXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghZXJyb3IgJiYgcmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcbiAgICAgICAgcmVzcG9uc2UgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBodHRwUmVxdWVzdC5vbmVycm9yID0gVXRpbC5mYWxzZUZuO1xuXG4gICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSk7XG4gICAgfVxuICB9O1xuXG4gIGh0dHBSZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm9uZXJyb3IoKTtcbiAgfTtcblxuICByZXR1cm4gaHR0cFJlcXVlc3Q7XG59XG5cbmZ1bmN0aW9uIHhtbEh0dHBQb3N0ICh1cmwsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgdmFyIGh0dHBSZXF1ZXN0ID0gY3JlYXRlUmVxdWVzdChjYWxsYmFjaywgY29udGV4dCk7XG4gIGh0dHBSZXF1ZXN0Lm9wZW4oJ1BPU1QnLCB1cmwpO1xuXG4gIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGV4dCAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgY29udGV4dC5vcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaHR0cFJlcXVlc3QudGltZW91dCA9IGNvbnRleHQub3B0aW9ucy50aW1lb3V0O1xuICAgIH1cbiAgfVxuICBodHRwUmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04Jyk7XG4gIGh0dHBSZXF1ZXN0LnNlbmQoc2VyaWFsaXplKHBhcmFtcykpO1xuXG4gIHJldHVybiBodHRwUmVxdWVzdDtcbn1cblxuZnVuY3Rpb24geG1sSHR0cEdldCAodXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIHZhciBodHRwUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3QoY2FsbGJhY2ssIGNvbnRleHQpO1xuICBodHRwUmVxdWVzdC5vcGVuKCdHRVQnLCB1cmwgKyAnPycgKyBzZXJpYWxpemUocGFyYW1zKSwgdHJ1ZSk7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0ICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZXh0ICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0Lm9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBodHRwUmVxdWVzdC50aW1lb3V0ID0gY29udGV4dC5vcHRpb25zLnRpbWVvdXQ7XG4gICAgfVxuICB9XG4gIGh0dHBSZXF1ZXN0LnNlbmQobnVsbCk7XG5cbiAgcmV0dXJuIGh0dHBSZXF1ZXN0O1xufVxuXG4vLyBBSkFYIGhhbmRsZXJzIGZvciBDT1JTIChtb2Rlcm4gYnJvd3NlcnMpIG9yIEpTT05QIChvbGRlciBicm93c2VycylcbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0ICh1cmwsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgdmFyIHBhcmFtU3RyaW5nID0gc2VyaWFsaXplKHBhcmFtcyk7XG4gIHZhciBodHRwUmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3QoY2FsbGJhY2ssIGNvbnRleHQpO1xuICB2YXIgcmVxdWVzdExlbmd0aCA9ICh1cmwgKyAnPycgKyBwYXJhbVN0cmluZykubGVuZ3RoO1xuXG4gIC8vIGllMTAvMTEgcmVxdWlyZSB0aGUgcmVxdWVzdCBiZSBvcGVuZWQgYmVmb3JlIGEgdGltZW91dCBpcyBhcHBsaWVkXG4gIGlmIChyZXF1ZXN0TGVuZ3RoIDw9IDIwMDAgJiYgU3VwcG9ydC5jb3JzKSB7XG4gICAgaHR0cFJlcXVlc3Qub3BlbignR0VUJywgdXJsICsgJz8nICsgcGFyYW1TdHJpbmcpO1xuICB9IGVsc2UgaWYgKHJlcXVlc3RMZW5ndGggPiAyMDAwICYmIFN1cHBvcnQuY29ycykge1xuICAgIGh0dHBSZXF1ZXN0Lm9wZW4oJ1BPU1QnLCB1cmwpO1xuICAgIGh0dHBSZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGV4dCAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgY29udGV4dC5vcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaHR0cFJlcXVlc3QudGltZW91dCA9IGNvbnRleHQub3B0aW9ucy50aW1lb3V0O1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlcXVlc3QgaXMgbGVzcyB0aGFuIDIwMDAgY2hhcmFjdGVycyBhbmQgdGhlIGJyb3dzZXIgc3VwcG9ydHMgQ09SUywgbWFrZSBHRVQgcmVxdWVzdCB3aXRoIFhNTEh0dHBSZXF1ZXN0XG4gIGlmIChyZXF1ZXN0TGVuZ3RoIDw9IDIwMDAgJiYgU3VwcG9ydC5jb3JzKSB7XG4gICAgaHR0cFJlcXVlc3Quc2VuZChudWxsKTtcblxuICAvLyByZXF1ZXN0IGlzIG1vcmUgdGhhbiAyMDAwIGNoYXJhY3RlcnMgYW5kIHRoZSBicm93c2VyIHN1cHBvcnRzIENPUlMsIG1ha2UgUE9TVCByZXF1ZXN0IHdpdGggWE1MSHR0cFJlcXVlc3RcbiAgfSBlbHNlIGlmIChyZXF1ZXN0TGVuZ3RoID4gMjAwMCAmJiBTdXBwb3J0LmNvcnMpIHtcbiAgICBodHRwUmVxdWVzdC5zZW5kKHBhcmFtU3RyaW5nKTtcblxuICAvLyByZXF1ZXN0IGlzIGxlc3MgIHRoYW4gMjAwMCBjaGFyYWN0ZXJzIGFuZCB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IENPUlMsIG1ha2UgYSBKU09OUCByZXF1ZXN0XG4gIH0gZWxzZSBpZiAocmVxdWVzdExlbmd0aCA8PSAyMDAwICYmICFTdXBwb3J0LmNvcnMpIHtcbiAgICByZXR1cm4ganNvbnAodXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcblxuICAvLyByZXF1ZXN0IGlzIGxvbmdlciB0aGVuIDIwMDAgY2hhcmFjdGVycyBhbmQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBDT1JTLCBsb2cgYSB3YXJuaW5nXG4gIH0gZWxzZSB7XG4gICAgd2FybignYSByZXF1ZXN0IHRvICcgKyB1cmwgKyAnIHdhcyBsb25nZXIgdGhlbiAyMDAwIGNoYXJhY3RlcnMgYW5kIHRoaXMgYnJvd3NlciBjYW5ub3QgbWFrZSBhIGNyb3NzLWRvbWFpbiBwb3N0IHJlcXVlc3QuIFBsZWFzZSB1c2UgYSBwcm94eSBodHRwOi8vZXNyaS5naXRodWIuaW8vZXNyaS1sZWFmbGV0L2FwaS1yZWZlcmVuY2UvcmVxdWVzdC5odG1sJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGh0dHBSZXF1ZXN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganNvbnAgKHVybCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICB3aW5kb3cuX0VzcmlMZWFmbGV0Q2FsbGJhY2tzID0gd2luZG93Ll9Fc3JpTGVhZmxldENhbGxiYWNrcyB8fCB7fTtcbiAgdmFyIGNhbGxiYWNrSWQgPSAnYycgKyBjYWxsYmFja3M7XG4gIHBhcmFtcy5jYWxsYmFjayA9ICd3aW5kb3cuX0VzcmlMZWFmbGV0Q2FsbGJhY2tzLicgKyBjYWxsYmFja0lkO1xuXG4gIHdpbmRvdy5fRXNyaUxlYWZsZXRDYWxsYmFja3NbY2FsbGJhY2tJZF0gPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICBpZiAod2luZG93Ll9Fc3JpTGVhZmxldENhbGxiYWNrc1tjYWxsYmFja0lkXSAhPT0gdHJ1ZSkge1xuICAgICAgdmFyIGVycm9yO1xuICAgICAgdmFyIHJlc3BvbnNlVHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyZXNwb25zZSk7XG5cbiAgICAgIGlmICghKHJlc3BvbnNlVHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgfHwgcmVzcG9uc2VUeXBlID09PSAnW29iamVjdCBBcnJheV0nKSkge1xuICAgICAgICBlcnJvciA9IHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogNTAwLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0V4cGVjdGVkIGFycmF5IG9yIG9iamVjdCBhcyBKU09OUCByZXNwb25zZSdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlc3BvbnNlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlcnJvciAmJiByZXNwb25zZS5lcnJvcikge1xuICAgICAgICBlcnJvciA9IHJlc3BvbnNlO1xuICAgICAgICByZXNwb25zZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIHJlc3BvbnNlKTtcbiAgICAgIHdpbmRvdy5fRXNyaUxlYWZsZXRDYWxsYmFja3NbY2FsbGJhY2tJZF0gPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc2NyaXB0ID0gRG9tVXRpbC5jcmVhdGUoJ3NjcmlwdCcsIG51bGwsIGRvY3VtZW50LmJvZHkpO1xuICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xuICBzY3JpcHQuc3JjID0gdXJsICsgJz8nICsgc2VyaWFsaXplKHBhcmFtcyk7XG4gIHNjcmlwdC5pZCA9IGNhbGxiYWNrSWQ7XG4gIERvbVV0aWwuYWRkQ2xhc3Moc2NyaXB0LCAnZXNyaS1sZWFmbGV0LWpzb25wJyk7XG5cbiAgY2FsbGJhY2tzKys7XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogY2FsbGJhY2tJZCxcbiAgICB1cmw6IHNjcmlwdC5zcmMsXG4gICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdpbmRvdy5fRXNyaUxlYWZsZXRDYWxsYmFja3MuX2NhbGxiYWNrW2NhbGxiYWNrSWRdKHtcbiAgICAgICAgY29kZTogMCxcbiAgICAgICAgbWVzc2FnZTogJ1JlcXVlc3QgYWJvcnRlZC4nXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBnZXQgPSAoKFN1cHBvcnQuY29ycykgPyB4bWxIdHRwR2V0IDoganNvbnApO1xuZ2V0LkNPUlMgPSB4bWxIdHRwR2V0O1xuZ2V0LkpTT05QID0ganNvbnA7XG5cbi8vIGNob29zZSB0aGUgY29ycmVjdCBBSkFYIGhhbmRsZXIgZGVwZW5kaW5nIG9uIENPUlMgc3VwcG9ydFxuZXhwb3J0IHsgZ2V0IH07XG5cbi8vIGFsd2F5cyB1c2UgWE1MSHR0cFJlcXVlc3QgZm9yIHBvc3RzXG5leHBvcnQgeyB4bWxIdHRwUG9zdCBhcyBwb3N0IH07XG5cbi8vIGV4cG9ydCB0aGUgUmVxdWVzdCBvYmplY3QgdG8gY2FsbCB0aGUgZGlmZmVyZW50IGhhbmRsZXJzIGZvciBkZWJ1Z2dpbmdcbmV4cG9ydCB2YXIgUmVxdWVzdCA9IHtcbiAgcmVxdWVzdDogcmVxdWVzdCxcbiAgZ2V0OiBnZXQsXG4gIHBvc3Q6IHhtbEh0dHBQb3N0XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSZXF1ZXN0O1xuIiwiLypcbiAqIENvcHlyaWdodCAyMDE3IEVzcmlcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gY2hlY2tzIGlmIDIgeCx5IHBvaW50cyBhcmUgZXF1YWxcbmZ1bmN0aW9uIHBvaW50c0VxdWFsIChhLCBiKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBjaGVja3MgaWYgdGhlIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBvZiBhIHJpbmcgYXJlIGVxdWFsIGFuZCBjbG9zZXMgdGhlIHJpbmdcbmZ1bmN0aW9uIGNsb3NlUmluZyAoY29vcmRpbmF0ZXMpIHtcbiAgaWYgKCFwb2ludHNFcXVhbChjb29yZGluYXRlc1swXSwgY29vcmRpbmF0ZXNbY29vcmRpbmF0ZXMubGVuZ3RoIC0gMV0pKSB7XG4gICAgY29vcmRpbmF0ZXMucHVzaChjb29yZGluYXRlc1swXSk7XG4gIH1cbiAgcmV0dXJuIGNvb3JkaW5hdGVzO1xufVxuXG4vLyBkZXRlcm1pbmUgaWYgcG9seWdvbiByaW5nIGNvb3JkaW5hdGVzIGFyZSBjbG9ja3dpc2UuIGNsb2Nrd2lzZSBzaWduaWZpZXMgb3V0ZXIgcmluZywgY291bnRlci1jbG9ja3dpc2UgYW4gaW5uZXIgcmluZ1xuLy8gb3IgaG9sZS4gdGhpcyBsb2dpYyB3YXMgZm91bmQgYXQgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTY1NjQ3L2hvdy10by1kZXRlcm1pbmUtaWYtYS1saXN0LW9mLXBvbHlnb24tXG4vLyBwb2ludHMtYXJlLWluLWNsb2Nrd2lzZS1vcmRlclxuZnVuY3Rpb24gcmluZ0lzQ2xvY2t3aXNlIChyaW5nVG9UZXN0KSB7XG4gIHZhciB0b3RhbCA9IDA7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJMZW5ndGggPSByaW5nVG9UZXN0Lmxlbmd0aDtcbiAgdmFyIHB0MSA9IHJpbmdUb1Rlc3RbaV07XG4gIHZhciBwdDI7XG4gIGZvciAoaTsgaSA8IHJMZW5ndGggLSAxOyBpKyspIHtcbiAgICBwdDIgPSByaW5nVG9UZXN0W2kgKyAxXTtcbiAgICB0b3RhbCArPSAocHQyWzBdIC0gcHQxWzBdKSAqIChwdDJbMV0gKyBwdDFbMV0pO1xuICAgIHB0MSA9IHB0MjtcbiAgfVxuICByZXR1cm4gKHRvdGFsID49IDApO1xufVxuXG4vLyBwb3J0ZWQgZnJvbSB0ZXJyYWZvcm1lci5qcyBodHRwczovL2dpdGh1Yi5jb20vRXNyaS9UZXJyYWZvcm1lci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci5qcyNMNTA0LUw1MTlcbmZ1bmN0aW9uIHZlcnRleEludGVyc2VjdHNWZXJ0ZXggKGExLCBhMiwgYjEsIGIyKSB7XG4gIHZhciB1YVQgPSAoKGIyWzBdIC0gYjFbMF0pICogKGExWzFdIC0gYjFbMV0pKSAtICgoYjJbMV0gLSBiMVsxXSkgKiAoYTFbMF0gLSBiMVswXSkpO1xuICB2YXIgdWJUID0gKChhMlswXSAtIGExWzBdKSAqIChhMVsxXSAtIGIxWzFdKSkgLSAoKGEyWzFdIC0gYTFbMV0pICogKGExWzBdIC0gYjFbMF0pKTtcbiAgdmFyIHVCID0gKChiMlsxXSAtIGIxWzFdKSAqIChhMlswXSAtIGExWzBdKSkgLSAoKGIyWzBdIC0gYjFbMF0pICogKGEyWzFdIC0gYTFbMV0pKTtcblxuICBpZiAodUIgIT09IDApIHtcbiAgICB2YXIgdWEgPSB1YVQgLyB1QjtcbiAgICB2YXIgdWIgPSB1YlQgLyB1QjtcblxuICAgIGlmICh1YSA+PSAwICYmIHVhIDw9IDEgJiYgdWIgPj0gMCAmJiB1YiA8PSAxKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIHBvcnRlZCBmcm9tIHRlcnJhZm9ybWVyLmpzIGh0dHBzOi8vZ2l0aHViLmNvbS9Fc3JpL1RlcnJhZm9ybWVyL2Jsb2IvbWFzdGVyL3RlcnJhZm9ybWVyLmpzI0w1MjEtTDUzMVxuZnVuY3Rpb24gYXJyYXlJbnRlcnNlY3RzQXJyYXkgKGEsIGIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgYi5sZW5ndGggLSAxOyBqKyspIHtcbiAgICAgIGlmICh2ZXJ0ZXhJbnRlcnNlY3RzVmVydGV4KGFbaV0sIGFbaSArIDFdLCBiW2pdLCBiW2ogKyAxXSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBwb3J0ZWQgZnJvbSB0ZXJyYWZvcm1lci5qcyBodHRwczovL2dpdGh1Yi5jb20vRXNyaS9UZXJyYWZvcm1lci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci5qcyNMNDcwLUw0ODBcbmZ1bmN0aW9uIGNvb3JkaW5hdGVzQ29udGFpblBvaW50IChjb29yZGluYXRlcywgcG9pbnQpIHtcbiAgdmFyIGNvbnRhaW5zID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSAtMSwgbCA9IGNvb3JkaW5hdGVzLmxlbmd0aCwgaiA9IGwgLSAxOyArK2kgPCBsOyBqID0gaSkge1xuICAgIGlmICgoKGNvb3JkaW5hdGVzW2ldWzFdIDw9IHBvaW50WzFdICYmIHBvaW50WzFdIDwgY29vcmRpbmF0ZXNbal1bMV0pIHx8XG4gICAgICAgICAoY29vcmRpbmF0ZXNbal1bMV0gPD0gcG9pbnRbMV0gJiYgcG9pbnRbMV0gPCBjb29yZGluYXRlc1tpXVsxXSkpICYmXG4gICAgICAgIChwb2ludFswXSA8ICgoKGNvb3JkaW5hdGVzW2pdWzBdIC0gY29vcmRpbmF0ZXNbaV1bMF0pICogKHBvaW50WzFdIC0gY29vcmRpbmF0ZXNbaV1bMV0pKSAvIChjb29yZGluYXRlc1tqXVsxXSAtIGNvb3JkaW5hdGVzW2ldWzFdKSkgKyBjb29yZGluYXRlc1tpXVswXSkpIHtcbiAgICAgIGNvbnRhaW5zID0gIWNvbnRhaW5zO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29udGFpbnM7XG59XG5cbi8vIHBvcnRlZCBmcm9tIHRlcnJhZm9ybWVyLWFyY2dpcy1wYXJzZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvdGVycmFmb3JtZXItYXJjZ2lzLXBhcnNlci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci1hcmNnaXMtcGFyc2VyLmpzI0wxMDYtTDExM1xuZnVuY3Rpb24gY29vcmRpbmF0ZXNDb250YWluQ29vcmRpbmF0ZXMgKG91dGVyLCBpbm5lcikge1xuICB2YXIgaW50ZXJzZWN0cyA9IGFycmF5SW50ZXJzZWN0c0FycmF5KG91dGVyLCBpbm5lcik7XG4gIHZhciBjb250YWlucyA9IGNvb3JkaW5hdGVzQ29udGFpblBvaW50KG91dGVyLCBpbm5lclswXSk7XG4gIGlmICghaW50ZXJzZWN0cyAmJiBjb250YWlucykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gZG8gYW55IHBvbHlnb25zIGluIHRoaXMgYXJyYXkgY29udGFpbiBhbnkgb3RoZXIgcG9seWdvbnMgaW4gdGhpcyBhcnJheT9cbi8vIHVzZWQgZm9yIGNoZWNraW5nIGZvciBob2xlcyBpbiBhcmNnaXMgcmluZ3Ncbi8vIHBvcnRlZCBmcm9tIHRlcnJhZm9ybWVyLWFyY2dpcy1wYXJzZXIuanMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvdGVycmFmb3JtZXItYXJjZ2lzLXBhcnNlci9ibG9iL21hc3Rlci90ZXJyYWZvcm1lci1hcmNnaXMtcGFyc2VyLmpzI0wxMTctTDE3MlxuZnVuY3Rpb24gY29udmVydFJpbmdzVG9HZW9KU09OIChyaW5ncykge1xuICB2YXIgb3V0ZXJSaW5ncyA9IFtdO1xuICB2YXIgaG9sZXMgPSBbXTtcbiAgdmFyIHg7IC8vIGl0ZXJhdG9yXG4gIHZhciBvdXRlclJpbmc7IC8vIGN1cnJlbnQgb3V0ZXIgcmluZyBiZWluZyBldmFsdWF0ZWRcbiAgdmFyIGhvbGU7IC8vIGN1cnJlbnQgaG9sZSBiZWluZyBldmFsdWF0ZWRcblxuICAvLyBmb3IgZWFjaCByaW5nXG4gIGZvciAodmFyIHIgPSAwOyByIDwgcmluZ3MubGVuZ3RoOyByKyspIHtcbiAgICB2YXIgcmluZyA9IGNsb3NlUmluZyhyaW5nc1tyXS5zbGljZSgwKSk7XG4gICAgaWYgKHJpbmcubGVuZ3RoIDwgNCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIGlzIHRoaXMgcmluZyBhbiBvdXRlciByaW5nPyBpcyBpdCBjbG9ja3dpc2U/XG4gICAgaWYgKHJpbmdJc0Nsb2Nrd2lzZShyaW5nKSkge1xuICAgICAgdmFyIHBvbHlnb24gPSBbIHJpbmcuc2xpY2UoKS5yZXZlcnNlKCkgXTsgLy8gd2luZCBvdXRlciByaW5ncyBjb3VudGVyY2xvY2t3aXNlIGZvciBSRkMgNzk0NiBjb21wbGlhbmNlXG4gICAgICBvdXRlclJpbmdzLnB1c2gocG9seWdvbik7IC8vIHB1c2ggdG8gb3V0ZXIgcmluZ3NcbiAgICB9IGVsc2Uge1xuICAgICAgaG9sZXMucHVzaChyaW5nLnNsaWNlKCkucmV2ZXJzZSgpKTsgLy8gd2luZCBpbm5lciByaW5ncyBjbG9ja3dpc2UgZm9yIFJGQyA3OTQ2IGNvbXBsaWFuY2VcbiAgICB9XG4gIH1cblxuICB2YXIgdW5jb250YWluZWRIb2xlcyA9IFtdO1xuXG4gIC8vIHdoaWxlIHRoZXJlIGFyZSBob2xlcyBsZWZ0Li4uXG4gIHdoaWxlIChob2xlcy5sZW5ndGgpIHtcbiAgICAvLyBwb3AgYSBob2xlIG9mZiBvdXQgc3RhY2tcbiAgICBob2xlID0gaG9sZXMucG9wKCk7XG5cbiAgICAvLyBsb29wIG92ZXIgYWxsIG91dGVyIHJpbmdzIGFuZCBzZWUgaWYgdGhleSBjb250YWluIG91ciBob2xlLlxuICAgIHZhciBjb250YWluZWQgPSBmYWxzZTtcbiAgICBmb3IgKHggPSBvdXRlclJpbmdzLmxlbmd0aCAtIDE7IHggPj0gMDsgeC0tKSB7XG4gICAgICBvdXRlclJpbmcgPSBvdXRlclJpbmdzW3hdWzBdO1xuICAgICAgaWYgKGNvb3JkaW5hdGVzQ29udGFpbkNvb3JkaW5hdGVzKG91dGVyUmluZywgaG9sZSkpIHtcbiAgICAgICAgLy8gdGhlIGhvbGUgaXMgY29udGFpbmVkIHB1c2ggaXQgaW50byBvdXIgcG9seWdvblxuICAgICAgICBvdXRlclJpbmdzW3hdLnB1c2goaG9sZSk7XG4gICAgICAgIGNvbnRhaW5lZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJpbmcgaXMgbm90IGNvbnRhaW5lZCBpbiBhbnkgb3V0ZXIgcmluZ1xuICAgIC8vIHNvbWV0aW1lcyB0aGlzIGhhcHBlbnMgaHR0cHM6Ly9naXRodWIuY29tL0VzcmkvZXNyaS1sZWFmbGV0L2lzc3Vlcy8zMjBcbiAgICBpZiAoIWNvbnRhaW5lZCkge1xuICAgICAgdW5jb250YWluZWRIb2xlcy5wdXNoKGhvbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHdlIGNvdWxkbid0IG1hdGNoIGFueSBob2xlcyB1c2luZyBjb250YWlucyB3ZSBjYW4gdHJ5IGludGVyc2VjdHMuLi5cbiAgd2hpbGUgKHVuY29udGFpbmVkSG9sZXMubGVuZ3RoKSB7XG4gICAgLy8gcG9wIGEgaG9sZSBvZmYgb3V0IHN0YWNrXG4gICAgaG9sZSA9IHVuY29udGFpbmVkSG9sZXMucG9wKCk7XG5cbiAgICAvLyBsb29wIG92ZXIgYWxsIG91dGVyIHJpbmdzIGFuZCBzZWUgaWYgYW55IGludGVyc2VjdCBvdXIgaG9sZS5cbiAgICB2YXIgaW50ZXJzZWN0cyA9IGZhbHNlO1xuXG4gICAgZm9yICh4ID0gb3V0ZXJSaW5ncy5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkge1xuICAgICAgb3V0ZXJSaW5nID0gb3V0ZXJSaW5nc1t4XVswXTtcbiAgICAgIGlmIChhcnJheUludGVyc2VjdHNBcnJheShvdXRlclJpbmcsIGhvbGUpKSB7XG4gICAgICAgIC8vIHRoZSBob2xlIGlzIGNvbnRhaW5lZCBwdXNoIGl0IGludG8gb3VyIHBvbHlnb25cbiAgICAgICAgb3V0ZXJSaW5nc1t4XS5wdXNoKGhvbGUpO1xuICAgICAgICBpbnRlcnNlY3RzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbnRlcnNlY3RzKSB7XG4gICAgICBvdXRlclJpbmdzLnB1c2goW2hvbGUucmV2ZXJzZSgpXSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG91dGVyUmluZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgIGNvb3JkaW5hdGVzOiBvdXRlclJpbmdzWzBdXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ011bHRpUG9seWdvbicsXG4gICAgICBjb29yZGluYXRlczogb3V0ZXJSaW5nc1xuICAgIH07XG4gIH1cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgcmluZ3MgYXJlIG9yaWVudGVkIGluIHRoZSByaWdodCBkaXJlY3Rpb25zXG4vLyBvdXRlciByaW5ncyBhcmUgY2xvY2t3aXNlLCBob2xlcyBhcmUgY291bnRlcmNsb2Nrd2lzZVxuLy8gdXNlZCBmb3IgY29udmVydGluZyBHZW9KU09OIFBvbHlnb25zIHRvIEFyY0dJUyBQb2x5Z29uc1xuZnVuY3Rpb24gb3JpZW50UmluZ3MgKHBvbHkpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICB2YXIgcG9seWdvbiA9IHBvbHkuc2xpY2UoMCk7XG4gIHZhciBvdXRlclJpbmcgPSBjbG9zZVJpbmcocG9seWdvbi5zaGlmdCgpLnNsaWNlKDApKTtcbiAgaWYgKG91dGVyUmluZy5sZW5ndGggPj0gNCkge1xuICAgIGlmICghcmluZ0lzQ2xvY2t3aXNlKG91dGVyUmluZykpIHtcbiAgICAgIG91dGVyUmluZy5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgb3V0cHV0LnB1c2gob3V0ZXJSaW5nKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9seWdvbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhvbGUgPSBjbG9zZVJpbmcocG9seWdvbltpXS5zbGljZSgwKSk7XG4gICAgICBpZiAoaG9sZS5sZW5ndGggPj0gNCkge1xuICAgICAgICBpZiAocmluZ0lzQ2xvY2t3aXNlKGhvbGUpKSB7XG4gICAgICAgICAgaG9sZS5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0LnB1c2goaG9sZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBmbGF0dGVucyBob2xlcyBpbiBtdWx0aXBvbHlnb25zIHRvIG9uZSBhcnJheSBvZiBwb2x5Z29uc1xuLy8gdXNlZCBmb3IgY29udmVydGluZyBHZW9KU09OIFBvbHlnb25zIHRvIEFyY0dJUyBQb2x5Z29uc1xuZnVuY3Rpb24gZmxhdHRlbk11bHRpUG9seWdvblJpbmdzIChyaW5ncykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcG9seWdvbiA9IG9yaWVudFJpbmdzKHJpbmdzW2ldKTtcbiAgICBmb3IgKHZhciB4ID0gcG9seWdvbi5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkge1xuICAgICAgdmFyIHJpbmcgPSBwb2x5Z29uW3hdLnNsaWNlKDApO1xuICAgICAgb3V0cHV0LnB1c2gocmluZyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8vIHNoYWxsb3cgb2JqZWN0IGNsb25lIGZvciBmZWF0dXJlIHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXNcbi8vIGZyb20gaHR0cDovL2pzcGVyZi5jb20vY2xvbmluZy1hbi1vYmplY3QvMlxuZnVuY3Rpb24gc2hhbGxvd0Nsb25lIChvYmopIHtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgIHRhcmdldFtpXSA9IG9ialtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gZ2V0SWQgKGF0dHJpYnV0ZXMsIGlkQXR0cmlidXRlKSB7XG4gIHZhciBrZXlzID0gaWRBdHRyaWJ1dGUgPyBbaWRBdHRyaWJ1dGUsICdPQkpFQ1RJRCcsICdGSUQnXSA6IFsnT0JKRUNUSUQnLCAnRklEJ107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmIChcbiAgICAgIGtleSBpbiBhdHRyaWJ1dGVzICYmXG4gICAgICAodHlwZW9mIGF0dHJpYnV0ZXNba2V5XSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgdHlwZW9mIGF0dHJpYnV0ZXNba2V5XSA9PT0gJ251bWJlcicpXG4gICAgKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlc1trZXldO1xuICAgIH1cbiAgfVxuICB0aHJvdyBFcnJvcignTm8gdmFsaWQgaWQgYXR0cmlidXRlIGZvdW5kJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmNnaXNUb0dlb0pTT04gKGFyY2dpcywgaWRBdHRyaWJ1dGUpIHtcbiAgdmFyIGdlb2pzb24gPSB7fTtcblxuICBpZiAodHlwZW9mIGFyY2dpcy54ID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYXJjZ2lzLnkgPT09ICdudW1iZXInKSB7XG4gICAgZ2VvanNvbi50eXBlID0gJ1BvaW50JztcbiAgICBnZW9qc29uLmNvb3JkaW5hdGVzID0gW2FyY2dpcy54LCBhcmNnaXMueV07XG4gICAgaWYgKHR5cGVvZiBhcmNnaXMueiA9PT0gJ251bWJlcicpIHtcbiAgICAgIGdlb2pzb24uY29vcmRpbmF0ZXMucHVzaChhcmNnaXMueik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGFyY2dpcy5wb2ludHMpIHtcbiAgICBnZW9qc29uLnR5cGUgPSAnTXVsdGlQb2ludCc7XG4gICAgZ2VvanNvbi5jb29yZGluYXRlcyA9IGFyY2dpcy5wb2ludHMuc2xpY2UoMCk7XG4gIH1cblxuICBpZiAoYXJjZ2lzLnBhdGhzKSB7XG4gICAgaWYgKGFyY2dpcy5wYXRocy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGdlb2pzb24udHlwZSA9ICdMaW5lU3RyaW5nJztcbiAgICAgIGdlb2pzb24uY29vcmRpbmF0ZXMgPSBhcmNnaXMucGF0aHNbMF0uc2xpY2UoMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlb2pzb24udHlwZSA9ICdNdWx0aUxpbmVTdHJpbmcnO1xuICAgICAgZ2VvanNvbi5jb29yZGluYXRlcyA9IGFyY2dpcy5wYXRocy5zbGljZSgwKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYXJjZ2lzLnJpbmdzKSB7XG4gICAgZ2VvanNvbiA9IGNvbnZlcnRSaW5nc1RvR2VvSlNPTihhcmNnaXMucmluZ3Muc2xpY2UoMCkpO1xuICB9XG5cbiAgaWYgKGFyY2dpcy5nZW9tZXRyeSB8fCBhcmNnaXMuYXR0cmlidXRlcykge1xuICAgIGdlb2pzb24udHlwZSA9ICdGZWF0dXJlJztcbiAgICBnZW9qc29uLmdlb21ldHJ5ID0gKGFyY2dpcy5nZW9tZXRyeSkgPyBhcmNnaXNUb0dlb0pTT04oYXJjZ2lzLmdlb21ldHJ5KSA6IG51bGw7XG4gICAgZ2VvanNvbi5wcm9wZXJ0aWVzID0gKGFyY2dpcy5hdHRyaWJ1dGVzKSA/IHNoYWxsb3dDbG9uZShhcmNnaXMuYXR0cmlidXRlcykgOiBudWxsO1xuICAgIGlmIChhcmNnaXMuYXR0cmlidXRlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZ2VvanNvbi5pZCA9IGdldElkKGFyY2dpcy5hdHRyaWJ1dGVzLCBpZEF0dHJpYnV0ZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gZG9uJ3Qgc2V0IGFuIGlkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgbm8gdmFsaWQgZ2VvbWV0cnkgd2FzIGVuY291bnRlcmVkXG4gIGlmIChKU09OLnN0cmluZ2lmeShnZW9qc29uLmdlb21ldHJ5KSA9PT0gSlNPTi5zdHJpbmdpZnkoe30pKSB7XG4gICAgZ2VvanNvbi5nZW9tZXRyeSA9IG51bGw7XG4gIH1cblxuICBpZiAoXG4gICAgYXJjZ2lzLnNwYXRpYWxSZWZlcmVuY2UgJiZcbiAgICBhcmNnaXMuc3BhdGlhbFJlZmVyZW5jZS53a2lkICYmXG4gICAgYXJjZ2lzLnNwYXRpYWxSZWZlcmVuY2Uud2tpZCAhPT0gNDMyNlxuICApIHtcbiAgICBjb25zb2xlLndhcm4oJ09iamVjdCBjb252ZXJ0ZWQgaW4gbm9uLXN0YW5kYXJkIGNycyAtICcgKyBKU09OLnN0cmluZ2lmeShhcmNnaXMuc3BhdGlhbFJlZmVyZW5jZSkpO1xuICB9XG5cbiAgcmV0dXJuIGdlb2pzb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9qc29uVG9BcmNHSVMgKGdlb2pzb24sIGlkQXR0cmlidXRlKSB7XG4gIGlkQXR0cmlidXRlID0gaWRBdHRyaWJ1dGUgfHwgJ09CSkVDVElEJztcbiAgdmFyIHNwYXRpYWxSZWZlcmVuY2UgPSB7IHdraWQ6IDQzMjYgfTtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgaTtcblxuICBzd2l0Y2ggKGdlb2pzb24udHlwZSkge1xuICAgIGNhc2UgJ1BvaW50JzpcbiAgICAgIHJlc3VsdC54ID0gZ2VvanNvbi5jb29yZGluYXRlc1swXTtcbiAgICAgIHJlc3VsdC55ID0gZ2VvanNvbi5jb29yZGluYXRlc1sxXTtcbiAgICAgIHJlc3VsdC5zcGF0aWFsUmVmZXJlbmNlID0gc3BhdGlhbFJlZmVyZW5jZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ011bHRpUG9pbnQnOlxuICAgICAgcmVzdWx0LnBvaW50cyA9IGdlb2pzb24uY29vcmRpbmF0ZXMuc2xpY2UoMCk7XG4gICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdMaW5lU3RyaW5nJzpcbiAgICAgIHJlc3VsdC5wYXRocyA9IFtnZW9qc29uLmNvb3JkaW5hdGVzLnNsaWNlKDApXTtcbiAgICAgIHJlc3VsdC5zcGF0aWFsUmVmZXJlbmNlID0gc3BhdGlhbFJlZmVyZW5jZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ011bHRpTGluZVN0cmluZyc6XG4gICAgICByZXN1bHQucGF0aHMgPSBnZW9qc29uLmNvb3JkaW5hdGVzLnNsaWNlKDApO1xuICAgICAgcmVzdWx0LnNwYXRpYWxSZWZlcmVuY2UgPSBzcGF0aWFsUmVmZXJlbmNlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnUG9seWdvbic6XG4gICAgICByZXN1bHQucmluZ3MgPSBvcmllbnRSaW5ncyhnZW9qc29uLmNvb3JkaW5hdGVzLnNsaWNlKDApKTtcbiAgICAgIHJlc3VsdC5zcGF0aWFsUmVmZXJlbmNlID0gc3BhdGlhbFJlZmVyZW5jZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ011bHRpUG9seWdvbic6XG4gICAgICByZXN1bHQucmluZ3MgPSBmbGF0dGVuTXVsdGlQb2x5Z29uUmluZ3MoZ2VvanNvbi5jb29yZGluYXRlcy5zbGljZSgwKSk7XG4gICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdGZWF0dXJlJzpcbiAgICAgIGlmIChnZW9qc29uLmdlb21ldHJ5KSB7XG4gICAgICAgIHJlc3VsdC5nZW9tZXRyeSA9IGdlb2pzb25Ub0FyY0dJUyhnZW9qc29uLmdlb21ldHJ5LCBpZEF0dHJpYnV0ZSk7XG4gICAgICB9XG4gICAgICByZXN1bHQuYXR0cmlidXRlcyA9IChnZW9qc29uLnByb3BlcnRpZXMpID8gc2hhbGxvd0Nsb25lKGdlb2pzb24ucHJvcGVydGllcykgOiB7fTtcbiAgICAgIGlmIChnZW9qc29uLmlkKSB7XG4gICAgICAgIHJlc3VsdC5hdHRyaWJ1dGVzW2lkQXR0cmlidXRlXSA9IGdlb2pzb24uaWQ7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdGZWF0dXJlQ29sbGVjdGlvbic6XG4gICAgICByZXN1bHQgPSBbXTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9qc29uLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGdlb2pzb25Ub0FyY0dJUyhnZW9qc29uLmZlYXR1cmVzW2ldLCBpZEF0dHJpYnV0ZSkpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnR2VvbWV0cnlDb2xsZWN0aW9uJzpcbiAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGdlb2pzb24uZ2VvbWV0cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQucHVzaChnZW9qc29uVG9BcmNHSVMoZ2VvanNvbi5nZW9tZXRyaWVzW2ldLCBpZEF0dHJpYnV0ZSkpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCB7IGFyY2dpc1RvR2VvSlNPTjogYXJjZ2lzVG9HZW9KU09OLCBnZW9qc29uVG9BcmNHSVM6IGdlb2pzb25Ub0FyY0dJUyB9O1xuIiwiaW1wb3J0IHsgbGF0TG5nLCBsYXRMbmdCb3VuZHMsIExhdExuZywgTGF0TG5nQm91bmRzLCBVdGlsLCBEb21VdGlsLCBHZW9KU09OIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBqc29ucCB9IGZyb20gJy4vUmVxdWVzdCc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9PcHRpb25zJztcblxuaW1wb3J0IHtcbiAgZ2VvanNvblRvQXJjR0lTIGFzIGcyYSxcbiAgYXJjZ2lzVG9HZW9KU09OIGFzIGEyZ1xufSBmcm9tICdAZXNyaS9hcmNnaXMtdG8tZ2VvanNvbi11dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW9qc29uVG9BcmNHSVMgKGdlb2pzb24sIGlkQXR0cikge1xuICByZXR1cm4gZzJhKGdlb2pzb24sIGlkQXR0cik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmNnaXNUb0dlb0pTT04gKGFyY2dpcywgaWRBdHRyKSB7XG4gIHJldHVybiBhMmcoYXJjZ2lzLCBpZEF0dHIpO1xufVxuXG4vLyBjb252ZXJ0IGFuIGV4dGVudCAoQXJjR0lTKSB0byBMYXRMbmdCb3VuZHMgKExlYWZsZXQpXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW50VG9Cb3VuZHMgKGV4dGVudCkge1xuICAvLyBcIk5hTlwiIGNvb3JkaW5hdGVzIGZyb20gQXJjR0lTIFNlcnZlciBpbmRpY2F0ZSBhIG51bGwgZ2VvbWV0cnlcbiAgaWYgKGV4dGVudC54bWluICE9PSAnTmFOJyAmJiBleHRlbnQueW1pbiAhPT0gJ05hTicgJiYgZXh0ZW50LnhtYXggIT09ICdOYU4nICYmIGV4dGVudC55bWF4ICE9PSAnTmFOJykge1xuICAgIHZhciBzdyA9IGxhdExuZyhleHRlbnQueW1pbiwgZXh0ZW50LnhtaW4pO1xuICAgIHZhciBuZSA9IGxhdExuZyhleHRlbnQueW1heCwgZXh0ZW50LnhtYXgpO1xuICAgIHJldHVybiBsYXRMbmdCb3VuZHMoc3csIG5lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBjb252ZXJ0IGFuIExhdExuZ0JvdW5kcyAoTGVhZmxldCkgdG8gZXh0ZW50IChBcmNHSVMpXG5leHBvcnQgZnVuY3Rpb24gYm91bmRzVG9FeHRlbnQgKGJvdW5kcykge1xuICBib3VuZHMgPSBsYXRMbmdCb3VuZHMoYm91bmRzKTtcbiAgcmV0dXJuIHtcbiAgICAneG1pbic6IGJvdW5kcy5nZXRTb3V0aFdlc3QoKS5sbmcsXG4gICAgJ3ltaW4nOiBib3VuZHMuZ2V0U291dGhXZXN0KCkubGF0LFxuICAgICd4bWF4JzogYm91bmRzLmdldE5vcnRoRWFzdCgpLmxuZyxcbiAgICAneW1heCc6IGJvdW5kcy5nZXROb3J0aEVhc3QoKS5sYXQsXG4gICAgJ3NwYXRpYWxSZWZlcmVuY2UnOiB7XG4gICAgICAnd2tpZCc6IDQzMjZcbiAgICB9XG4gIH07XG59XG5cbnZhciBrbm93bkZpZWxkTmFtZXMgPSAvXihPQkpFQ1RJRHxGSUR8T0lEfElEKSQvaTtcblxuLy8gQXR0ZW1wdHMgdG8gZmluZCB0aGUgSUQgRmllbGQgZnJvbSByZXNwb25zZVxuZXhwb3J0IGZ1bmN0aW9uIF9maW5kSWRBdHRyaWJ1dGVGcm9tUmVzcG9uc2UgKHJlc3BvbnNlKSB7XG4gIHZhciByZXN1bHQ7XG5cbiAgaWYgKHJlc3BvbnNlLm9iamVjdElkRmllbGROYW1lKSB7XG4gICAgLy8gRmluZCBJZCBGaWVsZCBkaXJlY3RseVxuICAgIHJlc3VsdCA9IHJlc3BvbnNlLm9iamVjdElkRmllbGROYW1lO1xuICB9IGVsc2UgaWYgKHJlc3BvbnNlLmZpZWxkcykge1xuICAgIC8vIEZpbmQgSUQgRmllbGQgYmFzZWQgb24gZmllbGQgdHlwZVxuICAgIGZvciAodmFyIGogPSAwOyBqIDw9IHJlc3BvbnNlLmZpZWxkcy5sZW5ndGggLSAxOyBqKyspIHtcbiAgICAgIGlmIChyZXNwb25zZS5maWVsZHNbal0udHlwZSA9PT0gJ2VzcmlGaWVsZFR5cGVPSUQnKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlLmZpZWxkc1tqXS5uYW1lO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIC8vIElmIG5vIGZpZWxkIHdhcyBtYXJrZWQgYXMgYmVpbmcgdGhlIGVzcmlGaWVsZFR5cGVPSUQgdHJ5IHdlbGwga25vd24gZmllbGQgbmFtZXNcbiAgICAgIGZvciAoaiA9IDA7IGogPD0gcmVzcG9uc2UuZmllbGRzLmxlbmd0aCAtIDE7IGorKykge1xuICAgICAgICBpZiAocmVzcG9uc2UuZmllbGRzW2pdLm5hbWUubWF0Y2goa25vd25GaWVsZE5hbWVzKSkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlLmZpZWxkc1tqXS5uYW1lO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIFRoaXMgaXMgdGhlICdsYXN0JyByZXNvcnQsIGZpbmQgdGhlIElkIGZpZWxkIGZyb20gdGhlIHNwZWNpZmllZCBmZWF0dXJlXG5leHBvcnQgZnVuY3Rpb24gX2ZpbmRJZEF0dHJpYnV0ZUZyb21GZWF0dXJlIChmZWF0dXJlKSB7XG4gIGZvciAodmFyIGtleSBpbiBmZWF0dXJlLmF0dHJpYnV0ZXMpIHtcbiAgICBpZiAoa2V5Lm1hdGNoKGtub3duRmllbGROYW1lcykpIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24gKHJlc3BvbnNlLCBpZEF0dHJpYnV0ZSkge1xuICB2YXIgb2JqZWN0SWRGaWVsZDtcbiAgdmFyIGZlYXR1cmVzID0gcmVzcG9uc2UuZmVhdHVyZXMgfHwgcmVzcG9uc2UucmVzdWx0cztcbiAgdmFyIGNvdW50ID0gZmVhdHVyZXMubGVuZ3RoO1xuXG4gIGlmIChpZEF0dHJpYnV0ZSkge1xuICAgIG9iamVjdElkRmllbGQgPSBpZEF0dHJpYnV0ZTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RJZEZpZWxkID0gX2ZpbmRJZEF0dHJpYnV0ZUZyb21SZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICB2YXIgZmVhdHVyZUNvbGxlY3Rpb24gPSB7XG4gICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICBmZWF0dXJlczogW11cbiAgfTtcblxuICBpZiAoY291bnQpIHtcbiAgICBmb3IgKHZhciBpID0gZmVhdHVyZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmZWF0dXJlID0gYXJjZ2lzVG9HZW9KU09OKGZlYXR1cmVzW2ldLCBvYmplY3RJZEZpZWxkIHx8IF9maW5kSWRBdHRyaWJ1dGVGcm9tRmVhdHVyZShmZWF0dXJlc1tpXSkpO1xuICAgICAgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMucHVzaChmZWF0dXJlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmVhdHVyZUNvbGxlY3Rpb247XG59XG5cbiAgLy8gdHJpbSB1cmwgd2hpdGVzcGFjZSBhbmQgYWRkIGEgdHJhaWxpbmcgc2xhc2ggaWYgbmVlZGVkXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcmwgKHVybCkge1xuICAvLyB0cmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcywgYnV0IG5vdCBzcGFjZXMgaW5zaWRlIHRoZSB1cmxcbiAgdXJsID0gVXRpbC50cmltKHVybCk7XG5cbiAgLy8gYWRkIGEgdHJhaWxpbmcgc2xhc2ggdG8gdGhlIHVybCBpZiB0aGUgdXNlciBvbWl0dGVkIGl0XG4gIGlmICh1cmxbdXJsLmxlbmd0aCAtIDFdICE9PSAnLycpIHtcbiAgICB1cmwgKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn1cblxuLyogRXh0cmFjdCB1cmwgcGFyYW1zIGlmIGFueSBhbmQgc3RvcmUgdGhlbSBpbiByZXF1ZXN0UGFyYW1zIGF0dHJpYnV0ZS5cbiAgIFJldHVybiB0aGUgb3B0aW9ucyBwYXJhbXMgdXBkYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVybFBhcmFtcyAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucy51cmwuaW5kZXhPZignPycpICE9PSAtMSkge1xuICAgIG9wdGlvbnMucmVxdWVzdFBhcmFtcyA9IG9wdGlvbnMucmVxdWVzdFBhcmFtcyB8fCB7fTtcbiAgICB2YXIgcXVlcnlTdHJpbmcgPSBvcHRpb25zLnVybC5zdWJzdHJpbmcob3B0aW9ucy51cmwuaW5kZXhPZignPycpICsgMSk7XG4gICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybC5zcGxpdCgnPycpWzBdO1xuICAgIG9wdGlvbnMucmVxdWVzdFBhcmFtcyA9IEpTT04ucGFyc2UoJ3tcIicgKyBkZWNvZGVVUkkocXVlcnlTdHJpbmcpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC8mL2csICdcIixcIicpLnJlcGxhY2UoLz0vZywgJ1wiOlwiJykgKyAnXCJ9Jyk7XG4gIH1cbiAgb3B0aW9ucy51cmwgPSBjbGVhblVybChvcHRpb25zLnVybC5zcGxpdCgnPycpWzBdKTtcbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FyY2dpc09ubGluZSAodXJsKSB7XG4gIC8qIGhvc3RlZCBmZWF0dXJlIHNlcnZpY2VzIHN1cHBvcnQgZ2VvanNvbiBhcyBhbiBvdXRwdXQgZm9ybWF0XG4gIHV0aWxpdHkuYXJjZ2lzLmNvbSBzZXJ2aWNlcyBhcmUgcHJveGllZCBmcm9tIGEgdmFyaWV0eSBvZiBBcmNHSVMgU2VydmVyIHZpbnRhZ2VzLCBhbmQgbWF5IG5vdCAqL1xuICByZXR1cm4gKC9eKD8hLip1dGlsaXR5XFwuYXJjZ2lzXFwuY29tKS4qXFwuYXJjZ2lzXFwuY29tLipGZWF0dXJlU2VydmVyL2kpLnRlc3QodXJsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlb2pzb25UeXBlVG9BcmNHSVMgKGdlb0pzb25UeXBlKSB7XG4gIHZhciBhcmNnaXNHZW9tZXRyeVR5cGU7XG4gIHN3aXRjaCAoZ2VvSnNvblR5cGUpIHtcbiAgICBjYXNlICdQb2ludCc6XG4gICAgICBhcmNnaXNHZW9tZXRyeVR5cGUgPSAnZXNyaUdlb21ldHJ5UG9pbnQnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnTXVsdGlQb2ludCc6XG4gICAgICBhcmNnaXNHZW9tZXRyeVR5cGUgPSAnZXNyaUdlb21ldHJ5TXVsdGlwb2ludCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdMaW5lU3RyaW5nJzpcbiAgICAgIGFyY2dpc0dlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlQb2x5bGluZSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdNdWx0aUxpbmVTdHJpbmcnOlxuICAgICAgYXJjZ2lzR2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvbHlsaW5lJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1BvbHlnb24nOlxuICAgICAgYXJjZ2lzR2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvbHlnb24nO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnTXVsdGlQb2x5Z29uJzpcbiAgICAgIGFyY2dpc0dlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlQb2x5Z29uJztcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGFyY2dpc0dlb21ldHJ5VHlwZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm4gKCkge1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIHtcbiAgICBjb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY0F0dHJpYnV0aW9uV2lkdGggKG1hcCkge1xuICAvLyBlaXRoZXIgY3JvcCBhdCA1NXB4IG9yIHVzZXIgZGVmaW5lZCBidWZmZXJcbiAgcmV0dXJuIChtYXAuZ2V0U2l6ZSgpLnggLSBvcHRpb25zLmF0dHJpYnV0aW9uV2lkdGhPZmZzZXQpICsgJ3B4Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEVzcmlBdHRyaWJ1dGlvbiAobWFwKSB7XG4gIGlmIChtYXAuYXR0cmlidXRpb25Db250cm9sICYmICFtYXAuYXR0cmlidXRpb25Db250cm9sLl9lc3JpQXR0cmlidXRpb25BZGRlZCkge1xuICAgIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuc2V0UHJlZml4KCc8YSBocmVmPVwiaHR0cDovL2xlYWZsZXRqcy5jb21cIiB0aXRsZT1cIkEgSlMgbGlicmFyeSBmb3IgaW50ZXJhY3RpdmUgbWFwc1wiPkxlYWZsZXQ8L2E+IHwgUG93ZXJlZCBieSA8YSBocmVmPVwiaHR0cHM6Ly93d3cuZXNyaS5jb21cIj5Fc3JpPC9hPicpO1xuXG4gICAgdmFyIGhvdmVyQXR0cmlidXRpb25TdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgaG92ZXJBdHRyaWJ1dGlvblN0eWxlLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgIGhvdmVyQXR0cmlidXRpb25TdHlsZS5pbm5lckhUTUwgPSAnLmVzcmktdHJ1bmNhdGVkLWF0dHJpYnV0aW9uOmhvdmVyIHsnICtcbiAgICAgICd3aGl0ZS1zcGFjZTogbm9ybWFsOycgK1xuICAgICd9JztcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoaG92ZXJBdHRyaWJ1dGlvblN0eWxlKTtcbiAgICBEb21VdGlsLmFkZENsYXNzKG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuX2NvbnRhaW5lciwgJ2VzcmktdHJ1bmNhdGVkLWF0dHJpYnV0aW9uOmhvdmVyJyk7XG5cbiAgICAvLyBkZWZpbmUgYSBuZXcgY3NzIGNsYXNzIGluIEpTIHRvIHRyaW0gYXR0cmlidXRpb24gaW50byBhIHNpbmdsZSBsaW5lXG4gICAgdmFyIGF0dHJpYnV0aW9uU3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIGF0dHJpYnV0aW9uU3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgYXR0cmlidXRpb25TdHlsZS5pbm5lckhUTUwgPSAnLmVzcmktdHJ1bmNhdGVkLWF0dHJpYnV0aW9uIHsnICtcbiAgICAgICd2ZXJ0aWNhbC1hbGlnbjogLTNweDsnICtcbiAgICAgICd3aGl0ZS1zcGFjZTogbm93cmFwOycgK1xuICAgICAgJ292ZXJmbG93OiBoaWRkZW47JyArXG4gICAgICAndGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7JyArXG4gICAgICAnZGlzcGxheTogaW5saW5lLWJsb2NrOycgK1xuICAgICAgJ3RyYW5zaXRpb246IDBzIHdoaXRlLXNwYWNlOycgK1xuICAgICAgJ3RyYW5zaXRpb24tZGVsYXk6IDFzOycgK1xuICAgICAgJ21heC13aWR0aDogJyArIGNhbGNBdHRyaWJ1dGlvbldpZHRoKG1hcCkgKyAnOycgK1xuICAgICd9JztcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoYXR0cmlidXRpb25TdHlsZSk7XG4gICAgRG9tVXRpbC5hZGRDbGFzcyhtYXAuYXR0cmlidXRpb25Db250cm9sLl9jb250YWluZXIsICdlc3JpLXRydW5jYXRlZC1hdHRyaWJ1dGlvbicpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSB3aWR0aCB1c2VkIHRvIHRydW5jYXRlIHdoZW4gdGhlIG1hcCBpdHNlbGYgaXMgcmVzaXplZFxuICAgIG1hcC5vbigncmVzaXplJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIG1hcC5hdHRyaWJ1dGlvbkNvbnRyb2wuX2NvbnRhaW5lci5zdHlsZS5tYXhXaWR0aCA9IGNhbGNBdHRyaWJ1dGlvbldpZHRoKGUudGFyZ2V0KTtcbiAgICB9KTtcblxuICAgIC8vIHJlbW92ZSBpbmplY3RlZCBzY3JpcHRzIGFuZCBzdHlsZSB0YWdzXG4gICAgbWFwLm9uKCd1bmxvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBob3ZlckF0dHJpYnV0aW9uU3R5bGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChob3ZlckF0dHJpYnV0aW9uU3R5bGUpO1xuICAgICAgYXR0cmlidXRpb25TdHlsZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGF0dHJpYnV0aW9uU3R5bGUpO1xuICAgICAgdmFyIG5vZGVMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmVzcmktbGVhZmxldC1qc29ucCcpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBub2RlTGlzdC5pdGVtKGkpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZUxpc3QuaXRlbShpKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBtYXAuYXR0cmlidXRpb25Db250cm9sLl9lc3JpQXR0cmlidXRpb25BZGRlZCA9IHRydWU7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9zZXRHZW9tZXRyeSAoZ2VvbWV0cnkpIHtcbiAgdmFyIHBhcmFtcyA9IHtcbiAgICBnZW9tZXRyeTogbnVsbCxcbiAgICBnZW9tZXRyeVR5cGU6IG51bGxcbiAgfTtcblxuICAvLyBjb252ZXJ0IGJvdW5kcyB0byBleHRlbnQgYW5kIGZpbmlzaFxuICBpZiAoZ2VvbWV0cnkgaW5zdGFuY2VvZiBMYXRMbmdCb3VuZHMpIHtcbiAgICAvLyBzZXQgZ2VvbWV0cnkgKyBnZW9tZXRyeVR5cGVcbiAgICBwYXJhbXMuZ2VvbWV0cnkgPSBib3VuZHNUb0V4dGVudChnZW9tZXRyeSk7XG4gICAgcGFyYW1zLmdlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlFbnZlbG9wZSc7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8vIGNvbnZlcnQgTC5NYXJrZXIgPiBMLkxhdExuZ1xuICBpZiAoZ2VvbWV0cnkuZ2V0TGF0TG5nKSB7XG4gICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZXRMYXRMbmcoKTtcbiAgfVxuXG4gIC8vIGNvbnZlcnQgTC5MYXRMbmcgdG8gYSBnZW9qc29uIHBvaW50IGFuZCBjb250aW51ZTtcbiAgaWYgKGdlb21ldHJ5IGluc3RhbmNlb2YgTGF0TG5nKSB7XG4gICAgZ2VvbWV0cnkgPSB7XG4gICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgY29vcmRpbmF0ZXM6IFtnZW9tZXRyeS5sbmcsIGdlb21ldHJ5LmxhdF1cbiAgICB9O1xuICB9XG5cbiAgLy8gaGFuZGxlIEwuR2VvSlNPTiwgcHVsbCBvdXQgdGhlIGZpcnN0IGdlb21ldHJ5XG4gIGlmIChnZW9tZXRyeSBpbnN0YW5jZW9mIEdlb0pTT04pIHtcbiAgICAvLyByZWFzc2lnbiBnZW9tZXRyeSB0byB0aGUgR2VvSlNPTiB2YWx1ZSAgKHdlIGFyZSBhc3N1bWluZyB0aGF0IG9ubHkgb25lIGZlYXR1cmUgaXMgcHJlc2VudClcbiAgICBnZW9tZXRyeSA9IGdlb21ldHJ5LmdldExheWVycygpWzBdLmZlYXR1cmUuZ2VvbWV0cnk7XG4gICAgcGFyYW1zLmdlb21ldHJ5ID0gZ2VvanNvblRvQXJjR0lTKGdlb21ldHJ5KTtcbiAgICBwYXJhbXMuZ2VvbWV0cnlUeXBlID0gZ2VvanNvblR5cGVUb0FyY0dJUyhnZW9tZXRyeS50eXBlKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBMLlBvbHlsaW5lIGFuZCBMLlBvbHlnb25cbiAgaWYgKGdlb21ldHJ5LnRvR2VvSlNPTikge1xuICAgIGdlb21ldHJ5ID0gZ2VvbWV0cnkudG9HZW9KU09OKCk7XG4gIH1cblxuICAvLyBoYW5kbGUgR2VvSlNPTiBmZWF0dXJlIGJ5IHB1bGxpbmcgb3V0IHRoZSBnZW9tZXRyeVxuICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgLy8gZ2V0IHRoZSBnZW9tZXRyeSBvZiB0aGUgZ2VvanNvbiBmZWF0dXJlXG4gICAgZ2VvbWV0cnkgPSBnZW9tZXRyeS5nZW9tZXRyeTtcbiAgfVxuXG4gIC8vIGNvbmZpcm0gdGhhdCBvdXIgR2VvSlNPTiBpcyBhIHBvaW50LCBsaW5lIG9yIHBvbHlnb25cbiAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcgfHwgZ2VvbWV0cnkudHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJyB8fCBnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgIHBhcmFtcy5nZW9tZXRyeSA9IGdlb2pzb25Ub0FyY0dJUyhnZW9tZXRyeSk7XG4gICAgcGFyYW1zLmdlb21ldHJ5VHlwZSA9IGdlb2pzb25UeXBlVG9BcmNHSVMoZ2VvbWV0cnkudHlwZSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8vIHdhcm4gdGhlIHVzZXIgaWYgd2UgaGF2bid0IGZvdW5kIGFuIGFwcHJvcHJpYXRlIG9iamVjdFxuICB3YXJuKCdpbnZhbGlkIGdlb21ldHJ5IHBhc3NlZCB0byBzcGF0aWFsIHF1ZXJ5LiBTaG91bGQgYmUgTC5MYXRMbmcsIEwuTGF0TG5nQm91bmRzLCBMLk1hcmtlciBvciBhIEdlb0pTT04gUG9pbnQsIExpbmUsIFBvbHlnb24gb3IgTXVsdGlQb2x5Z29uIG9iamVjdCcpO1xuXG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRBdHRyaWJ1dGlvbkRhdGEgKHVybCwgbWFwKSB7XG4gIGpzb25wKHVybCwge30sIFV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIGF0dHJpYnV0aW9ucykge1xuICAgIGlmIChlcnJvcikgeyByZXR1cm47IH1cbiAgICBtYXAuX2VzcmlBdHRyaWJ1dGlvbnMgPSBbXTtcbiAgICBmb3IgKHZhciBjID0gMDsgYyA8IGF0dHJpYnV0aW9ucy5jb250cmlidXRvcnMubGVuZ3RoOyBjKyspIHtcbiAgICAgIHZhciBjb250cmlidXRvciA9IGF0dHJpYnV0aW9ucy5jb250cmlidXRvcnNbY107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udHJpYnV0b3IuY292ZXJhZ2VBcmVhcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY292ZXJhZ2VBcmVhID0gY29udHJpYnV0b3IuY292ZXJhZ2VBcmVhc1tpXTtcbiAgICAgICAgdmFyIHNvdXRoV2VzdCA9IGxhdExuZyhjb3ZlcmFnZUFyZWEuYmJveFswXSwgY292ZXJhZ2VBcmVhLmJib3hbMV0pO1xuICAgICAgICB2YXIgbm9ydGhFYXN0ID0gbGF0TG5nKGNvdmVyYWdlQXJlYS5iYm94WzJdLCBjb3ZlcmFnZUFyZWEuYmJveFszXSk7XG4gICAgICAgIG1hcC5fZXNyaUF0dHJpYnV0aW9ucy5wdXNoKHtcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogY29udHJpYnV0b3IuYXR0cmlidXRpb24sXG4gICAgICAgICAgc2NvcmU6IGNvdmVyYWdlQXJlYS5zY29yZSxcbiAgICAgICAgICBib3VuZHM6IGxhdExuZ0JvdW5kcyhzb3V0aFdlc3QsIG5vcnRoRWFzdCksXG4gICAgICAgICAgbWluWm9vbTogY292ZXJhZ2VBcmVhLnpvb21NaW4sXG4gICAgICAgICAgbWF4Wm9vbTogY292ZXJhZ2VBcmVhLnpvb21NYXhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWFwLl9lc3JpQXR0cmlidXRpb25zLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBiLnNjb3JlIC0gYS5zY29yZTtcbiAgICB9KTtcblxuICAgIC8vIHBhc3MgdGhlIHNhbWUgYXJndW1lbnQgYXMgdGhlIG1hcCdzICdtb3ZlZW5kJyBldmVudFxuICAgIHZhciBvYmogPSB7IHRhcmdldDogbWFwIH07XG4gICAgX3VwZGF0ZU1hcEF0dHJpYnV0aW9uKG9iaik7XG4gIH0sIHRoaXMpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF91cGRhdGVNYXBBdHRyaWJ1dGlvbiAoZXZ0KSB7XG4gIHZhciBtYXAgPSBldnQudGFyZ2V0O1xuICB2YXIgb2xkQXR0cmlidXRpb25zID0gbWFwLl9lc3JpQXR0cmlidXRpb25zO1xuXG4gIGlmIChtYXAgJiYgbWFwLmF0dHJpYnV0aW9uQ29udHJvbCAmJiBvbGRBdHRyaWJ1dGlvbnMpIHtcbiAgICB2YXIgbmV3QXR0cmlidXRpb25zID0gJyc7XG4gICAgdmFyIGJvdW5kcyA9IG1hcC5nZXRCb3VuZHMoKTtcbiAgICB2YXIgd3JhcHBlZEJvdW5kcyA9IGxhdExuZ0JvdW5kcyhcbiAgICAgIGJvdW5kcy5nZXRTb3V0aFdlc3QoKS53cmFwKCksXG4gICAgICBib3VuZHMuZ2V0Tm9ydGhFYXN0KCkud3JhcCgpXG4gICAgKTtcbiAgICB2YXIgem9vbSA9IG1hcC5nZXRab29tKCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9sZEF0dHJpYnV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGF0dHJpYnV0aW9uID0gb2xkQXR0cmlidXRpb25zW2ldO1xuICAgICAgdmFyIHRleHQgPSBhdHRyaWJ1dGlvbi5hdHRyaWJ1dGlvbjtcblxuICAgICAgaWYgKCFuZXdBdHRyaWJ1dGlvbnMubWF0Y2godGV4dCkgJiYgYXR0cmlidXRpb24uYm91bmRzLmludGVyc2VjdHMod3JhcHBlZEJvdW5kcykgJiYgem9vbSA+PSBhdHRyaWJ1dGlvbi5taW5ab29tICYmIHpvb20gPD0gYXR0cmlidXRpb24ubWF4Wm9vbSkge1xuICAgICAgICBuZXdBdHRyaWJ1dGlvbnMgKz0gKCcsICcgKyB0ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBuZXdBdHRyaWJ1dGlvbnMgPSBuZXdBdHRyaWJ1dGlvbnMuc3Vic3RyKDIpO1xuICAgIHZhciBhdHRyaWJ1dGlvbkVsZW1lbnQgPSBtYXAuYXR0cmlidXRpb25Db250cm9sLl9jb250YWluZXIucXVlcnlTZWxlY3RvcignLmVzcmktZHluYW1pYy1hdHRyaWJ1dGlvbicpO1xuXG4gICAgYXR0cmlidXRpb25FbGVtZW50LmlubmVySFRNTCA9IG5ld0F0dHJpYnV0aW9ucztcbiAgICBhdHRyaWJ1dGlvbkVsZW1lbnQuc3R5bGUubWF4V2lkdGggPSBjYWxjQXR0cmlidXRpb25XaWR0aChtYXApO1xuXG4gICAgbWFwLmZpcmUoJ2F0dHJpYnV0aW9udXBkYXRlZCcsIHtcbiAgICAgIGF0dHJpYnV0aW9uOiBuZXdBdHRyaWJ1dGlvbnNcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIEVzcmlVdGlsID0ge1xuICB3YXJuOiB3YXJuLFxuICBjbGVhblVybDogY2xlYW5VcmwsXG4gIGdldFVybFBhcmFtczogZ2V0VXJsUGFyYW1zLFxuICBpc0FyY2dpc09ubGluZTogaXNBcmNnaXNPbmxpbmUsXG4gIGdlb2pzb25UeXBlVG9BcmNHSVM6IGdlb2pzb25UeXBlVG9BcmNHSVMsXG4gIHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbjogcmVzcG9uc2VUb0ZlYXR1cmVDb2xsZWN0aW9uLFxuICBnZW9qc29uVG9BcmNHSVM6IGdlb2pzb25Ub0FyY0dJUyxcbiAgYXJjZ2lzVG9HZW9KU09OOiBhcmNnaXNUb0dlb0pTT04sXG4gIGJvdW5kc1RvRXh0ZW50OiBib3VuZHNUb0V4dGVudCxcbiAgZXh0ZW50VG9Cb3VuZHM6IGV4dGVudFRvQm91bmRzLFxuICBjYWxjQXR0cmlidXRpb25XaWR0aDogY2FsY0F0dHJpYnV0aW9uV2lkdGgsXG4gIHNldEVzcmlBdHRyaWJ1dGlvbjogc2V0RXNyaUF0dHJpYnV0aW9uLFxuICBfc2V0R2VvbWV0cnk6IF9zZXRHZW9tZXRyeSxcbiAgX2dldEF0dHJpYnV0aW9uRGF0YTogX2dldEF0dHJpYnV0aW9uRGF0YSxcbiAgX3VwZGF0ZU1hcEF0dHJpYnV0aW9uOiBfdXBkYXRlTWFwQXR0cmlidXRpb24sXG4gIF9maW5kSWRBdHRyaWJ1dGVGcm9tRmVhdHVyZTogX2ZpbmRJZEF0dHJpYnV0ZUZyb21GZWF0dXJlLFxuICBfZmluZElkQXR0cmlidXRlRnJvbVJlc3BvbnNlOiBfZmluZElkQXR0cmlidXRlRnJvbVJlc3BvbnNlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBFc3JpVXRpbDtcbiIsImltcG9ydCB7IENsYXNzLCBVdGlsIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQge2NvcnN9IGZyb20gJy4uL1N1cHBvcnQnO1xuaW1wb3J0IHsgY2xlYW5VcmwsIGdldFVybFBhcmFtcyB9IGZyb20gJy4uL1V0aWwnO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi4vUmVxdWVzdCc7XG5cbmV4cG9ydCB2YXIgVGFzayA9IENsYXNzLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIHByb3h5OiBmYWxzZSxcbiAgICB1c2VDb3JzOiBjb3JzXG4gIH0sXG5cbiAgLy8gR2VuZXJhdGUgYSBtZXRob2QgZm9yIGVhY2ggbWV0aG9kTmFtZTpwYXJhbU5hbWUgaW4gdGhlIHNldHRlcnMgZm9yIHRoaXMgdGFzay5cbiAgZ2VuZXJhdGVTZXR0ZXI6IGZ1bmN0aW9uIChwYXJhbSwgY29udGV4dCkge1xuICAgIHJldHVybiBVdGlsLmJpbmQoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB0aGlzLnBhcmFtc1twYXJhbV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChlbmRwb2ludCkge1xuICAgIC8vIGVuZHBvaW50IGNhbiBiZSBlaXRoZXIgYSB1cmwgKGFuZCBvcHRpb25zKSBmb3IgYW4gQXJjR0lTIFJlc3QgU2VydmljZSBvciBhbiBpbnN0YW5jZSBvZiBFc3JpTGVhZmxldC5TZXJ2aWNlXG4gICAgaWYgKGVuZHBvaW50LnJlcXVlc3QgJiYgZW5kcG9pbnQub3B0aW9ucykge1xuICAgICAgdGhpcy5fc2VydmljZSA9IGVuZHBvaW50O1xuICAgICAgVXRpbC5zZXRPcHRpb25zKHRoaXMsIGVuZHBvaW50Lm9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBVdGlsLnNldE9wdGlvbnModGhpcywgZW5kcG9pbnQpO1xuICAgICAgdGhpcy5vcHRpb25zLnVybCA9IGNsZWFuVXJsKGVuZHBvaW50LnVybCk7XG4gICAgfVxuXG4gICAgLy8gY2xvbmUgZGVmYXVsdCBwYXJhbXMgaW50byB0aGlzIG9iamVjdFxuICAgIHRoaXMucGFyYW1zID0gVXRpbC5leHRlbmQoe30sIHRoaXMucGFyYW1zIHx8IHt9KTtcblxuICAgIC8vIGdlbmVyYXRlIHNldHRlciBtZXRob2RzIGJhc2VkIG9uIHRoZSBzZXR0ZXJzIG9iamVjdCBpbXBsaW1lbnRlZCBhIGNoaWxkIGNsYXNzXG4gICAgaWYgKHRoaXMuc2V0dGVycykge1xuICAgICAgZm9yICh2YXIgc2V0dGVyIGluIHRoaXMuc2V0dGVycykge1xuICAgICAgICB2YXIgcGFyYW0gPSB0aGlzLnNldHRlcnNbc2V0dGVyXTtcbiAgICAgICAgdGhpc1tzZXR0ZXJdID0gdGhpcy5nZW5lcmF0ZVNldHRlcihwYXJhbSwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHRva2VuOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodGhpcy5fc2VydmljZSkge1xuICAgICAgdGhpcy5fc2VydmljZS5hdXRoZW50aWNhdGUodG9rZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcmFtcy50b2tlbiA9IHRva2VuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBBcmNHSVMgU2VydmVyIEZpbmQvSWRlbnRpZnkgMTAuNStcbiAgZm9ybWF0OiBmdW5jdGlvbiAoYm9vbGVhbikge1xuICAgIC8vIHVzZSBkb3VibGUgbmVnYXRpdmUgdG8gZXhwb3NlIGEgbW9yZSBpbnR1aXRpdmUgcG9zaXRpdmUgbWV0aG9kIG5hbWVcbiAgICB0aGlzLnBhcmFtcy5yZXR1cm5VbmZvcm1hdHRlZFZhbHVlcyA9ICFib29sZWFuO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJlcXVlc3Q6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMucmVxdWVzdFBhcmFtcykge1xuICAgICAgVXRpbC5leHRlbmQodGhpcy5wYXJhbXMsIHRoaXMub3B0aW9ucy5yZXF1ZXN0UGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NlcnZpY2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlLnJlcXVlc3QodGhpcy5wYXRoLCB0aGlzLnBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdyZXF1ZXN0JywgdGhpcy5wYXRoLCB0aGlzLnBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICB9LFxuXG4gIF9yZXF1ZXN0OiBmdW5jdGlvbiAobWV0aG9kLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdmFyIHVybCA9ICh0aGlzLm9wdGlvbnMucHJveHkpID8gdGhpcy5vcHRpb25zLnByb3h5ICsgJz8nICsgdGhpcy5vcHRpb25zLnVybCArIHBhdGggOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aDtcblxuICAgIGlmICgobWV0aG9kID09PSAnZ2V0JyB8fCBtZXRob2QgPT09ICdyZXF1ZXN0JykgJiYgIXRoaXMub3B0aW9ucy51c2VDb3JzKSB7XG4gICAgICByZXR1cm4gUmVxdWVzdC5nZXQuSlNPTlAodXJsLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gUmVxdWVzdFttZXRob2RdKHVybCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gdGFzayAob3B0aW9ucykge1xuICBvcHRpb25zID0gZ2V0VXJsUGFyYW1zKG9wdGlvbnMpO1xuICByZXR1cm4gbmV3IFRhc2sob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRhc2s7XG4iLCJpbXBvcnQgeyBwb2ludCwgbGF0TG5nIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi9UYXNrJztcbmltcG9ydCB7XG4gIHdhcm4sXG4gIHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbixcbiAgaXNBcmNnaXNPbmxpbmUsXG4gIGV4dGVudFRvQm91bmRzLFxuICBfc2V0R2VvbWV0cnlcbn0gZnJvbSAnLi4vVXRpbCc7XG5cbmV4cG9ydCB2YXIgUXVlcnkgPSBUYXNrLmV4dGVuZCh7XG4gIHNldHRlcnM6IHtcbiAgICAnb2Zmc2V0JzogJ3Jlc3VsdE9mZnNldCcsXG4gICAgJ2xpbWl0JzogJ3Jlc3VsdFJlY29yZENvdW50JyxcbiAgICAnZmllbGRzJzogJ291dEZpZWxkcycsXG4gICAgJ3ByZWNpc2lvbic6ICdnZW9tZXRyeVByZWNpc2lvbicsXG4gICAgJ2ZlYXR1cmVJZHMnOiAnb2JqZWN0SWRzJyxcbiAgICAncmV0dXJuR2VvbWV0cnknOiAncmV0dXJuR2VvbWV0cnknLFxuICAgICdyZXR1cm5NJzogJ3JldHVybk0nLFxuICAgICd0cmFuc2Zvcm0nOiAnZGF0dW1UcmFuc2Zvcm1hdGlvbicsXG4gICAgJ3Rva2VuJzogJ3Rva2VuJ1xuICB9LFxuXG4gIHBhdGg6ICdxdWVyeScsXG5cbiAgcGFyYW1zOiB7XG4gICAgcmV0dXJuR2VvbWV0cnk6IHRydWUsXG4gICAgd2hlcmU6ICcxPTEnLFxuICAgIG91dFNyOiA0MzI2LFxuICAgIG91dEZpZWxkczogJyonXG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIGZlYXR1cmUgaWYgaXRzIHNoYXBlIGlzIHdob2xseSBjb250YWluZWQgd2l0aGluIHRoZSBzZWFyY2ggZ2VvbWV0cnkuIFZhbGlkIGZvciBhbGwgc2hhcGUgdHlwZSBjb21iaW5hdGlvbnMuXG4gIHdpdGhpbjogZnVuY3Rpb24gKGdlb21ldHJ5KSB7XG4gICAgdGhpcy5fc2V0R2VvbWV0cnlQYXJhbXMoZ2VvbWV0cnkpO1xuICAgIHRoaXMucGFyYW1zLnNwYXRpYWxSZWwgPSAnZXNyaVNwYXRpYWxSZWxDb250YWlucyc7IC8vIHRvIHRoZSBSRVNUIGFwaSB0aGlzIHJlYWRzIGdlb21ldHJ5ICoqY29udGFpbnMqKiBsYXllclxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIGFueSBzcGF0aWFsIHJlbGF0aW9uc2hpcCBpcyBmb3VuZC4gQXBwbGllcyB0byBhbGwgc2hhcGUgdHlwZSBjb21iaW5hdGlvbnMuXG4gIGludGVyc2VjdHM6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIHRoaXMuX3NldEdlb21ldHJ5UGFyYW1zKGdlb21ldHJ5KTtcbiAgICB0aGlzLnBhcmFtcy5zcGF0aWFsUmVsID0gJ2VzcmlTcGF0aWFsUmVsSW50ZXJzZWN0cyc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIGZlYXR1cmUgaWYgaXRzIHNoYXBlIHdob2xseSBjb250YWlucyB0aGUgc2VhcmNoIGdlb21ldHJ5LiBWYWxpZCBmb3IgYWxsIHNoYXBlIHR5cGUgY29tYmluYXRpb25zLlxuICBjb250YWluczogZnVuY3Rpb24gKGdlb21ldHJ5KSB7XG4gICAgdGhpcy5fc2V0R2VvbWV0cnlQYXJhbXMoZ2VvbWV0cnkpO1xuICAgIHRoaXMucGFyYW1zLnNwYXRpYWxSZWwgPSAnZXNyaVNwYXRpYWxSZWxXaXRoaW4nOyAvLyB0byB0aGUgUkVTVCBhcGkgdGhpcyByZWFkcyBnZW9tZXRyeSAqKndpdGhpbioqIGxheWVyXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLy8gUmV0dXJucyBhIGZlYXR1cmUgaWYgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgaW50ZXJpb3JzIG9mIHRoZSB0d28gc2hhcGVzIGlzIG5vdCBlbXB0eSBhbmQgaGFzIGEgbG93ZXIgZGltZW5zaW9uIHRoYW4gdGhlIG1heGltdW0gZGltZW5zaW9uIG9mIHRoZSB0d28gc2hhcGVzLiBUd28gbGluZXMgdGhhdCBzaGFyZSBhbiBlbmRwb2ludCBpbiBjb21tb24gZG8gbm90IGNyb3NzLiBWYWxpZCBmb3IgTGluZS9MaW5lLCBMaW5lL0FyZWEsIE11bHRpLXBvaW50L0FyZWEsIGFuZCBNdWx0aS1wb2ludC9MaW5lIHNoYXBlIHR5cGUgY29tYmluYXRpb25zLlxuICBjcm9zc2VzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeVBhcmFtcyhnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbENyb3NzZXMnO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIHRoZSB0d28gc2hhcGVzIHNoYXJlIGEgY29tbW9uIGJvdW5kYXJ5LiBIb3dldmVyLCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBpbnRlcmlvcnMgb2YgdGhlIHR3byBzaGFwZXMgbXVzdCBiZSBlbXB0eS4gSW4gdGhlIFBvaW50L0xpbmUgY2FzZSwgdGhlIHBvaW50IG1heSB0b3VjaCBhbiBlbmRwb2ludCBvbmx5IG9mIHRoZSBsaW5lLiBBcHBsaWVzIHRvIGFsbCBjb21iaW5hdGlvbnMgZXhjZXB0IFBvaW50L1BvaW50LlxuICB0b3VjaGVzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeVBhcmFtcyhnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbFRvdWNoZXMnO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBzaGFwZXMgcmVzdWx0cyBpbiBhbiBvYmplY3Qgb2YgdGhlIHNhbWUgZGltZW5zaW9uLCBidXQgZGlmZmVyZW50IGZyb20gYm90aCBvZiB0aGUgc2hhcGVzLiBBcHBsaWVzIHRvIEFyZWEvQXJlYSwgTGluZS9MaW5lLCBhbmQgTXVsdGktcG9pbnQvTXVsdGktcG9pbnQgc2hhcGUgdHlwZSBjb21iaW5hdGlvbnMuXG4gIG92ZXJsYXBzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeVBhcmFtcyhnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbE92ZXJsYXBzJztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBSZXR1cm5zIGEgZmVhdHVyZSBpZiB0aGUgZW52ZWxvcGUgb2YgdGhlIHR3byBzaGFwZXMgaW50ZXJzZWN0cy5cbiAgYmJveEludGVyc2VjdHM6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIHRoaXMuX3NldEdlb21ldHJ5UGFyYW1zKGdlb21ldHJ5KTtcbiAgICB0aGlzLnBhcmFtcy5zcGF0aWFsUmVsID0gJ2VzcmlTcGF0aWFsUmVsRW52ZWxvcGVJbnRlcnNlY3RzJztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBpZiBzb21lb25lIGNhbiBoZWxwIGRlY2lwaGVyIHRoZSBBcmNPYmplY3RzIGV4cGxhbmF0aW9uIGFuZCB0cmFuc2xhdGUgdG8gcGxhaW4gc3BlYWssIHdlIHNob3VsZCBtZW50aW9uIHRoaXMgbWV0aG9kIGluIHRoZSBkb2NcbiAgaW5kZXhJbnRlcnNlY3RzOiBmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICB0aGlzLl9zZXRHZW9tZXRyeVBhcmFtcyhnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuc3BhdGlhbFJlbCA9ICdlc3JpU3BhdGlhbFJlbEluZGV4SW50ZXJzZWN0cyc7IC8vIFJldHVybnMgYSBmZWF0dXJlIGlmIHRoZSBlbnZlbG9wZSBvZiB0aGUgcXVlcnkgZ2VvbWV0cnkgaW50ZXJzZWN0cyB0aGUgaW5kZXggZW50cnkgZm9yIHRoZSB0YXJnZXQgZ2VvbWV0cnlcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBvbmx5IHZhbGlkIGZvciBGZWF0dXJlIFNlcnZpY2VzIHJ1bm5pbmcgb24gQXJjR0lTIFNlcnZlciAxMC4zKyBvciBBcmNHSVMgT25saW5lXG4gIG5lYXJieTogZnVuY3Rpb24gKGxhdGxuZywgcmFkaXVzKSB7XG4gICAgbGF0bG5nID0gbGF0TG5nKGxhdGxuZyk7XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBbbGF0bG5nLmxuZywgbGF0bG5nLmxhdF07XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gJ2VzcmlHZW9tZXRyeVBvaW50JztcbiAgICB0aGlzLnBhcmFtcy5zcGF0aWFsUmVsID0gJ2VzcmlTcGF0aWFsUmVsSW50ZXJzZWN0cyc7XG4gICAgdGhpcy5wYXJhbXMudW5pdHMgPSAnZXNyaVNSVW5pdF9NZXRlcic7XG4gICAgdGhpcy5wYXJhbXMuZGlzdGFuY2UgPSByYWRpdXM7XG4gICAgdGhpcy5wYXJhbXMuaW5TciA9IDQzMjY7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgd2hlcmU6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAvLyBpbnN0ZWFkIG9mIGNvbnZlcnRpbmcgZG91YmxlLXF1b3RlcyB0byBzaW5nbGUgcXVvdGVzLCBwYXNzIGFzIGlzLCBhbmQgcHJvdmlkZSBhIG1vcmUgaW5mb3JtYXRpdmUgbWVzc2FnZSBpZiBhIDQwMCBpcyBlbmNvdW50ZXJlZFxuICAgIHRoaXMucGFyYW1zLndoZXJlID0gc3RyaW5nO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGJldHdlZW46IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgdGhpcy5wYXJhbXMudGltZSA9IFtzdGFydC52YWx1ZU9mKCksIGVuZC52YWx1ZU9mKCldO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNpbXBsaWZ5OiBmdW5jdGlvbiAobWFwLCBmYWN0b3IpIHtcbiAgICB2YXIgbWFwV2lkdGggPSBNYXRoLmFicyhtYXAuZ2V0Qm91bmRzKCkuZ2V0V2VzdCgpIC0gbWFwLmdldEJvdW5kcygpLmdldEVhc3QoKSk7XG4gICAgdGhpcy5wYXJhbXMubWF4QWxsb3dhYmxlT2Zmc2V0ID0gKG1hcFdpZHRoIC8gbWFwLmdldFNpemUoKS55KSAqIGZhY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBvcmRlckJ5OiBmdW5jdGlvbiAoZmllbGROYW1lLCBvcmRlcikge1xuICAgIG9yZGVyID0gb3JkZXIgfHwgJ0FTQyc7XG4gICAgdGhpcy5wYXJhbXMub3JkZXJCeUZpZWxkcyA9ICh0aGlzLnBhcmFtcy5vcmRlckJ5RmllbGRzKSA/IHRoaXMucGFyYW1zLm9yZGVyQnlGaWVsZHMgKyAnLCcgOiAnJztcbiAgICB0aGlzLnBhcmFtcy5vcmRlckJ5RmllbGRzICs9IChbZmllbGROYW1lLCBvcmRlcl0pLmpvaW4oJyAnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBydW46IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NsZWFuUGFyYW1zKCk7XG5cbiAgICAvLyBzZXJ2aWNlcyBob3N0ZWQgb24gQXJjR0lTIE9ubGluZSBhbmQgQXJjR0lTIFNlcnZlciAxMC4zLjErIHN1cHBvcnQgcmVxdWVzdGluZyBnZW9qc29uIGRpcmVjdGx5XG4gICAgaWYgKHRoaXMub3B0aW9ucy5pc01vZGVybiB8fCBpc0FyY2dpc09ubGluZSh0aGlzLm9wdGlvbnMudXJsKSkge1xuICAgICAgdGhpcy5wYXJhbXMuZiA9ICdnZW9qc29uJztcblxuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuX3RyYXBTUUxlcnJvcnMoZXJyb3IpO1xuICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCByZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgICAgfSwgdGhpcyk7XG5cbiAgICAvLyBvdGhlcndpc2UgY29udmVydCBpdCBpbiB0aGUgY2FsbGJhY2sgdGhlbiBwYXNzIGl0IG9uXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICB0aGlzLl90cmFwU1FMZXJyb3JzKGVycm9yKTtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgKHJlc3BvbnNlICYmIHJlc3BvbnNlVG9GZWF0dXJlQ29sbGVjdGlvbihyZXNwb25zZSkpLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH0sXG5cbiAgY291bnQ6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NsZWFuUGFyYW1zKCk7XG4gICAgdGhpcy5wYXJhbXMucmV0dXJuQ291bnRPbmx5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgZXJyb3IsIChyZXNwb25zZSAmJiByZXNwb25zZS5jb3VudCksIHJlc3BvbnNlKTtcbiAgICB9LCBjb250ZXh0KTtcbiAgfSxcblxuICBpZHM6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NsZWFuUGFyYW1zKCk7XG4gICAgdGhpcy5wYXJhbXMucmV0dXJuSWRzT25seSA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIGVycm9yLCAocmVzcG9uc2UgJiYgcmVzcG9uc2Uub2JqZWN0SWRzKSwgcmVzcG9uc2UpO1xuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIC8vIG9ubHkgdmFsaWQgZm9yIEZlYXR1cmUgU2VydmljZXMgcnVubmluZyBvbiBBcmNHSVMgU2VydmVyIDEwLjMrIG9yIEFyY0dJUyBPbmxpbmVcbiAgYm91bmRzOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLl9jbGVhblBhcmFtcygpO1xuICAgIHRoaXMucGFyYW1zLnJldHVybkV4dGVudE9ubHkgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmV4dGVudCAmJiBleHRlbnRUb0JvdW5kcyhyZXNwb25zZS5leHRlbnQpKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIGV4dGVudFRvQm91bmRzKHJlc3BvbnNlLmV4dGVudCksIHJlc3BvbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0ge1xuICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIEJvdW5kcydcbiAgICAgICAgfTtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgbnVsbCwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuICB9LFxuXG4gIGRpc3RpbmN0OiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gZ2VvbWV0cnkgbXVzdCBiZSBvbWl0dGVkIGZvciBxdWVyaWVzIHJlcXVlc3RpbmcgZGlzdGluY3QgdmFsdWVzXG4gICAgdGhpcy5wYXJhbXMucmV0dXJuR2VvbWV0cnkgPSBmYWxzZTtcbiAgICB0aGlzLnBhcmFtcy5yZXR1cm5EaXN0aW5jdFZhbHVlcyA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLy8gb25seSB2YWxpZCBmb3IgaW1hZ2Ugc2VydmljZXNcbiAgcGl4ZWxTaXplOiBmdW5jdGlvbiAocmF3UG9pbnQpIHtcbiAgICB2YXIgY2FzdFBvaW50ID0gcG9pbnQocmF3UG9pbnQpO1xuICAgIHRoaXMucGFyYW1zLnBpeGVsU2l6ZSA9IFtjYXN0UG9pbnQueCwgY2FzdFBvaW50LnldO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8vIG9ubHkgdmFsaWQgZm9yIG1hcCBzZXJ2aWNlc1xuICBsYXllcjogZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgdGhpcy5wYXRoID0gbGF5ZXIgKyAnL3F1ZXJ5JztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBfdHJhcFNRTGVycm9yczogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJzQwMCcpIHtcbiAgICAgICAgd2Fybignb25lIGNvbW1vbiBzeW50YXggZXJyb3IgaW4gcXVlcnkgcmVxdWVzdHMgaXMgZW5jYXNpbmcgc3RyaW5nIHZhbHVlcyBpbiBkb3VibGUgcXVvdGVzIGluc3RlYWQgb2Ygc2luZ2xlIHF1b3RlcycpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBfY2xlYW5QYXJhbXM6IGZ1bmN0aW9uICgpIHtcbiAgICBkZWxldGUgdGhpcy5wYXJhbXMucmV0dXJuSWRzT25seTtcbiAgICBkZWxldGUgdGhpcy5wYXJhbXMucmV0dXJuRXh0ZW50T25seTtcbiAgICBkZWxldGUgdGhpcy5wYXJhbXMucmV0dXJuQ291bnRPbmx5O1xuICB9LFxuXG4gIF9zZXRHZW9tZXRyeVBhcmFtczogZnVuY3Rpb24gKGdlb21ldHJ5KSB7XG4gICAgdGhpcy5wYXJhbXMuaW5TciA9IDQzMjY7XG4gICAgdmFyIGNvbnZlcnRlZCA9IF9zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBjb252ZXJ0ZWQuZ2VvbWV0cnk7XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnlUeXBlID0gY29udmVydGVkLmdlb21ldHJ5VHlwZTtcbiAgfVxuXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5IChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgUXVlcnkob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHF1ZXJ5O1xuIiwiaW1wb3J0IHsgVGFzayB9IGZyb20gJy4vVGFzayc7XG5pbXBvcnQgeyByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuLi9VdGlsJztcblxuZXhwb3J0IHZhciBGaW5kID0gVGFzay5leHRlbmQoe1xuICBzZXR0ZXJzOiB7XG4gICAgLy8gbWV0aG9kIG5hbWUgPiBwYXJhbSBuYW1lXG4gICAgJ2NvbnRhaW5zJzogJ2NvbnRhaW5zJyxcbiAgICAndGV4dCc6ICdzZWFyY2hUZXh0JyxcbiAgICAnZmllbGRzJzogJ3NlYXJjaEZpZWxkcycsIC8vIGRlbm90ZSBhbiBhcnJheSBvciBzaW5nbGUgc3RyaW5nXG4gICAgJ3NwYXRpYWxSZWZlcmVuY2UnOiAnc3InLFxuICAgICdzcic6ICdzcicsXG4gICAgJ2xheWVycyc6ICdsYXllcnMnLFxuICAgICdyZXR1cm5HZW9tZXRyeSc6ICdyZXR1cm5HZW9tZXRyeScsXG4gICAgJ21heEFsbG93YWJsZU9mZnNldCc6ICdtYXhBbGxvd2FibGVPZmZzZXQnLFxuICAgICdwcmVjaXNpb24nOiAnZ2VvbWV0cnlQcmVjaXNpb24nLFxuICAgICdkeW5hbWljTGF5ZXJzJzogJ2R5bmFtaWNMYXllcnMnLFxuICAgICdyZXR1cm5aJzogJ3JldHVyblonLFxuICAgICdyZXR1cm5NJzogJ3JldHVybk0nLFxuICAgICdnZGJWZXJzaW9uJzogJ2dkYlZlcnNpb24nLFxuICAgIC8vIHNraXBwZWQgaW1wbGVtZW50aW5nIHRoaXMgKGZvciBub3cpIGJlY2F1c2UgdGhlIFJFU1Qgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBpc250IGNvbnNpc3RlbnQgYmV0d2VlbiBvcGVyYXRpb25zXG4gICAgLy8gJ3RyYW5zZm9ybSc6ICdkYXR1bVRyYW5zZm9ybWF0aW9ucycsXG4gICAgJ3Rva2VuJzogJ3Rva2VuJ1xuICB9LFxuXG4gIHBhdGg6ICdmaW5kJyxcblxuICBwYXJhbXM6IHtcbiAgICBzcjogNDMyNixcbiAgICBjb250YWluczogdHJ1ZSxcbiAgICByZXR1cm5HZW9tZXRyeTogdHJ1ZSxcbiAgICByZXR1cm5aOiB0cnVlLFxuICAgIHJldHVybk06IGZhbHNlXG4gIH0sXG5cbiAgbGF5ZXJEZWZzOiBmdW5jdGlvbiAoaWQsIHdoZXJlKSB7XG4gICAgdGhpcy5wYXJhbXMubGF5ZXJEZWZzID0gKHRoaXMucGFyYW1zLmxheWVyRGVmcykgPyB0aGlzLnBhcmFtcy5sYXllckRlZnMgKyAnOycgOiAnJztcbiAgICB0aGlzLnBhcmFtcy5sYXllckRlZnMgKz0gKFtpZCwgd2hlcmVdKS5qb2luKCc6Jyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgc2ltcGxpZnk6IGZ1bmN0aW9uIChtYXAsIGZhY3Rvcikge1xuICAgIHZhciBtYXBXaWR0aCA9IE1hdGguYWJzKG1hcC5nZXRCb3VuZHMoKS5nZXRXZXN0KCkgLSBtYXAuZ2V0Qm91bmRzKCkuZ2V0RWFzdCgpKTtcbiAgICB0aGlzLnBhcmFtcy5tYXhBbGxvd2FibGVPZmZzZXQgPSAobWFwV2lkdGggLyBtYXAuZ2V0U2l6ZSgpLnkpICogZmFjdG9yO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJ1bjogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCAocmVzcG9uc2UgJiYgcmVzcG9uc2VUb0ZlYXR1cmVDb2xsZWN0aW9uKHJlc3BvbnNlKSksIHJlc3BvbnNlKTtcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRmluZChvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmluZDtcbiIsImltcG9ydCB7IFRhc2sgfSBmcm9tICcuL1Rhc2snO1xuXG5leHBvcnQgdmFyIElkZW50aWZ5ID0gVGFzay5leHRlbmQoe1xuICBwYXRoOiAnaWRlbnRpZnknLFxuXG4gIGJldHdlZW46IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgdGhpcy5wYXJhbXMudGltZSA9IFtzdGFydC52YWx1ZU9mKCksIGVuZC52YWx1ZU9mKCldO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aWZ5IChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgSWRlbnRpZnkob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlkZW50aWZ5O1xuIiwiaW1wb3J0IHsgbGF0TG5nIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBJZGVudGlmeSB9IGZyb20gJy4vSWRlbnRpZnknO1xuaW1wb3J0IHsgcmVzcG9uc2VUb0ZlYXR1cmVDb2xsZWN0aW9uLFxuICBib3VuZHNUb0V4dGVudCxcbiAgX3NldEdlb21ldHJ5XG59IGZyb20gJy4uL1V0aWwnO1xuXG5leHBvcnQgdmFyIElkZW50aWZ5RmVhdHVyZXMgPSBJZGVudGlmeS5leHRlbmQoe1xuICBzZXR0ZXJzOiB7XG4gICAgJ2xheWVycyc6ICdsYXllcnMnLFxuICAgICdwcmVjaXNpb24nOiAnZ2VvbWV0cnlQcmVjaXNpb24nLFxuICAgICd0b2xlcmFuY2UnOiAndG9sZXJhbmNlJyxcbiAgICAvLyBza2lwcGVkIGltcGxlbWVudGluZyB0aGlzIChmb3Igbm93KSBiZWNhdXNlIHRoZSBSRVNUIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gaXNudCBjb25zaXN0ZW50IGJldHdlZW4gb3BlcmF0aW9ucy5cbiAgICAvLyAndHJhbnNmb3JtJzogJ2RhdHVtVHJhbnNmb3JtYXRpb25zJ1xuICAgICdyZXR1cm5HZW9tZXRyeSc6ICdyZXR1cm5HZW9tZXRyeSdcbiAgfSxcblxuICBwYXJhbXM6IHtcbiAgICBzcjogNDMyNixcbiAgICBsYXllcnM6ICdhbGwnLFxuICAgIHRvbGVyYW5jZTogMyxcbiAgICByZXR1cm5HZW9tZXRyeTogdHJ1ZVxuICB9LFxuXG4gIG9uOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgdmFyIGV4dGVudCA9IGJvdW5kc1RvRXh0ZW50KG1hcC5nZXRCb3VuZHMoKSk7XG4gICAgdmFyIHNpemUgPSBtYXAuZ2V0U2l6ZSgpO1xuICAgIHRoaXMucGFyYW1zLmltYWdlRGlzcGxheSA9IFtzaXplLngsIHNpemUueSwgOTZdO1xuICAgIHRoaXMucGFyYW1zLm1hcEV4dGVudCA9IFtleHRlbnQueG1pbiwgZXh0ZW50LnltaW4sIGV4dGVudC54bWF4LCBleHRlbnQueW1heF07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgYXQ6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIC8vIGNhc3QgbGF0LCBsb25nIHBhaXJzIGluIHJhdyBhcnJheSBmb3JtIG1hbnVhbGx5XG4gICAgaWYgKGdlb21ldHJ5Lmxlbmd0aCA9PT0gMikge1xuICAgICAgZ2VvbWV0cnkgPSBsYXRMbmcoZ2VvbWV0cnkpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRHZW9tZXRyeVBhcmFtcyhnZW9tZXRyeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgbGF5ZXJEZWY6IGZ1bmN0aW9uIChpZCwgd2hlcmUpIHtcbiAgICB0aGlzLnBhcmFtcy5sYXllckRlZnMgPSAodGhpcy5wYXJhbXMubGF5ZXJEZWZzKSA/IHRoaXMucGFyYW1zLmxheWVyRGVmcyArICc7JyA6ICcnO1xuICAgIHRoaXMucGFyYW1zLmxheWVyRGVmcyArPSAoW2lkLCB3aGVyZV0pLmpvaW4oJzonKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBzaW1wbGlmeTogZnVuY3Rpb24gKG1hcCwgZmFjdG9yKSB7XG4gICAgdmFyIG1hcFdpZHRoID0gTWF0aC5hYnMobWFwLmdldEJvdW5kcygpLmdldFdlc3QoKSAtIG1hcC5nZXRCb3VuZHMoKS5nZXRFYXN0KCkpO1xuICAgIHRoaXMucGFyYW1zLm1heEFsbG93YWJsZU9mZnNldCA9IChtYXBXaWR0aCAvIG1hcC5nZXRTaXplKCkueSkgKiBmYWN0b3I7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcnVuOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIC8vIGltbWVkaWF0ZWx5IGludm9rZSB3aXRoIGFuIGVycm9yXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgdW5kZWZpbmVkLCByZXNwb25zZSk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgLy8gb2sgbm8gZXJyb3IgbGV0cyBqdXN0IGFzc3VtZSB3ZSBoYXZlIGZlYXR1cmVzLi4uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZmVhdHVyZUNvbGxlY3Rpb24gPSByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24ocmVzcG9uc2UpO1xuICAgICAgICByZXNwb25zZS5yZXN1bHRzID0gcmVzcG9uc2UucmVzdWx0cy5yZXZlcnNlKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzW2ldO1xuICAgICAgICAgIGZlYXR1cmUubGF5ZXJJZCA9IHJlc3BvbnNlLnJlc3VsdHNbaV0ubGF5ZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIHVuZGVmaW5lZCwgZmVhdHVyZUNvbGxlY3Rpb24sIHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICBfc2V0R2VvbWV0cnlQYXJhbXM6IGZ1bmN0aW9uIChnZW9tZXRyeSkge1xuICAgIHZhciBjb252ZXJ0ZWQgPSBfc2V0R2VvbWV0cnkoZ2VvbWV0cnkpO1xuICAgIHRoaXMucGFyYW1zLmdlb21ldHJ5ID0gY29udmVydGVkLmdlb21ldHJ5O1xuICAgIHRoaXMucGFyYW1zLmdlb21ldHJ5VHlwZSA9IGNvbnZlcnRlZC5nZW9tZXRyeVR5cGU7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpZnlGZWF0dXJlcyAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IElkZW50aWZ5RmVhdHVyZXMob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlkZW50aWZ5RmVhdHVyZXM7XG4iLCJpbXBvcnQgeyBsYXRMbmcgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IElkZW50aWZ5IH0gZnJvbSAnLi9JZGVudGlmeSc7XG5pbXBvcnQgeyByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuLi9VdGlsJztcblxuZXhwb3J0IHZhciBJZGVudGlmeUltYWdlID0gSWRlbnRpZnkuZXh0ZW5kKHtcbiAgc2V0dGVyczoge1xuICAgICdzZXRNb3NhaWNSdWxlJzogJ21vc2FpY1J1bGUnLFxuICAgICdzZXRSZW5kZXJpbmdSdWxlJzogJ3JlbmRlcmluZ1J1bGUnLFxuICAgICdzZXRQaXhlbFNpemUnOiAncGl4ZWxTaXplJyxcbiAgICAncmV0dXJuQ2F0YWxvZ0l0ZW1zJzogJ3JldHVybkNhdGFsb2dJdGVtcycsXG4gICAgJ3JldHVybkdlb21ldHJ5JzogJ3JldHVybkdlb21ldHJ5J1xuICB9LFxuXG4gIHBhcmFtczoge1xuICAgIHJldHVybkdlb21ldHJ5OiBmYWxzZVxuICB9LFxuXG4gIGF0OiBmdW5jdGlvbiAobGF0bG5nKSB7XG4gICAgbGF0bG5nID0gbGF0TG5nKGxhdGxuZyk7XG4gICAgdGhpcy5wYXJhbXMuZ2VvbWV0cnkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB4OiBsYXRsbmcubG5nLFxuICAgICAgeTogbGF0bG5nLmxhdCxcbiAgICAgIHNwYXRpYWxSZWZlcmVuY2U6IHtcbiAgICAgICAgd2tpZDogNDMyNlxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGFyYW1zLmdlb21ldHJ5VHlwZSA9ICdlc3JpR2VvbWV0cnlQb2ludCc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0TW9zYWljUnVsZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5tb3NhaWNSdWxlO1xuICB9LFxuXG4gIGdldFJlbmRlcmluZ1J1bGU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXMucmVuZGVyaW5nUnVsZTtcbiAgfSxcblxuICBnZXRQaXhlbFNpemU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXMucGl4ZWxTaXplO1xuICB9LFxuXG4gIHJ1bjogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yLCAocmVzcG9uc2UgJiYgdGhpcy5fcmVzcG9uc2VUb0dlb0pTT04ocmVzcG9uc2UpKSwgcmVzcG9uc2UpO1xuICAgIH0sIHRoaXMpO1xuICB9LFxuXG4gIC8vIGdldCBwaXhlbCBkYXRhIGFuZCByZXR1cm4gYXMgZ2VvSlNPTiBwb2ludFxuICAvLyBwb3B1bGF0ZSBjYXRhbG9nIGl0ZW1zIChpZiBhbnkpXG4gIC8vIG1lcmdpbmcgaW4gYW55IGNhdGFsb2dJdGVtVmlzaWJpbGl0aWVzIGFzIGEgcHJvcGVyeSBvZiBlYWNoIGZlYXR1cmVcbiAgX3Jlc3BvbnNlVG9HZW9KU09OOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICB2YXIgbG9jYXRpb24gPSByZXNwb25zZS5sb2NhdGlvbjtcbiAgICB2YXIgY2F0YWxvZ0l0ZW1zID0gcmVzcG9uc2UuY2F0YWxvZ0l0ZW1zO1xuICAgIHZhciBjYXRhbG9nSXRlbVZpc2liaWxpdGllcyA9IHJlc3BvbnNlLmNhdGFsb2dJdGVtVmlzaWJpbGl0aWVzO1xuICAgIHZhciBnZW9KU09OID0ge1xuICAgICAgJ3BpeGVsJzoge1xuICAgICAgICAndHlwZSc6ICdGZWF0dXJlJyxcbiAgICAgICAgJ2dlb21ldHJ5Jzoge1xuICAgICAgICAgICd0eXBlJzogJ1BvaW50JyxcbiAgICAgICAgICAnY29vcmRpbmF0ZXMnOiBbbG9jYXRpb24ueCwgbG9jYXRpb24ueV1cbiAgICAgICAgfSxcbiAgICAgICAgJ2Nycyc6IHtcbiAgICAgICAgICAndHlwZSc6ICdFUFNHJyxcbiAgICAgICAgICAncHJvcGVydGllcyc6IHtcbiAgICAgICAgICAgICdjb2RlJzogbG9jYXRpb24uc3BhdGlhbFJlZmVyZW5jZS53a2lkXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAncHJvcGVydGllcyc6IHtcbiAgICAgICAgICAnT0JKRUNUSUQnOiByZXNwb25zZS5vYmplY3RJZCxcbiAgICAgICAgICAnbmFtZSc6IHJlc3BvbnNlLm5hbWUsXG4gICAgICAgICAgJ3ZhbHVlJzogcmVzcG9uc2UudmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgJ2lkJzogcmVzcG9uc2Uub2JqZWN0SWRcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHJlc3BvbnNlLnByb3BlcnRpZXMgJiYgcmVzcG9uc2UucHJvcGVydGllcy5WYWx1ZXMpIHtcbiAgICAgIGdlb0pTT04ucGl4ZWwucHJvcGVydGllcy52YWx1ZXMgPSByZXNwb25zZS5wcm9wZXJ0aWVzLlZhbHVlcztcbiAgICB9XG5cbiAgICBpZiAoY2F0YWxvZ0l0ZW1zICYmIGNhdGFsb2dJdGVtcy5mZWF0dXJlcykge1xuICAgICAgZ2VvSlNPTi5jYXRhbG9nSXRlbXMgPSByZXNwb25zZVRvRmVhdHVyZUNvbGxlY3Rpb24oY2F0YWxvZ0l0ZW1zKTtcbiAgICAgIGlmIChjYXRhbG9nSXRlbVZpc2liaWxpdGllcyAmJiBjYXRhbG9nSXRlbVZpc2liaWxpdGllcy5sZW5ndGggPT09IGdlb0pTT04uY2F0YWxvZ0l0ZW1zLmZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgICBmb3IgKHZhciBpID0gY2F0YWxvZ0l0ZW1WaXNpYmlsaXRpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBnZW9KU09OLmNhdGFsb2dJdGVtcy5mZWF0dXJlc1tpXS5wcm9wZXJ0aWVzLmNhdGFsb2dJdGVtVmlzaWJpbGl0eSA9IGNhdGFsb2dJdGVtVmlzaWJpbGl0aWVzW2ldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZW9KU09OO1xuICB9XG5cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpZnlJbWFnZSAocGFyYW1zKSB7XG4gIHJldHVybiBuZXcgSWRlbnRpZnlJbWFnZShwYXJhbXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpZGVudGlmeUltYWdlO1xuIiwiaW1wb3J0IHsgVXRpbCwgRXZlbnRlZCB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHtjb3JzfSBmcm9tICcuLi9TdXBwb3J0JztcbmltcG9ydCB7Y2xlYW5VcmwsIGdldFVybFBhcmFtc30gZnJvbSAnLi4vVXRpbCc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuLi9SZXF1ZXN0JztcblxuZXhwb3J0IHZhciBTZXJ2aWNlID0gRXZlbnRlZC5leHRlbmQoe1xuXG4gIG9wdGlvbnM6IHtcbiAgICBwcm94eTogZmFsc2UsXG4gICAgdXNlQ29yczogY29ycyxcbiAgICB0aW1lb3V0OiAwXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLl9yZXF1ZXN0UXVldWUgPSBbXTtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGluZyA9IGZhbHNlO1xuICAgIFV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLm9wdGlvbnMudXJsID0gY2xlYW5VcmwodGhpcy5vcHRpb25zLnVybCk7XG4gIH0sXG5cbiAgZ2V0OiBmdW5jdGlvbiAocGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdnZXQnLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgfSxcblxuICBwb3N0OiBmdW5jdGlvbiAocGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdwb3N0JywgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCk7XG4gIH0sXG5cbiAgcmVxdWVzdDogZnVuY3Rpb24gKHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgncmVxdWVzdCcsIHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpO1xuICB9LFxuXG4gIG1ldGFkYXRhOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnZ2V0JywgJycsIHt9LCBjYWxsYmFjaywgY29udGV4dCk7XG4gIH0sXG5cbiAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGluZyA9IGZhbHNlO1xuICAgIHRoaXMub3B0aW9ucy50b2tlbiA9IHRva2VuO1xuICAgIHRoaXMuX3J1blF1ZXVlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0VGltZW91dDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudGltZW91dDtcbiAgfSxcblxuICBzZXRUaW1lb3V0OiBmdW5jdGlvbiAodGltZW91dCkge1xuICAgIHRoaXMub3B0aW9ucy50aW1lb3V0ID0gdGltZW91dDtcbiAgfSxcblxuICBfcmVxdWVzdDogZnVuY3Rpb24gKG1ldGhvZCwgcGF0aCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuZmlyZSgncmVxdWVzdHN0YXJ0Jywge1xuICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aCxcbiAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgbWV0aG9kOiBtZXRob2RcbiAgICB9LCB0cnVlKTtcblxuICAgIHZhciB3cmFwcGVkQ2FsbGJhY2sgPSB0aGlzLl9jcmVhdGVTZXJ2aWNlQ2FsbGJhY2sobWV0aG9kLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIHBhcmFtcy50b2tlbiA9IHRoaXMub3B0aW9ucy50b2tlbjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZXF1ZXN0UGFyYW1zKSB7XG4gICAgICBVdGlsLmV4dGVuZChwYXJhbXMsIHRoaXMub3B0aW9ucy5yZXF1ZXN0UGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2F1dGhlbnRpY2F0aW5nKSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0UXVldWUucHVzaChbbWV0aG9kLCBwYXRoLCBwYXJhbXMsIGNhbGxiYWNrLCBjb250ZXh0XSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cmwgPSAodGhpcy5vcHRpb25zLnByb3h5KSA/IHRoaXMub3B0aW9ucy5wcm94eSArICc/JyArIHRoaXMub3B0aW9ucy51cmwgKyBwYXRoIDogdGhpcy5vcHRpb25zLnVybCArIHBhdGg7XG5cbiAgICAgIGlmICgobWV0aG9kID09PSAnZ2V0JyB8fCBtZXRob2QgPT09ICdyZXF1ZXN0JykgJiYgIXRoaXMub3B0aW9ucy51c2VDb3JzKSB7XG4gICAgICAgIHJldHVybiBSZXF1ZXN0LmdldC5KU09OUCh1cmwsIHBhcmFtcywgd3JhcHBlZENhbGxiYWNrLCBjb250ZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBSZXF1ZXN0W21ldGhvZF0odXJsLCBwYXJhbXMsIHdyYXBwZWRDYWxsYmFjaywgY29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIF9jcmVhdGVTZXJ2aWNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChtZXRob2QsIHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gVXRpbC5iaW5kKGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGlmIChlcnJvciAmJiAoZXJyb3IuY29kZSA9PT0gNDk5IHx8IGVycm9yLmNvZGUgPT09IDQ5OCkpIHtcbiAgICAgICAgdGhpcy5fYXV0aGVudGljYXRpbmcgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuX3JlcXVlc3RRdWV1ZS5wdXNoKFttZXRob2QsIHBhdGgsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHRdKTtcblxuICAgICAgICAvLyBmaXJlIGFuIGV2ZW50IGZvciB1c2VycyB0byBoYW5kbGUgYW5kIHJlLWF1dGhlbnRpY2F0ZVxuICAgICAgICB0aGlzLmZpcmUoJ2F1dGhlbnRpY2F0aW9ucmVxdWlyZWQnLCB7XG4gICAgICAgICAgYXV0aGVudGljYXRlOiBVdGlsLmJpbmQodGhpcy5hdXRoZW50aWNhdGUsIHRoaXMpXG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIC8vIGlmIHRoZSB1c2VyIGhhcyBhY2Nlc3MgdG8gYSBjYWxsYmFjayB0aGV5IGNhbiBoYW5kbGUgdGhlIGF1dGggZXJyb3JcbiAgICAgICAgZXJyb3IuYXV0aGVudGljYXRlID0gVXRpbC5iaW5kKHRoaXMuYXV0aGVudGljYXRlLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5maXJlKCdyZXF1ZXN0ZXJyb3InLCB7XG4gICAgICAgICAgdXJsOiB0aGlzLm9wdGlvbnMudXJsICsgcGF0aCxcbiAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgIGNvZGU6IGVycm9yLmNvZGUsXG4gICAgICAgICAgbWV0aG9kOiBtZXRob2RcbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpcmUoJ3JlcXVlc3RzdWNjZXNzJywge1xuICAgICAgICAgIHVybDogdGhpcy5vcHRpb25zLnVybCArIHBhdGgsXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgICAgIG1ldGhvZDogbWV0aG9kXG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpcmUoJ3JlcXVlc3RlbmQnLCB7XG4gICAgICAgIHVybDogdGhpcy5vcHRpb25zLnVybCArIHBhdGgsXG4gICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICBtZXRob2Q6IG1ldGhvZFxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgX3J1blF1ZXVlOiBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMuX3JlcXVlc3RRdWV1ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLl9yZXF1ZXN0UXVldWVbaV07XG4gICAgICB2YXIgbWV0aG9kID0gcmVxdWVzdC5zaGlmdCgpO1xuICAgICAgdGhpc1ttZXRob2RdLmFwcGx5KHRoaXMsIHJlcXVlc3QpO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0UXVldWUgPSBbXTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlIChvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBnZXRVcmxQYXJhbXMob3B0aW9ucyk7XG4gIHJldHVybiBuZXcgU2VydmljZShvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2VydmljZTtcbiIsImltcG9ydCB7IFNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2UnO1xuaW1wb3J0IGlkZW50aWZ5RmVhdHVyZXMgZnJvbSAnLi4vVGFza3MvSWRlbnRpZnlGZWF0dXJlcyc7XG5pbXBvcnQgcXVlcnkgZnJvbSAnLi4vVGFza3MvUXVlcnknO1xuaW1wb3J0IGZpbmQgZnJvbSAnLi4vVGFza3MvRmluZCc7XG5cbmV4cG9ydCB2YXIgTWFwU2VydmljZSA9IFNlcnZpY2UuZXh0ZW5kKHtcblxuICBpZGVudGlmeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpZGVudGlmeUZlYXR1cmVzKHRoaXMpO1xuICB9LFxuXG4gIGZpbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmluZCh0aGlzKTtcbiAgfSxcblxuICBxdWVyeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBxdWVyeSh0aGlzKTtcbiAgfVxuXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIG1hcFNlcnZpY2UgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBNYXBTZXJ2aWNlKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBTZXJ2aWNlO1xuIiwiaW1wb3J0IHsgU2VydmljZSB9IGZyb20gJy4vU2VydmljZSc7XG5pbXBvcnQgaWRlbnRpZnlJbWFnZSBmcm9tICcuLi9UYXNrcy9JZGVudGlmeUltYWdlJztcbmltcG9ydCBxdWVyeSBmcm9tICcuLi9UYXNrcy9RdWVyeSc7XG5cbmV4cG9ydCB2YXIgSW1hZ2VTZXJ2aWNlID0gU2VydmljZS5leHRlbmQoe1xuXG4gIHF1ZXJ5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHF1ZXJ5KHRoaXMpO1xuICB9LFxuXG4gIGlkZW50aWZ5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlkZW50aWZ5SW1hZ2UodGhpcyk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2VTZXJ2aWNlIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgSW1hZ2VTZXJ2aWNlKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpbWFnZVNlcnZpY2U7XG4iLCJpbXBvcnQgeyBTZXJ2aWNlIH0gZnJvbSAnLi9TZXJ2aWNlJztcbmltcG9ydCBxdWVyeSBmcm9tICcuLi9UYXNrcy9RdWVyeSc7XG5pbXBvcnQgeyBnZW9qc29uVG9BcmNHSVMgfSBmcm9tICcuLi9VdGlsJztcblxuZXhwb3J0IHZhciBGZWF0dXJlTGF5ZXJTZXJ2aWNlID0gU2VydmljZS5leHRlbmQoe1xuXG4gIG9wdGlvbnM6IHtcbiAgICBpZEF0dHJpYnV0ZTogJ09CSkVDVElEJ1xuICB9LFxuXG4gIHF1ZXJ5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHF1ZXJ5KHRoaXMpO1xuICB9LFxuXG4gIGFkZEZlYXR1cmU6IGZ1bmN0aW9uIChmZWF0dXJlLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIGRlbGV0ZSBmZWF0dXJlLmlkO1xuXG4gICAgZmVhdHVyZSA9IGdlb2pzb25Ub0FyY0dJUyhmZWF0dXJlKTtcblxuICAgIHJldHVybiB0aGlzLnBvc3QoJ2FkZEZlYXR1cmVzJywge1xuICAgICAgZmVhdHVyZXM6IFtmZWF0dXJlXVxuICAgIH0sIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzcG9uc2UgJiYgcmVzcG9uc2UuYWRkUmVzdWx0cykgPyByZXNwb25zZS5hZGRSZXN1bHRzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IgfHwgcmVzcG9uc2UuYWRkUmVzdWx0c1swXS5lcnJvciwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9LCBjb250ZXh0KTtcbiAgfSxcblxuICB1cGRhdGVGZWF0dXJlOiBmdW5jdGlvbiAoZmVhdHVyZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICBmZWF0dXJlID0gZ2VvanNvblRvQXJjR0lTKGZlYXR1cmUsIHRoaXMub3B0aW9ucy5pZEF0dHJpYnV0ZSk7XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KCd1cGRhdGVGZWF0dXJlcycsIHtcbiAgICAgIGZlYXR1cmVzOiBbZmVhdHVyZV1cbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlc3BvbnNlICYmIHJlc3BvbnNlLnVwZGF0ZVJlc3VsdHMpID8gcmVzcG9uc2UudXBkYXRlUmVzdWx0c1swXSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVycm9yIHx8IHJlc3BvbnNlLnVwZGF0ZVJlc3VsdHNbMF0uZXJyb3IsIHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSwgY29udGV4dCk7XG4gIH0sXG5cbiAgZGVsZXRlRmVhdHVyZTogZnVuY3Rpb24gKGlkLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnBvc3QoJ2RlbGV0ZUZlYXR1cmVzJywge1xuICAgICAgb2JqZWN0SWRzOiBpZFxuICAgIH0sIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIHZhciByZXN1bHQgPSAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZGVsZXRlUmVzdWx0cykgPyByZXNwb25zZS5kZWxldGVSZXN1bHRzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IgfHwgcmVzcG9uc2UuZGVsZXRlUmVzdWx0c1swXS5lcnJvciwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9LCBjb250ZXh0KTtcbiAgfSxcblxuICBkZWxldGVGZWF0dXJlczogZnVuY3Rpb24gKGlkcywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5wb3N0KCdkZWxldGVGZWF0dXJlcycsIHtcbiAgICAgIG9iamVjdElkczogaWRzXG4gICAgfSwgZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgLy8gcGFzcyBiYWNrIHRoZSBlbnRpcmUgYXJyYXlcbiAgICAgIHZhciByZXN1bHQgPSAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZGVsZXRlUmVzdWx0cykgPyByZXNwb25zZS5kZWxldGVSZXN1bHRzIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IgfHwgcmVzcG9uc2UuZGVsZXRlUmVzdWx0c1swXS5lcnJvciwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9LCBjb250ZXh0KTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlTGF5ZXJTZXJ2aWNlIChvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgRmVhdHVyZUxheWVyU2VydmljZShvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmVhdHVyZUxheWVyU2VydmljZTtcbiIsImltcG9ydCB7IFRpbGVMYXllciwgVXRpbCB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgcG9pbnRlckV2ZW50cyB9IGZyb20gJy4uL1N1cHBvcnQnO1xuaW1wb3J0IHtcbiAgc2V0RXNyaUF0dHJpYnV0aW9uLFxuICBfZ2V0QXR0cmlidXRpb25EYXRhLFxuICBfdXBkYXRlTWFwQXR0cmlidXRpb25cbn0gZnJvbSAnLi4vVXRpbCc7XG5cbnZhciB0aWxlUHJvdG9jb2wgPSAod2luZG93LmxvY2F0aW9uLnByb3RvY29sICE9PSAnaHR0cHM6JykgPyAnaHR0cDonIDogJ2h0dHBzOic7XG5cbmV4cG9ydCB2YXIgQmFzZW1hcExheWVyID0gVGlsZUxheWVyLmV4dGVuZCh7XG4gIHN0YXRpY3M6IHtcbiAgICBUSUxFUzoge1xuICAgICAgU3RyZWV0czoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfU3RyZWV0X01hcC9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE5LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdVU0dTLCBOT0FBJyxcbiAgICAgICAgICBhdHRyaWJ1dGlvblVybDogJ2h0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vV29ybGRfU3RyZWV0X01hcCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFRvcG9ncmFwaGljOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9Ub3BvX01hcC9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE5LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdVU0dTLCBOT0FBJyxcbiAgICAgICAgICBhdHRyaWJ1dGlvblVybDogJ2h0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vV29ybGRfVG9wb19NYXAnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBPY2VhbnM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL2FyY2dpcy9yZXN0L3NlcnZpY2VzL09jZWFuL1dvcmxkX09jZWFuX0Jhc2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxNixcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnVVNHUywgTk9BQScsXG4gICAgICAgICAgYXR0cmlidXRpb25Vcmw6ICdodHRwczovL3N0YXRpYy5hcmNnaXMuY29tL2F0dHJpYnV0aW9uL09jZWFuX0Jhc2VtYXAnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBPY2VhbnNMYWJlbHM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL2FyY2dpcy9yZXN0L3NlcnZpY2VzL09jZWFuL1dvcmxkX09jZWFuX1JlZmVyZW5jZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE2LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgcGFuZTogKHBvaW50ZXJFdmVudHMpID8gJ2VzcmktbGFiZWxzJyA6ICd0aWxlUGFuZSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIE5hdGlvbmFsR2VvZ3JhcGhpYzoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvTmF0R2VvX1dvcmxkX01hcC9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE2LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdOYXRpb25hbCBHZW9ncmFwaGljLCBEZUxvcm1lLCBIRVJFLCBVTkVQLVdDTUMsIFVTR1MsIE5BU0EsIEVTQSwgTUVUSSwgTlJDQU4sIEdFQkNPLCBOT0FBLCBpbmNyZW1lbnQgUCBDb3JwLidcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIERhcmtHcmF5OiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9DYW52YXMvV29ybGRfRGFya19HcmF5X0Jhc2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxNixcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnSEVSRSwgRGVMb3JtZSwgTWFwbXlJbmRpYSwgJmNvcHk7IE9wZW5TdHJlZXRNYXAgY29udHJpYnV0b3JzJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgRGFya0dyYXlMYWJlbHM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL0NhbnZhcy9Xb3JsZF9EYXJrX0dyYXlfUmVmZXJlbmNlL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTYsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBwYW5lOiAocG9pbnRlckV2ZW50cykgPyAnZXNyaS1sYWJlbHMnIDogJ3RpbGVQYW5lJyxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJydcblxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgR3JheToge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvQ2FudmFzL1dvcmxkX0xpZ2h0X0dyYXlfQmFzZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE2LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdIRVJFLCBEZUxvcm1lLCBNYXBteUluZGlhLCAmY29weTsgT3BlblN0cmVldE1hcCBjb250cmlidXRvcnMnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBHcmF5TGFiZWxzOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9DYW52YXMvV29ybGRfTGlnaHRfR3JheV9SZWZlcmVuY2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxNixcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIHBhbmU6IChwb2ludGVyRXZlbnRzKSA/ICdlc3JpLWxhYmVscycgOiAndGlsZVBhbmUnLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgSW1hZ2VyeToge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfSW1hZ2VyeS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE5LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdEaWdpdGFsR2xvYmUsIEdlb0V5ZSwgaS1jdWJlZCwgVVNEQSwgVVNHUywgQUVYLCBHZXRtYXBwaW5nLCBBZXJvZ3JpZCwgSUdOLCBJR1AsIHN3aXNzdG9wbywgYW5kIHRoZSBHSVMgVXNlciBDb21tdW5pdHknLFxuICAgICAgICAgIGF0dHJpYnV0aW9uVXJsOiAnaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9Xb3JsZF9JbWFnZXJ5J1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgSW1hZ2VyeUxhYmVsczoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvUmVmZXJlbmNlL1dvcmxkX0JvdW5kYXJpZXNfYW5kX1BsYWNlcy9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE5LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgcGFuZTogKHBvaW50ZXJFdmVudHMpID8gJ2VzcmktbGFiZWxzJyA6ICd0aWxlUGFuZScsXG4gICAgICAgICAgYXR0cmlidXRpb246ICcnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBJbWFnZXJ5VHJhbnNwb3J0YXRpb246IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1JlZmVyZW5jZS9Xb3JsZF9UcmFuc3BvcnRhdGlvbi9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE5LFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgcGFuZTogKHBvaW50ZXJFdmVudHMpID8gJ2VzcmktbGFiZWxzJyA6ICd0aWxlUGFuZSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFNoYWRlZFJlbGllZjoge1xuICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgJy8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfU2hhZGVkX1JlbGllZi9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDEzLFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgYXR0cmlidXRpb246ICdVU0dTJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgU2hhZGVkUmVsaWVmTGFiZWxzOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfQm91bmRhcmllc19hbmRfUGxhY2VzX0FsdGVybmF0ZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDEyLFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgcGFuZTogKHBvaW50ZXJFdmVudHMpID8gJ2VzcmktbGFiZWxzJyA6ICd0aWxlUGFuZScsXG4gICAgICAgICAgYXR0cmlidXRpb246ICcnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBUZXJyYWluOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9UZXJyYWluX0Jhc2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWluWm9vbTogMSxcbiAgICAgICAgICBtYXhab29tOiAxMyxcbiAgICAgICAgICBzdWJkb21haW5zOiBbJ3NlcnZlcicsICdzZXJ2aWNlcyddLFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnVVNHUywgTk9BQSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFRlcnJhaW5MYWJlbHM6IHtcbiAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICcvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1JlZmVyZW5jZS9Xb3JsZF9SZWZlcmVuY2VfT3ZlcmxheS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDEzLFxuICAgICAgICAgIHN1YmRvbWFpbnM6IFsnc2VydmVyJywgJ3NlcnZpY2VzJ10sXG4gICAgICAgICAgcGFuZTogKHBvaW50ZXJFdmVudHMpID8gJ2VzcmktbGFiZWxzJyA6ICd0aWxlUGFuZScsXG4gICAgICAgICAgYXR0cmlidXRpb246ICcnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBVU0FUb3BvOiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9VU0FfVG9wb19NYXBzL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1pblpvb206IDEsXG4gICAgICAgICAgbWF4Wm9vbTogMTUsXG4gICAgICAgICAgc3ViZG9tYWluczogWydzZXJ2ZXInLCAnc2VydmljZXMnXSxcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogJ1VTR1MsIE5hdGlvbmFsIEdlb2dyYXBoaWMgU29jaWV0eSwgaS1jdWJlZCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIEltYWdlcnlDbGFyaXR5OiB7XG4gICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAnLy9jbGFyaXR5Lm1hcHRpbGVzLmFyY2dpcy5jb20vYXJjZ2lzL3Jlc3Qvc2VydmljZXMvV29ybGRfSW1hZ2VyeS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtaW5ab29tOiAxLFxuICAgICAgICAgIG1heFpvb206IDE5LFxuICAgICAgICAgIGF0dHJpYnV0aW9uOiAnRXNyaSwgRGlnaXRhbEdsb2JlLCBHZW9FeWUsIEVhcnRoc3RhciBHZW9ncmFwaGljcywgQ05FUy9BaXJidXMgRFMsIFVTREEsIFVTR1MsIEFlcm9HUklELCBJR04sIGFuZCB0aGUgR0lTIFVzZXIgQ29tbXVuaXR5J1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uIChrZXksIG9wdGlvbnMpIHtcbiAgICB2YXIgY29uZmlnO1xuXG4gICAgLy8gc2V0IHRoZSBjb25maWcgdmFyaWFibGUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29uZmlnIG9iamVjdFxuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyAmJiBrZXkudXJsVGVtcGxhdGUgJiYga2V5Lm9wdGlvbnMpIHtcbiAgICAgIGNvbmZpZyA9IGtleTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmIEJhc2VtYXBMYXllci5USUxFU1trZXldKSB7XG4gICAgICBjb25maWcgPSBCYXNlbWFwTGF5ZXIuVElMRVNba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMLmVzcmkuQmFzZW1hcExheWVyOiBJbnZhbGlkIHBhcmFtZXRlci4gVXNlIG9uZSBvZiBcIlN0cmVldHNcIiwgXCJUb3BvZ3JhcGhpY1wiLCBcIk9jZWFuc1wiLCBcIk9jZWFuc0xhYmVsc1wiLCBcIk5hdGlvbmFsR2VvZ3JhcGhpY1wiLCBcIkdyYXlcIiwgXCJHcmF5TGFiZWxzXCIsIFwiRGFya0dyYXlcIiwgXCJEYXJrR3JheUxhYmVsc1wiLCBcIkltYWdlcnlcIiwgXCJJbWFnZXJ5TGFiZWxzXCIsIFwiSW1hZ2VyeVRyYW5zcG9ydGF0aW9uXCIsIFwiSW1hZ2VyeUNsYXJpdHlcIiwgXCJTaGFkZWRSZWxpZWZcIiwgXCJTaGFkZWRSZWxpZWZMYWJlbHNcIiwgXCJUZXJyYWluXCIsIFwiVGVycmFpbkxhYmVsc1wiIG9yIFwiVVNBVG9wb1wiJyk7XG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgcGFzc2VkIG9wdGlvbnMgaW50byB0aGUgY29uZmlnIG9wdGlvbnNcbiAgICB2YXIgdGlsZU9wdGlvbnMgPSBVdGlsLmV4dGVuZChjb25maWcub3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICBVdGlsLnNldE9wdGlvbnModGhpcywgdGlsZU9wdGlvbnMpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50b2tlbikge1xuICAgICAgY29uZmlnLnVybFRlbXBsYXRlICs9ICgnP3Rva2VuPScgKyB0aGlzLm9wdGlvbnMudG9rZW4pO1xuICAgIH1cblxuICAgIC8vIGNhbGwgdGhlIGluaXRpYWxpemUgbWV0aG9kIG9uIEwuVGlsZUxheWVyIHRvIHNldCBldmVyeXRoaW5nIHVwXG4gICAgVGlsZUxheWVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgY29uZmlnLnVybFRlbXBsYXRlLCB0aWxlT3B0aW9ucyk7XG4gIH0sXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAvLyBpbmNsdWRlICdQb3dlcmVkIGJ5IEVzcmknIGluIG1hcCBhdHRyaWJ1dGlvblxuICAgIHNldEVzcmlBdHRyaWJ1dGlvbihtYXApO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wYW5lID09PSAnZXNyaS1sYWJlbHMnKSB7XG4gICAgICB0aGlzLl9pbml0UGFuZSgpO1xuICAgIH1cbiAgICAvLyBzb21lIGJhc2VtYXBzIGNhbiBzdXBwbHkgZHluYW1pYyBhdHRyaWJ1dGlvblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRpb25VcmwpIHtcbiAgICAgIF9nZXRBdHRyaWJ1dGlvbkRhdGEodGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uVXJsLCBtYXApO1xuICAgIH1cblxuICAgIG1hcC5vbignbW92ZWVuZCcsIF91cGRhdGVNYXBBdHRyaWJ1dGlvbik7XG5cbiAgICBUaWxlTGF5ZXIucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcywgbWFwKTtcbiAgfSxcblxuICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgIG1hcC5vZmYoJ21vdmVlbmQnLCBfdXBkYXRlTWFwQXR0cmlidXRpb24pO1xuICAgIFRpbGVMYXllci5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIF9pbml0UGFuZTogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fbWFwLmdldFBhbmUodGhpcy5vcHRpb25zLnBhbmUpKSB7XG4gICAgICB2YXIgcGFuZSA9IHRoaXMuX21hcC5jcmVhdGVQYW5lKHRoaXMub3B0aW9ucy5wYW5lKTtcbiAgICAgIHBhbmUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgIHBhbmUuc3R5bGUuekluZGV4ID0gNTAwO1xuICAgIH1cbiAgfSxcblxuICBnZXRBdHRyaWJ1dGlvbjogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRpb24pIHtcbiAgICAgIHZhciBhdHRyaWJ1dGlvbiA9ICc8c3BhbiBjbGFzcz1cImVzcmktZHluYW1pYy1hdHRyaWJ1dGlvblwiPicgKyB0aGlzLm9wdGlvbnMuYXR0cmlidXRpb24gKyAnPC9zcGFuPic7XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGlvbjtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlbWFwTGF5ZXIgKGtleSwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEJhc2VtYXBMYXllcihrZXksIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlbWFwTGF5ZXI7XG4iLCJpbXBvcnQgeyBDUlMsIERvbUV2ZW50LCBUaWxlTGF5ZXIsIFV0aWwgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IHdhcm4sIGdldFVybFBhcmFtcywgc2V0RXNyaUF0dHJpYnV0aW9uIH0gZnJvbSAnLi4vVXRpbCc7XG5pbXBvcnQgbWFwU2VydmljZSBmcm9tICcuLi9TZXJ2aWNlcy9NYXBTZXJ2aWNlJztcblxuZXhwb3J0IHZhciBUaWxlZE1hcExheWVyID0gVGlsZUxheWVyLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICB6b29tT2Zmc2V0QWxsb3dhbmNlOiAwLjEsXG4gICAgZXJyb3JUaWxlVXJsOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFRQUFBQUVBQkFNQUFBQ3VYTFZWQUFBQUExQk1WRVV6TkRWc3psSEhBQUFBQVhSU1RsTUFRT2JZWmdBQUFBbHdTRmx6QUFBQUFBQUFBQUFCNm1VV3BBQUFBRFpKUkVGVWVKenR3UUVCQUFBQWdpRC9yMjVJUUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE3d2FCQUFBQncwOFJ3QUFBQUFCSlJVNUVya0pnZ2c9PSdcbiAgfSxcblxuICBzdGF0aWNzOiB7XG4gICAgTWVyY2F0b3Jab29tTGV2ZWxzOiB7XG4gICAgICAnMCc6IDE1NjU0My4wMzM5Mjc5OTk5OSxcbiAgICAgICcxJzogNzgyNzEuNTE2OTYzOTk5ODkzLFxuICAgICAgJzInOiAzOTEzNS43NTg0ODIwMDAwOTksXG4gICAgICAnMyc6IDE5NTY3Ljg3OTI0MDk5OTkwMSxcbiAgICAgICc0JzogOTc4My45Mzk2MjA0OTk5NTkzLFxuICAgICAgJzUnOiA0ODkxLjk2OTgxMDI0OTk3OTcsXG4gICAgICAnNic6IDI0NDUuOTg0OTA1MTI0OTg5OCxcbiAgICAgICc3JzogMTIyMi45OTI0NTI1NjI0ODk5LFxuICAgICAgJzgnOiA2MTEuNDk2MjI2MjgxMzgwMDIsXG4gICAgICAnOSc6IDMwNS43NDgxMTMxNDA1NTgwMixcbiAgICAgICcxMCc6IDE1Mi44NzQwNTY1NzA0MTEsXG4gICAgICAnMTEnOiA3Ni40MzcwMjgyODUwNzMxOTcsXG4gICAgICAnMTInOiAzOC4yMTg1MTQxNDI1MzY1OTgsXG4gICAgICAnMTMnOiAxOS4xMDkyNTcwNzEyNjgyOTksXG4gICAgICAnMTQnOiA5LjU1NDYyODUzNTYzNDE0OTYsXG4gICAgICAnMTUnOiA0Ljc3NzMxNDI2Nzk0OTM2OTksXG4gICAgICAnMTYnOiAyLjM4ODY1NzEzMzk3NDY4LFxuICAgICAgJzE3JzogMS4xOTQzMjg1NjY4NTUwNTAxLFxuICAgICAgJzE4JzogMC41OTcxNjQyODM1NTk4MTY5OSxcbiAgICAgICcxOSc6IDAuMjk4NTgyMTQxNjQ3NjE2OTgsXG4gICAgICAnMjAnOiAwLjE0OTI5MTA3MDgyMzgxLFxuICAgICAgJzIxJzogMC4wNzQ2NDU1MzU0MTE5MSxcbiAgICAgICcyMic6IDAuMDM3MzIyNzY3NzA1OTUyNSxcbiAgICAgICcyMyc6IDAuMDE4NjYxMzgzODUyOTc2M1xuICAgIH1cbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBVdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG5cbiAgICAvLyBzZXQgdGhlIHVybHNcbiAgICBvcHRpb25zID0gZ2V0VXJsUGFyYW1zKG9wdGlvbnMpO1xuICAgIHRoaXMudGlsZVVybCA9IChvcHRpb25zLnByb3h5ID8gb3B0aW9ucy5wcm94eSArICc/JyA6ICcnKSArIG9wdGlvbnMudXJsICsgJ3RpbGUve3p9L3t5fS97eH0nICsgKG9wdGlvbnMucmVxdWVzdFBhcmFtcyAmJiBPYmplY3Qua2V5cyhvcHRpb25zLnJlcXVlc3RQYXJhbXMpLmxlbmd0aCA+IDAgPyBVdGlsLmdldFBhcmFtU3RyaW5nKG9wdGlvbnMucmVxdWVzdFBhcmFtcykgOiAnJyk7XG4gICAgLy8gUmVtb3ZlIHN1YmRvbWFpbiBpbiB1cmxcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vRXNyaS9lc3JpLWxlYWZsZXQvaXNzdWVzLzk5MVxuICAgIGlmIChvcHRpb25zLnVybC5pbmRleE9mKCd7c30nKSAhPT0gLTEgJiYgb3B0aW9ucy5zdWJkb21haW5zKSB7XG4gICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsLnJlcGxhY2UoJ3tzfScsIG9wdGlvbnMuc3ViZG9tYWluc1swXSk7XG4gICAgfVxuICAgIHRoaXMuc2VydmljZSA9IG1hcFNlcnZpY2Uob3B0aW9ucyk7XG4gICAgdGhpcy5zZXJ2aWNlLmFkZEV2ZW50UGFyZW50KHRoaXMpO1xuXG4gICAgdmFyIGFyY2dpc29ubGluZSA9IG5ldyBSZWdFeHAoL3RpbGVzLmFyY2dpcyhvbmxpbmUpP1xcLmNvbS9nKTtcbiAgICBpZiAoYXJjZ2lzb25saW5lLnRlc3Qob3B0aW9ucy51cmwpKSB7XG4gICAgICB0aGlzLnRpbGVVcmwgPSB0aGlzLnRpbGVVcmwucmVwbGFjZSgnOi8vdGlsZXMnLCAnOi8vdGlsZXN7c30nKTtcbiAgICAgIG9wdGlvbnMuc3ViZG9tYWlucyA9IFsnMScsICcyJywgJzMnLCAnNCddO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIHRoaXMudGlsZVVybCArPSAoJz90b2tlbj0nICsgdGhpcy5vcHRpb25zLnRva2VuKTtcbiAgICB9XG5cbiAgICAvLyBpbml0IGxheWVyIGJ5IGNhbGxpbmcgVGlsZUxheWVycyBpbml0aWFsaXplIG1ldGhvZFxuICAgIFRpbGVMYXllci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHRoaXMudGlsZVVybCwgb3B0aW9ucyk7XG4gIH0sXG5cbiAgZ2V0VGlsZVVybDogZnVuY3Rpb24gKHRpbGVQb2ludCkge1xuICAgIHZhciB6b29tID0gdGhpcy5fZ2V0Wm9vbUZvclVybCgpO1xuXG4gICAgcmV0dXJuIFV0aWwudGVtcGxhdGUodGhpcy50aWxlVXJsLCBVdGlsLmV4dGVuZCh7XG4gICAgICBzOiB0aGlzLl9nZXRTdWJkb21haW4odGlsZVBvaW50KSxcbiAgICAgIHg6IHRpbGVQb2ludC54LFxuICAgICAgeTogdGlsZVBvaW50LnksXG4gICAgICAvLyB0cnkgbG9kIG1hcCBmaXJzdCwgdGhlbiBqdXN0IGRlZmF1bHQgdG8gem9vbSBsZXZlbFxuICAgICAgejogKHRoaXMuX2xvZE1hcCAmJiB0aGlzLl9sb2RNYXBbem9vbV0pID8gdGhpcy5fbG9kTWFwW3pvb21dIDogem9vbVxuICAgIH0sIHRoaXMub3B0aW9ucykpO1xuICB9LFxuXG4gIGNyZWF0ZVRpbGU6IGZ1bmN0aW9uIChjb29yZHMsIGRvbmUpIHtcbiAgICB2YXIgdGlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuXG4gICAgRG9tRXZlbnQub24odGlsZSwgJ2xvYWQnLCBVdGlsLmJpbmQodGhpcy5fdGlsZU9uTG9hZCwgdGhpcywgZG9uZSwgdGlsZSkpO1xuICAgIERvbUV2ZW50Lm9uKHRpbGUsICdlcnJvcicsIFV0aWwuYmluZCh0aGlzLl90aWxlT25FcnJvciwgdGhpcywgZG9uZSwgdGlsZSkpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jcm9zc09yaWdpbikge1xuICAgICAgdGlsZS5jcm9zc09yaWdpbiA9ICcnO1xuICAgIH1cblxuICAgIC8qXG4gICAgIEFsdCB0YWcgaXMgc2V0IHRvIGVtcHR5IHN0cmluZyB0byBrZWVwIHNjcmVlbiByZWFkZXJzIGZyb20gcmVhZGluZyBVUkwgYW5kIGZvciBjb21wbGlhbmNlIHJlYXNvbnNcbiAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLVRFQ0hTL0g2N1xuICAgICovXG4gICAgdGlsZS5hbHQgPSAnJztcblxuICAgIC8vIGlmIHRoZXJlIGlzIG5vIGxvZCBtYXAgb3IgYW4gbG9kIG1hcCB3aXRoIGEgcHJvcGVyIHpvb20gbG9hZCB0aGUgdGlsZVxuICAgIC8vIG90aGVyd2lzZSB3YWl0IGZvciB0aGUgbG9kIG1hcCB0byBiZWNvbWUgYXZhaWxhYmxlXG4gICAgaWYgKCF0aGlzLl9sb2RNYXAgfHwgKHRoaXMuX2xvZE1hcCAmJiB0aGlzLl9sb2RNYXBbdGhpcy5fZ2V0Wm9vbUZvclVybCgpXSkpIHtcbiAgICAgIHRpbGUuc3JjID0gdGhpcy5nZXRUaWxlVXJsKGNvb3Jkcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25jZSgnbG9kbWFwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB0aWxlLnNyYyA9IHRoaXMuZ2V0VGlsZVVybChjb29yZHMpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbGU7XG4gIH0sXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICAvLyBpbmNsdWRlICdQb3dlcmVkIGJ5IEVzcmknIGluIG1hcCBhdHRyaWJ1dGlvblxuICAgIHNldEVzcmlBdHRyaWJ1dGlvbihtYXApO1xuXG4gICAgaWYgKCF0aGlzLl9sb2RNYXApIHtcbiAgICAgIHRoaXMubWV0YWRhdGEoZnVuY3Rpb24gKGVycm9yLCBtZXRhZGF0YSkge1xuICAgICAgICBpZiAoIWVycm9yICYmIG1ldGFkYXRhLnNwYXRpYWxSZWZlcmVuY2UpIHtcbiAgICAgICAgICB2YXIgc3IgPSBtZXRhZGF0YS5zcGF0aWFsUmVmZXJlbmNlLmxhdGVzdFdraWQgfHwgbWV0YWRhdGEuc3BhdGlhbFJlZmVyZW5jZS53a2lkO1xuICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIGNvcHlyaWdodCB0ZXh0IGZyb20gdGhlIHNlcnZpY2UgdXNpbmcgbGVhZmxldCdzIGF0dHJpYnV0aW9uIGNvbnRyb2xcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbiAmJiBtYXAuYXR0cmlidXRpb25Db250cm9sICYmIG1ldGFkYXRhLmNvcHlyaWdodFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbiA9IG1ldGFkYXRhLmNvcHlyaWdodFRleHQ7XG4gICAgICAgICAgICBtYXAuYXR0cmlidXRpb25Db250cm9sLmFkZEF0dHJpYnV0aW9uKHRoaXMuZ2V0QXR0cmlidXRpb24oKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaWYgdGhlIHNlcnZpY2UgdGlsZXMgd2VyZSBwdWJsaXNoZWQgaW4gd2ViIG1lcmNhdG9yIHVzaW5nIGNvbnZlbnRpb25hbCBMT0RzIGJ1dCBtaXNzaW5nIGxldmVscywgd2UgY2FuIHRyeSBhbmQgcmVtYXAgdGhlbVxuICAgICAgICAgIGlmIChtYXAub3B0aW9ucy5jcnMgPT09IENSUy5FUFNHMzg1NyAmJiAoc3IgPT09IDEwMjEwMCB8fCBzciA9PT0gMzg1NykpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZE1hcCA9IHt9O1xuICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSB6b29tIGxldmVsIGRhdGFcbiAgICAgICAgICAgIHZhciBhcmNnaXNMT0RzID0gbWV0YWRhdGEudGlsZUluZm8ubG9kcztcbiAgICAgICAgICAgIHZhciBjb3JyZWN0UmVzb2x1dGlvbnMgPSBUaWxlZE1hcExheWVyLk1lcmNhdG9yWm9vbUxldmVscztcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmNnaXNMT0RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBhcmNnaXNMT0QgPSBhcmNnaXNMT0RzW2ldO1xuICAgICAgICAgICAgICBmb3IgKHZhciBjaSBpbiBjb3JyZWN0UmVzb2x1dGlvbnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29ycmVjdFJlcyA9IGNvcnJlY3RSZXNvbHV0aW9uc1tjaV07XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fd2l0aGluUGVyY2VudGFnZShhcmNnaXNMT0QucmVzb2x1dGlvbiwgY29ycmVjdFJlcywgdGhpcy5vcHRpb25zLnpvb21PZmZzZXRBbGxvd2FuY2UpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9sb2RNYXBbY2ldID0gYXJjZ2lzTE9ELmxldmVsO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmlyZSgnbG9kbWFwJyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtYXAub3B0aW9ucy5jcnMgJiYgbWFwLm9wdGlvbnMuY3JzLmNvZGUgJiYgKG1hcC5vcHRpb25zLmNycy5jb2RlLmluZGV4T2Yoc3IpID4gLTEpKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgcHJvamVjdGlvbiBpcyBXR1M4NCwgb3IgdGhlIGRldmVsb3BlciBpcyB1c2luZyBQcm9qNCB0byBkZWZpbmUgYSBjdXN0b20gQ1JTLCBubyBhY3Rpb24gaXMgcmVxdWlyZWRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgdGhlIHNlcnZpY2Ugd2FzIGNhY2hlZCBpbiBhIGN1c3RvbSBwcm9qZWN0aW9uIGFuZCBhbiBhcHByb3ByaWF0ZSBMT0QgaGFzbid0IGJlZW4gZGVmaW5lZCBpbiB0aGUgbWFwLCBndWlkZSB0aGUgZGV2ZWxvcGVyIHRvIG91ciBQcm9qNCBzYW1wbGVcbiAgICAgICAgICAgIHdhcm4oJ0wuZXNyaS5UaWxlZE1hcExheWVyIGlzIHVzaW5nIGEgbm9uLW1lcmNhdG9yIHNwYXRpYWwgcmVmZXJlbmNlLiBTdXBwb3J0IG1heSBiZSBhdmFpbGFibGUgdGhyb3VnaCBQcm9qNExlYWZsZXQgaHR0cDovL2VzcmkuZ2l0aHViLmlvL2VzcmktbGVhZmxldC9leGFtcGxlcy9ub24tbWVyY2F0b3ItcHJvamVjdGlvbi5odG1sJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG5cbiAgICBUaWxlTGF5ZXIucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcywgbWFwKTtcbiAgfSxcblxuICBtZXRhZGF0YTogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5zZXJ2aWNlLm1ldGFkYXRhKGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBpZGVudGlmeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuaWRlbnRpZnkoKTtcbiAgfSxcblxuICBmaW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS5maW5kKCk7XG4gIH0sXG5cbiAgcXVlcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnF1ZXJ5KCk7XG4gIH0sXG5cbiAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB2YXIgdG9rZW5RcyA9ICc/dG9rZW49JyArIHRva2VuO1xuICAgIHRoaXMudGlsZVVybCA9ICh0aGlzLm9wdGlvbnMudG9rZW4pID8gdGhpcy50aWxlVXJsLnJlcGxhY2UoL1xcP3Rva2VuPSguKykvZywgdG9rZW5RcykgOiB0aGlzLnRpbGVVcmwgKyB0b2tlblFzO1xuICAgIHRoaXMub3B0aW9ucy50b2tlbiA9IHRva2VuO1xuICAgIHRoaXMuc2VydmljZS5hdXRoZW50aWNhdGUodG9rZW4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIF93aXRoaW5QZXJjZW50YWdlOiBmdW5jdGlvbiAoYSwgYiwgcGVyY2VudGFnZSkge1xuICAgIHZhciBkaWZmID0gTWF0aC5hYnMoKGEgLyBiKSAtIDEpO1xuICAgIHJldHVybiBkaWZmIDwgcGVyY2VudGFnZTtcbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWxlZE1hcExheWVyICh1cmwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBUaWxlZE1hcExheWVyKHVybCwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRpbGVkTWFwTGF5ZXI7XG4iLCJpbXBvcnQgeyBJbWFnZU92ZXJsYXksIENSUywgRG9tVXRpbCwgVXRpbCwgTGF5ZXIsIHBvcHVwLCBsYXRMbmcsIGJvdW5kcyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgY29ycyB9IGZyb20gJy4uL1N1cHBvcnQnO1xuaW1wb3J0IHsgc2V0RXNyaUF0dHJpYnV0aW9uIH0gZnJvbSAnLi4vVXRpbCc7XG5cbnZhciBPdmVybGF5ID0gSW1hZ2VPdmVybGF5LmV4dGVuZCh7XG4gIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgdGhpcy5fdG9wTGVmdCA9IG1hcC5nZXRQaXhlbEJvdW5kcygpLm1pbjtcbiAgICBJbWFnZU92ZXJsYXkucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcywgbWFwKTtcbiAgfSxcbiAgX3Jlc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX21hcC5vcHRpb25zLmNycyA9PT0gQ1JTLkVQU0czODU3KSB7XG4gICAgICBJbWFnZU92ZXJsYXkucHJvdG90eXBlLl9yZXNldC5jYWxsKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBEb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuX2ltYWdlLCB0aGlzLl90b3BMZWZ0LnN1YnRyYWN0KHRoaXMuX21hcC5nZXRQaXhlbE9yaWdpbigpKSk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IHZhciBSYXN0ZXJMYXllciA9IExheWVyLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBvcGFjaXR5OiAxLFxuICAgIHBvc2l0aW9uOiAnZnJvbnQnLFxuICAgIGY6ICdpbWFnZScsXG4gICAgdXNlQ29yczogY29ycyxcbiAgICBhdHRyaWJ1dGlvbjogbnVsbCxcbiAgICBpbnRlcmFjdGl2ZTogZmFsc2UsXG4gICAgYWx0OiAnJ1xuICB9LFxuXG4gIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgLy8gaW5jbHVkZSAnUG93ZXJlZCBieSBFc3JpJyBpbiBtYXAgYXR0cmlidXRpb25cbiAgICBzZXRFc3JpQXR0cmlidXRpb24obWFwKTtcblxuICAgIHRoaXMuX3VwZGF0ZSA9IFV0aWwudGhyb3R0bGUodGhpcy5fdXBkYXRlLCB0aGlzLm9wdGlvbnMudXBkYXRlSW50ZXJ2YWwsIHRoaXMpO1xuXG4gICAgbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlLCB0aGlzKTtcblxuICAgIC8vIGlmIHdlIGhhZCBhbiBpbWFnZSBsb2FkZWQgYW5kIGl0IG1hdGNoZXMgdGhlXG4gICAgLy8gY3VycmVudCBib3VuZHMgc2hvdyB0aGUgaW1hZ2Ugb3RoZXJ3aXNlIHJlbW92ZSBpdFxuICAgIGlmICh0aGlzLl9jdXJyZW50SW1hZ2UgJiYgdGhpcy5fY3VycmVudEltYWdlLl9ib3VuZHMuZXF1YWxzKHRoaXMuX21hcC5nZXRCb3VuZHMoKSkpIHtcbiAgICAgIG1hcC5hZGRMYXllcih0aGlzLl9jdXJyZW50SW1hZ2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fY3VycmVudEltYWdlKSB7XG4gICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fY3VycmVudEltYWdlKTtcbiAgICAgIHRoaXMuX2N1cnJlbnRJbWFnZSA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlKCk7XG5cbiAgICBpZiAodGhpcy5fcG9wdXApIHtcbiAgICAgIHRoaXMuX21hcC5vbignY2xpY2snLCB0aGlzLl9nZXRQb3B1cERhdGEsIHRoaXMpO1xuICAgICAgdGhpcy5fbWFwLm9uKCdkYmxjbGljaycsIHRoaXMuX3Jlc2V0UG9wdXBTdGF0ZSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gYWRkIGNvcHlyaWdodCB0ZXh0IGxpc3RlZCBpbiBzZXJ2aWNlIG1ldGFkYXRhXG4gICAgdGhpcy5tZXRhZGF0YShmdW5jdGlvbiAoZXJyLCBtZXRhZGF0YSkge1xuICAgICAgaWYgKCFlcnIgJiYgIXRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbiAmJiBtYXAuYXR0cmlidXRpb25Db250cm9sICYmIG1ldGFkYXRhLmNvcHlyaWdodFRleHQpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uID0gbWV0YWRhdGEuY29weXJpZ2h0VGV4dDtcbiAgICAgICAgbWFwLmF0dHJpYnV0aW9uQ29udHJvbC5hZGRBdHRyaWJ1dGlvbih0aGlzLmdldEF0dHJpYnV0aW9uKCkpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICB9LFxuXG4gIG9uUmVtb3ZlOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRJbWFnZSkge1xuICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX2N1cnJlbnRJbWFnZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BvcHVwKSB7XG4gICAgICB0aGlzLl9tYXAub2ZmKCdjbGljaycsIHRoaXMuX2dldFBvcHVwRGF0YSwgdGhpcyk7XG4gICAgICB0aGlzLl9tYXAub2ZmKCdkYmxjbGljaycsIHRoaXMuX3Jlc2V0UG9wdXBTdGF0ZSwgdGhpcyk7XG4gICAgfVxuXG4gICAgdGhpcy5fbWFwLm9mZignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZSwgdGhpcyk7XG4gIH0sXG5cbiAgYmluZFBvcHVwOiBmdW5jdGlvbiAoZm4sIHBvcHVwT3B0aW9ucykge1xuICAgIHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwID0gZmFsc2U7XG4gICAgdGhpcy5fbGFzdENsaWNrID0gZmFsc2U7XG4gICAgdGhpcy5fcG9wdXAgPSBwb3B1cChwb3B1cE9wdGlvbnMpO1xuICAgIHRoaXMuX3BvcHVwRnVuY3Rpb24gPSBmbjtcbiAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICB0aGlzLl9tYXAub24oJ2NsaWNrJywgdGhpcy5fZ2V0UG9wdXBEYXRhLCB0aGlzKTtcbiAgICAgIHRoaXMuX21hcC5vbignZGJsY2xpY2snLCB0aGlzLl9yZXNldFBvcHVwU3RhdGUsIHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICB1bmJpbmRQb3B1cDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgIHRoaXMuX21hcC5jbG9zZVBvcHVwKHRoaXMuX3BvcHVwKTtcbiAgICAgIHRoaXMuX21hcC5vZmYoJ2NsaWNrJywgdGhpcy5fZ2V0UG9wdXBEYXRhLCB0aGlzKTtcbiAgICAgIHRoaXMuX21hcC5vZmYoJ2RibGNsaWNrJywgdGhpcy5fcmVzZXRQb3B1cFN0YXRlLCB0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5fcG9wdXAgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBicmluZ1RvRnJvbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24gPSAnZnJvbnQnO1xuICAgIGlmICh0aGlzLl9jdXJyZW50SW1hZ2UpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRJbWFnZS5icmluZ1RvRnJvbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgYnJpbmdUb0JhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24gPSAnYmFjayc7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRJbWFnZSkge1xuICAgICAgdGhpcy5fY3VycmVudEltYWdlLmJyaW5nVG9CYWNrKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldEF0dHJpYnV0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbjtcbiAgfSxcblxuICBnZXRPcGFjaXR5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5vcGFjaXR5O1xuICB9LFxuXG4gIHNldE9wYWNpdHk6IGZ1bmN0aW9uIChvcGFjaXR5KSB7XG4gICAgdGhpcy5vcHRpb25zLm9wYWNpdHkgPSBvcGFjaXR5O1xuICAgIGlmICh0aGlzLl9jdXJyZW50SW1hZ2UpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRJbWFnZS5zZXRPcGFjaXR5KG9wYWNpdHkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRUaW1lUmFuZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gW3RoaXMub3B0aW9ucy5mcm9tLCB0aGlzLm9wdGlvbnMudG9dO1xuICB9LFxuXG4gIHNldFRpbWVSYW5nZTogZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gICAgdGhpcy5vcHRpb25zLmZyb20gPSBmcm9tO1xuICAgIHRoaXMub3B0aW9ucy50byA9IHRvO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIG1ldGFkYXRhOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLnNlcnZpY2UubWV0YWRhdGEoY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGF1dGhlbnRpY2F0ZTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmF1dGhlbnRpY2F0ZSh0b2tlbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcmVkcmF3OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gIH0sXG5cbiAgX3JlbmRlckltYWdlOiBmdW5jdGlvbiAodXJsLCBib3VuZHMsIGNvbnRlbnRUeXBlKSB7XG4gICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgLy8gaWYgbm8gb3V0cHV0IGRpcmVjdG9yeSBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIGEgc2VydmljZSwgTUlNRSBkYXRhIHdpbGwgYmUgcmV0dXJuZWRcbiAgICAgIGlmIChjb250ZW50VHlwZSkge1xuICAgICAgICB1cmwgPSAnZGF0YTonICsgY29udGVudFR5cGUgKyAnO2Jhc2U2NCwnICsgdXJsO1xuICAgICAgfVxuICAgICAgLy8gY3JlYXRlIGEgbmV3IGltYWdlIG92ZXJsYXkgYW5kIGFkZCBpdCB0byB0aGUgbWFwXG4gICAgICAvLyB0byBzdGFydCBsb2FkaW5nIHRoZSBpbWFnZVxuICAgICAgLy8gb3BhY2l0eSBpcyAwIHdoaWxlIHRoZSBpbWFnZSBpcyBsb2FkaW5nXG4gICAgICB2YXIgaW1hZ2UgPSBuZXcgT3ZlcmxheSh1cmwsIGJvdW5kcywge1xuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICBjcm9zc09yaWdpbjogdGhpcy5vcHRpb25zLnVzZUNvcnMsXG4gICAgICAgIGFsdDogdGhpcy5vcHRpb25zLmFsdCxcbiAgICAgICAgcGFuZTogdGhpcy5vcHRpb25zLnBhbmUgfHwgdGhpcy5nZXRQYW5lKCksXG4gICAgICAgIGludGVyYWN0aXZlOiB0aGlzLm9wdGlvbnMuaW50ZXJhY3RpdmVcbiAgICAgIH0pLmFkZFRvKHRoaXMuX21hcCk7XG5cbiAgICAgIHZhciBvbk92ZXJsYXlFcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKGltYWdlKTtcbiAgICAgICAgdGhpcy5maXJlKCdlcnJvcicpO1xuICAgICAgICBpbWFnZS5vZmYoJ2xvYWQnLCBvbk92ZXJsYXlMb2FkLCB0aGlzKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBvbk92ZXJsYXlMb2FkID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaW1hZ2Uub2ZmKCdlcnJvcicsIG9uT3ZlcmxheUxvYWQsIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgdmFyIG5ld0ltYWdlID0gZS50YXJnZXQ7XG4gICAgICAgICAgdmFyIG9sZEltYWdlID0gdGhpcy5fY3VycmVudEltYWdlO1xuXG4gICAgICAgICAgLy8gaWYgdGhlIGJvdW5kcyBvZiB0aGlzIGltYWdlIG1hdGNoZXMgdGhlIGJvdW5kcyB0aGF0XG4gICAgICAgICAgLy8gX3JlbmRlckltYWdlIHdhcyBjYWxsZWQgd2l0aCBhbmQgd2UgaGF2ZSBhIG1hcCB3aXRoIHRoZSBzYW1lIGJvdW5kc1xuICAgICAgICAgIC8vIGhpZGUgdGhlIG9sZCBpbWFnZSBpZiB0aGVyZSBpcyBvbmUgYW5kIHNldCB0aGUgb3BhY2l0eVxuICAgICAgICAgIC8vIG9mIHRoZSBuZXcgaW1hZ2Ugb3RoZXJ3aXNlIHJlbW92ZSB0aGUgbmV3IGltYWdlXG4gICAgICAgICAgaWYgKG5ld0ltYWdlLl9ib3VuZHMuZXF1YWxzKGJvdW5kcykgJiYgbmV3SW1hZ2UuX2JvdW5kcy5lcXVhbHModGhpcy5fbWFwLmdldEJvdW5kcygpKSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudEltYWdlID0gbmV3SW1hZ2U7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24gPT09ICdmcm9udCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5icmluZ1RvRnJvbnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuYnJpbmdUb0JhY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcCAmJiB0aGlzLl9jdXJyZW50SW1hZ2UuX21hcCkge1xuICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW1hZ2Uuc2V0T3BhY2l0eSh0aGlzLm9wdGlvbnMub3BhY2l0eSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SW1hZ2UuX21hcC5yZW1vdmVMYXllcih0aGlzLl9jdXJyZW50SW1hZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob2xkSW1hZ2UgJiYgdGhpcy5fbWFwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX21hcC5yZW1vdmVMYXllcihvbGRJbWFnZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvbGRJbWFnZSAmJiBvbGRJbWFnZS5fbWFwKSB7XG4gICAgICAgICAgICAgIG9sZEltYWdlLl9tYXAucmVtb3ZlTGF5ZXIob2xkSW1hZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIobmV3SW1hZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnbG9hZCcsIHtcbiAgICAgICAgICBib3VuZHM6IGJvdW5kc1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIElmIGxvYWRpbmcgdGhlIGltYWdlIGZhaWxzXG4gICAgICBpbWFnZS5vbmNlKCdlcnJvcicsIG9uT3ZlcmxheUVycm9yLCB0aGlzKTtcblxuICAgICAgLy8gb25jZSB0aGUgaW1hZ2UgbG9hZHNcbiAgICAgIGltYWdlLm9uY2UoJ2xvYWQnLCBvbk92ZXJsYXlMb2FkLCB0aGlzKTtcblxuICAgICAgdGhpcy5maXJlKCdsb2FkaW5nJywge1xuICAgICAgICBib3VuZHM6IGJvdW5kc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIF91cGRhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX21hcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKTtcbiAgICB2YXIgYm91bmRzID0gdGhpcy5fbWFwLmdldEJvdW5kcygpO1xuXG4gICAgaWYgKHRoaXMuX2FuaW1hdGluZ1pvb20pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbWFwLl9wYW5UcmFuc2l0aW9uICYmIHRoaXMuX21hcC5fcGFuVHJhbnNpdGlvbi5faW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh6b29tID4gdGhpcy5vcHRpb25zLm1heFpvb20gfHwgem9vbSA8IHRoaXMub3B0aW9ucy5taW5ab29tKSB7XG4gICAgICBpZiAodGhpcy5fY3VycmVudEltYWdlKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRJbWFnZS5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX2N1cnJlbnRJbWFnZSk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRJbWFnZSA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHBhcmFtcyA9IHRoaXMuX2J1aWxkRXhwb3J0UGFyYW1zKCk7XG4gICAgVXRpbC5leHRlbmQocGFyYW1zLCB0aGlzLm9wdGlvbnMucmVxdWVzdFBhcmFtcyk7XG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0RXhwb3J0KHBhcmFtcywgYm91bmRzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2N1cnJlbnRJbWFnZSkge1xuICAgICAgdGhpcy5fY3VycmVudEltYWdlLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fY3VycmVudEltYWdlKTtcbiAgICAgIHRoaXMuX2N1cnJlbnRJbWFnZSA9IG51bGw7XG4gICAgfVxuICB9LFxuXG4gIF9yZW5kZXJQb3B1cDogZnVuY3Rpb24gKGxhdGxuZywgZXJyb3IsIHJlc3VsdHMsIHJlc3BvbnNlKSB7XG4gICAgbGF0bG5nID0gbGF0TG5nKGxhdGxuZyk7XG4gICAgaWYgKHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwICYmIHRoaXMuX2xhc3RDbGljay5lcXVhbHMobGF0bG5nKSkge1xuICAgICAgLy8gYWRkIHRoZSBwb3B1cCB0byB0aGUgbWFwIHdoZXJlIHRoZSBtb3VzZSB3YXMgY2xpY2tlZCBhdFxuICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLl9wb3B1cEZ1bmN0aW9uKGVycm9yLCByZXN1bHRzLCByZXNwb25zZSk7XG4gICAgICBpZiAoY29udGVudCkge1xuICAgICAgICB0aGlzLl9wb3B1cC5zZXRMYXRMbmcobGF0bG5nKS5zZXRDb250ZW50KGNvbnRlbnQpLm9wZW5Pbih0aGlzLl9tYXApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBfcmVzZXRQb3B1cFN0YXRlOiBmdW5jdGlvbiAoZSkge1xuICAgIHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwID0gZmFsc2U7XG4gICAgdGhpcy5fbGFzdENsaWNrID0gZS5sYXRsbmc7XG4gIH0sXG5cbiAgX2NhbGN1bGF0ZUJib3g6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGl4ZWxCb3VuZHMgPSB0aGlzLl9tYXAuZ2V0UGl4ZWxCb3VuZHMoKTtcblxuICAgIHZhciBzdyA9IHRoaXMuX21hcC51bnByb2plY3QocGl4ZWxCb3VuZHMuZ2V0Qm90dG9tTGVmdCgpKTtcbiAgICB2YXIgbmUgPSB0aGlzLl9tYXAudW5wcm9qZWN0KHBpeGVsQm91bmRzLmdldFRvcFJpZ2h0KCkpO1xuXG4gICAgdmFyIG5lUHJvamVjdGVkID0gdGhpcy5fbWFwLm9wdGlvbnMuY3JzLnByb2plY3QobmUpO1xuICAgIHZhciBzd1Byb2plY3RlZCA9IHRoaXMuX21hcC5vcHRpb25zLmNycy5wcm9qZWN0KHN3KTtcblxuICAgIC8vIHRoaXMgZW5zdXJlcyBuZS9zdyBhcmUgc3dpdGNoZWQgaW4gcG9sYXIgbWFwcyB3aGVyZSBub3J0aC90b3AgYm90dG9tL3NvdXRoIGlzIGludmVydGVkXG4gICAgdmFyIGJvdW5kc1Byb2plY3RlZCA9IGJvdW5kcyhuZVByb2plY3RlZCwgc3dQcm9qZWN0ZWQpO1xuXG4gICAgcmV0dXJuIFtib3VuZHNQcm9qZWN0ZWQuZ2V0Qm90dG9tTGVmdCgpLngsIGJvdW5kc1Byb2plY3RlZC5nZXRCb3R0b21MZWZ0KCkueSwgYm91bmRzUHJvamVjdGVkLmdldFRvcFJpZ2h0KCkueCwgYm91bmRzUHJvamVjdGVkLmdldFRvcFJpZ2h0KCkueV0uam9pbignLCcpO1xuICB9LFxuXG4gIF9jYWxjdWxhdGVJbWFnZVNpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlbnN1cmUgdGhhdCB3ZSBkb24ndCBhc2sgQXJjR0lTIFNlcnZlciBmb3IgYSB0YWxsZXIgaW1hZ2UgdGhhbiB3ZSBoYXZlIGFjdHVhbCBtYXAgZGlzcGxheWluZyB3aXRoaW4gdGhlIGRpdlxuICAgIHZhciBib3VuZHMgPSB0aGlzLl9tYXAuZ2V0UGl4ZWxCb3VuZHMoKTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuX21hcC5nZXRTaXplKCk7XG5cbiAgICB2YXIgc3cgPSB0aGlzLl9tYXAudW5wcm9qZWN0KGJvdW5kcy5nZXRCb3R0b21MZWZ0KCkpO1xuICAgIHZhciBuZSA9IHRoaXMuX21hcC51bnByb2plY3QoYm91bmRzLmdldFRvcFJpZ2h0KCkpO1xuXG4gICAgdmFyIHRvcCA9IHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQobmUpLnk7XG4gICAgdmFyIGJvdHRvbSA9IHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQoc3cpLnk7XG5cbiAgICBpZiAodG9wID4gMCB8fCBib3R0b20gPCBzaXplLnkpIHtcbiAgICAgIHNpemUueSA9IGJvdHRvbSAtIHRvcDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2l6ZS54ICsgJywnICsgc2l6ZS55O1xuICB9XG59KTtcbiIsImltcG9ydCB7IFV0aWwgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFJhc3RlckxheWVyIH0gZnJvbSAnLi9SYXN0ZXJMYXllcic7XG5pbXBvcnQgeyBnZXRVcmxQYXJhbXMgfSBmcm9tICcuLi9VdGlsJztcbmltcG9ydCBpbWFnZVNlcnZpY2UgZnJvbSAnLi4vU2VydmljZXMvSW1hZ2VTZXJ2aWNlJztcblxuZXhwb3J0IHZhciBJbWFnZU1hcExheWVyID0gUmFzdGVyTGF5ZXIuZXh0ZW5kKHtcblxuICBvcHRpb25zOiB7XG4gICAgdXBkYXRlSW50ZXJ2YWw6IDE1MCxcbiAgICBmb3JtYXQ6ICdqcGdwbmcnLFxuICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgIGY6ICdpbWFnZSdcbiAgfSxcblxuICBxdWVyeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UucXVlcnkoKTtcbiAgfSxcblxuICBpZGVudGlmeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuaWRlbnRpZnkoKTtcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBnZXRVcmxQYXJhbXMob3B0aW9ucyk7XG4gICAgdGhpcy5zZXJ2aWNlID0gaW1hZ2VTZXJ2aWNlKG9wdGlvbnMpO1xuICAgIHRoaXMuc2VydmljZS5hZGRFdmVudFBhcmVudCh0aGlzKTtcblxuICAgIFV0aWwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgfSxcblxuICBzZXRQaXhlbFR5cGU6IGZ1bmN0aW9uIChwaXhlbFR5cGUpIHtcbiAgICB0aGlzLm9wdGlvbnMucGl4ZWxUeXBlID0gcGl4ZWxUeXBlO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldFBpeGVsVHlwZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucGl4ZWxUeXBlO1xuICB9LFxuXG4gIHNldEJhbmRJZHM6IGZ1bmN0aW9uIChiYW5kSWRzKSB7XG4gICAgaWYgKFV0aWwuaXNBcnJheShiYW5kSWRzKSkge1xuICAgICAgdGhpcy5vcHRpb25zLmJhbmRJZHMgPSBiYW5kSWRzLmpvaW4oJywnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcHRpb25zLmJhbmRJZHMgPSBiYW5kSWRzLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldEJhbmRJZHM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmJhbmRJZHM7XG4gIH0sXG5cbiAgc2V0Tm9EYXRhOiBmdW5jdGlvbiAobm9EYXRhLCBub0RhdGFJbnRlcnByZXRhdGlvbikge1xuICAgIGlmIChVdGlsLmlzQXJyYXkobm9EYXRhKSkge1xuICAgICAgdGhpcy5vcHRpb25zLm5vRGF0YSA9IG5vRGF0YS5qb2luKCcsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3B0aW9ucy5ub0RhdGEgPSBub0RhdGEudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKG5vRGF0YUludGVycHJldGF0aW9uKSB7XG4gICAgICB0aGlzLm9wdGlvbnMubm9EYXRhSW50ZXJwcmV0YXRpb24gPSBub0RhdGFJbnRlcnByZXRhdGlvbjtcbiAgICB9XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0Tm9EYXRhOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ub0RhdGE7XG4gIH0sXG5cbiAgZ2V0Tm9EYXRhSW50ZXJwcmV0YXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm5vRGF0YUludGVycHJldGF0aW9uO1xuICB9LFxuXG4gIHNldFJlbmRlcmluZ1J1bGU6IGZ1bmN0aW9uIChyZW5kZXJpbmdSdWxlKSB7XG4gICAgdGhpcy5vcHRpb25zLnJlbmRlcmluZ1J1bGUgPSByZW5kZXJpbmdSdWxlO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICB9LFxuXG4gIGdldFJlbmRlcmluZ1J1bGU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJlbmRlcmluZ1J1bGU7XG4gIH0sXG5cbiAgc2V0TW9zYWljUnVsZTogZnVuY3Rpb24gKG1vc2FpY1J1bGUpIHtcbiAgICB0aGlzLm9wdGlvbnMubW9zYWljUnVsZSA9IG1vc2FpY1J1bGU7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gIH0sXG5cbiAgZ2V0TW9zYWljUnVsZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubW9zYWljUnVsZTtcbiAgfSxcblxuICBfZ2V0UG9wdXBEYXRhOiBmdW5jdGlvbiAoZSkge1xuICAgIHZhciBjYWxsYmFjayA9IFV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIHJlc3VsdHMsIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9IC8vIHdlIHJlYWxseSBjYW4ndCBkbyBhbnl0aGluZyBoZXJlIGJ1dCBhdXRoZW50aWNhdGUgb3IgcmVxdWVzdGVycm9yIHdpbGwgZmlyZVxuICAgICAgc2V0VGltZW91dChVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9yZW5kZXJQb3B1cChlLmxhdGxuZywgZXJyb3IsIHJlc3VsdHMsIHJlc3BvbnNlKTtcbiAgICAgIH0sIHRoaXMpLCAzMDApO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgdmFyIGlkZW50aWZ5UmVxdWVzdCA9IHRoaXMuaWRlbnRpZnkoKS5hdChlLmxhdGxuZyk7XG5cbiAgICAvLyBzZXQgbW9zYWljIHJ1bGUgZm9yIGlkZW50aWZ5IHRhc2sgaWYgaXQgaXMgc2V0IGZvciBsYXllclxuICAgIGlmICh0aGlzLm9wdGlvbnMubW9zYWljUnVsZSkge1xuICAgICAgaWRlbnRpZnlSZXF1ZXN0LnNldE1vc2FpY1J1bGUodGhpcy5vcHRpb25zLm1vc2FpY1J1bGUpO1xuICAgICAgLy8gQFRPRE86IGZvcmNlIHJldHVybiBjYXRhbG9nIGl0ZW1zIHRvbz9cbiAgICB9XG5cbiAgICAvLyBAVE9ETzogc2V0IHJlbmRlcmluZyBydWxlPyBOb3Qgc3VyZSxcbiAgICAvLyBzb21ldGltZXMgeW91IHdhbnQgcmF3IHBpeGVsIHZhbHVlc1xuICAgIC8vIGlmICh0aGlzLm9wdGlvbnMucmVuZGVyaW5nUnVsZSkge1xuICAgIC8vICAgaWRlbnRpZnlSZXF1ZXN0LnNldFJlbmRlcmluZ1J1bGUodGhpcy5vcHRpb25zLnJlbmRlcmluZ1J1bGUpO1xuICAgIC8vIH1cblxuICAgIGlkZW50aWZ5UmVxdWVzdC5ydW4oY2FsbGJhY2spO1xuXG4gICAgLy8gc2V0IHRoZSBmbGFncyB0byBzaG93IHRoZSBwb3B1cFxuICAgIHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwID0gdHJ1ZTtcbiAgICB0aGlzLl9sYXN0Q2xpY2sgPSBlLmxhdGxuZztcbiAgfSxcblxuICBfYnVpbGRFeHBvcnRQYXJhbXM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3IgPSBwYXJzZUludCh0aGlzLl9tYXAub3B0aW9ucy5jcnMuY29kZS5zcGxpdCgnOicpWzFdLCAxMCk7XG5cbiAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgYmJveDogdGhpcy5fY2FsY3VsYXRlQmJveCgpLFxuICAgICAgc2l6ZTogdGhpcy5fY2FsY3VsYXRlSW1hZ2VTaXplKCksXG4gICAgICBmb3JtYXQ6IHRoaXMub3B0aW9ucy5mb3JtYXQsXG4gICAgICB0cmFuc3BhcmVudDogdGhpcy5vcHRpb25zLnRyYW5zcGFyZW50LFxuICAgICAgYmJveFNSOiBzcixcbiAgICAgIGltYWdlU1I6IHNyXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZnJvbSAmJiB0aGlzLm9wdGlvbnMudG8pIHtcbiAgICAgIHBhcmFtcy50aW1lID0gdGhpcy5vcHRpb25zLmZyb20udmFsdWVPZigpICsgJywnICsgdGhpcy5vcHRpb25zLnRvLnZhbHVlT2YoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnBpeGVsVHlwZSkge1xuICAgICAgcGFyYW1zLnBpeGVsVHlwZSA9IHRoaXMub3B0aW9ucy5waXhlbFR5cGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uKSB7XG4gICAgICBwYXJhbXMuaW50ZXJwb2xhdGlvbiA9IHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcHJlc3Npb25RdWFsaXR5KSB7XG4gICAgICBwYXJhbXMuY29tcHJlc3Npb25RdWFsaXR5ID0gdGhpcy5vcHRpb25zLmNvbXByZXNzaW9uUXVhbGl0eTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmJhbmRJZHMpIHtcbiAgICAgIHBhcmFtcy5iYW5kSWRzID0gdGhpcy5vcHRpb25zLmJhbmRJZHM7XG4gICAgfVxuXG4gICAgLy8gMCBpcyBmYWxzeSAqYW5kKiBhIHZhbGlkIGlucHV0IHBhcmFtZXRlclxuICAgIGlmICh0aGlzLm9wdGlvbnMubm9EYXRhID09PSAwIHx8IHRoaXMub3B0aW9ucy5ub0RhdGEpIHtcbiAgICAgIHBhcmFtcy5ub0RhdGEgPSB0aGlzLm9wdGlvbnMubm9EYXRhO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubm9EYXRhSW50ZXJwcmV0YXRpb24pIHtcbiAgICAgIHBhcmFtcy5ub0RhdGFJbnRlcnByZXRhdGlvbiA9IHRoaXMub3B0aW9ucy5ub0RhdGFJbnRlcnByZXRhdGlvbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXJ2aWNlLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgIHBhcmFtcy50b2tlbiA9IHRoaXMuc2VydmljZS5vcHRpb25zLnRva2VuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucmVuZGVyaW5nUnVsZSkge1xuICAgICAgcGFyYW1zLnJlbmRlcmluZ1J1bGUgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMucmVuZGVyaW5nUnVsZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5tb3NhaWNSdWxlKSB7XG4gICAgICBwYXJhbXMubW9zYWljUnVsZSA9IEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5tb3NhaWNSdWxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9LFxuXG4gIF9yZXF1ZXN0RXhwb3J0OiBmdW5jdGlvbiAocGFyYW1zLCBib3VuZHMpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmYgPT09ICdqc29uJykge1xuICAgICAgdGhpcy5zZXJ2aWNlLnJlcXVlc3QoJ2V4cG9ydEltYWdlJywgcGFyYW1zLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChlcnJvcikgeyByZXR1cm47IH0gLy8gd2UgcmVhbGx5IGNhbid0IGRvIGFueXRoaW5nIGhlcmUgYnV0IGF1dGhlbnRpY2F0ZSBvciByZXF1ZXN0ZXJyb3Igd2lsbCBmaXJlXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgICAgICByZXNwb25zZS5ocmVmICs9ICgnP3Rva2VuPScgKyB0aGlzLm9wdGlvbnMudG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbmRlckltYWdlKHJlc3BvbnNlLmhyZWYsIGJvdW5kcyk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zLmYgPSAnaW1hZ2UnO1xuICAgICAgdGhpcy5fcmVuZGVySW1hZ2UodGhpcy5vcHRpb25zLnVybCArICdleHBvcnRJbWFnZScgKyBVdGlsLmdldFBhcmFtU3RyaW5nKHBhcmFtcyksIGJvdW5kcyk7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlTWFwTGF5ZXIgKHVybCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEltYWdlTWFwTGF5ZXIodXJsLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW1hZ2VNYXBMYXllcjtcbiIsImltcG9ydCB7IFV0aWwgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IFJhc3RlckxheWVyIH0gZnJvbSAnLi9SYXN0ZXJMYXllcic7XG5pbXBvcnQgeyBnZXRVcmxQYXJhbXMgfSBmcm9tICcuLi9VdGlsJztcbmltcG9ydCBtYXBTZXJ2aWNlIGZyb20gJy4uL1NlcnZpY2VzL01hcFNlcnZpY2UnO1xuXG5leHBvcnQgdmFyIER5bmFtaWNNYXBMYXllciA9IFJhc3RlckxheWVyLmV4dGVuZCh7XG5cbiAgb3B0aW9uczoge1xuICAgIHVwZGF0ZUludGVydmFsOiAxNTAsXG4gICAgbGF5ZXJzOiBmYWxzZSxcbiAgICBsYXllckRlZnM6IGZhbHNlLFxuICAgIHRpbWVPcHRpb25zOiBmYWxzZSxcbiAgICBmb3JtYXQ6ICdwbmcyNCcsXG4gICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgZjogJ2pzb24nXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gZ2V0VXJsUGFyYW1zKG9wdGlvbnMpO1xuICAgIHRoaXMuc2VydmljZSA9IG1hcFNlcnZpY2Uob3B0aW9ucyk7XG4gICAgdGhpcy5zZXJ2aWNlLmFkZEV2ZW50UGFyZW50KHRoaXMpO1xuXG4gICAgaWYgKChvcHRpb25zLnByb3h5IHx8IG9wdGlvbnMudG9rZW4pICYmIG9wdGlvbnMuZiAhPT0gJ2pzb24nKSB7XG4gICAgICBvcHRpb25zLmYgPSAnanNvbic7XG4gICAgfVxuXG4gICAgVXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xuICB9LFxuXG4gIGdldER5bmFtaWNMYXllcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmR5bmFtaWNMYXllcnM7XG4gIH0sXG5cbiAgc2V0RHluYW1pY0xheWVyczogZnVuY3Rpb24gKGR5bmFtaWNMYXllcnMpIHtcbiAgICB0aGlzLm9wdGlvbnMuZHluYW1pY0xheWVycyA9IGR5bmFtaWNMYXllcnM7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0TGF5ZXJzOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYXllcnM7XG4gIH0sXG5cbiAgc2V0TGF5ZXJzOiBmdW5jdGlvbiAobGF5ZXJzKSB7XG4gICAgdGhpcy5vcHRpb25zLmxheWVycyA9IGxheWVycztcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBnZXRMYXllckRlZnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxheWVyRGVmcztcbiAgfSxcblxuICBzZXRMYXllckRlZnM6IGZ1bmN0aW9uIChsYXllckRlZnMpIHtcbiAgICB0aGlzLm9wdGlvbnMubGF5ZXJEZWZzID0gbGF5ZXJEZWZzO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGdldFRpbWVPcHRpb25zOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50aW1lT3B0aW9ucztcbiAgfSxcblxuICBzZXRUaW1lT3B0aW9uczogZnVuY3Rpb24gKHRpbWVPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zLnRpbWVPcHRpb25zID0gdGltZU9wdGlvbnM7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcXVlcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnF1ZXJ5KCk7XG4gIH0sXG5cbiAgaWRlbnRpZnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmlkZW50aWZ5KCk7XG4gIH0sXG5cbiAgZmluZDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZmluZCgpO1xuICB9LFxuXG4gIF9nZXRQb3B1cERhdGE6IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIGNhbGxiYWNrID0gVXRpbC5iaW5kKGZ1bmN0aW9uIChlcnJvciwgZmVhdHVyZUNvbGxlY3Rpb24sIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9IC8vIHdlIHJlYWxseSBjYW4ndCBkbyBhbnl0aGluZyBoZXJlIGJ1dCBhdXRoZW50aWNhdGUgb3IgcmVxdWVzdGVycm9yIHdpbGwgZmlyZVxuICAgICAgc2V0VGltZW91dChVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9yZW5kZXJQb3B1cChlLmxhdGxuZywgZXJyb3IsIGZlYXR1cmVDb2xsZWN0aW9uLCByZXNwb25zZSk7XG4gICAgICB9LCB0aGlzKSwgMzAwKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHZhciBpZGVudGlmeVJlcXVlc3Q7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5wb3B1cCkge1xuICAgICAgaWRlbnRpZnlSZXF1ZXN0ID0gdGhpcy5vcHRpb25zLnBvcHVwLm9uKHRoaXMuX21hcCkuYXQoZS5sYXRsbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZGVudGlmeVJlcXVlc3QgPSB0aGlzLmlkZW50aWZ5KCkub24odGhpcy5fbWFwKS5hdChlLmxhdGxuZyk7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGV4dHJhbmVvdXMgdmVydGljZXMgZnJvbSByZXNwb25zZSBmZWF0dXJlcyBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBkb25lXG4gICAgaWRlbnRpZnlSZXF1ZXN0LnBhcmFtcy5tYXhBbGxvd2FibGVPZmZzZXQgPyB0cnVlIDogaWRlbnRpZnlSZXF1ZXN0LnNpbXBsaWZ5KHRoaXMuX21hcCwgMC41KTtcblxuICAgIGlmICghKHRoaXMub3B0aW9ucy5wb3B1cCAmJiB0aGlzLm9wdGlvbnMucG9wdXAucGFyYW1zICYmIHRoaXMub3B0aW9ucy5wb3B1cC5wYXJhbXMubGF5ZXJzKSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5sYXllcnMpIHtcbiAgICAgICAgaWRlbnRpZnlSZXF1ZXN0LmxheWVycygndmlzaWJsZTonICsgdGhpcy5vcHRpb25zLmxheWVycy5qb2luKCcsJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWRlbnRpZnlSZXF1ZXN0LmxheWVycygndmlzaWJsZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHByZXNlbnQsIHBhc3MgbGF5ZXIgaWRzIGFuZCBzcWwgZmlsdGVycyB0aHJvdWdoIHRvIHRoZSBpZGVudGlmeSB0YXNrXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYXllckRlZnMgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5sYXllckRlZnMgIT09ICdzdHJpbmcnICYmICFpZGVudGlmeVJlcXVlc3QucGFyYW1zLmxheWVyRGVmcykge1xuICAgICAgZm9yICh2YXIgaWQgaW4gdGhpcy5vcHRpb25zLmxheWVyRGVmcykge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxheWVyRGVmcy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICBpZGVudGlmeVJlcXVlc3QubGF5ZXJEZWYoaWQsIHRoaXMub3B0aW9ucy5sYXllckRlZnNbaWRdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlkZW50aWZ5UmVxdWVzdC5ydW4oY2FsbGJhY2spO1xuXG4gICAgLy8gc2V0IHRoZSBmbGFncyB0byBzaG93IHRoZSBwb3B1cFxuICAgIHRoaXMuX3Nob3VsZFJlbmRlclBvcHVwID0gdHJ1ZTtcbiAgICB0aGlzLl9sYXN0Q2xpY2sgPSBlLmxhdGxuZztcbiAgfSxcblxuICBfYnVpbGRFeHBvcnRQYXJhbXM6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3IgPSBwYXJzZUludCh0aGlzLl9tYXAub3B0aW9ucy5jcnMuY29kZS5zcGxpdCgnOicpWzFdLCAxMCk7XG5cbiAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgYmJveDogdGhpcy5fY2FsY3VsYXRlQmJveCgpLFxuICAgICAgc2l6ZTogdGhpcy5fY2FsY3VsYXRlSW1hZ2VTaXplKCksXG4gICAgICBkcGk6IDk2LFxuICAgICAgZm9ybWF0OiB0aGlzLm9wdGlvbnMuZm9ybWF0LFxuICAgICAgdHJhbnNwYXJlbnQ6IHRoaXMub3B0aW9ucy50cmFuc3BhcmVudCxcbiAgICAgIGJib3hTUjogc3IsXG4gICAgICBpbWFnZVNSOiBzclxuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmR5bmFtaWNMYXllcnMpIHtcbiAgICAgIHBhcmFtcy5keW5hbWljTGF5ZXJzID0gdGhpcy5vcHRpb25zLmR5bmFtaWNMYXllcnM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYXllcnMpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubGF5ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbXMubGF5ZXJzID0gJ3Nob3c6JyArIHRoaXMub3B0aW9ucy5sYXllcnMuam9pbignLCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubGF5ZXJEZWZzKSB7XG4gICAgICBwYXJhbXMubGF5ZXJEZWZzID0gdHlwZW9mIHRoaXMub3B0aW9ucy5sYXllckRlZnMgPT09ICdzdHJpbmcnID8gdGhpcy5vcHRpb25zLmxheWVyRGVmcyA6IEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5sYXllckRlZnMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZU9wdGlvbnMpIHtcbiAgICAgIHBhcmFtcy50aW1lT3B0aW9ucyA9IEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy50aW1lT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5mcm9tICYmIHRoaXMub3B0aW9ucy50bykge1xuICAgICAgcGFyYW1zLnRpbWUgPSB0aGlzLm9wdGlvbnMuZnJvbS52YWx1ZU9mKCkgKyAnLCcgKyB0aGlzLm9wdGlvbnMudG8udmFsdWVPZigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlcnZpY2Uub3B0aW9ucy50b2tlbikge1xuICAgICAgcGFyYW1zLnRva2VuID0gdGhpcy5zZXJ2aWNlLm9wdGlvbnMudG9rZW47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcm94eSkge1xuICAgICAgcGFyYW1zLnByb3h5ID0gdGhpcy5vcHRpb25zLnByb3h5O1xuICAgIH1cblxuICAgIC8vIHVzZSBhIHRpbWVzdGFtcCB0byBidXN0IHNlcnZlciBjYWNoZVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZUNhY2hlKSB7XG4gICAgICBwYXJhbXMuX3RzID0gRGF0ZS5ub3coKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9LFxuXG4gIF9yZXF1ZXN0RXhwb3J0OiBmdW5jdGlvbiAocGFyYW1zLCBib3VuZHMpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmYgPT09ICdqc29uJykge1xuICAgICAgdGhpcy5zZXJ2aWNlLnJlcXVlc3QoJ2V4cG9ydCcsIHBhcmFtcywgZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuOyB9IC8vIHdlIHJlYWxseSBjYW4ndCBkbyBhbnl0aGluZyBoZXJlIGJ1dCBhdXRoZW50aWNhdGUgb3IgcmVxdWVzdGVycm9yIHdpbGwgZmlyZVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW4pIHtcbiAgICAgICAgICByZXNwb25zZS5ocmVmICs9ICgnP3Rva2VuPScgKyB0aGlzLm9wdGlvbnMudG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucHJveHkpIHtcbiAgICAgICAgICByZXNwb25zZS5ocmVmID0gdGhpcy5vcHRpb25zLnByb3h5ICsgJz8nICsgcmVzcG9uc2UuaHJlZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2UuaHJlZikge1xuICAgICAgICAgIHRoaXMuX3JlbmRlckltYWdlKHJlc3BvbnNlLmhyZWYsIGJvdW5kcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcmVuZGVySW1hZ2UocmVzcG9uc2UuaW1hZ2VEYXRhLCBib3VuZHMsIHJlc3BvbnNlLmNvbnRlbnRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtcy5mID0gJ2ltYWdlJztcbiAgICAgIHRoaXMuX3JlbmRlckltYWdlKHRoaXMub3B0aW9ucy51cmwgKyAnZXhwb3J0JyArIFV0aWwuZ2V0UGFyYW1TdHJpbmcocGFyYW1zKSwgYm91bmRzKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZHluYW1pY01hcExheWVyICh1cmwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBEeW5hbWljTWFwTGF5ZXIodXJsLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZHluYW1pY01hcExheWVyO1xuIiwiaW1wb3J0IHtcbiAgYm91bmRzLFxuICBsYXRMbmdCb3VuZHMsXG4gIHBvaW50LFxuICBMYXllcixcbiAgc2V0T3B0aW9ucyxcbiAgVXRpbFxufSBmcm9tICdsZWFmbGV0JztcblxudmFyIFZpcnR1YWxHcmlkID0gTGF5ZXIuZXh0ZW5kKHtcblxuICBvcHRpb25zOiB7XG4gICAgY2VsbFNpemU6IDUxMixcbiAgICB1cGRhdGVJbnRlcnZhbDogMTUwXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLl96b29taW5nID0gZmFsc2U7XG4gIH0sXG5cbiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHtcbiAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgdGhpcy5fdXBkYXRlID0gVXRpbC50aHJvdHRsZSh0aGlzLl91cGRhdGUsIHRoaXMub3B0aW9ucy51cGRhdGVJbnRlcnZhbCwgdGhpcyk7XG4gICAgdGhpcy5fcmVzZXQoKTtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfSxcblxuICBvblJlbW92ZTogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX21hcC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuZ2V0RXZlbnRzKCksIHRoaXMpO1xuICAgIHRoaXMuX3JlbW92ZUNlbGxzKCk7XG4gIH0sXG5cbiAgZ2V0RXZlbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV2ZW50cyA9IHtcbiAgICAgIG1vdmVlbmQ6IHRoaXMuX3VwZGF0ZSxcbiAgICAgIHpvb21zdGFydDogdGhpcy5fem9vbXN0YXJ0LFxuICAgICAgem9vbWVuZDogdGhpcy5fcmVzZXRcbiAgICB9O1xuXG4gICAgcmV0dXJuIGV2ZW50cztcbiAgfSxcblxuICBhZGRUbzogZnVuY3Rpb24gKG1hcCkge1xuICAgIG1hcC5hZGRMYXllcih0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICByZW1vdmVGcm9tOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgbWFwLnJlbW92ZUxheWVyKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIF96b29tc3RhcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl96b29taW5nID0gdHJ1ZTtcbiAgfSxcblxuICBfcmVzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9yZW1vdmVDZWxscygpO1xuXG4gICAgdGhpcy5fY2VsbHMgPSB7fTtcbiAgICB0aGlzLl9hY3RpdmVDZWxscyA9IHt9O1xuICAgIHRoaXMuX2NlbGxzVG9Mb2FkID0gMDtcbiAgICB0aGlzLl9jZWxsc1RvdGFsID0gMDtcbiAgICB0aGlzLl9jZWxsTnVtQm91bmRzID0gdGhpcy5fZ2V0Q2VsbE51bUJvdW5kcygpO1xuXG4gICAgdGhpcy5fcmVzZXRXcmFwKCk7XG4gICAgdGhpcy5fem9vbWluZyA9IGZhbHNlO1xuICB9LFxuXG4gIF9yZXNldFdyYXA6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbWFwID0gdGhpcy5fbWFwO1xuICAgIHZhciBjcnMgPSBtYXAub3B0aW9ucy5jcnM7XG5cbiAgICBpZiAoY3JzLmluZmluaXRlKSB7IHJldHVybjsgfVxuXG4gICAgdmFyIGNlbGxTaXplID0gdGhpcy5fZ2V0Q2VsbFNpemUoKTtcblxuICAgIGlmIChjcnMud3JhcExuZykge1xuICAgICAgdGhpcy5fd3JhcExuZyA9IFtcbiAgICAgICAgTWF0aC5mbG9vcihtYXAucHJvamVjdChbMCwgY3JzLndyYXBMbmdbMF1dKS54IC8gY2VsbFNpemUpLFxuICAgICAgICBNYXRoLmNlaWwobWFwLnByb2plY3QoWzAsIGNycy53cmFwTG5nWzFdXSkueCAvIGNlbGxTaXplKVxuICAgICAgXTtcbiAgICB9XG5cbiAgICBpZiAoY3JzLndyYXBMYXQpIHtcbiAgICAgIHRoaXMuX3dyYXBMYXQgPSBbXG4gICAgICAgIE1hdGguZmxvb3IobWFwLnByb2plY3QoW2Nycy53cmFwTGF0WzBdLCAwXSkueSAvIGNlbGxTaXplKSxcbiAgICAgICAgTWF0aC5jZWlsKG1hcC5wcm9qZWN0KFtjcnMud3JhcExhdFsxXSwgMF0pLnkgLyBjZWxsU2l6ZSlcbiAgICAgIF07XG4gICAgfVxuICB9LFxuXG4gIF9nZXRDZWxsU2l6ZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY2VsbFNpemU7XG4gIH0sXG5cbiAgX3VwZGF0ZTogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG1hcEJvdW5kcyA9IHRoaXMuX21hcC5nZXRQaXhlbEJvdW5kcygpO1xuICAgIHZhciBjZWxsU2l6ZSA9IHRoaXMuX2dldENlbGxTaXplKCk7XG5cbiAgICAvLyBjZWxsIGNvb3JkaW5hdGVzIHJhbmdlIGZvciB0aGUgY3VycmVudCB2aWV3XG4gICAgdmFyIGNlbGxCb3VuZHMgPSBib3VuZHMoXG4gICAgICBtYXBCb3VuZHMubWluLmRpdmlkZUJ5KGNlbGxTaXplKS5mbG9vcigpLFxuICAgICAgbWFwQm91bmRzLm1heC5kaXZpZGVCeShjZWxsU2l6ZSkuZmxvb3IoKSk7XG5cbiAgICB0aGlzLl9yZW1vdmVPdGhlckNlbGxzKGNlbGxCb3VuZHMpO1xuICAgIHRoaXMuX2FkZENlbGxzKGNlbGxCb3VuZHMpO1xuXG4gICAgdGhpcy5maXJlKCdjZWxsc3VwZGF0ZWQnKTtcbiAgfSxcblxuICBfYWRkQ2VsbHM6IGZ1bmN0aW9uIChjZWxsQm91bmRzKSB7XG4gICAgdmFyIHF1ZXVlID0gW107XG4gICAgdmFyIGNlbnRlciA9IGNlbGxCb3VuZHMuZ2V0Q2VudGVyKCk7XG4gICAgdmFyIHpvb20gPSB0aGlzLl9tYXAuZ2V0Wm9vbSgpO1xuXG4gICAgdmFyIGosIGksIGNvb3JkcztcbiAgICAvLyBjcmVhdGUgYSBxdWV1ZSBvZiBjb29yZGluYXRlcyB0byBsb2FkIGNlbGxzIGZyb21cbiAgICBmb3IgKGogPSBjZWxsQm91bmRzLm1pbi55OyBqIDw9IGNlbGxCb3VuZHMubWF4Lnk7IGorKykge1xuICAgICAgZm9yIChpID0gY2VsbEJvdW5kcy5taW4ueDsgaSA8PSBjZWxsQm91bmRzLm1heC54OyBpKyspIHtcbiAgICAgICAgY29vcmRzID0gcG9pbnQoaSwgaik7XG4gICAgICAgIGNvb3Jkcy56ID0gem9vbTtcblxuICAgICAgICBpZiAodGhpcy5faXNWYWxpZENlbGwoY29vcmRzKSkge1xuICAgICAgICAgIHF1ZXVlLnB1c2goY29vcmRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjZWxsc1RvTG9hZCA9IHF1ZXVlLmxlbmd0aDtcblxuICAgIGlmIChjZWxsc1RvTG9hZCA9PT0gMCkgeyByZXR1cm47IH1cblxuICAgIHRoaXMuX2NlbGxzVG9Mb2FkICs9IGNlbGxzVG9Mb2FkO1xuICAgIHRoaXMuX2NlbGxzVG90YWwgKz0gY2VsbHNUb0xvYWQ7XG5cbiAgICAvLyBzb3J0IGNlbGwgcXVldWUgdG8gbG9hZCBjZWxscyBpbiBvcmRlciBvZiB0aGVpciBkaXN0YW5jZSB0byBjZW50ZXJcbiAgICBxdWV1ZS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS5kaXN0YW5jZVRvKGNlbnRlcikgLSBiLmRpc3RhbmNlVG8oY2VudGVyKTtcbiAgICB9KTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBjZWxsc1RvTG9hZDsgaSsrKSB7XG4gICAgICB0aGlzLl9hZGRDZWxsKHF1ZXVlW2ldKTtcbiAgICB9XG4gIH0sXG5cbiAgX2lzVmFsaWRDZWxsOiBmdW5jdGlvbiAoY29vcmRzKSB7XG4gICAgdmFyIGNycyA9IHRoaXMuX21hcC5vcHRpb25zLmNycztcblxuICAgIGlmICghY3JzLmluZmluaXRlKSB7XG4gICAgICAvLyBkb24ndCBsb2FkIGNlbGwgaWYgaXQncyBvdXQgb2YgYm91bmRzIGFuZCBub3Qgd3JhcHBlZFxuICAgICAgdmFyIGNlbGxOdW1Cb3VuZHMgPSB0aGlzLl9jZWxsTnVtQm91bmRzO1xuICAgICAgaWYgKFxuICAgICAgICAoIWNycy53cmFwTG5nICYmIChjb29yZHMueCA8IGNlbGxOdW1Cb3VuZHMubWluLnggfHwgY29vcmRzLnggPiBjZWxsTnVtQm91bmRzLm1heC54KSkgfHxcbiAgICAgICAgKCFjcnMud3JhcExhdCAmJiAoY29vcmRzLnkgPCBjZWxsTnVtQm91bmRzLm1pbi55IHx8IGNvb3Jkcy55ID4gY2VsbE51bUJvdW5kcy5tYXgueSkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5vcHRpb25zLmJvdW5kcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gZG9uJ3QgbG9hZCBjZWxsIGlmIGl0IGRvZXNuJ3QgaW50ZXJzZWN0IHRoZSBib3VuZHMgaW4gb3B0aW9uc1xuICAgIHZhciBjZWxsQm91bmRzID0gdGhpcy5fY2VsbENvb3Jkc1RvQm91bmRzKGNvb3Jkcyk7XG4gICAgcmV0dXJuIGxhdExuZ0JvdW5kcyh0aGlzLm9wdGlvbnMuYm91bmRzKS5pbnRlcnNlY3RzKGNlbGxCb3VuZHMpO1xuICB9LFxuXG4gIC8vIGNvbnZlcnRzIGNlbGwgY29vcmRpbmF0ZXMgdG8gaXRzIGdlb2dyYXBoaWNhbCBib3VuZHNcbiAgX2NlbGxDb29yZHNUb0JvdW5kczogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG4gICAgdmFyIGNlbGxTaXplID0gdGhpcy5vcHRpb25zLmNlbGxTaXplO1xuICAgIHZhciBud1BvaW50ID0gY29vcmRzLm11bHRpcGx5QnkoY2VsbFNpemUpO1xuICAgIHZhciBzZVBvaW50ID0gbndQb2ludC5hZGQoW2NlbGxTaXplLCBjZWxsU2l6ZV0pO1xuICAgIHZhciBudyA9IG1hcC53cmFwTGF0TG5nKG1hcC51bnByb2plY3QobndQb2ludCwgY29vcmRzLnopKTtcbiAgICB2YXIgc2UgPSBtYXAud3JhcExhdExuZyhtYXAudW5wcm9qZWN0KHNlUG9pbnQsIGNvb3Jkcy56KSk7XG5cbiAgICByZXR1cm4gbGF0TG5nQm91bmRzKG53LCBzZSk7XG4gIH0sXG5cbiAgLy8gY29udmVydHMgY2VsbCBjb29yZGluYXRlcyB0byBrZXkgZm9yIHRoZSBjZWxsIGNhY2hlXG4gIF9jZWxsQ29vcmRzVG9LZXk6IGZ1bmN0aW9uIChjb29yZHMpIHtcbiAgICByZXR1cm4gY29vcmRzLnggKyAnOicgKyBjb29yZHMueTtcbiAgfSxcblxuICAvLyBjb252ZXJ0cyBjZWxsIGNhY2hlIGtleSB0byBjb29yZGlhbnRlc1xuICBfa2V5VG9DZWxsQ29vcmRzOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGtBcnIgPSBrZXkuc3BsaXQoJzonKTtcbiAgICB2YXIgeCA9IHBhcnNlSW50KGtBcnJbMF0sIDEwKTtcbiAgICB2YXIgeSA9IHBhcnNlSW50KGtBcnJbMV0sIDEwKTtcblxuICAgIHJldHVybiBwb2ludCh4LCB5KTtcbiAgfSxcblxuICAvLyByZW1vdmUgYW55IHByZXNlbnQgY2VsbHMgdGhhdCBhcmUgb2ZmIHRoZSBzcGVjaWZpZWQgYm91bmRzXG4gIF9yZW1vdmVPdGhlckNlbGxzOiBmdW5jdGlvbiAoYm91bmRzKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuX2NlbGxzKSB7XG4gICAgICBpZiAoIWJvdW5kcy5jb250YWlucyh0aGlzLl9rZXlUb0NlbGxDb29yZHMoa2V5KSkpIHtcbiAgICAgICAgdGhpcy5fcmVtb3ZlQ2VsbChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBfcmVtb3ZlQ2VsbDogZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBjZWxsID0gdGhpcy5fYWN0aXZlQ2VsbHNba2V5XTtcblxuICAgIGlmIChjZWxsKSB7XG4gICAgICBkZWxldGUgdGhpcy5fYWN0aXZlQ2VsbHNba2V5XTtcblxuICAgICAgaWYgKHRoaXMuY2VsbExlYXZlKSB7XG4gICAgICAgIHRoaXMuY2VsbExlYXZlKGNlbGwuYm91bmRzLCBjZWxsLmNvb3Jkcyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlyZSgnY2VsbGxlYXZlJywge1xuICAgICAgICBib3VuZHM6IGNlbGwuYm91bmRzLFxuICAgICAgICBjb29yZHM6IGNlbGwuY29vcmRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX3JlbW92ZUNlbGxzOiBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuX2NlbGxzKSB7XG4gICAgICB2YXIgY2VsbEJvdW5kcyA9IHRoaXMuX2NlbGxzW2tleV0uYm91bmRzO1xuICAgICAgdmFyIGNvb3JkcyA9IHRoaXMuX2NlbGxzW2tleV0uY29vcmRzO1xuXG4gICAgICBpZiAodGhpcy5jZWxsTGVhdmUpIHtcbiAgICAgICAgdGhpcy5jZWxsTGVhdmUoY2VsbEJvdW5kcywgY29vcmRzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maXJlKCdjZWxsbGVhdmUnLCB7XG4gICAgICAgIGJvdW5kczogY2VsbEJvdW5kcyxcbiAgICAgICAgY29vcmRzOiBjb29yZHNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBfYWRkQ2VsbDogZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgIC8vIHdyYXAgY2VsbCBjb29yZHMgaWYgbmVjZXNzYXJ5IChkZXBlbmRpbmcgb24gQ1JTKVxuICAgIHRoaXMuX3dyYXBDb29yZHMoY29vcmRzKTtcblxuICAgIC8vIGdlbmVyYXRlIHRoZSBjZWxsIGtleVxuICAgIHZhciBrZXkgPSB0aGlzLl9jZWxsQ29vcmRzVG9LZXkoY29vcmRzKTtcblxuICAgIC8vIGdldCB0aGUgY2VsbCBmcm9tIHRoZSBjYWNoZVxuICAgIHZhciBjZWxsID0gdGhpcy5fY2VsbHNba2V5XTtcbiAgICAvLyBpZiB0aGlzIGNlbGwgc2hvdWxkIGJlIHNob3duIGFzIGlzbnQgYWN0aXZlIHlldCAoZW50ZXIpXG5cbiAgICBpZiAoY2VsbCAmJiAhdGhpcy5fYWN0aXZlQ2VsbHNba2V5XSkge1xuICAgICAgaWYgKHRoaXMuY2VsbEVudGVyKSB7XG4gICAgICAgIHRoaXMuY2VsbEVudGVyKGNlbGwuYm91bmRzLCBjb29yZHMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpcmUoJ2NlbGxlbnRlcicsIHtcbiAgICAgICAgYm91bmRzOiBjZWxsLmJvdW5kcyxcbiAgICAgICAgY29vcmRzOiBjb29yZHNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9hY3RpdmVDZWxsc1trZXldID0gY2VsbDtcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBkb250IGhhdmUgdGhpcyBjZWxsIGluIHRoZSBjYWNoZSB5ZXQgKGNyZWF0ZSlcbiAgICBpZiAoIWNlbGwpIHtcbiAgICAgIGNlbGwgPSB7XG4gICAgICAgIGNvb3JkczogY29vcmRzLFxuICAgICAgICBib3VuZHM6IHRoaXMuX2NlbGxDb29yZHNUb0JvdW5kcyhjb29yZHMpXG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9jZWxsc1trZXldID0gY2VsbDtcbiAgICAgIHRoaXMuX2FjdGl2ZUNlbGxzW2tleV0gPSBjZWxsO1xuXG4gICAgICBpZiAodGhpcy5jcmVhdGVDZWxsKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2VsbChjZWxsLmJvdW5kcywgY29vcmRzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maXJlKCdjZWxsY3JlYXRlJywge1xuICAgICAgICBib3VuZHM6IGNlbGwuYm91bmRzLFxuICAgICAgICBjb29yZHM6IGNvb3Jkc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIF93cmFwQ29vcmRzOiBmdW5jdGlvbiAoY29vcmRzKSB7XG4gICAgY29vcmRzLnggPSB0aGlzLl93cmFwTG5nID8gVXRpbC53cmFwTnVtKGNvb3Jkcy54LCB0aGlzLl93cmFwTG5nKSA6IGNvb3Jkcy54O1xuICAgIGNvb3Jkcy55ID0gdGhpcy5fd3JhcExhdCA/IFV0aWwud3JhcE51bShjb29yZHMueSwgdGhpcy5fd3JhcExhdCkgOiBjb29yZHMueTtcbiAgfSxcblxuICAvLyBnZXQgdGhlIGdsb2JhbCBjZWxsIGNvb3JkaW5hdGVzIHJhbmdlIGZvciB0aGUgY3VycmVudCB6b29tXG4gIF9nZXRDZWxsTnVtQm91bmRzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHdvcmxkQm91bmRzID0gdGhpcy5fbWFwLmdldFBpeGVsV29ybGRCb3VuZHMoKTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuX2dldENlbGxTaXplKCk7XG5cbiAgICByZXR1cm4gd29ybGRCb3VuZHMgPyBib3VuZHMoXG4gICAgICB3b3JsZEJvdW5kcy5taW4uZGl2aWRlQnkoc2l6ZSkuZmxvb3IoKSxcbiAgICAgIHdvcmxkQm91bmRzLm1heC5kaXZpZGVCeShzaXplKS5jZWlsKCkuc3VidHJhY3QoWzEsIDFdKSkgOiBudWxsO1xuICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgVmlydHVhbEdyaWQ7XG4iLCJmdW5jdGlvbiBCaW5hcnlTZWFyY2hJbmRleCAodmFsdWVzKSB7XG4gIHRoaXMudmFsdWVzID0gW10uY29uY2F0KHZhbHVlcyB8fCBbXSk7XG59XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgaW5kZXggPSB0aGlzLmdldEluZGV4KHZhbHVlKTtcbiAgcmV0dXJuIHRoaXMudmFsdWVzW2luZGV4XTtcbn07XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5nZXRJbmRleCA9IGZ1bmN0aW9uIGdldEluZGV4ICh2YWx1ZSkge1xuICBpZiAodGhpcy5kaXJ0eSkge1xuICAgIHRoaXMuc29ydCgpO1xuICB9XG5cbiAgdmFyIG1pbkluZGV4ID0gMDtcbiAgdmFyIG1heEluZGV4ID0gdGhpcy52YWx1ZXMubGVuZ3RoIC0gMTtcbiAgdmFyIGN1cnJlbnRJbmRleDtcbiAgdmFyIGN1cnJlbnRFbGVtZW50O1xuXG4gIHdoaWxlIChtaW5JbmRleCA8PSBtYXhJbmRleCkge1xuICAgIGN1cnJlbnRJbmRleCA9IChtaW5JbmRleCArIG1heEluZGV4KSAvIDIgfCAwO1xuICAgIGN1cnJlbnRFbGVtZW50ID0gdGhpcy52YWx1ZXNbTWF0aC5yb3VuZChjdXJyZW50SW5kZXgpXTtcbiAgICBpZiAoK2N1cnJlbnRFbGVtZW50LnZhbHVlIDwgK3ZhbHVlKSB7XG4gICAgICBtaW5JbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgfSBlbHNlIGlmICgrY3VycmVudEVsZW1lbnQudmFsdWUgPiArdmFsdWUpIHtcbiAgICAgIG1heEluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gTWF0aC5hYnMofm1heEluZGV4KTtcbn07XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5iZXR3ZWVuID0gZnVuY3Rpb24gYmV0d2VlbiAoc3RhcnQsIGVuZCkge1xuICB2YXIgc3RhcnRJbmRleCA9IHRoaXMuZ2V0SW5kZXgoc3RhcnQpO1xuICB2YXIgZW5kSW5kZXggPSB0aGlzLmdldEluZGV4KGVuZCk7XG5cbiAgaWYgKHN0YXJ0SW5kZXggPT09IDAgJiYgZW5kSW5kZXggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB3aGlsZSAodGhpcy52YWx1ZXNbc3RhcnRJbmRleCAtIDFdICYmIHRoaXMudmFsdWVzW3N0YXJ0SW5kZXggLSAxXS52YWx1ZSA9PT0gc3RhcnQpIHtcbiAgICBzdGFydEluZGV4LS07XG4gIH1cblxuICB3aGlsZSAodGhpcy52YWx1ZXNbZW5kSW5kZXggKyAxXSAmJiB0aGlzLnZhbHVlc1tlbmRJbmRleCArIDFdLnZhbHVlID09PSBlbmQpIHtcbiAgICBlbmRJbmRleCsrO1xuICB9XG5cbiAgaWYgKHRoaXMudmFsdWVzW2VuZEluZGV4XSAmJiB0aGlzLnZhbHVlc1tlbmRJbmRleF0udmFsdWUgPT09IGVuZCAmJiB0aGlzLnZhbHVlc1tlbmRJbmRleCArIDFdKSB7XG4gICAgZW5kSW5kZXgrKztcbiAgfVxuXG4gIHJldHVybiB0aGlzLnZhbHVlcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG59O1xuXG5CaW5hcnlTZWFyY2hJbmRleC5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gaW5zZXJ0IChpdGVtKSB7XG4gIHRoaXMudmFsdWVzLnNwbGljZSh0aGlzLmdldEluZGV4KGl0ZW0udmFsdWUpLCAwLCBpdGVtKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5CaW5hcnlTZWFyY2hJbmRleC5wcm90b3R5cGUuYnVsa0FkZCA9IGZ1bmN0aW9uIGJ1bGtBZGQgKGl0ZW1zLCBzb3J0KSB7XG4gIHRoaXMudmFsdWVzID0gdGhpcy52YWx1ZXMuY29uY2F0KFtdLmNvbmNhdChpdGVtcyB8fCBbXSkpO1xuXG4gIGlmIChzb3J0KSB7XG4gICAgdGhpcy5zb3J0KCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJpbmFyeVNlYXJjaEluZGV4LnByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24gc29ydCAoKSB7XG4gIHRoaXMudmFsdWVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gK2IudmFsdWUgLSArYS52YWx1ZTtcbiAgfSkucmV2ZXJzZSgpO1xuICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQmluYXJ5U2VhcmNoSW5kZXg7XG4iLCJpbXBvcnQgeyBVdGlsIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgZmVhdHVyZUxheWVyU2VydmljZSBmcm9tICcuLi8uLi9TZXJ2aWNlcy9GZWF0dXJlTGF5ZXJTZXJ2aWNlJztcbmltcG9ydCB7IGdldFVybFBhcmFtcywgd2Fybiwgc2V0RXNyaUF0dHJpYnV0aW9uIH0gZnJvbSAnLi4vLi4vVXRpbCc7XG5pbXBvcnQgVmlydHVhbEdyaWQgZnJvbSAnbGVhZmxldC12aXJ0dWFsLWdyaWQnO1xuaW1wb3J0IEJpbmFyeVNlYXJjaEluZGV4IGZyb20gJ3RpbnktYmluYXJ5LXNlYXJjaCc7XG5cbmV4cG9ydCB2YXIgRmVhdHVyZU1hbmFnZXIgPSBWaXJ0dWFsR3JpZC5leHRlbmQoe1xuICAvKipcbiAgICogT3B0aW9uc1xuICAgKi9cblxuICBvcHRpb25zOiB7XG4gICAgYXR0cmlidXRpb246IG51bGwsXG4gICAgd2hlcmU6ICcxPTEnLFxuICAgIGZpZWxkczogWycqJ10sXG4gICAgZnJvbTogZmFsc2UsXG4gICAgdG86IGZhbHNlLFxuICAgIHRpbWVGaWVsZDogZmFsc2UsXG4gICAgdGltZUZpbHRlck1vZGU6ICdzZXJ2ZXInLFxuICAgIHNpbXBsaWZ5RmFjdG9yOiAwLFxuICAgIHByZWNpc2lvbjogNlxuICB9LFxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKi9cblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIFZpcnR1YWxHcmlkLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgICBvcHRpb25zID0gZ2V0VXJsUGFyYW1zKG9wdGlvbnMpO1xuICAgIG9wdGlvbnMgPSBVdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG5cbiAgICB0aGlzLnNlcnZpY2UgPSBmZWF0dXJlTGF5ZXJTZXJ2aWNlKG9wdGlvbnMpO1xuICAgIHRoaXMuc2VydmljZS5hZGRFdmVudFBhcmVudCh0aGlzKTtcblxuICAgIC8vIHVzZSBjYXNlIGluc2Vuc2l0aXZlIHJlZ2V4IHRvIGxvb2sgZm9yIGNvbW1vbiBmaWVsZG5hbWVzIHVzZWQgZm9yIGluZGV4aW5nXG4gICAgaWYgKHRoaXMub3B0aW9ucy5maWVsZHNbMF0gIT09ICcqJykge1xuICAgICAgdmFyIG9pZENoZWNrID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5maWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5maWVsZHNbaV0ubWF0Y2goL14oT0JKRUNUSUR8RklEfE9JRHxJRCkkL2kpKSB7XG4gICAgICAgICAgb2lkQ2hlY2sgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob2lkQ2hlY2sgPT09IGZhbHNlKSB7XG4gICAgICAgIHdhcm4oJ25vIGtub3duIGVzcmlGaWVsZFR5cGVPSUQgZmllbGQgZGV0ZWN0ZWQgaW4gZmllbGRzIEFycmF5LiAgUGxlYXNlIGFkZCBhbiBhdHRyaWJ1dGUgZmllbGQgY29udGFpbmluZyB1bmlxdWUgSURzIHRvIGVuc3VyZSB0aGUgbGF5ZXIgY2FuIGJlIGRyYXduIGNvcnJlY3RseS4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydCAmJiB0aGlzLm9wdGlvbnMudGltZUZpZWxkLmVuZCkge1xuICAgICAgdGhpcy5fc3RhcnRUaW1lSW5kZXggPSBuZXcgQmluYXJ5U2VhcmNoSW5kZXgoKTtcbiAgICAgIHRoaXMuX2VuZFRpbWVJbmRleCA9IG5ldyBCaW5hcnlTZWFyY2hJbmRleCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLnRpbWVGaWVsZCkge1xuICAgICAgdGhpcy5fdGltZUluZGV4ID0gbmV3IEJpbmFyeVNlYXJjaEluZGV4KCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2FjaGUgPSB7fTtcbiAgICB0aGlzLl9jdXJyZW50U25hcHNob3QgPSBbXTsgLy8gY2FjaGUgb2Ygd2hhdCBsYXllcnMgc2hvdWxkIGJlIGFjdGl2ZVxuICAgIHRoaXMuX2FjdGl2ZVJlcXVlc3RzID0gMDtcbiAgfSxcblxuICAvKipcbiAgICogTGF5ZXIgSW50ZXJmYWNlXG4gICAqL1xuXG4gIG9uQWRkOiBmdW5jdGlvbiAobWFwKSB7XG4gICAgLy8gaW5jbHVkZSAnUG93ZXJlZCBieSBFc3JpJyBpbiBtYXAgYXR0cmlidXRpb25cbiAgICBzZXRFc3JpQXR0cmlidXRpb24obWFwKTtcblxuICAgIHRoaXMuc2VydmljZS5tZXRhZGF0YShmdW5jdGlvbiAoZXJyLCBtZXRhZGF0YSkge1xuICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgdmFyIHN1cHBvcnRlZEZvcm1hdHMgPSBtZXRhZGF0YS5zdXBwb3J0ZWRRdWVyeUZvcm1hdHM7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgc29tZW9uZSBoYXMgcmVxdWVzdGVkIHRoYXQgd2UgZG9uJ3QgdXNlIGdlb0pTT04sIGV2ZW4gaWYgaXQncyBhdmFpbGFibGVcbiAgICAgICAgdmFyIGZvcmNlSnNvbkZvcm1hdCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zZXJ2aWNlLm9wdGlvbnMuaXNNb2Rlcm4gPT09IGZhbHNlKSB7XG4gICAgICAgICAgZm9yY2VKc29uRm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVubGVzcyB3ZSd2ZSBiZWVuIHRvbGQgb3RoZXJ3aXNlLCBjaGVjayB0byBzZWUgd2hldGhlciBzZXJ2aWNlIGNhbiBlbWl0IEdlb0pTT04gbmF0aXZlbHlcbiAgICAgICAgaWYgKCFmb3JjZUpzb25Gb3JtYXQgJiYgc3VwcG9ydGVkRm9ybWF0cyAmJiBzdXBwb3J0ZWRGb3JtYXRzLmluZGV4T2YoJ2dlb0pTT04nKSAhPT0gLTEpIHtcbiAgICAgICAgICB0aGlzLnNlcnZpY2Uub3B0aW9ucy5pc01vZGVybiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgY29weXJpZ2h0IHRleHQgbGlzdGVkIGluIHNlcnZpY2UgbWV0YWRhdGFcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYXR0cmlidXRpb24gJiYgbWFwLmF0dHJpYnV0aW9uQ29udHJvbCAmJiBtZXRhZGF0YS5jb3B5cmlnaHRUZXh0KSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9uID0gbWV0YWRhdGEuY29weXJpZ2h0VGV4dDtcbiAgICAgICAgICBtYXAuYXR0cmlidXRpb25Db250cm9sLmFkZEF0dHJpYnV0aW9uKHRoaXMuZ2V0QXR0cmlidXRpb24oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcblxuICAgIG1hcC5vbignem9vbWVuZCcsIHRoaXMuX2hhbmRsZVpvb21DaGFuZ2UsIHRoaXMpO1xuXG4gICAgcmV0dXJuIFZpcnR1YWxHcmlkLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMsIG1hcCk7XG4gIH0sXG5cbiAgb25SZW1vdmU6IGZ1bmN0aW9uIChtYXApIHtcbiAgICBtYXAub2ZmKCd6b29tZW5kJywgdGhpcy5faGFuZGxlWm9vbUNoYW5nZSwgdGhpcyk7XG5cbiAgICByZXR1cm4gVmlydHVhbEdyaWQucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcywgbWFwKTtcbiAgfSxcblxuICBnZXRBdHRyaWJ1dGlvbjogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRpb247XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZlYXR1cmUgTWFuYWdlbWVudFxuICAgKi9cblxuICBjcmVhdGVDZWxsOiBmdW5jdGlvbiAoYm91bmRzLCBjb29yZHMpIHtcbiAgICAvLyBkb250IGZldGNoIGZlYXR1cmVzIG91dHNpZGUgdGhlIHNjYWxlIHJhbmdlIGRlZmluZWQgZm9yIHRoZSBsYXllclxuICAgIGlmICh0aGlzLl92aXNpYmxlWm9vbSgpKSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0RmVhdHVyZXMoYm91bmRzLCBjb29yZHMpO1xuICAgIH1cbiAgfSxcblxuICBfcmVxdWVzdEZlYXR1cmVzOiBmdW5jdGlvbiAoYm91bmRzLCBjb29yZHMsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fYWN0aXZlUmVxdWVzdHMrKztcblxuICAgIC8vIG91ciBmaXJzdCBhY3RpdmUgcmVxdWVzdCBmaXJlcyBsb2FkaW5nXG4gICAgaWYgKHRoaXMuX2FjdGl2ZVJlcXVlc3RzID09PSAxKSB7XG4gICAgICB0aGlzLmZpcmUoJ2xvYWRpbmcnLCB7XG4gICAgICAgIGJvdW5kczogYm91bmRzXG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYnVpbGRRdWVyeShib3VuZHMpLnJ1bihmdW5jdGlvbiAoZXJyb3IsIGZlYXR1cmVDb2xsZWN0aW9uLCByZXNwb25zZSkge1xuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmV4Y2VlZGVkVHJhbnNmZXJMaW1pdCkge1xuICAgICAgICB0aGlzLmZpcmUoJ2RyYXdsaW1pdGV4Y2VlZGVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIG5vIGVycm9yLCBmZWF0dXJlc1xuICAgICAgaWYgKCFlcnJvciAmJiBmZWF0dXJlQ29sbGVjdGlvbiAmJiBmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gc2NoZWR1bGUgYWRkaW5nIGZlYXR1cmVzIHVudGlsIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZVxuICAgICAgICBVdGlsLnJlcXVlc3RBbmltRnJhbWUoVXRpbC5iaW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLl9hZGRGZWF0dXJlcyhmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcywgY29vcmRzKTtcbiAgICAgICAgICB0aGlzLl9wb3N0UHJvY2Vzc0ZlYXR1cmVzKGJvdW5kcyk7XG4gICAgICAgIH0sIHRoaXMpKTtcbiAgICAgIH1cblxuICAgICAgLy8gbm8gZXJyb3IsIG5vIGZlYXR1cmVzXG4gICAgICBpZiAoIWVycm9yICYmIGZlYXR1cmVDb2xsZWN0aW9uICYmICFmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fcG9zdFByb2Nlc3NGZWF0dXJlcyhib3VuZHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fcG9zdFByb2Nlc3NGZWF0dXJlcyhib3VuZHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBlcnJvciwgZmVhdHVyZUNvbGxlY3Rpb24pO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICB9LFxuXG4gIF9wb3N0UHJvY2Vzc0ZlYXR1cmVzOiBmdW5jdGlvbiAoYm91bmRzKSB7XG4gICAgLy8gZGVpbmNyZW1lbnQgdGhlIHJlcXVlc3QgY291bnRlciBub3cgdGhhdCB3ZSBoYXZlIHByb2Nlc3NlZCBmZWF0dXJlc1xuICAgIHRoaXMuX2FjdGl2ZVJlcXVlc3RzLS07XG5cbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBhY3RpdmUgcmVxdWVzdHMgZmlyZSBhIGxvYWQgZXZlbnQgZm9yIHRoaXMgdmlld1xuICAgIGlmICh0aGlzLl9hY3RpdmVSZXF1ZXN0cyA8PSAwKSB7XG4gICAgICB0aGlzLmZpcmUoJ2xvYWQnLCB7XG4gICAgICAgIGJvdW5kczogYm91bmRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgX2NhY2hlS2V5OiBmdW5jdGlvbiAoY29vcmRzKSB7XG4gICAgcmV0dXJuIGNvb3Jkcy56ICsgJzonICsgY29vcmRzLnggKyAnOicgKyBjb29yZHMueTtcbiAgfSxcblxuICBfYWRkRmVhdHVyZXM6IGZ1bmN0aW9uIChmZWF0dXJlcywgY29vcmRzKSB7XG4gICAgdmFyIGtleSA9IHRoaXMuX2NhY2hlS2V5KGNvb3Jkcyk7XG4gICAgdGhpcy5fY2FjaGVba2V5XSA9IHRoaXMuX2NhY2hlW2tleV0gfHwgW107XG5cbiAgICBmb3IgKHZhciBpID0gZmVhdHVyZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBpZCA9IGZlYXR1cmVzW2ldLmlkO1xuXG4gICAgICBpZiAodGhpcy5fY3VycmVudFNuYXBzaG90LmluZGV4T2YoaWQpID09PSAtMSkge1xuICAgICAgICB0aGlzLl9jdXJyZW50U25hcHNob3QucHVzaChpZCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fY2FjaGVba2V5XS5pbmRleE9mKGlkKSA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5fY2FjaGVba2V5XS5wdXNoKGlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWVGaWVsZCkge1xuICAgICAgdGhpcy5fYnVpbGRUaW1lSW5kZXhlcyhmZWF0dXJlcyk7XG4gICAgfVxuXG4gICAgdGhpcy5jcmVhdGVMYXllcnMoZmVhdHVyZXMpO1xuICB9LFxuXG4gIF9idWlsZFF1ZXJ5OiBmdW5jdGlvbiAoYm91bmRzKSB7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpcy5zZXJ2aWNlLnF1ZXJ5KClcbiAgICAgIC5pbnRlcnNlY3RzKGJvdW5kcylcbiAgICAgIC53aGVyZSh0aGlzLm9wdGlvbnMud2hlcmUpXG4gICAgICAuZmllbGRzKHRoaXMub3B0aW9ucy5maWVsZHMpXG4gICAgICAucHJlY2lzaW9uKHRoaXMub3B0aW9ucy5wcmVjaXNpb24pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZXF1ZXN0UGFyYW1zKSB7XG4gICAgICBVdGlsLmV4dGVuZChxdWVyeS5wYXJhbXMsIHRoaXMub3B0aW9ucy5yZXF1ZXN0UGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnNpbXBsaWZ5RmFjdG9yKSB7XG4gICAgICBxdWVyeS5zaW1wbGlmeSh0aGlzLl9tYXAsIHRoaXMub3B0aW9ucy5zaW1wbGlmeUZhY3Rvcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50aW1lRmlsdGVyTW9kZSA9PT0gJ3NlcnZlcicgJiYgdGhpcy5vcHRpb25zLmZyb20gJiYgdGhpcy5vcHRpb25zLnRvKSB7XG4gICAgICBxdWVyeS5iZXR3ZWVuKHRoaXMub3B0aW9ucy5mcm9tLCB0aGlzLm9wdGlvbnMudG8pO1xuICAgIH1cblxuICAgIHJldHVybiBxdWVyeTtcbiAgfSxcblxuICAvKipcbiAgICogV2hlcmUgTWV0aG9kc1xuICAgKi9cblxuICBzZXRXaGVyZTogZnVuY3Rpb24gKHdoZXJlLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMub3B0aW9ucy53aGVyZSA9ICh3aGVyZSAmJiB3aGVyZS5sZW5ndGgpID8gd2hlcmUgOiAnMT0xJztcblxuICAgIHZhciBvbGRTbmFwc2hvdCA9IFtdO1xuICAgIHZhciBuZXdTbmFwc2hvdCA9IFtdO1xuICAgIHZhciBwZW5kaW5nUmVxdWVzdHMgPSAwO1xuICAgIHZhciByZXF1ZXN0RXJyb3IgPSBudWxsO1xuICAgIHZhciByZXF1ZXN0Q2FsbGJhY2sgPSBVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCBmZWF0dXJlQ29sbGVjdGlvbikge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlcXVlc3RFcnJvciA9IGVycm9yO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmVhdHVyZUNvbGxlY3Rpb24pIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgbmV3U25hcHNob3QucHVzaChmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlc1tpXS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGVuZGluZ1JlcXVlc3RzLS07XG5cbiAgICAgIGlmIChwZW5kaW5nUmVxdWVzdHMgPD0gMCAmJiB0aGlzLl92aXNpYmxlWm9vbSgpKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTbmFwc2hvdCA9IG5ld1NuYXBzaG90O1xuICAgICAgICAvLyBzY2hlZHVsZSBhZGRpbmcgZmVhdHVyZXMgZm9yIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZVxuICAgICAgICBVdGlsLnJlcXVlc3RBbmltRnJhbWUoVXRpbC5iaW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxheWVycyhvbGRTbmFwc2hvdCk7XG4gICAgICAgICAgdGhpcy5hZGRMYXllcnMobmV3U25hcHNob3QpO1xuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCByZXF1ZXN0RXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcykpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgZm9yICh2YXIgaSA9IHRoaXMuX2N1cnJlbnRTbmFwc2hvdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgb2xkU25hcHNob3QucHVzaCh0aGlzLl9jdXJyZW50U25hcHNob3RbaV0pO1xuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9hY3RpdmVDZWxscykge1xuICAgICAgcGVuZGluZ1JlcXVlc3RzKys7XG4gICAgICB2YXIgY29vcmRzID0gdGhpcy5fa2V5VG9DZWxsQ29vcmRzKGtleSk7XG4gICAgICB2YXIgYm91bmRzID0gdGhpcy5fY2VsbENvb3Jkc1RvQm91bmRzKGNvb3Jkcyk7XG4gICAgICB0aGlzLl9yZXF1ZXN0RmVhdHVyZXMoYm91bmRzLCBrZXksIHJlcXVlc3RDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0V2hlcmU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLndoZXJlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUaW1lIFJhbmdlIE1ldGhvZHNcbiAgICovXG5cbiAgZ2V0VGltZVJhbmdlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFt0aGlzLm9wdGlvbnMuZnJvbSwgdGhpcy5vcHRpb25zLnRvXTtcbiAgfSxcblxuICBzZXRUaW1lUmFuZ2U6IGZ1bmN0aW9uIChmcm9tLCB0bywgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB2YXIgb2xkRnJvbSA9IHRoaXMub3B0aW9ucy5mcm9tO1xuICAgIHZhciBvbGRUbyA9IHRoaXMub3B0aW9ucy50bztcbiAgICB2YXIgcGVuZGluZ1JlcXVlc3RzID0gMDtcbiAgICB2YXIgcmVxdWVzdEVycm9yID0gbnVsbDtcbiAgICB2YXIgcmVxdWVzdENhbGxiYWNrID0gVXRpbC5iaW5kKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlcXVlc3RFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhpcy5fZmlsdGVyRXhpc3RpbmdGZWF0dXJlcyhvbGRGcm9tLCBvbGRUbywgZnJvbSwgdG8pO1xuXG4gICAgICBwZW5kaW5nUmVxdWVzdHMtLTtcblxuICAgICAgaWYgKGNhbGxiYWNrICYmIHBlbmRpbmdSZXF1ZXN0cyA8PSAwKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgcmVxdWVzdEVycm9yKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcblxuICAgIHRoaXMub3B0aW9ucy5mcm9tID0gZnJvbTtcbiAgICB0aGlzLm9wdGlvbnMudG8gPSB0bztcblxuICAgIHRoaXMuX2ZpbHRlckV4aXN0aW5nRmVhdHVyZXMob2xkRnJvbSwgb2xkVG8sIGZyb20sIHRvKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUZpbHRlck1vZGUgPT09ICdzZXJ2ZXInKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fYWN0aXZlQ2VsbHMpIHtcbiAgICAgICAgcGVuZGluZ1JlcXVlc3RzKys7XG4gICAgICAgIHZhciBjb29yZHMgPSB0aGlzLl9rZXlUb0NlbGxDb29yZHMoa2V5KTtcbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxDb29yZHNUb0JvdW5kcyhjb29yZHMpO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0RmVhdHVyZXMoYm91bmRzLCBrZXksIHJlcXVlc3RDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcmVmcmVzaDogZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl9hY3RpdmVDZWxscykge1xuICAgICAgdmFyIGNvb3JkcyA9IHRoaXMuX2tleVRvQ2VsbENvb3JkcyhrZXkpO1xuICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2NlbGxDb29yZHNUb0JvdW5kcyhjb29yZHMpO1xuICAgICAgdGhpcy5fcmVxdWVzdEZlYXR1cmVzKGJvdW5kcywga2V5KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWRyYXcpIHtcbiAgICAgIHRoaXMub25jZSgnbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5lYWNoRmVhdHVyZShmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICAgICAgICB0aGlzLl9yZWRyYXcobGF5ZXIuZmVhdHVyZS5pZCk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICB9LFxuXG4gIF9maWx0ZXJFeGlzdGluZ0ZlYXR1cmVzOiBmdW5jdGlvbiAob2xkRnJvbSwgb2xkVG8sIG5ld0Zyb20sIG5ld1RvKSB7XG4gICAgdmFyIGxheWVyc1RvUmVtb3ZlID0gKG9sZEZyb20gJiYgb2xkVG8pID8gdGhpcy5fZ2V0RmVhdHVyZXNJblRpbWVSYW5nZShvbGRGcm9tLCBvbGRUbykgOiB0aGlzLl9jdXJyZW50U25hcHNob3Q7XG4gICAgdmFyIGxheWVyc1RvQWRkID0gdGhpcy5fZ2V0RmVhdHVyZXNJblRpbWVSYW5nZShuZXdGcm9tLCBuZXdUbyk7XG5cbiAgICBpZiAobGF5ZXJzVG9BZGQuaW5kZXhPZikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnNUb0FkZC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2hvdWxkUmVtb3ZlTGF5ZXIgPSBsYXllcnNUb1JlbW92ZS5pbmRleE9mKGxheWVyc1RvQWRkW2ldKTtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUxheWVyID49IDApIHtcbiAgICAgICAgICBsYXllcnNUb1JlbW92ZS5zcGxpY2Uoc2hvdWxkUmVtb3ZlTGF5ZXIsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2NoZWR1bGUgYWRkaW5nIGZlYXR1cmVzIHVudGlsIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZVxuICAgIFV0aWwucmVxdWVzdEFuaW1GcmFtZShVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5yZW1vdmVMYXllcnMobGF5ZXJzVG9SZW1vdmUpO1xuICAgICAgdGhpcy5hZGRMYXllcnMobGF5ZXJzVG9BZGQpO1xuICAgIH0sIHRoaXMpKTtcbiAgfSxcblxuICBfZ2V0RmVhdHVyZXNJblRpbWVSYW5nZTogZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgaWRzID0gW107XG4gICAgdmFyIHNlYXJjaDtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUZpZWxkLnN0YXJ0ICYmIHRoaXMub3B0aW9ucy50aW1lRmllbGQuZW5kKSB7XG4gICAgICB2YXIgc3RhcnRUaW1lcyA9IHRoaXMuX3N0YXJ0VGltZUluZGV4LmJldHdlZW4oc3RhcnQsIGVuZCk7XG4gICAgICB2YXIgZW5kVGltZXMgPSB0aGlzLl9lbmRUaW1lSW5kZXguYmV0d2VlbihzdGFydCwgZW5kKTtcbiAgICAgIHNlYXJjaCA9IHN0YXJ0VGltZXMuY29uY2F0KGVuZFRpbWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VhcmNoID0gdGhpcy5fdGltZUluZGV4LmJldHdlZW4oc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IHNlYXJjaC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWRzLnB1c2goc2VhcmNoW2ldLmlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWRzO1xuICB9LFxuXG4gIF9idWlsZFRpbWVJbmRleGVzOiBmdW5jdGlvbiAoZ2VvanNvbikge1xuICAgIHZhciBpO1xuICAgIHZhciBmZWF0dXJlO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUZpZWxkLnN0YXJ0ICYmIHRoaXMub3B0aW9ucy50aW1lRmllbGQuZW5kKSB7XG4gICAgICB2YXIgc3RhcnRUaW1lRW50cmllcyA9IFtdO1xuICAgICAgdmFyIGVuZFRpbWVFbnRyaWVzID0gW107XG4gICAgICBmb3IgKGkgPSBnZW9qc29uLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGZlYXR1cmUgPSBnZW9qc29uW2ldO1xuICAgICAgICBzdGFydFRpbWVFbnRyaWVzLnB1c2goe1xuICAgICAgICAgIGlkOiBmZWF0dXJlLmlkLFxuICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydF0pXG4gICAgICAgIH0pO1xuICAgICAgICBlbmRUaW1lRW50cmllcy5wdXNoKHtcbiAgICAgICAgICBpZDogZmVhdHVyZS5pZCxcbiAgICAgICAgICB2YWx1ZTogbmV3IERhdGUoZmVhdHVyZS5wcm9wZXJ0aWVzW3RoaXMub3B0aW9ucy50aW1lRmllbGQuZW5kXSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFydFRpbWVJbmRleC5idWxrQWRkKHN0YXJ0VGltZUVudHJpZXMpO1xuICAgICAgdGhpcy5fZW5kVGltZUluZGV4LmJ1bGtBZGQoZW5kVGltZUVudHJpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdGltZUVudHJpZXMgPSBbXTtcbiAgICAgIGZvciAoaSA9IGdlb2pzb24ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgZmVhdHVyZSA9IGdlb2pzb25baV07XG4gICAgICAgIHRpbWVFbnRyaWVzLnB1c2goe1xuICAgICAgICAgIGlkOiBmZWF0dXJlLmlkLFxuICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZF0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90aW1lSW5kZXguYnVsa0FkZCh0aW1lRW50cmllcyk7XG4gICAgfVxuICB9LFxuXG4gIF9mZWF0dXJlV2l0aGluVGltZVJhbmdlOiBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmZyb20gfHwgIXRoaXMub3B0aW9ucy50bykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGZyb20gPSArdGhpcy5vcHRpb25zLmZyb20udmFsdWVPZigpO1xuICAgIHZhciB0byA9ICt0aGlzLm9wdGlvbnMudG8udmFsdWVPZigpO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMudGltZUZpZWxkID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIGRhdGUgPSArZmVhdHVyZS5wcm9wZXJ0aWVzW3RoaXMub3B0aW9ucy50aW1lRmllbGRdO1xuICAgICAgcmV0dXJuIChkYXRlID49IGZyb20pICYmIChkYXRlIDw9IHRvKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydCAmJiB0aGlzLm9wdGlvbnMudGltZUZpZWxkLmVuZCkge1xuICAgICAgdmFyIHN0YXJ0RGF0ZSA9ICtmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5zdGFydF07XG4gICAgICB2YXIgZW5kRGF0ZSA9ICtmZWF0dXJlLnByb3BlcnRpZXNbdGhpcy5vcHRpb25zLnRpbWVGaWVsZC5lbmRdO1xuICAgICAgcmV0dXJuICgoc3RhcnREYXRlID49IGZyb20pICYmIChzdGFydERhdGUgPD0gdG8pKSB8fCAoKGVuZERhdGUgPj0gZnJvbSkgJiYgKGVuZERhdGUgPD0gdG8pKTtcbiAgICB9XG4gIH0sXG5cbiAgX3Zpc2libGVab29tOiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBvZiB0aGUgbWFwIGlzIHdpdGhpbiB0aGUgb3B0aW9uYWwgbGltaXQgZGVmaW5lZCBmb3IgdGhlIEZlYXR1cmVMYXllclxuICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKTtcbiAgICBpZiAoem9vbSA+IHRoaXMub3B0aW9ucy5tYXhab29tIHx8IHpvb20gPCB0aGlzLm9wdGlvbnMubWluWm9vbSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7IHJldHVybiB0cnVlOyB9XG4gIH0sXG5cbiAgX2hhbmRsZVpvb21DaGFuZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX3Zpc2libGVab29tKCkpIHtcbiAgICAgIHRoaXMucmVtb3ZlTGF5ZXJzKHRoaXMuX2N1cnJlbnRTbmFwc2hvdCk7XG4gICAgICB0aGlzLl9jdXJyZW50U25hcHNob3QgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLypcbiAgICAgIGZvciBldmVyeSBjZWxsIGluIHRoaXMuX2FjdGl2ZUNlbGxzXG4gICAgICAgIDEuIEdldCB0aGUgY2FjaGUga2V5IGZvciB0aGUgY29vcmRzIG9mIHRoZSBjZWxsXG4gICAgICAgIDIuIElmIHRoaXMuX2NhY2hlW2tleV0gZXhpc3RzIGl0IHdpbGwgYmUgYW4gYXJyYXkgb2YgZmVhdHVyZSBJRHMuXG4gICAgICAgIDMuIENhbGwgdGhpcy5hZGRMYXllcnModGhpcy5fY2FjaGVba2V5XSkgdG8gaW5zdHJ1Y3QgdGhlIGZlYXR1cmUgbGF5ZXIgdG8gYWRkIHRoZSBsYXllcnMgYmFjay5cbiAgICAgICovXG4gICAgICBmb3IgKHZhciBpIGluIHRoaXMuX2FjdGl2ZUNlbGxzKSB7XG4gICAgICAgIHZhciBjb29yZHMgPSB0aGlzLl9hY3RpdmVDZWxsc1tpXS5jb29yZHM7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLl9jYWNoZUtleShjb29yZHMpO1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVba2V5XSkge1xuICAgICAgICAgIHRoaXMuYWRkTGF5ZXJzKHRoaXMuX2NhY2hlW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTZXJ2aWNlIE1ldGhvZHNcbiAgICovXG5cbiAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB0aGlzLnNlcnZpY2UuYXV0aGVudGljYXRlKHRva2VuKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBtZXRhZGF0YTogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5zZXJ2aWNlLm1ldGFkYXRhKGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBxdWVyeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UucXVlcnkoKTtcbiAgfSxcblxuICBfZ2V0TWV0YWRhdGE6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9tZXRhZGF0YSkge1xuICAgICAgdmFyIGVycm9yO1xuICAgICAgY2FsbGJhY2soZXJyb3IsIHRoaXMuX21ldGFkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhZGF0YShVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCByZXNwb25zZSkge1xuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICBjYWxsYmFjayhlcnJvciwgdGhpcy5fbWV0YWRhdGEpO1xuICAgICAgfSwgdGhpcykpO1xuICAgIH1cbiAgfSxcblxuICBhZGRGZWF0dXJlOiBmdW5jdGlvbiAoZmVhdHVyZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLl9nZXRNZXRhZGF0YShVdGlsLmJpbmQoZnVuY3Rpb24gKGVycm9yLCBtZXRhZGF0YSkge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChjYWxsYmFjaykgeyBjYWxsYmFjay5jYWxsKHRoaXMsIGVycm9yLCBudWxsKTsgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VydmljZS5hZGRGZWF0dXJlKGZlYXR1cmUsIFV0aWwuYmluZChmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAvLyBhc3NpZ24gSUQgZnJvbSByZXN1bHQgdG8gYXBwcm9wcmlhdGUgb2JqZWN0aWQgZmllbGQgZnJvbSBzZXJ2aWNlIG1ldGFkYXRhXG4gICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW21ldGFkYXRhLm9iamVjdElkRmllbGRdID0gcmVzcG9uc2Uub2JqZWN0SWQ7XG5cbiAgICAgICAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gdXBkYXRlIHRoZSBnZW9qc29uIGlkIGZvciBjcmVhdGVMYXllcnMoKSB0byBmdW5jdGlvblxuICAgICAgICAgIGZlYXR1cmUuaWQgPSByZXNwb25zZS5vYmplY3RJZDtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUxheWVycyhbZmVhdHVyZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzKSk7XG4gICAgfSwgdGhpcykpO1xuICB9LFxuXG4gIHVwZGF0ZUZlYXR1cmU6IGZ1bmN0aW9uIChmZWF0dXJlLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuc2VydmljZS51cGRhdGVGZWF0dXJlKGZlYXR1cmUsIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMYXllcnMoW2ZlYXR1cmUuaWRdLCB0cnVlKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMYXllcnMoW2ZlYXR1cmVdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXJyb3IsIHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfSxcblxuICBkZWxldGVGZWF0dXJlOiBmdW5jdGlvbiAoaWQsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgdGhpcy5zZXJ2aWNlLmRlbGV0ZUZlYXR1cmUoaWQsIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UpIHtcbiAgICAgIGlmICghZXJyb3IgJiYgcmVzcG9uc2Uub2JqZWN0SWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMYXllcnMoW3Jlc3BvbnNlLm9iamVjdElkXSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICB9LFxuXG4gIGRlbGV0ZUZlYXR1cmVzOiBmdW5jdGlvbiAoaWRzLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZGVsZXRlRmVhdHVyZXMoaWRzLCBmdW5jdGlvbiAoZXJyb3IsIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoIWVycm9yICYmIHJlc3BvbnNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGF5ZXJzKFtyZXNwb25zZVtpXS5vYmplY3RJZF0sIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICB9XG59KTtcbiIsImltcG9ydCB7IFBhdGgsIFV0aWwsIEdlb0pTT04sIGxhdExuZyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgRmVhdHVyZU1hbmFnZXIgfSBmcm9tICcuL0ZlYXR1cmVNYW5hZ2VyJztcblxuZXhwb3J0IHZhciBGZWF0dXJlTGF5ZXIgPSBGZWF0dXJlTWFuYWdlci5leHRlbmQoe1xuXG4gIG9wdGlvbnM6IHtcbiAgICBjYWNoZUxheWVyczogdHJ1ZVxuICB9LFxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKi9cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIHRoaXMuX29yaWdpbmFsU3R5bGUgPSB0aGlzLm9wdGlvbnMuc3R5bGU7XG4gICAgdGhpcy5fbGF5ZXJzID0ge307XG4gIH0sXG5cbiAgLyoqXG4gICAqIExheWVyIEludGVyZmFjZVxuICAgKi9cblxuICBvblJlbW92ZTogZnVuY3Rpb24gKG1hcCkge1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICBtYXAucmVtb3ZlTGF5ZXIodGhpcy5fbGF5ZXJzW2ldKTtcbiAgICAgIC8vIHRyaWdnZXIgdGhlIGV2ZW50IHdoZW4gdGhlIGVudGlyZSBmZWF0dXJlTGF5ZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBtYXBcbiAgICAgIHRoaXMuZmlyZSgncmVtb3ZlZmVhdHVyZScsIHtcbiAgICAgICAgZmVhdHVyZTogdGhpcy5fbGF5ZXJzW2ldLmZlYXR1cmUsXG4gICAgICAgIHBlcm1hbmVudDogZmFsc2VcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLCBtYXApO1xuICB9LFxuXG4gIGNyZWF0ZU5ld0xheWVyOiBmdW5jdGlvbiAoZ2VvanNvbikge1xuICAgIHZhciBsYXllciA9IEdlb0pTT04uZ2VvbWV0cnlUb0xheWVyKGdlb2pzb24sIHRoaXMub3B0aW9ucyk7XG4gICAgbGF5ZXIuZGVmYXVsdE9wdGlvbnMgPSBsYXllci5vcHRpb25zO1xuICAgIHJldHVybiBsYXllcjtcbiAgfSxcblxuICBfdXBkYXRlTGF5ZXI6IGZ1bmN0aW9uIChsYXllciwgZ2VvanNvbikge1xuICAgIC8vIGNvbnZlcnQgdGhlIGdlb2pzb24gY29vcmRpbmF0ZXMgaW50byBhIExlYWZsZXQgTGF0TG5nIGFycmF5L25lc3RlZCBhcnJheXNcbiAgICAvLyBwYXNzIGl0IHRvIHNldExhdExuZ3MgdG8gdXBkYXRlIGxheWVyIGdlb21ldHJpZXNcbiAgICB2YXIgbGF0bG5ncyA9IFtdO1xuICAgIHZhciBjb29yZHNUb0xhdExuZyA9IHRoaXMub3B0aW9ucy5jb29yZHNUb0xhdExuZyB8fCBHZW9KU09OLmNvb3Jkc1RvTGF0TG5nO1xuXG4gICAgLy8gY29weSBuZXcgYXR0cmlidXRlcywgaWYgcHJlc2VudFxuICAgIGlmIChnZW9qc29uLnByb3BlcnRpZXMpIHtcbiAgICAgIGxheWVyLmZlYXR1cmUucHJvcGVydGllcyA9IGdlb2pzb24ucHJvcGVydGllcztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGdlb2pzb24uZ2VvbWV0cnkudHlwZSkge1xuICAgICAgY2FzZSAnUG9pbnQnOlxuICAgICAgICBsYXRsbmdzID0gR2VvSlNPTi5jb29yZHNUb0xhdExuZyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgbGF5ZXIuc2V0TGF0TG5nKGxhdGxuZ3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0xpbmVTdHJpbmcnOlxuICAgICAgICBsYXRsbmdzID0gR2VvSlNPTi5jb29yZHNUb0xhdExuZ3MoZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlcywgMCwgY29vcmRzVG9MYXRMbmcpO1xuICAgICAgICBsYXllci5zZXRMYXRMbmdzKGxhdGxuZ3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ011bHRpTGluZVN0cmluZyc6XG4gICAgICAgIGxhdGxuZ3MgPSBHZW9KU09OLmNvb3Jkc1RvTGF0TG5ncyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzLCAxLCBjb29yZHNUb0xhdExuZyk7XG4gICAgICAgIGxheWVyLnNldExhdExuZ3MobGF0bG5ncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnUG9seWdvbic6XG4gICAgICAgIGxhdGxuZ3MgPSBHZW9KU09OLmNvb3Jkc1RvTGF0TG5ncyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzLCAxLCBjb29yZHNUb0xhdExuZyk7XG4gICAgICAgIGxheWVyLnNldExhdExuZ3MobGF0bG5ncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnTXVsdGlQb2x5Z29uJzpcbiAgICAgICAgbGF0bG5ncyA9IEdlb0pTT04uY29vcmRzVG9MYXRMbmdzKGdlb2pzb24uZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIDIsIGNvb3Jkc1RvTGF0TG5nKTtcbiAgICAgICAgbGF5ZXIuc2V0TGF0TG5ncyhsYXRsbmdzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBGZWF0dXJlIE1hbmFnZW1lbnQgTWV0aG9kc1xuICAgKi9cblxuICBjcmVhdGVMYXllcnM6IGZ1bmN0aW9uIChmZWF0dXJlcykge1xuICAgIGZvciAodmFyIGkgPSBmZWF0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGdlb2pzb24gPSBmZWF0dXJlc1tpXTtcblxuICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2dlb2pzb24uaWRdO1xuICAgICAgdmFyIG5ld0xheWVyO1xuXG4gICAgICBpZiAodGhpcy5fdmlzaWJsZVpvb20oKSAmJiBsYXllciAmJiAhdGhpcy5fbWFwLmhhc0xheWVyKGxheWVyKSkge1xuICAgICAgICB0aGlzLl9tYXAuYWRkTGF5ZXIobGF5ZXIpO1xuICAgICAgICB0aGlzLmZpcmUoJ2FkZGZlYXR1cmUnLCB7XG4gICAgICAgICAgZmVhdHVyZTogbGF5ZXIuZmVhdHVyZVxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gdXBkYXRlIGdlb21ldHJ5IGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKGxheWVyICYmIHRoaXMub3B0aW9ucy5zaW1wbGlmeUZhY3RvciA+IDAgJiYgKGxheWVyLnNldExhdExuZ3MgfHwgbGF5ZXIuc2V0TGF0TG5nKSkge1xuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllciwgZ2VvanNvbik7XG4gICAgICB9XG5cbiAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgbmV3TGF5ZXIgPSB0aGlzLmNyZWF0ZU5ld0xheWVyKGdlb2pzb24pO1xuICAgICAgICBuZXdMYXllci5mZWF0dXJlID0gZ2VvanNvbjtcblxuICAgICAgICAvLyBidWJibGUgZXZlbnRzIGZyb20gaW5kaXZpZHVhbCBsYXllcnMgdG8gdGhlIGZlYXR1cmUgbGF5ZXJcbiAgICAgICAgbmV3TGF5ZXIuYWRkRXZlbnRQYXJlbnQodGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkVhY2hGZWF0dXJlKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLm9uRWFjaEZlYXR1cmUobmV3TGF5ZXIuZmVhdHVyZSwgbmV3TGF5ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FjaGUgdGhlIGxheWVyXG4gICAgICAgIHRoaXMuX2xheWVyc1tuZXdMYXllci5mZWF0dXJlLmlkXSA9IG5ld0xheWVyO1xuXG4gICAgICAgIC8vIHN0eWxlIHRoZSBsYXllclxuICAgICAgICB0aGlzLnNldEZlYXR1cmVTdHlsZShuZXdMYXllci5mZWF0dXJlLmlkLCB0aGlzLm9wdGlvbnMuc3R5bGUpO1xuXG4gICAgICAgIHRoaXMuZmlyZSgnY3JlYXRlZmVhdHVyZScsIHtcbiAgICAgICAgICBmZWF0dXJlOiBuZXdMYXllci5mZWF0dXJlXG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIC8vIGFkZCB0aGUgbGF5ZXIgaWYgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBpcyBpbnNpZGUgdGhlIHJhbmdlIGRlZmluZWQgZm9yIHRoZSBsYXllciwgaXQgaXMgd2l0aGluIHRoZSBjdXJyZW50IHRpbWUgYm91bmRzIG9yIG91ciBsYXllciBpcyBub3QgdGltZSBlbmFibGVkXG4gICAgICAgIGlmICh0aGlzLl92aXNpYmxlWm9vbSgpICYmICghdGhpcy5vcHRpb25zLnRpbWVGaWVsZCB8fCAodGhpcy5vcHRpb25zLnRpbWVGaWVsZCAmJiB0aGlzLl9mZWF0dXJlV2l0aGluVGltZVJhbmdlKGdlb2pzb24pKSkpIHtcbiAgICAgICAgICB0aGlzLl9tYXAuYWRkTGF5ZXIobmV3TGF5ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGFkZExheWVyczogZnVuY3Rpb24gKGlkcykge1xuICAgIGZvciAodmFyIGkgPSBpZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tpZHNbaV1dO1xuICAgICAgaWYgKGxheWVyKSB7XG4gICAgICAgIHRoaXMuX21hcC5hZGRMYXllcihsYXllcik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlbW92ZUxheWVyczogZnVuY3Rpb24gKGlkcywgcGVybWFuZW50KSB7XG4gICAgZm9yICh2YXIgaSA9IGlkcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGlkID0gaWRzW2ldO1xuICAgICAgdmFyIGxheWVyID0gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICAgIGlmIChsYXllcikge1xuICAgICAgICB0aGlzLmZpcmUoJ3JlbW92ZWZlYXR1cmUnLCB7XG4gICAgICAgICAgZmVhdHVyZTogbGF5ZXIuZmVhdHVyZSxcbiAgICAgICAgICBwZXJtYW5lbnQ6IHBlcm1hbmVudFxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKGxheWVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYXllciAmJiBwZXJtYW5lbnQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xheWVyc1tpZF07XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNlbGxFbnRlcjogZnVuY3Rpb24gKGJvdW5kcywgY29vcmRzKSB7XG4gICAgaWYgKHRoaXMuX3Zpc2libGVab29tKCkgJiYgIXRoaXMuX3pvb21pbmcgJiYgdGhpcy5fbWFwKSB7XG4gICAgICBVdGlsLnJlcXVlc3RBbmltRnJhbWUoVXRpbC5iaW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhY2hlS2V5ID0gdGhpcy5fY2FjaGVLZXkoY29vcmRzKTtcbiAgICAgICAgdmFyIGNlbGxLZXkgPSB0aGlzLl9jZWxsQ29vcmRzVG9LZXkoY29vcmRzKTtcbiAgICAgICAgdmFyIGxheWVycyA9IHRoaXMuX2NhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUNlbGxzW2NlbGxLZXldICYmIGxheWVycykge1xuICAgICAgICAgIHRoaXMuYWRkTGF5ZXJzKGxheWVycyk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpKTtcbiAgICB9XG4gIH0sXG5cbiAgY2VsbExlYXZlOiBmdW5jdGlvbiAoYm91bmRzLCBjb29yZHMpIHtcbiAgICBpZiAoIXRoaXMuX3pvb21pbmcpIHtcbiAgICAgIFV0aWwucmVxdWVzdEFuaW1GcmFtZShVdGlsLmJpbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgdmFyIGNhY2hlS2V5ID0gdGhpcy5fY2FjaGVLZXkoY29vcmRzKTtcbiAgICAgICAgICB2YXIgY2VsbEtleSA9IHRoaXMuX2NlbGxDb29yZHNUb0tleShjb29yZHMpO1xuICAgICAgICAgIHZhciBsYXllcnMgPSB0aGlzLl9jYWNoZVtjYWNoZUtleV07XG4gICAgICAgICAgdmFyIG1hcEJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuX2FjdGl2ZUNlbGxzW2NlbGxLZXldICYmIGxheWVycykge1xuICAgICAgICAgICAgdmFyIHJlbW92YWJsZSA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcnNbaV1dO1xuICAgICAgICAgICAgICBpZiAobGF5ZXIgJiYgbGF5ZXIuZ2V0Qm91bmRzICYmIG1hcEJvdW5kcy5pbnRlcnNlY3RzKGxheWVyLmdldEJvdW5kcygpKSkge1xuICAgICAgICAgICAgICAgIHJlbW92YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW1vdmFibGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMYXllcnMobGF5ZXJzLCAhdGhpcy5vcHRpb25zLmNhY2hlTGF5ZXJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuY2FjaGVMYXllcnMgJiYgcmVtb3ZhYmxlKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWNoZVtjYWNoZUtleV07XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jZWxsc1tjZWxsS2V5XTtcbiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2FjdGl2ZUNlbGxzW2NlbGxLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgdGhpcykpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU3R5bGluZyBNZXRob2RzXG4gICAqL1xuXG4gIHJlc2V0U3R5bGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3R5bGUgPSB0aGlzLl9vcmlnaW5hbFN0eWxlO1xuICAgIHRoaXMuZWFjaEZlYXR1cmUoZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICB0aGlzLnJlc2V0RmVhdHVyZVN0eWxlKGxheWVyLmZlYXR1cmUuaWQpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNldFN0eWxlOiBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3R5bGUgPSBzdHlsZTtcbiAgICB0aGlzLmVhY2hGZWF0dXJlKGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgdGhpcy5zZXRGZWF0dXJlU3R5bGUobGF5ZXIuZmVhdHVyZS5pZCwgc3R5bGUpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHJlc2V0RmVhdHVyZVN0eWxlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgIHZhciBzdHlsZSA9IHRoaXMuX29yaWdpbmFsU3R5bGUgfHwgUGF0aC5wcm90b3R5cGUub3B0aW9ucztcbiAgICBpZiAobGF5ZXIpIHtcbiAgICAgIFV0aWwuZXh0ZW5kKGxheWVyLm9wdGlvbnMsIGxheWVyLmRlZmF1bHRPcHRpb25zKTtcbiAgICAgIHRoaXMuc2V0RmVhdHVyZVN0eWxlKGlkLCBzdHlsZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNldEZlYXR1cmVTdHlsZTogZnVuY3Rpb24gKGlkLCBzdHlsZSkge1xuICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG4gICAgaWYgKHR5cGVvZiBzdHlsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3R5bGUgPSBzdHlsZShsYXllci5mZWF0dXJlKTtcbiAgICB9XG4gICAgaWYgKGxheWVyLnNldFN0eWxlKSB7XG4gICAgICBsYXllci5zZXRTdHlsZShzdHlsZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBVdGlsaXR5IE1ldGhvZHNcbiAgICovXG5cbiAgZWFjaEFjdGl2ZUZlYXR1cmU6IGZ1bmN0aW9uIChmbiwgY29udGV4dCkge1xuICAgIC8vIGZpZ3VyZSBvdXQgKHJvdWdobHkpIHdoaWNoIGxheWVycyBhcmUgaW4gdmlld1xuICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgIHZhciBhY3RpdmVCb3VuZHMgPSB0aGlzLl9tYXAuZ2V0Qm91bmRzKCk7XG4gICAgICBmb3IgKHZhciBpIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFNuYXBzaG90LmluZGV4T2YodGhpcy5fbGF5ZXJzW2ldLmZlYXR1cmUuaWQpICE9PSAtMSkge1xuICAgICAgICAgIC8vIGEgc2ltcGxlIHBvaW50IGluIHBvbHkgdGVzdCBmb3IgcG9pbnQgZ2VvbWV0cmllc1xuICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbGF5ZXJzW2ldLmdldExhdExuZyA9PT0gJ2Z1bmN0aW9uJyAmJiBhY3RpdmVCb3VuZHMuY29udGFpbnModGhpcy5fbGF5ZXJzW2ldLmdldExhdExuZygpKSkge1xuICAgICAgICAgICAgZm4uY2FsbChjb250ZXh0LCB0aGlzLl9sYXllcnNbaV0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX2xheWVyc1tpXS5nZXRCb3VuZHMgPT09ICdmdW5jdGlvbicgJiYgYWN0aXZlQm91bmRzLmludGVyc2VjdHModGhpcy5fbGF5ZXJzW2ldLmdldEJvdW5kcygpKSkge1xuICAgICAgICAgICAgLy8gaW50ZXJzZWN0aW5nIGJvdW5kcyBjaGVjayBmb3IgcG9seWxpbmUgYW5kIHBvbHlnb24gZ2VvbWV0cmllc1xuICAgICAgICAgICAgZm4uY2FsbChjb250ZXh0LCB0aGlzLl9sYXllcnNbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBlYWNoRmVhdHVyZTogZnVuY3Rpb24gKGZuLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgaSBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgIGZuLmNhbGwoY29udGV4dCwgdGhpcy5fbGF5ZXJzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgZ2V0RmVhdHVyZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xheWVyc1tpZF07XG4gIH0sXG5cbiAgYnJpbmdUb0JhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmVhY2hGZWF0dXJlKGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgaWYgKGxheWVyLmJyaW5nVG9CYWNrKSB7XG4gICAgICAgIGxheWVyLmJyaW5nVG9CYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG5cbiAgYnJpbmdUb0Zyb250OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lYWNoRmVhdHVyZShmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICAgIGlmIChsYXllci5icmluZ1RvRnJvbnQpIHtcbiAgICAgICAgbGF5ZXIuYnJpbmdUb0Zyb250KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG5cbiAgcmVkcmF3OiBmdW5jdGlvbiAoaWQpIHtcbiAgICBpZiAoaWQpIHtcbiAgICAgIHRoaXMuX3JlZHJhdyhpZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIF9yZWRyYXc6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG4gICAgdmFyIGdlb2pzb24gPSBsYXllci5mZWF0dXJlO1xuXG4gICAgLy8gaWYgdGhpcyBsb29rcyBsaWtlIGEgbWFya2VyXG4gICAgaWYgKGxheWVyICYmIGxheWVyLnNldEljb24gJiYgdGhpcy5vcHRpb25zLnBvaW50VG9MYXllcikge1xuICAgICAgLy8gdXBkYXRlIGN1c3RvbSBzeW1ib2xvZ3ksIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wb2ludFRvTGF5ZXIpIHtcbiAgICAgICAgdmFyIGdldEljb24gPSB0aGlzLm9wdGlvbnMucG9pbnRUb0xheWVyKGdlb2pzb24sIGxhdExuZyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLCBnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdKSk7XG4gICAgICAgIHZhciB1cGRhdGVkSWNvbiA9IGdldEljb24ub3B0aW9ucy5pY29uO1xuICAgICAgICBsYXllci5zZXRJY29uKHVwZGF0ZWRJY29uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBsb29rcyBsaWtlIGEgdmVjdG9yIG1hcmtlciAoY2lyY2xlTWFya2VyKVxuICAgIGlmIChsYXllciAmJiBsYXllci5zZXRTdHlsZSAmJiB0aGlzLm9wdGlvbnMucG9pbnRUb0xheWVyKSB7XG4gICAgICB2YXIgZ2V0U3R5bGUgPSB0aGlzLm9wdGlvbnMucG9pbnRUb0xheWVyKGdlb2pzb24sIGxhdExuZyhnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLCBnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdKSk7XG4gICAgICB2YXIgdXBkYXRlZFN0eWxlID0gZ2V0U3R5bGUub3B0aW9ucztcbiAgICAgIHRoaXMuc2V0RmVhdHVyZVN0eWxlKGdlb2pzb24uaWQsIHVwZGF0ZWRTdHlsZSk7XG4gICAgfVxuXG4gICAgLy8gbG9va3MgbGlrZSBhIHBhdGggKHBvbHlnb24vcG9seWxpbmUpXG4gICAgaWYgKGxheWVyICYmIGxheWVyLnNldFN0eWxlICYmIHRoaXMub3B0aW9ucy5zdHlsZSkge1xuICAgICAgdGhpcy5yZXNldFN0eWxlKGdlb2pzb24uaWQpO1xuICAgIH1cbiAgfVxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlTGF5ZXIgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBGZWF0dXJlTGF5ZXIob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZlYXR1cmVMYXllcjtcbiIsIi8vIGV4cG9ydCB2ZXJzaW9uXG5leHBvcnQge3ZlcnNpb24gYXMgVkVSU0lPTn0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcblxuLy8gaW1wb3J0IGJhc2VcbmV4cG9ydCB7IFN1cHBvcnQgfSBmcm9tICcuL1N1cHBvcnQnO1xuZXhwb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vT3B0aW9ucyc7XG5leHBvcnQgeyBFc3JpVXRpbCBhcyBVdGlsIH0gZnJvbSAnLi9VdGlsJztcbmV4cG9ydCB7IGdldCwgcG9zdCwgcmVxdWVzdCB9IGZyb20gJy4vUmVxdWVzdCc7XG5cbi8vIGV4cG9ydCB0YXNrc1xuZXhwb3J0IHsgVGFzaywgdGFzayB9IGZyb20gJy4vVGFza3MvVGFzayc7XG5leHBvcnQgeyBRdWVyeSwgcXVlcnkgfSBmcm9tICcuL1Rhc2tzL1F1ZXJ5JztcbmV4cG9ydCB7IEZpbmQsIGZpbmQgfSBmcm9tICcuL1Rhc2tzL0ZpbmQnO1xuZXhwb3J0IHsgSWRlbnRpZnksIGlkZW50aWZ5IH0gZnJvbSAnLi9UYXNrcy9JZGVudGlmeSc7XG5leHBvcnQgeyBJZGVudGlmeUZlYXR1cmVzLCBpZGVudGlmeUZlYXR1cmVzIH0gZnJvbSAnLi9UYXNrcy9JZGVudGlmeUZlYXR1cmVzJztcbmV4cG9ydCB7IElkZW50aWZ5SW1hZ2UsIGlkZW50aWZ5SW1hZ2UgfSBmcm9tICcuL1Rhc2tzL0lkZW50aWZ5SW1hZ2UnO1xuXG4vLyBleHBvcnQgc2VydmljZXNcbmV4cG9ydCB7IFNlcnZpY2UsIHNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2VzL1NlcnZpY2UnO1xuZXhwb3J0IHsgTWFwU2VydmljZSwgbWFwU2VydmljZSB9IGZyb20gJy4vU2VydmljZXMvTWFwU2VydmljZSc7XG5leHBvcnQgeyBJbWFnZVNlcnZpY2UsIGltYWdlU2VydmljZSB9IGZyb20gJy4vU2VydmljZXMvSW1hZ2VTZXJ2aWNlJztcbmV4cG9ydCB7IEZlYXR1cmVMYXllclNlcnZpY2UsIGZlYXR1cmVMYXllclNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2VzL0ZlYXR1cmVMYXllclNlcnZpY2UnO1xuXG4vLyBleHBvcnQgbGF5ZXJzXG5leHBvcnQgeyBCYXNlbWFwTGF5ZXIsIGJhc2VtYXBMYXllciB9IGZyb20gJy4vTGF5ZXJzL0Jhc2VtYXBMYXllcic7XG5leHBvcnQgeyBUaWxlZE1hcExheWVyLCB0aWxlZE1hcExheWVyIH0gZnJvbSAnLi9MYXllcnMvVGlsZWRNYXBMYXllcic7XG5leHBvcnQgeyBSYXN0ZXJMYXllciB9IGZyb20gJy4vTGF5ZXJzL1Jhc3RlckxheWVyJztcbmV4cG9ydCB7IEltYWdlTWFwTGF5ZXIsIGltYWdlTWFwTGF5ZXIgfSBmcm9tICcuL0xheWVycy9JbWFnZU1hcExheWVyJztcbmV4cG9ydCB7IER5bmFtaWNNYXBMYXllciwgZHluYW1pY01hcExheWVyIH0gZnJvbSAnLi9MYXllcnMvRHluYW1pY01hcExheWVyJztcbmV4cG9ydCB7IEZlYXR1cmVNYW5hZ2VyIH0gZnJvbSAnLi9MYXllcnMvRmVhdHVyZUxheWVyL0ZlYXR1cmVNYW5hZ2VyJztcbmV4cG9ydCB7IEZlYXR1cmVMYXllciwgZmVhdHVyZUxheWVyIH0gZnJvbSAnLi9MYXllcnMvRmVhdHVyZUxheWVyL0ZlYXR1cmVMYXllcic7XG4iXSwibmFtZXMiOlsiVXRpbCIsIkRvbVV0aWwiLCJnZW9qc29uVG9BcmNHSVMiLCJnMmEiLCJhcmNnaXNUb0dlb0pTT04iLCJhMmciLCJsYXRMbmciLCJsYXRMbmdCb3VuZHMiLCJvcHRpb25zIiwiTGF0TG5nQm91bmRzIiwiTGF0TG5nIiwiR2VvSlNPTiIsIkNsYXNzIiwicG9pbnQiLCJFdmVudGVkIiwicmVxdWVzdCIsIlRpbGVMYXllciIsIkRvbUV2ZW50IiwiQ1JTIiwiSW1hZ2VPdmVybGF5IiwiTGF5ZXIiLCJwb3B1cCIsImJvdW5kcyIsInNldE9wdGlvbnMiLCJQYXRoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFPLElBQUksSUFBSSxLQUFLLE1BQU0sQ0FBQyxjQUFjLElBQUksaUJBQWlCLElBQUksSUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztBQUNoRyxBQUFPLElBQUksYUFBYSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxFQUFFLENBQUM7O0FBRS9FLEFBQVUsSUFBQyxPQUFPLEdBQUc7RUFDbkIsSUFBSSxFQUFFLElBQUk7RUFDVixhQUFhLEVBQUUsYUFBYTtDQUM3Qjs7QUNOUyxJQUFDLE9BQU8sR0FBRztFQUNuQixzQkFBc0IsRUFBRSxFQUFFO0NBQzNCOztBQ0VELElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQzs7QUFFbEIsU0FBUyxTQUFTLEVBQUUsTUFBTSxFQUFFO0VBQzFCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQzs7RUFFZCxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDOztFQUU5QixLQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sRUFBRTtJQUN0QixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7TUFDOUIsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFD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Q0FBQztHQUNYO0VBQ0QsUUFBUSxLQUFLLElBQUksQ0FBQyxFQUFFO0NBQ3JCOzs7QUFHRCxTQUFTLHNCQUFzQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtFQUMvQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BGLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEYsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFbkYsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO0lBQ1osSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNsQixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDOztJQUVsQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7TUFDNUMsT0FBTyxJQUFJLENBQUM7S0FDYjtHQUNGOztFQUVELE9BQU8sS0FBSyxDQUFDO0NBQ2Q7OztBQUdELFNBQVMsb0JBQW9CLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNuQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO01BQ3JDLElBQUksc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUMxRCxPQUFPLElBQUksQ0FBQztPQUNiO0tBQ0Y7R0FDRjs7RUFFRCxPQUFPLEtBQUssQ0FBQztDQUNkOzs7QUFHRCxTQUFTLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUU7RUFDcEQsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO0VBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFDbEUsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUM3RCxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDL0QsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUMzSixRQUFRLEdBQUcsQ0FBQyxRQUFRLENBQUM7S0FDdEI7R0FDRjtFQUNELE9BQU8sUUFBUSxDQUFDO0NBQ2pCOzs7QUFHRCxTQUFTLDZCQUE2QixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7RUFDcEQsSUFBSSxVQUFVLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0VBQ3BELElBQUksUUFBUSxHQUFHLHVCQUF1QixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUN4RCxJQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsRUFBRTtJQUMzQixPQUFPLElBQUksQ0FBQztHQUNiO0VBQ0QsT0FBTyxLQUFLLENBQUM7Q0FDZDs7Ozs7QUFLRCxTQUFTLHFCQUFxQixFQUFFLEtBQUssRUFBRTtFQUNyQyxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7RUFDcEIsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0VBQ2YsSUFBSSxDQUFDLENBQUM7RUFDTixJQUFJLFNBQVMsQ0FBQztFQUNkLElBQUksSUFBSSxDQUFDOzs7RUFHVCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtJQUNyQyxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDbkIsU0FBUztLQUNWOztJQUVELElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFO01BQ3pCLElBQUksT0FBTyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7TUFDekMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUMxQixNQUFNO01BQ0wsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztLQUNwQztHQUNGOztFQUVELElBQUksZ0JBQWdCLEdBQUcsRUFBRSxDQUFDOzs7RUFHMUIsT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFOztJQUVuQixJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDOzs7SUFHbkIsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLEtBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7TUFDM0MsU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM3QixJQUFJLDZCQUE2QixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRTs7UUFFbEQsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE1BQU07T0FDUDtLQUNGOzs7O0lBSUQsSUFBSSxDQUFDLFNBQVMsRUFBRTtNQUNkLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM3QjtHQUNGOzs7RUFHRCxPQUFPLGdCQUFnQixDQUFDLE1BQU0sRUFBRTs7SUFFOUIsSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDOzs7SUFHOUIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDOztJQUV2QixLQUFLLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO01BQzNDLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDN0IsSUFBSSxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUU7O1FBRXpDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsVUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQixNQUFNO09BQ1A7S0FDRjs7SUFFRCxJQUFJLENBQUMsVUFBVSxFQUFFO01BQ2YsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDbkM7R0FDRjs7RUFFRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0lBQzNCLE9BQU87TUFDTCxJQUFJLEVBQUUsU0FBUztNQUNmLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0tBQzNCLENBQUM7R0FDSCxNQUFNO0lBQ0wsT0FBTztNQUNMLElBQUksRUFBRSxjQUFjO01BQ3BCLFdBQVcsRUFBRSxVQUFVO0tBQ3hCLENBQUM7R0FDSDtDQUNGOzs7OztBQUtELFNBQVMsV0FBVyxFQUFFLElBQUksRUFBRTtFQUMxQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM1QixJQUFJLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BELElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7SUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRTtNQUMvQixTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDckI7O0lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzs7SUFFdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7TUFDdkMsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUMxQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1FBQ3BCLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFO1VBQ3pCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNoQjtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7T0FDbkI7S0FDRjtHQUNGOztFQUVELE9BQU8sTUFBTSxDQUFDO0NBQ2Y7Ozs7QUFJRCxTQUFTLHdCQUF3QixFQUFFLEtBQUssRUFBRTtFQUN4QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7RUFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDckMsSUFBSSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtNQUM1QyxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbkI7R0FDRjtFQUNELE9BQU8sTUFBTSxDQUFDO0NBQ2Y7Ozs7QUFJRCxTQUFTLFlBQVksRUFBRSxHQUFHLEVBQUU7RUFDMUIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLEtBQUssSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFO0lBQ2pCLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3BCO0dBQ0Y7RUFDRCxPQUFPLE1BQU0sQ0FBQztDQUNmOztBQUVELFNBQVMsS0FBSyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUU7RUFDdkMsSUFBSSxJQUFJLEdBQUcsV0FBVyxHQUFHLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztFQUNoRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtJQUNwQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEI7TUFDRSxHQUFHLElBQUksVUFBVTtPQUNoQixPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRO1FBQ2xDLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsQ0FBQztNQUN0QztNQUNBLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3hCO0dBQ0Y7RUFDRCxNQUFNLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0NBQzVDOztBQUVELEFBQU8sU0FBUyxlQUFlLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRTtFQUNwRCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7O0VBRWpCLElBQUksT0FBTyxNQUFNLENBQUMsQ0FBQyxLQUFLLFFBQVEsSUFBSSxPQUFPLE1BQU0sQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFO0lBQ2hFLE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO0lBQ3ZCLE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQyxJQUFJLE9BQU8sTUFBTSxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUU7TUFDaEMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3BDO0dBQ0Y7O0VBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO0lBQ2pCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO0lBQzVCLE9BQU8sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7R0FDOUM7O0VBRUQsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFO0lBQ2hCLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQzdCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO01BQzVCLE9BQU8sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDaEQsTUFBTTtNQUNMLE9BQU8sQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7TUFDakMsT0FBTyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM3QztHQUNGOztFQUVELElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTtJQUNoQixPQUFPLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztHQUN4RDs7RUFFRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtJQUN4QyxPQUFPLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztJQUN6QixPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMvRSxPQUFPLENBQUMsVUFBVSxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNsRixJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7TUFDckIsSUFBSTtRQUNGLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7T0FDcEQsQ0FBQyxPQUFPLEdBQUcsRUFBRTs7T0FFYjtLQUNGO0dBQ0Y7OztFQUdELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUMzRCxPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztHQUN6Qjs7RUFFRDtJQUNFLE1BQU0sQ0FBQyxnQkFBZ0I7SUFDdkIsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUk7SUFDNUIsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksS0FBSyxJQUFJO0lBQ3JDO0lBQ0EsT0FBTyxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7R0FDbkc7O0VBRUQsT0FBTyxPQUFPLENBQUM7Q0FDaEI7O0FBRUQsQUFBTyxTQUFTLGVBQWUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFO0VBQ3JELFdBQVcsR0FBRyxXQUFXLElBQUksVUFBVSxDQUFDO0VBQ3hDLElBQUksZ0JBQWdCLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7RUFDdEMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLElBQUksQ0FBQyxDQUFDOztFQUVOLFFBQVEsT0FBTyxDQUFDLElBQUk7SUFDbEIsS0FBSyxPQUFPO01BQ1YsTUFBTSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ2xDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNsQyxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7TUFDM0MsTUFBTTtJQUNSLEtBQUssWUFBWTtNQUNmLE1BQU0sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDN0MsTUFBTSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO01BQzNDLE1BQU07SUFDUixLQUFLLFlBQVk7TUFDZixNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM5QyxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7TUFDM0MsTUFBTTtJQUNSLEtBQUssaUJBQWlCO01BQ3BCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDNUMsTUFBTSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO01BQzNDLE1BQU07SUFDUixLQUFLLFNBQVM7TUFDWixNQUFNLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ3pELE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztNQUMzQyxNQUFNO0lBQ1IsS0FBSyxjQUFjO01BQ2pCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsd0JBQXdCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUN0RSxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7TUFDM0MsTUFBTTtJQUNSLEtBQUssU0FBUztNQUNaLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtRQUNwQixNQUFNLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO09BQ2xFO01BQ0QsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7TUFDakYsSUFBSSxPQUFPLENBQUMsRUFBRSxFQUFFO1FBQ2QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO09BQzdDO01BQ0QsTUFBTTtJQUNSLEtBQUssbUJBQW1CO01BQ3RCLE1BQU0sR0FBRyxFQUFFLENBQUM7TUFDWixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztPQUNoRTtNQUNELE1BQU07SUFDUixLQUFLLG9CQUFvQjtNQUN2QixNQUFNLEdBQUcsRUFBRSxDQUFDO01BQ1osS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM5QyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7T0FDbEU7TUFDRCxNQUFNO0dBQ1Q7O0VBRUQsT0FBTyxNQUFNLENBQUM7Q0FDZjs7QUMvV00sU0FBU0MsaUJBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFO0VBQ2hELE9BQU9DLGVBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7Q0FDN0I7O0FBRUQsQUFBTyxTQUFTQyxpQkFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7RUFDL0MsT0FBT0MsZUFBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztDQUM1Qjs7O0FBR0QsQUFBTyxTQUFTLGNBQWMsRUFBRSxNQUFNLEVBQUU7O0VBRXRDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUU7SUFDcEcsSUFBSSxFQUFFLEdBQUdDLGNBQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxJQUFJLEVBQUUsR0FBR0EsY0FBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLE9BQU9DLG9CQUFZLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0dBQzdCLE1BQU07SUFDTCxPQUFPLElBQUksQ0FBQztHQUNiO0NBQ0Y7OztBQUdELEFBQU8sU0FBUyxjQUFjLEVBQUUsTUFBTSxFQUFFO0VBQ3RDLE1BQU0sR0FBR0Esb0JBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztFQUM5QixPQUFPO0lBQ0wsTUFBTSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHO0lBQ2pDLE1BQU0sRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsR0FBRztJQUNqQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUc7SUFDakMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHO0lBQ2pDLGtCQUFrQixFQUFFO01BQ2xCLE1BQU0sRUFBRSxJQUFJO0tBQ2I7R0FDRixDQUFDO0NBQ0g7O0FBRUQsSUFBSSxlQUFlLEdBQUcsMEJBQTBCLENBQUM7OztBQUdqRCxBQUFPLFNBQVMsNEJBQTRCLEVBQUUsUUFBUSxFQUFFO0VBQ3RELElBQUksTUFBTSxDQUFDOztFQUVYLElBQUksUUFBUSxDQUFDLGlCQUFpQixFQUFFOztJQUU5QixNQUFNLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDO0dBQ3JDLE1BQU0sSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFOztJQUUxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO01BQ3BELElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssa0JBQWtCLEVBQUU7UUFDbEQsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2pDLE1BQU07T0FDUDtLQUNGO0lBQ0QsSUFBSSxDQUFDLE1BQU0sRUFBRTs7TUFFWCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNoRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRTtVQUNsRCxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7VUFDakMsTUFBTTtTQUNQO09BQ0Y7S0FDRjtHQUNGO0VBQ0QsT0FBTyxNQUFNLENBQUM7Q0FDZjs7O0FBR0QsQUFBTyxTQUFTLDJCQUEyQixFQUFFLE9BQU8sRUFBRTtFQUNwRCxLQUFLLElBQUksR0FBRyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7SUFDbEMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFO01BQzlCLE9BQU8sR0FBRyxDQUFDO0tBQ1o7R0FDRjtDQUNGOztBQUVELEFBQU8sU0FBUywyQkFBMkIsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFO0VBQ2xFLElBQUksYUFBYSxDQUFDO0VBQ2xCLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQztFQUNyRCxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDOztFQUU1QixJQUFJLFdBQVcsRUFBRTtJQUNmLGFBQWEsR0FBRyxXQUFXLENBQUM7R0FDN0IsTUFBTTtJQUNMLGFBQWEsR0FBRyw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztHQUN4RDs7RUFFRCxJQUFJLGlCQUFpQixHQUFHO0lBQ3RCLElBQUksRUFBRSxtQkFBbUI7SUFDekIsUUFBUSxFQUFFLEVBQUU7R0FDYixDQUFDOztFQUVGLElBQUksS0FBSyxFQUFFO0lBQ1QsS0FBSyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO01BQzdDLElBQUksT0FBTyxHQUFHSCxpQkFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLElBQUksMkJBQTJCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUN0RyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQzFDO0dBQ0Y7O0VBRUQsT0FBTyxpQkFBaUIsQ0FBQztDQUMxQjs7O0FBR0QsQUFBTyxTQUFTLFFBQVEsRUFBRSxHQUFHLEVBQUU7O0VBRTdCLEdBQUcsR0FBR0osWUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzs7O0VBR3JCLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO0lBQy9CLEdBQUcsSUFBSSxHQUFHLENBQUM7R0FDWjs7RUFFRCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7O0FBSUQsQUFBTyxTQUFTLFlBQVksRUFBRVEsVUFBTyxFQUFFO0VBQ3JDLElBQUlBLFVBQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0lBQ25DQSxVQUFPLENBQUMsYUFBYSxHQUFHQSxVQUFPLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztJQUNwRCxJQUFJLFdBQVcsR0FBR0EsVUFBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUNBLFVBQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RFQSxVQUFPLENBQUMsR0FBRyxHQUFHQSxVQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4Q0EsVUFBTyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7R0FDekk7RUFDREEsVUFBTyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUNBLFVBQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbEQsT0FBT0EsVUFBTyxDQUFDO0NBQ2hCOztBQUVELEFBQU8sU0FBUyxjQUFjLEVBQUUsR0FBRyxFQUFFOzs7RUFHbkMsT0FBTyxDQUFDLDREQUE0RCxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNqRjs7QUFFRCxBQUFPLFNBQVMsbUJBQW1CLEVBQUUsV0FBVyxFQUFFO0VBQ2hELElBQUksa0JBQWtCLENBQUM7RUFDdkIsUUFBUSxXQUFXO0lBQ2pCLEtBQUssT0FBTztNQUNWLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDO01BQ3pDLE1BQU07SUFDUixLQUFLLFlBQVk7TUFDZixrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztNQUM5QyxNQUFNO0lBQ1IsS0FBSyxZQUFZO01BQ2Ysa0JBQWtCLEdBQUcsc0JBQXNCLENBQUM7TUFDNUMsTUFBTTtJQUNSLEtBQUssaUJBQWlCO01BQ3BCLGtCQUFrQixHQUFHLHNCQUFzQixDQUFDO01BQzVDLE1BQU07SUFDUixLQUFLLFNBQVM7TUFDWixrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztNQUMzQyxNQUFNO0lBQ1IsS0FBSyxjQUFjO01BQ2pCLGtCQUFrQixHQUFHLHFCQUFxQixDQUFDO01BQzNDLE1BQU07R0FDVDs7RUFFRCxPQUFPLGtCQUFrQixDQUFDO0NBQzNCOztBQUVELEFBQU8sU0FBUyxJQUFJLElBQUk7RUFDdEIsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksRUFBRTtJQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7R0FDeEM7Q0FDRjs7QUFFRCxBQUFPLFNBQVMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFOztFQUV6QyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsc0JBQXNCLElBQUksSUFBSSxDQUFDO0NBQ2xFOztBQUVELEFBQU8sU0FBUyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7RUFDdkMsSUFBSSxHQUFHLENBQUMsa0JBQWtCLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLEVBQUU7SUFDM0UsR0FBRyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQywySUFBMkksQ0FBQyxDQUFDOztJQUU5SyxJQUFJLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUQscUJBQXFCLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztJQUN4QyxxQkFBcUIsQ0FBQyxTQUFTLEdBQUcscUNBQXFDO01BQ3JFLHNCQUFzQjtJQUN4QixHQUFHLENBQUM7O0lBRUosUUFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQzVFUCxlQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsa0NBQWtDLENBQUMsQ0FBQzs7O0lBR3hGLElBQUksZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2RCxnQkFBZ0IsQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO0lBQ25DLGdCQUFnQixDQUFDLFNBQVMsR0FBRywrQkFBK0I7TUFDMUQsdUJBQXVCO01BQ3ZCLHNCQUFzQjtNQUN0QixtQkFBbUI7TUFDbkIsMEJBQTBCO01BQzFCLHdCQUF3QjtNQUN4Qiw2QkFBNkI7TUFDN0IsdUJBQXVCO01BQ3ZCLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHO0lBQ2pELEdBQUcsQ0FBQzs7SUFFSixRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdkVBLGVBQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDOzs7SUFHbEYsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEVBQUU7TUFDNUIsR0FBRyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNuRixDQUFDLENBQUM7OztJQUdILEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFlBQVk7TUFDM0IscUJBQXFCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO01BQ3BFLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztNQUMxRCxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsQ0FBQztNQUNoRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN4QyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO09BQzNEO0tBQ0YsQ0FBQyxDQUFDOztJQUVILEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7R0FDckQ7Q0FDRjs7QUFFRCxBQUFPLFNBQVMsWUFBWSxFQUFFLFFBQVEsRUFBRTtFQUN0QyxJQUFJLE1BQU0sR0FBRztJQUNYLFFBQVEsRUFBRSxJQUFJO0lBQ2QsWUFBWSxFQUFFLElBQUk7R0FDbkIsQ0FBQzs7O0VBR0YsSUFBSSxRQUFRLFlBQVlRLG9CQUFZLEVBQUU7O0lBRXBDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsc0JBQXNCLENBQUM7SUFDN0MsT0FBTyxNQUFNLENBQUM7R0FDZjs7O0VBR0QsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFO0lBQ3RCLFFBQVEsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7R0FDakM7OztFQUdELElBQUksUUFBUSxZQUFZQyxjQUFNLEVBQUU7SUFDOUIsUUFBUSxHQUFHO01BQ1QsSUFBSSxFQUFFLE9BQU87TUFDYixXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUM7S0FDMUMsQ0FBQztHQUNIOzs7RUFHRCxJQUFJLFFBQVEsWUFBWUMsZUFBTyxFQUFFOztJQUUvQixRQUFRLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDcEQsTUFBTSxDQUFDLFFBQVEsR0FBR1QsaUJBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QyxNQUFNLENBQUMsWUFBWSxHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUMxRDs7O0VBR0QsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFO0lBQ3RCLFFBQVEsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7R0FDakM7OztFQUdELElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7O0lBRS9CLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO0dBQzlCOzs7RUFHRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssWUFBWSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFO0lBQ2xJLE1BQU0sQ0FBQyxRQUFRLEdBQUdBLGlCQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUMsTUFBTSxDQUFDLFlBQVksR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekQsT0FBTyxNQUFNLENBQUM7R0FDZjs7O0VBR0QsSUFBSSxDQUFDLGlKQUFpSixDQUFDLENBQUM7O0VBRXhKLE9BQU87Q0FDUjs7QUFFRCxBQUFPLFNBQVMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtFQUM3QyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRUYsWUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssRUFBRSxZQUFZLEVBQUU7SUFDdEQsSUFBSSxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUU7SUFDdEIsR0FBRyxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztJQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7TUFDekQsSUFBSSxXQUFXLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7TUFFL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3pELElBQUksWUFBWSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxTQUFTLEdBQUdNLGNBQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFJLFNBQVMsR0FBR0EsY0FBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7VUFDekIsV0FBVyxFQUFFLFdBQVcsQ0FBQyxXQUFXO1VBQ3BDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSztVQUN6QixNQUFNLEVBQUVDLG9CQUFZLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztVQUMxQyxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU87VUFDN0IsT0FBTyxFQUFFLFlBQVksQ0FBQyxPQUFPO1NBQzlCLENBQUMsQ0FBQztPQUNKO0tBQ0Y7O0lBRUQsR0FBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7TUFDekMsT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7S0FDMUIsQ0FBQyxDQUFDOzs7SUFHSCxJQUFJLEdBQUcsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMxQixxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUM1QixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDWDs7QUFFRCxBQUFPLFNBQVMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO0VBQzFDLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7RUFDckIsSUFBSSxlQUFlLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDOztFQUU1QyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsa0JBQWtCLElBQUksZUFBZSxFQUFFO0lBQ3BELElBQUksZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUN6QixJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDN0IsSUFBSSxhQUFhLEdBQUdBLG9CQUFZO01BQzlCLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLEVBQUU7TUFDNUIsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksRUFBRTtLQUM3QixDQUFDO0lBQ0YsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDOztJQUV6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtNQUMvQyxJQUFJLFdBQVcsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDckMsSUFBSSxJQUFJLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQzs7TUFFbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUU7UUFDOUksZUFBZSxLQUFLLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztPQUNsQztLQUNGOztJQUVELGVBQWUsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVDLElBQUksa0JBQWtCLEdBQUcsR0FBRyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsQ0FBQzs7SUFFdEcsa0JBQWtCLENBQUMsU0FBUyxHQUFHLGVBQWUsQ0FBQztJQUMvQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDOztJQUU5RCxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO01BQzdCLFdBQVcsRUFBRSxlQUFlO0tBQzdCLENBQUMsQ0FBQztHQUNKO0NBQ0Y7O0FBRUQsQUFBVSxJQUFDLFFBQVEsR0FBRztFQUNwQixJQUFJLEVBQUUsSUFBSTtFQUNWLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLFlBQVksRUFBRSxZQUFZO0VBQzFCLGNBQWMsRUFBRSxjQUFjO0VBQzlCLG1CQUFtQixFQUFFLG1CQUFtQjtFQUN4QywyQkFBMkIsRUFBRSwyQkFBMkI7RUFDeEQsZUFBZSxFQUFFTCxpQkFBZTtFQUNoQyxlQUFlLEVBQUVFLGlCQUFlO0VBQ2hDLGNBQWMsRUFBRSxjQUFjO0VBQzlCLGNBQWMsRUFBRSxjQUFjO0VBQzlCLG9CQUFvQixFQUFFLG9CQUFvQjtFQUMxQyxrQkFBa0IsRUFBRSxrQkFBa0I7RUFDdEMsWUFBWSxFQUFFLFlBQVk7RUFDMUIsbUJBQW1CLEVBQUUsbUJBQW1CO0VBQ3hDLHFCQUFxQixFQUFFLHFCQUFxQjtFQUM1QywyQkFBMkIsRUFBRSwyQkFBMkI7RUFDeEQsNEJBQTRCLEVBQUUsNEJBQTRCO0NBQzNEOztBQzNXUyxJQUFDLElBQUksR0FBR1EsYUFBSyxDQUFDLE1BQU0sQ0FBQzs7RUFFN0IsT0FBTyxFQUFFO0lBQ1AsS0FBSyxFQUFFLEtBQUs7SUFDWixPQUFPLEVBQUUsSUFBSTtHQUNkOzs7RUFHRCxjQUFjLEVBQUUsVUFBVSxLQUFLLEVBQUUsT0FBTyxFQUFFO0lBQ3hDLE9BQU9aLFlBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLEVBQUU7TUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7TUFDM0IsT0FBTyxJQUFJLENBQUM7S0FDYixFQUFFLE9BQU8sQ0FBQyxDQUFDO0dBQ2I7O0VBRUQsVUFBVSxFQUFFLFVBQVUsUUFBUSxFQUFFOztJQUU5QixJQUFJLFFBQVEsQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtNQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztNQUN6QkEsWUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ3pDLE1BQU07TUFDTEEsWUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7TUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUMzQzs7O0lBR0QsSUFBSSxDQUFDLE1BQU0sR0FBR0EsWUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQzs7O0lBR2pELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtNQUNoQixLQUFLLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7UUFDL0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7T0FDakQ7S0FDRjtHQUNGOztFQUVELEtBQUssRUFBRSxVQUFVLEtBQUssRUFBRTtJQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7TUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDbkMsTUFBTTtNQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztLQUMzQjtJQUNELE9BQU8sSUFBSSxDQUFDO0dBQ2I7OztFQUdELE1BQU0sRUFBRSxVQUFVLE9BQU8sRUFBRTs7SUFFekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUMvQyxPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELE9BQU8sRUFBRSxVQUFVLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDcEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtNQUM5QkEsWUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDdEQ7SUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7TUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3pFOztJQUVELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztHQUM1RTs7RUFFRCxRQUFRLEVBQUUsVUFBVSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFO0lBQzNELElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7O0lBRTlHLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLE1BQU0sS0FBSyxTQUFTLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtNQUN2RSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQzFEOztJQUVELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0dBQ3hEO0NBQ0YsQ0FBQyxDQUFDOztBQUVILEFBQU8sU0FBUyxJQUFJLEVBQUUsT0FBTyxFQUFFO0VBQzdCLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7RUFDaEMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztDQUMxQjs7QUN6RVMsSUFBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztFQUM3QixPQUFPLEVBQUU7SUFDUCxRQUFRLEVBQUUsY0FBYztJQUN4QixPQUFPLEVBQUUsbUJBQW1CO0lBQzVCLFFBQVEsRUFBRSxXQUFXO0lBQ3JCLFdBQVcsRUFBRSxtQkFBbUI7SUFDaEMsWUFBWSxFQUFFLFdBQVc7SUFDekIsZ0JBQWdCLEVBQUUsZ0JBQWdCO0lBQ2xDLFNBQVMsRUFBRSxTQUFTO0lBQ3BCLFdBQVcsRUFBRSxxQkFBcUI7SUFDbEMsT0FBTyxFQUFFLE9BQU87R0FDakI7O0VBRUQsSUFBSSxFQUFFLE9BQU87O0VBRWIsTUFBTSxFQUFFO0lBQ04sY0FBYyxFQUFFLElBQUk7SUFDcEIsS0FBSyxFQUFFLEtBQUs7SUFDWixLQUFLLEVBQUUsSUFBSTtJQUNYLFNBQVMsRUFBRSxHQUFHO0dBQ2Y7OztFQUdELE1BQU0sRUFBRSxVQUFVLFFBQVEsRUFBRTtJQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsd0JBQXdCLENBQUM7SUFDbEQsT0FBTyxJQUFJLENBQUM7R0FDYjs7O0VBR0QsVUFBVSxFQUFFLFVBQVUsUUFBUSxFQUFFO0lBQzlCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRywwQkFBMEIsQ0FBQztJQUNwRCxPQUFPLElBQUksQ0FBQztHQUNiOzs7RUFHRCxRQUFRLEVBQUUsVUFBVSxRQUFRLEVBQUU7SUFDNUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLHNCQUFzQixDQUFDO0lBQ2hELE9BQU8sSUFBSSxDQUFDO0dBQ2I7OztFQUdELE9BQU8sRUFBRSxVQUFVLFFBQVEsRUFBRTtJQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsdUJBQXVCLENBQUM7SUFDakQsT0FBTyxJQUFJLENBQUM7R0FDYjs7O0VBR0QsT0FBTyxFQUFFLFVBQVUsUUFBUSxFQUFFO0lBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQztJQUNqRCxPQUFPLElBQUksQ0FBQztHQUNiOzs7RUFHRCxRQUFRLEVBQUUsVUFBVSxRQUFRLEVBQUU7SUFDNUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLHdCQUF3QixDQUFDO0lBQ2xELE9BQU8sSUFBSSxDQUFDO0dBQ2I7OztFQUdELGNBQWMsRUFBRSxVQUFVLFFBQVEsRUFBRTtJQUNsQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsa0NBQWtDLENBQUM7SUFDNUQsT0FBTyxJQUFJLENBQUM7R0FDYjs7O0VBR0QsZUFBZSxFQUFFLFVBQVUsUUFBUSxFQUFFO0lBQ25DLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRywrQkFBK0IsQ0FBQztJQUN6RCxPQUFPLElBQUksQ0FBQztHQUNiOzs7RUFHRCxNQUFNLEVBQUUsVUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFO0lBQ2hDLE1BQU0sR0FBR00sY0FBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsbUJBQW1CLENBQUM7SUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsMEJBQTBCLENBQUM7SUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsa0JBQWtCLENBQUM7SUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO0lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUN4QixPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELEtBQUssRUFBRSxVQUFVLE1BQU0sRUFBRTs7SUFFdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO0lBQzNCLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsT0FBTyxFQUFFLFVBQVUsS0FBSyxFQUFFLEdBQUcsRUFBRTtJQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNwRCxPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELFFBQVEsRUFBRSxVQUFVLEdBQUcsRUFBRSxNQUFNLEVBQUU7SUFDL0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDL0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQztJQUN2RSxPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELE9BQU8sRUFBRSxVQUFVLFNBQVMsRUFBRSxLQUFLLEVBQUU7SUFDbkMsS0FBSyxHQUFHLEtBQUssSUFBSSxLQUFLLENBQUM7SUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQy9GLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVELE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsR0FBRyxFQUFFLFVBQVUsUUFBUSxFQUFFLE9BQU8sRUFBRTtJQUNoQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7OztJQUdwQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO01BQzdELElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQzs7TUFFMUIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBRTtRQUM3QyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7T0FDbkQsRUFBRSxJQUFJLENBQUMsQ0FBQzs7O0tBR1YsTUFBTTtNQUNMLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUU7UUFDN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEdBQUcsUUFBUSxJQUFJLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO09BQzlGLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDVjtHQUNGOztFQUVELEtBQUssRUFBRSxVQUFVLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDbEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztJQUNuQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFO01BQzdDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQztLQUNwRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0dBQ2I7O0VBRUQsR0FBRyxFQUFFLFVBQVUsUUFBUSxFQUFFLE9BQU8sRUFBRTtJQUNoQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQ2pDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUU7TUFDN0MsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxHQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDO0tBQ3hFLEVBQUUsT0FBTyxDQUFDLENBQUM7R0FDYjs7O0VBR0QsTUFBTSxFQUFFLFVBQVUsUUFBUSxFQUFFLE9BQU8sRUFBRTtJQUNuQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDcEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBRTtNQUM3QyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDbEUsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7T0FDMUUsTUFBTTtRQUNMLEtBQUssR0FBRztVQUNOLE9BQU8sRUFBRSxnQkFBZ0I7U0FDMUIsQ0FBQztRQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7T0FDL0M7S0FDRixFQUFFLE9BQU8sQ0FBQyxDQUFDO0dBQ2I7O0VBRUQsUUFBUSxFQUFFLFlBQVk7O0lBRXBCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztJQUN4QyxPQUFPLElBQUksQ0FBQztHQUNiOzs7RUFHRCxTQUFTLEVBQUUsVUFBVSxRQUFRLEVBQUU7SUFDN0IsSUFBSSxTQUFTLEdBQUdPLGFBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELE9BQU8sSUFBSSxDQUFDO0dBQ2I7OztFQUdELEtBQUssRUFBRSxVQUFVLEtBQUssRUFBRTtJQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssR0FBRyxRQUFRLENBQUM7SUFDN0IsT0FBTyxJQUFJLENBQUM7R0FDYjs7RUFFRCxjQUFjLEVBQUUsVUFBVSxLQUFLLEVBQUU7SUFDL0IsSUFBSSxLQUFLLEVBQUU7TUFDVCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFO1FBQ3hCLElBQUksQ0FBQywrR0FBK0csQ0FBQyxDQUFDO09BQ3ZIO0tBQ0Y7R0FDRjs7RUFFRCxZQUFZLEVBQUUsWUFBWTtJQUN4QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO0lBQ2pDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztJQUNwQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO0dBQ3BDOztFQUVELGtCQUFrQixFQUFFLFVBQVUsUUFBUSxFQUFFO0lBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUN4QixJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDO0dBQ25EOztDQUVGLENBQUMsQ0FBQzs7QUFFSCxBQUFPLFNBQVMsS0FBSyxFQUFFLE9BQU8sRUFBRTtFQUM5QixPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0NBQzNCOztBQzNOUyxJQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0VBQzVCLE9BQU8sRUFBRTs7SUFFUCxVQUFVLEVBQUUsVUFBVTtJQUN0QixNQUFNLEVBQUUsWUFBWTtJQUNwQixRQUFRLEVBQUUsY0FBYztJQUN4QixrQkFBa0IsRUFBRSxJQUFJO0lBQ3hCLElBQUksRUFBRSxJQUFJO0lBQ1YsUUFBUSxFQUFFLFFBQVE7SUFDbEIsZ0JBQWdCLEVBQUUsZ0JBQWdCO0lBQ2xDLG9CQUFvQixFQUFFLG9CQUFvQjtJQUMxQyxXQUFXLEVBQUUsbUJBQW1CO0lBQ2hDLGVBQWUsRUFBRSxlQUFlO0lBQ2hDLFNBQVMsRUFBRSxTQUFTO0lBQ3BCLFNBQVMsRUFBRSxTQUFTO0lBQ3BCLFlBQVksRUFBRSxZQUFZOzs7SUFHMUIsT0FBTyxFQUFFLE9BQU87R0FDakI7O0VBRUQsSUFBSSxFQUFFLE1BQU07O0VBRVosTUFBTSxFQUFFO0lBQ04sRUFBRSxFQUFFLElBQUk7SUFDUixRQUFRLEVBQUUsSUFBSTtJQUNkLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLE9BQU8sRUFBRSxJQUFJO0lBQ2IsT0FBTyxFQUFFLEtBQUs7R0FDZjs7RUFFRCxTQUFTLEVBQUUsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFO0lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNuRixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqRCxPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELFFBQVEsRUFBRSxVQUFVLEdBQUcsRUFBRSxNQUFNLEVBQUU7SUFDL0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDL0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQztJQUN2RSxPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELEdBQUcsRUFBRSxVQUFVLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDaEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBRTtNQUM3QyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEdBQUcsUUFBUSxJQUFJLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO0tBQzlGLEVBQUUsT0FBTyxDQUFDLENBQUM7R0FDYjtDQUNGLENBQUMsQ0FBQzs7QUFFSCxBQUFPLFNBQVMsSUFBSSxFQUFFLE9BQU8sRUFBRTtFQUM3QixPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0NBQzFCOztBQ3JEUyxJQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0VBQ2hDLElBQUksRUFBRSxVQUFVOztFQUVoQixPQUFPLEVBQUUsVUFBVSxLQUFLLEVBQUUsR0FBRyxFQUFFO0lBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELE9BQU8sSUFBSSxDQUFDO0dBQ2I7Q0FDRixDQUFDLENBQUM7O0FBRUgsQUFBTyxTQUFTLFFBQVEsRUFBRSxPQUFPLEVBQUU7RUFDakMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztDQUM5Qjs7QUNOUyxJQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7RUFDNUMsT0FBTyxFQUFFO0lBQ1AsUUFBUSxFQUFFLFFBQVE7SUFDbEIsV0FBVyxFQUFFLG1CQUFtQjtJQUNoQyxXQUFXLEVBQUUsV0FBVzs7O0lBR3hCLGdCQUFnQixFQUFFLGdCQUFnQjtHQUNuQzs7RUFFRCxNQUFNLEVBQUU7SUFDTixFQUFFLEVBQUUsSUFBSTtJQUNSLE1BQU0sRUFBRSxLQUFLO0lBQ2IsU0FBUyxFQUFFLENBQUM7SUFDWixjQUFjLEVBQUUsSUFBSTtHQUNyQjs7RUFFRCxFQUFFLEVBQUUsVUFBVSxHQUFHLEVBQUU7SUFDakIsSUFBSSxNQUFNLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3RSxPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELEVBQUUsRUFBRSxVQUFVLFFBQVEsRUFBRTs7SUFFdEIsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUN6QixRQUFRLEdBQUdQLGNBQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUM3QjtJQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUU7SUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ25GLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pELE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsUUFBUSxFQUFFLFVBQVUsR0FBRyxFQUFFLE1BQU0sRUFBRTtJQUMvQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUMvRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDO0lBQ3ZFLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsR0FBRyxFQUFFLFVBQVUsUUFBUSxFQUFFLE9BQU8sRUFBRTtJQUNoQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFOztNQUU3QyxJQUFJLEtBQUssRUFBRTtRQUNULFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkQsT0FBTzs7O09BR1IsTUFBTTtRQUNMLElBQUksaUJBQWlCLEdBQUcsMkJBQTJCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUQsUUFBUSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1VBQzFELElBQUksT0FBTyxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUM1QyxPQUFPLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1NBQy9DO1FBQ0QsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFDO09BQ2hFO0tBQ0YsQ0FBQyxDQUFDO0dBQ0o7O0VBRUQsa0JBQWtCLEVBQUUsVUFBVSxRQUFRLEVBQUU7SUFDdEMsSUFBSSxTQUFTLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQztHQUNuRDtDQUNGLENBQUMsQ0FBQzs7QUFFSCxBQUFPLFNBQVMsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFO0VBQ3pDLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztDQUN0Qzs7QUM5RVMsSUFBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztFQUN6QyxPQUFPLEVBQUU7SUFDUCxlQUFlLEVBQUUsWUFBWTtJQUM3QixrQkFBa0IsRUFBRSxlQUFlO0lBQ25DLGNBQWMsRUFBRSxXQUFXO0lBQzNCLG9CQUFvQixFQUFFLG9CQUFvQjtJQUMxQyxnQkFBZ0IsRUFBRSxnQkFBZ0I7R0FDbkM7O0VBRUQsTUFBTSxFQUFFO0lBQ04sY0FBYyxFQUFFLEtBQUs7R0FDdEI7O0VBRUQsRUFBRSxFQUFFLFVBQVUsTUFBTSxFQUFFO0lBQ3BCLE1BQU0sR0FBR0EsY0FBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7TUFDcEMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHO01BQ2IsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHO01BQ2IsZ0JBQWdCLEVBQUU7UUFDaEIsSUFBSSxFQUFFLElBQUk7T0FDWDtLQUNGLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLG1CQUFtQixDQUFDO0lBQy9DLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsYUFBYSxFQUFFLFlBQVk7SUFDekIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztHQUMvQjs7RUFFRCxnQkFBZ0IsRUFBRSxZQUFZO0lBQzVCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7R0FDbEM7O0VBRUQsWUFBWSxFQUFFLFlBQVk7SUFDeEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztHQUM5Qjs7RUFFRCxHQUFHLEVBQUUsVUFBVSxRQUFRLEVBQUUsT0FBTyxFQUFFO0lBQ2hDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUU7TUFDN0MsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxHQUFHLFFBQVEsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7S0FDMUYsRUFBRSxJQUFJLENBQUMsQ0FBQztHQUNWOzs7OztFQUtELGtCQUFrQixFQUFFLFVBQVUsUUFBUSxFQUFFO0lBQ3RDLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7SUFDakMsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztJQUN6QyxJQUFJLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQztJQUMvRCxJQUFJLE9BQU8sR0FBRztNQUNaLE9BQU8sRUFBRTtRQUNQLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLFVBQVUsRUFBRTtVQUNWLE1BQU0sRUFBRSxPQUFPO1VBQ2YsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQ3hDO1FBQ0QsS0FBSyxFQUFFO1VBQ0wsTUFBTSxFQUFFLE1BQU07VUFDZCxZQUFZLEVBQUU7WUFDWixNQUFNLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUk7V0FDdkM7U0FDRjtRQUNELFlBQVksRUFBRTtVQUNaLFVBQVUsRUFBRSxRQUFRLENBQUMsUUFBUTtVQUM3QixNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUk7VUFDckIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1NBQ3hCO1FBQ0QsSUFBSSxFQUFFLFFBQVEsQ0FBQyxRQUFRO09BQ3hCO0tBQ0YsQ0FBQzs7SUFFRixJQUFJLFFBQVEsQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7TUFDckQsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO0tBQzlEOztJQUVELElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxRQUFRLEVBQUU7TUFDekMsT0FBTyxDQUFDLFlBQVksR0FBRywyQkFBMkIsQ0FBQyxZQUFZLENBQUMsQ0FBQztNQUNqRSxJQUFJLHVCQUF1QixJQUFJLHVCQUF1QixDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7UUFDdEcsS0FBSyxJQUFJLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7VUFDNUQsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLHFCQUFxQixHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hHO09BQ0Y7S0FDRjtJQUNELE9BQU8sT0FBTyxDQUFDO0dBQ2hCOztDQUVGLENBQUMsQ0FBQzs7QUFFSCxBQUFPLFNBQVMsYUFBYSxFQUFFLE1BQU0sRUFBRTtFQUNyQyxPQUFPLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0NBQ2xDOztBQzNGUyxJQUFDLE9BQU8sR0FBR1EsZUFBTyxDQUFDLE1BQU0sQ0FBQzs7RUFFbEMsT0FBTyxFQUFFO0lBQ1AsS0FBSyxFQUFFLEtBQUs7SUFDWixPQUFPLEVBQUUsSUFBSTtJQUNiLE9BQU8sRUFBRSxDQUFDO0dBQ1g7O0VBRUQsVUFBVSxFQUFFLFVBQVUsT0FBTyxFQUFFO0lBQzdCLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQzdCZCxZQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUMvQzs7RUFFRCxHQUFHLEVBQUUsVUFBVSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDOUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztHQUM5RDs7RUFFRCxJQUFJLEVBQUUsVUFBVSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDL0MsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztHQUMvRDs7RUFFRCxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDbEQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztHQUNsRTs7RUFFRCxRQUFRLEVBQUUsVUFBVSxRQUFRLEVBQUUsT0FBTyxFQUFFO0lBQ3JDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7R0FDeEQ7O0VBRUQsWUFBWSxFQUFFLFVBQVUsS0FBSyxFQUFFO0lBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUMzQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDakIsT0FBTyxJQUFJLENBQUM7R0FDYjs7RUFFRCxVQUFVLEVBQUUsWUFBWTtJQUN0QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0dBQzdCOztFQUVELFVBQVUsRUFBRSxVQUFVLE9BQU8sRUFBRTtJQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7R0FDaEM7O0VBRUQsUUFBUSxFQUFFLFVBQVUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRTtJQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtNQUN4QixHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSTtNQUM1QixNQUFNLEVBQUUsTUFBTTtNQUNkLE1BQU0sRUFBRSxNQUFNO0tBQ2YsRUFBRSxJQUFJLENBQUMsQ0FBQzs7SUFFVCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDOztJQUUzRixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO01BQ3RCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7S0FDbkM7SUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFO01BQzlCQSxZQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0tBQ2pEO0lBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO01BQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7TUFDbkUsT0FBTztLQUNSLE1BQU07TUFDTCxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDOztNQUU5RyxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxNQUFNLEtBQUssU0FBUyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7UUFDdkUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztPQUNqRSxNQUFNO1FBQ0wsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7T0FDL0Q7S0FDRjtHQUNGOztFQUVELHNCQUFzQixFQUFFLFVBQVUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRTtJQUN6RSxPQUFPQSxZQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBRTtNQUMxQyxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1FBQ3ZELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDOztRQUU1QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDOzs7UUFHbkUsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtVQUNsQyxZQUFZLEVBQUVBLFlBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7U0FDakQsRUFBRSxJQUFJLENBQUMsQ0FBQzs7O1FBR1QsS0FBSyxDQUFDLFlBQVksR0FBR0EsWUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO09BQ3pEOztNQUVELFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQzs7TUFFeEMsSUFBSSxLQUFLLEVBQUU7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtVQUN4QixHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSTtVQUM1QixNQUFNLEVBQUUsTUFBTTtVQUNkLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztVQUN0QixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7VUFDaEIsTUFBTSxFQUFFLE1BQU07U0FDZixFQUFFLElBQUksQ0FBQyxDQUFDO09BQ1YsTUFBTTtRQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7VUFDMUIsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLElBQUk7VUFDNUIsTUFBTSxFQUFFLE1BQU07VUFDZCxRQUFRLEVBQUUsUUFBUTtVQUNsQixNQUFNLEVBQUUsTUFBTTtTQUNmLEVBQUUsSUFBSSxDQUFDLENBQUM7T0FDVjs7TUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtRQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSTtRQUM1QixNQUFNLEVBQUUsTUFBTTtRQUNkLE1BQU0sRUFBRSxNQUFNO09BQ2YsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNWLEVBQUUsSUFBSSxDQUFDLENBQUM7R0FDVjs7RUFFRCxTQUFTLEVBQUUsWUFBWTtJQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO01BQ3ZELElBQUllLFVBQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ3BDLElBQUksTUFBTSxHQUFHQSxVQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7TUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUVBLFVBQU8sQ0FBQyxDQUFDO0tBQ25DO0lBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7R0FDekI7Q0FDRixDQUFDLENBQUM7O0FBRUgsQUFBTyxTQUFTLE9BQU8sRUFBRSxPQUFPLEVBQUU7RUFDaEMsT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztFQUNoQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0NBQzdCOztBQ3BJUyxJQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDOztFQUVyQyxRQUFRLEVBQUUsWUFBWTtJQUNwQixPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0dBQy9COztFQUVELElBQUksRUFBRSxZQUFZO0lBQ2hCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0dBQ25COztFQUVELEtBQUssRUFBRSxZQUFZO0lBQ2pCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0dBQ3BCOztDQUVGLENBQUMsQ0FBQzs7QUFFSCxBQUFPLFNBQVMsVUFBVSxFQUFFLE9BQU8sRUFBRTtFQUNuQyxPQUFPLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0NBQ2hDOztBQ25CUyxJQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDOztFQUV2QyxLQUFLLEVBQUUsWUFBWTtJQUNqQixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUNwQjs7RUFFRCxRQUFRLEVBQUUsWUFBWTtJQUNwQixPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUM1QjtDQUNGLENBQUMsQ0FBQzs7QUFFSCxBQUFPLFNBQVMsWUFBWSxFQUFFLE9BQU8sRUFBRTtFQUNyQyxPQUFPLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0NBQ2xDOztBQ2JTLElBQUMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQzs7RUFFOUMsT0FBTyxFQUFFO0lBQ1AsV0FBVyxFQUFFLFVBQVU7R0FDeEI7O0VBRUQsS0FBSyxFQUFFLFlBQVk7SUFDakIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDcEI7O0VBRUQsVUFBVSxFQUFFLFVBQVUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDaEQsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDOztJQUVsQixPQUFPLEdBQUdiLGlCQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7O0lBRW5DLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7TUFDOUIsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDO0tBQ3BCLEVBQUUsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFO01BQzVCLElBQUksTUFBTSxHQUFHLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7TUFDcEYsSUFBSSxRQUFRLEVBQUU7UUFDWixRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7T0FDdkU7S0FDRixFQUFFLE9BQU8sQ0FBQyxDQUFDO0dBQ2I7O0VBRUQsYUFBYSxFQUFFLFVBQVUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDbkQsT0FBTyxHQUFHQSxpQkFBZSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDOztJQUU3RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7TUFDakMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDO0tBQ3BCLEVBQUUsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFO01BQzVCLElBQUksTUFBTSxHQUFHLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxhQUFhLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7TUFDMUYsSUFBSSxRQUFRLEVBQUU7UUFDWixRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7T0FDMUU7S0FDRixFQUFFLE9BQU8sQ0FBQyxDQUFDO0dBQ2I7O0VBRUQsYUFBYSxFQUFFLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDOUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO01BQ2pDLFNBQVMsRUFBRSxFQUFFO0tBQ2QsRUFBRSxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUU7TUFDNUIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLGFBQWEsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztNQUMxRixJQUFJLFFBQVEsRUFBRTtRQUNaLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztPQUMxRTtLQUNGLEVBQUUsT0FBTyxDQUFDLENBQUM7R0FDYjs7RUFFRCxjQUFjLEVBQUUsVUFBVSxHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRTtJQUNoRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7TUFDakMsU0FBUyxFQUFFLEdBQUc7S0FDZixFQUFFLFVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBRTs7TUFFNUIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLGFBQWEsSUFBSSxRQUFRLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztNQUN2RixJQUFJLFFBQVEsRUFBRTtRQUNaLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztPQUMxRTtLQUNGLEVBQUUsT0FBTyxDQUFDLENBQUM7R0FDYjtDQUNGLENBQUMsQ0FBQzs7QUFFSCxBQUFPLFNBQVMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFO0VBQzVDLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztDQUN6Qzs7QUM1REQsSUFBSSxZQUFZLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQzs7QUFFaEYsQUFBVSxJQUFDLFlBQVksR0FBR2MsaUJBQVMsQ0FBQyxNQUFNLENBQUM7RUFDekMsT0FBTyxFQUFFO0lBQ1AsS0FBSyxFQUFFO01BQ0wsT0FBTyxFQUFFO1FBQ1AsV0FBVyxFQUFFLFlBQVksR0FBRyx5RkFBeUY7UUFDckgsT0FBTyxFQUFFO1VBQ1AsT0FBTyxFQUFFLENBQUM7VUFDVixPQUFPLEVBQUUsRUFBRTtVQUNYLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7VUFDbEMsV0FBVyxFQUFFLFlBQVk7VUFDekIsY0FBYyxFQUFFLHdEQUF3RDtTQUN6RTtPQUNGO01BQ0QsV0FBVyxFQUFFO1FBQ1gsV0FBVyxFQUFFLFlBQVksR0FBRyx1RkFBdUY7UUFDbkgsT0FBTyxFQUFFO1VBQ1AsT0FBTyxFQUFFLENBQUM7VUFDVixPQUFPLEVBQUUsRUFBRTtVQUNYLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7VUFDbEMsV0FBVyxFQUFFLFlBQVk7VUFDekIsY0FBYyxFQUFFLHNEQUFzRDtTQUN2RTtPQUNGO01BQ0QsTUFBTSxFQUFFO1FBQ04sV0FBVyxFQUFFLFlBQVksR0FBRywrRkFBK0Y7UUFDM0gsT0FBTyxFQUFFO1VBQ1AsT0FBTyxFQUFFLENBQUM7VUFDVixPQUFPLEVBQUUsRUFBRTtVQUNYLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7VUFDbEMsV0FBVyxFQUFFLFlBQVk7VUFDekIsY0FBYyxFQUFFLHFEQUFxRDtTQUN0RTtPQUNGO01BQ0QsWUFBWSxFQUFFO1FBQ1osV0FBVyxFQUFFLFlBQVksR0FBRyxvR0FBb0c7UUFDaEksT0FBTyxFQUFFO1VBQ1AsT0FBTyxFQUFFLENBQUM7VUFDVixPQUFPLEVBQUUsRUFBRTtVQUNYLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7VUFDbEMsSUFBSSxFQUFFLENBQUMsYUFBYSxJQUFJLGFBQWEsR0FBRyxVQUFVO1NBQ25EO09BQ0Y7TUFDRCxrQkFBa0IsRUFBRTtRQUNsQixXQUFXLEVBQUUsWUFBWSxHQUFHLHlGQUF5RjtRQUNySCxPQUFPLEVBQUU7VUFDUCxPQUFPLEVBQUUsQ0FBQztVQUNWLE9BQU8sRUFBRSxFQUFFO1VBQ1gsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztVQUNsQyxXQUFXLEVBQUUsNkdBQTZHO1NBQzNIO09BQ0Y7TUFDRCxRQUFRLEVBQUU7UUFDUixXQUFXLEVBQUUsWUFBWSxHQUFHLG9HQUFvRztRQUNoSSxPQUFPLEVBQUU7VUFDUCxPQUFPLEVBQUUsQ0FBQztVQUNWLE9BQU8sRUFBRSxFQUFFO1VBQ1gsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztVQUNsQyxXQUFXLEVBQUUsOERBQThEO1NBQzVFO09BQ0Y7TUFDRCxjQUFjLEVBQUU7UUFDZCxXQUFXLEVBQUUsWUFBWSxHQUFHLHlHQUF5RztRQUNySSxPQUFPLEVBQUU7VUFDUCxPQUFPLEVBQUUsQ0FBQztVQUNWLE9BQU8sRUFBRSxFQUFFO1VBQ1gsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztVQUNsQyxJQUFJLEVBQUUsQ0FBQyxhQUFhLElBQUksYUFBYSxHQUFHLFVBQVU7VUFDbEQsV0FBVyxFQUFFLEVBQUU7O1NBRWhCO09BQ0Y7TUFDRCxJQUFJLEVBQUU7UUFDSixXQUFXLEVBQUUsWUFBWSxHQUFHLHFHQUFxRztRQUNqSSxPQUFPLEVBQUU7VUFDUCxPQUFPLEVBQUUsQ0FBQztVQUNWLE9BQU8sRUFBRSxFQUFFO1VBQ1gsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztVQUNsQyxXQUFXLEVBQUUsOERBQThEO1NBQzVFO09BQ0Y7TUFDRCxVQUFVLEVBQUU7UUFDVixXQUFXLEVBQUUsWUFBWSxHQUFHLDBHQUEwRztRQUN0SSxPQUFPLEVBQUU7VUFDUCxPQUFPLEVBQUUsQ0FBQztVQUNWLE9BQU8sRUFBRSxFQUFFO1VBQ1gsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztVQUNsQyxJQUFJLEVBQUUsQ0FBQyxhQUFhLElBQUksYUFBYSxHQUFHLFVBQVU7VUFDbEQsV0FBVyxFQUFFLEVBQUU7U0FDaEI7T0FDRjtNQUNELE9BQU8sRUFBRTtRQUNQLFdBQVcsRUFBRSxZQUFZLEdBQUcsc0ZBQXNGO1FBQ2xILE9BQU8sRUFBRTtVQUNQLE9BQU8sRUFBRSxDQUFDO1VBQ1YsT0FBTyxFQUFFLEVBQUU7VUFDWCxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO1VBQ2xDLFdBQVcsRUFBRSx1SEFBdUg7VUFDcEksY0FBYyxFQUFFLHFEQUFxRDtTQUN0RTtPQUNGO01BQ0QsYUFBYSxFQUFFO1FBQ2IsV0FBVyxFQUFFLFlBQVksR0FBRyw4R0FBOEc7UUFDMUksT0FBTyxFQUFFO1VBQ1AsT0FBTyxFQUFFLENBQUM7VUFDVixPQUFPLEVBQUUsRUFBRTtVQUNYLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7VUFDbEMsSUFBSSxFQUFFLENBQUMsYUFBYSxJQUFJLGFBQWEsR0FBRyxVQUFVO1VBQ2xELFdBQVcsRUFBRSxFQUFFO1NBQ2hCO09BQ0Y7TUFDRCxxQkFBcUIsRUFBRTtRQUNyQixXQUFXLEVBQUUsWUFBWSxHQUFHLHVHQUF1RztRQUNuSSxPQUFPLEVBQUU7VUFDUCxPQUFPLEVBQUUsQ0FBQztVQUNWLE9BQU8sRUFBRSxFQUFFO1VBQ1gsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztVQUNsQyxJQUFJLEVBQUUsQ0FBQyxhQUFhLElBQUksYUFBYSxHQUFHLFVBQVU7U0FDbkQ7T0FDRjtNQUNELFlBQVksRUFBRTtRQUNaLFdBQVcsRUFBRSxZQUFZLEdBQUcsNEZBQTRGO1FBQ3hILE9BQU8sRUFBRTtVQUNQLE9BQU8sRUFBRSxDQUFDO1VBQ1YsT0FBTyxFQUFFLEVBQUU7VUFDWCxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO1VBQ2xDLFdBQVcsRUFBRSxNQUFNO1NBQ3BCO09BQ0Y7TUFDRCxrQkFBa0IsRUFBRTtRQUNsQixXQUFXLEVBQUUsWUFBWSxHQUFHLHdIQUF3SDtRQUNwSixPQUFPLEVBQUU7VUFDUCxPQUFPLEVBQUUsQ0FBQztVQUNWLE9BQU8sRUFBRSxFQUFFO1VBQ1gsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztVQUNsQyxJQUFJLEVBQUUsQ0FBQyxhQUFhLElBQUksYUFBYSxHQUFHLFVBQVU7VUFDbEQsV0FBVyxFQUFFLEVBQUU7U0FDaEI7T0FDRjtNQUNELE9BQU8sRUFBRTtRQUNQLFdBQVcsRUFBRSxZQUFZLEdBQUcsMkZBQTJGO1FBQ3ZILE9BQU8sRUFBRTtVQUNQLE9BQU8sRUFBRSxDQUFDO1VBQ1YsT0FBTyxFQUFFLEVBQUU7VUFDWCxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO1VBQ2xDLFdBQVcsRUFBRSxZQUFZO1NBQzFCO09BQ0Y7TUFDRCxhQUFhLEVBQUU7UUFDYixXQUFXLEVBQUUsWUFBWSxHQUFHLDBHQUEwRztRQUN0SSxPQUFPLEVBQUU7VUFDUCxPQUFPLEVBQUUsQ0FBQztVQUNWLE9BQU8sRUFBRSxFQUFFO1VBQ1gsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztVQUNsQyxJQUFJLEVBQUUsQ0FBQyxhQUFhLElBQUksYUFBYSxHQUFHLFVBQVU7VUFDbEQsV0FBVyxFQUFFLEVBQUU7U0FDaEI7T0FDRjtNQUNELE9BQU8sRUFBRTtRQUNQLFdBQVcsRUFBRSxZQUFZLEdBQUcsc0ZBQXNGO1FBQ2xILE9BQU8sRUFBRTtVQUNQLE9BQU8sRUFBRSxDQUFDO1VBQ1YsT0FBTyxFQUFFLEVBQUU7VUFDWCxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO1VBQ2xDLFdBQVcsRUFBRSw0Q0FBNEM7U0FDMUQ7T0FDRjtNQUNELGNBQWMsRUFBRTtRQUNkLFdBQVcsRUFBRSxZQUFZLEdBQUcsNkZBQTZGO1FBQ3pILE9BQU8sRUFBRTtVQUNQLE9BQU8sRUFBRSxDQUFDO1VBQ1YsT0FBTyxFQUFFLEVBQUU7VUFDWCxXQUFXLEVBQUUsMEhBQTBIO1NBQ3hJO09BQ0Y7S0FDRjtHQUNGOztFQUVELFVBQVUsRUFBRSxVQUFVLEdBQUcsRUFBRSxPQUFPLEVBQUU7SUFDbEMsSUFBSSxNQUFNLENBQUM7OztJQUdYLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtNQUM3RCxNQUFNLEdBQUcsR0FBRyxDQUFDO0tBQ2QsTUFBTSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO01BQzdELE1BQU0sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ2xDLE1BQU07TUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLHVVQUF1VSxDQUFDLENBQUM7S0FDMVY7OztJQUdELElBQUksV0FBVyxHQUFHaEIsWUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDOztJQUV2REEsWUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7O0lBRW5DLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7TUFDdEIsTUFBTSxDQUFDLFdBQVcsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN4RDs7O0lBR0RnQixpQkFBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0dBQzVFOztFQUVELEtBQUssRUFBRSxVQUFVLEdBQUcsRUFBRTs7SUFFcEIsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRXhCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssYUFBYSxFQUFFO01BQ3ZDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztLQUNsQjs7SUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFO01BQy9CLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ3ZEOztJQUVELEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLHFCQUFxQixDQUFDLENBQUM7O0lBRXpDQSxpQkFBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztHQUMzQzs7RUFFRCxRQUFRLEVBQUUsVUFBVSxHQUFHLEVBQUU7SUFDdkIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUscUJBQXFCLENBQUMsQ0FBQztJQUMxQ0EsaUJBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7R0FDOUM7O0VBRUQsU0FBUyxFQUFFLFlBQVk7SUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7TUFDekMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztNQUNuRCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7TUFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO0tBQ3pCO0dBQ0Y7O0VBRUQsY0FBYyxFQUFFLFlBQVk7SUFDMUIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTtNQUM1QixJQUFJLFdBQVcsR0FBRyx5Q0FBeUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7S0FDcEc7SUFDRCxPQUFPLFdBQVcsQ0FBQztHQUNwQjtDQUNGLENBQUMsQ0FBQzs7QUFFSCxBQUFPLFNBQVMsWUFBWSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUU7RUFDMUMsT0FBTyxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Q0FDdkM7O0FDeFBTLElBQUMsYUFBYSxHQUFHQSxpQkFBUyxDQUFDLE1BQU0sQ0FBQztFQUMxQyxPQUFPLEVBQUU7SUFDUCxtQkFBbUIsRUFBRSxHQUFHO0lBQ3hCLFlBQVksRUFBRSxnUEFBZ1A7R0FDL1A7O0VBRUQsT0FBTyxFQUFFO0lBQ1Asa0JBQWtCLEVBQUU7TUFDbEIsR0FBRyxFQUFFLGtCQUFrQjtNQUN2QixHQUFHLEVBQUUsa0JBQWtCO01BQ3ZCLEdBQUcsRUFBRSxrQkFBa0I7TUFDdkIsR0FBRyxFQUFFLGtCQUFrQjtNQUN2QixHQUFHLEVBQUUsa0JBQWtCO01BQ3ZCLEdBQUcsRUFBRSxrQkFBa0I7TUFDdkIsR0FBRyxFQUFFLGtCQUFrQjtNQUN2QixHQUFHLEVBQUUsa0JBQWtCO01BQ3ZCLEdBQUcsRUFBRSxrQkFBa0I7TUFDdkIsR0FBRyxFQUFFLGtCQUFrQjtNQUN2QixJQUFJLEVBQUUsZ0JBQWdCO01BQ3RCLElBQUksRUFBRSxrQkFBa0I7TUFDeEIsSUFBSSxFQUFFLGtCQUFrQjtNQUN4QixJQUFJLEVBQUUsa0JBQWtCO01BQ3hCLElBQUksRUFBRSxrQkFBa0I7TUFDeEIsSUFBSSxFQUFFLGtCQUFrQjtNQUN4QixJQUFJLEVBQUUsZ0JBQWdCO01BQ3RCLElBQUksRUFBRSxrQkFBa0I7TUFDeEIsSUFBSSxFQUFFLG1CQUFtQjtNQUN6QixJQUFJLEVBQUUsbUJBQW1CO01BQ3pCLElBQUksRUFBRSxnQkFBZ0I7TUFDdEIsSUFBSSxFQUFFLGdCQUFnQjtNQUN0QixJQUFJLEVBQUUsa0JBQWtCO01BQ3hCLElBQUksRUFBRSxrQkFBa0I7S0FDekI7R0FDRjs7RUFFRCxVQUFVLEVBQUUsVUFBVSxPQUFPLEVBQUU7SUFDN0IsT0FBTyxHQUFHaEIsWUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7OztJQUd6QyxPQUFPLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxPQUFPLENBQUMsR0FBRyxHQUFHLGtCQUFrQixJQUFJLE9BQU8sQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBR0EsWUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7OztJQUcxTixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7TUFDM0QsT0FBTyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2pFO0lBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7O0lBRWxDLElBQUksWUFBWSxHQUFHLElBQUksTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDN0QsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtNQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztNQUMvRCxPQUFPLENBQUMsVUFBVSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDM0M7O0lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtNQUN0QixJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ2xEOzs7SUFHRGdCLGlCQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7R0FDbEU7O0VBRUQsVUFBVSxFQUFFLFVBQVUsU0FBUyxFQUFFO0lBQy9CLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzs7SUFFakMsT0FBT2hCLFlBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRUEsWUFBSSxDQUFDLE1BQU0sQ0FBQztNQUM3QyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUM7TUFDaEMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO01BQ2QsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDOztNQUVkLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUk7S0FDcEUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztHQUNuQjs7RUFFRCxVQUFVLEVBQUUsVUFBVSxNQUFNLEVBQUUsSUFBSSxFQUFFO0lBQ2xDLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7O0lBRXpDaUIsZ0JBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRWpCLFlBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDekVpQixnQkFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFakIsWUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQzs7SUFFM0UsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTtNQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztLQUN2Qjs7Ozs7O0lBTUQsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7Ozs7SUFJZCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRTtNQUMxRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDcEMsTUFBTTtNQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVk7UUFDOUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO09BQ3BDLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDVjs7SUFFRCxPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELEtBQUssRUFBRSxVQUFVLEdBQUcsRUFBRTs7SUFFcEIsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRXhCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO01BQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLGdCQUFnQixFQUFFO1VBQ3ZDLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQzs7VUFFaEYsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFO1lBQ2pGLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7WUFDbEQsR0FBRyxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztXQUM5RDs7O1VBR0QsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBS2tCLFdBQUcsQ0FBQyxRQUFRLEtBQUssRUFBRSxLQUFLLE1BQU0sSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFDdEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7O1lBRWxCLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3hDLElBQUksa0JBQWtCLEdBQUcsYUFBYSxDQUFDLGtCQUFrQixDQUFDOztZQUUxRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtjQUMxQyxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Y0FDOUIsS0FBSyxJQUFJLEVBQUUsSUFBSSxrQkFBa0IsRUFBRTtnQkFDakMsSUFBSSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7O2dCQUV4QyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEVBQUU7a0JBQzlGLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztrQkFDbkMsTUFBTTtpQkFDUDtlQUNGO2FBQ0Y7O1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztXQUNyQixNQUFNLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTs7V0FFOUYsTUFBTTs7WUFFTCxJQUFJLENBQUMsd0xBQXdMLENBQUMsQ0FBQztXQUNoTTtTQUNGO09BQ0YsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNWOztJQUVERixpQkFBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztHQUMzQzs7RUFFRCxRQUFRLEVBQUUsVUFBVSxRQUFRLEVBQUUsT0FBTyxFQUFFO0lBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6QyxPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELFFBQVEsRUFBRSxZQUFZO0lBQ3BCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztHQUNoQzs7RUFFRCxJQUFJLEVBQUUsWUFBWTtJQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7R0FDNUI7O0VBRUQsS0FBSyxFQUFFLFlBQVk7SUFDakIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0dBQzdCOztFQUVELFlBQVksRUFBRSxVQUFVLEtBQUssRUFBRTtJQUM3QixJQUFJLE9BQU8sR0FBRyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDOUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRTtJQUM3QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqQyxPQUFPLElBQUksR0FBRyxVQUFVLENBQUM7R0FDMUI7Q0FDRixDQUFDLENBQUM7O0FBRUgsQUFBTyxTQUFTLGFBQWEsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFO0VBQzNDLE9BQU8sSUFBSSxhQUFhLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0NBQ3hDOztBQ3hMRCxJQUFJLE9BQU8sR0FBR0csb0JBQVksQ0FBQyxNQUFNLENBQUM7RUFDaEMsS0FBSyxFQUFFLFVBQVUsR0FBRyxFQUFFO0lBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUN6Q0Esb0JBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7R0FDOUM7RUFDRCxNQUFNLEVBQUUsWUFBWTtJQUNsQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBS0QsV0FBRyxDQUFDLFFBQVEsRUFBRTtNQUMxQ0Msb0JBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUMxQyxNQUFNO01BQ0xsQixlQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDdEY7R0FDRjtDQUNGLENBQUMsQ0FBQzs7QUFFSCxBQUFVLElBQUMsV0FBVyxHQUFHbUIsYUFBSyxDQUFDLE1BQU0sQ0FBQztFQUNwQyxPQUFPLEVBQUU7SUFDUCxPQUFPLEVBQUUsQ0FBQztJQUNWLFFBQVEsRUFBRSxPQUFPO0lBQ2pCLENBQUMsRUFBRSxPQUFPO0lBQ1YsT0FBTyxFQUFFLElBQUk7SUFDYixXQUFXLEVBQUUsSUFBSTtJQUNqQixXQUFXLEVBQUUsS0FBSztJQUNsQixHQUFHLEVBQUUsRUFBRTtHQUNSOztFQUVELEtBQUssRUFBRSxVQUFVLEdBQUcsRUFBRTs7SUFFcEIsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRXhCLElBQUksQ0FBQyxPQUFPLEdBQUdwQixZQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7O0lBRTlFLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Ozs7SUFJdEMsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUU7TUFDbEYsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDbEMsTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7TUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO01BQzFDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0tBQzNCOztJQUVELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7SUFFZixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7TUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztNQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ3ZEOzs7SUFHRCxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxFQUFFLFFBQVEsRUFBRTtNQUNyQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLGtCQUFrQixJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUU7UUFDekYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUNsRCxHQUFHLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO09BQzlEO0tBQ0YsRUFBRSxJQUFJLENBQUMsQ0FBQztHQUNWOztFQUVELFFBQVEsRUFBRSxVQUFVLEdBQUcsRUFBRTtJQUN2QixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7TUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0tBQzNDOztJQUVELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtNQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO01BQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDeEQ7O0lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7R0FDOUM7O0VBRUQsU0FBUyxFQUFFLFVBQVUsRUFBRSxFQUFFLFlBQVksRUFBRTtJQUNyQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUdxQixhQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDekIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO01BQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7TUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUN2RDtJQUNELE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsV0FBVyxFQUFFLFlBQVk7SUFDdkIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO01BQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO01BQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO01BQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDeEQ7SUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNwQixPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELFlBQVksRUFBRSxZQUFZO0lBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUNoQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7TUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztLQUNuQztJQUNELE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsV0FBVyxFQUFFLFlBQVk7SUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO0lBQy9CLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtNQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO0tBQ2xDO0lBQ0QsT0FBTyxJQUFJLENBQUM7R0FDYjs7RUFFRCxjQUFjLEVBQUUsWUFBWTtJQUMxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0dBQ2pDOztFQUVELFVBQVUsRUFBRSxZQUFZO0lBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7R0FDN0I7O0VBRUQsVUFBVSxFQUFFLFVBQVUsT0FBTyxFQUFFO0lBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUMvQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7TUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDeEM7SUFDRCxPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELFlBQVksRUFBRSxZQUFZO0lBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0dBQzdDOztFQUVELFlBQVksRUFBRSxVQUFVLElBQUksRUFBRSxFQUFFLEVBQUU7SUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNyQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDZixPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELFFBQVEsRUFBRSxVQUFVLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsWUFBWSxFQUFFLFVBQVUsS0FBSyxFQUFFO0lBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsTUFBTSxFQUFFLFlBQVk7SUFDbEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0dBQ2hCOztFQUVELFlBQVksRUFBRSxVQUFVLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFO0lBQ2hELElBQUksSUFBSSxDQUFDLElBQUksRUFBRTs7TUFFYixJQUFJLFdBQVcsRUFBRTtRQUNmLEdBQUcsR0FBRyxPQUFPLEdBQUcsV0FBVyxHQUFHLFVBQVUsR0FBRyxHQUFHLENBQUM7T0FDaEQ7Ozs7TUFJRCxJQUFJLEtBQUssR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFO1FBQ25DLE9BQU8sRUFBRSxDQUFDO1FBQ1YsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTztRQUNqQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHO1FBQ3JCLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1FBQ3pDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7T0FDdEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O01BRXBCLElBQUksY0FBYyxHQUFHLFlBQVk7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQixLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7T0FDeEMsQ0FBQzs7TUFFRixJQUFJLGFBQWEsR0FBRyxVQUFVLENBQUMsRUFBRTtRQUMvQixLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1VBQ2IsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztVQUN4QixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDOzs7Ozs7VUFNbEMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUU7WUFDckYsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUM7O1lBRTlCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFO2NBQ3JDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUNyQixNQUFNO2NBQ0wsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3BCOztZQUVELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRTtjQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3JELE1BQU07Y0FDTCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ3pEOztZQUVELElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7Y0FDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDakM7O1lBRUQsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksRUFBRTtjQUM3QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNyQztXQUNGLE1BQU07WUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztXQUNqQztTQUNGOztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1VBQ2hCLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQyxDQUFDO09BQ0osQ0FBQzs7O01BR0YsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDOzs7TUFHMUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDOztNQUV4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUNuQixNQUFNLEVBQUUsTUFBTTtPQUNmLENBQUMsQ0FBQztLQUNKO0dBQ0Y7O0VBRUQsT0FBTyxFQUFFLFlBQVk7SUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7TUFDZCxPQUFPO0tBQ1I7O0lBRUQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDOztJQUVuQyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7TUFDdkIsT0FBTztLQUNSOztJQUVELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFO01BQ3BFLE9BQU87S0FDUjs7SUFFRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7TUFDOUQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1FBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7T0FDM0I7TUFDRCxPQUFPO0tBQ1I7O0lBRUQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDdkNyQixZQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDOztJQUVoRCxJQUFJLE1BQU0sRUFBRTtNQUNWLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ3JDLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO01BQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7TUFDeEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7S0FDM0I7R0FDRjs7RUFFRCxZQUFZLEVBQUUsVUFBVSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUU7SUFDeEQsTUFBTSxHQUFHTSxjQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7O01BRTdELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztNQUM1RCxJQUFJLE9BQU8sRUFBRTtRQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO09BQ3JFO0tBQ0Y7R0FDRjs7RUFFRCxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsRUFBRTtJQUM3QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztHQUM1Qjs7RUFFRCxjQUFjLEVBQUUsWUFBWTtJQUMxQixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDOztJQUU3QyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUMxRCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQzs7SUFFeEQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwRCxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7SUFHcEQsSUFBSSxlQUFlLEdBQUdnQixjQUFNLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDOztJQUV2RCxPQUFPLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUMzSjs7RUFFRCxtQkFBbUIsRUFBRSxZQUFZOztJQUUvQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7O0lBRS9CLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDOztJQUVuRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFaEQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFO01BQzlCLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQztLQUN2Qjs7SUFFRCxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7R0FDOUI7Q0FDRixDQUFDOztBQ3JUUSxJQUFDLGFBQWEsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDOztFQUU1QyxPQUFPLEVBQUU7SUFDUCxjQUFjLEVBQUUsR0FBRztJQUNuQixNQUFNLEVBQUUsUUFBUTtJQUNoQixXQUFXLEVBQUUsSUFBSTtJQUNqQixDQUFDLEVBQUUsT0FBTztHQUNYOztFQUVELEtBQUssRUFBRSxZQUFZO0lBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztHQUM3Qjs7RUFFRCxRQUFRLEVBQUUsWUFBWTtJQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7R0FDaEM7O0VBRUQsVUFBVSxFQUFFLFVBQVUsT0FBTyxFQUFFO0lBQzdCLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7O0lBRWxDdEIsWUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7R0FDaEM7O0VBRUQsWUFBWSxFQUFFLFVBQVUsU0FBUyxFQUFFO0lBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUNuQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDZixPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELFlBQVksRUFBRSxZQUFZO0lBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7R0FDL0I7O0VBRUQsVUFBVSxFQUFFLFVBQVUsT0FBTyxFQUFFO0lBQzdCLElBQUlBLFlBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7TUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUMxQyxNQUFNO01BQ0wsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQzNDO0lBQ0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2YsT0FBTyxJQUFJLENBQUM7R0FDYjs7RUFFRCxVQUFVLEVBQUUsWUFBWTtJQUN0QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0dBQzdCOztFQUVELFNBQVMsRUFBRSxVQUFVLE1BQU0sRUFBRSxvQkFBb0IsRUFBRTtJQUNqRCxJQUFJQSxZQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO01BQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDeEMsTUFBTTtNQUNMLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUN6QztJQUNELElBQUksb0JBQW9CLEVBQUU7TUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztLQUMxRDtJQUNELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNmLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsU0FBUyxFQUFFLFlBQVk7SUFDckIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztHQUM1Qjs7RUFFRCx1QkFBdUIsRUFBRSxZQUFZO0lBQ25DLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztHQUMxQzs7RUFFRCxnQkFBZ0IsRUFBRSxVQUFVLGFBQWEsRUFBRTtJQUN6QyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFDM0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0dBQ2hCOztFQUVELGdCQUFnQixFQUFFLFlBQVk7SUFDNUIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztHQUNuQzs7RUFFRCxhQUFhLEVBQUUsVUFBVSxVQUFVLEVBQUU7SUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQ3JDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztHQUNoQjs7RUFFRCxhQUFhLEVBQUUsWUFBWTtJQUN6QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0dBQ2hDOztFQUVELGFBQWEsRUFBRSxVQUFVLENBQUMsRUFBRTtJQUMxQixJQUFJLFFBQVEsR0FBR0EsWUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFO01BQzNELElBQUksS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFO01BQ3RCLFVBQVUsQ0FBQ0EsWUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZO1FBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO09BQ3ZELEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDaEIsRUFBRSxJQUFJLENBQUMsQ0FBQzs7SUFFVCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7O0lBR25ELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7TUFDM0IsZUFBZSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDOztLQUV4RDs7Ozs7Ozs7SUFRRCxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7SUFHOUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7R0FDNUI7O0VBRUQsa0JBQWtCLEVBQUUsWUFBWTtJQUM5QixJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7O0lBRWhFLElBQUksTUFBTSxHQUFHO01BQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUU7TUFDM0IsSUFBSSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtNQUNoQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO01BQzNCLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7TUFDckMsTUFBTSxFQUFFLEVBQUU7TUFDVixPQUFPLEVBQUUsRUFBRTtLQUNaLENBQUM7O0lBRUYsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRTtNQUN4QyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUM3RTs7SUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO01BQzFCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7S0FDM0M7O0lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtNQUM5QixNQUFNLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO0tBQ25EOztJQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRTtNQUNuQyxNQUFNLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztLQUM3RDs7SUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO01BQ3hCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7S0FDdkM7OztJQUdELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO01BQ3BELE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7S0FDckM7O0lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFO01BQ3JDLE1BQU0sQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDO0tBQ2pFOztJQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO01BQzlCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0tBQzNDOztJQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUU7TUFDOUIsTUFBTSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDbkU7O0lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRTtNQUMzQixNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUM3RDs7SUFFRCxPQUFPLE1BQU0sQ0FBQztHQUNmOztFQUVELGNBQWMsRUFBRSxVQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUU7SUFDeEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUU7TUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUU7UUFDckUsSUFBSSxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUU7UUFDdEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtVQUN0QixRQUFRLENBQUMsSUFBSSxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO09BQzFDLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDVixNQUFNO01BQ0wsTUFBTSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7TUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxhQUFhLEdBQUdBLFlBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDM0Y7R0FDRjtDQUNGLENBQUMsQ0FBQzs7QUFFSCxBQUFPLFNBQVMsYUFBYSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUU7RUFDM0MsT0FBTyxJQUFJLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Q0FDeEM7O0FDL0xTLElBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7O0VBRTlDLE9BQU8sRUFBRTtJQUNQLGNBQWMsRUFBRSxHQUFHO0lBQ25CLE1BQU0sRUFBRSxLQUFLO0lBQ2IsU0FBUyxFQUFFLEtBQUs7SUFDaEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsTUFBTSxFQUFFLE9BQU87SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixDQUFDLEVBQUUsTUFBTTtHQUNWOztFQUVELFVBQVUsRUFBRSxVQUFVLE9BQU8sRUFBRTtJQUM3QixPQUFPLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDOztJQUVsQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFO01BQzVELE9BQU8sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0tBQ3BCOztJQUVEQSxZQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztHQUNoQzs7RUFFRCxnQkFBZ0IsRUFBRSxZQUFZO0lBQzVCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7R0FDbkM7O0VBRUQsZ0JBQWdCLEVBQUUsVUFBVSxhQUFhLEVBQUU7SUFDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBQzNDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNmLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsU0FBUyxFQUFFLFlBQVk7SUFDckIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztHQUM1Qjs7RUFFRCxTQUFTLEVBQUUsVUFBVSxNQUFNLEVBQUU7SUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQzdCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNmLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsWUFBWSxFQUFFLFlBQVk7SUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztHQUMvQjs7RUFFRCxZQUFZLEVBQUUsVUFBVSxTQUFTLEVBQUU7SUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQ25DLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNmLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsY0FBYyxFQUFFLFlBQVk7SUFDMUIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztHQUNqQzs7RUFFRCxjQUFjLEVBQUUsVUFBVSxXQUFXLEVBQUU7SUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ3ZDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNmLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsS0FBSyxFQUFFLFlBQVk7SUFDakIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0dBQzdCOztFQUVELFFBQVEsRUFBRSxZQUFZO0lBQ3BCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztHQUNoQzs7RUFFRCxJQUFJLEVBQUUsWUFBWTtJQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7R0FDNUI7O0VBRUQsYUFBYSxFQUFFLFVBQVUsQ0FBQyxFQUFFO0lBQzFCLElBQUksUUFBUSxHQUFHQSxZQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRTtNQUNyRSxJQUFJLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRTtNQUN0QixVQUFVLENBQUNBLFlBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFDO09BQ2pFLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDaEIsRUFBRSxJQUFJLENBQUMsQ0FBQzs7SUFFVCxJQUFJLGVBQWUsQ0FBQztJQUNwQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO01BQ3RCLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDakUsTUFBTTtNQUNMLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzlEOzs7SUFHRCxlQUFlLENBQUMsTUFBTSxDQUFDLGtCQUFrQixHQUFHLElBQUksR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7O0lBRTVGLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO01BQzFGLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7UUFDdkIsZUFBZSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7T0FDcEUsTUFBTTtRQUNMLGVBQWUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7T0FDbkM7S0FDRjs7O0lBR0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO01BQzdHLEtBQUssSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7UUFDckMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUU7VUFDN0MsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMxRDtPQUNGO0tBQ0Y7O0lBRUQsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7O0lBRzlCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0dBQzVCOztFQUVELGtCQUFrQixFQUFFLFlBQVk7SUFDOUIsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDOztJQUVoRSxJQUFJLE1BQU0sR0FBRztNQUNYLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFO01BQzNCLElBQUksRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7TUFDaEMsR0FBRyxFQUFFLEVBQUU7TUFDUCxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO01BQzNCLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7TUFDckMsTUFBTSxFQUFFLEVBQUU7TUFDVixPQUFPLEVBQUUsRUFBRTtLQUNaLENBQUM7O0lBRUYsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtNQUM5QixNQUFNLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO0tBQ25EOztJQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7TUFDdkIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3BDLE9BQU87T0FDUixNQUFNO1FBQ0wsTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO09BQ3pEO0tBQ0Y7O0lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtNQUMxQixNQUFNLENBQUMsU0FBUyxHQUFHLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEtBQUssUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNqSTs7SUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFO01BQzVCLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBQy9EOztJQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUU7TUFDeEMsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDN0U7O0lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7TUFDOUIsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7S0FDM0M7O0lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtNQUN0QixNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0tBQ25DOzs7SUFHRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO01BQzdCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQ3pCOztJQUVELE9BQU8sTUFBTSxDQUFDO0dBQ2Y7O0VBRUQsY0FBYyxFQUFFLFVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRTtJQUN4QyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRTtNQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBRTtRQUNoRSxJQUFJLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRTs7UUFFdEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtVQUN0QixRQUFRLENBQUMsSUFBSSxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtVQUN0QixRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1NBQzFEO1FBQ0QsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFO1VBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztTQUMxQyxNQUFNO1VBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDckU7T0FDRixFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ1YsTUFBTTtNQUNMLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO01BQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsUUFBUSxHQUFHQSxZQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ3RGO0dBQ0Y7Q0FDRixDQUFDLENBQUM7O0FBRUgsQUFBTyxTQUFTLGVBQWUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFO0VBQzdDLE9BQU8sSUFBSSxlQUFlLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0NBQzFDOztBQ2pNRCxJQUFJLFdBQVcsR0FBR29CLGFBQUssQ0FBQyxNQUFNLENBQUM7O0VBRTdCLE9BQU8sRUFBRTtJQUNQLFFBQVEsRUFBRSxHQUFHO0lBQ2IsY0FBYyxFQUFFLEdBQUc7R0FDcEI7O0VBRUQsVUFBVSxFQUFFLFVBQVUsT0FBTyxFQUFFO0lBQzdCLE9BQU8sR0FBR0csa0JBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7R0FDdkI7O0VBRUQsS0FBSyxFQUFFLFVBQVUsR0FBRyxFQUFFO0lBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUd2QixZQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0dBQ2hCOztFQUVELFFBQVEsRUFBRSxZQUFZO0lBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztHQUNyQjs7RUFFRCxTQUFTLEVBQUUsWUFBWTtJQUNyQixJQUFJLE1BQU0sR0FBRztNQUNYLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztNQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7TUFDMUIsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNO0tBQ3JCLENBQUM7O0lBRUYsT0FBTyxNQUFNLENBQUM7R0FDZjs7RUFFRCxLQUFLLEVBQUUsVUFBVSxHQUFHLEVBQUU7SUFDcEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQixPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELFVBQVUsRUFBRSxVQUFVLEdBQUcsRUFBRTtJQUN6QixHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RCLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsVUFBVSxFQUFFLFlBQVk7SUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7R0FDdEI7O0VBRUQsTUFBTSxFQUFFLFlBQVk7SUFDbEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDOztJQUVwQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNqQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNyQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOztJQUUvQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7R0FDdkI7O0VBRUQsVUFBVSxFQUFFLFlBQVk7SUFDdEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNwQixJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQzs7SUFFMUIsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFOztJQUU3QixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7O0lBRW5DLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtNQUNmLElBQUksQ0FBQyxRQUFRLEdBQUc7UUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztPQUN6RCxDQUFDO0tBQ0g7O0lBRUQsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO01BQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRztRQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO09BQ3pELENBQUM7S0FDSDtHQUNGOztFQUVELFlBQVksRUFBRSxZQUFZO0lBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7R0FDOUI7O0VBRUQsT0FBTyxFQUFFLFlBQVk7SUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7TUFDZCxPQUFPO0tBQ1I7O0lBRUQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMzQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7OztJQUduQyxJQUFJLFVBQVUsR0FBR3NCLGNBQU07TUFDckIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFO01BQ3hDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7O0lBRTVDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDOztJQUUzQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0dBQzNCOztFQUVELFNBQVMsRUFBRSxVQUFVLFVBQVUsRUFBRTtJQUMvQixJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDZixJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDcEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7SUFFL0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQzs7SUFFakIsS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO01BQ3JELEtBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNyRCxNQUFNLEdBQUdULGFBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckIsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7O1FBRWhCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtVQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3BCO09BQ0Y7S0FDRjs7SUFFRCxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDOztJQUUvQixJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUU7O0lBRWxDLElBQUksQ0FBQyxZQUFZLElBQUksV0FBVyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDOzs7SUFHaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7TUFDekIsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDcEQsQ0FBQyxDQUFDOztJQUVILEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFO01BQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDekI7R0FDRjs7RUFFRCxZQUFZLEVBQUUsVUFBVSxNQUFNLEVBQUU7SUFDOUIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDOztJQUVoQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTs7TUFFakIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztNQUN4QztRQUNFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNsRixDQUFDLEdBQUcsQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEY7UUFDQSxPQUFPLEtBQUssQ0FBQztPQUNkO0tBQ0Y7O0lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO01BQ3hCLE9BQU8sSUFBSSxDQUFDO0tBQ2I7OztJQUdELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRCxPQUFPTixvQkFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0dBQ2pFOzs7RUFHRCxtQkFBbUIsRUFBRSxVQUFVLE1BQU0sRUFBRTtJQUNyQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3BCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQ3JDLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2hELElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUQsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFMUQsT0FBT0Esb0JBQVksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7R0FDN0I7OztFQUdELGdCQUFnQixFQUFFLFVBQVUsTUFBTSxFQUFFO0lBQ2xDLE9BQU8sTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztHQUNsQzs7O0VBR0QsZ0JBQWdCLEVBQUUsVUFBVSxHQUFHLEVBQUU7SUFDL0IsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7O0lBRTlCLE9BQU9NLGFBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7R0FDcEI7OztFQUdELGlCQUFpQixFQUFFLFVBQVUsTUFBTSxFQUFFO0lBQ25DLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtNQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtRQUNoRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO09BQ3ZCO0tBQ0Y7R0FDRjs7RUFFRCxXQUFXLEVBQUUsVUFBVSxHQUFHLEVBQUU7SUFDMUIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQzs7SUFFbEMsSUFBSSxJQUFJLEVBQUU7TUFDUixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7O01BRTlCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO09BQzFDOztNQUVELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1FBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtRQUNuQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07T0FDcEIsQ0FBQyxDQUFDO0tBQ0o7R0FDRjs7RUFFRCxZQUFZLEVBQUUsWUFBWTtJQUN4QixLQUFLLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7TUFDM0IsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7TUFDekMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7O01BRXJDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztPQUNwQzs7TUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtRQUNyQixNQUFNLEVBQUUsVUFBVTtRQUNsQixNQUFNLEVBQUUsTUFBTTtPQUNmLENBQUMsQ0FBQztLQUNKO0dBQ0Y7O0VBRUQsUUFBUSxFQUFFLFVBQVUsTUFBTSxFQUFFOztJQUUxQixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDOzs7SUFHekIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDOzs7SUFHeEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzs7O0lBRzVCLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRTtNQUNuQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO09BQ3JDOztNQUVELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1FBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtRQUNuQixNQUFNLEVBQUUsTUFBTTtPQUNmLENBQUMsQ0FBQzs7TUFFSCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUMvQjs7O0lBR0QsSUFBSSxDQUFDLElBQUksRUFBRTtNQUNULElBQUksR0FBRztRQUNMLE1BQU0sRUFBRSxNQUFNO1FBQ2QsTUFBTSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7T0FDekMsQ0FBQzs7TUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztNQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQzs7TUFFOUIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1FBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztPQUN0Qzs7TUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtRQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07UUFDbkIsTUFBTSxFQUFFLE1BQU07T0FDZixDQUFDLENBQUM7S0FDSjtHQUNGOztFQUVELFdBQVcsRUFBRSxVQUFVLE1BQU0sRUFBRTtJQUM3QixNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUdiLFlBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM1RSxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUdBLFlBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztHQUM3RTs7O0VBR0QsaUJBQWlCLEVBQUUsWUFBWTtJQUM3QixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDbEQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDOztJQUUvQixPQUFPLFdBQVcsR0FBR3NCLGNBQU07TUFDekIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFO01BQ3RDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0dBQ2xFO0NBQ0YsQ0FBQyxDQUFDOztBQzdTSCxTQUFTLGlCQUFpQixFQUFFLE1BQU0sRUFBRTtFQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0NBQ3ZDOztBQUVELGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsVUFBVSxLQUFLLEVBQUU7RUFDbkQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztFQUNqQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Q0FDM0IsQ0FBQzs7QUFFRixpQkFBaUIsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFNBQVMsUUFBUSxFQUFFLEtBQUssRUFBRTtFQUMvRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7SUFDZCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7R0FDYjs7RUFFRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFDakIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0VBQ3RDLElBQUksWUFBWSxDQUFDO0VBQ2pCLElBQUksY0FBYyxDQUFDOztFQUVuQixPQUFPLFFBQVEsSUFBSSxRQUFRLEVBQUU7SUFDM0IsWUFBWSxHQUFHLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN2RCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssRUFBRTtNQUNsQyxRQUFRLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztLQUM3QixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSyxFQUFFO01BQ3pDLFFBQVEsR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0tBQzdCLE1BQU07TUFDTCxPQUFPLFlBQVksQ0FBQztLQUNyQjtHQUNGOztFQUVELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0NBQzVCLENBQUM7O0FBRUYsaUJBQWlCLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxTQUFTLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO0VBQ2xFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7RUFDdEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFbEMsSUFBSSxVQUFVLEtBQUssQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUU7SUFDdEMsT0FBTyxFQUFFLENBQUM7R0FDWDs7RUFFRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUU7SUFDakYsVUFBVSxFQUFFLENBQUM7R0FDZDs7RUFFRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHLEVBQUU7SUFDM0UsUUFBUSxFQUFFLENBQUM7R0FDWjs7RUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQzdGLFFBQVEsRUFBRSxDQUFDO0dBQ1o7O0VBRUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7Q0FDaEQsQ0FBQzs7QUFFRixpQkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTSxFQUFFLElBQUksRUFBRTtFQUMxRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7RUFDdkQsT0FBTyxJQUFJLENBQUM7Q0FDYixDQUFDOztBQUVGLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsU0FBUyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtFQUNuRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0VBRXpELElBQUksSUFBSSxFQUFFO0lBQ1IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0dBQ2IsTUFBTTtJQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0dBQ25COztFQUVELE9BQU8sSUFBSSxDQUFDO0NBQ2IsQ0FBQzs7QUFFRixpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFNBQVMsSUFBSSxJQUFJO0VBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUMvQixPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7R0FDNUIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0VBQ2IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7RUFDbkIsT0FBTyxJQUFJLENBQUM7Q0FDYixDQUFDOztBQzFFUSxJQUFDLGNBQWMsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDOzs7OztFQUs3QyxPQUFPLEVBQUU7SUFDUCxXQUFXLEVBQUUsSUFBSTtJQUNqQixLQUFLLEVBQUUsS0FBSztJQUNaLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNiLElBQUksRUFBRSxLQUFLO0lBQ1gsRUFBRSxFQUFFLEtBQUs7SUFDVCxTQUFTLEVBQUUsS0FBSztJQUNoQixjQUFjLEVBQUUsUUFBUTtJQUN4QixjQUFjLEVBQUUsQ0FBQztJQUNqQixTQUFTLEVBQUUsQ0FBQztHQUNiOzs7Ozs7RUFNRCxVQUFVLEVBQUUsVUFBVSxPQUFPLEVBQUU7SUFDN0IsV0FBVyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQzs7SUFFckQsT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoQyxPQUFPLEdBQUd0QixZQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQzs7SUFFekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7O0lBR2xDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO01BQ2xDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztNQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25ELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLEVBQUU7VUFDNUQsUUFBUSxHQUFHLElBQUksQ0FBQztTQUNqQjtPQUNGO01BQ0QsSUFBSSxRQUFRLEtBQUssS0FBSyxFQUFFO1FBQ3RCLElBQUksQ0FBQyw0SkFBNEosQ0FBQyxDQUFDO09BQ3BLO0tBQ0Y7O0lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO01BQzlELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO01BQy9DLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO0tBQzlDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtNQUNqQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztLQUMzQzs7SUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNqQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0lBQzNCLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO0dBQzFCOzs7Ozs7RUFNRCxLQUFLLEVBQUUsVUFBVSxHQUFHLEVBQUU7O0lBRXBCLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDOztJQUV4QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsRUFBRSxRQUFRLEVBQUU7TUFDN0MsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNSLElBQUksZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDOzs7UUFHdEQsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLEtBQUssRUFBRTtVQUMzQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1NBQ3hCOzs7UUFHRCxJQUFJLENBQUMsZUFBZSxJQUFJLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtVQUN0RixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1NBQ3RDOzs7UUFHRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLGtCQUFrQixJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUU7VUFDakYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztVQUNsRCxHQUFHLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1NBQzlEO09BQ0Y7S0FDRixFQUFFLElBQUksQ0FBQyxDQUFDOztJQUVULEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQzs7SUFFaEQsT0FBTyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ3BEOztFQUVELFFBQVEsRUFBRSxVQUFVLEdBQUcsRUFBRTtJQUN2QixHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7O0lBRWpELE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztHQUN2RDs7RUFFRCxjQUFjLEVBQUUsWUFBWTtJQUMxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0dBQ2pDOzs7Ozs7RUFNRCxVQUFVLEVBQUUsVUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFOztJQUVwQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRTtNQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ3ZDO0dBQ0Y7O0VBRUQsZ0JBQWdCLEVBQUUsVUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtJQUNwRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7OztJQUd2QixJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssQ0FBQyxFQUFFO01BQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1FBQ25CLE1BQU0sRUFBRSxNQUFNO09BQ2YsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNWOztJQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFO01BQ2hGLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTtRQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7T0FDaEM7OztNQUdELElBQUksQ0FBQyxLQUFLLElBQUksaUJBQWlCLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTs7UUFFcEVBLFlBQUksQ0FBQyxnQkFBZ0IsQ0FBQ0EsWUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZO1VBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1VBQ3RELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7T0FDWDs7O01BR0QsSUFBSSxDQUFDLEtBQUssSUFBSSxpQkFBaUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7UUFDckUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO09BQ25DOztNQUVELElBQUksS0FBSyxFQUFFO1FBQ1QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO09BQ25DOztNQUVELElBQUksUUFBUSxFQUFFO1FBQ1osUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7T0FDL0M7S0FDRixFQUFFLElBQUksQ0FBQyxDQUFDO0dBQ1Y7O0VBRUQsb0JBQW9CLEVBQUUsVUFBVSxNQUFNLEVBQUU7O0lBRXRDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs7O0lBR3ZCLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLEVBQUU7TUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDaEIsTUFBTSxFQUFFLE1BQU07T0FDZixDQUFDLENBQUM7S0FDSjtHQUNGOztFQUVELFNBQVMsRUFBRSxVQUFVLE1BQU0sRUFBRTtJQUMzQixPQUFPLE1BQU0sQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7R0FDbkQ7O0VBRUQsWUFBWSxFQUFFLFVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRTtJQUN4QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7O0lBRTFDLEtBQUssSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtNQUM3QyxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztNQUV4QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDNUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztPQUNoQztNQUNELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7T0FDM0I7S0FDRjs7SUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO01BQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUNsQzs7SUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0dBQzdCOztFQUVELFdBQVcsRUFBRSxVQUFVLE1BQU0sRUFBRTtJQUM3QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtPQUM3QixVQUFVLENBQUMsTUFBTSxDQUFDO09BQ2xCLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztPQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7T0FDM0IsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7O0lBRXJDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUU7TUFDOUJBLFlBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0tBQ3ZEOztJQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUU7TUFDL0IsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7S0FDeEQ7O0lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUU7TUFDcEYsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ25EOztJQUVELE9BQU8sS0FBSyxDQUFDO0dBQ2Q7Ozs7OztFQU1ELFFBQVEsRUFBRSxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFO0lBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQzs7SUFFN0QsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNyQixJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFDeEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLElBQUksZUFBZSxHQUFHQSxZQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxFQUFFLGlCQUFpQixFQUFFO01BQ2xFLElBQUksS0FBSyxFQUFFO1FBQ1QsWUFBWSxHQUFHLEtBQUssQ0FBQztPQUN0Qjs7TUFFRCxJQUFJLGlCQUFpQixFQUFFO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtVQUMvRCxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNwRDtPQUNGOztNQUVELGVBQWUsRUFBRSxDQUFDOztNQUVsQixJQUFJLGVBQWUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO1FBQy9DLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7O1FBRXBDQSxZQUFJLENBQUMsZ0JBQWdCLENBQUNBLFlBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtVQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1VBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7VUFDNUIsSUFBSSxRQUFRLEVBQUU7WUFDWixRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztXQUN0QztTQUNGLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztPQUNYO0tBQ0YsRUFBRSxJQUFJLENBQUMsQ0FBQzs7SUFFVCxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7TUFDMUQsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM1Qzs7SUFFRCxLQUFLLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7TUFDakMsZUFBZSxFQUFFLENBQUM7TUFDbEIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO01BQ3hDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztNQUM5QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztLQUNyRDs7SUFFRCxPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELFFBQVEsRUFBRSxZQUFZO0lBQ3BCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7R0FDM0I7Ozs7OztFQU1ELFlBQVksRUFBRSxZQUFZO0lBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0dBQzdDOztFQUVELFlBQVksRUFBRSxVQUFVLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRTtJQUNuRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUNoQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUM1QixJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFDeEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLElBQUksZUFBZSxHQUFHQSxZQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxFQUFFO01BQy9DLElBQUksS0FBSyxFQUFFO1FBQ1QsWUFBWSxHQUFHLEtBQUssQ0FBQztPQUN0QjtNQUNELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQzs7TUFFdkQsZUFBZSxFQUFFLENBQUM7O01BRWxCLElBQUksUUFBUSxJQUFJLGVBQWUsSUFBSSxDQUFDLEVBQUU7UUFDcEMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7T0FDdEM7S0FDRixFQUFFLElBQUksQ0FBQyxDQUFDOztJQUVULElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7O0lBRXJCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQzs7SUFFdkQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsS0FBSyxRQUFRLEVBQUU7TUFDNUMsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1FBQ2pDLGVBQWUsRUFBRSxDQUFDO1FBQ2xCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7T0FDckQ7S0FDRjs7SUFFRCxPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELE9BQU8sRUFBRSxZQUFZO0lBQ25CLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtNQUNqQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7TUFDeEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO01BQzlDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDcEM7O0lBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO01BQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWTtRQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsS0FBSyxFQUFFO1VBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNoQyxFQUFFLElBQUksQ0FBQyxDQUFDO09BQ1YsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNWO0dBQ0Y7O0VBRUQsdUJBQXVCLEVBQUUsVUFBVSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDakUsSUFBSSxjQUFjLEdBQUcsQ0FBQyxPQUFPLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9HLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7O0lBRS9ELElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRTtNQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMzQyxJQUFJLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsSUFBSSxpQkFBaUIsSUFBSSxDQUFDLEVBQUU7VUFDMUIsY0FBYyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUM3QztPQUNGO0tBQ0Y7OztJQUdEQSxZQUFJLENBQUMsZ0JBQWdCLENBQUNBLFlBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtNQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO01BQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7S0FDN0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0dBQ1g7O0VBRUQsdUJBQXVCLEVBQUUsVUFBVSxLQUFLLEVBQUUsR0FBRyxFQUFFO0lBQzdDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNiLElBQUksTUFBTSxDQUFDOztJQUVYLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtNQUM5RCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7TUFDMUQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO01BQ3RELE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ3RDLE1BQU07TUFDTCxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQzlDOztJQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtNQUMzQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUN4Qjs7SUFFRCxPQUFPLEdBQUcsQ0FBQztHQUNaOztFQUVELGlCQUFpQixFQUFFLFVBQVUsT0FBTyxFQUFFO0lBQ3BDLElBQUksQ0FBQyxDQUFDO0lBQ04sSUFBSSxPQUFPLENBQUM7SUFDWixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7TUFDOUQsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7TUFDMUIsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO01BQ3hCLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDeEMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7VUFDcEIsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1VBQ2QsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEUsQ0FBQyxDQUFDO1FBQ0gsY0FBYyxDQUFDLElBQUksQ0FBQztVQUNsQixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7VUFDZCxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNoRSxDQUFDLENBQUM7T0FDSjtNQUNELElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7TUFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7S0FDNUMsTUFBTTtNQUNMLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztNQUNyQixLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsV0FBVyxDQUFDLElBQUksQ0FBQztVQUNmLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtVQUNkLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDNUQsQ0FBQyxDQUFDO09BQ0o7O01BRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7S0FDdEM7R0FDRjs7RUFFRCx1QkFBdUIsRUFBRSxVQUFVLE9BQU8sRUFBRTtJQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRTtNQUMxQyxPQUFPLElBQUksQ0FBQztLQUNiOztJQUVELElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDeEMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7SUFFcEMsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRTtNQUM5QyxJQUFJLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztNQUN2RCxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7S0FDdkM7O0lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO01BQzlELElBQUksU0FBUyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztNQUNsRSxJQUFJLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7TUFDOUQsT0FBTyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksTUFBTSxTQUFTLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxNQUFNLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQzdGO0dBQ0Y7O0VBRUQsWUFBWSxFQUFFLFlBQVk7O0lBRXhCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO01BQ2QsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO01BQzlELE9BQU8sS0FBSyxDQUFDO0tBQ2QsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUU7R0FDeEI7O0VBRUQsaUJBQWlCLEVBQUUsWUFBWTtJQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO01BQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7TUFDekMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztLQUM1QixNQUFNOzs7Ozs7O01BT0wsS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1FBQy9CLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3pDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1VBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO09BQ0Y7S0FDRjtHQUNGOzs7Ozs7RUFNRCxZQUFZLEVBQUUsVUFBVSxLQUFLLEVBQUU7SUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsT0FBTyxJQUFJLENBQUM7R0FDYjs7RUFFRCxRQUFRLEVBQUUsVUFBVSxRQUFRLEVBQUUsT0FBTyxFQUFFO0lBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6QyxPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELEtBQUssRUFBRSxZQUFZO0lBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztHQUM3Qjs7RUFFRCxZQUFZLEVBQUUsVUFBVSxRQUFRLEVBQUU7SUFDaEMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO01BQ2xCLElBQUksS0FBSyxDQUFDO01BQ1YsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDakMsTUFBTTtNQUNMLElBQUksQ0FBQyxRQUFRLENBQUNBLFlBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFO1FBQ2pELElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO09BQ2pDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUNYO0dBQ0Y7O0VBRUQsVUFBVSxFQUFFLFVBQVUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDaEQsSUFBSSxDQUFDLFlBQVksQ0FBQ0EsWUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUU7TUFDckQsSUFBSSxLQUFLLEVBQUU7UUFDVCxJQUFJLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFO1FBQ25ELE9BQU87T0FDUjs7TUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUVBLFlBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFO1FBQ3BFLElBQUksQ0FBQyxLQUFLLEVBQUU7O1VBRVYsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQzs7O1VBRy9ELE9BQU8sQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztVQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUM5Qjs7UUFFRCxJQUFJLFFBQVEsRUFBRTtVQUNaLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztTQUN6QztPQUNGLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUNYLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztHQUNYOztFQUVELGFBQWEsRUFBRSxVQUFVLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFO0lBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUU7TUFDN0QsSUFBSSxDQUFDLEtBQUssRUFBRTtRQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7T0FDOUI7O01BRUQsSUFBSSxRQUFRLEVBQUU7UUFDWixRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7T0FDekM7S0FDRixFQUFFLElBQUksQ0FBQyxDQUFDO0dBQ1Y7O0VBRUQsYUFBYSxFQUFFLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLFVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBRTtNQUN4RCxJQUFJLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUU7UUFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztPQUM5QztNQUNELElBQUksUUFBUSxFQUFFO1FBQ1osUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO09BQ3pDO0tBQ0YsRUFBRSxJQUFJLENBQUMsQ0FBQztHQUNWOztFQUVELGNBQWMsRUFBRSxVQUFVLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFO0lBQ2hELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBRTtNQUNqRSxJQUFJLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1VBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDakQ7T0FDRjtNQUNELElBQUksUUFBUSxFQUFFO1FBQ1osUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO09BQ3pDO0tBQ0YsRUFBRSxJQUFJLENBQUMsQ0FBQztHQUNWO0NBQ0YsQ0FBQzs7QUM5aEJRLElBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUM7O0VBRTlDLE9BQU8sRUFBRTtJQUNQLFdBQVcsRUFBRSxJQUFJO0dBQ2xCOzs7OztFQUtELFVBQVUsRUFBRSxVQUFVLE9BQU8sRUFBRTtJQUM3QixjQUFjLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7R0FDbkI7Ozs7OztFQU1ELFFBQVEsRUFBRSxVQUFVLEdBQUcsRUFBRTtJQUN2QixLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7TUFDMUIsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O01BRWpDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1FBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87UUFDaEMsU0FBUyxFQUFFLEtBQUs7T0FDakIsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNWOztJQUVELE9BQU8sY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztHQUMxRDs7RUFFRCxjQUFjLEVBQUUsVUFBVSxPQUFPLEVBQUU7SUFDakMsSUFBSSxLQUFLLEdBQUdXLGVBQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzRCxLQUFLLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDckMsT0FBTyxLQUFLLENBQUM7R0FDZDs7RUFFRCxZQUFZLEVBQUUsVUFBVSxLQUFLLEVBQUUsT0FBTyxFQUFFOzs7SUFHdEMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxJQUFJQSxlQUFPLENBQUMsY0FBYyxDQUFDOzs7SUFHM0UsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO01BQ3RCLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7S0FDL0M7O0lBRUQsUUFBUSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUk7TUFDM0IsS0FBSyxPQUFPO1FBQ1YsT0FBTyxHQUFHQSxlQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0QsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QixNQUFNO01BQ1IsS0FBSyxZQUFZO1FBQ2YsT0FBTyxHQUFHQSxlQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNuRixLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLE1BQU07TUFDUixLQUFLLGlCQUFpQjtRQUNwQixPQUFPLEdBQUdBLGVBQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ25GLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUIsTUFBTTtNQUNSLEtBQUssU0FBUztRQUNaLE9BQU8sR0FBR0EsZUFBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDbkYsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQixNQUFNO01BQ1IsS0FBSyxjQUFjO1FBQ2pCLE9BQU8sR0FBR0EsZUFBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDbkYsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQixNQUFNO0tBQ1Q7R0FDRjs7Ozs7O0VBTUQsWUFBWSxFQUFFLFVBQVUsUUFBUSxFQUFFO0lBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtNQUM3QyxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7O01BRTFCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQ3JDLElBQUksUUFBUSxDQUFDOztNQUViLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1VBQ3RCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztTQUN2QixFQUFFLElBQUksQ0FBQyxDQUFDO09BQ1Y7OztNQUdELElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFHLENBQUMsS0FBSyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUNyRixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztPQUNuQzs7TUFFRCxJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1YsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsUUFBUSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7OztRQUczQixRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDOztRQUU5QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFO1VBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDeEQ7OztRQUdELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUM7OztRQUc3QyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7O1FBRTlELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1VBQ3pCLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztTQUMxQixFQUFFLElBQUksQ0FBQyxDQUFDOzs7UUFHVCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7VUFDekgsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDOUI7T0FDRjtLQUNGO0dBQ0Y7O0VBRUQsU0FBUyxFQUFFLFVBQVUsR0FBRyxFQUFFO0lBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtNQUN4QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ2pDLElBQUksS0FBSyxFQUFFO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7T0FDM0I7S0FDRjtHQUNGOztFQUVELFlBQVksRUFBRSxVQUFVLEdBQUcsRUFBRSxTQUFTLEVBQUU7SUFDdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO01BQ3hDLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNoQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQzdCLElBQUksS0FBSyxFQUFFO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7VUFDekIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1VBQ3RCLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztPQUM5QjtNQUNELElBQUksS0FBSyxJQUFJLFNBQVMsRUFBRTtRQUN0QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7T0FDekI7S0FDRjtHQUNGOztFQUVELFNBQVMsRUFBRSxVQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUU7SUFDbkMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7TUFDdERYLFlBQUksQ0FBQyxnQkFBZ0IsQ0FBQ0EsWUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZO1FBQzFDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sRUFBRTtVQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3hCO09BQ0YsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ1g7R0FDRjs7RUFFRCxTQUFTLEVBQUUsVUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFO0lBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO01BQ2xCQSxZQUFJLENBQUMsZ0JBQWdCLENBQUNBLFlBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtRQUMxQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7VUFDYixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1VBQ3RDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztVQUM1QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1VBQ25DLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7VUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxFQUFFO1lBQ3pDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQzs7WUFFckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Y0FDdEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztjQUNwQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUU7Z0JBQ3ZFLFNBQVMsR0FBRyxLQUFLLENBQUM7ZUFDbkI7YUFDRjs7WUFFRCxJQUFJLFNBQVMsRUFBRTtjQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUN0RDs7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksU0FBUyxFQUFFO2NBQzFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztjQUM3QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Y0FDNUIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ25DO1dBQ0Y7U0FDRjtPQUNGLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUNYO0dBQ0Y7Ozs7OztFQU1ELFVBQVUsRUFBRSxZQUFZO0lBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEtBQUssRUFBRTtNQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUMxQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1QsT0FBTyxJQUFJLENBQUM7R0FDYjs7RUFFRCxRQUFRLEVBQUUsVUFBVSxLQUFLLEVBQUU7SUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxLQUFLLEVBQUU7TUFDaEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUMvQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1QsT0FBTyxJQUFJLENBQUM7R0FDYjs7RUFFRCxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsRUFBRTtJQUMvQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLElBQUl3QixZQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUMxRCxJQUFJLEtBQUssRUFBRTtNQUNUeEIsWUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztNQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUNqQztJQUNELE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsZUFBZSxFQUFFLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRTtJQUNwQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFO01BQy9CLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQzlCO0lBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO01BQ2xCLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDdkI7SUFDRCxPQUFPLElBQUksQ0FBQztHQUNiOzs7Ozs7RUFNRCxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUU7O0lBRXhDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtNQUNiLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7TUFDekMsS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1FBQzFCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTs7VUFFcEUsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLFVBQVUsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRTtZQUN6RyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7V0FDbkMsTUFBTSxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssVUFBVSxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFOztZQUVsSCxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7V0FDbkM7U0FDRjtPQUNGO0tBQ0Y7SUFDRCxPQUFPLElBQUksQ0FBQztHQUNiOztFQUVELFdBQVcsRUFBRSxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUU7SUFDbEMsS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO01BQzFCLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNuQztJQUNELE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsVUFBVSxFQUFFLFVBQVUsRUFBRSxFQUFFO0lBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztHQUN6Qjs7RUFFRCxXQUFXLEVBQUUsWUFBWTtJQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsS0FBSyxFQUFFO01BQ2hDLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRTtRQUNyQixLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7T0FDckI7S0FDRixDQUFDLENBQUM7R0FDSjs7RUFFRCxZQUFZLEVBQUUsWUFBWTtJQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsS0FBSyxFQUFFO01BQ2hDLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTtRQUN0QixLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7T0FDdEI7S0FDRixDQUFDLENBQUM7R0FDSjs7RUFFRCxNQUFNLEVBQUUsVUFBVSxFQUFFLEVBQUU7SUFDcEIsSUFBSSxFQUFFLEVBQUU7TUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ2xCO0lBQ0QsT0FBTyxJQUFJLENBQUM7R0FDYjs7RUFFRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUU7SUFDckIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDOzs7SUFHNUIsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTs7TUFFdkQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtRQUM3QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUVNLGNBQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0gsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDdkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztPQUM1QjtLQUNGOzs7SUFHRCxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO01BQ3hELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRUEsY0FBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM1SCxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO01BQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztLQUNoRDs7O0lBR0QsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtNQUNqRCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUM3QjtHQUNGO0NBQ0YsQ0FBQyxDQUFDOztBQUVILEFBQU8sU0FBUyxZQUFZLEVBQUUsT0FBTyxFQUFFO0VBQ3JDLE9BQU8sSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7Q0FDbEM7O0FDeFVELGlCQUFpQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7In0= diff --git a/dist/esri-leaflet.js b/dist/esri-leaflet.js new file mode 100644 index 000000000..d43891c01 --- /dev/null +++ b/dist/esri-leaflet.js @@ -0,0 +1,5 @@ +/* esri-leaflet - v2.1.4 - Fri Mar 09 2018 18:28:26 GMT-0800 (PST) + * Copyright (c) 2018 Environmental Systems Research Institute, Inc. + * Apache-2.0 */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("leaflet")):"function"==typeof define&&define.amd?define(["exports","leaflet"],e):e((t.L=t.L||{},t.L.esri={}),t.L)}(this,function(t,e){"use strict";var i=window.XMLHttpRequest&&"withCredentials"in new window.XMLHttpRequest,s=""===document.documentElement.style.pointerEvents,r={cors:i,pointerEvents:s},n={attributionWidthOffset:55},o=0;function a(t){var e="";for(var i in t.f=t.f||"json",t)if(t.hasOwnProperty(i)){var s,r=t[i],n=Object.prototype.toString.call(r);e.length&&(e+="&"),s="[object Array]"===n?"[object Object]"===Object.prototype.toString.call(r[0])?JSON.stringify(r):r.join(","):"[object Object]"===n?JSON.stringify(r):"[object Date]"===n?r.valueOf():r,e+=encodeURIComponent(i)+"="+encodeURIComponent(s)}return e}function l(t,i){var s=new window.XMLHttpRequest;return s.onerror=function(r){s.onreadystatechange=e.Util.falseFn,t.call(i,{error:{code:500,message:"XMLHttpRequest error"}},null)},s.onreadystatechange=function(){var r,n;if(4===s.readyState){try{r=JSON.parse(s.responseText)}catch(t){r=null,n={code:500,message:"Could not parse response as JSON. This could also be caused by a CORS or XMLHttpRequest error."}}!n&&r.error&&(n=r.error,r=null),s.onerror=e.Util.falseFn,t.call(i,n,r)}},s.ontimeout=function(){this.onerror()},s}function u(t,e,i,s){var r=l(i,s);return r.open("POST",t),void 0!==s&&null!==s&&void 0!==s.options&&(r.timeout=s.options.timeout),r.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"),r.send(a(e)),r}function h(t,e,i,s){var r=l(i,s);return r.open("GET",t+"?"+a(e),!0),void 0!==s&&null!==s&&void 0!==s.options&&(r.timeout=s.options.timeout),r.send(null),r}function c(t,e,i,s){var n=a(e),o=l(i,s),u=(t+"?"+n).length;if(u<=2e3&&r.cors?o.open("GET",t+"?"+n):u>2e3&&r.cors&&(o.open("POST",t),o.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8")),void 0!==s&&null!==s&&void 0!==s.options&&(o.timeout=s.options.timeout),u<=2e3&&r.cors)o.send(null);else{if(!(u>2e3&&r.cors))return u<=2e3&&!r.cors?p(t,e,i,s):void M("a request to "+t+" was longer then 2000 characters and this browser cannot make a cross-domain post request. Please use a proxy http://esri.github.io/esri-leaflet/api-reference/request.html");o.send(n)}return o}function p(t,i,s,r){window._EsriLeafletCallbacks=window._EsriLeafletCallbacks||{};var n="c"+o;i.callback="window._EsriLeafletCallbacks."+n,window._EsriLeafletCallbacks[n]=function(t){if(!0!==window._EsriLeafletCallbacks[n]){var e,i=Object.prototype.toString.call(t);"[object Object]"!==i&&"[object Array]"!==i&&(e={error:{code:500,message:"Expected array or object as JSONP response"}},t=null),!e&&t.error&&(e=t,t=null),s.call(r,e,t),window._EsriLeafletCallbacks[n]=!0}};var l=e.DomUtil.create("script",null,document.body);return l.type="text/javascript",l.src=t+"?"+a(i),l.id=n,e.DomUtil.addClass(l,"esri-leaflet-jsonp"),o++,{id:n,url:l.src,abort:function(){window._EsriLeafletCallbacks._callback[n]({code:0,message:"Request aborted."})}}}var d=r.cors?h:p;d.CORS=h,d.JSONP=p;var m={request:c,get:d,post:u};function f(t){return function(t,e){for(var i=0;i=0}function g(t,e,i,s){var r=(s[0]-i[0])*(t[1]-i[1])-(s[1]-i[1])*(t[0]-i[0]),n=(e[0]-t[0])*(t[1]-i[1])-(e[1]-t[1])*(t[0]-i[0]),o=(s[1]-i[1])*(e[0]-t[0])-(s[0]-i[0])*(e[1]-t[1]);if(0!==o){var a=r/o,l=n/o;if(a>=0&&a<=1&&l>=0&&l<=1)return!0}return!1}function v(t,e){for(var i=0;i=4){y(s)||s.reverse(),e.push(s);for(var r=0;r=4&&(y(n)&&n.reverse(),e.push(n))}}return e}function x(t){var e={};for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i]);return e}function L(t,e){var i={};if("number"==typeof t.x&&"number"==typeof t.y&&(i.type="Point",i.coordinates=[t.x,t.y],"number"==typeof t.z&&i.coordinates.push(t.z)),t.points&&(i.type="MultiPoint",i.coordinates=t.points.slice(0)),t.paths&&(1===t.paths.length?(i.type="LineString",i.coordinates=t.paths[0].slice(0)):(i.type="MultiLineString",i.coordinates=t.paths.slice(0))),t.rings&&(i=function(t){for(var e,i,s=[],r=[],n=0;n=0;e--)if(_(s[e][0],i)){s[e].push(i),u=!0;break}u||l.push(i)}for(;l.length;){i=l.pop();var h=!1;for(e=s.length-1;e>=0;e--)if(v(s[e][0],i)){s[e].push(i),h=!0;break}h||s.push([i.reverse()])}return 1===s.length?{type:"Polygon",coordinates:s[0]}:{type:"MultiPolygon",coordinates:s}}(t.rings.slice(0))),(t.geometry||t.attributes)&&(i.type="Feature",i.geometry=t.geometry?L(t.geometry):null,i.properties=t.attributes?x(t.attributes):null,t.attributes))try{i.id=function(t,e){for(var i=e?[e,"OBJECTID","FID"]:["OBJECTID","FID"],s=0;s=0;r--){var n=s[r].slice(0);e.push(n)}return e}(t.coordinates.slice(0)),r.spatialReference=s;break;case"Feature":t.geometry&&(r.geometry=S(t.geometry,e)),r.attributes=t.properties?x(t.properties):{},t.id&&(r.attributes[e]=t.id);break;case"FeatureCollection":for(r=[],i=0;i=0;o--){var a=I(s[o],i||C(s[o]));n.features.push(a)}return n}function F(t){return"/"!==(t=e.Util.trim(t))[t.length-1]&&(t+="/"),t}function U(t){if(-1!==t.url.indexOf("?")){t.requestParams=t.requestParams||{};var e=t.url.substring(t.url.indexOf("?")+1);t.url=t.url.split("?")[0],t.requestParams=JSON.parse('{"'+decodeURI(e).replace(/"/g,'\\"').replace(/&/g,'","').replace(/=/g,'":"')+'"}')}return t.url=F(t.url.split("?")[0]),t}function k(t){return/^(?!.*utility\.arcgis\.com).*\.arcgis\.com.*FeatureServer/i.test(t)}function q(t){var e;switch(t){case"Point":e="esriGeometryPoint";break;case"MultiPoint":e="esriGeometryMultipoint";break;case"LineString":case"MultiLineString":e="esriGeometryPolyline";break;case"Polygon":case"MultiPolygon":e="esriGeometryPolygon"}return e}function M(){console&&console.warn&&console.warn.apply(console,arguments)}function G(t){return t.getSize().x-n.attributionWidthOffset+"px"}function D(t){if(t.attributionControl&&!t.attributionControl._esriAttributionAdded){t.attributionControl.setPrefix('Leaflet | Powered by Esri');var i=document.createElement("style");i.type="text/css",i.innerHTML=".esri-truncated-attribution:hover {white-space: normal;}",document.getElementsByTagName("head")[0].appendChild(i),e.DomUtil.addClass(t.attributionControl._container,"esri-truncated-attribution:hover");var s=document.createElement("style");s.type="text/css",s.innerHTML=".esri-truncated-attribution {vertical-align: -3px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;display: inline-block;transition: 0s white-space;transition-delay: 1s;max-width: "+G(t)+";}",document.getElementsByTagName("head")[0].appendChild(s),e.DomUtil.addClass(t.attributionControl._container,"esri-truncated-attribution"),t.on("resize",function(e){t.attributionControl._container.style.maxWidth=G(e.target)}),t.on("unload",function(){i.parentNode.removeChild(i),s.parentNode.removeChild(s);for(var t=document.querySelectorAll(".esri-leaflet-jsonp"),e=0;e=u.minZoom&&a<=u.maxZoom&&(r+=", "+h)}r=r.substr(2);var c=i.attributionControl._container.querySelector(".esri-dynamic-attribution");c.innerHTML=r,c.style.maxWidth=G(i),i.fire("attributionupdated",{attribution:r})}}var N={warn:M,cleanUrl:F,getUrlParams:U,isArcgisOnline:k,geojsonTypeToArcGIS:q,responseToFeatureCollection:P,geojsonToArcGIS:A,arcgisToGeoJSON:I,boundsToExtent:w,extentToBounds:T,calcAttributionWidth:G,setEsriAttribution:D,_setGeometry:E,_getAttributionData:B,_updateMapAttribution:z,_findIdAttributeFromFeature:C,_findIdAttributeFromResponse:O},j=e.Class.extend({options:{proxy:!1,useCors:i},generateSetter:function(t,i){return e.Util.bind(function(e){return this.params[t]=e,this},i)},initialize:function(t){if(t.request&&t.options?(this._service=t,e.Util.setOptions(this,t.options)):(e.Util.setOptions(this,t),this.options.url=F(t.url)),this.params=e.Util.extend({},this.params||{}),this.setters)for(var i in this.setters){var s=this.setters[i];this[i]=this.generateSetter(s,this)}},token:function(t){return this._service?this._service.authenticate(t):this.params.token=t,this},format:function(t){return this.params.returnUnformattedValues=!t,this},request:function(t,i){return this.options.requestParams&&e.Util.extend(this.params,this.options.requestParams),this._service?this._service.request(this.path,this.params,t,i):this._request("request",this.path,this.params,t,i)},_request:function(t,e,i,s,r){var n=this.options.proxy?this.options.proxy+"?"+this.options.url+e:this.options.url+e;return"get"!==t&&"request"!==t||this.options.useCors?m[t](n,i,s,r):m.get.JSONP(n,i,s,r)}});var Z=j.extend({setters:{offset:"resultOffset",limit:"resultRecordCount",fields:"outFields",precision:"geometryPrecision",featureIds:"objectIds",returnGeometry:"returnGeometry",returnM:"returnM",transform:"datumTransformation",token:"token"},path:"query",params:{returnGeometry:!0,where:"1=1",outSr:4326,outFields:"*"},within:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelContains",this},intersects:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelIntersects",this},contains:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelWithin",this},crosses:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelCrosses",this},touches:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelTouches",this},overlaps:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelOverlaps",this},bboxIntersects:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelEnvelopeIntersects",this},indexIntersects:function(t){return this._setGeometryParams(t),this.params.spatialRel="esriSpatialRelIndexIntersects",this},nearby:function(t,i){return t=e.latLng(t),this.params.geometry=[t.lng,t.lat],this.params.geometryType="esriGeometryPoint",this.params.spatialRel="esriSpatialRelIntersects",this.params.units="esriSRUnit_Meter",this.params.distance=i,this.params.inSr=4326,this},where:function(t){return this.params.where=t,this},between:function(t,e){return this.params.time=[t.valueOf(),e.valueOf()],this},simplify:function(t,e){var i=Math.abs(t.getBounds().getWest()-t.getBounds().getEast());return this.params.maxAllowableOffset=i/t.getSize().y*e,this},orderBy:function(t,e){return e=e||"ASC",this.params.orderByFields=this.params.orderByFields?this.params.orderByFields+",":"",this.params.orderByFields+=[t,e].join(" "),this},run:function(t,e){return this._cleanParams(),this.options.isModern||k(this.options.url)?(this.params.f="geojson",this.request(function(i,s){this._trapSQLerrors(i),t.call(e,i,s,s)},this)):this.request(function(i,s){this._trapSQLerrors(i),t.call(e,i,s&&P(s),s)},this)},count:function(t,e){return this._cleanParams(),this.params.returnCountOnly=!0,this.request(function(e,i){t.call(this,e,i&&i.count,i)},e)},ids:function(t,e){return this._cleanParams(),this.params.returnIdsOnly=!0,this.request(function(e,i){t.call(this,e,i&&i.objectIds,i)},e)},bounds:function(t,e){return this._cleanParams(),this.params.returnExtentOnly=!0,this.request(function(i,s){s&&s.extent&&T(s.extent)?t.call(e,i,T(s.extent),s):(i={message:"Invalid Bounds"},t.call(e,i,null,s))},e)},distinct:function(){return this.params.returnGeometry=!1,this.params.returnDistinctValues=!0,this},pixelSize:function(t){var i=e.point(t);return this.params.pixelSize=[i.x,i.y],this},layer:function(t){return this.path=t+"/query",this},_trapSQLerrors:function(t){t&&"400"===t.code&&M("one common syntax error in query requests is encasing string values in double quotes instead of single quotes")},_cleanParams:function(){delete this.params.returnIdsOnly,delete this.params.returnExtentOnly,delete this.params.returnCountOnly},_setGeometryParams:function(t){this.params.inSr=4326;var e=E(t);this.params.geometry=e.geometry,this.params.geometryType=e.geometryType}});function J(t){return new Z(t)}var W=j.extend({setters:{contains:"contains",text:"searchText",fields:"searchFields",spatialReference:"sr",sr:"sr",layers:"layers",returnGeometry:"returnGeometry",maxAllowableOffset:"maxAllowableOffset",precision:"geometryPrecision",dynamicLayers:"dynamicLayers",returnZ:"returnZ",returnM:"returnM",gdbVersion:"gdbVersion",token:"token"},path:"find",params:{sr:4326,contains:!0,returnGeometry:!0,returnZ:!0,returnM:!1},layerDefs:function(t,e){return this.params.layerDefs=this.params.layerDefs?this.params.layerDefs+";":"",this.params.layerDefs+=[t,e].join(":"),this},simplify:function(t,e){var i=Math.abs(t.getBounds().getWest()-t.getBounds().getEast());return this.params.maxAllowableOffset=i/t.getSize().y*e,this},run:function(t,e){return this.request(function(i,s){t.call(e,i,s&&P(s),s)},e)}});function Q(t){return new W(t)}var V=j.extend({path:"identify",between:function(t,e){return this.params.time=[t.valueOf(),e.valueOf()],this}});var H=V.extend({setters:{layers:"layers",precision:"geometryPrecision",tolerance:"tolerance",returnGeometry:"returnGeometry"},params:{sr:4326,layers:"all",tolerance:3,returnGeometry:!0},on:function(t){var e=w(t.getBounds()),i=t.getSize();return this.params.imageDisplay=[i.x,i.y,96],this.params.mapExtent=[e.xmin,e.ymin,e.xmax,e.ymax],this},at:function(t){return 2===t.length&&(t=e.latLng(t)),this._setGeometryParams(t),this},layerDef:function(t,e){return this.params.layerDefs=this.params.layerDefs?this.params.layerDefs+";":"",this.params.layerDefs+=[t,e].join(":"),this},simplify:function(t,e){var i=Math.abs(t.getBounds().getWest()-t.getBounds().getEast());return this.params.maxAllowableOffset=i/t.getSize().y*e,this},run:function(t,e){return this.request(function(i,s){if(i)t.call(e,i,void 0,s);else{var r=P(s);s.results=s.results.reverse();for(var n=0;n=0;n--)r.catalogItems.features[n].properties.catalogItemVisibility=s[n];return r}});function $(t){return new X(t)}var Y=e.Evented.extend({options:{proxy:!1,useCors:i,timeout:0},initialize:function(t){t=t||{},this._requestQueue=[],this._authenticating=!1,e.Util.setOptions(this,t),this.options.url=F(this.options.url)},get:function(t,e,i,s){return this._request("get",t,e,i,s)},post:function(t,e,i,s){return this._request("post",t,e,i,s)},request:function(t,e,i,s){return this._request("request",t,e,i,s)},metadata:function(t,e){return this._request("get","",{},t,e)},authenticate:function(t){return this._authenticating=!1,this.options.token=t,this._runQueue(),this},getTimeout:function(){return this.options.timeout},setTimeout:function(t){this.options.timeout=t},_request:function(t,i,s,r,n){this.fire("requeststart",{url:this.options.url+i,params:s,method:t},!0);var o=this._createServiceCallback(t,i,s,r,n);if(this.options.token&&(s.token=this.options.token),this.options.requestParams&&e.Util.extend(s,this.options.requestParams),!this._authenticating){var a=this.options.proxy?this.options.proxy+"?"+this.options.url+i:this.options.url+i;return"get"!==t&&"request"!==t||this.options.useCors?m[t](a,s,o,n):m.get.JSONP(a,s,o,n)}this._requestQueue.push([t,i,s,r,n])},_createServiceCallback:function(t,i,s,r,n){return e.Util.bind(function(o,a){!o||499!==o.code&&498!==o.code||(this._authenticating=!0,this._requestQueue.push([t,i,s,r,n]),this.fire("authenticationrequired",{authenticate:e.Util.bind(this.authenticate,this)},!0),o.authenticate=e.Util.bind(this.authenticate,this)),r.call(n,o,a),o?this.fire("requesterror",{url:this.options.url+i,params:s,message:o.message,code:o.code,method:t},!0):this.fire("requestsuccess",{url:this.options.url+i,params:s,response:a,method:t},!0),this.fire("requestend",{url:this.options.url+i,params:s,method:t},!0)},this)},_runQueue:function(){for(var t=this._requestQueue.length-1;t>=0;t--){var e=this._requestQueue[t];this[e.shift()].apply(this,e)}this._requestQueue=[]}});var tt=Y.extend({identify:function(){return K(this)},find:function(){return Q(this)},query:function(){return J(this)}});function et(t){return new tt(t)}var it=Y.extend({query:function(){return J(this)},identify:function(){return $(this)}});function st(t){return new it(t)}var rt=Y.extend({options:{idAttribute:"OBJECTID"},query:function(){return J(this)},addFeature:function(t,e,i){return delete t.id,t=A(t),this.post("addFeatures",{features:[t]},function(t,s){var r=s&&s.addResults?s.addResults[0]:void 0;e&&e.call(i,t||s.addResults[0].error,r)},i)},updateFeature:function(t,e,i){return t=A(t,this.options.idAttribute),this.post("updateFeatures",{features:[t]},function(t,s){var r=s&&s.updateResults?s.updateResults[0]:void 0;e&&e.call(i,t||s.updateResults[0].error,r)},i)},deleteFeature:function(t,e,i){return this.post("deleteFeatures",{objectIds:t},function(t,s){var r=s&&s.deleteResults?s.deleteResults[0]:void 0;e&&e.call(i,t||s.deleteResults[0].error,r)},i)},deleteFeatures:function(t,e,i){return this.post("deleteFeatures",{objectIds:t},function(t,s){var r=s&&s.deleteResults?s.deleteResults:void 0;e&&e.call(i,t||s.deleteResults[0].error,r)},i)}});function nt(t){return new rt(t)}var ot="https:"!==window.location.protocol?"http:":"https:",at=e.TileLayer.extend({statics:{TILES:{Streets:{urlTemplate:ot+"//{s}.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,subdomains:["server","services"],attribution:"USGS, NOAA",attributionUrl:"https://static.arcgis.com/attribution/World_Street_Map"}},Topographic:{urlTemplate:ot+"//{s}.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,subdomains:["server","services"],attribution:"USGS, NOAA",attributionUrl:"https://static.arcgis.com/attribution/World_Topo_Map"}},Oceans:{urlTemplate:ot+"//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],attribution:"USGS, NOAA",attributionUrl:"https://static.arcgis.com/attribution/Ocean_Basemap"}},OceansLabels:{urlTemplate:ot+"//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Reference/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],pane:s?"esri-labels":"tilePane"}},NationalGeographic:{urlTemplate:ot+"//{s}.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],attribution:"National Geographic, DeLorme, HERE, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, increment P Corp."}},DarkGray:{urlTemplate:ot+"//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],attribution:"HERE, DeLorme, MapmyIndia, © OpenStreetMap contributors"}},DarkGrayLabels:{urlTemplate:ot+"//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Reference/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],pane:s?"esri-labels":"tilePane",attribution:""}},Gray:{urlTemplate:ot+"//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],attribution:"HERE, DeLorme, MapmyIndia, © OpenStreetMap contributors"}},GrayLabels:{urlTemplate:ot+"//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:16,subdomains:["server","services"],pane:s?"esri-labels":"tilePane",attribution:""}},Imagery:{urlTemplate:ot+"//{s}.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,subdomains:["server","services"],attribution:"DigitalGlobe, GeoEye, i-cubed, USDA, USGS, AEX, Getmapping, Aerogrid, IGN, IGP, swisstopo, and the GIS User Community",attributionUrl:"https://static.arcgis.com/attribution/World_Imagery"}},ImageryLabels:{urlTemplate:ot+"//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,subdomains:["server","services"],pane:s?"esri-labels":"tilePane",attribution:""}},ImageryTransportation:{urlTemplate:ot+"//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Transportation/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,subdomains:["server","services"],pane:s?"esri-labels":"tilePane"}},ShadedRelief:{urlTemplate:ot+"//{s}.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:13,subdomains:["server","services"],attribution:"USGS"}},ShadedReliefLabels:{urlTemplate:ot+"//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places_Alternate/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:12,subdomains:["server","services"],pane:s?"esri-labels":"tilePane",attribution:""}},Terrain:{urlTemplate:ot+"//{s}.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:13,subdomains:["server","services"],attribution:"USGS, NOAA"}},TerrainLabels:{urlTemplate:ot+"//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Reference_Overlay/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:13,subdomains:["server","services"],pane:s?"esri-labels":"tilePane",attribution:""}},USATopo:{urlTemplate:ot+"//{s}.arcgisonline.com/ArcGIS/rest/services/USA_Topo_Maps/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:15,subdomains:["server","services"],attribution:"USGS, National Geographic Society, i-cubed"}},ImageryClarity:{urlTemplate:ot+"//clarity.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",options:{minZoom:1,maxZoom:19,attribution:"Esri, DigitalGlobe, GeoEye, Earthstar Geographics, CNES/Airbus DS, USDA, USGS, AeroGRID, IGN, and the GIS User Community"}}}},initialize:function(t,i){var s;if("object"==typeof t&&t.urlTemplate&&t.options)s=t;else{if("string"!=typeof t||!at.TILES[t])throw new Error('L.esri.BasemapLayer: Invalid parameter. Use one of "Streets", "Topographic", "Oceans", "OceansLabels", "NationalGeographic", "Gray", "GrayLabels", "DarkGray", "DarkGrayLabels", "Imagery", "ImageryLabels", "ImageryTransportation", "ImageryClarity", "ShadedRelief", "ShadedReliefLabels", "Terrain", "TerrainLabels" or "USATopo"');s=at.TILES[t]}var r=e.Util.extend(s.options,i);e.Util.setOptions(this,r),this.options.token&&(s.urlTemplate+="?token="+this.options.token),e.TileLayer.prototype.initialize.call(this,s.urlTemplate,r)},onAdd:function(t){D(t),"esri-labels"===this.options.pane&&this._initPane(),this.options.attributionUrl&&B(this.options.attributionUrl,t),t.on("moveend",z),e.TileLayer.prototype.onAdd.call(this,t)},onRemove:function(t){t.off("moveend",z),e.TileLayer.prototype.onRemove.call(this,t)},_initPane:function(){if(!this._map.getPane(this.options.pane)){var t=this._map.createPane(this.options.pane);t.style.pointerEvents="none",t.style.zIndex=500}},getAttribution:function(){if(this.options.attribution)var t=''+this.options.attribution+"";return t}});var lt=e.TileLayer.extend({options:{zoomOffsetAllowance:.1,errorTileUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEABAMAAACuXLVVAAAAA1BMVEUzNDVszlHHAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAAAAAAAAAB6mUWpAAAADZJREFUeJztwQEBAAAAgiD/r25IQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7waBAAABw08RwAAAAABJRU5ErkJggg=="},statics:{MercatorZoomLevels:{0:156543.033928,1:78271.5169639999,2:39135.7584820001,3:19567.8792409999,4:9783.93962049996,5:4891.96981024998,6:2445.98490512499,7:1222.99245256249,8:611.49622628138,9:305.748113140558,10:152.874056570411,11:76.4370282850732,12:38.2185141425366,13:19.1092570712683,14:9.55462853563415,15:4.77731426794937,16:2.38865713397468,17:1.19432856685505,18:.597164283559817,19:.298582141647617,20:.14929107082381,21:.07464553541191,22:.0373227677059525,23:.0186613838529763}},initialize:function(t){t=U(t=e.Util.setOptions(this,t)),this.tileUrl=(t.proxy?t.proxy+"?":"")+t.url+"tile/{z}/{y}/{x}"+(t.requestParams&&Object.keys(t.requestParams).length>0?e.Util.getParamString(t.requestParams):""),-1!==t.url.indexOf("{s}")&&t.subdomains&&(t.url=t.url.replace("{s}",t.subdomains[0])),this.service=et(t),this.service.addEventParent(this),new RegExp(/tiles.arcgis(online)?\.com/g).test(t.url)&&(this.tileUrl=this.tileUrl.replace("://tiles","://tiles{s}"),t.subdomains=["1","2","3","4"]),this.options.token&&(this.tileUrl+="?token="+this.options.token),e.TileLayer.prototype.initialize.call(this,this.tileUrl,t)},getTileUrl:function(t){var i=this._getZoomForUrl();return e.Util.template(this.tileUrl,e.Util.extend({s:this._getSubdomain(t),x:t.x,y:t.y,z:this._lodMap&&this._lodMap[i]?this._lodMap[i]:i},this.options))},createTile:function(t,i){var s=document.createElement("img");return e.DomEvent.on(s,"load",e.Util.bind(this._tileOnLoad,this,i,s)),e.DomEvent.on(s,"error",e.Util.bind(this._tileOnError,this,i,s)),this.options.crossOrigin&&(s.crossOrigin=""),s.alt="",!this._lodMap||this._lodMap&&this._lodMap[this._getZoomForUrl()]?s.src=this.getTileUrl(t):this.once("lodmap",function(){s.src=this.getTileUrl(t)},this),s},onAdd:function(t){D(t),this._lodMap||this.metadata(function(i,s){if(!i&&s.spatialReference){var r=s.spatialReference.latestWkid||s.spatialReference.wkid;if(!this.options.attribution&&t.attributionControl&&s.copyrightText&&(this.options.attribution=s.copyrightText,t.attributionControl.addAttribution(this.getAttribution())),t.options.crs!==e.CRS.EPSG3857||102100!==r&&3857!==r)t.options.crs&&t.options.crs.code&&t.options.crs.code.indexOf(r)>-1||M("L.esri.TiledMapLayer is using a non-mercator spatial reference. Support may be available through Proj4Leaflet http://esri.github.io/esri-leaflet/examples/non-mercator-projection.html");else{this._lodMap={};for(var n=s.tileInfo.lods,o=lt.MercatorZoomLevels,a=0;athis.options.maxZoom||t0||ns.max.x)||!i.wrapLat&&(t.ys.max.y))return!1}if(!this.options.bounds)return!0;var r=this._cellCoordsToBounds(t);return e.latLngBounds(this.options.bounds).intersects(r)},_cellCoordsToBounds:function(t){var i=this._map,s=this.options.cellSize,r=t.multiplyBy(s),n=r.add([s,s]),o=i.wrapLatLng(i.unproject(r,t.z)),a=i.wrapLatLng(i.unproject(n,t.z));return e.latLngBounds(o,a)},_cellCoordsToKey:function(t){return t.x+":"+t.y},_keyToCellCoords:function(t){var i=t.split(":"),s=parseInt(i[0],10),r=parseInt(i[1],10);return e.point(s,r)},_removeOtherCells:function(t){for(var e in this._cells)t.contains(this._keyToCellCoords(e))||this._removeCell(e)},_removeCell:function(t){var e=this._activeCells[t];e&&(delete this._activeCells[t],this.cellLeave&&this.cellLeave(e.bounds,e.coords),this.fire("cellleave",{bounds:e.bounds,coords:e.coords}))},_removeCells:function(){for(var t in this._cells){var e=this._cells[t].bounds,i=this._cells[t].coords;this.cellLeave&&this.cellLeave(e,i),this.fire("cellleave",{bounds:e,coords:i})}},_addCell:function(t){this._wrapCoords(t);var e=this._cellCoordsToKey(t),i=this._cells[e];i&&!this._activeCells[e]&&(this.cellEnter&&this.cellEnter(i.bounds,t),this.fire("cellenter",{bounds:i.bounds,coords:t}),this._activeCells[e]=i),i||(i={coords:t,bounds:this._cellCoordsToBounds(t)},this._cells[e]=i,this._activeCells[e]=i,this.createCell&&this.createCell(i.bounds,t),this.fire("cellcreate",{bounds:i.bounds,coords:t}))},_wrapCoords:function(t){t.x=this._wrapLng?e.Util.wrapNum(t.x,this._wrapLng):t.x,t.y=this._wrapLat?e.Util.wrapNum(t.y,this._wrapLat):t.y},_getCellNumBounds:function(){var t=this._map.getPixelWorldBounds(),i=this._getCellSize();return t?e.bounds(t.min.divideBy(i).floor(),t.max.divideBy(i).ceil().subtract([1,1])):null}});function mt(t){this.values=[].concat(t||[])}mt.prototype.query=function(t){var e=this.getIndex(t);return this.values[e]},mt.prototype.getIndex=function(t){this.dirty&&this.sort();for(var e,i,s=0,r=this.values.length-1;s<=r;)if(e=(s+r)/2|0,+(i=this.values[Math.round(e)]).value<+t)s=e+1;else{if(!(+i.value>+t))return e;r=e-1}return Math.abs(~r)},mt.prototype.between=function(t,e){var i=this.getIndex(t),s=this.getIndex(e);if(0===i&&0===s)return[];for(;this.values[i-1]&&this.values[i-1].value===t;)i--;for(;this.values[s+1]&&this.values[s+1].value===e;)s++;return this.values[s]&&this.values[s].value===e&&this.values[s+1]&&s++,this.values.slice(i,s)},mt.prototype.insert=function(t){return this.values.splice(this.getIndex(t.value),0,t),this},mt.prototype.bulkAdd=function(t,e){return this.values=this.values.concat([].concat(t||[])),e?this.sort():this.dirty=!0,this},mt.prototype.sort=function(){return this.values.sort(function(t,e){return+e.value-+t.value}).reverse(),this.dirty=!1,this};var ft=dt.extend({options:{attribution:null,where:"1=1",fields:["*"],from:!1,to:!1,timeField:!1,timeFilterMode:"server",simplifyFactor:0,precision:6},initialize:function(t){if(dt.prototype.initialize.call(this,t),t=U(t),t=e.Util.setOptions(this,t),this.service=nt(t),this.service.addEventParent(this),"*"!==this.options.fields[0]){for(var i=!1,s=0;s=0;s--){var r=t[s].id;-1===this._currentSnapshot.indexOf(r)&&this._currentSnapshot.push(r),-1===this._cache[i].indexOf(r)&&this._cache[i].push(r)}this.options.timeField&&this._buildTimeIndexes(t),this.createLayers(t)},_buildQuery:function(t){var i=this.service.query().intersects(t).where(this.options.where).fields(this.options.fields).precision(this.options.precision);return this.options.requestParams&&e.Util.extend(i.params,this.options.requestParams),this.options.simplifyFactor&&i.simplify(this._map,this.options.simplifyFactor),"server"===this.options.timeFilterMode&&this.options.from&&this.options.to&&i.between(this.options.from,this.options.to),i},setWhere:function(t,i,s){this.options.where=t&&t.length?t:"1=1";for(var r=[],n=[],o=0,a=null,l=e.Util.bind(function(t,l){if(t&&(a=t),l)for(var u=l.features.length-1;u>=0;u--)n.push(l.features[u].id);--o<=0&&this._visibleZoom()&&(this._currentSnapshot=n,e.Util.requestAnimFrame(e.Util.bind(function(){this.removeLayers(r),this.addLayers(n),i&&i.call(s,a)},this)))},this),u=this._currentSnapshot.length-1;u>=0;u--)r.push(this._currentSnapshot[u]);for(var h in this._activeCells){o++;var c=this._keyToCellCoords(h),p=this._cellCoordsToBounds(c);this._requestFeatures(p,h,l)}return this},getWhere:function(){return this.options.where},getTimeRange:function(){return[this.options.from,this.options.to]},setTimeRange:function(t,i,s,r){var n=this.options.from,o=this.options.to,a=0,l=null,u=e.Util.bind(function(e){e&&(l=e),this._filterExistingFeatures(n,o,t,i),a--,s&&a<=0&&s.call(r,l)},this);if(this.options.from=t,this.options.to=i,this._filterExistingFeatures(n,o,t,i),"server"===this.options.timeFilterMode)for(var h in this._activeCells){a++;var c=this._keyToCellCoords(h),p=this._cellCoordsToBounds(c);this._requestFeatures(p,h,u)}return this},refresh:function(){for(var t in this._activeCells){var e=this._keyToCellCoords(t),i=this._cellCoordsToBounds(e);this._requestFeatures(i,t)}this.redraw&&this.once("load",function(){this.eachFeature(function(t){this._redraw(t.feature.id)},this)},this)},_filterExistingFeatures:function(t,i,s,r){var n=t&&i?this._getFeaturesInTimeRange(t,i):this._currentSnapshot,o=this._getFeaturesInTimeRange(s,r);if(o.indexOf)for(var a=0;a=0&&n.splice(l,1)}e.Util.requestAnimFrame(e.Util.bind(function(){this.removeLayers(n),this.addLayers(o)},this))},_getFeaturesInTimeRange:function(t,e){var i,s=[];if(this.options.timeField.start&&this.options.timeField.end){var r=this._startTimeIndex.between(t,e),n=this._endTimeIndex.between(t,e);i=r.concat(n)}else i=this._timeIndex.between(t,e);for(var o=i.length-1;o>=0;o--)s.push(i[o].id);return s},_buildTimeIndexes:function(t){var e,i;if(this.options.timeField.start&&this.options.timeField.end){var s=[],r=[];for(e=t.length-1;e>=0;e--)i=t[e],s.push({id:i.id,value:new Date(i.properties[this.options.timeField.start])}),r.push({id:i.id,value:new Date(i.properties[this.options.timeField.end])});this._startTimeIndex.bulkAdd(s),this._endTimeIndex.bulkAdd(r)}else{var n=[];for(e=t.length-1;e>=0;e--)i=t[e],n.push({id:i.id,value:new Date(i.properties[this.options.timeField])});this._timeIndex.bulkAdd(n)}},_featureWithinTimeRange:function(t){if(!this.options.from||!this.options.to)return!0;var e=+this.options.from.valueOf(),i=+this.options.to.valueOf();if("string"==typeof this.options.timeField){var s=+t.properties[this.options.timeField];return s>=e&&s<=i}if(this.options.timeField.start&&this.options.timeField.end){var r=+t.properties[this.options.timeField.start],n=+t.properties[this.options.timeField.end];return r>=e&&r<=i||n>=e&&n<=i}},_visibleZoom:function(){if(!this._map)return!1;var t=this._map.getZoom();return!(t>this.options.maxZoom||t0)for(var r=0;r=0;e--){var i,s=t[e],r=this._layers[s.id];this._visibleZoom()&&r&&!this._map.hasLayer(r)&&(this._map.addLayer(r),this.fire("addfeature",{feature:r.feature},!0)),r&&this.options.simplifyFactor>0&&(r.setLatLngs||r.setLatLng)&&this._updateLayer(r,s),r||((i=this.createNewLayer(s)).feature=s,i.addEventParent(this),this.options.onEachFeature&&this.options.onEachFeature(i.feature,i),this._layers[i.feature.id]=i,this.setFeatureStyle(i.feature.id,this.options.style),this.fire("createfeature",{feature:i.feature},!0),this._visibleZoom()&&(!this.options.timeField||this.options.timeField&&this._featureWithinTimeRange(s))&&this._map.addLayer(i))}},addLayers:function(t){for(var e=t.length-1;e>=0;e--){var i=this._layers[t[e]];i&&this._map.addLayer(i)}},removeLayers:function(t,e){for(var i=t.length-1;i>=0;i--){var s=t[i],r=this._layers[s];r&&(this.fire("removefeature",{feature:r.feature,permanent:e},!0),this._map.removeLayer(r)),r&&e&&delete this._layers[s]}},cellEnter:function(t,i){this._visibleZoom()&&!this._zooming&&this._map&&e.Util.requestAnimFrame(e.Util.bind(function(){var t=this._cacheKey(i),e=this._cellCoordsToKey(i),s=this._cache[t];this._activeCells[e]&&s&&this.addLayers(s)},this))},cellLeave:function(t,i){this._zooming||e.Util.requestAnimFrame(e.Util.bind(function(){if(this._map){var t=this._cacheKey(i),e=this._cellCoordsToKey(i),s=this._cache[t],r=this._map.getBounds();if(!this._activeCells[e]&&s){for(var n=!0,o=0;o 2000 && Support.cors) {\n httpRequest.open('POST', url);\n httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');\n }\n\n if (typeof context !== 'undefined' && context !== null) {\n if (typeof context.options !== 'undefined') {\n httpRequest.timeout = context.options.timeout;\n }\n }\n\n // request is less than 2000 characters and the browser supports CORS, make GET request with XMLHttpRequest\n if (requestLength <= 2000 && Support.cors) {\n httpRequest.send(null);\n\n // request is more than 2000 characters and the browser supports CORS, make POST request with XMLHttpRequest\n } else if (requestLength > 2000 && Support.cors) {\n httpRequest.send(paramString);\n\n // request is less than 2000 characters and the browser does not support CORS, make a JSONP request\n } else if (requestLength <= 2000 && !Support.cors) {\n return jsonp(url, params, callback, context);\n\n // request is longer then 2000 characters and the browser does not support CORS, log a warning\n } else {\n warn('a request to ' + url + ' was longer then 2000 characters and this browser cannot make a cross-domain post request. Please use a proxy http://esri.github.io/esri-leaflet/api-reference/request.html');\n return;\n }\n\n return httpRequest;\n}\n\nexport function jsonp (url, params, callback, context) {\n window._EsriLeafletCallbacks = window._EsriLeafletCallbacks || {};\n var callbackId = 'c' + callbacks;\n params.callback = 'window._EsriLeafletCallbacks.' + callbackId;\n\n window._EsriLeafletCallbacks[callbackId] = function (response) {\n if (window._EsriLeafletCallbacks[callbackId] !== true) {\n var error;\n var responseType = Object.prototype.toString.call(response);\n\n if (!(responseType === '[object Object]' || responseType === '[object Array]')) {\n error = {\n error: {\n code: 500,\n message: 'Expected array or object as JSONP response'\n }\n };\n response = null;\n }\n\n if (!error && response.error) {\n error = response;\n response = null;\n }\n\n callback.call(context, error, response);\n window._EsriLeafletCallbacks[callbackId] = true;\n }\n };\n\n var script = DomUtil.create('script', null, document.body);\n script.type = 'text/javascript';\n script.src = url + '?' + serialize(params);\n script.id = callbackId;\n DomUtil.addClass(script, 'esri-leaflet-jsonp');\n\n callbacks++;\n\n return {\n id: callbackId,\n url: script.src,\n abort: function () {\n window._EsriLeafletCallbacks._callback[callbackId]({\n code: 0,\n message: 'Request aborted.'\n });\n }\n };\n}\n\nvar get = ((Support.cors) ? xmlHttpGet : jsonp);\nget.CORS = xmlHttpGet;\nget.JSONP = jsonp;\n\n// choose the correct AJAX handler depending on CORS support\nexport { get };\n\n// always use XMLHttpRequest for posts\nexport { xmlHttpPost as post };\n\n// export the Request object to call the different handlers for debugging\nexport var Request = {\n request: request,\n get: get,\n post: xmlHttpPost\n};\n\nexport default Request;\n","/*\n * Copyright 2017 Esri\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// checks if 2 x,y points are equal\nfunction pointsEqual (a, b) {\n for (var i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\n// checks if the first and last points of a ring are equal and closes the ring\nfunction closeRing (coordinates) {\n if (!pointsEqual(coordinates[0], coordinates[coordinates.length - 1])) {\n coordinates.push(coordinates[0]);\n }\n return coordinates;\n}\n\n// determine if polygon ring coordinates are clockwise. clockwise signifies outer ring, counter-clockwise an inner ring\n// or hole. this logic was found at http://stackoverflow.com/questions/1165647/how-to-determine-if-a-list-of-polygon-\n// points-are-in-clockwise-order\nfunction ringIsClockwise (ringToTest) {\n var total = 0;\n var i = 0;\n var rLength = ringToTest.length;\n var pt1 = ringToTest[i];\n var pt2;\n for (i; i < rLength - 1; i++) {\n pt2 = ringToTest[i + 1];\n total += (pt2[0] - pt1[0]) * (pt2[1] + pt1[1]);\n pt1 = pt2;\n }\n return (total >= 0);\n}\n\n// ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L504-L519\nfunction vertexIntersectsVertex (a1, a2, b1, b2) {\n var uaT = ((b2[0] - b1[0]) * (a1[1] - b1[1])) - ((b2[1] - b1[1]) * (a1[0] - b1[0]));\n var ubT = ((a2[0] - a1[0]) * (a1[1] - b1[1])) - ((a2[1] - a1[1]) * (a1[0] - b1[0]));\n var uB = ((b2[1] - b1[1]) * (a2[0] - a1[0])) - ((b2[0] - b1[0]) * (a2[1] - a1[1]));\n\n if (uB !== 0) {\n var ua = uaT / uB;\n var ub = ubT / uB;\n\n if (ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1) {\n return true;\n }\n }\n\n return false;\n}\n\n// ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L521-L531\nfunction arrayIntersectsArray (a, b) {\n for (var i = 0; i < a.length - 1; i++) {\n for (var j = 0; j < b.length - 1; j++) {\n if (vertexIntersectsVertex(a[i], a[i + 1], b[j], b[j + 1])) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n// ported from terraformer.js https://github.com/Esri/Terraformer/blob/master/terraformer.js#L470-L480\nfunction coordinatesContainPoint (coordinates, point) {\n var contains = false;\n for (var i = -1, l = coordinates.length, j = l - 1; ++i < l; j = i) {\n if (((coordinates[i][1] <= point[1] && point[1] < coordinates[j][1]) ||\n (coordinates[j][1] <= point[1] && point[1] < coordinates[i][1])) &&\n (point[0] < (((coordinates[j][0] - coordinates[i][0]) * (point[1] - coordinates[i][1])) / (coordinates[j][1] - coordinates[i][1])) + coordinates[i][0])) {\n contains = !contains;\n }\n }\n return contains;\n}\n\n// ported from terraformer-arcgis-parser.js https://github.com/Esri/terraformer-arcgis-parser/blob/master/terraformer-arcgis-parser.js#L106-L113\nfunction coordinatesContainCoordinates (outer, inner) {\n var intersects = arrayIntersectsArray(outer, inner);\n var contains = coordinatesContainPoint(outer, inner[0]);\n if (!intersects && contains) {\n return true;\n }\n return false;\n}\n\n// do any polygons in this array contain any other polygons in this array?\n// used for checking for holes in arcgis rings\n// ported from terraformer-arcgis-parser.js https://github.com/Esri/terraformer-arcgis-parser/blob/master/terraformer-arcgis-parser.js#L117-L172\nfunction convertRingsToGeoJSON (rings) {\n var outerRings = [];\n var holes = [];\n var x; // iterator\n var outerRing; // current outer ring being evaluated\n var hole; // current hole being evaluated\n\n // for each ring\n for (var r = 0; r < rings.length; r++) {\n var ring = closeRing(rings[r].slice(0));\n if (ring.length < 4) {\n continue;\n }\n // is this ring an outer ring? is it clockwise?\n if (ringIsClockwise(ring)) {\n var polygon = [ ring.slice().reverse() ]; // wind outer rings counterclockwise for RFC 7946 compliance\n outerRings.push(polygon); // push to outer rings\n } else {\n holes.push(ring.slice().reverse()); // wind inner rings clockwise for RFC 7946 compliance\n }\n }\n\n var uncontainedHoles = [];\n\n // while there are holes left...\n while (holes.length) {\n // pop a hole off out stack\n hole = holes.pop();\n\n // loop over all outer rings and see if they contain our hole.\n var contained = false;\n for (x = outerRings.length - 1; x >= 0; x--) {\n outerRing = outerRings[x][0];\n if (coordinatesContainCoordinates(outerRing, hole)) {\n // the hole is contained push it into our polygon\n outerRings[x].push(hole);\n contained = true;\n break;\n }\n }\n\n // ring is not contained in any outer ring\n // sometimes this happens https://github.com/Esri/esri-leaflet/issues/320\n if (!contained) {\n uncontainedHoles.push(hole);\n }\n }\n\n // if we couldn't match any holes using contains we can try intersects...\n while (uncontainedHoles.length) {\n // pop a hole off out stack\n hole = uncontainedHoles.pop();\n\n // loop over all outer rings and see if any intersect our hole.\n var intersects = false;\n\n for (x = outerRings.length - 1; x >= 0; x--) {\n outerRing = outerRings[x][0];\n if (arrayIntersectsArray(outerRing, hole)) {\n // the hole is contained push it into our polygon\n outerRings[x].push(hole);\n intersects = true;\n break;\n }\n }\n\n if (!intersects) {\n outerRings.push([hole.reverse()]);\n }\n }\n\n if (outerRings.length === 1) {\n return {\n type: 'Polygon',\n coordinates: outerRings[0]\n };\n } else {\n return {\n type: 'MultiPolygon',\n coordinates: outerRings\n };\n }\n}\n\n// This function ensures that rings are oriented in the right directions\n// outer rings are clockwise, holes are counterclockwise\n// used for converting GeoJSON Polygons to ArcGIS Polygons\nfunction orientRings (poly) {\n var output = [];\n var polygon = poly.slice(0);\n var outerRing = closeRing(polygon.shift().slice(0));\n if (outerRing.length >= 4) {\n if (!ringIsClockwise(outerRing)) {\n outerRing.reverse();\n }\n\n output.push(outerRing);\n\n for (var i = 0; i < polygon.length; i++) {\n var hole = closeRing(polygon[i].slice(0));\n if (hole.length >= 4) {\n if (ringIsClockwise(hole)) {\n hole.reverse();\n }\n output.push(hole);\n }\n }\n }\n\n return output;\n}\n\n// This function flattens holes in multipolygons to one array of polygons\n// used for converting GeoJSON Polygons to ArcGIS Polygons\nfunction flattenMultiPolygonRings (rings) {\n var output = [];\n for (var i = 0; i < rings.length; i++) {\n var polygon = orientRings(rings[i]);\n for (var x = polygon.length - 1; x >= 0; x--) {\n var ring = polygon[x].slice(0);\n output.push(ring);\n }\n }\n return output;\n}\n\n// shallow object clone for feature properties and attributes\n// from http://jsperf.com/cloning-an-object/2\nfunction shallowClone (obj) {\n var target = {};\n for (var i in obj) {\n if (obj.hasOwnProperty(i)) {\n target[i] = obj[i];\n }\n }\n return target;\n}\n\nfunction getId (attributes, idAttribute) {\n var keys = idAttribute ? [idAttribute, 'OBJECTID', 'FID'] : ['OBJECTID', 'FID'];\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (\n key in attributes &&\n (typeof attributes[key] === 'string' ||\n typeof attributes[key] === 'number')\n ) {\n return attributes[key];\n }\n }\n throw Error('No valid id attribute found');\n}\n\nexport function arcgisToGeoJSON (arcgis, idAttribute) {\n var geojson = {};\n\n if (typeof arcgis.x === 'number' && typeof arcgis.y === 'number') {\n geojson.type = 'Point';\n geojson.coordinates = [arcgis.x, arcgis.y];\n if (typeof arcgis.z === 'number') {\n geojson.coordinates.push(arcgis.z);\n }\n }\n\n if (arcgis.points) {\n geojson.type = 'MultiPoint';\n geojson.coordinates = arcgis.points.slice(0);\n }\n\n if (arcgis.paths) {\n if (arcgis.paths.length === 1) {\n geojson.type = 'LineString';\n geojson.coordinates = arcgis.paths[0].slice(0);\n } else {\n geojson.type = 'MultiLineString';\n geojson.coordinates = arcgis.paths.slice(0);\n }\n }\n\n if (arcgis.rings) {\n geojson = convertRingsToGeoJSON(arcgis.rings.slice(0));\n }\n\n if (arcgis.geometry || arcgis.attributes) {\n geojson.type = 'Feature';\n geojson.geometry = (arcgis.geometry) ? arcgisToGeoJSON(arcgis.geometry) : null;\n geojson.properties = (arcgis.attributes) ? shallowClone(arcgis.attributes) : null;\n if (arcgis.attributes) {\n try {\n geojson.id = getId(arcgis.attributes, idAttribute);\n } catch (err) {\n // don't set an id\n }\n }\n }\n\n // if no valid geometry was encountered\n if (JSON.stringify(geojson.geometry) === JSON.stringify({})) {\n geojson.geometry = null;\n }\n\n if (\n arcgis.spatialReference &&\n arcgis.spatialReference.wkid &&\n arcgis.spatialReference.wkid !== 4326\n ) {\n console.warn('Object converted in non-standard crs - ' + JSON.stringify(arcgis.spatialReference));\n }\n\n return geojson;\n}\n\nexport function geojsonToArcGIS (geojson, idAttribute) {\n idAttribute = idAttribute || 'OBJECTID';\n var spatialReference = { wkid: 4326 };\n var result = {};\n var i;\n\n switch (geojson.type) {\n case 'Point':\n result.x = geojson.coordinates[0];\n result.y = geojson.coordinates[1];\n result.spatialReference = spatialReference;\n break;\n case 'MultiPoint':\n result.points = geojson.coordinates.slice(0);\n result.spatialReference = spatialReference;\n break;\n case 'LineString':\n result.paths = [geojson.coordinates.slice(0)];\n result.spatialReference = spatialReference;\n break;\n case 'MultiLineString':\n result.paths = geojson.coordinates.slice(0);\n result.spatialReference = spatialReference;\n break;\n case 'Polygon':\n result.rings = orientRings(geojson.coordinates.slice(0));\n result.spatialReference = spatialReference;\n break;\n case 'MultiPolygon':\n result.rings = flattenMultiPolygonRings(geojson.coordinates.slice(0));\n result.spatialReference = spatialReference;\n break;\n case 'Feature':\n if (geojson.geometry) {\n result.geometry = geojsonToArcGIS(geojson.geometry, idAttribute);\n }\n result.attributes = (geojson.properties) ? shallowClone(geojson.properties) : {};\n if (geojson.id) {\n result.attributes[idAttribute] = geojson.id;\n }\n break;\n case 'FeatureCollection':\n result = [];\n for (i = 0; i < geojson.features.length; i++) {\n result.push(geojsonToArcGIS(geojson.features[i], idAttribute));\n }\n break;\n case 'GeometryCollection':\n result = [];\n for (i = 0; i < geojson.geometries.length; i++) {\n result.push(geojsonToArcGIS(geojson.geometries[i], idAttribute));\n }\n break;\n }\n\n return result;\n}\n\nexport default { arcgisToGeoJSON: arcgisToGeoJSON, geojsonToArcGIS: geojsonToArcGIS };\n","import { latLng, latLngBounds, LatLng, LatLngBounds, Util, DomUtil, GeoJSON } from 'leaflet';\nimport { jsonp } from './Request';\nimport { options } from './Options';\n\nimport {\n geojsonToArcGIS as g2a,\n arcgisToGeoJSON as a2g\n} from '@esri/arcgis-to-geojson-utils';\n\nexport function geojsonToArcGIS (geojson, idAttr) {\n return g2a(geojson, idAttr);\n}\n\nexport function arcgisToGeoJSON (arcgis, idAttr) {\n return a2g(arcgis, idAttr);\n}\n\n// convert an extent (ArcGIS) to LatLngBounds (Leaflet)\nexport function extentToBounds (extent) {\n // \"NaN\" coordinates from ArcGIS Server indicate a null geometry\n if (extent.xmin !== 'NaN' && extent.ymin !== 'NaN' && extent.xmax !== 'NaN' && extent.ymax !== 'NaN') {\n var sw = latLng(extent.ymin, extent.xmin);\n var ne = latLng(extent.ymax, extent.xmax);\n return latLngBounds(sw, ne);\n } else {\n return null;\n }\n}\n\n// convert an LatLngBounds (Leaflet) to extent (ArcGIS)\nexport function boundsToExtent (bounds) {\n bounds = latLngBounds(bounds);\n return {\n 'xmin': bounds.getSouthWest().lng,\n 'ymin': bounds.getSouthWest().lat,\n 'xmax': bounds.getNorthEast().lng,\n 'ymax': bounds.getNorthEast().lat,\n 'spatialReference': {\n 'wkid': 4326\n }\n };\n}\n\nvar knownFieldNames = /^(OBJECTID|FID|OID|ID)$/i;\n\n// Attempts to find the ID Field from response\nexport function _findIdAttributeFromResponse (response) {\n var result;\n\n if (response.objectIdFieldName) {\n // Find Id Field directly\n result = response.objectIdFieldName;\n } else if (response.fields) {\n // Find ID Field based on field type\n for (var j = 0; j <= response.fields.length - 1; j++) {\n if (response.fields[j].type === 'esriFieldTypeOID') {\n result = response.fields[j].name;\n break;\n }\n }\n if (!result) {\n // If no field was marked as being the esriFieldTypeOID try well known field names\n for (j = 0; j <= response.fields.length - 1; j++) {\n if (response.fields[j].name.match(knownFieldNames)) {\n result = response.fields[j].name;\n break;\n }\n }\n }\n }\n return result;\n}\n\n// This is the 'last' resort, find the Id field from the specified feature\nexport function _findIdAttributeFromFeature (feature) {\n for (var key in feature.attributes) {\n if (key.match(knownFieldNames)) {\n return key;\n }\n }\n}\n\nexport function responseToFeatureCollection (response, idAttribute) {\n var objectIdField;\n var features = response.features || response.results;\n var count = features.length;\n\n if (idAttribute) {\n objectIdField = idAttribute;\n } else {\n objectIdField = _findIdAttributeFromResponse(response);\n }\n\n var featureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n if (count) {\n for (var i = features.length - 1; i >= 0; i--) {\n var feature = arcgisToGeoJSON(features[i], objectIdField || _findIdAttributeFromFeature(features[i]));\n featureCollection.features.push(feature);\n }\n }\n\n return featureCollection;\n}\n\n // trim url whitespace and add a trailing slash if needed\nexport function cleanUrl (url) {\n // trim leading and trailing spaces, but not spaces inside the url\n url = Util.trim(url);\n\n // add a trailing slash to the url if the user omitted it\n if (url[url.length - 1] !== '/') {\n url += '/';\n }\n\n return url;\n}\n\n/* Extract url params if any and store them in requestParams attribute.\n Return the options params updated */\nexport function getUrlParams (options) {\n if (options.url.indexOf('?') !== -1) {\n options.requestParams = options.requestParams || {};\n var queryString = options.url.substring(options.url.indexOf('?') + 1);\n options.url = options.url.split('?')[0];\n options.requestParams = JSON.parse('{\"' + decodeURI(queryString).replace(/\"/g, '\\\\\"').replace(/&/g, '\",\"').replace(/=/g, '\":\"') + '\"}');\n }\n options.url = cleanUrl(options.url.split('?')[0]);\n return options;\n}\n\nexport function isArcgisOnline (url) {\n /* hosted feature services support geojson as an output format\n utility.arcgis.com services are proxied from a variety of ArcGIS Server vintages, and may not */\n return (/^(?!.*utility\\.arcgis\\.com).*\\.arcgis\\.com.*FeatureServer/i).test(url);\n}\n\nexport function geojsonTypeToArcGIS (geoJsonType) {\n var arcgisGeometryType;\n switch (geoJsonType) {\n case 'Point':\n arcgisGeometryType = 'esriGeometryPoint';\n break;\n case 'MultiPoint':\n arcgisGeometryType = 'esriGeometryMultipoint';\n break;\n case 'LineString':\n arcgisGeometryType = 'esriGeometryPolyline';\n break;\n case 'MultiLineString':\n arcgisGeometryType = 'esriGeometryPolyline';\n break;\n case 'Polygon':\n arcgisGeometryType = 'esriGeometryPolygon';\n break;\n case 'MultiPolygon':\n arcgisGeometryType = 'esriGeometryPolygon';\n break;\n }\n\n return arcgisGeometryType;\n}\n\nexport function warn () {\n if (console && console.warn) {\n console.warn.apply(console, arguments);\n }\n}\n\nexport function calcAttributionWidth (map) {\n // either crop at 55px or user defined buffer\n return (map.getSize().x - options.attributionWidthOffset) + 'px';\n}\n\nexport function setEsriAttribution (map) {\n if (map.attributionControl && !map.attributionControl._esriAttributionAdded) {\n map.attributionControl.setPrefix('Leaflet | Powered by Esri');\n\n var hoverAttributionStyle = document.createElement('style');\n hoverAttributionStyle.type = 'text/css';\n hoverAttributionStyle.innerHTML = '.esri-truncated-attribution:hover {' +\n 'white-space: normal;' +\n '}';\n\n document.getElementsByTagName('head')[0].appendChild(hoverAttributionStyle);\n DomUtil.addClass(map.attributionControl._container, 'esri-truncated-attribution:hover');\n\n // define a new css class in JS to trim attribution into a single line\n var attributionStyle = document.createElement('style');\n attributionStyle.type = 'text/css';\n attributionStyle.innerHTML = '.esri-truncated-attribution {' +\n 'vertical-align: -3px;' +\n 'white-space: nowrap;' +\n 'overflow: hidden;' +\n 'text-overflow: ellipsis;' +\n 'display: inline-block;' +\n 'transition: 0s white-space;' +\n 'transition-delay: 1s;' +\n 'max-width: ' + calcAttributionWidth(map) + ';' +\n '}';\n\n document.getElementsByTagName('head')[0].appendChild(attributionStyle);\n DomUtil.addClass(map.attributionControl._container, 'esri-truncated-attribution');\n\n // update the width used to truncate when the map itself is resized\n map.on('resize', function (e) {\n map.attributionControl._container.style.maxWidth = calcAttributionWidth(e.target);\n });\n\n // remove injected scripts and style tags\n map.on('unload', function () {\n hoverAttributionStyle.parentNode.removeChild(hoverAttributionStyle);\n attributionStyle.parentNode.removeChild(attributionStyle);\n var nodeList = document.querySelectorAll('.esri-leaflet-jsonp');\n for (var i = 0; i < nodeList.length; i++) {\n nodeList.item(i).parentNode.removeChild(nodeList.item(i));\n }\n });\n\n map.attributionControl._esriAttributionAdded = true;\n }\n}\n\nexport function _setGeometry (geometry) {\n var params = {\n geometry: null,\n geometryType: null\n };\n\n // convert bounds to extent and finish\n if (geometry instanceof LatLngBounds) {\n // set geometry + geometryType\n params.geometry = boundsToExtent(geometry);\n params.geometryType = 'esriGeometryEnvelope';\n return params;\n }\n\n // convert L.Marker > L.LatLng\n if (geometry.getLatLng) {\n geometry = geometry.getLatLng();\n }\n\n // convert L.LatLng to a geojson point and continue;\n if (geometry instanceof LatLng) {\n geometry = {\n type: 'Point',\n coordinates: [geometry.lng, geometry.lat]\n };\n }\n\n // handle L.GeoJSON, pull out the first geometry\n if (geometry instanceof GeoJSON) {\n // reassign geometry to the GeoJSON value (we are assuming that only one feature is present)\n geometry = geometry.getLayers()[0].feature.geometry;\n params.geometry = geojsonToArcGIS(geometry);\n params.geometryType = geojsonTypeToArcGIS(geometry.type);\n }\n\n // Handle L.Polyline and L.Polygon\n if (geometry.toGeoJSON) {\n geometry = geometry.toGeoJSON();\n }\n\n // handle GeoJSON feature by pulling out the geometry\n if (geometry.type === 'Feature') {\n // get the geometry of the geojson feature\n geometry = geometry.geometry;\n }\n\n // confirm that our GeoJSON is a point, line or polygon\n if (geometry.type === 'Point' || geometry.type === 'LineString' || geometry.type === 'Polygon' || geometry.type === 'MultiPolygon') {\n params.geometry = geojsonToArcGIS(geometry);\n params.geometryType = geojsonTypeToArcGIS(geometry.type);\n return params;\n }\n\n // warn the user if we havn't found an appropriate object\n warn('invalid geometry passed to spatial query. Should be L.LatLng, L.LatLngBounds, L.Marker or a GeoJSON Point, Line, Polygon or MultiPolygon object');\n\n return;\n}\n\nexport function _getAttributionData (url, map) {\n jsonp(url, {}, Util.bind(function (error, attributions) {\n if (error) { return; }\n map._esriAttributions = [];\n for (var c = 0; c < attributions.contributors.length; c++) {\n var contributor = attributions.contributors[c];\n\n for (var i = 0; i < contributor.coverageAreas.length; i++) {\n var coverageArea = contributor.coverageAreas[i];\n var southWest = latLng(coverageArea.bbox[0], coverageArea.bbox[1]);\n var northEast = latLng(coverageArea.bbox[2], coverageArea.bbox[3]);\n map._esriAttributions.push({\n attribution: contributor.attribution,\n score: coverageArea.score,\n bounds: latLngBounds(southWest, northEast),\n minZoom: coverageArea.zoomMin,\n maxZoom: coverageArea.zoomMax\n });\n }\n }\n\n map._esriAttributions.sort(function (a, b) {\n return b.score - a.score;\n });\n\n // pass the same argument as the map's 'moveend' event\n var obj = { target: map };\n _updateMapAttribution(obj);\n }, this));\n}\n\nexport function _updateMapAttribution (evt) {\n var map = evt.target;\n var oldAttributions = map._esriAttributions;\n\n if (map && map.attributionControl && oldAttributions) {\n var newAttributions = '';\n var bounds = map.getBounds();\n var wrappedBounds = latLngBounds(\n bounds.getSouthWest().wrap(),\n bounds.getNorthEast().wrap()\n );\n var zoom = map.getZoom();\n\n for (var i = 0; i < oldAttributions.length; i++) {\n var attribution = oldAttributions[i];\n var text = attribution.attribution;\n\n if (!newAttributions.match(text) && attribution.bounds.intersects(wrappedBounds) && zoom >= attribution.minZoom && zoom <= attribution.maxZoom) {\n newAttributions += (', ' + text);\n }\n }\n\n newAttributions = newAttributions.substr(2);\n var attributionElement = map.attributionControl._container.querySelector('.esri-dynamic-attribution');\n\n attributionElement.innerHTML = newAttributions;\n attributionElement.style.maxWidth = calcAttributionWidth(map);\n\n map.fire('attributionupdated', {\n attribution: newAttributions\n });\n }\n}\n\nexport var EsriUtil = {\n warn: warn,\n cleanUrl: cleanUrl,\n getUrlParams: getUrlParams,\n isArcgisOnline: isArcgisOnline,\n geojsonTypeToArcGIS: geojsonTypeToArcGIS,\n responseToFeatureCollection: responseToFeatureCollection,\n geojsonToArcGIS: geojsonToArcGIS,\n arcgisToGeoJSON: arcgisToGeoJSON,\n boundsToExtent: boundsToExtent,\n extentToBounds: extentToBounds,\n calcAttributionWidth: calcAttributionWidth,\n setEsriAttribution: setEsriAttribution,\n _setGeometry: _setGeometry,\n _getAttributionData: _getAttributionData,\n _updateMapAttribution: _updateMapAttribution,\n _findIdAttributeFromFeature: _findIdAttributeFromFeature,\n _findIdAttributeFromResponse: _findIdAttributeFromResponse\n};\n\nexport default EsriUtil;\n","import { Class, Util } from 'leaflet';\nimport {cors} from '../Support';\nimport { cleanUrl, getUrlParams } from '../Util';\nimport Request from '../Request';\n\nexport var Task = Class.extend({\n\n options: {\n proxy: false,\n useCors: cors\n },\n\n // Generate a method for each methodName:paramName in the setters for this task.\n generateSetter: function (param, context) {\n return Util.bind(function (value) {\n this.params[param] = value;\n return this;\n }, context);\n },\n\n initialize: function (endpoint) {\n // endpoint can be either a url (and options) for an ArcGIS Rest Service or an instance of EsriLeaflet.Service\n if (endpoint.request && endpoint.options) {\n this._service = endpoint;\n Util.setOptions(this, endpoint.options);\n } else {\n Util.setOptions(this, endpoint);\n this.options.url = cleanUrl(endpoint.url);\n }\n\n // clone default params into this object\n this.params = Util.extend({}, this.params || {});\n\n // generate setter methods based on the setters object implimented a child class\n if (this.setters) {\n for (var setter in this.setters) {\n var param = this.setters[setter];\n this[setter] = this.generateSetter(param, this);\n }\n }\n },\n\n token: function (token) {\n if (this._service) {\n this._service.authenticate(token);\n } else {\n this.params.token = token;\n }\n return this;\n },\n\n // ArcGIS Server Find/Identify 10.5+\n format: function (boolean) {\n // use double negative to expose a more intuitive positive method name\n this.params.returnUnformattedValues = !boolean;\n return this;\n },\n\n request: function (callback, context) {\n if (this.options.requestParams) {\n Util.extend(this.params, this.options.requestParams);\n }\n if (this._service) {\n return this._service.request(this.path, this.params, callback, context);\n }\n\n return this._request('request', this.path, this.params, callback, context);\n },\n\n _request: function (method, path, params, callback, context) {\n var url = (this.options.proxy) ? this.options.proxy + '?' + this.options.url + path : this.options.url + path;\n\n if ((method === 'get' || method === 'request') && !this.options.useCors) {\n return Request.get.JSONP(url, params, callback, context);\n }\n\n return Request[method](url, params, callback, context);\n }\n});\n\nexport function task (options) {\n options = getUrlParams(options);\n return new Task(options);\n}\n\nexport default task;\n","import { point, latLng } from 'leaflet';\nimport { Task } from './Task';\nimport {\n warn,\n responseToFeatureCollection,\n isArcgisOnline,\n extentToBounds,\n _setGeometry\n} from '../Util';\n\nexport var Query = Task.extend({\n setters: {\n 'offset': 'resultOffset',\n 'limit': 'resultRecordCount',\n 'fields': 'outFields',\n 'precision': 'geometryPrecision',\n 'featureIds': 'objectIds',\n 'returnGeometry': 'returnGeometry',\n 'returnM': 'returnM',\n 'transform': 'datumTransformation',\n 'token': 'token'\n },\n\n path: 'query',\n\n params: {\n returnGeometry: true,\n where: '1=1',\n outSr: 4326,\n outFields: '*'\n },\n\n // Returns a feature if its shape is wholly contained within the search geometry. Valid for all shape type combinations.\n within: function (geometry) {\n this._setGeometryParams(geometry);\n this.params.spatialRel = 'esriSpatialRelContains'; // to the REST api this reads geometry **contains** layer\n return this;\n },\n\n // Returns a feature if any spatial relationship is found. Applies to all shape type combinations.\n intersects: function (geometry) {\n this._setGeometryParams(geometry);\n this.params.spatialRel = 'esriSpatialRelIntersects';\n return this;\n },\n\n // Returns a feature if its shape wholly contains the search geometry. Valid for all shape type combinations.\n contains: function (geometry) {\n this._setGeometryParams(geometry);\n this.params.spatialRel = 'esriSpatialRelWithin'; // to the REST api this reads geometry **within** layer\n return this;\n },\n\n // Returns a feature if the intersection of the interiors of the two shapes is not empty and has a lower dimension than the maximum dimension of the two shapes. Two lines that share an endpoint in common do not cross. Valid for Line/Line, Line/Area, Multi-point/Area, and Multi-point/Line shape type combinations.\n crosses: function (geometry) {\n this._setGeometryParams(geometry);\n this.params.spatialRel = 'esriSpatialRelCrosses';\n return this;\n },\n\n // Returns a feature if the two shapes share a common boundary. However, the intersection of the interiors of the two shapes must be empty. In the Point/Line case, the point may touch an endpoint only of the line. Applies to all combinations except Point/Point.\n touches: function (geometry) {\n this._setGeometryParams(geometry);\n this.params.spatialRel = 'esriSpatialRelTouches';\n return this;\n },\n\n // Returns a feature if the intersection of the two shapes results in an object of the same dimension, but different from both of the shapes. Applies to Area/Area, Line/Line, and Multi-point/Multi-point shape type combinations.\n overlaps: function (geometry) {\n this._setGeometryParams(geometry);\n this.params.spatialRel = 'esriSpatialRelOverlaps';\n return this;\n },\n\n // Returns a feature if the envelope of the two shapes intersects.\n bboxIntersects: function (geometry) {\n this._setGeometryParams(geometry);\n this.params.spatialRel = 'esriSpatialRelEnvelopeIntersects';\n return this;\n },\n\n // if someone can help decipher the ArcObjects explanation and translate to plain speak, we should mention this method in the doc\n indexIntersects: function (geometry) {\n this._setGeometryParams(geometry);\n this.params.spatialRel = 'esriSpatialRelIndexIntersects'; // Returns a feature if the envelope of the query geometry intersects the index entry for the target geometry\n return this;\n },\n\n // only valid for Feature Services running on ArcGIS Server 10.3+ or ArcGIS Online\n nearby: function (latlng, radius) {\n latlng = latLng(latlng);\n this.params.geometry = [latlng.lng, latlng.lat];\n this.params.geometryType = 'esriGeometryPoint';\n this.params.spatialRel = 'esriSpatialRelIntersects';\n this.params.units = 'esriSRUnit_Meter';\n this.params.distance = radius;\n this.params.inSr = 4326;\n return this;\n },\n\n where: function (string) {\n // instead of converting double-quotes to single quotes, pass as is, and provide a more informative message if a 400 is encountered\n this.params.where = string;\n return this;\n },\n\n between: function (start, end) {\n this.params.time = [start.valueOf(), end.valueOf()];\n return this;\n },\n\n simplify: function (map, factor) {\n var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast());\n this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor;\n return this;\n },\n\n orderBy: function (fieldName, order) {\n order = order || 'ASC';\n this.params.orderByFields = (this.params.orderByFields) ? this.params.orderByFields + ',' : '';\n this.params.orderByFields += ([fieldName, order]).join(' ');\n return this;\n },\n\n run: function (callback, context) {\n this._cleanParams();\n\n // services hosted on ArcGIS Online and ArcGIS Server 10.3.1+ support requesting geojson directly\n if (this.options.isModern || isArcgisOnline(this.options.url)) {\n this.params.f = 'geojson';\n\n return this.request(function (error, response) {\n this._trapSQLerrors(error);\n callback.call(context, error, response, response);\n }, this);\n\n // otherwise convert it in the callback then pass it on\n } else {\n return this.request(function (error, response) {\n this._trapSQLerrors(error);\n callback.call(context, error, (response && responseToFeatureCollection(response)), response);\n }, this);\n }\n },\n\n count: function (callback, context) {\n this._cleanParams();\n this.params.returnCountOnly = true;\n return this.request(function (error, response) {\n callback.call(this, error, (response && response.count), response);\n }, context);\n },\n\n ids: function (callback, context) {\n this._cleanParams();\n this.params.returnIdsOnly = true;\n return this.request(function (error, response) {\n callback.call(this, error, (response && response.objectIds), response);\n }, context);\n },\n\n // only valid for Feature Services running on ArcGIS Server 10.3+ or ArcGIS Online\n bounds: function (callback, context) {\n this._cleanParams();\n this.params.returnExtentOnly = true;\n return this.request(function (error, response) {\n if (response && response.extent && extentToBounds(response.extent)) {\n callback.call(context, error, extentToBounds(response.extent), response);\n } else {\n error = {\n message: 'Invalid Bounds'\n };\n callback.call(context, error, null, response);\n }\n }, context);\n },\n\n distinct: function () {\n // geometry must be omitted for queries requesting distinct values\n this.params.returnGeometry = false;\n this.params.returnDistinctValues = true;\n return this;\n },\n\n // only valid for image services\n pixelSize: function (rawPoint) {\n var castPoint = point(rawPoint);\n this.params.pixelSize = [castPoint.x, castPoint.y];\n return this;\n },\n\n // only valid for map services\n layer: function (layer) {\n this.path = layer + '/query';\n return this;\n },\n\n _trapSQLerrors: function (error) {\n if (error) {\n if (error.code === '400') {\n warn('one common syntax error in query requests is encasing string values in double quotes instead of single quotes');\n }\n }\n },\n\n _cleanParams: function () {\n delete this.params.returnIdsOnly;\n delete this.params.returnExtentOnly;\n delete this.params.returnCountOnly;\n },\n\n _setGeometryParams: function (geometry) {\n this.params.inSr = 4326;\n var converted = _setGeometry(geometry);\n this.params.geometry = converted.geometry;\n this.params.geometryType = converted.geometryType;\n }\n\n});\n\nexport function query (options) {\n return new Query(options);\n}\n\nexport default query;\n","import { Task } from './Task';\nimport { responseToFeatureCollection } from '../Util';\n\nexport var Find = Task.extend({\n setters: {\n // method name > param name\n 'contains': 'contains',\n 'text': 'searchText',\n 'fields': 'searchFields', // denote an array or single string\n 'spatialReference': 'sr',\n 'sr': 'sr',\n 'layers': 'layers',\n 'returnGeometry': 'returnGeometry',\n 'maxAllowableOffset': 'maxAllowableOffset',\n 'precision': 'geometryPrecision',\n 'dynamicLayers': 'dynamicLayers',\n 'returnZ': 'returnZ',\n 'returnM': 'returnM',\n 'gdbVersion': 'gdbVersion',\n // skipped implementing this (for now) because the REST service implementation isnt consistent between operations\n // 'transform': 'datumTransformations',\n 'token': 'token'\n },\n\n path: 'find',\n\n params: {\n sr: 4326,\n contains: true,\n returnGeometry: true,\n returnZ: true,\n returnM: false\n },\n\n layerDefs: function (id, where) {\n this.params.layerDefs = (this.params.layerDefs) ? this.params.layerDefs + ';' : '';\n this.params.layerDefs += ([id, where]).join(':');\n return this;\n },\n\n simplify: function (map, factor) {\n var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast());\n this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor;\n return this;\n },\n\n run: function (callback, context) {\n return this.request(function (error, response) {\n callback.call(context, error, (response && responseToFeatureCollection(response)), response);\n }, context);\n }\n});\n\nexport function find (options) {\n return new Find(options);\n}\n\nexport default find;\n","import { Task } from './Task';\n\nexport var Identify = Task.extend({\n path: 'identify',\n\n between: function (start, end) {\n this.params.time = [start.valueOf(), end.valueOf()];\n return this;\n }\n});\n\nexport function identify (options) {\n return new Identify(options);\n}\n\nexport default identify;\n","import { latLng } from 'leaflet';\nimport { Identify } from './Identify';\nimport { responseToFeatureCollection,\n boundsToExtent,\n _setGeometry\n} from '../Util';\n\nexport var IdentifyFeatures = Identify.extend({\n setters: {\n 'layers': 'layers',\n 'precision': 'geometryPrecision',\n 'tolerance': 'tolerance',\n // skipped implementing this (for now) because the REST service implementation isnt consistent between operations.\n // 'transform': 'datumTransformations'\n 'returnGeometry': 'returnGeometry'\n },\n\n params: {\n sr: 4326,\n layers: 'all',\n tolerance: 3,\n returnGeometry: true\n },\n\n on: function (map) {\n var extent = boundsToExtent(map.getBounds());\n var size = map.getSize();\n this.params.imageDisplay = [size.x, size.y, 96];\n this.params.mapExtent = [extent.xmin, extent.ymin, extent.xmax, extent.ymax];\n return this;\n },\n\n at: function (geometry) {\n // cast lat, long pairs in raw array form manually\n if (geometry.length === 2) {\n geometry = latLng(geometry);\n }\n this._setGeometryParams(geometry);\n return this;\n },\n\n layerDef: function (id, where) {\n this.params.layerDefs = (this.params.layerDefs) ? this.params.layerDefs + ';' : '';\n this.params.layerDefs += ([id, where]).join(':');\n return this;\n },\n\n simplify: function (map, factor) {\n var mapWidth = Math.abs(map.getBounds().getWest() - map.getBounds().getEast());\n this.params.maxAllowableOffset = (mapWidth / map.getSize().y) * factor;\n return this;\n },\n\n run: function (callback, context) {\n return this.request(function (error, response) {\n // immediately invoke with an error\n if (error) {\n callback.call(context, error, undefined, response);\n return;\n\n // ok no error lets just assume we have features...\n } else {\n var featureCollection = responseToFeatureCollection(response);\n response.results = response.results.reverse();\n for (var i = 0; i < featureCollection.features.length; i++) {\n var feature = featureCollection.features[i];\n feature.layerId = response.results[i].layerId;\n }\n callback.call(context, undefined, featureCollection, response);\n }\n });\n },\n\n _setGeometryParams: function (geometry) {\n var converted = _setGeometry(geometry);\n this.params.geometry = converted.geometry;\n this.params.geometryType = converted.geometryType;\n }\n});\n\nexport function identifyFeatures (options) {\n return new IdentifyFeatures(options);\n}\n\nexport default identifyFeatures;\n","import { latLng } from 'leaflet';\nimport { Identify } from './Identify';\nimport { responseToFeatureCollection } from '../Util';\n\nexport var IdentifyImage = Identify.extend({\n setters: {\n 'setMosaicRule': 'mosaicRule',\n 'setRenderingRule': 'renderingRule',\n 'setPixelSize': 'pixelSize',\n 'returnCatalogItems': 'returnCatalogItems',\n 'returnGeometry': 'returnGeometry'\n },\n\n params: {\n returnGeometry: false\n },\n\n at: function (latlng) {\n latlng = latLng(latlng);\n this.params.geometry = JSON.stringify({\n x: latlng.lng,\n y: latlng.lat,\n spatialReference: {\n wkid: 4326\n }\n });\n this.params.geometryType = 'esriGeometryPoint';\n return this;\n },\n\n getMosaicRule: function () {\n return this.params.mosaicRule;\n },\n\n getRenderingRule: function () {\n return this.params.renderingRule;\n },\n\n getPixelSize: function () {\n return this.params.pixelSize;\n },\n\n run: function (callback, context) {\n return this.request(function (error, response) {\n callback.call(context, error, (response && this._responseToGeoJSON(response)), response);\n }, this);\n },\n\n // get pixel data and return as geoJSON point\n // populate catalog items (if any)\n // merging in any catalogItemVisibilities as a propery of each feature\n _responseToGeoJSON: function (response) {\n var location = response.location;\n var catalogItems = response.catalogItems;\n var catalogItemVisibilities = response.catalogItemVisibilities;\n var geoJSON = {\n 'pixel': {\n 'type': 'Feature',\n 'geometry': {\n 'type': 'Point',\n 'coordinates': [location.x, location.y]\n },\n 'crs': {\n 'type': 'EPSG',\n 'properties': {\n 'code': location.spatialReference.wkid\n }\n },\n 'properties': {\n 'OBJECTID': response.objectId,\n 'name': response.name,\n 'value': response.value\n },\n 'id': response.objectId\n }\n };\n\n if (response.properties && response.properties.Values) {\n geoJSON.pixel.properties.values = response.properties.Values;\n }\n\n if (catalogItems && catalogItems.features) {\n geoJSON.catalogItems = responseToFeatureCollection(catalogItems);\n if (catalogItemVisibilities && catalogItemVisibilities.length === geoJSON.catalogItems.features.length) {\n for (var i = catalogItemVisibilities.length - 1; i >= 0; i--) {\n geoJSON.catalogItems.features[i].properties.catalogItemVisibility = catalogItemVisibilities[i];\n }\n }\n }\n return geoJSON;\n }\n\n});\n\nexport function identifyImage (params) {\n return new IdentifyImage(params);\n}\n\nexport default identifyImage;\n","import { Util, Evented } from 'leaflet';\nimport {cors} from '../Support';\nimport {cleanUrl, getUrlParams} from '../Util';\nimport Request from '../Request';\n\nexport var Service = Evented.extend({\n\n options: {\n proxy: false,\n useCors: cors,\n timeout: 0\n },\n\n initialize: function (options) {\n options = options || {};\n this._requestQueue = [];\n this._authenticating = false;\n Util.setOptions(this, options);\n this.options.url = cleanUrl(this.options.url);\n },\n\n get: function (path, params, callback, context) {\n return this._request('get', path, params, callback, context);\n },\n\n post: function (path, params, callback, context) {\n return this._request('post', path, params, callback, context);\n },\n\n request: function (path, params, callback, context) {\n return this._request('request', path, params, callback, context);\n },\n\n metadata: function (callback, context) {\n return this._request('get', '', {}, callback, context);\n },\n\n authenticate: function (token) {\n this._authenticating = false;\n this.options.token = token;\n this._runQueue();\n return this;\n },\n\n getTimeout: function () {\n return this.options.timeout;\n },\n\n setTimeout: function (timeout) {\n this.options.timeout = timeout;\n },\n\n _request: function (method, path, params, callback, context) {\n this.fire('requeststart', {\n url: this.options.url + path,\n params: params,\n method: method\n }, true);\n\n var wrappedCallback = this._createServiceCallback(method, path, params, callback, context);\n\n if (this.options.token) {\n params.token = this.options.token;\n }\n if (this.options.requestParams) {\n Util.extend(params, this.options.requestParams);\n }\n if (this._authenticating) {\n this._requestQueue.push([method, path, params, callback, context]);\n return;\n } else {\n var url = (this.options.proxy) ? this.options.proxy + '?' + this.options.url + path : this.options.url + path;\n\n if ((method === 'get' || method === 'request') && !this.options.useCors) {\n return Request.get.JSONP(url, params, wrappedCallback, context);\n } else {\n return Request[method](url, params, wrappedCallback, context);\n }\n }\n },\n\n _createServiceCallback: function (method, path, params, callback, context) {\n return Util.bind(function (error, response) {\n if (error && (error.code === 499 || error.code === 498)) {\n this._authenticating = true;\n\n this._requestQueue.push([method, path, params, callback, context]);\n\n // fire an event for users to handle and re-authenticate\n this.fire('authenticationrequired', {\n authenticate: Util.bind(this.authenticate, this)\n }, true);\n\n // if the user has access to a callback they can handle the auth error\n error.authenticate = Util.bind(this.authenticate, this);\n }\n\n callback.call(context, error, response);\n\n if (error) {\n this.fire('requesterror', {\n url: this.options.url + path,\n params: params,\n message: error.message,\n code: error.code,\n method: method\n }, true);\n } else {\n this.fire('requestsuccess', {\n url: this.options.url + path,\n params: params,\n response: response,\n method: method\n }, true);\n }\n\n this.fire('requestend', {\n url: this.options.url + path,\n params: params,\n method: method\n }, true);\n }, this);\n },\n\n _runQueue: function () {\n for (var i = this._requestQueue.length - 1; i >= 0; i--) {\n var request = this._requestQueue[i];\n var method = request.shift();\n this[method].apply(this, request);\n }\n this._requestQueue = [];\n }\n});\n\nexport function service (options) {\n options = getUrlParams(options);\n return new Service(options);\n}\n\nexport default service;\n","import { Service } from './Service';\nimport identifyFeatures from '../Tasks/IdentifyFeatures';\nimport query from '../Tasks/Query';\nimport find from '../Tasks/Find';\n\nexport var MapService = Service.extend({\n\n identify: function () {\n return identifyFeatures(this);\n },\n\n find: function () {\n return find(this);\n },\n\n query: function () {\n return query(this);\n }\n\n});\n\nexport function mapService (options) {\n return new MapService(options);\n}\n\nexport default mapService;\n","import { Service } from './Service';\nimport identifyImage from '../Tasks/IdentifyImage';\nimport query from '../Tasks/Query';\n\nexport var ImageService = Service.extend({\n\n query: function () {\n return query(this);\n },\n\n identify: function () {\n return identifyImage(this);\n }\n});\n\nexport function imageService (options) {\n return new ImageService(options);\n}\n\nexport default imageService;\n","import { Service } from './Service';\nimport query from '../Tasks/Query';\nimport { geojsonToArcGIS } from '../Util';\n\nexport var FeatureLayerService = Service.extend({\n\n options: {\n idAttribute: 'OBJECTID'\n },\n\n query: function () {\n return query(this);\n },\n\n addFeature: function (feature, callback, context) {\n delete feature.id;\n\n feature = geojsonToArcGIS(feature);\n\n return this.post('addFeatures', {\n features: [feature]\n }, function (error, response) {\n var result = (response && response.addResults) ? response.addResults[0] : undefined;\n if (callback) {\n callback.call(context, error || response.addResults[0].error, result);\n }\n }, context);\n },\n\n updateFeature: function (feature, callback, context) {\n feature = geojsonToArcGIS(feature, this.options.idAttribute);\n\n return this.post('updateFeatures', {\n features: [feature]\n }, function (error, response) {\n var result = (response && response.updateResults) ? response.updateResults[0] : undefined;\n if (callback) {\n callback.call(context, error || response.updateResults[0].error, result);\n }\n }, context);\n },\n\n deleteFeature: function (id, callback, context) {\n return this.post('deleteFeatures', {\n objectIds: id\n }, function (error, response) {\n var result = (response && response.deleteResults) ? response.deleteResults[0] : undefined;\n if (callback) {\n callback.call(context, error || response.deleteResults[0].error, result);\n }\n }, context);\n },\n\n deleteFeatures: function (ids, callback, context) {\n return this.post('deleteFeatures', {\n objectIds: ids\n }, function (error, response) {\n // pass back the entire array\n var result = (response && response.deleteResults) ? response.deleteResults : undefined;\n if (callback) {\n callback.call(context, error || response.deleteResults[0].error, result);\n }\n }, context);\n }\n});\n\nexport function featureLayerService (options) {\n return new FeatureLayerService(options);\n}\n\nexport default featureLayerService;\n","import { TileLayer, Util } from 'leaflet';\nimport { pointerEvents } from '../Support';\nimport {\n setEsriAttribution,\n _getAttributionData,\n _updateMapAttribution\n} from '../Util';\n\nvar tileProtocol = (window.location.protocol !== 'https:') ? 'http:' : 'https:';\n\nexport var BasemapLayer = TileLayer.extend({\n statics: {\n TILES: {\n Streets: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 19,\n subdomains: ['server', 'services'],\n attribution: 'USGS, NOAA',\n attributionUrl: 'https://static.arcgis.com/attribution/World_Street_Map'\n }\n },\n Topographic: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 19,\n subdomains: ['server', 'services'],\n attribution: 'USGS, NOAA',\n attributionUrl: 'https://static.arcgis.com/attribution/World_Topo_Map'\n }\n },\n Oceans: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 16,\n subdomains: ['server', 'services'],\n attribution: 'USGS, NOAA',\n attributionUrl: 'https://static.arcgis.com/attribution/Ocean_Basemap'\n }\n },\n OceansLabels: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Reference/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 16,\n subdomains: ['server', 'services'],\n pane: (pointerEvents) ? 'esri-labels' : 'tilePane'\n }\n },\n NationalGeographic: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 16,\n subdomains: ['server', 'services'],\n attribution: 'National Geographic, DeLorme, HERE, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, increment P Corp.'\n }\n },\n DarkGray: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 16,\n subdomains: ['server', 'services'],\n attribution: 'HERE, DeLorme, MapmyIndia, © OpenStreetMap contributors'\n }\n },\n DarkGrayLabels: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Reference/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 16,\n subdomains: ['server', 'services'],\n pane: (pointerEvents) ? 'esri-labels' : 'tilePane',\n attribution: ''\n\n }\n },\n Gray: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 16,\n subdomains: ['server', 'services'],\n attribution: 'HERE, DeLorme, MapmyIndia, © OpenStreetMap contributors'\n }\n },\n GrayLabels: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 16,\n subdomains: ['server', 'services'],\n pane: (pointerEvents) ? 'esri-labels' : 'tilePane',\n attribution: ''\n }\n },\n Imagery: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 19,\n subdomains: ['server', 'services'],\n attribution: 'DigitalGlobe, GeoEye, i-cubed, USDA, USGS, AEX, Getmapping, Aerogrid, IGN, IGP, swisstopo, and the GIS User Community',\n attributionUrl: 'https://static.arcgis.com/attribution/World_Imagery'\n }\n },\n ImageryLabels: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 19,\n subdomains: ['server', 'services'],\n pane: (pointerEvents) ? 'esri-labels' : 'tilePane',\n attribution: ''\n }\n },\n ImageryTransportation: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Transportation/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 19,\n subdomains: ['server', 'services'],\n pane: (pointerEvents) ? 'esri-labels' : 'tilePane'\n }\n },\n ShadedRelief: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 13,\n subdomains: ['server', 'services'],\n attribution: 'USGS'\n }\n },\n ShadedReliefLabels: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places_Alternate/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 12,\n subdomains: ['server', 'services'],\n pane: (pointerEvents) ? 'esri-labels' : 'tilePane',\n attribution: ''\n }\n },\n Terrain: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 13,\n subdomains: ['server', 'services'],\n attribution: 'USGS, NOAA'\n }\n },\n TerrainLabels: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/Reference/World_Reference_Overlay/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 13,\n subdomains: ['server', 'services'],\n pane: (pointerEvents) ? 'esri-labels' : 'tilePane',\n attribution: ''\n }\n },\n USATopo: {\n urlTemplate: tileProtocol + '//{s}.arcgisonline.com/ArcGIS/rest/services/USA_Topo_Maps/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 15,\n subdomains: ['server', 'services'],\n attribution: 'USGS, National Geographic Society, i-cubed'\n }\n },\n ImageryClarity: {\n urlTemplate: tileProtocol + '//clarity.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',\n options: {\n minZoom: 1,\n maxZoom: 19,\n attribution: 'Esri, DigitalGlobe, GeoEye, Earthstar Geographics, CNES/Airbus DS, USDA, USGS, AeroGRID, IGN, and the GIS User Community'\n }\n }\n }\n },\n\n initialize: function (key, options) {\n var config;\n\n // set the config variable with the appropriate config object\n if (typeof key === 'object' && key.urlTemplate && key.options) {\n config = key;\n } else if (typeof key === 'string' && BasemapLayer.TILES[key]) {\n config = BasemapLayer.TILES[key];\n } else {\n throw new Error('L.esri.BasemapLayer: Invalid parameter. Use one of \"Streets\", \"Topographic\", \"Oceans\", \"OceansLabels\", \"NationalGeographic\", \"Gray\", \"GrayLabels\", \"DarkGray\", \"DarkGrayLabels\", \"Imagery\", \"ImageryLabels\", \"ImageryTransportation\", \"ImageryClarity\", \"ShadedRelief\", \"ShadedReliefLabels\", \"Terrain\", \"TerrainLabels\" or \"USATopo\"');\n }\n\n // merge passed options into the config options\n var tileOptions = Util.extend(config.options, options);\n\n Util.setOptions(this, tileOptions);\n\n if (this.options.token) {\n config.urlTemplate += ('?token=' + this.options.token);\n }\n\n // call the initialize method on L.TileLayer to set everything up\n TileLayer.prototype.initialize.call(this, config.urlTemplate, tileOptions);\n },\n\n onAdd: function (map) {\n // include 'Powered by Esri' in map attribution\n setEsriAttribution(map);\n\n if (this.options.pane === 'esri-labels') {\n this._initPane();\n }\n // some basemaps can supply dynamic attribution\n if (this.options.attributionUrl) {\n _getAttributionData(this.options.attributionUrl, map);\n }\n\n map.on('moveend', _updateMapAttribution);\n\n TileLayer.prototype.onAdd.call(this, map);\n },\n\n onRemove: function (map) {\n map.off('moveend', _updateMapAttribution);\n TileLayer.prototype.onRemove.call(this, map);\n },\n\n _initPane: function () {\n if (!this._map.getPane(this.options.pane)) {\n var pane = this._map.createPane(this.options.pane);\n pane.style.pointerEvents = 'none';\n pane.style.zIndex = 500;\n }\n },\n\n getAttribution: function () {\n if (this.options.attribution) {\n var attribution = '' + this.options.attribution + '';\n }\n return attribution;\n }\n});\n\nexport function basemapLayer (key, options) {\n return new BasemapLayer(key, options);\n}\n\nexport default basemapLayer;\n","import { CRS, DomEvent, TileLayer, Util } from 'leaflet';\nimport { warn, getUrlParams, setEsriAttribution } from '../Util';\nimport mapService from '../Services/MapService';\n\nexport var TiledMapLayer = TileLayer.extend({\n options: {\n zoomOffsetAllowance: 0.1,\n errorTileUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEABAMAAACuXLVVAAAAA1BMVEUzNDVszlHHAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAAAAAAAAAB6mUWpAAAADZJREFUeJztwQEBAAAAgiD/r25IQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7waBAAABw08RwAAAAABJRU5ErkJggg=='\n },\n\n statics: {\n MercatorZoomLevels: {\n '0': 156543.03392799999,\n '1': 78271.516963999893,\n '2': 39135.758482000099,\n '3': 19567.879240999901,\n '4': 9783.9396204999593,\n '5': 4891.9698102499797,\n '6': 2445.9849051249898,\n '7': 1222.9924525624899,\n '8': 611.49622628138002,\n '9': 305.74811314055802,\n '10': 152.874056570411,\n '11': 76.437028285073197,\n '12': 38.218514142536598,\n '13': 19.109257071268299,\n '14': 9.5546285356341496,\n '15': 4.7773142679493699,\n '16': 2.38865713397468,\n '17': 1.1943285668550501,\n '18': 0.59716428355981699,\n '19': 0.29858214164761698,\n '20': 0.14929107082381,\n '21': 0.07464553541191,\n '22': 0.0373227677059525,\n '23': 0.0186613838529763\n }\n },\n\n initialize: function (options) {\n options = Util.setOptions(this, options);\n\n // set the urls\n options = getUrlParams(options);\n this.tileUrl = (options.proxy ? options.proxy + '?' : '') + options.url + 'tile/{z}/{y}/{x}' + (options.requestParams && Object.keys(options.requestParams).length > 0 ? Util.getParamString(options.requestParams) : '');\n // Remove subdomain in url\n // https://github.com/Esri/esri-leaflet/issues/991\n if (options.url.indexOf('{s}') !== -1 && options.subdomains) {\n options.url = options.url.replace('{s}', options.subdomains[0]);\n }\n this.service = mapService(options);\n this.service.addEventParent(this);\n\n var arcgisonline = new RegExp(/tiles.arcgis(online)?\\.com/g);\n if (arcgisonline.test(options.url)) {\n this.tileUrl = this.tileUrl.replace('://tiles', '://tiles{s}');\n options.subdomains = ['1', '2', '3', '4'];\n }\n\n if (this.options.token) {\n this.tileUrl += ('?token=' + this.options.token);\n }\n\n // init layer by calling TileLayers initialize method\n TileLayer.prototype.initialize.call(this, this.tileUrl, options);\n },\n\n getTileUrl: function (tilePoint) {\n var zoom = this._getZoomForUrl();\n\n return Util.template(this.tileUrl, Util.extend({\n s: this._getSubdomain(tilePoint),\n x: tilePoint.x,\n y: tilePoint.y,\n // try lod map first, then just default to zoom level\n z: (this._lodMap && this._lodMap[zoom]) ? this._lodMap[zoom] : zoom\n }, this.options));\n },\n\n createTile: function (coords, done) {\n var tile = document.createElement('img');\n\n DomEvent.on(tile, 'load', Util.bind(this._tileOnLoad, this, done, tile));\n DomEvent.on(tile, 'error', Util.bind(this._tileOnError, this, done, tile));\n\n if (this.options.crossOrigin) {\n tile.crossOrigin = '';\n }\n\n /*\n Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons\n http://www.w3.org/TR/WCAG20-TECHS/H67\n */\n tile.alt = '';\n\n // if there is no lod map or an lod map with a proper zoom load the tile\n // otherwise wait for the lod map to become available\n if (!this._lodMap || (this._lodMap && this._lodMap[this._getZoomForUrl()])) {\n tile.src = this.getTileUrl(coords);\n } else {\n this.once('lodmap', function () {\n tile.src = this.getTileUrl(coords);\n }, this);\n }\n\n return tile;\n },\n\n onAdd: function (map) {\n // include 'Powered by Esri' in map attribution\n setEsriAttribution(map);\n\n if (!this._lodMap) {\n this.metadata(function (error, metadata) {\n if (!error && metadata.spatialReference) {\n var sr = metadata.spatialReference.latestWkid || metadata.spatialReference.wkid;\n // display the copyright text from the service using leaflet's attribution control\n if (!this.options.attribution && map.attributionControl && metadata.copyrightText) {\n this.options.attribution = metadata.copyrightText;\n map.attributionControl.addAttribution(this.getAttribution());\n }\n\n // if the service tiles were published in web mercator using conventional LODs but missing levels, we can try and remap them\n if (map.options.crs === CRS.EPSG3857 && (sr === 102100 || sr === 3857)) {\n this._lodMap = {};\n // create the zoom level data\n var arcgisLODs = metadata.tileInfo.lods;\n var correctResolutions = TiledMapLayer.MercatorZoomLevels;\n\n for (var i = 0; i < arcgisLODs.length; i++) {\n var arcgisLOD = arcgisLODs[i];\n for (var ci in correctResolutions) {\n var correctRes = correctResolutions[ci];\n\n if (this._withinPercentage(arcgisLOD.resolution, correctRes, this.options.zoomOffsetAllowance)) {\n this._lodMap[ci] = arcgisLOD.level;\n break;\n }\n }\n }\n\n this.fire('lodmap');\n } else if (map.options.crs && map.options.crs.code && (map.options.crs.code.indexOf(sr) > -1)) {\n // if the projection is WGS84, or the developer is using Proj4 to define a custom CRS, no action is required\n } else {\n // if the service was cached in a custom projection and an appropriate LOD hasn't been defined in the map, guide the developer to our Proj4 sample\n warn('L.esri.TiledMapLayer is using a non-mercator spatial reference. Support may be available through Proj4Leaflet http://esri.github.io/esri-leaflet/examples/non-mercator-projection.html');\n }\n }\n }, this);\n }\n\n TileLayer.prototype.onAdd.call(this, map);\n },\n\n metadata: function (callback, context) {\n this.service.metadata(callback, context);\n return this;\n },\n\n identify: function () {\n return this.service.identify();\n },\n\n find: function () {\n return this.service.find();\n },\n\n query: function () {\n return this.service.query();\n },\n\n authenticate: function (token) {\n var tokenQs = '?token=' + token;\n this.tileUrl = (this.options.token) ? this.tileUrl.replace(/\\?token=(.+)/g, tokenQs) : this.tileUrl + tokenQs;\n this.options.token = token;\n this.service.authenticate(token);\n return this;\n },\n\n _withinPercentage: function (a, b, percentage) {\n var diff = Math.abs((a / b) - 1);\n return diff < percentage;\n }\n});\n\nexport function tiledMapLayer (url, options) {\n return new TiledMapLayer(url, options);\n}\n\nexport default tiledMapLayer;\n","import { ImageOverlay, CRS, DomUtil, Util, Layer, popup, latLng, bounds } from 'leaflet';\nimport { cors } from '../Support';\nimport { setEsriAttribution } from '../Util';\n\nvar Overlay = ImageOverlay.extend({\n onAdd: function (map) {\n this._topLeft = map.getPixelBounds().min;\n ImageOverlay.prototype.onAdd.call(this, map);\n },\n _reset: function () {\n if (this._map.options.crs === CRS.EPSG3857) {\n ImageOverlay.prototype._reset.call(this);\n } else {\n DomUtil.setPosition(this._image, this._topLeft.subtract(this._map.getPixelOrigin()));\n }\n }\n});\n\nexport var RasterLayer = Layer.extend({\n options: {\n opacity: 1,\n position: 'front',\n f: 'image',\n useCors: cors,\n attribution: null,\n interactive: false,\n alt: ''\n },\n\n onAdd: function (map) {\n // include 'Powered by Esri' in map attribution\n setEsriAttribution(map);\n\n this._update = Util.throttle(this._update, this.options.updateInterval, this);\n\n map.on('moveend', this._update, this);\n\n // if we had an image loaded and it matches the\n // current bounds show the image otherwise remove it\n if (this._currentImage && this._currentImage._bounds.equals(this._map.getBounds())) {\n map.addLayer(this._currentImage);\n } else if (this._currentImage) {\n this._map.removeLayer(this._currentImage);\n this._currentImage = null;\n }\n\n this._update();\n\n if (this._popup) {\n this._map.on('click', this._getPopupData, this);\n this._map.on('dblclick', this._resetPopupState, this);\n }\n\n // add copyright text listed in service metadata\n this.metadata(function (err, metadata) {\n if (!err && !this.options.attribution && map.attributionControl && metadata.copyrightText) {\n this.options.attribution = metadata.copyrightText;\n map.attributionControl.addAttribution(this.getAttribution());\n }\n }, this);\n },\n\n onRemove: function (map) {\n if (this._currentImage) {\n this._map.removeLayer(this._currentImage);\n }\n\n if (this._popup) {\n this._map.off('click', this._getPopupData, this);\n this._map.off('dblclick', this._resetPopupState, this);\n }\n\n this._map.off('moveend', this._update, this);\n },\n\n bindPopup: function (fn, popupOptions) {\n this._shouldRenderPopup = false;\n this._lastClick = false;\n this._popup = popup(popupOptions);\n this._popupFunction = fn;\n if (this._map) {\n this._map.on('click', this._getPopupData, this);\n this._map.on('dblclick', this._resetPopupState, this);\n }\n return this;\n },\n\n unbindPopup: function () {\n if (this._map) {\n this._map.closePopup(this._popup);\n this._map.off('click', this._getPopupData, this);\n this._map.off('dblclick', this._resetPopupState, this);\n }\n this._popup = false;\n return this;\n },\n\n bringToFront: function () {\n this.options.position = 'front';\n if (this._currentImage) {\n this._currentImage.bringToFront();\n }\n return this;\n },\n\n bringToBack: function () {\n this.options.position = 'back';\n if (this._currentImage) {\n this._currentImage.bringToBack();\n }\n return this;\n },\n\n getAttribution: function () {\n return this.options.attribution;\n },\n\n getOpacity: function () {\n return this.options.opacity;\n },\n\n setOpacity: function (opacity) {\n this.options.opacity = opacity;\n if (this._currentImage) {\n this._currentImage.setOpacity(opacity);\n }\n return this;\n },\n\n getTimeRange: function () {\n return [this.options.from, this.options.to];\n },\n\n setTimeRange: function (from, to) {\n this.options.from = from;\n this.options.to = to;\n this._update();\n return this;\n },\n\n metadata: function (callback, context) {\n this.service.metadata(callback, context);\n return this;\n },\n\n authenticate: function (token) {\n this.service.authenticate(token);\n return this;\n },\n\n redraw: function () {\n this._update();\n },\n\n _renderImage: function (url, bounds, contentType) {\n if (this._map) {\n // if no output directory has been specified for a service, MIME data will be returned\n if (contentType) {\n url = 'data:' + contentType + ';base64,' + url;\n }\n // create a new image overlay and add it to the map\n // to start loading the image\n // opacity is 0 while the image is loading\n var image = new Overlay(url, bounds, {\n opacity: 0,\n crossOrigin: this.options.useCors,\n alt: this.options.alt,\n pane: this.options.pane || this.getPane(),\n interactive: this.options.interactive\n }).addTo(this._map);\n\n var onOverlayError = function () {\n this._map.removeLayer(image);\n this.fire('error');\n image.off('load', onOverlayLoad, this);\n };\n\n var onOverlayLoad = function (e) {\n image.off('error', onOverlayLoad, this);\n if (this._map) {\n var newImage = e.target;\n var oldImage = this._currentImage;\n\n // if the bounds of this image matches the bounds that\n // _renderImage was called with and we have a map with the same bounds\n // hide the old image if there is one and set the opacity\n // of the new image otherwise remove the new image\n if (newImage._bounds.equals(bounds) && newImage._bounds.equals(this._map.getBounds())) {\n this._currentImage = newImage;\n\n if (this.options.position === 'front') {\n this.bringToFront();\n } else {\n this.bringToBack();\n }\n\n if (this._map && this._currentImage._map) {\n this._currentImage.setOpacity(this.options.opacity);\n } else {\n this._currentImage._map.removeLayer(this._currentImage);\n }\n\n if (oldImage && this._map) {\n this._map.removeLayer(oldImage);\n }\n\n if (oldImage && oldImage._map) {\n oldImage._map.removeLayer(oldImage);\n }\n } else {\n this._map.removeLayer(newImage);\n }\n }\n\n this.fire('load', {\n bounds: bounds\n });\n };\n\n // If loading the image fails\n image.once('error', onOverlayError, this);\n\n // once the image loads\n image.once('load', onOverlayLoad, this);\n\n this.fire('loading', {\n bounds: bounds\n });\n }\n },\n\n _update: function () {\n if (!this._map) {\n return;\n }\n\n var zoom = this._map.getZoom();\n var bounds = this._map.getBounds();\n\n if (this._animatingZoom) {\n return;\n }\n\n if (this._map._panTransition && this._map._panTransition._inProgress) {\n return;\n }\n\n if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {\n if (this._currentImage) {\n this._currentImage._map.removeLayer(this._currentImage);\n this._currentImage = null;\n }\n return;\n }\n\n var params = this._buildExportParams();\n Util.extend(params, this.options.requestParams);\n\n if (params) {\n this._requestExport(params, bounds);\n } else if (this._currentImage) {\n this._currentImage._map.removeLayer(this._currentImage);\n this._currentImage = null;\n }\n },\n\n _renderPopup: function (latlng, error, results, response) {\n latlng = latLng(latlng);\n if (this._shouldRenderPopup && this._lastClick.equals(latlng)) {\n // add the popup to the map where the mouse was clicked at\n var content = this._popupFunction(error, results, response);\n if (content) {\n this._popup.setLatLng(latlng).setContent(content).openOn(this._map);\n }\n }\n },\n\n _resetPopupState: function (e) {\n this._shouldRenderPopup = false;\n this._lastClick = e.latlng;\n },\n\n _calculateBbox: function () {\n var pixelBounds = this._map.getPixelBounds();\n\n var sw = this._map.unproject(pixelBounds.getBottomLeft());\n var ne = this._map.unproject(pixelBounds.getTopRight());\n\n var neProjected = this._map.options.crs.project(ne);\n var swProjected = this._map.options.crs.project(sw);\n\n // this ensures ne/sw are switched in polar maps where north/top bottom/south is inverted\n var boundsProjected = bounds(neProjected, swProjected);\n\n return [boundsProjected.getBottomLeft().x, boundsProjected.getBottomLeft().y, boundsProjected.getTopRight().x, boundsProjected.getTopRight().y].join(',');\n },\n\n _calculateImageSize: function () {\n // ensure that we don't ask ArcGIS Server for a taller image than we have actual map displaying within the div\n var bounds = this._map.getPixelBounds();\n var size = this._map.getSize();\n\n var sw = this._map.unproject(bounds.getBottomLeft());\n var ne = this._map.unproject(bounds.getTopRight());\n\n var top = this._map.latLngToLayerPoint(ne).y;\n var bottom = this._map.latLngToLayerPoint(sw).y;\n\n if (top > 0 || bottom < size.y) {\n size.y = bottom - top;\n }\n\n return size.x + ',' + size.y;\n }\n});\n","import { Util } from 'leaflet';\nimport { RasterLayer } from './RasterLayer';\nimport { getUrlParams } from '../Util';\nimport imageService from '../Services/ImageService';\n\nexport var ImageMapLayer = RasterLayer.extend({\n\n options: {\n updateInterval: 150,\n format: 'jpgpng',\n transparent: true,\n f: 'image'\n },\n\n query: function () {\n return this.service.query();\n },\n\n identify: function () {\n return this.service.identify();\n },\n\n initialize: function (options) {\n options = getUrlParams(options);\n this.service = imageService(options);\n this.service.addEventParent(this);\n\n Util.setOptions(this, options);\n },\n\n setPixelType: function (pixelType) {\n this.options.pixelType = pixelType;\n this._update();\n return this;\n },\n\n getPixelType: function () {\n return this.options.pixelType;\n },\n\n setBandIds: function (bandIds) {\n if (Util.isArray(bandIds)) {\n this.options.bandIds = bandIds.join(',');\n } else {\n this.options.bandIds = bandIds.toString();\n }\n this._update();\n return this;\n },\n\n getBandIds: function () {\n return this.options.bandIds;\n },\n\n setNoData: function (noData, noDataInterpretation) {\n if (Util.isArray(noData)) {\n this.options.noData = noData.join(',');\n } else {\n this.options.noData = noData.toString();\n }\n if (noDataInterpretation) {\n this.options.noDataInterpretation = noDataInterpretation;\n }\n this._update();\n return this;\n },\n\n getNoData: function () {\n return this.options.noData;\n },\n\n getNoDataInterpretation: function () {\n return this.options.noDataInterpretation;\n },\n\n setRenderingRule: function (renderingRule) {\n this.options.renderingRule = renderingRule;\n this._update();\n },\n\n getRenderingRule: function () {\n return this.options.renderingRule;\n },\n\n setMosaicRule: function (mosaicRule) {\n this.options.mosaicRule = mosaicRule;\n this._update();\n },\n\n getMosaicRule: function () {\n return this.options.mosaicRule;\n },\n\n _getPopupData: function (e) {\n var callback = Util.bind(function (error, results, response) {\n if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire\n setTimeout(Util.bind(function () {\n this._renderPopup(e.latlng, error, results, response);\n }, this), 300);\n }, this);\n\n var identifyRequest = this.identify().at(e.latlng);\n\n // set mosaic rule for identify task if it is set for layer\n if (this.options.mosaicRule) {\n identifyRequest.setMosaicRule(this.options.mosaicRule);\n // @TODO: force return catalog items too?\n }\n\n // @TODO: set rendering rule? Not sure,\n // sometimes you want raw pixel values\n // if (this.options.renderingRule) {\n // identifyRequest.setRenderingRule(this.options.renderingRule);\n // }\n\n identifyRequest.run(callback);\n\n // set the flags to show the popup\n this._shouldRenderPopup = true;\n this._lastClick = e.latlng;\n },\n\n _buildExportParams: function () {\n var sr = parseInt(this._map.options.crs.code.split(':')[1], 10);\n\n var params = {\n bbox: this._calculateBbox(),\n size: this._calculateImageSize(),\n format: this.options.format,\n transparent: this.options.transparent,\n bboxSR: sr,\n imageSR: sr\n };\n\n if (this.options.from && this.options.to) {\n params.time = this.options.from.valueOf() + ',' + this.options.to.valueOf();\n }\n\n if (this.options.pixelType) {\n params.pixelType = this.options.pixelType;\n }\n\n if (this.options.interpolation) {\n params.interpolation = this.options.interpolation;\n }\n\n if (this.options.compressionQuality) {\n params.compressionQuality = this.options.compressionQuality;\n }\n\n if (this.options.bandIds) {\n params.bandIds = this.options.bandIds;\n }\n\n // 0 is falsy *and* a valid input parameter\n if (this.options.noData === 0 || this.options.noData) {\n params.noData = this.options.noData;\n }\n\n if (this.options.noDataInterpretation) {\n params.noDataInterpretation = this.options.noDataInterpretation;\n }\n\n if (this.service.options.token) {\n params.token = this.service.options.token;\n }\n\n if (this.options.renderingRule) {\n params.renderingRule = JSON.stringify(this.options.renderingRule);\n }\n\n if (this.options.mosaicRule) {\n params.mosaicRule = JSON.stringify(this.options.mosaicRule);\n }\n\n return params;\n },\n\n _requestExport: function (params, bounds) {\n if (this.options.f === 'json') {\n this.service.request('exportImage', params, function (error, response) {\n if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire\n if (this.options.token) {\n response.href += ('?token=' + this.options.token);\n }\n this._renderImage(response.href, bounds);\n }, this);\n } else {\n params.f = 'image';\n this._renderImage(this.options.url + 'exportImage' + Util.getParamString(params), bounds);\n }\n }\n});\n\nexport function imageMapLayer (url, options) {\n return new ImageMapLayer(url, options);\n}\n\nexport default imageMapLayer;\n","import { Util } from 'leaflet';\nimport { RasterLayer } from './RasterLayer';\nimport { getUrlParams } from '../Util';\nimport mapService from '../Services/MapService';\n\nexport var DynamicMapLayer = RasterLayer.extend({\n\n options: {\n updateInterval: 150,\n layers: false,\n layerDefs: false,\n timeOptions: false,\n format: 'png24',\n transparent: true,\n f: 'json'\n },\n\n initialize: function (options) {\n options = getUrlParams(options);\n this.service = mapService(options);\n this.service.addEventParent(this);\n\n if ((options.proxy || options.token) && options.f !== 'json') {\n options.f = 'json';\n }\n\n Util.setOptions(this, options);\n },\n\n getDynamicLayers: function () {\n return this.options.dynamicLayers;\n },\n\n setDynamicLayers: function (dynamicLayers) {\n this.options.dynamicLayers = dynamicLayers;\n this._update();\n return this;\n },\n\n getLayers: function () {\n return this.options.layers;\n },\n\n setLayers: function (layers) {\n this.options.layers = layers;\n this._update();\n return this;\n },\n\n getLayerDefs: function () {\n return this.options.layerDefs;\n },\n\n setLayerDefs: function (layerDefs) {\n this.options.layerDefs = layerDefs;\n this._update();\n return this;\n },\n\n getTimeOptions: function () {\n return this.options.timeOptions;\n },\n\n setTimeOptions: function (timeOptions) {\n this.options.timeOptions = timeOptions;\n this._update();\n return this;\n },\n\n query: function () {\n return this.service.query();\n },\n\n identify: function () {\n return this.service.identify();\n },\n\n find: function () {\n return this.service.find();\n },\n\n _getPopupData: function (e) {\n var callback = Util.bind(function (error, featureCollection, response) {\n if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire\n setTimeout(Util.bind(function () {\n this._renderPopup(e.latlng, error, featureCollection, response);\n }, this), 300);\n }, this);\n\n var identifyRequest;\n if (this.options.popup) {\n identifyRequest = this.options.popup.on(this._map).at(e.latlng);\n } else {\n identifyRequest = this.identify().on(this._map).at(e.latlng);\n }\n\n // remove extraneous vertices from response features if it has not already been done\n identifyRequest.params.maxAllowableOffset ? true : identifyRequest.simplify(this._map, 0.5);\n\n if (!(this.options.popup && this.options.popup.params && this.options.popup.params.layers)) {\n if (this.options.layers) {\n identifyRequest.layers('visible:' + this.options.layers.join(','));\n } else {\n identifyRequest.layers('visible');\n }\n }\n\n // if present, pass layer ids and sql filters through to the identify task\n if (this.options.layerDefs && typeof this.options.layerDefs !== 'string' && !identifyRequest.params.layerDefs) {\n for (var id in this.options.layerDefs) {\n if (this.options.layerDefs.hasOwnProperty(id)) {\n identifyRequest.layerDef(id, this.options.layerDefs[id]);\n }\n }\n }\n\n identifyRequest.run(callback);\n\n // set the flags to show the popup\n this._shouldRenderPopup = true;\n this._lastClick = e.latlng;\n },\n\n _buildExportParams: function () {\n var sr = parseInt(this._map.options.crs.code.split(':')[1], 10);\n\n var params = {\n bbox: this._calculateBbox(),\n size: this._calculateImageSize(),\n dpi: 96,\n format: this.options.format,\n transparent: this.options.transparent,\n bboxSR: sr,\n imageSR: sr\n };\n\n if (this.options.dynamicLayers) {\n params.dynamicLayers = this.options.dynamicLayers;\n }\n\n if (this.options.layers) {\n if (this.options.layers.length === 0) {\n return;\n } else {\n params.layers = 'show:' + this.options.layers.join(',');\n }\n }\n\n if (this.options.layerDefs) {\n params.layerDefs = typeof this.options.layerDefs === 'string' ? this.options.layerDefs : JSON.stringify(this.options.layerDefs);\n }\n\n if (this.options.timeOptions) {\n params.timeOptions = JSON.stringify(this.options.timeOptions);\n }\n\n if (this.options.from && this.options.to) {\n params.time = this.options.from.valueOf() + ',' + this.options.to.valueOf();\n }\n\n if (this.service.options.token) {\n params.token = this.service.options.token;\n }\n\n if (this.options.proxy) {\n params.proxy = this.options.proxy;\n }\n\n // use a timestamp to bust server cache\n if (this.options.disableCache) {\n params._ts = Date.now();\n }\n\n return params;\n },\n\n _requestExport: function (params, bounds) {\n if (this.options.f === 'json') {\n this.service.request('export', params, function (error, response) {\n if (error) { return; } // we really can't do anything here but authenticate or requesterror will fire\n\n if (this.options.token) {\n response.href += ('?token=' + this.options.token);\n }\n if (this.options.proxy) {\n response.href = this.options.proxy + '?' + response.href;\n }\n if (response.href) {\n this._renderImage(response.href, bounds);\n } else {\n this._renderImage(response.imageData, bounds, response.contentType);\n }\n }, this);\n } else {\n params.f = 'image';\n this._renderImage(this.options.url + 'export' + Util.getParamString(params), bounds);\n }\n }\n});\n\nexport function dynamicMapLayer (url, options) {\n return new DynamicMapLayer(url, options);\n}\n\nexport default dynamicMapLayer;\n","import {\n bounds,\n latLngBounds,\n point,\n Layer,\n setOptions,\n Util\n} from 'leaflet';\n\nvar VirtualGrid = Layer.extend({\n\n options: {\n cellSize: 512,\n updateInterval: 150\n },\n\n initialize: function (options) {\n options = setOptions(this, options);\n this._zooming = false;\n },\n\n onAdd: function (map) {\n this._map = map;\n this._update = Util.throttle(this._update, this.options.updateInterval, this);\n this._reset();\n this._update();\n },\n\n onRemove: function () {\n this._map.removeEventListener(this.getEvents(), this);\n this._removeCells();\n },\n\n getEvents: function () {\n var events = {\n moveend: this._update,\n zoomstart: this._zoomstart,\n zoomend: this._reset\n };\n\n return events;\n },\n\n addTo: function (map) {\n map.addLayer(this);\n return this;\n },\n\n removeFrom: function (map) {\n map.removeLayer(this);\n return this;\n },\n\n _zoomstart: function () {\n this._zooming = true;\n },\n\n _reset: function () {\n this._removeCells();\n\n this._cells = {};\n this._activeCells = {};\n this._cellsToLoad = 0;\n this._cellsTotal = 0;\n this._cellNumBounds = this._getCellNumBounds();\n\n this._resetWrap();\n this._zooming = false;\n },\n\n _resetWrap: function () {\n var map = this._map;\n var crs = map.options.crs;\n\n if (crs.infinite) { return; }\n\n var cellSize = this._getCellSize();\n\n if (crs.wrapLng) {\n this._wrapLng = [\n Math.floor(map.project([0, crs.wrapLng[0]]).x / cellSize),\n Math.ceil(map.project([0, crs.wrapLng[1]]).x / cellSize)\n ];\n }\n\n if (crs.wrapLat) {\n this._wrapLat = [\n Math.floor(map.project([crs.wrapLat[0], 0]).y / cellSize),\n Math.ceil(map.project([crs.wrapLat[1], 0]).y / cellSize)\n ];\n }\n },\n\n _getCellSize: function () {\n return this.options.cellSize;\n },\n\n _update: function () {\n if (!this._map) {\n return;\n }\n\n var mapBounds = this._map.getPixelBounds();\n var cellSize = this._getCellSize();\n\n // cell coordinates range for the current view\n var cellBounds = bounds(\n mapBounds.min.divideBy(cellSize).floor(),\n mapBounds.max.divideBy(cellSize).floor());\n\n this._removeOtherCells(cellBounds);\n this._addCells(cellBounds);\n\n this.fire('cellsupdated');\n },\n\n _addCells: function (cellBounds) {\n var queue = [];\n var center = cellBounds.getCenter();\n var zoom = this._map.getZoom();\n\n var j, i, coords;\n // create a queue of coordinates to load cells from\n for (j = cellBounds.min.y; j <= cellBounds.max.y; j++) {\n for (i = cellBounds.min.x; i <= cellBounds.max.x; i++) {\n coords = point(i, j);\n coords.z = zoom;\n\n if (this._isValidCell(coords)) {\n queue.push(coords);\n }\n }\n }\n\n var cellsToLoad = queue.length;\n\n if (cellsToLoad === 0) { return; }\n\n this._cellsToLoad += cellsToLoad;\n this._cellsTotal += cellsToLoad;\n\n // sort cell queue to load cells in order of their distance to center\n queue.sort(function (a, b) {\n return a.distanceTo(center) - b.distanceTo(center);\n });\n\n for (i = 0; i < cellsToLoad; i++) {\n this._addCell(queue[i]);\n }\n },\n\n _isValidCell: function (coords) {\n var crs = this._map.options.crs;\n\n if (!crs.infinite) {\n // don't load cell if it's out of bounds and not wrapped\n var cellNumBounds = this._cellNumBounds;\n if (\n (!crs.wrapLng && (coords.x < cellNumBounds.min.x || coords.x > cellNumBounds.max.x)) ||\n (!crs.wrapLat && (coords.y < cellNumBounds.min.y || coords.y > cellNumBounds.max.y))\n ) {\n return false;\n }\n }\n\n if (!this.options.bounds) {\n return true;\n }\n\n // don't load cell if it doesn't intersect the bounds in options\n var cellBounds = this._cellCoordsToBounds(coords);\n return latLngBounds(this.options.bounds).intersects(cellBounds);\n },\n\n // converts cell coordinates to its geographical bounds\n _cellCoordsToBounds: function (coords) {\n var map = this._map;\n var cellSize = this.options.cellSize;\n var nwPoint = coords.multiplyBy(cellSize);\n var sePoint = nwPoint.add([cellSize, cellSize]);\n var nw = map.wrapLatLng(map.unproject(nwPoint, coords.z));\n var se = map.wrapLatLng(map.unproject(sePoint, coords.z));\n\n return latLngBounds(nw, se);\n },\n\n // converts cell coordinates to key for the cell cache\n _cellCoordsToKey: function (coords) {\n return coords.x + ':' + coords.y;\n },\n\n // converts cell cache key to coordiantes\n _keyToCellCoords: function (key) {\n var kArr = key.split(':');\n var x = parseInt(kArr[0], 10);\n var y = parseInt(kArr[1], 10);\n\n return point(x, y);\n },\n\n // remove any present cells that are off the specified bounds\n _removeOtherCells: function (bounds) {\n for (var key in this._cells) {\n if (!bounds.contains(this._keyToCellCoords(key))) {\n this._removeCell(key);\n }\n }\n },\n\n _removeCell: function (key) {\n var cell = this._activeCells[key];\n\n if (cell) {\n delete this._activeCells[key];\n\n if (this.cellLeave) {\n this.cellLeave(cell.bounds, cell.coords);\n }\n\n this.fire('cellleave', {\n bounds: cell.bounds,\n coords: cell.coords\n });\n }\n },\n\n _removeCells: function () {\n for (var key in this._cells) {\n var cellBounds = this._cells[key].bounds;\n var coords = this._cells[key].coords;\n\n if (this.cellLeave) {\n this.cellLeave(cellBounds, coords);\n }\n\n this.fire('cellleave', {\n bounds: cellBounds,\n coords: coords\n });\n }\n },\n\n _addCell: function (coords) {\n // wrap cell coords if necessary (depending on CRS)\n this._wrapCoords(coords);\n\n // generate the cell key\n var key = this._cellCoordsToKey(coords);\n\n // get the cell from the cache\n var cell = this._cells[key];\n // if this cell should be shown as isnt active yet (enter)\n\n if (cell && !this._activeCells[key]) {\n if (this.cellEnter) {\n this.cellEnter(cell.bounds, coords);\n }\n\n this.fire('cellenter', {\n bounds: cell.bounds,\n coords: coords\n });\n\n this._activeCells[key] = cell;\n }\n\n // if we dont have this cell in the cache yet (create)\n if (!cell) {\n cell = {\n coords: coords,\n bounds: this._cellCoordsToBounds(coords)\n };\n\n this._cells[key] = cell;\n this._activeCells[key] = cell;\n\n if (this.createCell) {\n this.createCell(cell.bounds, coords);\n }\n\n this.fire('cellcreate', {\n bounds: cell.bounds,\n coords: coords\n });\n }\n },\n\n _wrapCoords: function (coords) {\n coords.x = this._wrapLng ? Util.wrapNum(coords.x, this._wrapLng) : coords.x;\n coords.y = this._wrapLat ? Util.wrapNum(coords.y, this._wrapLat) : coords.y;\n },\n\n // get the global cell coordinates range for the current zoom\n _getCellNumBounds: function () {\n var worldBounds = this._map.getPixelWorldBounds();\n var size = this._getCellSize();\n\n return worldBounds ? bounds(\n worldBounds.min.divideBy(size).floor(),\n worldBounds.max.divideBy(size).ceil().subtract([1, 1])) : null;\n }\n});\n\nexport default VirtualGrid;\n","function BinarySearchIndex (values) {\n this.values = [].concat(values || []);\n}\n\nBinarySearchIndex.prototype.query = function (value) {\n var index = this.getIndex(value);\n return this.values[index];\n};\n\nBinarySearchIndex.prototype.getIndex = function getIndex (value) {\n if (this.dirty) {\n this.sort();\n }\n\n var minIndex = 0;\n var maxIndex = this.values.length - 1;\n var currentIndex;\n var currentElement;\n\n while (minIndex <= maxIndex) {\n currentIndex = (minIndex + maxIndex) / 2 | 0;\n currentElement = this.values[Math.round(currentIndex)];\n if (+currentElement.value < +value) {\n minIndex = currentIndex + 1;\n } else if (+currentElement.value > +value) {\n maxIndex = currentIndex - 1;\n } else {\n return currentIndex;\n }\n }\n\n return Math.abs(~maxIndex);\n};\n\nBinarySearchIndex.prototype.between = function between (start, end) {\n var startIndex = this.getIndex(start);\n var endIndex = this.getIndex(end);\n\n if (startIndex === 0 && endIndex === 0) {\n return [];\n }\n\n while (this.values[startIndex - 1] && this.values[startIndex - 1].value === start) {\n startIndex--;\n }\n\n while (this.values[endIndex + 1] && this.values[endIndex + 1].value === end) {\n endIndex++;\n }\n\n if (this.values[endIndex] && this.values[endIndex].value === end && this.values[endIndex + 1]) {\n endIndex++;\n }\n\n return this.values.slice(startIndex, endIndex);\n};\n\nBinarySearchIndex.prototype.insert = function insert (item) {\n this.values.splice(this.getIndex(item.value), 0, item);\n return this;\n};\n\nBinarySearchIndex.prototype.bulkAdd = function bulkAdd (items, sort) {\n this.values = this.values.concat([].concat(items || []));\n\n if (sort) {\n this.sort();\n } else {\n this.dirty = true;\n }\n\n return this;\n};\n\nBinarySearchIndex.prototype.sort = function sort () {\n this.values.sort(function (a, b) {\n return +b.value - +a.value;\n }).reverse();\n this.dirty = false;\n return this;\n};\n\nexport default BinarySearchIndex;\n","import { Util } from 'leaflet';\nimport featureLayerService from '../../Services/FeatureLayerService';\nimport { getUrlParams, warn, setEsriAttribution } from '../../Util';\nimport VirtualGrid from 'leaflet-virtual-grid';\nimport BinarySearchIndex from 'tiny-binary-search';\n\nexport var FeatureManager = VirtualGrid.extend({\n /**\n * Options\n */\n\n options: {\n attribution: null,\n where: '1=1',\n fields: ['*'],\n from: false,\n to: false,\n timeField: false,\n timeFilterMode: 'server',\n simplifyFactor: 0,\n precision: 6\n },\n\n /**\n * Constructor\n */\n\n initialize: function (options) {\n VirtualGrid.prototype.initialize.call(this, options);\n\n options = getUrlParams(options);\n options = Util.setOptions(this, options);\n\n this.service = featureLayerService(options);\n this.service.addEventParent(this);\n\n // use case insensitive regex to look for common fieldnames used for indexing\n if (this.options.fields[0] !== '*') {\n var oidCheck = false;\n for (var i = 0; i < this.options.fields.length; i++) {\n if (this.options.fields[i].match(/^(OBJECTID|FID|OID|ID)$/i)) {\n oidCheck = true;\n }\n }\n if (oidCheck === false) {\n warn('no known esriFieldTypeOID field detected in fields Array. Please add an attribute field containing unique IDs to ensure the layer can be drawn correctly.');\n }\n }\n\n if (this.options.timeField.start && this.options.timeField.end) {\n this._startTimeIndex = new BinarySearchIndex();\n this._endTimeIndex = new BinarySearchIndex();\n } else if (this.options.timeField) {\n this._timeIndex = new BinarySearchIndex();\n }\n\n this._cache = {};\n this._currentSnapshot = []; // cache of what layers should be active\n this._activeRequests = 0;\n },\n\n /**\n * Layer Interface\n */\n\n onAdd: function (map) {\n // include 'Powered by Esri' in map attribution\n setEsriAttribution(map);\n\n this.service.metadata(function (err, metadata) {\n if (!err) {\n var supportedFormats = metadata.supportedQueryFormats;\n\n // Check if someone has requested that we don't use geoJSON, even if it's available\n var forceJsonFormat = false;\n if (this.service.options.isModern === false) {\n forceJsonFormat = true;\n }\n\n // Unless we've been told otherwise, check to see whether service can emit GeoJSON natively\n if (!forceJsonFormat && supportedFormats && supportedFormats.indexOf('geoJSON') !== -1) {\n this.service.options.isModern = true;\n }\n\n // add copyright text listed in service metadata\n if (!this.options.attribution && map.attributionControl && metadata.copyrightText) {\n this.options.attribution = metadata.copyrightText;\n map.attributionControl.addAttribution(this.getAttribution());\n }\n }\n }, this);\n\n map.on('zoomend', this._handleZoomChange, this);\n\n return VirtualGrid.prototype.onAdd.call(this, map);\n },\n\n onRemove: function (map) {\n map.off('zoomend', this._handleZoomChange, this);\n\n return VirtualGrid.prototype.onRemove.call(this, map);\n },\n\n getAttribution: function () {\n return this.options.attribution;\n },\n\n /**\n * Feature Management\n */\n\n createCell: function (bounds, coords) {\n // dont fetch features outside the scale range defined for the layer\n if (this._visibleZoom()) {\n this._requestFeatures(bounds, coords);\n }\n },\n\n _requestFeatures: function (bounds, coords, callback) {\n this._activeRequests++;\n\n // our first active request fires loading\n if (this._activeRequests === 1) {\n this.fire('loading', {\n bounds: bounds\n }, true);\n }\n\n return this._buildQuery(bounds).run(function (error, featureCollection, response) {\n if (response && response.exceededTransferLimit) {\n this.fire('drawlimitexceeded');\n }\n\n // no error, features\n if (!error && featureCollection && featureCollection.features.length) {\n // schedule adding features until the next animation frame\n Util.requestAnimFrame(Util.bind(function () {\n this._addFeatures(featureCollection.features, coords);\n this._postProcessFeatures(bounds);\n }, this));\n }\n\n // no error, no features\n if (!error && featureCollection && !featureCollection.features.length) {\n this._postProcessFeatures(bounds);\n }\n\n if (error) {\n this._postProcessFeatures(bounds);\n }\n\n if (callback) {\n callback.call(this, error, featureCollection);\n }\n }, this);\n },\n\n _postProcessFeatures: function (bounds) {\n // deincrement the request counter now that we have processed features\n this._activeRequests--;\n\n // if there are no more active requests fire a load event for this view\n if (this._activeRequests <= 0) {\n this.fire('load', {\n bounds: bounds\n });\n }\n },\n\n _cacheKey: function (coords) {\n return coords.z + ':' + coords.x + ':' + coords.y;\n },\n\n _addFeatures: function (features, coords) {\n var key = this._cacheKey(coords);\n this._cache[key] = this._cache[key] || [];\n\n for (var i = features.length - 1; i >= 0; i--) {\n var id = features[i].id;\n\n if (this._currentSnapshot.indexOf(id) === -1) {\n this._currentSnapshot.push(id);\n }\n if (this._cache[key].indexOf(id) === -1) {\n this._cache[key].push(id);\n }\n }\n\n if (this.options.timeField) {\n this._buildTimeIndexes(features);\n }\n\n this.createLayers(features);\n },\n\n _buildQuery: function (bounds) {\n var query = this.service.query()\n .intersects(bounds)\n .where(this.options.where)\n .fields(this.options.fields)\n .precision(this.options.precision);\n\n if (this.options.requestParams) {\n Util.extend(query.params, this.options.requestParams);\n }\n\n if (this.options.simplifyFactor) {\n query.simplify(this._map, this.options.simplifyFactor);\n }\n\n if (this.options.timeFilterMode === 'server' && this.options.from && this.options.to) {\n query.between(this.options.from, this.options.to);\n }\n\n return query;\n },\n\n /**\n * Where Methods\n */\n\n setWhere: function (where, callback, context) {\n this.options.where = (where && where.length) ? where : '1=1';\n\n var oldSnapshot = [];\n var newSnapshot = [];\n var pendingRequests = 0;\n var requestError = null;\n var requestCallback = Util.bind(function (error, featureCollection) {\n if (error) {\n requestError = error;\n }\n\n if (featureCollection) {\n for (var i = featureCollection.features.length - 1; i >= 0; i--) {\n newSnapshot.push(featureCollection.features[i].id);\n }\n }\n\n pendingRequests--;\n\n if (pendingRequests <= 0 && this._visibleZoom()) {\n this._currentSnapshot = newSnapshot;\n // schedule adding features for the next animation frame\n Util.requestAnimFrame(Util.bind(function () {\n this.removeLayers(oldSnapshot);\n this.addLayers(newSnapshot);\n if (callback) {\n callback.call(context, requestError);\n }\n }, this));\n }\n }, this);\n\n for (var i = this._currentSnapshot.length - 1; i >= 0; i--) {\n oldSnapshot.push(this._currentSnapshot[i]);\n }\n\n for (var key in this._activeCells) {\n pendingRequests++;\n var coords = this._keyToCellCoords(key);\n var bounds = this._cellCoordsToBounds(coords);\n this._requestFeatures(bounds, key, requestCallback);\n }\n\n return this;\n },\n\n getWhere: function () {\n return this.options.where;\n },\n\n /**\n * Time Range Methods\n */\n\n getTimeRange: function () {\n return [this.options.from, this.options.to];\n },\n\n setTimeRange: function (from, to, callback, context) {\n var oldFrom = this.options.from;\n var oldTo = this.options.to;\n var pendingRequests = 0;\n var requestError = null;\n var requestCallback = Util.bind(function (error) {\n if (error) {\n requestError = error;\n }\n this._filterExistingFeatures(oldFrom, oldTo, from, to);\n\n pendingRequests--;\n\n if (callback && pendingRequests <= 0) {\n callback.call(context, requestError);\n }\n }, this);\n\n this.options.from = from;\n this.options.to = to;\n\n this._filterExistingFeatures(oldFrom, oldTo, from, to);\n\n if (this.options.timeFilterMode === 'server') {\n for (var key in this._activeCells) {\n pendingRequests++;\n var coords = this._keyToCellCoords(key);\n var bounds = this._cellCoordsToBounds(coords);\n this._requestFeatures(bounds, key, requestCallback);\n }\n }\n\n return this;\n },\n\n refresh: function () {\n for (var key in this._activeCells) {\n var coords = this._keyToCellCoords(key);\n var bounds = this._cellCoordsToBounds(coords);\n this._requestFeatures(bounds, key);\n }\n\n if (this.redraw) {\n this.once('load', function () {\n this.eachFeature(function (layer) {\n this._redraw(layer.feature.id);\n }, this);\n }, this);\n }\n },\n\n _filterExistingFeatures: function (oldFrom, oldTo, newFrom, newTo) {\n var layersToRemove = (oldFrom && oldTo) ? this._getFeaturesInTimeRange(oldFrom, oldTo) : this._currentSnapshot;\n var layersToAdd = this._getFeaturesInTimeRange(newFrom, newTo);\n\n if (layersToAdd.indexOf) {\n for (var i = 0; i < layersToAdd.length; i++) {\n var shouldRemoveLayer = layersToRemove.indexOf(layersToAdd[i]);\n if (shouldRemoveLayer >= 0) {\n layersToRemove.splice(shouldRemoveLayer, 1);\n }\n }\n }\n\n // schedule adding features until the next animation frame\n Util.requestAnimFrame(Util.bind(function () {\n this.removeLayers(layersToRemove);\n this.addLayers(layersToAdd);\n }, this));\n },\n\n _getFeaturesInTimeRange: function (start, end) {\n var ids = [];\n var search;\n\n if (this.options.timeField.start && this.options.timeField.end) {\n var startTimes = this._startTimeIndex.between(start, end);\n var endTimes = this._endTimeIndex.between(start, end);\n search = startTimes.concat(endTimes);\n } else {\n search = this._timeIndex.between(start, end);\n }\n\n for (var i = search.length - 1; i >= 0; i--) {\n ids.push(search[i].id);\n }\n\n return ids;\n },\n\n _buildTimeIndexes: function (geojson) {\n var i;\n var feature;\n if (this.options.timeField.start && this.options.timeField.end) {\n var startTimeEntries = [];\n var endTimeEntries = [];\n for (i = geojson.length - 1; i >= 0; i--) {\n feature = geojson[i];\n startTimeEntries.push({\n id: feature.id,\n value: new Date(feature.properties[this.options.timeField.start])\n });\n endTimeEntries.push({\n id: feature.id,\n value: new Date(feature.properties[this.options.timeField.end])\n });\n }\n this._startTimeIndex.bulkAdd(startTimeEntries);\n this._endTimeIndex.bulkAdd(endTimeEntries);\n } else {\n var timeEntries = [];\n for (i = geojson.length - 1; i >= 0; i--) {\n feature = geojson[i];\n timeEntries.push({\n id: feature.id,\n value: new Date(feature.properties[this.options.timeField])\n });\n }\n\n this._timeIndex.bulkAdd(timeEntries);\n }\n },\n\n _featureWithinTimeRange: function (feature) {\n if (!this.options.from || !this.options.to) {\n return true;\n }\n\n var from = +this.options.from.valueOf();\n var to = +this.options.to.valueOf();\n\n if (typeof this.options.timeField === 'string') {\n var date = +feature.properties[this.options.timeField];\n return (date >= from) && (date <= to);\n }\n\n if (this.options.timeField.start && this.options.timeField.end) {\n var startDate = +feature.properties[this.options.timeField.start];\n var endDate = +feature.properties[this.options.timeField.end];\n return ((startDate >= from) && (startDate <= to)) || ((endDate >= from) && (endDate <= to));\n }\n },\n\n _visibleZoom: function () {\n // check to see whether the current zoom level of the map is within the optional limit defined for the FeatureLayer\n if (!this._map) {\n return false;\n }\n var zoom = this._map.getZoom();\n if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {\n return false;\n } else { return true; }\n },\n\n _handleZoomChange: function () {\n if (!this._visibleZoom()) {\n this.removeLayers(this._currentSnapshot);\n this._currentSnapshot = [];\n } else {\n /*\n for every cell in this._activeCells\n 1. Get the cache key for the coords of the cell\n 2. If this._cache[key] exists it will be an array of feature IDs.\n 3. Call this.addLayers(this._cache[key]) to instruct the feature layer to add the layers back.\n */\n for (var i in this._activeCells) {\n var coords = this._activeCells[i].coords;\n var key = this._cacheKey(coords);\n if (this._cache[key]) {\n this.addLayers(this._cache[key]);\n }\n }\n }\n },\n\n /**\n * Service Methods\n */\n\n authenticate: function (token) {\n this.service.authenticate(token);\n return this;\n },\n\n metadata: function (callback, context) {\n this.service.metadata(callback, context);\n return this;\n },\n\n query: function () {\n return this.service.query();\n },\n\n _getMetadata: function (callback) {\n if (this._metadata) {\n var error;\n callback(error, this._metadata);\n } else {\n this.metadata(Util.bind(function (error, response) {\n this._metadata = response;\n callback(error, this._metadata);\n }, this));\n }\n },\n\n addFeature: function (feature, callback, context) {\n this._getMetadata(Util.bind(function (error, metadata) {\n if (error) {\n if (callback) { callback.call(this, error, null); }\n return;\n }\n\n this.service.addFeature(feature, Util.bind(function (error, response) {\n if (!error) {\n // assign ID from result to appropriate objectid field from service metadata\n feature.properties[metadata.objectIdField] = response.objectId;\n\n // we also need to update the geojson id for createLayers() to function\n feature.id = response.objectId;\n this.createLayers([feature]);\n }\n\n if (callback) {\n callback.call(context, error, response);\n }\n }, this));\n }, this));\n },\n\n updateFeature: function (feature, callback, context) {\n this.service.updateFeature(feature, function (error, response) {\n if (!error) {\n this.removeLayers([feature.id], true);\n this.createLayers([feature]);\n }\n\n if (callback) {\n callback.call(context, error, response);\n }\n }, this);\n },\n\n deleteFeature: function (id, callback, context) {\n this.service.deleteFeature(id, function (error, response) {\n if (!error && response.objectId) {\n this.removeLayers([response.objectId], true);\n }\n if (callback) {\n callback.call(context, error, response);\n }\n }, this);\n },\n\n deleteFeatures: function (ids, callback, context) {\n return this.service.deleteFeatures(ids, function (error, response) {\n if (!error && response.length > 0) {\n for (var i = 0; i < response.length; i++) {\n this.removeLayers([response[i].objectId], true);\n }\n }\n if (callback) {\n callback.call(context, error, response);\n }\n }, this);\n }\n});\n","import { Path, Util, GeoJSON, latLng } from 'leaflet';\nimport { FeatureManager } from './FeatureManager';\n\nexport var FeatureLayer = FeatureManager.extend({\n\n options: {\n cacheLayers: true\n },\n\n /**\n * Constructor\n */\n initialize: function (options) {\n FeatureManager.prototype.initialize.call(this, options);\n this._originalStyle = this.options.style;\n this._layers = {};\n },\n\n /**\n * Layer Interface\n */\n\n onRemove: function (map) {\n for (var i in this._layers) {\n map.removeLayer(this._layers[i]);\n // trigger the event when the entire featureLayer is removed from the map\n this.fire('removefeature', {\n feature: this._layers[i].feature,\n permanent: false\n }, true);\n }\n\n return FeatureManager.prototype.onRemove.call(this, map);\n },\n\n createNewLayer: function (geojson) {\n var layer = GeoJSON.geometryToLayer(geojson, this.options);\n layer.defaultOptions = layer.options;\n return layer;\n },\n\n _updateLayer: function (layer, geojson) {\n // convert the geojson coordinates into a Leaflet LatLng array/nested arrays\n // pass it to setLatLngs to update layer geometries\n var latlngs = [];\n var coordsToLatLng = this.options.coordsToLatLng || GeoJSON.coordsToLatLng;\n\n // copy new attributes, if present\n if (geojson.properties) {\n layer.feature.properties = geojson.properties;\n }\n\n switch (geojson.geometry.type) {\n case 'Point':\n latlngs = GeoJSON.coordsToLatLng(geojson.geometry.coordinates);\n layer.setLatLng(latlngs);\n break;\n case 'LineString':\n latlngs = GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 0, coordsToLatLng);\n layer.setLatLngs(latlngs);\n break;\n case 'MultiLineString':\n latlngs = GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1, coordsToLatLng);\n layer.setLatLngs(latlngs);\n break;\n case 'Polygon':\n latlngs = GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1, coordsToLatLng);\n layer.setLatLngs(latlngs);\n break;\n case 'MultiPolygon':\n latlngs = GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 2, coordsToLatLng);\n layer.setLatLngs(latlngs);\n break;\n }\n },\n\n /**\n * Feature Management Methods\n */\n\n createLayers: function (features) {\n for (var i = features.length - 1; i >= 0; i--) {\n var geojson = features[i];\n\n var layer = this._layers[geojson.id];\n var newLayer;\n\n if (this._visibleZoom() && layer && !this._map.hasLayer(layer)) {\n this._map.addLayer(layer);\n this.fire('addfeature', {\n feature: layer.feature\n }, true);\n }\n\n // update geometry if necessary\n if (layer && this.options.simplifyFactor > 0 && (layer.setLatLngs || layer.setLatLng)) {\n this._updateLayer(layer, geojson);\n }\n\n if (!layer) {\n newLayer = this.createNewLayer(geojson);\n newLayer.feature = geojson;\n\n // bubble events from individual layers to the feature layer\n newLayer.addEventParent(this);\n\n if (this.options.onEachFeature) {\n this.options.onEachFeature(newLayer.feature, newLayer);\n }\n\n // cache the layer\n this._layers[newLayer.feature.id] = newLayer;\n\n // style the layer\n this.setFeatureStyle(newLayer.feature.id, this.options.style);\n\n this.fire('createfeature', {\n feature: newLayer.feature\n }, true);\n\n // add the layer if the current zoom level is inside the range defined for the layer, it is within the current time bounds or our layer is not time enabled\n if (this._visibleZoom() && (!this.options.timeField || (this.options.timeField && this._featureWithinTimeRange(geojson)))) {\n this._map.addLayer(newLayer);\n }\n }\n }\n },\n\n addLayers: function (ids) {\n for (var i = ids.length - 1; i >= 0; i--) {\n var layer = this._layers[ids[i]];\n if (layer) {\n this._map.addLayer(layer);\n }\n }\n },\n\n removeLayers: function (ids, permanent) {\n for (var i = ids.length - 1; i >= 0; i--) {\n var id = ids[i];\n var layer = this._layers[id];\n if (layer) {\n this.fire('removefeature', {\n feature: layer.feature,\n permanent: permanent\n }, true);\n this._map.removeLayer(layer);\n }\n if (layer && permanent) {\n delete this._layers[id];\n }\n }\n },\n\n cellEnter: function (bounds, coords) {\n if (this._visibleZoom() && !this._zooming && this._map) {\n Util.requestAnimFrame(Util.bind(function () {\n var cacheKey = this._cacheKey(coords);\n var cellKey = this._cellCoordsToKey(coords);\n var layers = this._cache[cacheKey];\n if (this._activeCells[cellKey] && layers) {\n this.addLayers(layers);\n }\n }, this));\n }\n },\n\n cellLeave: function (bounds, coords) {\n if (!this._zooming) {\n Util.requestAnimFrame(Util.bind(function () {\n if (this._map) {\n var cacheKey = this._cacheKey(coords);\n var cellKey = this._cellCoordsToKey(coords);\n var layers = this._cache[cacheKey];\n var mapBounds = this._map.getBounds();\n if (!this._activeCells[cellKey] && layers) {\n var removable = true;\n\n for (var i = 0; i < layers.length; i++) {\n var layer = this._layers[layers[i]];\n if (layer && layer.getBounds && mapBounds.intersects(layer.getBounds())) {\n removable = false;\n }\n }\n\n if (removable) {\n this.removeLayers(layers, !this.options.cacheLayers);\n }\n\n if (!this.options.cacheLayers && removable) {\n delete this._cache[cacheKey];\n delete this._cells[cellKey];\n delete this._activeCells[cellKey];\n }\n }\n }\n }, this));\n }\n },\n\n /**\n * Styling Methods\n */\n\n resetStyle: function () {\n this.options.style = this._originalStyle;\n this.eachFeature(function (layer) {\n this.resetFeatureStyle(layer.feature.id);\n }, this);\n return this;\n },\n\n setStyle: function (style) {\n this.options.style = style;\n this.eachFeature(function (layer) {\n this.setFeatureStyle(layer.feature.id, style);\n }, this);\n return this;\n },\n\n resetFeatureStyle: function (id) {\n var layer = this._layers[id];\n var style = this._originalStyle || Path.prototype.options;\n if (layer) {\n Util.extend(layer.options, layer.defaultOptions);\n this.setFeatureStyle(id, style);\n }\n return this;\n },\n\n setFeatureStyle: function (id, style) {\n var layer = this._layers[id];\n if (typeof style === 'function') {\n style = style(layer.feature);\n }\n if (layer.setStyle) {\n layer.setStyle(style);\n }\n return this;\n },\n\n /**\n * Utility Methods\n */\n\n eachActiveFeature: function (fn, context) {\n // figure out (roughly) which layers are in view\n if (this._map) {\n var activeBounds = this._map.getBounds();\n for (var i in this._layers) {\n if (this._currentSnapshot.indexOf(this._layers[i].feature.id) !== -1) {\n // a simple point in poly test for point geometries\n if (typeof this._layers[i].getLatLng === 'function' && activeBounds.contains(this._layers[i].getLatLng())) {\n fn.call(context, this._layers[i]);\n } else if (typeof this._layers[i].getBounds === 'function' && activeBounds.intersects(this._layers[i].getBounds())) {\n // intersecting bounds check for polyline and polygon geometries\n fn.call(context, this._layers[i]);\n }\n }\n }\n }\n return this;\n },\n\n eachFeature: function (fn, context) {\n for (var i in this._layers) {\n fn.call(context, this._layers[i]);\n }\n return this;\n },\n\n getFeature: function (id) {\n return this._layers[id];\n },\n\n bringToBack: function () {\n this.eachFeature(function (layer) {\n if (layer.bringToBack) {\n layer.bringToBack();\n }\n });\n },\n\n bringToFront: function () {\n this.eachFeature(function (layer) {\n if (layer.bringToFront) {\n layer.bringToFront();\n }\n });\n },\n\n redraw: function (id) {\n if (id) {\n this._redraw(id);\n }\n return this;\n },\n\n _redraw: function (id) {\n var layer = this._layers[id];\n var geojson = layer.feature;\n\n // if this looks like a marker\n if (layer && layer.setIcon && this.options.pointToLayer) {\n // update custom symbology, if necessary\n if (this.options.pointToLayer) {\n var getIcon = this.options.pointToLayer(geojson, latLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0]));\n var updatedIcon = getIcon.options.icon;\n layer.setIcon(updatedIcon);\n }\n }\n\n // looks like a vector marker (circleMarker)\n if (layer && layer.setStyle && this.options.pointToLayer) {\n var getStyle = this.options.pointToLayer(geojson, latLng(geojson.geometry.coordinates[1], geojson.geometry.coordinates[0]));\n var updatedStyle = getStyle.options;\n this.setFeatureStyle(geojson.id, updatedStyle);\n }\n\n // looks like a path (polygon/polyline)\n if (layer && layer.setStyle && this.options.style) {\n this.resetStyle(geojson.id);\n }\n }\n});\n\nexport function featureLayer (options) {\n return new FeatureLayer(options);\n}\n\nexport default featureLayer;\n"],"names":["cors","window","XMLHttpRequest","pointerEvents","document","documentElement","style","Support","options","attributionWidthOffset","callbacks","serialize","params","data","key","f","hasOwnProperty","value","param","type","Object","prototype","toString","call","length","JSON","stringify","join","valueOf","encodeURIComponent","createRequest","callback","context","httpRequest","onerror","e","onreadystatechange","Util","falseFn","error","code","message","response","readyState","parse","responseText","ontimeout","this","xmlHttpPost","url","open","timeout","setRequestHeader","send","xmlHttpGet","request","paramString","requestLength","jsonp","warn","_EsriLeafletCallbacks","callbackId","responseType","script","DomUtil","create","body","src","id","addClass","abort","_callback","get","CORS","JSONP","Request","post","closeRing","coordinates","a","b","i","pointsEqual","push","ringIsClockwise","ringToTest","pt2","total","rLength","pt1","vertexIntersectsVertex","a1","a2","b1","b2","uaT","ubT","uB","ua","ub","arrayIntersectsArray","j","coordinatesContainCoordinates","outer","inner","intersects","contains","point","l","coordinatesContainPoint","orientRings","poly","output","polygon","slice","outerRing","shift","reverse","hole","shallowClone","obj","target","arcgisToGeoJSON","arcgis","idAttribute","geojson","x","y","z","points","paths","rings","outerRings","holes","r","ring","uncontainedHoles","pop","contained","convertRingsToGeoJSON","geometry","attributes","properties","keys","Error","getId","err","spatialReference","wkid","console","geojsonToArcGIS","result","flattenMultiPolygonRings","features","geometries","idAttr","g2a","a2g","extentToBounds","extent","xmin","ymin","xmax","ymax","sw","latLng","ne","latLngBounds","boundsToExtent","bounds","getSouthWest","lng","lat","getNorthEast","knownFieldNames","_findIdAttributeFromResponse","objectIdFieldName","fields","name","match","_findIdAttributeFromFeature","feature","responseToFeatureCollection","objectIdField","results","count","featureCollection","cleanUrl","trim","getUrlParams","indexOf","requestParams","queryString","substring","split","decodeURI","replace","isArcgisOnline","test","geojsonTypeToArcGIS","geoJsonType","arcgisGeometryType","apply","arguments","calcAttributionWidth","map","getSize","setEsriAttribution","attributionControl","_esriAttributionAdded","setPrefix","hoverAttributionStyle","createElement","innerHTML","getElementsByTagName","appendChild","_container","attributionStyle","on","maxWidth","parentNode","removeChild","nodeList","querySelectorAll","item","_setGeometry","geometryType","LatLngBounds","getLatLng","LatLng","GeoJSON","getLayers","toGeoJSON","_getAttributionData","bind","attributions","_esriAttributions","c","contributors","contributor","coverageAreas","coverageArea","southWest","bbox","northEast","attribution","score","minZoom","zoomMin","maxZoom","zoomMax","sort","_updateMapAttribution","evt","oldAttributions","newAttributions","getBounds","wrappedBounds","wrap","zoom","getZoom","text","substr","attributionElement","querySelector","fire","EsriUtil","Task","Class","extend","proxy","useCors","generateSetter","initialize","endpoint","_service","setOptions","setters","setter","token","authenticate","format","boolean","returnUnformattedValues","path","_request","method","Query","offset","limit","precision","featureIds","returnGeometry","returnM","transform","where","outSr","outFields","within","_setGeometryParams","spatialRel","crosses","touches","overlaps","bboxIntersects","indexIntersects","nearby","latlng","radius","units","distance","inSr","string","between","start","end","time","simplify","factor","mapWidth","Math","abs","getWest","getEast","maxAllowableOffset","orderBy","fieldName","order","orderByFields","run","_cleanParams","isModern","_trapSQLerrors","returnCountOnly","ids","returnIdsOnly","objectIds","returnExtentOnly","distinct","returnDistinctValues","pixelSize","rawPoint","castPoint","layer","converted","query","Find","sr","layers","dynamicLayers","returnZ","gdbVersion","layerDefs","find","Identify","IdentifyFeatures","tolerance","size","imageDisplay","mapExtent","at","layerDef","undefined","layerId","identifyFeatures","IdentifyImage","setMosaicRule","setRenderingRule","setPixelSize","returnCatalogItems","getMosaicRule","mosaicRule","getRenderingRule","renderingRule","getPixelSize","_responseToGeoJSON","location","catalogItems","catalogItemVisibilities","geoJSON","pixel","crs","OBJECTID","objectId","Values","values","catalogItemVisibility","identifyImage","Service","Evented","_requestQueue","_authenticating","metadata","_runQueue","getTimeout","setTimeout","wrappedCallback","_createServiceCallback","MapService","identify","mapService","ImageService","imageService","FeatureLayerService","addFeature","addResults","updateFeature","updateResults","deleteFeature","deleteResults","deleteFeatures","featureLayerService","tileProtocol","protocol","BasemapLayer","TileLayer","statics","TILES","Streets","urlTemplate","subdomains","attributionUrl","Topographic","Oceans","OceansLabels","pane","NationalGeographic","DarkGray","DarkGrayLabels","Gray","GrayLabels","Imagery","ImageryLabels","ImageryTransportation","ShadedRelief","ShadedReliefLabels","Terrain","TerrainLabels","USATopo","ImageryClarity","config","tileOptions","onAdd","_initPane","onRemove","off","_map","getPane","createPane","zIndex","getAttribution","TiledMapLayer","zoomOffsetAllowance","errorTileUrl","MercatorZoomLevels","0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","tileUrl","getParamString","service","addEventParent","RegExp","getTileUrl","tilePoint","_getZoomForUrl","template","s","_getSubdomain","_lodMap","createTile","coords","done","tile","DomEvent","_tileOnLoad","_tileOnError","crossOrigin","alt","once","latestWkid","copyrightText","addAttribution","CRS","EPSG3857","arcgisLODs","tileInfo","lods","correctResolutions","arcgisLOD","ci","correctRes","_withinPercentage","resolution","level","tokenQs","percentage","Overlay","ImageOverlay","_topLeft","getPixelBounds","min","_reset","setPosition","_image","subtract","getPixelOrigin","RasterLayer","Layer","opacity","position","interactive","_update","throttle","updateInterval","_currentImage","_bounds","equals","addLayer","removeLayer","_popup","_getPopupData","_resetPopupState","bindPopup","fn","popupOptions","_shouldRenderPopup","_lastClick","popup","_popupFunction","unbindPopup","closePopup","bringToFront","bringToBack","getOpacity","setOpacity","getTimeRange","from","to","setTimeRange","redraw","_renderImage","contentType","image","addTo","onOverlayLoad","newImage","oldImage","_animatingZoom","_panTransition","_inProgress","_buildExportParams","_requestExport","_renderPopup","content","setLatLng","setContent","openOn","_calculateBbox","pixelBounds","unproject","getBottomLeft","getTopRight","neProjected","project","swProjected","boundsProjected","_calculateImageSize","top","latLngToLayerPoint","bottom","ImageMapLayer","transparent","setPixelType","pixelType","getPixelType","setBandIds","bandIds","isArray","getBandIds","setNoData","noData","noDataInterpretation","getNoData","getNoDataInterpretation","identifyRequest","parseInt","bboxSR","imageSR","interpolation","compressionQuality","href","DynamicMapLayer","timeOptions","getDynamicLayers","setDynamicLayers","setLayers","getLayerDefs","setLayerDefs","getTimeOptions","setTimeOptions","dpi","disableCache","_ts","Date","now","imageData","VirtualGrid","cellSize","_zooming","removeEventListener","getEvents","_removeCells","moveend","zoomstart","_zoomstart","zoomend","removeFrom","_cells","_activeCells","_cellsToLoad","_cellsTotal","_cellNumBounds","_getCellNumBounds","_resetWrap","infinite","_getCellSize","wrapLng","_wrapLng","floor","ceil","wrapLat","_wrapLat","mapBounds","cellBounds","divideBy","max","_removeOtherCells","_addCells","queue","center","getCenter","_isValidCell","cellsToLoad","distanceTo","_addCell","cellNumBounds","_cellCoordsToBounds","nwPoint","multiplyBy","sePoint","add","nw","wrapLatLng","se","_cellCoordsToKey","_keyToCellCoords","kArr","_removeCell","cell","cellLeave","_wrapCoords","cellEnter","createCell","wrapNum","worldBounds","getPixelWorldBounds","BinarySearchIndex","concat","index","getIndex","dirty","currentIndex","currentElement","minIndex","maxIndex","round","startIndex","endIndex","insert","splice","bulkAdd","items","FeatureManager","timeField","timeFilterMode","simplifyFactor","oidCheck","_startTimeIndex","_endTimeIndex","_timeIndex","_cache","_currentSnapshot","_activeRequests","supportedFormats","supportedQueryFormats","forceJsonFormat","_handleZoomChange","_visibleZoom","_requestFeatures","_buildQuery","exceededTransferLimit","requestAnimFrame","_addFeatures","_postProcessFeatures","_cacheKey","_buildTimeIndexes","createLayers","setWhere","oldSnapshot","newSnapshot","pendingRequests","requestError","requestCallback","removeLayers","addLayers","getWhere","oldFrom","oldTo","_filterExistingFeatures","refresh","eachFeature","_redraw","newFrom","newTo","layersToRemove","_getFeaturesInTimeRange","layersToAdd","shouldRemoveLayer","search","startTimes","endTimes","startTimeEntries","endTimeEntries","timeEntries","_featureWithinTimeRange","date","startDate","endDate","_getMetadata","_metadata","FeatureLayer","cacheLayers","_originalStyle","_layers","permanent","createNewLayer","geometryToLayer","defaultOptions","_updateLayer","latlngs","coordsToLatLng","coordsToLatLngs","setLatLngs","newLayer","hasLayer","onEachFeature","setFeatureStyle","cacheKey","cellKey","removable","resetStyle","resetFeatureStyle","setStyle","Path","eachActiveFeature","activeBounds","getFeature","setIcon","pointToLayer","updatedIcon","icon","updatedStyle"],"mappings":"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"} \ No newline at end of file