diff --git a/.eslintrc b/.eslintrc index 2e74b787..19bdf662 100644 --- a/.eslintrc +++ b/.eslintrc @@ -40,7 +40,7 @@ "curly": [ "error" ], "dot-notation": [ "error" ], "eqeqeq": [ "error" ], - "id-length": [ "error" ], + "id-length": [ "error", { "exceptions": ["x", "y", "c"] } ], "indent": [ "error", 4, @@ -53,7 +53,7 @@ "error", "unix" ], - "new-cap": [ "error", { + "new-cap": [ "error", { "newIsCapExceptions": ["tClass"] }], "no-case-declarations": [ "error" ], diff --git a/.gitignore b/.gitignore index e8f5dc71..0777ec2a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,9 @@ **/node_modules/ *.log -.env \ No newline at end of file +.*env* +.idea +*__pycache__ +.DS_Store +*htmlcov +*.coverage +*.pytest_cache \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..ba831342 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "lib/rpc_spec"] + path = lib/rpc_spec + url = https://github.com/smartdevicelink/rpc_spec.git + branch = master diff --git a/examples/js/hello-sdl/index.html b/examples/js/hello-sdl/index.html index 6ce9a4fd..9c007ab4 100644 --- a/examples/js/hello-sdl/index.html +++ b/examples/js/hello-sdl/index.html @@ -89,7 +89,7 @@ } async _onHmiStatusListener (onHmiStatus) { - const hmiLevel = onHmiStatus.getHMILevel(); + const hmiLevel = onHmiStatus.getHmiLevel(); // wait for the FULL state for more functionality if (hmiLevel === SDL.rpc.enums.HMILevel.HMI_FULL) { diff --git a/examples/node/hello-sdl/AppClient.js b/examples/node/hello-sdl/AppClient.js index 15a3818c..f19c0da8 100644 --- a/examples/node/hello-sdl/AppClient.js +++ b/examples/node/hello-sdl/AppClient.js @@ -92,7 +92,7 @@ class AppClient { } async _onHmiStatusListener (onHmiStatus) { - const hmiLevel = onHmiStatus.getHMILevel(); + const hmiLevel = onHmiStatus.getHmiLevel(); // wait for the FULL state for more functionality if (hmiLevel === SDL.rpc.enums.HMILevel.HMI_FULL) { diff --git a/generator/README.md b/generator/README.md new file mode 100644 index 00000000..84124498 --- /dev/null +++ b/generator/README.md @@ -0,0 +1,1741 @@ +# Proxy Library RPC Generator + +## Overview + +This script provides the possibility to auto-generate JavaScript code based on a given SDL MOBILE_API XML specification. + +## Requirements + +The script requires Python 3.5 pre-installed in the system. This is the minimal Python 3 version that has not reached the end-of-life (https://devguide.python.org/devcycle/#end-of-life-branches). + +Some required libraries are described in `requirements.txt` and should be pre-installed by the command: +```shell script +pip install -r requirements.txt +``` +Please also make sure before usage the 'lib/rpc_spec' Git submodule is successfully initialized, because the script uses the XML parser provided there. + +## Usage +```shell script +usage: generator.py [-h] [-v] [-xml SOURCE_XML] [-xsd SOURCE_XSD] + [-d OUTPUT_DIRECTORY] [-t [TEMPLATES_DIRECTORY]] + [-r REGEX_PATTERN] [--verbose] [-e] [-s] [-m] [-y] [-n] + +Proxy Library RPC Generator + +optional arguments: + -h, --help show this help message and exit + -v, --version print the version and exit + -xml SOURCE_XML, --source-xml SOURCE_XML, --input-file SOURCE_XML + should point to MOBILE_API.xml + -xsd SOURCE_XSD, --source-xsd SOURCE_XSD + -d OUTPUT_DIRECTORY, --output-directory OUTPUT_DIRECTORY + define the place where the generated output should be + placed + -t [TEMPLATES_DIRECTORY], --templates-directory [TEMPLATES_DIRECTORY] + path to directory with templates + -r REGEX_PATTERN, --regex-pattern REGEX_PATTERN + only elements matched with defined regex pattern will + be parsed and generated + --verbose display additional details like logs etc + -e, --enums only specified elements will be generated, if present + -s, --structs only specified elements will be generated, if present + -m, -f, --functions only specified elements will be generated, if present + -y, --overwrite force overwriting of existing files in output + directory, ignore confirmation message + -n, --skip skip overwriting of existing files in output + directory, ignore confirmation message +``` + +# JavaScript ES6 Transformation rules + +## Overview +These are the general transformation rules for RPC classes of SDL JavaScript Suite Library. The description of base classes, already included in the library, is not provided here, for details please view the source code. + +The JSDoc is used for inline documentation of generated code. All non-XML values should follow Architecture & Contribution Guidelines (GUIDELINES.md) + +These rules based on the current `develop` branch state (commit:`c5b3b448e008dadc9a5b66addde17633ac957700`) of [`smartdevicelink/sdl_javascript_suite`](https://github.com/smartdevicelink/sdl_javascript_suite) repository. + +## The License Header +All files should start from the comment with the license information. + +```javascript +/* +* Copyright (c) [year], SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ +``` +Where `[year]` in the copyright line is the current year. + +## `` +Each Enum class should be stored as a single script file in the folder named `enums` and the name of the script file should be equal to the value from the `"name"` attribute of `` followed by the extension `.js`. + +Example: +```shell script +enums/ImageType.js +``` +The script should import the base Enum class and the produced class should extend it. The name of the class is the value from the `"name"` attribute of ``. The constructor has no params and should call `super()`. + +The class should have the next JSDoc comment: +```javascript +/** + * [description] + * @typedef {Enum} [enum_name] + * @property {Object} _MAP + */ +``` +Where `[description]` is `` of the current ``, if exists, and `[enum_name]` is the value of the `"name"` attribute. + +The constructor should have the next JSDoc comment: +```javascript +/** + * @constructor + */ +``` + +Example: +```javascript +import { Enum } from '_path_to_base_classes_/Enum.js'; + +/** + * Contains information about the type of image. + * @typedef {Enum} ImageType + * @property {Object} _MAP + */ +class ImageType extends Enum { + + /** + * @constructor + */ + constructor() { + super(); + } +} +``` +The set of `` should be mapped to the frozen object and put into the private static property `_MAP`. + +The following list are general rules for keys and values of this object: + +1. The `"name"` attribute is the base value for both the key and the value of the mapped object. +2. In case if the `"internal_name"` attribute exists, this should be used for the key instead of the `"name"` attribute. +3. In case if the `"value"` attribute exists, this attribute should be used for the value instead of the `"name"` attribute. +4. In case if the `"hexvalue"` attribute exists, this attribute should be used for the value instead of the `"value"` and `"name"` attributes. +5. Uses of the "sync" prefix shall be replaced with "sdl" (where it would not break functionality). E.g. `SyncMsgVersion -> SdlMsgVersion`. This applies to member variables and their accessors. The key used when creating the RPC message JSON should match that of the RPC Spec. +6. The `_MAP` keys and static getters of the `FunctionID` enum shall not include the ID suffix. e.g. `RegisterAppInterfaceID -> RegisterAppInterface`. + +According to ES6 standard, static (class-side) data properties and prototype data properties must be defined outside of the ClassBody declaration. + +Example: +```javascript +ImageType._MAP = Object.freeze({ + 'STATIC': 'STATIC', + 'DYNAMIC': 'DYNAMIC', +}); +``` + +For each `` the static getter method should be defined in the class. The name of the getter is the `"internal_name"` or `"name"` attribute value, the same as `_MAP` keys. The returned value is the value from the frozen object described above taken by the corresponding key. + +The getter should have the next JSDoc comment: +```javascript +/** + * [description] + * @return {[enum_type]} + */ +``` +Where `[description]` is `` of the current ``, if exists, and `[enum_type]` is the one of `String` or `Number`. + +Example: +```javascript +/** + * @return {String} + */ +static get STATIC() { + return ImageType._MAP.STATIC; +} + +/** + * @return {String} + */ +static get DYNAMIC() { + return ImageType._MAP.DYNAMIC; +} +``` +The base Enum class requires subclasses to override and implement the `valueForKey` method with one parameter named `"key"`. This implementation should return a given enumeration **`value`** if the provided **`key`** exists in the collection (otherwise `null`) using the _valueForKey(key) private method found in the base Enum class. + +This method should have the next JSDoc comment: +```javascript +/** + * A method for subclasses to implement that does what _keyForValue does + * @param key - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ +``` + +Example: +```javascript +/** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ +static valueForKey (key) { + return ImageType._valueForKey(key, ImageType._MAP); +} +``` +Also the base Enum class requires subclasses to override and implement the `keyForValue` method with one parameter named `"value"`. This implementation should return a given enumeration **`key`** if the provided **`value`** exists in the collection (otherwise `null`) using the __keyForValue(value) private method found in the base Enum class. + +This method should have the next JSDoc comment: +```javascript +/** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ +``` + +Example: +```javascript +/** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ +static keyForValue (value) { + return ImageType._keyForValue(value, ImageType._MAP); +} +``` +After the `_MAP` definition, the script should export the produced class. + +Example: +```javascript +export { ImageType }; +``` + +### Below are examples of `` with different `` attributes + + +#### Example with only `"name"` attribute: + +XML: +```xml + + Contains information about the type of image. + + + +``` + +The Output: +```javascript +/* +* Copyright (c) 2019, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Enum } from '_path_to_base_classes_/Enum.js'; + +/** + * Contains information about the type of image. + * @typedef {Enum} ImageType + * @property {Object} _MAP + */ +class ImageType extends Enum { + /** + * @constructor + */ + constructor () { + super(); + } + + /** + * @return {String} + */ + static get STATIC () { + return ImageType._MAP.STATIC; + } + + /** + * @return {String} + */ + static get DYNAMIC () { + return ImageType._MAP.DYNAMIC; + } + + /** + * Get the value for the given enum key + * @param value - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return ImageType._valueForKey(key, ImageType._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return ImageType._keyForValue(value, ImageType._MAP); + } +} + +ImageType._MAP = Object.freeze({ + 'STATIC': 'STATIC', + 'DYNAMIC': 'DYNAMIC', +}); + +export { ImageType }; +``` + +#### Example with `"internal_name"` and `"name"` attribute: + +XML: +```xml + + Contains information about the VR capabilities. + + +``` + +The Output: +```javascript +/* +* Copyright (c) 2019, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Enum } from '_path_to_base_classes_/Enum.js'; + +/** + * Contains information about the VR capabilities. + * @typedef {Enum} VrCapabilities + * @property {Object} _MAP + */ +class VrCapabilities extends Enum { + constructor () { + super(); + } + + /** + * @return {String} + */ + static get VR_TEXT () { + return VrCapabilities._MAP.VR_TEXT; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return VrCapabilities._valueForKey(key, VrCapabilities._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return VrCapabilities._keyForValue(value, VrCapabilities._MAP); + } +} + +VrCapabilities._MAP = Object.freeze({ + 'VR_TEXT': 'TEXT', +}); + +export { VrCapabilities }; +``` + +#### Example with `"value"` attribute: + +XML: +```xml + + + The default window is a main window pre-created on behalf of the app. + + + The primary widget of the app. + + +``` + +The Output: +```javascript +/* +* Copyright (c) 2019, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ +import { Enum } from '_path_to_base_classes_/Enum.js'; + +/** + * @typedef {Enum} PredefinedWindows + * @property {Object} _MAP + */ +class PredefinedWindows extends Enum { + /** + * @constructor + */ + constructor () { + super(); + } + + /** + * The primary widget of the app. + * @return {Number} + */ + static get PRIMARY_WIDGET () { + return PredefinedWindows._MAP.PRIMARY_WIDGET; + } + + /** + * The default window is a main window pre-created on behalf of the app. + * @return {Number} + */ + static get DEFAULT_WINDOW () { + return PredefinedWindows._MAP.DEFAULT_WINDOW; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return PredefinedWindows._valueForKey(key, PredefinedWindows._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return PredefinedWindows._keyForValue(value, PredefinedWindows._MAP); + } +} + +PredefinedWindows._MAP = Object.freeze({ + 'PRIMARY_WIDGET': 1, + 'DEFAULT_WINDOW': 0, +}); + +export { PredefinedWindows }; +``` + +#### Example with `"hexvalue"` attribute: + +XML: +```xml + + Enumeration linking function names with function IDs in SmartDeviceLink protocol. Assumes enumeration starts at value 0. + + + + +``` + +The Output: +```javascript +/* +* Copyright (c) 2019, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ +import { Enum } from '_path_to_base_classes_/Enum.js'; + +/** + * Enumeration linking function names with function IDs in SmartDeviceLink protocol. Assumes enumeration starts at value 0. + * @typedef {Enum} FunctionID + * @property {Object} _MAP + */ +class FunctionID extends Enum { + /** + * @constructor + */ + constructor () { + super(); + } + + /** + * @return {Number} + */ + static get RESERVED () { + return FunctionID._MAP.RESERVED; + } + + /** + * @return {Number} + */ + static get RegisterAppInterface () { + return FunctionID._MAP.RegisterAppInterface; + } + + /** + * @return {Number} + */ + static get Slider () { + return FunctionID._MAP.Slider; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return FunctionID._valueForKey(key, FunctionID._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return FunctionID._keyForValue(value, FunctionID._MAP); + } +} + +FunctionID._MAP = Object.freeze({ + 'RESERVED': 0x0, + 'RegisterAppInterface': 0x1, + 'Slider': 0x1A, +}); + +export { FunctionID }; +``` + +## `` +Each Struct class should be stored as a single script file in the folder named `structs` and the name of the script file should be equal to the value from the `"name"` attribute of `` following by the extension `.js`. + +Example: +```shell script +structs/VehicleDataResult.js +``` + +The script should import the base `RpcStruct` class and the produced class should extend it. The name of the class is the value from the `"name"` attribute of ``. + +The script should also import any Enum and Struct classes, that are used in the represented structure. + +The constructor has one parameter named `parameters` to pass the JavaScript object with initial values of the represented structure and should call `super(parameters)` to pass this object into the base class. + +The class should have the next JSDoc comment: +```javascript +/** + * [description] + */ +``` +Where `[description]` is `` of the current ``, if exists. + +The constructor should have the next JSDoc comment: +```javascript +/** + * @constructor + */ +``` + +Example: +```javascript +import { RpcStruct } from '_path_to_base_classes_/RpcStruct.js'; +import { VehicleDataType } from '../enums/VehicleDataType.js'; +import { VehicleDataResultCode } from '../enums/VehicleDataResultCode.js'; + +/** + * Individual published data request result + */ +class VehicleDataResult extends RpcStruct { + + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } +} +``` + +The set of `` should be mapped to the static properties of the new class by following rules: + +1. The name of the property is the `SCREAMING_SNAKE_CASE` formatted value of the `"name"` attribute of `` with the `KEY_` prefix. +2. The value of the property is the value of the `"name"` attribute of `` +3. Uses of the "sync" prefix shall be replaced with "sdl" (where it would not break functionality). E.g. `KEY_SYNC_MSG_VERSION -> KEY_SDL_MSG_VERSION`. This applies to member variables and their accessors. The key used when creating the RPC message JSON should match that of the RPC Spec. + +According to ES6 standard, static (class-side) data properties and prototype data properties must be defined outside of the ClassBody declaration. + +Example: +```javascript +VehicleDataResult.KEY_DATA_TYPE = 'dataType'; +VehicleDataResult.KEY_RESULT_CODE = 'resultCode'; +VehicleDataResult.KEY_OEM_CUSTOM_DATA_TYPE = 'oemCustomDataType'; +``` + +For each `` the getter and setter methods should be defined in the class: + +1. The name of the getter is the `PascalCase` formatted value of the `"name"` attribute with the `get` prefix, for the setter the prefix should be `set`. +2. Uses of the "sync" prefix shall be replaced with "sdl" (where it would not break functionality). E.g. `SyncMsgVersion -> SdlMsgVersion`. This applies to member variables and their accessors. The key used when creating the RPC message JSON should match that of the RPC Spec. +3. If the `` has the `"type"` attribute value as one of `Boolean`, `Float`, `Integer`, `String`: + * The getter should call and return the result of the `this.getParameter` method, where the single parameter is the value of the corresponding static property described above; + * The setter should call the `this.setParameter` method, where the first parameter is the value of the corresponding static property described above, the second is the value passed into setter; + * The setter should return `this` instance to support the chaining. +4. If the `` has the `"type"` attribute value as the one of `` or `` name: + * The getter should call and return the result of the `this.getObject` method, where the first parameter is the corresponding Struct or Enum class, the second is the value of the corresponding static property described above; + * The setter should validate the received value by calling the `this.validateType` method, where the fist parameter is the Struct or Enum class corresponding to the `"type"` attribute value of ``, the second is the value itself; + * The setter should call the `this.setParameter` method, where the first parameter is the value of the corresponding static property described above, the second is the value passed into setter; + * The setter should return `this` instance to support the chaining. + +The setter should have the next JSDoc comment: +```javascript +/** + * @param {[param_type]} [value_name] [description] + * @return {[struct_name]} + */ +``` +Where `[param_type]` is the `"type"` attribute, `[value_name]` is the lowercase last part of the `"name"` attribute, `[description]` is `` of the current ``, if exists, and `[struct_name]` is the `"name"` attribute of the current Struct. + +The getter should have the next JSDoc comment: +```javascript +/** + * @return {[param_type]} + */ +``` +Where `[param_type]` is the `"type"` attribute of the current ``. + + +Examples: +```javascript +/** + * @param {VehicleDataType} type Defined published data element type. + * @return {VehicleDataResult} + */ +setDataType(type) { + this.validateType(VehicleDataType, type); + this.setParameter(VehicleDataResult.KEY_DATA_TYPE, type); + return this; +} + +/** + * @return {VehicleDataType} + */ +getDataType() { + return this.getObject(VehicleDataType, VehicleDataResult.KEY_DATA_TYPE); +} + +/** + * @param {String} type Type of requested oem specific parameter + * @return {VehicleDataResult} + */ +setOemCustomDataType(type) { + this.setParameter(VehicleDataResult.KEY_OEM_CUSTOM_DATA_TYPE, type); + return this; +} + +/** + * @return {String} + */ +getOemCustomDataType() { + return this.getParameter(VehicleDataResult.KEY_OEM_CUSTOM_DATA_TYPE); +} +``` + +After the static properties definition, the script should export the produced class. + +Example: +```javascript +export { VehicleDataResult }; +``` + +### Below is the full example of the Struct class with simple and Enum parameters inside: + +XML: +```xml + + Individual published data request result + + Defined published data element type. + + + Published data result code. + + + Type of requested oem specific parameter + + +``` + +The Output: +```javascript +/* +* Copyright (c) 2019, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '_path_to_base_classes_/RpcStruct.js'; +import { VehicleDataType } from '../enums/VehicleDataType.js'; +import { VehicleDataResultCode } from '../enums/VehicleDataResultCode.js'; + +/** + * Individual published data request result + */ +class VehicleDataResult extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {VehicleDataType} type - Defined published data element type. + * @return {VehicleDataResult} + */ + setDataType (type) { + this.validateType(VehicleDataType, type); + this.setParameter(VehicleDataResult.KEY_DATA_TYPE, type); + return this; + } + + /** + * @return {VehicleDataType} + */ + getDataType () { + return this.getObject(VehicleDataType, VehicleDataResult.KEY_DATA_TYPE); + } + + /** + * @param {VehicleDataResultCode} code - Published data result code. + * @return {VehicleDataResult} + */ + setResultCode (code) { + this.validateType(VehicleDataResultCode, code); + this.setParameter(VehicleDataResult.KEY_RESULT_CODE, code); + return this; + } + + /** + * @return {VehicleDataResultCode} + */ + getResultCode () { + return this.getObject(VehicleDataResultCode, VehicleDataResult.KEY_RESULT_CODE); + } + + /** + * @param {String} type - Type of requested oem specific parameter + * @return {VehicleDataResult} + */ + setOemCustomDataType (type) { + this.setParameter(VehicleDataResult.KEY_OEM_CUSTOM_DATA_TYPE, type); + return this; + } + + /** + * @return {String} + */ + getOemCustomDataType () { + return this.getParameter(VehicleDataResult.KEY_OEM_CUSTOM_DATA_TYPE); + } +} + +VehicleDataResult.KEY_DATA_TYPE = 'dataType'; +VehicleDataResult.KEY_RESULT_CODE = 'resultCode'; +VehicleDataResult.KEY_OEM_CUSTOM_DATA_TYPE = 'oemCustomDataType'; + +export { VehicleDataResult }; +``` + +## `` + +Each Function class should be stored as a single script file in the folder named `messages` and the name of the script is the value from the `"name"` attribute of `` (followed by additional suffix `Response` if the `"messagetype"` attribute is set to `response`) followed by the extension `.js`. + +Example: +```shell script +messages/AddCommand.js +messages/AddCommandResponse.js +messages/OnLanguageChange.js +``` + +There are some prerequisites for the Function class: + +1. Based on the value of the `"messagetype"` attribute of ``, the script should import the base class `RpcRequest`, `RpcResponse` or `RpcNotification` class and the produced class should extend the imported base class. +2. The script should import `enums/FunctionID.js` to get the `functionID` hex value of the current RPC function. The key of the required `` of `FunctionID` enum is the value of the `"functionID"` attribute of ``. +3. The script should import all Enum and Struct classes, that are used by the representing function. +4. The name of the class is the value from the `"name"` attribute of `` (followed by additional suffix `Response` if the `"messagetype"` attribute is set to `response`), e.g. `AddCommand`, `AddCommandResponse`, `OnLanguageChange`. +5. The constructor has one parameter named `store` to pass the JavaScript object with initial values of the function params and should call `super(store)` to pass this object into the parent class. +6. The constructor should call `this.setFunctionName` method with the correspond `FunctionID` value described in the point 2, e.g. `FunctionID.AddCommandID`. + +The class should have the next JSDoc comment: +```javascript +/** + * [description] + */ +``` +Where `[description]` is `` of the current ``, if exists. + +The constructor should have the next JSDoc comment: +```javascript +/** + * @constructor + */ +``` + +Example: +```javascript +import { RpcRequest } from '_path_to_base_classes_/RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { Image } from '../enums/Image.js'; +import { MenuParams } from '../enums/MenuParams.js'; + +/** + * Adds a command to the in application menu. Either menuParams or vrCommands must be provided. + */ +class AddCommand extends RpcRequest { + + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.AddCommandID); + } +} +``` + +Example: +```javascript +import { RpcResponse } from '_path_to_base_classes_/RpcResponse.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +class AddCommandResponse extends RpcResponse { + + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.AddCommandID); + } +} +``` + +Example: +```javascript +import { RpcNotification } from '_path_to_base_classes_/RpcNotification.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { Language } from '../enums/Language.js'; +import { MenuParams } from '../enums/MenuParams.js'; + +class OnLanguageChange extends RpcNotification { + + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnLanguageChangeID); + } +} +``` + +The set of `` should be mapped to the static properties of the new class by following rules: + +1. The name of the property is the `SCREAMING_SNAKE_CASE` formatted value of the `"name"` attribute of `` with the `KEY_` prefix. +2. Uses of the "sync" prefix shall be replaced with "sdl" (where it would not break functionality). E.g. `SyncMsgVersion -> SdlMsgVersion`. This applies to member variables and their accessors. The key used when creating the RPC message JSON should match that of the RPC Spec. +3. The value of the property is the value of the "name" attribute of +4. The exclusion are `` with name `success`, `resultCode` and `info` of `` with the attribute `messagetype="response"`, in this case they should be omitted. + +According to ES6 standard, static (class-side) data properties and prototype data properties must be defined outside of the ClassBody declaration. + +Example: +```javascript +AddCommand.KEY_CMD_ID = 'cmdID'; +OnLanguageChange. KEY_LANGUAGE = 'language'; +OnLanguageChange.KEY_HMI_DISPLAY_LANGUAGE = 'hmiDisplayLanguage'; +``` + +For each `` the getter and setter methods should be defined in the class: + +1. The name of the getter is the `PascalCase` formatted value of the `"name"` attribute with the `get` prefix, for the setter the prefix should be `set`. +2. If the `` has the `"type"` attribute value as one of `Boolean`, `Float`, `Integer`, `String`: + * The getter should call and return the result of the `this.getParameter` method, where the single parameter is the value of the corresponding static property described above; + * The setter should call the `this.setParameter` method, where the first parameter is the value of the corresponding static property described above, the second is the value passed into setter; + * The setter should return `this` instance to support the chaining. +3. If the `` has the `"type"` attribute value as the one of `` or `` name: + * The getter should call and return the result of the `this.getObject` method, where the first parameter is the corresponding Struct or Enum class, the second is the value of the corresponding static property described above; + * The setter should validate the received value by calling the `this.validateType` method, where the fist parameter is the Struct or Enum class corresponding to the `"type"` attribute value of ``, the second is the value itself; + * The setter should call the `this.setParameter` method, where the first parameter is the value of the corresponding static property described above, the second is the value passed into setter; + * The setter should return `this` instance to support the chaining. +4. The exclusion are `` with name `success`, `resultCode` and `info` of `` with the attribute `messagetype="response"`, in this case they should be omitted. + +The setter should have the next JSDoc comment: +```javascript +/** + * @param {[param_type]} [value_name] [description] + * @return {[struct_name]} + */ +``` +Where `[param_type]` is the `"type"` attribute, `[value_name]` is the lowercase last part of the `"name"` attribute, `[description]` is `` of the current ``, if exists, and `[struct_name]` is the `"name"` attribute of the current Struct. + +The getter should have the next JSDoc comment: +```javascript +/** + * @return {[param_type]} + */ +``` +Where `[param_type]` is the `"type"` attribute of the current ``. + +Example: +```javascript +/** + * @param {Number} cmdid unique ID of the command to add. + * @return {AddCommand} + */ +setCmdID(id) { + this.setParameter(AddCommand.KEY_CMD_ID, id); + return this; +} + +/** + * @return {Number} + */ +getCmdID() { + return this.getParameter(AddCommand.KEY_CMD_ID); +} + +/** + * @param {MenuParams} params Optional sub value containing menu parameters + * @return {AddCommand} + */ +setMenuParams(menuParams) { + this.validateType(MenuParams, menuParams); + this.setParameter(AddCommand.KEY_MENU_PARAMS, menuParams); + return this; +} + +/** + * @return {MenuParams} + */ +getMenuParams() { + return this.getObject(MenuParams, AddCommand.KEY_MENU_PARAMS); +} + +/** + * @param {Language} language Current display language + * @return {OnLanguageChange} + */ +setHmiDisplayLanguage(language) { + this.validateType(Language, language); + this.setParameter(OnLanguageChange.KEY_HMI_DISPLAY_LANGUAGE, language); + return this; +} + +/** + * @return {Language} + */ +getHmiDisplayLanguage() { + return this.getObject(Language, OnLanguageChange.KEY_HMI_DISPLAY_LANGUAGE); +} +``` + +After the static properties definition, the script should export the produced class. + +Example: +```javascript +export { AddCommand }; +``` + +### Below are full examples for Request, Response and Notification. +#### Request Example: + +XML: +```xml + + + Adds a command to the in application menu. + Either menuParams or vrCommands must be provided. + + + + unique ID of the command to add. + + + + Optional sub value containing menu parameters + + + + + An array of strings to be used as VR synonyms for this command. + If this array is provided, it may not be empty. + + + + + + Image struct determining whether static or dynamic icon. + If omitted on supported displays, no (or the default if applicable) icon shall be displayed. + + + + +``` + +The Output: +```javascript +/* +* Copyright (c) 2019, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '_path_to_base_classes_/RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { Image } from '../structs/Image.js'; +import { MenuParams } from '../structs/MenuParams.js'; + +/** + * Adds a command to the in application menu. Either menuParams or vrCommands must be provided. + */ +class AddCommand extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.AddCommand); + } + + /** + * @param {Number} id - unique ID of the command to add. + * @return {AddCommand} + */ + setCmdID (id) { + this.setParameter(AddCommand.KEY_CMD_ID, id); + return this; + } + + /** + * @return {Number} + */ + getCmdID () { + return this.getParameter(AddCommand.KEY_CMD_ID); + } + + /** + * @param {MenuParams} params - Optional sub value containing menu parameters + * @return {AddCommand} + */ + setMenuParams (params) { + this.validateType(MenuParams, params); + this.setParameter(AddCommand.KEY_MENU_PARAMS, params); + return this; + } + + /** + * @return {MenuParams} + */ + getMenuParams () { + return this.getObject(MenuParams, AddCommand.KEY_MENU_PARAMS); + } + + /** + * @param {Array} commands - An array of strings to be used as VR synonyms for this command. If this array + * is provided, it may not be empty. + * @return {AddCommand} + */ + setVrCommands (commands) { + this.setParameter(AddCommand.KEY_VR_COMMANDS, commands); + return this; + } + + /** + * @return {Array} + */ + getVrCommands () { + return this.getParameter(AddCommand.KEY_VR_COMMANDS); + } + + /** + * @param {Image} icon - Image struct determining whether static or dynamic icon. If omitted on supported displays, + * no (or the default if applicable) icon shall be displayed. + * @return {AddCommand} + */ + setCmdIcon (icon) { + this.validateType(Image, icon); + this.setParameter(AddCommand.KEY_CMD_ICON, icon); + return this; + } + + /** + * @return {Image} + */ + getCmdIcon () { + return this.getObject(Image, AddCommand.KEY_CMD_ICON); + } +} + +AddCommand.KEY_CMD_ID = 'cmdID'; +AddCommand.KEY_MENU_PARAMS = 'menuParams'; +AddCommand.KEY_VR_COMMANDS = 'vrCommands'; +AddCommand.KEY_CMD_ICON = 'cmdIcon'; + +export { AddCommand }; +``` + +#### Response Example: + +> Please pay attention that no other parameters for this example except "info", "success" and "resultCode", thus they were omitted and only the constructor and other parameters are present) + +XML: +```xml + + + true if successful; false, if failed + + + + See Result + + + + + + + + + + + + + + + + + Provides additional human readable info regarding the result. + + + + + ID of the choice that was selected in response to PerformInteraction. + Only is valid if general result is "success:true". + + + + + + Manually entered text selection, e.g. through keyboard + Can be returned in lieu of choiceID, depending on trigger source + + + + + + See TriggerSource + Only is valid if resultCode is SUCCESS. + + + + +``` + +The Output: +```javascript +/* +* Copyright (c) 2019, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcResponse } from '_path_to_base_classes_/RpcResponse.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { TriggerSource } from '../enums/TriggerSource.js'; + +class PerformInteractionResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.PerformInteraction); + } + + /** + * @param {Number} id - ID of the choice that was selected in response to PerformInteraction. Only is valid if + * general result is "success:true". + * @return {PerformInteractionResponse} + */ + setChoiceID (id) { + this.setParameter(PerformInteractionResponse.KEY_CHOICE_ID, id); + return this; + } + + /** + * @return {Number} + */ + getChoiceID () { + return this.getParameter(PerformInteractionResponse.KEY_CHOICE_ID); + } + + /** + * @param {String} entry - Manually entered text selection, e.g. through keyboard Can be returned in lieu of + * choiceID, depending on trigger source + * @return {PerformInteractionResponse} + */ + setManualTextEntry (entry) { + this.setParameter(PerformInteractionResponse.KEY_MANUAL_TEXT_ENTRY, entry); + return this; + } + + /** + * @return {String} + */ + getManualTextEntry () { + return this.getParameter(PerformInteractionResponse.KEY_MANUAL_TEXT_ENTRY); + } + + /** + * @param {TriggerSource} source - See TriggerSource Only is valid if resultCode is SUCCESS. + * @return {PerformInteractionResponse} + */ + setTriggerSource (source) { + this.validateType(TriggerSource, source); + this.setParameter(PerformInteractionResponse.KEY_TRIGGER_SOURCE, source); + return this; + } + + /** + * @return {TriggerSource} + */ + getTriggerSource () { + return this.getObject(TriggerSource, PerformInteractionResponse.KEY_TRIGGER_SOURCE); + } +} + +PerformInteractionResponse.KEY_CHOICE_ID = 'choiceID'; +PerformInteractionResponse.KEY_MANUAL_TEXT_ENTRY = 'manualTextEntry'; +PerformInteractionResponse.KEY_TRIGGER_SOURCE = 'triggerSource'; + +export { PerformInteractionResponse }; +``` +#### Notification Example: +XML: +```xml + + + Current SDL voice engine (VR+TTS) language + + + Current display language + + +``` +The Output: +```javascript +/* +* Copyright (c) 2019, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcNotification } from '_path_to_base_classes_/RpcNotification.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { Language } from '../enums/Language.js'; + +class OnLanguageChange extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnLanguageChange); + } + + /** + * @param {Language} language - Current SDL voice engine (VR+TTS) language + * @return {OnLanguageChange} + */ + setLanguage (language) { + this.validateType(Language, language); + this.setParameter(OnLanguageChange.KEY_LANGUAGE, language); + return this; + } + + /** + * @return {Language} + */ + getLanguage () { + return this.getObject(Language, OnLanguageChange.KEY_LANGUAGE); + } + + /** + * @param {Language} language - Current display language + * @return {OnLanguageChange} + */ + setHmiDisplayLanguage (language) { + this.validateType(Language, language); + this.setParameter(OnLanguageChange.KEY_HMI_DISPLAY_LANGUAGE, language); + return this; + } + + /** + * @return {Language} + */ + getHmiDisplayLanguage () { + return this.getObject(Language, OnLanguageChange.KEY_HMI_DISPLAY_LANGUAGE); + } +} + +OnLanguageChange.KEY_LANGUAGE = 'language'; +OnLanguageChange.KEY_HMI_DISPLAY_LANGUAGE = 'hmiDisplayLanguage'; + +export { OnLanguageChange }; +``` + +# Custom mapping + +## Overview + +There are cases named `edge cases` when it is not possible to get the required info from XML or some manual additions are required in generated classes. For that purpose the generator includes the custom mapping file `mapping.json` that allows to add required customizations. + +## Structure + +The customization script contains the JSON object. Below is the schema: + +```json +{ + ["enums"|"structs"|"functions"]: { + [enum_name|struct_name|function_name]: { + [element_name|param_name]: { + "-methods": {}, + "methods": { + "method_title": [custom_method_title], + "key": [custom_key_name], + "description": [custom_description] + }, + "params": { + "key": [custom_key_name] + "value": [custom_value] + }, + }, + "params": [ + { + "key": [custom_param_name], + "value": [custom_param_value] + } + ], + "script": [path_to_custom_code] + } + } +} +``` + +Root keys in the structure are `"enums"`, `"structs"` and `"functions"`. The key on the next level is the corresponding name of required ``, `` or ``. On the next level, the name of `` or `` is expected. Also, at this level, it is possible to add any custom code into class from the file via the `script` key and to add custom params to class properties via an array from `params` key. See the detailed description below. + +The mapping object does not provide the possibility to create brand new ``, `` or ``, and their child elements in this way. The customization is allowed only for existing XML elements, unexisting names of elements and their child elements defined int the mapping object will be ignored. + +## Adding the custom code +As described above the custom code could be added via `script` key. The value of this key should be the path to the file. The code will be included as-is directly into the class, therefore only comments and method definitions are allowed in this file. + +Example: +```json +{ + "functions": { + "PutFileRequest": { + "script": "templates/scripts/PutFileRequest.js" + } + } +} +``` + +The content of the `templates/scripts/PutFileRequest.js` file is: +```javascript +// ------ Not part of the RPC spec itself ----- + +/** + * @param {Uint8Array} fileData + * @return {PutFile} + */ +setFileData(fileData) { + this.setBulkData(fileData); + return this; +} +/** + * @return {Uint8Array} + */ +getFileData() { + return this.getBulkData(); +} + +//----------------- END ----------------------- +``` +This code will be included into `PutFileRequest` class of the `messages/PutFileRequest.js` file as-is. + +## Adding custom parameters +As described above the custom code could be added via `params` key. The value of this key should be the array of objects. Each that object should include `key` and `value` properties for defining the name and the value of the new parameter. + +Following example demonstrates the object and the code that will be generated for Enums and Structs/Functions: +```json +{ + "key": "APP_ID_MAX_LENGTH", + "value": 10 +} +``` + +In Enums this will produce the new property in the static `_MAP` object +```javascript +_EnumClass_._MAP = Object.freeze({ + // ..., + 'APP_ID_MAX_LENGTH': 10, + // ... +}); +``` + +In Structs/Functions this will produce the new static property +```javascript +// ... +_StructClass_.APP_ID_MAX_LENGTH = 10; +// ... +``` +```javascript +// ... +_FunctionClass_.APP_ID_MAX_LENGTH = 10; +// ... +``` + +## Customization the `` of `` or the `` of ``/`` +In order of this customization it is possible to change the name and description of getter/setter methods and the name and value of corresponding static property. Additionally it is possible to remove getter/setter methods. + +### Changing the name and description of getter/setter methods +To change the name and description of getter/setter methods it needs to define `methods.method_title` value. + +Example: +```json +{ + "enums": { + "AudioType": { + "PCM": { + "methods": { + "method_title": "Wave", + "description": "Linear Wave!" + } + } + } + } +} +``` + +This will replace the `PCM` method name to `Wave` and `Linear PCM.` description to `Linear Wave!`, please pay attention the `_MAP` still has the `PCM` key. +```javascript + /* + * Linear Wave! + * @return {String} + */ + static get Wave () { + return AudioType._MAP.PCM; + } +``` + +### Changing the name and value of corresponding static property +To change the name of corresponding static property it needs to define `params.key` value. + +To change the value of corresponding static property it needs to define `params.value` value. + +Example: +```json +{ + "enums": { + "AudioType": { + "PCM": { + "methods": { + "key": "Wave" + }, + "params": { + "key": "Wave", + "value": "NEW_PCM" + } + } + } + } +} +``` + +The result will the following. Please pay attention that in case if the name of the static property was changed, you should also define the same `methods.key` value, otherwise the key will be unchanged in getter/setter methods. +```javascript + +class AudioType extends Enum { +// ... + /* + * Linear PCM. + * @return {String} + */ + static get PCM () { + return AudioType._MAP.Wave; // will be old `AudioType._MAP.PCM` if `methods.key` is not defined + } +// ... +} + +AudioType._MAP = Object.freeze({ + // ..., + 'Wave': "NEW_PCM", // old key/value PCM: "PCM" + // ... +}); +``` + +### Removing getter/setter methods +To remove getter/setter methods it needs to define `-methods` key, the value of this key doesn't matter. + +Example: +```json +{ + "enums": { + "AudioType": { + "PCM": { + "-methods": {} + } + } + } +} +``` + +This will remove `static get PCM` method from the class and only the `_MAP` key/value will be generated. diff --git a/generator/__init__.py b/generator/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/generator/generator.py b/generator/generator.py new file mode 100644 index 00000000..9d79e27e --- /dev/null +++ b/generator/generator.py @@ -0,0 +1,455 @@ +"""This is main runner of generator + +""" + +import logging +import re +import sys +from argparse import ArgumentParser +from collections import namedtuple +from datetime import date +from inspect import getfile +from itertools import groupby +from json import JSONDecodeError, loads +from os.path import basename +from pprint import pformat +from time import sleep + +from jinja2 import Environment, FileSystemLoader, TemplateNotFound, UndefinedError +from pathlib2 import Path + +ROOT = Path(__file__).absolute().parents[0] + +sys.path.append(ROOT.parents[0].joinpath('lib/rpc_spec/InterfaceParser').as_posix()) + +try: + from parsers.sdl_rpc_v2 import Parser + from parsers.rpc_base import ParseError + from model.interface import Interface + from transformers.generate_error import GenerateError + from transformers.common_producer import InterfaceProducerCommon + from transformers.enums_producer import EnumsProducer + from transformers.functions_producer import FunctionsProducer + from transformers.structs_producer import StructsProducer +except ModuleNotFoundError as message: + print('%s.\nprobably you did not initialize submodule', message) + sys.exit(1) + + +class Generator: + """ + This class contains only technical features, as follow: + - parsing command-line arguments, or evaluating required Paths interactively; + - calling parsers to get Model from xml; + - calling producers to transform initial Model to dict used in jinja2 templates + Not required to be covered by unit tests cause contains only technical features. + """ + + def __init__(self): + self.logger = logging.getLogger(self.__class__.__name__) + self._env = None + self.paths_named = namedtuple('paths_named', 'path_to_enum_class path_to_struct_class path_to_request_class ' + 'path_to_response_class path_to_notification_class enums_dir_name ' + 'structs_dir_name functions_dir_name rpc_creator') + + @property + def env(self): + """ + :return: jinja2 Environment + """ + return self._env + + @env.setter + def env(self, value): + """ + :param value: path with directory with templates + :return: jinja2 Environment + """ + if not Path(value).exists(): + self.logger.critical('Directory with templates not found %s', value) + sys.exit(1) + else: + self._env = Environment(loader=FileSystemLoader(value)) + + @property + def get_version(self): + """ + :return: current version of Generator + """ + return InterfaceProducerCommon.version + + def config_logging(self, verbose): + """ + Configure logging + :param verbose: boolean + """ + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + datefmt='%m-%d %H:%M')) + if verbose: + handler.setLevel(logging.DEBUG) + self.logger.setLevel(logging.DEBUG) + else: + handler.setLevel(logging.ERROR) + self.logger.setLevel(logging.ERROR) + logging.getLogger().handlers.clear() + root_logger = logging.getLogger() + root_logger.addHandler(handler) + + def evaluate_output_directory(self, output_directory): + """ + :param output_directory: path to output_directory + :return: validated path to output_directory + """ + if output_directory.startswith('/'): + path = Path(output_directory).absolute().resolve() + else: + path = ROOT.joinpath(output_directory).resolve() + if not path.exists(): + self.logger.warning('Directory not found: %s, trying to create it', path) + try: + path.mkdir(parents=True, exist_ok=True) + except OSError as message1: + self.logger.critical('Failed to create directory %s, %s', path.as_posix(), message1) + sys.exit(1) + return path + + def get_parser(self): + """ + Parsing command-line arguments, or evaluating required Paths interactively. + :return: an instance of argparse.ArgumentParser + """ + + if len(sys.argv) == 2 and sys.argv[1] in ('-v', '--version'): + print(self.get_version) + sys.exit(0) + + Paths = namedtuple('Paths', 'name path') + xml = Paths('source_xml', ROOT.parents[0].joinpath('lib/rpc_spec/MOBILE_API.xml')) + required_source = not xml.path.exists() + + out = Paths('output_directory', ROOT.parents[0].joinpath('lib/js/src/rpc')) + output_required = not out.path.exists() + + parser = ArgumentParser(description='Proxy Library RPC Generator') + parser.add_argument('-v', '--version', action='store_true', help='print the version and exit') + parser.add_argument('-xml', '--source-xml', '--input-file', required=required_source, + help='should point to MOBILE_API.xml') + parser.add_argument('-xsd', '--source-xsd', required=False) + parser.add_argument('-d', '--output-directory', required=output_required, + help='define the place where the generated output should be placed') + parser.add_argument('-t', '--templates-directory', nargs='?', default=ROOT.joinpath('templates').as_posix(), + help='path to directory with templates') + parser.add_argument('-r', '--regex-pattern', required=False, + help='only elements matched with defined regex pattern will be parsed and generated') + parser.add_argument('--verbose', action='store_true', help='display additional details like logs etc') + parser.add_argument('-e', '--enums', required=False, action='store_true', + help='only specified elements will be generated, if present') + parser.add_argument('-s', '--structs', required=False, action='store_true', + help='only specified elements will be generated, if present') + parser.add_argument('-m', '-f', '--functions', required=False, action='store_true', + help='only specified elements will be generated, if present') + parser.add_argument('-y', '--overwrite', action='store_true', + help='force overwriting of existing files in output directory, ignore confirmation message') + parser.add_argument('-n', '--skip', action='store_true', + help='skip overwriting of existing files in output directory, ignore confirmation message') + + args, unknown = parser.parse_known_args() + + if unknown: + self.logger.critical('found unknown arguments: %s', ' '.join(unknown)) + parser.print_help(sys.stderr) + sys.exit(1) + + if args.skip and args.overwrite: + self.logger.critical('please select only one option skip or overwrite') + sys.exit(1) + + if not args.enums and not args.structs and not args.functions: + args.enums = args.structs = args.functions = True + + for intermediate in (xml, out): + if not getattr(args, intermediate.name) and intermediate.path.exists(): + while True: + try: + confirm = input('Confirm default path {} for {} Y/Enter = yes, N = no' + .format(intermediate.path, intermediate.name)) + if confirm.lower() == 'y' or not confirm: + self.logger.warning('%s set to %s', intermediate.name, intermediate.path) + setattr(args, intermediate.name, intermediate.path.as_posix()) + sleep(0.05) + break + if confirm.lower() == 'n': + self.logger.warning('provide argument %s', intermediate.name) + sys.exit(1) + except KeyboardInterrupt: + print('\nThe user interrupted the execution of the program') + sys.exit(1) + + args.output_directory = self.evaluate_output_directory(args.output_directory) + + self.logger.info('parsed arguments:\n%s', pformat((vars(args)))) + return args + + def versions_compatibility_validating(self): + """version of generator script requires the same or lesser version of parser script. + if the parser script needs to fix a bug (and becomes, e.g. 1.0.1) and the generator script stays at 1.0.0. + As long as the generator script is the same or greater major version, it should be parsable. + This requires some level of backward compatibility. E.g. they have to be the same major version. + + """ + + regex = r'(\d+\.\d+).(\d)' + + parser_origin = Parser().get_version + parser_split = re.findall(regex, parser_origin).pop() + generator_split = re.findall(regex, self.get_version).pop() + + parser_major = float(parser_split[0]) + generator_major = float(generator_split[0]) + + if parser_major > generator_major: + self.logger.critical('Generator (%s) requires the same or lesser version of Parser (%s)', + self.get_version, parser_origin) + sys.exit(1) + + self.logger.info('Parser type: %s, version %s,\tGenerator version %s', + basename(getfile(Parser().__class__)), parser_origin, self.get_version) + + def get_paths(self, file_name=ROOT.joinpath('paths.ini')): + """ + :param file_name: path to file with Paths + :return: namedtuple with Paths to key elements + """ + data = {} + try: + with file_name.open('r') as file: + for line in file: + if line.startswith('#'): + self.logger.warning('commented property %s, which will be skipped', line.strip()) + continue + if re.match(r'^(\w+)\s?=\s?(.+)', line): + if len(line.split('=')) > 2: + self.logger.critical('can not evaluate value, too many separators %s', str(line)) + sys.exit(1) + name, var = line.partition('=')[::2] + if name.strip() in data: + self.logger.critical('duplicate key %s', name) + sys.exit(1) + data[name.strip().lower()] = var.strip() + except FileNotFoundError as message1: + self.logger.critical(message1) + sys.exit(1) + + missed = list(set(self.paths_named._fields) - set(data.keys())) + if missed: + self.logger.critical('in %s missed fields: %s ', file, str(missed)) + sys.exit(1) + + return self.paths_named(**data) + + def get_mappings(self, file_name=ROOT.joinpath('mapping.json')): + """ + The key name in *.json is equal to property named in jinja2 templates + :param file_name: path to file with manual mappings + :return: dictionary with custom manual mappings + """ + + try: + with file_name.open('r') as file: + intermediate = file.readlines() + return loads(''.join(intermediate)) + except (FileNotFoundError, JSONDecodeError) as message1: + self.logger.error(message1) + return {} + + def write_file(self, file_name, template, data): + """ + Calling producer/transformer instance to transform initial Model to dict used in jinja2 templates. + Applying transformed dict to jinja2 templates and writing to appropriate file + :param file_name: output js file + :param template: name of template + :param data: transformed moder ready for apply to Jinja2 template + """ + try: + render = self.env.get_template(template).render(data) + with file_name.open('w', encoding='utf-8') as file: + file.write(render) + except (TemplateNotFound, UndefinedError, AttributeError) as message1: + self.logger.error('skipping %s, %s', file_name.as_posix(), message1) + + def process(self, directory, skip, overwrite, items, transformer): + """ + Process each item from initial Model. According to provided arguments skipping, overriding or asking what to to. + :param directory: output directory for writing output files + :param skip: if file exist skip it + :param overwrite: if file exist overwrite it + :param items: elements initial Model + :param transformer: producer/transformer instance + """ + directory.mkdir(parents=True, exist_ok=True) + for item in items.values(): + data = transformer.transform(item) + if 'template' in data: + template = data['template'] + else: + template = type(item).__name__.lower() + '_template.js' + file = directory.joinpath(data['name'] + '.js') + self.process_common(skip, overwrite, file, template, data) + + def process_function_name(self, file, dir_name, skip, overwrite, functions, transformer, mappings): + """ + :param file: + :param dir_name: + :param skip: + :param overwrite: + :param functions: + :param transformer: + :param mappings: + :return: + """ + if dir_name.startswith('..'): + dir_name = dir_name[1:] + + creator = namedtuple('creator', 'function_name class_name type') + data = {'name': file.stem, 'imports': [], 'cases': [], 'year': date.today().year, } + + grouped = [{'name': k, 'type': [x for x in v]} for k, v in groupby(functions.values(), key=lambda x: x.name)] + + for item in grouped: + name = item['name'] + for func in item['type']: + kind = func.message_type.name.capitalize() + if kind == 'Response': + name += kind + key = name + kind + if key in mappings and 'name' in mappings[key]: + name = mappings[key]['name'] + data['imports'].append(transformer.imports(what=name, wherefrom='{}/{}.js'.format(dir_name, name))) + if kind != 'Response': + data['cases'].append(creator(name, name, kind.upper())) + elif kind == 'Response' and len(item['type']) == 1: + data['cases'].append(creator(item['name'], name, kind.upper())) + + self.process_common(skip, overwrite, file, file.stem + '_template.js', data) + + def process_common(self, skip, overwrite, file, template, data): + """ + :param skip: + :param overwrite: + :param file: + :param template: + :param data: + :return: + """ + if file.is_file(): + if skip: + self.logger.info('Skipping %s', file.name) + return + if overwrite: + self.logger.info('Overriding %s', file.name) + self.write_file(file, template, data) + else: + while True: + try: + confirm = input('File already exists {}. Overwrite? Y/Enter = yes, N = no\n' + .format(file.name)) + if confirm.lower() == 'y' or not confirm: + self.logger.info('Overriding %s', file.name) + self.write_file(file, template, data) + break + if confirm.lower() == 'n': + self.logger.info('Skipping %s', file.name) + break + except KeyboardInterrupt: + print('\nThe user interrupted the execution of the program') + sys.exit(1) + else: + self.logger.info('Writing new %s', file.name) + self.write_file(file, template, data) + + def filter_pattern(self, interface, pattern): + """ + :param interface: initial Model + :param pattern: regex-pattern from command-line arguments to filter element from initial Model + :return: initial Model + """ + names = tuple(interface.enums.keys()) + tuple(interface.structs.keys()) + + if pattern: + match = {i: {} for i in vars(interface).keys()} + match['params'] = interface.params + empty = True + for key, value in vars(interface).items(): + if key == 'params': + continue + for name, item in value.items(): + if re.match(pattern, item.name): + if hasattr(item, 'message_type'): + log = '{}/{} {} match with {}'.format( + key, item.name, item.message_type.name.title(), pattern) + else: + log = '{}/{} match with {}'.format(key, item.name, pattern) + self.logger.info(log) + if key in match: + match[key][name] = item + empty = False + if empty: + self.logger.warning('no one match with %s', pattern) + sys.exit(0) + return Interface(**match), names + return interface, names + + @staticmethod + def evaluate_instance_directory(dir_name): + """ + :param dir_name: property from paths.ini (ENUMS|STRUCTS|FUNCTIONS)_DIR_NAME + :return: substring after float dot + """ + pattern = re.search(r'^([./]*)(.+)', dir_name) + if pattern: + return pattern.group(2) + raise GenerateError('Can not evaluate directory {}'.format(dir_name)) + + def main(self): + """ + Entry point for parser and generator + :return: None + """ + args = self.get_parser() + self.config_logging(args.verbose) + self.env = args.templates_directory + + self.versions_compatibility_validating() + + paths = self.get_paths() + + try: + interface = Parser().parse(args.source_xml, args.source_xsd) + except ParseError as error1: + self.logger.error(error1) + sys.exit(1) + + filtered, names = self.filter_pattern(interface, args.regex_pattern) + + mappings = self.get_mappings() + + functions_transformer = FunctionsProducer(paths, names, mappings) + if args.enums and filtered.enums: + directory = args.output_directory.joinpath(self.evaluate_instance_directory(paths.enums_dir_name)) + self.process(directory, args.skip, args.overwrite, filtered.enums, + EnumsProducer(paths, mappings)) + if args.structs and filtered.structs: + directory = args.output_directory.joinpath(self.evaluate_instance_directory(paths.structs_dir_name)) + self.process(directory, args.skip, args.overwrite, filtered.structs, + StructsProducer(paths, names, mappings)) + if args.functions and filtered.functions: + directory = args.output_directory.joinpath(self.evaluate_instance_directory(paths.functions_dir_name)) + self.process(directory, args.skip, args.overwrite, filtered.functions, functions_transformer) + self.process_function_name(args.output_directory.joinpath(paths.rpc_creator), paths.functions_dir_name, + args.skip, args.overwrite, interface.functions, functions_transformer, + mappings.get('functions', {})) + + +if __name__ == '__main__': + Generator().main() diff --git a/generator/mapping.json b/generator/mapping.json new file mode 100644 index 00000000..2f928fea --- /dev/null +++ b/generator/mapping.json @@ -0,0 +1,79 @@ +{ + "structs": { + "Grid": { + "col": { + "methods": { + "method_title": "Column", + "key": "KEY_COLUMN" + }, + "params": { + "key": "KEY_COLUMN" + } + }, + "colspan": { + "methods": { + "method_title": "ColumnSpan", + "key": "KEY_COLUMN_SPAN" + }, + "params": { + "key": "KEY_COLUMN_SPAN" + } + }, + "rowspan": { + "methods": { + "method_title": "RowSpan", + "key": "KEY_ROW_SPAN" + }, + "params": { + "key": "KEY_ROW_SPAN" + } + }, + "levelspan": { + "methods": { + "method_title": "LevelSpan", + "key": "KEY_LEVEL_SPAN" + }, + "params": { + "key": "KEY_LEVEL_SPAN" + } + } + } + }, + "functions": { + "SetAppIconRequest": { + "syncFileName": { + "methods": { + "method_title": "FileName", + "key": "KEY_FILE_NAME" + }, + "params": { + "key": "KEY_FILE_NAME" + } + } + }, + "RegisterAppInterfaceRequest": { + "appID": { + "-methods": {} + }, + "params": [ + { + "key": "APP_ID_MAX_LENGTH", + "value": 10 + } + ], + "script": "templates/scripts/RegisterAppInterfaceRequest.js" + }, + "PutFileRequest": { + "syncFileName": { + "methods": { + "method_title": "FileName", + "key": "KEY_FILE_NAME" + }, + "params": { + "key": "KEY_FILE_NAME" + } + }, + "script": "templates/scripts/PutFileRequest.js" + } + } +} diff --git a/generator/paths.ini b/generator/paths.ini new file mode 100644 index 00000000..d16c3d9e --- /dev/null +++ b/generator/paths.ini @@ -0,0 +1,13 @@ +#sdl_javascript_suite/lib/js/util/ +PATH_TO_ENUM_CLASS = ../../util/Enum.js + +#sdl_javascript_suite/lib/js/rpc/ +PATH_TO_STRUCT_CLASS = ../RpcStruct.js +PATH_TO_REQUEST_CLASS = ../RpcRequest.js +PATH_TO_RESPONSE_CLASS = ../RpcResponse.js +PATH_TO_NOTIFICATION_CLASS = ../RpcNotification.js +ENUMS_DIR_NAME = ../enums +STRUCTS_DIR_NAME = ../structs +FUNCTIONS_DIR_NAME = ../messages + +RPC_CREATOR = RpcCreator.js \ No newline at end of file diff --git a/generator/requirements.txt b/generator/requirements.txt new file mode 100644 index 00000000..ffc507da --- /dev/null +++ b/generator/requirements.txt @@ -0,0 +1,5 @@ +xmlschema +Jinja2 +coverage +pathlib2 +pylint \ No newline at end of file diff --git a/generator/templates/RpcCreator_template.js b/generator/templates/RpcCreator_template.js new file mode 100644 index 00000000..0ad53233 --- /dev/null +++ b/generator/templates/RpcCreator_template.js @@ -0,0 +1,63 @@ +{% extends 'base_template.js' %} + +{%- block imports %} +// messages +{{-super()}} +// other +import { RpcType } from './enums/RpcType.js'; +import { FunctionID } from './enums/FunctionID.js'; +import { JsonRpcMarshaller } from './../util/JsonRpcMarshaller.js'; +import { BinaryFrameHeader } from './../protocol/BinaryFrameHeader.js'; +{% endblock -%} +{%- block body %} + /** + * Converts an SdlPacket to an RpcMessage + * @param {SdlPacket} sdlPacket + * @return {RpcMessage} + */ + static construct (sdlPacket) { + const payload = sdlPacket.getPayload(); + const binaryFrameHeader = BinaryFrameHeader.fromBinaryHeader(payload); + + let message; + const rpcType = binaryFrameHeader.getRpcType(); + const rpcName = RpcType.keyForValue(rpcType); + const correlationId = binaryFrameHeader.getCorrelationId(); + const functionId = binaryFrameHeader.getFunctionId(); + const functionName = FunctionID.keyForValue(functionId); + const bulkData = binaryFrameHeader.getBulkData(); + const jsonData = binaryFrameHeader.getJsonData(); + const params = { + parameters: JsonRpcMarshaller.unmarshall(jsonData), + }; + + switch (functionId) { + {%- for item in cases %} + case FunctionID.{{item.function_name}}: + if (rpcType === RpcType.{{item.type}}) { + message = new {{item.class_name}}(params); + }{% if item.type == 'REQUEST' %} else if (rpcType === RpcType.RESPONSE) { + message = new {{item.class_name}}Response(params); + } + {%- endif %} + break; + {%- endfor %} + default: + message = null; + } + + if (message === null || message === undefined) { // informs of missing classes + console.warn(`RpcCreator couldn't construct an RPC for the ${functionName} ${rpcName}`); + return null; + } + + if (rpcType === RpcType.REQUEST || rpcType === RpcType.RESPONSE) { + message.setCorrelationId(correlationId); + } + if (bulkData) { + message.setBulkData(bulkData); + } + + return message; + } +{% endblock -%} \ No newline at end of file diff --git a/generator/templates/base_struct_function.js b/generator/templates/base_struct_function.js new file mode 100644 index 00000000..6eaaa4f7 --- /dev/null +++ b/generator/templates/base_struct_function.js @@ -0,0 +1,74 @@ +{% extends 'base_template.js' %} + +{% block typedef %} +{%- if description is defined or deprecated is defined %} +/** + {% if description is defined -%} + {% for d in description -%} + * {{d}} + {% endfor -%} + {% endif -%} + {% if deprecated is defined -%} + * @deprecated + {% endif -%} + */ +{%- endif %} +{%- endblock %} +{% block body %} + /** + {% if deprecated is defined -%} + * @deprecated + {% endif -%} + * @constructor + */ +{%- block constructor %} +{% endblock -%} + {%- if script is defined %} +{{script|indent(4,True)}} +{% endif -%} + {% for method in methods %} + {% set len = method.type|length + method.param_name|length + 13 -%} + /** + {% if deprecated is defined -%} + * @deprecated + {% endif -%} + {% if not method.description -%} + * @param {{'%s%s%s %s'|format('{', method.type, '}', method.param_name)}} + {% else -%} + * {% for d in method.description -%} + {% if loop.index == 1 -%} + @param {{'%s%s%s %s - %s'|format('{', method.type, '}', method.param_name, d)}} + {% else -%} + * {{d|indent(len,True)}} + {% endif -%} {% endfor -%} + {% endif -%} + * @return {{'%s%s%s'|format('{', name, '}')}} + */ + set{{method.method_title}} ({{method.param_name}}) { + {%- if method.external %} + this.validateType({{method.external}}, {{method.param_name}}{{ ', true' if '[]' in method.type }}); + {%- endif %} + this.setParameter({{name}}.{{method.key}}, {{method.param_name}}); + return this; + } + + /** + {% if deprecated is defined -%} + * @deprecated + {% endif -%} + * @return {{'%s%s%s'|format('{', method.type, '}')}} + */ + get{{method.method_title}} () { + {%- if method.external %} + return this.getObject({{method.external}}, {{name}}.{{method.key}}); + {%- else %} + return this.getParameter({{name}}.{{method.key}}); + {%- endif %} + } +{% endfor -%} +{%- endblock %} +{% block properties -%} +{% for param in params %} +{{name}}.{{param.key}} = {{param.value}}; +{%- endfor %} +{%- endblock %} \ No newline at end of file diff --git a/generator/templates/base_template.js b/generator/templates/base_template.js new file mode 100644 index 00000000..a690ff56 --- /dev/null +++ b/generator/templates/base_template.js @@ -0,0 +1,45 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) {{year}}, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ +{% block imports -%} +{% for _import in imports %} +import {{'%s %s %s'|format('{', _import.what, '}')}} from '{{_import.wherefrom}}'; +{%- endfor %} +{% endblock -%} +{% block typedef -%}{%- endblock %} +class {{name}}{{' extends '+ extend if extend}} { +{%- block body %} +{% endblock -%} +} +{% block properties -%}{%- endblock %} + +export {{'%s %s %s'|format('{', name, '}')}}; diff --git a/generator/templates/enum_template.js b/generator/templates/enum_template.js new file mode 100644 index 00000000..948c1831 --- /dev/null +++ b/generator/templates/enum_template.js @@ -0,0 +1,68 @@ +{% extends 'base_template.js' %} +{% block typedef %} +/** + {% if description is defined -%} + {% for d in description -%} + * {{d}} + {% endfor -%} + {% endif -%} + {% if deprecated is defined -%} + * @deprecated + {% endif -%} + * @typedef {{'%s%s%s %s'|format('{', extend, '}', name)}} + * @property {Object} _MAP + */ +{%- endblock %} +{% block body %} + /** + {%- if deprecated is defined %} + * @deprecated + {%- endif %} + * @constructor + */ + constructor () { + super(); + } + {%- for method in methods %} + + /** + {%- if deprecated is defined %} + * @deprecated + {%- endif %} + {%- for d in method.description %} + * {{d}} + {%- endfor %} + * @return {{'%s%s%s'|format('{', method.type, '}')}} + */ + static get {{method.method_title}} () { + return {{name}}._MAP.{{method.method_title}}; + } + {%- endfor %} +{% if script is defined %} +{{script|indent(4,True)}} +{% endif %} + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return {{name}}._valueForKey(key, {{name}}._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return {{name}}._keyForValue(value, {{name}}._MAP); + } +{% endblock %} +{% block properties %} +{{name}}._MAP = Object.freeze({ +{%- for param in params %} + '{{param.key}}': {{param.value}}, +{%- endfor %} +}); +{%- endblock %} \ No newline at end of file diff --git a/generator/templates/function_template.js b/generator/templates/function_template.js new file mode 100644 index 00000000..549751c6 --- /dev/null +++ b/generator/templates/function_template.js @@ -0,0 +1,7 @@ +{% extends 'base_struct_function.js' %} +{% block constructor %} + constructor (store) { + super(store); + this.setFunctionName(FunctionID.{{ func }}); + } +{% endblock %} \ No newline at end of file diff --git a/generator/templates/scripts/PutFileRequest.js b/generator/templates/scripts/PutFileRequest.js new file mode 100644 index 00000000..7a3a53a9 --- /dev/null +++ b/generator/templates/scripts/PutFileRequest.js @@ -0,0 +1,18 @@ +// ------ Not part of the RPC spec itself ----- + +/** + * @param {Uint8Array} fileData + * @return {PutFile} + */ +setFileData (fileData) { + this.setBulkData(fileData); + return this; +} +/** + * @return {Uint8Array} + */ +getFileData () { + return this.getBulkData(); +} + +// ----------------- END ----------------------- \ No newline at end of file diff --git a/generator/templates/scripts/RegisterAppInterfaceRequest.js b/generator/templates/scripts/RegisterAppInterfaceRequest.js new file mode 100644 index 00000000..bfd44e71 --- /dev/null +++ b/generator/templates/scripts/RegisterAppInterfaceRequest.js @@ -0,0 +1,49 @@ +/** + * @param {String} fullAppId + * @return {RegisterAppInterface} + */ +setFullAppId (fullAppId) { + this.validateType(String, fullAppId); + + if (fullAppId !== null) { + fullAppId = fullAppId.toLowerCase(); + this.setParameter(RegisterAppInterface.KEY_FULL_APP_ID, fullAppId); + let appID; + if (fullAppId.length <= RegisterAppInterface.APP_ID_MAX_LENGTH) { + appID = fullAppId; + } else { + appID = fullAppId.replace('-', '').substring(0, RegisterAppInterface.APP_ID_MAX_LENGTH); + } + this._setAppId(appID); + } else { + this.setParameter(RegisterAppInterface.KEY_FULL_APP_ID, null); + } + + return this; +} + +/** + * @return {String} the app id + */ +getFullAppId () { + return this.getParameter(RegisterAppInterface.KEY_FULL_APP_ID); +} + +/** + * @param {String} appId - This method should not be accessed directly by developers. Only set the full ID and this + * param will be set. + * @return {RegisterAppInterface} + */ +_setAppId (appId) { + this.validateType(String, appId); + + this.setParameter(RegisterAppInterface.KEY_APP_ID, appId); + return this; +} + +/** + * @return {String} the app id + */ +getAppId () { + return this.getParameter(RegisterAppInterface.KEY_APP_ID); +} \ No newline at end of file diff --git a/generator/templates/struct_template.js b/generator/templates/struct_template.js new file mode 100644 index 00000000..d8027553 --- /dev/null +++ b/generator/templates/struct_template.js @@ -0,0 +1,6 @@ +{% extends 'base_struct_function.js' %} +{% block constructor %} + constructor (parameters) { + super(parameters); + } +{% endblock %} diff --git a/generator/test/__init__.py b/generator/test/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/generator/test/runner.py b/generator/test/runner.py new file mode 100644 index 00000000..c2b0ebab --- /dev/null +++ b/generator/test/runner.py @@ -0,0 +1,41 @@ +"""Main entry point to run all tests + +""" + +import sys +from pathlib import Path +from unittest import TestLoader, TestSuite, TextTestRunner + +PATH = Path(__file__).absolute() + +sys.path.append(PATH.parents[2].joinpath('lib/rpc_spec/InterfaceParser').as_posix()) +sys.path.append(PATH.parents[1].as_posix()) + +try: + from test_enums import TestEnumsProducer + from test_functions import TestFunctionsProducer + from test_structs import TestStructsProducer + from test_code_format_and_quality import CodeFormatAndQuality +except ModuleNotFoundError as message: + print('{}.\nProbably you did not initialize submodule'.format(message)) + sys.exit(1) + + +def main(): + """ + Main entry point to run all tests + """ + suite = TestSuite() + + suite.addTests(TestLoader().loadTestsFromTestCase(TestFunctionsProducer)) + suite.addTests(TestLoader().loadTestsFromTestCase(TestEnumsProducer)) + suite.addTests(TestLoader().loadTestsFromTestCase(TestStructsProducer)) + suite.addTests(TestLoader().loadTestsFromTestCase(CodeFormatAndQuality)) + + runner = TextTestRunner(verbosity=2) + test_result = runner.run(suite) + print(test_result) + + +if __name__ == '__main__': + main() diff --git a/generator/test/test_code_format_and_quality.py b/generator/test/test_code_format_and_quality.py new file mode 100755 index 00000000..45b12ca5 --- /dev/null +++ b/generator/test/test_code_format_and_quality.py @@ -0,0 +1,36 @@ +"""Interface model unit test + +""" + +import unittest +from os import walk +from os.path import join +from pathlib import Path + +from pylint.lint import Run + + +class CodeFormatAndQuality(unittest.TestCase): + MINIMUM_SCORE = 9 + + def setUp(self): + """Searching for all python files to be checked + + """ + self.list_of_files = [] + for (directory, _, filenames) in walk(Path(__file__).absolute().parents[1].as_posix()): + self.list_of_files += [join(directory, file) for file in filenames + if file.endswith('.py') and not file.startswith('test')] + self.list_of_files.append('--max-line-length=120') + + def test_check(self): + """Performing checks by PyLint + + """ + results = Run(self.list_of_files, do_exit=False) + score = results.linter.stats['global_note'] + self.assertGreaterEqual(score, self.MINIMUM_SCORE) + + +if __name__ == "__main__": + unittest.main() diff --git a/generator/test/test_enums.py b/generator/test/test_enums.py new file mode 100644 index 00000000..05106809 --- /dev/null +++ b/generator/test/test_enums.py @@ -0,0 +1,61 @@ +from collections import namedtuple +from datetime import date +from unittest import TestCase + +from model.enum import Enum +from model.enum_element import EnumElement +from transformers.enums_producer import EnumsProducer + + +class TestEnumsProducer(TestCase): + def setUp(self): + self.maxDiff = None + Prop = namedtuple('Prop', 'enums_dir_name structs_dir_name path_to_enum_class') + paths = Prop(enums_dir_name='../enums', + structs_dir_name='../structs', + path_to_enum_class='../../util/Enum.js') + self.producer = EnumsProducer(paths) + + def test_FunctionID(self): + item = Enum(name='FunctionID', elements={ + 'RESERVED': EnumElement(name='RESERVED', value=0), + 'RegisterAppInterfaceID': EnumElement(name='RegisterAppInterfaceID', hex_value=1), + 'PerformAudioPassThruID': EnumElement(name='PerformAudioPassThruID', hex_value=10) + }) + expected = { + 'name': 'FunctionID', + 'imports': {self.producer.imports(what='Enum', wherefrom='../../util/Enum.js')}, + 'methods': [self.producer.methods(method_title='RESERVED', + description=[], type='Number'), + self.producer.methods(method_title='RegisterAppInterface', + description=[], type='Number'), + self.producer.methods(method_title='PerformAudioPassThru', + description=[], type='Number')], + 'params': [self.producer.params(key='RESERVED', value=0), + self.producer.params(key='RegisterAppInterface', value='0x01'), + self.producer.params(key='PerformAudioPassThru', value='0x10')], + 'extend': 'Enum' + } + result = self.producer.transform(item) + self.assertEqual(expected['name'], result['name']) + self.assertListEqual(sorted(expected['imports']), sorted(result['imports'])) + self.assertListEqual(sorted(expected['methods']), sorted(result['methods'])) + self.assertListEqual(sorted(expected['params']), sorted(result['params'])) + self.assertEqual(expected['extend'], result['extend']) + + def test_Result(self): + item = Enum(name='Result', elements={ + 'SUCCESS': EnumElement(name='SUCCESS') + }) + expected = { + 'year': date.today().year, + 'name': 'Result', + 'file_name': 'Result', + 'imports': {self.producer.imports(what='Enum', wherefrom='../../util/Enum.js')}, + 'methods': tuple([self.producer.methods(method_title='SUCCESS', + description=[], type='String')]), + 'params': tuple([self.producer.params(key='SUCCESS', value="'SUCCESS'")]), + 'extend': 'Enum' + } + result = self.producer.transform(item) + self.assertEqual(expected, result) diff --git a/generator/test/test_functions.py b/generator/test/test_functions.py new file mode 100644 index 00000000..eaa1ffaf --- /dev/null +++ b/generator/test/test_functions.py @@ -0,0 +1,261 @@ +from collections import namedtuple +from unittest import TestCase + +from model.array import Array +from model.boolean import Boolean +from model.enum import Enum +from model.enum_element import EnumElement +from model.function import Function +from model.integer import Integer +from model.param import Param +from model.string import String +from model.struct import Struct +from transformers.functions_producer import FunctionsProducer + + +class TestFunctionsProducer(TestCase): + def setUp(self): + self.maxDiff = None + Prop = namedtuple('Prop', + 'functions_dir_name enums_dir_name structs_dir_name path_to_request_class ' + 'path_to_response_class path_to_notification_class') + paths = Prop(functions_dir_name='../messages', + enums_dir_name='../enums', + structs_dir_name='../structs', + path_to_request_class='../RpcRequest.js', + path_to_response_class='../RpcResponse.js', + path_to_notification_class='../RpcNotification.js') + + mapping = {"functions": { + "RegisterAppInterfaceRequest": { + "syncMsgVersion": { + "methods": { + "method_title": "SdlMsgVersion", + "external": "SdlMsgVersion", + "key": "KEY_SDL_MSG_VERSION", + "type": "SdlMsgVersion" + }, + "params": { + "key": "KEY_SDL_MSG_VERSION" + } + }, + "params": [ + { + "key": "APP_ID_MAX_LENGTH", + "value": 10 + } + ] + }, + "RegisterAppInterfaceResponse": { + "script": "templates/scripts/notExist.js" + }, + "PutFileRequest": { + "script": "templates/scripts/PutFileRequest.js" + }}} + + names = ('FileType', 'Language', 'SyncMsgVersion', 'TemplateColorScheme', 'TTSChunk', 'Choice') + self.producer = FunctionsProducer(paths, names, mapping) + + def test_RegisterAppInterfaceRequest(self): + item = Function(name='RegisterAppInterface', function_id=Enum(name='RegisterAppInterfaceID'), + message_type=EnumElement(name='request'), params= + { + 'syncMsgVersion': Param(name='syncMsgVersion', param_type= + Struct(name='SyncMsgVersion', description=['Specifies the'], members={ + 'majorVersion': Param(name='majorVersion', param_type=Integer()) + }), description=['See SyncMsgVersion']), + 'fullAppID': Param(name='fullAppID', description=['ID used'], param_type=String()), + 'dayColorScheme': Param(name='dayColorScheme', param_type= + Struct(name='TemplateColorScheme', description= + ['\n A color scheme for all display layout templates.\n '])), + 'ttsName': Param(name='ttsName', description=['\n TTS string for'], param_type= + Array(element_type=Struct(name='TTSChunk', description=['A TTS chunk']))) + }) + expected = { + 'name': 'RegisterAppInterface', + 'imports': {self.producer.imports(what='SdlMsgVersion', wherefrom='../structs/SdlMsgVersion.js'), + self.producer.imports(what='TemplateColorScheme', + wherefrom='../structs/TemplateColorScheme.js'), + self.producer.imports(what='TTSChunk', wherefrom='../structs/TTSChunk.js'), + self.producer.imports(what='RpcRequest', wherefrom='../RpcRequest.js'), + self.producer.imports(what='FunctionID', wherefrom='../enums/FunctionID.js')}, + 'methods': [self.producer.methods(key='KEY_SDL_MSG_VERSION', + method_title='SdlMsgVersion', external='SdlMsgVersion', + description=['See SyncMsgVersion'], param_name='version', + type='SdlMsgVersion'), + self.producer.methods(key='KEY_FULL_APP_ID', method_title='FullAppID', + external=None, description=['ID used'], param_name='id', type='String'), + self.producer.methods(key='KEY_DAY_COLOR_SCHEME', param_name='scheme', + method_title='DayColorScheme', external='TemplateColorScheme', + description=['A color scheme for all display layout templates.'], + type='TemplateColorScheme'), + self.producer.methods(key='KEY_TTS_NAME', param_name='name', + method_title='TtsName', external='TTSChunk', + description=['TTS string for'], type='TTSChunk[]')], + 'params': [self.producer.params(key='APP_ID_MAX_LENGTH', value=10), + self.producer.params(key='KEY_SDL_MSG_VERSION', value="'syncMsgVersion'"), + self.producer.params(key='KEY_FULL_APP_ID', value="'fullAppID'"), + self.producer.params(key='KEY_DAY_COLOR_SCHEME', value="'dayColorScheme'"), + self.producer.params(key='KEY_TTS_NAME', value="'ttsName'")], + 'script': self.producer.get_file_content('templates/scripts/fullAppID.js'), + 'func': 'RegisterAppInterface', + 'extend': 'RpcRequest' + } + result = self.producer.transform(item) + self.assertEqual(expected['name'], result['name']) + self.assertListEqual(sorted(expected['imports']), sorted(result['imports'])) + self.assertListEqual(sorted(expected['methods']), sorted(result['methods'])) + self.assertListEqual(sorted(expected['params']), sorted(result['params'])) + self.assertEqual(expected['func'], result['func']) + self.assertEqual(expected['extend'], result['extend']) + + def test_RegisterAppInterfaceResponse(self): + item = Function(name='RegisterAppInterface', function_id=Enum(name='RegisterAppInterfaceID'), + description=['The response '], + message_type=EnumElement(name='response'), params= + { + 'success': Param(name='success', param_type=Boolean(), description=[' true if ']), + 'language': Param(name='language', param_type= + Enum(name='Language', elements={ + 'EN-US': EnumElement(name='EN-US', description=['English - US']) + }), description=['The currently']), + 'supportedDiagModes': Param(name='supportedDiagModes', param_type= + Array(element_type=Integer()), description=['\n Specifies the'], ) + }) + expected = { + 'name': 'RegisterAppInterfaceResponse', + 'imports': {self.producer.imports(what='Language', wherefrom='../enums/Language.js'), + self.producer.imports(what='RpcResponse', wherefrom='../RpcResponse.js'), + self.producer.imports(what='FunctionID', wherefrom='../enums/FunctionID.js')}, + 'methods': [self.producer.methods(key='KEY_LANGUAGE', + method_title='Language', external='Language', + description=['The currently'], param_name='language', + type='Language'), + self.producer.methods(key='KEY_SUPPORTED_DIAG_MODES', + method_title='SupportedDiagModes', external=None, + description=['Specifies the'], param_name='modes', + type='Number[]')], + 'params': [self.producer.params(key='KEY_LANGUAGE', value="'language'"), + self.producer.params(key='KEY_SUPPORTED_DIAG_MODES', value="'supportedDiagModes'")], + 'description': ['The response'], + 'func': 'RegisterAppInterface', + 'extend': 'RpcResponse' + } + result = self.producer.transform(item) + self.assertEqual(expected['name'], result['name']) + self.assertListEqual(sorted(expected['imports']), sorted(result['imports'])) + self.assertListEqual(sorted(expected['methods']), sorted(result['methods'])) + self.assertListEqual(sorted(expected['params']), sorted(result['params'])) + self.assertEqual(expected['description'], result['description']) + self.assertEqual(expected['func'], result['func']) + self.assertEqual(expected['extend'], result['extend']) + + def test_UnregisterAppInterfaceRequest(self): + item = Function(name='UnregisterAppInterface', function_id=Enum(name='UnregisterAppInterfaceID'), + message_type=EnumElement(name='request'), params={}) + expected = { + 'name': 'UnregisterAppInterface', + 'imports': {self.producer.imports(what='RpcRequest', wherefrom='../RpcRequest.js'), + self.producer.imports(what='FunctionID', wherefrom='../enums/FunctionID.js')}, + 'func': 'UnregisterAppInterface', + 'extend': 'RpcRequest' + } + result = self.producer.transform(item) + self.assertEqual(expected['name'], result['name']) + self.assertListEqual(sorted(expected['imports']), sorted(result['imports'])) + self.assertEqual(expected['func'], result['func']) + self.assertEqual(expected['extend'], result['extend']) + + def test_PutFileRequest(self): + item = Function(name='PutFile', function_id=Enum(name='PutFileID'), description=['\n Used to'], + message_type=EnumElement(name='request'), params= + { + 'fileType': Param(name='fileType', param_type= + Enum(name='FileType', description=['Enumeration listing'], elements={ + 'AUDIO_MP3': EnumElement(name='AUDIO_MP3') + }), description=['Selected file type.']) + }) + expected = { + 'name': 'PutFile', + 'imports': {self.producer.imports(what='FileType', wherefrom='../enums/FileType.js'), + self.producer.imports(what='RpcRequest', wherefrom='../RpcRequest.js'), + self.producer.imports(what='FunctionID', wherefrom='../enums/FunctionID.js')}, + 'methods': [self.producer.methods(key='KEY_FILE_TYPE', + method_title='FileType', external='FileType', + description=['Selected file type.'], param_name='type', + type='FileType')], + 'params': [self.producer.params(key='KEY_FILE_TYPE', value="'fileType'")], + 'description': ['Used to'], + 'script': self.producer.get_file_content('templates/scripts/PutFileRequest.js'), + 'func': 'PutFile', + 'extend': 'RpcRequest' + } + result = self.producer.transform(item) + self.assertEqual(expected['name'], result['name']) + self.assertListEqual(sorted(expected['imports']), sorted(result['imports'])) + self.assertListEqual(sorted(expected['methods']), sorted(result['methods'])) + self.assertListEqual(sorted(expected['params']), sorted(result['params'])) + self.assertEqual(expected['description'], result['description']) + self.assertSequenceEqual(expected['script'], result['script']) + self.assertEqual(expected['func'], result['func']) + self.assertEqual(expected['extend'], result['extend']) + + def test_OnEncodedSyncPDataNotification(self): + item = Function(name='OnEncodedSyncPData', function_id=Enum(name='OnEncodedSyncPDataID'), + description=['\n Callback including \n'], + message_type=EnumElement(name='notification'), params= + { + 'URL': Param(name='URL', param_type=String(), description=['\n If ']) + }) + expected = { + 'name': 'OnEncodedSyncPData', + 'imports': {self.producer.imports(what='RpcNotification', wherefrom='../RpcNotification.js'), + self.producer.imports(what='FunctionID', wherefrom='../enums/FunctionID.js')}, + 'methods': [self.producer.methods(key='KEY_URL', + method_title='URL', external=None, + description=['If'], param_name='url', + type='String')], + 'params': [self.producer.params(key='KEY_URL', value="'URL'")], + 'description': ['Callback including'], + 'func': 'OnEncodedSyncPData', + 'extend': 'RpcNotification' + } + result = self.producer.transform(item) + self.assertEqual(expected['name'], result['name']) + self.assertListEqual(sorted(expected['imports']), sorted(result['imports'])) + self.assertListEqual(sorted(expected['methods']), sorted(result['methods'])) + self.assertListEqual(sorted(expected['params']), sorted(result['params'])) + self.assertEqual(expected['description'], result['description']) + self.assertEqual(expected['func'], result['func']) + self.assertEqual(expected['extend'], result['extend']) + + def test_CreateInteractionChoiceSetRequest(self): + item = Function(name='CreateInteractionChoiceSet', function_id=Enum(name='CreateInteractionChoiceSetID'), + description=['creates interaction'], + message_type=EnumElement(name='request'), params= + { + 'choiceSet': Param(name='choiceSet', param_type= + Array(element_type=Struct(name='Choice', description=['A choice is an option given to ']))) + }) + expected = { + 'name': 'CreateInteractionChoiceSet', + 'imports': {self.producer.imports(what='Choice', wherefrom='../structs/Choice.js'), + self.producer.imports(what='RpcRequest', wherefrom='../RpcRequest.js'), + self.producer.imports(what='FunctionID', wherefrom='../enums/FunctionID.js')}, + 'methods': [self.producer.methods(key='KEY_CHOICE_SET', + method_title='ChoiceSet', external='Choice', + description=['A choice is an option given to'], param_name='set', + type='Choice[]')], + 'params': [self.producer.params(key='KEY_CHOICE_SET', value="'choiceSet'")], + 'description': ['creates interaction'], + 'func': 'CreateInteractionChoiceSet', + 'extend': 'RpcRequest' + } + result = self.producer.transform(item) + self.assertEqual(expected['name'], result['name']) + self.assertListEqual(sorted(expected['imports']), sorted(result['imports'])) + self.assertListEqual(sorted(expected['methods']), sorted(result['methods'])) + self.assertListEqual(sorted(expected['params']), sorted(result['params'])) + self.assertEqual(expected['description'], result['description']) + self.assertEqual(expected['func'], result['func']) + self.assertEqual(expected['extend'], result['extend']) diff --git a/generator/test/test_structs.py b/generator/test/test_structs.py new file mode 100644 index 00000000..c5110a29 --- /dev/null +++ b/generator/test/test_structs.py @@ -0,0 +1,37 @@ +from collections import namedtuple +from datetime import date +from unittest import TestCase + +from model.param import Param +from model.struct import Struct +from transformers.structs_producer import StructsProducer + + +class TestStructsProducer(TestCase): + def setUp(self): + self.maxDiff = None + Prop = namedtuple('Prop', 'structs_dir_name enums_dir_name path_to_struct_class') + paths = Prop(enums_dir_name='../enums', + structs_dir_name='../structs', + path_to_struct_class='../RpcStruct.js') + + self.producer = StructsProducer(paths, ['Image'], {}) + + def test_SoftButton(self): + item = Struct(name='SoftButton', members={ + 'image': Param(name='image', param_type=Struct(name='Image'), description=['Optional image']), + }) + expected = { + 'year': date.today().year, + 'name': 'SoftButton', + 'file_name': 'SoftButton', + 'imports': {self.producer.imports(what='Image', wherefrom='./Image.js'), + self.producer.imports(what='RpcStruct', wherefrom='../RpcStruct.js')}, + 'methods': tuple([self.producer.methods(description=['Optional image'], external='Image', + key='KEY_IMAGE', method_title='Image', + param_name='image', type='Image')]), + 'params': tuple([self.producer.params(key='KEY_IMAGE', value="'image'")]), + 'extend': 'RpcStruct' + } + result = self.producer.transform(item) + self.assertEqual(expected, result) diff --git a/generator/transformers/__init__.py b/generator/transformers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/generator/transformers/common_producer.py b/generator/transformers/common_producer.py new file mode 100644 index 00000000..a894e68e --- /dev/null +++ b/generator/transformers/common_producer.py @@ -0,0 +1,318 @@ +""" +Common transformation +""" + +import logging +import re +import textwrap +from abc import ABC +from collections import namedtuple, OrderedDict +from datetime import date +from pathlib import Path + +from model.array import Array +from model.enum import Enum +from model.float import Float +from model.function import Function +from model.integer import Integer +from model.struct import Struct +from transformers.generate_error import GenerateError + + +class InterfaceProducerCommon(ABC): + """ + Common transformation + """ + version = '1.0.0' + + def __init__(self, container_name, enums_dir_name, structs_dir_name, + names=(), mapping=OrderedDict()): + self.logger = logging.getLogger(self.__class__.__name__) + self.container_name = container_name + self.names = list(map(lambda e: self.replace_sync(e), names)) + self.enums_dir = enums_dir_name + self.structs_dir = structs_dir_name + self.mapping = mapping + self.imports = namedtuple('Imports', 'what wherefrom') + self.methods = namedtuple('Methods', 'key method_title external description param_name type') + self.params = namedtuple('Params', 'key value') + + @property + def get_version(self): + """ + :return: current version of Generator + """ + return self.version + + @staticmethod + def replace_sync(name): + """ + :param name: string with item name + :return: string with replaced 'sync' to 'Sdl' + """ + if name: + return re.sub(r'^(s|S)ync(.+)$', r'\1dl\2', name) + return name + + def transform(self, item) -> dict: + """ + :param item: particular element from initial Model + :return: dictionary to be applied to jinja2 template + """ + imports = {} + methods = {} + params = {} + + for param in getattr(item, self.container_name).values(): + _import, _methods, _params = self.common_flow(param, type(item)) + + if _import: + imports.update(_import) + if _methods: + methods[param.name] = _methods + params.update({param.name: _params}) + + name = self.replace_sync(item.name) + render = {'year': date.today().year, + 'file_name': name, + 'name': name, + 'imports': {self.imports(what=k, wherefrom=v) for k, v in imports.items()}, + 'methods': methods, + 'params': params} + + if getattr(item, 'description', None): + render.update({'description': self.extract_description(item.description, 116)}) + if item.deprecated: + render.update({'deprecated': item.deprecated}) + + self.custom_mapping(render, item) + + render.update({'params': tuple(render['params'].values())}) + render.update({'methods': tuple(render['methods'].values())}) + + return render + + def extract_imports(self, param, item_type): + """ + :param param: + :param item_type: + :return: + """ + + def evaluate(element): + if isinstance(element, (Struct, Enum)): + return self.replace_sync(element.name), type(element) + return None, None + + if isinstance(param.param_type, Array): + type_origin, kind = evaluate(param.param_type.element_type) + else: + type_origin, kind = evaluate(param.param_type) + + if type_origin in self.names: + if kind is Enum: + return {type_origin: '{}/{}.js'.format(self.enums_dir, type_origin)} + elif kind is Struct: + if item_type is Struct: + import_path = '.' + else: + import_path = self.structs_dir + return {type_origin: '{}/{}.js'.format(import_path, type_origin)} + + def common_flow(self, param, item_type): + """ + Main transformation flow, for Struct and Function + :param param: sub-element (Param, FunctionParam) of element from initial Model + :param item_type: type of parent element from initial Model + :return: tuple with 3 element, which going to be applied to jinja2 template + """ + name, description = self.extract_name_description(param) + type_name = self.extract_type(param) + imports = self.extract_imports(param, item_type) + param_name = self.replace_sync(param.name) + key = self.key(param_name) + + short_name = re.sub(r'(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])', '=^.^=', param_name) \ + .split('=^.^=').pop().lower() + description = self.extract_description(description, 100 - len(type_name) - len(short_name)) + title = param_name[:1].upper() + param_name[1:] + + methods = self.methods(key=key, method_title=title, external=name, description=description, + param_name=short_name, type=type_name) + params = self.params(key=key, value="'{}'".format(param.name)) + return imports, methods, params + + def prepare_imports(self, extend): + """ + Extract imports from property PATH_TO_(STRUCT|REQUEST|RESPONSE|NOTIFICATION)_CLASS + :param extend: property to be evaluated and converted to self.imports + :return: self.imports + """ + tmp = re.match(r'.+/(.+).js', extend) + if tmp: + return self.imports(what=tmp.group(1), wherefrom=extend) + raise GenerateError('Can not extract imports from {}'.format(extend)) + + @staticmethod + def key(param: str): + """ + Convert param string to uppercase and inserting underscores + :param param: camel case string + :return: string in uppercase with underscores + """ + if re.match(r'^[A-Z_]+$', param): + return 'KEY_' + param + return 'KEY_' + re.sub(r'([a-z]|[A-Z]{2,})([A-Z]|\d$)', r'\1_\2', param).upper() + + @staticmethod + def ending_cutter(name: str): + """ + If string not contains only uppercase letters and end with 'ID' deleting 'ID' from end of string + :param name: string to evaluate and deleting 'ID' from end of string + :return: if match cut string else original string + """ + if name.endswith('ID') and re.match(r'^(?=\w+[A-Z])(?=\w+[a-z])\w+$', name): + return name[:-2] + return name + + @staticmethod + def extract_description(data, length: int) -> list: + """ + Evaluate, align and delete @TODO + :param data: list with description + :param length: + :return: evaluated string + """ + if not data: + return [] + if isinstance(data, list): + data = ' '.join(data) + return textwrap.wrap(re.sub(r'(\s{2,}|\n|\[@TODO.+)', ' ', data).strip(), length) + + def extract_name_description(self, param): + """ + Extracting and evaluating name, description from appropriate place + :param param: sub-element (Param, FunctionParam) of element from initial Model + :return: tuple with 2 element (name, description) + """ + name = None + description = None + if getattr(param, 'description', None): + description = param.description + + if getattr(param, 'primary_name', None): + name = param.primary_name + elif getattr(param, 'param_type', None): + if getattr(param.param_type, 'name', None): + name = param.param_type.name + if not description and getattr(param.param_type, 'description', None): + description = param.param_type.description + elif getattr(param.param_type, 'element_type', None) and \ + getattr(param.param_type.element_type, 'name', None): + name = param.param_type.element_type.name + if not description and getattr(param.param_type.element_type, 'description', None): + description = param.param_type.element_type.description + + return self.replace_sync(name), self.extract_description(description, 116) + + def extract_type(self, param): + """ + Evaluate and extract type + :param param: sub-element (Param, FunctionParam) of element from initial Model + :return: string with sub-element type + """ + + def evaluate(instance): + if isinstance(instance, (Struct, Enum)): + return instance.name + if isinstance(instance, (Integer, Float)): + return 'Number' + return type(instance).__name__ + + if isinstance(param.param_type, Array): + return self.replace_sync(evaluate(param.param_type.element_type)) + '[]' + return self.replace_sync(evaluate(param.param_type)) + + def get_file_content(self, file_name: str): + """ + Used for getting content of custom scripts used in custom mapping + :param file_name: relational path custom scripts + :return: string with content of custom scripts + """ + file_name = Path(__file__).absolute().parents[1].joinpath(file_name) + try: + with file_name.open('r') as file: + intermediate = file.readlines() + return ''.join(intermediate) + except FileNotFoundError as message: + self.logger.error(message) + return '' + + def custom_mapping(self, render, item): + """ + :param render: dictionarry with data ready to apply to Jinja2 template + :param item: original item from parsed model + :return: + """ + if isinstance(item, Function): + mapping_name = item.name + item.message_type.name.capitalize() + else: + mapping_name = item.name + + if mapping_name not in self.mapping: + return + custom = self.mapping[mapping_name] + + if 'params' in custom: + for data in custom['params']: + missed = list(set(self.params._fields) - set(data.keys())) + if missed: + self.logger.warning('not valid %s', str(data)) + continue + render['params'][data['key']] = self.params(**data) + del custom['params'] + if 'script' in custom: + script = self.get_file_content(custom['script']) + if script: + render['script'] = script + del custom['script'] + + for name, mapping in custom.copy().items(): + if not isinstance(mapping, dict): + continue + for section, data in mapping.copy().items(): + if section == '-methods' and name in render['methods']: + redundant = list(custom[name].copy().keys()) + redundant.remove('-methods') + if redundant: + self.logger.info('%s/%s, "-methods" provided, skipping: %s', + mapping_name, name, str(redundant)) + del render['methods'][name] + del custom[name] + break + if section in render: + if section == 'imports': + for field in data: + missed = list(set(getattr(self, section)._fields) - set(field.keys())) + if missed: + self.logger.error('%s/%s/%s, redundant: %s', mapping_name, name, section, missed) + continue + render[section].add(self.imports(**field)) + elif name in render[section]: + redundant = list(set(data.keys()) - set(getattr(self, section)._fields)) + if redundant: + self.logger.error('%s/%s/%s, redundant: %s', mapping_name, name, section, redundant) + continue + if 'description' in data: + data['description'] = self.extract_description(data['description'], 116) + render[section][name] = render[section][name]._replace(**data) + else: + self.logger.warning('%s/%s not exist, skipping it.', mapping_name, name) + del custom[name][section] + else: + self.logger.warning('%s/%s/%s not exist, skipping it.', mapping_name, name, section) + del custom[name] + if name in custom and not custom[name]: + del custom[name] + + render.update(custom) diff --git a/generator/transformers/enums_producer.py b/generator/transformers/enums_producer.py new file mode 100644 index 00000000..f268b414 --- /dev/null +++ b/generator/transformers/enums_producer.py @@ -0,0 +1,86 @@ +""" +Enums transformation +""" + +import logging +from collections import namedtuple + +from model.enum import Enum +from model.enum_element import EnumElement +from transformers.common_producer import InterfaceProducerCommon + + +class EnumsProducer(InterfaceProducerCommon): + """ + Enums transformation + """ + + def __init__(self, paths, mapping=None): + super(EnumsProducer, self).__init__( + container_name='elements', + enums_dir_name=paths.enums_dir_name, + structs_dir_name=paths.structs_dir_name, + mapping=mapping['enums'] if mapping and 'enums' in mapping else {}) + self.logger = logging.getLogger(self.__class__.__name__) + self.enum_class = paths.path_to_enum_class + self.methods = namedtuple('Methods', 'method_title description type') + + def transform(self, item: Enum) -> dict: + """ + Override + :param item: particular element from initial Model + :return: dictionary to be applied to jinja2 template + """ + tmp = super(EnumsProducer, self).transform(item) + what_where = self.prepare_imports(self.enum_class) + tmp.update({'extend': what_where.what}) + tmp['imports'].add(what_where) + return tmp + + def common_flow(self, param: EnumElement, item_type=None): + """ + Override + Main transformation flow, for Enum + :param param: sub-element (EnumElement) of element from initial Model + :param item_type: not used + :return: tuple with 3 element, which going to be applied to jinja2 template + """ + (name, description) = self.extract_name_description(param) + type_name = self.extract_type(param) + description = self.extract_description(description, 117 - len(type_name)) + name = self.ending_cutter(name) + + methods = self.methods(method_title=name, description=description, type=type_name) + params = self.extract_param(param) + + imports = None + return imports, methods, params + + def extract_param(self, param: EnumElement) -> namedtuple: + """ + Evaluate and extract params + :param param: sub-element (EnumElement) of element from initial Model + :return: self.params + """ + if getattr(param, 'hex_value', None) is not None: + if len(str(param.hex_value)) > 1: + value = '0x{}'.format(param.hex_value) + else: + value = '0x0{}'.format(param.hex_value) + elif getattr(param, 'value', None) is not None: + value = param.value + else: + value = "'{}'".format(param.name) + return self.params(key=self.ending_cutter(param.primary_name), value=value) + + @staticmethod + def extract_type(param: EnumElement) -> str: + """ + Override + Evaluate and extract type + :param param: sub-element (EnumElement) of element from initial Model + :return: string with sub-element type + """ + if getattr(param, 'hex_value', None) is not None or getattr(param, 'value', None) is not None: + return 'Number' + return 'String' diff --git a/generator/transformers/functions_producer.py b/generator/transformers/functions_producer.py new file mode 100644 index 00000000..13836ba2 --- /dev/null +++ b/generator/transformers/functions_producer.py @@ -0,0 +1,51 @@ +""" +Functions transformation +""" +import logging + +from model.function import Function +from transformers.common_producer import InterfaceProducerCommon + + +class FunctionsProducer(InterfaceProducerCommon): + """ + Functions transformation + """ + + def __init__(self, paths, names, mapping=None): + super(FunctionsProducer, self).__init__( + container_name='params', + enums_dir_name=paths.enums_dir_name, + structs_dir_name=paths.structs_dir_name, + names=names, + mapping=mapping['functions'] if mapping and 'functions' in mapping else {}) + self.logger = logging.getLogger(self.__class__.__name__) + self.request_class = paths.path_to_request_class + self.response_class = paths.path_to_response_class + self.notification_class = paths.path_to_notification_class + + def transform(self, item: Function) -> dict: + """ + Override + :param item: particular element from initial Model + :return: dictionary to be applied to jinja2 template + """ + list(map(item.params.__delitem__, filter(item.params.__contains__, ['success', 'resultCode', 'info']))) + render = super(FunctionsProducer, self).transform(item) + render.update({'func': self.ending_cutter(item.function_id.name)}) + if item.message_type.name == 'response': + render.update({'file_name': item.name + item.message_type.name.capitalize()}) + name = None + if item.message_type.name == 'request': + name = self.request_class + elif item.message_type.name == 'response': + name = self.response_class + render['name'] = render['name'] + 'Response' + elif item.message_type.name == 'notification': + name = self.notification_class + if name: + what_where = self.prepare_imports(name) + render.update({'extend': what_where.what}) + render['imports'].add(what_where) + render['imports'].add(self.imports(what='FunctionID', wherefrom='{}/FunctionID.js'.format(self.enums_dir))) + return render diff --git a/generator/transformers/generate_error.py b/generator/transformers/generate_error.py new file mode 100644 index 00000000..3fe1a75e --- /dev/null +++ b/generator/transformers/generate_error.py @@ -0,0 +1,12 @@ +""" +Generate error. +""" + + +class GenerateError(Exception): + """Generate error. + + This exception is raised when generator is unable to create + output from given model. + + """ diff --git a/generator/transformers/structs_producer.py b/generator/transformers/structs_producer.py new file mode 100644 index 00000000..f5c90cf6 --- /dev/null +++ b/generator/transformers/structs_producer.py @@ -0,0 +1,36 @@ +""" +Structs transformation +""" + +import logging + +from model.struct import Struct +from transformers.common_producer import InterfaceProducerCommon + + +class StructsProducer(InterfaceProducerCommon): + """ + Structs transformation + """ + + def __init__(self, paths, names, mapping=None): + super(StructsProducer, self).__init__( + container_name='members', + enums_dir_name=paths.enums_dir_name, + structs_dir_name=paths.structs_dir_name, + names=names, + mapping=mapping['structs'] if mapping and 'structs' in mapping else {}) + self.logger = logging.getLogger(self.__class__.__name__) + self.struct_class = paths.path_to_struct_class + + def transform(self, item: Struct) -> dict: + """ + Override + :param item: particular element from initial Model + :return: dictionary to be applied to jinja2 template + """ + tmp = super(StructsProducer, self).transform(item) + what_where = self.prepare_imports(self.struct_class) + tmp.update({'extend': what_where.what}) + tmp['imports'].add(what_where) + return tmp diff --git a/lib/js/app.js b/lib/js/app.js index b2e0a776..3fb7ca96 100644 --- a/lib/js/app.js +++ b/lib/js/app.js @@ -51,76 +51,363 @@ import { RpcNotification } from './src/rpc/RpcNotification.js'; import { RpcRequest } from './src/rpc/RpcRequest.js'; import { RpcResponse } from './src/rpc/RpcResponse.js'; import { RpcStruct } from './src/rpc/RpcStruct.js'; +import { AmbientLightStatus } from './src/rpc/enums/AmbientLightStatus.js'; import { AppHMIType } from './src/rpc/enums/AppHMIType.js'; +import { AppInterfaceUnregisteredReason } from './src/rpc/enums/AppInterfaceUnregisteredReason.js'; +import { AppServiceType } from './src/rpc/enums/AppServiceType.js'; +import { AudioStreamingIndicator } from './src/rpc/enums/AudioStreamingIndicator.js'; import { AudioStreamingState } from './src/rpc/enums/AudioStreamingState.js'; import { AudioType } from './src/rpc/enums/AudioType.js'; import { BitsPerSample } from './src/rpc/enums/BitsPerSample.js'; +import { ButtonEventMode } from './src/rpc/enums/ButtonEventMode.js'; import { ButtonName } from './src/rpc/enums/ButtonName.js'; +import { ButtonPressMode } from './src/rpc/enums/ButtonPressMode.js'; +import { CarModeStatus } from './src/rpc/enums/CarModeStatus.js'; import { CharacterSet } from './src/rpc/enums/CharacterSet.js'; +import { CompassDirection } from './src/rpc/enums/CompassDirection.js'; +import { ComponentVolumeStatus } from './src/rpc/enums/ComponentVolumeStatus.js'; +import { DefrostZone } from './src/rpc/enums/DefrostZone.js'; +import { DeliveryMode } from './src/rpc/enums/DeliveryMode.js'; +import { DeviceLevelStatus } from './src/rpc/enums/DeviceLevelStatus.js'; +import { Dimension } from './src/rpc/enums/Dimension.js'; +import { Direction } from './src/rpc/enums/Direction.js'; +import { DisplayMode } from './src/rpc/enums/DisplayMode.js'; import { DisplayType } from './src/rpc/enums/DisplayType.js'; +import { DistanceUnit } from './src/rpc/enums/DistanceUnit.js'; +import { DriverDistractionState } from './src/rpc/enums/DriverDistractionState.js'; +import { ECallConfirmationStatus } from './src/rpc/enums/ECallConfirmationStatus.js'; +import { ElectronicParkBrakeStatus } from './src/rpc/enums/ElectronicParkBrakeStatus.js'; +import { EmergencyEventType } from './src/rpc/enums/EmergencyEventType.js'; import { FileType } from './src/rpc/enums/FileType.js'; +import { FuelCutoffStatus } from './src/rpc/enums/FuelCutoffStatus.js'; +import { FuelType } from './src/rpc/enums/FuelType.js'; import { FunctionID } from './src/rpc/enums/FunctionID.js'; +import { GlobalProperty } from './src/rpc/enums/GlobalProperty.js'; import { HMILevel } from './src/rpc/enums/HMILevel.js'; import { HmiZoneCapabilities } from './src/rpc/enums/HmiZoneCapabilities.js'; +import { HybridAppPreference } from './src/rpc/enums/HybridAppPreference.js'; +import { IgnitionStableStatus } from './src/rpc/enums/IgnitionStableStatus.js'; +import { IgnitionStatus } from './src/rpc/enums/IgnitionStatus.js'; import { ImageFieldName } from './src/rpc/enums/ImageFieldName.js'; import { ImageType } from './src/rpc/enums/ImageType.js'; +import { InteractionMode } from './src/rpc/enums/InteractionMode.js'; +import { KeyboardEvent } from './src/rpc/enums/KeyboardEvent.js'; +import { KeyboardLayout } from './src/rpc/enums/KeyboardLayout.js'; +import { KeypressMode } from './src/rpc/enums/KeypressMode.js'; import { Language } from './src/rpc/enums/Language.js'; +import { LayoutMode } from './src/rpc/enums/LayoutMode.js'; +import { LightName } from './src/rpc/enums/LightName.js'; +import { LightStatus } from './src/rpc/enums/LightStatus.js'; +import { MaintenanceModeStatus } from './src/rpc/enums/MaintenanceModeStatus.js'; +import { MassageCushion } from './src/rpc/enums/MassageCushion.js'; +import { MassageMode } from './src/rpc/enums/MassageMode.js'; +import { MassageZone } from './src/rpc/enums/MassageZone.js'; import { MediaClockFormat } from './src/rpc/enums/MediaClockFormat.js'; +import { MediaType } from './src/rpc/enums/MediaType.js'; +import { MenuLayout } from './src/rpc/enums/MenuLayout.js'; import { MetadataType } from './src/rpc/enums/MetadataType.js'; +import { ModuleType } from './src/rpc/enums/ModuleType.js'; +import { NavigationAction } from './src/rpc/enums/NavigationAction.js'; +import { NavigationJunction } from './src/rpc/enums/NavigationJunction.js'; +import { PRNDL } from './src/rpc/enums/PRNDL.js'; +import { PermissionStatus } from './src/rpc/enums/PermissionStatus.js'; +import { PowerModeQualificationStatus } from './src/rpc/enums/PowerModeQualificationStatus.js'; +import { PowerModeStatus } from './src/rpc/enums/PowerModeStatus.js'; +import { PredefinedLayout } from './src/rpc/enums/PredefinedLayout.js'; +import { PredefinedWindows } from './src/rpc/enums/PredefinedWindows.js'; import { PrerecordedSpeech } from './src/rpc/enums/PrerecordedSpeech.js'; +import { PrimaryAudioSource } from './src/rpc/enums/PrimaryAudioSource.js'; +import { RadioBand } from './src/rpc/enums/RadioBand.js'; +import { RadioState } from './src/rpc/enums/RadioState.js'; +import { RequestType } from './src/rpc/enums/RequestType.js'; import { Result } from './src/rpc/enums/Result.js'; import { RpcType } from './src/rpc/enums/RpcType.js'; import { SamplingRate } from './src/rpc/enums/SamplingRate.js'; +import { SeatMemoryActionType } from './src/rpc/enums/SeatMemoryActionType.js'; +import { ServiceUpdateReason } from './src/rpc/enums/ServiceUpdateReason.js'; import { SoftButtonType } from './src/rpc/enums/SoftButtonType.js'; import { SpeechCapabilities } from './src/rpc/enums/SpeechCapabilities.js'; +import { SupportedSeat } from './src/rpc/enums/SupportedSeat.js'; import { SystemAction } from './src/rpc/enums/SystemAction.js'; +import { SystemCapabilityType } from './src/rpc/enums/SystemCapabilityType.js'; import { SystemContext } from './src/rpc/enums/SystemContext.js'; +import { TBTState } from './src/rpc/enums/TBTState.js'; +import { TPMS } from './src/rpc/enums/TPMS.js'; +import { TemperatureUnit } from './src/rpc/enums/TemperatureUnit.js'; import { TextAlignment } from './src/rpc/enums/TextAlignment.js'; import { TextFieldName } from './src/rpc/enums/TextFieldName.js'; +import { TimerMode } from './src/rpc/enums/TimerMode.js'; +import { TouchType } from './src/rpc/enums/TouchType.js'; +import { TriggerSource } from './src/rpc/enums/TriggerSource.js'; +import { TurnSignal } from './src/rpc/enums/TurnSignal.js'; +import { UpdateMode } from './src/rpc/enums/UpdateMode.js'; +import { VehicleDataActiveStatus } from './src/rpc/enums/VehicleDataActiveStatus.js'; +import { VehicleDataEventStatus } from './src/rpc/enums/VehicleDataEventStatus.js'; +import { VehicleDataNotificationStatus } from './src/rpc/enums/VehicleDataNotificationStatus.js'; +import { VehicleDataResultCode } from './src/rpc/enums/VehicleDataResultCode.js'; +import { VehicleDataStatus } from './src/rpc/enums/VehicleDataStatus.js'; +import { VehicleDataType } from './src/rpc/enums/VehicleDataType.js'; +import { VentilationMode } from './src/rpc/enums/VentilationMode.js'; import { VideoStreamingCodec } from './src/rpc/enums/VideoStreamingCodec.js'; import { VideoStreamingProtocol } from './src/rpc/enums/VideoStreamingProtocol.js'; import { VideoStreamingState } from './src/rpc/enums/VideoStreamingState.js'; import { VrCapabilities } from './src/rpc/enums/VrCapabilities.js'; +import { WarningLightStatus } from './src/rpc/enums/WarningLightStatus.js'; +import { WayPointType } from './src/rpc/enums/WayPointType.js'; +import { WindowType } from './src/rpc/enums/WindowType.js'; +import { WiperStatus } from './src/rpc/enums/WiperStatus.js'; +import { messageType } from './src/rpc/enums/messageType.js'; import { AddCommand } from './src/rpc/messages/AddCommand.js'; import { AddCommandResponse } from './src/rpc/messages/AddCommandResponse.js'; -import { OnHmiStatus } from './src/rpc/messages/OnHmiStatus.js'; +import { AddSubMenu } from './src/rpc/messages/AddSubMenu.js'; +import { AddSubMenuResponse } from './src/rpc/messages/AddSubMenuResponse.js'; +import { Alert } from './src/rpc/messages/Alert.js'; +import { AlertManeuver } from './src/rpc/messages/AlertManeuver.js'; +import { AlertManeuverResponse } from './src/rpc/messages/AlertManeuverResponse.js'; +import { AlertResponse } from './src/rpc/messages/AlertResponse.js'; +import { ButtonPress } from './src/rpc/messages/ButtonPress.js'; +import { ButtonPressResponse } from './src/rpc/messages/ButtonPressResponse.js'; +import { CancelInteraction } from './src/rpc/messages/CancelInteraction.js'; +import { CancelInteractionResponse } from './src/rpc/messages/CancelInteractionResponse.js'; +import { ChangeRegistration } from './src/rpc/messages/ChangeRegistration.js'; +import { ChangeRegistrationResponse } from './src/rpc/messages/ChangeRegistrationResponse.js'; +import { CloseApplication } from './src/rpc/messages/CloseApplication.js'; +import { CloseApplicationResponse } from './src/rpc/messages/CloseApplicationResponse.js'; +import { CreateInteractionChoiceSet } from './src/rpc/messages/CreateInteractionChoiceSet.js'; +import { CreateInteractionChoiceSetResponse } from './src/rpc/messages/CreateInteractionChoiceSetResponse.js'; +import { CreateWindow } from './src/rpc/messages/CreateWindow.js'; +import { CreateWindowResponse } from './src/rpc/messages/CreateWindowResponse.js'; +import { DeleteCommand } from './src/rpc/messages/DeleteCommand.js'; +import { DeleteCommandResponse } from './src/rpc/messages/DeleteCommandResponse.js'; +import { DeleteFile } from './src/rpc/messages/DeleteFile.js'; +import { DeleteFileResponse } from './src/rpc/messages/DeleteFileResponse.js'; +import { DeleteInteractionChoiceSet } from './src/rpc/messages/DeleteInteractionChoiceSet.js'; +import { DeleteInteractionChoiceSetResponse } from './src/rpc/messages/DeleteInteractionChoiceSetResponse.js'; +import { DeleteSubMenu } from './src/rpc/messages/DeleteSubMenu.js'; +import { DeleteSubMenuResponse } from './src/rpc/messages/DeleteSubMenuResponse.js'; +import { DeleteWindow } from './src/rpc/messages/DeleteWindow.js'; +import { DeleteWindowResponse } from './src/rpc/messages/DeleteWindowResponse.js'; +import { DiagnosticMessage } from './src/rpc/messages/DiagnosticMessage.js'; +import { DiagnosticMessageResponse } from './src/rpc/messages/DiagnosticMessageResponse.js'; +import { DialNumber } from './src/rpc/messages/DialNumber.js'; +import { DialNumberResponse } from './src/rpc/messages/DialNumberResponse.js'; +import { EncodedSyncPData } from './src/rpc/messages/EncodedSyncPData.js'; +import { EncodedSyncPDataResponse } from './src/rpc/messages/EncodedSyncPDataResponse.js'; +import { EndAudioPassThru } from './src/rpc/messages/EndAudioPassThru.js'; +import { EndAudioPassThruResponse } from './src/rpc/messages/EndAudioPassThruResponse.js'; +import { GenericResponseResponse } from './src/rpc/messages/GenericResponseResponse.js'; +import { GetAppServiceData } from './src/rpc/messages/GetAppServiceData.js'; +import { GetAppServiceDataResponse } from './src/rpc/messages/GetAppServiceDataResponse.js'; +import { GetCloudAppProperties } from './src/rpc/messages/GetCloudAppProperties.js'; +import { GetCloudAppPropertiesResponse } from './src/rpc/messages/GetCloudAppPropertiesResponse.js'; +import { GetDTCs } from './src/rpc/messages/GetDTCs.js'; +import { GetDTCsResponse } from './src/rpc/messages/GetDTCsResponse.js'; +import { GetFile } from './src/rpc/messages/GetFile.js'; +import { GetFileResponse } from './src/rpc/messages/GetFileResponse.js'; +import { GetInteriorVehicleData } from './src/rpc/messages/GetInteriorVehicleData.js'; +import { GetInteriorVehicleDataConsent } from './src/rpc/messages/GetInteriorVehicleDataConsent.js'; +import { GetInteriorVehicleDataConsentResponse } from './src/rpc/messages/GetInteriorVehicleDataConsentResponse.js'; +import { GetInteriorVehicleDataResponse } from './src/rpc/messages/GetInteriorVehicleDataResponse.js'; +import { GetSystemCapability } from './src/rpc/messages/GetSystemCapability.js'; +import { GetSystemCapabilityResponse } from './src/rpc/messages/GetSystemCapabilityResponse.js'; +import { GetVehicleData } from './src/rpc/messages/GetVehicleData.js'; +import { GetVehicleDataResponse } from './src/rpc/messages/GetVehicleDataResponse.js'; +import { GetWayPoints } from './src/rpc/messages/GetWayPoints.js'; +import { GetWayPointsResponse } from './src/rpc/messages/GetWayPointsResponse.js'; +import { ListFiles } from './src/rpc/messages/ListFiles.js'; +import { ListFilesResponse } from './src/rpc/messages/ListFilesResponse.js'; +import { OnAppInterfaceUnregistered } from './src/rpc/messages/OnAppInterfaceUnregistered.js'; +import { OnAppServiceData } from './src/rpc/messages/OnAppServiceData.js'; +import { OnAudioPassThru } from './src/rpc/messages/OnAudioPassThru.js'; +import { OnButtonEvent } from './src/rpc/messages/OnButtonEvent.js'; +import { OnButtonPress } from './src/rpc/messages/OnButtonPress.js'; +import { OnCommand } from './src/rpc/messages/OnCommand.js'; +import { OnDriverDistraction } from './src/rpc/messages/OnDriverDistraction.js'; +import { OnEncodedSyncPData } from './src/rpc/messages/OnEncodedSyncPData.js'; +import { OnHMIStatus } from './src/rpc/messages/OnHMIStatus.js'; +import { OnHashChange } from './src/rpc/messages/OnHashChange.js'; +import { OnInteriorVehicleData } from './src/rpc/messages/OnInteriorVehicleData.js'; +import { OnKeyboardInput } from './src/rpc/messages/OnKeyboardInput.js'; import { OnLanguageChange } from './src/rpc/messages/OnLanguageChange.js'; +import { OnPermissionsChange } from './src/rpc/messages/OnPermissionsChange.js'; +import { OnRCStatus } from './src/rpc/messages/OnRCStatus.js'; +import { OnSystemCapabilityUpdated } from './src/rpc/messages/OnSystemCapabilityUpdated.js'; +import { OnSystemRequest } from './src/rpc/messages/OnSystemRequest.js'; +import { OnTBTClientState } from './src/rpc/messages/OnTBTClientState.js'; +import { OnTouchEvent } from './src/rpc/messages/OnTouchEvent.js'; +import { OnVehicleData } from './src/rpc/messages/OnVehicleData.js'; +import { OnWayPointChange } from './src/rpc/messages/OnWayPointChange.js'; +import { PerformAppServiceInteraction } from './src/rpc/messages/PerformAppServiceInteraction.js'; +import { PerformAppServiceInteractionResponse } from './src/rpc/messages/PerformAppServiceInteractionResponse.js'; +import { PerformAudioPassThru } from './src/rpc/messages/PerformAudioPassThru.js'; +import { PerformAudioPassThruResponse } from './src/rpc/messages/PerformAudioPassThruResponse.js'; +import { PerformInteraction } from './src/rpc/messages/PerformInteraction.js'; +import { PerformInteractionResponse } from './src/rpc/messages/PerformInteractionResponse.js'; +import { PublishAppService } from './src/rpc/messages/PublishAppService.js'; +import { PublishAppServiceResponse } from './src/rpc/messages/PublishAppServiceResponse.js'; import { PutFile } from './src/rpc/messages/PutFile.js'; import { PutFileResponse } from './src/rpc/messages/PutFileResponse.js'; +import { ReadDID } from './src/rpc/messages/ReadDID.js'; +import { ReadDIDResponse } from './src/rpc/messages/ReadDIDResponse.js'; import { RegisterAppInterface } from './src/rpc/messages/RegisterAppInterface.js'; import { RegisterAppInterfaceResponse } from './src/rpc/messages/RegisterAppInterfaceResponse.js'; +import { ReleaseInteriorVehicleDataModule } from './src/rpc/messages/ReleaseInteriorVehicleDataModule.js'; +import { ReleaseInteriorVehicleDataModuleResponse } from './src/rpc/messages/ReleaseInteriorVehicleDataModuleResponse.js'; +import { ResetGlobalProperties } from './src/rpc/messages/ResetGlobalProperties.js'; +import { ResetGlobalPropertiesResponse } from './src/rpc/messages/ResetGlobalPropertiesResponse.js'; +import { ScrollableMessage } from './src/rpc/messages/ScrollableMessage.js'; +import { ScrollableMessageResponse } from './src/rpc/messages/ScrollableMessageResponse.js'; +import { SendHapticData } from './src/rpc/messages/SendHapticData.js'; +import { SendHapticDataResponse } from './src/rpc/messages/SendHapticDataResponse.js'; +import { SendLocation } from './src/rpc/messages/SendLocation.js'; +import { SendLocationResponse } from './src/rpc/messages/SendLocationResponse.js'; import { SetAppIcon } from './src/rpc/messages/SetAppIcon.js'; import { SetAppIconResponse } from './src/rpc/messages/SetAppIconResponse.js'; +import { SetCloudAppProperties } from './src/rpc/messages/SetCloudAppProperties.js'; +import { SetCloudAppPropertiesResponse } from './src/rpc/messages/SetCloudAppPropertiesResponse.js'; +import { SetDisplayLayout } from './src/rpc/messages/SetDisplayLayout.js'; +import { SetDisplayLayoutResponse } from './src/rpc/messages/SetDisplayLayoutResponse.js'; +import { SetGlobalProperties } from './src/rpc/messages/SetGlobalProperties.js'; +import { SetGlobalPropertiesResponse } from './src/rpc/messages/SetGlobalPropertiesResponse.js'; +import { SetInteriorVehicleData } from './src/rpc/messages/SetInteriorVehicleData.js'; +import { SetInteriorVehicleDataResponse } from './src/rpc/messages/SetInteriorVehicleDataResponse.js'; +import { SetMediaClockTimer } from './src/rpc/messages/SetMediaClockTimer.js'; +import { SetMediaClockTimerResponse } from './src/rpc/messages/SetMediaClockTimerResponse.js'; import { Show } from './src/rpc/messages/Show.js'; +import { ShowAppMenu } from './src/rpc/messages/ShowAppMenu.js'; +import { ShowAppMenuResponse } from './src/rpc/messages/ShowAppMenuResponse.js'; +import { ShowConstantTBT } from './src/rpc/messages/ShowConstantTBT.js'; +import { ShowConstantTBTResponse } from './src/rpc/messages/ShowConstantTBTResponse.js'; import { ShowResponse } from './src/rpc/messages/ShowResponse.js'; +import { Slider } from './src/rpc/messages/Slider.js'; +import { SliderResponse } from './src/rpc/messages/SliderResponse.js'; +import { Speak } from './src/rpc/messages/Speak.js'; +import { SpeakResponse } from './src/rpc/messages/SpeakResponse.js'; +import { SubscribeButton } from './src/rpc/messages/SubscribeButton.js'; +import { SubscribeButtonResponse } from './src/rpc/messages/SubscribeButtonResponse.js'; +import { SubscribeVehicleData } from './src/rpc/messages/SubscribeVehicleData.js'; +import { SubscribeVehicleDataResponse } from './src/rpc/messages/SubscribeVehicleDataResponse.js'; +import { SubscribeWayPoints } from './src/rpc/messages/SubscribeWayPoints.js'; +import { SubscribeWayPointsResponse } from './src/rpc/messages/SubscribeWayPointsResponse.js'; +import { SystemRequest } from './src/rpc/messages/SystemRequest.js'; +import { SystemRequestResponse } from './src/rpc/messages/SystemRequestResponse.js'; +import { UnpublishAppService } from './src/rpc/messages/UnpublishAppService.js'; +import { UnpublishAppServiceResponse } from './src/rpc/messages/UnpublishAppServiceResponse.js'; import { UnregisterAppInterface } from './src/rpc/messages/UnregisterAppInterface.js'; import { UnregisterAppInterfaceResponse } from './src/rpc/messages/UnregisterAppInterfaceResponse.js'; +import { UnsubscribeButton } from './src/rpc/messages/UnsubscribeButton.js'; +import { UnsubscribeButtonResponse } from './src/rpc/messages/UnsubscribeButtonResponse.js'; +import { UnsubscribeVehicleData } from './src/rpc/messages/UnsubscribeVehicleData.js'; +import { UnsubscribeVehicleDataResponse } from './src/rpc/messages/UnsubscribeVehicleDataResponse.js'; +import { UnsubscribeWayPoints } from './src/rpc/messages/UnsubscribeWayPoints.js'; +import { UnsubscribeWayPointsResponse } from './src/rpc/messages/UnsubscribeWayPointsResponse.js'; +import { UpdateTurnList } from './src/rpc/messages/UpdateTurnList.js'; +import { UpdateTurnListResponse } from './src/rpc/messages/UpdateTurnListResponse.js'; +import { AirbagStatus } from './src/rpc/structs/AirbagStatus.js'; import { AppInfo } from './src/rpc/structs/AppInfo.js'; +import { AppServiceCapability } from './src/rpc/structs/AppServiceCapability.js'; +import { AppServiceData } from './src/rpc/structs/AppServiceData.js'; +import { AppServiceManifest } from './src/rpc/structs/AppServiceManifest.js'; +import { AppServiceRecord } from './src/rpc/structs/AppServiceRecord.js'; +import { AppServicesCapabilities } from './src/rpc/structs/AppServicesCapabilities.js'; +import { AudioControlCapabilities } from './src/rpc/structs/AudioControlCapabilities.js'; +import { AudioControlData } from './src/rpc/structs/AudioControlData.js'; import { AudioPassThruCapabilities } from './src/rpc/structs/AudioPassThruCapabilities.js'; +import { BeltStatus } from './src/rpc/structs/BeltStatus.js'; +import { BodyInformation } from './src/rpc/structs/BodyInformation.js'; import { ButtonCapabilities } from './src/rpc/structs/ButtonCapabilities.js'; +import { Choice } from './src/rpc/structs/Choice.js'; +import { ClimateControlCapabilities } from './src/rpc/structs/ClimateControlCapabilities.js'; +import { ClimateControlData } from './src/rpc/structs/ClimateControlData.js'; +import { CloudAppProperties } from './src/rpc/structs/CloudAppProperties.js'; +import { ClusterModeStatus } from './src/rpc/structs/ClusterModeStatus.js'; +import { Coordinate } from './src/rpc/structs/Coordinate.js'; +import { DIDResult } from './src/rpc/structs/DIDResult.js'; +import { DateTime } from './src/rpc/structs/DateTime.js'; import { DeviceInfo } from './src/rpc/structs/DeviceInfo.js'; +import { DeviceStatus } from './src/rpc/structs/DeviceStatus.js'; import { DisplayCapabilities } from './src/rpc/structs/DisplayCapabilities.js'; +import { DisplayCapability } from './src/rpc/structs/DisplayCapability.js'; +import { ECallInfo } from './src/rpc/structs/ECallInfo.js'; +import { EmergencyEvent } from './src/rpc/structs/EmergencyEvent.js'; +import { EqualizerSettings } from './src/rpc/structs/EqualizerSettings.js'; +import { FuelRange } from './src/rpc/structs/FuelRange.js'; +import { GPSData } from './src/rpc/structs/GPSData.js'; import { Grid } from './src/rpc/structs/Grid.js'; import { HMICapabilities } from './src/rpc/structs/HMICapabilities.js'; +import { HMIPermissions } from './src/rpc/structs/HMIPermissions.js'; +import { HMISettingsControlCapabilities } from './src/rpc/structs/HMISettingsControlCapabilities.js'; +import { HMISettingsControlData } from './src/rpc/structs/HMISettingsControlData.js'; +import { HapticRect } from './src/rpc/structs/HapticRect.js'; +import { HeadLampStatus } from './src/rpc/structs/HeadLampStatus.js'; import { Image } from './src/rpc/structs/Image.js'; import { ImageField } from './src/rpc/structs/ImageField.js'; import { ImageResolution } from './src/rpc/structs/ImageResolution.js'; +import { KeyboardProperties } from './src/rpc/structs/KeyboardProperties.js'; +import { LightCapabilities } from './src/rpc/structs/LightCapabilities.js'; +import { LightControlCapabilities } from './src/rpc/structs/LightControlCapabilities.js'; +import { LightControlData } from './src/rpc/structs/LightControlData.js'; +import { LightState } from './src/rpc/structs/LightState.js'; +import { LocationDetails } from './src/rpc/structs/LocationDetails.js'; +import { MassageCushionFirmness } from './src/rpc/structs/MassageCushionFirmness.js'; +import { MassageModeData } from './src/rpc/structs/MassageModeData.js'; +import { MediaServiceData } from './src/rpc/structs/MediaServiceData.js'; +import { MediaServiceManifest } from './src/rpc/structs/MediaServiceManifest.js'; import { MenuParams } from './src/rpc/structs/MenuParams.js'; import { MetadataTags } from './src/rpc/structs/MetadataTags.js'; +import { ModuleData } from './src/rpc/structs/ModuleData.js'; import { ModuleInfo } from './src/rpc/structs/ModuleInfo.js'; +import { MyKey } from './src/rpc/structs/MyKey.js'; +import { NavigationCapability } from './src/rpc/structs/NavigationCapability.js'; +import { NavigationInstruction } from './src/rpc/structs/NavigationInstruction.js'; +import { NavigationServiceData } from './src/rpc/structs/NavigationServiceData.js'; +import { NavigationServiceManifest } from './src/rpc/structs/NavigationServiceManifest.js'; +import { OASISAddress } from './src/rpc/structs/OASISAddress.js'; +import { ParameterPermissions } from './src/rpc/structs/ParameterPermissions.js'; +import { PermissionItem } from './src/rpc/structs/PermissionItem.js'; +import { PhoneCapability } from './src/rpc/structs/PhoneCapability.js'; import { PresetBankCapabilities } from './src/rpc/structs/PresetBankCapabilities.js'; import { RGBColor } from './src/rpc/structs/RGBColor.js'; +import { RadioControlCapabilities } from './src/rpc/structs/RadioControlCapabilities.js'; +import { RadioControlData } from './src/rpc/structs/RadioControlData.js'; +import { RdsData } from './src/rpc/structs/RdsData.js'; +import { Rectangle } from './src/rpc/structs/Rectangle.js'; +import { RemoteControlCapabilities } from './src/rpc/structs/RemoteControlCapabilities.js'; import { ScreenParams } from './src/rpc/structs/ScreenParams.js'; import { SdlMsgVersion } from './src/rpc/structs/SdlMsgVersion.js'; +import { SeatControlCapabilities } from './src/rpc/structs/SeatControlCapabilities.js'; +import { SeatControlData } from './src/rpc/structs/SeatControlData.js'; +import { SeatLocation } from './src/rpc/structs/SeatLocation.js'; +import { SeatLocationCapability } from './src/rpc/structs/SeatLocationCapability.js'; +import { SeatMemoryAction } from './src/rpc/structs/SeatMemoryAction.js'; +import { SingleTireStatus } from './src/rpc/structs/SingleTireStatus.js'; +import { SisData } from './src/rpc/structs/SisData.js'; import { SoftButton } from './src/rpc/structs/SoftButton.js'; import { SoftButtonCapabilities } from './src/rpc/structs/SoftButtonCapabilities.js'; +import { StartTime } from './src/rpc/structs/StartTime.js'; +import { StationIDNumber } from './src/rpc/structs/StationIDNumber.js'; +import { SystemCapability } from './src/rpc/structs/SystemCapability.js'; import { TTSChunk } from './src/rpc/structs/TTSChunk.js'; +import { Temperature } from './src/rpc/structs/Temperature.js'; import { TemplateColorScheme } from './src/rpc/structs/TemplateColorScheme.js'; +import { TemplateConfiguration } from './src/rpc/structs/TemplateConfiguration.js'; import { TextField } from './src/rpc/structs/TextField.js'; +import { TireStatus } from './src/rpc/structs/TireStatus.js'; +import { TouchCoord } from './src/rpc/structs/TouchCoord.js'; +import { TouchEvent } from './src/rpc/structs/TouchEvent.js'; import { TouchEventCapabilities } from './src/rpc/structs/TouchEventCapabilities.js'; +import { Turn } from './src/rpc/structs/Turn.js'; +import { VehicleDataResult } from './src/rpc/structs/VehicleDataResult.js'; import { VehicleType } from './src/rpc/structs/VehicleType.js'; import { VideoStreamingCapability } from './src/rpc/structs/VideoStreamingCapability.js'; import { VideoStreamingFormat } from './src/rpc/structs/VideoStreamingFormat.js'; +import { VrHelpItem } from './src/rpc/structs/VrHelpItem.js'; +import { WeatherAlert } from './src/rpc/structs/WeatherAlert.js'; +import { WeatherData } from './src/rpc/structs/WeatherData.js'; +import { WeatherServiceData } from './src/rpc/structs/WeatherServiceData.js'; +import { WeatherServiceManifest } from './src/rpc/structs/WeatherServiceManifest.js'; +import { WindowCapability } from './src/rpc/structs/WindowCapability.js'; +import { WindowTypeCapabilities } from './src/rpc/structs/WindowTypeCapabilities.js'; import { SdlServiceListener } from './src/session/SdlServiceListener.js'; import { SdlSession } from './src/session/SdlSession.js'; import { SdlSessionListener } from './src/session/SdlSessionListener.js'; @@ -180,80 +467,367 @@ const SDL = { RpcResponse, RpcStruct, enums: { + AmbientLightStatus, AppHMIType, + AppInterfaceUnregisteredReason, + AppServiceType, + AudioStreamingIndicator, AudioStreamingState, AudioType, BitsPerSample, + ButtonEventMode, ButtonName, + ButtonPressMode, + CarModeStatus, CharacterSet, + CompassDirection, + ComponentVolumeStatus, + DefrostZone, + DeliveryMode, + DeviceLevelStatus, + Dimension, + Direction, + DisplayMode, DisplayType, + DistanceUnit, + DriverDistractionState, + ECallConfirmationStatus, + ElectronicParkBrakeStatus, + EmergencyEventType, FileType, + FuelCutoffStatus, + FuelType, FunctionID, + GlobalProperty, HMILevel, HmiZoneCapabilities, + HybridAppPreference, + IgnitionStableStatus, + IgnitionStatus, ImageFieldName, ImageType, + InteractionMode, + KeyboardEvent, + KeyboardLayout, + KeypressMode, Language, + LayoutMode, + LightName, + LightStatus, + MaintenanceModeStatus, + MassageCushion, + MassageMode, + MassageZone, MediaClockFormat, + MediaType, + MenuLayout, MetadataType, + ModuleType, + NavigationAction, + NavigationJunction, + PRNDL, + PermissionStatus, + PowerModeQualificationStatus, + PowerModeStatus, + PredefinedLayout, + PredefinedWindows, PrerecordedSpeech, + PrimaryAudioSource, + RadioBand, + RadioState, + RequestType, Result, RpcType, SamplingRate, + SeatMemoryActionType, + ServiceUpdateReason, SoftButtonType, SpeechCapabilities, + SupportedSeat, SystemAction, + SystemCapabilityType, SystemContext, + TBTState, + TPMS, + TemperatureUnit, TextAlignment, TextFieldName, + TimerMode, + TouchType, + TriggerSource, + TurnSignal, + UpdateMode, + VehicleDataActiveStatus, + VehicleDataEventStatus, + VehicleDataNotificationStatus, + VehicleDataResultCode, + VehicleDataStatus, + VehicleDataType, + VentilationMode, VideoStreamingCodec, VideoStreamingProtocol, VideoStreamingState, VrCapabilities, + WarningLightStatus, + WayPointType, + WindowType, + WiperStatus, + messageType, }, messages: { AddCommand, AddCommandResponse, - OnHmiStatus, + AddSubMenu, + AddSubMenuResponse, + Alert, + AlertManeuver, + AlertManeuverResponse, + AlertResponse, + ButtonPress, + ButtonPressResponse, + CancelInteraction, + CancelInteractionResponse, + ChangeRegistration, + ChangeRegistrationResponse, + CloseApplication, + CloseApplicationResponse, + CreateInteractionChoiceSet, + CreateInteractionChoiceSetResponse, + CreateWindow, + CreateWindowResponse, + DeleteCommand, + DeleteCommandResponse, + DeleteFile, + DeleteFileResponse, + DeleteInteractionChoiceSet, + DeleteInteractionChoiceSetResponse, + DeleteSubMenu, + DeleteSubMenuResponse, + DeleteWindow, + DeleteWindowResponse, + DiagnosticMessage, + DiagnosticMessageResponse, + DialNumber, + DialNumberResponse, + EncodedSyncPData, + EncodedSyncPDataResponse, + EndAudioPassThru, + EndAudioPassThruResponse, + GenericResponseResponse, + GetAppServiceData, + GetAppServiceDataResponse, + GetCloudAppProperties, + GetCloudAppPropertiesResponse, + GetDTCs, + GetDTCsResponse, + GetFile, + GetFileResponse, + GetInteriorVehicleData, + GetInteriorVehicleDataConsent, + GetInteriorVehicleDataConsentResponse, + GetInteriorVehicleDataResponse, + GetSystemCapability, + GetSystemCapabilityResponse, + GetVehicleData, + GetVehicleDataResponse, + GetWayPoints, + GetWayPointsResponse, + ListFiles, + ListFilesResponse, + OnAppInterfaceUnregistered, + OnAppServiceData, + OnAudioPassThru, + OnButtonEvent, + OnButtonPress, + OnCommand, + OnDriverDistraction, + OnEncodedSyncPData, + OnHMIStatus, + OnHashChange, + OnInteriorVehicleData, + OnKeyboardInput, OnLanguageChange, + OnPermissionsChange, + OnRCStatus, + OnSystemCapabilityUpdated, + OnSystemRequest, + OnTBTClientState, + OnTouchEvent, + OnVehicleData, + OnWayPointChange, + PerformAppServiceInteraction, + PerformAppServiceInteractionResponse, + PerformAudioPassThru, + PerformAudioPassThruResponse, + PerformInteraction, + PerformInteractionResponse, + PublishAppService, + PublishAppServiceResponse, PutFile, PutFileResponse, + ReadDID, + ReadDIDResponse, RegisterAppInterface, RegisterAppInterfaceResponse, + ReleaseInteriorVehicleDataModule, + ReleaseInteriorVehicleDataModuleResponse, + ResetGlobalProperties, + ResetGlobalPropertiesResponse, + ScrollableMessage, + ScrollableMessageResponse, + SendHapticData, + SendHapticDataResponse, + SendLocation, + SendLocationResponse, SetAppIcon, SetAppIconResponse, + SetCloudAppProperties, + SetCloudAppPropertiesResponse, + SetDisplayLayout, + SetDisplayLayoutResponse, + SetGlobalProperties, + SetGlobalPropertiesResponse, + SetInteriorVehicleData, + SetInteriorVehicleDataResponse, + SetMediaClockTimer, + SetMediaClockTimerResponse, Show, + ShowAppMenu, + ShowAppMenuResponse, + ShowConstantTBT, + ShowConstantTBTResponse, ShowResponse, + Slider, + SliderResponse, + Speak, + SpeakResponse, + SubscribeButton, + SubscribeButtonResponse, + SubscribeVehicleData, + SubscribeVehicleDataResponse, + SubscribeWayPoints, + SubscribeWayPointsResponse, + SystemRequest, + SystemRequestResponse, + UnpublishAppService, + UnpublishAppServiceResponse, UnregisterAppInterface, UnregisterAppInterfaceResponse, + UnsubscribeButton, + UnsubscribeButtonResponse, + UnsubscribeVehicleData, + UnsubscribeVehicleDataResponse, + UnsubscribeWayPoints, + UnsubscribeWayPointsResponse, + UpdateTurnList, + UpdateTurnListResponse, }, structs: { + AirbagStatus, AppInfo, + AppServiceCapability, + AppServiceData, + AppServiceManifest, + AppServiceRecord, + AppServicesCapabilities, + AudioControlCapabilities, + AudioControlData, AudioPassThruCapabilities, + BeltStatus, + BodyInformation, ButtonCapabilities, + Choice, + ClimateControlCapabilities, + ClimateControlData, + CloudAppProperties, + ClusterModeStatus, + Coordinate, + DIDResult, + DateTime, DeviceInfo, + DeviceStatus, DisplayCapabilities, + DisplayCapability, + ECallInfo, + EmergencyEvent, + EqualizerSettings, + FuelRange, + GPSData, Grid, HMICapabilities, + HMIPermissions, + HMISettingsControlCapabilities, + HMISettingsControlData, + HapticRect, + HeadLampStatus, Image, ImageField, ImageResolution, + KeyboardProperties, + LightCapabilities, + LightControlCapabilities, + LightControlData, + LightState, + LocationDetails, + MassageCushionFirmness, + MassageModeData, + MediaServiceData, + MediaServiceManifest, MenuParams, MetadataTags, + ModuleData, ModuleInfo, + MyKey, + NavigationCapability, + NavigationInstruction, + NavigationServiceData, + NavigationServiceManifest, + OASISAddress, + ParameterPermissions, + PermissionItem, + PhoneCapability, PresetBankCapabilities, RGBColor, + RadioControlCapabilities, + RadioControlData, + RdsData, + Rectangle, + RemoteControlCapabilities, ScreenParams, SdlMsgVersion, + SeatControlCapabilities, + SeatControlData, + SeatLocation, + SeatLocationCapability, + SeatMemoryAction, + SingleTireStatus, + SisData, SoftButton, SoftButtonCapabilities, + StartTime, + StationIDNumber, + SystemCapability, TTSChunk, + Temperature, TemplateColorScheme, + TemplateConfiguration, TextField, + TireStatus, + TouchCoord, + TouchEvent, TouchEventCapabilities, + Turn, + VehicleDataResult, VehicleType, VideoStreamingCapability, VideoStreamingFormat, + VrHelpItem, + WeatherAlert, + WeatherData, + WeatherServiceData, + WeatherServiceManifest, + WindowCapability, + WindowTypeCapabilities, }, }, session: { diff --git a/lib/js/dist/SDL.js b/lib/js/dist/SDL.js index 9401f8fe..2a6c4262 100644 --- a/lib/js/dist/SDL.js +++ b/lib/js/dist/SDL.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).SDL=t()}(this,function(){"use strict";function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var n=0;n=n())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+n().toString(16)+" bytes");return 0|e}function h(e,t){if(_.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return w(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return F(e).length;default:if(r)return w(e).length;t=(""+t).toLowerCase(),r=!0}}function E(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function p(e,t,n,r,i){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):2147483647=e.length){if(i)return-1;n=e.length-1}else if(n<0){if(!i)return-1;n=0}if("string"==typeof t&&(t=_.from(t,r)),_.isBuffer(t))return 0===t.length?-1:y(e,t,n,r,i);if("number"==typeof t)return t&=255,_.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):y(e,[t],n,r,i);throw new TypeError("val must be string, number or Buffer")}function y(e,t,n,r,i){var o,s=1,a=e.length,u=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;a/=s=2,u/=2,n/=2}function l(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}if(i){var c=-1;for(o=n;o>8,i=n%256,o.push(i),o.push(r);return o}(t,e.length-n),e,n,r)}function d(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function T(e,t,n){n=Math.min(e.length,n);for(var r=[],i=t;i>>10&1023|55296),c=56320|1023&c),r.push(c),i+=_}return function(e){var t=e.length;if(t<=P)return String.fromCharCode.apply(String,e);var n="",r=0;for(;rthis.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e=e||"utf8";;)switch(e){case"hex":return m(this,t,n);case"utf8":case"utf-8":return T(this,t,n);case"ascii":return v(this,t,n);case"latin1":case"binary":return I(this,t,n);case"base64":return d(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return O(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}.apply(this,arguments)},_.prototype.equals=function(e){if(!_.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===_.compare(this,e)},_.prototype.inspect=function(){var e="",t=U.INSPECT_MAX_BYTES;return 0t&&(e+=" ... ")),""},_.prototype.compare=function(e,t,n,r,i){if(!_.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===i&&(i=this.length),t<0||n>e.length||r<0||i>this.length)throw new RangeError("out of range index");if(i<=r&&n<=t)return 0;if(i<=r)return-1;if(n<=t)return 1;if(this===e)return 0;for(var o=(i>>>=0)-(r>>>=0),s=(n>>>=0)-(t>>>=0),a=Math.min(o,s),u=this.slice(r,i),l=e.slice(t,n),c=0;cthis.length)throw new RangeError("Attempt to write outside buffer bounds");r=r||"utf8";for(var o,s,a,u,l,c,_=!1;;)switch(r){case"hex":return g(this,e,t,n);case"utf8":case"utf-8":return l=t,c=n,Y(w(e,(u=this).length-l),u,l,c);case"ascii":return A(this,e,t,n);case"latin1":case"binary":return A(this,e,t,n);case"base64":return o=this,s=t,a=n,Y(F(e),o,s,a);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,n);default:if(_)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),_=!0}},_.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var P=4096;function v(e,t,n){var r="";n=Math.min(e.length,n);for(var i=t;ie.length)throw new RangeError("Index out of range")}function N(e,t,n,r){t<0&&(t=65535+t+1);for(var i=0,o=Math.min(e.length-n,2);i>>8*(r?i:1-i)}function b(e,t,n,r){t<0&&(t=4294967295+t+1);for(var i=0,o=Math.min(e.length-n,4);i>>8*(r?i:3-i)&255}function k(e,t,n,r){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function M(e,t,n,r,i){return i||k(e,0,n,4),o.write(e,t,n,r,23,4),n+4}function D(e,t,n,r,i){return i||k(e,0,n,8),o.write(e,t,n,r,52,8),n+8}_.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):r>>8):N(this,e,t,!0),t+2},_.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),_.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},_.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),_.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):b(this,e,t,!0),t+4},_.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),_.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):b(this,e,t,!1),t+4},_.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);R(this,e,t,n,i-1,-i)}var o=0,s=1,a=0;for(this[t]=255&e;++o>0)-a&255;return t+n},_.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);R(this,e,t,n,i-1,-i)}var o=n-1,s=1,a=0;for(this[t+o]=255&e;0<=--o&&(s*=256);)e<0&&0===a&&0!==this[t+o+1]&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+n},_.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,127,-128),_.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},_.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),_.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},_.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),_.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},_.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),_.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):b(this,e,t,!0),t+4},_.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),_.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):b(this,e,t,!1),t+4},_.prototype.writeFloatLE=function(e,t,n){return M(this,e,t,!0,n)},_.prototype.writeFloatBE=function(e,t,n){return M(this,e,t,!1,n)},_.prototype.writeDoubleLE=function(e,t,n){return D(this,e,t,!0,n)},_.prototype.writeDoubleBE=function(e,t,n){return D(this,e,t,!1,n)},_.prototype.copy=function(e,t,n,r){if(n=n||0,r||0===r||(r=this.length),t>=e.length&&(t=e.length),t=t||0,0=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t>>=0,n=void 0===n?this.length:n>>>0,"number"==typeof(e=e||0))for(o=t;o>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;o.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return o}function F(e){return r.toByteArray(B(e))}function Y(e,t,n,r){for(var i=0;i=t.length||i>=e.length);++i)t[i+n]=e[i];return i}}).call(U,K(0))},function(module,exports,__webpack_require__){(function(global,Buffer){var _t;_t=function(exports,_long,buffer){_long=_long&&_long.hasOwnProperty("default")?_long.default:_long,buffer=buffer&&buffer.hasOwnProperty("default")?buffer.default:buffer;var commonjsGlobal="undefined"!=typeof window?window:void 0!==global?global:"undefined"!=typeof self?self:{};function createCommonjsModule(e,t){return e(t={exports:{}},t.exports),t.exports}function getCjsExportFromNamespace(e){return e&&e.default||e}var map=createCommonjsModule(function(e){if(void 0!==commonjsGlobal.Map)e.exports=commonjsGlobal.Map,e.exports.Map=commonjsGlobal.Map;else{var t=function(e){this._keys=[],this._values={};for(var t=0;t>8&255,n[1]=e>>16&255,n[0]=e>>24&255,n[4]=PROCESS_UNIQUE[0],n[5]=PROCESS_UNIQUE[1],n[6]=PROCESS_UNIQUE[2],n[7]=PROCESS_UNIQUE[3],n[8]=PROCESS_UNIQUE[4],n[11]=255&t,n[10]=t>>8&255,n[9]=t>>16&255,n}},{key:"createPk",value:function(){return new i}},{key:"createFromTime",value:function(e){var t=Buffer$1.from([0,0,0,0,0,0,0,0,0,0,0,0]);return t[3]=255&e,t[2]=e>>8&255,t[1]=e>>16&255,t[0]=e>>24&255,new i(t)}},{key:"createFromHexString",value:function(e){if(void 0===e||null!=e&&24!==e.length)throw new TypeError("Argument passed in must be a single String of 12 bytes or a string of 24 hex characters");if(hasBufferType)return new i(Buffer$1.from(e,"hex"));for(var t=new _Buffer(12),n=0,r=0;r<24;)t[n++]=decodeLookup[e.charCodeAt(r++)]<<4|decodeLookup[e.charCodeAt(r++)];return new i(t)}},{key:"isValid",value:function(e){return null!=e&&("number"==typeof e||("string"==typeof e?12===e.length||24===e.length&&checkForHexRegExp.test(e):e instanceof i||(e instanceof _Buffer&&12===e.length||!!e.toHexString&&(12===e.id.length||24===e.id.length&&checkForHexRegExp.test(e.id)))))}},{key:"fromExtendedJSON",value:function(e){return new i(e.$oid)}}]),i}();ObjectId.get_inc=deprecate$1(function(){return ObjectId.getInc()},"Please use the static `ObjectId.getInc()` instead"),ObjectId.prototype.get_inc=deprecate$1(function(){return ObjectId.getInc()},"Please use the static `ObjectId.getInc()` instead"),ObjectId.prototype.getInc=deprecate$1(function(){return ObjectId.getInc()},"Please use the static `ObjectId.getInc()` instead"),ObjectId.prototype.generate=deprecate$1(function(e){return ObjectId.generate(e)},"Please use the static `ObjectId.generate(time)` instead"),Object.defineProperty(ObjectId.prototype,"generationTime",{enumerable:!0,get:function(){return this.id[3]|this.id[2]<<8|this.id[1]<<16|this.id[0]<<24},set:function(e){this.id[3]=255&e,this.id[2]=e>>8&255,this.id[1]=e>>16&255,this.id[0]=e>>24&255}}),ObjectId.prototype[util$2.inspect.custom||"inspect"]=ObjectId.prototype.toString,ObjectId.index=~~(16777215*Math.random()),Object.defineProperty(ObjectId.prototype,"_bsontype",{value:"ObjectID"});var objectid=ObjectId;function _classCallCheck$3(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties$3(e,t){for(var n=0;n>>0,r=t.high>>>0;return n>>0>>0}function invalidErr(e,t){throw new TypeError('"'.concat(e,'" is not a valid Decimal128 string - ').concat(t))}function Decimal128(e){this.bytes=e}Decimal128.fromString=function(e){var t,n=!1,r=!1,i=!1,o=0,s=0,a=0,u=0,l=0,c=[0],_=0,f=0,h=0,E=0,p=0,y=0,g=[0,0],A=[0,0],S=0;if(7e3<=e.length)throw new TypeError(e+" not a valid Decimal128 string");var d=e.match(PARSE_STRING_REGEXP),T=e.match(PARSE_INF_REGEXP),P=e.match(PARSE_NAN_REGEXP);if(!d&&!T&&!P||0===e.length)throw new TypeError(e+" not a valid Decimal128 string");if(d){var v=d[2],I=d[4],m=d[5],O=d[6];I&&void 0===O&&invalidErr(e,"missing exponent power"),I&&void 0===v&&invalidErr(e,"missing exponent base"),void 0===I&&(m||O)&&invalidErr(e,"missing e before exponent")}if("+"!==e[S]&&"-"!==e[S]||(n="-"===e[S++]),!isDigit(e[S])&&"."!==e[S]){if("i"===e[S]||"I"===e[S])return new Decimal128(Buffer$2.from(n?INF_NEGATIVE_BUFFER:INF_POSITIVE_BUFFER));if("N"===e[S])return new Decimal128(Buffer$2.from(NAN_BUFFER))}for(;isDigit(e[S])||"."===e[S];)"."!==e[S]?(_<34&&("0"===e[S]&&!i||(i||(l=s),i=!0,c[f++]=parseInt(e[S],10),_+=1)),i&&(a+=1),r&&(u+=1),s+=1):(r&&invalidErr(e,"contains multiple periods"),r=!0),S+=1;if(r&&!s)throw new TypeError(e+" not a valid Decimal128 string");if("e"===e[S]||"E"===e[S]){var C=e.substr(++S).match(EXPONENT_REGEX);if(!C||!C[2])return new Decimal128(Buffer$2.from(NAN_BUFFER));p=parseInt(C[0],10),S+=C[0].length}if(e[S])return new Decimal128(Buffer$2.from(NAN_BUFFER));if(h=0,_){if(E=_-1,1!==(o=a))for(;"0"===e[l+o-1];)o-=1}else _=a=1,o=c[E=h=0]=0;for(p<=u&&16384>8&255,w[S++]=L.low.low>>16&255,w[S++]=L.low.low>>24&255,w[S++]=255&L.low.high,w[S++]=L.low.high>>8&255,w[S++]=L.low.high>>16&255,w[S++]=L.low.high>>24&255,w[S++]=255&L.high.low,w[S++]=L.high.low>>8&255,w[S++]=L.high.low>>16&255,w[S++]=L.high.low>>24&255,w[S++]=255&L.high.high,w[S++]=L.high.high>>8&255,w[S++]=L.high.high>>16&255,w[S++]=L.high.high>>24&255,new Decimal128(w)};var COMBINATION_MASK=31,EXPONENT_MASK=16383,COMBINATION_INFINITY=30,COMBINATION_NAN=31;Decimal128.prototype.toString=function(){for(var e,t,n,r,i,o,s=0,a=new Array(36),u=0;u>26&COMBINATION_MASK)>>3==3){if(i===COMBINATION_INFINITY)return g.join("")+"Infinity";if(i===COMBINATION_NAN)return"NaN";o=e>>15&EXPONENT_MASK,_=8+(e>>14&1)}else _=e>>14&7,o=e>>17&EXPONENT_MASK;if(l=o-EXPONENT_BIAS,y.parts[0]=(16383&e)+((15&_)<<14),y.parts[1]=t,y.parts[2]=n,y.parts[3]=r,0===y.parts[0]&&0===y.parts[1]&&0===y.parts[2]&&0===y.parts[3])p=!0;else for(h=3;0<=h;h--){var S=0,d=divideu128(y);if(y=d.quotient,S=d.rem.low)for(f=8;0<=f;f--)a[9*h+f]=S%10,S=Math.floor(S/10)}if(p)s=1,a[E]=0;else for(s=36;!a[E];)s-=1,E+=1;if(34<=(c=s-1+l)||c<=-7||0this.position)this.buffer[this.position++]=t;else if(void 0!==Buffer$3&&Buffer$3.isBuffer(this.buffer)){var n=Buffer$3.alloc(o.BUFFER_SIZE+this.buffer.length);this.buffer.copy(n,0,0,this.buffer.length),this.buffer=n,this.buffer[this.position++]=t}else{var r=null;r=isUint8Array(this.buffer)?new Uint8Array(new ArrayBuffer(o.BUFFER_SIZE+this.buffer.length)):new Array(o.BUFFER_SIZE+this.buffer.length);for(var i=0;ithis.position?t+e.length:this.position;else if(void 0!==Buffer$3&&"string"==typeof e&&Buffer$3.isBuffer(this.buffer))this.buffer.write(e,t,"binary"),this.position=t+e.length>this.position?t+e.length:this.position;else if(isUint8Array(e)||Array.isArray(e)&&"string"!=typeof e){for(var i=0;ithis.position?t:this.position}else if("string"==typeof e){for(var o=0;othis.position?t:this.position}}},{key:"read",value:function(e,t){if(t=t&&0= 5, is ".concat(i));if(t.allowObjectSmallerThanBufferSize&&e.length= bson size ").concat(i));if(!t.allowObjectSmallerThanBufferSize&&e.length!==i)throw new Error("buffer length ".concat(e.length," must === bson size ").concat(i));if(i+r>e.length)throw new Error("(bson size ".concat(i," + options.index ").concat(r," must be <= buffer length ").concat(Buffer$4.byteLength(e),")"));if(0!==e[r+i-1])throw new Error("One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00");return deserializeObject(e,r,t,n)}function deserializeObject(e,t,n,r){var i=null!=n.evalFunctions&&n.evalFunctions,o=null!=n.cacheFunctions&&n.cacheFunctions,s=null!=n.cacheFunctionsCrc32&&n.cacheFunctionsCrc32;if(!s)var a=null;var u=null==n.fieldsAsRaw?null:n.fieldsAsRaw,l=null!=n.raw&&n.raw,c="boolean"==typeof n.bsonRegExp&&n.bsonRegExp,_=null!=n.promoteBuffers&&n.promoteBuffers,f=null==n.promoteLongs||n.promoteLongs,h=null==n.promoteValues||n.promoteValues,E=t;if(e.length<5)throw new Error("corrupt bson message < 5 bytes long");var p=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;if(p<5||p>e.length)throw new Error("corrupt bson message");for(var y=r?[]:{},g=0;;){var A=e[t++];if(0===A)break;for(var S=t;0!==e[S]&&S=Buffer$4.byteLength(e))throw new Error("Bad BSON Document: illegal CString");var d=r?g++:e.toString("utf8",t,S);if(t=S+1,A===constants.BSON_DATA_STRING){var T=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;if(T<=0||T>e.length-t||0!==e[t+T-1])throw new Error("bad string length in bson");if(!validateUtf8$1(e,t,t+T-1))throw new Error("Invalid UTF-8 string in BSON document");var P=e.toString("utf8",t,t+T-1);y[d]=P,t+=T}else if(A===constants.BSON_DATA_OID){var v=Buffer$4.alloc(12);e.copy(v,0,t,t+12),y[d]=new objectid(v),t+=12}else if(A===constants.BSON_DATA_INT&&!1===h)y[d]=new int_32(e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24);else if(A===constants.BSON_DATA_INT)y[d]=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;else if(A===constants.BSON_DATA_NUMBER&&!1===h)y[d]=new double_1(e.readDoubleLE(t)),t+=8;else if(A===constants.BSON_DATA_NUMBER)y[d]=e.readDoubleLE(t),t+=8;else if(A===constants.BSON_DATA_DATE){var I=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24,m=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;y[d]=new Date(new long_1(I,m).toNumber())}else if(A===constants.BSON_DATA_BOOLEAN){if(0!==e[t]&&1!==e[t])throw new Error("illegal boolean type value");y[d]=1===e[t++]}else if(A===constants.BSON_DATA_OBJECT){var O=t,C=e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24;if(C<=0||C>e.length-t)throw new Error("bad embedded document length in bson");y[d]=l?e.slice(t,t+C):deserializeObject(e,O,n,!1),t+=C}else if(A===constants.BSON_DATA_ARRAY){var R=t,N=e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24,b=n,k=t+N;if(u&&u[d]){for(var M in b={},n)b[M]=n[M];b.raw=!0}if(y[d]=deserializeObject(e,R,b,!0),0!==e[(t+=N)-1])throw new Error("invalid array terminator byte");if(t!==k)throw new Error("corrupted array bson")}else if(A===constants.BSON_DATA_UNDEFINED)y[d]=void 0;else if(A===constants.BSON_DATA_NULL)y[d]=null;else if(A===constants.BSON_DATA_LONG){var D=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24,B=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24,L=new long_1(D,B);y[d]=f&&!0===h&&L.lessThanOrEqual(JS_INT_MAX_LONG)&&L.greaterThanOrEqual(JS_INT_MIN_LONG)?L.toNumber():L}else if(A===constants.BSON_DATA_DECIMAL128){var w=Buffer$4.alloc(16);e.copy(w,0,t,t+16),t+=16;var F=new decimal128(w);y[d]=F.toObject?F.toObject():F}else if(A===constants.BSON_DATA_BINARY){var Y=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24,U=Y,K=e[t++];if(Y<0)throw new Error("Negative binary type element size found");if(Y>Buffer$4.byteLength(e))throw new Error("Binary type size larger than document size");if(null!=e.slice){if(K===binary.SUBTYPE_BYTE_ARRAY){if((Y=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24)<0)throw new Error("Negative binary type element size found for subtype 0x02");if(U-4=e.length)throw new Error("Bad BSON Document: illegal CString");var H=e.toString("utf8",t,S);for(S=t=S+1;0!==e[S]&&S=e.length)throw new Error("Bad BSON Document: illegal CString");var x=e.toString("utf8",t,S);t=S+1;var G=new Array(x.length);for(S=0;S=e.length)throw new Error("Bad BSON Document: illegal CString");var j=e.toString("utf8",t,S);for(S=t=S+1;0!==e[S]&&S=e.length)throw new Error("Bad BSON Document: illegal CString");var $=e.toString("utf8",t,S);t=S+1,y[d]=new regexp(j,$)}else if(A===constants.BSON_DATA_SYMBOL){var z=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;if(z<=0||z>e.length-t||0!==e[t+z-1])throw new Error("bad string length in bson");y[d]=e.toString("utf8",t,t+z-1),t+=z}else if(A===constants.BSON_DATA_TIMESTAMP){var W=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24,X=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;y[d]=new timestamp(W,X)}else if(A===constants.BSON_DATA_MIN_KEY)y[d]=new min_key;else if(A===constants.BSON_DATA_MAX_KEY)y[d]=new max_key;else if(A===constants.BSON_DATA_CODE){var J=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;if(J<=0||J>e.length-t||0!==e[t+J-1])throw new Error("bad string length in bson");var Z=e.toString("utf8",t,t+J-1);if(i)if(o){var q=s?a(Z):Z;y[d]=isolateEvalWithHash(functionCache,q,Z,y)}else y[d]=isolateEval(Z);else y[d]=new code(Z);t+=J}else if(A===constants.BSON_DATA_CODE_W_SCOPE){var Q=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;if(Q<13)throw new Error("code_w_scope total size shorter minimum expected length");var ee=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;if(ee<=0||ee>e.length-t||0!==e[t+ee-1])throw new Error("bad string length in bson");var te=e.toString("utf8",t,t+ee-1),ne=t+=ee,re=e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24,ie=deserializeObject(e,ne,n,!1);if(t+=re,Q<8+re+ee)throw new Error("code_w_scope total size is to short, truncating scope");if(8+re+eee.length-t||0!==e[t+se-1])throw new Error("bad string length in bson");if(!validateUtf8$1(e,t,t+se-1))throw new Error("Invalid UTF-8 string in BSON document");var ae=e.toString("utf8",t,t+se-1);t+=se;var ue=Buffer$4.alloc(12);e.copy(ue,0,t,t+12);var le=new objectid(ue);t+=12,y[d]=new db_ref(ae,le)}}if(p!=t-E){if(r)throw new Error("corrupt array bson");throw new Error("corrupt object bson")}var ce=Object.keys(y).filter(function(e){return e.startsWith("$")}),_e=!0;if(ce.forEach(function(e){-1===["$ref","$id","$db"].indexOf(e)&&(_e=!1)}),!_e)return y;if(null==y.$id||null==y.$ref)return y;var fe=Object.assign({},y);return delete fe.$ref,delete fe.$id,delete fe.$db,new db_ref(y.$ref,y.$id,y.$db||null,fe)}function isolateEvalWithHash(functionCache,hash,functionString,object){var value=null;return null==functionCache[hash]&&(eval("value = "+functionString),functionCache[hash]=value),functionCache[hash].bind(object)}function isolateEval(functionString){var value=null;return eval("value = "+functionString),value}var deserializer=deserialize$1;function readIEEE754(e,t,n,r,i){var o,s,a="big"===n,u=8*i-r-1,l=(1<>1,_=-7,f=a?0:i-1,h=a?1:-1,E=e[t+f];for(f+=h,o=E&(1<<-_)-1,E>>=-_,_+=u;0<_;o=256*o+e[t+f],f+=h,_-=8);for(s=o&(1<<-_)-1,o>>=-_,_+=r;0<_;s=256*s+e[t+f],f+=h,_-=8);if(0===o)o=1-c;else{if(o===l)return s?NaN:1/0*(E?-1:1);s+=Math.pow(2,r),o-=c}return(E?-1:1)*s*Math.pow(2,o-r)}function writeIEEE754(e,t,n,r,i,o){var s,a,u,l="big"===r,c=8*o-i-1,_=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,E=l?o-1:0,p=l?-1:1,y=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,s=_):(s=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-s))<1&&(s--,u*=2),2<=(t+=1<=s+f?h/u:h*Math.pow(2,1-f))*u&&(s++,u/=2),_<=s+f?(a=0,s=_):1<=s+f?(a=(t*u-1)*Math.pow(2,i),s+=f):(a=t*Math.pow(2,f-1)*Math.pow(2,i),s=0)),isNaN(t)&&(a=0);8<=i;)e[n+E]=255&a,E+=p,a/=256,i-=8;for(s=s<>24&255,e[r+2]=s+1>>16&255,e[r+1]=s+1>>8&255,e[r]=s+1&255,r=r+4+s,e[r++]=0,r}function serializeNumber(e,t,n,r,i){if(Math.floor(n)===n&&n>=constants.JS_INT_MIN&&n<=constants.JS_INT_MAX)if(n>=constants.BSON_INT32_MIN&&n<=constants.BSON_INT32_MAX)e[r++]=constants.BSON_DATA_INT,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,e[r++]=255&n,e[r++]=n>>8&255,e[r++]=n>>16&255,e[r++]=n>>24&255;else if(n>=constants.JS_INT_MIN&&n<=constants.JS_INT_MAX){e[r++]=constants.BSON_DATA_NUMBER,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,writeIEEE754$1(e,n,r,"little",52,8),r+=8}else{e[r++]=constants.BSON_DATA_LONG,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var o=long_1.fromNumber(n),s=o.getLowBits(),a=o.getHighBits();e[r++]=255&s,e[r++]=s>>8&255,e[r++]=s>>16&255,e[r++]=s>>24&255,e[r++]=255&a,e[r++]=a>>8&255,e[r++]=a>>16&255,e[r++]=a>>24&255}else e[r++]=constants.BSON_DATA_NUMBER,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,writeIEEE754$1(e,n,r,"little",52,8),r+=8;return r}function serializeNull(e,t,n,r,i){return e[r++]=constants.BSON_DATA_NULL,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,r}function serializeBoolean(e,t,n,r,i){return e[r++]=constants.BSON_DATA_BOOLEAN,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,e[r++]=n?1:0,r}function serializeDate(e,t,n,r,i){e[r++]=constants.BSON_DATA_DATE,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var o=long_1.fromNumber(n.getTime()),s=o.getLowBits(),a=o.getHighBits();return e[r++]=255&s,e[r++]=s>>8&255,e[r++]=s>>16&255,e[r++]=s>>24&255,e[r++]=255&a,e[r++]=a>>8&255,e[r++]=a>>16&255,e[r++]=a>>24&255,r}function serializeRegExp(e,t,n,r,i){if(e[r++]=constants.BSON_DATA_REGEXP,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,n.source&&null!=n.source.match(regexp$1))throw Error("value "+n.source+" must not contain null bytes");return r+=e.write(n.source,r,"utf8"),e[r++]=0,n.ignoreCase&&(e[r++]=105),n.global&&(e[r++]=115),n.multiline&&(e[r++]=109),e[r++]=0,r}function serializeBSONRegExp(e,t,n,r,i){if(e[r++]=constants.BSON_DATA_REGEXP,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,null!=n.pattern.match(regexp$1))throw Error("pattern "+n.pattern+" must not contain null bytes");return r+=e.write(n.pattern,r,"utf8"),e[r++]=0,r+=e.write(n.options.split("").sort().join(""),r,"utf8"),e[r++]=0,r}function serializeMinMax(e,t,n,r,i){return null===n?e[r++]=constants.BSON_DATA_NULL:"MinKey"===n._bsontype?e[r++]=constants.BSON_DATA_MIN_KEY:e[r++]=constants.BSON_DATA_MAX_KEY,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,r}function serializeObjectId(e,t,n,r,i){if(e[r++]=constants.BSON_DATA_OID,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,"string"==typeof n.id)e.write(n.id,r,"binary");else{if(!n.id||!n.id.copy)throw new TypeError("object ["+JSON.stringify(n)+"] is not a valid ObjectId");n.id.copy(e,r,0,12)}return r+12}function serializeBuffer(e,t,n,r,i){e[r++]=constants.BSON_DATA_BINARY,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var o=n.length;return e[r++]=255&o,e[r++]=o>>8&255,e[r++]=o>>16&255,e[r++]=o>>24&255,e[r++]=constants.BSON_BINARY_SUBTYPE_DEFAULT,n.copy(e,r,0,o),r+=o}function serializeObject(e,t,n,r,i,o,s,a,u,l){for(var c=0;c>8&255,e[r++]=o>>16&255,e[r++]=o>>24&255,e[r++]=255&s,e[r++]=s>>8&255,e[r++]=s>>16&255,e[r++]=s>>24&255,r}function serializeInt32(e,t,n,r,i){return e[r++]=constants.BSON_DATA_INT,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,e[r++]=255&n,e[r++]=n>>8&255,e[r++]=n>>16&255,e[r++]=n>>24&255,r}function serializeDouble(e,t,n,r,i){return e[r++]=constants.BSON_DATA_NUMBER,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,writeIEEE754$1(e,n.value,r,"little",52,8),r+=8}function serializeFunction(e,t,n,r,i,o,s){e[r++]=constants.BSON_DATA_CODE,r+=s?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var a=normalizedFunctionString$1(n),u=e.write(a,r+4,"utf8")+1;return e[r]=255&u,e[r+1]=u>>8&255,e[r+2]=u>>16&255,e[r+3]=u>>24&255,r=r+4+u-1,e[r++]=0,r}function serializeCode(e,t,n,r,i,o,s,a,u){if(n.scope&&"object"===_typeof$3(n.scope)){e[r++]=constants.BSON_DATA_CODE_W_SCOPE,r+=u?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var l=r,c="string"==typeof n.code?n.code:n.code.toString();r+=4;var _=e.write(c,r+4,"utf8")+1;e[r]=255&_,e[r+1]=_>>8&255,e[r+2]=_>>16&255,e[r+3]=_>>24&255,e[r+4+_-1]=0,r=r+_+4;var f=serializeInto(e,n.scope,i,r,o+1,s,a);r=f-1;var h=f-l;e[l++]=255&h,e[l++]=h>>8&255,e[l++]=h>>16&255,e[l++]=h>>24&255,e[r++]=0}else{e[r++]=constants.BSON_DATA_CODE,r+=u?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var E=n.code.toString(),p=e.write(E,r+4,"utf8")+1;e[r]=255&p,e[r+1]=p>>8&255,e[r+2]=p>>16&255,e[r+3]=p>>24&255,r=r+4+p-1,e[r++]=0}return r}function serializeBinary(e,t,n,r,i){e[r++]=constants.BSON_DATA_BINARY,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var o=n.value(!0),s=n.position;return n.sub_type===binary.SUBTYPE_BYTE_ARRAY&&(s+=4),e[r++]=255&s,e[r++]=s>>8&255,e[r++]=s>>16&255,e[r++]=s>>24&255,e[r++]=n.sub_type,n.sub_type===binary.SUBTYPE_BYTE_ARRAY&&(s-=4,e[r++]=255&s,e[r++]=s>>8&255,e[r++]=s>>16&255,e[r++]=s>>24&255),o.copy(e,r,0,n.position),r+=n.position}function serializeSymbol(e,t,n,r,i){e[r++]=constants.BSON_DATA_SYMBOL,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var o=e.write(n.value,r+4,"utf8")+1;return e[r]=255&o,e[r+1]=o>>8&255,e[r+2]=o>>16&255,e[r+3]=o>>24&255,r=r+4+o-1,e[r++]=0,r}function serializeDBRef(e,t,n,r,i,o,s){e[r++]=constants.BSON_DATA_OBJECT,r+=s?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var a,u=r,l={$ref:n.collection||n.namespace,$id:n.oid};null!=n.db&&(l.$db=n.db);var c=(a=serializeInto(e,l=Object.assign(l,n.fields),!1,r,i+1,o))-u;return e[u++]=255&c,e[u++]=c>>8&255,e[u++]=c>>16&255,e[u++]=c>>24&255,a}function serializeInto(e,t,n,r,i,o,s,a){r=r||0,(a=a||[]).push(t);var u=r+4;if(Array.isArray(t))for(var l=0;l>8&255,e[r++]=P>>16&255,e[r++]=P>>24&255,u}var serializer=serializeInto;function _typeof$4(e){return(_typeof$4="function"==typeof Symbol&&"symbol"===_typeof(Symbol.iterator)?function(e){return _typeof(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":_typeof(e)})(e)}var Buffer$6=buffer.Buffer,normalizedFunctionString$2=utils.normalizedFunctionString;function isDate$2(e){return"object"===_typeof$4(e)&&"[object Date]"===Object.prototype.toString.call(e)}function calculateObjectSize(e,t,n){var r=5;if(Array.isArray(e))for(var i=0;i=constants.JS_INT_MIN&&t<=constants.JS_INT_MAX&&t>=constants.BSON_INT32_MIN&&t<=constants.BSON_INT32_MAX?(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+5:(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+9;case"undefined":return r||!i?(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+1:0;case"boolean":return(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+2;case"object":if(null==t||"MinKey"===t._bsontype||"MaxKey"===t._bsontype)return(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+1;if("ObjectId"===t._bsontype||"ObjectID"===t._bsontype)return(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+13;if(t instanceof Date||isDate$2(t))return(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+9;if(void 0!==Buffer$6&&Buffer$6.isBuffer(t))return(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+6+t.length;if("Long"===t._bsontype||"Double"===t._bsontype||"Timestamp"===t._bsontype)return(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+9;if("Decimal128"===t._bsontype)return(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+17;if("Code"===t._bsontype)return null!=t.scope&&0>16&255,s[a++]=t>>8&255,s[a++]=255&t;2===o&&(t=l[e.charCodeAt(n)]<<2|l[e.charCodeAt(n+1)]>>4,s[a++]=255&t);1===o&&(t=l[e.charCodeAt(n)]<<10|l[e.charCodeAt(n+1)]<<4|l[e.charCodeAt(n+2)]>>2,s[a++]=t>>8&255,s[a++]=255&t);return s},t.fromByteArray=function(e){for(var t,n=e.length,r=n%3,i=[],o=0,s=n-r;o>2]+a[t<<4&63]+"==")):2==r&&(t=(e[n-2]<<8)+e[n-1],i.push(a[t>>10]+a[t>>4&63]+a[t<<2&63]+"="));return i.join("")};for(var a=[],l=[],c="undefined"!=typeof Uint8Array?Uint8Array:Array,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=0,o=r.length;i>18&63]+a[i>>12&63]+a[i>>6&63]+a[63&i]);return o.join("")}l["-".charCodeAt(0)]=62,l["_".charCodeAt(0)]=63},function(e,t){t.read=function(e,t,n,r,i){var o,s,a=8*i-r-1,u=(1<>1,c=-7,_=n?i-1:0,f=n?-1:1,h=e[t+_];for(_+=f,o=h&(1<<-c)-1,h>>=-c,c+=a;0>=-c,c+=r;0>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:o-1,E=r?1:-1,p=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,s=c):(s=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-s))<1&&(s--,u*=2),2<=(t+=1<=s+_?f/u:f*Math.pow(2,1-_))*u&&(s++,u/=2),c<=s+_?(a=0,s=c):1<=s+_?(a=(t*u-1)*Math.pow(2,i),s+=_):(a=t*Math.pow(2,_-1)*Math.pow(2,i),s=0));8<=i;e[n+h]=255&a,h+=E,a/=256,i-=8);for(s=s<>>=0)&&e<256)&&(r=s[e])?r:(n=y(e,(0|e)<0?-1:0,!0),i&&(s[e]=n),n):(i=-128<=(e|=0)&&e<128)&&(r=o[e])?r:(n=y(e,e<0?-1:0,!1),i&&(o[e]=n),n)}function p(e,t){if(isNaN(e))return t?l:S;if(t){if(e<0)return l;if(a<=e)return v}else{if(e<=-u)return I;if(u<=e+1)return P}return e<0?p(-e,t).neg():y(e%i|0,e/i|0,t)}function y(e,t,n){return new r(e,t,n)}r.fromInt=n,r.fromNumber=p,r.fromBits=y;var c=Math.pow;function _(e,t,n){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return S;if(t="number"==typeof t?(n=t,!1):!!t,(n=n||10)<2||36>>0:this.low},m.toNumber=function(){return this.unsigned?(this.high>>>0)*i+(this.low>>>0):this.high*i+(this.low>>>0)},m.toString=function(e){if((e=e||10)<2||36>>0).toString(e);if((o=a).isZero())return u+s;for(;u.length<6;)u="0"+u;s=""+u+s}},m.getHighBits=function(){return this.high},m.getHighBitsUnsigned=function(){return this.high>>>0},m.getLowBits=function(){return this.low},m.getLowBitsUnsigned=function(){return this.low>>>0},m.getNumBitsAbs=function(){if(this.isNegative())return this.eq(I)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;0>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},m.eq=m.equals,m.notEquals=function(e){return!this.eq(e)},m.neq=m.notEquals,m.ne=m.notEquals,m.lessThan=function(e){return this.comp(e)<0},m.lt=m.lessThan,m.lessThanOrEqual=function(e){return this.comp(e)<=0},m.lte=m.lessThanOrEqual,m.le=m.lessThanOrEqual,m.greaterThan=function(e){return 0>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},m.comp=m.compare,m.negate=function(){return!this.unsigned&&this.eq(I)?I:this.not().add(f)},m.neg=m.negate,m.add=function(e){E(e)||(e=g(e));var t=this.high>>>16,n=65535&this.high,r=this.low>>>16,i=65535&this.low,o=e.high>>>16,s=65535&e.high,a=e.low>>>16,u=0,l=0,c=0,_=0;return c+=(_+=i+(65535&e.low))>>>16,l+=(c+=r+a)>>>16,u+=(l+=n+s)>>>16,u+=t+o,y((c&=65535)<<16|(_&=65535),(u&=65535)<<16|(l&=65535),this.unsigned)},m.subtract=function(e){return E(e)||(e=g(e)),this.add(e.neg())},m.sub=m.subtract,m.multiply=function(e){if(this.isZero())return S;if(E(e)||(e=g(e)),h)return y(h.mul(this.low,this.high,e.low,e.high),h.get_high(),this.unsigned);if(e.isZero())return S;if(this.eq(I))return e.isOdd()?I:S;if(e.eq(I))return this.isOdd()?I:S;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(A)&&e.lt(A))return p(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,n=65535&this.high,r=this.low>>>16,i=65535&this.low,o=e.high>>>16,s=65535&e.high,a=e.low>>>16,u=65535&e.low,l=0,c=0,_=0,f=0;return _+=(f+=i*u)>>>16,c+=(_+=r*u)>>>16,_&=65535,c+=(_+=i*a)>>>16,l+=(c+=n*u)>>>16,c&=65535,l+=(c+=r*a)>>>16,c&=65535,l+=(c+=i*s)>>>16,l+=t*u+n*a+r*s+i*o,y((_&=65535)<<16|(f&=65535),(l&=65535)<<16|(c&=65535),this.unsigned)},m.mul=m.multiply,m.divide=function(e){if(E(e)||(e=g(e)),e.isZero())throw Error("division by zero");var t,n,r;if(h)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?y((this.unsigned?h.div_u:h.div_s)(this.low,this.high,e.low,e.high),h.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?l:S;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return l;if(e.gt(this.shru(1)))return d;r=l}else{if(this.eq(I))return e.eq(f)||e.eq(T)?I:e.eq(I)?f:(t=this.shr(1).div(e).shl(1)).eq(S)?e.isNegative()?f:T:(n=this.sub(e.mul(t)),r=t.add(n.div(e)));else if(e.eq(I))return this.unsigned?l:S;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();r=S}for(n=this;n.gte(e);){t=Math.max(1,Math.floor(n.toNumber()/e.toNumber()));for(var i=Math.ceil(Math.log(t)/Math.LN2),o=i<=48?1:c(2,i-48),s=p(t),a=s.mul(e);a.isNegative()||a.gt(n);)a=(s=p(t-=o,this.unsigned)).mul(e);s.isZero()&&(s=f),r=r.add(s),n=n.sub(a)}return r},m.div=m.divide,m.modulo=function(e){return E(e)||(e=g(e)),h?y((this.unsigned?h.rem_u:h.rem_s)(this.low,this.high,e.low,e.high),h.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},m.mod=m.modulo,m.rem=m.modulo,m.not=function(){return y(~this.low,~this.high,this.unsigned)},m.and=function(e){return E(e)||(e=g(e)),y(this.low&e.low,this.high&e.high,this.unsigned)},m.or=function(e){return E(e)||(e=g(e)),y(this.low|e.low,this.high|e.high,this.unsigned)},m.xor=function(e){return E(e)||(e=g(e)),y(this.low^e.low,this.high^e.high,this.unsigned)},m.shiftLeft=function(e){return E(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?y(this.low<>>32-e,this.unsigned):y(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):y(this.high>>e-32,0<=this.high?0:-1,this.unsigned)},m.shr=m.shiftRight,m.shiftRightUnsigned=function(e){if(E(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?y(this.low>>>e|t<<32-e,t>>>e,this.unsigned):y(32===e?t:t>>>e-32,0,this.unsigned)},m.shru=m.shiftRightUnsigned,m.shr_u=m.shiftRightUnsigned,m.toSigned=function(){return this.unsigned?y(this.low,this.high,!1):this},m.toUnsigned=function(){return this.unsigned?this:y(this.low,this.high,!0)},m.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},m.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},m.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},r.fromBytes=function(e,t,n){return n?r.fromBytesLE(e,t):r.fromBytesBE(e,t)},r.fromBytesLE=function(e,t){return new r(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},r.fromBytesBE=function(e,t){return new r(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}}],ak={},bk.m=_j,bk.c=ak,bk.d=function(e,t,n){bk.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},bk.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return bk.d(t,"a",t),t},bk.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},bk.p="",bk(bk.s=2))}),BSON=unwrapExports(bson_common),bson=BSON.bson,Bson=function(){function e(){_classCallCheck(this,e)}return _createClass(e,null,[{key:"serialize",value:function(e){return bson.serialize(e)}},{key:"deserialize",value:function(e){return bson.deserialize(e)}}]),e}(),SdlPacket=function(){function _(){var e=0>24,l[c++]=(16711680&s)>>16,l[c++]=(65280&s)>>8,l[c++]=255&s,1>24,l[c++]=(16711680&a)>>16,l[c++]=(65280&a)>>8,l[c++]=255&a),null!==u&&0>16&255,o[a++]=r>>8&255,o[a++]=255&r;return 2==i?(r=revLookup[e.charCodeAt(t)]<<2|revLookup[e.charCodeAt(t+1)]>>4,o[a++]=255&r):1==i&&(r=revLookup[e.charCodeAt(t)]<<10|revLookup[e.charCodeAt(t+1)]<<4|revLookup[e.charCodeAt(t+2)]>>2,o[a++]=r>>8&255,o[a++]=255&r),o}function tripletToBase64(e){return lookup[e>>18&63]+lookup[e>>12&63]+lookup[e>>6&63]+lookup[63&e]}function encodeChunk(e,t,n){for(var r,i=[],o=t;o>2],i+=lookup[t<<4&63],i+="=="):2==r&&(t=(e[n-2]<<8)+e[n-1],i+=lookup[t>>10],i+=lookup[t>>4&63],i+=lookup[t<<2&63],i+="="),o.push(i),o.join("")}function read(e,t,n,r,i){var o,s,a=8*i-r-1,u=(1<>1,c=-7,_=n?i-1:0,f=n?-1:1,h=e[t+_];for(_+=f,o=h&(1<<-c)-1,h>>=-c,c+=a;0>=-c,c+=r;0>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:o-1,E=r?1:-1,p=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,s=c):(s=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-s))<1&&(s--,u*=2),2<=(t+=1<=s+_?f/u:f*Math.pow(2,1-_))*u&&(s++,u/=2),c<=s+_?(a=0,s=c):1<=s+_?(a=(t*u-1)*Math.pow(2,i),s+=_):(a=t*Math.pow(2,_-1)*Math.pow(2,i),s=0));8<=i;e[n+h]=255&a,h+=E,a/=256,i-=8);for(s=s<=kMaxLength())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+kMaxLength().toString(16)+" bytes");return 0|e}function internalIsBuffer(e){return!(null==e||!e._isBuffer)}function byteLength(e,t){if(internalIsBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return utf8ToBytes(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return base64ToBytes(e).length;default:if(r)return utf8ToBytes(e).length;t=(""+t).toLowerCase(),r=!0}}function slowToString(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e=e||"utf8";;)switch(e){case"hex":return hexSlice(this,t,n);case"utf8":case"utf-8":return utf8Slice(this,t,n);case"ascii":return asciiSlice(this,t,n);case"latin1":case"binary":return latin1Slice(this,t,n);case"base64":return base64Slice(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}function swap(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function bidirectionalIndexOf(e,t,n,r,i){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):2147483647=e.length){if(i)return-1;n=e.length-1}else if(n<0){if(!i)return-1;n=0}if("string"==typeof t&&(t=Buffer.from(t,r)),internalIsBuffer(t))return 0===t.length?-1:arrayIndexOf(e,t,n,r,i);if("number"==typeof t)return t&=255,Buffer.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):arrayIndexOf(e,[t],n,r,i);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(e,t,n,r,i){var o,s=1,a=e.length,u=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;a/=s=2,u/=2,n/=2}function l(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}if(i){var c=-1;for(o=n;o>>10&1023|55296),c=56320|1023&c),r.push(c),i+=_}return decodeCodePointsArray(r)}Buffer.TYPED_ARRAY_SUPPORT=void 0===global$1.TYPED_ARRAY_SUPPORT||global$1.TYPED_ARRAY_SUPPORT,Buffer.poolSize=8192,Buffer._augment=function(e){return e.__proto__=Buffer.prototype,e},Buffer.from=function(e,t,n){return from(null,e,t,n)},Buffer.TYPED_ARRAY_SUPPORT&&(Buffer.prototype.__proto__=Uint8Array.prototype,Buffer.__proto__=Uint8Array),Buffer.alloc=function(e,t,n){return alloc(null,e,t,n)},Buffer.allocUnsafe=function(e){return allocUnsafe(null,e)},Buffer.allocUnsafeSlow=function(e){return allocUnsafe(null,e)},Buffer.isBuffer=isBuffer,Buffer.compare=function(e,t){if(!internalIsBuffer(e)||!internalIsBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var n=e.length,r=t.length,i=0,o=Math.min(n,r);it&&(e+=" ... ")),""},Buffer.prototype.compare=function(e,t,n,r,i){if(!internalIsBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===i&&(i=this.length),t<0||n>e.length||r<0||i>this.length)throw new RangeError("out of range index");if(i<=r&&n<=t)return 0;if(i<=r)return-1;if(n<=t)return 1;if(this===e)return 0;for(var o=(i>>>=0)-(r>>>=0),s=(n>>>=0)-(t>>>=0),a=Math.min(o,s),u=this.slice(r,i),l=e.slice(t,n),c=0;cthis.length)throw new RangeError("Attempt to write outside buffer bounds");r=r||"utf8";for(var o=!1;;)switch(r){case"hex":return hexWrite(this,e,t,n);case"utf8":case"utf-8":return utf8Write(this,e,t,n);case"ascii":return asciiWrite(this,e,t,n);case"latin1":case"binary":return latin1Write(this,e,t,n);case"base64":return base64Write(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,e,t,n);default:if(o)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),o=!0}},Buffer.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var MAX_ARGUMENTS_LENGTH=4096;function decodeCodePointsArray(e){var t=e.length;if(t<=MAX_ARGUMENTS_LENGTH)return String.fromCharCode.apply(String,e);for(var n="",r=0;re.length)throw new RangeError("Index out of range")}function objectWriteUInt16(e,t,n,r){t<0&&(t=65535+t+1);for(var i=0,o=Math.min(e.length-n,2);i>>8*(r?i:1-i)}function objectWriteUInt32(e,t,n,r){t<0&&(t=4294967295+t+1);for(var i=0,o=Math.min(e.length-n,4);i>>8*(r?i:3-i)&255}function checkIEEE754(e,t,n,r,i,o){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function writeFloat(e,t,n,r,i){return i||checkIEEE754(e,t,n,4),write(e,t,n,r,23,4),n+4}function writeDouble(e,t,n,r,i){return i||checkIEEE754(e,t,n,8),write(e,t,n,r,52,8),n+8}Buffer.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):r>>8):objectWriteUInt16(this,e,t,!0),t+2},Buffer.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,2,65535,0),Buffer.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):objectWriteUInt16(this,e,t,!1),t+2},Buffer.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):objectWriteUInt32(this,e,t,!0),t+4},Buffer.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):objectWriteUInt32(this,e,t,!1),t+4},Buffer.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);checkInt(this,e,t,n,i-1,-i)}var o=0,s=1,a=0;for(this[t]=255&e;++o>0)-a&255;return t+n},Buffer.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);checkInt(this,e,t,n,i-1,-i)}var o=n-1,s=1,a=0;for(this[t+o]=255&e;0<=--o&&(s*=256);)e<0&&0===a&&0!==this[t+o+1]&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+n},Buffer.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,1,127,-128),Buffer.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},Buffer.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):objectWriteUInt16(this,e,t,!0),t+2},Buffer.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):objectWriteUInt16(this,e,t,!1),t+2},Buffer.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,4,2147483647,-2147483648),Buffer.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):objectWriteUInt32(this,e,t,!0),t+4},Buffer.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),Buffer.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):objectWriteUInt32(this,e,t,!1),t+4},Buffer.prototype.writeFloatLE=function(e,t,n){return writeFloat(this,e,t,!0,n)},Buffer.prototype.writeFloatBE=function(e,t,n){return writeFloat(this,e,t,!1,n)},Buffer.prototype.writeDoubleLE=function(e,t,n){return writeDouble(this,e,t,!0,n)},Buffer.prototype.writeDoubleBE=function(e,t,n){return writeDouble(this,e,t,!1,n)},Buffer.prototype.copy=function(e,t,n,r){if(n=n||0,r||0===r||(r=this.length),t>=e.length&&(t=e.length),t=t||0,0=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t>>=0,n=void 0===n?this.length:n>>>0,"number"==typeof(e=e||0))for(o=t;o>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;o.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return o}function asciiToBytes(e){for(var t=[],n=0;n>8,i=n%256,o.push(i),o.push(r);return o}function base64ToBytes(e){return toByteArray(base64clean(e))}function blitBuffer(e,t,n,r){for(var i=0;i=t.length||i>=e.length);++i)t[i+n]=e[i];return i}function isnan(e){return e!=e}function isBuffer(e){return null!=e&&(!!e._isBuffer||isFastBuffer(e)||isSlowBuffer(e))}function isFastBuffer(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function isSlowBuffer(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&isFastBuffer(e.slice(0,0))}var TextEncoder=function(){function e(){_classCallCheck(this,e)}return _createClass(e,null,[{key:"encode",value:function(e){for(var t=e.length,n=-1,r=[],i=0,o=0,s=0;s!==t;){if(i=e.charCodeAt(s),s+=1,55296<=i&&i<=56319){if(s===t){r[n+=1]=239,r[n+=1]=191,r[n+=1]=189;break}if(!(56320<=(o=e.charCodeAt(s))&&o<=57343)){r[n+=1]=239,r[n+=1]=191,r[n+=1]=189;continue}if(s+=1,65535<(i=1024*(i-55296)+o-56320+65536)){r[n+=1]=240|i>>>18,r[n+=1]=128|i>>>12&63,r[n+=1]=128|i>>>6&63,r[n+=1]=128|63&i;continue}}i<=127?r[n+=1]=0|i:(i<=2047?r[n+=1]=192|i>>>6:(r[n+=1]=224|i>>>12,r[n+=1]=128|i>>>6&63),r[n+=1]=128|63&i)}return r.length=n+1,r}}]),e}(),JsonRpcMarshaller=function(){function e(){_classCallCheck(this,e)}return _createClass(e,null,[{key:"marshall",value:function(e){var t=null;try{var n=function e(t){var n=t.getParameters();for(var r in n)n[r]instanceof RpcStruct&&(n[r]=e(n[r]));return n}(e),r=JSON.stringify(n);t=this._encode(r)}catch(e){console.error("Failed to encode messages to JSON.",e)}return t}},{key:"unmarshall",value:function(e){var t=null;try{var n=this._decode(e);t=JSON.parse(n)}catch(e){console.error("Failed to parse JSON",e)}return t}},{key:"_encode",value:function(e){return new Uint8Array(TextEncoder.encode(e))}},{key:"_decode",value:function(e){return Buffer.from(e).toString()}}]),e}(),BinaryFrameHeader=function(){function l(e,t,n,r){_classCallCheck(this,l),this._rpcType=e,this._functionId=t,this._correlationId=n,this._jsonSize=r,this._bulkData=null,this._jsonData=null}return _createClass(l,[{key:"assembleHeaderBytes",value:function(){var e=[],t=this._functionId,n=this._correlationId;this._rpcType;e.push((251658240&t)>>24),e.push((16711680&t)>>16),e.push((65280&t)>>8),e.push(255&t),e.push((4278190080&n)>>24),e.push((16711680&n)>>16),e.push((65280&n)>>8),e.push(255&n);var r=this._jsonSize;return e.push((4278190080&r)>>24),e.push((16711680&r)>>16),e.push((65280&r)>>8),e.push(255&r),e}},{key:"setRpcType",value:function(e){return this._rpcType=e,this}},{key:"getRpcType",value:function(){return this._rpcType}},{key:"setFunctionId",value:function(e){return this._functionId=e,this}},{key:"getFunctionId",value:function(){return this._functionId}},{key:"setCorrelationId",value:function(e){return this._correlationId=e,this}},{key:"getCorrelationId",value:function(){return this._correlationId}},{key:"setJsonSize",value:function(e){return this._jsonSize=e,this}},{key:"getJsonSize",value:function(){return this._jsonSize}},{key:"getJsonData",value:function(){return this._jsonData}},{key:"setJsonData",value:function(e){return this._jsonData=e,this}},{key:"setBulkData",value:function(e){return this._bulkData=e,this}},{key:"getBulkData",value:function(){return this._bulkData}}],[{key:"fromBinaryHeader",value:function(e){var t=e[0]>>4,n=(15&e[0])<<24;n+=(255&e[1])<<16,n+=(255&e[2])<<8,n+=255&e[3];var r=(255&e[4])<<24;r+=(255&e[5])<<16,r+=(255&e[6])<<8,r+=255&e[7];var i=(255&e[8])<<24;i+=(255&e[9])<<16,i+=(255&e[10])<<8;var o=new l(t,n,r,i+=255&e[11]),s=l.HEADER_SIZE,a=l.HEADER_SIZE+i;if(o.setJsonData(e.slice(s,a)),e.length>a){var u=e.slice(a);o.setBulkData(u)}return o}}]),l}();BinaryFrameHeader.HEADER_SIZE=12;var MessageFrameDisassembler=function(){function u(e,t,n,r,i,o,s){if(_classCallCheck(this,u),this._rpcRequest=e,this._sessionId=t,this._messageId=n,this._isEncrypted=o,!r)throw new Error("MTU must be specified.");if(this._mtu=r,!i)throw new Error("Version must be specified.");this._version=i,this._packetCallback=s}return _createClass(u,[{key:"_buildRPCMainBuffer",value:function(){var e=this._rpcRequest.getBulkData(),t=this._rpcRequest.getCorrelationId(),n=this._rpcRequest.getRPCType(),r=this._rpcRequest.getFunctionName(),i=FunctionID.valueForKey(r);if(!i)throw new Error("Failed to find function ".concat(r));var o=JsonRpcMarshaller.marshall(this._rpcRequest),s=o.length,a=new BinaryFrameHeader(n,i,t);a.setJsonData(o),a.setJsonSize(s),a.setBulkData(e);var u=a.getBulkData(),l=0;u&&(l=u.length);var c=new Uint8Array(12+s+l);return c.set(a.assembleHeaderBytes(),0),c.set(o,12),u&&c.set(u,12+s),c}},{key:"_doRequest",value:function(){var e=this._version,t=FrameType.SINGLE,n=SdlPacket.SERVICE_TYPE_RPC,r=this._sessionId,i=this._messageId,o=this._isEncrypted,s=this._buildRPCMainBuffer(),a=this._mtu,u=Math.ceil(s.length/a);if(u<=1){var l=this._constructPacket(e,n,0,r,i,t,s,o);this._packetCallback(l)}else{var c=new ArrayBuffer(8),_=new DataView(c);_.setUint32(0,s.length,!1),_.setUint32(4,u,!1);var f=new Uint8Array(c),h=this._constructPacket(e,n,0,r,i,FrameType.FIRST,f,o);this._packetCallback(h),this._buildConsecutiveFrames(e,n,r,i,s,a,o)}}},{key:"_constructPacket",value:function(e,t,n,r,i,o,s,a){var u=s.length;return new SdlPacket(e,a,o,t,n,r,u,i,s,0,u)}},{key:"_buildConsecutiveFrames",value:function(e,t,n,r,i,o,s){for(var a,u=0,l=0;0!==a;){a=l+o>=i.length?0:u%255+1;var c=this._constructPacket(e,t,a,n,r,FrameType.CONSECUTIVE,i.slice(l,l+o),s);this._packetCallback(c),u++,l+=o}}}],[{key:"buildRPC",value:function(e,t,n,r,i,o,s){var a=new u(e,t,n,r,i,o,s);return a._doRequest(),a}}]),u}(),TransportListener=function(){function e(){_classCallCheck(this,e),this._onTransportConnected=null,this._onTransportDisconnected=null,this._onError=null,this._onPacketReceived=null}return _createClass(e,[{key:"setOnTransportConnected",value:function(e){return this._onTransportConnected=e,this}},{key:"setOnTransportDisconnected",value:function(e){return this._onTransportDisconnected=e,this}},{key:"setOnError",value:function(e){return this._onError=e,this}},{key:"setOnPacketReceived",value:function(e){return this._onPacketReceived=e,this}},{key:"onTransportConnected",value:function(){"function"==typeof this._onTransportConnected&&this._onTransportConnected()}},{key:"onTransportDisconnected",value:function(){"function"==typeof this._onTransportDisconnected&&this._onTransportDisconnected()}},{key:"onError",value:function(e){var t=0e.getMajor())return 1;if(this.getMajor()===e.getMajor()){if(this.getMinor()>e.getMinor())return 1;if(this.getMinor()===e.getMinor()){if(this.getPatch()>e.getPatch())return 1;if(this.getPatch()===e.getPatch())return 0}}return-1}}]),r}(),ServiceType=function(){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,_getPrototypeOf(t).call(this))}return _inherits(t,Enum),_createClass(t,null,[{key:"valueForKey",value:function(e){return t._valueForKey(e,t._MAP)}},{key:"keyForValue",value:function(e){return t._keyForValue(e,t._MAP)}},{key:"CONTROL",get:function(){return t._MAP.CONTROL}},{key:"RPC",get:function(){return t._MAP.RPC}},{key:"AUDIO",get:function(){return t._MAP.AUDIO}},{key:"VIDEO",get:function(){return t._MAP.VIDEO}},{key:"HYBRID",get:function(){return t._MAP.HYBRID}}]),t}();ServiceType._MAP=Object.freeze({CONTROL:0,RPC:7,AUDIO:10,VIDEO:11,HYBRID:15});var MessageFrameAssembler=function(){function t(e){if(_classCallCheck(this,t),"function"!=typeof e)throw new Error("Callback not of expected type (function) for MessageFrameAssembler");this._callback=e,this._accumulator=[],this._totalConsecutiveFrames=0,this._consecutiveFramesHandledCount=0,this._consecutiveFramesDataLength=0}return _createClass(t,[{key:"handleFrame",value:function(e){var t=e.getFrameType();return t!==FrameType.FIRST&&t!==FrameType.CONSECUTIVE?this._callback(null,e):this._handleMultiFrameMessage(e)}},{key:"_handleFirstDataFrame",value:function(e){var t=e.getPayload();if(t instanceof Uint8Array!=!0||8!==t.length)throw new Error("Error handling first frame. Payload is an invalid length should be length 8.");for(var n in t)if(n<0||255>4,0===this._version?n.ERROR_STATE:(this._encryption=1==(e&n.ENCRYPTION_MASK)>>3,this._frameType=e&n.FRAME_TYPE_MASK,(this._version<1||5FrameType.CONSECUTIVE?n.ERROR_STATE:n.SERVICE_TYPE_STATE);if(t===n.SERVICE_TYPE_STATE)return this._serviceType=255&e,n.CONTROL_FRAME_INFO_STATE;if(t===n.CONTROL_FRAME_INFO_STATE){switch(this._controlFrameInfo=255&e,this._frameType){case FrameType.CONTROL:break;case FrameType.SINGLE:case FrameType.FIRST:if(0!==this._controlFrameInfo)return n.ERROR_STATE;break;case FrameType.CONSECUTIVE:break;default:return n.ERROR_STATE}return n.SESSION_ID_STATE}if(t===n.SESSION_ID_STATE)return this._sessionID=255&e,n.DATA_SIZE_1_STATE;if(t===n.DATA_SIZE_1_STATE)return this._dataLength+=(255&e)<<24,n.DATA_SIZE_2_STATE;if(t===n.DATA_SIZE_2_STATE)return this._dataLength+=(255&e)<<16,n.DATA_SIZE_3_STATE;if(t===n.DATA_SIZE_3_STATE)return this._dataLength+=(255&e)<<8,n.DATA_SIZE_4_STATE;if(t!==n.DATA_SIZE_4_STATE)return t===n.MESSAGE_1_STATE?(this._messageID+=(255&e)<<24,n.MESSAGE_2_STATE):t===n.MESSAGE_2_STATE?(this._messageID+=(255&e)<<16,n.MESSAGE_3_STATE):t===n.MESSAGE_3_STATE?(this._messageID+=(255&e)<<8,n.MESSAGE_4_STATE):t===n.MESSAGE_4_STATE?(this._messageID+=255&e,0===this._dataLength?n.FINISHED_STATE:(this._dumpSize=this._dataLength,this._payload=new Uint8Array(this._dataLength),n.DATA_PUMP_STATE)):t===n.DATA_PUMP_STATE?(this._payload[this._dataLength-this._dumpSize]=e,this._dumpSize-=1,0=n())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+n().toString(16)+" bytes");return 0|e}function h(e,t){if(c.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return b(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return U(e).length;default:if(r)return b(e).length;t=(""+t).toLowerCase(),r=!0}}function A(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function T(e,t,n,r,i){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):2147483647=e.length){if(i)return-1;n=e.length-1}else if(n<0){if(!i)return-1;n=0}if("string"==typeof t&&(t=c.from(t,r)),c.isBuffer(t))return 0===t.length?-1:f(e,t,n,r,i);if("number"==typeof t)return t&=255,c.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):f(e,[t],n,r,i);throw new TypeError("val must be string, number or Buffer")}function f(e,t,n,r,i){var a,s=1,u=e.length,o=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;u/=s=2,o/=2,n/=2}function _(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}if(i){var l=-1;for(a=n;a>8,i=n%256,a.push(i),a.push(r);return a}(t,e.length-n),e,n,r)}function I(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function p(e,t,n){n=Math.min(e.length,n);for(var r=[],i=t;i>>10&1023|55296),l=56320|1023&l),r.push(l),i+=c}return function(e){var t=e.length;if(t<=R)return String.fromCharCode.apply(String,e);var n="",r=0;for(;rthis.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e=e||"utf8";;)switch(e){case"hex":return O(this,t,n);case"utf8":case"utf-8":return p(this,t,n);case"ascii":return g(this,t,n);case"latin1":case"binary":return C(this,t,n);case"base64":return I(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return v(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}.apply(this,arguments)},c.prototype.equals=function(e){if(!c.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===c.compare(this,e)},c.prototype.inspect=function(){var e="",t=F.INSPECT_MAX_BYTES;return 0t&&(e+=" ... ")),""},c.prototype.compare=function(e,t,n,r,i){if(!c.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===i&&(i=this.length),t<0||n>e.length||r<0||i>this.length)throw new RangeError("out of range index");if(i<=r&&n<=t)return 0;if(i<=r)return-1;if(n<=t)return 1;if(this===e)return 0;for(var a=(i>>>=0)-(r>>>=0),s=(n>>>=0)-(t>>>=0),u=Math.min(a,s),o=this.slice(r,i),_=e.slice(t,n),l=0;lthis.length)throw new RangeError("Attempt to write outside buffer bounds");r=r||"utf8";for(var a,s,u,o,_,l,c=!1;;)switch(r){case"hex":return S(this,e,t,n);case"utf8":case"utf-8":return _=t,l=n,B(b(e,(o=this).length-_),o,_,l);case"ascii":return y(this,e,t,n);case"latin1":case"binary":return y(this,e,t,n);case"base64":return a=this,s=t,u=n,B(U(e),a,s,u);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,e,t,n);default:if(c)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),c=!0}},c.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var R=4096;function g(e,t,n){var r="";n=Math.min(e.length,n);for(var i=t;ie.length)throw new RangeError("Index out of range")}function m(e,t,n,r){t<0&&(t=65535+t+1);for(var i=0,a=Math.min(e.length-n,2);i>>8*(r?i:1-i)}function d(e,t,n,r){t<0&&(t=4294967295+t+1);for(var i=0,a=Math.min(e.length-n,4);i>>8*(r?i:3-i)&255}function L(e,t,n,r){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function k(e,t,n,r,i){return i||L(e,0,n,4),a.write(e,t,n,r,23,4),n+4}function M(e,t,n,r,i){return i||L(e,0,n,8),a.write(e,t,n,r,52,8),n+8}c.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):r>>8):m(this,e,t,!0),t+2},c.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||D(this,e,t,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):m(this,e,t,!1),t+2},c.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||D(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):d(this,e,t,!0),t+4},c.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||D(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):d(this,e,t,!1),t+4},c.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);D(this,e,t,n,i-1,-i)}var a=0,s=1,u=0;for(this[t]=255&e;++a>0)-u&255;return t+n},c.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);D(this,e,t,n,i-1,-i)}var a=n-1,s=1,u=0;for(this[t+a]=255&e;0<=--a&&(s*=256);)e<0&&0===u&&0!==this[t+a+1]&&(u=1),this[t+a]=(e/s>>0)-u&255;return t+n},c.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||D(this,e,t,1,127,-128),c.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},c.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||D(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):m(this,e,t,!0),t+2},c.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||D(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):m(this,e,t,!1),t+2},c.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||D(this,e,t,4,2147483647,-2147483648),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):d(this,e,t,!0),t+4},c.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||D(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):d(this,e,t,!1),t+4},c.prototype.writeFloatLE=function(e,t,n){return k(this,e,t,!0,n)},c.prototype.writeFloatBE=function(e,t,n){return k(this,e,t,!1,n)},c.prototype.writeDoubleLE=function(e,t,n){return M(this,e,t,!0,n)},c.prototype.writeDoubleBE=function(e,t,n){return M(this,e,t,!1,n)},c.prototype.copy=function(e,t,n,r){if(n=n||0,r||0===r||(r=this.length),t>=e.length&&(t=e.length),t=t||0,0=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t>>=0,n=void 0===n?this.length:n>>>0,"number"==typeof(e=e||0))for(a=t;a>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;a.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;a.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return a}function U(e){return r.toByteArray(Y(e))}function B(e,t,n,r){for(var i=0;i=t.length||i>=e.length);++i)t[i+n]=e[i];return i}}).call(F,V(0))},function(module,exports,__webpack_require__){(function(global,Buffer){var iu;iu=function(exports,_long,buffer){_long=_long&&_long.hasOwnProperty("default")?_long.default:_long,buffer=buffer&&buffer.hasOwnProperty("default")?buffer.default:buffer;var commonjsGlobal="undefined"!=typeof window?window:void 0!==global?global:"undefined"!=typeof self?self:{};function createCommonjsModule(e,t){return e(t={exports:{}},t.exports),t.exports}function getCjsExportFromNamespace(e){return e&&e.default||e}var map=createCommonjsModule(function(e){if(void 0!==commonjsGlobal.Map)e.exports=commonjsGlobal.Map,e.exports.Map=commonjsGlobal.Map;else{var t=function(e){this._keys=[],this._values={};for(var t=0;t>8&255,n[1]=e>>16&255,n[0]=e>>24&255,n[4]=PROCESS_UNIQUE[0],n[5]=PROCESS_UNIQUE[1],n[6]=PROCESS_UNIQUE[2],n[7]=PROCESS_UNIQUE[3],n[8]=PROCESS_UNIQUE[4],n[11]=255&t,n[10]=t>>8&255,n[9]=t>>16&255,n}},{key:"createPk",value:function(){return new i}},{key:"createFromTime",value:function(e){var t=Buffer$1.from([0,0,0,0,0,0,0,0,0,0,0,0]);return t[3]=255&e,t[2]=e>>8&255,t[1]=e>>16&255,t[0]=e>>24&255,new i(t)}},{key:"createFromHexString",value:function(e){if(void 0===e||null!=e&&24!==e.length)throw new TypeError("Argument passed in must be a single String of 12 bytes or a string of 24 hex characters");if(hasBufferType)return new i(Buffer$1.from(e,"hex"));for(var t=new _Buffer(12),n=0,r=0;r<24;)t[n++]=decodeLookup[e.charCodeAt(r++)]<<4|decodeLookup[e.charCodeAt(r++)];return new i(t)}},{key:"isValid",value:function(e){return null!=e&&("number"==typeof e||("string"==typeof e?12===e.length||24===e.length&&checkForHexRegExp.test(e):e instanceof i||(e instanceof _Buffer&&12===e.length||!!e.toHexString&&(12===e.id.length||24===e.id.length&&checkForHexRegExp.test(e.id)))))}},{key:"fromExtendedJSON",value:function(e){return new i(e.$oid)}}]),i}();ObjectId.get_inc=deprecate$1(function(){return ObjectId.getInc()},"Please use the static `ObjectId.getInc()` instead"),ObjectId.prototype.get_inc=deprecate$1(function(){return ObjectId.getInc()},"Please use the static `ObjectId.getInc()` instead"),ObjectId.prototype.getInc=deprecate$1(function(){return ObjectId.getInc()},"Please use the static `ObjectId.getInc()` instead"),ObjectId.prototype.generate=deprecate$1(function(e){return ObjectId.generate(e)},"Please use the static `ObjectId.generate(time)` instead"),Object.defineProperty(ObjectId.prototype,"generationTime",{enumerable:!0,get:function(){return this.id[3]|this.id[2]<<8|this.id[1]<<16|this.id[0]<<24},set:function(e){this.id[3]=255&e,this.id[2]=e>>8&255,this.id[1]=e>>16&255,this.id[0]=e>>24&255}}),ObjectId.prototype[util$2.inspect.custom||"inspect"]=ObjectId.prototype.toString,ObjectId.index=~~(16777215*Math.random()),Object.defineProperty(ObjectId.prototype,"_bsontype",{value:"ObjectID"});var objectid=ObjectId;function _classCallCheck$3(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties$3(e,t){for(var n=0;n>>0,r=t.high>>>0;return n>>0>>0}function invalidErr(e,t){throw new TypeError('"'.concat(e,'" is not a valid Decimal128 string - ').concat(t))}function Decimal128(e){this.bytes=e}Decimal128.fromString=function(e){var t,n=!1,r=!1,i=!1,a=0,s=0,u=0,o=0,_=0,l=[0],c=0,E=0,h=0,A=0,T=0,f=0,S=[0,0],y=[0,0],P=0;if(7e3<=e.length)throw new TypeError(e+" not a valid Decimal128 string");var I=e.match(PARSE_STRING_REGEXP),p=e.match(PARSE_INF_REGEXP),R=e.match(PARSE_NAN_REGEXP);if(!I&&!p&&!R||0===e.length)throw new TypeError(e+" not a valid Decimal128 string");if(I){var g=I[2],C=I[4],O=I[5],v=I[6];C&&void 0===v&&invalidErr(e,"missing exponent power"),C&&void 0===g&&invalidErr(e,"missing exponent base"),void 0===C&&(O||v)&&invalidErr(e,"missing e before exponent")}if("+"!==e[P]&&"-"!==e[P]||(n="-"===e[P++]),!isDigit(e[P])&&"."!==e[P]){if("i"===e[P]||"I"===e[P])return new Decimal128(Buffer$2.from(n?INF_NEGATIVE_BUFFER:INF_POSITIVE_BUFFER));if("N"===e[P])return new Decimal128(Buffer$2.from(NAN_BUFFER))}for(;isDigit(e[P])||"."===e[P];)"."!==e[P]?(c<34&&("0"===e[P]&&!i||(i||(_=s),i=!0,l[E++]=parseInt(e[P],10),c+=1)),i&&(u+=1),r&&(o+=1),s+=1):(r&&invalidErr(e,"contains multiple periods"),r=!0),P+=1;if(r&&!s)throw new TypeError(e+" not a valid Decimal128 string");if("e"===e[P]||"E"===e[P]){var N=e.substr(++P).match(EXPONENT_REGEX);if(!N||!N[2])return new Decimal128(Buffer$2.from(NAN_BUFFER));T=parseInt(N[0],10),P+=N[0].length}if(e[P])return new Decimal128(Buffer$2.from(NAN_BUFFER));if(h=0,c){if(A=c-1,1!==(a=u))for(;"0"===e[_+a-1];)a-=1}else c=u=1,a=l[A=h=0]=0;for(T<=o&&16384>8&255,b[P++]=K.low.low>>16&255,b[P++]=K.low.low>>24&255,b[P++]=255&K.low.high,b[P++]=K.low.high>>8&255,b[P++]=K.low.high>>16&255,b[P++]=K.low.high>>24&255,b[P++]=255&K.high.low,b[P++]=K.high.low>>8&255,b[P++]=K.high.low>>16&255,b[P++]=K.high.low>>24&255,b[P++]=255&K.high.high,b[P++]=K.high.high>>8&255,b[P++]=K.high.high>>16&255,b[P++]=K.high.high>>24&255,new Decimal128(b)};var COMBINATION_MASK=31,EXPONENT_MASK=16383,COMBINATION_INFINITY=30,COMBINATION_NAN=31;Decimal128.prototype.toString=function(){for(var e,t,n,r,i,a,s=0,u=new Array(36),o=0;o>26&COMBINATION_MASK)>>3==3){if(i===COMBINATION_INFINITY)return S.join("")+"Infinity";if(i===COMBINATION_NAN)return"NaN";a=e>>15&EXPONENT_MASK,c=8+(e>>14&1)}else c=e>>14&7,a=e>>17&EXPONENT_MASK;if(_=a-EXPONENT_BIAS,f.parts[0]=(16383&e)+((15&c)<<14),f.parts[1]=t,f.parts[2]=n,f.parts[3]=r,0===f.parts[0]&&0===f.parts[1]&&0===f.parts[2]&&0===f.parts[3])T=!0;else for(h=3;0<=h;h--){var P=0,I=divideu128(f);if(f=I.quotient,P=I.rem.low)for(E=8;0<=E;E--)u[9*h+E]=P%10,P=Math.floor(P/10)}if(T)s=1,u[A]=0;else for(s=36;!u[A];)s-=1,A+=1;if(34<=(l=s-1+_)||l<=-7||0<_){if(34this.position)this.buffer[this.position++]=t;else if(void 0!==Buffer$3&&Buffer$3.isBuffer(this.buffer)){var n=Buffer$3.alloc(a.BUFFER_SIZE+this.buffer.length);this.buffer.copy(n,0,0,this.buffer.length),this.buffer=n,this.buffer[this.position++]=t}else{var r=null;r=isUint8Array(this.buffer)?new Uint8Array(new ArrayBuffer(a.BUFFER_SIZE+this.buffer.length)):new Array(a.BUFFER_SIZE+this.buffer.length);for(var i=0;ithis.position?t+e.length:this.position;else if(void 0!==Buffer$3&&"string"==typeof e&&Buffer$3.isBuffer(this.buffer))this.buffer.write(e,t,"binary"),this.position=t+e.length>this.position?t+e.length:this.position;else if(isUint8Array(e)||Array.isArray(e)&&"string"!=typeof e){for(var i=0;ithis.position?t:this.position}else if("string"==typeof e){for(var a=0;athis.position?t:this.position}}},{key:"read",value:function(e,t){if(t=t&&0= 5, is ".concat(i));if(t.allowObjectSmallerThanBufferSize&&e.length= bson size ").concat(i));if(!t.allowObjectSmallerThanBufferSize&&e.length!==i)throw new Error("buffer length ".concat(e.length," must === bson size ").concat(i));if(i+r>e.length)throw new Error("(bson size ".concat(i," + options.index ").concat(r," must be <= buffer length ").concat(Buffer$4.byteLength(e),")"));if(0!==e[r+i-1])throw new Error("One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00");return deserializeObject(e,r,t,n)}function deserializeObject(e,t,n,r){var i=null!=n.evalFunctions&&n.evalFunctions,a=null!=n.cacheFunctions&&n.cacheFunctions,s=null!=n.cacheFunctionsCrc32&&n.cacheFunctionsCrc32;if(!s)var u=null;var o=null==n.fieldsAsRaw?null:n.fieldsAsRaw,_=null!=n.raw&&n.raw,l="boolean"==typeof n.bsonRegExp&&n.bsonRegExp,c=null!=n.promoteBuffers&&n.promoteBuffers,E=null==n.promoteLongs||n.promoteLongs,h=null==n.promoteValues||n.promoteValues,A=t;if(e.length<5)throw new Error("corrupt bson message < 5 bytes long");var T=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;if(T<5||T>e.length)throw new Error("corrupt bson message");for(var f=r?[]:{},S=0;;){var y=e[t++];if(0===y)break;for(var P=t;0!==e[P]&&P=Buffer$4.byteLength(e))throw new Error("Bad BSON Document: illegal CString");var I=r?S++:e.toString("utf8",t,P);if(t=P+1,y===constants.BSON_DATA_STRING){var p=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;if(p<=0||p>e.length-t||0!==e[t+p-1])throw new Error("bad string length in bson");if(!validateUtf8$1(e,t,t+p-1))throw new Error("Invalid UTF-8 string in BSON document");var R=e.toString("utf8",t,t+p-1);f[I]=R,t+=p}else if(y===constants.BSON_DATA_OID){var g=Buffer$4.alloc(12);e.copy(g,0,t,t+12),f[I]=new objectid(g),t+=12}else if(y===constants.BSON_DATA_INT&&!1===h)f[I]=new int_32(e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24);else if(y===constants.BSON_DATA_INT)f[I]=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;else if(y===constants.BSON_DATA_NUMBER&&!1===h)f[I]=new double_1(e.readDoubleLE(t)),t+=8;else if(y===constants.BSON_DATA_NUMBER)f[I]=e.readDoubleLE(t),t+=8;else if(y===constants.BSON_DATA_DATE){var C=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24,O=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;f[I]=new Date(new long_1(C,O).toNumber())}else if(y===constants.BSON_DATA_BOOLEAN){if(0!==e[t]&&1!==e[t])throw new Error("illegal boolean type value");f[I]=1===e[t++]}else if(y===constants.BSON_DATA_OBJECT){var v=t,N=e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24;if(N<=0||N>e.length-t)throw new Error("bad embedded document length in bson");f[I]=_?e.slice(t,t+N):deserializeObject(e,v,n,!1),t+=N}else if(y===constants.BSON_DATA_ARRAY){var D=t,m=e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24,d=n,L=t+m;if(o&&o[I]){for(var k in d={},n)d[k]=n[k];d.raw=!0}if(f[I]=deserializeObject(e,D,d,!0),0!==e[(t+=m)-1])throw new Error("invalid array terminator byte");if(t!==L)throw new Error("corrupted array bson")}else if(y===constants.BSON_DATA_UNDEFINED)f[I]=void 0;else if(y===constants.BSON_DATA_NULL)f[I]=null;else if(y===constants.BSON_DATA_LONG){var M=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24,Y=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24,K=new long_1(M,Y);f[I]=E&&!0===h&&K.lessThanOrEqual(JS_INT_MAX_LONG)&&K.greaterThanOrEqual(JS_INT_MIN_LONG)?K.toNumber():K}else if(y===constants.BSON_DATA_DECIMAL128){var b=Buffer$4.alloc(16);e.copy(b,0,t,t+16),t+=16;var U=new decimal128(b);f[I]=U.toObject?U.toObject():U}else if(y===constants.BSON_DATA_BINARY){var B=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24,F=B,V=e[t++];if(B<0)throw new Error("Negative binary type element size found");if(B>Buffer$4.byteLength(e))throw new Error("Binary type size larger than document size");if(null!=e.slice){if(V===binary.SUBTYPE_BYTE_ARRAY){if((B=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24)<0)throw new Error("Negative binary type element size found for subtype 0x02");if(F-4=e.length)throw new Error("Bad BSON Document: illegal CString");var H=e.toString("utf8",t,P);for(P=t=P+1;0!==e[P]&&P=e.length)throw new Error("Bad BSON Document: illegal CString");var w=e.toString("utf8",t,P);t=P+1;var W=new Array(w.length);for(P=0;P=e.length)throw new Error("Bad BSON Document: illegal CString");var j=e.toString("utf8",t,P);for(P=t=P+1;0!==e[P]&&P=e.length)throw new Error("Bad BSON Document: illegal CString");var x=e.toString("utf8",t,P);t=P+1,f[I]=new regexp(j,x)}else if(y===constants.BSON_DATA_SYMBOL){var z=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;if(z<=0||z>e.length-t||0!==e[t+z-1])throw new Error("bad string length in bson");f[I]=e.toString("utf8",t,t+z-1),t+=z}else if(y===constants.BSON_DATA_TIMESTAMP){var X=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24,$=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;f[I]=new timestamp(X,$)}else if(y===constants.BSON_DATA_MIN_KEY)f[I]=new min_key;else if(y===constants.BSON_DATA_MAX_KEY)f[I]=new max_key;else if(y===constants.BSON_DATA_CODE){var Q=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;if(Q<=0||Q>e.length-t||0!==e[t+Q-1])throw new Error("bad string length in bson");var q=e.toString("utf8",t,t+Q-1);if(i)if(a){var Z=s?u(q):q;f[I]=isolateEvalWithHash(functionCache,Z,q,f)}else f[I]=isolateEval(q);else f[I]=new code(q);t+=Q}else if(y===constants.BSON_DATA_CODE_W_SCOPE){var J=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;if(J<13)throw new Error("code_w_scope total size shorter minimum expected length");var ee=e[t++]|e[t++]<<8|e[t++]<<16|e[t++]<<24;if(ee<=0||ee>e.length-t||0!==e[t+ee-1])throw new Error("bad string length in bson");var te=e.toString("utf8",t,t+ee-1),ne=t+=ee,re=e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24,ie=deserializeObject(e,ne,n,!1);if(t+=re,J<8+re+ee)throw new Error("code_w_scope total size is to short, truncating scope");if(8+re+eee.length-t||0!==e[t+se-1])throw new Error("bad string length in bson");if(!validateUtf8$1(e,t,t+se-1))throw new Error("Invalid UTF-8 string in BSON document");var ue=e.toString("utf8",t,t+se-1);t+=se;var oe=Buffer$4.alloc(12);e.copy(oe,0,t,t+12);var _e=new objectid(oe);t+=12,f[I]=new db_ref(ue,_e)}}if(T!=t-A){if(r)throw new Error("corrupt array bson");throw new Error("corrupt object bson")}var le=Object.keys(f).filter(function(e){return e.startsWith("$")}),ce=!0;if(le.forEach(function(e){-1===["$ref","$id","$db"].indexOf(e)&&(ce=!1)}),!ce)return f;if(null==f.$id||null==f.$ref)return f;var Ee=Object.assign({},f);return delete Ee.$ref,delete Ee.$id,delete Ee.$db,new db_ref(f.$ref,f.$id,f.$db||null,Ee)}function isolateEvalWithHash(functionCache,hash,functionString,object){var value=null;return null==functionCache[hash]&&(eval("value = "+functionString),functionCache[hash]=value),functionCache[hash].bind(object)}function isolateEval(functionString){var value=null;return eval("value = "+functionString),value}var deserializer=deserialize$1;function readIEEE754(e,t,n,r,i){var a,s,u="big"===n,o=8*i-r-1,_=(1<>1,c=-7,E=u?0:i-1,h=u?1:-1,A=e[t+E];for(E+=h,a=A&(1<<-c)-1,A>>=-c,c+=o;0>=-c,c+=r;0>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,A=_?a-1:0,T=_?-1:1,f=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(u=isNaN(t)?1:0,s=c):(s=Math.floor(Math.log(t)/Math.LN2),t*(o=Math.pow(2,-s))<1&&(s--,o*=2),2<=(t+=1<=s+E?h/o:h*Math.pow(2,1-E))*o&&(s++,o/=2),c<=s+E?(u=0,s=c):1<=s+E?(u=(t*o-1)*Math.pow(2,i),s+=E):(u=t*Math.pow(2,E-1)*Math.pow(2,i),s=0)),isNaN(t)&&(u=0);8<=i;)e[n+A]=255&u,A+=T,u/=256,i-=8;for(s=s<>24&255,e[r+2]=s+1>>16&255,e[r+1]=s+1>>8&255,e[r]=s+1&255,r=r+4+s,e[r++]=0,r}function serializeNumber(e,t,n,r,i){if(Math.floor(n)===n&&n>=constants.JS_INT_MIN&&n<=constants.JS_INT_MAX)if(n>=constants.BSON_INT32_MIN&&n<=constants.BSON_INT32_MAX)e[r++]=constants.BSON_DATA_INT,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,e[r++]=255&n,e[r++]=n>>8&255,e[r++]=n>>16&255,e[r++]=n>>24&255;else if(n>=constants.JS_INT_MIN&&n<=constants.JS_INT_MAX){e[r++]=constants.BSON_DATA_NUMBER,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,writeIEEE754$1(e,n,r,"little",52,8),r+=8}else{e[r++]=constants.BSON_DATA_LONG,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var a=long_1.fromNumber(n),s=a.getLowBits(),u=a.getHighBits();e[r++]=255&s,e[r++]=s>>8&255,e[r++]=s>>16&255,e[r++]=s>>24&255,e[r++]=255&u,e[r++]=u>>8&255,e[r++]=u>>16&255,e[r++]=u>>24&255}else e[r++]=constants.BSON_DATA_NUMBER,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,writeIEEE754$1(e,n,r,"little",52,8),r+=8;return r}function serializeNull(e,t,n,r,i){return e[r++]=constants.BSON_DATA_NULL,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,r}function serializeBoolean(e,t,n,r,i){return e[r++]=constants.BSON_DATA_BOOLEAN,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,e[r++]=n?1:0,r}function serializeDate(e,t,n,r,i){e[r++]=constants.BSON_DATA_DATE,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var a=long_1.fromNumber(n.getTime()),s=a.getLowBits(),u=a.getHighBits();return e[r++]=255&s,e[r++]=s>>8&255,e[r++]=s>>16&255,e[r++]=s>>24&255,e[r++]=255&u,e[r++]=u>>8&255,e[r++]=u>>16&255,e[r++]=u>>24&255,r}function serializeRegExp(e,t,n,r,i){if(e[r++]=constants.BSON_DATA_REGEXP,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,n.source&&null!=n.source.match(regexp$1))throw Error("value "+n.source+" must not contain null bytes");return r+=e.write(n.source,r,"utf8"),e[r++]=0,n.ignoreCase&&(e[r++]=105),n.global&&(e[r++]=115),n.multiline&&(e[r++]=109),e[r++]=0,r}function serializeBSONRegExp(e,t,n,r,i){if(e[r++]=constants.BSON_DATA_REGEXP,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,null!=n.pattern.match(regexp$1))throw Error("pattern "+n.pattern+" must not contain null bytes");return r+=e.write(n.pattern,r,"utf8"),e[r++]=0,r+=e.write(n.options.split("").sort().join(""),r,"utf8"),e[r++]=0,r}function serializeMinMax(e,t,n,r,i){return null===n?e[r++]=constants.BSON_DATA_NULL:"MinKey"===n._bsontype?e[r++]=constants.BSON_DATA_MIN_KEY:e[r++]=constants.BSON_DATA_MAX_KEY,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,r}function serializeObjectId(e,t,n,r,i){if(e[r++]=constants.BSON_DATA_OID,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,"string"==typeof n.id)e.write(n.id,r,"binary");else{if(!n.id||!n.id.copy)throw new TypeError("object ["+JSON.stringify(n)+"] is not a valid ObjectId");n.id.copy(e,r,0,12)}return r+12}function serializeBuffer(e,t,n,r,i){e[r++]=constants.BSON_DATA_BINARY,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var a=n.length;return e[r++]=255&a,e[r++]=a>>8&255,e[r++]=a>>16&255,e[r++]=a>>24&255,e[r++]=constants.BSON_BINARY_SUBTYPE_DEFAULT,n.copy(e,r,0,a),r+=a}function serializeObject(e,t,n,r,i,a,s,u,o,_){for(var l=0;l<_.length;l++)if(_[l]===n)throw new Error("cyclic dependency detected");_.push(n),e[r++]=Array.isArray(n)?constants.BSON_DATA_ARRAY:constants.BSON_DATA_OBJECT,r+=o?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var c=serializeInto(e,n,i,r,a+1,s,u,_);return _.pop(),c}function serializeDecimal128(e,t,n,r,i){return e[r++]=constants.BSON_DATA_DECIMAL128,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,n.bytes.copy(e,r,0,16),r+16}function serializeLong(e,t,n,r,i){e[r++]="Long"===n._bsontype?constants.BSON_DATA_LONG:constants.BSON_DATA_TIMESTAMP,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var a=n.getLowBits(),s=n.getHighBits();return e[r++]=255&a,e[r++]=a>>8&255,e[r++]=a>>16&255,e[r++]=a>>24&255,e[r++]=255&s,e[r++]=s>>8&255,e[r++]=s>>16&255,e[r++]=s>>24&255,r}function serializeInt32(e,t,n,r,i){return e[r++]=constants.BSON_DATA_INT,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,e[r++]=255&n,e[r++]=n>>8&255,e[r++]=n>>16&255,e[r++]=n>>24&255,r}function serializeDouble(e,t,n,r,i){return e[r++]=constants.BSON_DATA_NUMBER,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0,writeIEEE754$1(e,n.value,r,"little",52,8),r+=8}function serializeFunction(e,t,n,r,i,a,s){e[r++]=constants.BSON_DATA_CODE,r+=s?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var u=normalizedFunctionString$1(n),o=e.write(u,r+4,"utf8")+1;return e[r]=255&o,e[r+1]=o>>8&255,e[r+2]=o>>16&255,e[r+3]=o>>24&255,r=r+4+o-1,e[r++]=0,r}function serializeCode(e,t,n,r,i,a,s,u,o){if(n.scope&&"object"===_typeof$3(n.scope)){e[r++]=constants.BSON_DATA_CODE_W_SCOPE,r+=o?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var _=r,l="string"==typeof n.code?n.code:n.code.toString();r+=4;var c=e.write(l,r+4,"utf8")+1;e[r]=255&c,e[r+1]=c>>8&255,e[r+2]=c>>16&255,e[r+3]=c>>24&255,e[r+4+c-1]=0,r=r+c+4;var E=serializeInto(e,n.scope,i,r,a+1,s,u);r=E-1;var h=E-_;e[_++]=255&h,e[_++]=h>>8&255,e[_++]=h>>16&255,e[_++]=h>>24&255,e[r++]=0}else{e[r++]=constants.BSON_DATA_CODE,r+=o?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var A=n.code.toString(),T=e.write(A,r+4,"utf8")+1;e[r]=255&T,e[r+1]=T>>8&255,e[r+2]=T>>16&255,e[r+3]=T>>24&255,r=r+4+T-1,e[r++]=0}return r}function serializeBinary(e,t,n,r,i){e[r++]=constants.BSON_DATA_BINARY,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var a=n.value(!0),s=n.position;return n.sub_type===binary.SUBTYPE_BYTE_ARRAY&&(s+=4),e[r++]=255&s,e[r++]=s>>8&255,e[r++]=s>>16&255,e[r++]=s>>24&255,e[r++]=n.sub_type,n.sub_type===binary.SUBTYPE_BYTE_ARRAY&&(s-=4,e[r++]=255&s,e[r++]=s>>8&255,e[r++]=s>>16&255,e[r++]=s>>24&255),a.copy(e,r,0,n.position),r+=n.position}function serializeSymbol(e,t,n,r,i){e[r++]=constants.BSON_DATA_SYMBOL,r+=i?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var a=e.write(n.value,r+4,"utf8")+1;return e[r]=255&a,e[r+1]=a>>8&255,e[r+2]=a>>16&255,e[r+3]=a>>24&255,r=r+4+a-1,e[r++]=0,r}function serializeDBRef(e,t,n,r,i,a,s){e[r++]=constants.BSON_DATA_OBJECT,r+=s?e.write(t,r,"ascii"):e.write(t,r,"utf8"),e[r++]=0;var u,o=r,_={$ref:n.collection||n.namespace,$id:n.oid};null!=n.db&&(_.$db=n.db);var l=(u=serializeInto(e,_=Object.assign(_,n.fields),!1,r,i+1,a))-o;return e[o++]=255&l,e[o++]=l>>8&255,e[o++]=l>>16&255,e[o++]=l>>24&255,u}function serializeInto(e,t,n,r,i,a,s,u){r=r||0,(u=u||[]).push(t);var o=r+4;if(Array.isArray(t))for(var _=0;_>8&255,e[r++]=R>>16&255,e[r++]=R>>24&255,o}var serializer=serializeInto;function _typeof$4(e){return(_typeof$4="function"==typeof Symbol&&"symbol"===_typeof(Symbol.iterator)?function(e){return _typeof(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":_typeof(e)})(e)}var Buffer$6=buffer.Buffer,normalizedFunctionString$2=utils.normalizedFunctionString;function isDate$2(e){return"object"===_typeof$4(e)&&"[object Date]"===Object.prototype.toString.call(e)}function calculateObjectSize(e,t,n){var r=5;if(Array.isArray(e))for(var i=0;i=constants.JS_INT_MIN&&t<=constants.JS_INT_MAX&&t>=constants.BSON_INT32_MIN&&t<=constants.BSON_INT32_MAX?(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+5:(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+9;case"undefined":return r||!i?(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+1:0;case"boolean":return(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+2;case"object":if(null==t||"MinKey"===t._bsontype||"MaxKey"===t._bsontype)return(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+1;if("ObjectId"===t._bsontype||"ObjectID"===t._bsontype)return(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+13;if(t instanceof Date||isDate$2(t))return(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+9;if(void 0!==Buffer$6&&Buffer$6.isBuffer(t))return(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+6+t.length;if("Long"===t._bsontype||"Double"===t._bsontype||"Timestamp"===t._bsontype)return(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+9;if("Decimal128"===t._bsontype)return(null!=e?Buffer$6.byteLength(e,"utf8")+1:0)+17;if("Code"===t._bsontype)return null!=t.scope&&0>16&255,s[u++]=t>>8&255,s[u++]=255&t;2===a&&(t=_[e.charCodeAt(n)]<<2|_[e.charCodeAt(n+1)]>>4,s[u++]=255&t);1===a&&(t=_[e.charCodeAt(n)]<<10|_[e.charCodeAt(n+1)]<<4|_[e.charCodeAt(n+2)]>>2,s[u++]=t>>8&255,s[u++]=255&t);return s},t.fromByteArray=function(e){for(var t,n=e.length,r=n%3,i=[],a=0,s=n-r;a>2]+u[t<<4&63]+"==")):2==r&&(t=(e[n-2]<<8)+e[n-1],i.push(u[t>>10]+u[t>>4&63]+u[t<<2&63]+"="));return i.join("")};for(var u=[],_=[],l="undefined"!=typeof Uint8Array?Uint8Array:Array,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=0,a=r.length;i>18&63]+u[i>>12&63]+u[i>>6&63]+u[63&i]);return a.join("")}_["-".charCodeAt(0)]=62,_["_".charCodeAt(0)]=63},function(e,t){t.read=function(e,t,n,r,i){var a,s,u=8*i-r-1,o=(1<>1,l=-7,c=n?i-1:0,E=n?-1:1,h=e[t+c];for(c+=E,a=h&(1<<-l)-1,h>>=-l,l+=u;0>=-l,l+=r;0>1,E=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:a-1,A=r?1:-1,T=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(u=isNaN(t)?1:0,s=l):(s=Math.floor(Math.log(t)/Math.LN2),t*(o=Math.pow(2,-s))<1&&(s--,o*=2),2<=(t+=1<=s+c?E/o:E*Math.pow(2,1-c))*o&&(s++,o/=2),l<=s+c?(u=0,s=l):1<=s+c?(u=(t*o-1)*Math.pow(2,i),s+=c):(u=t*Math.pow(2,c-1)*Math.pow(2,i),s=0));8<=i;e[n+h]=255&u,h+=A,u/=256,i-=8);for(s=s<>>=0)&&e<256)&&(r=s[e])?r:(n=f(e,(0|e)<0?-1:0,!0),i&&(s[e]=n),n):(i=-128<=(e|=0)&&e<128)&&(r=a[e])?r:(n=f(e,e<0?-1:0,!1),i&&(a[e]=n),n)}function T(e,t){if(isNaN(e))return t?_:P;if(t){if(e<0)return _;if(u<=e)return g}else{if(e<=-o)return C;if(o<=e+1)return R}return e<0?T(-e,t).neg():f(e%i|0,e/i|0,t)}function f(e,t,n){return new r(e,t,n)}r.fromInt=n,r.fromNumber=T,r.fromBits=f;var l=Math.pow;function c(e,t,n){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return P;if(t="number"==typeof t?(n=t,!1):!!t,(n=n||10)<2||36>>0:this.low},O.toNumber=function(){return this.unsigned?(this.high>>>0)*i+(this.low>>>0):this.high*i+(this.low>>>0)},O.toString=function(e){if((e=e||10)<2||36>>0).toString(e);if((a=u).isZero())return o+s;for(;o.length<6;)o="0"+o;s=""+o+s}},O.getHighBits=function(){return this.high},O.getHighBitsUnsigned=function(){return this.high>>>0},O.getLowBits=function(){return this.low},O.getLowBitsUnsigned=function(){return this.low>>>0},O.getNumBitsAbs=function(){if(this.isNegative())return this.eq(C)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;0>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},O.eq=O.equals,O.notEquals=function(e){return!this.eq(e)},O.neq=O.notEquals,O.ne=O.notEquals,O.lessThan=function(e){return this.comp(e)<0},O.lt=O.lessThan,O.lessThanOrEqual=function(e){return this.comp(e)<=0},O.lte=O.lessThanOrEqual,O.le=O.lessThanOrEqual,O.greaterThan=function(e){return 0>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},O.comp=O.compare,O.negate=function(){return!this.unsigned&&this.eq(C)?C:this.not().add(E)},O.neg=O.negate,O.add=function(e){A(e)||(e=S(e));var t=this.high>>>16,n=65535&this.high,r=this.low>>>16,i=65535&this.low,a=e.high>>>16,s=65535&e.high,u=e.low>>>16,o=0,_=0,l=0,c=0;return l+=(c+=i+(65535&e.low))>>>16,_+=(l+=r+u)>>>16,o+=(_+=n+s)>>>16,o+=t+a,f((l&=65535)<<16|(c&=65535),(o&=65535)<<16|(_&=65535),this.unsigned)},O.subtract=function(e){return A(e)||(e=S(e)),this.add(e.neg())},O.sub=O.subtract,O.multiply=function(e){if(this.isZero())return P;if(A(e)||(e=S(e)),h)return f(h.mul(this.low,this.high,e.low,e.high),h.get_high(),this.unsigned);if(e.isZero())return P;if(this.eq(C))return e.isOdd()?C:P;if(e.eq(C))return this.isOdd()?C:P;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(y)&&e.lt(y))return T(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,n=65535&this.high,r=this.low>>>16,i=65535&this.low,a=e.high>>>16,s=65535&e.high,u=e.low>>>16,o=65535&e.low,_=0,l=0,c=0,E=0;return c+=(E+=i*o)>>>16,l+=(c+=r*o)>>>16,c&=65535,l+=(c+=i*u)>>>16,_+=(l+=n*o)>>>16,l&=65535,_+=(l+=r*u)>>>16,l&=65535,_+=(l+=i*s)>>>16,_+=t*o+n*u+r*s+i*a,f((c&=65535)<<16|(E&=65535),(_&=65535)<<16|(l&=65535),this.unsigned)},O.mul=O.multiply,O.divide=function(e){if(A(e)||(e=S(e)),e.isZero())throw Error("division by zero");var t,n,r;if(h)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?f((this.unsigned?h.div_u:h.div_s)(this.low,this.high,e.low,e.high),h.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?_:P;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return _;if(e.gt(this.shru(1)))return I;r=_}else{if(this.eq(C))return e.eq(E)||e.eq(p)?C:e.eq(C)?E:(t=this.shr(1).div(e).shl(1)).eq(P)?e.isNegative()?E:p:(n=this.sub(e.mul(t)),r=t.add(n.div(e)));else if(e.eq(C))return this.unsigned?_:P;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();r=P}for(n=this;n.gte(e);){t=Math.max(1,Math.floor(n.toNumber()/e.toNumber()));for(var i=Math.ceil(Math.log(t)/Math.LN2),a=i<=48?1:l(2,i-48),s=T(t),u=s.mul(e);u.isNegative()||u.gt(n);)u=(s=T(t-=a,this.unsigned)).mul(e);s.isZero()&&(s=E),r=r.add(s),n=n.sub(u)}return r},O.div=O.divide,O.modulo=function(e){return A(e)||(e=S(e)),h?f((this.unsigned?h.rem_u:h.rem_s)(this.low,this.high,e.low,e.high),h.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},O.mod=O.modulo,O.rem=O.modulo,O.not=function(){return f(~this.low,~this.high,this.unsigned)},O.and=function(e){return A(e)||(e=S(e)),f(this.low&e.low,this.high&e.high,this.unsigned)},O.or=function(e){return A(e)||(e=S(e)),f(this.low|e.low,this.high|e.high,this.unsigned)},O.xor=function(e){return A(e)||(e=S(e)),f(this.low^e.low,this.high^e.high,this.unsigned)},O.shiftLeft=function(e){return A(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?f(this.low<>>32-e,this.unsigned):f(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):f(this.high>>e-32,0<=this.high?0:-1,this.unsigned)},O.shr=O.shiftRight,O.shiftRightUnsigned=function(e){if(A(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?f(this.low>>>e|t<<32-e,t>>>e,this.unsigned):f(32===e?t:t>>>e-32,0,this.unsigned)},O.shru=O.shiftRightUnsigned,O.shr_u=O.shiftRightUnsigned,O.toSigned=function(){return this.unsigned?f(this.low,this.high,!1):this},O.toUnsigned=function(){return this.unsigned?this:f(this.low,this.high,!0)},O.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},O.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},O.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},r.fromBytes=function(e,t,n){return n?r.fromBytesLE(e,t):r.fromBytesBE(e,t)},r.fromBytesLE=function(e,t){return new r(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},r.fromBytesBE=function(e,t){return new r(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}}],jk={},kk.m=ik,kk.c=jk,kk.d=function(e,t,n){kk.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},kk.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return kk.d(t,"a",t),t},kk.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},kk.p="",kk(kk.s=2))}),BSON=unwrapExports(bson_common),bson=BSON.bson,Bson=function(){function e(){_classCallCheck(this,e)}return _createClass(e,null,[{key:"serialize",value:function(e){return bson.serialize(e)}},{key:"deserialize",value:function(e){return bson.deserialize(e)}}]),e}(),SdlPacket=function(){function c(){var e=0>24,_[l++]=(16711680&s)>>16,_[l++]=(65280&s)>>8,_[l++]=255&s,1>24,_[l++]=(16711680&u)>>16,_[l++]=(65280&u)>>8,_[l++]=255&u),null!==o&&0>16&255,a[u++]=r>>8&255,a[u++]=255&r;return 2==i?(r=revLookup[e.charCodeAt(t)]<<2|revLookup[e.charCodeAt(t+1)]>>4,a[u++]=255&r):1==i&&(r=revLookup[e.charCodeAt(t)]<<10|revLookup[e.charCodeAt(t+1)]<<4|revLookup[e.charCodeAt(t+2)]>>2,a[u++]=r>>8&255,a[u++]=255&r),a}function tripletToBase64(e){return lookup[e>>18&63]+lookup[e>>12&63]+lookup[e>>6&63]+lookup[63&e]}function encodeChunk(e,t,n){for(var r,i=[],a=t;a>2],i+=lookup[t<<4&63],i+="=="):2==r&&(t=(e[n-2]<<8)+e[n-1],i+=lookup[t>>10],i+=lookup[t>>4&63],i+=lookup[t<<2&63],i+="="),a.push(i),a.join("")}function read(e,t,n,r,i){var a,s,u=8*i-r-1,o=(1<>1,l=-7,c=n?i-1:0,E=n?-1:1,h=e[t+c];for(c+=E,a=h&(1<<-l)-1,h>>=-l,l+=u;0>=-l,l+=r;0>1,E=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:a-1,A=r?1:-1,T=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(u=isNaN(t)?1:0,s=l):(s=Math.floor(Math.log(t)/Math.LN2),t*(o=Math.pow(2,-s))<1&&(s--,o*=2),2<=(t+=1<=s+c?E/o:E*Math.pow(2,1-c))*o&&(s++,o/=2),l<=s+c?(u=0,s=l):1<=s+c?(u=(t*o-1)*Math.pow(2,i),s+=c):(u=t*Math.pow(2,c-1)*Math.pow(2,i),s=0));8<=i;e[n+h]=255&u,h+=A,u/=256,i-=8);for(s=s<=kMaxLength())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+kMaxLength().toString(16)+" bytes");return 0|e}function internalIsBuffer(e){return!(null==e||!e._isBuffer)}function byteLength(e,t){if(internalIsBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return utf8ToBytes(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return base64ToBytes(e).length;default:if(r)return utf8ToBytes(e).length;t=(""+t).toLowerCase(),r=!0}}function slowToString(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e=e||"utf8";;)switch(e){case"hex":return hexSlice(this,t,n);case"utf8":case"utf-8":return utf8Slice(this,t,n);case"ascii":return asciiSlice(this,t,n);case"latin1":case"binary":return latin1Slice(this,t,n);case"base64":return base64Slice(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}function swap(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function bidirectionalIndexOf(e,t,n,r,i){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):2147483647=e.length){if(i)return-1;n=e.length-1}else if(n<0){if(!i)return-1;n=0}if("string"==typeof t&&(t=Buffer.from(t,r)),internalIsBuffer(t))return 0===t.length?-1:arrayIndexOf(e,t,n,r,i);if("number"==typeof t)return t&=255,Buffer.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):arrayIndexOf(e,[t],n,r,i);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(e,t,n,r,i){var a,s=1,u=e.length,o=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;u/=s=2,o/=2,n/=2}function _(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}if(i){var l=-1;for(a=n;a>>10&1023|55296),l=56320|1023&l),r.push(l),i+=c}return decodeCodePointsArray(r)}Buffer.TYPED_ARRAY_SUPPORT=void 0===global$1.TYPED_ARRAY_SUPPORT||global$1.TYPED_ARRAY_SUPPORT,Buffer.poolSize=8192,Buffer._augment=function(e){return e.__proto__=Buffer.prototype,e},Buffer.from=function(e,t,n){return from(null,e,t,n)},Buffer.TYPED_ARRAY_SUPPORT&&(Buffer.prototype.__proto__=Uint8Array.prototype,Buffer.__proto__=Uint8Array),Buffer.alloc=function(e,t,n){return alloc(null,e,t,n)},Buffer.allocUnsafe=function(e){return allocUnsafe(null,e)},Buffer.allocUnsafeSlow=function(e){return allocUnsafe(null,e)},Buffer.isBuffer=isBuffer,Buffer.compare=function(e,t){if(!internalIsBuffer(e)||!internalIsBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var n=e.length,r=t.length,i=0,a=Math.min(n,r);it&&(e+=" ... ")),""},Buffer.prototype.compare=function(e,t,n,r,i){if(!internalIsBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===i&&(i=this.length),t<0||n>e.length||r<0||i>this.length)throw new RangeError("out of range index");if(i<=r&&n<=t)return 0;if(i<=r)return-1;if(n<=t)return 1;if(this===e)return 0;for(var a=(i>>>=0)-(r>>>=0),s=(n>>>=0)-(t>>>=0),u=Math.min(a,s),o=this.slice(r,i),_=e.slice(t,n),l=0;lthis.length)throw new RangeError("Attempt to write outside buffer bounds");r=r||"utf8";for(var a=!1;;)switch(r){case"hex":return hexWrite(this,e,t,n);case"utf8":case"utf-8":return utf8Write(this,e,t,n);case"ascii":return asciiWrite(this,e,t,n);case"latin1":case"binary":return latin1Write(this,e,t,n);case"base64":return base64Write(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,e,t,n);default:if(a)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),a=!0}},Buffer.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var MAX_ARGUMENTS_LENGTH=4096;function decodeCodePointsArray(e){var t=e.length;if(t<=MAX_ARGUMENTS_LENGTH)return String.fromCharCode.apply(String,e);for(var n="",r=0;re.length)throw new RangeError("Index out of range")}function objectWriteUInt16(e,t,n,r){t<0&&(t=65535+t+1);for(var i=0,a=Math.min(e.length-n,2);i>>8*(r?i:1-i)}function objectWriteUInt32(e,t,n,r){t<0&&(t=4294967295+t+1);for(var i=0,a=Math.min(e.length-n,4);i>>8*(r?i:3-i)&255}function checkIEEE754(e,t,n,r,i,a){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function writeFloat(e,t,n,r,i){return i||checkIEEE754(e,t,n,4),write(e,t,n,r,23,4),n+4}function writeDouble(e,t,n,r,i){return i||checkIEEE754(e,t,n,8),write(e,t,n,r,52,8),n+8}Buffer.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):r>>8):objectWriteUInt16(this,e,t,!0),t+2},Buffer.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,2,65535,0),Buffer.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):objectWriteUInt16(this,e,t,!1),t+2},Buffer.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):objectWriteUInt32(this,e,t,!0),t+4},Buffer.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):objectWriteUInt32(this,e,t,!1),t+4},Buffer.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);checkInt(this,e,t,n,i-1,-i)}var a=0,s=1,u=0;for(this[t]=255&e;++a>0)-u&255;return t+n},Buffer.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);checkInt(this,e,t,n,i-1,-i)}var a=n-1,s=1,u=0;for(this[t+a]=255&e;0<=--a&&(s*=256);)e<0&&0===u&&0!==this[t+a+1]&&(u=1),this[t+a]=(e/s>>0)-u&255;return t+n},Buffer.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,1,127,-128),Buffer.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},Buffer.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):objectWriteUInt16(this,e,t,!0),t+2},Buffer.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):objectWriteUInt16(this,e,t,!1),t+2},Buffer.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,4,2147483647,-2147483648),Buffer.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):objectWriteUInt32(this,e,t,!0),t+4},Buffer.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||checkInt(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),Buffer.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):objectWriteUInt32(this,e,t,!1),t+4},Buffer.prototype.writeFloatLE=function(e,t,n){return writeFloat(this,e,t,!0,n)},Buffer.prototype.writeFloatBE=function(e,t,n){return writeFloat(this,e,t,!1,n)},Buffer.prototype.writeDoubleLE=function(e,t,n){return writeDouble(this,e,t,!0,n)},Buffer.prototype.writeDoubleBE=function(e,t,n){return writeDouble(this,e,t,!1,n)},Buffer.prototype.copy=function(e,t,n,r){if(n=n||0,r||0===r||(r=this.length),t>=e.length&&(t=e.length),t=t||0,0=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t>>=0,n=void 0===n?this.length:n>>>0,"number"==typeof(e=e||0))for(a=t;a>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;a.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;a.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return a}function asciiToBytes(e){for(var t=[],n=0;n>8,i=n%256,a.push(i),a.push(r);return a}function base64ToBytes(e){return toByteArray(base64clean(e))}function blitBuffer(e,t,n,r){for(var i=0;i=t.length||i>=e.length);++i)t[i+n]=e[i];return i}function isnan(e){return e!=e}function isBuffer(e){return null!=e&&(!!e._isBuffer||isFastBuffer(e)||isSlowBuffer(e))}function isFastBuffer(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function isSlowBuffer(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&isFastBuffer(e.slice(0,0))}var TextEncoder=function(){function e(){_classCallCheck(this,e)}return _createClass(e,null,[{key:"encode",value:function(e){for(var t=e.length,n=-1,r=[],i=0,a=0,s=0;s!==t;){if(i=e.charCodeAt(s),s+=1,55296<=i&&i<=56319){if(s===t){r[n+=1]=239,r[n+=1]=191,r[n+=1]=189;break}if(!(56320<=(a=e.charCodeAt(s))&&a<=57343)){r[n+=1]=239,r[n+=1]=191,r[n+=1]=189;continue}if(s+=1,65535<(i=1024*(i-55296)+a-56320+65536)){r[n+=1]=240|i>>>18,r[n+=1]=128|i>>>12&63,r[n+=1]=128|i>>>6&63,r[n+=1]=128|63&i;continue}}i<=127?r[n+=1]=0|i:(i<=2047?r[n+=1]=192|i>>>6:(r[n+=1]=224|i>>>12,r[n+=1]=128|i>>>6&63),r[n+=1]=128|63&i)}return r.length=n+1,r}}]),e}(),JsonRpcMarshaller=function(){function e(){_classCallCheck(this,e)}return _createClass(e,null,[{key:"marshall",value:function(e){var t=null;try{var n=function e(t){var n=t.getParameters();for(var r in n)n[r]instanceof RpcStruct&&(n[r]=e(n[r]));return n}(e),r=JSON.stringify(n);t=this._encode(r)}catch(e){console.error("Failed to encode messages to JSON.",e)}return t}},{key:"unmarshall",value:function(e){var t=null;try{var n=this._decode(e);t=JSON.parse(n)}catch(e){console.error("Failed to parse JSON",e)}return t}},{key:"_encode",value:function(e){return new Uint8Array(TextEncoder.encode(e))}},{key:"_decode",value:function(e){return Buffer.from(e).toString()}}]),e}(),BinaryFrameHeader=function(){function _(e,t,n,r){_classCallCheck(this,_),this._rpcType=e,this._functionId=t,this._correlationId=n,this._jsonSize=r,this._bulkData=null,this._jsonData=null}return _createClass(_,[{key:"assembleHeaderBytes",value:function(){var e=[],t=this._functionId,n=this._correlationId;this._rpcType;e.push((251658240&t)>>24),e.push((16711680&t)>>16),e.push((65280&t)>>8),e.push(255&t),e.push((4278190080&n)>>24),e.push((16711680&n)>>16),e.push((65280&n)>>8),e.push(255&n);var r=this._jsonSize;return e.push((4278190080&r)>>24),e.push((16711680&r)>>16),e.push((65280&r)>>8),e.push(255&r),e}},{key:"setRpcType",value:function(e){return this._rpcType=e,this}},{key:"getRpcType",value:function(){return this._rpcType}},{key:"setFunctionId",value:function(e){return this._functionId=e,this}},{key:"getFunctionId",value:function(){return this._functionId}},{key:"setCorrelationId",value:function(e){return this._correlationId=e,this}},{key:"getCorrelationId",value:function(){return this._correlationId}},{key:"setJsonSize",value:function(e){return this._jsonSize=e,this}},{key:"getJsonSize",value:function(){return this._jsonSize}},{key:"getJsonData",value:function(){return this._jsonData}},{key:"setJsonData",value:function(e){return this._jsonData=e,this}},{key:"setBulkData",value:function(e){return this._bulkData=e,this}},{key:"getBulkData",value:function(){return this._bulkData}}],[{key:"fromBinaryHeader",value:function(e){var t=e[0]>>4,n=(15&e[0])<<24;n+=(255&e[1])<<16,n+=(255&e[2])<<8,n+=255&e[3];var r=(255&e[4])<<24;r+=(255&e[5])<<16,r+=(255&e[6])<<8,r+=255&e[7];var i=(255&e[8])<<24;i+=(255&e[9])<<16,i+=(255&e[10])<<8;var a=new _(t,n,r,i+=255&e[11]),s=_.HEADER_SIZE,u=_.HEADER_SIZE+i;if(a.setJsonData(e.slice(s,u)),e.length>u){var o=e.slice(u);a.setBulkData(o)}return a}}]),_}();BinaryFrameHeader.HEADER_SIZE=12;var MessageFrameDisassembler=function(){function o(e,t,n,r,i,a,s){if(_classCallCheck(this,o),this._rpcRequest=e,this._sessionId=t,this._messageId=n,this._isEncrypted=a,!r)throw new Error("MTU must be specified.");if(this._mtu=r,!i)throw new Error("Version must be specified.");this._version=i,this._packetCallback=s}return _createClass(o,[{key:"_buildRPCMainBuffer",value:function(){var e=this._rpcRequest.getBulkData(),t=this._rpcRequest.getCorrelationId(),n=this._rpcRequest.getRPCType(),r=this._rpcRequest.getFunctionName(),i=FunctionID.valueForKey(r);if(!i)throw new Error("Failed to find function ".concat(r));var a=JsonRpcMarshaller.marshall(this._rpcRequest),s=a.length,u=new BinaryFrameHeader(n,i,t);u.setJsonData(a),u.setJsonSize(s),u.setBulkData(e);var o=u.getBulkData(),_=0;o&&(_=o.length);var l=new Uint8Array(12+s+_);return l.set(u.assembleHeaderBytes(),0),l.set(a,12),o&&l.set(o,12+s),l}},{key:"_doRequest",value:function(){var e=this._version,t=FrameType.SINGLE,n=SdlPacket.SERVICE_TYPE_RPC,r=this._sessionId,i=this._messageId,a=this._isEncrypted,s=this._buildRPCMainBuffer(),u=this._mtu,o=Math.ceil(s.length/u);if(o<=1){var _=this._constructPacket(e,n,0,r,i,t,s,a);this._packetCallback(_)}else{var l=new ArrayBuffer(8),c=new DataView(l);c.setUint32(0,s.length,!1),c.setUint32(4,o,!1);var E=new Uint8Array(l),h=this._constructPacket(e,n,0,r,i,FrameType.FIRST,E,a);this._packetCallback(h),this._buildConsecutiveFrames(e,n,r,i,s,u,a)}}},{key:"_constructPacket",value:function(e,t,n,r,i,a,s,u){var o=s.length;return new SdlPacket(e,u,a,t,n,r,o,i,s,0,o)}},{key:"_buildConsecutiveFrames",value:function(e,t,n,r,i,a,s){for(var u,o=0,_=0;0!==u;){u=_+a>=i.length?0:o%255+1;var l=this._constructPacket(e,t,u,n,r,FrameType.CONSECUTIVE,i.slice(_,_+a),s);this._packetCallback(l),o++,_+=a}}}],[{key:"buildRPC",value:function(e,t,n,r,i,a,s){var u=new o(e,t,n,r,i,a,s);return u._doRequest(),u}}]),o}(),TransportListener=function(){function e(){_classCallCheck(this,e),this._onTransportConnected=null,this._onTransportDisconnected=null,this._onError=null,this._onPacketReceived=null}return _createClass(e,[{key:"setOnTransportConnected",value:function(e){return this._onTransportConnected=e,this}},{key:"setOnTransportDisconnected",value:function(e){return this._onTransportDisconnected=e,this}},{key:"setOnError",value:function(e){return this._onError=e,this}},{key:"setOnPacketReceived",value:function(e){return this._onPacketReceived=e,this}},{key:"onTransportConnected",value:function(){"function"==typeof this._onTransportConnected&&this._onTransportConnected()}},{key:"onTransportDisconnected",value:function(){"function"==typeof this._onTransportDisconnected&&this._onTransportDisconnected()}},{key:"onError",value:function(e){var t=0e.getMajor())return 1;if(this.getMajor()===e.getMajor()){if(this.getMinor()>e.getMinor())return 1;if(this.getMinor()===e.getMinor()){if(this.getPatch()>e.getPatch())return 1;if(this.getPatch()===e.getPatch())return 0}}return-1}}]),r}(),ServiceType=function(){function t(){return _classCallCheck(this,t),_possibleConstructorReturn(this,_getPrototypeOf(t).call(this))}return _inherits(t,Enum),_createClass(t,null,[{key:"valueForKey",value:function(e){return t._valueForKey(e,t._MAP)}},{key:"keyForValue",value:function(e){return t._keyForValue(e,t._MAP)}},{key:"CONTROL",get:function(){return t._MAP.CONTROL}},{key:"RPC",get:function(){return t._MAP.RPC}},{key:"AUDIO",get:function(){return t._MAP.AUDIO}},{key:"VIDEO",get:function(){return t._MAP.VIDEO}},{key:"HYBRID",get:function(){return t._MAP.HYBRID}}]),t}();ServiceType._MAP=Object.freeze({CONTROL:0,RPC:7,AUDIO:10,VIDEO:11,HYBRID:15});var MessageFrameAssembler=function(){function t(e){if(_classCallCheck(this,t),"function"!=typeof e)throw new Error("Callback not of expected type (function) for MessageFrameAssembler");this._callback=e,this._accumulator=[],this._totalConsecutiveFrames=0,this._consecutiveFramesHandledCount=0,this._consecutiveFramesDataLength=0}return _createClass(t,[{key:"handleFrame",value:function(e){var t=e.getFrameType();return t!==FrameType.FIRST&&t!==FrameType.CONSECUTIVE?this._callback(null,e):this._handleMultiFrameMessage(e)}},{key:"_handleFirstDataFrame",value:function(e){var t=e.getPayload();if(t instanceof Uint8Array!=!0||8!==t.length)throw new Error("Error handling first frame. Payload is an invalid length should be length 8.");for(var n in t)if(n<0||255>4,0===this._version?n.ERROR_STATE:(this._encryption=1==(e&n.ENCRYPTION_MASK)>>3,this._frameType=e&n.FRAME_TYPE_MASK,(this._version<1||5FrameType.CONSECUTIVE?n.ERROR_STATE:n.SERVICE_TYPE_STATE);if(t===n.SERVICE_TYPE_STATE)return this._serviceType=255&e,n.CONTROL_FRAME_INFO_STATE;if(t===n.CONTROL_FRAME_INFO_STATE){switch(this._controlFrameInfo=255&e,this._frameType){case FrameType.CONTROL:break;case FrameType.SINGLE:case FrameType.FIRST:if(0!==this._controlFrameInfo)return n.ERROR_STATE;break;case FrameType.CONSECUTIVE:break;default:return n.ERROR_STATE}return n.SESSION_ID_STATE}if(t===n.SESSION_ID_STATE)return this._sessionID=255&e,n.DATA_SIZE_1_STATE;if(t===n.DATA_SIZE_1_STATE)return this._dataLength+=(255&e)<<24,n.DATA_SIZE_2_STATE;if(t===n.DATA_SIZE_2_STATE)return this._dataLength+=(255&e)<<16,n.DATA_SIZE_3_STATE;if(t===n.DATA_SIZE_3_STATE)return this._dataLength+=(255&e)<<8,n.DATA_SIZE_4_STATE;if(t!==n.DATA_SIZE_4_STATE)return t===n.MESSAGE_1_STATE?(this._messageID+=(255&e)<<24,n.MESSAGE_2_STATE):t===n.MESSAGE_2_STATE?(this._messageID+=(255&e)<<16,n.MESSAGE_3_STATE):t===n.MESSAGE_3_STATE?(this._messageID+=(255&e)<<8,n.MESSAGE_4_STATE):t===n.MESSAGE_4_STATE?(this._messageID+=255&e,0===this._dataLength?n.FINISHED_STATE:(this._dumpSize=this._dataLength,this._payload=new Uint8Array(this._dataLength),n.DATA_PUMP_STATE)):t===n.DATA_PUMP_STATE?(this._payload[this._dataLength-this._dumpSize]=e,this._dumpSize-=1,0mediaClock) + * @return {String} + */ + static get CLEAR () { + return UpdateMode._MAP.CLEAR; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return UpdateMode._valueForKey(key, UpdateMode._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return UpdateMode._keyForValue(value, UpdateMode._MAP); + } +} + +UpdateMode._MAP = Object.freeze({ + 'COUNTUP': 'COUNTUP', + 'COUNTDOWN': 'COUNTDOWN', + 'PAUSE': 'PAUSE', + 'RESUME': 'RESUME', + 'CLEAR': 'CLEAR', +}); + +export { UpdateMode }; \ No newline at end of file diff --git a/lib/js/src/rpc/enums/VehicleDataActiveStatus.js b/lib/js/src/rpc/enums/VehicleDataActiveStatus.js new file mode 100644 index 00000000..be9cf47a --- /dev/null +++ b/lib/js/src/rpc/enums/VehicleDataActiveStatus.js @@ -0,0 +1,111 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Enum } from '../../util/Enum.js'; + +/** + * Reflects the status of given vehicle component. + * @typedef {Enum} VehicleDataActiveStatus + * @property {Object} _MAP + */ +class VehicleDataActiveStatus extends Enum { + /** + * @constructor + */ + constructor () { + super(); + } + + /** + * @return {String} + */ + static get VDAS_INACTIVE_NOT_CONFIRMED () { + return VehicleDataActiveStatus._MAP.VDAS_INACTIVE_NOT_CONFIRMED; + } + + /** + * @return {String} + */ + static get VDAS_INACTIVE_CONFIRMED () { + return VehicleDataActiveStatus._MAP.VDAS_INACTIVE_CONFIRMED; + } + + /** + * @return {String} + */ + static get VDAS_ACTIVE_NOT_CONFIRMED () { + return VehicleDataActiveStatus._MAP.VDAS_ACTIVE_NOT_CONFIRMED; + } + + /** + * @return {String} + */ + static get VDAS_ACTIVE_CONFIRMED () { + return VehicleDataActiveStatus._MAP.VDAS_ACTIVE_CONFIRMED; + } + + /** + * @return {String} + */ + static get VDAS_FAULT () { + return VehicleDataActiveStatus._MAP.VDAS_FAULT; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return VehicleDataActiveStatus._valueForKey(key, VehicleDataActiveStatus._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return VehicleDataActiveStatus._keyForValue(value, VehicleDataActiveStatus._MAP); + } +} + +VehicleDataActiveStatus._MAP = Object.freeze({ + 'VDAS_INACTIVE_NOT_CONFIRMED': 'INACTIVE_NOT_CONFIRMED', + 'VDAS_INACTIVE_CONFIRMED': 'INACTIVE_CONFIRMED', + 'VDAS_ACTIVE_NOT_CONFIRMED': 'ACTIVE_NOT_CONFIRMED', + 'VDAS_ACTIVE_CONFIRMED': 'ACTIVE_CONFIRMED', + 'VDAS_FAULT': 'FAULT', +}); + +export { VehicleDataActiveStatus }; \ No newline at end of file diff --git a/lib/js/src/rpc/enums/VehicleDataEventStatus.js b/lib/js/src/rpc/enums/VehicleDataEventStatus.js new file mode 100644 index 00000000..0cb39425 --- /dev/null +++ b/lib/js/src/rpc/enums/VehicleDataEventStatus.js @@ -0,0 +1,111 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Enum } from '../../util/Enum.js'; + +/** + * Reflects the status of a vehicle data event; e.g. a seat belt event status. + * @typedef {Enum} VehicleDataEventStatus + * @property {Object} _MAP + */ +class VehicleDataEventStatus extends Enum { + /** + * @constructor + */ + constructor () { + super(); + } + + /** + * @return {String} + */ + static get VDES_NO_EVENT () { + return VehicleDataEventStatus._MAP.VDES_NO_EVENT; + } + + /** + * @return {String} + */ + static get VDES_NO () { + return VehicleDataEventStatus._MAP.VDES_NO; + } + + /** + * @return {String} + */ + static get VDES_YES () { + return VehicleDataEventStatus._MAP.VDES_YES; + } + + /** + * @return {String} + */ + static get VDES_NOT_SUPPORTED () { + return VehicleDataEventStatus._MAP.VDES_NOT_SUPPORTED; + } + + /** + * @return {String} + */ + static get VDES_FAULT () { + return VehicleDataEventStatus._MAP.VDES_FAULT; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return VehicleDataEventStatus._valueForKey(key, VehicleDataEventStatus._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return VehicleDataEventStatus._keyForValue(value, VehicleDataEventStatus._MAP); + } +} + +VehicleDataEventStatus._MAP = Object.freeze({ + 'VDES_NO_EVENT': 'NO_EVENT', + 'VDES_NO': 'NO', + 'VDES_YES': 'YES', + 'VDES_NOT_SUPPORTED': 'NOT_SUPPORTED', + 'VDES_FAULT': 'FAULT', +}); + +export { VehicleDataEventStatus }; \ No newline at end of file diff --git a/lib/js/src/rpc/enums/VehicleDataNotificationStatus.js b/lib/js/src/rpc/enums/VehicleDataNotificationStatus.js new file mode 100644 index 00000000..fa5f1eee --- /dev/null +++ b/lib/js/src/rpc/enums/VehicleDataNotificationStatus.js @@ -0,0 +1,103 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Enum } from '../../util/Enum.js'; + +/** + * Reflects the status of a vehicle data notification. + * @typedef {Enum} VehicleDataNotificationStatus + * @property {Object} _MAP + */ +class VehicleDataNotificationStatus extends Enum { + /** + * @constructor + */ + constructor () { + super(); + } + + /** + * @return {String} + */ + static get VDNS_NOT_SUPPORTED () { + return VehicleDataNotificationStatus._MAP.VDNS_NOT_SUPPORTED; + } + + /** + * @return {String} + */ + static get VDNS_NORMAL () { + return VehicleDataNotificationStatus._MAP.VDNS_NORMAL; + } + + /** + * @return {String} + */ + static get VDNS_ACTIVE () { + return VehicleDataNotificationStatus._MAP.VDNS_ACTIVE; + } + + /** + * @return {String} + */ + static get VDNS_NOT_USED () { + return VehicleDataNotificationStatus._MAP.VDNS_NOT_USED; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return VehicleDataNotificationStatus._valueForKey(key, VehicleDataNotificationStatus._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return VehicleDataNotificationStatus._keyForValue(value, VehicleDataNotificationStatus._MAP); + } +} + +VehicleDataNotificationStatus._MAP = Object.freeze({ + 'VDNS_NOT_SUPPORTED': 'NOT_SUPPORTED', + 'VDNS_NORMAL': 'NORMAL', + 'VDNS_ACTIVE': 'ACTIVE', + 'VDNS_NOT_USED': 'NOT_USED', +}); + +export { VehicleDataNotificationStatus }; \ No newline at end of file diff --git a/lib/js/src/rpc/enums/VehicleDataResultCode.js b/lib/js/src/rpc/enums/VehicleDataResultCode.js new file mode 100644 index 00000000..3b5e6bb5 --- /dev/null +++ b/lib/js/src/rpc/enums/VehicleDataResultCode.js @@ -0,0 +1,152 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Enum } from '../../util/Enum.js'; + +/** + * Enumeration that describes possible result codes of a vehicle data entry request. + * @typedef {Enum} VehicleDataResultCode + * @property {Object} _MAP + */ +class VehicleDataResultCode extends Enum { + /** + * @constructor + */ + constructor () { + super(); + } + + /** + * Individual vehicle data item / DTC / DID request or subscription successful + * @return {String} + */ + static get VDRC_SUCCESS () { + return VehicleDataResultCode._MAP.VDRC_SUCCESS; + } + + /** + * DTC / DID request successful, however, not all active DTCs or full contents of DID location available + * @return {String} + */ + static get VDRC_TRUNCATED_DATA () { + return VehicleDataResultCode._MAP.VDRC_TRUNCATED_DATA; + } + + /** + * This vehicle data item is not allowed for this app by the OEM/Manufactorer of the connected module. + * @return {String} + */ + static get VDRC_DISALLOWED () { + return VehicleDataResultCode._MAP.VDRC_DISALLOWED; + } + + /** + * The user has not granted access to this type of vehicle data item at this time. + * @return {String} + */ + static get VDRC_USER_DISALLOWED () { + return VehicleDataResultCode._MAP.VDRC_USER_DISALLOWED; + } + + /** + * The ECU ID referenced is not a valid ID on the bus / system. + * @return {String} + */ + static get VDRC_INVALID_ID () { + return VehicleDataResultCode._MAP.VDRC_INVALID_ID; + } + + /** + * The requested vehicle data item / DTC / DID is not currently available or responding on the bus / system. + * @return {String} + */ + static get VDRC_DATA_NOT_AVAILABLE () { + return VehicleDataResultCode._MAP.VDRC_DATA_NOT_AVAILABLE; + } + + /** + * The vehicle data item is already subscribed. + * @return {String} + */ + static get VDRC_DATA_ALREADY_SUBSCRIBED () { + return VehicleDataResultCode._MAP.VDRC_DATA_ALREADY_SUBSCRIBED; + } + + /** + * The vehicle data item cannot be unsubscribed because it is not currently subscribed. + * @return {String} + */ + static get VDRC_DATA_NOT_SUBSCRIBED () { + return VehicleDataResultCode._MAP.VDRC_DATA_NOT_SUBSCRIBED; + } + + /** + * The request for this item is ignored because it is already in progress. + * @return {String} + */ + static get VDRC_IGNORED () { + return VehicleDataResultCode._MAP.VDRC_IGNORED; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return VehicleDataResultCode._valueForKey(key, VehicleDataResultCode._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return VehicleDataResultCode._keyForValue(value, VehicleDataResultCode._MAP); + } +} + +VehicleDataResultCode._MAP = Object.freeze({ + 'VDRC_SUCCESS': 'SUCCESS', + 'VDRC_TRUNCATED_DATA': 'TRUNCATED_DATA', + 'VDRC_DISALLOWED': 'DISALLOWED', + 'VDRC_USER_DISALLOWED': 'USER_DISALLOWED', + 'VDRC_INVALID_ID': 'INVALID_ID', + 'VDRC_DATA_NOT_AVAILABLE': 'VEHICLE_DATA_NOT_AVAILABLE', + 'VDRC_DATA_ALREADY_SUBSCRIBED': 'DATA_ALREADY_SUBSCRIBED', + 'VDRC_DATA_NOT_SUBSCRIBED': 'DATA_NOT_SUBSCRIBED', + 'VDRC_IGNORED': 'IGNORED', +}); + +export { VehicleDataResultCode }; \ No newline at end of file diff --git a/lib/js/src/rpc/enums/VehicleDataStatus.js b/lib/js/src/rpc/enums/VehicleDataStatus.js new file mode 100644 index 00000000..54733f79 --- /dev/null +++ b/lib/js/src/rpc/enums/VehicleDataStatus.js @@ -0,0 +1,95 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Enum } from '../../util/Enum.js'; + +/** + * Reflects the status of a binary vehicle data item. + * @typedef {Enum} VehicleDataStatus + * @property {Object} _MAP + */ +class VehicleDataStatus extends Enum { + /** + * @constructor + */ + constructor () { + super(); + } + + /** + * @return {String} + */ + static get VDS_NO_DATA_EXISTS () { + return VehicleDataStatus._MAP.VDS_NO_DATA_EXISTS; + } + + /** + * @return {String} + */ + static get VDS_OFF () { + return VehicleDataStatus._MAP.VDS_OFF; + } + + /** + * @return {String} + */ + static get VDS_ON () { + return VehicleDataStatus._MAP.VDS_ON; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return VehicleDataStatus._valueForKey(key, VehicleDataStatus._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return VehicleDataStatus._keyForValue(value, VehicleDataStatus._MAP); + } +} + +VehicleDataStatus._MAP = Object.freeze({ + 'VDS_NO_DATA_EXISTS': 'NO_DATA_EXISTS', + 'VDS_OFF': 'OFF', + 'VDS_ON': 'ON', +}); + +export { VehicleDataStatus }; \ No newline at end of file diff --git a/lib/js/src/rpc/enums/VehicleDataType.js b/lib/js/src/rpc/enums/VehicleDataType.js new file mode 100644 index 00000000..96c1345c --- /dev/null +++ b/lib/js/src/rpc/enums/VehicleDataType.js @@ -0,0 +1,328 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Enum } from '../../util/Enum.js'; + +/** + * Defines the data types that can be published and subscribed to. + * @typedef {Enum} VehicleDataType + * @property {Object} _MAP + */ +class VehicleDataType extends Enum { + /** + * @constructor + */ + constructor () { + super(); + } + + /** + * Notifies GPSData may be subscribed + * @return {String} + */ + static get VEHICLEDATA_GPS () { + return VehicleDataType._MAP.VEHICLEDATA_GPS; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_SPEED () { + return VehicleDataType._MAP.VEHICLEDATA_SPEED; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_RPM () { + return VehicleDataType._MAP.VEHICLEDATA_RPM; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_FUELLEVEL () { + return VehicleDataType._MAP.VEHICLEDATA_FUELLEVEL; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_FUELLEVEL_STATE () { + return VehicleDataType._MAP.VEHICLEDATA_FUELLEVEL_STATE; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_FUELCONSUMPTION () { + return VehicleDataType._MAP.VEHICLEDATA_FUELCONSUMPTION; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_EXTERNTEMP () { + return VehicleDataType._MAP.VEHICLEDATA_EXTERNTEMP; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_VIN () { + return VehicleDataType._MAP.VEHICLEDATA_VIN; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_PRNDL () { + return VehicleDataType._MAP.VEHICLEDATA_PRNDL; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_TIREPRESSURE () { + return VehicleDataType._MAP.VEHICLEDATA_TIREPRESSURE; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_ODOMETER () { + return VehicleDataType._MAP.VEHICLEDATA_ODOMETER; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_BELTSTATUS () { + return VehicleDataType._MAP.VEHICLEDATA_BELTSTATUS; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_BODYINFO () { + return VehicleDataType._MAP.VEHICLEDATA_BODYINFO; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_DEVICESTATUS () { + return VehicleDataType._MAP.VEHICLEDATA_DEVICESTATUS; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_ECALLINFO () { + return VehicleDataType._MAP.VEHICLEDATA_ECALLINFO; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_AIRBAGSTATUS () { + return VehicleDataType._MAP.VEHICLEDATA_AIRBAGSTATUS; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_EMERGENCYEVENT () { + return VehicleDataType._MAP.VEHICLEDATA_EMERGENCYEVENT; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_CLUSTERMODESTATUS () { + return VehicleDataType._MAP.VEHICLEDATA_CLUSTERMODESTATUS; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_MYKEY () { + return VehicleDataType._MAP.VEHICLEDATA_MYKEY; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_BRAKING () { + return VehicleDataType._MAP.VEHICLEDATA_BRAKING; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_WIPERSTATUS () { + return VehicleDataType._MAP.VEHICLEDATA_WIPERSTATUS; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_HEADLAMPSTATUS () { + return VehicleDataType._MAP.VEHICLEDATA_HEADLAMPSTATUS; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_BATTVOLTAGE () { + return VehicleDataType._MAP.VEHICLEDATA_BATTVOLTAGE; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_ENGINETORQUE () { + return VehicleDataType._MAP.VEHICLEDATA_ENGINETORQUE; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_ACCPEDAL () { + return VehicleDataType._MAP.VEHICLEDATA_ACCPEDAL; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_STEERINGWHEEL () { + return VehicleDataType._MAP.VEHICLEDATA_STEERINGWHEEL; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_TURNSIGNAL () { + return VehicleDataType._MAP.VEHICLEDATA_TURNSIGNAL; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_FUELRANGE () { + return VehicleDataType._MAP.VEHICLEDATA_FUELRANGE; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_ENGINEOILLIFE () { + return VehicleDataType._MAP.VEHICLEDATA_ENGINEOILLIFE; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_ELECTRONICPARKBRAKESTATUS () { + return VehicleDataType._MAP.VEHICLEDATA_ELECTRONICPARKBRAKESTATUS; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_CLOUDAPPVEHICLEID () { + return VehicleDataType._MAP.VEHICLEDATA_CLOUDAPPVEHICLEID; + } + + /** + * @return {String} + */ + static get VEHICLEDATA_OEM_CUSTOM_DATA () { + return VehicleDataType._MAP.VEHICLEDATA_OEM_CUSTOM_DATA; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return VehicleDataType._valueForKey(key, VehicleDataType._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return VehicleDataType._keyForValue(value, VehicleDataType._MAP); + } +} + +VehicleDataType._MAP = Object.freeze({ + 'VEHICLEDATA_GPS': 'VEHICLEDATA_GPS', + 'VEHICLEDATA_SPEED': 'VEHICLEDATA_SPEED', + 'VEHICLEDATA_RPM': 'VEHICLEDATA_RPM', + 'VEHICLEDATA_FUELLEVEL': 'VEHICLEDATA_FUELLEVEL', + 'VEHICLEDATA_FUELLEVEL_STATE': 'VEHICLEDATA_FUELLEVEL_STATE', + 'VEHICLEDATA_FUELCONSUMPTION': 'VEHICLEDATA_FUELCONSUMPTION', + 'VEHICLEDATA_EXTERNTEMP': 'VEHICLEDATA_EXTERNTEMP', + 'VEHICLEDATA_VIN': 'VEHICLEDATA_VIN', + 'VEHICLEDATA_PRNDL': 'VEHICLEDATA_PRNDL', + 'VEHICLEDATA_TIREPRESSURE': 'VEHICLEDATA_TIREPRESSURE', + 'VEHICLEDATA_ODOMETER': 'VEHICLEDATA_ODOMETER', + 'VEHICLEDATA_BELTSTATUS': 'VEHICLEDATA_BELTSTATUS', + 'VEHICLEDATA_BODYINFO': 'VEHICLEDATA_BODYINFO', + 'VEHICLEDATA_DEVICESTATUS': 'VEHICLEDATA_DEVICESTATUS', + 'VEHICLEDATA_ECALLINFO': 'VEHICLEDATA_ECALLINFO', + 'VEHICLEDATA_AIRBAGSTATUS': 'VEHICLEDATA_AIRBAGSTATUS', + 'VEHICLEDATA_EMERGENCYEVENT': 'VEHICLEDATA_EMERGENCYEVENT', + 'VEHICLEDATA_CLUSTERMODESTATUS': 'VEHICLEDATA_CLUSTERMODESTATUS', + 'VEHICLEDATA_MYKEY': 'VEHICLEDATA_MYKEY', + 'VEHICLEDATA_BRAKING': 'VEHICLEDATA_BRAKING', + 'VEHICLEDATA_WIPERSTATUS': 'VEHICLEDATA_WIPERSTATUS', + 'VEHICLEDATA_HEADLAMPSTATUS': 'VEHICLEDATA_HEADLAMPSTATUS', + 'VEHICLEDATA_BATTVOLTAGE': 'VEHICLEDATA_BATTVOLTAGE', + 'VEHICLEDATA_ENGINETORQUE': 'VEHICLEDATA_ENGINETORQUE', + 'VEHICLEDATA_ACCPEDAL': 'VEHICLEDATA_ACCPEDAL', + 'VEHICLEDATA_STEERINGWHEEL': 'VEHICLEDATA_STEERINGWHEEL', + 'VEHICLEDATA_TURNSIGNAL': 'VEHICLEDATA_TURNSIGNAL', + 'VEHICLEDATA_FUELRANGE': 'VEHICLEDATA_FUELRANGE', + 'VEHICLEDATA_ENGINEOILLIFE': 'VEHICLEDATA_ENGINEOILLIFE', + 'VEHICLEDATA_ELECTRONICPARKBRAKESTATUS': 'VEHICLEDATA_ELECTRONICPARKBRAKESTATUS', + 'VEHICLEDATA_CLOUDAPPVEHICLEID': 'VEHICLEDATA_CLOUDAPPVEHICLEID', + 'VEHICLEDATA_OEM_CUSTOM_DATA': 'VEHICLEDATA_OEM_CUSTOM_DATA', +}); + +export { VehicleDataType }; \ No newline at end of file diff --git a/lib/js/src/rpc/enums/VentilationMode.js b/lib/js/src/rpc/enums/VentilationMode.js new file mode 100644 index 00000000..fa2d72eb --- /dev/null +++ b/lib/js/src/rpc/enums/VentilationMode.js @@ -0,0 +1,102 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Enum } from '../../util/Enum.js'; + +/** + * @typedef {Enum} VentilationMode + * @property {Object} _MAP + */ +class VentilationMode extends Enum { + /** + * @constructor + */ + constructor () { + super(); + } + + /** + * @return {String} + */ + static get UPPER () { + return VentilationMode._MAP.UPPER; + } + + /** + * @return {String} + */ + static get LOWER () { + return VentilationMode._MAP.LOWER; + } + + /** + * @return {String} + */ + static get BOTH () { + return VentilationMode._MAP.BOTH; + } + + /** + * @return {String} + */ + static get NONE () { + return VentilationMode._MAP.NONE; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return VentilationMode._valueForKey(key, VentilationMode._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return VentilationMode._keyForValue(value, VentilationMode._MAP); + } +} + +VentilationMode._MAP = Object.freeze({ + 'UPPER': 'UPPER', + 'LOWER': 'LOWER', + 'BOTH': 'BOTH', + 'NONE': 'NONE', +}); + +export { VentilationMode }; \ No newline at end of file diff --git a/lib/js/src/rpc/enums/VideoStreamingCodec.js b/lib/js/src/rpc/enums/VideoStreamingCodec.js index 81005805..020099a1 100644 --- a/lib/js/src/rpc/enums/VideoStreamingCodec.js +++ b/lib/js/src/rpc/enums/VideoStreamingCodec.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -33,17 +34,21 @@ import { Enum } from '../../util/Enum.js'; /** + * Enum for each type of video streaming codec. * @typedef {Enum} VideoStreamingCodec * @property {Object} _MAP */ class VideoStreamingCodec extends Enum { /** - * @constructor - */ + * @constructor + */ constructor () { super(); } + /** + * A block-oriented motion-compensation-based video compression standard. As of 2014 it is one of the most + * commonly used formats for the recording, compression, and distribution of video content. * @return {String} */ static get H264 () { @@ -51,6 +56,10 @@ class VideoStreamingCodec extends Enum { } /** + * High Efficiency Video Coding (HEVC), also known as H.265 and MPEG-H Part 2, is a video compression standard, + * one of several potential successors to the widely used AVC (H.264 or MPEG-4 Part 10). In comparison to AVC, + * HEVC offers about double the data compression ratio at the same level of video quality, or substantially + * improved video quality at the same bit rate. It supports resolutions up to 8192x4320, including 8K UHD. * @return {String} */ static get H265 () { @@ -58,6 +67,10 @@ class VideoStreamingCodec extends Enum { } /** + * Theora is derived from the formerly proprietary VP3 codec, released into the public domain by On2 Technologies. + * It is broadly comparable in design and bitrate efficiency to MPEG-4 Part 2, early versions of Windows Media + * Video, and RealVideo while lacking some of the features present in some of these other codecs. It is comparable + * in open standards philosophy to the BBC's Dirac codec. * @return {String} */ static get Theora () { @@ -65,6 +78,9 @@ class VideoStreamingCodec extends Enum { } /** + * VP8 can be multiplexed into the Matroska-based container format WebM along with Vorbis and Opus audio. The + * image format WebP is based on VP8's intra-frame coding. VP8's direct successor, VP9, and the emerging royalty- + * free internet video format AV1 from the Alliance for Open Media (AOMedia) are based on VP8. * @return {String} */ static get VP8 () { @@ -72,6 +88,8 @@ class VideoStreamingCodec extends Enum { } /** + * Similar to VP8, but VP9 is customized for video resolutions beyond high-definition video (UHD) and also enables + * lossless compression. * @return {String} */ static get VP9 () { @@ -79,58 +97,29 @@ class VideoStreamingCodec extends Enum { } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey (key) { return VideoStreamingCodec._valueForKey(key, VideoStreamingCodec._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue (value) { return VideoStreamingCodec._keyForValue(value, VideoStreamingCodec._MAP); } } VideoStreamingCodec._MAP = Object.freeze({ - /** - * A block-oriented motion-compensation-based video compression standard. As of 2014 it is one - * of the most commonly used formats for the recording, compression, and distribution of video - * content. - */ 'H264': 'H264', - /** - * High Efficiency Video Coding (HEVC), also known as H.265 and MPEG-H Part 2, is a video - * compression standard, one of several potential successors to the widely used AVC - * (H.264 or MPEG-4 Part 10). In comparison to AVC, HEVC offers about double the data - * compression ratio at the same level of video quality, or substantially improved video quality - * at the same bit rate. It supports resolutions up to 8192x4320, including 8K UHD. - */ 'H265': 'H265', - /** - * Theora is derived from the formerly proprietary VP3 codec, released into the public domain by - * On2 Technologies. It is broadly comparable in design and bitrate efficiency to MPEG-4 Part 2, - * early versions of Windows Media Video, and RealVideo while lacking some of the features - * present in some of these other codecs. It is comparable in open standards philosophy to the - * BBC's Dirac codec. - */ 'Theora': 'Theora', - /** - * VP8 can be multiplexed into the Matroska-based container format WebM along with Vorbis and - * Opus audio. The image format WebP is based on VP8's intra-frame coding. VP8's direct - * successor, VP9, and the emerging royalty-free internet video format AV1 from the Alliance - * for Open Media (AOMedia) are based on VP8. - */ 'VP8': 'VP8', - /** - * Similar to VP8, but VP9 is customized for video resolutions beyond high-definition video - * (UHD) and also enables lossless compression. - */ 'VP9': 'VP9', }); diff --git a/lib/js/src/rpc/enums/VideoStreamingProtocol.js b/lib/js/src/rpc/enums/VideoStreamingProtocol.js index 018e1f5a..92da2d22 100644 --- a/lib/js/src/rpc/enums/VideoStreamingProtocol.js +++ b/lib/js/src/rpc/enums/VideoStreamingProtocol.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -33,17 +34,20 @@ import { Enum } from '../../util/Enum.js'; /** + * Enum for each type of video streaming protocol type. * @typedef {Enum} VideoStreamingProtocol * @property {Object} _MAP */ class VideoStreamingProtocol extends Enum { /** - * @constructor - */ + * @constructor + */ constructor () { super(); } + /** + * Raw stream bytes that contains no timestamp data and is the lowest supported video streaming * @return {String} */ static get RAW () { @@ -51,6 +55,9 @@ class VideoStreamingProtocol extends Enum { } /** + * RTP facilitates the transfer of real-time data. Information provided by this protocol include timestamps (for + * synchronization), sequence numbers (for packet loss and reordering detection) and the payload format which + * indicates the encoded format of the data. * @return {String} */ static get RTP () { @@ -58,6 +65,9 @@ class VideoStreamingProtocol extends Enum { } /** + * The transmission of streaming data itself is not a task of RTSP. Most RTSP servers use the Real-time Transport + * Protocol (RTP) in conjunction with Real-time Control Protocol (RTCP) for media stream delivery. However, some + * vendors implement proprietary transport protocols. * @return {String} */ static get RTSP () { @@ -65,6 +75,9 @@ class VideoStreamingProtocol extends Enum { } /** + * Real-Time Messaging Protocol (RTMP) was initially a proprietary protocol developed by Macromedia for streaming + * audio, video and data over the Internet, between a Flash player and a server. Macromedia is now owned by Adobe, + * which has released an incomplete version of the specification of the protocol for public use. * @return {String} */ static get RTMP () { @@ -72,6 +85,8 @@ class VideoStreamingProtocol extends Enum { } /** + * The WebM container is based on a profile of Matroska. WebM initially supported VP8 video and Vorbis audio + * streams. In 2013 it was updated to accommodate VP9 video and Opus audio. * @return {String} */ static get WEBM () { @@ -79,54 +94,30 @@ class VideoStreamingProtocol extends Enum { } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey (key) { return VideoStreamingProtocol._valueForKey(key, VideoStreamingProtocol._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue (value) { return VideoStreamingProtocol._keyForValue(value, VideoStreamingProtocol._MAP); } } VideoStreamingProtocol._MAP = Object.freeze({ - /** - * Raw stream bytes that contains no timestamp data and is the lowest supported video streaming - */ 'RAW': 'RAW', - /** - * RTP facilitates the transfer of real-time data. Information provided by this protocol include - * timestamps (for synchronization), sequence numbers (for packet loss and reordering detection) - * and the payload format which indicates the encoded format of the data. - */ 'RTP': 'RTP', - /** - * The transmission of streaming data itself is not a task of RTSP. Most RTSP servers use the - * Real-time Transport Protocol (RTP) in conjunction with Real-time Control Protocol (RTCP) for - * media stream delivery. However, some vendors implement proprietary transport protocols. - */ 'RTSP': 'RTSP', - /** - * Real-Time Messaging Protocol (RTMP) was initially a proprietary protocol developed by - * Macromedia for streaming audio, video and data over the Internet, between a Flash player and - * a server. Macromedia is now owned by Adobe, which has released an incomplete version of the - * specification of the protocol for public use. - */ 'RTMP': 'RTMP', - /** - * The WebM container is based on a profile of Matroska. WebM initially supported VP8 video and - * Vorbis audio streams. In 2013 it was updated to accommodate VP9 video and Opus audio. - */ 'WEBM': 'WEBM', - }); export { VideoStreamingProtocol }; \ No newline at end of file diff --git a/lib/js/src/rpc/enums/VideoStreamingState.js b/lib/js/src/rpc/enums/VideoStreamingState.js index 73a95092..75ebbcd0 100644 --- a/lib/js/src/rpc/enums/VideoStreamingState.js +++ b/lib/js/src/rpc/enums/VideoStreamingState.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -33,10 +34,14 @@ import { Enum } from '../../util/Enum.js'; /** + * Enumeration that describes possible states of video streaming. * @typedef {Enum} VideoStreamingState * @property {Object} _MAP */ class VideoStreamingState extends Enum { + /** + * @constructor + */ constructor () { super(); } @@ -56,19 +61,19 @@ class VideoStreamingState extends Enum { } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey (key) { return VideoStreamingState._valueForKey(key, VideoStreamingState._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue (value) { return VideoStreamingState._keyForValue(value, VideoStreamingState._MAP); } @@ -77,7 +82,6 @@ class VideoStreamingState extends Enum { VideoStreamingState._MAP = Object.freeze({ 'STREAMABLE': 'STREAMABLE', 'NOT_STREAMABLE': 'NOT_STREAMABLE', - }); export { VideoStreamingState }; \ No newline at end of file diff --git a/lib/js/src/rpc/enums/VrCapabilities.js b/lib/js/src/rpc/enums/VrCapabilities.js index 03aeed02..08ead2d6 100644 --- a/lib/js/src/rpc/enums/VrCapabilities.js +++ b/lib/js/src/rpc/enums/VrCapabilities.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -33,10 +34,14 @@ import { Enum } from '../../util/Enum.js'; /** + * Contains information about the VR capabilities. * @typedef {Enum} VrCapabilities * @property {Object} _MAP */ class VrCapabilities extends Enum { + /** + * @constructor + */ constructor () { super(); } @@ -49,19 +54,19 @@ class VrCapabilities extends Enum { } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey (key) { return VrCapabilities._valueForKey(key, VrCapabilities._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue (value) { return VrCapabilities._keyForValue(value, VrCapabilities._MAP); } diff --git a/lib/js/src/rpc/enums/WarningLightStatus.js b/lib/js/src/rpc/enums/WarningLightStatus.js new file mode 100644 index 00000000..8ca86d7d --- /dev/null +++ b/lib/js/src/rpc/enums/WarningLightStatus.js @@ -0,0 +1,103 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Enum } from '../../util/Enum.js'; + +/** + * Reflects the status of a cluster instrument warning light. + * @typedef {Enum} WarningLightStatus + * @property {Object} _MAP + */ +class WarningLightStatus extends Enum { + /** + * @constructor + */ + constructor () { + super(); + } + + /** + * @return {String} + */ + static get WLS_OFF () { + return WarningLightStatus._MAP.WLS_OFF; + } + + /** + * @return {String} + */ + static get WLS_ON () { + return WarningLightStatus._MAP.WLS_ON; + } + + /** + * @return {String} + */ + static get WLS_FLASH () { + return WarningLightStatus._MAP.WLS_FLASH; + } + + /** + * @return {String} + */ + static get WLS_NOT_USED () { + return WarningLightStatus._MAP.WLS_NOT_USED; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return WarningLightStatus._valueForKey(key, WarningLightStatus._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return WarningLightStatus._keyForValue(value, WarningLightStatus._MAP); + } +} + +WarningLightStatus._MAP = Object.freeze({ + 'WLS_OFF': 'OFF', + 'WLS_ON': 'ON', + 'WLS_FLASH': 'FLASH', + 'WLS_NOT_USED': 'NOT_USED', +}); + +export { WarningLightStatus }; \ No newline at end of file diff --git a/lib/js/src/rpc/enums/WayPointType.js b/lib/js/src/rpc/enums/WayPointType.js new file mode 100644 index 00000000..2027f8da --- /dev/null +++ b/lib/js/src/rpc/enums/WayPointType.js @@ -0,0 +1,87 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Enum } from '../../util/Enum.js'; + +/** + * Describes what kind of waypoint is requested/provided. + * @typedef {Enum} WayPointType + * @property {Object} _MAP + */ +class WayPointType extends Enum { + /** + * @constructor + */ + constructor () { + super(); + } + + /** + * @return {String} + */ + static get ALL () { + return WayPointType._MAP.ALL; + } + + /** + * @return {String} + */ + static get DESTINATION () { + return WayPointType._MAP.DESTINATION; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return WayPointType._valueForKey(key, WayPointType._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return WayPointType._keyForValue(value, WayPointType._MAP); + } +} + +WayPointType._MAP = Object.freeze({ + 'ALL': 'ALL', + 'DESTINATION': 'DESTINATION', +}); + +export { WayPointType }; \ No newline at end of file diff --git a/lib/js/src/rpc/enums/WindowType.js b/lib/js/src/rpc/enums/WindowType.js new file mode 100644 index 00000000..9e3bb930 --- /dev/null +++ b/lib/js/src/rpc/enums/WindowType.js @@ -0,0 +1,89 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Enum } from '../../util/Enum.js'; + +/** + * @typedef {Enum} WindowType + * @property {Object} _MAP + */ +class WindowType extends Enum { + /** + * @constructor + */ + constructor () { + super(); + } + + /** + * This window type describes the main window on a display. + * @return {String} + */ + static get MAIN () { + return WindowType._MAP.MAIN; + } + + /** + * A widget is a small window that the app can create to provide information and soft buttons for quick app + * control. + * @return {String} + */ + static get WIDGET () { + return WindowType._MAP.WIDGET; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return WindowType._valueForKey(key, WindowType._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return WindowType._keyForValue(value, WindowType._MAP); + } +} + +WindowType._MAP = Object.freeze({ + 'MAIN': 'MAIN', + 'WIDGET': 'WIDGET', +}); + +export { WindowType }; \ No newline at end of file diff --git a/lib/js/src/rpc/enums/WiperStatus.js b/lib/js/src/rpc/enums/WiperStatus.js new file mode 100644 index 00000000..6406ad50 --- /dev/null +++ b/lib/js/src/rpc/enums/WiperStatus.js @@ -0,0 +1,191 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Enum } from '../../util/Enum.js'; + +/** + * Reflects the status of the wipers. + * @typedef {Enum} WiperStatus + * @property {Object} _MAP + */ +class WiperStatus extends Enum { + /** + * @constructor + */ + constructor () { + super(); + } + + /** + * @return {String} + */ + static get OFF () { + return WiperStatus._MAP.OFF; + } + + /** + * @return {String} + */ + static get AUTO_OFF () { + return WiperStatus._MAP.AUTO_OFF; + } + + /** + * @return {String} + */ + static get OFF_MOVING () { + return WiperStatus._MAP.OFF_MOVING; + } + + /** + * @return {String} + */ + static get MAN_INT_OFF () { + return WiperStatus._MAP.MAN_INT_OFF; + } + + /** + * @return {String} + */ + static get MAN_INT_ON () { + return WiperStatus._MAP.MAN_INT_ON; + } + + /** + * @return {String} + */ + static get MAN_LOW () { + return WiperStatus._MAP.MAN_LOW; + } + + /** + * @return {String} + */ + static get MAN_HIGH () { + return WiperStatus._MAP.MAN_HIGH; + } + + /** + * @return {String} + */ + static get MAN_FLICK () { + return WiperStatus._MAP.MAN_FLICK; + } + + /** + * @return {String} + */ + static get WASH () { + return WiperStatus._MAP.WASH; + } + + /** + * @return {String} + */ + static get AUTO_LOW () { + return WiperStatus._MAP.AUTO_LOW; + } + + /** + * @return {String} + */ + static get AUTO_HIGH () { + return WiperStatus._MAP.AUTO_HIGH; + } + + /** + * @return {String} + */ + static get COURTESYWIPE () { + return WiperStatus._MAP.COURTESYWIPE; + } + + /** + * @return {String} + */ + static get AUTO_ADJUST () { + return WiperStatus._MAP.AUTO_ADJUST; + } + + /** + * @return {String} + */ + static get STALLED () { + return WiperStatus._MAP.STALLED; + } + + /** + * @return {String} + */ + static get NO_DATA_EXISTS () { + return WiperStatus._MAP.NO_DATA_EXISTS; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return WiperStatus._valueForKey(key, WiperStatus._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return WiperStatus._keyForValue(value, WiperStatus._MAP); + } +} + +WiperStatus._MAP = Object.freeze({ + 'OFF': 'OFF', + 'AUTO_OFF': 'AUTO_OFF', + 'OFF_MOVING': 'OFF_MOVING', + 'MAN_INT_OFF': 'MAN_INT_OFF', + 'MAN_INT_ON': 'MAN_INT_ON', + 'MAN_LOW': 'MAN_LOW', + 'MAN_HIGH': 'MAN_HIGH', + 'MAN_FLICK': 'MAN_FLICK', + 'WASH': 'WASH', + 'AUTO_LOW': 'AUTO_LOW', + 'AUTO_HIGH': 'AUTO_HIGH', + 'COURTESYWIPE': 'COURTESYWIPE', + 'AUTO_ADJUST': 'AUTO_ADJUST', + 'STALLED': 'STALLED', + 'NO_DATA_EXISTS': 'NO_DATA_EXISTS', +}); + +export { WiperStatus }; \ No newline at end of file diff --git a/lib/js/src/rpc/enums/messageType.js b/lib/js/src/rpc/enums/messageType.js new file mode 100644 index 00000000..0b71228d --- /dev/null +++ b/lib/js/src/rpc/enums/messageType.js @@ -0,0 +1,95 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Enum } from '../../util/Enum.js'; + +/** + * Enumeration linking message types with function types in WiPro protocol. Assumes enumeration starts at value 0. + * @typedef {Enum} messageType + * @property {Object} _MAP + */ +class messageType extends Enum { + /** + * @constructor + */ + constructor () { + super(); + } + + /** + * @return {Number} + */ + static get request () { + return messageType._MAP.request; + } + + /** + * @return {Number} + */ + static get response () { + return messageType._MAP.response; + } + + /** + * @return {Number} + */ + static get notification () { + return messageType._MAP.notification; + } + + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + static valueForKey (key) { + return messageType._valueForKey(key, messageType._MAP); + } + + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + static keyForValue (value) { + return messageType._keyForValue(value, messageType._MAP); + } +} + +messageType._MAP = Object.freeze({ + 'request': 0, + 'response': 1, + 'notification': 2, +}); + +export { messageType }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/AddCommand.js b/lib/js/src/rpc/messages/AddCommand.js index 1af5205a..c0a4330f 100644 --- a/lib/js/src/rpc/messages/AddCommand.js +++ b/lib/js/src/rpc/messages/AddCommand.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -31,92 +32,94 @@ */ import { RpcRequest } from '../RpcRequest.js'; -import { Image } from '../structs/Image.js'; -import { MenuParams } from '../structs/MenuParams.js'; import { FunctionID } from '../enums/FunctionID.js'; +import { MenuParams } from '../structs/MenuParams.js'; +import { Image } from '../structs/Image.js'; +/** + * Adds a command to the in application menu. Either menuParams or vrCommands must be provided. + */ class AddCommand extends RpcRequest { /** - * @constructor - */ + * @constructor + */ constructor (store) { super(store); this.setFunctionName(FunctionID.AddCommand); } - /** - * @param {Number} id - * @return {AddCommand} - */ + * @param {Number} id - unique ID of the command to add. + * @return {AddCommand} + */ setCmdID (id) { this.setParameter(AddCommand.KEY_CMD_ID, id); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getCmdID () { return this.getParameter(AddCommand.KEY_CMD_ID); } /** - * @param {MenuParams} menuParams - * @return {AddCommand} - */ - setMenuParams (menuParams) { - this.validateType(MenuParams, menuParams); - - this.setParameter(AddCommand.KEY_MENU_PARAMS, menuParams); + * @param {MenuParams} params - Optional sub value containing menu parameters + * @return {AddCommand} + */ + setMenuParams (params) { + this.validateType(MenuParams, params); + this.setParameter(AddCommand.KEY_MENU_PARAMS, params); return this; } /** - * @return {MenuParams} - */ + * @return {MenuParams} + */ getMenuParams () { return this.getObject(MenuParams, AddCommand.KEY_MENU_PARAMS); } /** - * @param {Array} vrCommands - * @return {AddCommand} - */ - setVrCommands (vrCommands) { - this.setParameter(AddCommand.KEY_VR_COMMANDS, vrCommands); + * @param {String[]} commands - An array of strings to be used as VR synonyms for this command. If this array is + * provided, it may not be empty. + * @return {AddCommand} + */ + setVrCommands (commands) { + this.setParameter(AddCommand.KEY_VR_COMMANDS, commands); return this; } /** - * @return {Array} - */ + * @return {String[]} + */ getVrCommands () { return this.getParameter(AddCommand.KEY_VR_COMMANDS); } /** - * @param {Image} icon - * @return {AddCommand} - */ + * @param {Image} icon - Image struct determining whether static or dynamic icon. If omitted on supported displays, + * no (or the default if applicable) icon shall be displayed. + * @return {AddCommand} + */ setCmdIcon (icon) { this.validateType(Image, icon); - this.setParameter(AddCommand.KEY_CMD_ICON, icon); return this; } /** - * @return {Image} - */ + * @return {Image} + */ getCmdIcon () { return this.getObject(Image, AddCommand.KEY_CMD_ICON); } } -AddCommand.KEY_CMD_ICON = 'cmdIcon'; -AddCommand.KEY_MENU_PARAMS = 'menuParams'; AddCommand.KEY_CMD_ID = 'cmdID'; +AddCommand.KEY_MENU_PARAMS = 'menuParams'; AddCommand.KEY_VR_COMMANDS = 'vrCommands'; +AddCommand.KEY_CMD_ICON = 'cmdIcon'; -export { AddCommand }; +export { AddCommand }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/AddCommandResponse.js b/lib/js/src/rpc/messages/AddCommandResponse.js index a4e655e9..a549e54b 100644 --- a/lib/js/src/rpc/messages/AddCommandResponse.js +++ b/lib/js/src/rpc/messages/AddCommandResponse.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -30,17 +31,18 @@ * POSSIBILITY OF SUCH DAMAGE. */ -import { RpcResponse } from '../RpcResponse.js'; import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; class AddCommandResponse extends RpcResponse { /** - * @constructor - */ + * @constructor + */ constructor (store) { super(store); this.setFunctionName(FunctionID.AddCommand); } } -export { AddCommandResponse }; + +export { AddCommandResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/AddSubMenu.js b/lib/js/src/rpc/messages/AddSubMenu.js new file mode 100644 index 00000000..1b85203f --- /dev/null +++ b/lib/js/src/rpc/messages/AddSubMenu.js @@ -0,0 +1,144 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { MenuLayout } from '../enums/MenuLayout.js'; +import { Image } from '../structs/Image.js'; + +/** + * Adds a sub menu to the in-application menu. + */ +class AddSubMenu extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.AddSubMenu); + } + + /** + * @param {Number} id - unique ID of the sub menu to add. + * @return {AddSubMenu} + */ + setMenuID (id) { + this.setParameter(AddSubMenu.KEY_MENU_ID, id); + return this; + } + + /** + * @return {Number} + */ + getMenuID () { + return this.getParameter(AddSubMenu.KEY_MENU_ID); + } + + /** + * @param {Number} position - Position within the items that are are at top level of the in application menu. 0 will + * insert at the front. 1 will insert at the second position. If position is greater or + * equal than the number of items on top level, the sub menu will be appended to the end. + * Position of any submenu will always be located before the return and exit options If + * this param was omitted the entry will be added at the end. + * @return {AddSubMenu} + */ + setPosition (position) { + this.setParameter(AddSubMenu.KEY_POSITION, position); + return this; + } + + /** + * @return {Number} + */ + getPosition () { + return this.getParameter(AddSubMenu.KEY_POSITION); + } + + /** + * @param {String} name - Text to show in the menu for this sub menu. + * @return {AddSubMenu} + */ + setMenuName (name) { + this.setParameter(AddSubMenu.KEY_MENU_NAME, name); + return this; + } + + /** + * @return {String} + */ + getMenuName () { + return this.getParameter(AddSubMenu.KEY_MENU_NAME); + } + + /** + * @param {Image} icon - The image field for AddSubMenu + * @return {AddSubMenu} + */ + setMenuIcon (icon) { + this.validateType(Image, icon); + this.setParameter(AddSubMenu.KEY_MENU_ICON, icon); + return this; + } + + /** + * @return {Image} + */ + getMenuIcon () { + return this.getObject(Image, AddSubMenu.KEY_MENU_ICON); + } + + /** + * @param {MenuLayout} layout - Sets the layout of the submenu screen. + * @return {AddSubMenu} + */ + setMenuLayout (layout) { + this.validateType(MenuLayout, layout); + this.setParameter(AddSubMenu.KEY_MENU_LAYOUT, layout); + return this; + } + + /** + * @return {MenuLayout} + */ + getMenuLayout () { + return this.getObject(MenuLayout, AddSubMenu.KEY_MENU_LAYOUT); + } +} + +AddSubMenu.KEY_MENU_ID = 'menuID'; +AddSubMenu.KEY_POSITION = 'position'; +AddSubMenu.KEY_MENU_NAME = 'menuName'; +AddSubMenu.KEY_MENU_ICON = 'menuIcon'; +AddSubMenu.KEY_MENU_LAYOUT = 'menuLayout'; + +export { AddSubMenu }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/AddSubMenuResponse.js b/lib/js/src/rpc/messages/AddSubMenuResponse.js new file mode 100644 index 00000000..d47863db --- /dev/null +++ b/lib/js/src/rpc/messages/AddSubMenuResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class AddSubMenuResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.AddSubMenu); + } +} + + +export { AddSubMenuResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/Alert.js b/lib/js/src/rpc/messages/Alert.js new file mode 100644 index 00000000..2e510643 --- /dev/null +++ b/lib/js/src/rpc/messages/Alert.js @@ -0,0 +1,235 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { TTSChunk } from '../structs/TTSChunk.js'; +import { SoftButton } from '../structs/SoftButton.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { Image } from '../structs/Image.js'; + +/** + * Shows an alert which typically consists of text-to-speech message and text on the display. At least either + * alertText1, alertText2 or TTSChunks need to be provided. + */ +class Alert extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.Alert); + } + + /** + * @param {String} text1 - The first line of the alert text field + * @return {Alert} + */ + setAlertText1 (text1) { + this.setParameter(Alert.KEY_ALERT_TEXT_1, text1); + return this; + } + + /** + * @return {String} + */ + getAlertText1 () { + return this.getParameter(Alert.KEY_ALERT_TEXT_1); + } + + /** + * @param {String} text2 - The second line of the alert text field + * @return {Alert} + */ + setAlertText2 (text2) { + this.setParameter(Alert.KEY_ALERT_TEXT_2, text2); + return this; + } + + /** + * @return {String} + */ + getAlertText2 () { + return this.getParameter(Alert.KEY_ALERT_TEXT_2); + } + + /** + * @param {String} text3 - The optional third line of the alert text field + * @return {Alert} + */ + setAlertText3 (text3) { + this.setParameter(Alert.KEY_ALERT_TEXT_3, text3); + return this; + } + + /** + * @return {String} + */ + getAlertText3 () { + return this.getParameter(Alert.KEY_ALERT_TEXT_3); + } + + /** + * @param {TTSChunk[]} chunks - An array of text chunks of type TTSChunk. See TTSChunk. The array must have at least + * one item. + * @return {Alert} + */ + setTtsChunks (chunks) { + this.validateType(TTSChunk, chunks, true); + this.setParameter(Alert.KEY_TTS_CHUNKS, chunks); + return this; + } + + /** + * @return {TTSChunk[]} + */ + getTtsChunks () { + return this.getObject(TTSChunk, Alert.KEY_TTS_CHUNKS); + } + + /** + * @param {Number} duration - Timeout in milliseconds. Typical timeouts are 3-5 seconds. If omitted, timeout is set + * to 5s. + * @return {Alert} + */ + setDuration (duration) { + this.setParameter(Alert.KEY_DURATION, duration); + return this; + } + + /** + * @return {Number} + */ + getDuration () { + return this.getParameter(Alert.KEY_DURATION); + } + + /** + * @param {Boolean} tone - Defines if tone should be played. Tone is played before TTS. If omitted, no tone is + * played. + * @return {Alert} + */ + setPlayTone (tone) { + this.setParameter(Alert.KEY_PLAY_TONE, tone); + return this; + } + + /** + * @return {Boolean} + */ + getPlayTone () { + return this.getParameter(Alert.KEY_PLAY_TONE); + } + + /** + * @param {Boolean} indicator - If supported on the given platform, the alert GUI will include some sort of + * animation indicating that loading of a feature is progressing. e.g. a spinning wheel + * or hourglass, etc. + * @return {Alert} + */ + setProgressIndicator (indicator) { + this.setParameter(Alert.KEY_PROGRESS_INDICATOR, indicator); + return this; + } + + /** + * @return {Boolean} + */ + getProgressIndicator () { + return this.getParameter(Alert.KEY_PROGRESS_INDICATOR); + } + + /** + * @param {SoftButton[]} buttons - App defined SoftButtons. If omitted on supported displays, the displayed alert + * shall not have any SoftButtons. + * @return {Alert} + */ + setSoftButtons (buttons) { + this.validateType(SoftButton, buttons, true); + this.setParameter(Alert.KEY_SOFT_BUTTONS, buttons); + return this; + } + + /** + * @return {SoftButton[]} + */ + getSoftButtons () { + return this.getObject(SoftButton, Alert.KEY_SOFT_BUTTONS); + } + + /** + * @param {Image} icon - Image struct determining whether static or dynamic icon. If omitted on supported displays, + * no (or the default if applicable) icon should be displayed. + * @return {Alert} + */ + setAlertIcon (icon) { + this.validateType(Image, icon); + this.setParameter(Alert.KEY_ALERT_ICON, icon); + return this; + } + + /** + * @return {Image} + */ + getAlertIcon () { + return this.getObject(Image, Alert.KEY_ALERT_ICON); + } + + /** + * @param {Number} id - An ID for this specific alert to allow cancellation through the `CancelInteraction` RPC. + * @return {Alert} + */ + setCancelID (id) { + this.setParameter(Alert.KEY_CANCEL_ID, id); + return this; + } + + /** + * @return {Number} + */ + getCancelID () { + return this.getParameter(Alert.KEY_CANCEL_ID); + } +} + +Alert.KEY_ALERT_TEXT_1 = 'alertText1'; +Alert.KEY_ALERT_TEXT_2 = 'alertText2'; +Alert.KEY_ALERT_TEXT_3 = 'alertText3'; +Alert.KEY_TTS_CHUNKS = 'ttsChunks'; +Alert.KEY_DURATION = 'duration'; +Alert.KEY_PLAY_TONE = 'playTone'; +Alert.KEY_PROGRESS_INDICATOR = 'progressIndicator'; +Alert.KEY_SOFT_BUTTONS = 'softButtons'; +Alert.KEY_ALERT_ICON = 'alertIcon'; +Alert.KEY_CANCEL_ID = 'cancelID'; + +export { Alert }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/AlertManeuver.js b/lib/js/src/rpc/messages/AlertManeuver.js new file mode 100644 index 00000000..7875fb80 --- /dev/null +++ b/lib/js/src/rpc/messages/AlertManeuver.js @@ -0,0 +1,87 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { TTSChunk } from '../structs/TTSChunk.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { SoftButton } from '../structs/SoftButton.js'; + +class AlertManeuver extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.AlertManeuver); + } + + /** + * @param {TTSChunk[]} chunks - An array of text chunks of type TTSChunk. See TTSChunk + * @return {AlertManeuver} + */ + setTtsChunks (chunks) { + this.validateType(TTSChunk, chunks, true); + this.setParameter(AlertManeuver.KEY_TTS_CHUNKS, chunks); + return this; + } + + /** + * @return {TTSChunk[]} + */ + getTtsChunks () { + return this.getObject(TTSChunk, AlertManeuver.KEY_TTS_CHUNKS); + } + + /** + * @param {SoftButton[]} buttons - If omitted on supported displays, only the system defined "Close" SoftButton + * shall be displayed. + * @return {AlertManeuver} + */ + setSoftButtons (buttons) { + this.validateType(SoftButton, buttons, true); + this.setParameter(AlertManeuver.KEY_SOFT_BUTTONS, buttons); + return this; + } + + /** + * @return {SoftButton[]} + */ + getSoftButtons () { + return this.getObject(SoftButton, AlertManeuver.KEY_SOFT_BUTTONS); + } +} + +AlertManeuver.KEY_TTS_CHUNKS = 'ttsChunks'; +AlertManeuver.KEY_SOFT_BUTTONS = 'softButtons'; + +export { AlertManeuver }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/AlertManeuverResponse.js b/lib/js/src/rpc/messages/AlertManeuverResponse.js new file mode 100644 index 00000000..b9555952 --- /dev/null +++ b/lib/js/src/rpc/messages/AlertManeuverResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class AlertManeuverResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.AlertManeuver); + } +} + + +export { AlertManeuverResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/AlertResponse.js b/lib/js/src/rpc/messages/AlertResponse.js new file mode 100644 index 00000000..3a432b55 --- /dev/null +++ b/lib/js/src/rpc/messages/AlertResponse.js @@ -0,0 +1,67 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class AlertResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.Alert); + } + + /** + * @param {Number} time - Amount of time (in seconds) that an app must wait before resending an alert. If provided, + * another system event or overlay currently has a higher priority than this alert. An app + * must not send an alert without waiting at least the amount of time dictated. + * @return {AlertResponse} + */ + setTryAgainTime (time) { + this.setParameter(AlertResponse.KEY_TRY_AGAIN_TIME, time); + return this; + } + + /** + * @return {Number} + */ + getTryAgainTime () { + return this.getParameter(AlertResponse.KEY_TRY_AGAIN_TIME); + } +} + +AlertResponse.KEY_TRY_AGAIN_TIME = 'tryAgainTime'; + +export { AlertResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ButtonPress.js b/lib/js/src/rpc/messages/ButtonPress.js new file mode 100644 index 00000000..60157cdb --- /dev/null +++ b/lib/js/src/rpc/messages/ButtonPress.js @@ -0,0 +1,122 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { ButtonName } from '../enums/ButtonName.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { ButtonPressMode } from '../enums/ButtonPressMode.js'; +import { ModuleType } from '../enums/ModuleType.js'; +import { RpcRequest } from '../RpcRequest.js'; + +class ButtonPress extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ButtonPress); + } + + /** + * @param {ModuleType} type - The module where the button should be pressed + * @return {ButtonPress} + */ + setModuleType (type) { + this.validateType(ModuleType, type); + this.setParameter(ButtonPress.KEY_MODULE_TYPE, type); + return this; + } + + /** + * @return {ModuleType} + */ + getModuleType () { + return this.getObject(ModuleType, ButtonPress.KEY_MODULE_TYPE); + } + + /** + * @param {String} id - Id of a module, published by System Capability. + * @return {ButtonPress} + */ + setModuleId (id) { + this.setParameter(ButtonPress.KEY_MODULE_ID, id); + return this; + } + + /** + * @return {String} + */ + getModuleId () { + return this.getParameter(ButtonPress.KEY_MODULE_ID); + } + + /** + * @param {ButtonName} name - The name of supported RC climate or radio button. + * @return {ButtonPress} + */ + setButtonName (name) { + this.validateType(ButtonName, name); + this.setParameter(ButtonPress.KEY_BUTTON_NAME, name); + return this; + } + + /** + * @return {ButtonName} + */ + getButtonName () { + return this.getObject(ButtonName, ButtonPress.KEY_BUTTON_NAME); + } + + /** + * @param {ButtonPressMode} mode - Indicates whether this is a LONG or SHORT button press event. + * @return {ButtonPress} + */ + setButtonPressMode (mode) { + this.validateType(ButtonPressMode, mode); + this.setParameter(ButtonPress.KEY_BUTTON_PRESS_MODE, mode); + return this; + } + + /** + * @return {ButtonPressMode} + */ + getButtonPressMode () { + return this.getObject(ButtonPressMode, ButtonPress.KEY_BUTTON_PRESS_MODE); + } +} + +ButtonPress.KEY_MODULE_TYPE = 'moduleType'; +ButtonPress.KEY_MODULE_ID = 'moduleId'; +ButtonPress.KEY_BUTTON_NAME = 'buttonName'; +ButtonPress.KEY_BUTTON_PRESS_MODE = 'buttonPressMode'; + +export { ButtonPress }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ButtonPressResponse.js b/lib/js/src/rpc/messages/ButtonPressResponse.js new file mode 100644 index 00000000..8bec65fe --- /dev/null +++ b/lib/js/src/rpc/messages/ButtonPressResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class ButtonPressResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ButtonPress); + } +} + + +export { ButtonPressResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/CancelInteraction.js b/lib/js/src/rpc/messages/CancelInteraction.js new file mode 100644 index 00000000..8eb9a7f3 --- /dev/null +++ b/lib/js/src/rpc/messages/CancelInteraction.js @@ -0,0 +1,88 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Close an active interaction on the HMI. + */ +class CancelInteraction extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.CancelInteraction); + } + + /** + * @param {Number} id - The ID of the specific interaction you want to dismiss. If not set, the most recent of the + * RPC type set in functionID will be dismissed. + * @return {CancelInteraction} + */ + setCancelID (id) { + this.setParameter(CancelInteraction.KEY_CANCEL_ID, id); + return this; + } + + /** + * @return {Number} + */ + getCancelID () { + return this.getParameter(CancelInteraction.KEY_CANCEL_ID); + } + + /** + * @param {Number} id - The ID of the type of interaction the developer wants to dismiss. Only values 10, + * (PerformInteractionID), 12 (AlertID), 25 (ScrollableMessageID), and 26 (SliderID) are + * permitted. + * @return {CancelInteraction} + */ + setFunctionID (id) { + this.setParameter(CancelInteraction.KEY_FUNCTION_ID, id); + return this; + } + + /** + * @return {Number} + */ + getFunctionID () { + return this.getParameter(CancelInteraction.KEY_FUNCTION_ID); + } +} + +CancelInteraction.KEY_CANCEL_ID = 'cancelID'; +CancelInteraction.KEY_FUNCTION_ID = 'functionID'; + +export { CancelInteraction }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/CancelInteractionResponse.js b/lib/js/src/rpc/messages/CancelInteractionResponse.js new file mode 100644 index 00000000..d78bfb46 --- /dev/null +++ b/lib/js/src/rpc/messages/CancelInteractionResponse.js @@ -0,0 +1,51 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +/** + * If no applicable request can be dismissed, the result will be IGNORED. + */ +class CancelInteractionResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.CancelInteraction); + } +} + + +export { CancelInteractionResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ChangeRegistration.js b/lib/js/src/rpc/messages/ChangeRegistration.js new file mode 100644 index 00000000..bb688ce9 --- /dev/null +++ b/lib/js/src/rpc/messages/ChangeRegistration.js @@ -0,0 +1,155 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { TTSChunk } from '../structs/TTSChunk.js'; +import { Language } from '../enums/Language.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +class ChangeRegistration extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ChangeRegistration); + } + + /** + * @param {Language} language - Requested voice engine (VR+TTS) language registration + * @return {ChangeRegistration} + */ + setLanguage (language) { + this.validateType(Language, language); + this.setParameter(ChangeRegistration.KEY_LANGUAGE, language); + return this; + } + + /** + * @return {Language} + */ + getLanguage () { + return this.getObject(Language, ChangeRegistration.KEY_LANGUAGE); + } + + /** + * @param {Language} language - Request display language registration + * @return {ChangeRegistration} + */ + setHmiDisplayLanguage (language) { + this.validateType(Language, language); + this.setParameter(ChangeRegistration.KEY_HMI_DISPLAY_LANGUAGE, language); + return this; + } + + /** + * @return {Language} + */ + getHmiDisplayLanguage () { + return this.getObject(Language, ChangeRegistration.KEY_HMI_DISPLAY_LANGUAGE); + } + + /** + * @param {String} name - Request new app name registration + * @return {ChangeRegistration} + */ + setAppName (name) { + this.setParameter(ChangeRegistration.KEY_APP_NAME, name); + return this; + } + + /** + * @return {String} + */ + getAppName () { + return this.getParameter(ChangeRegistration.KEY_APP_NAME); + } + + /** + * @param {TTSChunk[]} name - Request new ttsName registration + * @return {ChangeRegistration} + */ + setTtsName (name) { + this.validateType(TTSChunk, name, true); + this.setParameter(ChangeRegistration.KEY_TTS_NAME, name); + return this; + } + + /** + * @return {TTSChunk[]} + */ + getTtsName () { + return this.getObject(TTSChunk, ChangeRegistration.KEY_TTS_NAME); + } + + /** + * @param {String} name - Request new app short name registration + * @return {ChangeRegistration} + */ + setNgnMediaScreenAppName (name) { + this.setParameter(ChangeRegistration.KEY_NGN_MEDIA_SCREEN_APP_NAME, name); + return this; + } + + /** + * @return {String} + */ + getNgnMediaScreenAppName () { + return this.getParameter(ChangeRegistration.KEY_NGN_MEDIA_SCREEN_APP_NAME); + } + + /** + * @param {String[]} synonyms - Request new VR synonyms registration + * @return {ChangeRegistration} + */ + setVrSynonyms (synonyms) { + this.setParameter(ChangeRegistration.KEY_VR_SYNONYMS, synonyms); + return this; + } + + /** + * @return {String[]} + */ + getVrSynonyms () { + return this.getParameter(ChangeRegistration.KEY_VR_SYNONYMS); + } +} + +ChangeRegistration.KEY_LANGUAGE = 'language'; +ChangeRegistration.KEY_HMI_DISPLAY_LANGUAGE = 'hmiDisplayLanguage'; +ChangeRegistration.KEY_APP_NAME = 'appName'; +ChangeRegistration.KEY_TTS_NAME = 'ttsName'; +ChangeRegistration.KEY_NGN_MEDIA_SCREEN_APP_NAME = 'ngnMediaScreenAppName'; +ChangeRegistration.KEY_VR_SYNONYMS = 'vrSynonyms'; + +export { ChangeRegistration }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ChangeRegistrationResponse.js b/lib/js/src/rpc/messages/ChangeRegistrationResponse.js new file mode 100644 index 00000000..3f119b3e --- /dev/null +++ b/lib/js/src/rpc/messages/ChangeRegistrationResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class ChangeRegistrationResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ChangeRegistration); + } +} + + +export { ChangeRegistrationResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/CloseApplication.js b/lib/js/src/rpc/messages/CloseApplication.js new file mode 100644 index 00000000..8f850979 --- /dev/null +++ b/lib/js/src/rpc/messages/CloseApplication.js @@ -0,0 +1,51 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Request from the application to exit the foreground and enter HMI_NONE. + */ +class CloseApplication extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.CloseApplication); + } +} + + +export { CloseApplication }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/CloseApplicationResponse.js b/lib/js/src/rpc/messages/CloseApplicationResponse.js new file mode 100644 index 00000000..7fbff7c0 --- /dev/null +++ b/lib/js/src/rpc/messages/CloseApplicationResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class CloseApplicationResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.CloseApplication); + } +} + + +export { CloseApplicationResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/CreateInteractionChoiceSet.js b/lib/js/src/rpc/messages/CreateInteractionChoiceSet.js new file mode 100644 index 00000000..e278b6c6 --- /dev/null +++ b/lib/js/src/rpc/messages/CreateInteractionChoiceSet.js @@ -0,0 +1,88 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { Choice } from '../structs/Choice.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * creates interaction choice set to be used later by performInteraction + */ +class CreateInteractionChoiceSet extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.CreateInteractionChoiceSet); + } + + /** + * @param {Number} id - Unique ID used for this interaction choice set. + * @return {CreateInteractionChoiceSet} + */ + setInteractionChoiceSetID (id) { + this.setParameter(CreateInteractionChoiceSet.KEY_INTERACTION_CHOICE_SET_ID, id); + return this; + } + + /** + * @return {Number} + */ + getInteractionChoiceSetID () { + return this.getParameter(CreateInteractionChoiceSet.KEY_INTERACTION_CHOICE_SET_ID); + } + + /** + * @param {Choice[]} set - A choice is an option given to the user, which can be selected either by menu, or through + * voice recognition system. + * @return {CreateInteractionChoiceSet} + */ + setChoiceSet (set) { + this.validateType(Choice, set, true); + this.setParameter(CreateInteractionChoiceSet.KEY_CHOICE_SET, set); + return this; + } + + /** + * @return {Choice[]} + */ + getChoiceSet () { + return this.getObject(Choice, CreateInteractionChoiceSet.KEY_CHOICE_SET); + } +} + +CreateInteractionChoiceSet.KEY_INTERACTION_CHOICE_SET_ID = 'interactionChoiceSetID'; +CreateInteractionChoiceSet.KEY_CHOICE_SET = 'choiceSet'; + +export { CreateInteractionChoiceSet }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/CreateInteractionChoiceSetResponse.js b/lib/js/src/rpc/messages/CreateInteractionChoiceSetResponse.js new file mode 100644 index 00000000..beb01f6a --- /dev/null +++ b/lib/js/src/rpc/messages/CreateInteractionChoiceSetResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class CreateInteractionChoiceSetResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.CreateInteractionChoiceSet); + } +} + + +export { CreateInteractionChoiceSetResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/CreateWindow.js b/lib/js/src/rpc/messages/CreateWindow.js new file mode 100644 index 00000000..92c1c82d --- /dev/null +++ b/lib/js/src/rpc/messages/CreateWindow.js @@ -0,0 +1,155 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { WindowType } from '../enums/WindowType.js'; +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Create a new window on the display with the specified window type. + */ +class CreateWindow extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.CreateWindow); + } + + /** + * @param {Number} id - A unique ID to identify the window. The value of '0' will always be the default main window + * on the main display and should not be used in this context as it will already be created for + * the app. See PredefinedWindows enum. Creating a window with an ID that is already in use + * will be rejected with `INVALID_ID`. + * @return {CreateWindow} + */ + setWindowID (id) { + this.setParameter(CreateWindow.KEY_WINDOW_ID, id); + return this; + } + + /** + * @return {Number} + */ + getWindowID () { + return this.getParameter(CreateWindow.KEY_WINDOW_ID); + } + + /** + * @param {String} name - The window name to be used by the HMI. The name of the pre-created default window will + * match the app name. Multiple apps can share the same window name except for the default + * main window. Creating a window with a name which is already in use by the app will result + * in `DUPLICATE_NAME`. + * @return {CreateWindow} + */ + setWindowName (name) { + this.setParameter(CreateWindow.KEY_WINDOW_NAME, name); + return this; + } + + /** + * @return {String} + */ + getWindowName () { + return this.getParameter(CreateWindow.KEY_WINDOW_NAME); + } + + /** + * @param {WindowType} type - The type of the window to be created. Main window or widget. + * @return {CreateWindow} + */ + setType (type) { + this.validateType(WindowType, type); + this.setParameter(CreateWindow.KEY_TYPE, type); + return this; + } + + /** + * @return {WindowType} + */ + getType () { + return this.getObject(WindowType, CreateWindow.KEY_TYPE); + } + + /** + * @param {String} type - Allows an app to create a widget related to a specific service type. As an example if a + * `MEDIA` app becomes active, this app becomes audible and is allowed to play audio. Actions + * such as skip or play/pause will be directed to this active media app. In case of widgets, + * the system can provide a single "media" widget which will act as a placeholder for the + * active media app. It is only allowed to have one window per service type. This means that + * a media app can only have a single MEDIA widget. Still the app can create widgets omitting + * this parameter. Those widgets would be available as app specific widgets that are + * permanently included in the HMI. This parameter is related to widgets only. The default + * main window, which is pre-created during app registration, will be created based on the + * HMI types specified in the app registration request. + * @return {CreateWindow} + */ + setAssociatedServiceType (type) { + this.setParameter(CreateWindow.KEY_ASSOCIATED_SERVICE_TYPE, type); + return this; + } + + /** + * @return {String} + */ + getAssociatedServiceType () { + return this.getParameter(CreateWindow.KEY_ASSOCIATED_SERVICE_TYPE); + } + + /** + * @param {Number} id - Optional parameter. Specify whether the content sent to an existing window should be + * duplicated to the created window. If there isn't a window with the ID, the request will be + * rejected with `INVALID_DATA`. + * @return {CreateWindow} + */ + setDuplicateUpdatesFromWindowID (id) { + this.setParameter(CreateWindow.KEY_DUPLICATE_UPDATES_FROM_WINDOW_ID, id); + return this; + } + + /** + * @return {Number} + */ + getDuplicateUpdatesFromWindowID () { + return this.getParameter(CreateWindow.KEY_DUPLICATE_UPDATES_FROM_WINDOW_ID); + } +} + +CreateWindow.KEY_WINDOW_ID = 'windowID'; +CreateWindow.KEY_WINDOW_NAME = 'windowName'; +CreateWindow.KEY_TYPE = 'type'; +CreateWindow.KEY_ASSOCIATED_SERVICE_TYPE = 'associatedServiceType'; +CreateWindow.KEY_DUPLICATE_UPDATES_FROM_WINDOW_ID = 'duplicateUpdatesFromWindowID'; + +export { CreateWindow }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/CreateWindowResponse.js b/lib/js/src/rpc/messages/CreateWindowResponse.js new file mode 100644 index 00000000..b7fbb63a --- /dev/null +++ b/lib/js/src/rpc/messages/CreateWindowResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class CreateWindowResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.CreateWindow); + } +} + + +export { CreateWindowResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/DeleteCommand.js b/lib/js/src/rpc/messages/DeleteCommand.js new file mode 100644 index 00000000..7c894bc6 --- /dev/null +++ b/lib/js/src/rpc/messages/DeleteCommand.js @@ -0,0 +1,68 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Deletes all commands from the in-application menu with the specified command id. + */ +class DeleteCommand extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.DeleteCommand); + } + + /** + * @param {Number} id - ID of the command(s) to delete. + * @return {DeleteCommand} + */ + setCmdID (id) { + this.setParameter(DeleteCommand.KEY_CMD_ID, id); + return this; + } + + /** + * @return {Number} + */ + getCmdID () { + return this.getParameter(DeleteCommand.KEY_CMD_ID); + } +} + +DeleteCommand.KEY_CMD_ID = 'cmdID'; + +export { DeleteCommand }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/DeleteCommandResponse.js b/lib/js/src/rpc/messages/DeleteCommandResponse.js new file mode 100644 index 00000000..56acc065 --- /dev/null +++ b/lib/js/src/rpc/messages/DeleteCommandResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class DeleteCommandResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.DeleteCommand); + } +} + + +export { DeleteCommandResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/DeleteFile.js b/lib/js/src/rpc/messages/DeleteFile.js new file mode 100644 index 00000000..3d489d17 --- /dev/null +++ b/lib/js/src/rpc/messages/DeleteFile.js @@ -0,0 +1,69 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Used to delete a file resident on the module in the app's local cache. Not supported on first generation SDL enabled + * vehicles. + */ +class DeleteFile extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.DeleteFile); + } + + /** + * @param {String} name - File reference name. + * @return {DeleteFile} + */ + setSdlFileName (name) { + this.setParameter(DeleteFile.KEY_SDL_FILE_NAME, name); + return this; + } + + /** + * @return {String} + */ + getSdlFileName () { + return this.getParameter(DeleteFile.KEY_SDL_FILE_NAME); + } +} + +DeleteFile.KEY_SDL_FILE_NAME = 'syncFileName'; + +export { DeleteFile }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/DeleteFileResponse.js b/lib/js/src/rpc/messages/DeleteFileResponse.js new file mode 100644 index 00000000..34457726 --- /dev/null +++ b/lib/js/src/rpc/messages/DeleteFileResponse.js @@ -0,0 +1,69 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +/** + * Response is sent, when the file data was deleted (success case). Or when an error occurred. Not supported on First + * generation SDL enabled vehicles. + */ +class DeleteFileResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.DeleteFile); + } + + /** + * @param {Number} available - Provides the total local space available on the module for the registered app. + * @return {DeleteFileResponse} + */ + setSpaceAvailable (available) { + this.setParameter(DeleteFileResponse.KEY_SPACE_AVAILABLE, available); + return this; + } + + /** + * @return {Number} + */ + getSpaceAvailable () { + return this.getParameter(DeleteFileResponse.KEY_SPACE_AVAILABLE); + } +} + +DeleteFileResponse.KEY_SPACE_AVAILABLE = 'spaceAvailable'; + +export { DeleteFileResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/DeleteInteractionChoiceSet.js b/lib/js/src/rpc/messages/DeleteInteractionChoiceSet.js new file mode 100644 index 00000000..85f0a47f --- /dev/null +++ b/lib/js/src/rpc/messages/DeleteInteractionChoiceSet.js @@ -0,0 +1,69 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Deletes interaction choice set that has been created with "CreateInteractionChoiceSet". The interaction may only be + * deleted when not currently in use by a "performInteraction". + */ +class DeleteInteractionChoiceSet extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.DeleteInteractionChoiceSet); + } + + /** + * @param {Number} id - ID of the interaction choice set to delete. + * @return {DeleteInteractionChoiceSet} + */ + setInteractionChoiceSetID (id) { + this.setParameter(DeleteInteractionChoiceSet.KEY_INTERACTION_CHOICE_SET_ID, id); + return this; + } + + /** + * @return {Number} + */ + getInteractionChoiceSetID () { + return this.getParameter(DeleteInteractionChoiceSet.KEY_INTERACTION_CHOICE_SET_ID); + } +} + +DeleteInteractionChoiceSet.KEY_INTERACTION_CHOICE_SET_ID = 'interactionChoiceSetID'; + +export { DeleteInteractionChoiceSet }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/DeleteInteractionChoiceSetResponse.js b/lib/js/src/rpc/messages/DeleteInteractionChoiceSetResponse.js new file mode 100644 index 00000000..2f46dce0 --- /dev/null +++ b/lib/js/src/rpc/messages/DeleteInteractionChoiceSetResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class DeleteInteractionChoiceSetResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.DeleteInteractionChoiceSet); + } +} + + +export { DeleteInteractionChoiceSetResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/DeleteSubMenu.js b/lib/js/src/rpc/messages/DeleteSubMenu.js new file mode 100644 index 00000000..26132c1f --- /dev/null +++ b/lib/js/src/rpc/messages/DeleteSubMenu.js @@ -0,0 +1,68 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Deletes a submenu from the in-application menu. + */ +class DeleteSubMenu extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.DeleteSubMenu); + } + + /** + * @param {Number} id - The "menuID" of the submenu to delete. (See addSubMenu.menuID) + * @return {DeleteSubMenu} + */ + setMenuID (id) { + this.setParameter(DeleteSubMenu.KEY_MENU_ID, id); + return this; + } + + /** + * @return {Number} + */ + getMenuID () { + return this.getParameter(DeleteSubMenu.KEY_MENU_ID); + } +} + +DeleteSubMenu.KEY_MENU_ID = 'menuID'; + +export { DeleteSubMenu }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/DeleteSubMenuResponse.js b/lib/js/src/rpc/messages/DeleteSubMenuResponse.js new file mode 100644 index 00000000..44624c53 --- /dev/null +++ b/lib/js/src/rpc/messages/DeleteSubMenuResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class DeleteSubMenuResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.DeleteSubMenu); + } +} + + +export { DeleteSubMenuResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/DeleteWindow.js b/lib/js/src/rpc/messages/DeleteWindow.js new file mode 100644 index 00000000..c4c99d1f --- /dev/null +++ b/lib/js/src/rpc/messages/DeleteWindow.js @@ -0,0 +1,69 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Deletes previously created window of the SDL application. + */ +class DeleteWindow extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.DeleteWindow); + } + + /** + * @param {Number} id - A unique ID to identify the window. The value of '0' will always be the default main window + * on the main display and cannot be deleted. See PredefinedWindows enum. + * @return {DeleteWindow} + */ + setWindowID (id) { + this.setParameter(DeleteWindow.KEY_WINDOW_ID, id); + return this; + } + + /** + * @return {Number} + */ + getWindowID () { + return this.getParameter(DeleteWindow.KEY_WINDOW_ID); + } +} + +DeleteWindow.KEY_WINDOW_ID = 'windowID'; + +export { DeleteWindow }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/DeleteWindowResponse.js b/lib/js/src/rpc/messages/DeleteWindowResponse.js new file mode 100644 index 00000000..f4f9c409 --- /dev/null +++ b/lib/js/src/rpc/messages/DeleteWindowResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class DeleteWindowResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.DeleteWindow); + } +} + + +export { DeleteWindowResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/DiagnosticMessage.js b/lib/js/src/rpc/messages/DiagnosticMessage.js new file mode 100644 index 00000000..ddddeb28 --- /dev/null +++ b/lib/js/src/rpc/messages/DiagnosticMessage.js @@ -0,0 +1,102 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Non periodic vehicle diagnostic request + */ +class DiagnosticMessage extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.DiagnosticMessage); + } + + /** + * @param {Number} id - Name of target ECU. + * @return {DiagnosticMessage} + */ + setTargetID (id) { + this.setParameter(DiagnosticMessage.KEY_TARGET_ID, id); + return this; + } + + /** + * @return {Number} + */ + getTargetID () { + return this.getParameter(DiagnosticMessage.KEY_TARGET_ID); + } + + /** + * @param {Number} length - Length of message (in bytes). + * @return {DiagnosticMessage} + */ + setMessageLength (length) { + this.setParameter(DiagnosticMessage.KEY_MESSAGE_LENGTH, length); + return this; + } + + /** + * @return {Number} + */ + getMessageLength () { + return this.getParameter(DiagnosticMessage.KEY_MESSAGE_LENGTH); + } + + /** + * @param {Number[]} data - Array of bytes comprising CAN message. + * @return {DiagnosticMessage} + */ + setMessageData (data) { + this.setParameter(DiagnosticMessage.KEY_MESSAGE_DATA, data); + return this; + } + + /** + * @return {Number[]} + */ + getMessageData () { + return this.getParameter(DiagnosticMessage.KEY_MESSAGE_DATA); + } +} + +DiagnosticMessage.KEY_TARGET_ID = 'targetID'; +DiagnosticMessage.KEY_MESSAGE_LENGTH = 'messageLength'; +DiagnosticMessage.KEY_MESSAGE_DATA = 'messageData'; + +export { DiagnosticMessage }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/DiagnosticMessageResponse.js b/lib/js/src/rpc/messages/DiagnosticMessageResponse.js new file mode 100644 index 00000000..32d28058 --- /dev/null +++ b/lib/js/src/rpc/messages/DiagnosticMessageResponse.js @@ -0,0 +1,65 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class DiagnosticMessageResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.DiagnosticMessage); + } + + /** + * @param {Number[]} result - Array of bytes comprising CAN message result. + * @return {DiagnosticMessageResponse} + */ + setMessageDataResult (result) { + this.setParameter(DiagnosticMessageResponse.KEY_MESSAGE_DATA_RESULT, result); + return this; + } + + /** + * @return {Number[]} + */ + getMessageDataResult () { + return this.getParameter(DiagnosticMessageResponse.KEY_MESSAGE_DATA_RESULT); + } +} + +DiagnosticMessageResponse.KEY_MESSAGE_DATA_RESULT = 'messageDataResult'; + +export { DiagnosticMessageResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/DialNumber.js b/lib/js/src/rpc/messages/DialNumber.js new file mode 100644 index 00000000..d4ad65fb --- /dev/null +++ b/lib/js/src/rpc/messages/DialNumber.js @@ -0,0 +1,69 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Dials a phone number and switches to phone application. + */ +class DialNumber extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.DialNumber); + } + + /** + * @param {String} number - Phone number is a string, which can be up to 40 chars. All characters shall be stripped + * from string except digits 0-9 and * # , ; + + * @return {DialNumber} + */ + setNumber (number) { + this.setParameter(DialNumber.KEY_NUMBER, number); + return this; + } + + /** + * @return {String} + */ + getNumber () { + return this.getParameter(DialNumber.KEY_NUMBER); + } +} + +DialNumber.KEY_NUMBER = 'number'; + +export { DialNumber }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/DialNumberResponse.js b/lib/js/src/rpc/messages/DialNumberResponse.js new file mode 100644 index 00000000..9b4eee9d --- /dev/null +++ b/lib/js/src/rpc/messages/DialNumberResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class DialNumberResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.DialNumber); + } +} + + +export { DialNumberResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/EncodedSyncPData.js b/lib/js/src/rpc/messages/EncodedSyncPData.js new file mode 100644 index 00000000..1a920ddd --- /dev/null +++ b/lib/js/src/rpc/messages/EncodedSyncPData.js @@ -0,0 +1,69 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Allows encoded data in the form of SyncP packets to be sent to the SYNC module. Legacy / v1 Protocol implementation; + * use SyncPData instead. *** DEPRECATED *** + */ +class EncodedSyncPData extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.EncodedSyncPData); + } + + /** + * @param {String[]} data - Contains base64 encoded string of SyncP packets. + * @return {EncodedSyncPData} + */ + setData (data) { + this.setParameter(EncodedSyncPData.KEY_DATA, data); + return this; + } + + /** + * @return {String[]} + */ + getData () { + return this.getParameter(EncodedSyncPData.KEY_DATA); + } +} + +EncodedSyncPData.KEY_DATA = 'data'; + +export { EncodedSyncPData }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/EncodedSyncPDataResponse.js b/lib/js/src/rpc/messages/EncodedSyncPDataResponse.js new file mode 100644 index 00000000..083f983a --- /dev/null +++ b/lib/js/src/rpc/messages/EncodedSyncPDataResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class EncodedSyncPDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.EncodedSyncPData); + } +} + + +export { EncodedSyncPDataResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/EndAudioPassThru.js b/lib/js/src/rpc/messages/EndAudioPassThru.js new file mode 100644 index 00000000..356b6644 --- /dev/null +++ b/lib/js/src/rpc/messages/EndAudioPassThru.js @@ -0,0 +1,51 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * When this request is invoked, the audio capture stops. + */ +class EndAudioPassThru extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.EndAudioPassThru); + } +} + + +export { EndAudioPassThru }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/EndAudioPassThruResponse.js b/lib/js/src/rpc/messages/EndAudioPassThruResponse.js new file mode 100644 index 00000000..1e072a1c --- /dev/null +++ b/lib/js/src/rpc/messages/EndAudioPassThruResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class EndAudioPassThruResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.EndAudioPassThru); + } +} + + +export { EndAudioPassThruResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GenericResponseResponse.js b/lib/js/src/rpc/messages/GenericResponseResponse.js new file mode 100644 index 00000000..51773a63 --- /dev/null +++ b/lib/js/src/rpc/messages/GenericResponseResponse.js @@ -0,0 +1,52 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +/** + * Generic Response is sent, when the name of a received msg cannot be retrieved. Only used in case of an error. + * Currently, only resultCode INVALID_DATA is used. + */ +class GenericResponseResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GenericResponse); + } +} + + +export { GenericResponseResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetAppServiceData.js b/lib/js/src/rpc/messages/GetAppServiceData.js new file mode 100644 index 00000000..e61a3a73 --- /dev/null +++ b/lib/js/src/rpc/messages/GetAppServiceData.js @@ -0,0 +1,90 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * This request asks the module for current data related to the specific service. It also includes an option to + * subscribe to that service for future updates + */ +class GetAppServiceData extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetAppServiceData); + } + + /** + * @param {String} type - The type of service that is to be offered by this app. See AppServiceType for known enum + * equivalent types. Parameter is a string to allow for new service types to be used by apps + * on older versions of SDL Core. + * @return {GetAppServiceData} + */ + setServiceType (type) { + this.setParameter(GetAppServiceData.KEY_SERVICE_TYPE, type); + return this; + } + + /** + * @return {String} + */ + getServiceType () { + return this.getParameter(GetAppServiceData.KEY_SERVICE_TYPE); + } + + /** + * @param {Boolean} subscribe - If true, the consumer is requesting to subscribe to all future updates from the + * service publisher. If false, the consumer doesn't wish to subscribe and should be + * unsubscribed if it was previously subscribed. + * @return {GetAppServiceData} + */ + setSubscribe (subscribe) { + this.setParameter(GetAppServiceData.KEY_SUBSCRIBE, subscribe); + return this; + } + + /** + * @return {Boolean} + */ + getSubscribe () { + return this.getParameter(GetAppServiceData.KEY_SUBSCRIBE); + } +} + +GetAppServiceData.KEY_SERVICE_TYPE = 'serviceType'; +GetAppServiceData.KEY_SUBSCRIBE = 'subscribe'; + +export { GetAppServiceData }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetAppServiceDataResponse.js b/lib/js/src/rpc/messages/GetAppServiceDataResponse.js new file mode 100644 index 00000000..385f3a0f --- /dev/null +++ b/lib/js/src/rpc/messages/GetAppServiceDataResponse.js @@ -0,0 +1,72 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { AppServiceData } from '../structs/AppServiceData.js'; +import { RpcResponse } from '../RpcResponse.js'; + +/** + * This response includes the data that was requested from the specific service + */ +class GetAppServiceDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetAppServiceData); + } + + /** + * @param {AppServiceData} data - Contains all the current data of the app service. The serviceType will link to + * which of the service data objects are included in this object (e.g. if the service + * type is MEDIA, the mediaServiceData param should be included). + * @return {GetAppServiceDataResponse} + */ + setServiceData (data) { + this.validateType(AppServiceData, data); + this.setParameter(GetAppServiceDataResponse.KEY_SERVICE_DATA, data); + return this; + } + + /** + * @return {AppServiceData} + */ + getServiceData () { + return this.getObject(AppServiceData, GetAppServiceDataResponse.KEY_SERVICE_DATA); + } +} + +GetAppServiceDataResponse.KEY_SERVICE_DATA = 'serviceData'; + +export { GetAppServiceDataResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetCloudAppProperties.js b/lib/js/src/rpc/messages/GetCloudAppProperties.js new file mode 100644 index 00000000..02f7f94c --- /dev/null +++ b/lib/js/src/rpc/messages/GetCloudAppProperties.js @@ -0,0 +1,68 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * RPC used to get the current properties of a cloud application + */ +class GetCloudAppProperties extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetCloudAppProperties); + } + + /** + * @param {String} id + * @return {GetCloudAppProperties} + */ + setAppID (id) { + this.setParameter(GetCloudAppProperties.KEY_APP_ID, id); + return this; + } + + /** + * @return {String} + */ + getAppID () { + return this.getParameter(GetCloudAppProperties.KEY_APP_ID); + } +} + +GetCloudAppProperties.KEY_APP_ID = 'appID'; + +export { GetCloudAppProperties }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetCloudAppPropertiesResponse.js b/lib/js/src/rpc/messages/GetCloudAppPropertiesResponse.js new file mode 100644 index 00000000..65c371a0 --- /dev/null +++ b/lib/js/src/rpc/messages/GetCloudAppPropertiesResponse.js @@ -0,0 +1,70 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { CloudAppProperties } from '../structs/CloudAppProperties.js'; +import { RpcResponse } from '../RpcResponse.js'; + +/** + * The response to GetCloudAppProperties + */ +class GetCloudAppPropertiesResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetCloudAppProperties); + } + + /** + * @param {CloudAppProperties} properties - The requested cloud application properties + * @return {GetCloudAppPropertiesResponse} + */ + setProperties (properties) { + this.validateType(CloudAppProperties, properties); + this.setParameter(GetCloudAppPropertiesResponse.KEY_PROPERTIES, properties); + return this; + } + + /** + * @return {CloudAppProperties} + */ + getProperties () { + return this.getObject(CloudAppProperties, GetCloudAppPropertiesResponse.KEY_PROPERTIES); + } +} + +GetCloudAppPropertiesResponse.KEY_PROPERTIES = 'properties'; + +export { GetCloudAppPropertiesResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetDTCs.js b/lib/js/src/rpc/messages/GetDTCs.js new file mode 100644 index 00000000..427cb46c --- /dev/null +++ b/lib/js/src/rpc/messages/GetDTCs.js @@ -0,0 +1,85 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Vehicle module diagnostic trouble code request. + */ +class GetDTCs extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetDTCs); + } + + /** + * @param {Number} name - Name of ECU. + * @return {GetDTCs} + */ + setEcuName (name) { + this.setParameter(GetDTCs.KEY_ECU_NAME, name); + return this; + } + + /** + * @return {Number} + */ + getEcuName () { + return this.getParameter(GetDTCs.KEY_ECU_NAME); + } + + /** + * @param {Number} mask - DTC Mask Byte to be sent in diagnostic request to module . + * @return {GetDTCs} + */ + setDtcMask (mask) { + this.setParameter(GetDTCs.KEY_DTC_MASK, mask); + return this; + } + + /** + * @return {Number} + */ + getDtcMask () { + return this.getParameter(GetDTCs.KEY_DTC_MASK); + } +} + +GetDTCs.KEY_ECU_NAME = 'ecuName'; +GetDTCs.KEY_DTC_MASK = 'dtcMask'; + +export { GetDTCs }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetDTCsResponse.js b/lib/js/src/rpc/messages/GetDTCsResponse.js new file mode 100644 index 00000000..855c4588 --- /dev/null +++ b/lib/js/src/rpc/messages/GetDTCsResponse.js @@ -0,0 +1,84 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class GetDTCsResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetDTCs); + } + + /** + * @param {Number} header - 2 byte ECU Header for DTC response (as defined in VHR_Layout_Specification_DTCs.pdf) + * @return {GetDTCsResponse} + */ + setEcuHeader (header) { + this.setParameter(GetDTCsResponse.KEY_ECU_HEADER, header); + return this; + } + + /** + * @return {Number} + */ + getEcuHeader () { + return this.getParameter(GetDTCsResponse.KEY_ECU_HEADER); + } + + /** + * @param {String[]} dtc - Array of all reported DTCs on module (ecuHeader contains information if list is + * truncated). Each DTC is represented by 4 bytes (3 bytes of data and 1 byte status as + * defined in VHR_Layout_Specification_DTCs.pdf). + * @return {GetDTCsResponse} + */ + setDtc (dtc) { + this.setParameter(GetDTCsResponse.KEY_DTC, dtc); + return this; + } + + /** + * @return {String[]} + */ + getDtc () { + return this.getParameter(GetDTCsResponse.KEY_DTC); + } +} + +GetDTCsResponse.KEY_ECU_HEADER = 'ecuHeader'; +GetDTCsResponse.KEY_DTC = 'dtc'; + +export { GetDTCsResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetFile.js b/lib/js/src/rpc/messages/GetFile.js new file mode 100644 index 00000000..44c292af --- /dev/null +++ b/lib/js/src/rpc/messages/GetFile.js @@ -0,0 +1,139 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FileType } from '../enums/FileType.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * This request is sent to the module to retrieve a file + */ +class GetFile extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetFile); + } + + /** + * @param {String} name - File name that should be retrieved + * @return {GetFile} + */ + setFileName (name) { + this.setParameter(GetFile.KEY_FILE_NAME, name); + return this; + } + + /** + * @return {String} + */ + getFileName () { + return this.getParameter(GetFile.KEY_FILE_NAME); + } + + /** + * @param {String} id - ID of the service that should have uploaded the requested file. + * @return {GetFile} + */ + setAppServiceId (id) { + this.setParameter(GetFile.KEY_APP_SERVICE_ID, id); + return this; + } + + /** + * @return {String} + */ + getAppServiceId () { + return this.getParameter(GetFile.KEY_APP_SERVICE_ID); + } + + /** + * @param {FileType} type - Selected file type. + * @return {GetFile} + */ + setFileType (type) { + this.validateType(FileType, type); + this.setParameter(GetFile.KEY_FILE_TYPE, type); + return this; + } + + /** + * @return {FileType} + */ + getFileType () { + return this.getObject(FileType, GetFile.KEY_FILE_TYPE); + } + + /** + * @param {Number} offset - Optional offset in bytes for resuming partial data chunks + * @return {GetFile} + */ + setOffset (offset) { + this.setParameter(GetFile.KEY_OFFSET, offset); + return this; + } + + /** + * @return {Number} + */ + getOffset () { + return this.getParameter(GetFile.KEY_OFFSET); + } + + /** + * @param {Number} length - Optional length in bytes for resuming partial data chunks If offset is set to 0, then + * length is the total length of the file to be retrieved + * @return {GetFile} + */ + setLength (length) { + this.setParameter(GetFile.KEY_LENGTH, length); + return this; + } + + /** + * @return {Number} + */ + getLength () { + return this.getParameter(GetFile.KEY_LENGTH); + } +} + +GetFile.KEY_FILE_NAME = 'fileName'; +GetFile.KEY_APP_SERVICE_ID = 'appServiceId'; +GetFile.KEY_FILE_TYPE = 'fileType'; +GetFile.KEY_OFFSET = 'offset'; +GetFile.KEY_LENGTH = 'length'; + +export { GetFile }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetFileResponse.js b/lib/js/src/rpc/messages/GetFileResponse.js new file mode 100644 index 00000000..5990c58e --- /dev/null +++ b/lib/js/src/rpc/messages/GetFileResponse.js @@ -0,0 +1,122 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; +import { FileType } from '../enums/FileType.js'; + +/** + * This response includes the data that is requested from the specific service + */ +class GetFileResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetFile); + } + + /** + * @param {Number} offset - Optional offset in bytes for resuming partial data chunks + * @return {GetFileResponse} + */ + setOffset (offset) { + this.setParameter(GetFileResponse.KEY_OFFSET, offset); + return this; + } + + /** + * @return {Number} + */ + getOffset () { + return this.getParameter(GetFileResponse.KEY_OFFSET); + } + + /** + * @param {Number} length - Optional length in bytes for resuming partial data chunks if offset is set to 0, then + * length is the total length of the file to be downloaded + * @return {GetFileResponse} + */ + setLength (length) { + this.setParameter(GetFileResponse.KEY_LENGTH, length); + return this; + } + + /** + * @return {Number} + */ + getLength () { + return this.getParameter(GetFileResponse.KEY_LENGTH); + } + + /** + * @param {FileType} type - File type that is being sent in response. + * @return {GetFileResponse} + */ + setFileType (type) { + this.validateType(FileType, type); + this.setParameter(GetFileResponse.KEY_FILE_TYPE, type); + return this; + } + + /** + * @return {FileType} + */ + getFileType () { + return this.getObject(FileType, GetFileResponse.KEY_FILE_TYPE); + } + + /** + * @param {Number} crc - Additional CRC32 checksum to protect data integrity up to 512 Mbits + * @return {GetFileResponse} + */ + setCrc (crc) { + this.setParameter(GetFileResponse.KEY_CRC, crc); + return this; + } + + /** + * @return {Number} + */ + getCrc () { + return this.getParameter(GetFileResponse.KEY_CRC); + } +} + +GetFileResponse.KEY_OFFSET = 'offset'; +GetFileResponse.KEY_LENGTH = 'length'; +GetFileResponse.KEY_FILE_TYPE = 'fileType'; +GetFileResponse.KEY_CRC = 'crc'; + +export { GetFileResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetInteriorVehicleData.js b/lib/js/src/rpc/messages/GetInteriorVehicleData.js new file mode 100644 index 00000000..6fcaaf85 --- /dev/null +++ b/lib/js/src/rpc/messages/GetInteriorVehicleData.js @@ -0,0 +1,107 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { ModuleType } from '../enums/ModuleType.js'; +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +class GetInteriorVehicleData extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetInteriorVehicleData); + } + + /** + * @param {ModuleType} type - The type of a RC module to retrieve module data from the vehicle. In the future, this + * should be the Identification of a module. + * @return {GetInteriorVehicleData} + */ + setModuleType (type) { + this.validateType(ModuleType, type); + this.setParameter(GetInteriorVehicleData.KEY_MODULE_TYPE, type); + return this; + } + + /** + * @return {ModuleType} + */ + getModuleType () { + return this.getObject(ModuleType, GetInteriorVehicleData.KEY_MODULE_TYPE); + } + + /** + * @param {String} id - Id of a module, published by System Capability. + * @return {GetInteriorVehicleData} + */ + setModuleId (id) { + this.setParameter(GetInteriorVehicleData.KEY_MODULE_ID, id); + return this; + } + + /** + * @return {String} + */ + getModuleId () { + return this.getParameter(GetInteriorVehicleData.KEY_MODULE_ID); + } + + /** + * @param {Boolean} subscribe - If subscribe is true, the head unit will register OnInteriorVehicleData + * notifications for the requested module (moduleId and moduleType). If subscribe is + * false, the head unit will unregister OnInteriorVehicleData notifications for the + * requested module (moduleId and moduleType). If subscribe is not included, the + * subscription status of the app for the requested module (moduleId and moduleType) + * will remain unchanged. + * @return {GetInteriorVehicleData} + */ + setSubscribe (subscribe) { + this.setParameter(GetInteriorVehicleData.KEY_SUBSCRIBE, subscribe); + return this; + } + + /** + * @return {Boolean} + */ + getSubscribe () { + return this.getParameter(GetInteriorVehicleData.KEY_SUBSCRIBE); + } +} + +GetInteriorVehicleData.KEY_MODULE_TYPE = 'moduleType'; +GetInteriorVehicleData.KEY_MODULE_ID = 'moduleId'; +GetInteriorVehicleData.KEY_SUBSCRIBE = 'subscribe'; + +export { GetInteriorVehicleData }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetInteriorVehicleDataConsent.js b/lib/js/src/rpc/messages/GetInteriorVehicleDataConsent.js new file mode 100644 index 00000000..ba0bc6f3 --- /dev/null +++ b/lib/js/src/rpc/messages/GetInteriorVehicleDataConsent.js @@ -0,0 +1,84 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { ModuleType } from '../enums/ModuleType.js'; +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +class GetInteriorVehicleDataConsent extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetInteriorVehicleDataConsent); + } + + /** + * @param {ModuleType} type - The module type that the app requests to control. + * @return {GetInteriorVehicleDataConsent} + */ + setModuleType (type) { + this.validateType(ModuleType, type); + this.setParameter(GetInteriorVehicleDataConsent.KEY_MODULE_TYPE, type); + return this; + } + + /** + * @return {ModuleType} + */ + getModuleType () { + return this.getObject(ModuleType, GetInteriorVehicleDataConsent.KEY_MODULE_TYPE); + } + + /** + * @param {String[]} ids - Ids of a module of same type, published by System Capability. + * @return {GetInteriorVehicleDataConsent} + */ + setModuleIds (ids) { + this.setParameter(GetInteriorVehicleDataConsent.KEY_MODULE_IDS, ids); + return this; + } + + /** + * @return {String[]} + */ + getModuleIds () { + return this.getParameter(GetInteriorVehicleDataConsent.KEY_MODULE_IDS); + } +} + +GetInteriorVehicleDataConsent.KEY_MODULE_TYPE = 'moduleType'; +GetInteriorVehicleDataConsent.KEY_MODULE_IDS = 'moduleIds'; + +export { GetInteriorVehicleDataConsent }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetInteriorVehicleDataConsentResponse.js b/lib/js/src/rpc/messages/GetInteriorVehicleDataConsentResponse.js new file mode 100644 index 00000000..2e2f58bf --- /dev/null +++ b/lib/js/src/rpc/messages/GetInteriorVehicleDataConsentResponse.js @@ -0,0 +1,67 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class GetInteriorVehicleDataConsentResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetInteriorVehicleDataConsent); + } + + /** + * @param {Boolean[]} allowed - This array has the same size as "moduleIds" in the request and each element + * corresponds to one moduleId If true, SDL grants the permission for the requested + * module If false, SDL denies the permission for the requested module. + * @return {GetInteriorVehicleDataConsentResponse} + */ + setAllowed (allowed) { + this.setParameter(GetInteriorVehicleDataConsentResponse.KEY_ALLOWED, allowed); + return this; + } + + /** + * @return {Boolean[]} + */ + getAllowed () { + return this.getParameter(GetInteriorVehicleDataConsentResponse.KEY_ALLOWED); + } +} + +GetInteriorVehicleDataConsentResponse.KEY_ALLOWED = 'allowed'; + +export { GetInteriorVehicleDataConsentResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetInteriorVehicleDataResponse.js b/lib/js/src/rpc/messages/GetInteriorVehicleDataResponse.js new file mode 100644 index 00000000..0390ea09 --- /dev/null +++ b/lib/js/src/rpc/messages/GetInteriorVehicleDataResponse.js @@ -0,0 +1,90 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { ModuleData } from '../structs/ModuleData.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class GetInteriorVehicleDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetInteriorVehicleData); + } + + /** + * @param {ModuleData} data - The moduleType indicates which type of data should be changed and identifies which + * data object exists in this struct. For example, if the moduleType is CLIMATE then a + * "climateControlData" should exist + * @return {GetInteriorVehicleDataResponse} + */ + setModuleData (data) { + this.validateType(ModuleData, data); + this.setParameter(GetInteriorVehicleDataResponse.KEY_MODULE_DATA, data); + return this; + } + + /** + * @return {ModuleData} + */ + getModuleData () { + return this.getObject(ModuleData, GetInteriorVehicleDataResponse.KEY_MODULE_DATA); + } + + /** + * @param {Boolean} subscribed - It is a conditional-mandatory parameter: must be returned in case "subscribe" + * parameter was present in the related request. if "true" - the "moduleType" from + * request is successfully subscribed and the head unit will send + * onInteriorVehicleData notifications for the moduleType. if "false" - the + * "moduleType" from request is either unsubscribed or failed to subscribe. + * @return {GetInteriorVehicleDataResponse} + */ + setIsSubscribed (subscribed) { + this.setParameter(GetInteriorVehicleDataResponse.KEY_IS_SUBSCRIBED, subscribed); + return this; + } + + /** + * @return {Boolean} + */ + getIsSubscribed () { + return this.getParameter(GetInteriorVehicleDataResponse.KEY_IS_SUBSCRIBED); + } +} + +GetInteriorVehicleDataResponse.KEY_MODULE_DATA = 'moduleData'; +GetInteriorVehicleDataResponse.KEY_IS_SUBSCRIBED = 'isSubscribed'; + +export { GetInteriorVehicleDataResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetSystemCapability.js b/lib/js/src/rpc/messages/GetSystemCapability.js new file mode 100644 index 00000000..fa2197d5 --- /dev/null +++ b/lib/js/src/rpc/messages/GetSystemCapability.js @@ -0,0 +1,89 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { SystemCapabilityType } from '../enums/SystemCapabilityType.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Request for expanded information about a supported system/HMI capability + */ +class GetSystemCapability extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetSystemCapability); + } + + /** + * @param {SystemCapabilityType} type - The type of system capability to get more information on + * @return {GetSystemCapability} + */ + setSystemCapabilityType (type) { + this.validateType(SystemCapabilityType, type); + this.setParameter(GetSystemCapability.KEY_SYSTEM_CAPABILITY_TYPE, type); + return this; + } + + /** + * @return {SystemCapabilityType} + */ + getSystemCapabilityType () { + return this.getObject(SystemCapabilityType, GetSystemCapability.KEY_SYSTEM_CAPABILITY_TYPE); + } + + /** + * @param {Boolean} subscribe - Flag to subscribe to updates of the supplied service capability type. If true, the + * requester will be subscribed. If false, the requester will not be subscribed and be + * removed as a subscriber if it was previously subscribed. + * @return {GetSystemCapability} + */ + setSubscribe (subscribe) { + this.setParameter(GetSystemCapability.KEY_SUBSCRIBE, subscribe); + return this; + } + + /** + * @return {Boolean} + */ + getSubscribe () { + return this.getParameter(GetSystemCapability.KEY_SUBSCRIBE); + } +} + +GetSystemCapability.KEY_SYSTEM_CAPABILITY_TYPE = 'systemCapabilityType'; +GetSystemCapability.KEY_SUBSCRIBE = 'subscribe'; + +export { GetSystemCapability }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetSystemCapabilityResponse.js b/lib/js/src/rpc/messages/GetSystemCapabilityResponse.js new file mode 100644 index 00000000..af0a74a7 --- /dev/null +++ b/lib/js/src/rpc/messages/GetSystemCapabilityResponse.js @@ -0,0 +1,69 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; +import { SystemCapability } from '../structs/SystemCapability.js'; + +class GetSystemCapabilityResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetSystemCapability); + } + + /** + * @param {SystemCapability} capability - The systemCapabilityType identifies which data object exists in this + * struct. For example, if the SystemCapability Type is NAVIGATION then a + * "navigationCapability" should exist + * @return {GetSystemCapabilityResponse} + */ + setSystemCapability (capability) { + this.validateType(SystemCapability, capability); + this.setParameter(GetSystemCapabilityResponse.KEY_SYSTEM_CAPABILITY, capability); + return this; + } + + /** + * @return {SystemCapability} + */ + getSystemCapability () { + return this.getObject(SystemCapability, GetSystemCapabilityResponse.KEY_SYSTEM_CAPABILITY); + } +} + +GetSystemCapabilityResponse.KEY_SYSTEM_CAPABILITY = 'systemCapability'; + +export { GetSystemCapabilityResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetVehicleData.js b/lib/js/src/rpc/messages/GetVehicleData.js new file mode 100644 index 00000000..132f6c2b --- /dev/null +++ b/lib/js/src/rpc/messages/GetVehicleData.js @@ -0,0 +1,561 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Non periodic vehicle data read request. + */ +class GetVehicleData extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetVehicleData); + } + + /** + * @param {Boolean} gps - See GPSData + * @return {GetVehicleData} + */ + setGps (gps) { + this.setParameter(GetVehicleData.KEY_GPS, gps); + return this; + } + + /** + * @return {Boolean} + */ + getGps () { + return this.getParameter(GetVehicleData.KEY_GPS); + } + + /** + * @param {Boolean} speed - The vehicle speed in kilometers per hour + * @return {GetVehicleData} + */ + setSpeed (speed) { + this.setParameter(GetVehicleData.KEY_SPEED, speed); + return this; + } + + /** + * @return {Boolean} + */ + getSpeed () { + return this.getParameter(GetVehicleData.KEY_SPEED); + } + + /** + * @param {Boolean} rpm - The number of revolutions per minute of the engine + * @return {GetVehicleData} + */ + setRpm (rpm) { + this.setParameter(GetVehicleData.KEY_RPM, rpm); + return this; + } + + /** + * @return {Boolean} + */ + getRpm () { + return this.getParameter(GetVehicleData.KEY_RPM); + } + + /** + * @param {Boolean} level - The fuel level in the tank (percentage) + * @return {GetVehicleData} + */ + setFuelLevel (level) { + this.setParameter(GetVehicleData.KEY_FUEL_LEVEL, level); + return this; + } + + /** + * @return {Boolean} + */ + getFuelLevel () { + return this.getParameter(GetVehicleData.KEY_FUEL_LEVEL); + } + + /** + * @param {Boolean} level_state - The fuel level state + * @return {GetVehicleData} + */ + setFuelLevel_State (level_state) { + this.setParameter(GetVehicleData.KEY_FUEL_LEVEL_STATE, level_state); + return this; + } + + /** + * @return {Boolean} + */ + getFuelLevel_State () { + return this.getParameter(GetVehicleData.KEY_FUEL_LEVEL_STATE); + } + + /** + * @param {Boolean} consumption - The instantaneous fuel consumption in microlitres + * @return {GetVehicleData} + */ + setInstantFuelConsumption (consumption) { + this.setParameter(GetVehicleData.KEY_INSTANT_FUEL_CONSUMPTION, consumption); + return this; + } + + /** + * @return {Boolean} + */ + getInstantFuelConsumption () { + return this.getParameter(GetVehicleData.KEY_INSTANT_FUEL_CONSUMPTION); + } + + /** + * @param {Boolean} range - The estimate range in KM the vehicle can travel based on fuel level and consumption + * @return {GetVehicleData} + */ + setFuelRange (range) { + this.setParameter(GetVehicleData.KEY_FUEL_RANGE, range); + return this; + } + + /** + * @return {Boolean} + */ + getFuelRange () { + return this.getParameter(GetVehicleData.KEY_FUEL_RANGE); + } + + /** + * @param {Boolean} temperature - The external temperature in degrees celsius + * @return {GetVehicleData} + */ + setExternalTemperature (temperature) { + this.setParameter(GetVehicleData.KEY_EXTERNAL_TEMPERATURE, temperature); + return this; + } + + /** + * @return {Boolean} + */ + getExternalTemperature () { + return this.getParameter(GetVehicleData.KEY_EXTERNAL_TEMPERATURE); + } + + /** + * @param {Boolean} signal - See TurnSignal + * @return {GetVehicleData} + */ + setTurnSignal (signal) { + this.setParameter(GetVehicleData.KEY_TURN_SIGNAL, signal); + return this; + } + + /** + * @return {Boolean} + */ + getTurnSignal () { + return this.getParameter(GetVehicleData.KEY_TURN_SIGNAL); + } + + /** + * @param {Boolean} vin - Vehicle identification number + * @return {GetVehicleData} + */ + setVin (vin) { + this.setParameter(GetVehicleData.KEY_VIN, vin); + return this; + } + + /** + * @return {Boolean} + */ + getVin () { + return this.getParameter(GetVehicleData.KEY_VIN); + } + + /** + * @param {Boolean} prndl - See PRNDL + * @return {GetVehicleData} + */ + setPrndl (prndl) { + this.setParameter(GetVehicleData.KEY_PRNDL, prndl); + return this; + } + + /** + * @return {Boolean} + */ + getPrndl () { + return this.getParameter(GetVehicleData.KEY_PRNDL); + } + + /** + * @param {Boolean} pressure - See TireStatus + * @return {GetVehicleData} + */ + setTirePressure (pressure) { + this.setParameter(GetVehicleData.KEY_TIRE_PRESSURE, pressure); + return this; + } + + /** + * @return {Boolean} + */ + getTirePressure () { + return this.getParameter(GetVehicleData.KEY_TIRE_PRESSURE); + } + + /** + * @param {Boolean} odometer - Odometer in km + * @return {GetVehicleData} + */ + setOdometer (odometer) { + this.setParameter(GetVehicleData.KEY_ODOMETER, odometer); + return this; + } + + /** + * @return {Boolean} + */ + getOdometer () { + return this.getParameter(GetVehicleData.KEY_ODOMETER); + } + + /** + * @param {Boolean} status - The status of the seat belts + * @return {GetVehicleData} + */ + setBeltStatus (status) { + this.setParameter(GetVehicleData.KEY_BELT_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getBeltStatus () { + return this.getParameter(GetVehicleData.KEY_BELT_STATUS); + } + + /** + * @param {Boolean} information - The body information including ignition status and internal temp + * @return {GetVehicleData} + */ + setBodyInformation (information) { + this.setParameter(GetVehicleData.KEY_BODY_INFORMATION, information); + return this; + } + + /** + * @return {Boolean} + */ + getBodyInformation () { + return this.getParameter(GetVehicleData.KEY_BODY_INFORMATION); + } + + /** + * @param {Boolean} status - The device status including signal and battery strength + * @return {GetVehicleData} + */ + setDeviceStatus (status) { + this.setParameter(GetVehicleData.KEY_DEVICE_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getDeviceStatus () { + return this.getParameter(GetVehicleData.KEY_DEVICE_STATUS); + } + + /** + * @param {Boolean} braking - The status of the brake pedal + * @return {GetVehicleData} + */ + setDriverBraking (braking) { + this.setParameter(GetVehicleData.KEY_DRIVER_BRAKING, braking); + return this; + } + + /** + * @return {Boolean} + */ + getDriverBraking () { + return this.getParameter(GetVehicleData.KEY_DRIVER_BRAKING); + } + + /** + * @param {Boolean} status - The status of the wipers + * @return {GetVehicleData} + */ + setWiperStatus (status) { + this.setParameter(GetVehicleData.KEY_WIPER_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getWiperStatus () { + return this.getParameter(GetVehicleData.KEY_WIPER_STATUS); + } + + /** + * @param {Boolean} status - Status of the head lamps + * @return {GetVehicleData} + */ + setHeadLampStatus (status) { + this.setParameter(GetVehicleData.KEY_HEAD_LAMP_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getHeadLampStatus () { + return this.getParameter(GetVehicleData.KEY_HEAD_LAMP_STATUS); + } + + /** + * @param {Boolean} torque - Torque value for engine (in Nm) on non-diesel variants + * @return {GetVehicleData} + */ + setEngineTorque (torque) { + this.setParameter(GetVehicleData.KEY_ENGINE_TORQUE, torque); + return this; + } + + /** + * @return {Boolean} + */ + getEngineTorque () { + return this.getParameter(GetVehicleData.KEY_ENGINE_TORQUE); + } + + /** + * @param {Boolean} position - Accelerator pedal position (percentage depressed) + * @return {GetVehicleData} + */ + setAccPedalPosition (position) { + this.setParameter(GetVehicleData.KEY_ACC_PEDAL_POSITION, position); + return this; + } + + /** + * @return {Boolean} + */ + getAccPedalPosition () { + return this.getParameter(GetVehicleData.KEY_ACC_PEDAL_POSITION); + } + + /** + * @param {Boolean} angle - Current angle of the steering wheel (in deg) + * @return {GetVehicleData} + */ + setSteeringWheelAngle (angle) { + this.setParameter(GetVehicleData.KEY_STEERING_WHEEL_ANGLE, angle); + return this; + } + + /** + * @return {Boolean} + */ + getSteeringWheelAngle () { + return this.getParameter(GetVehicleData.KEY_STEERING_WHEEL_ANGLE); + } + + /** + * @param {Boolean} life - The estimated percentage of remaining oil life of the engine. + * @return {GetVehicleData} + */ + setEngineOilLife (life) { + this.setParameter(GetVehicleData.KEY_ENGINE_OIL_LIFE, life); + return this; + } + + /** + * @return {Boolean} + */ + getEngineOilLife () { + return this.getParameter(GetVehicleData.KEY_ENGINE_OIL_LIFE); + } + + /** + * @param {Boolean} status - The status of the park brake as provided by Electric Park Brake (EPB) system. + * @return {GetVehicleData} + */ + setElectronicParkBrakeStatus (status) { + this.setParameter(GetVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getElectronicParkBrakeStatus () { + return this.getParameter(GetVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS); + } + + /** + * @param {Boolean} id - Parameter used by cloud apps to identify a head unit + * @return {GetVehicleData} + */ + setCloudAppVehicleID (id) { + this.setParameter(GetVehicleData.KEY_CLOUD_APP_VEHICLE_ID, id); + return this; + } + + /** + * @return {Boolean} + */ + getCloudAppVehicleID () { + return this.getParameter(GetVehicleData.KEY_CLOUD_APP_VEHICLE_ID); + } + + /** + * @param {Boolean} info - Emergency Call notification and confirmation data + * @return {GetVehicleData} + */ + setECallInfo (info) { + this.setParameter(GetVehicleData.KEY_E_CALL_INFO, info); + return this; + } + + /** + * @return {Boolean} + */ + getECallInfo () { + return this.getParameter(GetVehicleData.KEY_E_CALL_INFO); + } + + /** + * @param {Boolean} status - The status of the air bags + * @return {GetVehicleData} + */ + setAirbagStatus (status) { + this.setParameter(GetVehicleData.KEY_AIRBAG_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getAirbagStatus () { + return this.getParameter(GetVehicleData.KEY_AIRBAG_STATUS); + } + + /** + * @param {Boolean} event - Information related to an emergency event (and if it occurred) + * @return {GetVehicleData} + */ + setEmergencyEvent (event) { + this.setParameter(GetVehicleData.KEY_EMERGENCY_EVENT, event); + return this; + } + + /** + * @return {Boolean} + */ + getEmergencyEvent () { + return this.getParameter(GetVehicleData.KEY_EMERGENCY_EVENT); + } + + /** + * @param {Boolean} status - The status modes of the cluster + * @return {GetVehicleData} + */ + setClusterModeStatus (status) { + this.setParameter(GetVehicleData.KEY_CLUSTER_MODE_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getClusterModeStatus () { + return this.getParameter(GetVehicleData.KEY_CLUSTER_MODE_STATUS); + } + + /** + * @param {Boolean} key - Information related to the MyKey feature + * @return {GetVehicleData} + */ + setMyKey (key) { + this.setParameter(GetVehicleData.KEY_MY_KEY, key); + return this; + } + + /** + * @return {Boolean} + */ + getMyKey () { + return this.getParameter(GetVehicleData.KEY_MY_KEY); + } +} + +GetVehicleData.KEY_GPS = 'gps'; +GetVehicleData.KEY_SPEED = 'speed'; +GetVehicleData.KEY_RPM = 'rpm'; +GetVehicleData.KEY_FUEL_LEVEL = 'fuelLevel'; +GetVehicleData.KEY_FUEL_LEVEL_STATE = 'fuelLevel_State'; +GetVehicleData.KEY_INSTANT_FUEL_CONSUMPTION = 'instantFuelConsumption'; +GetVehicleData.KEY_FUEL_RANGE = 'fuelRange'; +GetVehicleData.KEY_EXTERNAL_TEMPERATURE = 'externalTemperature'; +GetVehicleData.KEY_TURN_SIGNAL = 'turnSignal'; +GetVehicleData.KEY_VIN = 'vin'; +GetVehicleData.KEY_PRNDL = 'prndl'; +GetVehicleData.KEY_TIRE_PRESSURE = 'tirePressure'; +GetVehicleData.KEY_ODOMETER = 'odometer'; +GetVehicleData.KEY_BELT_STATUS = 'beltStatus'; +GetVehicleData.KEY_BODY_INFORMATION = 'bodyInformation'; +GetVehicleData.KEY_DEVICE_STATUS = 'deviceStatus'; +GetVehicleData.KEY_DRIVER_BRAKING = 'driverBraking'; +GetVehicleData.KEY_WIPER_STATUS = 'wiperStatus'; +GetVehicleData.KEY_HEAD_LAMP_STATUS = 'headLampStatus'; +GetVehicleData.KEY_ENGINE_TORQUE = 'engineTorque'; +GetVehicleData.KEY_ACC_PEDAL_POSITION = 'accPedalPosition'; +GetVehicleData.KEY_STEERING_WHEEL_ANGLE = 'steeringWheelAngle'; +GetVehicleData.KEY_ENGINE_OIL_LIFE = 'engineOilLife'; +GetVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS = 'electronicParkBrakeStatus'; +GetVehicleData.KEY_CLOUD_APP_VEHICLE_ID = 'cloudAppVehicleID'; +GetVehicleData.KEY_E_CALL_INFO = 'eCallInfo'; +GetVehicleData.KEY_AIRBAG_STATUS = 'airbagStatus'; +GetVehicleData.KEY_EMERGENCY_EVENT = 'emergencyEvent'; +GetVehicleData.KEY_CLUSTER_MODE_STATUS = 'clusterModeStatus'; +GetVehicleData.KEY_MY_KEY = 'myKey'; + +export { GetVehicleData }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetVehicleDataResponse.js b/lib/js/src/rpc/messages/GetVehicleDataResponse.js new file mode 100644 index 00000000..bc9b35a0 --- /dev/null +++ b/lib/js/src/rpc/messages/GetVehicleDataResponse.js @@ -0,0 +1,595 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { AirbagStatus } from '../structs/AirbagStatus.js'; +import { ClusterModeStatus } from '../structs/ClusterModeStatus.js'; +import { VehicleDataEventStatus } from '../enums/VehicleDataEventStatus.js'; +import { EmergencyEvent } from '../structs/EmergencyEvent.js'; +import { TurnSignal } from '../enums/TurnSignal.js'; +import { RpcResponse } from '../RpcResponse.js'; +import { HeadLampStatus } from '../structs/HeadLampStatus.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { DeviceStatus } from '../structs/DeviceStatus.js'; +import { WiperStatus } from '../enums/WiperStatus.js'; +import { ElectronicParkBrakeStatus } from '../enums/ElectronicParkBrakeStatus.js'; +import { MyKey } from '../structs/MyKey.js'; +import { GPSData } from '../structs/GPSData.js'; +import { PRNDL } from '../enums/PRNDL.js'; +import { FuelRange } from '../structs/FuelRange.js'; +import { ECallInfo } from '../structs/ECallInfo.js'; +import { BeltStatus } from '../structs/BeltStatus.js'; +import { ComponentVolumeStatus } from '../enums/ComponentVolumeStatus.js'; +import { BodyInformation } from '../structs/BodyInformation.js'; +import { TireStatus } from '../structs/TireStatus.js'; + +class GetVehicleDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetVehicleData); + } + + /** + * @param {GPSData} gps - See GPSData + * @return {GetVehicleDataResponse} + */ + setGps (gps) { + this.validateType(GPSData, gps); + this.setParameter(GetVehicleDataResponse.KEY_GPS, gps); + return this; + } + + /** + * @return {GPSData} + */ + getGps () { + return this.getObject(GPSData, GetVehicleDataResponse.KEY_GPS); + } + + /** + * @param {Number} speed - The vehicle speed in kilometers per hour + * @return {GetVehicleDataResponse} + */ + setSpeed (speed) { + this.setParameter(GetVehicleDataResponse.KEY_SPEED, speed); + return this; + } + + /** + * @return {Number} + */ + getSpeed () { + return this.getParameter(GetVehicleDataResponse.KEY_SPEED); + } + + /** + * @param {Number} rpm - The number of revolutions per minute of the engine + * @return {GetVehicleDataResponse} + */ + setRpm (rpm) { + this.setParameter(GetVehicleDataResponse.KEY_RPM, rpm); + return this; + } + + /** + * @return {Number} + */ + getRpm () { + return this.getParameter(GetVehicleDataResponse.KEY_RPM); + } + + /** + * @param {Number} level - The fuel level in the tank (percentage) + * @return {GetVehicleDataResponse} + */ + setFuelLevel (level) { + this.setParameter(GetVehicleDataResponse.KEY_FUEL_LEVEL, level); + return this; + } + + /** + * @return {Number} + */ + getFuelLevel () { + return this.getParameter(GetVehicleDataResponse.KEY_FUEL_LEVEL); + } + + /** + * @param {ComponentVolumeStatus} level_state - The fuel level state + * @return {GetVehicleDataResponse} + */ + setFuelLevel_State (level_state) { + this.validateType(ComponentVolumeStatus, level_state); + this.setParameter(GetVehicleDataResponse.KEY_FUEL_LEVEL_STATE, level_state); + return this; + } + + /** + * @return {ComponentVolumeStatus} + */ + getFuelLevel_State () { + return this.getObject(ComponentVolumeStatus, GetVehicleDataResponse.KEY_FUEL_LEVEL_STATE); + } + + /** + * @param {Number} consumption - The instantaneous fuel consumption in microlitres + * @return {GetVehicleDataResponse} + */ + setInstantFuelConsumption (consumption) { + this.setParameter(GetVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION, consumption); + return this; + } + + /** + * @return {Number} + */ + getInstantFuelConsumption () { + return this.getParameter(GetVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION); + } + + /** + * @param {FuelRange[]} range - The estimate range in KM the vehicle can travel based on fuel level and consumption + * @return {GetVehicleDataResponse} + */ + setFuelRange (range) { + this.validateType(FuelRange, range, true); + this.setParameter(GetVehicleDataResponse.KEY_FUEL_RANGE, range); + return this; + } + + /** + * @return {FuelRange[]} + */ + getFuelRange () { + return this.getObject(FuelRange, GetVehicleDataResponse.KEY_FUEL_RANGE); + } + + /** + * @param {Number} temperature - The external temperature in degrees celsius + * @return {GetVehicleDataResponse} + */ + setExternalTemperature (temperature) { + this.setParameter(GetVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE, temperature); + return this; + } + + /** + * @return {Number} + */ + getExternalTemperature () { + return this.getParameter(GetVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE); + } + + /** + * @param {TurnSignal} signal - See TurnSignal + * @return {GetVehicleDataResponse} + */ + setTurnSignal (signal) { + this.validateType(TurnSignal, signal); + this.setParameter(GetVehicleDataResponse.KEY_TURN_SIGNAL, signal); + return this; + } + + /** + * @return {TurnSignal} + */ + getTurnSignal () { + return this.getObject(TurnSignal, GetVehicleDataResponse.KEY_TURN_SIGNAL); + } + + /** + * @param {String} vin - Vehicle identification number + * @return {GetVehicleDataResponse} + */ + setVin (vin) { + this.setParameter(GetVehicleDataResponse.KEY_VIN, vin); + return this; + } + + /** + * @return {String} + */ + getVin () { + return this.getParameter(GetVehicleDataResponse.KEY_VIN); + } + + /** + * @param {PRNDL} prndl - See PRNDL + * @return {GetVehicleDataResponse} + */ + setPrndl (prndl) { + this.validateType(PRNDL, prndl); + this.setParameter(GetVehicleDataResponse.KEY_PRNDL, prndl); + return this; + } + + /** + * @return {PRNDL} + */ + getPrndl () { + return this.getObject(PRNDL, GetVehicleDataResponse.KEY_PRNDL); + } + + /** + * @param {TireStatus} pressure - See TireStatus + * @return {GetVehicleDataResponse} + */ + setTirePressure (pressure) { + this.validateType(TireStatus, pressure); + this.setParameter(GetVehicleDataResponse.KEY_TIRE_PRESSURE, pressure); + return this; + } + + /** + * @return {TireStatus} + */ + getTirePressure () { + return this.getObject(TireStatus, GetVehicleDataResponse.KEY_TIRE_PRESSURE); + } + + /** + * @param {Number} odometer - Odometer in km + * @return {GetVehicleDataResponse} + */ + setOdometer (odometer) { + this.setParameter(GetVehicleDataResponse.KEY_ODOMETER, odometer); + return this; + } + + /** + * @return {Number} + */ + getOdometer () { + return this.getParameter(GetVehicleDataResponse.KEY_ODOMETER); + } + + /** + * @param {BeltStatus} status - The status of the seat belts + * @return {GetVehicleDataResponse} + */ + setBeltStatus (status) { + this.validateType(BeltStatus, status); + this.setParameter(GetVehicleDataResponse.KEY_BELT_STATUS, status); + return this; + } + + /** + * @return {BeltStatus} + */ + getBeltStatus () { + return this.getObject(BeltStatus, GetVehicleDataResponse.KEY_BELT_STATUS); + } + + /** + * @param {BodyInformation} information - The body information including power modes + * @return {GetVehicleDataResponse} + */ + setBodyInformation (information) { + this.validateType(BodyInformation, information); + this.setParameter(GetVehicleDataResponse.KEY_BODY_INFORMATION, information); + return this; + } + + /** + * @return {BodyInformation} + */ + getBodyInformation () { + return this.getObject(BodyInformation, GetVehicleDataResponse.KEY_BODY_INFORMATION); + } + + /** + * @param {DeviceStatus} status - The device status including signal and battery strength + * @return {GetVehicleDataResponse} + */ + setDeviceStatus (status) { + this.validateType(DeviceStatus, status); + this.setParameter(GetVehicleDataResponse.KEY_DEVICE_STATUS, status); + return this; + } + + /** + * @return {DeviceStatus} + */ + getDeviceStatus () { + return this.getObject(DeviceStatus, GetVehicleDataResponse.KEY_DEVICE_STATUS); + } + + /** + * @param {VehicleDataEventStatus} braking - The status of the brake pedal + * @return {GetVehicleDataResponse} + */ + setDriverBraking (braking) { + this.validateType(VehicleDataEventStatus, braking); + this.setParameter(GetVehicleDataResponse.KEY_DRIVER_BRAKING, braking); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getDriverBraking () { + return this.getObject(VehicleDataEventStatus, GetVehicleDataResponse.KEY_DRIVER_BRAKING); + } + + /** + * @param {WiperStatus} status - The status of the wipers + * @return {GetVehicleDataResponse} + */ + setWiperStatus (status) { + this.validateType(WiperStatus, status); + this.setParameter(GetVehicleDataResponse.KEY_WIPER_STATUS, status); + return this; + } + + /** + * @return {WiperStatus} + */ + getWiperStatus () { + return this.getObject(WiperStatus, GetVehicleDataResponse.KEY_WIPER_STATUS); + } + + /** + * @param {HeadLampStatus} status - Status of the head lamps + * @return {GetVehicleDataResponse} + */ + setHeadLampStatus (status) { + this.validateType(HeadLampStatus, status); + this.setParameter(GetVehicleDataResponse.KEY_HEAD_LAMP_STATUS, status); + return this; + } + + /** + * @return {HeadLampStatus} + */ + getHeadLampStatus () { + return this.getObject(HeadLampStatus, GetVehicleDataResponse.KEY_HEAD_LAMP_STATUS); + } + + /** + * @param {Number} torque - Torque value for engine (in Nm) on non-diesel variants + * @return {GetVehicleDataResponse} + */ + setEngineTorque (torque) { + this.setParameter(GetVehicleDataResponse.KEY_ENGINE_TORQUE, torque); + return this; + } + + /** + * @return {Number} + */ + getEngineTorque () { + return this.getParameter(GetVehicleDataResponse.KEY_ENGINE_TORQUE); + } + + /** + * @param {Number} position - Accelerator pedal position (percentage depressed) + * @return {GetVehicleDataResponse} + */ + setAccPedalPosition (position) { + this.setParameter(GetVehicleDataResponse.KEY_ACC_PEDAL_POSITION, position); + return this; + } + + /** + * @return {Number} + */ + getAccPedalPosition () { + return this.getParameter(GetVehicleDataResponse.KEY_ACC_PEDAL_POSITION); + } + + /** + * @param {Number} angle - Current angle of the steering wheel (in deg) + * @return {GetVehicleDataResponse} + */ + setSteeringWheelAngle (angle) { + this.setParameter(GetVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE, angle); + return this; + } + + /** + * @return {Number} + */ + getSteeringWheelAngle () { + return this.getParameter(GetVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE); + } + + /** + * @param {Number} life - The estimated percentage of remaining oil life of the engine. + * @return {GetVehicleDataResponse} + */ + setEngineOilLife (life) { + this.setParameter(GetVehicleDataResponse.KEY_ENGINE_OIL_LIFE, life); + return this; + } + + /** + * @return {Number} + */ + getEngineOilLife () { + return this.getParameter(GetVehicleDataResponse.KEY_ENGINE_OIL_LIFE); + } + + /** + * @param {ElectronicParkBrakeStatus} status - The status of the park brake as provided by Electric Park Brake (EPB) + * system. + * @return {GetVehicleDataResponse} + */ + setElectronicParkBrakeStatus (status) { + this.validateType(ElectronicParkBrakeStatus, status); + this.setParameter(GetVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS, status); + return this; + } + + /** + * @return {ElectronicParkBrakeStatus} + */ + getElectronicParkBrakeStatus () { + return this.getObject(ElectronicParkBrakeStatus, GetVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS); + } + + /** + * @param {String} id - Parameter used by cloud apps to identify a head unit + * @return {GetVehicleDataResponse} + */ + setCloudAppVehicleID (id) { + this.setParameter(GetVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID, id); + return this; + } + + /** + * @return {String} + */ + getCloudAppVehicleID () { + return this.getParameter(GetVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID); + } + + /** + * @param {ECallInfo} info - Emergency Call notification and confirmation data + * @return {GetVehicleDataResponse} + */ + setECallInfo (info) { + this.validateType(ECallInfo, info); + this.setParameter(GetVehicleDataResponse.KEY_E_CALL_INFO, info); + return this; + } + + /** + * @return {ECallInfo} + */ + getECallInfo () { + return this.getObject(ECallInfo, GetVehicleDataResponse.KEY_E_CALL_INFO); + } + + /** + * @param {AirbagStatus} status - The status of the air bags + * @return {GetVehicleDataResponse} + */ + setAirbagStatus (status) { + this.validateType(AirbagStatus, status); + this.setParameter(GetVehicleDataResponse.KEY_AIRBAG_STATUS, status); + return this; + } + + /** + * @return {AirbagStatus} + */ + getAirbagStatus () { + return this.getObject(AirbagStatus, GetVehicleDataResponse.KEY_AIRBAG_STATUS); + } + + /** + * @param {EmergencyEvent} event - Information related to an emergency event (and if it occurred) + * @return {GetVehicleDataResponse} + */ + setEmergencyEvent (event) { + this.validateType(EmergencyEvent, event); + this.setParameter(GetVehicleDataResponse.KEY_EMERGENCY_EVENT, event); + return this; + } + + /** + * @return {EmergencyEvent} + */ + getEmergencyEvent () { + return this.getObject(EmergencyEvent, GetVehicleDataResponse.KEY_EMERGENCY_EVENT); + } + + /** + * @param {ClusterModeStatus} status - The status modes of the cluster + * @return {GetVehicleDataResponse} + */ + setClusterModeStatus (status) { + this.validateType(ClusterModeStatus, status); + this.setParameter(GetVehicleDataResponse.KEY_CLUSTER_MODE_STATUS, status); + return this; + } + + /** + * @return {ClusterModeStatus} + */ + getClusterModeStatus () { + return this.getObject(ClusterModeStatus, GetVehicleDataResponse.KEY_CLUSTER_MODE_STATUS); + } + + /** + * @param {MyKey} key - Information related to the MyKey feature + * @return {GetVehicleDataResponse} + */ + setMyKey (key) { + this.validateType(MyKey, key); + this.setParameter(GetVehicleDataResponse.KEY_MY_KEY, key); + return this; + } + + /** + * @return {MyKey} + */ + getMyKey () { + return this.getObject(MyKey, GetVehicleDataResponse.KEY_MY_KEY); + } +} + +GetVehicleDataResponse.KEY_GPS = 'gps'; +GetVehicleDataResponse.KEY_SPEED = 'speed'; +GetVehicleDataResponse.KEY_RPM = 'rpm'; +GetVehicleDataResponse.KEY_FUEL_LEVEL = 'fuelLevel'; +GetVehicleDataResponse.KEY_FUEL_LEVEL_STATE = 'fuelLevel_State'; +GetVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION = 'instantFuelConsumption'; +GetVehicleDataResponse.KEY_FUEL_RANGE = 'fuelRange'; +GetVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE = 'externalTemperature'; +GetVehicleDataResponse.KEY_TURN_SIGNAL = 'turnSignal'; +GetVehicleDataResponse.KEY_VIN = 'vin'; +GetVehicleDataResponse.KEY_PRNDL = 'prndl'; +GetVehicleDataResponse.KEY_TIRE_PRESSURE = 'tirePressure'; +GetVehicleDataResponse.KEY_ODOMETER = 'odometer'; +GetVehicleDataResponse.KEY_BELT_STATUS = 'beltStatus'; +GetVehicleDataResponse.KEY_BODY_INFORMATION = 'bodyInformation'; +GetVehicleDataResponse.KEY_DEVICE_STATUS = 'deviceStatus'; +GetVehicleDataResponse.KEY_DRIVER_BRAKING = 'driverBraking'; +GetVehicleDataResponse.KEY_WIPER_STATUS = 'wiperStatus'; +GetVehicleDataResponse.KEY_HEAD_LAMP_STATUS = 'headLampStatus'; +GetVehicleDataResponse.KEY_ENGINE_TORQUE = 'engineTorque'; +GetVehicleDataResponse.KEY_ACC_PEDAL_POSITION = 'accPedalPosition'; +GetVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE = 'steeringWheelAngle'; +GetVehicleDataResponse.KEY_ENGINE_OIL_LIFE = 'engineOilLife'; +GetVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS = 'electronicParkBrakeStatus'; +GetVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID = 'cloudAppVehicleID'; +GetVehicleDataResponse.KEY_E_CALL_INFO = 'eCallInfo'; +GetVehicleDataResponse.KEY_AIRBAG_STATUS = 'airbagStatus'; +GetVehicleDataResponse.KEY_EMERGENCY_EVENT = 'emergencyEvent'; +GetVehicleDataResponse.KEY_CLUSTER_MODE_STATUS = 'clusterModeStatus'; +GetVehicleDataResponse.KEY_MY_KEY = 'myKey'; + +export { GetVehicleDataResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetWayPoints.js b/lib/js/src/rpc/messages/GetWayPoints.js new file mode 100644 index 00000000..1e788796 --- /dev/null +++ b/lib/js/src/rpc/messages/GetWayPoints.js @@ -0,0 +1,71 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { WayPointType } from '../enums/WayPointType.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Request for getting waypoint/destination data. + */ +class GetWayPoints extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetWayPoints); + } + + /** + * @param {WayPointType} type - To request for either the destination only or for all waypoints including + * destination + * @return {GetWayPoints} + */ + setWayPointType (type) { + this.validateType(WayPointType, type); + this.setParameter(GetWayPoints.KEY_WAY_POINT_TYPE, type); + return this; + } + + /** + * @return {WayPointType} + */ + getWayPointType () { + return this.getObject(WayPointType, GetWayPoints.KEY_WAY_POINT_TYPE); + } +} + +GetWayPoints.KEY_WAY_POINT_TYPE = 'wayPointType'; + +export { GetWayPoints }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/GetWayPointsResponse.js b/lib/js/src/rpc/messages/GetWayPointsResponse.js new file mode 100644 index 00000000..4125d554 --- /dev/null +++ b/lib/js/src/rpc/messages/GetWayPointsResponse.js @@ -0,0 +1,67 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { LocationDetails } from '../structs/LocationDetails.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class GetWayPointsResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.GetWayPoints); + } + + /** + * @param {LocationDetails[]} points - See LocationDetails + * @return {GetWayPointsResponse} + */ + setWayPoints (points) { + this.validateType(LocationDetails, points, true); + this.setParameter(GetWayPointsResponse.KEY_WAY_POINTS, points); + return this; + } + + /** + * @return {LocationDetails[]} + */ + getWayPoints () { + return this.getObject(LocationDetails, GetWayPointsResponse.KEY_WAY_POINTS); + } +} + +GetWayPointsResponse.KEY_WAY_POINTS = 'wayPoints'; + +export { GetWayPointsResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ListFiles.js b/lib/js/src/rpc/messages/ListFiles.js new file mode 100644 index 00000000..6c52abf1 --- /dev/null +++ b/lib/js/src/rpc/messages/ListFiles.js @@ -0,0 +1,52 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Requests the current list of resident filenames for the registered app. Not supported on first generation SDL + * enabled vehicles. + */ +class ListFiles extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ListFiles); + } +} + + +export { ListFiles }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ListFilesResponse.js b/lib/js/src/rpc/messages/ListFilesResponse.js new file mode 100644 index 00000000..29a1bee9 --- /dev/null +++ b/lib/js/src/rpc/messages/ListFilesResponse.js @@ -0,0 +1,87 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +/** + * Returns the current list of resident filenames for the registered app along with the current space available Not + * supported on First generation SDL enabled vehicles. + */ +class ListFilesResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ListFiles); + } + + /** + * @param {String[]} filenames - An array of all filenames resident on the module for the given registered app. If + * omitted, then no files currently reside on the system. + * @return {ListFilesResponse} + */ + setFilenames (filenames) { + this.setParameter(ListFilesResponse.KEY_FILENAMES, filenames); + return this; + } + + /** + * @return {String[]} + */ + getFilenames () { + return this.getParameter(ListFilesResponse.KEY_FILENAMES); + } + + /** + * @param {Number} available - Provides the total local space available on the module for the registered app. + * @return {ListFilesResponse} + */ + setSpaceAvailable (available) { + this.setParameter(ListFilesResponse.KEY_SPACE_AVAILABLE, available); + return this; + } + + /** + * @return {Number} + */ + getSpaceAvailable () { + return this.getParameter(ListFilesResponse.KEY_SPACE_AVAILABLE); + } +} + +ListFilesResponse.KEY_FILENAMES = 'filenames'; +ListFilesResponse.KEY_SPACE_AVAILABLE = 'spaceAvailable'; + +export { ListFilesResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnAppInterfaceUnregistered.js b/lib/js/src/rpc/messages/OnAppInterfaceUnregistered.js new file mode 100644 index 00000000..54fee94c --- /dev/null +++ b/lib/js/src/rpc/messages/OnAppInterfaceUnregistered.js @@ -0,0 +1,67 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { AppInterfaceUnregisteredReason } from '../enums/AppInterfaceUnregisteredReason.js'; +import { RpcNotification } from '../RpcNotification.js'; + +class OnAppInterfaceUnregistered extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnAppInterfaceUnregistered); + } + + /** + * @param {AppInterfaceUnregisteredReason} reason - See AppInterfaceUnregisteredReason + * @return {OnAppInterfaceUnregistered} + */ + setReason (reason) { + this.validateType(AppInterfaceUnregisteredReason, reason); + this.setParameter(OnAppInterfaceUnregistered.KEY_REASON, reason); + return this; + } + + /** + * @return {AppInterfaceUnregisteredReason} + */ + getReason () { + return this.getObject(AppInterfaceUnregisteredReason, OnAppInterfaceUnregistered.KEY_REASON); + } +} + +OnAppInterfaceUnregistered.KEY_REASON = 'reason'; + +export { OnAppInterfaceUnregistered }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnAppServiceData.js b/lib/js/src/rpc/messages/OnAppServiceData.js new file mode 100644 index 00000000..0274e210 --- /dev/null +++ b/lib/js/src/rpc/messages/OnAppServiceData.js @@ -0,0 +1,72 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { AppServiceData } from '../structs/AppServiceData.js'; +import { RpcNotification } from '../RpcNotification.js'; + +/** + * This notification includes the data that is updated from the specific service + */ +class OnAppServiceData extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnAppServiceData); + } + + /** + * @param {AppServiceData} data - Contains all the current data of the app service. The serviceType will link to + * which of the service data objects are included in this object (e.g. if the service + * type is MEDIA, the mediaServiceData param should be included). + * @return {OnAppServiceData} + */ + setServiceData (data) { + this.validateType(AppServiceData, data); + this.setParameter(OnAppServiceData.KEY_SERVICE_DATA, data); + return this; + } + + /** + * @return {AppServiceData} + */ + getServiceData () { + return this.getObject(AppServiceData, OnAppServiceData.KEY_SERVICE_DATA); + } +} + +OnAppServiceData.KEY_SERVICE_DATA = 'serviceData'; + +export { OnAppServiceData }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnAudioPassThru.js b/lib/js/src/rpc/messages/OnAudioPassThru.js new file mode 100644 index 00000000..b27a5379 --- /dev/null +++ b/lib/js/src/rpc/messages/OnAudioPassThru.js @@ -0,0 +1,51 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcNotification } from '../RpcNotification.js'; + +/** + * Binary data is in binary part of hybrid msg + */ +class OnAudioPassThru extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnAudioPassThru); + } +} + + +export { OnAudioPassThru }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnButtonEvent.js b/lib/js/src/rpc/messages/OnButtonEvent.js new file mode 100644 index 00000000..1f05633b --- /dev/null +++ b/lib/js/src/rpc/messages/OnButtonEvent.js @@ -0,0 +1,107 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { ButtonName } from '../enums/ButtonName.js'; +import { ButtonEventMode } from '../enums/ButtonEventMode.js'; +import { RpcNotification } from '../RpcNotification.js'; + +/** + * Notifies application of UP/DOWN events for buttons to which the application is subscribed. + */ +class OnButtonEvent extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnButtonEvent); + } + + /** + * @param {ButtonName} name - Defines the hard (physical) and soft (touchscreen) buttons available from the module + * @return {OnButtonEvent} + */ + setButtonName (name) { + this.validateType(ButtonName, name); + this.setParameter(OnButtonEvent.KEY_BUTTON_NAME, name); + return this; + } + + /** + * @return {ButtonName} + */ + getButtonName () { + return this.getObject(ButtonName, OnButtonEvent.KEY_BUTTON_NAME); + } + + /** + * @param {ButtonEventMode} mode - Indicates whether this is an UP or DOWN event. + * @return {OnButtonEvent} + */ + setButtonEventMode (mode) { + this.validateType(ButtonEventMode, mode); + this.setParameter(OnButtonEvent.KEY_BUTTON_EVENT_MODE, mode); + return this; + } + + /** + * @return {ButtonEventMode} + */ + getButtonEventMode () { + return this.getObject(ButtonEventMode, OnButtonEvent.KEY_BUTTON_EVENT_MODE); + } + + /** + * @param {Number} id - If ButtonName is "CUSTOM_BUTTON", this references the integer ID passed by a custom button. + * (e.g. softButton ID) + * @return {OnButtonEvent} + */ + setCustomButtonID (id) { + this.setParameter(OnButtonEvent.KEY_CUSTOM_BUTTON_ID, id); + return this; + } + + /** + * @return {Number} + */ + getCustomButtonID () { + return this.getParameter(OnButtonEvent.KEY_CUSTOM_BUTTON_ID); + } +} + +OnButtonEvent.KEY_BUTTON_NAME = 'buttonName'; +OnButtonEvent.KEY_BUTTON_EVENT_MODE = 'buttonEventMode'; +OnButtonEvent.KEY_CUSTOM_BUTTON_ID = 'customButtonID'; + +export { OnButtonEvent }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnButtonPress.js b/lib/js/src/rpc/messages/OnButtonPress.js new file mode 100644 index 00000000..a65d0a3f --- /dev/null +++ b/lib/js/src/rpc/messages/OnButtonPress.js @@ -0,0 +1,107 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { ButtonPressMode } from '../enums/ButtonPressMode.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { ButtonName } from '../enums/ButtonName.js'; +import { RpcNotification } from '../RpcNotification.js'; + +/** + * Notifies application of LONG/SHORT press events for buttons to which the application is subscribed. + */ +class OnButtonPress extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnButtonPress); + } + + /** + * @param {ButtonName} name - Defines the hard (physical) and soft (touchscreen) buttons available from the module + * @return {OnButtonPress} + */ + setButtonName (name) { + this.validateType(ButtonName, name); + this.setParameter(OnButtonPress.KEY_BUTTON_NAME, name); + return this; + } + + /** + * @return {ButtonName} + */ + getButtonName () { + return this.getObject(ButtonName, OnButtonPress.KEY_BUTTON_NAME); + } + + /** + * @param {ButtonPressMode} mode - Indicates whether this is a LONG or SHORT button press event. + * @return {OnButtonPress} + */ + setButtonPressMode (mode) { + this.validateType(ButtonPressMode, mode); + this.setParameter(OnButtonPress.KEY_BUTTON_PRESS_MODE, mode); + return this; + } + + /** + * @return {ButtonPressMode} + */ + getButtonPressMode () { + return this.getObject(ButtonPressMode, OnButtonPress.KEY_BUTTON_PRESS_MODE); + } + + /** + * @param {Number} id - If ButtonName is "CUSTOM_BUTTON", this references the integer ID passed by a custom button. + * (e.g. softButton ID) + * @return {OnButtonPress} + */ + setCustomButtonID (id) { + this.setParameter(OnButtonPress.KEY_CUSTOM_BUTTON_ID, id); + return this; + } + + /** + * @return {Number} + */ + getCustomButtonID () { + return this.getParameter(OnButtonPress.KEY_CUSTOM_BUTTON_ID); + } +} + +OnButtonPress.KEY_BUTTON_NAME = 'buttonName'; +OnButtonPress.KEY_BUTTON_PRESS_MODE = 'buttonPressMode'; +OnButtonPress.KEY_CUSTOM_BUTTON_ID = 'customButtonID'; + +export { OnButtonPress }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnCommand.js b/lib/js/src/rpc/messages/OnCommand.js new file mode 100644 index 00000000..ac903e95 --- /dev/null +++ b/lib/js/src/rpc/messages/OnCommand.js @@ -0,0 +1,84 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { TriggerSource } from '../enums/TriggerSource.js'; +import { RpcNotification } from '../RpcNotification.js'; + +class OnCommand extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnCommand); + } + + /** + * @param {Number} id - Command ID, which is related to a specific menu entry + * @return {OnCommand} + */ + setCmdID (id) { + this.setParameter(OnCommand.KEY_CMD_ID, id); + return this; + } + + /** + * @return {Number} + */ + getCmdID () { + return this.getParameter(OnCommand.KEY_CMD_ID); + } + + /** + * @param {TriggerSource} source - See TriggerSource + * @return {OnCommand} + */ + setTriggerSource (source) { + this.validateType(TriggerSource, source); + this.setParameter(OnCommand.KEY_TRIGGER_SOURCE, source); + return this; + } + + /** + * @return {TriggerSource} + */ + getTriggerSource () { + return this.getObject(TriggerSource, OnCommand.KEY_TRIGGER_SOURCE); + } +} + +OnCommand.KEY_CMD_ID = 'cmdID'; +OnCommand.KEY_TRIGGER_SOURCE = 'triggerSource'; + +export { OnCommand }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnDriverDistraction.js b/lib/js/src/rpc/messages/OnDriverDistraction.js new file mode 100644 index 00000000..fa5f6c02 --- /dev/null +++ b/lib/js/src/rpc/messages/OnDriverDistraction.js @@ -0,0 +1,109 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { DriverDistractionState } from '../enums/DriverDistractionState.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcNotification } from '../RpcNotification.js'; + +/** + * Provides driver distraction state to mobile applications + */ +class OnDriverDistraction extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnDriverDistraction); + } + + /** + * @param {DriverDistractionState} state - Current State of Driver Distraction + * @return {OnDriverDistraction} + */ + setState (state) { + this.validateType(DriverDistractionState, state); + this.setParameter(OnDriverDistraction.KEY_STATE, state); + return this; + } + + /** + * @return {DriverDistractionState} + */ + getState () { + return this.getObject(DriverDistractionState, OnDriverDistraction.KEY_STATE); + } + + /** + * @param {Boolean} enabled - If enabled, the lock screen will be able to be dismissed while connected to SDL, + * allowing users the ability to interact with the app. Dismissals should include a + * warning to the user and ensure that they are not the driver. + * @return {OnDriverDistraction} + */ + setLockScreenDismissalEnabled (enabled) { + this.setParameter(OnDriverDistraction.KEY_LOCK_SCREEN_DISMISSAL_ENABLED, enabled); + return this; + } + + /** + * @return {Boolean} + */ + getLockScreenDismissalEnabled () { + return this.getParameter(OnDriverDistraction.KEY_LOCK_SCREEN_DISMISSAL_ENABLED); + } + + /** + * @param {String} warning - Warning message to be displayed on the lock screen when dismissal is enabled. This + * warning should be used to ensure that the user is not the driver of the vehicle, ex. + * `Swipe down to dismiss, acknowledging that you are not the driver.`. This parameter + * must be present if "lockScreenDismissalEnabled" is set to true. + * @return {OnDriverDistraction} + */ + setLockScreenDismissalWarning (warning) { + this.setParameter(OnDriverDistraction.KEY_LOCK_SCREEN_DISMISSAL_WARNING, warning); + return this; + } + + /** + * @return {String} + */ + getLockScreenDismissalWarning () { + return this.getParameter(OnDriverDistraction.KEY_LOCK_SCREEN_DISMISSAL_WARNING); + } +} + +OnDriverDistraction.KEY_STATE = 'state'; +OnDriverDistraction.KEY_LOCK_SCREEN_DISMISSAL_ENABLED = 'lockScreenDismissalEnabled'; +OnDriverDistraction.KEY_LOCK_SCREEN_DISMISSAL_WARNING = 'lockScreenDismissalWarning'; + +export { OnDriverDistraction }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnEncodedSyncPData.js b/lib/js/src/rpc/messages/OnEncodedSyncPData.js new file mode 100644 index 00000000..0a39b17d --- /dev/null +++ b/lib/js/src/rpc/messages/OnEncodedSyncPData.js @@ -0,0 +1,105 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcNotification } from '../RpcNotification.js'; + +/** + * Callback including encoded data of any SyncP packets that SYNC needs to send back to the mobile device. Legacy / v1 + * Protocol implementation; responds to EncodedSyncPData. *** DEPRECATED *** + */ +class OnEncodedSyncPData extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnEncodedSyncPData); + } + + /** + * @param {String[]} data - Contains base64 encoded string of SyncP packets. + * @return {OnEncodedSyncPData} + */ + setData (data) { + this.setParameter(OnEncodedSyncPData.KEY_DATA, data); + return this; + } + + /** + * @return {String[]} + */ + getData () { + return this.getParameter(OnEncodedSyncPData.KEY_DATA); + } + + /** + * @param {String} url - If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data shall + * be forwarded to the provided URL. + * @return {OnEncodedSyncPData} + */ + setURL (url) { + this.setParameter(OnEncodedSyncPData.KEY_URL, url); + return this; + } + + /** + * @return {String} + */ + getURL () { + return this.getParameter(OnEncodedSyncPData.KEY_URL); + } + + /** + * @param {Number} timeout - If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data + * shall be forwarded with the provided timeout in seconds. + * @return {OnEncodedSyncPData} + */ + setTimeout (timeout) { + this.setParameter(OnEncodedSyncPData.KEY_TIMEOUT, timeout); + return this; + } + + /** + * @return {Number} + */ + getTimeout () { + return this.getParameter(OnEncodedSyncPData.KEY_TIMEOUT); + } +} + +OnEncodedSyncPData.KEY_DATA = 'data'; +OnEncodedSyncPData.KEY_URL = 'URL'; +OnEncodedSyncPData.KEY_TIMEOUT = 'Timeout'; + +export { OnEncodedSyncPData }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnHashChange.js b/lib/js/src/rpc/messages/OnHashChange.js new file mode 100644 index 00000000..e4de2f70 --- /dev/null +++ b/lib/js/src/rpc/messages/OnHashChange.js @@ -0,0 +1,70 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcNotification } from '../RpcNotification.js'; + +/** + * Notification containing an updated hashID which can be used over connection cycles (i.e. loss of connection, + * ignition cycles, etc.). Sent after initial registration and subsequently after any change in the calculated hash of + * all persisted app data. + */ +class OnHashChange extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnHashChange); + } + + /** + * @param {String} id - Calculated hash ID to be referenced during RegisterAppInterface. + * @return {OnHashChange} + */ + setHashID (id) { + this.setParameter(OnHashChange.KEY_HASH_ID, id); + return this; + } + + /** + * @return {String} + */ + getHashID () { + return this.getParameter(OnHashChange.KEY_HASH_ID); + } +} + +OnHashChange.KEY_HASH_ID = 'hashID'; + +export { OnHashChange }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnHmiStatus.js b/lib/js/src/rpc/messages/OnHmiStatus.js index 660de0cd..68404d08 100644 --- a/lib/js/src/rpc/messages/OnHmiStatus.js +++ b/lib/js/src/rpc/messages/OnHmiStatus.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -30,115 +31,114 @@ * POSSIBILITY OF SUCH DAMAGE. */ -import { RpcNotification } from '../RpcNotification.js'; +import { SystemContext } from '../enums/SystemContext.js'; import { FunctionID } from '../enums/FunctionID.js'; -import { HMILevel } from '../enums/HMILevel.js'; +import { RpcNotification } from '../RpcNotification.js'; import { AudioStreamingState } from '../enums/AudioStreamingState.js'; +import { HMILevel } from '../enums/HMILevel.js'; import { VideoStreamingState } from '../enums/VideoStreamingState.js'; -import { SystemContext } from '../enums/SystemContext.js'; -class OnHmiStatus extends RpcNotification { +class OnHMIStatus extends RpcNotification { /** - * @constructor - */ + * @constructor + */ constructor (store) { super(store); this.setFunctionName(FunctionID.OnHMIStatus); } /** - * @param {HMILevel} hmiLevel - * @return {OnHmiStatus} - */ - setHMILevel (hmiLevel) { - this.validateType(HMILevel, hmiLevel); - - this.setParameter(OnHmiStatus.KEY_HMI_LEVEL, hmiLevel); + * @param {HMILevel} level - See HMILevel + * @return {OnHMIStatus} + */ + setHmiLevel (level) { + this.validateType(HMILevel, level); + this.setParameter(OnHMIStatus.KEY_HMI_LEVEL, level); return this; } /** - * @return {HMILevel} - */ - getHMILevel () { - return this.getObject(HMILevel, OnHmiStatus.KEY_HMI_LEVEL); + * @return {HMILevel} + */ + getHmiLevel () { + return this.getObject(HMILevel, OnHMIStatus.KEY_HMI_LEVEL); } /** - * @param {AudioStreamingState} audioStreamingState - * @return {OnHmiStatus} - */ - setAudioStreamingState (audioStreamingState) { - this.validateType(AudioStreamingState, audioStreamingState); - - this.setParameter(OnHmiStatus.KEY_AUDIO_STREAMING_STATE, audioStreamingState); + * @param {AudioStreamingState} state - See AudioStreamingState + * @return {OnHMIStatus} + */ + setAudioStreamingState (state) { + this.validateType(AudioStreamingState, state); + this.setParameter(OnHMIStatus.KEY_AUDIO_STREAMING_STATE, state); return this; } /** - * @return {AudioStreamingState} - */ + * @return {AudioStreamingState} + */ getAudioStreamingState () { - return this.getObject(AudioStreamingState, OnHmiStatus.KEY_AUDIO_STREAMING_STATE); + return this.getObject(AudioStreamingState, OnHMIStatus.KEY_AUDIO_STREAMING_STATE); } /** - * @param {SystemContext} systemContext - * @return {OnHmiStatus} - */ - setSystemContext (systemContext) { - this.validateType(SystemContext, systemContext); - - this.setParameter(OnHmiStatus.KEY_SYSTEM_CONTEXT, systemContext); + * @param {SystemContext} context - See SystemContext + * @return {OnHMIStatus} + */ + setSystemContext (context) { + this.validateType(SystemContext, context); + this.setParameter(OnHMIStatus.KEY_SYSTEM_CONTEXT, context); return this; } /** - * @return {SystemContext} - */ + * @return {SystemContext} + */ getSystemContext () { - return this.getObject(SystemContext, OnHmiStatus.KEY_SYSTEM_CONTEXT); + return this.getObject(SystemContext, OnHMIStatus.KEY_SYSTEM_CONTEXT); } /** - * @param {VideoStreamingState} videoStreamingState - * @return {OnHmiStatus} - */ - setVideoStreamingState (videoStreamingState) { - this.validateType(VideoStreamingState, videoStreamingState); - - this.setParameter(OnHmiStatus.KEY_VIDEO_STREAMING_STATE, videoStreamingState); + * @param {VideoStreamingState} state - See VideoStreamingState. If it is NOT_STREAMABLE, the app must stop + * streaming video to SDL Core(stop service). + * @return {OnHMIStatus} + */ + setVideoStreamingState (state) { + this.validateType(VideoStreamingState, state); + this.setParameter(OnHMIStatus.KEY_VIDEO_STREAMING_STATE, state); return this; } /** - * @return {VideoStreamingState} - */ + * @return {VideoStreamingState} + */ getVideoStreamingState () { - return this.getObject(VideoStreamingState, OnHmiStatus.KEY_VIDEO_STREAMING_STATE); + return this.getObject(VideoStreamingState, OnHMIStatus.KEY_VIDEO_STREAMING_STATE); } /** - * @param {Number} windowID - * @return {Show} - */ - setWindowID (windowID) { - this.setParameter(OnHmiStatus.KEY_WINDOW_ID, windowID); + * @param {Number} id - This is the unique ID assigned to the window that this RPC is intended. If this param is not + * included, it will be assumed that this request is specifically for the main window on the + * main display. See PredefinedWindows enum. + * @return {OnHMIStatus} + */ + setWindowID (id) { + this.setParameter(OnHMIStatus.KEY_WINDOW_ID, id); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getWindowID () { - return this.getParameter(OnHmiStatus.KEY_WINDOW_ID); + return this.getParameter(OnHMIStatus.KEY_WINDOW_ID); } } -OnHmiStatus.KEY_HMI_LEVEL = 'hmiLevel'; -OnHmiStatus.KEY_AUDIO_STREAMING_STATE = 'audioStreamingState'; -OnHmiStatus.KEY_SYSTEM_CONTEXT = 'systemContext'; -OnHmiStatus.KEY_VIDEO_STREAMING_STATE = 'videoStreamingState'; -OnHmiStatus.KEY_WINDOW_ID = 'windowID'; +OnHMIStatus.KEY_HMI_LEVEL = 'hmiLevel'; +OnHMIStatus.KEY_AUDIO_STREAMING_STATE = 'audioStreamingState'; +OnHMIStatus.KEY_SYSTEM_CONTEXT = 'systemContext'; +OnHMIStatus.KEY_VIDEO_STREAMING_STATE = 'videoStreamingState'; +OnHMIStatus.KEY_WINDOW_ID = 'windowID'; -export { OnHmiStatus }; +export { OnHMIStatus }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnInteriorVehicleData.js b/lib/js/src/rpc/messages/OnInteriorVehicleData.js new file mode 100644 index 00000000..90967762 --- /dev/null +++ b/lib/js/src/rpc/messages/OnInteriorVehicleData.js @@ -0,0 +1,69 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { ModuleData } from '../structs/ModuleData.js'; +import { RpcNotification } from '../RpcNotification.js'; + +class OnInteriorVehicleData extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnInteriorVehicleData); + } + + /** + * @param {ModuleData} data - The moduleType indicates which type of data should be changed and identifies which + * data object exists in this struct. For example, if the moduleType is CLIMATE then a + * "climateControlData" should exist + * @return {OnInteriorVehicleData} + */ + setModuleData (data) { + this.validateType(ModuleData, data); + this.setParameter(OnInteriorVehicleData.KEY_MODULE_DATA, data); + return this; + } + + /** + * @return {ModuleData} + */ + getModuleData () { + return this.getObject(ModuleData, OnInteriorVehicleData.KEY_MODULE_DATA); + } +} + +OnInteriorVehicleData.KEY_MODULE_DATA = 'moduleData'; + +export { OnInteriorVehicleData }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnKeyboardInput.js b/lib/js/src/rpc/messages/OnKeyboardInput.js new file mode 100644 index 00000000..33c2fe63 --- /dev/null +++ b/lib/js/src/rpc/messages/OnKeyboardInput.js @@ -0,0 +1,90 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { KeyboardEvent } from '../enums/KeyboardEvent.js'; +import { RpcNotification } from '../RpcNotification.js'; + +/** + * On-screen keyboard event. Can be full string or individual keypresses depending on keyboard mode. + */ +class OnKeyboardInput extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnKeyboardInput); + } + + /** + * @param {KeyboardEvent} event - On-screen keyboard input data. + * @return {OnKeyboardInput} + */ + setEvent (event) { + this.validateType(KeyboardEvent, event); + this.setParameter(OnKeyboardInput.KEY_EVENT, event); + return this; + } + + /** + * @return {KeyboardEvent} + */ + getEvent () { + return this.getObject(KeyboardEvent, OnKeyboardInput.KEY_EVENT); + } + + /** + * @param {String} data - On-screen keyboard input data. For dynamic keypress events, this will be the current + * compounded string of entry text. For entry submission events, this will be the full text + * entry (this will always return regardless of the mode). For entry cancelled and entry + * aborted events, this data param will be omitted. + * @return {OnKeyboardInput} + */ + setData (data) { + this.setParameter(OnKeyboardInput.KEY_DATA, data); + return this; + } + + /** + * @return {String} + */ + getData () { + return this.getParameter(OnKeyboardInput.KEY_DATA); + } +} + +OnKeyboardInput.KEY_EVENT = 'event'; +OnKeyboardInput.KEY_DATA = 'data'; + +export { OnKeyboardInput }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnLanguageChange.js b/lib/js/src/rpc/messages/OnLanguageChange.js index b8612cbc..61250abc 100644 --- a/lib/js/src/rpc/messages/OnLanguageChange.js +++ b/lib/js/src/rpc/messages/OnLanguageChange.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -30,52 +31,50 @@ * POSSIBILITY OF SUCH DAMAGE. */ -import { RpcNotification } from '../RpcNotification.js'; -import { Language } from '../enums/Language.js'; import { FunctionID } from '../enums/FunctionID.js'; +import { Language } from '../enums/Language.js'; +import { RpcNotification } from '../RpcNotification.js'; class OnLanguageChange extends RpcNotification { /** - * @constructor - */ + * @constructor + */ constructor (store) { super(store); this.setFunctionName(FunctionID.OnLanguageChange); } /** - * @param {Language} language - * @return {OnLanguageChange} - */ + * @param {Language} language - Current SDL voice engine (VR+TTS) language + * @return {OnLanguageChange} + */ setLanguage (language) { this.validateType(Language, language); - this.setParameter(OnLanguageChange.KEY_LANGUAGE, language); return this; } /** - * @return {Language} - */ + * @return {Language} + */ getLanguage () { return this.getObject(Language, OnLanguageChange.KEY_LANGUAGE); } /** - * @param {Language} language - * @return {OnLanguageChange} - */ - setHMIDisplayLanguage (language) { + * @param {Language} language - Current display language + * @return {OnLanguageChange} + */ + setHmiDisplayLanguage (language) { this.validateType(Language, language); - this.setParameter(OnLanguageChange.KEY_HMI_DISPLAY_LANGUAGE, language); return this; } /** - * @return {Language} - */ - getHMIDisplayLanguage () { + * @return {Language} + */ + getHmiDisplayLanguage () { return this.getObject(Language, OnLanguageChange.KEY_HMI_DISPLAY_LANGUAGE); } } @@ -83,4 +82,4 @@ class OnLanguageChange extends RpcNotification { OnLanguageChange.KEY_LANGUAGE = 'language'; OnLanguageChange.KEY_HMI_DISPLAY_LANGUAGE = 'hmiDisplayLanguage'; -export { OnLanguageChange }; +export { OnLanguageChange }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnPermissionsChange.js b/lib/js/src/rpc/messages/OnPermissionsChange.js new file mode 100644 index 00000000..7144aa50 --- /dev/null +++ b/lib/js/src/rpc/messages/OnPermissionsChange.js @@ -0,0 +1,87 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { PermissionItem } from '../structs/PermissionItem.js'; +import { RpcNotification } from '../RpcNotification.js'; + +/** + * Provides update to app of which policy-table-enabled functions are available + */ +class OnPermissionsChange extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnPermissionsChange); + } + + /** + * @param {PermissionItem[]} item - Change in permissions for a given set of RPCs + * @return {OnPermissionsChange} + */ + setPermissionItem (item) { + this.validateType(PermissionItem, item, true); + this.setParameter(OnPermissionsChange.KEY_PERMISSION_ITEM, item); + return this; + } + + /** + * @return {PermissionItem[]} + */ + getPermissionItem () { + return this.getObject(PermissionItem, OnPermissionsChange.KEY_PERMISSION_ITEM); + } + + /** + * @param {Boolean} encryption + * @return {OnPermissionsChange} + */ + setRequireEncryption (encryption) { + this.setParameter(OnPermissionsChange.KEY_REQUIRE_ENCRYPTION, encryption); + return this; + } + + /** + * @return {Boolean} + */ + getRequireEncryption () { + return this.getParameter(OnPermissionsChange.KEY_REQUIRE_ENCRYPTION); + } +} + +OnPermissionsChange.KEY_PERMISSION_ITEM = 'permissionItem'; +OnPermissionsChange.KEY_REQUIRE_ENCRYPTION = 'requireEncryption'; + +export { OnPermissionsChange }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnRCStatus.js b/lib/js/src/rpc/messages/OnRCStatus.js new file mode 100644 index 00000000..93b01ff5 --- /dev/null +++ b/lib/js/src/rpc/messages/OnRCStatus.js @@ -0,0 +1,107 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { ModuleData } from '../structs/ModuleData.js'; +import { RpcNotification } from '../RpcNotification.js'; + +/** + * Issued by SDL to notify the application about remote control status change on SDL + */ +class OnRCStatus extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnRCStatus); + } + + /** + * @param {Boolean} allowed - If "true" - RC is allowed; if "false" - RC is disallowed. + * @return {OnRCStatus} + */ + setAllowed (allowed) { + this.setParameter(OnRCStatus.KEY_ALLOWED, allowed); + return this; + } + + /** + * @return {Boolean} + */ + getAllowed () { + return this.getParameter(OnRCStatus.KEY_ALLOWED); + } + + /** + * @param {ModuleData[]} modules - Contains a list (zero or more) of module types that are allocated to the + * application. + * @return {OnRCStatus} + */ + setAllocatedModules (modules) { + this.validateType(ModuleData, modules, true); + this.setParameter(OnRCStatus.KEY_ALLOCATED_MODULES, modules); + return this; + } + + /** + * @return {ModuleData[]} + */ + getAllocatedModules () { + return this.getObject(ModuleData, OnRCStatus.KEY_ALLOCATED_MODULES); + } + + /** + * @param {ModuleData[]} modules - Contains a list (zero or more) of module types that are free to access for the + * application. + * @return {OnRCStatus} + */ + setFreeModules (modules) { + this.validateType(ModuleData, modules, true); + this.setParameter(OnRCStatus.KEY_FREE_MODULES, modules); + return this; + } + + /** + * @return {ModuleData[]} + */ + getFreeModules () { + return this.getObject(ModuleData, OnRCStatus.KEY_FREE_MODULES); + } +} + +OnRCStatus.KEY_ALLOWED = 'allowed'; +OnRCStatus.KEY_ALLOCATED_MODULES = 'allocatedModules'; +OnRCStatus.KEY_FREE_MODULES = 'freeModules'; + +export { OnRCStatus }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnSystemCapabilityUpdated.js b/lib/js/src/rpc/messages/OnSystemCapabilityUpdated.js new file mode 100644 index 00000000..6b2632d3 --- /dev/null +++ b/lib/js/src/rpc/messages/OnSystemCapabilityUpdated.js @@ -0,0 +1,70 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { SystemCapability } from '../structs/SystemCapability.js'; +import { RpcNotification } from '../RpcNotification.js'; + +/** + * A notification to inform the connected device that a specific system capability has changed. + */ +class OnSystemCapabilityUpdated extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnSystemCapabilityUpdated); + } + + /** + * @param {SystemCapability} capability - The system capability that has been updated + * @return {OnSystemCapabilityUpdated} + */ + setSystemCapability (capability) { + this.validateType(SystemCapability, capability); + this.setParameter(OnSystemCapabilityUpdated.KEY_SYSTEM_CAPABILITY, capability); + return this; + } + + /** + * @return {SystemCapability} + */ + getSystemCapability () { + return this.getObject(SystemCapability, OnSystemCapabilityUpdated.KEY_SYSTEM_CAPABILITY); + } +} + +OnSystemCapabilityUpdated.KEY_SYSTEM_CAPABILITY = 'systemCapability'; + +export { OnSystemCapabilityUpdated }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnSystemRequest.js b/lib/js/src/rpc/messages/OnSystemRequest.js new file mode 100644 index 00000000..aafef9f2 --- /dev/null +++ b/lib/js/src/rpc/messages/OnSystemRequest.js @@ -0,0 +1,178 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RequestType } from '../enums/RequestType.js'; +import { FileType } from '../enums/FileType.js'; +import { RpcNotification } from '../RpcNotification.js'; + +/** + * An asynchronous request from the system for specific data from the device or the cloud or response to a request from + * the device or cloud Binary data can be included in hybrid part of message for some requests (such as Authentication + * request responses) + */ +class OnSystemRequest extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnSystemRequest); + } + + /** + * @param {RequestType} type - The type of system request. + * @return {OnSystemRequest} + */ + setRequestType (type) { + this.validateType(RequestType, type); + this.setParameter(OnSystemRequest.KEY_REQUEST_TYPE, type); + return this; + } + + /** + * @return {RequestType} + */ + getRequestType () { + return this.getObject(RequestType, OnSystemRequest.KEY_REQUEST_TYPE); + } + + /** + * @param {String} type - This parameter is filled for supporting OEM proprietary data exchanges. + * @return {OnSystemRequest} + */ + setRequestSubType (type) { + this.setParameter(OnSystemRequest.KEY_REQUEST_SUB_TYPE, type); + return this; + } + + /** + * @return {String} + */ + getRequestSubType () { + return this.getParameter(OnSystemRequest.KEY_REQUEST_SUB_TYPE); + } + + /** + * @param {String} url - Optional URL for HTTP requests. If blank, the binary data shall be forwarded to the app. If + * not blank, the binary data shall be forwarded to the url with a provided timeout in + * seconds. + * @return {OnSystemRequest} + */ + setUrl (url) { + this.setParameter(OnSystemRequest.KEY_URL, url); + return this; + } + + /** + * @return {String} + */ + getUrl () { + return this.getParameter(OnSystemRequest.KEY_URL); + } + + /** + * @param {Number} timeout - Optional timeout for HTTP requests Required if a URL is provided + * @return {OnSystemRequest} + */ + setTimeout (timeout) { + this.setParameter(OnSystemRequest.KEY_TIMEOUT, timeout); + return this; + } + + /** + * @return {Number} + */ + getTimeout () { + return this.getParameter(OnSystemRequest.KEY_TIMEOUT); + } + + /** + * @param {FileType} type - Optional file type (meant for HTTP file requests). + * @return {OnSystemRequest} + */ + setFileType (type) { + this.validateType(FileType, type); + this.setParameter(OnSystemRequest.KEY_FILE_TYPE, type); + return this; + } + + /** + * @return {FileType} + */ + getFileType () { + return this.getObject(FileType, OnSystemRequest.KEY_FILE_TYPE); + } + + /** + * @param {Number} offset - Optional offset in bytes for resuming partial data chunks + * @return {OnSystemRequest} + */ + setOffset (offset) { + this.setParameter(OnSystemRequest.KEY_OFFSET, offset); + return this; + } + + /** + * @return {Number} + */ + getOffset () { + return this.getParameter(OnSystemRequest.KEY_OFFSET); + } + + /** + * @param {Number} length - Optional length in bytes for resuming partial data chunks + * @return {OnSystemRequest} + */ + setLength (length) { + this.setParameter(OnSystemRequest.KEY_LENGTH, length); + return this; + } + + /** + * @return {Number} + */ + getLength () { + return this.getParameter(OnSystemRequest.KEY_LENGTH); + } +} + +OnSystemRequest.KEY_REQUEST_TYPE = 'requestType'; +OnSystemRequest.KEY_REQUEST_SUB_TYPE = 'requestSubType'; +OnSystemRequest.KEY_URL = 'url'; +OnSystemRequest.KEY_TIMEOUT = 'timeout'; +OnSystemRequest.KEY_FILE_TYPE = 'fileType'; +OnSystemRequest.KEY_OFFSET = 'offset'; +OnSystemRequest.KEY_LENGTH = 'length'; + +export { OnSystemRequest }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnTBTClientState.js b/lib/js/src/rpc/messages/OnTBTClientState.js new file mode 100644 index 00000000..4fc42898 --- /dev/null +++ b/lib/js/src/rpc/messages/OnTBTClientState.js @@ -0,0 +1,70 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { TBTState } from '../enums/TBTState.js'; +import { RpcNotification } from '../RpcNotification.js'; + +/** + * Provides applications with notifications specific to the current TBT client status on the module + */ +class OnTBTClientState extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnTBTClientState); + } + + /** + * @param {TBTState} state - Current State of TBT client + * @return {OnTBTClientState} + */ + setState (state) { + this.validateType(TBTState, state); + this.setParameter(OnTBTClientState.KEY_STATE, state); + return this; + } + + /** + * @return {TBTState} + */ + getState () { + return this.getObject(TBTState, OnTBTClientState.KEY_STATE); + } +} + +OnTBTClientState.KEY_STATE = 'state'; + +export { OnTBTClientState }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnTouchEvent.js b/lib/js/src/rpc/messages/OnTouchEvent.js new file mode 100644 index 00000000..5ed585ef --- /dev/null +++ b/lib/js/src/rpc/messages/OnTouchEvent.js @@ -0,0 +1,89 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { TouchEvent } from '../structs/TouchEvent.js'; +import { TouchType } from '../enums/TouchType.js'; +import { RpcNotification } from '../RpcNotification.js'; + +/** + * Notifies about touch events on the screen's prescribed area + */ +class OnTouchEvent extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnTouchEvent); + } + + /** + * @param {TouchType} type - The type of touch event. + * @return {OnTouchEvent} + */ + setType (type) { + this.validateType(TouchType, type); + this.setParameter(OnTouchEvent.KEY_TYPE, type); + return this; + } + + /** + * @return {TouchType} + */ + getType () { + return this.getObject(TouchType, OnTouchEvent.KEY_TYPE); + } + + /** + * @param {TouchEvent[]} event - List of all individual touches involved in this event. + * @return {OnTouchEvent} + */ + setEvent (event) { + this.validateType(TouchEvent, event, true); + this.setParameter(OnTouchEvent.KEY_EVENT, event); + return this; + } + + /** + * @return {TouchEvent[]} + */ + getEvent () { + return this.getObject(TouchEvent, OnTouchEvent.KEY_EVENT); + } +} + +OnTouchEvent.KEY_TYPE = 'type'; +OnTouchEvent.KEY_EVENT = 'event'; + +export { OnTouchEvent }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnVehicleData.js b/lib/js/src/rpc/messages/OnVehicleData.js new file mode 100644 index 00000000..40b769cc --- /dev/null +++ b/lib/js/src/rpc/messages/OnVehicleData.js @@ -0,0 +1,598 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { AirbagStatus } from '../structs/AirbagStatus.js'; +import { ClusterModeStatus } from '../structs/ClusterModeStatus.js'; +import { VehicleDataEventStatus } from '../enums/VehicleDataEventStatus.js'; +import { EmergencyEvent } from '../structs/EmergencyEvent.js'; +import { TurnSignal } from '../enums/TurnSignal.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { HeadLampStatus } from '../structs/HeadLampStatus.js'; +import { DeviceStatus } from '../structs/DeviceStatus.js'; +import { WiperStatus } from '../enums/WiperStatus.js'; +import { RpcNotification } from '../RpcNotification.js'; +import { ElectronicParkBrakeStatus } from '../enums/ElectronicParkBrakeStatus.js'; +import { MyKey } from '../structs/MyKey.js'; +import { GPSData } from '../structs/GPSData.js'; +import { PRNDL } from '../enums/PRNDL.js'; +import { FuelRange } from '../structs/FuelRange.js'; +import { ECallInfo } from '../structs/ECallInfo.js'; +import { BeltStatus } from '../structs/BeltStatus.js'; +import { ComponentVolumeStatus } from '../enums/ComponentVolumeStatus.js'; +import { BodyInformation } from '../structs/BodyInformation.js'; +import { TireStatus } from '../structs/TireStatus.js'; + +/** + * Callback for the periodic and non periodic vehicle data read function. + */ +class OnVehicleData extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnVehicleData); + } + + /** + * @param {GPSData} gps - See GPSData + * @return {OnVehicleData} + */ + setGps (gps) { + this.validateType(GPSData, gps); + this.setParameter(OnVehicleData.KEY_GPS, gps); + return this; + } + + /** + * @return {GPSData} + */ + getGps () { + return this.getObject(GPSData, OnVehicleData.KEY_GPS); + } + + /** + * @param {Number} speed - The vehicle speed in kilometers per hour + * @return {OnVehicleData} + */ + setSpeed (speed) { + this.setParameter(OnVehicleData.KEY_SPEED, speed); + return this; + } + + /** + * @return {Number} + */ + getSpeed () { + return this.getParameter(OnVehicleData.KEY_SPEED); + } + + /** + * @param {Number} rpm - The number of revolutions per minute of the engine + * @return {OnVehicleData} + */ + setRpm (rpm) { + this.setParameter(OnVehicleData.KEY_RPM, rpm); + return this; + } + + /** + * @return {Number} + */ + getRpm () { + return this.getParameter(OnVehicleData.KEY_RPM); + } + + /** + * @param {Number} level - The fuel level in the tank (percentage) + * @return {OnVehicleData} + */ + setFuelLevel (level) { + this.setParameter(OnVehicleData.KEY_FUEL_LEVEL, level); + return this; + } + + /** + * @return {Number} + */ + getFuelLevel () { + return this.getParameter(OnVehicleData.KEY_FUEL_LEVEL); + } + + /** + * @param {ComponentVolumeStatus} level_state - The fuel level state + * @return {OnVehicleData} + */ + setFuelLevel_State (level_state) { + this.validateType(ComponentVolumeStatus, level_state); + this.setParameter(OnVehicleData.KEY_FUEL_LEVEL_STATE, level_state); + return this; + } + + /** + * @return {ComponentVolumeStatus} + */ + getFuelLevel_State () { + return this.getObject(ComponentVolumeStatus, OnVehicleData.KEY_FUEL_LEVEL_STATE); + } + + /** + * @param {Number} consumption - The instantaneous fuel consumption in microlitres + * @return {OnVehicleData} + */ + setInstantFuelConsumption (consumption) { + this.setParameter(OnVehicleData.KEY_INSTANT_FUEL_CONSUMPTION, consumption); + return this; + } + + /** + * @return {Number} + */ + getInstantFuelConsumption () { + return this.getParameter(OnVehicleData.KEY_INSTANT_FUEL_CONSUMPTION); + } + + /** + * @param {FuelRange[]} range - The estimate range in KM the vehicle can travel based on fuel level and consumption + * @return {OnVehicleData} + */ + setFuelRange (range) { + this.validateType(FuelRange, range, true); + this.setParameter(OnVehicleData.KEY_FUEL_RANGE, range); + return this; + } + + /** + * @return {FuelRange[]} + */ + getFuelRange () { + return this.getObject(FuelRange, OnVehicleData.KEY_FUEL_RANGE); + } + + /** + * @param {Number} temperature - The external temperature in degrees celsius + * @return {OnVehicleData} + */ + setExternalTemperature (temperature) { + this.setParameter(OnVehicleData.KEY_EXTERNAL_TEMPERATURE, temperature); + return this; + } + + /** + * @return {Number} + */ + getExternalTemperature () { + return this.getParameter(OnVehicleData.KEY_EXTERNAL_TEMPERATURE); + } + + /** + * @param {TurnSignal} signal - See TurnSignal + * @return {OnVehicleData} + */ + setTurnSignal (signal) { + this.validateType(TurnSignal, signal); + this.setParameter(OnVehicleData.KEY_TURN_SIGNAL, signal); + return this; + } + + /** + * @return {TurnSignal} + */ + getTurnSignal () { + return this.getObject(TurnSignal, OnVehicleData.KEY_TURN_SIGNAL); + } + + /** + * @param {String} vin - Vehicle identification number. + * @return {OnVehicleData} + */ + setVin (vin) { + this.setParameter(OnVehicleData.KEY_VIN, vin); + return this; + } + + /** + * @return {String} + */ + getVin () { + return this.getParameter(OnVehicleData.KEY_VIN); + } + + /** + * @param {PRNDL} prndl - See PRNDL + * @return {OnVehicleData} + */ + setPrndl (prndl) { + this.validateType(PRNDL, prndl); + this.setParameter(OnVehicleData.KEY_PRNDL, prndl); + return this; + } + + /** + * @return {PRNDL} + */ + getPrndl () { + return this.getObject(PRNDL, OnVehicleData.KEY_PRNDL); + } + + /** + * @param {TireStatus} pressure - See TireStatus + * @return {OnVehicleData} + */ + setTirePressure (pressure) { + this.validateType(TireStatus, pressure); + this.setParameter(OnVehicleData.KEY_TIRE_PRESSURE, pressure); + return this; + } + + /** + * @return {TireStatus} + */ + getTirePressure () { + return this.getObject(TireStatus, OnVehicleData.KEY_TIRE_PRESSURE); + } + + /** + * @param {Number} odometer - Odometer in km + * @return {OnVehicleData} + */ + setOdometer (odometer) { + this.setParameter(OnVehicleData.KEY_ODOMETER, odometer); + return this; + } + + /** + * @return {Number} + */ + getOdometer () { + return this.getParameter(OnVehicleData.KEY_ODOMETER); + } + + /** + * @param {BeltStatus} status - The status of the seat belts + * @return {OnVehicleData} + */ + setBeltStatus (status) { + this.validateType(BeltStatus, status); + this.setParameter(OnVehicleData.KEY_BELT_STATUS, status); + return this; + } + + /** + * @return {BeltStatus} + */ + getBeltStatus () { + return this.getObject(BeltStatus, OnVehicleData.KEY_BELT_STATUS); + } + + /** + * @param {BodyInformation} information - The body information including power modes + * @return {OnVehicleData} + */ + setBodyInformation (information) { + this.validateType(BodyInformation, information); + this.setParameter(OnVehicleData.KEY_BODY_INFORMATION, information); + return this; + } + + /** + * @return {BodyInformation} + */ + getBodyInformation () { + return this.getObject(BodyInformation, OnVehicleData.KEY_BODY_INFORMATION); + } + + /** + * @param {DeviceStatus} status - The device status including signal and battery strength + * @return {OnVehicleData} + */ + setDeviceStatus (status) { + this.validateType(DeviceStatus, status); + this.setParameter(OnVehicleData.KEY_DEVICE_STATUS, status); + return this; + } + + /** + * @return {DeviceStatus} + */ + getDeviceStatus () { + return this.getObject(DeviceStatus, OnVehicleData.KEY_DEVICE_STATUS); + } + + /** + * @param {VehicleDataEventStatus} braking - The status of the brake pedal + * @return {OnVehicleData} + */ + setDriverBraking (braking) { + this.validateType(VehicleDataEventStatus, braking); + this.setParameter(OnVehicleData.KEY_DRIVER_BRAKING, braking); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getDriverBraking () { + return this.getObject(VehicleDataEventStatus, OnVehicleData.KEY_DRIVER_BRAKING); + } + + /** + * @param {WiperStatus} status - The status of the wipers + * @return {OnVehicleData} + */ + setWiperStatus (status) { + this.validateType(WiperStatus, status); + this.setParameter(OnVehicleData.KEY_WIPER_STATUS, status); + return this; + } + + /** + * @return {WiperStatus} + */ + getWiperStatus () { + return this.getObject(WiperStatus, OnVehicleData.KEY_WIPER_STATUS); + } + + /** + * @param {HeadLampStatus} status - Status of the head lamps + * @return {OnVehicleData} + */ + setHeadLampStatus (status) { + this.validateType(HeadLampStatus, status); + this.setParameter(OnVehicleData.KEY_HEAD_LAMP_STATUS, status); + return this; + } + + /** + * @return {HeadLampStatus} + */ + getHeadLampStatus () { + return this.getObject(HeadLampStatus, OnVehicleData.KEY_HEAD_LAMP_STATUS); + } + + /** + * @param {Number} torque - Torque value for engine (in Nm) on non-diesel variants + * @return {OnVehicleData} + */ + setEngineTorque (torque) { + this.setParameter(OnVehicleData.KEY_ENGINE_TORQUE, torque); + return this; + } + + /** + * @return {Number} + */ + getEngineTorque () { + return this.getParameter(OnVehicleData.KEY_ENGINE_TORQUE); + } + + /** + * @param {Number} position - Accelerator pedal position (percentage depressed) + * @return {OnVehicleData} + */ + setAccPedalPosition (position) { + this.setParameter(OnVehicleData.KEY_ACC_PEDAL_POSITION, position); + return this; + } + + /** + * @return {Number} + */ + getAccPedalPosition () { + return this.getParameter(OnVehicleData.KEY_ACC_PEDAL_POSITION); + } + + /** + * @param {Number} angle - Current angle of the steering wheel (in deg) + * @return {OnVehicleData} + */ + setSteeringWheelAngle (angle) { + this.setParameter(OnVehicleData.KEY_STEERING_WHEEL_ANGLE, angle); + return this; + } + + /** + * @return {Number} + */ + getSteeringWheelAngle () { + return this.getParameter(OnVehicleData.KEY_STEERING_WHEEL_ANGLE); + } + + /** + * @param {Number} life - The estimated percentage of remaining oil life of the engine. + * @return {OnVehicleData} + */ + setEngineOilLife (life) { + this.setParameter(OnVehicleData.KEY_ENGINE_OIL_LIFE, life); + return this; + } + + /** + * @return {Number} + */ + getEngineOilLife () { + return this.getParameter(OnVehicleData.KEY_ENGINE_OIL_LIFE); + } + + /** + * @param {ElectronicParkBrakeStatus} status - The status of the park brake as provided by Electric Park Brake (EPB) + * system. + * @return {OnVehicleData} + */ + setElectronicParkBrakeStatus (status) { + this.validateType(ElectronicParkBrakeStatus, status); + this.setParameter(OnVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS, status); + return this; + } + + /** + * @return {ElectronicParkBrakeStatus} + */ + getElectronicParkBrakeStatus () { + return this.getObject(ElectronicParkBrakeStatus, OnVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS); + } + + /** + * @param {String} id - Parameter used by cloud apps to identify a head unit + * @return {OnVehicleData} + */ + setCloudAppVehicleID (id) { + this.setParameter(OnVehicleData.KEY_CLOUD_APP_VEHICLE_ID, id); + return this; + } + + /** + * @return {String} + */ + getCloudAppVehicleID () { + return this.getParameter(OnVehicleData.KEY_CLOUD_APP_VEHICLE_ID); + } + + /** + * @param {ECallInfo} info - Emergency Call notification and confirmation data + * @return {OnVehicleData} + */ + setECallInfo (info) { + this.validateType(ECallInfo, info); + this.setParameter(OnVehicleData.KEY_E_CALL_INFO, info); + return this; + } + + /** + * @return {ECallInfo} + */ + getECallInfo () { + return this.getObject(ECallInfo, OnVehicleData.KEY_E_CALL_INFO); + } + + /** + * @param {AirbagStatus} status - The status of the air bags + * @return {OnVehicleData} + */ + setAirbagStatus (status) { + this.validateType(AirbagStatus, status); + this.setParameter(OnVehicleData.KEY_AIRBAG_STATUS, status); + return this; + } + + /** + * @return {AirbagStatus} + */ + getAirbagStatus () { + return this.getObject(AirbagStatus, OnVehicleData.KEY_AIRBAG_STATUS); + } + + /** + * @param {EmergencyEvent} event - Information related to an emergency event (and if it occurred) + * @return {OnVehicleData} + */ + setEmergencyEvent (event) { + this.validateType(EmergencyEvent, event); + this.setParameter(OnVehicleData.KEY_EMERGENCY_EVENT, event); + return this; + } + + /** + * @return {EmergencyEvent} + */ + getEmergencyEvent () { + return this.getObject(EmergencyEvent, OnVehicleData.KEY_EMERGENCY_EVENT); + } + + /** + * @param {ClusterModeStatus} status - The status modes of the cluster + * @return {OnVehicleData} + */ + setClusterModeStatus (status) { + this.validateType(ClusterModeStatus, status); + this.setParameter(OnVehicleData.KEY_CLUSTER_MODE_STATUS, status); + return this; + } + + /** + * @return {ClusterModeStatus} + */ + getClusterModeStatus () { + return this.getObject(ClusterModeStatus, OnVehicleData.KEY_CLUSTER_MODE_STATUS); + } + + /** + * @param {MyKey} key - Information related to the MyKey feature + * @return {OnVehicleData} + */ + setMyKey (key) { + this.validateType(MyKey, key); + this.setParameter(OnVehicleData.KEY_MY_KEY, key); + return this; + } + + /** + * @return {MyKey} + */ + getMyKey () { + return this.getObject(MyKey, OnVehicleData.KEY_MY_KEY); + } +} + +OnVehicleData.KEY_GPS = 'gps'; +OnVehicleData.KEY_SPEED = 'speed'; +OnVehicleData.KEY_RPM = 'rpm'; +OnVehicleData.KEY_FUEL_LEVEL = 'fuelLevel'; +OnVehicleData.KEY_FUEL_LEVEL_STATE = 'fuelLevel_State'; +OnVehicleData.KEY_INSTANT_FUEL_CONSUMPTION = 'instantFuelConsumption'; +OnVehicleData.KEY_FUEL_RANGE = 'fuelRange'; +OnVehicleData.KEY_EXTERNAL_TEMPERATURE = 'externalTemperature'; +OnVehicleData.KEY_TURN_SIGNAL = 'turnSignal'; +OnVehicleData.KEY_VIN = 'vin'; +OnVehicleData.KEY_PRNDL = 'prndl'; +OnVehicleData.KEY_TIRE_PRESSURE = 'tirePressure'; +OnVehicleData.KEY_ODOMETER = 'odometer'; +OnVehicleData.KEY_BELT_STATUS = 'beltStatus'; +OnVehicleData.KEY_BODY_INFORMATION = 'bodyInformation'; +OnVehicleData.KEY_DEVICE_STATUS = 'deviceStatus'; +OnVehicleData.KEY_DRIVER_BRAKING = 'driverBraking'; +OnVehicleData.KEY_WIPER_STATUS = 'wiperStatus'; +OnVehicleData.KEY_HEAD_LAMP_STATUS = 'headLampStatus'; +OnVehicleData.KEY_ENGINE_TORQUE = 'engineTorque'; +OnVehicleData.KEY_ACC_PEDAL_POSITION = 'accPedalPosition'; +OnVehicleData.KEY_STEERING_WHEEL_ANGLE = 'steeringWheelAngle'; +OnVehicleData.KEY_ENGINE_OIL_LIFE = 'engineOilLife'; +OnVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS = 'electronicParkBrakeStatus'; +OnVehicleData.KEY_CLOUD_APP_VEHICLE_ID = 'cloudAppVehicleID'; +OnVehicleData.KEY_E_CALL_INFO = 'eCallInfo'; +OnVehicleData.KEY_AIRBAG_STATUS = 'airbagStatus'; +OnVehicleData.KEY_EMERGENCY_EVENT = 'emergencyEvent'; +OnVehicleData.KEY_CLUSTER_MODE_STATUS = 'clusterModeStatus'; +OnVehicleData.KEY_MY_KEY = 'myKey'; + +export { OnVehicleData }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/OnWayPointChange.js b/lib/js/src/rpc/messages/OnWayPointChange.js new file mode 100644 index 00000000..68bc467c --- /dev/null +++ b/lib/js/src/rpc/messages/OnWayPointChange.js @@ -0,0 +1,70 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { LocationDetails } from '../structs/LocationDetails.js'; +import { RpcNotification } from '../RpcNotification.js'; + +/** + * Notification which provides the entire LocationDetails when there is a change to any waypoints or destination. + */ +class OnWayPointChange extends RpcNotification { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.OnWayPointChange); + } + + /** + * @param {LocationDetails[]} points - See LocationDetails + * @return {OnWayPointChange} + */ + setWayPoints (points) { + this.validateType(LocationDetails, points, true); + this.setParameter(OnWayPointChange.KEY_WAY_POINTS, points); + return this; + } + + /** + * @return {LocationDetails[]} + */ + getWayPoints () { + return this.getObject(LocationDetails, OnWayPointChange.KEY_WAY_POINTS); + } +} + +OnWayPointChange.KEY_WAY_POINTS = 'wayPoints'; + +export { OnWayPointChange }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/PerformAppServiceInteraction.js b/lib/js/src/rpc/messages/PerformAppServiceInteraction.js new file mode 100644 index 00000000..1eb6e73b --- /dev/null +++ b/lib/js/src/rpc/messages/PerformAppServiceInteraction.js @@ -0,0 +1,119 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +class PerformAppServiceInteraction extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.PerformAppServiceInteraction); + } + + /** + * @param {String} uri - Fully qualified URI based on a predetermined scheme provided by the app service. SDL makes + * no guarantee that this URI is correct. + * @return {PerformAppServiceInteraction} + */ + setServiceUri (uri) { + this.setParameter(PerformAppServiceInteraction.KEY_SERVICE_URI, uri); + return this; + } + + /** + * @return {String} + */ + getServiceUri () { + return this.getParameter(PerformAppServiceInteraction.KEY_SERVICE_URI); + } + + /** + * @param {String} id - The service ID that the app consumer wishes to send this URI. + * @return {PerformAppServiceInteraction} + */ + setServiceID (id) { + this.setParameter(PerformAppServiceInteraction.KEY_SERVICE_ID, id); + return this; + } + + /** + * @return {String} + */ + getServiceID () { + return this.getParameter(PerformAppServiceInteraction.KEY_SERVICE_ID); + } + + /** + * @param {String} app - This string is the appID of the app requesting the app service provider take the specific + * action. + * @return {PerformAppServiceInteraction} + */ + setOriginApp (app) { + this.setParameter(PerformAppServiceInteraction.KEY_ORIGIN_APP, app); + return this; + } + + /** + * @return {String} + */ + getOriginApp () { + return this.getParameter(PerformAppServiceInteraction.KEY_ORIGIN_APP); + } + + /** + * @param {Boolean} active - This flag signals the requesting consumer would like this service to become the active + * primary service of the destination's type. + * @return {PerformAppServiceInteraction} + */ + setRequestServiceActive (active) { + this.setParameter(PerformAppServiceInteraction.KEY_REQUEST_SERVICE_ACTIVE, active); + return this; + } + + /** + * @return {Boolean} + */ + getRequestServiceActive () { + return this.getParameter(PerformAppServiceInteraction.KEY_REQUEST_SERVICE_ACTIVE); + } +} + +PerformAppServiceInteraction.KEY_SERVICE_URI = 'serviceUri'; +PerformAppServiceInteraction.KEY_SERVICE_ID = 'serviceID'; +PerformAppServiceInteraction.KEY_ORIGIN_APP = 'originApp'; +PerformAppServiceInteraction.KEY_REQUEST_SERVICE_ACTIVE = 'requestServiceActive'; + +export { PerformAppServiceInteraction }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/PerformAppServiceInteractionResponse.js b/lib/js/src/rpc/messages/PerformAppServiceInteractionResponse.js new file mode 100644 index 00000000..3a1e8696 --- /dev/null +++ b/lib/js/src/rpc/messages/PerformAppServiceInteractionResponse.js @@ -0,0 +1,65 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class PerformAppServiceInteractionResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.PerformAppServiceInteraction); + } + + /** + * @param {String} result - The service can provide specific result strings to the consumer through this param. + * @return {PerformAppServiceInteractionResponse} + */ + setServiceSpecificResult (result) { + this.setParameter(PerformAppServiceInteractionResponse.KEY_SERVICE_SPECIFIC_RESULT, result); + return this; + } + + /** + * @return {String} + */ + getServiceSpecificResult () { + return this.getParameter(PerformAppServiceInteractionResponse.KEY_SERVICE_SPECIFIC_RESULT); + } +} + +PerformAppServiceInteractionResponse.KEY_SERVICE_SPECIFIC_RESULT = 'serviceSpecificResult'; + +export { PerformAppServiceInteractionResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/PerformAudioPassThru.js b/lib/js/src/rpc/messages/PerformAudioPassThru.js new file mode 100644 index 00000000..43cea934 --- /dev/null +++ b/lib/js/src/rpc/messages/PerformAudioPassThru.js @@ -0,0 +1,198 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { TTSChunk } from '../structs/TTSChunk.js'; +import { AudioType } from '../enums/AudioType.js'; +import { BitsPerSample } from '../enums/BitsPerSample.js'; +import { RpcRequest } from '../RpcRequest.js'; +import { SamplingRate } from '../enums/SamplingRate.js'; + +/** + * Starts audio pass thru session + */ +class PerformAudioPassThru extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.PerformAudioPassThru); + } + + /** + * @param {TTSChunk[]} prompt - The module will speak this prompt before opening the audio pass thru session. An + * array of text chunks of type TTSChunk. See TTSChunk. The array must have at least + * one item. If omitted, then no initial prompt is spoken. + * @return {PerformAudioPassThru} + */ + setInitialPrompt (prompt) { + this.validateType(TTSChunk, prompt, true); + this.setParameter(PerformAudioPassThru.KEY_INITIAL_PROMPT, prompt); + return this; + } + + /** + * @return {TTSChunk[]} + */ + getInitialPrompt () { + return this.getObject(TTSChunk, PerformAudioPassThru.KEY_INITIAL_PROMPT); + } + + /** + * @param {String} text1 - First line of text displayed during audio capture. + * @return {PerformAudioPassThru} + */ + setAudioPassThruDisplayText1 (text1) { + this.setParameter(PerformAudioPassThru.KEY_AUDIO_PASS_THRU_DISPLAY_TEXT_1, text1); + return this; + } + + /** + * @return {String} + */ + getAudioPassThruDisplayText1 () { + return this.getParameter(PerformAudioPassThru.KEY_AUDIO_PASS_THRU_DISPLAY_TEXT_1); + } + + /** + * @param {String} text2 - Second line of text displayed during audio capture. + * @return {PerformAudioPassThru} + */ + setAudioPassThruDisplayText2 (text2) { + this.setParameter(PerformAudioPassThru.KEY_AUDIO_PASS_THRU_DISPLAY_TEXT_2, text2); + return this; + } + + /** + * @return {String} + */ + getAudioPassThruDisplayText2 () { + return this.getParameter(PerformAudioPassThru.KEY_AUDIO_PASS_THRU_DISPLAY_TEXT_2); + } + + /** + * @param {SamplingRate} rate - This value shall be allowed at 8 kHz or 16 or 22 or 44 kHz. + * @return {PerformAudioPassThru} + */ + setSamplingRate (rate) { + this.validateType(SamplingRate, rate); + this.setParameter(PerformAudioPassThru.KEY_SAMPLING_RATE, rate); + return this; + } + + /** + * @return {SamplingRate} + */ + getSamplingRate () { + return this.getObject(SamplingRate, PerformAudioPassThru.KEY_SAMPLING_RATE); + } + + /** + * @param {Number} duration - The maximum duration of audio recording in milliseconds. + * @return {PerformAudioPassThru} + */ + setMaxDuration (duration) { + this.setParameter(PerformAudioPassThru.KEY_MAX_DURATION, duration); + return this; + } + + /** + * @return {Number} + */ + getMaxDuration () { + return this.getParameter(PerformAudioPassThru.KEY_MAX_DURATION); + } + + /** + * @param {BitsPerSample} sample - Specifies the quality the audio is recorded. Currently 8 bit or 16 bit. + * @return {PerformAudioPassThru} + */ + setBitsPerSample (sample) { + this.validateType(BitsPerSample, sample); + this.setParameter(PerformAudioPassThru.KEY_BITS_PER_SAMPLE, sample); + return this; + } + + /** + * @return {BitsPerSample} + */ + getBitsPerSample () { + return this.getObject(BitsPerSample, PerformAudioPassThru.KEY_BITS_PER_SAMPLE); + } + + /** + * @param {AudioType} type - Specifies the type of audio data being requested. + * @return {PerformAudioPassThru} + */ + setAudioType (type) { + this.validateType(AudioType, type); + this.setParameter(PerformAudioPassThru.KEY_AUDIO_TYPE, type); + return this; + } + + /** + * @return {AudioType} + */ + getAudioType () { + return this.getObject(AudioType, PerformAudioPassThru.KEY_AUDIO_TYPE); + } + + /** + * @param {Boolean} audio - Defines if the current audio source should be muted during the APT session. If not, the + * audio source will play without interruption. If omitted, the value is set to true. + * @return {PerformAudioPassThru} + */ + setMuteAudio (audio) { + this.setParameter(PerformAudioPassThru.KEY_MUTE_AUDIO, audio); + return this; + } + + /** + * @return {Boolean} + */ + getMuteAudio () { + return this.getParameter(PerformAudioPassThru.KEY_MUTE_AUDIO); + } +} + +PerformAudioPassThru.KEY_INITIAL_PROMPT = 'initialPrompt'; +PerformAudioPassThru.KEY_AUDIO_PASS_THRU_DISPLAY_TEXT_1 = 'audioPassThruDisplayText1'; +PerformAudioPassThru.KEY_AUDIO_PASS_THRU_DISPLAY_TEXT_2 = 'audioPassThruDisplayText2'; +PerformAudioPassThru.KEY_SAMPLING_RATE = 'samplingRate'; +PerformAudioPassThru.KEY_MAX_DURATION = 'maxDuration'; +PerformAudioPassThru.KEY_BITS_PER_SAMPLE = 'bitsPerSample'; +PerformAudioPassThru.KEY_AUDIO_TYPE = 'audioType'; +PerformAudioPassThru.KEY_MUTE_AUDIO = 'muteAudio'; + +export { PerformAudioPassThru }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/PerformAudioPassThruResponse.js b/lib/js/src/rpc/messages/PerformAudioPassThruResponse.js new file mode 100644 index 00000000..fa9f2c83 --- /dev/null +++ b/lib/js/src/rpc/messages/PerformAudioPassThruResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class PerformAudioPassThruResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.PerformAudioPassThru); + } +} + + +export { PerformAudioPassThruResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/PerformInteraction.js b/lib/js/src/rpc/messages/PerformInteraction.js new file mode 100644 index 00000000..87bf954e --- /dev/null +++ b/lib/js/src/rpc/messages/PerformInteraction.js @@ -0,0 +1,241 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { VrHelpItem } from '../structs/VrHelpItem.js'; +import { LayoutMode } from '../enums/LayoutMode.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { TTSChunk } from '../structs/TTSChunk.js'; +import { RpcRequest } from '../RpcRequest.js'; +import { InteractionMode } from '../enums/InteractionMode.js'; + +/** + * Triggers an interaction (e.g. "Permit GPS?" - Yes, no, Always Allow). + */ +class PerformInteraction extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.PerformInteraction); + } + + /** + * @param {String} text - Text to be displayed first. + * @return {PerformInteraction} + */ + setInitialText (text) { + this.setParameter(PerformInteraction.KEY_INITIAL_TEXT, text); + return this; + } + + /** + * @return {String} + */ + getInitialText () { + return this.getParameter(PerformInteraction.KEY_INITIAL_TEXT); + } + + /** + * @param {TTSChunk[]} prompt - This is the initial prompt spoken to the user at the start of an interaction. An + * array of text chunks of type TTSChunk. See TTSChunk. The array must have at least + * one item. + * @return {PerformInteraction} + */ + setInitialPrompt (prompt) { + this.validateType(TTSChunk, prompt, true); + this.setParameter(PerformInteraction.KEY_INITIAL_PROMPT, prompt); + return this; + } + + /** + * @return {TTSChunk[]} + */ + getInitialPrompt () { + return this.getObject(TTSChunk, PerformInteraction.KEY_INITIAL_PROMPT); + } + + /** + * @param {InteractionMode} mode - See InteractionMode. + * @return {PerformInteraction} + */ + setInteractionMode (mode) { + this.validateType(InteractionMode, mode); + this.setParameter(PerformInteraction.KEY_INTERACTION_MODE, mode); + return this; + } + + /** + * @return {InteractionMode} + */ + getInteractionMode () { + return this.getObject(InteractionMode, PerformInteraction.KEY_INTERACTION_MODE); + } + + /** + * @param {Number[]} list - List of interaction choice set IDs to use with an interaction. + * @return {PerformInteraction} + */ + setInteractionChoiceSetIDList (list) { + this.setParameter(PerformInteraction.KEY_INTERACTION_CHOICE_SET_IDLIST, list); + return this; + } + + /** + * @return {Number[]} + */ + getInteractionChoiceSetIDList () { + return this.getParameter(PerformInteraction.KEY_INTERACTION_CHOICE_SET_IDLIST); + } + + /** + * @param {TTSChunk[]} prompt - Help text. This is the spoken string when a user speaks "help" when the interaction + * is occurring. An array of text chunks of type TTSChunk. See TTSChunk. The array must + * have at least one item. + * @return {PerformInteraction} + */ + setHelpPrompt (prompt) { + this.validateType(TTSChunk, prompt, true); + this.setParameter(PerformInteraction.KEY_HELP_PROMPT, prompt); + return this; + } + + /** + * @return {TTSChunk[]} + */ + getHelpPrompt () { + return this.getObject(TTSChunk, PerformInteraction.KEY_HELP_PROMPT); + } + + /** + * @param {TTSChunk[]} prompt - Timeout text. This text is spoken when a VR interaction times out. An array of text + * chunks of type TTSChunk. See TTSChunk. The array must have at least one item. + * @return {PerformInteraction} + */ + setTimeoutPrompt (prompt) { + this.validateType(TTSChunk, prompt, true); + this.setParameter(PerformInteraction.KEY_TIMEOUT_PROMPT, prompt); + return this; + } + + /** + * @return {TTSChunk[]} + */ + getTimeoutPrompt () { + return this.getObject(TTSChunk, PerformInteraction.KEY_TIMEOUT_PROMPT); + } + + /** + * @param {Number} timeout - Timeout in milliseconds. If omitted a standard value of 10000 milliseconds is used. + * Applies only to the menu portion of the interaction. The VR timeout will be handled by + * the platform. + * @return {PerformInteraction} + */ + setTimeout (timeout) { + this.setParameter(PerformInteraction.KEY_TIMEOUT, timeout); + return this; + } + + /** + * @return {Number} + */ + getTimeout () { + return this.getParameter(PerformInteraction.KEY_TIMEOUT); + } + + /** + * @param {VrHelpItem[]} help - Ability to send suggested VR Help Items to display on-screen during Perform + * Interaction. If omitted on supported displays, the default generated list of + * suggested choices shall be displayed. + * @return {PerformInteraction} + */ + setVrHelp (help) { + this.validateType(VrHelpItem, help, true); + this.setParameter(PerformInteraction.KEY_VR_HELP, help); + return this; + } + + /** + * @return {VrHelpItem[]} + */ + getVrHelp () { + return this.getObject(VrHelpItem, PerformInteraction.KEY_VR_HELP); + } + + /** + * @param {LayoutMode} layout - See LayoutMode. + * @return {PerformInteraction} + */ + setInteractionLayout (layout) { + this.validateType(LayoutMode, layout); + this.setParameter(PerformInteraction.KEY_INTERACTION_LAYOUT, layout); + return this; + } + + /** + * @return {LayoutMode} + */ + getInteractionLayout () { + return this.getObject(LayoutMode, PerformInteraction.KEY_INTERACTION_LAYOUT); + } + + /** + * @param {Number} id - An ID for this specific PerformInteraction to allow cancellation through the + * `CancelInteraction` RPC. + * @return {PerformInteraction} + */ + setCancelID (id) { + this.setParameter(PerformInteraction.KEY_CANCEL_ID, id); + return this; + } + + /** + * @return {Number} + */ + getCancelID () { + return this.getParameter(PerformInteraction.KEY_CANCEL_ID); + } +} + +PerformInteraction.KEY_INITIAL_TEXT = 'initialText'; +PerformInteraction.KEY_INITIAL_PROMPT = 'initialPrompt'; +PerformInteraction.KEY_INTERACTION_MODE = 'interactionMode'; +PerformInteraction.KEY_INTERACTION_CHOICE_SET_IDLIST = 'interactionChoiceSetIDList'; +PerformInteraction.KEY_HELP_PROMPT = 'helpPrompt'; +PerformInteraction.KEY_TIMEOUT_PROMPT = 'timeoutPrompt'; +PerformInteraction.KEY_TIMEOUT = 'timeout'; +PerformInteraction.KEY_VR_HELP = 'vrHelp'; +PerformInteraction.KEY_INTERACTION_LAYOUT = 'interactionLayout'; +PerformInteraction.KEY_CANCEL_ID = 'cancelID'; + +export { PerformInteraction }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/PerformInteractionResponse.js b/lib/js/src/rpc/messages/PerformInteractionResponse.js new file mode 100644 index 00000000..d0655bb6 --- /dev/null +++ b/lib/js/src/rpc/messages/PerformInteractionResponse.js @@ -0,0 +1,103 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { TriggerSource } from '../enums/TriggerSource.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class PerformInteractionResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.PerformInteraction); + } + + /** + * @param {Number} id - ID of the choice that was selected in response to PerformInteraction. Only is valid if + * general result is "success:true". + * @return {PerformInteractionResponse} + */ + setChoiceID (id) { + this.setParameter(PerformInteractionResponse.KEY_CHOICE_ID, id); + return this; + } + + /** + * @return {Number} + */ + getChoiceID () { + return this.getParameter(PerformInteractionResponse.KEY_CHOICE_ID); + } + + /** + * @param {String} entry - Manually entered text selection, e.g. through keyboard Can be returned in lieu of + * choiceID, depending on trigger source + * @return {PerformInteractionResponse} + */ + setManualTextEntry (entry) { + this.setParameter(PerformInteractionResponse.KEY_MANUAL_TEXT_ENTRY, entry); + return this; + } + + /** + * @return {String} + */ + getManualTextEntry () { + return this.getParameter(PerformInteractionResponse.KEY_MANUAL_TEXT_ENTRY); + } + + /** + * @param {TriggerSource} source - See TriggerSource Only is valid if resultCode is SUCCESS. + * @return {PerformInteractionResponse} + */ + setTriggerSource (source) { + this.validateType(TriggerSource, source); + this.setParameter(PerformInteractionResponse.KEY_TRIGGER_SOURCE, source); + return this; + } + + /** + * @return {TriggerSource} + */ + getTriggerSource () { + return this.getObject(TriggerSource, PerformInteractionResponse.KEY_TRIGGER_SOURCE); + } +} + +PerformInteractionResponse.KEY_CHOICE_ID = 'choiceID'; +PerformInteractionResponse.KEY_MANUAL_TEXT_ENTRY = 'manualTextEntry'; +PerformInteractionResponse.KEY_TRIGGER_SOURCE = 'triggerSource'; + +export { PerformInteractionResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/PublishAppService.js b/lib/js/src/rpc/messages/PublishAppService.js new file mode 100644 index 00000000..005396b0 --- /dev/null +++ b/lib/js/src/rpc/messages/PublishAppService.js @@ -0,0 +1,72 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { AppServiceManifest } from '../structs/AppServiceManifest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Registers a service offered by this app on the module. Subsequent calls with the same service type will update the + * manifest for that service. + */ +class PublishAppService extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.PublishAppService); + } + + /** + * @param {AppServiceManifest} manifest - The manifest of the service that wishes to be published. If already + * published, the updated manifest for this service. + * @return {PublishAppService} + */ + setAppServiceManifest (manifest) { + this.validateType(AppServiceManifest, manifest); + this.setParameter(PublishAppService.KEY_APP_SERVICE_MANIFEST, manifest); + return this; + } + + /** + * @return {AppServiceManifest} + */ + getAppServiceManifest () { + return this.getObject(AppServiceManifest, PublishAppService.KEY_APP_SERVICE_MANIFEST); + } +} + +PublishAppService.KEY_APP_SERVICE_MANIFEST = 'appServiceManifest'; + +export { PublishAppService }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/PublishAppServiceResponse.js b/lib/js/src/rpc/messages/PublishAppServiceResponse.js new file mode 100644 index 00000000..149b244a --- /dev/null +++ b/lib/js/src/rpc/messages/PublishAppServiceResponse.js @@ -0,0 +1,72 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; +import { AppServiceRecord } from '../structs/AppServiceRecord.js'; + +/** + * Response to the request to register a service offered by this app on the module + */ +class PublishAppServiceResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.PublishAppService); + } + + /** + * @param {AppServiceRecord} record - If the request was successful, this object will be the current status of the + * service record for the published service. This will include the Core supplied + * service ID. + * @return {PublishAppServiceResponse} + */ + setAppServiceRecord (record) { + this.validateType(AppServiceRecord, record); + this.setParameter(PublishAppServiceResponse.KEY_APP_SERVICE_RECORD, record); + return this; + } + + /** + * @return {AppServiceRecord} + */ + getAppServiceRecord () { + return this.getObject(AppServiceRecord, PublishAppServiceResponse.KEY_APP_SERVICE_RECORD); + } +} + +PublishAppServiceResponse.KEY_APP_SERVICE_RECORD = 'appServiceRecord'; + +export { PublishAppServiceResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/PutFile.js b/lib/js/src/rpc/messages/PutFile.js index 3346995f..af234f0c 100644 --- a/lib/js/src/rpc/messages/PutFile.js +++ b/lib/js/src/rpc/messages/PutFile.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -34,10 +35,14 @@ import { RpcRequest } from '../RpcRequest.js'; import { FileType } from '../enums/FileType.js'; import { FunctionID } from '../enums/FunctionID.js'; +/** + * Used to push a binary data onto the module from a mobile device, such as icons and album art Not supported on first + * generation of SDL enabled modules. Binary data is in binary part of hybrid msg. + */ class PutFile extends RpcRequest { /** - * @constructor - */ + * @constructor + */ constructor (store) { super(store); this.setFunctionName(FunctionID.PutFile); @@ -46,133 +51,140 @@ class PutFile extends RpcRequest { // ------ Not part of the RPC spec itself ----- /** - * @param {Uint8Array} fileData - * @return {PutFile} - */ + * @param {Uint8Array} fileData + * @return {PutFile} + */ setFileData (fileData) { this.setBulkData(fileData); return this; } /** - * @return {Uint8Array} - */ + * @return {Uint8Array} + */ getFileData () { return this.getBulkData(); } // ----------------- END ----------------------- - /** - * @param {String} fileName - * @return {PutFile} - */ - setFileName (fileName) { - this.setParameter(PutFile.KEY_FILE_NAME, fileName); + * @param {String} name - File reference name. + * @return {PutFile} + */ + setFileName (name) { + this.setParameter(PutFile.KEY_FILE_NAME, name); return this; } /** - * @return {String} - */ + * @return {String} + */ getFileName () { return this.getParameter(PutFile.KEY_FILE_NAME); } /** - * @param {FileType} fileType - * @return {PutFile} - */ - setFileType (fileType) { - this.validateType(FileType, fileType); - this.setParameter(PutFile.KEY_FILE_TYPE, fileType); + * @param {FileType} type - Selected file type. + * @return {PutFile} + */ + setFileType (type) { + this.validateType(FileType, type); + this.setParameter(PutFile.KEY_FILE_TYPE, type); return this; } /** - * @return {FileType} - */ + * @return {FileType} + */ getFileType () { - return this.getObject(FileType, PutFile.KEY_MENU_PARAMS); + return this.getObject(FileType, PutFile.KEY_FILE_TYPE); } /** - * @param {Boolean} persistentFile - * @return {PutFile} - */ - setPersistentFile (persistentFile) { - this.setParameter(PutFile.KEY_PERSISTENT_FILE, persistentFile); + * @param {Boolean} file - Indicates if the file is meant to persist between sessions / ignition cycles. If set to + * TRUE, then the system will aim to persist this file through session / cycles. While files + * with this designation will have priority over others, they are subject to deletion by the + * system at any time. In the event of automatic deletion by the system, the app will + * receive a rejection and have to resend the file. If omitted, the value will be set to + * false. + * @return {PutFile} + */ + setPersistentFile (file) { + this.setParameter(PutFile.KEY_PERSISTENT_FILE, file); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getPersistentFile () { return this.getParameter(PutFile.KEY_PERSISTENT_FILE); } /** - * @param {Boolean} systemFile - * @return {PutFile} - */ - setSystemFile (systemFile) { - this.setParameter(PutFile.KEY_SYSTEM_FILE, systemFile); + * @param {Boolean} file - Indicates if the file is meant to be passed thru core to elsewhere on the system. If set + * to TRUE, then the system will instead pass the data thru as it arrives to a predetermined + * area outside of core. If omitted, the value will be set to false. + * @return {PutFile} + */ + setSystemFile (file) { + this.setParameter(PutFile.KEY_SYSTEM_FILE, file); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getSystemFile () { return this.getParameter(PutFile.KEY_SYSTEM_FILE); } /** - * @param {Number} offset - * @return {PutFile} - */ + * @param {Number} offset - Optional offset in bytes for resuming partial data chunks + * @return {PutFile} + */ setOffset (offset) { this.setParameter(PutFile.KEY_OFFSET, offset); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getOffset () { return this.getParameter(PutFile.KEY_OFFSET); } /** - * @param {Number} length - * @return {PutFile} - */ + * @param {Number} length - Optional length in bytes for resuming partial data chunks If offset is set to 0, then + * length is the total length of the file to be downloaded + * @return {PutFile} + */ setLength (length) { this.setParameter(PutFile.KEY_LENGTH, length); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getLength () { return this.getParameter(PutFile.KEY_LENGTH); } /** - * @param {Number} crc - * @return {PutFile} - */ - setCRC (crc) { + * @param {Number} crc - Additional CRC32 checksum to protect data integrity up to 512 Mbits + * @return {PutFile} + */ + setCrc (crc) { this.setParameter(PutFile.KEY_CRC, crc); return this; } /** - * @return {Number} - */ - getCRC () { + * @return {Number} + */ + getCrc () { return this.getParameter(PutFile.KEY_CRC); } } @@ -185,4 +197,4 @@ PutFile.KEY_OFFSET = 'offset'; PutFile.KEY_LENGTH = 'length'; PutFile.KEY_CRC = 'crc'; -export { PutFile }; +export { PutFile }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/PutFileResponse.js b/lib/js/src/rpc/messages/PutFileResponse.js index 25709690..18dd7cc7 100644 --- a/lib/js/src/rpc/messages/PutFileResponse.js +++ b/lib/js/src/rpc/messages/PutFileResponse.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -30,31 +31,35 @@ * POSSIBILITY OF SUCH DAMAGE. */ -import { RpcResponse } from '../RpcResponse.js'; import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; +/** + * Response is sent, when the file data was copied (success case). Or when an error occurred. Not supported on first + * generation SDL enabled vehicles. + */ class PutFileResponse extends RpcResponse { /** - * @constructor - */ + * @constructor + */ constructor (store) { super(store); this.setFunctionName(FunctionID.PutFile); } - /** - * @param {Number} spaceAvailable - * @return {PutFileResponse} - */ - setSpaceAvailable (spaceAvailable) { - this.setParameter(PutFileResponse.KEY_SPACE_AVAILABLE, spaceAvailable); + * @param {Number} available - Provides the total local space available in SDL Core for the registered app. If the + * transfer has systemFile enabled, then the value will be set to 0 automatically. + * @return {PutFileResponse} + */ + setSpaceAvailable (available) { + this.setParameter(PutFileResponse.KEY_SPACE_AVAILABLE, available); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getSpaceAvailable () { return this.getParameter(PutFileResponse.KEY_SPACE_AVAILABLE); } @@ -62,4 +67,4 @@ class PutFileResponse extends RpcResponse { PutFileResponse.KEY_SPACE_AVAILABLE = 'spaceAvailable'; -export { PutFileResponse }; +export { PutFileResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ReadDID.js b/lib/js/src/rpc/messages/ReadDID.js new file mode 100644 index 00000000..4a99669f --- /dev/null +++ b/lib/js/src/rpc/messages/ReadDID.js @@ -0,0 +1,85 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Non periodic vehicle data read request + */ +class ReadDID extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ReadDID); + } + + /** + * @param {Number} name - Name of ECU. + * @return {ReadDID} + */ + setEcuName (name) { + this.setParameter(ReadDID.KEY_ECU_NAME, name); + return this; + } + + /** + * @return {Number} + */ + getEcuName () { + return this.getParameter(ReadDID.KEY_ECU_NAME); + } + + /** + * @param {Number[]} location - Get raw data from vehicle data DID location(s) + * @return {ReadDID} + */ + setDidLocation (location) { + this.setParameter(ReadDID.KEY_DID_LOCATION, location); + return this; + } + + /** + * @return {Number[]} + */ + getDidLocation () { + return this.getParameter(ReadDID.KEY_DID_LOCATION); + } +} + +ReadDID.KEY_ECU_NAME = 'ecuName'; +ReadDID.KEY_DID_LOCATION = 'didLocation'; + +export { ReadDID }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ReadDIDResponse.js b/lib/js/src/rpc/messages/ReadDIDResponse.js new file mode 100644 index 00000000..b23b91a7 --- /dev/null +++ b/lib/js/src/rpc/messages/ReadDIDResponse.js @@ -0,0 +1,67 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { DIDResult } from '../structs/DIDResult.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class ReadDIDResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ReadDID); + } + + /** + * @param {DIDResult[]} result - Array of requested DID results (with data if available). + * @return {ReadDIDResponse} + */ + setDidResult (result) { + this.validateType(DIDResult, result, true); + this.setParameter(ReadDIDResponse.KEY_DID_RESULT, result); + return this; + } + + /** + * @return {DIDResult[]} + */ + getDidResult () { + return this.getObject(DIDResult, ReadDIDResponse.KEY_DID_RESULT); + } +} + +ReadDIDResponse.KEY_DID_RESULT = 'didResult'; + +export { ReadDIDResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/RegisterAppInterface.js b/lib/js/src/rpc/messages/RegisterAppInterface.js index 94b19446..1072a4d2 100644 --- a/lib/js/src/rpc/messages/RegisterAppInterface.js +++ b/lib/js/src/rpc/messages/RegisterAppInterface.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -30,336 +31,352 @@ * POSSIBILITY OF SUCH DAMAGE. */ -import { RpcRequest } from '../RpcRequest.js'; -import { SdlMsgVersion } from '../structs/SdlMsgVersion.js'; -import { TTSChunk } from '../structs/TTSChunk.js'; -import { DeviceInfo } from '../structs/DeviceInfo.js'; import { AppInfo } from '../structs/AppInfo.js'; import { TemplateColorScheme } from '../structs/TemplateColorScheme.js'; - -import { Language } from '../enums/Language.js'; -import { AppHMIType } from '../enums/AppHMIType.js'; import { FunctionID } from '../enums/FunctionID.js'; +import { TTSChunk } from '../structs/TTSChunk.js'; +import { SdlMsgVersion } from '../structs/SdlMsgVersion.js'; +import { AppHMIType } from '../enums/AppHMIType.js'; +import { Language } from '../enums/Language.js'; +import { RpcRequest } from '../RpcRequest.js'; +import { DeviceInfo } from '../structs/DeviceInfo.js'; +/** + * Establishes an interface with a mobile application. Before registerAppInterface no other commands will be + * accepted/executed. + */ class RegisterAppInterface extends RpcRequest { + /** + * @constructor + */ constructor (store) { super(store); this.setFunctionName(FunctionID.RegisterAppInterface); } /** - * @param {SdlMsgVersion} The max RPC Spec version supported by this library - * @return {RegisterAppInterface} - */ - setSdlMsgVersion (sdlMsgVersion) { - this.validateType(SdlMsgVersion, sdlMsgVersion); + * @param {String} fullAppId + * @return {RegisterAppInterface} + */ + setFullAppId (fullAppId) { + this.validateType(String, fullAppId); + + if (fullAppId !== null) { + fullAppId = fullAppId.toLowerCase(); + this.setParameter(RegisterAppInterface.KEY_FULL_APP_ID, fullAppId); + let appID; + if (fullAppId.length <= RegisterAppInterface.APP_ID_MAX_LENGTH) { + appID = fullAppId; + } else { + appID = fullAppId.replace('-', '').substring(0, RegisterAppInterface.APP_ID_MAX_LENGTH); + } + this._setAppId(appID); + } else { + this.setParameter(RegisterAppInterface.KEY_FULL_APP_ID, null); + } - this.setParameter(RegisterAppInterface.KEY_SDL_MSG_VERSION, sdlMsgVersion); return this; } /** - * @return {SdlMsgVersion} - */ - getSdlMsgVersion () { - return this.getObject(SdlMsgVersion, RegisterAppInterface.KEY_SDL_MSG_VERSION); + * @return {String} the app id + */ + getFullAppId () { + return this.getParameter(RegisterAppInterface.KEY_FULL_APP_ID); } + /** + * @param {String} appId - This method should not be accessed directly by developers. Only set the full ID and this + * param will be set. + * @return {RegisterAppInterface} + */ + _setAppId (appId) { + this.validateType(String, appId); + + this.setParameter(RegisterAppInterface.KEY_APP_ID, appId); + return this; + } /** - * @param {String} appName the name of the app that is registering - * @return {RegisterAppInterface} - */ - setAppName (appName) { - this.validateType(String, appName); + * @return {String} the app id + */ + getAppId () { + return this.getParameter(RegisterAppInterface.KEY_APP_ID); + } - this.setParameter(RegisterAppInterface.KEY_APP_NAME, appName); + /** + * @param {SdlMsgVersion} version - See SyncMsgVersion + * @return {RegisterAppInterface} + */ + setSdlMsgVersion (version) { + this.validateType(SdlMsgVersion, version); + this.setParameter(RegisterAppInterface.KEY_SDL_MSG_VERSION, version); return this; } /** - * @return {String} the app name - */ + * @return {SdlMsgVersion} + */ + getSdlMsgVersion () { + return this.getObject(SdlMsgVersion, RegisterAppInterface.KEY_SDL_MSG_VERSION); + } + + /** + * @param {String} name - The mobile application name, e.g. "My SDL App". Needs to be unique over all applications + * from the same device. May not be empty. May not start with a new line character. May not + * interfere with any name or synonym of previously registered applications from the same + * device and any predefined blacklist of words (global commands) Additional applications + * with the same name from the same device will be rejected. Only characters from char set + * @return {RegisterAppInterface} + */ + setAppName (name) { + this.setParameter(RegisterAppInterface.KEY_APP_NAME, name); + return this; + } + + /** + * @return {String} + */ getAppName () { return this.getParameter(RegisterAppInterface.KEY_APP_NAME); } /** - * @param {Array} ttsNames TTS string for VR recognition of the mobile application name, e.g. "My S D L App". - * Meant to overcome any failing on speech engine in properly pronouncing / understanding - * app name. Needs to be unique over all applications from the same device. May not be - * empty. May not start with a new line character. Only characters from char set - * @return {RegisterAppInterface} - */ - setTtsName (ttsNames) { - this.setParameter(RegisterAppInterface.KEY_TTS_NAME, ttsNames); + * @param {TTSChunk[]} name - TTS string for VR recognition of the mobile application name, e.g. "My S D L App". + * Meant to overcome any failing on speech engine in properly pronouncing / understanding + * app name. Needs to be unique over all applications from the same device. May not be + * empty. May not start with a new line character. Only characters from char set + * @return {RegisterAppInterface} + */ + setTtsName (name) { + this.validateType(TTSChunk, name, true); + this.setParameter(RegisterAppInterface.KEY_TTS_NAME, name); return this; } /** - * @return {Array} - */ + * @return {TTSChunk[]} + */ getTtsName () { return this.getObject(TTSChunk, RegisterAppInterface.KEY_TTS_NAME); } /** - * @param {String} ngnppName Provides an abbreviated version of the app name (if needed), that will be displayed - * on the NGN media screen. If not provided, the appName is used instead (and - * will be truncated if too long)Only characters from char set. - * @return {RegisterAppInterface} - */ - setNgnMediaScreenAppName (ngnppName) { - this.validateType(String, ngnppName); - - this.setParameter(RegisterAppInterface.KEY_NGN_MEDIA_SCREEN_APP_NAME, ngnppName); + * @param {String} name - Provides an abbreviated version of the app name (if needed), that will be displayed on the + * NGN media screen. If not provided, the appName is used instead (and will be truncated if + * too long) Only characters from char set + * @return {RegisterAppInterface} + */ + setNgnMediaScreenAppName (name) { + this.setParameter(RegisterAppInterface.KEY_NGN_MEDIA_SCREEN_APP_NAME, name); return this; } /** - * @return {String} an abbreviated version of the app name - */ + * @return {String} + */ getNgnMediaScreenAppName () { return this.getParameter(RegisterAppInterface.KEY_NGN_MEDIA_SCREEN_APP_NAME); } /** - * @param {Array} vrSynonyms Defines an additional voice recognition command. May not - * interfere with any app name of previously registered applications - * from the same device and any predefined blacklist of words (global - * commands)Only characters from char set - * @return {RegisterAppInterface} - */ - setVrSynonyms (vrSynonyms) { - this.setParameter(RegisterAppInterface.KEY_VR_SYNONYMS, vrSynonyms); + * @param {String[]} synonyms - Defines an additional voice recognition command. May not interfere with any app name + * of previously registered applications from the same device and any predefined + * blacklist of words (global commands) Only characters from char set + * @return {RegisterAppInterface} + */ + setVrSynonyms (synonyms) { + this.setParameter(RegisterAppInterface.KEY_VR_SYNONYMS, synonyms); return this; } /** - * @return {Array} - */ + * @return {String[]} + */ getVrSynonyms () { return this.getParameter(RegisterAppInterface.KEY_VR_SYNONYMS); } /** - * @param {Boolean} isMediaApplication Indicates if the application is a media or a non-media application. - * Only media applications will be able to stream audio to the module - * that is audible outside of the BT media source. - * @return {RegisterAppInterface} - */ - setIsMediaApplication (isMediaApplication) { - this.setParameter(RegisterAppInterface.KEY_IS_MEDIA_APPLICATION, isMediaApplication); + * @param {Boolean} application - Indicates if the application is a media or a non-media application. Only media + * applications will be able to stream audio to the module that is audible outside of + * the BT media source. + * @return {RegisterAppInterface} + */ + setIsMediaApplication (application) { + this.setParameter(RegisterAppInterface.KEY_IS_MEDIA_APPLICATION, application); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getIsMediaApplication () { return this.getParameter(RegisterAppInterface.KEY_IS_MEDIA_APPLICATION); } /** - * @param {Language} languageDesired - * @return {RegisterAppInterface} - */ - setLanguageDesired (languageDesired) { - this.validateType(Language, languageDesired); - - this.setParameter(RegisterAppInterface.KEY_LANGUAGE_DESIRED, languageDesired); + * @param {Language} desired - See Language Current app's expected VR+TTS language If there is a mismatch with the + * module, the app will be able to change this registration with changeRegistration + * prior to app being brought into focus. + * @return {RegisterAppInterface} + */ + setLanguageDesired (desired) { + this.validateType(Language, desired); + this.setParameter(RegisterAppInterface.KEY_LANGUAGE_DESIRED, desired); return this; } /** - * @return {Language} - */ + * @return {Language} + */ getLanguageDesired () { return this.getObject(Language, RegisterAppInterface.KEY_LANGUAGE_DESIRED); } - /** - * @param {Language} hmiDisplayLanguageDesired - * @return {RegisterAppInterface} - */ - setHmiDisplayLanguageDesired (hmiDisplayLanguageDesired) { - this.validateType(Language, hmiDisplayLanguageDesired); - - this.setParameter(RegisterAppInterface.KEY_HMI_DISPLAY_LANGUAGE_DESIRED, hmiDisplayLanguageDesired); + * @param {Language} desired - See Language Current app's expected display language If there is a mismatch with the + * module, the app will be able to change this registration with changeRegistration + * prior to app being brought into focus. + * @return {RegisterAppInterface} + */ + setHmiDisplayLanguageDesired (desired) { + this.validateType(Language, desired); + this.setParameter(RegisterAppInterface.KEY_HMI_DISPLAY_LANGUAGE_DESIRED, desired); return this; } /** - * @return {Language} - */ + * @return {Language} + */ getHmiDisplayLanguageDesired () { return this.getObject(Language, RegisterAppInterface.KEY_HMI_DISPLAY_LANGUAGE_DESIRED); } - /** - * @param {Array} appHMIType - * @return {RegisterAppInterface} - */ - setAppHmiType (appHMIType) { - // TODO make validate type accept arrays - // this.validateType(AppHMIType, appHMIType); - - this.setParameter(RegisterAppInterface.KEY_APP_HMI_TYPE, appHMIType); + * @param {AppHMIType[]} type - See AppHMIType List of all applicable app HMI types stating which HMI + * classifications to be given to the app. + * @return {RegisterAppInterface} + */ + setAppHMIType (type) { + this.validateType(AppHMIType, type, true); + this.setParameter(RegisterAppInterface.KEY_APP_HMI_TYPE, type); return this; } /** - * @return {Array} - */ - getAppHmiType () { + * @return {AppHMIType[]} + */ + getAppHMIType () { return this.getObject(AppHMIType, RegisterAppInterface.KEY_APP_HMI_TYPE); } /** - * @param {String} hashID the hash ID - * @return {RegisterAppInterface} - */ - setHashID (hashID) { - this.validateType(String, hashID); - - this.setParameter(RegisterAppInterface.KEY_HASH_ID, hashID); + * @param {String} id - ID used to uniquely identify current state of all app data that can persist through + * connection cycles (e.g. ignition cycles). This registered data (commands, submenus, choice + * sets, etc.) can be reestablished without needing to explicitly reregister each piece. If + * omitted, then the previous state of an app's commands, etc. will not be restored. When + * sending hashID, all RegisterAppInterface parameters should still be provided (e.g. ttsName, + * etc.). + * @return {RegisterAppInterface} + */ + setHashID (id) { + this.setParameter(RegisterAppInterface.KEY_HASH_ID, id); return this; } /** - * @return {String} the hash ID - */ + * @return {String} + */ getHashID () { return this.getParameter(RegisterAppInterface.KEY_HASH_ID); } /** - * @param {DeviceInfo} deviceInfo + * @param {DeviceInfo} info - See DeviceInfo. * @return {RegisterAppInterface} */ - setDeviceInfo (deviceInfo) { - this.validateType(DeviceInfo, deviceInfo); - - this.setParameter(RegisterAppInterface.KEY_DEVICE_INFO, deviceInfo); + setDeviceInfo (info) { + this.validateType(DeviceInfo, info); + this.setParameter(RegisterAppInterface.KEY_DEVICE_INFO, info); return this; } /** - * @return {DeviceInfo} - */ + * @return {DeviceInfo} + */ getDeviceInfo () { return this.getObject(DeviceInfo, RegisterAppInterface.KEY_DEVICE_INFO); } - /** - * @param {String} appName This method should not be accessed directly by developers. Only set the full ID and this param will be set. - * @return {RegisterAppInterface} - */ - _setAppId (appId) { - this.validateType(String, appId); - - this.setParameter(RegisterAppInterface.KEY_APP_ID, appId); - return this; - } - - /** - * @return {String} the app id - */ - getAppId () { - return this.getParameter(RegisterAppInterface.KEY_APP_ID); - } - - /** - * @param {String} fullAppId - * @return {RegisterAppInterface} - */ - setFullAppId (fullAppId) { - this.validateType(String, fullAppId); - - if (fullAppId !== null) { - fullAppId = fullAppId.toLowerCase(); - this.setParameter(RegisterAppInterface.KEY_FULL_APP_ID, fullAppId); - let appId; - if (fullAppId.length <= RegisterAppInterface.APP_ID_MAX_LENGTH) { - appId = fullAppId; - } else { - appId = fullAppId.replace('-', '').substring(0, RegisterAppInterface.APP_ID_MAX_LENGTH); - } - this._setAppId(appId); - } else { - this.setParameter(RegisterAppInterface.KEY_FULL_APP_ID, null); - } - + * @param {String} id - ID used to validate app with policy table entries + * @return {RegisterAppInterface} + */ + setFullAppID (id) { + this.setParameter(RegisterAppInterface.KEY_FULL_APP_ID, id); return this; } /** - * @return {String} the app id - */ - getFullAppId () { + * @return {String} + */ + getFullAppID () { return this.getParameter(RegisterAppInterface.KEY_FULL_APP_ID); } - /** - * @param {AppInfo} appInfo + * @param {AppInfo} info - See AppInfo. * @return {RegisterAppInterface} */ - setAppInfo (appInfo) { - this.validateType(AppInfo, appInfo); - - this.setParameter(RegisterAppInterface.KEY_APP_INFO, appInfo); + setAppInfo (info) { + this.validateType(AppInfo, info); + this.setParameter(RegisterAppInterface.KEY_APP_INFO, info); return this; } /** - * @return {AppInfo} - */ + * @return {AppInfo} + */ getAppInfo () { return this.getObject(AppInfo, RegisterAppInterface.KEY_APP_INFO); } /** - * @param {TemplateColorScheme} dayColorScheme + * @param {TemplateColorScheme} scheme - A color scheme for all display layout templates. * @return {RegisterAppInterface} */ - setDayColorScheme (dayColorScheme) { - this.validateType(TemplateColorScheme, dayColorScheme); - - this.setParameter(RegisterAppInterface.KEY_DAY_COLOR_SCHEME, dayColorScheme); + setDayColorScheme (scheme) { + this.validateType(TemplateColorScheme, scheme); + this.setParameter(RegisterAppInterface.KEY_DAY_COLOR_SCHEME, scheme); return this; } /** - * @return {TemplateColorScheme} - */ + * @return {TemplateColorScheme} + */ getDayColorScheme () { return this.getObject(TemplateColorScheme, RegisterAppInterface.KEY_DAY_COLOR_SCHEME); } /** - * @param {TemplateColorScheme} nightColorScheme + * @param {TemplateColorScheme} scheme - A color scheme for all display layout templates. * @return {RegisterAppInterface} */ - setNightColorScheme (nightColorScheme) { - this.validateType(TemplateColorScheme, nightColorScheme); - - this.setParameter(RegisterAppInterface.KEY_NIGHT_COLOR_SCHEME, nightColorScheme); + setNightColorScheme (scheme) { + this.validateType(TemplateColorScheme, scheme); + this.setParameter(RegisterAppInterface.KEY_NIGHT_COLOR_SCHEME, scheme); return this; } /** - * @return {TemplateColorScheme} - */ + * @return {TemplateColorScheme} + */ getNightColorScheme () { return this.getObject(TemplateColorScheme, RegisterAppInterface.KEY_NIGHT_COLOR_SCHEME); } } -RegisterAppInterface.KEY_SYNC_MSG_VERSION = 'syncMsgVersion'; RegisterAppInterface.KEY_SDL_MSG_VERSION = 'syncMsgVersion'; RegisterAppInterface.KEY_APP_NAME = 'appName'; RegisterAppInterface.KEY_TTS_NAME = 'ttsName'; @@ -378,4 +395,4 @@ RegisterAppInterface.KEY_DAY_COLOR_SCHEME = 'dayColorScheme'; RegisterAppInterface.KEY_NIGHT_COLOR_SCHEME = 'nightColorScheme'; RegisterAppInterface.APP_ID_MAX_LENGTH = 10; -export { RegisterAppInterface }; +export { RegisterAppInterface }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/RegisterAppInterfaceResponse.js b/lib/js/src/rpc/messages/RegisterAppInterfaceResponse.js index af742b39..3530ada6 100644 --- a/lib/js/src/rpc/messages/RegisterAppInterfaceResponse.js +++ b/lib/js/src/rpc/messages/RegisterAppInterfaceResponse.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -30,367 +31,358 @@ * POSSIBILITY OF SUCH DAMAGE. */ +import { SoftButtonCapabilities } from '../structs/SoftButtonCapabilities.js'; import { RpcResponse } from '../RpcResponse.js'; +import { FunctionID } from '../enums/FunctionID.js'; import { SdlMsgVersion } from '../structs/SdlMsgVersion.js'; -import { DisplayCapabilities } from '../structs/DisplayCapabilities.js'; -import { ButtonCapabilities } from '../structs/ButtonCapabilities.js'; -import { SoftButtonCapabilities } from '../structs/SoftButtonCapabilities.js'; +import { PrerecordedSpeech } from '../enums/PrerecordedSpeech.js'; +import { SpeechCapabilities } from '../enums/SpeechCapabilities.js'; import { PresetBankCapabilities } from '../structs/PresetBankCapabilities.js'; import { VehicleType } from '../structs/VehicleType.js'; -import { Language } from '../enums/Language.js'; import { HmiZoneCapabilities } from '../enums/HmiZoneCapabilities.js'; -import { SpeechCapabilities } from '../enums/SpeechCapabilities.js'; -import { PrerecordedSpeech } from '../enums/PrerecordedSpeech.js'; -import { FunctionID } from '../enums/FunctionID.js'; +import { DisplayCapabilities } from '../structs/DisplayCapabilities.js'; +import { Language } from '../enums/Language.js'; import { AudioPassThruCapabilities } from '../structs/AudioPassThruCapabilities.js'; import { VrCapabilities } from '../enums/VrCapabilities.js'; +import { ButtonCapabilities } from '../structs/ButtonCapabilities.js'; import { HMICapabilities } from '../structs/HMICapabilities.js'; +/** + * The response to registerAppInterface + */ class RegisterAppInterfaceResponse extends RpcResponse { + /** + * @constructor + */ constructor (store) { super(store); this.setFunctionName(FunctionID.RegisterAppInterface); } /** - * @param {SdlMsgVersion} The max RPC Spec version supported by this library - * @return {RegisterAppInterfaceResponse} - */ - setSdlMsgVersion (sdlMsgVersion) { - this.validateType(SdlMsgVersion, sdlMsgVersion); - - this.setParameter(RegisterAppInterfaceResponse.KEY_SDL_MSG_VERSION, sdlMsgVersion); + * @param {SdlMsgVersion} version - See SyncMsgVersion + * @return {RegisterAppInterfaceResponse} + */ + setSdlMsgVersion (version) { + this.validateType(SdlMsgVersion, version); + this.setParameter(RegisterAppInterfaceResponse.KEY_SDL_MSG_VERSION, version); return this; } /** - * @return {SdlMsgVersion} - */ + * @return {SdlMsgVersion} + */ getSdlMsgVersion () { return this.getObject(SdlMsgVersion, RegisterAppInterfaceResponse.KEY_SDL_MSG_VERSION); } /** - * @param {Language} language - * @return {RegisterAppInterfaceResponse} - */ + * @param {Language} language - The currently active VR+TTS language on the module. See "Language" for options. + * @return {RegisterAppInterfaceResponse} + */ setLanguage (language) { this.validateType(Language, language); - this.setParameter(RegisterAppInterfaceResponse.KEY_LANGUAGE, language); return this; } /** - * @return {Language} - */ + * @return {Language} + */ getLanguage () { return this.getObject(Language, RegisterAppInterfaceResponse.KEY_LANGUAGE); } - /** - * @param {Language} hmiDisplayLanguage - * @return {RegisterAppInterfaceResponse} - */ - setHmiDisplayLanguage (hmiDisplayLanguage) { - this.validateType(Language, hmiDisplayLanguage); - - this.setParameter(RegisterAppInterfaceResponse.KEY_HMI_DISPLAY_LANGUAGE, hmiDisplayLanguage); + * @param {Language} language - The currently active display language on the module. See "Language" for options. + * @return {RegisterAppInterfaceResponse} + */ + setHmiDisplayLanguage (language) { + this.validateType(Language, language); + this.setParameter(RegisterAppInterfaceResponse.KEY_HMI_DISPLAY_LANGUAGE, language); return this; } /** - * @return {Language} - */ + * @return {Language} + */ getHmiDisplayLanguage () { return this.getObject(Language, RegisterAppInterfaceResponse.KEY_HMI_DISPLAY_LANGUAGE); } /** - * @param {DisplayCapabilities} displayCapabilities - * @return {RegisterAppInterfaceResponse} - */ - setDisplayCapabilities (displayCapabilities) { - this.validateType(DisplayCapabilities, displayCapabilities); - - this.setParameter(RegisterAppInterfaceResponse.KEY_DISPLAY_CAPABILITIES, displayCapabilities); + * @param {DisplayCapabilities} capabilities - See DisplayCapabilities. This parameter is deprecated and replaced by + * SystemCapability using DISPLAYS. + * @return {RegisterAppInterfaceResponse} + */ + setDisplayCapabilities (capabilities) { + this.validateType(DisplayCapabilities, capabilities); + this.setParameter(RegisterAppInterfaceResponse.KEY_DISPLAY_CAPABILITIES, capabilities); return this; } /** - * @return {DisplayCapabilities} - */ + * @return {DisplayCapabilities} + */ getDisplayCapabilities () { return this.getObject(DisplayCapabilities, RegisterAppInterfaceResponse.KEY_DISPLAY_CAPABILITIES); } - /** - * @param {Array} buttonCapabilities - * @return {RegisterAppInterfaceResponse} - */ - setButtonCapabilities (buttonCapabilities) { - // TODO make this work with arrays - // this.validateType(Language, buttonCapabilities); - - this.setParameter(RegisterAppInterfaceResponse.KEY_BUTTON_CAPABILITIES, buttonCapabilities); + * @param {ButtonCapabilities[]} capabilities - See ButtonCapabilities. This parameter is deprecated and replaced by + * SystemCapability using DISPLAYS. + * @return {RegisterAppInterfaceResponse} + */ + setButtonCapabilities (capabilities) { + this.validateType(ButtonCapabilities, capabilities, true); + this.setParameter(RegisterAppInterfaceResponse.KEY_BUTTON_CAPABILITIES, capabilities); return this; } /** - * @return {Array} - */ + * @return {ButtonCapabilities[]} + */ getButtonCapabilities () { return this.getObject(ButtonCapabilities, RegisterAppInterfaceResponse.KEY_BUTTON_CAPABILITIES); } /** - * @param {Array} softButtonCapabilities - * @return {RegisterAppInterfaceResponse} - */ - setSoftButtonCapabilities (softButtonCapabilities) { - // TODO make this work with arrays - // this.validateType(SoftButtonCapabilities, softButtonCapabilities); - - this.setParameter(RegisterAppInterfaceResponse.KEY_SOFT_BUTTON_CAPABILITIES, softButtonCapabilities); + * @param {SoftButtonCapabilities[]} capabilities - If returned, the platform supports on-screen SoftButtons; see + * SoftButtonCapabilities. This parameter is deprecated and + * replaced by SystemCapability using DISPLAYS. + * @return {RegisterAppInterfaceResponse} + */ + setSoftButtonCapabilities (capabilities) { + this.validateType(SoftButtonCapabilities, capabilities, true); + this.setParameter(RegisterAppInterfaceResponse.KEY_SOFT_BUTTON_CAPABILITIES, capabilities); return this; } /** - * @return {Array} - */ + * @return {SoftButtonCapabilities[]} + */ getSoftButtonCapabilities () { return this.getObject(SoftButtonCapabilities, RegisterAppInterfaceResponse.KEY_SOFT_BUTTON_CAPABILITIES); } /** - * @param {PresetBankCapabilities} presetBankCapabilities - * @return {RegisterAppInterfaceResponse} - */ - setPresetBankCapabilities (presetBankCapabilities) { - this.validateType(PresetBankCapabilities, presetBankCapabilities); - - this.setParameter(RegisterAppInterfaceResponse.KEY_PRESET_BANK_CAPABILITIES, presetBankCapabilities); + * @param {PresetBankCapabilities} capabilities - If returned, the platform supports custom on-screen Presets; see + * PresetBankCapabilities. This parameter is deprecated and replaced + * by SystemCapability using DISPLAYS. + * @return {RegisterAppInterfaceResponse} + */ + setPresetBankCapabilities (capabilities) { + this.validateType(PresetBankCapabilities, capabilities); + this.setParameter(RegisterAppInterfaceResponse.KEY_PRESET_BANK_CAPABILITIES, capabilities); return this; } /** - * @return {PresetBankCapabilities} - */ + * @return {PresetBankCapabilities} + */ getPresetBankCapabilities () { return this.getObject(PresetBankCapabilities, RegisterAppInterfaceResponse.KEY_PRESET_BANK_CAPABILITIES); } /** - * @param {Array} hmiZoneCapabilities - * @return {RegisterAppInterfaceResponse} - */ - setHmiZoneCapabilities (hmiZoneCapabilities) { - // TODO make this work for arrays - // this.validateType(HmiZoneCapabilities, hmiZoneCapabilities); - - this.setParameter(RegisterAppInterfaceResponse.KEY_HMI_ZONE_CAPABILITIES, hmiZoneCapabilities); + * @param {HmiZoneCapabilities[]} capabilities - See HmiZoneCapabilities + * @return {RegisterAppInterfaceResponse} + */ + setHmiZoneCapabilities (capabilities) { + this.validateType(HmiZoneCapabilities, capabilities, true); + this.setParameter(RegisterAppInterfaceResponse.KEY_HMI_ZONE_CAPABILITIES, capabilities); return this; } /** - * @return {Array} - */ + * @return {HmiZoneCapabilities[]} + */ getHmiZoneCapabilities () { return this.getObject(HmiZoneCapabilities, RegisterAppInterfaceResponse.KEY_HMI_ZONE_CAPABILITIES); } /** - * @param {Array} speechCapabilities - * @return {RegisterAppInterfaceResponse} - */ - setSpeechCapabilities (speechCapabilities) { - // TODO make this work for arrays - // this.validateType(SpeechCapabilities, speechCapabilities); - - this.setParameter(RegisterAppInterfaceResponse.KEY_SPEECH_CAPABILITIES, speechCapabilities); + * @param {SpeechCapabilities[]} capabilities - See SpeechCapabilities + * @return {RegisterAppInterfaceResponse} + */ + setSpeechCapabilities (capabilities) { + this.validateType(SpeechCapabilities, capabilities, true); + this.setParameter(RegisterAppInterfaceResponse.KEY_SPEECH_CAPABILITIES, capabilities); return this; } /** - * @return {Array} - */ + * @return {SpeechCapabilities[]} + */ getSpeechCapabilities () { return this.getObject(SpeechCapabilities, RegisterAppInterfaceResponse.KEY_SPEECH_CAPABILITIES); } /** - * @param {Array} speechCapabilities - * @return {RegisterAppInterfaceResponse} - */ - setPrerecordedSpeech (speechCapabilities) { - // TODO make this work for arrays - // this.validateType(PrerecordedSpeech, speechCapabilities); - - this.setParameter(RegisterAppInterfaceResponse.KEY_PRERECORDED_SPEECH, speechCapabilities); + * @param {PrerecordedSpeech[]} speech - See PrerecordedSpeech + * @return {RegisterAppInterfaceResponse} + */ + setPrerecordedSpeech (speech) { + this.validateType(PrerecordedSpeech, speech, true); + this.setParameter(RegisterAppInterfaceResponse.KEY_PRERECORDED_SPEECH, speech); return this; } /** - * @return {Array} - */ + * @return {PrerecordedSpeech[]} + */ getPrerecordedSpeech () { return this.getObject(PrerecordedSpeech, RegisterAppInterfaceResponse.KEY_PRERECORDED_SPEECH); } /** - * @param {Array} vrCapabilities - * @return {RegisterAppInterfaceResponse} - */ - setVrCapabilities (vrCapabilities) { - // TODO make this work for arrays - // this.validateType(VrCapabilities, vrCapabilities); - - this.setParameter(RegisterAppInterfaceResponse.KEY_VR_CAPABILITIES, vrCapabilities); + * @param {VrCapabilities[]} capabilities - See VrCapabilities + * @return {RegisterAppInterfaceResponse} + */ + setVrCapabilities (capabilities) { + this.validateType(VrCapabilities, capabilities, true); + this.setParameter(RegisterAppInterfaceResponse.KEY_VR_CAPABILITIES, capabilities); return this; } /** - * @return {Array} - */ + * @return {VrCapabilities[]} + */ getVrCapabilities () { return this.getObject(VrCapabilities, RegisterAppInterfaceResponse.KEY_VR_CAPABILITIES); } /** - * @param {Array} audioPassThruCapabilities - * @return {RegisterAppInterfaceResponse} - */ - setAudioPassThruCapabilities (audioPassThruCapabilities) { - // TODO make this work for arrays - // this.validateType(AudioPassThruCapabilities, audioPassThruCapabilities); - - this.setParameter(RegisterAppInterfaceResponse.KEY_AUDIO_PASS_THRU_CAPABILITIES, audioPassThruCapabilities); + * @param {AudioPassThruCapabilities[]} capabilities - See AudioPassThruCapability + * @return {RegisterAppInterfaceResponse} + */ + setAudioPassThruCapabilities (capabilities) { + this.validateType(AudioPassThruCapabilities, capabilities, true); + this.setParameter(RegisterAppInterfaceResponse.KEY_AUDIO_PASS_THRU_CAPABILITIES, capabilities); return this; } /** - * @return {Array} - */ + * @return {AudioPassThruCapabilities[]} + */ getAudioPassThruCapabilities () { return this.getObject(AudioPassThruCapabilities, RegisterAppInterfaceResponse.KEY_AUDIO_PASS_THRU_CAPABILITIES); } /** - * @param {AudioPassThruCapabilities} pcmStreamCapabilities - * @return {RegisterAppInterfaceResponse} - */ - setPcmStreamCapabilities (pcmStreamCapabilities) { - this.validateType(AudioPassThruCapabilities, pcmStreamCapabilities); - - this.setParameter(RegisterAppInterfaceResponse.KEY_PCM_STREAM_CAPABILITIES, pcmStreamCapabilities); + * @param {AudioPassThruCapabilities} capabilities - See AudioPassThruCapability + * @return {RegisterAppInterfaceResponse} + */ + setPcmStreamCapabilities (capabilities) { + this.validateType(AudioPassThruCapabilities, capabilities); + this.setParameter(RegisterAppInterfaceResponse.KEY_PCM_STREAM_CAPABILITIES, capabilities); return this; } /** - * @return {AudioPassThruCapabilities} - */ + * @return {AudioPassThruCapabilities} + */ getPcmStreamCapabilities () { return this.getObject(AudioPassThruCapabilities, RegisterAppInterfaceResponse.KEY_PCM_STREAM_CAPABILITIES); } /** - * @param {VehicleType} vehicleType - * @return {RegisterAppInterfaceResponse} - */ - setVehicleType (vehicleType) { - this.validateType(VehicleType, vehicleType); - - this.setParameter(RegisterAppInterfaceResponse.KEY_VEHICLE_TYPE, vehicleType); + * @param {VehicleType} type - Specifies the vehicle's type. See VehicleType. + * @return {RegisterAppInterfaceResponse} + */ + setVehicleType (type) { + this.validateType(VehicleType, type); + this.setParameter(RegisterAppInterfaceResponse.KEY_VEHICLE_TYPE, type); return this; } /** - * @return {VehicleType} - */ + * @return {VehicleType} + */ getVehicleType () { return this.getObject(VehicleType, RegisterAppInterfaceResponse.KEY_VEHICLE_TYPE); } /** - * @param {Number} supportedDiagModes - * @return {RegisterAppInterfaceResponse} - */ - setSupportedDiagModes (supportedDiagModes) { - this.setParameter(RegisterAppInterfaceResponse.KEY_SUPPORTED_DIAG_MODE, supportedDiagModes); + * @param {Number[]} modes - Specifies the white-list of supported diagnostic modes (0x00-0xFF) capable for + * DiagnosticMessage requests. If a mode outside this list is requested, it will be + * rejected. + * @return {RegisterAppInterfaceResponse} + */ + setSupportedDiagModes (modes) { + this.setParameter(RegisterAppInterfaceResponse.KEY_SUPPORTED_DIAG_MODES, modes); return this; } /** - * @return {Number} - */ + * @return {Number[]} + */ getSupportedDiagModes () { - return this.getParameter(RegisterAppInterfaceResponse.KEY_SUPPORTED_DIAG_MODE); + return this.getParameter(RegisterAppInterfaceResponse.KEY_SUPPORTED_DIAG_MODES); } /** - * @param {HMICapabilities} hmiCapabilities - * @return {RegisterAppInterfaceResponse} - */ - setHMICapabilities (hmiCapabilities) { - this.validateType(HMICapabilities, hmiCapabilities); - - this.setParameter(RegisterAppInterfaceResponse.KEY_HMI_CAPABILITIES, hmiCapabilities); + * @param {HMICapabilities} capabilities - Specifies the HMI's capabilities. See HMICapabilities. + * @return {RegisterAppInterfaceResponse} + */ + setHmiCapabilities (capabilities) { + this.validateType(HMICapabilities, capabilities); + this.setParameter(RegisterAppInterfaceResponse.KEY_HMI_CAPABILITIES, capabilities); return this; } /** - * @return {HMICapabilities} - */ - getHMICapabilities () { + * @return {HMICapabilities} + */ + getHmiCapabilities () { return this.getObject(HMICapabilities, RegisterAppInterfaceResponse.KEY_HMI_CAPABILITIES); } /** - * @param {String} sdlVersion - * @return {RegisterAppInterfaceResponse} - */ - setSdlVersion (sdlVersion) { - this.setParameter(RegisterAppInterfaceResponse.KEY_SDL_VERSION, sdlVersion); + * @param {String} version - The SmartDeviceLink version. + * @return {RegisterAppInterfaceResponse} + */ + setSdlVersion (version) { + this.setParameter(RegisterAppInterfaceResponse.KEY_SDL_VERSION, version); return this; } /** - * @return {String} - */ + * @return {String} + */ getSdlVersion () { return this.getParameter(RegisterAppInterfaceResponse.KEY_SDL_VERSION); } /** - * @param {String} systemSoftwareVersion - * @return {RegisterAppInterfaceResponse} - */ - setSystemSoftwareVersion (systemSoftwareVersion) { - this.setParameter(RegisterAppInterfaceResponse.KEY_SYSTEM_SOFTWARE_VERSION, systemSoftwareVersion); + * @param {String} version - The software version of the system that implements the SmartDeviceLink core. + * @return {RegisterAppInterfaceResponse} + */ + setSystemSoftwareVersion (version) { + this.setParameter(RegisterAppInterfaceResponse.KEY_SYSTEM_SOFTWARE_VERSION, version); return this; } /** - * @return {String} - */ + * @return {String} + */ getSystemSoftwareVersion () { return this.getParameter(RegisterAppInterfaceResponse.KEY_SYSTEM_SOFTWARE_VERSION); } /** - * @param {Boolean} iconResumed - * @return {RegisterAppInterfaceResponse} - */ - setIconResumed (iconResumed) { - this.setParameter(RegisterAppInterfaceResponse.KEY_ICON_RESUMED, iconResumed); + * @param {Boolean} resumed - Existence of apps icon at system. If true, apps icon was resumed at system. If false, + * apps icon is not resumed at system + * @return {RegisterAppInterfaceResponse} + */ + setIconResumed (resumed) { + this.setParameter(RegisterAppInterfaceResponse.KEY_ICON_RESUMED, resumed); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getIconResumed () { return this.getParameter(RegisterAppInterfaceResponse.KEY_ICON_RESUMED); } @@ -410,10 +402,10 @@ RegisterAppInterfaceResponse.KEY_VR_CAPABILITIES = 'vrCapabilities'; RegisterAppInterfaceResponse.KEY_AUDIO_PASS_THRU_CAPABILITIES = 'audioPassThruCapabilities'; RegisterAppInterfaceResponse.KEY_PCM_STREAM_CAPABILITIES = 'pcmStreamCapabilities'; RegisterAppInterfaceResponse.KEY_VEHICLE_TYPE = 'vehicleType'; -RegisterAppInterfaceResponse.KEY_SUPPORTED_DIAG_MODE = 'supportedDiagModes'; +RegisterAppInterfaceResponse.KEY_SUPPORTED_DIAG_MODES = 'supportedDiagModes'; RegisterAppInterfaceResponse.KEY_HMI_CAPABILITIES = 'hmiCapabilities'; RegisterAppInterfaceResponse.KEY_SDL_VERSION = 'sdlVersion'; RegisterAppInterfaceResponse.KEY_SYSTEM_SOFTWARE_VERSION = 'systemSoftwareVersion'; RegisterAppInterfaceResponse.KEY_ICON_RESUMED = 'iconResumed'; -export { RegisterAppInterfaceResponse }; +export { RegisterAppInterfaceResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ReleaseInteriorVehicleDataModule.js b/lib/js/src/rpc/messages/ReleaseInteriorVehicleDataModule.js new file mode 100644 index 00000000..98daee7c --- /dev/null +++ b/lib/js/src/rpc/messages/ReleaseInteriorVehicleDataModule.js @@ -0,0 +1,84 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { ModuleType } from '../enums/ModuleType.js'; +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +class ReleaseInteriorVehicleDataModule extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ReleaseInteriorVehicleDataModule); + } + + /** + * @param {ModuleType} type + * @return {ReleaseInteriorVehicleDataModule} + */ + setModuleType (type) { + this.validateType(ModuleType, type); + this.setParameter(ReleaseInteriorVehicleDataModule.KEY_MODULE_TYPE, type); + return this; + } + + /** + * @return {ModuleType} + */ + getModuleType () { + return this.getObject(ModuleType, ReleaseInteriorVehicleDataModule.KEY_MODULE_TYPE); + } + + /** + * @param {String} id - Id of a module, published by System Capability. + * @return {ReleaseInteriorVehicleDataModule} + */ + setModuleId (id) { + this.setParameter(ReleaseInteriorVehicleDataModule.KEY_MODULE_ID, id); + return this; + } + + /** + * @return {String} + */ + getModuleId () { + return this.getParameter(ReleaseInteriorVehicleDataModule.KEY_MODULE_ID); + } +} + +ReleaseInteriorVehicleDataModule.KEY_MODULE_TYPE = 'moduleType'; +ReleaseInteriorVehicleDataModule.KEY_MODULE_ID = 'moduleId'; + +export { ReleaseInteriorVehicleDataModule }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ReleaseInteriorVehicleDataModuleResponse.js b/lib/js/src/rpc/messages/ReleaseInteriorVehicleDataModuleResponse.js new file mode 100644 index 00000000..b01a77b6 --- /dev/null +++ b/lib/js/src/rpc/messages/ReleaseInteriorVehicleDataModuleResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class ReleaseInteriorVehicleDataModuleResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ReleaseInteriorVehicleDataModule); + } +} + + +export { ReleaseInteriorVehicleDataModuleResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ResetGlobalProperties.js b/lib/js/src/rpc/messages/ResetGlobalProperties.js new file mode 100644 index 00000000..4e38a2e8 --- /dev/null +++ b/lib/js/src/rpc/messages/ResetGlobalProperties.js @@ -0,0 +1,72 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { GlobalProperty } from '../enums/GlobalProperty.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Allows resetting global properties. + */ +class ResetGlobalProperties extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ResetGlobalProperties); + } + + /** + * @param {GlobalProperty[]} properties - Contains the names of all global properties (like timeoutPrompt) that + * should be unset. Resetting means, that they have the same value as at + * start up (default) + * @return {ResetGlobalProperties} + */ + setProperties (properties) { + this.validateType(GlobalProperty, properties, true); + this.setParameter(ResetGlobalProperties.KEY_PROPERTIES, properties); + return this; + } + + /** + * @return {GlobalProperty[]} + */ + getProperties () { + return this.getObject(GlobalProperty, ResetGlobalProperties.KEY_PROPERTIES); + } +} + +ResetGlobalProperties.KEY_PROPERTIES = 'properties'; + +export { ResetGlobalProperties }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ResetGlobalPropertiesResponse.js b/lib/js/src/rpc/messages/ResetGlobalPropertiesResponse.js new file mode 100644 index 00000000..969b1abb --- /dev/null +++ b/lib/js/src/rpc/messages/ResetGlobalPropertiesResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class ResetGlobalPropertiesResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ResetGlobalProperties); + } +} + + +export { ResetGlobalPropertiesResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ScrollableMessage.js b/lib/js/src/rpc/messages/ScrollableMessage.js new file mode 100644 index 00000000..185306bf --- /dev/null +++ b/lib/js/src/rpc/messages/ScrollableMessage.js @@ -0,0 +1,125 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { SoftButton } from '../structs/SoftButton.js'; + +/** + * Creates a full screen overlay containing a large block of formatted text that can be scrolled with up to 8 + * SoftButtons defined + */ +class ScrollableMessage extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ScrollableMessage); + } + + /** + * @param {String} body - Body of text that can include newlines and tabs. + * @return {ScrollableMessage} + */ + setScrollableMessageBody (body) { + this.setParameter(ScrollableMessage.KEY_SCROLLABLE_MESSAGE_BODY, body); + return this; + } + + /** + * @return {String} + */ + getScrollableMessageBody () { + return this.getParameter(ScrollableMessage.KEY_SCROLLABLE_MESSAGE_BODY); + } + + /** + * @param {Number} timeout - App defined timeout. Indicates how long of a timeout from the last action (i.e. + * scrolling message resets timeout). + * @return {ScrollableMessage} + */ + setTimeout (timeout) { + this.setParameter(ScrollableMessage.KEY_TIMEOUT, timeout); + return this; + } + + /** + * @return {Number} + */ + getTimeout () { + return this.getParameter(ScrollableMessage.KEY_TIMEOUT); + } + + /** + * @param {SoftButton[]} buttons - App defined SoftButtons. If omitted on supported displays, only the system + * defined "Close" SoftButton will be displayed. + * @return {ScrollableMessage} + */ + setSoftButtons (buttons) { + this.validateType(SoftButton, buttons, true); + this.setParameter(ScrollableMessage.KEY_SOFT_BUTTONS, buttons); + return this; + } + + /** + * @return {SoftButton[]} + */ + getSoftButtons () { + return this.getObject(SoftButton, ScrollableMessage.KEY_SOFT_BUTTONS); + } + + /** + * @param {Number} id - An ID for this specific ScrollableMessage to allow cancellation through the + * `CancelInteraction` RPC. + * @return {ScrollableMessage} + */ + setCancelID (id) { + this.setParameter(ScrollableMessage.KEY_CANCEL_ID, id); + return this; + } + + /** + * @return {Number} + */ + getCancelID () { + return this.getParameter(ScrollableMessage.KEY_CANCEL_ID); + } +} + +ScrollableMessage.KEY_SCROLLABLE_MESSAGE_BODY = 'scrollableMessageBody'; +ScrollableMessage.KEY_TIMEOUT = 'timeout'; +ScrollableMessage.KEY_SOFT_BUTTONS = 'softButtons'; +ScrollableMessage.KEY_CANCEL_ID = 'cancelID'; + +export { ScrollableMessage }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ScrollableMessageResponse.js b/lib/js/src/rpc/messages/ScrollableMessageResponse.js new file mode 100644 index 00000000..375f76b8 --- /dev/null +++ b/lib/js/src/rpc/messages/ScrollableMessageResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class ScrollableMessageResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ScrollableMessage); + } +} + + +export { ScrollableMessageResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SendHapticData.js b/lib/js/src/rpc/messages/SendHapticData.js new file mode 100644 index 00000000..f045bfc1 --- /dev/null +++ b/lib/js/src/rpc/messages/SendHapticData.js @@ -0,0 +1,75 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { HapticRect } from '../structs/HapticRect.js'; + +/** + * Send the spatial data gathered from SDLCarWindow or VirtualDisplayEncoder to the HMI. This data will be utilized by + * the HMI to determine how and when haptic events should occur + */ +class SendHapticData extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SendHapticData); + } + + /** + * @param {HapticRect[]} data - Array of spatial data structures that represent the locations of all user controls + * present on the HMI. This data should be updated if/when the application presents a + * new screen. When a request is sent, if successful, it will replace all spatial data + * previously sent through RPC. If an empty array is sent, the existing spatial data + * will be cleared + * @return {SendHapticData} + */ + setHapticRectData (data) { + this.validateType(HapticRect, data, true); + this.setParameter(SendHapticData.KEY_HAPTIC_RECT_DATA, data); + return this; + } + + /** + * @return {HapticRect[]} + */ + getHapticRectData () { + return this.getObject(HapticRect, SendHapticData.KEY_HAPTIC_RECT_DATA); + } +} + +SendHapticData.KEY_HAPTIC_RECT_DATA = 'hapticRectData'; + +export { SendHapticData }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SendHapticDataResponse.js b/lib/js/src/rpc/messages/SendHapticDataResponse.js new file mode 100644 index 00000000..39c979c7 --- /dev/null +++ b/lib/js/src/rpc/messages/SendHapticDataResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class SendHapticDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SendHapticData); + } +} + + +export { SendHapticDataResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SendLocation.js b/lib/js/src/rpc/messages/SendLocation.js new file mode 100644 index 00000000..f949f9cb --- /dev/null +++ b/lib/js/src/rpc/messages/SendLocation.js @@ -0,0 +1,226 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { DeliveryMode } from '../enums/DeliveryMode.js'; +import { DateTime } from '../structs/DateTime.js'; +import { RpcRequest } from '../RpcRequest.js'; +import { OASISAddress } from '../structs/OASISAddress.js'; +import { Image } from '../structs/Image.js'; + +class SendLocation extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SendLocation); + } + + /** + * @param {Number} degrees + * @return {SendLocation} + */ + setLongitudeDegrees (degrees) { + this.setParameter(SendLocation.KEY_LONGITUDE_DEGREES, degrees); + return this; + } + + /** + * @return {Number} + */ + getLongitudeDegrees () { + return this.getParameter(SendLocation.KEY_LONGITUDE_DEGREES); + } + + /** + * @param {Number} degrees + * @return {SendLocation} + */ + setLatitudeDegrees (degrees) { + this.setParameter(SendLocation.KEY_LATITUDE_DEGREES, degrees); + return this; + } + + /** + * @return {Number} + */ + getLatitudeDegrees () { + return this.getParameter(SendLocation.KEY_LATITUDE_DEGREES); + } + + /** + * @param {String} name - Name / title of intended location + * @return {SendLocation} + */ + setLocationName (name) { + this.setParameter(SendLocation.KEY_LOCATION_NAME, name); + return this; + } + + /** + * @return {String} + */ + getLocationName () { + return this.getParameter(SendLocation.KEY_LOCATION_NAME); + } + + /** + * @param {String} description - Description intended location / establishment (if applicable) + * @return {SendLocation} + */ + setLocationDescription (description) { + this.setParameter(SendLocation.KEY_LOCATION_DESCRIPTION, description); + return this; + } + + /** + * @return {String} + */ + getLocationDescription () { + return this.getParameter(SendLocation.KEY_LOCATION_DESCRIPTION); + } + + /** + * @param {String[]} lines - Location address (if applicable) + * @return {SendLocation} + */ + setAddressLines (lines) { + this.setParameter(SendLocation.KEY_ADDRESS_LINES, lines); + return this; + } + + /** + * @return {String[]} + */ + getAddressLines () { + return this.getParameter(SendLocation.KEY_ADDRESS_LINES); + } + + /** + * @param {String} number - Phone number of intended location / establishment (if applicable) + * @return {SendLocation} + */ + setPhoneNumber (number) { + this.setParameter(SendLocation.KEY_PHONE_NUMBER, number); + return this; + } + + /** + * @return {String} + */ + getPhoneNumber () { + return this.getParameter(SendLocation.KEY_PHONE_NUMBER); + } + + /** + * @param {Image} image - Image / icon of intended location (if applicable and supported) + * @return {SendLocation} + */ + setLocationImage (image) { + this.validateType(Image, image); + this.setParameter(SendLocation.KEY_LOCATION_IMAGE, image); + return this; + } + + /** + * @return {Image} + */ + getLocationImage () { + return this.getObject(Image, SendLocation.KEY_LOCATION_IMAGE); + } + + /** + * @param {DateTime} stamp - timestamp in ISO 8601 format + * @return {SendLocation} + */ + setTimeStamp (stamp) { + this.validateType(DateTime, stamp); + this.setParameter(SendLocation.KEY_TIME_STAMP, stamp); + return this; + } + + /** + * @return {DateTime} + */ + getTimeStamp () { + return this.getObject(DateTime, SendLocation.KEY_TIME_STAMP); + } + + /** + * @param {OASISAddress} address - Address to be used for setting destination + * @return {SendLocation} + */ + setAddress (address) { + this.validateType(OASISAddress, address); + this.setParameter(SendLocation.KEY_ADDRESS, address); + return this; + } + + /** + * @return {OASISAddress} + */ + getAddress () { + return this.getObject(OASISAddress, SendLocation.KEY_ADDRESS); + } + + /** + * @param {DeliveryMode} mode - Defines the mode of prompt for user + * @return {SendLocation} + */ + setDeliveryMode (mode) { + this.validateType(DeliveryMode, mode); + this.setParameter(SendLocation.KEY_DELIVERY_MODE, mode); + return this; + } + + /** + * @return {DeliveryMode} + */ + getDeliveryMode () { + return this.getObject(DeliveryMode, SendLocation.KEY_DELIVERY_MODE); + } +} + +SendLocation.KEY_LONGITUDE_DEGREES = 'longitudeDegrees'; +SendLocation.KEY_LATITUDE_DEGREES = 'latitudeDegrees'; +SendLocation.KEY_LOCATION_NAME = 'locationName'; +SendLocation.KEY_LOCATION_DESCRIPTION = 'locationDescription'; +SendLocation.KEY_ADDRESS_LINES = 'addressLines'; +SendLocation.KEY_PHONE_NUMBER = 'phoneNumber'; +SendLocation.KEY_LOCATION_IMAGE = 'locationImage'; +SendLocation.KEY_TIME_STAMP = 'timeStamp'; +SendLocation.KEY_ADDRESS = 'address'; +SendLocation.KEY_DELIVERY_MODE = 'deliveryMode'; + +export { SendLocation }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SendLocationResponse.js b/lib/js/src/rpc/messages/SendLocationResponse.js new file mode 100644 index 00000000..17895eb8 --- /dev/null +++ b/lib/js/src/rpc/messages/SendLocationResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class SendLocationResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SendLocation); + } +} + + +export { SendLocationResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SetAppIcon.js b/lib/js/src/rpc/messages/SetAppIcon.js index 0d9b13ce..fc73ae6c 100644 --- a/lib/js/src/rpc/messages/SetAppIcon.js +++ b/lib/js/src/rpc/messages/SetAppIcon.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -33,27 +34,31 @@ import { RpcRequest } from '../RpcRequest.js'; import { FunctionID } from '../enums/FunctionID.js'; +/** + * Used to set existing local file on the module as the app's icon Not supported on first generation SDL enabled + * vehicles. + */ class SetAppIcon extends RpcRequest { /** - * @constructor - */ + * @constructor + */ constructor (store) { super(store); this.setFunctionName(FunctionID.SetAppIcon); } /** - * @param {String} fileName - * @return {SetAppIcon} - */ - setFileName (fileName) { - this.setParameter(SetAppIcon.KEY_FILE_NAME, fileName); + * @param {String} name - File reference name. + * @return {SetAppIcon} + */ + setFileName (name) { + this.setParameter(SetAppIcon.KEY_FILE_NAME, name); return this; } /** - * @return {String} - */ + * @return {String} + */ getFileName () { return this.getParameter(SetAppIcon.KEY_FILE_NAME); } @@ -61,5 +66,4 @@ class SetAppIcon extends RpcRequest { SetAppIcon.KEY_FILE_NAME = 'syncFileName'; - -export { SetAppIcon }; +export { SetAppIcon }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SetAppIconResponse.js b/lib/js/src/rpc/messages/SetAppIconResponse.js index 5051fc83..b1f2ffae 100644 --- a/lib/js/src/rpc/messages/SetAppIconResponse.js +++ b/lib/js/src/rpc/messages/SetAppIconResponse.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -30,17 +31,22 @@ * POSSIBILITY OF SUCH DAMAGE. */ -import { RpcResponse } from '../RpcResponse.js'; import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; +/** + * Response is sent, when the file data was copied (success case). Or when an error occurred. Not supported on First + * generation SDL enabled vehicles. + */ class SetAppIconResponse extends RpcResponse { /** - * @constructor - */ + * @constructor + */ constructor (store) { super(store); this.setFunctionName(FunctionID.SetAppIcon); } } -export { SetAppIconResponse }; + +export { SetAppIconResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SetCloudAppProperties.js b/lib/js/src/rpc/messages/SetCloudAppProperties.js new file mode 100644 index 00000000..cae17605 --- /dev/null +++ b/lib/js/src/rpc/messages/SetCloudAppProperties.js @@ -0,0 +1,70 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { CloudAppProperties } from '../structs/CloudAppProperties.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * RPC used to enable/disable a cloud application and set its cloud-related policy properties + */ +class SetCloudAppProperties extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SetCloudAppProperties); + } + + /** + * @param {CloudAppProperties} properties - The new cloud application properties + * @return {SetCloudAppProperties} + */ + setProperties (properties) { + this.validateType(CloudAppProperties, properties); + this.setParameter(SetCloudAppProperties.KEY_PROPERTIES, properties); + return this; + } + + /** + * @return {CloudAppProperties} + */ + getProperties () { + return this.getObject(CloudAppProperties, SetCloudAppProperties.KEY_PROPERTIES); + } +} + +SetCloudAppProperties.KEY_PROPERTIES = 'properties'; + +export { SetCloudAppProperties }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SetCloudAppPropertiesResponse.js b/lib/js/src/rpc/messages/SetCloudAppPropertiesResponse.js new file mode 100644 index 00000000..4325e97c --- /dev/null +++ b/lib/js/src/rpc/messages/SetCloudAppPropertiesResponse.js @@ -0,0 +1,51 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +/** + * The response to SetCloudAppProperties + */ +class SetCloudAppPropertiesResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SetCloudAppProperties); + } +} + + +export { SetCloudAppPropertiesResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SetDisplayLayout.js b/lib/js/src/rpc/messages/SetDisplayLayout.js new file mode 100644 index 00000000..47a89e17 --- /dev/null +++ b/lib/js/src/rpc/messages/SetDisplayLayout.js @@ -0,0 +1,114 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { TemplateColorScheme } from '../structs/TemplateColorScheme.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * This RPC is deprecated. Use Show RPC to change layout. + * @deprecated + */ +class SetDisplayLayout extends RpcRequest { + /** + * @deprecated + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SetDisplayLayout); + } + + /** + * @deprecated + * @param {String} layout - Predefined or dynamically created screen layout. Currently only predefined screen + * layouts are defined. + * @return {SetDisplayLayout} + */ + setDisplayLayout (layout) { + this.setParameter(SetDisplayLayout.KEY_DISPLAY_LAYOUT, layout); + return this; + } + + /** + * @deprecated + * @return {String} + */ + getDisplayLayout () { + return this.getParameter(SetDisplayLayout.KEY_DISPLAY_LAYOUT); + } + + /** + * @deprecated + * @param {TemplateColorScheme} scheme - A color scheme for all display layout templates. + * @return {SetDisplayLayout} + */ + setDayColorScheme (scheme) { + this.validateType(TemplateColorScheme, scheme); + this.setParameter(SetDisplayLayout.KEY_DAY_COLOR_SCHEME, scheme); + return this; + } + + /** + * @deprecated + * @return {TemplateColorScheme} + */ + getDayColorScheme () { + return this.getObject(TemplateColorScheme, SetDisplayLayout.KEY_DAY_COLOR_SCHEME); + } + + /** + * @deprecated + * @param {TemplateColorScheme} scheme - A color scheme for all display layout templates. + * @return {SetDisplayLayout} + */ + setNightColorScheme (scheme) { + this.validateType(TemplateColorScheme, scheme); + this.setParameter(SetDisplayLayout.KEY_NIGHT_COLOR_SCHEME, scheme); + return this; + } + + /** + * @deprecated + * @return {TemplateColorScheme} + */ + getNightColorScheme () { + return this.getObject(TemplateColorScheme, SetDisplayLayout.KEY_NIGHT_COLOR_SCHEME); + } +} + +SetDisplayLayout.KEY_DISPLAY_LAYOUT = 'displayLayout'; +SetDisplayLayout.KEY_DAY_COLOR_SCHEME = 'dayColorScheme'; +SetDisplayLayout.KEY_NIGHT_COLOR_SCHEME = 'nightColorScheme'; + +export { SetDisplayLayout }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SetDisplayLayoutResponse.js b/lib/js/src/rpc/messages/SetDisplayLayoutResponse.js new file mode 100644 index 00000000..77851fad --- /dev/null +++ b/lib/js/src/rpc/messages/SetDisplayLayoutResponse.js @@ -0,0 +1,139 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcResponse } from '../RpcResponse.js'; +import { SoftButtonCapabilities } from '../structs/SoftButtonCapabilities.js'; +import { PresetBankCapabilities } from '../structs/PresetBankCapabilities.js'; +import { DisplayCapabilities } from '../structs/DisplayCapabilities.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { ButtonCapabilities } from '../structs/ButtonCapabilities.js'; + +/** + * This RPC is deprecated. Use Show RPC to change layout. + * @deprecated + */ +class SetDisplayLayoutResponse extends RpcResponse { + /** + * @deprecated + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SetDisplayLayout); + } + + /** + * @deprecated + * @param {DisplayCapabilities} capabilities - See DisplayCapabilities + * @return {SetDisplayLayoutResponse} + */ + setDisplayCapabilities (capabilities) { + this.validateType(DisplayCapabilities, capabilities); + this.setParameter(SetDisplayLayoutResponse.KEY_DISPLAY_CAPABILITIES, capabilities); + return this; + } + + /** + * @deprecated + * @return {DisplayCapabilities} + */ + getDisplayCapabilities () { + return this.getObject(DisplayCapabilities, SetDisplayLayoutResponse.KEY_DISPLAY_CAPABILITIES); + } + + /** + * @deprecated + * @param {ButtonCapabilities[]} capabilities - See ButtonCapabilities + * @return {SetDisplayLayoutResponse} + */ + setButtonCapabilities (capabilities) { + this.validateType(ButtonCapabilities, capabilities, true); + this.setParameter(SetDisplayLayoutResponse.KEY_BUTTON_CAPABILITIES, capabilities); + return this; + } + + /** + * @deprecated + * @return {ButtonCapabilities[]} + */ + getButtonCapabilities () { + return this.getObject(ButtonCapabilities, SetDisplayLayoutResponse.KEY_BUTTON_CAPABILITIES); + } + + /** + * @deprecated + * @param {SoftButtonCapabilities[]} capabilities - If returned, the platform supports on-screen SoftButtons; see + * SoftButtonCapabilities. + * @return {SetDisplayLayoutResponse} + */ + setSoftButtonCapabilities (capabilities) { + this.validateType(SoftButtonCapabilities, capabilities, true); + this.setParameter(SetDisplayLayoutResponse.KEY_SOFT_BUTTON_CAPABILITIES, capabilities); + return this; + } + + /** + * @deprecated + * @return {SoftButtonCapabilities[]} + */ + getSoftButtonCapabilities () { + return this.getObject(SoftButtonCapabilities, SetDisplayLayoutResponse.KEY_SOFT_BUTTON_CAPABILITIES); + } + + /** + * @deprecated + * @param {PresetBankCapabilities} capabilities - If returned, the platform supports custom on-screen Presets; see + * PresetBankCapabilities. + * @return {SetDisplayLayoutResponse} + */ + setPresetBankCapabilities (capabilities) { + this.validateType(PresetBankCapabilities, capabilities); + this.setParameter(SetDisplayLayoutResponse.KEY_PRESET_BANK_CAPABILITIES, capabilities); + return this; + } + + /** + * @deprecated + * @return {PresetBankCapabilities} + */ + getPresetBankCapabilities () { + return this.getObject(PresetBankCapabilities, SetDisplayLayoutResponse.KEY_PRESET_BANK_CAPABILITIES); + } +} + +SetDisplayLayoutResponse.KEY_DISPLAY_CAPABILITIES = 'displayCapabilities'; +SetDisplayLayoutResponse.KEY_BUTTON_CAPABILITIES = 'buttonCapabilities'; +SetDisplayLayoutResponse.KEY_SOFT_BUTTON_CAPABILITIES = 'softButtonCapabilities'; +SetDisplayLayoutResponse.KEY_PRESET_BANK_CAPABILITIES = 'presetBankCapabilities'; + +export { SetDisplayLayoutResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SetGlobalProperties.js b/lib/js/src/rpc/messages/SetGlobalProperties.js new file mode 100644 index 00000000..e1f13a28 --- /dev/null +++ b/lib/js/src/rpc/messages/SetGlobalProperties.js @@ -0,0 +1,226 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { VrHelpItem } from '../structs/VrHelpItem.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { SeatLocation } from '../structs/SeatLocation.js'; +import { TTSChunk } from '../structs/TTSChunk.js'; +import { MenuLayout } from '../enums/MenuLayout.js'; +import { KeyboardProperties } from '../structs/KeyboardProperties.js'; +import { RpcRequest } from '../RpcRequest.js'; +import { Image } from '../structs/Image.js'; + +/** + * Allows setting global properties. + */ +class SetGlobalProperties extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SetGlobalProperties); + } + + /** + * @param {SeatLocation} location - Location of the user's seat. Default is driver's seat location if it is not set + * yet. + * @return {SetGlobalProperties} + */ + setUserLocation (location) { + this.validateType(SeatLocation, location); + this.setParameter(SetGlobalProperties.KEY_USER_LOCATION, location); + return this; + } + + /** + * @return {SeatLocation} + */ + getUserLocation () { + return this.getObject(SeatLocation, SetGlobalProperties.KEY_USER_LOCATION); + } + + /** + * @param {TTSChunk[]} prompt - The help prompt. An array of text chunks of type TTSChunk. See TTSChunk. The array + * must have at least one item. + * @return {SetGlobalProperties} + */ + setHelpPrompt (prompt) { + this.validateType(TTSChunk, prompt, true); + this.setParameter(SetGlobalProperties.KEY_HELP_PROMPT, prompt); + return this; + } + + /** + * @return {TTSChunk[]} + */ + getHelpPrompt () { + return this.getObject(TTSChunk, SetGlobalProperties.KEY_HELP_PROMPT); + } + + /** + * @param {TTSChunk[]} prompt - Help text for a wait timeout. An array of text chunks of type TTSChunk. See + * TTSChunk. The array must have at least one item. + * @return {SetGlobalProperties} + */ + setTimeoutPrompt (prompt) { + this.validateType(TTSChunk, prompt, true); + this.setParameter(SetGlobalProperties.KEY_TIMEOUT_PROMPT, prompt); + return this; + } + + /** + * @return {TTSChunk[]} + */ + getTimeoutPrompt () { + return this.getObject(TTSChunk, SetGlobalProperties.KEY_TIMEOUT_PROMPT); + } + + /** + * @param {String} title - VR Help Title text. If omitted on supported displays, the default module help title shall + * be used. If omitted and one or more vrHelp items are provided, the request will be + * rejected. + * @return {SetGlobalProperties} + */ + setVrHelpTitle (title) { + this.setParameter(SetGlobalProperties.KEY_VR_HELP_TITLE, title); + return this; + } + + /** + * @return {String} + */ + getVrHelpTitle () { + return this.getParameter(SetGlobalProperties.KEY_VR_HELP_TITLE); + } + + /** + * @param {VrHelpItem[]} help - VR Help Items. If omitted on supported displays, the default SmartDeviceLink VR help + * / What Can I Say? screen shall be used. If the list of VR Help Items contains + * nonsequential positions (e.g. [1,2,4]), the RPC shall be rejected. If omitted and a + * vrHelpTitle is provided, the request will be rejected. + * @return {SetGlobalProperties} + */ + setVrHelp (help) { + this.validateType(VrHelpItem, help, true); + this.setParameter(SetGlobalProperties.KEY_VR_HELP, help); + return this; + } + + /** + * @return {VrHelpItem[]} + */ + getVrHelp () { + return this.getObject(VrHelpItem, SetGlobalProperties.KEY_VR_HELP); + } + + /** + * @param {String} title - Optional text to label an app menu button (for certain touchscreen platforms). + * @return {SetGlobalProperties} + */ + setMenuTitle (title) { + this.setParameter(SetGlobalProperties.KEY_MENU_TITLE, title); + return this; + } + + /** + * @return {String} + */ + getMenuTitle () { + return this.getParameter(SetGlobalProperties.KEY_MENU_TITLE); + } + + /** + * @param {Image} icon - Optional icon to draw on an app menu button (for certain touchscreen platforms). + * @return {SetGlobalProperties} + */ + setMenuIcon (icon) { + this.validateType(Image, icon); + this.setParameter(SetGlobalProperties.KEY_MENU_ICON, icon); + return this; + } + + /** + * @return {Image} + */ + getMenuIcon () { + return this.getObject(Image, SetGlobalProperties.KEY_MENU_ICON); + } + + /** + * @param {KeyboardProperties} properties - On-screen keyboard configuration (if available). + * @return {SetGlobalProperties} + */ + setKeyboardProperties (properties) { + this.validateType(KeyboardProperties, properties); + this.setParameter(SetGlobalProperties.KEY_KEYBOARD_PROPERTIES, properties); + return this; + } + + /** + * @return {KeyboardProperties} + */ + getKeyboardProperties () { + return this.getObject(KeyboardProperties, SetGlobalProperties.KEY_KEYBOARD_PROPERTIES); + } + + /** + * @param {MenuLayout} layout - Sets the layout of the main menu screen. If this is sent while a menu is already on- + * screen, the head unit will change the display to the new layout type. + * @return {SetGlobalProperties} + */ + setMenuLayout (layout) { + this.validateType(MenuLayout, layout); + this.setParameter(SetGlobalProperties.KEY_MENU_LAYOUT, layout); + return this; + } + + /** + * @return {MenuLayout} + */ + getMenuLayout () { + return this.getObject(MenuLayout, SetGlobalProperties.KEY_MENU_LAYOUT); + } +} + +SetGlobalProperties.KEY_USER_LOCATION = 'userLocation'; +SetGlobalProperties.KEY_HELP_PROMPT = 'helpPrompt'; +SetGlobalProperties.KEY_TIMEOUT_PROMPT = 'timeoutPrompt'; +SetGlobalProperties.KEY_VR_HELP_TITLE = 'vrHelpTitle'; +SetGlobalProperties.KEY_VR_HELP = 'vrHelp'; +SetGlobalProperties.KEY_MENU_TITLE = 'menuTitle'; +SetGlobalProperties.KEY_MENU_ICON = 'menuIcon'; +SetGlobalProperties.KEY_KEYBOARD_PROPERTIES = 'keyboardProperties'; +SetGlobalProperties.KEY_MENU_LAYOUT = 'menuLayout'; + +export { SetGlobalProperties }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SetGlobalPropertiesResponse.js b/lib/js/src/rpc/messages/SetGlobalPropertiesResponse.js new file mode 100644 index 00000000..866addb5 --- /dev/null +++ b/lib/js/src/rpc/messages/SetGlobalPropertiesResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class SetGlobalPropertiesResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SetGlobalProperties); + } +} + + +export { SetGlobalPropertiesResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SetInteriorVehicleData.js b/lib/js/src/rpc/messages/SetInteriorVehicleData.js new file mode 100644 index 00000000..9a9ccb14 --- /dev/null +++ b/lib/js/src/rpc/messages/SetInteriorVehicleData.js @@ -0,0 +1,67 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { ModuleData } from '../structs/ModuleData.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +class SetInteriorVehicleData extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SetInteriorVehicleData); + } + + /** + * @param {ModuleData} data - The module data to set for the requested RC module. + * @return {SetInteriorVehicleData} + */ + setModuleData (data) { + this.validateType(ModuleData, data); + this.setParameter(SetInteriorVehicleData.KEY_MODULE_DATA, data); + return this; + } + + /** + * @return {ModuleData} + */ + getModuleData () { + return this.getObject(ModuleData, SetInteriorVehicleData.KEY_MODULE_DATA); + } +} + +SetInteriorVehicleData.KEY_MODULE_DATA = 'moduleData'; + +export { SetInteriorVehicleData }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SetInteriorVehicleDataResponse.js b/lib/js/src/rpc/messages/SetInteriorVehicleDataResponse.js new file mode 100644 index 00000000..617534cb --- /dev/null +++ b/lib/js/src/rpc/messages/SetInteriorVehicleDataResponse.js @@ -0,0 +1,72 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { ModuleData } from '../structs/ModuleData.js'; +import { RpcResponse } from '../RpcResponse.js'; + +/** + * Used to set the values of one remote control module + */ +class SetInteriorVehicleDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SetInteriorVehicleData); + } + + /** + * @param {ModuleData} data - The moduleType indicates which type of data should be changed and identifies which + * data object exists in this struct. For example, if the moduleType is CLIMATE then a + * "climateControlData" should exist + * @return {SetInteriorVehicleDataResponse} + */ + setModuleData (data) { + this.validateType(ModuleData, data); + this.setParameter(SetInteriorVehicleDataResponse.KEY_MODULE_DATA, data); + return this; + } + + /** + * @return {ModuleData} + */ + getModuleData () { + return this.getObject(ModuleData, SetInteriorVehicleDataResponse.KEY_MODULE_DATA); + } +} + +SetInteriorVehicleDataResponse.KEY_MODULE_DATA = 'moduleData'; + +export { SetInteriorVehicleDataResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SetMediaClockTimer.js b/lib/js/src/rpc/messages/SetMediaClockTimer.js new file mode 100644 index 00000000..6b5993a7 --- /dev/null +++ b/lib/js/src/rpc/messages/SetMediaClockTimer.js @@ -0,0 +1,135 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { StartTime } from '../structs/StartTime.js'; +import { UpdateMode } from '../enums/UpdateMode.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { AudioStreamingIndicator } from '../enums/AudioStreamingIndicator.js'; +import { RpcRequest } from '../RpcRequest.js'; + +/** + * Sets the initial media clock value and automatic update method. + */ +class SetMediaClockTimer extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SetMediaClockTimer); + } + + /** + * @param {StartTime} time - See StartTime. startTime must be provided for "COUNTUP" and "COUNTDOWN". startTime will + * be ignored for "RESUME", and "CLEAR" startTime can be sent for "PAUSE", in which case + * it will update the paused startTime + * @return {SetMediaClockTimer} + */ + setStartTime (time) { + this.validateType(StartTime, time); + this.setParameter(SetMediaClockTimer.KEY_START_TIME, time); + return this; + } + + /** + * @return {StartTime} + */ + getStartTime () { + return this.getObject(StartTime, SetMediaClockTimer.KEY_START_TIME); + } + + /** + * @param {StartTime} time - See StartTime. endTime can be provided for "COUNTUP" and "COUNTDOWN"; to be used to + * calculate any visual progress bar (if not provided, this feature is ignored) If endTime + * is greater then startTime for COUNTDOWN or less than startTime for COUNTUP, then the + * request will return an INVALID_DATA. endTime will be ignored for "RESUME", and "CLEAR" + * endTime can be sent for "PAUSE", in which case it will update the paused endTime + * @return {SetMediaClockTimer} + */ + setEndTime (time) { + this.validateType(StartTime, time); + this.setParameter(SetMediaClockTimer.KEY_END_TIME, time); + return this; + } + + /** + * @return {StartTime} + */ + getEndTime () { + return this.getObject(StartTime, SetMediaClockTimer.KEY_END_TIME); + } + + /** + * @param {UpdateMode} mode - Enumeration to control the media clock. In case of pause, resume, or clear, the start + * time value is ignored and shall be left out. For resume, the time continues with the + * same value as it was when paused. + * @return {SetMediaClockTimer} + */ + setUpdateMode (mode) { + this.validateType(UpdateMode, mode); + this.setParameter(SetMediaClockTimer.KEY_UPDATE_MODE, mode); + return this; + } + + /** + * @return {UpdateMode} + */ + getUpdateMode () { + return this.getObject(UpdateMode, SetMediaClockTimer.KEY_UPDATE_MODE); + } + + /** + * @param {AudioStreamingIndicator} indicator - Enumeration for the indicator icon on a play/pause button. see + * AudioStreamingIndicator. + * @return {SetMediaClockTimer} + */ + setAudioStreamingIndicator (indicator) { + this.validateType(AudioStreamingIndicator, indicator); + this.setParameter(SetMediaClockTimer.KEY_AUDIO_STREAMING_INDICATOR, indicator); + return this; + } + + /** + * @return {AudioStreamingIndicator} + */ + getAudioStreamingIndicator () { + return this.getObject(AudioStreamingIndicator, SetMediaClockTimer.KEY_AUDIO_STREAMING_INDICATOR); + } +} + +SetMediaClockTimer.KEY_START_TIME = 'startTime'; +SetMediaClockTimer.KEY_END_TIME = 'endTime'; +SetMediaClockTimer.KEY_UPDATE_MODE = 'updateMode'; +SetMediaClockTimer.KEY_AUDIO_STREAMING_INDICATOR = 'audioStreamingIndicator'; + +export { SetMediaClockTimer }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SetMediaClockTimerResponse.js b/lib/js/src/rpc/messages/SetMediaClockTimerResponse.js new file mode 100644 index 00000000..5b633cfa --- /dev/null +++ b/lib/js/src/rpc/messages/SetMediaClockTimerResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class SetMediaClockTimerResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SetMediaClockTimer); + } +} + + +export { SetMediaClockTimerResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/Show.js b/lib/js/src/rpc/messages/Show.js index 91c6e662..b6133f00 100644 --- a/lib/js/src/rpc/messages/Show.js +++ b/lib/js/src/rpc/messages/Show.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -30,274 +31,311 @@ * POSSIBILITY OF SUCH DAMAGE. */ -import { RpcRequest } from '../RpcRequest.js'; +import { TextAlignment } from '../enums/TextAlignment.js'; +import { FunctionID } from '../enums/FunctionID.js'; import { SoftButton } from '../structs/SoftButton.js'; -import { Image } from '../structs/Image.js'; +import { TemplateConfiguration } from '../structs/TemplateConfiguration.js'; import { MetadataTags } from '../structs/MetadataTags.js'; +import { RpcRequest } from '../RpcRequest.js'; +import { Image } from '../structs/Image.js'; -import { FunctionID } from '../enums/FunctionID.js'; -import { TextAlignment } from '../enums/TextAlignment.js'; - +/** + * Updates the persistent display. Supported fields depend on display capabilities. + */ class Show extends RpcRequest { /** - * @constructor - */ + * @constructor + */ constructor (store) { super(store); this.setFunctionName(FunctionID.Show); } - /** - * @param {String} mainField1 - * @return {Show} - */ - setMainField1 (mainField1) { - this.setParameter(Show.KEY_MAIN_FIELD_1, mainField1); + * @param {String} field1 - The text that should be displayed in a single or upper display line. If this text is not + * set, the text of mainField1 stays unchanged. If this text is empty "", the field will be + * cleared. + * @return {Show} + */ + setMainField1 (field1) { + this.setParameter(Show.KEY_MAIN_FIELD_1, field1); return this; } /** - * @return {String} - */ + * @return {String} + */ getMainField1 () { return this.getParameter(Show.KEY_MAIN_FIELD_1); } /** - * @param {String} mainField2 - * @return {Show} - */ - setMainField2 (mainField2) { - this.setParameter(Show.KEY_MAIN_FIELD_2, mainField2); + * @param {String} field2 - The text that should be displayed on the second display line. If this text is not set, + * the text of mainField2 stays unchanged. If this text is empty "", the field will be + * cleared. + * @return {Show} + */ + setMainField2 (field2) { + this.setParameter(Show.KEY_MAIN_FIELD_2, field2); return this; } /** - * @return {String} - */ + * @return {String} + */ getMainField2 () { return this.getParameter(Show.KEY_MAIN_FIELD_2); } /** - * @param {String} mainField3 - * @return {Show} - */ - setMainField3 (mainField3) { - this.setParameter(Show.KEY_MAIN_FIELD_3, mainField3); + * @param {String} field3 - The text that should be displayed on the second "page" first display line. If this text + * is not set, the text of mainField3 stays unchanged. If this text is empty "", the field + * will be cleared. + * @return {Show} + */ + setMainField3 (field3) { + this.setParameter(Show.KEY_MAIN_FIELD_3, field3); return this; } /** - * @return {String} - */ + * @return {String} + */ getMainField3 () { return this.getParameter(Show.KEY_MAIN_FIELD_3); } /** - * @param {String} mainField4 - * @return {Show} - */ - setMainField4 (mainField4) { - this.setParameter(Show.KEY_MAIN_FIELD_4, mainField4); + * @param {String} field4 - The text that should be displayed on the second "page" second display line. If this text + * is not set, the text of mainField4 stays unchanged. If this text is empty "", the field + * will be cleared. + * @return {Show} + */ + setMainField4 (field4) { + this.setParameter(Show.KEY_MAIN_FIELD_4, field4); return this; } /** - * @return {String} - */ + * @return {String} + */ getMainField4 () { return this.getParameter(Show.KEY_MAIN_FIELD_4); } /** - * @param {TextAlignment} menuParams - * @return {Show} - */ + * @param {TextAlignment} alignment - Specifies how mainField1 and mainField2 texts should be aligned on display. If + * omitted, texts will be centered. + * @return {Show} + */ setAlignment (alignment) { this.validateType(TextAlignment, alignment); - this.setParameter(Show.KEY_ALIGNMENT, alignment); return this; } /** - * @return {TextAlignment} - */ + * @return {TextAlignment} + */ getAlignment () { return this.getObject(TextAlignment, Show.KEY_ALIGNMENT); } /** - * @param {String} statusBar - * @return {Show} - */ - setStatusBar (statusBar) { - this.setParameter(Show.KEY_STATUS_BAR, statusBar); + * @param {String} bar - Requires investigation regarding the nav display capabilities. Potentially lower + * lowerStatusBar, upperStatusBar, titleBar, etc. + * @return {Show} + */ + setStatusBar (bar) { + this.setParameter(Show.KEY_STATUS_BAR, bar); return this; } /** - * @return {String} - */ + * @return {String} + */ getStatusBar () { return this.getParameter(Show.KEY_STATUS_BAR); } /** - * @param {String} mediaClock - * @return {Show} - */ - setMediaClock (mediaClock) { - this.setParameter(Show.KEY_MEDIA_CLOCK, mediaClock); + * @param {String} clock - Text value for MediaClock field. Has to be properly formatted by Mobile App according to + * the module's capabilities. If this text is set, any automatic media clock updates + * previously set with SetMediaClockTimer will be stopped. + * @return {Show} + */ + setMediaClock (clock) { + this.setParameter(Show.KEY_MEDIA_CLOCK, clock); return this; } /** - * @return {String} - */ + * @return {String} + */ getMediaClock () { return this.getParameter(Show.KEY_MEDIA_CLOCK); } /** - * @param {String} mediaTrack - * @return {Show} - */ - setMediaTrack (mediaTrack) { - this.setParameter(Show.KEY_MEDIA_TRACK, mediaTrack); + * @param {String} track - The text that should be displayed in the track field. If this text is not set, the text + * of mediaTrack stays unchanged. If this text is empty "", the field will be cleared. + * @return {Show} + */ + setMediaTrack (track) { + this.setParameter(Show.KEY_MEDIA_TRACK, track); return this; } /** - * @return {String} - */ + * @return {String} + */ getMediaTrack () { return this.getParameter(Show.KEY_MEDIA_TRACK); } /** - * @param {Image} graphic - * @return {Show} - */ + * @param {Image} graphic - Image struct determining whether static or dynamic image to display in app. If omitted + * on supported displays, the displayed graphic shall not change. + * @return {Show} + */ setGraphic (graphic) { this.validateType(Image, graphic); - this.setParameter(Show.KEY_GRAPHIC, graphic); return this; } /** - * @return {Image} - */ + * @return {Image} + */ getGraphic () { return this.getObject(Image, Show.KEY_GRAPHIC); } /** - * @param {Image} secondaryGraphic - * @return {Show} - */ - setSecondaryGraphic (secondaryGraphic) { - this.validateType(Image, secondaryGraphic); - - this.setParameter(Show.KEY_SECONDARY_GRAPHIC, secondaryGraphic); + * @param {Image} graphic - Image struct determining whether static or dynamic secondary image to display in app. If + * omitted on supported displays, the displayed secondary graphic shall not change. + * @return {Show} + */ + setSecondaryGraphic (graphic) { + this.validateType(Image, graphic); + this.setParameter(Show.KEY_SECONDARY_GRAPHIC, graphic); return this; } /** - * @return {Image} - */ + * @return {Image} + */ getSecondaryGraphic () { return this.getObject(Image, Show.KEY_SECONDARY_GRAPHIC); } /** - * @param {Array} softButtons - * @return {Show} - */ - setSoftButtons (softButtons) { - // TODO make this work for arrays - // this.validateType(SoftButton, softButtons); - - this.setParameter(Show.KEY_SOFT_BUTTONS, softButtons); + * @param {SoftButton[]} buttons - App defined SoftButtons. If omitted on supported displays, the currently + * displayed SoftButton values will not change. + * @return {Show} + */ + setSoftButtons (buttons) { + this.validateType(SoftButton, buttons, true); + this.setParameter(Show.KEY_SOFT_BUTTONS, buttons); return this; } /** - * @return {Array} - */ + * @return {SoftButton[]} + */ getSoftButtons () { return this.getObject(SoftButton, Show.KEY_SOFT_BUTTONS); } /** - * @param {Array} customPresets - * @return {Show} - */ - setCustomPresets (customPresets) { - this.setParameter(Show.KEY_CUSTOM_PRESETS, customPresets); + * @param {String[]} presets - App labeled on-screen presets (i.e. on-screen media presets or dynamic search + * suggestions). If omitted on supported displays, the presets will be shown as not + * defined. + * @return {Show} + */ + setCustomPresets (presets) { + this.setParameter(Show.KEY_CUSTOM_PRESETS, presets); return this; } /** - * @return {Array} - */ + * @return {String[]} + */ getCustomPresets () { return this.getParameter(Show.KEY_CUSTOM_PRESETS); } /** - * @param {MetadataTags} metadataTags - * @return {Show} - */ - setMetadataTags (metadataTags) { - this.validateType(MetadataTags, metadataTags); - - this.setParameter(Show.KEY_METADATA_TAGS, metadataTags); + * @param {MetadataTags} tags - App defined metadata information. See MetadataStruct. Uses mainField1, mainField2, + * mainField3, mainField4. If omitted on supported displays, the currently set metadata + * tags will not change. If any text field contains no tags or the none tag, the + * metadata tag for that textfield should be removed. + * @return {Show} + */ + setMetadataTags (tags) { + this.validateType(MetadataTags, tags); + this.setParameter(Show.KEY_METADATA_TAGS, tags); return this; } /** - * @return {MetadataTags} - */ + * @return {MetadataTags} + */ getMetadataTags () { return this.getObject(MetadataTags, Show.KEY_METADATA_TAGS); } /** - * @param {String} templateTitle - * @return {Show} - */ - setTemplateTitle (templateTitle) { - this.setParameter(Show.KEY_TEMPLATE_TITLE, templateTitle); + * @param {String} title - The title of the new template that will be displayed. How this will be displayed is + * dependent on the OEM design and implementation of the template. + * @return {Show} + */ + setTemplateTitle (title) { + this.setParameter(Show.KEY_TEMPLATE_TITLE, title); return this; } /** - * @return {String} - */ + * @return {String} + */ getTemplateTitle () { return this.getParameter(Show.KEY_TEMPLATE_TITLE); } /** - * @param {Number} windowID - * @return {Show} - */ - setWindowID (windowID) { - this.setParameter(Show.KEY_WINDOW_ID, windowID); + * @param {Number} id - This is the unique ID assigned to the window that this RPC is intended. If this param is not + * included, it will be assumed that this request is specifically for the main window on the + * main display. See PredefinedWindows enum. + * @return {Show} + */ + setWindowID (id) { + this.setParameter(Show.KEY_WINDOW_ID, id); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getWindowID () { return this.getParameter(Show.KEY_WINDOW_ID); } + + /** + * @param {TemplateConfiguration} configuration - Used to set an alternate template layout to a window. + * @return {Show} + */ + setTemplateConfiguration (configuration) { + this.validateType(TemplateConfiguration, configuration); + this.setParameter(Show.KEY_TEMPLATE_CONFIGURATION, configuration); + return this; + } + + /** + * @return {TemplateConfiguration} + */ + getTemplateConfiguration () { + return this.getObject(TemplateConfiguration, Show.KEY_TEMPLATE_CONFIGURATION); + } } Show.KEY_MAIN_FIELD_1 = 'mainField1'; @@ -315,5 +353,6 @@ Show.KEY_CUSTOM_PRESETS = 'customPresets'; Show.KEY_METADATA_TAGS = 'metadataTags'; Show.KEY_TEMPLATE_TITLE = 'templateTitle'; Show.KEY_WINDOW_ID = 'windowID'; +Show.KEY_TEMPLATE_CONFIGURATION = 'templateConfiguration'; -export { Show }; +export { Show }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ShowAppMenu.js b/lib/js/src/rpc/messages/ShowAppMenu.js new file mode 100644 index 00000000..76915927 --- /dev/null +++ b/lib/js/src/rpc/messages/ShowAppMenu.js @@ -0,0 +1,69 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Shows the built in menu view + */ +class ShowAppMenu extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ShowAppMenu); + } + + /** + * @param {Number} id - If omitted the HMI opens the app's menu. If set to a sub-menu ID the HMI opens the + * corresponding sub-menu previously added using `AddSubMenu`. + * @return {ShowAppMenu} + */ + setMenuID (id) { + this.setParameter(ShowAppMenu.KEY_MENU_ID, id); + return this; + } + + /** + * @return {Number} + */ + getMenuID () { + return this.getParameter(ShowAppMenu.KEY_MENU_ID); + } +} + +ShowAppMenu.KEY_MENU_ID = 'menuID'; + +export { ShowAppMenu }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ShowAppMenuResponse.js b/lib/js/src/rpc/messages/ShowAppMenuResponse.js new file mode 100644 index 00000000..af63f17f --- /dev/null +++ b/lib/js/src/rpc/messages/ShowAppMenuResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class ShowAppMenuResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ShowAppMenu); + } +} + + +export { ShowAppMenuResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ShowConstantTBT.js b/lib/js/src/rpc/messages/ShowConstantTBT.js new file mode 100644 index 00000000..0b2ceb37 --- /dev/null +++ b/lib/js/src/rpc/messages/ShowConstantTBT.js @@ -0,0 +1,246 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { SoftButton } from '../structs/SoftButton.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { Image } from '../structs/Image.js'; + +class ShowConstantTBT extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ShowConstantTBT); + } + + /** + * @param {String} text1 + * @return {ShowConstantTBT} + */ + setNavigationText1 (text1) { + this.setParameter(ShowConstantTBT.KEY_NAVIGATION_TEXT_1, text1); + return this; + } + + /** + * @return {String} + */ + getNavigationText1 () { + return this.getParameter(ShowConstantTBT.KEY_NAVIGATION_TEXT_1); + } + + /** + * @param {String} text2 + * @return {ShowConstantTBT} + */ + setNavigationText2 (text2) { + this.setParameter(ShowConstantTBT.KEY_NAVIGATION_TEXT_2, text2); + return this; + } + + /** + * @return {String} + */ + getNavigationText2 () { + return this.getParameter(ShowConstantTBT.KEY_NAVIGATION_TEXT_2); + } + + /** + * @param {String} eta + * @return {ShowConstantTBT} + */ + setEta (eta) { + this.setParameter(ShowConstantTBT.KEY_ETA, eta); + return this; + } + + /** + * @return {String} + */ + getEta () { + return this.getParameter(ShowConstantTBT.KEY_ETA); + } + + /** + * @param {String} destination + * @return {ShowConstantTBT} + */ + setTimeToDestination (destination) { + this.setParameter(ShowConstantTBT.KEY_TIME_TO_DESTINATION, destination); + return this; + } + + /** + * @return {String} + */ + getTimeToDestination () { + return this.getParameter(ShowConstantTBT.KEY_TIME_TO_DESTINATION); + } + + /** + * @param {String} distance + * @return {ShowConstantTBT} + */ + setTotalDistance (distance) { + this.setParameter(ShowConstantTBT.KEY_TOTAL_DISTANCE, distance); + return this; + } + + /** + * @return {String} + */ + getTotalDistance () { + return this.getParameter(ShowConstantTBT.KEY_TOTAL_DISTANCE); + } + + /** + * @param {Image} icon + * @return {ShowConstantTBT} + */ + setTurnIcon (icon) { + this.validateType(Image, icon); + this.setParameter(ShowConstantTBT.KEY_TURN_ICON, icon); + return this; + } + + /** + * @return {Image} + */ + getTurnIcon () { + return this.getObject(Image, ShowConstantTBT.KEY_TURN_ICON); + } + + /** + * @param {Image} icon + * @return {ShowConstantTBT} + */ + setNextTurnIcon (icon) { + this.validateType(Image, icon); + this.setParameter(ShowConstantTBT.KEY_NEXT_TURN_ICON, icon); + return this; + } + + /** + * @return {Image} + */ + getNextTurnIcon () { + return this.getObject(Image, ShowConstantTBT.KEY_NEXT_TURN_ICON); + } + + /** + * @param {Number} maneuver - Fraction of distance till next maneuver (starting from when AlertManeuver is + * triggered). Used to calculate progress bar. + * @return {ShowConstantTBT} + */ + setDistanceToManeuver (maneuver) { + this.setParameter(ShowConstantTBT.KEY_DISTANCE_TO_MANEUVER, maneuver); + return this; + } + + /** + * @return {Number} + */ + getDistanceToManeuver () { + return this.getParameter(ShowConstantTBT.KEY_DISTANCE_TO_MANEUVER); + } + + /** + * @param {Number} scale - Distance till next maneuver (starting from) from previous maneuver. Used to calculate + * progress bar. + * @return {ShowConstantTBT} + */ + setDistanceToManeuverScale (scale) { + this.setParameter(ShowConstantTBT.KEY_DISTANCE_TO_MANEUVER_SCALE, scale); + return this; + } + + /** + * @return {Number} + */ + getDistanceToManeuverScale () { + return this.getParameter(ShowConstantTBT.KEY_DISTANCE_TO_MANEUVER_SCALE); + } + + /** + * @param {Boolean} complete - If and when a maneuver has completed while an AlertManeuver is active, the app must + * send this value set to TRUE in order to clear the AlertManeuver overlay. If omitted + * the value will be assumed as FALSE. + * @return {ShowConstantTBT} + */ + setManeuverComplete (complete) { + this.setParameter(ShowConstantTBT.KEY_MANEUVER_COMPLETE, complete); + return this; + } + + /** + * @return {Boolean} + */ + getManeuverComplete () { + return this.getParameter(ShowConstantTBT.KEY_MANEUVER_COMPLETE); + } + + /** + * @param {SoftButton[]} buttons - Three dynamic SoftButtons available (first SoftButton is fixed to "Turns"). If + * omitted on supported displays, the currently displayed SoftButton values will not + * change. + * @return {ShowConstantTBT} + */ + setSoftButtons (buttons) { + this.validateType(SoftButton, buttons, true); + this.setParameter(ShowConstantTBT.KEY_SOFT_BUTTONS, buttons); + return this; + } + + /** + * @return {SoftButton[]} + */ + getSoftButtons () { + return this.getObject(SoftButton, ShowConstantTBT.KEY_SOFT_BUTTONS); + } +} + +ShowConstantTBT.KEY_NAVIGATION_TEXT_1 = 'navigationText1'; +ShowConstantTBT.KEY_NAVIGATION_TEXT_2 = 'navigationText2'; +ShowConstantTBT.KEY_ETA = 'eta'; +ShowConstantTBT.KEY_TIME_TO_DESTINATION = 'timeToDestination'; +ShowConstantTBT.KEY_TOTAL_DISTANCE = 'totalDistance'; +ShowConstantTBT.KEY_TURN_ICON = 'turnIcon'; +ShowConstantTBT.KEY_NEXT_TURN_ICON = 'nextTurnIcon'; +ShowConstantTBT.KEY_DISTANCE_TO_MANEUVER = 'distanceToManeuver'; +ShowConstantTBT.KEY_DISTANCE_TO_MANEUVER_SCALE = 'distanceToManeuverScale'; +ShowConstantTBT.KEY_MANEUVER_COMPLETE = 'maneuverComplete'; +ShowConstantTBT.KEY_SOFT_BUTTONS = 'softButtons'; + +export { ShowConstantTBT }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ShowConstantTBTResponse.js b/lib/js/src/rpc/messages/ShowConstantTBTResponse.js new file mode 100644 index 00000000..fd46cc22 --- /dev/null +++ b/lib/js/src/rpc/messages/ShowConstantTBTResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class ShowConstantTBTResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.ShowConstantTBT); + } +} + + +export { ShowConstantTBTResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/ShowResponse.js b/lib/js/src/rpc/messages/ShowResponse.js index 0b636fc8..2a62a053 100644 --- a/lib/js/src/rpc/messages/ShowResponse.js +++ b/lib/js/src/rpc/messages/ShowResponse.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -30,17 +31,18 @@ * POSSIBILITY OF SUCH DAMAGE. */ -import { RpcResponse } from '../RpcResponse.js'; import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; class ShowResponse extends RpcResponse { /** - * @constructor - */ + * @constructor + */ constructor (store) { super(store); this.setFunctionName(FunctionID.Show); } } -export { ShowResponse }; + +export { ShowResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/Slider.js b/lib/js/src/rpc/messages/Slider.js new file mode 100644 index 00000000..54a28e65 --- /dev/null +++ b/lib/js/src/rpc/messages/Slider.js @@ -0,0 +1,158 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Creates a full screen or pop-up overlay (depending on platform) with a single user controlled slider. + */ +class Slider extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.Slider); + } + + /** + * @param {Number} ticks - Number of selectable items on a horizontal axis + * @return {Slider} + */ + setNumTicks (ticks) { + this.setParameter(Slider.KEY_NUM_TICKS, ticks); + return this; + } + + /** + * @return {Number} + */ + getNumTicks () { + return this.getParameter(Slider.KEY_NUM_TICKS); + } + + /** + * @param {Number} position - Initial position of slider control (cannot exceed numTicks) + * @return {Slider} + */ + setPosition (position) { + this.setParameter(Slider.KEY_POSITION, position); + return this; + } + + /** + * @return {Number} + */ + getPosition () { + return this.getParameter(Slider.KEY_POSITION); + } + + /** + * @param {String} header - Text header to display + * @return {Slider} + */ + setSliderHeader (header) { + this.setParameter(Slider.KEY_SLIDER_HEADER, header); + return this; + } + + /** + * @return {String} + */ + getSliderHeader () { + return this.getParameter(Slider.KEY_SLIDER_HEADER); + } + + /** + * @param {String[]} footer - Text footer to display (meant to display min/max threshold descriptors). For a static + * text footer, only one footer string shall be provided in the array. For a dynamic text + * footer, the number of footer text string in the array must match the numTicks value. + * For a dynamic text footer, text array string should correlate with potential slider + * position index. If omitted on supported displays, no footer text shall be displayed. + * @return {Slider} + */ + setSliderFooter (footer) { + this.setParameter(Slider.KEY_SLIDER_FOOTER, footer); + return this; + } + + /** + * @return {String[]} + */ + getSliderFooter () { + return this.getParameter(Slider.KEY_SLIDER_FOOTER); + } + + /** + * @param {Number} timeout - App defined timeout. Indicates how long of a timeout from the last action (i.e. sliding + * control resets timeout). If omitted, the value is set to 10000. + * @return {Slider} + */ + setTimeout (timeout) { + this.setParameter(Slider.KEY_TIMEOUT, timeout); + return this; + } + + /** + * @return {Number} + */ + getTimeout () { + return this.getParameter(Slider.KEY_TIMEOUT); + } + + /** + * @param {Number} id - An ID for this specific Slider to allow cancellation through the `CancelInteraction` RPC. + * @return {Slider} + */ + setCancelID (id) { + this.setParameter(Slider.KEY_CANCEL_ID, id); + return this; + } + + /** + * @return {Number} + */ + getCancelID () { + return this.getParameter(Slider.KEY_CANCEL_ID); + } +} + +Slider.KEY_NUM_TICKS = 'numTicks'; +Slider.KEY_POSITION = 'position'; +Slider.KEY_SLIDER_HEADER = 'sliderHeader'; +Slider.KEY_SLIDER_FOOTER = 'sliderFooter'; +Slider.KEY_TIMEOUT = 'timeout'; +Slider.KEY_CANCEL_ID = 'cancelID'; + +export { Slider }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SliderResponse.js b/lib/js/src/rpc/messages/SliderResponse.js new file mode 100644 index 00000000..b0848bb4 --- /dev/null +++ b/lib/js/src/rpc/messages/SliderResponse.js @@ -0,0 +1,66 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class SliderResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.Slider); + } + + /** + * @param {Number} position - Current slider value returned when saved or canceled (aborted) This value is only + * returned for resultCodes "SAVED" or "ABORTED" + * @return {SliderResponse} + */ + setSliderPosition (position) { + this.setParameter(SliderResponse.KEY_SLIDER_POSITION, position); + return this; + } + + /** + * @return {Number} + */ + getSliderPosition () { + return this.getParameter(SliderResponse.KEY_SLIDER_POSITION); + } +} + +SliderResponse.KEY_SLIDER_POSITION = 'sliderPosition'; + +export { SliderResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/Speak.js b/lib/js/src/rpc/messages/Speak.js new file mode 100644 index 00000000..8ede0a3f --- /dev/null +++ b/lib/js/src/rpc/messages/Speak.js @@ -0,0 +1,71 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { TTSChunk } from '../structs/TTSChunk.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Speaks a text. + */ +class Speak extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.Speak); + } + + /** + * @param {TTSChunk[]} chunks - An array of text chunks of type TTSChunk. See TTSChunk. The array must have at least + * one item. + * @return {Speak} + */ + setTtsChunks (chunks) { + this.validateType(TTSChunk, chunks, true); + this.setParameter(Speak.KEY_TTS_CHUNKS, chunks); + return this; + } + + /** + * @return {TTSChunk[]} + */ + getTtsChunks () { + return this.getObject(TTSChunk, Speak.KEY_TTS_CHUNKS); + } +} + +Speak.KEY_TTS_CHUNKS = 'ttsChunks'; + +export { Speak }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SpeakResponse.js b/lib/js/src/rpc/messages/SpeakResponse.js new file mode 100644 index 00000000..a25587e7 --- /dev/null +++ b/lib/js/src/rpc/messages/SpeakResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class SpeakResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.Speak); + } +} + + +export { SpeakResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SubscribeButton.js b/lib/js/src/rpc/messages/SubscribeButton.js new file mode 100644 index 00000000..2028ce2b --- /dev/null +++ b/lib/js/src/rpc/messages/SubscribeButton.js @@ -0,0 +1,71 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { ButtonName } from '../enums/ButtonName.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Subscribes to built-in HMI buttons. The application will be notified by the OnButtonEvent and OnButtonPress. To + * unsubscribe the notifications, use unsubscribeButton. + */ +class SubscribeButton extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SubscribeButton); + } + + /** + * @param {ButtonName} name - Name of the button to subscribe. + * @return {SubscribeButton} + */ + setButtonName (name) { + this.validateType(ButtonName, name); + this.setParameter(SubscribeButton.KEY_BUTTON_NAME, name); + return this; + } + + /** + * @return {ButtonName} + */ + getButtonName () { + return this.getObject(ButtonName, SubscribeButton.KEY_BUTTON_NAME); + } +} + +SubscribeButton.KEY_BUTTON_NAME = 'buttonName'; + +export { SubscribeButton }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SubscribeButtonResponse.js b/lib/js/src/rpc/messages/SubscribeButtonResponse.js new file mode 100644 index 00000000..517f779b --- /dev/null +++ b/lib/js/src/rpc/messages/SubscribeButtonResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class SubscribeButtonResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SubscribeButton); + } +} + + +export { SubscribeButtonResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SubscribeVehicleData.js b/lib/js/src/rpc/messages/SubscribeVehicleData.js new file mode 100644 index 00000000..37134212 --- /dev/null +++ b/lib/js/src/rpc/messages/SubscribeVehicleData.js @@ -0,0 +1,546 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Subscribes for specific published data items. The data will be only sent if it has changed. The application will be + * notified by the onVehicleData notification whenever new data is available. To unsubscribe the notifications, use + * unsubscribe with the same subscriptionType. + */ +class SubscribeVehicleData extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SubscribeVehicleData); + } + + /** + * @param {Boolean} gps - See GPSData + * @return {SubscribeVehicleData} + */ + setGps (gps) { + this.setParameter(SubscribeVehicleData.KEY_GPS, gps); + return this; + } + + /** + * @return {Boolean} + */ + getGps () { + return this.getParameter(SubscribeVehicleData.KEY_GPS); + } + + /** + * @param {Boolean} speed - The vehicle speed in kilometers per hour + * @return {SubscribeVehicleData} + */ + setSpeed (speed) { + this.setParameter(SubscribeVehicleData.KEY_SPEED, speed); + return this; + } + + /** + * @return {Boolean} + */ + getSpeed () { + return this.getParameter(SubscribeVehicleData.KEY_SPEED); + } + + /** + * @param {Boolean} rpm - The number of revolutions per minute of the engine + * @return {SubscribeVehicleData} + */ + setRpm (rpm) { + this.setParameter(SubscribeVehicleData.KEY_RPM, rpm); + return this; + } + + /** + * @return {Boolean} + */ + getRpm () { + return this.getParameter(SubscribeVehicleData.KEY_RPM); + } + + /** + * @param {Boolean} level - The fuel level in the tank (percentage) + * @return {SubscribeVehicleData} + */ + setFuelLevel (level) { + this.setParameter(SubscribeVehicleData.KEY_FUEL_LEVEL, level); + return this; + } + + /** + * @return {Boolean} + */ + getFuelLevel () { + return this.getParameter(SubscribeVehicleData.KEY_FUEL_LEVEL); + } + + /** + * @param {Boolean} level_state - The fuel level state + * @return {SubscribeVehicleData} + */ + setFuelLevel_State (level_state) { + this.setParameter(SubscribeVehicleData.KEY_FUEL_LEVEL_STATE, level_state); + return this; + } + + /** + * @return {Boolean} + */ + getFuelLevel_State () { + return this.getParameter(SubscribeVehicleData.KEY_FUEL_LEVEL_STATE); + } + + /** + * @param {Boolean} consumption - The instantaneous fuel consumption in microlitres + * @return {SubscribeVehicleData} + */ + setInstantFuelConsumption (consumption) { + this.setParameter(SubscribeVehicleData.KEY_INSTANT_FUEL_CONSUMPTION, consumption); + return this; + } + + /** + * @return {Boolean} + */ + getInstantFuelConsumption () { + return this.getParameter(SubscribeVehicleData.KEY_INSTANT_FUEL_CONSUMPTION); + } + + /** + * @param {Boolean} range - The estimate range in KM the vehicle can travel based on fuel level and consumption + * @return {SubscribeVehicleData} + */ + setFuelRange (range) { + this.setParameter(SubscribeVehicleData.KEY_FUEL_RANGE, range); + return this; + } + + /** + * @return {Boolean} + */ + getFuelRange () { + return this.getParameter(SubscribeVehicleData.KEY_FUEL_RANGE); + } + + /** + * @param {Boolean} temperature - The external temperature in degrees celsius + * @return {SubscribeVehicleData} + */ + setExternalTemperature (temperature) { + this.setParameter(SubscribeVehicleData.KEY_EXTERNAL_TEMPERATURE, temperature); + return this; + } + + /** + * @return {Boolean} + */ + getExternalTemperature () { + return this.getParameter(SubscribeVehicleData.KEY_EXTERNAL_TEMPERATURE); + } + + /** + * @param {Boolean} signal - See TurnSignal + * @return {SubscribeVehicleData} + */ + setTurnSignal (signal) { + this.setParameter(SubscribeVehicleData.KEY_TURN_SIGNAL, signal); + return this; + } + + /** + * @return {Boolean} + */ + getTurnSignal () { + return this.getParameter(SubscribeVehicleData.KEY_TURN_SIGNAL); + } + + /** + * @param {Boolean} prndl - See PRNDL + * @return {SubscribeVehicleData} + */ + setPrndl (prndl) { + this.setParameter(SubscribeVehicleData.KEY_PRNDL, prndl); + return this; + } + + /** + * @return {Boolean} + */ + getPrndl () { + return this.getParameter(SubscribeVehicleData.KEY_PRNDL); + } + + /** + * @param {Boolean} pressure - See TireStatus + * @return {SubscribeVehicleData} + */ + setTirePressure (pressure) { + this.setParameter(SubscribeVehicleData.KEY_TIRE_PRESSURE, pressure); + return this; + } + + /** + * @return {Boolean} + */ + getTirePressure () { + return this.getParameter(SubscribeVehicleData.KEY_TIRE_PRESSURE); + } + + /** + * @param {Boolean} odometer - Odometer in km + * @return {SubscribeVehicleData} + */ + setOdometer (odometer) { + this.setParameter(SubscribeVehicleData.KEY_ODOMETER, odometer); + return this; + } + + /** + * @return {Boolean} + */ + getOdometer () { + return this.getParameter(SubscribeVehicleData.KEY_ODOMETER); + } + + /** + * @param {Boolean} status - The status of the seat belts + * @return {SubscribeVehicleData} + */ + setBeltStatus (status) { + this.setParameter(SubscribeVehicleData.KEY_BELT_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getBeltStatus () { + return this.getParameter(SubscribeVehicleData.KEY_BELT_STATUS); + } + + /** + * @param {Boolean} information - The body information including power modes + * @return {SubscribeVehicleData} + */ + setBodyInformation (information) { + this.setParameter(SubscribeVehicleData.KEY_BODY_INFORMATION, information); + return this; + } + + /** + * @return {Boolean} + */ + getBodyInformation () { + return this.getParameter(SubscribeVehicleData.KEY_BODY_INFORMATION); + } + + /** + * @param {Boolean} status - The device status including signal and battery strength + * @return {SubscribeVehicleData} + */ + setDeviceStatus (status) { + this.setParameter(SubscribeVehicleData.KEY_DEVICE_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getDeviceStatus () { + return this.getParameter(SubscribeVehicleData.KEY_DEVICE_STATUS); + } + + /** + * @param {Boolean} braking - The status of the brake pedal + * @return {SubscribeVehicleData} + */ + setDriverBraking (braking) { + this.setParameter(SubscribeVehicleData.KEY_DRIVER_BRAKING, braking); + return this; + } + + /** + * @return {Boolean} + */ + getDriverBraking () { + return this.getParameter(SubscribeVehicleData.KEY_DRIVER_BRAKING); + } + + /** + * @param {Boolean} status - The status of the wipers + * @return {SubscribeVehicleData} + */ + setWiperStatus (status) { + this.setParameter(SubscribeVehicleData.KEY_WIPER_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getWiperStatus () { + return this.getParameter(SubscribeVehicleData.KEY_WIPER_STATUS); + } + + /** + * @param {Boolean} status - Status of the head lamps + * @return {SubscribeVehicleData} + */ + setHeadLampStatus (status) { + this.setParameter(SubscribeVehicleData.KEY_HEAD_LAMP_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getHeadLampStatus () { + return this.getParameter(SubscribeVehicleData.KEY_HEAD_LAMP_STATUS); + } + + /** + * @param {Boolean} torque - Torque value for engine (in Nm) on non-diesel variants + * @return {SubscribeVehicleData} + */ + setEngineTorque (torque) { + this.setParameter(SubscribeVehicleData.KEY_ENGINE_TORQUE, torque); + return this; + } + + /** + * @return {Boolean} + */ + getEngineTorque () { + return this.getParameter(SubscribeVehicleData.KEY_ENGINE_TORQUE); + } + + /** + * @param {Boolean} position - Accelerator pedal position (percentage depressed) + * @return {SubscribeVehicleData} + */ + setAccPedalPosition (position) { + this.setParameter(SubscribeVehicleData.KEY_ACC_PEDAL_POSITION, position); + return this; + } + + /** + * @return {Boolean} + */ + getAccPedalPosition () { + return this.getParameter(SubscribeVehicleData.KEY_ACC_PEDAL_POSITION); + } + + /** + * @param {Boolean} angle - Current angle of the steering wheel (in deg) + * @return {SubscribeVehicleData} + */ + setSteeringWheelAngle (angle) { + this.setParameter(SubscribeVehicleData.KEY_STEERING_WHEEL_ANGLE, angle); + return this; + } + + /** + * @return {Boolean} + */ + getSteeringWheelAngle () { + return this.getParameter(SubscribeVehicleData.KEY_STEERING_WHEEL_ANGLE); + } + + /** + * @param {Boolean} life - The estimated percentage of remaining oil life of the engine. + * @return {SubscribeVehicleData} + */ + setEngineOilLife (life) { + this.setParameter(SubscribeVehicleData.KEY_ENGINE_OIL_LIFE, life); + return this; + } + + /** + * @return {Boolean} + */ + getEngineOilLife () { + return this.getParameter(SubscribeVehicleData.KEY_ENGINE_OIL_LIFE); + } + + /** + * @param {Boolean} status - The status of the park brake as provided by Electric Park Brake (EPB) system. + * @return {SubscribeVehicleData} + */ + setElectronicParkBrakeStatus (status) { + this.setParameter(SubscribeVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getElectronicParkBrakeStatus () { + return this.getParameter(SubscribeVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS); + } + + /** + * @param {Boolean} id - Parameter used by cloud apps to identify a head unit + * @return {SubscribeVehicleData} + */ + setCloudAppVehicleID (id) { + this.setParameter(SubscribeVehicleData.KEY_CLOUD_APP_VEHICLE_ID, id); + return this; + } + + /** + * @return {Boolean} + */ + getCloudAppVehicleID () { + return this.getParameter(SubscribeVehicleData.KEY_CLOUD_APP_VEHICLE_ID); + } + + /** + * @param {Boolean} info - Emergency Call notification and confirmation data + * @return {SubscribeVehicleData} + */ + setECallInfo (info) { + this.setParameter(SubscribeVehicleData.KEY_E_CALL_INFO, info); + return this; + } + + /** + * @return {Boolean} + */ + getECallInfo () { + return this.getParameter(SubscribeVehicleData.KEY_E_CALL_INFO); + } + + /** + * @param {Boolean} status - The status of the air bags + * @return {SubscribeVehicleData} + */ + setAirbagStatus (status) { + this.setParameter(SubscribeVehicleData.KEY_AIRBAG_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getAirbagStatus () { + return this.getParameter(SubscribeVehicleData.KEY_AIRBAG_STATUS); + } + + /** + * @param {Boolean} event - Information related to an emergency event (and if it occurred) + * @return {SubscribeVehicleData} + */ + setEmergencyEvent (event) { + this.setParameter(SubscribeVehicleData.KEY_EMERGENCY_EVENT, event); + return this; + } + + /** + * @return {Boolean} + */ + getEmergencyEvent () { + return this.getParameter(SubscribeVehicleData.KEY_EMERGENCY_EVENT); + } + + /** + * @param {Boolean} status - The status modes of the cluster + * @return {SubscribeVehicleData} + */ + setClusterModeStatus (status) { + this.setParameter(SubscribeVehicleData.KEY_CLUSTER_MODE_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getClusterModeStatus () { + return this.getParameter(SubscribeVehicleData.KEY_CLUSTER_MODE_STATUS); + } + + /** + * @param {Boolean} key - Information related to the MyKey feature + * @return {SubscribeVehicleData} + */ + setMyKey (key) { + this.setParameter(SubscribeVehicleData.KEY_MY_KEY, key); + return this; + } + + /** + * @return {Boolean} + */ + getMyKey () { + return this.getParameter(SubscribeVehicleData.KEY_MY_KEY); + } +} + +SubscribeVehicleData.KEY_GPS = 'gps'; +SubscribeVehicleData.KEY_SPEED = 'speed'; +SubscribeVehicleData.KEY_RPM = 'rpm'; +SubscribeVehicleData.KEY_FUEL_LEVEL = 'fuelLevel'; +SubscribeVehicleData.KEY_FUEL_LEVEL_STATE = 'fuelLevel_State'; +SubscribeVehicleData.KEY_INSTANT_FUEL_CONSUMPTION = 'instantFuelConsumption'; +SubscribeVehicleData.KEY_FUEL_RANGE = 'fuelRange'; +SubscribeVehicleData.KEY_EXTERNAL_TEMPERATURE = 'externalTemperature'; +SubscribeVehicleData.KEY_TURN_SIGNAL = 'turnSignal'; +SubscribeVehicleData.KEY_PRNDL = 'prndl'; +SubscribeVehicleData.KEY_TIRE_PRESSURE = 'tirePressure'; +SubscribeVehicleData.KEY_ODOMETER = 'odometer'; +SubscribeVehicleData.KEY_BELT_STATUS = 'beltStatus'; +SubscribeVehicleData.KEY_BODY_INFORMATION = 'bodyInformation'; +SubscribeVehicleData.KEY_DEVICE_STATUS = 'deviceStatus'; +SubscribeVehicleData.KEY_DRIVER_BRAKING = 'driverBraking'; +SubscribeVehicleData.KEY_WIPER_STATUS = 'wiperStatus'; +SubscribeVehicleData.KEY_HEAD_LAMP_STATUS = 'headLampStatus'; +SubscribeVehicleData.KEY_ENGINE_TORQUE = 'engineTorque'; +SubscribeVehicleData.KEY_ACC_PEDAL_POSITION = 'accPedalPosition'; +SubscribeVehicleData.KEY_STEERING_WHEEL_ANGLE = 'steeringWheelAngle'; +SubscribeVehicleData.KEY_ENGINE_OIL_LIFE = 'engineOilLife'; +SubscribeVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS = 'electronicParkBrakeStatus'; +SubscribeVehicleData.KEY_CLOUD_APP_VEHICLE_ID = 'cloudAppVehicleID'; +SubscribeVehicleData.KEY_E_CALL_INFO = 'eCallInfo'; +SubscribeVehicleData.KEY_AIRBAG_STATUS = 'airbagStatus'; +SubscribeVehicleData.KEY_EMERGENCY_EVENT = 'emergencyEvent'; +SubscribeVehicleData.KEY_CLUSTER_MODE_STATUS = 'clusterModeStatus'; +SubscribeVehicleData.KEY_MY_KEY = 'myKey'; + +export { SubscribeVehicleData }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SubscribeVehicleDataResponse.js b/lib/js/src/rpc/messages/SubscribeVehicleDataResponse.js new file mode 100644 index 00000000..9189ccee --- /dev/null +++ b/lib/js/src/rpc/messages/SubscribeVehicleDataResponse.js @@ -0,0 +1,572 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; +import { VehicleDataResult } from '../structs/VehicleDataResult.js'; + +class SubscribeVehicleDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SubscribeVehicleData); + } + + /** + * @param {VehicleDataResult} gps - See GPSData + * @return {SubscribeVehicleDataResponse} + */ + setGps (gps) { + this.validateType(VehicleDataResult, gps); + this.setParameter(SubscribeVehicleDataResponse.KEY_GPS, gps); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getGps () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_GPS); + } + + /** + * @param {VehicleDataResult} speed - The vehicle speed in kilometers per hour + * @return {SubscribeVehicleDataResponse} + */ + setSpeed (speed) { + this.validateType(VehicleDataResult, speed); + this.setParameter(SubscribeVehicleDataResponse.KEY_SPEED, speed); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getSpeed () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_SPEED); + } + + /** + * @param {VehicleDataResult} rpm - The number of revolutions per minute of the engine + * @return {SubscribeVehicleDataResponse} + */ + setRpm (rpm) { + this.validateType(VehicleDataResult, rpm); + this.setParameter(SubscribeVehicleDataResponse.KEY_RPM, rpm); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getRpm () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_RPM); + } + + /** + * @param {VehicleDataResult} level - The fuel level in the tank (percentage) + * @return {SubscribeVehicleDataResponse} + */ + setFuelLevel (level) { + this.validateType(VehicleDataResult, level); + this.setParameter(SubscribeVehicleDataResponse.KEY_FUEL_LEVEL, level); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getFuelLevel () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_FUEL_LEVEL); + } + + /** + * @param {VehicleDataResult} level_state - The fuel level state + * @return {SubscribeVehicleDataResponse} + */ + setFuelLevel_State (level_state) { + this.validateType(VehicleDataResult, level_state); + this.setParameter(SubscribeVehicleDataResponse.KEY_FUEL_LEVEL_STATE, level_state); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getFuelLevel_State () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_FUEL_LEVEL_STATE); + } + + /** + * @param {VehicleDataResult} consumption - The instantaneous fuel consumption in microlitres + * @return {SubscribeVehicleDataResponse} + */ + setInstantFuelConsumption (consumption) { + this.validateType(VehicleDataResult, consumption); + this.setParameter(SubscribeVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION, consumption); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getInstantFuelConsumption () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION); + } + + /** + * @param {VehicleDataResult} range - The estimate range in KM the vehicle can travel based on fuel level and + * consumption + * @return {SubscribeVehicleDataResponse} + */ + setFuelRange (range) { + this.validateType(VehicleDataResult, range); + this.setParameter(SubscribeVehicleDataResponse.KEY_FUEL_RANGE, range); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getFuelRange () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_FUEL_RANGE); + } + + /** + * @param {VehicleDataResult} temperature - The external temperature in degrees celsius. + * @return {SubscribeVehicleDataResponse} + */ + setExternalTemperature (temperature) { + this.validateType(VehicleDataResult, temperature); + this.setParameter(SubscribeVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE, temperature); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getExternalTemperature () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE); + } + + /** + * @param {VehicleDataResult} signal - See TurnSignal + * @return {SubscribeVehicleDataResponse} + */ + setTurnSignal (signal) { + this.validateType(VehicleDataResult, signal); + this.setParameter(SubscribeVehicleDataResponse.KEY_TURN_SIGNAL, signal); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getTurnSignal () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_TURN_SIGNAL); + } + + /** + * @param {VehicleDataResult} prndl - See PRNDL + * @return {SubscribeVehicleDataResponse} + */ + setPrndl (prndl) { + this.validateType(VehicleDataResult, prndl); + this.setParameter(SubscribeVehicleDataResponse.KEY_PRNDL, prndl); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getPrndl () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_PRNDL); + } + + /** + * @param {VehicleDataResult} pressure - See TireStatus + * @return {SubscribeVehicleDataResponse} + */ + setTirePressure (pressure) { + this.validateType(VehicleDataResult, pressure); + this.setParameter(SubscribeVehicleDataResponse.KEY_TIRE_PRESSURE, pressure); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getTirePressure () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_TIRE_PRESSURE); + } + + /** + * @param {VehicleDataResult} odometer - Odometer in km + * @return {SubscribeVehicleDataResponse} + */ + setOdometer (odometer) { + this.validateType(VehicleDataResult, odometer); + this.setParameter(SubscribeVehicleDataResponse.KEY_ODOMETER, odometer); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getOdometer () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_ODOMETER); + } + + /** + * @param {VehicleDataResult} status - The status of the seat belts + * @return {SubscribeVehicleDataResponse} + */ + setBeltStatus (status) { + this.validateType(VehicleDataResult, status); + this.setParameter(SubscribeVehicleDataResponse.KEY_BELT_STATUS, status); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getBeltStatus () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_BELT_STATUS); + } + + /** + * @param {VehicleDataResult} information - The body information including power modes + * @return {SubscribeVehicleDataResponse} + */ + setBodyInformation (information) { + this.validateType(VehicleDataResult, information); + this.setParameter(SubscribeVehicleDataResponse.KEY_BODY_INFORMATION, information); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getBodyInformation () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_BODY_INFORMATION); + } + + /** + * @param {VehicleDataResult} status - The device status including signal and battery strength + * @return {SubscribeVehicleDataResponse} + */ + setDeviceStatus (status) { + this.validateType(VehicleDataResult, status); + this.setParameter(SubscribeVehicleDataResponse.KEY_DEVICE_STATUS, status); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getDeviceStatus () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_DEVICE_STATUS); + } + + /** + * @param {VehicleDataResult} braking - The status of the brake pedal + * @return {SubscribeVehicleDataResponse} + */ + setDriverBraking (braking) { + this.validateType(VehicleDataResult, braking); + this.setParameter(SubscribeVehicleDataResponse.KEY_DRIVER_BRAKING, braking); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getDriverBraking () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_DRIVER_BRAKING); + } + + /** + * @param {VehicleDataResult} status - The status of the wipers + * @return {SubscribeVehicleDataResponse} + */ + setWiperStatus (status) { + this.validateType(VehicleDataResult, status); + this.setParameter(SubscribeVehicleDataResponse.KEY_WIPER_STATUS, status); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getWiperStatus () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_WIPER_STATUS); + } + + /** + * @param {VehicleDataResult} status - Status of the head lamps + * @return {SubscribeVehicleDataResponse} + */ + setHeadLampStatus (status) { + this.validateType(VehicleDataResult, status); + this.setParameter(SubscribeVehicleDataResponse.KEY_HEAD_LAMP_STATUS, status); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getHeadLampStatus () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_HEAD_LAMP_STATUS); + } + + /** + * @param {VehicleDataResult} torque - Torque value for engine (in Nm) on non-diesel variants + * @return {SubscribeVehicleDataResponse} + */ + setEngineTorque (torque) { + this.validateType(VehicleDataResult, torque); + this.setParameter(SubscribeVehicleDataResponse.KEY_ENGINE_TORQUE, torque); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getEngineTorque () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_ENGINE_TORQUE); + } + + /** + * @param {VehicleDataResult} position - Accelerator pedal position (percentage depressed) + * @return {SubscribeVehicleDataResponse} + */ + setAccPedalPosition (position) { + this.validateType(VehicleDataResult, position); + this.setParameter(SubscribeVehicleDataResponse.KEY_ACC_PEDAL_POSITION, position); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getAccPedalPosition () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_ACC_PEDAL_POSITION); + } + + /** + * @param {VehicleDataResult} angle - Current angle of the steering wheel (in deg) + * @return {SubscribeVehicleDataResponse} + */ + setSteeringWheelAngle (angle) { + this.validateType(VehicleDataResult, angle); + this.setParameter(SubscribeVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE, angle); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getSteeringWheelAngle () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE); + } + + /** + * @param {VehicleDataResult} life - The estimated percentage of remaining oil life of the engine. + * @return {SubscribeVehicleDataResponse} + */ + setEngineOilLife (life) { + this.validateType(VehicleDataResult, life); + this.setParameter(SubscribeVehicleDataResponse.KEY_ENGINE_OIL_LIFE, life); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getEngineOilLife () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_ENGINE_OIL_LIFE); + } + + /** + * @param {VehicleDataResult} status - The status of the park brake as provided by Electric Park Brake (EPB) system. + * @return {SubscribeVehicleDataResponse} + */ + setElectronicParkBrakeStatus (status) { + this.validateType(VehicleDataResult, status); + this.setParameter(SubscribeVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS, status); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getElectronicParkBrakeStatus () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS); + } + + /** + * @param {VehicleDataResult} id - Parameter used by cloud apps to identify a head unit + * @return {SubscribeVehicleDataResponse} + */ + setCloudAppVehicleID (id) { + this.validateType(VehicleDataResult, id); + this.setParameter(SubscribeVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID, id); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getCloudAppVehicleID () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID); + } + + /** + * @param {VehicleDataResult} info - Emergency Call notification and confirmation data + * @return {SubscribeVehicleDataResponse} + */ + setECallInfo (info) { + this.validateType(VehicleDataResult, info); + this.setParameter(SubscribeVehicleDataResponse.KEY_E_CALL_INFO, info); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getECallInfo () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_E_CALL_INFO); + } + + /** + * @param {VehicleDataResult} status - The status of the air bags + * @return {SubscribeVehicleDataResponse} + */ + setAirbagStatus (status) { + this.validateType(VehicleDataResult, status); + this.setParameter(SubscribeVehicleDataResponse.KEY_AIRBAG_STATUS, status); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getAirbagStatus () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_AIRBAG_STATUS); + } + + /** + * @param {VehicleDataResult} event - Information related to an emergency event (and if it occurred) + * @return {SubscribeVehicleDataResponse} + */ + setEmergencyEvent (event) { + this.validateType(VehicleDataResult, event); + this.setParameter(SubscribeVehicleDataResponse.KEY_EMERGENCY_EVENT, event); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getEmergencyEvent () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_EMERGENCY_EVENT); + } + + /** + * @param {VehicleDataResult} modes - The status modes of the cluster + * @return {SubscribeVehicleDataResponse} + */ + setClusterModes (modes) { + this.validateType(VehicleDataResult, modes); + this.setParameter(SubscribeVehicleDataResponse.KEY_CLUSTER_MODES, modes); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getClusterModes () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_CLUSTER_MODES); + } + + /** + * @param {VehicleDataResult} key - Information related to the MyKey feature + * @return {SubscribeVehicleDataResponse} + */ + setMyKey (key) { + this.validateType(VehicleDataResult, key); + this.setParameter(SubscribeVehicleDataResponse.KEY_MY_KEY, key); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getMyKey () { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_MY_KEY); + } +} + +SubscribeVehicleDataResponse.KEY_GPS = 'gps'; +SubscribeVehicleDataResponse.KEY_SPEED = 'speed'; +SubscribeVehicleDataResponse.KEY_RPM = 'rpm'; +SubscribeVehicleDataResponse.KEY_FUEL_LEVEL = 'fuelLevel'; +SubscribeVehicleDataResponse.KEY_FUEL_LEVEL_STATE = 'fuelLevel_State'; +SubscribeVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION = 'instantFuelConsumption'; +SubscribeVehicleDataResponse.KEY_FUEL_RANGE = 'fuelRange'; +SubscribeVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE = 'externalTemperature'; +SubscribeVehicleDataResponse.KEY_TURN_SIGNAL = 'turnSignal'; +SubscribeVehicleDataResponse.KEY_PRNDL = 'prndl'; +SubscribeVehicleDataResponse.KEY_TIRE_PRESSURE = 'tirePressure'; +SubscribeVehicleDataResponse.KEY_ODOMETER = 'odometer'; +SubscribeVehicleDataResponse.KEY_BELT_STATUS = 'beltStatus'; +SubscribeVehicleDataResponse.KEY_BODY_INFORMATION = 'bodyInformation'; +SubscribeVehicleDataResponse.KEY_DEVICE_STATUS = 'deviceStatus'; +SubscribeVehicleDataResponse.KEY_DRIVER_BRAKING = 'driverBraking'; +SubscribeVehicleDataResponse.KEY_WIPER_STATUS = 'wiperStatus'; +SubscribeVehicleDataResponse.KEY_HEAD_LAMP_STATUS = 'headLampStatus'; +SubscribeVehicleDataResponse.KEY_ENGINE_TORQUE = 'engineTorque'; +SubscribeVehicleDataResponse.KEY_ACC_PEDAL_POSITION = 'accPedalPosition'; +SubscribeVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE = 'steeringWheelAngle'; +SubscribeVehicleDataResponse.KEY_ENGINE_OIL_LIFE = 'engineOilLife'; +SubscribeVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS = 'electronicParkBrakeStatus'; +SubscribeVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID = 'cloudAppVehicleID'; +SubscribeVehicleDataResponse.KEY_E_CALL_INFO = 'eCallInfo'; +SubscribeVehicleDataResponse.KEY_AIRBAG_STATUS = 'airbagStatus'; +SubscribeVehicleDataResponse.KEY_EMERGENCY_EVENT = 'emergencyEvent'; +SubscribeVehicleDataResponse.KEY_CLUSTER_MODES = 'clusterModes'; +SubscribeVehicleDataResponse.KEY_MY_KEY = 'myKey'; + +export { SubscribeVehicleDataResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SubscribeWayPoints.js b/lib/js/src/rpc/messages/SubscribeWayPoints.js new file mode 100644 index 00000000..309be2c3 --- /dev/null +++ b/lib/js/src/rpc/messages/SubscribeWayPoints.js @@ -0,0 +1,51 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * To subscribe in getting changes for Waypoints/destinations + */ +class SubscribeWayPoints extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SubscribeWayPoints); + } +} + + +export { SubscribeWayPoints }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SubscribeWayPointsResponse.js b/lib/js/src/rpc/messages/SubscribeWayPointsResponse.js new file mode 100644 index 00000000..d2100e99 --- /dev/null +++ b/lib/js/src/rpc/messages/SubscribeWayPointsResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class SubscribeWayPointsResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SubscribeWayPoints); + } +} + + +export { SubscribeWayPointsResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SystemRequest.js b/lib/js/src/rpc/messages/SystemRequest.js new file mode 100644 index 00000000..094eff86 --- /dev/null +++ b/lib/js/src/rpc/messages/SystemRequest.js @@ -0,0 +1,107 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { RequestType } from '../enums/RequestType.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * An asynchronous request from the device; binary data can be included in hybrid part of message for some requests + * (such as HTTP, Proprietary, or Authentication requests) + */ +class SystemRequest extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SystemRequest); + } + + /** + * @param {RequestType} type - The type of system request. Note that Proprietary requests should forward the binary + * data to the known proprietary module on the system. + * @return {SystemRequest} + */ + setRequestType (type) { + this.validateType(RequestType, type); + this.setParameter(SystemRequest.KEY_REQUEST_TYPE, type); + return this; + } + + /** + * @return {RequestType} + */ + getRequestType () { + return this.getObject(RequestType, SystemRequest.KEY_REQUEST_TYPE); + } + + /** + * @param {String} type - This parameter is filled for supporting OEM proprietary data exchanges. + * @return {SystemRequest} + */ + setRequestSubType (type) { + this.setParameter(SystemRequest.KEY_REQUEST_SUB_TYPE, type); + return this; + } + + /** + * @return {String} + */ + getRequestSubType () { + return this.getParameter(SystemRequest.KEY_REQUEST_SUB_TYPE); + } + + /** + * @param {String} name - Filename of HTTP data to store in predefined system staging area. Mandatory if requestType + * is HTTP. PROPRIETARY requestType should ignore this parameter. + * @return {SystemRequest} + */ + setFileName (name) { + this.setParameter(SystemRequest.KEY_FILE_NAME, name); + return this; + } + + /** + * @return {String} + */ + getFileName () { + return this.getParameter(SystemRequest.KEY_FILE_NAME); + } +} + +SystemRequest.KEY_REQUEST_TYPE = 'requestType'; +SystemRequest.KEY_REQUEST_SUB_TYPE = 'requestSubType'; +SystemRequest.KEY_FILE_NAME = 'fileName'; + +export { SystemRequest }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/SystemRequestResponse.js b/lib/js/src/rpc/messages/SystemRequestResponse.js new file mode 100644 index 00000000..2bb1c832 --- /dev/null +++ b/lib/js/src/rpc/messages/SystemRequestResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class SystemRequestResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.SystemRequest); + } +} + + +export { SystemRequestResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/UnpublishAppService.js b/lib/js/src/rpc/messages/UnpublishAppService.js new file mode 100644 index 00000000..0fcb69b1 --- /dev/null +++ b/lib/js/src/rpc/messages/UnpublishAppService.js @@ -0,0 +1,68 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Unpublish an existing service published by this application. + */ +class UnpublishAppService extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.UnpublishAppService); + } + + /** + * @param {String} id - The ID of the service to be unpublished. + * @return {UnpublishAppService} + */ + setServiceID (id) { + this.setParameter(UnpublishAppService.KEY_SERVICE_ID, id); + return this; + } + + /** + * @return {String} + */ + getServiceID () { + return this.getParameter(UnpublishAppService.KEY_SERVICE_ID); + } +} + +UnpublishAppService.KEY_SERVICE_ID = 'serviceID'; + +export { UnpublishAppService }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/UnpublishAppServiceResponse.js b/lib/js/src/rpc/messages/UnpublishAppServiceResponse.js new file mode 100644 index 00000000..6ab57439 --- /dev/null +++ b/lib/js/src/rpc/messages/UnpublishAppServiceResponse.js @@ -0,0 +1,51 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +/** + * The response to UnpublishAppService + */ +class UnpublishAppServiceResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.UnpublishAppService); + } +} + + +export { UnpublishAppServiceResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/UnregisterAppInterface.js b/lib/js/src/rpc/messages/UnregisterAppInterface.js index 0116a608..c754d6cb 100644 --- a/lib/js/src/rpc/messages/UnregisterAppInterface.js +++ b/lib/js/src/rpc/messages/UnregisterAppInterface.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -33,10 +34,15 @@ import { RpcRequest } from '../RpcRequest.js'; import { FunctionID } from '../enums/FunctionID.js'; +/** + * Closes an interface from a mobile application. After unregisterAppInterface, no commands other than + * registerAppInterface will be accepted/executed. Will fail, if no registerAppInterface was completed successfully + * before. + */ class UnregisterAppInterface extends RpcRequest { /** - * @constructor - */ + * @constructor + */ constructor (store) { super(store); this.setFunctionName(FunctionID.UnregisterAppInterface); @@ -44,4 +50,4 @@ class UnregisterAppInterface extends RpcRequest { } -export { UnregisterAppInterface }; +export { UnregisterAppInterface }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/UnregisterAppInterfaceResponse.js b/lib/js/src/rpc/messages/UnregisterAppInterfaceResponse.js index cb785934..983550ab 100644 --- a/lib/js/src/rpc/messages/UnregisterAppInterfaceResponse.js +++ b/lib/js/src/rpc/messages/UnregisterAppInterfaceResponse.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -30,17 +31,18 @@ * POSSIBILITY OF SUCH DAMAGE. */ -import { RpcResponse } from '../RpcResponse.js'; import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; class UnregisterAppInterfaceResponse extends RpcResponse { /** - * @constructor - */ + * @constructor + */ constructor (store) { super(store); this.setFunctionName(FunctionID.UnregisterAppInterface); } } -export { UnregisterAppInterfaceResponse }; + +export { UnregisterAppInterfaceResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/UnsubscribeButton.js b/lib/js/src/rpc/messages/UnsubscribeButton.js new file mode 100644 index 00000000..d4dd7af9 --- /dev/null +++ b/lib/js/src/rpc/messages/UnsubscribeButton.js @@ -0,0 +1,70 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { ButtonName } from '../enums/ButtonName.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Unsubscribes from built-in HMI buttons. + */ +class UnsubscribeButton extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.UnsubscribeButton); + } + + /** + * @param {ButtonName} name - Name of the button to unsubscribe. + * @return {UnsubscribeButton} + */ + setButtonName (name) { + this.validateType(ButtonName, name); + this.setParameter(UnsubscribeButton.KEY_BUTTON_NAME, name); + return this; + } + + /** + * @return {ButtonName} + */ + getButtonName () { + return this.getObject(ButtonName, UnsubscribeButton.KEY_BUTTON_NAME); + } +} + +UnsubscribeButton.KEY_BUTTON_NAME = 'buttonName'; + +export { UnsubscribeButton }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/UnsubscribeButtonResponse.js b/lib/js/src/rpc/messages/UnsubscribeButtonResponse.js new file mode 100644 index 00000000..386b785c --- /dev/null +++ b/lib/js/src/rpc/messages/UnsubscribeButtonResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class UnsubscribeButtonResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.UnsubscribeButton); + } +} + + +export { UnsubscribeButtonResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/UnsubscribeVehicleData.js b/lib/js/src/rpc/messages/UnsubscribeVehicleData.js new file mode 100644 index 00000000..2bf5f92d --- /dev/null +++ b/lib/js/src/rpc/messages/UnsubscribeVehicleData.js @@ -0,0 +1,544 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * This function is used to unsubscribe the notifications from the subscribeVehicleData function. + */ +class UnsubscribeVehicleData extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.UnsubscribeVehicleData); + } + + /** + * @param {Boolean} gps - See GPSData + * @return {UnsubscribeVehicleData} + */ + setGps (gps) { + this.setParameter(UnsubscribeVehicleData.KEY_GPS, gps); + return this; + } + + /** + * @return {Boolean} + */ + getGps () { + return this.getParameter(UnsubscribeVehicleData.KEY_GPS); + } + + /** + * @param {Boolean} speed - The vehicle speed in kilometers per hour + * @return {UnsubscribeVehicleData} + */ + setSpeed (speed) { + this.setParameter(UnsubscribeVehicleData.KEY_SPEED, speed); + return this; + } + + /** + * @return {Boolean} + */ + getSpeed () { + return this.getParameter(UnsubscribeVehicleData.KEY_SPEED); + } + + /** + * @param {Boolean} rpm - The number of revolutions per minute of the engine + * @return {UnsubscribeVehicleData} + */ + setRpm (rpm) { + this.setParameter(UnsubscribeVehicleData.KEY_RPM, rpm); + return this; + } + + /** + * @return {Boolean} + */ + getRpm () { + return this.getParameter(UnsubscribeVehicleData.KEY_RPM); + } + + /** + * @param {Boolean} level - The fuel level in the tank (percentage) + * @return {UnsubscribeVehicleData} + */ + setFuelLevel (level) { + this.setParameter(UnsubscribeVehicleData.KEY_FUEL_LEVEL, level); + return this; + } + + /** + * @return {Boolean} + */ + getFuelLevel () { + return this.getParameter(UnsubscribeVehicleData.KEY_FUEL_LEVEL); + } + + /** + * @param {Boolean} level_state - The fuel level state + * @return {UnsubscribeVehicleData} + */ + setFuelLevel_State (level_state) { + this.setParameter(UnsubscribeVehicleData.KEY_FUEL_LEVEL_STATE, level_state); + return this; + } + + /** + * @return {Boolean} + */ + getFuelLevel_State () { + return this.getParameter(UnsubscribeVehicleData.KEY_FUEL_LEVEL_STATE); + } + + /** + * @param {Boolean} consumption - The instantaneous fuel consumption in microlitres + * @return {UnsubscribeVehicleData} + */ + setInstantFuelConsumption (consumption) { + this.setParameter(UnsubscribeVehicleData.KEY_INSTANT_FUEL_CONSUMPTION, consumption); + return this; + } + + /** + * @return {Boolean} + */ + getInstantFuelConsumption () { + return this.getParameter(UnsubscribeVehicleData.KEY_INSTANT_FUEL_CONSUMPTION); + } + + /** + * @param {Boolean} range - The estimate range in KM the vehicle can travel based on fuel level and consumption + * @return {UnsubscribeVehicleData} + */ + setFuelRange (range) { + this.setParameter(UnsubscribeVehicleData.KEY_FUEL_RANGE, range); + return this; + } + + /** + * @return {Boolean} + */ + getFuelRange () { + return this.getParameter(UnsubscribeVehicleData.KEY_FUEL_RANGE); + } + + /** + * @param {Boolean} temperature - The external temperature in degrees celsius. + * @return {UnsubscribeVehicleData} + */ + setExternalTemperature (temperature) { + this.setParameter(UnsubscribeVehicleData.KEY_EXTERNAL_TEMPERATURE, temperature); + return this; + } + + /** + * @return {Boolean} + */ + getExternalTemperature () { + return this.getParameter(UnsubscribeVehicleData.KEY_EXTERNAL_TEMPERATURE); + } + + /** + * @param {Boolean} signal - See TurnSignal + * @return {UnsubscribeVehicleData} + */ + setTurnSignal (signal) { + this.setParameter(UnsubscribeVehicleData.KEY_TURN_SIGNAL, signal); + return this; + } + + /** + * @return {Boolean} + */ + getTurnSignal () { + return this.getParameter(UnsubscribeVehicleData.KEY_TURN_SIGNAL); + } + + /** + * @param {Boolean} prndl - See PRNDL + * @return {UnsubscribeVehicleData} + */ + setPrndl (prndl) { + this.setParameter(UnsubscribeVehicleData.KEY_PRNDL, prndl); + return this; + } + + /** + * @return {Boolean} + */ + getPrndl () { + return this.getParameter(UnsubscribeVehicleData.KEY_PRNDL); + } + + /** + * @param {Boolean} pressure - See TireStatus + * @return {UnsubscribeVehicleData} + */ + setTirePressure (pressure) { + this.setParameter(UnsubscribeVehicleData.KEY_TIRE_PRESSURE, pressure); + return this; + } + + /** + * @return {Boolean} + */ + getTirePressure () { + return this.getParameter(UnsubscribeVehicleData.KEY_TIRE_PRESSURE); + } + + /** + * @param {Boolean} odometer - Odometer in km + * @return {UnsubscribeVehicleData} + */ + setOdometer (odometer) { + this.setParameter(UnsubscribeVehicleData.KEY_ODOMETER, odometer); + return this; + } + + /** + * @return {Boolean} + */ + getOdometer () { + return this.getParameter(UnsubscribeVehicleData.KEY_ODOMETER); + } + + /** + * @param {Boolean} status - The status of the seat belts + * @return {UnsubscribeVehicleData} + */ + setBeltStatus (status) { + this.setParameter(UnsubscribeVehicleData.KEY_BELT_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getBeltStatus () { + return this.getParameter(UnsubscribeVehicleData.KEY_BELT_STATUS); + } + + /** + * @param {Boolean} information - The body information including power modes + * @return {UnsubscribeVehicleData} + */ + setBodyInformation (information) { + this.setParameter(UnsubscribeVehicleData.KEY_BODY_INFORMATION, information); + return this; + } + + /** + * @return {Boolean} + */ + getBodyInformation () { + return this.getParameter(UnsubscribeVehicleData.KEY_BODY_INFORMATION); + } + + /** + * @param {Boolean} status - The device status including signal and battery strength + * @return {UnsubscribeVehicleData} + */ + setDeviceStatus (status) { + this.setParameter(UnsubscribeVehicleData.KEY_DEVICE_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getDeviceStatus () { + return this.getParameter(UnsubscribeVehicleData.KEY_DEVICE_STATUS); + } + + /** + * @param {Boolean} braking - The status of the brake pedal + * @return {UnsubscribeVehicleData} + */ + setDriverBraking (braking) { + this.setParameter(UnsubscribeVehicleData.KEY_DRIVER_BRAKING, braking); + return this; + } + + /** + * @return {Boolean} + */ + getDriverBraking () { + return this.getParameter(UnsubscribeVehicleData.KEY_DRIVER_BRAKING); + } + + /** + * @param {Boolean} status - The status of the wipers + * @return {UnsubscribeVehicleData} + */ + setWiperStatus (status) { + this.setParameter(UnsubscribeVehicleData.KEY_WIPER_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getWiperStatus () { + return this.getParameter(UnsubscribeVehicleData.KEY_WIPER_STATUS); + } + + /** + * @param {Boolean} status - Status of the head lamps + * @return {UnsubscribeVehicleData} + */ + setHeadLampStatus (status) { + this.setParameter(UnsubscribeVehicleData.KEY_HEAD_LAMP_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getHeadLampStatus () { + return this.getParameter(UnsubscribeVehicleData.KEY_HEAD_LAMP_STATUS); + } + + /** + * @param {Boolean} torque - Torque value for engine (in Nm) on non-diesel variants + * @return {UnsubscribeVehicleData} + */ + setEngineTorque (torque) { + this.setParameter(UnsubscribeVehicleData.KEY_ENGINE_TORQUE, torque); + return this; + } + + /** + * @return {Boolean} + */ + getEngineTorque () { + return this.getParameter(UnsubscribeVehicleData.KEY_ENGINE_TORQUE); + } + + /** + * @param {Boolean} position - Accelerator pedal position (percentage depressed) + * @return {UnsubscribeVehicleData} + */ + setAccPedalPosition (position) { + this.setParameter(UnsubscribeVehicleData.KEY_ACC_PEDAL_POSITION, position); + return this; + } + + /** + * @return {Boolean} + */ + getAccPedalPosition () { + return this.getParameter(UnsubscribeVehicleData.KEY_ACC_PEDAL_POSITION); + } + + /** + * @param {Boolean} angle - Current angle of the steering wheel (in deg) + * @return {UnsubscribeVehicleData} + */ + setSteeringWheelAngle (angle) { + this.setParameter(UnsubscribeVehicleData.KEY_STEERING_WHEEL_ANGLE, angle); + return this; + } + + /** + * @return {Boolean} + */ + getSteeringWheelAngle () { + return this.getParameter(UnsubscribeVehicleData.KEY_STEERING_WHEEL_ANGLE); + } + + /** + * @param {Boolean} life - The estimated percentage of remaining oil life of the engine. + * @return {UnsubscribeVehicleData} + */ + setEngineOilLife (life) { + this.setParameter(UnsubscribeVehicleData.KEY_ENGINE_OIL_LIFE, life); + return this; + } + + /** + * @return {Boolean} + */ + getEngineOilLife () { + return this.getParameter(UnsubscribeVehicleData.KEY_ENGINE_OIL_LIFE); + } + + /** + * @param {Boolean} status - The status of the park brake as provided by Electric Park Brake (EPB) system. + * @return {UnsubscribeVehicleData} + */ + setElectronicParkBrakeStatus (status) { + this.setParameter(UnsubscribeVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getElectronicParkBrakeStatus () { + return this.getParameter(UnsubscribeVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS); + } + + /** + * @param {Boolean} id - Parameter used by cloud apps to identify a head unit + * @return {UnsubscribeVehicleData} + */ + setCloudAppVehicleID (id) { + this.setParameter(UnsubscribeVehicleData.KEY_CLOUD_APP_VEHICLE_ID, id); + return this; + } + + /** + * @return {Boolean} + */ + getCloudAppVehicleID () { + return this.getParameter(UnsubscribeVehicleData.KEY_CLOUD_APP_VEHICLE_ID); + } + + /** + * @param {Boolean} info - Emergency Call notification and confirmation data + * @return {UnsubscribeVehicleData} + */ + setECallInfo (info) { + this.setParameter(UnsubscribeVehicleData.KEY_E_CALL_INFO, info); + return this; + } + + /** + * @return {Boolean} + */ + getECallInfo () { + return this.getParameter(UnsubscribeVehicleData.KEY_E_CALL_INFO); + } + + /** + * @param {Boolean} status - The status of the air bags + * @return {UnsubscribeVehicleData} + */ + setAirbagStatus (status) { + this.setParameter(UnsubscribeVehicleData.KEY_AIRBAG_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getAirbagStatus () { + return this.getParameter(UnsubscribeVehicleData.KEY_AIRBAG_STATUS); + } + + /** + * @param {Boolean} event - Information related to an emergency event (and if it occurred) + * @return {UnsubscribeVehicleData} + */ + setEmergencyEvent (event) { + this.setParameter(UnsubscribeVehicleData.KEY_EMERGENCY_EVENT, event); + return this; + } + + /** + * @return {Boolean} + */ + getEmergencyEvent () { + return this.getParameter(UnsubscribeVehicleData.KEY_EMERGENCY_EVENT); + } + + /** + * @param {Boolean} status - The status modes of the cluster + * @return {UnsubscribeVehicleData} + */ + setClusterModeStatus (status) { + this.setParameter(UnsubscribeVehicleData.KEY_CLUSTER_MODE_STATUS, status); + return this; + } + + /** + * @return {Boolean} + */ + getClusterModeStatus () { + return this.getParameter(UnsubscribeVehicleData.KEY_CLUSTER_MODE_STATUS); + } + + /** + * @param {Boolean} key - Information related to the MyKey feature + * @return {UnsubscribeVehicleData} + */ + setMyKey (key) { + this.setParameter(UnsubscribeVehicleData.KEY_MY_KEY, key); + return this; + } + + /** + * @return {Boolean} + */ + getMyKey () { + return this.getParameter(UnsubscribeVehicleData.KEY_MY_KEY); + } +} + +UnsubscribeVehicleData.KEY_GPS = 'gps'; +UnsubscribeVehicleData.KEY_SPEED = 'speed'; +UnsubscribeVehicleData.KEY_RPM = 'rpm'; +UnsubscribeVehicleData.KEY_FUEL_LEVEL = 'fuelLevel'; +UnsubscribeVehicleData.KEY_FUEL_LEVEL_STATE = 'fuelLevel_State'; +UnsubscribeVehicleData.KEY_INSTANT_FUEL_CONSUMPTION = 'instantFuelConsumption'; +UnsubscribeVehicleData.KEY_FUEL_RANGE = 'fuelRange'; +UnsubscribeVehicleData.KEY_EXTERNAL_TEMPERATURE = 'externalTemperature'; +UnsubscribeVehicleData.KEY_TURN_SIGNAL = 'turnSignal'; +UnsubscribeVehicleData.KEY_PRNDL = 'prndl'; +UnsubscribeVehicleData.KEY_TIRE_PRESSURE = 'tirePressure'; +UnsubscribeVehicleData.KEY_ODOMETER = 'odometer'; +UnsubscribeVehicleData.KEY_BELT_STATUS = 'beltStatus'; +UnsubscribeVehicleData.KEY_BODY_INFORMATION = 'bodyInformation'; +UnsubscribeVehicleData.KEY_DEVICE_STATUS = 'deviceStatus'; +UnsubscribeVehicleData.KEY_DRIVER_BRAKING = 'driverBraking'; +UnsubscribeVehicleData.KEY_WIPER_STATUS = 'wiperStatus'; +UnsubscribeVehicleData.KEY_HEAD_LAMP_STATUS = 'headLampStatus'; +UnsubscribeVehicleData.KEY_ENGINE_TORQUE = 'engineTorque'; +UnsubscribeVehicleData.KEY_ACC_PEDAL_POSITION = 'accPedalPosition'; +UnsubscribeVehicleData.KEY_STEERING_WHEEL_ANGLE = 'steeringWheelAngle'; +UnsubscribeVehicleData.KEY_ENGINE_OIL_LIFE = 'engineOilLife'; +UnsubscribeVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS = 'electronicParkBrakeStatus'; +UnsubscribeVehicleData.KEY_CLOUD_APP_VEHICLE_ID = 'cloudAppVehicleID'; +UnsubscribeVehicleData.KEY_E_CALL_INFO = 'eCallInfo'; +UnsubscribeVehicleData.KEY_AIRBAG_STATUS = 'airbagStatus'; +UnsubscribeVehicleData.KEY_EMERGENCY_EVENT = 'emergencyEvent'; +UnsubscribeVehicleData.KEY_CLUSTER_MODE_STATUS = 'clusterModeStatus'; +UnsubscribeVehicleData.KEY_MY_KEY = 'myKey'; + +export { UnsubscribeVehicleData }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/UnsubscribeVehicleDataResponse.js b/lib/js/src/rpc/messages/UnsubscribeVehicleDataResponse.js new file mode 100644 index 00000000..f538f055 --- /dev/null +++ b/lib/js/src/rpc/messages/UnsubscribeVehicleDataResponse.js @@ -0,0 +1,572 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; +import { VehicleDataResult } from '../structs/VehicleDataResult.js'; + +class UnsubscribeVehicleDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.UnsubscribeVehicleData); + } + + /** + * @param {VehicleDataResult} gps - See GPSData + * @return {UnsubscribeVehicleDataResponse} + */ + setGps (gps) { + this.validateType(VehicleDataResult, gps); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_GPS, gps); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getGps () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_GPS); + } + + /** + * @param {VehicleDataResult} speed - The vehicle speed in kilometers per hour + * @return {UnsubscribeVehicleDataResponse} + */ + setSpeed (speed) { + this.validateType(VehicleDataResult, speed); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_SPEED, speed); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getSpeed () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_SPEED); + } + + /** + * @param {VehicleDataResult} rpm - The number of revolutions per minute of the engine + * @return {UnsubscribeVehicleDataResponse} + */ + setRpm (rpm) { + this.validateType(VehicleDataResult, rpm); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_RPM, rpm); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getRpm () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_RPM); + } + + /** + * @param {VehicleDataResult} level - The fuel level in the tank (percentage) + * @return {UnsubscribeVehicleDataResponse} + */ + setFuelLevel (level) { + this.validateType(VehicleDataResult, level); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_FUEL_LEVEL, level); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getFuelLevel () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_FUEL_LEVEL); + } + + /** + * @param {VehicleDataResult} level_state - The fuel level state + * @return {UnsubscribeVehicleDataResponse} + */ + setFuelLevel_State (level_state) { + this.validateType(VehicleDataResult, level_state); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_FUEL_LEVEL_STATE, level_state); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getFuelLevel_State () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_FUEL_LEVEL_STATE); + } + + /** + * @param {VehicleDataResult} consumption - The instantaneous fuel consumption in microlitres + * @return {UnsubscribeVehicleDataResponse} + */ + setInstantFuelConsumption (consumption) { + this.validateType(VehicleDataResult, consumption); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION, consumption); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getInstantFuelConsumption () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION); + } + + /** + * @param {VehicleDataResult} range - The estimate range in KM the vehicle can travel based on fuel level and + * consumption + * @return {UnsubscribeVehicleDataResponse} + */ + setFuelRange (range) { + this.validateType(VehicleDataResult, range); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_FUEL_RANGE, range); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getFuelRange () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_FUEL_RANGE); + } + + /** + * @param {VehicleDataResult} temperature - The external temperature in degrees celsius + * @return {UnsubscribeVehicleDataResponse} + */ + setExternalTemperature (temperature) { + this.validateType(VehicleDataResult, temperature); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE, temperature); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getExternalTemperature () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE); + } + + /** + * @param {VehicleDataResult} signal - See TurnSignal + * @return {UnsubscribeVehicleDataResponse} + */ + setTurnSignal (signal) { + this.validateType(VehicleDataResult, signal); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_TURN_SIGNAL, signal); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getTurnSignal () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_TURN_SIGNAL); + } + + /** + * @param {VehicleDataResult} prndl - See PRNDL + * @return {UnsubscribeVehicleDataResponse} + */ + setPrndl (prndl) { + this.validateType(VehicleDataResult, prndl); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_PRNDL, prndl); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getPrndl () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_PRNDL); + } + + /** + * @param {VehicleDataResult} pressure - See TireStatus + * @return {UnsubscribeVehicleDataResponse} + */ + setTirePressure (pressure) { + this.validateType(VehicleDataResult, pressure); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_TIRE_PRESSURE, pressure); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getTirePressure () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_TIRE_PRESSURE); + } + + /** + * @param {VehicleDataResult} odometer - Odometer in km + * @return {UnsubscribeVehicleDataResponse} + */ + setOdometer (odometer) { + this.validateType(VehicleDataResult, odometer); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_ODOMETER, odometer); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getOdometer () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_ODOMETER); + } + + /** + * @param {VehicleDataResult} status - The status of the seat belts + * @return {UnsubscribeVehicleDataResponse} + */ + setBeltStatus (status) { + this.validateType(VehicleDataResult, status); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_BELT_STATUS, status); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getBeltStatus () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_BELT_STATUS); + } + + /** + * @param {VehicleDataResult} information - The body information including power modes + * @return {UnsubscribeVehicleDataResponse} + */ + setBodyInformation (information) { + this.validateType(VehicleDataResult, information); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_BODY_INFORMATION, information); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getBodyInformation () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_BODY_INFORMATION); + } + + /** + * @param {VehicleDataResult} status - The device status including signal and battery strength + * @return {UnsubscribeVehicleDataResponse} + */ + setDeviceStatus (status) { + this.validateType(VehicleDataResult, status); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_DEVICE_STATUS, status); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getDeviceStatus () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_DEVICE_STATUS); + } + + /** + * @param {VehicleDataResult} braking - The status of the brake pedal + * @return {UnsubscribeVehicleDataResponse} + */ + setDriverBraking (braking) { + this.validateType(VehicleDataResult, braking); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_DRIVER_BRAKING, braking); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getDriverBraking () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_DRIVER_BRAKING); + } + + /** + * @param {VehicleDataResult} status - The status of the wipers + * @return {UnsubscribeVehicleDataResponse} + */ + setWiperStatus (status) { + this.validateType(VehicleDataResult, status); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_WIPER_STATUS, status); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getWiperStatus () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_WIPER_STATUS); + } + + /** + * @param {VehicleDataResult} status - Status of the head lamps + * @return {UnsubscribeVehicleDataResponse} + */ + setHeadLampStatus (status) { + this.validateType(VehicleDataResult, status); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_HEAD_LAMP_STATUS, status); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getHeadLampStatus () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_HEAD_LAMP_STATUS); + } + + /** + * @param {VehicleDataResult} torque - Torque value for engine (in Nm) on non-diesel variants + * @return {UnsubscribeVehicleDataResponse} + */ + setEngineTorque (torque) { + this.validateType(VehicleDataResult, torque); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_ENGINE_TORQUE, torque); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getEngineTorque () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_ENGINE_TORQUE); + } + + /** + * @param {VehicleDataResult} position - Accelerator pedal position (percentage depressed) + * @return {UnsubscribeVehicleDataResponse} + */ + setAccPedalPosition (position) { + this.validateType(VehicleDataResult, position); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_ACC_PEDAL_POSITION, position); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getAccPedalPosition () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_ACC_PEDAL_POSITION); + } + + /** + * @param {VehicleDataResult} angle - Current angle of the steering wheel (in deg) + * @return {UnsubscribeVehicleDataResponse} + */ + setSteeringWheelAngle (angle) { + this.validateType(VehicleDataResult, angle); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE, angle); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getSteeringWheelAngle () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE); + } + + /** + * @param {VehicleDataResult} life - The estimated percentage of remaining oil life of the engine. + * @return {UnsubscribeVehicleDataResponse} + */ + setEngineOilLife (life) { + this.validateType(VehicleDataResult, life); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_ENGINE_OIL_LIFE, life); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getEngineOilLife () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_ENGINE_OIL_LIFE); + } + + /** + * @param {VehicleDataResult} status - The status of the park brake as provided by Electric Park Brake (EPB) system. + * @return {UnsubscribeVehicleDataResponse} + */ + setElectronicParkBrakeStatus (status) { + this.validateType(VehicleDataResult, status); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS, status); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getElectronicParkBrakeStatus () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS); + } + + /** + * @param {VehicleDataResult} id - Parameter used by cloud apps to identify a head unit + * @return {UnsubscribeVehicleDataResponse} + */ + setCloudAppVehicleID (id) { + this.validateType(VehicleDataResult, id); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID, id); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getCloudAppVehicleID () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID); + } + + /** + * @param {VehicleDataResult} info - Emergency Call notification and confirmation data + * @return {UnsubscribeVehicleDataResponse} + */ + setECallInfo (info) { + this.validateType(VehicleDataResult, info); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_E_CALL_INFO, info); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getECallInfo () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_E_CALL_INFO); + } + + /** + * @param {VehicleDataResult} status - The status of the air bags + * @return {UnsubscribeVehicleDataResponse} + */ + setAirbagStatus (status) { + this.validateType(VehicleDataResult, status); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_AIRBAG_STATUS, status); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getAirbagStatus () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_AIRBAG_STATUS); + } + + /** + * @param {VehicleDataResult} event - Information related to an emergency event (and if it occurred) + * @return {UnsubscribeVehicleDataResponse} + */ + setEmergencyEvent (event) { + this.validateType(VehicleDataResult, event); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_EMERGENCY_EVENT, event); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getEmergencyEvent () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_EMERGENCY_EVENT); + } + + /** + * @param {VehicleDataResult} modes - The status modes of the cluster + * @return {UnsubscribeVehicleDataResponse} + */ + setClusterModes (modes) { + this.validateType(VehicleDataResult, modes); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_CLUSTER_MODES, modes); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getClusterModes () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_CLUSTER_MODES); + } + + /** + * @param {VehicleDataResult} key - Information related to the MyKey feature + * @return {UnsubscribeVehicleDataResponse} + */ + setMyKey (key) { + this.validateType(VehicleDataResult, key); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_MY_KEY, key); + return this; + } + + /** + * @return {VehicleDataResult} + */ + getMyKey () { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_MY_KEY); + } +} + +UnsubscribeVehicleDataResponse.KEY_GPS = 'gps'; +UnsubscribeVehicleDataResponse.KEY_SPEED = 'speed'; +UnsubscribeVehicleDataResponse.KEY_RPM = 'rpm'; +UnsubscribeVehicleDataResponse.KEY_FUEL_LEVEL = 'fuelLevel'; +UnsubscribeVehicleDataResponse.KEY_FUEL_LEVEL_STATE = 'fuelLevel_State'; +UnsubscribeVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION = 'instantFuelConsumption'; +UnsubscribeVehicleDataResponse.KEY_FUEL_RANGE = 'fuelRange'; +UnsubscribeVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE = 'externalTemperature'; +UnsubscribeVehicleDataResponse.KEY_TURN_SIGNAL = 'turnSignal'; +UnsubscribeVehicleDataResponse.KEY_PRNDL = 'prndl'; +UnsubscribeVehicleDataResponse.KEY_TIRE_PRESSURE = 'tirePressure'; +UnsubscribeVehicleDataResponse.KEY_ODOMETER = 'odometer'; +UnsubscribeVehicleDataResponse.KEY_BELT_STATUS = 'beltStatus'; +UnsubscribeVehicleDataResponse.KEY_BODY_INFORMATION = 'bodyInformation'; +UnsubscribeVehicleDataResponse.KEY_DEVICE_STATUS = 'deviceStatus'; +UnsubscribeVehicleDataResponse.KEY_DRIVER_BRAKING = 'driverBraking'; +UnsubscribeVehicleDataResponse.KEY_WIPER_STATUS = 'wiperStatus'; +UnsubscribeVehicleDataResponse.KEY_HEAD_LAMP_STATUS = 'headLampStatus'; +UnsubscribeVehicleDataResponse.KEY_ENGINE_TORQUE = 'engineTorque'; +UnsubscribeVehicleDataResponse.KEY_ACC_PEDAL_POSITION = 'accPedalPosition'; +UnsubscribeVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE = 'steeringWheelAngle'; +UnsubscribeVehicleDataResponse.KEY_ENGINE_OIL_LIFE = 'engineOilLife'; +UnsubscribeVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS = 'electronicParkBrakeStatus'; +UnsubscribeVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID = 'cloudAppVehicleID'; +UnsubscribeVehicleDataResponse.KEY_E_CALL_INFO = 'eCallInfo'; +UnsubscribeVehicleDataResponse.KEY_AIRBAG_STATUS = 'airbagStatus'; +UnsubscribeVehicleDataResponse.KEY_EMERGENCY_EVENT = 'emergencyEvent'; +UnsubscribeVehicleDataResponse.KEY_CLUSTER_MODES = 'clusterModes'; +UnsubscribeVehicleDataResponse.KEY_MY_KEY = 'myKey'; + +export { UnsubscribeVehicleDataResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/UnsubscribeWayPoints.js b/lib/js/src/rpc/messages/UnsubscribeWayPoints.js new file mode 100644 index 00000000..919049c5 --- /dev/null +++ b/lib/js/src/rpc/messages/UnsubscribeWayPoints.js @@ -0,0 +1,51 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; + +/** + * Request to unsubscribe from WayPoints and Destination + */ +class UnsubscribeWayPoints extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.UnsubscribeWayPoints); + } +} + + +export { UnsubscribeWayPoints }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/UnsubscribeWayPointsResponse.js b/lib/js/src/rpc/messages/UnsubscribeWayPointsResponse.js new file mode 100644 index 00000000..72d0611a --- /dev/null +++ b/lib/js/src/rpc/messages/UnsubscribeWayPointsResponse.js @@ -0,0 +1,67 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { LocationDetails } from '../structs/LocationDetails.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class UnsubscribeWayPointsResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.UnsubscribeWayPoints); + } + + /** + * @param {LocationDetails[]} points - See LocationDetails + * @return {UnsubscribeWayPointsResponse} + */ + setWayPoints (points) { + this.validateType(LocationDetails, points, true); + this.setParameter(UnsubscribeWayPointsResponse.KEY_WAY_POINTS, points); + return this; + } + + /** + * @return {LocationDetails[]} + */ + getWayPoints () { + return this.getObject(LocationDetails, UnsubscribeWayPointsResponse.KEY_WAY_POINTS); + } +} + +UnsubscribeWayPointsResponse.KEY_WAY_POINTS = 'wayPoints'; + +export { UnsubscribeWayPointsResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/UpdateTurnList.js b/lib/js/src/rpc/messages/UpdateTurnList.js new file mode 100644 index 00000000..87daf9cc --- /dev/null +++ b/lib/js/src/rpc/messages/UpdateTurnList.js @@ -0,0 +1,86 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Turn } from '../structs/Turn.js'; +import { RpcRequest } from '../RpcRequest.js'; +import { FunctionID } from '../enums/FunctionID.js'; +import { SoftButton } from '../structs/SoftButton.js'; + +class UpdateTurnList extends RpcRequest { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.UpdateTurnList); + } + + /** + * @param {Turn[]} list + * @return {UpdateTurnList} + */ + setTurnList (list) { + this.validateType(Turn, list, true); + this.setParameter(UpdateTurnList.KEY_TURN_LIST, list); + return this; + } + + /** + * @return {Turn[]} + */ + getTurnList () { + return this.getObject(Turn, UpdateTurnList.KEY_TURN_LIST); + } + + /** + * @param {SoftButton[]} buttons - If omitted on supported displays, app-defined SoftButton will be left blank. + * @return {UpdateTurnList} + */ + setSoftButtons (buttons) { + this.validateType(SoftButton, buttons, true); + this.setParameter(UpdateTurnList.KEY_SOFT_BUTTONS, buttons); + return this; + } + + /** + * @return {SoftButton[]} + */ + getSoftButtons () { + return this.getObject(SoftButton, UpdateTurnList.KEY_SOFT_BUTTONS); + } +} + +UpdateTurnList.KEY_TURN_LIST = 'turnList'; +UpdateTurnList.KEY_SOFT_BUTTONS = 'softButtons'; + +export { UpdateTurnList }; \ No newline at end of file diff --git a/lib/js/src/rpc/messages/UpdateTurnListResponse.js b/lib/js/src/rpc/messages/UpdateTurnListResponse.js new file mode 100644 index 00000000..788902a6 --- /dev/null +++ b/lib/js/src/rpc/messages/UpdateTurnListResponse.js @@ -0,0 +1,48 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { FunctionID } from '../enums/FunctionID.js'; +import { RpcResponse } from '../RpcResponse.js'; + +class UpdateTurnListResponse extends RpcResponse { + /** + * @constructor + */ + constructor (store) { + super(store); + this.setFunctionName(FunctionID.UpdateTurnList); + } +} + + +export { UpdateTurnListResponse }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/AirbagStatus.js b/lib/js/src/rpc/structs/AirbagStatus.js new file mode 100644 index 00000000..8f463b91 --- /dev/null +++ b/lib/js/src/rpc/structs/AirbagStatus.js @@ -0,0 +1,197 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { VehicleDataEventStatus } from '../enums/VehicleDataEventStatus.js'; + +class AirbagStatus extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsDrvBag_D_Ltchd". See VehicleDataEventStatus. + * @return {AirbagStatus} + */ + setDriverAirbagDeployed (deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_DRIVER_AIRBAG_DEPLOYED, deployed); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getDriverAirbagDeployed () { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_DRIVER_AIRBAG_DEPLOYED); + } + + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsDrvSideBag_D_Ltchd". See + * VehicleDataEventStatus. + * @return {AirbagStatus} + */ + setDriverSideAirbagDeployed (deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_DRIVER_SIDE_AIRBAG_DEPLOYED, deployed); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getDriverSideAirbagDeployed () { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_DRIVER_SIDE_AIRBAG_DEPLOYED); + } + + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsDrvCrtnBag_D_Ltchd". See + * VehicleDataEventStatus. + * @return {AirbagStatus} + */ + setDriverCurtainAirbagDeployed (deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_DRIVER_CURTAIN_AIRBAG_DEPLOYED, deployed); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getDriverCurtainAirbagDeployed () { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_DRIVER_CURTAIN_AIRBAG_DEPLOYED); + } + + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsPasBag_D_Ltchd". See VehicleDataEventStatus. + * @return {AirbagStatus} + */ + setPassengerAirbagDeployed (deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_PASSENGER_AIRBAG_DEPLOYED, deployed); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getPassengerAirbagDeployed () { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_PASSENGER_AIRBAG_DEPLOYED); + } + + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsPasCrtnBag_D_Ltchd". See + * VehicleDataEventStatus. + * @return {AirbagStatus} + */ + setPassengerCurtainAirbagDeployed (deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_PASSENGER_CURTAIN_AIRBAG_DEPLOYED, deployed); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getPassengerCurtainAirbagDeployed () { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_PASSENGER_CURTAIN_AIRBAG_DEPLOYED); + } + + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsKneeDrvBag_D_Ltchd". See + * VehicleDataEventStatus. + * @return {AirbagStatus} + */ + setDriverKneeAirbagDeployed (deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_DRIVER_KNEE_AIRBAG_DEPLOYED, deployed); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getDriverKneeAirbagDeployed () { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_DRIVER_KNEE_AIRBAG_DEPLOYED); + } + + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsPasSideBag_D_Ltchd". See + * VehicleDataEventStatus. + * @return {AirbagStatus} + */ + setPassengerSideAirbagDeployed (deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_PASSENGER_SIDE_AIRBAG_DEPLOYED, deployed); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getPassengerSideAirbagDeployed () { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_PASSENGER_SIDE_AIRBAG_DEPLOYED); + } + + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsKneePasBag_D_Ltchd". See + * VehicleDataEventStatus. + * @return {AirbagStatus} + */ + setPassengerKneeAirbagDeployed (deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_PASSENGER_KNEE_AIRBAG_DEPLOYED, deployed); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getPassengerKneeAirbagDeployed () { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_PASSENGER_KNEE_AIRBAG_DEPLOYED); + } +} + +AirbagStatus.KEY_DRIVER_AIRBAG_DEPLOYED = 'driverAirbagDeployed'; +AirbagStatus.KEY_DRIVER_SIDE_AIRBAG_DEPLOYED = 'driverSideAirbagDeployed'; +AirbagStatus.KEY_DRIVER_CURTAIN_AIRBAG_DEPLOYED = 'driverCurtainAirbagDeployed'; +AirbagStatus.KEY_PASSENGER_AIRBAG_DEPLOYED = 'passengerAirbagDeployed'; +AirbagStatus.KEY_PASSENGER_CURTAIN_AIRBAG_DEPLOYED = 'passengerCurtainAirbagDeployed'; +AirbagStatus.KEY_DRIVER_KNEE_AIRBAG_DEPLOYED = 'driverKneeAirbagDeployed'; +AirbagStatus.KEY_PASSENGER_SIDE_AIRBAG_DEPLOYED = 'passengerSideAirbagDeployed'; +AirbagStatus.KEY_PASSENGER_KNEE_AIRBAG_DEPLOYED = 'passengerKneeAirbagDeployed'; + +export { AirbagStatus }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/AppInfo.js b/lib/js/src/rpc/structs/AppInfo.js index c8745f29..6a3e25c3 100644 --- a/lib/js/src/rpc/structs/AppInfo.js +++ b/lib/js/src/rpc/structs/AppInfo.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -32,73 +33,80 @@ import { RpcStruct } from '../RpcStruct.js'; +/** + * Contains detailed information about the registered application. + */ class AppInfo extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {String} appDisplayName - * @return {AppInfo} - */ - setAppDisplayName (appDisplayName) { - this.setParameter(AppInfo.KEY_APP_DISPLAY_NAME, appDisplayName); + * @param {String} name - The name displayed for the mobile application on the mobile device (can differ from the + * app name set in the initial RAI request). + * @return {AppInfo} + */ + setAppDisplayName (name) { + this.setParameter(AppInfo.KEY_APP_DISPLAY_NAME, name); return this; } /** - * @return {String} - */ + * @return {String} + */ getAppDisplayName () { return this.getParameter(AppInfo.KEY_APP_DISPLAY_NAME); } - /** - * @param {String} appBundleID - * @return {AppInfo} - */ - setAppBundleID (appBundleID) { - this.setParameter(AppInfo.KEY_APP_BUNDLE_ID, appBundleID); + * @param {String} id - The AppBundleID of an iOS application or package name of the Android application. This + * supports App Launch strategies for each platform. + * @return {AppInfo} + */ + setAppBundleID (id) { + this.setParameter(AppInfo.KEY_APP_BUNDLE_ID, id); return this; } /** - * @return {String} - */ + * @return {String} + */ getAppBundleID () { return this.getParameter(AppInfo.KEY_APP_BUNDLE_ID); } - /** - * @param {String} appVersion - * @return {AppInfo} - */ - setAppVersion (appVersion) { - this.setParameter(AppInfo.KEY_APP_VERSION, appVersion); + * @param {String} version - Represents the build version number of this particular mobile app. + * @return {AppInfo} + */ + setAppVersion (version) { + this.setParameter(AppInfo.KEY_APP_VERSION, version); return this; } /** - * @return {String} - */ + * @return {String} + */ getAppVersion () { return this.getParameter(AppInfo.KEY_APP_VERSION); } /** - * @param {String} appIcon string of the app icon file name - * @return {AppInfo} - */ - setAppIcon (appIcon) { - this.setParameter(AppInfo.KEY_APP_ICON, appIcon); + * @param {String} icon - A file reference to the icon utilized by this app (simplifies the process of setting an + * app icon during app registration). + * @return {AppInfo} + */ + setAppIcon (icon) { + this.setParameter(AppInfo.KEY_APP_ICON, icon); return this; } /** - * @return {String} - */ + * @return {String} + */ getAppIcon () { return this.getParameter(AppInfo.KEY_APP_ICON); } @@ -109,4 +117,4 @@ AppInfo.KEY_APP_BUNDLE_ID = 'appBundleID'; AppInfo.KEY_APP_VERSION = 'appVersion'; AppInfo.KEY_APP_ICON = 'appIcon'; -export { AppInfo }; +export { AppInfo }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/AppServiceCapability.js b/lib/js/src/rpc/structs/AppServiceCapability.js new file mode 100644 index 00000000..4201a6dd --- /dev/null +++ b/lib/js/src/rpc/structs/AppServiceCapability.js @@ -0,0 +1,85 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { ServiceUpdateReason } from '../enums/ServiceUpdateReason.js'; +import { AppServiceRecord } from './AppServiceRecord.js'; + +class AppServiceCapability extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {ServiceUpdateReason} reason - Only included in OnSystemCapabilityUpdated. Update reason for service + * record. + * @return {AppServiceCapability} + */ + setUpdateReason (reason) { + this.validateType(ServiceUpdateReason, reason); + this.setParameter(AppServiceCapability.KEY_UPDATE_REASON, reason); + return this; + } + + /** + * @return {ServiceUpdateReason} + */ + getUpdateReason () { + return this.getObject(ServiceUpdateReason, AppServiceCapability.KEY_UPDATE_REASON); + } + + /** + * @param {AppServiceRecord} record - Service record for a specific app service provider + * @return {AppServiceCapability} + */ + setUpdatedAppServiceRecord (record) { + this.validateType(AppServiceRecord, record); + this.setParameter(AppServiceCapability.KEY_UPDATED_APP_SERVICE_RECORD, record); + return this; + } + + /** + * @return {AppServiceRecord} + */ + getUpdatedAppServiceRecord () { + return this.getObject(AppServiceRecord, AppServiceCapability.KEY_UPDATED_APP_SERVICE_RECORD); + } +} + +AppServiceCapability.KEY_UPDATE_REASON = 'updateReason'; +AppServiceCapability.KEY_UPDATED_APP_SERVICE_RECORD = 'updatedAppServiceRecord'; + +export { AppServiceCapability }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/AppServiceData.js b/lib/js/src/rpc/structs/AppServiceData.js new file mode 100644 index 00000000..3b9e9501 --- /dev/null +++ b/lib/js/src/rpc/structs/AppServiceData.js @@ -0,0 +1,143 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { NavigationServiceData } from './NavigationServiceData.js'; +import { MediaServiceData } from './MediaServiceData.js'; +import { WeatherServiceData } from './WeatherServiceData.js'; + +/** + * Contains all the current data of the app service. The serviceType will link to which of the service data objects are + * included in this object (e.g. if the service type is MEDIA, the mediaServiceData param should be included). + */ +class AppServiceData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} type - The type of service that is to be offered by this app. See AppServiceType for known enum + * equivalent types. Parameter is a string to allow for new service types to be used by apps + * on older versions of SDL Core. + * @return {AppServiceData} + */ + setServiceType (type) { + this.setParameter(AppServiceData.KEY_SERVICE_TYPE, type); + return this; + } + + /** + * @return {String} + */ + getServiceType () { + return this.getParameter(AppServiceData.KEY_SERVICE_TYPE); + } + + /** + * @param {String} id + * @return {AppServiceData} + */ + setServiceID (id) { + this.setParameter(AppServiceData.KEY_SERVICE_ID, id); + return this; + } + + /** + * @return {String} + */ + getServiceID () { + return this.getParameter(AppServiceData.KEY_SERVICE_ID); + } + + /** + * @param {MediaServiceData} data - This data is related to what a media service should provide + * @return {AppServiceData} + */ + setMediaServiceData (data) { + this.validateType(MediaServiceData, data); + this.setParameter(AppServiceData.KEY_MEDIA_SERVICE_DATA, data); + return this; + } + + /** + * @return {MediaServiceData} + */ + getMediaServiceData () { + return this.getObject(MediaServiceData, AppServiceData.KEY_MEDIA_SERVICE_DATA); + } + + /** + * @param {WeatherServiceData} data - This data is related to what a weather service would provide + * @return {AppServiceData} + */ + setWeatherServiceData (data) { + this.validateType(WeatherServiceData, data); + this.setParameter(AppServiceData.KEY_WEATHER_SERVICE_DATA, data); + return this; + } + + /** + * @return {WeatherServiceData} + */ + getWeatherServiceData () { + return this.getObject(WeatherServiceData, AppServiceData.KEY_WEATHER_SERVICE_DATA); + } + + /** + * @param {NavigationServiceData} data - This data is related to what a navigation service would provide. + * @return {AppServiceData} + */ + setNavigationServiceData (data) { + this.validateType(NavigationServiceData, data); + this.setParameter(AppServiceData.KEY_NAVIGATION_SERVICE_DATA, data); + return this; + } + + /** + * @return {NavigationServiceData} + */ + getNavigationServiceData () { + return this.getObject(NavigationServiceData, AppServiceData.KEY_NAVIGATION_SERVICE_DATA); + } +} + +AppServiceData.KEY_SERVICE_TYPE = 'serviceType'; +AppServiceData.KEY_SERVICE_ID = 'serviceID'; +AppServiceData.KEY_MEDIA_SERVICE_DATA = 'mediaServiceData'; +AppServiceData.KEY_WEATHER_SERVICE_DATA = 'weatherServiceData'; +AppServiceData.KEY_NAVIGATION_SERVICE_DATA = 'navigationServiceData'; + +export { AppServiceData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/AppServiceManifest.js b/lib/js/src/rpc/structs/AppServiceManifest.js new file mode 100644 index 00000000..a89403f9 --- /dev/null +++ b/lib/js/src/rpc/structs/AppServiceManifest.js @@ -0,0 +1,220 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { NavigationServiceManifest } from './NavigationServiceManifest.js'; +import { Image } from './Image.js'; +import { SdlMsgVersion } from './SdlMsgVersion.js'; +import { WeatherServiceManifest } from './WeatherServiceManifest.js'; +import { RpcStruct } from '../RpcStruct.js'; +import { MediaServiceManifest } from './MediaServiceManifest.js'; + +/** + * This manifest contains all the information necessary for the service to be published, activated, and consumers able + * to interact with it + */ +class AppServiceManifest extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} name - Unique name of this service + * @return {AppServiceManifest} + */ + setServiceName (name) { + this.setParameter(AppServiceManifest.KEY_SERVICE_NAME, name); + return this; + } + + /** + * @return {String} + */ + getServiceName () { + return this.getParameter(AppServiceManifest.KEY_SERVICE_NAME); + } + + /** + * @param {String} type - The type of service that is to be offered by this app. See AppServiceType for known enum + * equivalent types. Parameter is a string to allow for new service types to be used by apps + * on older versions of SDL Core. + * @return {AppServiceManifest} + */ + setServiceType (type) { + this.setParameter(AppServiceManifest.KEY_SERVICE_TYPE, type); + return this; + } + + /** + * @return {String} + */ + getServiceType () { + return this.getParameter(AppServiceManifest.KEY_SERVICE_TYPE); + } + + /** + * @param {Image} icon - The icon to be associated with this service. Most likely the same as the appIcon. + * @return {AppServiceManifest} + */ + setServiceIcon (icon) { + this.validateType(Image, icon); + this.setParameter(AppServiceManifest.KEY_SERVICE_ICON, icon); + return this; + } + + /** + * @return {Image} + */ + getServiceIcon () { + return this.getObject(Image, AppServiceManifest.KEY_SERVICE_ICON); + } + + /** + * @param {Boolean} consumers - If true, app service consumers beyond the IVI system will be able to access this + * service. If false, only the IVI system will be able consume the service. If not + * provided, it is assumed to be false. + * @return {AppServiceManifest} + */ + setAllowAppConsumers (consumers) { + this.setParameter(AppServiceManifest.KEY_ALLOW_APP_CONSUMERS, consumers); + return this; + } + + /** + * @return {Boolean} + */ + getAllowAppConsumers () { + return this.getParameter(AppServiceManifest.KEY_ALLOW_APP_CONSUMERS); + } + + /** + * @param {SdlMsgVersion} version - This is the max RPC Spec version the app service understands. This is important + * during the RPC passthrough functionality. If not included, it is assumed the max + * version of the module is acceptable. + * @return {AppServiceManifest} + */ + setRpcSpecVersion (version) { + this.validateType(SdlMsgVersion, version); + this.setParameter(AppServiceManifest.KEY_RPC_SPEC_VERSION, version); + return this; + } + + /** + * @return {SdlMsgVersion} + */ + getRpcSpecVersion () { + return this.getObject(SdlMsgVersion, AppServiceManifest.KEY_RPC_SPEC_VERSION); + } + + /** + * @param {Number[]} cs - This field contains the Function IDs for the RPCs that this service intends to handle + * correctly. This means the service will provide meaningful responses. + * @return {AppServiceManifest} + */ + setHandledRPCs (cs) { + this.setParameter(AppServiceManifest.KEY_HANDLED_RPCS, cs); + return this; + } + + /** + * @return {Number[]} + */ + getHandledRPCs () { + return this.getParameter(AppServiceManifest.KEY_HANDLED_RPCS); + } + + /** + * @param {MediaServiceManifest} manifest + * @return {AppServiceManifest} + */ + setMediaServiceManifest (manifest) { + this.validateType(MediaServiceManifest, manifest); + this.setParameter(AppServiceManifest.KEY_MEDIA_SERVICE_MANIFEST, manifest); + return this; + } + + /** + * @return {MediaServiceManifest} + */ + getMediaServiceManifest () { + return this.getObject(MediaServiceManifest, AppServiceManifest.KEY_MEDIA_SERVICE_MANIFEST); + } + + /** + * @param {WeatherServiceManifest} manifest + * @return {AppServiceManifest} + */ + setWeatherServiceManifest (manifest) { + this.validateType(WeatherServiceManifest, manifest); + this.setParameter(AppServiceManifest.KEY_WEATHER_SERVICE_MANIFEST, manifest); + return this; + } + + /** + * @return {WeatherServiceManifest} + */ + getWeatherServiceManifest () { + return this.getObject(WeatherServiceManifest, AppServiceManifest.KEY_WEATHER_SERVICE_MANIFEST); + } + + /** + * @param {NavigationServiceManifest} manifest + * @return {AppServiceManifest} + */ + setNavigationServiceManifest (manifest) { + this.validateType(NavigationServiceManifest, manifest); + this.setParameter(AppServiceManifest.KEY_NAVIGATION_SERVICE_MANIFEST, manifest); + return this; + } + + /** + * @return {NavigationServiceManifest} + */ + getNavigationServiceManifest () { + return this.getObject(NavigationServiceManifest, AppServiceManifest.KEY_NAVIGATION_SERVICE_MANIFEST); + } +} + +AppServiceManifest.KEY_SERVICE_NAME = 'serviceName'; +AppServiceManifest.KEY_SERVICE_TYPE = 'serviceType'; +AppServiceManifest.KEY_SERVICE_ICON = 'serviceIcon'; +AppServiceManifest.KEY_ALLOW_APP_CONSUMERS = 'allowAppConsumers'; +AppServiceManifest.KEY_RPC_SPEC_VERSION = 'rpcSpecVersion'; +AppServiceManifest.KEY_HANDLED_RPCS = 'handledRPCs'; +AppServiceManifest.KEY_MEDIA_SERVICE_MANIFEST = 'mediaServiceManifest'; +AppServiceManifest.KEY_WEATHER_SERVICE_MANIFEST = 'weatherServiceManifest'; +AppServiceManifest.KEY_NAVIGATION_SERVICE_MANIFEST = 'navigationServiceManifest'; + +export { AppServiceManifest }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/AppServiceRecord.js b/lib/js/src/rpc/structs/AppServiceRecord.js new file mode 100644 index 00000000..c5a6b9a5 --- /dev/null +++ b/lib/js/src/rpc/structs/AppServiceRecord.js @@ -0,0 +1,125 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { AppServiceManifest } from './AppServiceManifest.js'; + +/** + * This is the record of an app service publisher that the module has. It should contain the most up to date + * information including the service's active state + */ +class AppServiceRecord extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} id - A unique ID tied to this specific service record. The ID is supplied by the module that + * services publish themselves. + * @return {AppServiceRecord} + */ + setServiceID (id) { + this.setParameter(AppServiceRecord.KEY_SERVICE_ID, id); + return this; + } + + /** + * @return {String} + */ + getServiceID () { + return this.getParameter(AppServiceRecord.KEY_SERVICE_ID); + } + + /** + * @param {AppServiceManifest} manifest - Manifest for the service that this record is for. + * @return {AppServiceRecord} + */ + setServiceManifest (manifest) { + this.validateType(AppServiceManifest, manifest); + this.setParameter(AppServiceRecord.KEY_SERVICE_MANIFEST, manifest); + return this; + } + + /** + * @return {AppServiceManifest} + */ + getServiceManifest () { + return this.getObject(AppServiceManifest, AppServiceRecord.KEY_SERVICE_MANIFEST); + } + + /** + * @param {Boolean} published - If true, the service is published and available. If false, the service has likely + * just been unpublished, and should be considered unavailable. + * @return {AppServiceRecord} + */ + setServicePublished (published) { + this.setParameter(AppServiceRecord.KEY_SERVICE_PUBLISHED, published); + return this; + } + + /** + * @return {Boolean} + */ + getServicePublished () { + return this.getParameter(AppServiceRecord.KEY_SERVICE_PUBLISHED); + } + + /** + * @param {Boolean} active - If true, the service is the active primary service of the supplied service type. It + * will receive all potential RPCs that are passed through to that service type. If false, + * it is not the primary service of the supplied type. See servicePublished for its + * availability. + * @return {AppServiceRecord} + */ + setServiceActive (active) { + this.setParameter(AppServiceRecord.KEY_SERVICE_ACTIVE, active); + return this; + } + + /** + * @return {Boolean} + */ + getServiceActive () { + return this.getParameter(AppServiceRecord.KEY_SERVICE_ACTIVE); + } +} + +AppServiceRecord.KEY_SERVICE_ID = 'serviceID'; +AppServiceRecord.KEY_SERVICE_MANIFEST = 'serviceManifest'; +AppServiceRecord.KEY_SERVICE_PUBLISHED = 'servicePublished'; +AppServiceRecord.KEY_SERVICE_ACTIVE = 'serviceActive'; + +export { AppServiceRecord }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/AppServicesCapabilities.js b/lib/js/src/rpc/structs/AppServicesCapabilities.js new file mode 100644 index 00000000..74153e50 --- /dev/null +++ b/lib/js/src/rpc/structs/AppServicesCapabilities.js @@ -0,0 +1,70 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { AppServiceCapability } from './AppServiceCapability.js'; + +/** + * Capabilities of app services including what service types are supported and the current state of services. + */ +class AppServicesCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {AppServiceCapability[]} services - An array of currently available services. If this is an update to the + * capability the affected services will include an update reason in that + * item + * @return {AppServicesCapabilities} + */ + setAppServices (services) { + this.validateType(AppServiceCapability, services, true); + this.setParameter(AppServicesCapabilities.KEY_APP_SERVICES, services); + return this; + } + + /** + * @return {AppServiceCapability[]} + */ + getAppServices () { + return this.getObject(AppServiceCapability, AppServicesCapabilities.KEY_APP_SERVICES); + } +} + +AppServicesCapabilities.KEY_APP_SERVICES = 'appServices'; + +export { AppServicesCapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/AudioControlCapabilities.js b/lib/js/src/rpc/structs/AudioControlCapabilities.js new file mode 100644 index 00000000..ff71a361 --- /dev/null +++ b/lib/js/src/rpc/structs/AudioControlCapabilities.js @@ -0,0 +1,169 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { ModuleInfo } from './ModuleInfo.js'; + +class AudioControlCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} name - The short friendly name of the light control module. It should not be used to identify a + * module by mobile application. + * @return {AudioControlCapabilities} + */ + setModuleName (name) { + this.setParameter(AudioControlCapabilities.KEY_MODULE_NAME, name); + return this; + } + + /** + * @return {String} + */ + getModuleName () { + return this.getParameter(AudioControlCapabilities.KEY_MODULE_NAME); + } + + /** + * @param {ModuleInfo} info - Information about a RC module, including its id. + * @return {AudioControlCapabilities} + */ + setModuleInfo (info) { + this.validateType(ModuleInfo, info); + this.setParameter(AudioControlCapabilities.KEY_MODULE_INFO, info); + return this; + } + + /** + * @return {ModuleInfo} + */ + getModuleInfo () { + return this.getObject(ModuleInfo, AudioControlCapabilities.KEY_MODULE_INFO); + } + + /** + * @param {Boolean} available - Availability of the control of audio source. + * @return {AudioControlCapabilities} + */ + setSourceAvailable (available) { + this.setParameter(AudioControlCapabilities.KEY_SOURCE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getSourceAvailable () { + return this.getParameter(AudioControlCapabilities.KEY_SOURCE_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the keepContext parameter. + * @return {AudioControlCapabilities} + */ + setKeepContextAvailable (available) { + this.setParameter(AudioControlCapabilities.KEY_KEEP_CONTEXT_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getKeepContextAvailable () { + return this.getParameter(AudioControlCapabilities.KEY_KEEP_CONTEXT_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of audio volume. + * @return {AudioControlCapabilities} + */ + setVolumeAvailable (available) { + this.setParameter(AudioControlCapabilities.KEY_VOLUME_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getVolumeAvailable () { + return this.getParameter(AudioControlCapabilities.KEY_VOLUME_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of Equalizer Settings. + * @return {AudioControlCapabilities} + */ + setEqualizerAvailable (available) { + this.setParameter(AudioControlCapabilities.KEY_EQUALIZER_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getEqualizerAvailable () { + return this.getParameter(AudioControlCapabilities.KEY_EQUALIZER_AVAILABLE); + } + + /** + * @param {Number} id - Must be included if equalizerAvailable=true, and assume all IDs starting from 1 to this + * value are valid + * @return {AudioControlCapabilities} + */ + setEqualizerMaxChannelId (id) { + this.setParameter(AudioControlCapabilities.KEY_EQUALIZER_MAX_CHANNEL_ID, id); + return this; + } + + /** + * @return {Number} + */ + getEqualizerMaxChannelId () { + return this.getParameter(AudioControlCapabilities.KEY_EQUALIZER_MAX_CHANNEL_ID); + } +} + +AudioControlCapabilities.KEY_MODULE_NAME = 'moduleName'; +AudioControlCapabilities.KEY_MODULE_INFO = 'moduleInfo'; +AudioControlCapabilities.KEY_SOURCE_AVAILABLE = 'sourceAvailable'; +AudioControlCapabilities.KEY_KEEP_CONTEXT_AVAILABLE = 'keepContextAvailable'; +AudioControlCapabilities.KEY_VOLUME_AVAILABLE = 'volumeAvailable'; +AudioControlCapabilities.KEY_EQUALIZER_AVAILABLE = 'equalizerAvailable'; +AudioControlCapabilities.KEY_EQUALIZER_MAX_CHANNEL_ID = 'equalizerMaxChannelId'; + +export { AudioControlCapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/AudioControlData.js b/lib/js/src/rpc/structs/AudioControlData.js new file mode 100644 index 00000000..9fd6bf00 --- /dev/null +++ b/lib/js/src/rpc/structs/AudioControlData.js @@ -0,0 +1,127 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { PrimaryAudioSource } from '../enums/PrimaryAudioSource.js'; +import { EqualizerSettings } from './EqualizerSettings.js'; + +class AudioControlData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {PrimaryAudioSource} source - In a getter response or a notification, it is the current primary audio + * source of the system. In a setter request, it is the target audio source + * that the system shall switch to. If the value is MOBILE_APP, the system + * shall switch to the mobile media app that issues the setter RPC. + * @return {AudioControlData} + */ + setSource (source) { + this.validateType(PrimaryAudioSource, source); + this.setParameter(AudioControlData.KEY_SOURCE, source); + return this; + } + + /** + * @return {PrimaryAudioSource} + */ + getSource () { + return this.getObject(PrimaryAudioSource, AudioControlData.KEY_SOURCE); + } + + /** + * @param {Boolean} context - This parameter shall not be present in any getter responses or notifications. This + * parameter is optional in a setter request. The default value is false if it is not + * included. If it is false, the system not only changes the audio source but also brings + * the default application or system UI associated with the audio source to foreground. + * If it is true, the system only changes the audio source, but keeps the current + * application in foreground. + * @return {AudioControlData} + */ + setKeepContext (context) { + this.setParameter(AudioControlData.KEY_KEEP_CONTEXT, context); + return this; + } + + /** + * @return {Boolean} + */ + getKeepContext () { + return this.getParameter(AudioControlData.KEY_KEEP_CONTEXT); + } + + /** + * @param {Number} volume - Reflects the volume of audio, from 0%-100%. + * @return {AudioControlData} + */ + setVolume (volume) { + this.setParameter(AudioControlData.KEY_VOLUME, volume); + return this; + } + + /** + * @return {Number} + */ + getVolume () { + return this.getParameter(AudioControlData.KEY_VOLUME); + } + + /** + * @param {EqualizerSettings[]} settings - Defines the list of supported channels (band) and their current/desired + * settings on HMI + * @return {AudioControlData} + */ + setEqualizerSettings (settings) { + this.validateType(EqualizerSettings, settings, true); + this.setParameter(AudioControlData.KEY_EQUALIZER_SETTINGS, settings); + return this; + } + + /** + * @return {EqualizerSettings[]} + */ + getEqualizerSettings () { + return this.getObject(EqualizerSettings, AudioControlData.KEY_EQUALIZER_SETTINGS); + } +} + +AudioControlData.KEY_SOURCE = 'source'; +AudioControlData.KEY_KEEP_CONTEXT = 'keepContext'; +AudioControlData.KEY_VOLUME = 'volume'; +AudioControlData.KEY_EQUALIZER_SETTINGS = 'equalizerSettings'; + +export { AudioControlData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/AudioPassThruCapabilities.js b/lib/js/src/rpc/structs/AudioPassThruCapabilities.js index f5ec65f6..8ea9c8b4 100644 --- a/lib/js/src/rpc/structs/AudioPassThruCapabilities.js +++ b/lib/js/src/rpc/structs/AudioPassThruCapabilities.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -35,61 +36,65 @@ import { SamplingRate } from '../enums/SamplingRate.js'; import { BitsPerSample } from '../enums/BitsPerSample.js'; import { AudioType } from '../enums/AudioType.js'; +/** + * Describes different audio type configurations for PerformAudioPassThru. e.g. {8kHz,8-bit,PCM} The audio is recorded + * in monaural. + */ class AudioPassThruCapabilities extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {SamplingRate} samplingRate - * @return {AudioPassThruCapabilities} - */ - setSamplingRate (samplingRate) { - this.validateType(SamplingRate, samplingRate); - - this.setParameter(AudioPassThruCapabilities.KEY_SAMPLING_RATE, samplingRate); + * @param {SamplingRate} rate - Describes different sampling options for PerformAudioPassThru. + * @return {AudioPassThruCapabilities} + */ + setSamplingRate (rate) { + this.validateType(SamplingRate, rate); + this.setParameter(AudioPassThruCapabilities.KEY_SAMPLING_RATE, rate); return this; } /** - * @return {SamplingRate} - */ + * @return {SamplingRate} + */ getSamplingRate () { return this.getObject(SamplingRate, AudioPassThruCapabilities.KEY_SAMPLING_RATE); } /** - * @param {BitsPerSample} bitsPerSample - * @return {AudioPassThruCapabilities} - */ - setBitsPerSample (bitsPerSample) { - this.validateType(BitsPerSample, bitsPerSample); - - this.setParameter(AudioPassThruCapabilities.KEY_BITS_PER_SAMPLE, bitsPerSample); + * @param {BitsPerSample} sample - Describes different quality options for PerformAudioPassThru. + * @return {AudioPassThruCapabilities} + */ + setBitsPerSample (sample) { + this.validateType(BitsPerSample, sample); + this.setParameter(AudioPassThruCapabilities.KEY_BITS_PER_SAMPLE, sample); return this; } /** - * @return {BitsPerSample} - */ + * @return {BitsPerSample} + */ getBitsPerSample () { return this.getObject(BitsPerSample, AudioPassThruCapabilities.KEY_BITS_PER_SAMPLE); } /** - * @param {AudioType} bitsPerSample - * @return {AudioPassThruCapabilities} - */ - setAudioType (audioType) { - this.validateType(AudioType, audioType); - - this.setParameter(AudioPassThruCapabilities.KEY_AUDIO_TYPE, audioType); + * @param {AudioType} type - Describes different audio type options for PerformAudioPassThru. + * @return {AudioPassThruCapabilities} + */ + setAudioType (type) { + this.validateType(AudioType, type); + this.setParameter(AudioPassThruCapabilities.KEY_AUDIO_TYPE, type); return this; } /** - * @return {AudioType} - */ + * @return {AudioType} + */ getAudioType () { return this.getObject(AudioType, AudioPassThruCapabilities.KEY_AUDIO_TYPE); } @@ -99,4 +104,4 @@ AudioPassThruCapabilities.KEY_SAMPLING_RATE = 'samplingRate'; AudioPassThruCapabilities.KEY_BITS_PER_SAMPLE = 'bitsPerSample'; AudioPassThruCapabilities.KEY_AUDIO_TYPE = 'audioType'; -export { AudioPassThruCapabilities }; +export { AudioPassThruCapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/BeltStatus.js b/lib/js/src/rpc/structs/BeltStatus.js new file mode 100644 index 00000000..d499ae9e --- /dev/null +++ b/lib/js/src/rpc/structs/BeltStatus.js @@ -0,0 +1,318 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { VehicleDataEventStatus } from '../enums/VehicleDataEventStatus.js'; + +class BeltStatus extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsDrvBelt_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + setDriverBeltDeployed (deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(BeltStatus.KEY_DRIVER_BELT_DEPLOYED, deployed); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getDriverBeltDeployed () { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_DRIVER_BELT_DEPLOYED); + } + + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsPasBelt_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + setPassengerBeltDeployed (deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(BeltStatus.KEY_PASSENGER_BELT_DEPLOYED, deployed); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getPassengerBeltDeployed () { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_PASSENGER_BELT_DEPLOYED); + } + + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw1PasBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + setPassengerBuckleBelted (belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_PASSENGER_BUCKLE_BELTED, belted); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getPassengerBuckleBelted () { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_PASSENGER_BUCKLE_BELTED); + } + + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw1DrvBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + setDriverBuckleBelted (belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_DRIVER_BUCKLE_BELTED, belted); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getDriverBuckleBelted () { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_DRIVER_BUCKLE_BELTED); + } + + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw2lBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + setLeftRow2BuckleBelted (belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_LEFT_ROW2BUCKLE_BELTED, belted); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getLeftRow2BuckleBelted () { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_LEFT_ROW2BUCKLE_BELTED); + } + + /** + * @param {VehicleDataEventStatus} detected - References signal "VedsRw1PasChld_D_Ltchd". See + * VehicleDataEventStatus. + * @return {BeltStatus} + */ + setPassengerChildDetected (detected) { + this.validateType(VehicleDataEventStatus, detected); + this.setParameter(BeltStatus.KEY_PASSENGER_CHILD_DETECTED, detected); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getPassengerChildDetected () { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_PASSENGER_CHILD_DETECTED); + } + + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw2rBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + setRightRow2BuckleBelted (belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_RIGHT_ROW2BUCKLE_BELTED, belted); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getRightRow2BuckleBelted () { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_RIGHT_ROW2BUCKLE_BELTED); + } + + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw2mBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + setMiddleRow2BuckleBelted (belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_MIDDLE_ROW2BUCKLE_BELTED, belted); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getMiddleRow2BuckleBelted () { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_MIDDLE_ROW2BUCKLE_BELTED); + } + + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw3mBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + setMiddleRow3BuckleBelted (belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_MIDDLE_ROW3BUCKLE_BELTED, belted); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getMiddleRow3BuckleBelted () { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_MIDDLE_ROW3BUCKLE_BELTED); + } + + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw3lBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + setLeftRow3BuckleBelted (belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_LEFT_ROW3BUCKLE_BELTED, belted); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getLeftRow3BuckleBelted () { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_LEFT_ROW3BUCKLE_BELTED); + } + + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw3rBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + setRightRow3BuckleBelted (belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_RIGHT_ROW3BUCKLE_BELTED, belted); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getRightRow3BuckleBelted () { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_RIGHT_ROW3BUCKLE_BELTED); + } + + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw2lRib_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + setLeftRearInflatableBelted (belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_LEFT_REAR_INFLATABLE_BELTED, belted); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getLeftRearInflatableBelted () { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_LEFT_REAR_INFLATABLE_BELTED); + } + + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw2rRib_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + setRightRearInflatableBelted (belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_RIGHT_REAR_INFLATABLE_BELTED, belted); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getRightRearInflatableBelted () { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_RIGHT_REAR_INFLATABLE_BELTED); + } + + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsRw1mBelt_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + setMiddleRow1BeltDeployed (deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(BeltStatus.KEY_MIDDLE_ROW1BELT_DEPLOYED, deployed); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getMiddleRow1BeltDeployed () { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_MIDDLE_ROW1BELT_DEPLOYED); + } + + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw1mBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + setMiddleRow1BuckleBelted (belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_MIDDLE_ROW1BUCKLE_BELTED, belted); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getMiddleRow1BuckleBelted () { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_MIDDLE_ROW1BUCKLE_BELTED); + } +} + +BeltStatus.KEY_DRIVER_BELT_DEPLOYED = 'driverBeltDeployed'; +BeltStatus.KEY_PASSENGER_BELT_DEPLOYED = 'passengerBeltDeployed'; +BeltStatus.KEY_PASSENGER_BUCKLE_BELTED = 'passengerBuckleBelted'; +BeltStatus.KEY_DRIVER_BUCKLE_BELTED = 'driverBuckleBelted'; +BeltStatus.KEY_LEFT_ROW2BUCKLE_BELTED = 'leftRow2BuckleBelted'; +BeltStatus.KEY_PASSENGER_CHILD_DETECTED = 'passengerChildDetected'; +BeltStatus.KEY_RIGHT_ROW2BUCKLE_BELTED = 'rightRow2BuckleBelted'; +BeltStatus.KEY_MIDDLE_ROW2BUCKLE_BELTED = 'middleRow2BuckleBelted'; +BeltStatus.KEY_MIDDLE_ROW3BUCKLE_BELTED = 'middleRow3BuckleBelted'; +BeltStatus.KEY_LEFT_ROW3BUCKLE_BELTED = 'leftRow3BuckleBelted'; +BeltStatus.KEY_RIGHT_ROW3BUCKLE_BELTED = 'rightRow3BuckleBelted'; +BeltStatus.KEY_LEFT_REAR_INFLATABLE_BELTED = 'leftRearInflatableBelted'; +BeltStatus.KEY_RIGHT_REAR_INFLATABLE_BELTED = 'rightRearInflatableBelted'; +BeltStatus.KEY_MIDDLE_ROW1BELT_DEPLOYED = 'middleRow1BeltDeployed'; +BeltStatus.KEY_MIDDLE_ROW1BUCKLE_BELTED = 'middleRow1BuckleBelted'; + +export { BeltStatus }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/BodyInformation.js b/lib/js/src/rpc/structs/BodyInformation.js new file mode 100644 index 00000000..ebd0843f --- /dev/null +++ b/lib/js/src/rpc/structs/BodyInformation.js @@ -0,0 +1,169 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { IgnitionStatus } from '../enums/IgnitionStatus.js'; +import { IgnitionStableStatus } from '../enums/IgnitionStableStatus.js'; + +class BodyInformation extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Boolean} active - References signal "PrkBrkActv_B_Actl". + * @return {BodyInformation} + */ + setParkBrakeActive (active) { + this.setParameter(BodyInformation.KEY_PARK_BRAKE_ACTIVE, active); + return this; + } + + /** + * @return {Boolean} + */ + getParkBrakeActive () { + return this.getParameter(BodyInformation.KEY_PARK_BRAKE_ACTIVE); + } + + /** + * @param {IgnitionStableStatus} status - References signal "Ignition_Switch_Stable". See IgnitionStableStatus. + * @return {BodyInformation} + */ + setIgnitionStableStatus (status) { + this.validateType(IgnitionStableStatus, status); + this.setParameter(BodyInformation.KEY_IGNITION_STABLE_STATUS, status); + return this; + } + + /** + * @return {IgnitionStableStatus} + */ + getIgnitionStableStatus () { + return this.getObject(IgnitionStableStatus, BodyInformation.KEY_IGNITION_STABLE_STATUS); + } + + /** + * @param {IgnitionStatus} status - References signal "Ignition_status". See IgnitionStatus. + * @return {BodyInformation} + */ + setIgnitionStatus (status) { + this.validateType(IgnitionStatus, status); + this.setParameter(BodyInformation.KEY_IGNITION_STATUS, status); + return this; + } + + /** + * @return {IgnitionStatus} + */ + getIgnitionStatus () { + return this.getObject(IgnitionStatus, BodyInformation.KEY_IGNITION_STATUS); + } + + /** + * @param {Boolean} ajar - References signal "DrStatDrv_B_Actl". + * @return {BodyInformation} + */ + setDriverDoorAjar (ajar) { + this.setParameter(BodyInformation.KEY_DRIVER_DOOR_AJAR, ajar); + return this; + } + + /** + * @return {Boolean} + */ + getDriverDoorAjar () { + return this.getParameter(BodyInformation.KEY_DRIVER_DOOR_AJAR); + } + + /** + * @param {Boolean} ajar - References signal "DrStatPsngr_B_Actl". + * @return {BodyInformation} + */ + setPassengerDoorAjar (ajar) { + this.setParameter(BodyInformation.KEY_PASSENGER_DOOR_AJAR, ajar); + return this; + } + + /** + * @return {Boolean} + */ + getPassengerDoorAjar () { + return this.getParameter(BodyInformation.KEY_PASSENGER_DOOR_AJAR); + } + + /** + * @param {Boolean} ajar - References signal "DrStatRl_B_Actl". + * @return {BodyInformation} + */ + setRearLeftDoorAjar (ajar) { + this.setParameter(BodyInformation.KEY_REAR_LEFT_DOOR_AJAR, ajar); + return this; + } + + /** + * @return {Boolean} + */ + getRearLeftDoorAjar () { + return this.getParameter(BodyInformation.KEY_REAR_LEFT_DOOR_AJAR); + } + + /** + * @param {Boolean} ajar - References signal "DrStatRr_B_Actl". + * @return {BodyInformation} + */ + setRearRightDoorAjar (ajar) { + this.setParameter(BodyInformation.KEY_REAR_RIGHT_DOOR_AJAR, ajar); + return this; + } + + /** + * @return {Boolean} + */ + getRearRightDoorAjar () { + return this.getParameter(BodyInformation.KEY_REAR_RIGHT_DOOR_AJAR); + } +} + +BodyInformation.KEY_PARK_BRAKE_ACTIVE = 'parkBrakeActive'; +BodyInformation.KEY_IGNITION_STABLE_STATUS = 'ignitionStableStatus'; +BodyInformation.KEY_IGNITION_STATUS = 'ignitionStatus'; +BodyInformation.KEY_DRIVER_DOOR_AJAR = 'driverDoorAjar'; +BodyInformation.KEY_PASSENGER_DOOR_AJAR = 'passengerDoorAjar'; +BodyInformation.KEY_REAR_LEFT_DOOR_AJAR = 'rearLeftDoorAjar'; +BodyInformation.KEY_REAR_RIGHT_DOOR_AJAR = 'rearRightDoorAjar'; + +export { BodyInformation }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/ButtonCapabilities.js b/lib/js/src/rpc/structs/ButtonCapabilities.js index ed7f742b..9be31b7f 100644 --- a/lib/js/src/rpc/structs/ButtonCapabilities.js +++ b/lib/js/src/rpc/structs/ButtonCapabilities.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -31,94 +32,102 @@ */ import { RpcStruct } from '../RpcStruct.js'; -import { ModuleInfo } from './ModuleInfo'; import { ButtonName } from '../enums/ButtonName.js'; +import { ModuleInfo } from './ModuleInfo.js'; +/** + * Contains information about a button's capabilities. + */ class ButtonCapabilities extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {ButtonName} name - * @return {ButtonCapabilities} - */ + * @param {ButtonName} name - The name of the button. See ButtonName. + * @return {ButtonCapabilities} + */ setName (name) { this.validateType(ButtonName, name); - this.setParameter(ButtonCapabilities.KEY_NAME, name); return this; } /** - * @return {ButtonName} - */ + * @return {ButtonName} + */ getName () { return this.getObject(ButtonName, ButtonCapabilities.KEY_NAME); } /** - * @param {ModuleInfo} moduleInfo - * @return {ButtonCapabilities} - */ - setModuleInfo (moduleInfo) { - this.validateType(ModuleInfo, moduleInfo); - - this.setParameter(ButtonCapabilities.KEY_MODULE_INFO, moduleInfo); + * @param {ModuleInfo} info - Information about a RC module, including its id. + * @return {ButtonCapabilities} + */ + setModuleInfo (info) { + this.validateType(ModuleInfo, info); + this.setParameter(ButtonCapabilities.KEY_MODULE_INFO, info); return this; } /** - * @return {ModuleInfo} - */ + * @return {ModuleInfo} + */ getModuleInfo () { return this.getObject(ModuleInfo, ButtonCapabilities.KEY_MODULE_INFO); } /** - * @param {Boolean} shortPressAvailable - * @return {ButtonCapabilities} - */ - setShortPressAvailable (shortPressAvailable) { - this.setParameter(ButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE, shortPressAvailable); + * @param {Boolean} available - The button supports a short press. Whenever the button is pressed short, + * onButtonPressed( SHORT) will be invoked. + * @return {ButtonCapabilities} + */ + setShortPressAvailable (available) { + this.setParameter(ButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE, available); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getShortPressAvailable () { return this.getParameter(ButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE); } /** - * @param {Boolean} longPressAvailable - * @return {ButtonCapabilities} - */ - setLongPressAvailable (longPressAvailable) { - this.setParameter(ButtonCapabilities.KEY_LONG_PRESS_AVAILABLE, longPressAvailable); + * @param {Boolean} available - The button supports a LONG press. Whenever the button is pressed long, + * onButtonPressed( LONG) will be invoked. + * @return {ButtonCapabilities} + */ + setLongPressAvailable (available) { + this.setParameter(ButtonCapabilities.KEY_LONG_PRESS_AVAILABLE, available); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getLongPressAvailable () { return this.getParameter(ButtonCapabilities.KEY_LONG_PRESS_AVAILABLE); } /** - * @param {Boolean} upDownAvailable - * @return {ButtonCapabilities} - */ - setUpDownAvailable (upDownAvailable) { - this.setParameter(ButtonCapabilities.KEY_UP_DOWN_AVAILABLE, upDownAvailable); + * @param {Boolean} available - The button supports "button down" and "button up". Whenever the button is pressed, + * onButtonEvent( DOWN) will be invoked. Whenever the button is released, + * onButtonEvent( UP) will be invoked. + * @return {ButtonCapabilities} + */ + setUpDownAvailable (available) { + this.setParameter(ButtonCapabilities.KEY_UP_DOWN_AVAILABLE, available); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getUpDownAvailable () { return this.getParameter(ButtonCapabilities.KEY_UP_DOWN_AVAILABLE); } @@ -130,4 +139,4 @@ ButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE = 'shortPressAvailable'; ButtonCapabilities.KEY_LONG_PRESS_AVAILABLE = 'longPressAvailable'; ButtonCapabilities.KEY_UP_DOWN_AVAILABLE = 'upDownAvailable'; -export { ButtonCapabilities }; +export { ButtonCapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/Choice.js b/lib/js/src/rpc/structs/Choice.js new file mode 100644 index 00000000..a9e31bc7 --- /dev/null +++ b/lib/js/src/rpc/structs/Choice.js @@ -0,0 +1,171 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { Image } from './Image.js'; + +/** + * A choice is an option given to the user, which can be selected either by menu, or through voice recognition system. + */ +class Choice extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} id + * @return {Choice} + */ + setChoiceID (id) { + this.setParameter(Choice.KEY_CHOICE_ID, id); + return this; + } + + /** + * @return {Number} + */ + getChoiceID () { + return this.getParameter(Choice.KEY_CHOICE_ID); + } + + /** + * @param {String} name + * @return {Choice} + */ + setMenuName (name) { + this.setParameter(Choice.KEY_MENU_NAME, name); + return this; + } + + /** + * @return {String} + */ + getMenuName () { + return this.getParameter(Choice.KEY_MENU_NAME); + } + + /** + * @param {String[]} commands + * @return {Choice} + */ + setVrCommands (commands) { + this.setParameter(Choice.KEY_VR_COMMANDS, commands); + return this; + } + + /** + * @return {String[]} + */ + getVrCommands () { + return this.getParameter(Choice.KEY_VR_COMMANDS); + } + + /** + * @param {Image} image + * @return {Choice} + */ + setImage (image) { + this.validateType(Image, image); + this.setParameter(Choice.KEY_IMAGE, image); + return this; + } + + /** + * @return {Image} + */ + getImage () { + return this.getObject(Image, Choice.KEY_IMAGE); + } + + /** + * @param {String} text - Optional secondary text to display; e.g. address of POI in a search result entry + * @return {Choice} + */ + setSecondaryText (text) { + this.setParameter(Choice.KEY_SECONDARY_TEXT, text); + return this; + } + + /** + * @return {String} + */ + getSecondaryText () { + return this.getParameter(Choice.KEY_SECONDARY_TEXT); + } + + /** + * @param {String} text - Optional tertiary text to display; e.g. distance to POI for a search result entry + * @return {Choice} + */ + setTertiaryText (text) { + this.setParameter(Choice.KEY_TERTIARY_TEXT, text); + return this; + } + + /** + * @return {String} + */ + getTertiaryText () { + return this.getParameter(Choice.KEY_TERTIARY_TEXT); + } + + /** + * @param {Image} image - Optional secondary image struct for choice + * @return {Choice} + */ + setSecondaryImage (image) { + this.validateType(Image, image); + this.setParameter(Choice.KEY_SECONDARY_IMAGE, image); + return this; + } + + /** + * @return {Image} + */ + getSecondaryImage () { + return this.getObject(Image, Choice.KEY_SECONDARY_IMAGE); + } +} + +Choice.KEY_CHOICE_ID = 'choiceID'; +Choice.KEY_MENU_NAME = 'menuName'; +Choice.KEY_VR_COMMANDS = 'vrCommands'; +Choice.KEY_IMAGE = 'image'; +Choice.KEY_SECONDARY_TEXT = 'secondaryText'; +Choice.KEY_TERTIARY_TEXT = 'tertiaryText'; +Choice.KEY_SECONDARY_IMAGE = 'secondaryImage'; + +export { Choice }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/ClimateControlCapabilities.js b/lib/js/src/rpc/structs/ClimateControlCapabilities.js new file mode 100644 index 00000000..360c27a9 --- /dev/null +++ b/lib/js/src/rpc/structs/ClimateControlCapabilities.js @@ -0,0 +1,394 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { DefrostZone } from '../enums/DefrostZone.js'; +import { VentilationMode } from '../enums/VentilationMode.js'; +import { ModuleInfo } from './ModuleInfo.js'; + +/** + * Contains information about a climate control module's capabilities. + */ +class ClimateControlCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} name - The short friendly name of the climate control module. It should not be used to identify a + * module by mobile application. + * @return {ClimateControlCapabilities} + */ + setModuleName (name) { + this.setParameter(ClimateControlCapabilities.KEY_MODULE_NAME, name); + return this; + } + + /** + * @return {String} + */ + getModuleName () { + return this.getParameter(ClimateControlCapabilities.KEY_MODULE_NAME); + } + + /** + * @param {ModuleInfo} info - Information about a RC module, including its id. + * @return {ClimateControlCapabilities} + */ + setModuleInfo (info) { + this.validateType(ModuleInfo, info); + this.setParameter(ClimateControlCapabilities.KEY_MODULE_INFO, info); + return this; + } + + /** + * @return {ModuleInfo} + */ + getModuleInfo () { + return this.getObject(ModuleInfo, ClimateControlCapabilities.KEY_MODULE_INFO); + } + + /** + * @param {Boolean} available - Availability of the reading of current temperature. True: Available, False: Not + * Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + setCurrentTemperatureAvailable (available) { + this.setParameter(ClimateControlCapabilities.KEY_CURRENT_TEMPERATURE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getCurrentTemperatureAvailable () { + return this.getParameter(ClimateControlCapabilities.KEY_CURRENT_TEMPERATURE_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of fan speed. True: Available, False: Not Available, Not + * present: Not Available. + * @return {ClimateControlCapabilities} + */ + setFanSpeedAvailable (available) { + this.setParameter(ClimateControlCapabilities.KEY_FAN_SPEED_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getFanSpeedAvailable () { + return this.getParameter(ClimateControlCapabilities.KEY_FAN_SPEED_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of desired temperature. True: Available, False: Not + * Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + setDesiredTemperatureAvailable (available) { + this.setParameter(ClimateControlCapabilities.KEY_DESIRED_TEMPERATURE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getDesiredTemperatureAvailable () { + return this.getParameter(ClimateControlCapabilities.KEY_DESIRED_TEMPERATURE_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of turn on/off AC. True: Available, False: Not + * Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + setAcEnableAvailable (available) { + this.setParameter(ClimateControlCapabilities.KEY_AC_ENABLE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getAcEnableAvailable () { + return this.getParameter(ClimateControlCapabilities.KEY_AC_ENABLE_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of enable/disable air conditioning is ON on the maximum + * level. True: Available, False: Not Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + setAcMaxEnableAvailable (available) { + this.setParameter(ClimateControlCapabilities.KEY_AC_MAX_ENABLE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getAcMaxEnableAvailable () { + return this.getParameter(ClimateControlCapabilities.KEY_AC_MAX_ENABLE_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of enable/disable circulate Air mode. True: Available, + * False: Not Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + setCirculateAirEnableAvailable (available) { + this.setParameter(ClimateControlCapabilities.KEY_CIRCULATE_AIR_ENABLE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getCirculateAirEnableAvailable () { + return this.getParameter(ClimateControlCapabilities.KEY_CIRCULATE_AIR_ENABLE_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of enable/disable auto mode. True: Available, False: Not + * Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + setAutoModeEnableAvailable (available) { + this.setParameter(ClimateControlCapabilities.KEY_AUTO_MODE_ENABLE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getAutoModeEnableAvailable () { + return this.getParameter(ClimateControlCapabilities.KEY_AUTO_MODE_ENABLE_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of enable/disable dual mode. True: Available, False: Not + * Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + setDualModeEnableAvailable (available) { + this.setParameter(ClimateControlCapabilities.KEY_DUAL_MODE_ENABLE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getDualModeEnableAvailable () { + return this.getParameter(ClimateControlCapabilities.KEY_DUAL_MODE_ENABLE_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of defrost zones. True: Available, False: Not Available, + * Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + setDefrostZoneAvailable (available) { + this.setParameter(ClimateControlCapabilities.KEY_DEFROST_ZONE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getDefrostZoneAvailable () { + return this.getParameter(ClimateControlCapabilities.KEY_DEFROST_ZONE_AVAILABLE); + } + + /** + * @param {DefrostZone[]} zone - A set of all defrost zones that are controllable. + * @return {ClimateControlCapabilities} + */ + setDefrostZone (zone) { + this.validateType(DefrostZone, zone, true); + this.setParameter(ClimateControlCapabilities.KEY_DEFROST_ZONE, zone); + return this; + } + + /** + * @return {DefrostZone[]} + */ + getDefrostZone () { + return this.getObject(DefrostZone, ClimateControlCapabilities.KEY_DEFROST_ZONE); + } + + /** + * @param {Boolean} available - Availability of the control of air ventilation mode. True: Available, False: Not + * Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + setVentilationModeAvailable (available) { + this.setParameter(ClimateControlCapabilities.KEY_VENTILATION_MODE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getVentilationModeAvailable () { + return this.getParameter(ClimateControlCapabilities.KEY_VENTILATION_MODE_AVAILABLE); + } + + /** + * @param {VentilationMode[]} mode - A set of all ventilation modes that are controllable. + * @return {ClimateControlCapabilities} + */ + setVentilationMode (mode) { + this.validateType(VentilationMode, mode, true); + this.setParameter(ClimateControlCapabilities.KEY_VENTILATION_MODE, mode); + return this; + } + + /** + * @return {VentilationMode[]} + */ + getVentilationMode () { + return this.getObject(VentilationMode, ClimateControlCapabilities.KEY_VENTILATION_MODE); + } + + /** + * @param {Boolean} available - Availability of the control (enable/disable) of heated Steering Wheel. True: + * Available, False: Not Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + setHeatedSteeringWheelAvailable (available) { + this.setParameter(ClimateControlCapabilities.KEY_HEATED_STEERING_WHEEL_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getHeatedSteeringWheelAvailable () { + return this.getParameter(ClimateControlCapabilities.KEY_HEATED_STEERING_WHEEL_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control (enable/disable) of heated Windshield. True: Available, + * False: Not Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + setHeatedWindshieldAvailable (available) { + this.setParameter(ClimateControlCapabilities.KEY_HEATED_WINDSHIELD_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getHeatedWindshieldAvailable () { + return this.getParameter(ClimateControlCapabilities.KEY_HEATED_WINDSHIELD_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control (enable/disable) of heated Rear Window. True: Available, + * False: Not Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + setHeatedRearWindowAvailable (available) { + this.setParameter(ClimateControlCapabilities.KEY_HEATED_REAR_WINDOW_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getHeatedRearWindowAvailable () { + return this.getParameter(ClimateControlCapabilities.KEY_HEATED_REAR_WINDOW_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control (enable/disable) of heated Mirrors. True: Available, + * False: Not Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + setHeatedMirrorsAvailable (available) { + this.setParameter(ClimateControlCapabilities.KEY_HEATED_MIRRORS_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getHeatedMirrorsAvailable () { + return this.getParameter(ClimateControlCapabilities.KEY_HEATED_MIRRORS_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of enable/disable climate control. True: Available, + * False: Not Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + setClimateEnableAvailable (available) { + this.setParameter(ClimateControlCapabilities.KEY_CLIMATE_ENABLE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getClimateEnableAvailable () { + return this.getParameter(ClimateControlCapabilities.KEY_CLIMATE_ENABLE_AVAILABLE); + } +} + +ClimateControlCapabilities.KEY_MODULE_NAME = 'moduleName'; +ClimateControlCapabilities.KEY_MODULE_INFO = 'moduleInfo'; +ClimateControlCapabilities.KEY_CURRENT_TEMPERATURE_AVAILABLE = 'currentTemperatureAvailable'; +ClimateControlCapabilities.KEY_FAN_SPEED_AVAILABLE = 'fanSpeedAvailable'; +ClimateControlCapabilities.KEY_DESIRED_TEMPERATURE_AVAILABLE = 'desiredTemperatureAvailable'; +ClimateControlCapabilities.KEY_AC_ENABLE_AVAILABLE = 'acEnableAvailable'; +ClimateControlCapabilities.KEY_AC_MAX_ENABLE_AVAILABLE = 'acMaxEnableAvailable'; +ClimateControlCapabilities.KEY_CIRCULATE_AIR_ENABLE_AVAILABLE = 'circulateAirEnableAvailable'; +ClimateControlCapabilities.KEY_AUTO_MODE_ENABLE_AVAILABLE = 'autoModeEnableAvailable'; +ClimateControlCapabilities.KEY_DUAL_MODE_ENABLE_AVAILABLE = 'dualModeEnableAvailable'; +ClimateControlCapabilities.KEY_DEFROST_ZONE_AVAILABLE = 'defrostZoneAvailable'; +ClimateControlCapabilities.KEY_DEFROST_ZONE = 'defrostZone'; +ClimateControlCapabilities.KEY_VENTILATION_MODE_AVAILABLE = 'ventilationModeAvailable'; +ClimateControlCapabilities.KEY_VENTILATION_MODE = 'ventilationMode'; +ClimateControlCapabilities.KEY_HEATED_STEERING_WHEEL_AVAILABLE = 'heatedSteeringWheelAvailable'; +ClimateControlCapabilities.KEY_HEATED_WINDSHIELD_AVAILABLE = 'heatedWindshieldAvailable'; +ClimateControlCapabilities.KEY_HEATED_REAR_WINDOW_AVAILABLE = 'heatedRearWindowAvailable'; +ClimateControlCapabilities.KEY_HEATED_MIRRORS_AVAILABLE = 'heatedMirrorsAvailable'; +ClimateControlCapabilities.KEY_CLIMATE_ENABLE_AVAILABLE = 'climateEnableAvailable'; + +export { ClimateControlCapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/ClimateControlData.js b/lib/js/src/rpc/structs/ClimateControlData.js new file mode 100644 index 00000000..2fa8062a --- /dev/null +++ b/lib/js/src/rpc/structs/ClimateControlData.js @@ -0,0 +1,308 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Temperature } from './Temperature.js'; +import { RpcStruct } from '../RpcStruct.js'; +import { VentilationMode } from '../enums/VentilationMode.js'; +import { DefrostZone } from '../enums/DefrostZone.js'; + +class ClimateControlData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} speed + * @return {ClimateControlData} + */ + setFanSpeed (speed) { + this.setParameter(ClimateControlData.KEY_FAN_SPEED, speed); + return this; + } + + /** + * @return {Number} + */ + getFanSpeed () { + return this.getParameter(ClimateControlData.KEY_FAN_SPEED); + } + + /** + * @param {Temperature} temperature + * @return {ClimateControlData} + */ + setCurrentTemperature (temperature) { + this.validateType(Temperature, temperature); + this.setParameter(ClimateControlData.KEY_CURRENT_TEMPERATURE, temperature); + return this; + } + + /** + * @return {Temperature} + */ + getCurrentTemperature () { + return this.getObject(Temperature, ClimateControlData.KEY_CURRENT_TEMPERATURE); + } + + /** + * @param {Temperature} temperature + * @return {ClimateControlData} + */ + setDesiredTemperature (temperature) { + this.validateType(Temperature, temperature); + this.setParameter(ClimateControlData.KEY_DESIRED_TEMPERATURE, temperature); + return this; + } + + /** + * @return {Temperature} + */ + getDesiredTemperature () { + return this.getObject(Temperature, ClimateControlData.KEY_DESIRED_TEMPERATURE); + } + + /** + * @param {Boolean} enable + * @return {ClimateControlData} + */ + setAcEnable (enable) { + this.setParameter(ClimateControlData.KEY_AC_ENABLE, enable); + return this; + } + + /** + * @return {Boolean} + */ + getAcEnable () { + return this.getParameter(ClimateControlData.KEY_AC_ENABLE); + } + + /** + * @param {Boolean} enable + * @return {ClimateControlData} + */ + setCirculateAirEnable (enable) { + this.setParameter(ClimateControlData.KEY_CIRCULATE_AIR_ENABLE, enable); + return this; + } + + /** + * @return {Boolean} + */ + getCirculateAirEnable () { + return this.getParameter(ClimateControlData.KEY_CIRCULATE_AIR_ENABLE); + } + + /** + * @param {Boolean} enable + * @return {ClimateControlData} + */ + setAutoModeEnable (enable) { + this.setParameter(ClimateControlData.KEY_AUTO_MODE_ENABLE, enable); + return this; + } + + /** + * @return {Boolean} + */ + getAutoModeEnable () { + return this.getParameter(ClimateControlData.KEY_AUTO_MODE_ENABLE); + } + + /** + * @param {DefrostZone} zone + * @return {ClimateControlData} + */ + setDefrostZone (zone) { + this.validateType(DefrostZone, zone); + this.setParameter(ClimateControlData.KEY_DEFROST_ZONE, zone); + return this; + } + + /** + * @return {DefrostZone} + */ + getDefrostZone () { + return this.getObject(DefrostZone, ClimateControlData.KEY_DEFROST_ZONE); + } + + /** + * @param {Boolean} enable + * @return {ClimateControlData} + */ + setDualModeEnable (enable) { + this.setParameter(ClimateControlData.KEY_DUAL_MODE_ENABLE, enable); + return this; + } + + /** + * @return {Boolean} + */ + getDualModeEnable () { + return this.getParameter(ClimateControlData.KEY_DUAL_MODE_ENABLE); + } + + /** + * @param {Boolean} enable + * @return {ClimateControlData} + */ + setAcMaxEnable (enable) { + this.setParameter(ClimateControlData.KEY_AC_MAX_ENABLE, enable); + return this; + } + + /** + * @return {Boolean} + */ + getAcMaxEnable () { + return this.getParameter(ClimateControlData.KEY_AC_MAX_ENABLE); + } + + /** + * @param {VentilationMode} mode + * @return {ClimateControlData} + */ + setVentilationMode (mode) { + this.validateType(VentilationMode, mode); + this.setParameter(ClimateControlData.KEY_VENTILATION_MODE, mode); + return this; + } + + /** + * @return {VentilationMode} + */ + getVentilationMode () { + return this.getObject(VentilationMode, ClimateControlData.KEY_VENTILATION_MODE); + } + + /** + * @param {Boolean} enable - value false means disabled/turn off, value true means enabled/turn on. + * @return {ClimateControlData} + */ + setHeatedSteeringWheelEnable (enable) { + this.setParameter(ClimateControlData.KEY_HEATED_STEERING_WHEEL_ENABLE, enable); + return this; + } + + /** + * @return {Boolean} + */ + getHeatedSteeringWheelEnable () { + return this.getParameter(ClimateControlData.KEY_HEATED_STEERING_WHEEL_ENABLE); + } + + /** + * @param {Boolean} enable - value false means disabled, value true means enabled. + * @return {ClimateControlData} + */ + setHeatedWindshieldEnable (enable) { + this.setParameter(ClimateControlData.KEY_HEATED_WINDSHIELD_ENABLE, enable); + return this; + } + + /** + * @return {Boolean} + */ + getHeatedWindshieldEnable () { + return this.getParameter(ClimateControlData.KEY_HEATED_WINDSHIELD_ENABLE); + } + + /** + * @param {Boolean} enable - value false means disabled, value true means enabled. + * @return {ClimateControlData} + */ + setHeatedRearWindowEnable (enable) { + this.setParameter(ClimateControlData.KEY_HEATED_REAR_WINDOW_ENABLE, enable); + return this; + } + + /** + * @return {Boolean} + */ + getHeatedRearWindowEnable () { + return this.getParameter(ClimateControlData.KEY_HEATED_REAR_WINDOW_ENABLE); + } + + /** + * @param {Boolean} enable - value false means disabled, value true means enabled. + * @return {ClimateControlData} + */ + setHeatedMirrorsEnable (enable) { + this.setParameter(ClimateControlData.KEY_HEATED_MIRRORS_ENABLE, enable); + return this; + } + + /** + * @return {Boolean} + */ + getHeatedMirrorsEnable () { + return this.getParameter(ClimateControlData.KEY_HEATED_MIRRORS_ENABLE); + } + + /** + * @param {Boolean} enable - True if the climate module is on, false if the climate module is off + * @return {ClimateControlData} + */ + setClimateEnable (enable) { + this.setParameter(ClimateControlData.KEY_CLIMATE_ENABLE, enable); + return this; + } + + /** + * @return {Boolean} + */ + getClimateEnable () { + return this.getParameter(ClimateControlData.KEY_CLIMATE_ENABLE); + } +} + +ClimateControlData.KEY_FAN_SPEED = 'fanSpeed'; +ClimateControlData.KEY_CURRENT_TEMPERATURE = 'currentTemperature'; +ClimateControlData.KEY_DESIRED_TEMPERATURE = 'desiredTemperature'; +ClimateControlData.KEY_AC_ENABLE = 'acEnable'; +ClimateControlData.KEY_CIRCULATE_AIR_ENABLE = 'circulateAirEnable'; +ClimateControlData.KEY_AUTO_MODE_ENABLE = 'autoModeEnable'; +ClimateControlData.KEY_DEFROST_ZONE = 'defrostZone'; +ClimateControlData.KEY_DUAL_MODE_ENABLE = 'dualModeEnable'; +ClimateControlData.KEY_AC_MAX_ENABLE = 'acMaxEnable'; +ClimateControlData.KEY_VENTILATION_MODE = 'ventilationMode'; +ClimateControlData.KEY_HEATED_STEERING_WHEEL_ENABLE = 'heatedSteeringWheelEnable'; +ClimateControlData.KEY_HEATED_WINDSHIELD_ENABLE = 'heatedWindshieldEnable'; +ClimateControlData.KEY_HEATED_REAR_WINDOW_ENABLE = 'heatedRearWindowEnable'; +ClimateControlData.KEY_HEATED_MIRRORS_ENABLE = 'heatedMirrorsEnable'; +ClimateControlData.KEY_CLIMATE_ENABLE = 'climateEnable'; + +export { ClimateControlData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/CloudAppProperties.js b/lib/js/src/rpc/structs/CloudAppProperties.js new file mode 100644 index 00000000..f093b37d --- /dev/null +++ b/lib/js/src/rpc/structs/CloudAppProperties.js @@ -0,0 +1,170 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { HybridAppPreference } from '../enums/HybridAppPreference.js'; + +class CloudAppProperties extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String[]} nicknames - An array of app names a cloud app is allowed to register with. If included in a + * SetCloudAppProperties request, this value will overwrite the existing "nicknames" + * field in the app policies section of the policy table. + * @return {CloudAppProperties} + */ + setNicknames (nicknames) { + this.setParameter(CloudAppProperties.KEY_NICKNAMES, nicknames); + return this; + } + + /** + * @return {String[]} + */ + getNicknames () { + return this.getParameter(CloudAppProperties.KEY_NICKNAMES); + } + + /** + * @param {String} id + * @return {CloudAppProperties} + */ + setAppID (id) { + this.setParameter(CloudAppProperties.KEY_APP_ID, id); + return this; + } + + /** + * @return {String} + */ + getAppID () { + return this.getParameter(CloudAppProperties.KEY_APP_ID); + } + + /** + * @param {Boolean} enabled - If true, cloud app will be included in HMI RPC UpdateAppList + * @return {CloudAppProperties} + */ + setEnabled (enabled) { + this.setParameter(CloudAppProperties.KEY_ENABLED, enabled); + return this; + } + + /** + * @return {Boolean} + */ + getEnabled () { + return this.getParameter(CloudAppProperties.KEY_ENABLED); + } + + /** + * @param {String} token - Used to authenticate websocket connection on app activation + * @return {CloudAppProperties} + */ + setAuthToken (token) { + this.setParameter(CloudAppProperties.KEY_AUTH_TOKEN, token); + return this; + } + + /** + * @return {String} + */ + getAuthToken () { + return this.getParameter(CloudAppProperties.KEY_AUTH_TOKEN); + } + + /** + * @param {String} type - Specifies the connection type Core should use + * @return {CloudAppProperties} + */ + setCloudTransportType (type) { + this.setParameter(CloudAppProperties.KEY_CLOUD_TRANSPORT_TYPE, type); + return this; + } + + /** + * @return {String} + */ + getCloudTransportType () { + return this.getParameter(CloudAppProperties.KEY_CLOUD_TRANSPORT_TYPE); + } + + /** + * @param {HybridAppPreference} preference - Specifies the user preference to use the cloud app version or mobile + * app version when both are available + * @return {CloudAppProperties} + */ + setHybridAppPreference (preference) { + this.validateType(HybridAppPreference, preference); + this.setParameter(CloudAppProperties.KEY_HYBRID_APP_PREFERENCE, preference); + return this; + } + + /** + * @return {HybridAppPreference} + */ + getHybridAppPreference () { + return this.getObject(HybridAppPreference, CloudAppProperties.KEY_HYBRID_APP_PREFERENCE); + } + + /** + * @param {String} endpoint - Specifies the endpoint which Core will attempt to connect to when this app is selected + * @return {CloudAppProperties} + */ + setEndpoint (endpoint) { + this.setParameter(CloudAppProperties.KEY_ENDPOINT, endpoint); + return this; + } + + /** + * @return {String} + */ + getEndpoint () { + return this.getParameter(CloudAppProperties.KEY_ENDPOINT); + } +} + +CloudAppProperties.KEY_NICKNAMES = 'nicknames'; +CloudAppProperties.KEY_APP_ID = 'appID'; +CloudAppProperties.KEY_ENABLED = 'enabled'; +CloudAppProperties.KEY_AUTH_TOKEN = 'authToken'; +CloudAppProperties.KEY_CLOUD_TRANSPORT_TYPE = 'cloudTransportType'; +CloudAppProperties.KEY_HYBRID_APP_PREFERENCE = 'hybridAppPreference'; +CloudAppProperties.KEY_ENDPOINT = 'endpoint'; + +export { CloudAppProperties }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/ClusterModeStatus.js b/lib/js/src/rpc/structs/ClusterModeStatus.js new file mode 100644 index 00000000..028ea633 --- /dev/null +++ b/lib/js/src/rpc/structs/ClusterModeStatus.js @@ -0,0 +1,120 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { PowerModeStatus } from '../enums/PowerModeStatus.js'; +import { CarModeStatus } from '../enums/CarModeStatus.js'; +import { PowerModeQualificationStatus } from '../enums/PowerModeQualificationStatus.js'; + +class ClusterModeStatus extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Boolean} active - References signal "PowerMode_UB". + * @return {ClusterModeStatus} + */ + setPowerModeActive (active) { + this.setParameter(ClusterModeStatus.KEY_POWER_MODE_ACTIVE, active); + return this; + } + + /** + * @return {Boolean} + */ + getPowerModeActive () { + return this.getParameter(ClusterModeStatus.KEY_POWER_MODE_ACTIVE); + } + + /** + * @param {PowerModeQualificationStatus} status - References signal "PowerModeQF". See PowerModeQualificationStatus. + * @return {ClusterModeStatus} + */ + setPowerModeQualificationStatus (status) { + this.validateType(PowerModeQualificationStatus, status); + this.setParameter(ClusterModeStatus.KEY_POWER_MODE_QUALIFICATION_STATUS, status); + return this; + } + + /** + * @return {PowerModeQualificationStatus} + */ + getPowerModeQualificationStatus () { + return this.getObject(PowerModeQualificationStatus, ClusterModeStatus.KEY_POWER_MODE_QUALIFICATION_STATUS); + } + + /** + * @param {CarModeStatus} status - References signal "CarMode". See CarMode. + * @return {ClusterModeStatus} + */ + setCarModeStatus (status) { + this.validateType(CarModeStatus, status); + this.setParameter(ClusterModeStatus.KEY_CAR_MODE_STATUS, status); + return this; + } + + /** + * @return {CarModeStatus} + */ + getCarModeStatus () { + return this.getObject(CarModeStatus, ClusterModeStatus.KEY_CAR_MODE_STATUS); + } + + /** + * @param {PowerModeStatus} status - References signal "PowerMode". See PowerMode. + * @return {ClusterModeStatus} + */ + setPowerModeStatus (status) { + this.validateType(PowerModeStatus, status); + this.setParameter(ClusterModeStatus.KEY_POWER_MODE_STATUS, status); + return this; + } + + /** + * @return {PowerModeStatus} + */ + getPowerModeStatus () { + return this.getObject(PowerModeStatus, ClusterModeStatus.KEY_POWER_MODE_STATUS); + } +} + +ClusterModeStatus.KEY_POWER_MODE_ACTIVE = 'powerModeActive'; +ClusterModeStatus.KEY_POWER_MODE_QUALIFICATION_STATUS = 'powerModeQualificationStatus'; +ClusterModeStatus.KEY_CAR_MODE_STATUS = 'carModeStatus'; +ClusterModeStatus.KEY_POWER_MODE_STATUS = 'powerModeStatus'; + +export { ClusterModeStatus }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/Coordinate.js b/lib/js/src/rpc/structs/Coordinate.js new file mode 100644 index 00000000..4c80f5ba --- /dev/null +++ b/lib/js/src/rpc/structs/Coordinate.js @@ -0,0 +1,80 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; + +class Coordinate extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} degrees - Latitude of the location. + * @return {Coordinate} + */ + setLatitudeDegrees (degrees) { + this.setParameter(Coordinate.KEY_LATITUDE_DEGREES, degrees); + return this; + } + + /** + * @return {Number} + */ + getLatitudeDegrees () { + return this.getParameter(Coordinate.KEY_LATITUDE_DEGREES); + } + + /** + * @param {Number} degrees - Longitude of the location. + * @return {Coordinate} + */ + setLongitudeDegrees (degrees) { + this.setParameter(Coordinate.KEY_LONGITUDE_DEGREES, degrees); + return this; + } + + /** + * @return {Number} + */ + getLongitudeDegrees () { + return this.getParameter(Coordinate.KEY_LONGITUDE_DEGREES); + } +} + +Coordinate.KEY_LATITUDE_DEGREES = 'latitudeDegrees'; +Coordinate.KEY_LONGITUDE_DEGREES = 'longitudeDegrees'; + +export { Coordinate }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/DIDResult.js b/lib/js/src/rpc/structs/DIDResult.js new file mode 100644 index 00000000..a1f666f1 --- /dev/null +++ b/lib/js/src/rpc/structs/DIDResult.js @@ -0,0 +1,102 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { VehicleDataResultCode } from '../enums/VehicleDataResultCode.js'; + +/** + * Individual requested DID result and data + */ +class DIDResult extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {VehicleDataResultCode} code - Individual DID result code. + * @return {DIDResult} + */ + setResultCode (code) { + this.validateType(VehicleDataResultCode, code); + this.setParameter(DIDResult.KEY_RESULT_CODE, code); + return this; + } + + /** + * @return {VehicleDataResultCode} + */ + getResultCode () { + return this.getObject(VehicleDataResultCode, DIDResult.KEY_RESULT_CODE); + } + + /** + * @param {Number} location - Location of raw data from vehicle data DID + * @return {DIDResult} + */ + setDidLocation (location) { + this.setParameter(DIDResult.KEY_DID_LOCATION, location); + return this; + } + + /** + * @return {Number} + */ + getDidLocation () { + return this.getParameter(DIDResult.KEY_DID_LOCATION); + } + + /** + * @param {String} data - Raw DID-based data returned for requested element. + * @return {DIDResult} + */ + setData (data) { + this.setParameter(DIDResult.KEY_DATA, data); + return this; + } + + /** + * @return {String} + */ + getData () { + return this.getParameter(DIDResult.KEY_DATA); + } +} + +DIDResult.KEY_RESULT_CODE = 'resultCode'; +DIDResult.KEY_DID_LOCATION = 'didLocation'; +DIDResult.KEY_DATA = 'data'; + +export { DIDResult }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/DateTime.js b/lib/js/src/rpc/structs/DateTime.js new file mode 100644 index 00000000..3bee1b6d --- /dev/null +++ b/lib/js/src/rpc/structs/DateTime.js @@ -0,0 +1,199 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; + +class DateTime extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} millisecond - Milliseconds + * @return {DateTime} + */ + setMillisecond (millisecond) { + this.setParameter(DateTime.KEY_MILLISECOND, millisecond); + return this; + } + + /** + * @return {Number} + */ + getMillisecond () { + return this.getParameter(DateTime.KEY_MILLISECOND); + } + + /** + * @param {Number} second - Seconds part of time + * @return {DateTime} + */ + setSecond (second) { + this.setParameter(DateTime.KEY_SECOND, second); + return this; + } + + /** + * @return {Number} + */ + getSecond () { + return this.getParameter(DateTime.KEY_SECOND); + } + + /** + * @param {Number} minute - Minutes part of time + * @return {DateTime} + */ + setMinute (minute) { + this.setParameter(DateTime.KEY_MINUTE, minute); + return this; + } + + /** + * @return {Number} + */ + getMinute () { + return this.getParameter(DateTime.KEY_MINUTE); + } + + /** + * @param {Number} hour - Hours part of time. Note that this structure accepts time only in 24 Hr format + * @return {DateTime} + */ + setHour (hour) { + this.setParameter(DateTime.KEY_HOUR, hour); + return this; + } + + /** + * @return {Number} + */ + getHour () { + return this.getParameter(DateTime.KEY_HOUR); + } + + /** + * @param {Number} day - Day of the month + * @return {DateTime} + */ + setDay (day) { + this.setParameter(DateTime.KEY_DAY, day); + return this; + } + + /** + * @return {Number} + */ + getDay () { + return this.getParameter(DateTime.KEY_DAY); + } + + /** + * @param {Number} month - Month of the year + * @return {DateTime} + */ + setMonth (month) { + this.setParameter(DateTime.KEY_MONTH, month); + return this; + } + + /** + * @return {Number} + */ + getMonth () { + return this.getParameter(DateTime.KEY_MONTH); + } + + /** + * @param {Number} year - The year in YYYY format + * @return {DateTime} + */ + setYear (year) { + this.setParameter(DateTime.KEY_YEAR, year); + return this; + } + + /** + * @return {Number} + */ + getYear () { + return this.getParameter(DateTime.KEY_YEAR); + } + + /** + * @param {Number} tz_hour - Time zone offset in Hours wrt UTC. + * @return {DateTime} + */ + setTz_hour (tz_hour) { + this.setParameter(DateTime.KEY_TZ_HOUR, tz_hour); + return this; + } + + /** + * @return {Number} + */ + getTz_hour () { + return this.getParameter(DateTime.KEY_TZ_HOUR); + } + + /** + * @param {Number} tz_minute - Time zone offset in Min wrt UTC. + * @return {DateTime} + */ + setTz_minute (tz_minute) { + this.setParameter(DateTime.KEY_TZ_MINUTE, tz_minute); + return this; + } + + /** + * @return {Number} + */ + getTz_minute () { + return this.getParameter(DateTime.KEY_TZ_MINUTE); + } +} + +DateTime.KEY_MILLISECOND = 'millisecond'; +DateTime.KEY_SECOND = 'second'; +DateTime.KEY_MINUTE = 'minute'; +DateTime.KEY_HOUR = 'hour'; +DateTime.KEY_DAY = 'day'; +DateTime.KEY_MONTH = 'month'; +DateTime.KEY_YEAR = 'year'; +DateTime.KEY_TZ_HOUR = 'tz_hour'; +DateTime.KEY_TZ_MINUTE = 'tz_minute'; + +export { DateTime }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/DeviceInfo.js b/lib/js/src/rpc/structs/DeviceInfo.js index 30158137..4f9b1a4e 100644 --- a/lib/js/src/rpc/structs/DeviceInfo.js +++ b/lib/js/src/rpc/structs/DeviceInfo.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -32,119 +33,109 @@ import { RpcStruct } from '../RpcStruct.js'; +/** + * Various information about connecting device. + */ class DeviceInfo extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {String} hardware - * @return {DeviceInfo} - */ + * @param {String} hardware - Device model + * @return {DeviceInfo} + */ setHardware (hardware) { - this.validateType(String, hardware); - this.setParameter(DeviceInfo.KEY_HARDWARE, hardware); return this; } /** - * @return {String} - */ + * @return {String} + */ getHardware () { return this.getParameter(DeviceInfo.KEY_HARDWARE); } - /** - * @param {String} firmwareRev - * @return {DeviceInfo} - */ - setFirmwareRev (firmwareRev) { - this.validateType(String, firmwareRev); - - this.setParameter(DeviceInfo.KEY_FIRMWARE_REV, firmwareRev); + * @param {String} rev - Device firmware revision + * @return {DeviceInfo} + */ + setFirmwareRev (rev) { + this.setParameter(DeviceInfo.KEY_FIRMWARE_REV, rev); return this; } /** - * @return {String} - */ + * @return {String} + */ getFirmwareRev () { return this.getParameter(DeviceInfo.KEY_FIRMWARE_REV); } - /** - * @param {String} os - * @return {DeviceInfo} - */ + * @param {String} os - Device OS + * @return {DeviceInfo} + */ setOs (os) { - this.validateType(String, os); - this.setParameter(DeviceInfo.KEY_OS, os); return this; } /** - * @return {String} - */ + * @return {String} + */ getOs () { return this.getParameter(DeviceInfo.KEY_OS); } /** - * @param {String} osVersion - * @return {DeviceInfo} - */ - setOsVersion (osVersion) { - this.validateType(String, osVersion); - - this.setParameter(DeviceInfo.KEY_OS_VERSION, osVersion); + * @param {String} version - Device OS version + * @return {DeviceInfo} + */ + setOsVersion (version) { + this.setParameter(DeviceInfo.KEY_OS_VERSION, version); return this; } /** - * @return {String} - */ + * @return {String} + */ getOsVersion () { return this.getParameter(DeviceInfo.KEY_OS_VERSION); } - /** - * @param {String} carrier - * @return {DeviceInfo} - */ + * @param {String} carrier - Device mobile carrier (if applicable) + * @return {DeviceInfo} + */ setCarrier (carrier) { - this.validateType(String, carrier); - this.setParameter(DeviceInfo.KEY_CARRIER, carrier); return this; } /** - * @return {String} - */ + * @return {String} + */ getCarrier () { return this.getParameter(DeviceInfo.KEY_CARRIER); } - /** - * @param {Number} maxNumberRFCOMMPorts - * @return {DeviceInfo} - */ - setMaxNumberRFCOMMPorts (maxNumberRFCOMMPorts) { - this.validateType(Number, maxNumberRFCOMMPorts); - - this.setParameter(DeviceInfo.KEY_MAX_NUMBER_RFCOMM_PORTS, maxNumberRFCOMMPorts); + * @param {Number} ports - Omitted if connected not via BT. + * @return {DeviceInfo} + */ + setMaxNumberRFCOMMPorts (ports) { + this.setParameter(DeviceInfo.KEY_MAX_NUMBER_RFCOMM_PORTS, ports); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getMaxNumberRFCOMMPorts () { return this.getParameter(DeviceInfo.KEY_MAX_NUMBER_RFCOMM_PORTS); } @@ -157,4 +148,4 @@ DeviceInfo.KEY_OS_VERSION = 'osVersion'; DeviceInfo.KEY_CARRIER = 'carrier'; DeviceInfo.KEY_MAX_NUMBER_RFCOMM_PORTS = 'maxNumberRFCOMMPorts'; -export { DeviceInfo }; +export { DeviceInfo }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/DeviceStatus.js b/lib/js/src/rpc/structs/DeviceStatus.js new file mode 100644 index 00000000..beb16575 --- /dev/null +++ b/lib/js/src/rpc/structs/DeviceStatus.js @@ -0,0 +1,240 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { PrimaryAudioSource } from '../enums/PrimaryAudioSource.js'; +import { DeviceLevelStatus } from '../enums/DeviceLevelStatus.js'; + +class DeviceStatus extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Boolean} on - References signal "CPM_VoiceRec_STAT". + * @return {DeviceStatus} + */ + setVoiceRecOn (on) { + this.setParameter(DeviceStatus.KEY_VOICE_REC_ON, on); + return this; + } + + /** + * @return {Boolean} + */ + getVoiceRecOn () { + return this.getParameter(DeviceStatus.KEY_VOICE_REC_ON); + } + + /** + * @param {Boolean} on - References signal "BT_ICON". + * @return {DeviceStatus} + */ + setBtIconOn (on) { + this.setParameter(DeviceStatus.KEY_BT_ICON_ON, on); + return this; + } + + /** + * @return {Boolean} + */ + getBtIconOn () { + return this.getParameter(DeviceStatus.KEY_BT_ICON_ON); + } + + /** + * @param {Boolean} active - References signal "CPM_Call_Active_STAT". + * @return {DeviceStatus} + */ + setCallActive (active) { + this.setParameter(DeviceStatus.KEY_CALL_ACTIVE, active); + return this; + } + + /** + * @return {Boolean} + */ + getCallActive () { + return this.getParameter(DeviceStatus.KEY_CALL_ACTIVE); + } + + /** + * @param {Boolean} roaming - References signal "CPM_Phone_Roaming_STAT". + * @return {DeviceStatus} + */ + setPhoneRoaming (roaming) { + this.setParameter(DeviceStatus.KEY_PHONE_ROAMING, roaming); + return this; + } + + /** + * @return {Boolean} + */ + getPhoneRoaming () { + return this.getParameter(DeviceStatus.KEY_PHONE_ROAMING); + } + + /** + * @param {Boolean} available - References signal "CPM_TextMsg_AVAL". + * @return {DeviceStatus} + */ + setTextMsgAvailable (available) { + this.setParameter(DeviceStatus.KEY_TEXT_MSG_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getTextMsgAvailable () { + return this.getParameter(DeviceStatus.KEY_TEXT_MSG_AVAILABLE); + } + + /** + * @param {DeviceLevelStatus} status - Device battery level status. References signal "CPM_Batt_Level_STAT". See + * DeviceLevelStatus. + * @return {DeviceStatus} + */ + setBattLevelStatus (status) { + this.validateType(DeviceLevelStatus, status); + this.setParameter(DeviceStatus.KEY_BATT_LEVEL_STATUS, status); + return this; + } + + /** + * @return {DeviceLevelStatus} + */ + getBattLevelStatus () { + return this.getObject(DeviceLevelStatus, DeviceStatus.KEY_BATT_LEVEL_STATUS); + } + + /** + * @param {Boolean} muted - References signal "CPM_Stereo_Audio_Output". + * @return {DeviceStatus} + */ + setStereoAudioOutputMuted (muted) { + this.setParameter(DeviceStatus.KEY_STEREO_AUDIO_OUTPUT_MUTED, muted); + return this; + } + + /** + * @return {Boolean} + */ + getStereoAudioOutputMuted () { + return this.getParameter(DeviceStatus.KEY_STEREO_AUDIO_OUTPUT_MUTED); + } + + /** + * @param {Boolean} muted - References signal "CPM_Mono_Audio_Output". + * @return {DeviceStatus} + */ + setMonoAudioOutputMuted (muted) { + this.setParameter(DeviceStatus.KEY_MONO_AUDIO_OUTPUT_MUTED, muted); + return this; + } + + /** + * @return {Boolean} + */ + getMonoAudioOutputMuted () { + return this.getParameter(DeviceStatus.KEY_MONO_AUDIO_OUTPUT_MUTED); + } + + /** + * @param {DeviceLevelStatus} status - Device signal level status. References signal "CPM_Signal_Strength_STAT". See + * DeviceLevelStatus. + * @return {DeviceStatus} + */ + setSignalLevelStatus (status) { + this.validateType(DeviceLevelStatus, status); + this.setParameter(DeviceStatus.KEY_SIGNAL_LEVEL_STATUS, status); + return this; + } + + /** + * @return {DeviceLevelStatus} + */ + getSignalLevelStatus () { + return this.getObject(DeviceLevelStatus, DeviceStatus.KEY_SIGNAL_LEVEL_STATUS); + } + + /** + * @param {PrimaryAudioSource} source - References signal "CPM_Stereo_PAS_Source". See PrimaryAudioSource. + * @return {DeviceStatus} + */ + setPrimaryAudioSource (source) { + this.validateType(PrimaryAudioSource, source); + this.setParameter(DeviceStatus.KEY_PRIMARY_AUDIO_SOURCE, source); + return this; + } + + /** + * @return {PrimaryAudioSource} + */ + getPrimaryAudioSource () { + return this.getObject(PrimaryAudioSource, DeviceStatus.KEY_PRIMARY_AUDIO_SOURCE); + } + + /** + * @param {Boolean} active - References signal "eCall_Event". + * @return {DeviceStatus} + */ + setECallEventActive (active) { + this.setParameter(DeviceStatus.KEY_E_CALL_EVENT_ACTIVE, active); + return this; + } + + /** + * @return {Boolean} + */ + getECallEventActive () { + return this.getParameter(DeviceStatus.KEY_E_CALL_EVENT_ACTIVE); + } +} + +DeviceStatus.KEY_VOICE_REC_ON = 'voiceRecOn'; +DeviceStatus.KEY_BT_ICON_ON = 'btIconOn'; +DeviceStatus.KEY_CALL_ACTIVE = 'callActive'; +DeviceStatus.KEY_PHONE_ROAMING = 'phoneRoaming'; +DeviceStatus.KEY_TEXT_MSG_AVAILABLE = 'textMsgAvailable'; +DeviceStatus.KEY_BATT_LEVEL_STATUS = 'battLevelStatus'; +DeviceStatus.KEY_STEREO_AUDIO_OUTPUT_MUTED = 'stereoAudioOutputMuted'; +DeviceStatus.KEY_MONO_AUDIO_OUTPUT_MUTED = 'monoAudioOutputMuted'; +DeviceStatus.KEY_SIGNAL_LEVEL_STATUS = 'signalLevelStatus'; +DeviceStatus.KEY_PRIMARY_AUDIO_SOURCE = 'primaryAudioSource'; +DeviceStatus.KEY_E_CALL_EVENT_ACTIVE = 'eCallEventActive'; + +export { DeviceStatus }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/DisplayCapabilities.js b/lib/js/src/rpc/structs/DisplayCapabilities.js index 834fb3c2..a7c2cc77 100644 --- a/lib/js/src/rpc/structs/DisplayCapabilities.js +++ b/lib/js/src/rpc/structs/DisplayCapabilities.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -30,179 +31,192 @@ * POSSIBILITY OF SUCH DAMAGE. */ -import { RpcStruct } from '../RpcStruct.js'; -import { TextField } from './TextField.js'; -import { ImageField } from './ImageField.js'; +import { MediaClockFormat } from '../enums/MediaClockFormat.js'; import { ScreenParams } from './ScreenParams.js'; +import { ImageField } from './ImageField.js'; +import { RpcStruct } from '../RpcStruct.js'; import { DisplayType } from '../enums/DisplayType.js'; -import { MediaClockFormat } from '../enums/MediaClockFormat.js'; +import { TextField } from './TextField.js'; +/** + * Contains information about the display capabilities. This struct is deprecated; please see the new SystemCapability + * DISPLAYS and corresponding struct DisplayCapability + * @deprecated + */ class DisplayCapabilities extends RpcStruct { + /** + * @deprecated + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {DisplayType} displayType - * @return {DisplayCapabilities} - */ - setDisplayType (displayType) { - this.validateType(DisplayType, displayType); - - this.setParameter(DisplayCapabilities.KEY_DISPLAY_TYPE, displayType); + * @deprecated + * @param {DisplayType} type - The type of the display. See DisplayType + * @return {DisplayCapabilities} + */ + setDisplayType (type) { + this.validateType(DisplayType, type); + this.setParameter(DisplayCapabilities.KEY_DISPLAY_TYPE, type); return this; } /** - * @return {DisplayType} - */ + * @deprecated + * @return {DisplayType} + */ getDisplayType () { return this.getObject(DisplayType, DisplayCapabilities.KEY_DISPLAY_TYPE); } - /** - * @param {String} displayName - * @return {DisplayCapabilities} - */ - setDisplayName (displayName) { - this.setParameter(DisplayCapabilities.KEY_DISPLAY_NAME, displayName); + * @deprecated + * @param {String} name - The name of the display the app is connected to. + * @return {DisplayCapabilities} + */ + setDisplayName (name) { + this.setParameter(DisplayCapabilities.KEY_DISPLAY_NAME, name); return this; } /** - * @return {String} - */ + * @deprecated + * @return {String} + */ getDisplayName () { return this.getParameter(DisplayCapabilities.KEY_DISPLAY_NAME); } /** - * @param {Array} textFields - * @return {DisplayCapabilities} - */ - setTextFields (textFields) { - // TODO make work with arrays - // this.validateType(TextField, textFields); - - this.setParameter(DisplayCapabilities.KEY_TEXT_FIELDS, textFields); + * @deprecated + * @param {TextField[]} fields - A set of all fields that support text data. See TextField + * @return {DisplayCapabilities} + */ + setTextFields (fields) { + this.validateType(TextField, fields, true); + this.setParameter(DisplayCapabilities.KEY_TEXT_FIELDS, fields); return this; } /** - * @return {Array} - */ + * @deprecated + * @return {TextField[]} + */ getTextFields () { return this.getObject(TextField, DisplayCapabilities.KEY_TEXT_FIELDS); } - /** - * @param {Array} imageFields - * @return {DisplayCapabilities} - */ - setImageFields (imageFields) { - // TODO make work with arrays - // this.validateType(ImageField, imageFields); - - this.setParameter(DisplayCapabilities.KEY_IMAGE_FIELDS, imageFields); + * @deprecated + * @param {ImageField[]} fields - A set of all fields that support images. See ImageField + * @return {DisplayCapabilities} + */ + setImageFields (fields) { + this.validateType(ImageField, fields, true); + this.setParameter(DisplayCapabilities.KEY_IMAGE_FIELDS, fields); return this; } /** - * @return {Array} - */ + * @deprecated + * @return {ImageField[]} + */ getImageFields () { return this.getObject(ImageField, DisplayCapabilities.KEY_IMAGE_FIELDS); } /** - * @param {Array} mediaClockFormats - * @return {DisplayCapabilities} - */ - setMediaClockFormats (mediaClockFormats) { - // TODO make work with arrays - // this.validateType(ImageField, mediaClockFormats); - - this.setParameter(DisplayCapabilities.KEY_MEDIA_CLOCK_FORMATS, mediaClockFormats); + * @deprecated + * @param {MediaClockFormat[]} formats - A set of all supported formats of the media clock. See MediaClockFormat + * @return {DisplayCapabilities} + */ + setMediaClockFormats (formats) { + this.validateType(MediaClockFormat, formats, true); + this.setParameter(DisplayCapabilities.KEY_MEDIA_CLOCK_FORMATS, formats); return this; } /** - * @return {Array} - */ + * @deprecated + * @return {MediaClockFormat[]} + */ getMediaClockFormats () { return this.getObject(MediaClockFormat, DisplayCapabilities.KEY_MEDIA_CLOCK_FORMATS); } - /** - * @param {Boolean} graphicSupported - * @return {DisplayCapabilities} - */ - setGraphicsSupported (graphicSupported) { - this.setParameter(DisplayCapabilities.KEY_GRAPHICS_SUPPORTED, graphicSupported); + * @deprecated + * @param {Boolean} supported - The display's persistent screen supports referencing a static or dynamic image. + * @return {DisplayCapabilities} + */ + setGraphicSupported (supported) { + this.setParameter(DisplayCapabilities.KEY_GRAPHIC_SUPPORTED, supported); return this; } /** - * @return {Boolean} - */ - getGraphicsSupported () { - return this.getParameter(DisplayCapabilities.KEY_GRAPHICS_SUPPORTED); + * @deprecated + * @return {Boolean} + */ + getGraphicSupported () { + return this.getParameter(DisplayCapabilities.KEY_GRAPHIC_SUPPORTED); } /** - * @param {Array} templatesAvailable - * @return {DisplayCapabilities} - */ - setTemplatesAvailable (templatesAvailable) { - // TODO make work with arrays - // this.validateType(String, templatesAvailable); - - this.setParameter(DisplayCapabilities.KEY_TEMPLATES_AVAILABLE, templatesAvailable); + * @deprecated + * @param {String[]} available - A set of all predefined persistent display templates available on headunit. To be + * referenced in SetDisplayLayout. + * @return {DisplayCapabilities} + */ + setTemplatesAvailable (available) { + this.setParameter(DisplayCapabilities.KEY_TEMPLATES_AVAILABLE, available); return this; } /** - * @return {Array} - */ + * @deprecated + * @return {String[]} + */ getTemplatesAvailable () { return this.getParameter(DisplayCapabilities.KEY_TEMPLATES_AVAILABLE); } /** - * @param {ScreenParams} screenParams - * @return {DisplayCapabilities} - */ - setScreenParams (screenParams) { - this.validateType(ScreenParams, screenParams); - - this.setParameter(DisplayCapabilities.KEY_SCREEN_PARAMS, screenParams); + * @deprecated + * @param {ScreenParams} params - A set of all parameters related to a prescribed screen area (e.g. for video / + * touch input). + * @return {DisplayCapabilities} + */ + setScreenParams (params) { + this.validateType(ScreenParams, params); + this.setParameter(DisplayCapabilities.KEY_SCREEN_PARAMS, params); return this; } /** - * @return {ScreenParams} - */ + * @deprecated + * @return {ScreenParams} + */ getScreenParams () { return this.getObject(ScreenParams, DisplayCapabilities.KEY_SCREEN_PARAMS); } - /** - * @param {Array} numCustomPresetsAvailable - * @return {DisplayCapabilities} - */ - setNumCustomPresetsAvailable (numCustomPresetsAvailable) { - // TODO make work with arrays - // this.validateType(Number, numCustomPresetsAvailable); - this.setParameter(DisplayCapabilities.KEY_NUM_CUSTOM_PRESETS_AVAILABLE, numCustomPresetsAvailable); + /** + * @deprecated + * @param {Number} available - The number of on-screen custom presets available (if any); otherwise omitted. + * @return {DisplayCapabilities} + */ + setNumCustomPresetsAvailable (available) { + this.setParameter(DisplayCapabilities.KEY_NUM_CUSTOM_PRESETS_AVAILABLE, available); return this; } /** - * @return {Array} - */ + * @deprecated + * @return {Number} + */ getNumCustomPresetsAvailable () { return this.getParameter(DisplayCapabilities.KEY_NUM_CUSTOM_PRESETS_AVAILABLE); } @@ -213,9 +227,9 @@ DisplayCapabilities.KEY_DISPLAY_NAME = 'displayName'; DisplayCapabilities.KEY_TEXT_FIELDS = 'textFields'; DisplayCapabilities.KEY_IMAGE_FIELDS = 'imageFields'; DisplayCapabilities.KEY_MEDIA_CLOCK_FORMATS = 'mediaClockFormats'; -DisplayCapabilities.KEY_GRAPHICS_SUPPORTED = 'graphicSupported'; +DisplayCapabilities.KEY_GRAPHIC_SUPPORTED = 'graphicSupported'; DisplayCapabilities.KEY_TEMPLATES_AVAILABLE = 'templatesAvailable'; DisplayCapabilities.KEY_SCREEN_PARAMS = 'screenParams'; DisplayCapabilities.KEY_NUM_CUSTOM_PRESETS_AVAILABLE = 'numCustomPresetsAvailable'; -export { DisplayCapabilities }; +export { DisplayCapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/DisplayCapability.js b/lib/js/src/rpc/structs/DisplayCapability.js new file mode 100644 index 00000000..256b58e4 --- /dev/null +++ b/lib/js/src/rpc/structs/DisplayCapability.js @@ -0,0 +1,111 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { WindowTypeCapabilities } from './WindowTypeCapabilities.js'; +import { WindowCapability } from './WindowCapability.js'; +import { RpcStruct } from '../RpcStruct.js'; + +class DisplayCapability extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} name + * @return {DisplayCapability} + */ + setDisplayName (name) { + this.setParameter(DisplayCapability.KEY_DISPLAY_NAME, name); + return this; + } + + /** + * @return {String} + */ + getDisplayName () { + return this.getParameter(DisplayCapability.KEY_DISPLAY_NAME); + } + + /** + * @param {WindowTypeCapabilities[]} supported - Informs the application how many windows the app is allowed to + * create per type. + * @return {DisplayCapability} + */ + setWindowTypeSupported (supported) { + this.validateType(WindowTypeCapabilities, supported, true); + this.setParameter(DisplayCapability.KEY_WINDOW_TYPE_SUPPORTED, supported); + return this; + } + + /** + * @return {WindowTypeCapabilities[]} + */ + getWindowTypeSupported () { + return this.getObject(WindowTypeCapabilities, DisplayCapability.KEY_WINDOW_TYPE_SUPPORTED); + } + + /** + * @param {WindowCapability[]} capabilities - Contains a list of capabilities of all windows related to the app. + * Once the app has registered the capabilities of all windows are + * provided. GetSystemCapability still allows requesting window + * capabilities of all windows. After registration, only windows with + * capabilities changed will be included. Following cases will cause only + * affected windows to be included: 1. App creates a new window. After + * the window is created, a system capability notification will be sent + * related only to the created window. 2. App sets a new layout to the + * window. The new layout changes window capabilties. The notification + * will reflect those changes to the single window. + * @return {DisplayCapability} + */ + setWindowCapabilities (capabilities) { + this.validateType(WindowCapability, capabilities, true); + this.setParameter(DisplayCapability.KEY_WINDOW_CAPABILITIES, capabilities); + return this; + } + + /** + * @return {WindowCapability[]} + */ + getWindowCapabilities () { + return this.getObject(WindowCapability, DisplayCapability.KEY_WINDOW_CAPABILITIES); + } +} + +DisplayCapability.KEY_DISPLAY_NAME = 'displayName'; +DisplayCapability.KEY_WINDOW_TYPE_SUPPORTED = 'windowTypeSupported'; +DisplayCapability.KEY_WINDOW_CAPABILITIES = 'windowCapabilities'; + +export { DisplayCapability }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/ECallInfo.js b/lib/js/src/rpc/structs/ECallInfo.js new file mode 100644 index 00000000..f1e0c47f --- /dev/null +++ b/lib/js/src/rpc/structs/ECallInfo.js @@ -0,0 +1,104 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { VehicleDataNotificationStatus } from '../enums/VehicleDataNotificationStatus.js'; +import { ECallConfirmationStatus } from '../enums/ECallConfirmationStatus.js'; + +class ECallInfo extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {VehicleDataNotificationStatus} status - References signal "eCallNotification_4A". See + * VehicleDataNotificationStatus. + * @return {ECallInfo} + */ + setECallNotificationStatus (status) { + this.validateType(VehicleDataNotificationStatus, status); + this.setParameter(ECallInfo.KEY_E_CALL_NOTIFICATION_STATUS, status); + return this; + } + + /** + * @return {VehicleDataNotificationStatus} + */ + getECallNotificationStatus () { + return this.getObject(VehicleDataNotificationStatus, ECallInfo.KEY_E_CALL_NOTIFICATION_STATUS); + } + + /** + * @param {VehicleDataNotificationStatus} status - References signal "eCallNotification". See + * VehicleDataNotificationStatus. + * @return {ECallInfo} + */ + setAuxECallNotificationStatus (status) { + this.validateType(VehicleDataNotificationStatus, status); + this.setParameter(ECallInfo.KEY_AUX_ECALL_NOTIFICATION_STATUS, status); + return this; + } + + /** + * @return {VehicleDataNotificationStatus} + */ + getAuxECallNotificationStatus () { + return this.getObject(VehicleDataNotificationStatus, ECallInfo.KEY_AUX_ECALL_NOTIFICATION_STATUS); + } + + /** + * @param {ECallConfirmationStatus} status - References signal "eCallConfirmation". See ECallConfirmationStatus. + * @return {ECallInfo} + */ + setECallConfirmationStatus (status) { + this.validateType(ECallConfirmationStatus, status); + this.setParameter(ECallInfo.KEY_E_CALL_CONFIRMATION_STATUS, status); + return this; + } + + /** + * @return {ECallConfirmationStatus} + */ + getECallConfirmationStatus () { + return this.getObject(ECallConfirmationStatus, ECallInfo.KEY_E_CALL_CONFIRMATION_STATUS); + } +} + +ECallInfo.KEY_E_CALL_NOTIFICATION_STATUS = 'eCallNotificationStatus'; +ECallInfo.KEY_AUX_ECALL_NOTIFICATION_STATUS = 'auxECallNotificationStatus'; +ECallInfo.KEY_E_CALL_CONFIRMATION_STATUS = 'eCallConfirmationStatus'; + +export { ECallInfo }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/EmergencyEvent.js b/lib/js/src/rpc/structs/EmergencyEvent.js new file mode 100644 index 00000000..04d28e4b --- /dev/null +++ b/lib/js/src/rpc/structs/EmergencyEvent.js @@ -0,0 +1,139 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { FuelCutoffStatus } from '../enums/FuelCutoffStatus.js'; +import { EmergencyEventType } from '../enums/EmergencyEventType.js'; +import { VehicleDataEventStatus } from '../enums/VehicleDataEventStatus.js'; + +class EmergencyEvent extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {EmergencyEventType} type - References signal "VedsEvntType_D_Ltchd". See EmergencyEventType. + * @return {EmergencyEvent} + */ + setEmergencyEventType (type) { + this.validateType(EmergencyEventType, type); + this.setParameter(EmergencyEvent.KEY_EMERGENCY_EVENT_TYPE, type); + return this; + } + + /** + * @return {EmergencyEventType} + */ + getEmergencyEventType () { + return this.getObject(EmergencyEventType, EmergencyEvent.KEY_EMERGENCY_EVENT_TYPE); + } + + /** + * @param {FuelCutoffStatus} status - References signal "RCM_FuelCutoff". See FuelCutoffStatus. + * @return {EmergencyEvent} + */ + setFuelCutoffStatus (status) { + this.validateType(FuelCutoffStatus, status); + this.setParameter(EmergencyEvent.KEY_FUEL_CUTOFF_STATUS, status); + return this; + } + + /** + * @return {FuelCutoffStatus} + */ + getFuelCutoffStatus () { + return this.getObject(FuelCutoffStatus, EmergencyEvent.KEY_FUEL_CUTOFF_STATUS); + } + + /** + * @param {VehicleDataEventStatus} event - References signal "VedsEvntRoll_D_Ltchd". See VehicleDataEventStatus. + * @return {EmergencyEvent} + */ + setRolloverEvent (event) { + this.validateType(VehicleDataEventStatus, event); + this.setParameter(EmergencyEvent.KEY_ROLLOVER_EVENT, event); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getRolloverEvent () { + return this.getObject(VehicleDataEventStatus, EmergencyEvent.KEY_ROLLOVER_EVENT); + } + + /** + * @param {Number} velocity - References signal "VedsMaxDeltaV_D_Ltchd". Change in velocity in KPH. Additional + * reserved values: 0x00 No event 0xFE Not supported 0xFF Fault + * @return {EmergencyEvent} + */ + setMaximumChangeVelocity (velocity) { + this.setParameter(EmergencyEvent.KEY_MAXIMUM_CHANGE_VELOCITY, velocity); + return this; + } + + /** + * @return {Number} + */ + getMaximumChangeVelocity () { + return this.getParameter(EmergencyEvent.KEY_MAXIMUM_CHANGE_VELOCITY); + } + + /** + * @param {VehicleDataEventStatus} events - References signal "VedsMultiEvnt_D_Ltchd". See VehicleDataEventStatus. + * @return {EmergencyEvent} + */ + setMultipleEvents (events) { + this.validateType(VehicleDataEventStatus, events); + this.setParameter(EmergencyEvent.KEY_MULTIPLE_EVENTS, events); + return this; + } + + /** + * @return {VehicleDataEventStatus} + */ + getMultipleEvents () { + return this.getObject(VehicleDataEventStatus, EmergencyEvent.KEY_MULTIPLE_EVENTS); + } +} + +EmergencyEvent.KEY_EMERGENCY_EVENT_TYPE = 'emergencyEventType'; +EmergencyEvent.KEY_FUEL_CUTOFF_STATUS = 'fuelCutoffStatus'; +EmergencyEvent.KEY_ROLLOVER_EVENT = 'rolloverEvent'; +EmergencyEvent.KEY_MAXIMUM_CHANGE_VELOCITY = 'maximumChangeVelocity'; +EmergencyEvent.KEY_MULTIPLE_EVENTS = 'multipleEvents'; + +export { EmergencyEvent }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/EqualizerSettings.js b/lib/js/src/rpc/structs/EqualizerSettings.js new file mode 100644 index 00000000..66de738b --- /dev/null +++ b/lib/js/src/rpc/structs/EqualizerSettings.js @@ -0,0 +1,100 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; + +/** + * Defines the each Equalizer channel settings. + */ +class EqualizerSettings extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} id + * @return {EqualizerSettings} + */ + setChannelId (id) { + this.setParameter(EqualizerSettings.KEY_CHANNEL_ID, id); + return this; + } + + /** + * @return {Number} + */ + getChannelId () { + return this.getParameter(EqualizerSettings.KEY_CHANNEL_ID); + } + + /** + * @param {String} name - read-only channel / frequency name (e.i. "Treble, Midrange, Bass" or "125 Hz") + * @return {EqualizerSettings} + */ + setChannelName (name) { + this.setParameter(EqualizerSettings.KEY_CHANNEL_NAME, name); + return this; + } + + /** + * @return {String} + */ + getChannelName () { + return this.getParameter(EqualizerSettings.KEY_CHANNEL_NAME); + } + + /** + * @param {Number} setting - Reflects the setting, from 0%-100%. + * @return {EqualizerSettings} + */ + setChannelSetting (setting) { + this.setParameter(EqualizerSettings.KEY_CHANNEL_SETTING, setting); + return this; + } + + /** + * @return {Number} + */ + getChannelSetting () { + return this.getParameter(EqualizerSettings.KEY_CHANNEL_SETTING); + } +} + +EqualizerSettings.KEY_CHANNEL_ID = 'channelId'; +EqualizerSettings.KEY_CHANNEL_NAME = 'channelName'; +EqualizerSettings.KEY_CHANNEL_SETTING = 'channelSetting'; + +export { EqualizerSettings }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/FuelRange.js b/lib/js/src/rpc/structs/FuelRange.js new file mode 100644 index 00000000..85be6e6d --- /dev/null +++ b/lib/js/src/rpc/structs/FuelRange.js @@ -0,0 +1,82 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { FuelType } from '../enums/FuelType.js'; + +class FuelRange extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {FuelType} type + * @return {FuelRange} + */ + setType (type) { + this.validateType(FuelType, type); + this.setParameter(FuelRange.KEY_TYPE, type); + return this; + } + + /** + * @return {FuelType} + */ + getType () { + return this.getObject(FuelType, FuelRange.KEY_TYPE); + } + + /** + * @param {Number} range - The estimate range in KM the vehicle can travel based on fuel level and consumption. + * @return {FuelRange} + */ + setRange (range) { + this.setParameter(FuelRange.KEY_RANGE, range); + return this; + } + + /** + * @return {Number} + */ + getRange () { + return this.getParameter(FuelRange.KEY_RANGE); + } +} + +FuelRange.KEY_TYPE = 'type'; +FuelRange.KEY_RANGE = 'range'; + +export { FuelRange }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/GPSData.js b/lib/js/src/rpc/structs/GPSData.js new file mode 100644 index 00000000..36323c69 --- /dev/null +++ b/lib/js/src/rpc/structs/GPSData.js @@ -0,0 +1,378 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { CompassDirection } from '../enums/CompassDirection.js'; +import { Dimension } from '../enums/Dimension.js'; + +/** + * Struct with the GPS data. + */ +class GPSData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} degrees + * @return {GPSData} + */ + setLongitudeDegrees (degrees) { + this.setParameter(GPSData.KEY_LONGITUDE_DEGREES, degrees); + return this; + } + + /** + * @return {Number} + */ + getLongitudeDegrees () { + return this.getParameter(GPSData.KEY_LONGITUDE_DEGREES); + } + + /** + * @param {Number} degrees + * @return {GPSData} + */ + setLatitudeDegrees (degrees) { + this.setParameter(GPSData.KEY_LATITUDE_DEGREES, degrees); + return this; + } + + /** + * @return {Number} + */ + getLatitudeDegrees () { + return this.getParameter(GPSData.KEY_LATITUDE_DEGREES); + } + + /** + * @param {Number} year - The current UTC year. + * @return {GPSData} + */ + setUtcYear (year) { + this.setParameter(GPSData.KEY_UTC_YEAR, year); + return this; + } + + /** + * @return {Number} + */ + getUtcYear () { + return this.getParameter(GPSData.KEY_UTC_YEAR); + } + + /** + * @param {Number} month - The current UTC month. + * @return {GPSData} + */ + setUtcMonth (month) { + this.setParameter(GPSData.KEY_UTC_MONTH, month); + return this; + } + + /** + * @return {Number} + */ + getUtcMonth () { + return this.getParameter(GPSData.KEY_UTC_MONTH); + } + + /** + * @param {Number} day - The current UTC day. + * @return {GPSData} + */ + setUtcDay (day) { + this.setParameter(GPSData.KEY_UTC_DAY, day); + return this; + } + + /** + * @return {Number} + */ + getUtcDay () { + return this.getParameter(GPSData.KEY_UTC_DAY); + } + + /** + * @param {Number} hours - The current UTC hour. + * @return {GPSData} + */ + setUtcHours (hours) { + this.setParameter(GPSData.KEY_UTC_HOURS, hours); + return this; + } + + /** + * @return {Number} + */ + getUtcHours () { + return this.getParameter(GPSData.KEY_UTC_HOURS); + } + + /** + * @param {Number} minutes - The current UTC minute. + * @return {GPSData} + */ + setUtcMinutes (minutes) { + this.setParameter(GPSData.KEY_UTC_MINUTES, minutes); + return this; + } + + /** + * @return {Number} + */ + getUtcMinutes () { + return this.getParameter(GPSData.KEY_UTC_MINUTES); + } + + /** + * @param {Number} seconds - The current UTC second. + * @return {GPSData} + */ + setUtcSeconds (seconds) { + this.setParameter(GPSData.KEY_UTC_SECONDS, seconds); + return this; + } + + /** + * @return {Number} + */ + getUtcSeconds () { + return this.getParameter(GPSData.KEY_UTC_SECONDS); + } + + /** + * @param {CompassDirection} direction - See CompassDirection. + * @return {GPSData} + */ + setCompassDirection (direction) { + this.validateType(CompassDirection, direction); + this.setParameter(GPSData.KEY_COMPASS_DIRECTION, direction); + return this; + } + + /** + * @return {CompassDirection} + */ + getCompassDirection () { + return this.getObject(CompassDirection, GPSData.KEY_COMPASS_DIRECTION); + } + + /** + * @param {Number} pdop - PDOP. If undefined or unavailable, then value shall be set to 0. + * @return {GPSData} + */ + setPdop (pdop) { + this.setParameter(GPSData.KEY_PDOP, pdop); + return this; + } + + /** + * @return {Number} + */ + getPdop () { + return this.getParameter(GPSData.KEY_PDOP); + } + + /** + * @param {Number} hdop - HDOP. If value is unknown, value shall be set to 0. + * @return {GPSData} + */ + setHdop (hdop) { + this.setParameter(GPSData.KEY_HDOP, hdop); + return this; + } + + /** + * @return {Number} + */ + getHdop () { + return this.getParameter(GPSData.KEY_HDOP); + } + + /** + * @param {Number} vdop - VDOP. If value is unknown, value shall be set to 0. + * @return {GPSData} + */ + setVdop (vdop) { + this.setParameter(GPSData.KEY_VDOP, vdop); + return this; + } + + /** + * @return {Number} + */ + getVdop () { + return this.getParameter(GPSData.KEY_VDOP); + } + + /** + * @param {Boolean} actual - True, if actual. False, if inferred. + * @return {GPSData} + */ + setActual (actual) { + this.setParameter(GPSData.KEY_ACTUAL, actual); + return this; + } + + /** + * @return {Boolean} + */ + getActual () { + return this.getParameter(GPSData.KEY_ACTUAL); + } + + /** + * @param {Number} satellites - Number of satellites in view + * @return {GPSData} + */ + setSatellites (satellites) { + this.setParameter(GPSData.KEY_SATELLITES, satellites); + return this; + } + + /** + * @return {Number} + */ + getSatellites () { + return this.getParameter(GPSData.KEY_SATELLITES); + } + + /** + * @param {Dimension} dimension - See Dimension + * @return {GPSData} + */ + setDimension (dimension) { + this.validateType(Dimension, dimension); + this.setParameter(GPSData.KEY_DIMENSION, dimension); + return this; + } + + /** + * @return {Dimension} + */ + getDimension () { + return this.getObject(Dimension, GPSData.KEY_DIMENSION); + } + + /** + * @param {Number} altitude - Altitude in meters + * @return {GPSData} + */ + setAltitude (altitude) { + this.setParameter(GPSData.KEY_ALTITUDE, altitude); + return this; + } + + /** + * @return {Number} + */ + getAltitude () { + return this.getParameter(GPSData.KEY_ALTITUDE); + } + + /** + * @param {Number} heading - The heading. North is 0. Resolution is 0.01 + * @return {GPSData} + */ + setHeading (heading) { + this.setParameter(GPSData.KEY_HEADING, heading); + return this; + } + + /** + * @return {Number} + */ + getHeading () { + return this.getParameter(GPSData.KEY_HEADING); + } + + /** + * @param {Number} speed - The speed in KPH + * @return {GPSData} + */ + setSpeed (speed) { + this.setParameter(GPSData.KEY_SPEED, speed); + return this; + } + + /** + * @return {Number} + */ + getSpeed () { + return this.getParameter(GPSData.KEY_SPEED); + } + + /** + * @param {Boolean} shifted - True, if GPS lat/long, time, and altitude have been purposefully shifted (requires a + * proprietary algorithm to unshift). False, if the GPS data is raw and un-shifted. If + * not provided, then value is assumed False. + * @return {GPSData} + */ + setShifted (shifted) { + this.setParameter(GPSData.KEY_SHIFTED, shifted); + return this; + } + + /** + * @return {Boolean} + */ + getShifted () { + return this.getParameter(GPSData.KEY_SHIFTED); + } +} + +GPSData.KEY_LONGITUDE_DEGREES = 'longitudeDegrees'; +GPSData.KEY_LATITUDE_DEGREES = 'latitudeDegrees'; +GPSData.KEY_UTC_YEAR = 'utcYear'; +GPSData.KEY_UTC_MONTH = 'utcMonth'; +GPSData.KEY_UTC_DAY = 'utcDay'; +GPSData.KEY_UTC_HOURS = 'utcHours'; +GPSData.KEY_UTC_MINUTES = 'utcMinutes'; +GPSData.KEY_UTC_SECONDS = 'utcSeconds'; +GPSData.KEY_COMPASS_DIRECTION = 'compassDirection'; +GPSData.KEY_PDOP = 'pdop'; +GPSData.KEY_HDOP = 'hdop'; +GPSData.KEY_VDOP = 'vdop'; +GPSData.KEY_ACTUAL = 'actual'; +GPSData.KEY_SATELLITES = 'satellites'; +GPSData.KEY_DIMENSION = 'dimension'; +GPSData.KEY_ALTITUDE = 'altitude'; +GPSData.KEY_HEADING = 'heading'; +GPSData.KEY_SPEED = 'speed'; +GPSData.KEY_SHIFTED = 'shifted'; + +export { GPSData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/Grid.js b/lib/js/src/rpc/structs/Grid.js index 61494ba6..e3d855b2 100644 --- a/lib/js/src/rpc/structs/Grid.js +++ b/lib/js/src/rpc/structs/Grid.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -32,103 +33,109 @@ import { RpcStruct } from '../RpcStruct.js'; +/** + * Describes a location (origin coordinates and span) of a vehicle component. + */ class Grid extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {Number} column - * @return {Grid} - */ - setColumn (column) { - this.setParameter(Grid.KEY_COLUMN, column); + * @param {Number} col + * @return {Grid} + */ + setColumn (col) { + this.setParameter(Grid.KEY_COLUMN, col); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getColumn () { return this.getParameter(Grid.KEY_COLUMN); } /** - * @param {Number} row - * @return {Grid} - */ + * @param {Number} row + * @return {Grid} + */ setRow (row) { this.setParameter(Grid.KEY_ROW, row); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getRow () { return this.getParameter(Grid.KEY_ROW); } /** - * @param {Number} level - * @return {Grid} - */ + * @param {Number} level + * @return {Grid} + */ setLevel (level) { this.setParameter(Grid.KEY_LEVEL, level); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getLevel () { return this.getParameter(Grid.KEY_LEVEL); } /** - * @param {Number} columnSpan - * @return {Grid} - */ - setColumnSpan (columnSpan) { - this.setParameter(Grid.KEY_COLUMN_SPAN, columnSpan); + * @param {Number} colspan + * @return {Grid} + */ + setColumnSpan (colspan) { + this.setParameter(Grid.KEY_COLUMN_SPAN, colspan); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getColumnSpan () { return this.getParameter(Grid.KEY_COLUMN_SPAN); } /** - * @param {Number} rowSpan - * @return {Grid} - */ - setRowSpan (rowSpan) { - this.setParameter(Grid.KEY_ROW_SPAN, rowSpan); + * @param {Number} rowspan + * @return {Grid} + */ + setRowSpan (rowspan) { + this.setParameter(Grid.KEY_ROW_SPAN, rowspan); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getRowSpan () { return this.getParameter(Grid.KEY_ROW_SPAN); } /** - * @param {Number} levelSpan - * @return {Grid} - */ - setLevelSpan (levelSpan) { - this.setParameter(Grid.KEY_LEVEL_SPAN, levelSpan); + * @param {Number} levelspan + * @return {Grid} + */ + setLevelSpan (levelspan) { + this.setParameter(Grid.KEY_LEVEL_SPAN, levelspan); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getLevelSpan () { return this.getParameter(Grid.KEY_LEVEL_SPAN); } @@ -141,4 +148,4 @@ Grid.KEY_COLUMN_SPAN = 'colspan'; Grid.KEY_ROW_SPAN = 'rowspan'; Grid.KEY_LEVEL_SPAN = 'levelspan'; -export { Grid }; +export { Grid }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/HMICapabilities.js b/lib/js/src/rpc/structs/HMICapabilities.js index 5953d56b..757d3452 100644 --- a/lib/js/src/rpc/structs/HMICapabilities.js +++ b/lib/js/src/rpc/structs/HMICapabilities.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -32,122 +33,122 @@ import { RpcStruct } from '../RpcStruct.js'; - class HMICapabilities extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {Boolean} navigation - * @return {HMICapabilities} - */ + * @param {Boolean} navigation - Availability of build in Nav. True: Available, False: Not Available + * @return {HMICapabilities} + */ setNavigation (navigation) { this.setParameter(HMICapabilities.KEY_NAVIGATION, navigation); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getNavigation () { return this.getParameter(HMICapabilities.KEY_NAVIGATION); } /** - * @param {Boolean} phoneCall - * @return {HMICapabilities} - */ - setPhoneCall (phoneCall) { - this.setParameter(HMICapabilities.KEY_PHONE_CALL, phoneCall); + * @param {Boolean} call - Availability of build in phone. True: Available, False: Not Available + * @return {HMICapabilities} + */ + setPhoneCall (call) { + this.setParameter(HMICapabilities.KEY_PHONE_CALL, call); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getPhoneCall () { return this.getParameter(HMICapabilities.KEY_PHONE_CALL); } /** - * @param {Boolean} videoStreaming - * @return {HMICapabilities} - */ - setVideoStreaming (videoStreaming) { - this.setParameter(HMICapabilities.KEY_VIDEO_STREAMING, videoStreaming); + * @param {Boolean} streaming - Availability of video streaming. + * @return {HMICapabilities} + */ + setVideoStreaming (streaming) { + this.setParameter(HMICapabilities.KEY_VIDEO_STREAMING, streaming); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getVideoStreaming () { return this.getParameter(HMICapabilities.KEY_VIDEO_STREAMING); } /** - * @param {Boolean} remoteControl - * @return {HMICapabilities} - */ - setRemoteControl (remoteControl) { - this.setParameter(HMICapabilities.KEY_REMOTE_CONTROL, remoteControl); + * @param {Boolean} control - Availability of remote control feature. True: Available, False: Not Available + * @return {HMICapabilities} + */ + setRemoteControl (control) { + this.setParameter(HMICapabilities.KEY_REMOTE_CONTROL, control); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getRemoteControl () { return this.getParameter(HMICapabilities.KEY_REMOTE_CONTROL); } /** - * @param {Boolean} appServices - * @return {HMICapabilities} - */ - setAppService (appServices) { - this.setParameter(HMICapabilities.KEY_APP_SERVICES, appServices); + * @param {Boolean} services - Availability of App Services functionality. True: Available, False: Not Available + * @return {HMICapabilities} + */ + setAppServices (services) { + this.setParameter(HMICapabilities.KEY_APP_SERVICES, services); return this; } /** - * @return {Boolean} - */ - getAppService () { + * @return {Boolean} + */ + getAppServices () { return this.getParameter(HMICapabilities.KEY_APP_SERVICES); } - /** - * @param {Boolean} displays - * @return {HMICapabilities} - */ + * @param {Boolean} displays - Availability of displays capability. True: Available, False: Not Available + * @return {HMICapabilities} + */ setDisplays (displays) { this.setParameter(HMICapabilities.KEY_DISPLAYS, displays); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getDisplays () { return this.getParameter(HMICapabilities.KEY_DISPLAYS); } - /** - * @param {Boolean} seatLocation - * @return {HMICapabilities} - */ - setSeatLocation (seatLocation) { - this.setParameter(HMICapabilities.KEY_SEAT_LOCATION, seatLocation); + * @param {Boolean} location - Availability of seat location feature. True: Available, False: Not Available + * @return {HMICapabilities} + */ + setSeatLocation (location) { + this.setParameter(HMICapabilities.KEY_SEAT_LOCATION, location); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getSeatLocation () { return this.getParameter(HMICapabilities.KEY_SEAT_LOCATION); } @@ -161,4 +162,4 @@ HMICapabilities.KEY_APP_SERVICES = 'appServices'; HMICapabilities.KEY_DISPLAYS = 'displays'; HMICapabilities.KEY_SEAT_LOCATION = 'seatLocation'; -export { HMICapabilities }; +export { HMICapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/HMIPermissions.js b/lib/js/src/rpc/structs/HMIPermissions.js new file mode 100644 index 00000000..7fab06c9 --- /dev/null +++ b/lib/js/src/rpc/structs/HMIPermissions.js @@ -0,0 +1,83 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { HMILevel } from '../enums/HMILevel.js'; +import { RpcStruct } from '../RpcStruct.js'; + +class HMIPermissions extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {HMILevel[]} allowed - A set of all HMI levels that are permitted for this given RPC. + * @return {HMIPermissions} + */ + setAllowed (allowed) { + this.validateType(HMILevel, allowed, true); + this.setParameter(HMIPermissions.KEY_ALLOWED, allowed); + return this; + } + + /** + * @return {HMILevel[]} + */ + getAllowed () { + return this.getObject(HMILevel, HMIPermissions.KEY_ALLOWED); + } + + /** + * @param {HMILevel[]} disallowed - A set of all HMI levels that are prohibited for this given RPC. + * @return {HMIPermissions} + */ + setUserDisallowed (disallowed) { + this.validateType(HMILevel, disallowed, true); + this.setParameter(HMIPermissions.KEY_USER_DISALLOWED, disallowed); + return this; + } + + /** + * @return {HMILevel[]} + */ + getUserDisallowed () { + return this.getObject(HMILevel, HMIPermissions.KEY_USER_DISALLOWED); + } +} + +HMIPermissions.KEY_ALLOWED = 'allowed'; +HMIPermissions.KEY_USER_DISALLOWED = 'userDisallowed'; + +export { HMIPermissions }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/HMISettingsControlCapabilities.js b/lib/js/src/rpc/structs/HMISettingsControlCapabilities.js new file mode 100644 index 00000000..50707982 --- /dev/null +++ b/lib/js/src/rpc/structs/HMISettingsControlCapabilities.js @@ -0,0 +1,134 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { ModuleInfo } from './ModuleInfo.js'; + +class HMISettingsControlCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} name - The short friendly name of the hmi setting module. It should not be used to identify a + * module by mobile application. + * @return {HMISettingsControlCapabilities} + */ + setModuleName (name) { + this.setParameter(HMISettingsControlCapabilities.KEY_MODULE_NAME, name); + return this; + } + + /** + * @return {String} + */ + getModuleName () { + return this.getParameter(HMISettingsControlCapabilities.KEY_MODULE_NAME); + } + + /** + * @param {ModuleInfo} info - Information about a RC module, including its id. + * @return {HMISettingsControlCapabilities} + */ + setModuleInfo (info) { + this.validateType(ModuleInfo, info); + this.setParameter(HMISettingsControlCapabilities.KEY_MODULE_INFO, info); + return this; + } + + /** + * @return {ModuleInfo} + */ + getModuleInfo () { + return this.getObject(ModuleInfo, HMISettingsControlCapabilities.KEY_MODULE_INFO); + } + + /** + * @param {Boolean} available - Availability of the control of distance unit. + * @return {HMISettingsControlCapabilities} + */ + setDistanceUnitAvailable (available) { + this.setParameter(HMISettingsControlCapabilities.KEY_DISTANCE_UNIT_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getDistanceUnitAvailable () { + return this.getParameter(HMISettingsControlCapabilities.KEY_DISTANCE_UNIT_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of temperature unit. + * @return {HMISettingsControlCapabilities} + */ + setTemperatureUnitAvailable (available) { + this.setParameter(HMISettingsControlCapabilities.KEY_TEMPERATURE_UNIT_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getTemperatureUnitAvailable () { + return this.getParameter(HMISettingsControlCapabilities.KEY_TEMPERATURE_UNIT_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of HMI display mode. + * @return {HMISettingsControlCapabilities} + */ + setDisplayModeUnitAvailable (available) { + this.setParameter(HMISettingsControlCapabilities.KEY_DISPLAY_MODE_UNIT_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getDisplayModeUnitAvailable () { + return this.getParameter(HMISettingsControlCapabilities.KEY_DISPLAY_MODE_UNIT_AVAILABLE); + } +} + +HMISettingsControlCapabilities.KEY_MODULE_NAME = 'moduleName'; +HMISettingsControlCapabilities.KEY_MODULE_INFO = 'moduleInfo'; +HMISettingsControlCapabilities.KEY_DISTANCE_UNIT_AVAILABLE = 'distanceUnitAvailable'; +HMISettingsControlCapabilities.KEY_TEMPERATURE_UNIT_AVAILABLE = 'temperatureUnitAvailable'; +HMISettingsControlCapabilities.KEY_DISPLAY_MODE_UNIT_AVAILABLE = 'displayModeUnitAvailable'; + +export { HMISettingsControlCapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/HMISettingsControlData.js b/lib/js/src/rpc/structs/HMISettingsControlData.js new file mode 100644 index 00000000..6fc066be --- /dev/null +++ b/lib/js/src/rpc/structs/HMISettingsControlData.js @@ -0,0 +1,106 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { DisplayMode } from '../enums/DisplayMode.js'; +import { RpcStruct } from '../RpcStruct.js'; +import { DistanceUnit } from '../enums/DistanceUnit.js'; +import { TemperatureUnit } from '../enums/TemperatureUnit.js'; + +/** + * Corresponds to "HMI_SETTINGS" ModuleType + */ +class HMISettingsControlData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {DisplayMode} mode + * @return {HMISettingsControlData} + */ + setDisplayMode (mode) { + this.validateType(DisplayMode, mode); + this.setParameter(HMISettingsControlData.KEY_DISPLAY_MODE, mode); + return this; + } + + /** + * @return {DisplayMode} + */ + getDisplayMode () { + return this.getObject(DisplayMode, HMISettingsControlData.KEY_DISPLAY_MODE); + } + + /** + * @param {TemperatureUnit} unit + * @return {HMISettingsControlData} + */ + setTemperatureUnit (unit) { + this.validateType(TemperatureUnit, unit); + this.setParameter(HMISettingsControlData.KEY_TEMPERATURE_UNIT, unit); + return this; + } + + /** + * @return {TemperatureUnit} + */ + getTemperatureUnit () { + return this.getObject(TemperatureUnit, HMISettingsControlData.KEY_TEMPERATURE_UNIT); + } + + /** + * @param {DistanceUnit} unit + * @return {HMISettingsControlData} + */ + setDistanceUnit (unit) { + this.validateType(DistanceUnit, unit); + this.setParameter(HMISettingsControlData.KEY_DISTANCE_UNIT, unit); + return this; + } + + /** + * @return {DistanceUnit} + */ + getDistanceUnit () { + return this.getObject(DistanceUnit, HMISettingsControlData.KEY_DISTANCE_UNIT); + } +} + +HMISettingsControlData.KEY_DISPLAY_MODE = 'displayMode'; +HMISettingsControlData.KEY_TEMPERATURE_UNIT = 'temperatureUnit'; +HMISettingsControlData.KEY_DISTANCE_UNIT = 'distanceUnit'; + +export { HMISettingsControlData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/HapticRect.js b/lib/js/src/rpc/structs/HapticRect.js new file mode 100644 index 00000000..1f91bd10 --- /dev/null +++ b/lib/js/src/rpc/structs/HapticRect.js @@ -0,0 +1,86 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Rectangle } from './Rectangle.js'; +import { RpcStruct } from '../RpcStruct.js'; + +/** + * Defines haptic data for each user control object for video streaming application + */ +class HapticRect extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} id - A user control spatial identifier + * @return {HapticRect} + */ + setId (id) { + this.setParameter(HapticRect.KEY_ID, id); + return this; + } + + /** + * @return {Number} + */ + getId () { + return this.getParameter(HapticRect.KEY_ID); + } + + /** + * @param {Rectangle} rect - The position of the haptic rectangle to be highlighted. The center of this rectangle + * will be "touched" when a press occurs. + * @return {HapticRect} + */ + setRect (rect) { + this.validateType(Rectangle, rect); + this.setParameter(HapticRect.KEY_RECT, rect); + return this; + } + + /** + * @return {Rectangle} + */ + getRect () { + return this.getObject(Rectangle, HapticRect.KEY_RECT); + } +} + +HapticRect.KEY_ID = 'id'; +HapticRect.KEY_RECT = 'rect'; + +export { HapticRect }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/HeadLampStatus.js b/lib/js/src/rpc/structs/HeadLampStatus.js new file mode 100644 index 00000000..a6bbd3bb --- /dev/null +++ b/lib/js/src/rpc/structs/HeadLampStatus.js @@ -0,0 +1,99 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { AmbientLightStatus } from '../enums/AmbientLightStatus.js'; + +class HeadLampStatus extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Boolean} on - Status of the low beam lamps. References signal "HeadLampLoActv_B_Stat". + * @return {HeadLampStatus} + */ + setLowBeamsOn (on) { + this.setParameter(HeadLampStatus.KEY_LOW_BEAMS_ON, on); + return this; + } + + /** + * @return {Boolean} + */ + getLowBeamsOn () { + return this.getParameter(HeadLampStatus.KEY_LOW_BEAMS_ON); + } + + /** + * @param {Boolean} on - Status of the high beam lamps. References signal "HeadLghtHiOn_B_Stat". + * @return {HeadLampStatus} + */ + setHighBeamsOn (on) { + this.setParameter(HeadLampStatus.KEY_HIGH_BEAMS_ON, on); + return this; + } + + /** + * @return {Boolean} + */ + getHighBeamsOn () { + return this.getParameter(HeadLampStatus.KEY_HIGH_BEAMS_ON); + } + + /** + * @param {AmbientLightStatus} status - Status of the ambient light sensor. + * @return {HeadLampStatus} + */ + setAmbientLightSensorStatus (status) { + this.validateType(AmbientLightStatus, status); + this.setParameter(HeadLampStatus.KEY_AMBIENT_LIGHT_SENSOR_STATUS, status); + return this; + } + + /** + * @return {AmbientLightStatus} + */ + getAmbientLightSensorStatus () { + return this.getObject(AmbientLightStatus, HeadLampStatus.KEY_AMBIENT_LIGHT_SENSOR_STATUS); + } +} + +HeadLampStatus.KEY_LOW_BEAMS_ON = 'lowBeamsOn'; +HeadLampStatus.KEY_HIGH_BEAMS_ON = 'highBeamsOn'; +HeadLampStatus.KEY_AMBIENT_LIGHT_SENSOR_STATUS = 'ambientLightSensorStatus'; + +export { HeadLampStatus }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/Image.js b/lib/js/src/rpc/structs/Image.js index 49c70264..0a9bfae1 100644 --- a/lib/js/src/rpc/structs/Image.js +++ b/lib/js/src/rpc/structs/Image.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -35,58 +36,58 @@ import { ImageType } from '../enums/ImageType.js'; class Image extends RpcStruct { /** - * @constructor - */ + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {String} value - * @return {Image} - */ + * @param {String} value - Either the static hex icon value or the binary image file name identifier (sent by + * PutFile). + * @return {Image} + */ setValue (value) { this.setParameter(Image.KEY_VALUE, value); return this; } /** - * @return {String} - */ + * @return {String} + */ getValue () { return this.getParameter(Image.KEY_VALUE); } /** - * @param {ImageType} type - * @return {Image} - */ + * @param {ImageType} type - Describes, whether it is a static or dynamic image. + * @return {Image} + */ setImageType (type) { this.validateType(ImageType, type); - this.setParameter(Image.KEY_IMAGE_TYPE, type); return this; } /** - * @return {ImageType} - */ + * @return {ImageType} + */ getImageType () { return this.getObject(ImageType, Image.KEY_IMAGE_TYPE); } /** - * @param {Boolean} isTemplate - * @return {Image} - */ - setIsTemplate (isTemplate) { - this.setParameter(Image.KEY_IS_TEMPLATE, isTemplate); + * @param {Boolean} template - If true, the image is a template image and can be recolored by the HMI + * @return {Image} + */ + setIsTemplate (template) { + this.setParameter(Image.KEY_IS_TEMPLATE, template); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getIsTemplate () { return this.getParameter(Image.KEY_IS_TEMPLATE); } @@ -96,4 +97,4 @@ Image.KEY_VALUE = 'value'; Image.KEY_IMAGE_TYPE = 'imageType'; Image.KEY_IS_TEMPLATE = 'isTemplate'; -export { Image }; +export { Image }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/ImageField.js b/lib/js/src/rpc/structs/ImageField.js index bba8e1f3..0060d680 100644 --- a/lib/js/src/rpc/structs/ImageField.js +++ b/lib/js/src/rpc/structs/ImageField.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -32,64 +33,64 @@ import { RpcStruct } from '../RpcStruct.js'; import { ImageResolution } from './ImageResolution.js'; -import { FileType } from '../enums/FileType.js'; import { ImageFieldName } from '../enums/ImageFieldName.js'; +import { FileType } from '../enums/FileType.js'; class ImageField extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {ImageFieldName} imageFieldName - * @return {ImageField} - */ - setImageFieldName (imageFieldName) { - this.validateType(ImageFieldName, imageFieldName); - - this.setParameter(ImageField.KEY_NAME, imageFieldName); + * @param {ImageFieldName} name - The name that identifies the field. See ImageFieldName. + * @return {ImageField} + */ + setName (name) { + this.validateType(ImageFieldName, name); + this.setParameter(ImageField.KEY_NAME, name); return this; } /** - * @return {ImageFieldName} - */ - getImageFieldName () { + * @return {ImageFieldName} + */ + getName () { return this.getObject(ImageFieldName, ImageField.KEY_NAME); } /** - * @param {FileType[]} imageTypeSupported - * @return {ImageField} - */ - setImageTypeSupported (imageTypeSupported) { - this.validateType(FileType, imageTypeSupported, true); - - this.setParameter(ImageField.KEY_IMAGE_TYPE_SUPPORTED, imageTypeSupported); + * @param {FileType[]} supported - The image types that are supported in this field. See FileType. + * @return {ImageField} + */ + setImageTypeSupported (supported) { + this.validateType(FileType, supported, true); + this.setParameter(ImageField.KEY_IMAGE_TYPE_SUPPORTED, supported); return this; } /** - * @return {FileType} - */ + * @return {FileType[]} + */ getImageTypeSupported () { return this.getObject(FileType, ImageField.KEY_IMAGE_TYPE_SUPPORTED); } /** - * @param {ImageResolution} imageResolution - * @return {ImageField} - */ - setImageResolution (imageResolution) { - this.validateType(ImageResolution, imageResolution); - - this.setParameter(ImageField.KEY_IMAGE_RESOLUTION, imageResolution); + * @param {ImageResolution} resolution - The image resolution of this field. + * @return {ImageField} + */ + setImageResolution (resolution) { + this.validateType(ImageResolution, resolution); + this.setParameter(ImageField.KEY_IMAGE_RESOLUTION, resolution); return this; } /** - * @return {ImageResolution} - */ + * @return {ImageResolution} + */ getImageResolution () { return this.getObject(ImageResolution, ImageField.KEY_IMAGE_RESOLUTION); } @@ -99,4 +100,4 @@ ImageField.KEY_NAME = 'name'; ImageField.KEY_IMAGE_TYPE_SUPPORTED = 'imageTypeSupported'; ImageField.KEY_IMAGE_RESOLUTION = 'imageResolution'; -export { ImageField }; +export { ImageField }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/ImageResolution.js b/lib/js/src/rpc/structs/ImageResolution.js index 59a93fd9..7ed7e2ac 100644 --- a/lib/js/src/rpc/structs/ImageResolution.js +++ b/lib/js/src/rpc/structs/ImageResolution.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -33,38 +34,41 @@ import { RpcStruct } from '../RpcStruct.js'; class ImageResolution extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {Number} resolutionWidth - * @return {ImageResolution} - */ - setResolutionWidth (resolutionWidth) { - this.setParameter(ImageResolution.KEY_RESOLUTION_WIDTH, resolutionWidth); + * @param {Number} width - The image resolution width. + * @return {ImageResolution} + */ + setResolutionWidth (width) { + this.setParameter(ImageResolution.KEY_RESOLUTION_WIDTH, width); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getResolutionWidth () { return this.getParameter(ImageResolution.KEY_RESOLUTION_WIDTH); } /** - * @param {Number} resolutionHeight - * @return {ImageResolution} - */ - setResolutionHeight (resolutionHeight) { - this.setParameter(ImageResolution.KEY_RESOLUTION_HEIGHT, resolutionHeight); + * @param {Number} height - The image resolution height. + * @return {ImageResolution} + */ + setResolutionHeight (height) { + this.setParameter(ImageResolution.KEY_RESOLUTION_HEIGHT, height); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getResolutionHeight () { return this.getParameter(ImageResolution.KEY_RESOLUTION_HEIGHT); } @@ -73,4 +77,4 @@ class ImageResolution extends RpcStruct { ImageResolution.KEY_RESOLUTION_WIDTH = 'resolutionWidth'; ImageResolution.KEY_RESOLUTION_HEIGHT = 'resolutionHeight'; -export { ImageResolution }; +export { ImageResolution }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/KeyboardProperties.js b/lib/js/src/rpc/structs/KeyboardProperties.js new file mode 100644 index 00000000..4a373ebb --- /dev/null +++ b/lib/js/src/rpc/structs/KeyboardProperties.js @@ -0,0 +1,160 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { KeyboardLayout } from '../enums/KeyboardLayout.js'; +import { Language } from '../enums/Language.js'; +import { KeypressMode } from '../enums/KeypressMode.js'; + +/** + * Configuration of on-screen keyboard (if available). + */ +class KeyboardProperties extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Language} language - The keyboard language. + * @return {KeyboardProperties} + */ + setLanguage (language) { + this.validateType(Language, language); + this.setParameter(KeyboardProperties.KEY_LANGUAGE, language); + return this; + } + + /** + * @return {Language} + */ + getLanguage () { + return this.getObject(Language, KeyboardProperties.KEY_LANGUAGE); + } + + /** + * @param {KeyboardLayout} layout - Desired keyboard layout. + * @return {KeyboardProperties} + */ + setKeyboardLayout (layout) { + this.validateType(KeyboardLayout, layout); + this.setParameter(KeyboardProperties.KEY_KEYBOARD_LAYOUT, layout); + return this; + } + + /** + * @return {KeyboardLayout} + */ + getKeyboardLayout () { + return this.getObject(KeyboardLayout, KeyboardProperties.KEY_KEYBOARD_LAYOUT); + } + + /** + * @param {KeypressMode} mode - Desired keypress mode. If omitted, this value will be set to RESEND_CURRENT_ENTRY. + * @return {KeyboardProperties} + */ + setKeypressMode (mode) { + this.validateType(KeypressMode, mode); + this.setParameter(KeyboardProperties.KEY_KEYPRESS_MODE, mode); + return this; + } + + /** + * @return {KeypressMode} + */ + getKeypressMode () { + return this.getObject(KeypressMode, KeyboardProperties.KEY_KEYPRESS_MODE); + } + + /** + * @param {String[]} list - Array of keyboard characters to enable. All omitted characters will be greyed out + * (disabled) on the keyboard. If omitted, the entire keyboard will be enabled. + * @return {KeyboardProperties} + */ + setLimitedCharacterList (list) { + this.setParameter(KeyboardProperties.KEY_LIMITED_CHARACTER_LIST, list); + return this; + } + + /** + * @return {String[]} + */ + getLimitedCharacterList () { + return this.getParameter(KeyboardProperties.KEY_LIMITED_CHARACTER_LIST); + } + + /** + * @param {String} text - Deprecated, use autoCompleteList instead. + * @return {KeyboardProperties} + */ + setAutoCompleteText (text) { + this.setParameter(KeyboardProperties.KEY_AUTO_COMPLETE_TEXT, text); + return this; + } + + /** + * @return {String} + */ + getAutoCompleteText () { + return this.getParameter(KeyboardProperties.KEY_AUTO_COMPLETE_TEXT); + } + + /** + * @param {String[]} list - Allows an app to prepopulate the text field with a list of suggested or completed + * entries as the user types. If empty, the auto-complete list will be removed from the + * screen. + * @return {KeyboardProperties} + */ + setAutoCompleteList (list) { + this.setParameter(KeyboardProperties.KEY_AUTO_COMPLETE_LIST, list); + return this; + } + + /** + * @return {String[]} + */ + getAutoCompleteList () { + return this.getParameter(KeyboardProperties.KEY_AUTO_COMPLETE_LIST); + } +} + +KeyboardProperties.KEY_LANGUAGE = 'language'; +KeyboardProperties.KEY_KEYBOARD_LAYOUT = 'keyboardLayout'; +KeyboardProperties.KEY_KEYPRESS_MODE = 'keypressMode'; +KeyboardProperties.KEY_LIMITED_CHARACTER_LIST = 'limitedCharacterList'; +KeyboardProperties.KEY_AUTO_COMPLETE_TEXT = 'autoCompleteText'; +KeyboardProperties.KEY_AUTO_COMPLETE_LIST = 'autoCompleteList'; + +export { KeyboardProperties }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/LightCapabilities.js b/lib/js/src/rpc/structs/LightCapabilities.js new file mode 100644 index 00000000..0ee890be --- /dev/null +++ b/lib/js/src/rpc/structs/LightCapabilities.js @@ -0,0 +1,117 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { LightName } from '../enums/LightName.js'; + +class LightCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {LightName} name + * @return {LightCapabilities} + */ + setName (name) { + this.validateType(LightName, name); + this.setParameter(LightCapabilities.KEY_NAME, name); + return this; + } + + /** + * @return {LightName} + */ + getName () { + return this.getObject(LightName, LightCapabilities.KEY_NAME); + } + + /** + * @param {Boolean} available - Indicates if the status (ON/OFF) can be set remotely. App shall not use read-only + * values (RAMP_UP/RAMP_DOWN/UNKNOWN/INVALID) in a setInteriorVehicleData request. + * @return {LightCapabilities} + */ + setStatusAvailable (available) { + this.setParameter(LightCapabilities.KEY_STATUS_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getStatusAvailable () { + return this.getParameter(LightCapabilities.KEY_STATUS_AVAILABLE); + } + + /** + * @param {Boolean} available - Indicates if the light's density can be set remotely (similar to a dimmer). + * @return {LightCapabilities} + */ + setDensityAvailable (available) { + this.setParameter(LightCapabilities.KEY_DENSITY_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getDensityAvailable () { + return this.getParameter(LightCapabilities.KEY_DENSITY_AVAILABLE); + } + + /** + * @param {Boolean} available - Indicates if the light's color can be set remotely by using the sRGB color space. + * @return {LightCapabilities} + */ + setRgbColorSpaceAvailable (available) { + this.setParameter(LightCapabilities.KEY_RGB_COLOR_SPACE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getRgbColorSpaceAvailable () { + return this.getParameter(LightCapabilities.KEY_RGB_COLOR_SPACE_AVAILABLE); + } +} + +LightCapabilities.KEY_NAME = 'name'; +LightCapabilities.KEY_STATUS_AVAILABLE = 'statusAvailable'; +LightCapabilities.KEY_DENSITY_AVAILABLE = 'densityAvailable'; +LightCapabilities.KEY_RGB_COLOR_SPACE_AVAILABLE = 'rgbColorSpaceAvailable'; + +export { LightCapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/LightControlCapabilities.js b/lib/js/src/rpc/structs/LightControlCapabilities.js new file mode 100644 index 00000000..94571be7 --- /dev/null +++ b/lib/js/src/rpc/structs/LightControlCapabilities.js @@ -0,0 +1,102 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { LightCapabilities } from './LightCapabilities.js'; +import { ModuleInfo } from './ModuleInfo.js'; + +class LightControlCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} name - The short friendly name of the light control module. It should not be used to identify a + * module by mobile application. + * @return {LightControlCapabilities} + */ + setModuleName (name) { + this.setParameter(LightControlCapabilities.KEY_MODULE_NAME, name); + return this; + } + + /** + * @return {String} + */ + getModuleName () { + return this.getParameter(LightControlCapabilities.KEY_MODULE_NAME); + } + + /** + * @param {ModuleInfo} info - Information about a RC module, including its id. + * @return {LightControlCapabilities} + */ + setModuleInfo (info) { + this.validateType(ModuleInfo, info); + this.setParameter(LightControlCapabilities.KEY_MODULE_INFO, info); + return this; + } + + /** + * @return {ModuleInfo} + */ + getModuleInfo () { + return this.getObject(ModuleInfo, LightControlCapabilities.KEY_MODULE_INFO); + } + + /** + * @param {LightCapabilities[]} lights - An array of available LightCapabilities that are controllable. + * @return {LightControlCapabilities} + */ + setSupportedLights (lights) { + this.validateType(LightCapabilities, lights, true); + this.setParameter(LightControlCapabilities.KEY_SUPPORTED_LIGHTS, lights); + return this; + } + + /** + * @return {LightCapabilities[]} + */ + getSupportedLights () { + return this.getObject(LightCapabilities, LightControlCapabilities.KEY_SUPPORTED_LIGHTS); + } +} + +LightControlCapabilities.KEY_MODULE_NAME = 'moduleName'; +LightControlCapabilities.KEY_MODULE_INFO = 'moduleInfo'; +LightControlCapabilities.KEY_SUPPORTED_LIGHTS = 'supportedLights'; + +export { LightControlCapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/LightControlData.js b/lib/js/src/rpc/structs/LightControlData.js new file mode 100644 index 00000000..5a968d7c --- /dev/null +++ b/lib/js/src/rpc/structs/LightControlData.js @@ -0,0 +1,66 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { LightState } from './LightState.js'; + +class LightControlData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {LightState[]} state - An array of LightNames and their current or desired status. No change to the status + * of the LightNames that are not listed in the array. + * @return {LightControlData} + */ + setLightState (state) { + this.validateType(LightState, state, true); + this.setParameter(LightControlData.KEY_LIGHT_STATE, state); + return this; + } + + /** + * @return {LightState[]} + */ + getLightState () { + return this.getObject(LightState, LightControlData.KEY_LIGHT_STATE); + } +} + +LightControlData.KEY_LIGHT_STATE = 'lightState'; + +export { LightControlData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/LightState.js b/lib/js/src/rpc/structs/LightState.js new file mode 100644 index 00000000..af2fc8d7 --- /dev/null +++ b/lib/js/src/rpc/structs/LightState.js @@ -0,0 +1,120 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { LightStatus } from '../enums/LightStatus.js'; +import { LightName } from '../enums/LightName.js'; +import { RGBColor } from './RGBColor.js'; + +class LightState extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {LightName} id - The name of a light or a group of lights. + * @return {LightState} + */ + setId (id) { + this.validateType(LightName, id); + this.setParameter(LightState.KEY_ID, id); + return this; + } + + /** + * @return {LightName} + */ + getId () { + return this.getObject(LightName, LightState.KEY_ID); + } + + /** + * @param {LightStatus} status + * @return {LightState} + */ + setStatus (status) { + this.validateType(LightStatus, status); + this.setParameter(LightState.KEY_STATUS, status); + return this; + } + + /** + * @return {LightStatus} + */ + getStatus () { + return this.getObject(LightStatus, LightState.KEY_STATUS); + } + + /** + * @param {Number} density + * @return {LightState} + */ + setDensity (density) { + this.setParameter(LightState.KEY_DENSITY, density); + return this; + } + + /** + * @return {Number} + */ + getDensity () { + return this.getParameter(LightState.KEY_DENSITY); + } + + /** + * @param {RGBColor} color + * @return {LightState} + */ + setColor (color) { + this.validateType(RGBColor, color); + this.setParameter(LightState.KEY_COLOR, color); + return this; + } + + /** + * @return {RGBColor} + */ + getColor () { + return this.getObject(RGBColor, LightState.KEY_COLOR); + } +} + +LightState.KEY_ID = 'id'; +LightState.KEY_STATUS = 'status'; +LightState.KEY_DENSITY = 'density'; +LightState.KEY_COLOR = 'color'; + +export { LightState }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/LocationDetails.js b/lib/js/src/rpc/structs/LocationDetails.js new file mode 100644 index 00000000..0b5a368e --- /dev/null +++ b/lib/js/src/rpc/structs/LocationDetails.js @@ -0,0 +1,171 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Coordinate } from './Coordinate.js'; +import { Image } from './Image.js'; +import { OASISAddress } from './OASISAddress.js'; +import { RpcStruct } from '../RpcStruct.js'; + +class LocationDetails extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Coordinate} coordinate - Latitude/Longitude of the location. + * @return {LocationDetails} + */ + setCoordinate (coordinate) { + this.validateType(Coordinate, coordinate); + this.setParameter(LocationDetails.KEY_COORDINATE, coordinate); + return this; + } + + /** + * @return {Coordinate} + */ + getCoordinate () { + return this.getObject(Coordinate, LocationDetails.KEY_COORDINATE); + } + + /** + * @param {String} name - Name of location. + * @return {LocationDetails} + */ + setLocationName (name) { + this.setParameter(LocationDetails.KEY_LOCATION_NAME, name); + return this; + } + + /** + * @return {String} + */ + getLocationName () { + return this.getParameter(LocationDetails.KEY_LOCATION_NAME); + } + + /** + * @param {String[]} lines - Location address for display purposes only + * @return {LocationDetails} + */ + setAddressLines (lines) { + this.setParameter(LocationDetails.KEY_ADDRESS_LINES, lines); + return this; + } + + /** + * @return {String[]} + */ + getAddressLines () { + return this.getParameter(LocationDetails.KEY_ADDRESS_LINES); + } + + /** + * @param {String} description - Description intended location / establishment (if applicable) + * @return {LocationDetails} + */ + setLocationDescription (description) { + this.setParameter(LocationDetails.KEY_LOCATION_DESCRIPTION, description); + return this; + } + + /** + * @return {String} + */ + getLocationDescription () { + return this.getParameter(LocationDetails.KEY_LOCATION_DESCRIPTION); + } + + /** + * @param {String} number - Phone number of location / establishment. + * @return {LocationDetails} + */ + setPhoneNumber (number) { + this.setParameter(LocationDetails.KEY_PHONE_NUMBER, number); + return this; + } + + /** + * @return {String} + */ + getPhoneNumber () { + return this.getParameter(LocationDetails.KEY_PHONE_NUMBER); + } + + /** + * @param {Image} image - Image / icon of intended location. + * @return {LocationDetails} + */ + setLocationImage (image) { + this.validateType(Image, image); + this.setParameter(LocationDetails.KEY_LOCATION_IMAGE, image); + return this; + } + + /** + * @return {Image} + */ + getLocationImage () { + return this.getObject(Image, LocationDetails.KEY_LOCATION_IMAGE); + } + + /** + * @param {OASISAddress} address - Address to be used by navigation engines for search + * @return {LocationDetails} + */ + setSearchAddress (address) { + this.validateType(OASISAddress, address); + this.setParameter(LocationDetails.KEY_SEARCH_ADDRESS, address); + return this; + } + + /** + * @return {OASISAddress} + */ + getSearchAddress () { + return this.getObject(OASISAddress, LocationDetails.KEY_SEARCH_ADDRESS); + } +} + +LocationDetails.KEY_COORDINATE = 'coordinate'; +LocationDetails.KEY_LOCATION_NAME = 'locationName'; +LocationDetails.KEY_ADDRESS_LINES = 'addressLines'; +LocationDetails.KEY_LOCATION_DESCRIPTION = 'locationDescription'; +LocationDetails.KEY_PHONE_NUMBER = 'phoneNumber'; +LocationDetails.KEY_LOCATION_IMAGE = 'locationImage'; +LocationDetails.KEY_SEARCH_ADDRESS = 'searchAddress'; + +export { LocationDetails }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/MassageCushionFirmness.js b/lib/js/src/rpc/structs/MassageCushionFirmness.js new file mode 100644 index 00000000..98424231 --- /dev/null +++ b/lib/js/src/rpc/structs/MassageCushionFirmness.js @@ -0,0 +1,85 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { MassageCushion } from '../enums/MassageCushion.js'; + +/** + * The intensity or firmness of a cushion. + */ +class MassageCushionFirmness extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {MassageCushion} cushion - List possible cushions of a multi-contour massage seat. + * @return {MassageCushionFirmness} + */ + setCushion (cushion) { + this.validateType(MassageCushion, cushion); + this.setParameter(MassageCushionFirmness.KEY_CUSHION, cushion); + return this; + } + + /** + * @return {MassageCushion} + */ + getCushion () { + return this.getObject(MassageCushion, MassageCushionFirmness.KEY_CUSHION); + } + + /** + * @param {Number} firmness + * @return {MassageCushionFirmness} + */ + setFirmness (firmness) { + this.setParameter(MassageCushionFirmness.KEY_FIRMNESS, firmness); + return this; + } + + /** + * @return {Number} + */ + getFirmness () { + return this.getParameter(MassageCushionFirmness.KEY_FIRMNESS); + } +} + +MassageCushionFirmness.KEY_CUSHION = 'cushion'; +MassageCushionFirmness.KEY_FIRMNESS = 'firmness'; + +export { MassageCushionFirmness }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/MassageModeData.js b/lib/js/src/rpc/structs/MassageModeData.js new file mode 100644 index 00000000..681f9d96 --- /dev/null +++ b/lib/js/src/rpc/structs/MassageModeData.js @@ -0,0 +1,87 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { MassageZone } from '../enums/MassageZone.js'; +import { MassageMode } from '../enums/MassageMode.js'; + +/** + * Specify the mode of a massage zone. + */ +class MassageModeData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {MassageZone} zone - List possible zones of a multi-contour massage seat. + * @return {MassageModeData} + */ + setMassageZone (zone) { + this.validateType(MassageZone, zone); + this.setParameter(MassageModeData.KEY_MASSAGE_ZONE, zone); + return this; + } + + /** + * @return {MassageZone} + */ + getMassageZone () { + return this.getObject(MassageZone, MassageModeData.KEY_MASSAGE_ZONE); + } + + /** + * @param {MassageMode} mode - List possible modes of a massage zone. + * @return {MassageModeData} + */ + setMassageMode (mode) { + this.validateType(MassageMode, mode); + this.setParameter(MassageModeData.KEY_MASSAGE_MODE, mode); + return this; + } + + /** + * @return {MassageMode} + */ + getMassageMode () { + return this.getObject(MassageMode, MassageModeData.KEY_MASSAGE_MODE); + } +} + +MassageModeData.KEY_MASSAGE_ZONE = 'massageZone'; +MassageModeData.KEY_MASSAGE_MODE = 'massageMode'; + +export { MassageModeData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/MediaServiceData.js b/lib/js/src/rpc/structs/MediaServiceData.js new file mode 100644 index 00000000..0e3a0b75 --- /dev/null +++ b/lib/js/src/rpc/structs/MediaServiceData.js @@ -0,0 +1,295 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { Image } from './Image.js'; +import { MediaType } from '../enums/MediaType.js'; + +/** + * This data is related to what a media service should provide + */ +class MediaServiceData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {MediaType} type - The type of the currently playing or paused track. + * @return {MediaServiceData} + */ + setMediaType (type) { + this.validateType(MediaType, type); + this.setParameter(MediaServiceData.KEY_MEDIA_TYPE, type); + return this; + } + + /** + * @return {MediaType} + */ + getMediaType () { + return this.getObject(MediaType, MediaServiceData.KEY_MEDIA_TYPE); + } + + /** + * @param {String} title - Music: The name of the current track Podcast: The name of the current episode Audiobook: + * The name of the current chapter + * @return {MediaServiceData} + */ + setMediaTitle (title) { + this.setParameter(MediaServiceData.KEY_MEDIA_TITLE, title); + return this; + } + + /** + * @return {String} + */ + getMediaTitle () { + return this.getParameter(MediaServiceData.KEY_MEDIA_TITLE); + } + + /** + * @param {String} artist - Music: The name of the current album artist Podcast: The provider of the podcast (hosts, + * network, company) Audiobook: The book author's name + * @return {MediaServiceData} + */ + setMediaArtist (artist) { + this.setParameter(MediaServiceData.KEY_MEDIA_ARTIST, artist); + return this; + } + + /** + * @return {String} + */ + getMediaArtist () { + return this.getParameter(MediaServiceData.KEY_MEDIA_ARTIST); + } + + /** + * @param {String} album - Music: The name of the current album Podcast: The name of the current podcast show + * Audiobook: The name of the current book + * @return {MediaServiceData} + */ + setMediaAlbum (album) { + this.setParameter(MediaServiceData.KEY_MEDIA_ALBUM, album); + return this; + } + + /** + * @return {String} + */ + getMediaAlbum () { + return this.getParameter(MediaServiceData.KEY_MEDIA_ALBUM); + } + + /** + * @param {String} name - Music: The name of the playlist or radio station, if the user is playing from a playlist, + * otherwise, Null Podcast: The name of the playlist, if the user is playing from a playlist, + * otherwise, Null Audiobook: Likely not applicable, possibly a collection or "playlist" of + * books + * @return {MediaServiceData} + */ + setPlaylistName (name) { + this.setParameter(MediaServiceData.KEY_PLAYLIST_NAME, name); + return this; + } + + /** + * @return {String} + */ + getPlaylistName () { + return this.getParameter(MediaServiceData.KEY_PLAYLIST_NAME); + } + + /** + * @param {Boolean} explicit - Whether or not the content currently playing (e.g. the track, episode, or book) + * contains explicit content + * @return {MediaServiceData} + */ + setIsExplicit (explicit) { + this.setParameter(MediaServiceData.KEY_IS_EXPLICIT, explicit); + return this; + } + + /** + * @return {Boolean} + */ + getIsExplicit () { + return this.getParameter(MediaServiceData.KEY_IS_EXPLICIT); + } + + /** + * @param {Number} progress - Music: The current progress of the track in seconds Podcast: The current progress of + * the episode in seconds Audiobook: The current progress of the current segment (e.g. + * the chapter) in seconds + * @return {MediaServiceData} + */ + setTrackPlaybackProgress (progress) { + this.setParameter(MediaServiceData.KEY_TRACK_PLAYBACK_PROGRESS, progress); + return this; + } + + /** + * @return {Number} + */ + getTrackPlaybackProgress () { + return this.getParameter(MediaServiceData.KEY_TRACK_PLAYBACK_PROGRESS); + } + + /** + * @param {Number} duration - Music: The total duration of the track in seconds Podcast: The total duration of the + * episode in seconds Audiobook: The total duration of the current segment (e.g. the + * chapter) in seconds + * @return {MediaServiceData} + */ + setTrackPlaybackDuration (duration) { + this.setParameter(MediaServiceData.KEY_TRACK_PLAYBACK_DURATION, duration); + return this; + } + + /** + * @return {Number} + */ + getTrackPlaybackDuration () { + return this.getParameter(MediaServiceData.KEY_TRACK_PLAYBACK_DURATION); + } + + /** + * @param {Number} progress - Music: The current progress of the playback queue in seconds Podcast: The current + * progress of the playback queue in seconds Audiobook: The current progress of the + * playback queue (e.g. the book) in seconds + * @return {MediaServiceData} + */ + setQueuePlaybackProgress (progress) { + this.setParameter(MediaServiceData.KEY_QUEUE_PLAYBACK_PROGRESS, progress); + return this; + } + + /** + * @return {Number} + */ + getQueuePlaybackProgress () { + return this.getParameter(MediaServiceData.KEY_QUEUE_PLAYBACK_PROGRESS); + } + + /** + * @param {Number} duration - Music: The total duration of the playback queue in seconds Podcast: The total duration + * of the playback queue in seconds Audiobook: The total duration of the playback queue + * (e.g. the book) in seconds + * @return {MediaServiceData} + */ + setQueuePlaybackDuration (duration) { + this.setParameter(MediaServiceData.KEY_QUEUE_PLAYBACK_DURATION, duration); + return this; + } + + /** + * @return {Number} + */ + getQueuePlaybackDuration () { + return this.getParameter(MediaServiceData.KEY_QUEUE_PLAYBACK_DURATION); + } + + /** + * @param {Number} number - Music: The current number (1 based) of the track in the playback queue Podcast: The + * current number (1 based) of the episode in the playback queue Audiobook: The current + * number (1 based) of the episode in the playback queue (e.g. the chapter number in the + * book) + * @return {MediaServiceData} + */ + setQueueCurrentTrackNumber (number) { + this.setParameter(MediaServiceData.KEY_QUEUE_CURRENT_TRACK_NUMBER, number); + return this; + } + + /** + * @return {Number} + */ + getQueueCurrentTrackNumber () { + return this.getParameter(MediaServiceData.KEY_QUEUE_CURRENT_TRACK_NUMBER); + } + + /** + * @param {Number} count - Music: The total number of tracks in the playback queue Podcast: The total number of + * episodes in the playback queue Audiobook: The total number of sections in the playback + * queue (e.g. the number of chapters in the book) + * @return {MediaServiceData} + */ + setQueueTotalTrackCount (count) { + this.setParameter(MediaServiceData.KEY_QUEUE_TOTAL_TRACK_COUNT, count); + return this; + } + + /** + * @return {Number} + */ + getQueueTotalTrackCount () { + return this.getParameter(MediaServiceData.KEY_QUEUE_TOTAL_TRACK_COUNT); + } + + /** + * @param {Image} image - Music: The album art of the current track Podcast: The podcast or chapter artwork of the + * current podcast episode Audiobook: The book or chapter artwork of the current audiobook + * @return {MediaServiceData} + */ + setMediaImage (image) { + this.validateType(Image, image); + this.setParameter(MediaServiceData.KEY_MEDIA_IMAGE, image); + return this; + } + + /** + * @return {Image} + */ + getMediaImage () { + return this.getObject(Image, MediaServiceData.KEY_MEDIA_IMAGE); + } +} + +MediaServiceData.KEY_MEDIA_TYPE = 'mediaType'; +MediaServiceData.KEY_MEDIA_TITLE = 'mediaTitle'; +MediaServiceData.KEY_MEDIA_ARTIST = 'mediaArtist'; +MediaServiceData.KEY_MEDIA_ALBUM = 'mediaAlbum'; +MediaServiceData.KEY_PLAYLIST_NAME = 'playlistName'; +MediaServiceData.KEY_IS_EXPLICIT = 'isExplicit'; +MediaServiceData.KEY_TRACK_PLAYBACK_PROGRESS = 'trackPlaybackProgress'; +MediaServiceData.KEY_TRACK_PLAYBACK_DURATION = 'trackPlaybackDuration'; +MediaServiceData.KEY_QUEUE_PLAYBACK_PROGRESS = 'queuePlaybackProgress'; +MediaServiceData.KEY_QUEUE_PLAYBACK_DURATION = 'queuePlaybackDuration'; +MediaServiceData.KEY_QUEUE_CURRENT_TRACK_NUMBER = 'queueCurrentTrackNumber'; +MediaServiceData.KEY_QUEUE_TOTAL_TRACK_COUNT = 'queueTotalTrackCount'; +MediaServiceData.KEY_MEDIA_IMAGE = 'mediaImage'; + +export { MediaServiceData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/MediaServiceManifest.js b/lib/js/src/rpc/structs/MediaServiceManifest.js new file mode 100644 index 00000000..5d12776e --- /dev/null +++ b/lib/js/src/rpc/structs/MediaServiceManifest.js @@ -0,0 +1,46 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; + +class MediaServiceManifest extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } +} + + +export { MediaServiceManifest }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/MenuParams.js b/lib/js/src/rpc/structs/MenuParams.js index 17a89187..fe68f6fc 100644 --- a/lib/js/src/rpc/structs/MenuParams.js +++ b/lib/js/src/rpc/structs/MenuParams.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -34,63 +35,67 @@ import { RpcStruct } from '../RpcStruct.js'; class MenuParams extends RpcStruct { /** - * @constructor - */ + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {Number} id - * @return {MenuParams} - */ + * @param {Number} id - unique ID of the sub menu, the command will be added to. If not provided, it will be + * provided to the top level of the in application menu. + * @return {MenuParams} + */ setParentID (id) { this.setParameter(MenuParams.KEY_PARENT_ID, id); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getParentID () { return this.getParameter(MenuParams.KEY_PARENT_ID); } /** - * @param {Number} position - * @return {MenuParams} - */ + * @param {Number} position - Position within the items that are are at top level of the in application menu. 0 will + * insert at the front. 1 will insert at the second position. if position is greater or + * equal than the number of items on top level, the sub menu will be appended to the end. + * If this param was omitted the entry will be added at the end. + * @return {MenuParams} + */ setPosition (position) { this.setParameter(MenuParams.KEY_POSITION, position); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getPosition () { return this.getParameter(MenuParams.KEY_POSITION); } /** - * @param {String} menuName - * @return {MenuParams} - */ - setMenuName (menuName) { - this.setParameter(MenuParams.KEY_MENU_NAME, menuName); + * @param {String} name - Text to show in the menu for this sub menu. + * @return {MenuParams} + */ + setMenuName (name) { + this.setParameter(MenuParams.KEY_MENU_NAME, name); return this; } /** - * @param {String} - */ + * @return {String} + */ getMenuName () { return this.getParameter(MenuParams.KEY_MENU_NAME); } } MenuParams.KEY_PARENT_ID = 'parentID'; -MenuParams.KEY_POSITION = 'position'; +MenuParams.KEY_POSITION = 'position'; MenuParams.KEY_MENU_NAME = 'menuName'; -export { MenuParams }; +export { MenuParams }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/MetadataTags.js b/lib/js/src/rpc/structs/MetadataTags.js index 66bd7ea0..34a13d93 100644 --- a/lib/js/src/rpc/structs/MetadataTags.js +++ b/lib/js/src/rpc/structs/MetadataTags.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -35,72 +36,76 @@ import { MetadataType } from '../enums/MetadataType.js'; class MetadataTags extends RpcStruct { /** - * @constructor - */ + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {Array} mainField1 - * @return {MetadataTags} - */ - setMainField1 (mainField1) { - this.setParameter(MetadataTags.KEY_MAIN_FIELD_1, mainField1); + * @param {MetadataType[]} field1 - The type of data contained in the "mainField1" text field. + * @return {MetadataTags} + */ + setMainField1 (field1) { + this.validateType(MetadataType, field1, true); + this.setParameter(MetadataTags.KEY_MAIN_FIELD_1, field1); return this; } /** - * @return {Array} - */ + * @return {MetadataType[]} + */ getMainField1 () { return this.getObject(MetadataType, MetadataTags.KEY_MAIN_FIELD_1); } /** - * @param {Array} mainField2 - * @return {MetadataTags} - */ - setMainField2 (mainField2) { - this.setParameter(MetadataTags.KEY_MAIN_FIELD_2, mainField2); + * @param {MetadataType[]} field2 - The type of data contained in the "mainField2" text field. + * @return {MetadataTags} + */ + setMainField2 (field2) { + this.validateType(MetadataType, field2, true); + this.setParameter(MetadataTags.KEY_MAIN_FIELD_2, field2); return this; } /** - * @return {Array} - */ + * @return {MetadataType[]} + */ getMainField2 () { return this.getObject(MetadataType, MetadataTags.KEY_MAIN_FIELD_2); } /** - * @param {Array} mainField3 - * @return {MetadataTags} - */ - setMainField3 (mainField3) { - this.setParameter(MetadataTags.KEY_MAIN_FIELD_3, mainField3); + * @param {MetadataType[]} field3 - The type of data contained in the "mainField3" text field. + * @return {MetadataTags} + */ + setMainField3 (field3) { + this.validateType(MetadataType, field3, true); + this.setParameter(MetadataTags.KEY_MAIN_FIELD_3, field3); return this; } /** - * @return {Array} - */ + * @return {MetadataType[]} + */ getMainField3 () { return this.getObject(MetadataType, MetadataTags.KEY_MAIN_FIELD_3); } /** - * @param {Array} mainField4 - * @return {MetadataTags} - */ - setMainField4 (mainField4) { - this.setParameter(MetadataTags.KEY_MAIN_FIELD_4, mainField4); + * @param {MetadataType[]} field4 - The type of data contained in the "mainField4" text field. + * @return {MetadataTags} + */ + setMainField4 (field4) { + this.validateType(MetadataType, field4, true); + this.setParameter(MetadataTags.KEY_MAIN_FIELD_4, field4); return this; } /** - * @return {Array} - */ + * @return {MetadataType[]} + */ getMainField4 () { return this.getObject(MetadataType, MetadataTags.KEY_MAIN_FIELD_4); } @@ -111,4 +116,4 @@ MetadataTags.KEY_MAIN_FIELD_2 = 'mainField2'; MetadataTags.KEY_MAIN_FIELD_3 = 'mainField3'; MetadataTags.KEY_MAIN_FIELD_4 = 'mainField4'; -export { MetadataTags }; +export { MetadataTags }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/ModuleData.js b/lib/js/src/rpc/structs/ModuleData.js new file mode 100644 index 00000000..4ac7f92d --- /dev/null +++ b/lib/js/src/rpc/structs/ModuleData.js @@ -0,0 +1,200 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { HMISettingsControlData } from './HMISettingsControlData.js'; +import { RadioControlData } from './RadioControlData.js'; +import { ModuleType } from '../enums/ModuleType.js'; +import { ClimateControlData } from './ClimateControlData.js'; +import { AudioControlData } from './AudioControlData.js'; +import { SeatControlData } from './SeatControlData.js'; +import { RpcStruct } from '../RpcStruct.js'; +import { LightControlData } from './LightControlData.js'; + +/** + * The moduleType indicates which type of data should be changed and identifies which data object exists in this + * struct. For example, if the moduleType is CLIMATE then a "climateControlData" should exist + */ +class ModuleData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {ModuleType} type + * @return {ModuleData} + */ + setModuleType (type) { + this.validateType(ModuleType, type); + this.setParameter(ModuleData.KEY_MODULE_TYPE, type); + return this; + } + + /** + * @return {ModuleType} + */ + getModuleType () { + return this.getObject(ModuleType, ModuleData.KEY_MODULE_TYPE); + } + + /** + * @param {String} id - Id of a module, published by System Capability. + * @return {ModuleData} + */ + setModuleId (id) { + this.setParameter(ModuleData.KEY_MODULE_ID, id); + return this; + } + + /** + * @return {String} + */ + getModuleId () { + return this.getParameter(ModuleData.KEY_MODULE_ID); + } + + /** + * @param {RadioControlData} data + * @return {ModuleData} + */ + setRadioControlData (data) { + this.validateType(RadioControlData, data); + this.setParameter(ModuleData.KEY_RADIO_CONTROL_DATA, data); + return this; + } + + /** + * @return {RadioControlData} + */ + getRadioControlData () { + return this.getObject(RadioControlData, ModuleData.KEY_RADIO_CONTROL_DATA); + } + + /** + * @param {ClimateControlData} data + * @return {ModuleData} + */ + setClimateControlData (data) { + this.validateType(ClimateControlData, data); + this.setParameter(ModuleData.KEY_CLIMATE_CONTROL_DATA, data); + return this; + } + + /** + * @return {ClimateControlData} + */ + getClimateControlData () { + return this.getObject(ClimateControlData, ModuleData.KEY_CLIMATE_CONTROL_DATA); + } + + /** + * @param {SeatControlData} data - Seat control data corresponds to "SEAT" ModuleType. + * @return {ModuleData} + */ + setSeatControlData (data) { + this.validateType(SeatControlData, data); + this.setParameter(ModuleData.KEY_SEAT_CONTROL_DATA, data); + return this; + } + + /** + * @return {SeatControlData} + */ + getSeatControlData () { + return this.getObject(SeatControlData, ModuleData.KEY_SEAT_CONTROL_DATA); + } + + /** + * @param {AudioControlData} data + * @return {ModuleData} + */ + setAudioControlData (data) { + this.validateType(AudioControlData, data); + this.setParameter(ModuleData.KEY_AUDIO_CONTROL_DATA, data); + return this; + } + + /** + * @return {AudioControlData} + */ + getAudioControlData () { + return this.getObject(AudioControlData, ModuleData.KEY_AUDIO_CONTROL_DATA); + } + + /** + * @param {LightControlData} data + * @return {ModuleData} + */ + setLightControlData (data) { + this.validateType(LightControlData, data); + this.setParameter(ModuleData.KEY_LIGHT_CONTROL_DATA, data); + return this; + } + + /** + * @return {LightControlData} + */ + getLightControlData () { + return this.getObject(LightControlData, ModuleData.KEY_LIGHT_CONTROL_DATA); + } + + /** + * @param {HMISettingsControlData} data - Corresponds to "HMI_SETTINGS" ModuleType + * @return {ModuleData} + */ + setHmiSettingsControlData (data) { + this.validateType(HMISettingsControlData, data); + this.setParameter(ModuleData.KEY_HMI_SETTINGS_CONTROL_DATA, data); + return this; + } + + /** + * @return {HMISettingsControlData} + */ + getHmiSettingsControlData () { + return this.getObject(HMISettingsControlData, ModuleData.KEY_HMI_SETTINGS_CONTROL_DATA); + } +} + +ModuleData.KEY_MODULE_TYPE = 'moduleType'; +ModuleData.KEY_MODULE_ID = 'moduleId'; +ModuleData.KEY_RADIO_CONTROL_DATA = 'radioControlData'; +ModuleData.KEY_CLIMATE_CONTROL_DATA = 'climateControlData'; +ModuleData.KEY_SEAT_CONTROL_DATA = 'seatControlData'; +ModuleData.KEY_AUDIO_CONTROL_DATA = 'audioControlData'; +ModuleData.KEY_LIGHT_CONTROL_DATA = 'lightControlData'; +ModuleData.KEY_HMI_SETTINGS_CONTROL_DATA = 'hmiSettingsControlData'; + +export { ModuleData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/ModuleInfo.js b/lib/js/src/rpc/structs/ModuleInfo.js index 692b2d0f..7817315c 100644 --- a/lib/js/src/rpc/structs/ModuleInfo.js +++ b/lib/js/src/rpc/structs/ModuleInfo.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -33,76 +34,79 @@ import { RpcStruct } from '../RpcStruct.js'; import { Grid } from './Grid.js'; +/** + * Information about a RC module + */ class ModuleInfo extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {String} moduleId - * @return {ModuleInfo} - */ - setModuleId (moduleId) { - this.setParameter(ModuleInfo.KEY_MODULE_ID, moduleId); + * @param {String} id - uuid of a module. "moduleId + moduleType" uniquely identify a module. + * @return {ModuleInfo} + */ + setModuleId (id) { + this.setParameter(ModuleInfo.KEY_MODULE_ID, id); return this; } /** - * @return {String} - */ + * @return {String} + */ getModuleId () { return this.getParameter(ModuleInfo.KEY_MODULE_ID); } - /** - * @param {Grid} location - * @return {ModuleInfo} - */ + * @param {Grid} location - Location of a module. + * @return {ModuleInfo} + */ setLocation (location) { this.validateType(Grid, location); - this.setParameter(ModuleInfo.KEY_LOCATION, location); return this; } /** - * @return {Grid} - */ + * @return {Grid} + */ getLocation () { return this.getObject(Grid, ModuleInfo.KEY_LOCATION); } /** - * @param {Grid} serviceArea - * @return {ModuleInfo} - */ - setServiceArea (serviceArea) { - this.validateType(Grid, serviceArea); - - this.setParameter(ModuleInfo.KEY_SERVICE_AREA, serviceArea); + * @param {Grid} area - Service area of a module. + * @return {ModuleInfo} + */ + setServiceArea (area) { + this.validateType(Grid, area); + this.setParameter(ModuleInfo.KEY_SERVICE_AREA, area); return this; } /** - * @return {Grid} - */ + * @return {Grid} + */ getServiceArea () { return this.getObject(Grid, ModuleInfo.KEY_SERVICE_AREA); } /** - * @param {Boolean} allowMultipleAccess - * @return {ModuleInfo} - */ - setAllowMultipleAccess (allowMultipleAccess) { - this.setParameter(ModuleInfo.KEY_ALLOW_MULTIPLE_ACCESS, allowMultipleAccess); + * @param {Boolean} access - allow multiple users/apps to access the module or not + * @return {ModuleInfo} + */ + setAllowMultipleAccess (access) { + this.setParameter(ModuleInfo.KEY_ALLOW_MULTIPLE_ACCESS, access); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getAllowMultipleAccess () { return this.getParameter(ModuleInfo.KEY_ALLOW_MULTIPLE_ACCESS); } @@ -113,4 +117,4 @@ ModuleInfo.KEY_LOCATION = 'location'; ModuleInfo.KEY_SERVICE_AREA = 'serviceArea'; ModuleInfo.KEY_ALLOW_MULTIPLE_ACCESS = 'allowMultipleAccess'; -export { ModuleInfo }; +export { ModuleInfo }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/MyKey.js b/lib/js/src/rpc/structs/MyKey.js new file mode 100644 index 00000000..de0069bf --- /dev/null +++ b/lib/js/src/rpc/structs/MyKey.js @@ -0,0 +1,66 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { VehicleDataStatus } from '../enums/VehicleDataStatus.js'; + +class MyKey extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {VehicleDataStatus} e911override - Indicates whether e911 override is on. References signal + * "MyKey_e911Override_St". See VehicleDataStatus. + * @return {MyKey} + */ + setE911Override (e911override) { + this.validateType(VehicleDataStatus, e911override); + this.setParameter(MyKey.KEY_E911OVERRIDE, e911override); + return this; + } + + /** + * @return {VehicleDataStatus} + */ + getE911Override () { + return this.getObject(VehicleDataStatus, MyKey.KEY_E911OVERRIDE); + } +} + +MyKey.KEY_E911OVERRIDE = 'e911Override'; + +export { MyKey }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/NavigationCapability.js b/lib/js/src/rpc/structs/NavigationCapability.js new file mode 100644 index 00000000..5051abdf --- /dev/null +++ b/lib/js/src/rpc/structs/NavigationCapability.js @@ -0,0 +1,83 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; + +/** + * Extended capabilities for an onboard navigation system + */ +class NavigationCapability extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Boolean} enabled - If the module has the ability to add locations to the onboard nav + * @return {NavigationCapability} + */ + setSendLocationEnabled (enabled) { + this.setParameter(NavigationCapability.KEY_SEND_LOCATION_ENABLED, enabled); + return this; + } + + /** + * @return {Boolean} + */ + getSendLocationEnabled () { + return this.getParameter(NavigationCapability.KEY_SEND_LOCATION_ENABLED); + } + + /** + * @param {Boolean} enabled - If the module has the ability to return way points from onboard nav + * @return {NavigationCapability} + */ + setGetWayPointsEnabled (enabled) { + this.setParameter(NavigationCapability.KEY_GET_WAY_POINTS_ENABLED, enabled); + return this; + } + + /** + * @return {Boolean} + */ + getGetWayPointsEnabled () { + return this.getParameter(NavigationCapability.KEY_GET_WAY_POINTS_ENABLED); + } +} + +NavigationCapability.KEY_SEND_LOCATION_ENABLED = 'sendLocationEnabled'; +NavigationCapability.KEY_GET_WAY_POINTS_ENABLED = 'getWayPointsEnabled'; + +export { NavigationCapability }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/NavigationInstruction.js b/lib/js/src/rpc/structs/NavigationInstruction.js new file mode 100644 index 00000000..aba2eaf8 --- /dev/null +++ b/lib/js/src/rpc/structs/NavigationInstruction.js @@ -0,0 +1,200 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Image } from './Image.js'; +import { DateTime } from './DateTime.js'; +import { RpcStruct } from '../RpcStruct.js'; +import { NavigationJunction } from '../enums/NavigationJunction.js'; +import { Direction } from '../enums/Direction.js'; +import { LocationDetails } from './LocationDetails.js'; +import { NavigationAction } from '../enums/NavigationAction.js'; + +class NavigationInstruction extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {LocationDetails} details + * @return {NavigationInstruction} + */ + setLocationDetails (details) { + this.validateType(LocationDetails, details); + this.setParameter(NavigationInstruction.KEY_LOCATION_DETAILS, details); + return this; + } + + /** + * @return {LocationDetails} + */ + getLocationDetails () { + return this.getObject(LocationDetails, NavigationInstruction.KEY_LOCATION_DETAILS); + } + + /** + * @param {NavigationAction} action + * @return {NavigationInstruction} + */ + setAction (action) { + this.validateType(NavigationAction, action); + this.setParameter(NavigationInstruction.KEY_ACTION, action); + return this; + } + + /** + * @return {NavigationAction} + */ + getAction () { + return this.getObject(NavigationAction, NavigationInstruction.KEY_ACTION); + } + + /** + * @param {DateTime} eta + * @return {NavigationInstruction} + */ + setEta (eta) { + this.validateType(DateTime, eta); + this.setParameter(NavigationInstruction.KEY_ETA, eta); + return this; + } + + /** + * @return {DateTime} + */ + getEta () { + return this.getObject(DateTime, NavigationInstruction.KEY_ETA); + } + + /** + * @param {Number} bearing - The angle at which this instruction takes place. For example, 0 would mean straight, + * less than 45 is bearing right, greater than 135 is sharp right, between 45 and 135 is a + * regular right, and 180 is a U-Turn, etc. + * @return {NavigationInstruction} + */ + setBearing (bearing) { + this.setParameter(NavigationInstruction.KEY_BEARING, bearing); + return this; + } + + /** + * @return {Number} + */ + getBearing () { + return this.getParameter(NavigationInstruction.KEY_BEARING); + } + + /** + * @param {NavigationJunction} type + * @return {NavigationInstruction} + */ + setJunctionType (type) { + this.validateType(NavigationJunction, type); + this.setParameter(NavigationInstruction.KEY_JUNCTION_TYPE, type); + return this; + } + + /** + * @return {NavigationJunction} + */ + getJunctionType () { + return this.getObject(NavigationJunction, NavigationInstruction.KEY_JUNCTION_TYPE); + } + + /** + * @param {Direction} side - Used to infer which side of the road this instruction takes place. For a U-Turn + * (action=TURN, bearing=180) this will determine which direction the turn should take + * place. + * @return {NavigationInstruction} + */ + setDrivingSide (side) { + this.validateType(Direction, side); + this.setParameter(NavigationInstruction.KEY_DRIVING_SIDE, side); + return this; + } + + /** + * @return {Direction} + */ + getDrivingSide () { + return this.getObject(Direction, NavigationInstruction.KEY_DRIVING_SIDE); + } + + /** + * @param {String} details - This is a string representation of this instruction, used to display instructions to + * the users. This is not intended to be read aloud to the users, see the param prompt in + * NavigationServiceData for that. + * @return {NavigationInstruction} + */ + setDetails (details) { + this.setParameter(NavigationInstruction.KEY_DETAILS, details); + return this; + } + + /** + * @return {String} + */ + getDetails () { + return this.getParameter(NavigationInstruction.KEY_DETAILS); + } + + /** + * @param {Image} image - An image representation of this instruction. + * @return {NavigationInstruction} + */ + setImage (image) { + this.validateType(Image, image); + this.setParameter(NavigationInstruction.KEY_IMAGE, image); + return this; + } + + /** + * @return {Image} + */ + getImage () { + return this.getObject(Image, NavigationInstruction.KEY_IMAGE); + } +} + +NavigationInstruction.KEY_LOCATION_DETAILS = 'locationDetails'; +NavigationInstruction.KEY_ACTION = 'action'; +NavigationInstruction.KEY_ETA = 'eta'; +NavigationInstruction.KEY_BEARING = 'bearing'; +NavigationInstruction.KEY_JUNCTION_TYPE = 'junctionType'; +NavigationInstruction.KEY_DRIVING_SIDE = 'drivingSide'; +NavigationInstruction.KEY_DETAILS = 'details'; +NavigationInstruction.KEY_IMAGE = 'image'; + +export { NavigationInstruction }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/NavigationServiceData.js b/lib/js/src/rpc/structs/NavigationServiceData.js new file mode 100644 index 00000000..1046e16a --- /dev/null +++ b/lib/js/src/rpc/structs/NavigationServiceData.js @@ -0,0 +1,218 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { DateTime } from './DateTime.js'; +import { LocationDetails } from './LocationDetails.js'; +import { RpcStruct } from '../RpcStruct.js'; +import { NavigationInstruction } from './NavigationInstruction.js'; + +/** + * This data is related to what a navigation service would provide. + */ +class NavigationServiceData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {DateTime} stamp - This is the timestamp of when the data was generated. This is to ensure any time or + * distance given in the data can accurately be adjusted if necessary. + * @return {NavigationServiceData} + */ + setTimeStamp (stamp) { + this.validateType(DateTime, stamp); + this.setParameter(NavigationServiceData.KEY_TIME_STAMP, stamp); + return this; + } + + /** + * @return {DateTime} + */ + getTimeStamp () { + return this.getObject(DateTime, NavigationServiceData.KEY_TIME_STAMP); + } + + /** + * @param {LocationDetails} origin + * @return {NavigationServiceData} + */ + setOrigin (origin) { + this.validateType(LocationDetails, origin); + this.setParameter(NavigationServiceData.KEY_ORIGIN, origin); + return this; + } + + /** + * @return {LocationDetails} + */ + getOrigin () { + return this.getObject(LocationDetails, NavigationServiceData.KEY_ORIGIN); + } + + /** + * @param {LocationDetails} destination + * @return {NavigationServiceData} + */ + setDestination (destination) { + this.validateType(LocationDetails, destination); + this.setParameter(NavigationServiceData.KEY_DESTINATION, destination); + return this; + } + + /** + * @return {LocationDetails} + */ + getDestination () { + return this.getObject(LocationDetails, NavigationServiceData.KEY_DESTINATION); + } + + /** + * @param {DateTime} eta + * @return {NavigationServiceData} + */ + setDestinationETA (eta) { + this.validateType(DateTime, eta); + this.setParameter(NavigationServiceData.KEY_DESTINATION_ETA, eta); + return this; + } + + /** + * @return {DateTime} + */ + getDestinationETA () { + return this.getObject(DateTime, NavigationServiceData.KEY_DESTINATION_ETA); + } + + /** + * @param {NavigationInstruction[]} instructions - This array should be ordered with all remaining instructions. The + * start of this array should always contain the next instruction. + * @return {NavigationServiceData} + */ + setInstructions (instructions) { + this.validateType(NavigationInstruction, instructions, true); + this.setParameter(NavigationServiceData.KEY_INSTRUCTIONS, instructions); + return this; + } + + /** + * @return {NavigationInstruction[]} + */ + getInstructions () { + return this.getObject(NavigationInstruction, NavigationServiceData.KEY_INSTRUCTIONS); + } + + /** + * @param {DateTime} eta + * @return {NavigationServiceData} + */ + setNextInstructionETA (eta) { + this.validateType(DateTime, eta); + this.setParameter(NavigationServiceData.KEY_NEXT_INSTRUCTION_ETA, eta); + return this; + } + + /** + * @return {DateTime} + */ + getNextInstructionETA () { + return this.getObject(DateTime, NavigationServiceData.KEY_NEXT_INSTRUCTION_ETA); + } + + /** + * @param {Number} distance - The distance to this instruction from current location. This should only be updated + * ever .1 unit of distance. For more accuracy the consumer can use the GPS location of + * itself and the next instruction. + * @return {NavigationServiceData} + */ + setNextInstructionDistance (distance) { + this.setParameter(NavigationServiceData.KEY_NEXT_INSTRUCTION_DISTANCE, distance); + return this; + } + + /** + * @return {Number} + */ + getNextInstructionDistance () { + return this.getParameter(NavigationServiceData.KEY_NEXT_INSTRUCTION_DISTANCE); + } + + /** + * @param {Number} scale - Distance till next maneuver (starting from) from previous maneuver. + * @return {NavigationServiceData} + */ + setNextInstructionDistanceScale (scale) { + this.setParameter(NavigationServiceData.KEY_NEXT_INSTRUCTION_DISTANCE_SCALE, scale); + return this; + } + + /** + * @return {Number} + */ + getNextInstructionDistanceScale () { + return this.getParameter(NavigationServiceData.KEY_NEXT_INSTRUCTION_DISTANCE_SCALE); + } + + /** + * @param {String} prompt - This is a prompt message that should be conveyed to the user through either display or + * voice (TTS). This param will change often as it should represent the following: + * approaching instruction, post instruction, alerts that affect the current navigation + * session, etc. + * @return {NavigationServiceData} + */ + setPrompt (prompt) { + this.setParameter(NavigationServiceData.KEY_PROMPT, prompt); + return this; + } + + /** + * @return {String} + */ + getPrompt () { + return this.getParameter(NavigationServiceData.KEY_PROMPT); + } +} + +NavigationServiceData.KEY_TIME_STAMP = 'timeStamp'; +NavigationServiceData.KEY_ORIGIN = 'origin'; +NavigationServiceData.KEY_DESTINATION = 'destination'; +NavigationServiceData.KEY_DESTINATION_ETA = 'destinationETA'; +NavigationServiceData.KEY_INSTRUCTIONS = 'instructions'; +NavigationServiceData.KEY_NEXT_INSTRUCTION_ETA = 'nextInstructionETA'; +NavigationServiceData.KEY_NEXT_INSTRUCTION_DISTANCE = 'nextInstructionDistance'; +NavigationServiceData.KEY_NEXT_INSTRUCTION_DISTANCE_SCALE = 'nextInstructionDistanceScale'; +NavigationServiceData.KEY_PROMPT = 'prompt'; + +export { NavigationServiceData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/NavigationServiceManifest.js b/lib/js/src/rpc/structs/NavigationServiceManifest.js new file mode 100644 index 00000000..31ceabb2 --- /dev/null +++ b/lib/js/src/rpc/structs/NavigationServiceManifest.js @@ -0,0 +1,63 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; + +class NavigationServiceManifest extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Boolean} points - Informs the subscriber if this service can actually accept way points. + * @return {NavigationServiceManifest} + */ + setAcceptsWayPoints (points) { + this.setParameter(NavigationServiceManifest.KEY_ACCEPTS_WAY_POINTS, points); + return this; + } + + /** + * @return {Boolean} + */ + getAcceptsWayPoints () { + return this.getParameter(NavigationServiceManifest.KEY_ACCEPTS_WAY_POINTS); + } +} + +NavigationServiceManifest.KEY_ACCEPTS_WAY_POINTS = 'acceptsWayPoints'; + +export { NavigationServiceManifest }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/OASISAddress.js b/lib/js/src/rpc/structs/OASISAddress.js new file mode 100644 index 00000000..1bc522fa --- /dev/null +++ b/lib/js/src/rpc/structs/OASISAddress.js @@ -0,0 +1,199 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; + +class OASISAddress extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} name - Name of the country (localized) + * @return {OASISAddress} + */ + setCountryName (name) { + this.setParameter(OASISAddress.KEY_COUNTRY_NAME, name); + return this; + } + + /** + * @return {String} + */ + getCountryName () { + return this.getParameter(OASISAddress.KEY_COUNTRY_NAME); + } + + /** + * @param {String} code - Name of country (ISO 3166-2) + * @return {OASISAddress} + */ + setCountryCode (code) { + this.setParameter(OASISAddress.KEY_COUNTRY_CODE, code); + return this; + } + + /** + * @return {String} + */ + getCountryCode () { + return this.getParameter(OASISAddress.KEY_COUNTRY_CODE); + } + + /** + * @param {String} code - (PLZ, ZIP, PIN, CAP etc.) + * @return {OASISAddress} + */ + setPostalCode (code) { + this.setParameter(OASISAddress.KEY_POSTAL_CODE, code); + return this; + } + + /** + * @return {String} + */ + getPostalCode () { + return this.getParameter(OASISAddress.KEY_POSTAL_CODE); + } + + /** + * @param {String} area - Portion of country (e.g. state) + * @return {OASISAddress} + */ + setAdministrativeArea (area) { + this.setParameter(OASISAddress.KEY_ADMINISTRATIVE_AREA, area); + return this; + } + + /** + * @return {String} + */ + getAdministrativeArea () { + return this.getParameter(OASISAddress.KEY_ADMINISTRATIVE_AREA); + } + + /** + * @param {String} area - Portion of e.g. state (e.g. county) + * @return {OASISAddress} + */ + setSubAdministrativeArea (area) { + this.setParameter(OASISAddress.KEY_SUB_ADMINISTRATIVE_AREA, area); + return this; + } + + /** + * @return {String} + */ + getSubAdministrativeArea () { + return this.getParameter(OASISAddress.KEY_SUB_ADMINISTRATIVE_AREA); + } + + /** + * @param {String} locality - Hypernym for e.g. city/village + * @return {OASISAddress} + */ + setLocality (locality) { + this.setParameter(OASISAddress.KEY_LOCALITY, locality); + return this; + } + + /** + * @return {String} + */ + getLocality () { + return this.getParameter(OASISAddress.KEY_LOCALITY); + } + + /** + * @param {String} locality - Hypernym for e.g. district + * @return {OASISAddress} + */ + setSubLocality (locality) { + this.setParameter(OASISAddress.KEY_SUB_LOCALITY, locality); + return this; + } + + /** + * @return {String} + */ + getSubLocality () { + return this.getParameter(OASISAddress.KEY_SUB_LOCALITY); + } + + /** + * @param {String} thoroughfare - Hypernym for street, road etc. + * @return {OASISAddress} + */ + setThoroughfare (thoroughfare) { + this.setParameter(OASISAddress.KEY_THOROUGHFARE, thoroughfare); + return this; + } + + /** + * @return {String} + */ + getThoroughfare () { + return this.getParameter(OASISAddress.KEY_THOROUGHFARE); + } + + /** + * @param {String} thoroughfare - Portion of thoroughfare e.g. house number + * @return {OASISAddress} + */ + setSubThoroughfare (thoroughfare) { + this.setParameter(OASISAddress.KEY_SUB_THOROUGHFARE, thoroughfare); + return this; + } + + /** + * @return {String} + */ + getSubThoroughfare () { + return this.getParameter(OASISAddress.KEY_SUB_THOROUGHFARE); + } +} + +OASISAddress.KEY_COUNTRY_NAME = 'countryName'; +OASISAddress.KEY_COUNTRY_CODE = 'countryCode'; +OASISAddress.KEY_POSTAL_CODE = 'postalCode'; +OASISAddress.KEY_ADMINISTRATIVE_AREA = 'administrativeArea'; +OASISAddress.KEY_SUB_ADMINISTRATIVE_AREA = 'subAdministrativeArea'; +OASISAddress.KEY_LOCALITY = 'locality'; +OASISAddress.KEY_SUB_LOCALITY = 'subLocality'; +OASISAddress.KEY_THOROUGHFARE = 'thoroughfare'; +OASISAddress.KEY_SUB_THOROUGHFARE = 'subThoroughfare'; + +export { OASISAddress }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/ParameterPermissions.js b/lib/js/src/rpc/structs/ParameterPermissions.js new file mode 100644 index 00000000..d2cfbd3d --- /dev/null +++ b/lib/js/src/rpc/structs/ParameterPermissions.js @@ -0,0 +1,80 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; + +class ParameterPermissions extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String[]} allowed - A set of all parameters that are permitted for this given RPC. + * @return {ParameterPermissions} + */ + setAllowed (allowed) { + this.setParameter(ParameterPermissions.KEY_ALLOWED, allowed); + return this; + } + + /** + * @return {String[]} + */ + getAllowed () { + return this.getParameter(ParameterPermissions.KEY_ALLOWED); + } + + /** + * @param {String[]} disallowed - A set of all parameters that are prohibited for this given RPC. + * @return {ParameterPermissions} + */ + setUserDisallowed (disallowed) { + this.setParameter(ParameterPermissions.KEY_USER_DISALLOWED, disallowed); + return this; + } + + /** + * @return {String[]} + */ + getUserDisallowed () { + return this.getParameter(ParameterPermissions.KEY_USER_DISALLOWED); + } +} + +ParameterPermissions.KEY_ALLOWED = 'allowed'; +ParameterPermissions.KEY_USER_DISALLOWED = 'userDisallowed'; + +export { ParameterPermissions }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/PermissionItem.js b/lib/js/src/rpc/structs/PermissionItem.js new file mode 100644 index 00000000..999946c6 --- /dev/null +++ b/lib/js/src/rpc/structs/PermissionItem.js @@ -0,0 +1,118 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { HMIPermissions } from './HMIPermissions.js'; +import { ParameterPermissions } from './ParameterPermissions.js'; + +class PermissionItem extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} name - Name of the individual RPC in the policy table. + * @return {PermissionItem} + */ + setRpcName (name) { + this.setParameter(PermissionItem.KEY_RPC_NAME, name); + return this; + } + + /** + * @return {String} + */ + getRpcName () { + return this.getParameter(PermissionItem.KEY_RPC_NAME); + } + + /** + * @param {HMIPermissions} permissions + * @return {PermissionItem} + */ + setHmiPermissions (permissions) { + this.validateType(HMIPermissions, permissions); + this.setParameter(PermissionItem.KEY_HMI_PERMISSIONS, permissions); + return this; + } + + /** + * @return {HMIPermissions} + */ + getHmiPermissions () { + return this.getObject(HMIPermissions, PermissionItem.KEY_HMI_PERMISSIONS); + } + + /** + * @param {ParameterPermissions} permissions + * @return {PermissionItem} + */ + setParameterPermissions (permissions) { + this.validateType(ParameterPermissions, permissions); + this.setParameter(PermissionItem.KEY_PARAMETER_PERMISSIONS, permissions); + return this; + } + + /** + * @return {ParameterPermissions} + */ + getParameterPermissions () { + return this.getObject(ParameterPermissions, PermissionItem.KEY_PARAMETER_PERMISSIONS); + } + + /** + * @param {Boolean} encryption + * @return {PermissionItem} + */ + setRequireEncryption (encryption) { + this.setParameter(PermissionItem.KEY_REQUIRE_ENCRYPTION, encryption); + return this; + } + + /** + * @return {Boolean} + */ + getRequireEncryption () { + return this.getParameter(PermissionItem.KEY_REQUIRE_ENCRYPTION); + } +} + +PermissionItem.KEY_RPC_NAME = 'rpcName'; +PermissionItem.KEY_HMI_PERMISSIONS = 'hmiPermissions'; +PermissionItem.KEY_PARAMETER_PERMISSIONS = 'parameterPermissions'; +PermissionItem.KEY_REQUIRE_ENCRYPTION = 'requireEncryption'; + +export { PermissionItem }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/PhoneCapability.js b/lib/js/src/rpc/structs/PhoneCapability.js new file mode 100644 index 00000000..735e3ec1 --- /dev/null +++ b/lib/js/src/rpc/structs/PhoneCapability.js @@ -0,0 +1,66 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; + +/** + * Extended capabilities of the module's phone feature + */ +class PhoneCapability extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Boolean} enabled - If the module has the ability to perform dial number + * @return {PhoneCapability} + */ + setDialNumberEnabled (enabled) { + this.setParameter(PhoneCapability.KEY_DIAL_NUMBER_ENABLED, enabled); + return this; + } + + /** + * @return {Boolean} + */ + getDialNumberEnabled () { + return this.getParameter(PhoneCapability.KEY_DIAL_NUMBER_ENABLED); + } +} + +PhoneCapability.KEY_DIAL_NUMBER_ENABLED = 'dialNumberEnabled'; + +export { PhoneCapability }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/PresetBankCapabilities.js b/lib/js/src/rpc/structs/PresetBankCapabilities.js index 845793c5..c13a3940 100644 --- a/lib/js/src/rpc/structs/PresetBankCapabilities.js +++ b/lib/js/src/rpc/structs/PresetBankCapabilities.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -32,23 +33,29 @@ import { RpcStruct } from '../RpcStruct.js'; +/** + * Contains information about on-screen preset capabilities. + */ class PresetBankCapabilities extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {Boolean} onScreenPresetsAvailable - * @return {PresetBankCapabilities} - */ - setOnScreenPresetsAvailable (onScreenPresetsAvailable) { - this.setParameter(PresetBankCapabilities.KEY_ON_SCREEN_PRESETS_AVAILABLE, onScreenPresetsAvailable); + * @param {Boolean} available - Onscreen custom presets are available. + * @return {PresetBankCapabilities} + */ + setOnScreenPresetsAvailable (available) { + this.setParameter(PresetBankCapabilities.KEY_ON_SCREEN_PRESETS_AVAILABLE, available); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getOnScreenPresetsAvailable () { return this.getParameter(PresetBankCapabilities.KEY_ON_SCREEN_PRESETS_AVAILABLE); } @@ -56,4 +63,4 @@ class PresetBankCapabilities extends RpcStruct { PresetBankCapabilities.KEY_ON_SCREEN_PRESETS_AVAILABLE = 'onScreenPresetsAvailable'; -export { PresetBankCapabilities }; +export { PresetBankCapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/RGBColor.js b/lib/js/src/rpc/structs/RGBColor.js index 2b4c9f94..a0d034f5 100644 --- a/lib/js/src/rpc/structs/RGBColor.js +++ b/lib/js/src/rpc/structs/RGBColor.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -33,57 +34,58 @@ import { RpcStruct } from '../RpcStruct.js'; class RGBColor extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {Number} redValue - * @return {RGBColor} - */ - setRedValue (redValue) { - this.setParameter(RGBColor.KEY_RED, redValue); + * @param {Number} red + * @return {RGBColor} + */ + setRed (red) { + this.setParameter(RGBColor.KEY_RED, red); return this; } /** - * @return {Number} - */ - getRedValue () { + * @return {Number} + */ + getRed () { return this.getParameter(RGBColor.KEY_RED); } - /** - * @param {Number} greenValue - * @return {RGBColor} - */ - setGreenValue (greenValue) { - this.setParameter(RGBColor.KEY_GREEN, greenValue); + * @param {Number} green + * @return {RGBColor} + */ + setGreen (green) { + this.setParameter(RGBColor.KEY_GREEN, green); return this; } /** - * @return {Number} - */ - getGreenValue () { + * @return {Number} + */ + getGreen () { return this.getParameter(RGBColor.KEY_GREEN); } - /** - * @param {Number} blueValue - * @return {RGBColor} - */ - setBlueValue (blueValue) { - this.setParameter(RGBColor.KEY_BLUE, blueValue); + * @param {Number} blue + * @return {RGBColor} + */ + setBlue (blue) { + this.setParameter(RGBColor.KEY_BLUE, blue); return this; } /** - * @return {Number} - */ - getBlueValue () { + * @return {Number} + */ + getBlue () { return this.getParameter(RGBColor.KEY_BLUE); } } @@ -92,4 +94,4 @@ RGBColor.KEY_RED = 'red'; RGBColor.KEY_GREEN = 'green'; RGBColor.KEY_BLUE = 'blue'; -export { RGBColor }; +export { RGBColor }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/RadioControlCapabilities.js b/lib/js/src/rpc/structs/RadioControlCapabilities.js new file mode 100644 index 00000000..bd10ddd9 --- /dev/null +++ b/lib/js/src/rpc/structs/RadioControlCapabilities.js @@ -0,0 +1,320 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { ModuleInfo } from './ModuleInfo.js'; + +/** + * Contains information about a radio control module's capabilities. + */ +class RadioControlCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} name - The short friendly name of the climate control module. It should not be used to identify a + * module by mobile application. + * @return {RadioControlCapabilities} + */ + setModuleName (name) { + this.setParameter(RadioControlCapabilities.KEY_MODULE_NAME, name); + return this; + } + + /** + * @return {String} + */ + getModuleName () { + return this.getParameter(RadioControlCapabilities.KEY_MODULE_NAME); + } + + /** + * @param {ModuleInfo} info - Information about a RC module, including its id. + * @return {RadioControlCapabilities} + */ + setModuleInfo (info) { + this.validateType(ModuleInfo, info); + this.setParameter(RadioControlCapabilities.KEY_MODULE_INFO, info); + return this; + } + + /** + * @return {ModuleInfo} + */ + getModuleInfo () { + return this.getObject(ModuleInfo, RadioControlCapabilities.KEY_MODULE_INFO); + } + + /** + * @param {Boolean} available - Availability of the control of enable/disable radio. True: Available, False: Not + * Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + setRadioEnableAvailable (available) { + this.setParameter(RadioControlCapabilities.KEY_RADIO_ENABLE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getRadioEnableAvailable () { + return this.getParameter(RadioControlCapabilities.KEY_RADIO_ENABLE_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of radio band. True: Available, False: Not Available, + * Not present: Not Available. + * @return {RadioControlCapabilities} + */ + setRadioBandAvailable (available) { + this.setParameter(RadioControlCapabilities.KEY_RADIO_BAND_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getRadioBandAvailable () { + return this.getParameter(RadioControlCapabilities.KEY_RADIO_BAND_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of radio frequency. True: Available, False: Not + * Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + setRadioFrequencyAvailable (available) { + this.setParameter(RadioControlCapabilities.KEY_RADIO_FREQUENCY_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getRadioFrequencyAvailable () { + return this.getParameter(RadioControlCapabilities.KEY_RADIO_FREQUENCY_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of HD radio channel. True: Available, False: Not + * Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + setHdChannelAvailable (available) { + this.setParameter(RadioControlCapabilities.KEY_HD_CHANNEL_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getHdChannelAvailable () { + return this.getParameter(RadioControlCapabilities.KEY_HD_CHANNEL_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the getting Radio Data System (RDS) data. True: Available, False: + * Not Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + setRdsDataAvailable (available) { + this.setParameter(RadioControlCapabilities.KEY_RDS_DATA_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getRdsDataAvailable () { + return this.getParameter(RadioControlCapabilities.KEY_RDS_DATA_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the getting the number of available HD channels. True: Available, + * False: Not Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + setAvailableHDsAvailable (available) { + this.setParameter(RadioControlCapabilities.KEY_AVAILABLE_HDS_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getAvailableHDsAvailable () { + return this.getParameter(RadioControlCapabilities.KEY_AVAILABLE_HDS_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the list of available HD sub-channel indexes. True: Available, + * False: Not Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + setAvailableHdChannelsAvailable (available) { + this.setParameter(RadioControlCapabilities.KEY_AVAILABLE_HD_CHANNELS_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getAvailableHdChannelsAvailable () { + return this.getParameter(RadioControlCapabilities.KEY_AVAILABLE_HD_CHANNELS_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the getting the Radio state. True: Available, False: Not Available, + * Not present: Not Available. + * @return {RadioControlCapabilities} + */ + setStateAvailable (available) { + this.setParameter(RadioControlCapabilities.KEY_STATE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getStateAvailable () { + return this.getParameter(RadioControlCapabilities.KEY_STATE_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the getting the signal strength. True: Available, False: Not + * Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + setSignalStrengthAvailable (available) { + this.setParameter(RadioControlCapabilities.KEY_SIGNAL_STRENGTH_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getSignalStrengthAvailable () { + return this.getParameter(RadioControlCapabilities.KEY_SIGNAL_STRENGTH_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the getting the signal Change Threshold. True: Available, False: Not + * Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + setSignalChangeThresholdAvailable (available) { + this.setParameter(RadioControlCapabilities.KEY_SIGNAL_CHANGE_THRESHOLD_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getSignalChangeThresholdAvailable () { + return this.getParameter(RadioControlCapabilities.KEY_SIGNAL_CHANGE_THRESHOLD_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the getting HD radio Station Information Service (SIS) data. True: + * Available, False: Not Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + setSisDataAvailable (available) { + this.setParameter(RadioControlCapabilities.KEY_SIS_DATA_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getSisDataAvailable () { + return this.getParameter(RadioControlCapabilities.KEY_SIS_DATA_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of the control of enable/disable HD radio. True: Available, False: Not + * Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + setHdRadioEnableAvailable (available) { + this.setParameter(RadioControlCapabilities.KEY_HD_RADIO_ENABLE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getHdRadioEnableAvailable () { + return this.getParameter(RadioControlCapabilities.KEY_HD_RADIO_ENABLE_AVAILABLE); + } + + /** + * @param {Boolean} available - Availability of sirius XM radio. True: Available, False: Not Available, Not present: + * Not Available. + * @return {RadioControlCapabilities} + */ + setSiriusxmRadioAvailable (available) { + this.setParameter(RadioControlCapabilities.KEY_SIRIUSXM_RADIO_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getSiriusxmRadioAvailable () { + return this.getParameter(RadioControlCapabilities.KEY_SIRIUSXM_RADIO_AVAILABLE); + } +} + +RadioControlCapabilities.KEY_MODULE_NAME = 'moduleName'; +RadioControlCapabilities.KEY_MODULE_INFO = 'moduleInfo'; +RadioControlCapabilities.KEY_RADIO_ENABLE_AVAILABLE = 'radioEnableAvailable'; +RadioControlCapabilities.KEY_RADIO_BAND_AVAILABLE = 'radioBandAvailable'; +RadioControlCapabilities.KEY_RADIO_FREQUENCY_AVAILABLE = 'radioFrequencyAvailable'; +RadioControlCapabilities.KEY_HD_CHANNEL_AVAILABLE = 'hdChannelAvailable'; +RadioControlCapabilities.KEY_RDS_DATA_AVAILABLE = 'rdsDataAvailable'; +RadioControlCapabilities.KEY_AVAILABLE_HDS_AVAILABLE = 'availableHDsAvailable'; +RadioControlCapabilities.KEY_AVAILABLE_HD_CHANNELS_AVAILABLE = 'availableHdChannelsAvailable'; +RadioControlCapabilities.KEY_STATE_AVAILABLE = 'stateAvailable'; +RadioControlCapabilities.KEY_SIGNAL_STRENGTH_AVAILABLE = 'signalStrengthAvailable'; +RadioControlCapabilities.KEY_SIGNAL_CHANGE_THRESHOLD_AVAILABLE = 'signalChangeThresholdAvailable'; +RadioControlCapabilities.KEY_SIS_DATA_AVAILABLE = 'sisDataAvailable'; +RadioControlCapabilities.KEY_HD_RADIO_ENABLE_AVAILABLE = 'hdRadioEnableAvailable'; +RadioControlCapabilities.KEY_SIRIUSXM_RADIO_AVAILABLE = 'siriusxmRadioAvailable'; + +export { RadioControlCapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/RadioControlData.js b/lib/js/src/rpc/structs/RadioControlData.js new file mode 100644 index 00000000..c90540cf --- /dev/null +++ b/lib/js/src/rpc/structs/RadioControlData.js @@ -0,0 +1,280 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RadioBand } from '../enums/RadioBand.js'; +import { RpcStruct } from '../RpcStruct.js'; +import { RdsData } from './RdsData.js'; +import { RadioState } from '../enums/RadioState.js'; +import { SisData } from './SisData.js'; + +class RadioControlData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} integer - The integer part of the frequency ie for 101.7 this value should be 101 + * @return {RadioControlData} + */ + setFrequencyInteger (integer) { + this.setParameter(RadioControlData.KEY_FREQUENCY_INTEGER, integer); + return this; + } + + /** + * @return {Number} + */ + getFrequencyInteger () { + return this.getParameter(RadioControlData.KEY_FREQUENCY_INTEGER); + } + + /** + * @param {Number} fraction - The fractional part of the frequency for 101.7 is 7 + * @return {RadioControlData} + */ + setFrequencyFraction (fraction) { + this.setParameter(RadioControlData.KEY_FREQUENCY_FRACTION, fraction); + return this; + } + + /** + * @return {Number} + */ + getFrequencyFraction () { + return this.getParameter(RadioControlData.KEY_FREQUENCY_FRACTION); + } + + /** + * @param {RadioBand} band + * @return {RadioControlData} + */ + setBand (band) { + this.validateType(RadioBand, band); + this.setParameter(RadioControlData.KEY_BAND, band); + return this; + } + + /** + * @return {RadioBand} + */ + getBand () { + return this.getObject(RadioBand, RadioControlData.KEY_BAND); + } + + /** + * @param {RdsData} data + * @return {RadioControlData} + */ + setRdsData (data) { + this.validateType(RdsData, data); + this.setParameter(RadioControlData.KEY_RDS_DATA, data); + return this; + } + + /** + * @return {RdsData} + */ + getRdsData () { + return this.getObject(RdsData, RadioControlData.KEY_RDS_DATA); + } + + /** + * @param {Boolean} enable - True if the hd radio is on, false if the radio is off + * @return {RadioControlData} + */ + setHdRadioEnable (enable) { + this.setParameter(RadioControlData.KEY_HD_RADIO_ENABLE, enable); + return this; + } + + /** + * @return {Boolean} + */ + getHdRadioEnable () { + return this.getParameter(RadioControlData.KEY_HD_RADIO_ENABLE); + } + + /** + * @param {Number} ds - Number of HD sub-channels if available + * @return {RadioControlData} + */ + setAvailableHDs (ds) { + this.setParameter(RadioControlData.KEY_AVAILABLE_HDS, ds); + return this; + } + + /** + * @return {Number} + */ + getAvailableHDs () { + return this.getParameter(RadioControlData.KEY_AVAILABLE_HDS); + } + + /** + * @param {Number[]} channels - The list of available HD sub-channel indexes. Empty list means no Hd channel is + * available. Read-only. + * @return {RadioControlData} + */ + setAvailableHdChannels (channels) { + this.setParameter(RadioControlData.KEY_AVAILABLE_HD_CHANNELS, channels); + return this; + } + + /** + * @return {Number[]} + */ + getAvailableHdChannels () { + return this.getParameter(RadioControlData.KEY_AVAILABLE_HD_CHANNELS); + } + + /** + * @param {Number} channel - Current HD sub-channel if available + * @return {RadioControlData} + */ + setHdChannel (channel) { + this.setParameter(RadioControlData.KEY_HD_CHANNEL, channel); + return this; + } + + /** + * @return {Number} + */ + getHdChannel () { + return this.getParameter(RadioControlData.KEY_HD_CHANNEL); + } + + /** + * @param {Number} strength + * @return {RadioControlData} + */ + setSignalStrength (strength) { + this.setParameter(RadioControlData.KEY_SIGNAL_STRENGTH, strength); + return this; + } + + /** + * @return {Number} + */ + getSignalStrength () { + return this.getParameter(RadioControlData.KEY_SIGNAL_STRENGTH); + } + + /** + * @param {Number} threshold - If the signal strength falls below the set value for this parameter, the radio will + * tune to an alternative frequency + * @return {RadioControlData} + */ + setSignalChangeThreshold (threshold) { + this.setParameter(RadioControlData.KEY_SIGNAL_CHANGE_THRESHOLD, threshold); + return this; + } + + /** + * @return {Number} + */ + getSignalChangeThreshold () { + return this.getParameter(RadioControlData.KEY_SIGNAL_CHANGE_THRESHOLD); + } + + /** + * @param {Boolean} enable - True if the radio is on, false if the radio is off. If set to false, no other data will + * be included. + * @return {RadioControlData} + */ + setRadioEnable (enable) { + this.setParameter(RadioControlData.KEY_RADIO_ENABLE, enable); + return this; + } + + /** + * @return {Boolean} + */ + getRadioEnable () { + return this.getParameter(RadioControlData.KEY_RADIO_ENABLE); + } + + /** + * @param {RadioState} state + * @return {RadioControlData} + */ + setState (state) { + this.validateType(RadioState, state); + this.setParameter(RadioControlData.KEY_STATE, state); + return this; + } + + /** + * @return {RadioState} + */ + getState () { + return this.getObject(RadioState, RadioControlData.KEY_STATE); + } + + /** + * @param {SisData} data - Read-only Station Information Service (SIS) data provides basic information about the + * station such as call sign, as well as information not displayable to the consumer such as + * the station identification number + * @return {RadioControlData} + */ + setSisData (data) { + this.validateType(SisData, data); + this.setParameter(RadioControlData.KEY_SIS_DATA, data); + return this; + } + + /** + * @return {SisData} + */ + getSisData () { + return this.getObject(SisData, RadioControlData.KEY_SIS_DATA); + } +} + +RadioControlData.KEY_FREQUENCY_INTEGER = 'frequencyInteger'; +RadioControlData.KEY_FREQUENCY_FRACTION = 'frequencyFraction'; +RadioControlData.KEY_BAND = 'band'; +RadioControlData.KEY_RDS_DATA = 'rdsData'; +RadioControlData.KEY_HD_RADIO_ENABLE = 'hdRadioEnable'; +RadioControlData.KEY_AVAILABLE_HDS = 'availableHDs'; +RadioControlData.KEY_AVAILABLE_HD_CHANNELS = 'availableHdChannels'; +RadioControlData.KEY_HD_CHANNEL = 'hdChannel'; +RadioControlData.KEY_SIGNAL_STRENGTH = 'signalStrength'; +RadioControlData.KEY_SIGNAL_CHANGE_THRESHOLD = 'signalChangeThreshold'; +RadioControlData.KEY_RADIO_ENABLE = 'radioEnable'; +RadioControlData.KEY_STATE = 'state'; +RadioControlData.KEY_SIS_DATA = 'sisData'; + +export { RadioControlData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/RdsData.js b/lib/js/src/rpc/structs/RdsData.js new file mode 100644 index 00000000..2a17b7f7 --- /dev/null +++ b/lib/js/src/rpc/structs/RdsData.js @@ -0,0 +1,183 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; + +class RdsData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} ps - Program Service Name + * @return {RdsData} + */ + setPS (ps) { + this.setParameter(RdsData.KEY_PS, ps); + return this; + } + + /** + * @return {String} + */ + getPS () { + return this.getParameter(RdsData.KEY_PS); + } + + /** + * @param {String} rt - Radio Text + * @return {RdsData} + */ + setRT (rt) { + this.setParameter(RdsData.KEY_RT, rt); + return this; + } + + /** + * @return {String} + */ + getRT () { + return this.getParameter(RdsData.KEY_RT); + } + + /** + * @param {String} ct - The clock text in UTC format as YYYY-MM-DDThh:mm:ss.sTZD + * @return {RdsData} + */ + setCT (ct) { + this.setParameter(RdsData.KEY_CT, ct); + return this; + } + + /** + * @return {String} + */ + getCT () { + return this.getParameter(RdsData.KEY_CT); + } + + /** + * @param {String} pi - Program Identification - the call sign for the radio station + * @return {RdsData} + */ + setPI (pi) { + this.setParameter(RdsData.KEY_PI, pi); + return this; + } + + /** + * @return {String} + */ + getPI () { + return this.getParameter(RdsData.KEY_PI); + } + + /** + * @param {Number} pty - The program type - The region should be used to differentiate between EU and North America + * program types + * @return {RdsData} + */ + setPTY (pty) { + this.setParameter(RdsData.KEY_PTY, pty); + return this; + } + + /** + * @return {Number} + */ + getPTY () { + return this.getParameter(RdsData.KEY_PTY); + } + + /** + * @param {Boolean} tp - Traffic Program Identification - Identifies a station that offers traffic + * @return {RdsData} + */ + setTP (tp) { + this.setParameter(RdsData.KEY_TP, tp); + return this; + } + + /** + * @return {Boolean} + */ + getTP () { + return this.getParameter(RdsData.KEY_TP); + } + + /** + * @param {Boolean} ta - Traffic Announcement Identification - Indicates an ongoing traffic announcement + * @return {RdsData} + */ + setTA (ta) { + this.setParameter(RdsData.KEY_TA, ta); + return this; + } + + /** + * @return {Boolean} + */ + getTA () { + return this.getParameter(RdsData.KEY_TA); + } + + /** + * @param {String} reg - Region + * @return {RdsData} + */ + setREG (reg) { + this.setParameter(RdsData.KEY_REG, reg); + return this; + } + + /** + * @return {String} + */ + getREG () { + return this.getParameter(RdsData.KEY_REG); + } +} + +RdsData.KEY_PS = 'PS'; +RdsData.KEY_RT = 'RT'; +RdsData.KEY_CT = 'CT'; +RdsData.KEY_PI = 'PI'; +RdsData.KEY_PTY = 'PTY'; +RdsData.KEY_TP = 'TP'; +RdsData.KEY_TA = 'TA'; +RdsData.KEY_REG = 'REG'; + +export { RdsData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/Rectangle.js b/lib/js/src/rpc/structs/Rectangle.js new file mode 100644 index 00000000..67e91447 --- /dev/null +++ b/lib/js/src/rpc/structs/Rectangle.js @@ -0,0 +1,114 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; + +class Rectangle extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} x - The upper left X-coordinate of the rectangle + * @return {Rectangle} + */ + setX (x) { + this.setParameter(Rectangle.KEY_X, x); + return this; + } + + /** + * @return {Number} + */ + getX () { + return this.getParameter(Rectangle.KEY_X); + } + + /** + * @param {Number} y - The upper left Y-coordinate of the rectangle + * @return {Rectangle} + */ + setY (y) { + this.setParameter(Rectangle.KEY_Y, y); + return this; + } + + /** + * @return {Number} + */ + getY () { + return this.getParameter(Rectangle.KEY_Y); + } + + /** + * @param {Number} width - The width of the rectangle + * @return {Rectangle} + */ + setWidth (width) { + this.setParameter(Rectangle.KEY_WIDTH, width); + return this; + } + + /** + * @return {Number} + */ + getWidth () { + return this.getParameter(Rectangle.KEY_WIDTH); + } + + /** + * @param {Number} height - The height of the rectangle + * @return {Rectangle} + */ + setHeight (height) { + this.setParameter(Rectangle.KEY_HEIGHT, height); + return this; + } + + /** + * @return {Number} + */ + getHeight () { + return this.getParameter(Rectangle.KEY_HEIGHT); + } +} + +Rectangle.KEY_X = 'x'; +Rectangle.KEY_Y = 'y'; +Rectangle.KEY_WIDTH = 'width'; +Rectangle.KEY_HEIGHT = 'height'; + +export { Rectangle }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/RemoteControlCapabilities.js b/lib/js/src/rpc/structs/RemoteControlCapabilities.js new file mode 100644 index 00000000..89c5f444 --- /dev/null +++ b/lib/js/src/rpc/structs/RemoteControlCapabilities.js @@ -0,0 +1,184 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { AudioControlCapabilities } from './AudioControlCapabilities.js'; +import { LightControlCapabilities } from './LightControlCapabilities.js'; +import { ClimateControlCapabilities } from './ClimateControlCapabilities.js'; +import { RpcStruct } from '../RpcStruct.js'; +import { ButtonCapabilities } from './ButtonCapabilities.js'; +import { SeatControlCapabilities } from './SeatControlCapabilities.js'; +import { RadioControlCapabilities } from './RadioControlCapabilities.js'; +import { HMISettingsControlCapabilities } from './HMISettingsControlCapabilities.js'; + +class RemoteControlCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {ClimateControlCapabilities[]} capabilities - If included, the platform supports RC climate controls. For + * this baseline version, maxsize=1. i.e. only one climate + * control module is supported. + * @return {RemoteControlCapabilities} + */ + setClimateControlCapabilities (capabilities) { + this.validateType(ClimateControlCapabilities, capabilities, true); + this.setParameter(RemoteControlCapabilities.KEY_CLIMATE_CONTROL_CAPABILITIES, capabilities); + return this; + } + + /** + * @return {ClimateControlCapabilities[]} + */ + getClimateControlCapabilities () { + return this.getObject(ClimateControlCapabilities, RemoteControlCapabilities.KEY_CLIMATE_CONTROL_CAPABILITIES); + } + + /** + * @param {RadioControlCapabilities[]} capabilities - If included, the platform supports RC radio controls.For this + * baseline version, maxsize=1. i.e. only one radio control + * module is supported. + * @return {RemoteControlCapabilities} + */ + setRadioControlCapabilities (capabilities) { + this.validateType(RadioControlCapabilities, capabilities, true); + this.setParameter(RemoteControlCapabilities.KEY_RADIO_CONTROL_CAPABILITIES, capabilities); + return this; + } + + /** + * @return {RadioControlCapabilities[]} + */ + getRadioControlCapabilities () { + return this.getObject(RadioControlCapabilities, RemoteControlCapabilities.KEY_RADIO_CONTROL_CAPABILITIES); + } + + /** + * @param {ButtonCapabilities[]} capabilities - If included, the platform supports RC button controls with the + * included button names. + * @return {RemoteControlCapabilities} + */ + setButtonCapabilities (capabilities) { + this.validateType(ButtonCapabilities, capabilities, true); + this.setParameter(RemoteControlCapabilities.KEY_BUTTON_CAPABILITIES, capabilities); + return this; + } + + /** + * @return {ButtonCapabilities[]} + */ + getButtonCapabilities () { + return this.getObject(ButtonCapabilities, RemoteControlCapabilities.KEY_BUTTON_CAPABILITIES); + } + + /** + * @param {AudioControlCapabilities[]} capabilities - If included, the platform supports audio controls. + * @return {RemoteControlCapabilities} + */ + setAudioControlCapabilities (capabilities) { + this.validateType(AudioControlCapabilities, capabilities, true); + this.setParameter(RemoteControlCapabilities.KEY_AUDIO_CONTROL_CAPABILITIES, capabilities); + return this; + } + + /** + * @return {AudioControlCapabilities[]} + */ + getAudioControlCapabilities () { + return this.getObject(AudioControlCapabilities, RemoteControlCapabilities.KEY_AUDIO_CONTROL_CAPABILITIES); + } + + /** + * @param {HMISettingsControlCapabilities} capabilities - If included, the platform supports hmi setting controls. + * @return {RemoteControlCapabilities} + */ + setHmiSettingsControlCapabilities (capabilities) { + this.validateType(HMISettingsControlCapabilities, capabilities); + this.setParameter(RemoteControlCapabilities.KEY_HMI_SETTINGS_CONTROL_CAPABILITIES, capabilities); + return this; + } + + /** + * @return {HMISettingsControlCapabilities} + */ + getHmiSettingsControlCapabilities () { + return this.getObject(HMISettingsControlCapabilities, RemoteControlCapabilities.KEY_HMI_SETTINGS_CONTROL_CAPABILITIES); + } + + /** + * @param {LightControlCapabilities} capabilities - If included, the platform supports light controls. + * @return {RemoteControlCapabilities} + */ + setLightControlCapabilities (capabilities) { + this.validateType(LightControlCapabilities, capabilities); + this.setParameter(RemoteControlCapabilities.KEY_LIGHT_CONTROL_CAPABILITIES, capabilities); + return this; + } + + /** + * @return {LightControlCapabilities} + */ + getLightControlCapabilities () { + return this.getObject(LightControlCapabilities, RemoteControlCapabilities.KEY_LIGHT_CONTROL_CAPABILITIES); + } + + /** + * @param {SeatControlCapabilities[]} capabilities - If included, the platform supports seat controls. + * @return {RemoteControlCapabilities} + */ + setSeatControlCapabilities (capabilities) { + this.validateType(SeatControlCapabilities, capabilities, true); + this.setParameter(RemoteControlCapabilities.KEY_SEAT_CONTROL_CAPABILITIES, capabilities); + return this; + } + + /** + * @return {SeatControlCapabilities[]} + */ + getSeatControlCapabilities () { + return this.getObject(SeatControlCapabilities, RemoteControlCapabilities.KEY_SEAT_CONTROL_CAPABILITIES); + } +} + +RemoteControlCapabilities.KEY_CLIMATE_CONTROL_CAPABILITIES = 'climateControlCapabilities'; +RemoteControlCapabilities.KEY_RADIO_CONTROL_CAPABILITIES = 'radioControlCapabilities'; +RemoteControlCapabilities.KEY_BUTTON_CAPABILITIES = 'buttonCapabilities'; +RemoteControlCapabilities.KEY_AUDIO_CONTROL_CAPABILITIES = 'audioControlCapabilities'; +RemoteControlCapabilities.KEY_HMI_SETTINGS_CONTROL_CAPABILITIES = 'hmiSettingsControlCapabilities'; +RemoteControlCapabilities.KEY_LIGHT_CONTROL_CAPABILITIES = 'lightControlCapabilities'; +RemoteControlCapabilities.KEY_SEAT_CONTROL_CAPABILITIES = 'seatControlCapabilities'; + +export { RemoteControlCapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/ScreenParams.js b/lib/js/src/rpc/structs/ScreenParams.js index cd82d4b6..d53f2c28 100644 --- a/lib/js/src/rpc/structs/ScreenParams.js +++ b/lib/js/src/rpc/structs/ScreenParams.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -35,43 +36,43 @@ import { ImageResolution } from './ImageResolution.js'; import { TouchEventCapabilities } from './TouchEventCapabilities.js'; class ScreenParams extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } - /** - * @param {ImageResolution} resolution - * @return {ScreenParams} - */ + * @param {ImageResolution} resolution - The resolution of the prescribed screen area. + * @return {ScreenParams} + */ setResolution (resolution) { this.validateType(ImageResolution, resolution); - this.setParameter(ScreenParams.KEY_RESOLUTION, resolution); return this; } /** - * @return {ImageResolution} - */ + * @return {ImageResolution} + */ getResolution () { return this.getObject(ImageResolution, ScreenParams.KEY_RESOLUTION); } /** - * @param {TouchEventCapabilities} touchEventCapabilities - * @return {ScreenParams} - */ - setTouchEventAvailable (touchEventCapabilities) { - this.validateType(TouchEventCapabilities, touchEventCapabilities); - - this.setParameter(ScreenParams.KEY_TOUCH_EVENT_AVAILABLE, touchEventCapabilities); + * @param {TouchEventCapabilities} available - Types of screen touch events available in screen area. + * @return {ScreenParams} + */ + setTouchEventAvailable (available) { + this.validateType(TouchEventCapabilities, available); + this.setParameter(ScreenParams.KEY_TOUCH_EVENT_AVAILABLE, available); return this; } /** - * @return {TouchEventCapabilities} - */ + * @return {TouchEventCapabilities} + */ getTouchEventAvailable () { return this.getObject(TouchEventCapabilities, ScreenParams.KEY_TOUCH_EVENT_AVAILABLE); } @@ -80,4 +81,4 @@ class ScreenParams extends RpcStruct { ScreenParams.KEY_RESOLUTION = 'resolution'; ScreenParams.KEY_TOUCH_EVENT_AVAILABLE = 'touchEventAvailable'; -export { ScreenParams }; +export { ScreenParams }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/SdlMsgVersion.js b/lib/js/src/rpc/structs/SdlMsgVersion.js index 99f103b5..6e1ea261 100644 --- a/lib/js/src/rpc/structs/SdlMsgVersion.js +++ b/lib/js/src/rpc/structs/SdlMsgVersion.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -32,55 +33,63 @@ import { RpcStruct } from '../RpcStruct.js'; +/** + * Specifies the version number of the SmartDeviceLink protocol that is supported by the mobile application + */ class SdlMsgVersion extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {Number} the major version of this object - * @return {SdlMsgVersion} - */ - setMajorVersion (value) { - this.setParameter(SdlMsgVersion.KEY_MAJOR_VERSION, value); + * @param {Number} version - The major version indicates versions that is not-compatible to previous versions. + * @return {SdlMsgVersion} + */ + setMajorVersion (version) { + this.setParameter(SdlMsgVersion.KEY_MAJOR_VERSION, version); return this; } /** - * @return {Number} the major version of this object - */ + * @return {Number} + */ getMajorVersion () { return this.getParameter(SdlMsgVersion.KEY_MAJOR_VERSION); } /** - * @param {Number} the minor version of this object - * @return {SdlMsgVersion} - */ - setMinorVersion (value) { - this.setParameter(SdlMsgVersion.KEY_MINOR_VERSION, value); + * @param {Number} version - The minor version indicates a change to a previous version that should still allow to + * be run on an older version (with limited functionality) + * @return {SdlMsgVersion} + */ + setMinorVersion (version) { + this.setParameter(SdlMsgVersion.KEY_MINOR_VERSION, version); return this; } /** - * @return {Number} the minor version of this object - */ + * @return {Number} + */ getMinorVersion () { return this.getParameter(SdlMsgVersion.KEY_MINOR_VERSION); } /** - * @param {Number} the patch version of this object - * @return {SdlMsgVersion} - */ - setPatchVersion (value) { - this.setParameter(SdlMsgVersion.KEY_PATCH_VERSION, value); + * @param {Number} version - The patch version indicates a fix to existing functionality in a previous version that + * should still be able to be run on an older version + * @return {SdlMsgVersion} + */ + setPatchVersion (version) { + this.setParameter(SdlMsgVersion.KEY_PATCH_VERSION, version); return this; } /** - * @return {Number} the patch version of this objects - */ + * @return {Number} + */ getPatchVersion () { return this.getParameter(SdlMsgVersion.KEY_PATCH_VERSION); } @@ -90,4 +99,4 @@ SdlMsgVersion.KEY_MAJOR_VERSION = 'majorVersion'; SdlMsgVersion.KEY_MINOR_VERSION = 'minorVersion'; SdlMsgVersion.KEY_PATCH_VERSION = 'patchVersion'; -export { SdlMsgVersion }; +export { SdlMsgVersion }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/SeatControlCapabilities.js b/lib/js/src/rpc/structs/SeatControlCapabilities.js new file mode 100644 index 00000000..ed2953bc --- /dev/null +++ b/lib/js/src/rpc/structs/SeatControlCapabilities.js @@ -0,0 +1,338 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { ModuleInfo } from './ModuleInfo.js'; + +class SeatControlCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} name - The short friendly name of the light control module. It should not be used to identify a + * module by mobile application. + * @return {SeatControlCapabilities} + */ + setModuleName (name) { + this.setParameter(SeatControlCapabilities.KEY_MODULE_NAME, name); + return this; + } + + /** + * @return {String} + */ + getModuleName () { + return this.getParameter(SeatControlCapabilities.KEY_MODULE_NAME); + } + + /** + * @param {ModuleInfo} info - Information about a RC module, including its id. + * @return {SeatControlCapabilities} + */ + setModuleInfo (info) { + this.validateType(ModuleInfo, info); + this.setParameter(SeatControlCapabilities.KEY_MODULE_INFO, info); + return this; + } + + /** + * @return {ModuleInfo} + */ + getModuleInfo () { + return this.getObject(ModuleInfo, SeatControlCapabilities.KEY_MODULE_INFO); + } + + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + setHeatingEnabledAvailable (available) { + this.setParameter(SeatControlCapabilities.KEY_HEATING_ENABLED_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getHeatingEnabledAvailable () { + return this.getParameter(SeatControlCapabilities.KEY_HEATING_ENABLED_AVAILABLE); + } + + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + setCoolingEnabledAvailable (available) { + this.setParameter(SeatControlCapabilities.KEY_COOLING_ENABLED_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getCoolingEnabledAvailable () { + return this.getParameter(SeatControlCapabilities.KEY_COOLING_ENABLED_AVAILABLE); + } + + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + setHeatingLevelAvailable (available) { + this.setParameter(SeatControlCapabilities.KEY_HEATING_LEVEL_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getHeatingLevelAvailable () { + return this.getParameter(SeatControlCapabilities.KEY_HEATING_LEVEL_AVAILABLE); + } + + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + setCoolingLevelAvailable (available) { + this.setParameter(SeatControlCapabilities.KEY_COOLING_LEVEL_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getCoolingLevelAvailable () { + return this.getParameter(SeatControlCapabilities.KEY_COOLING_LEVEL_AVAILABLE); + } + + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + setHorizontalPositionAvailable (available) { + this.setParameter(SeatControlCapabilities.KEY_HORIZONTAL_POSITION_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getHorizontalPositionAvailable () { + return this.getParameter(SeatControlCapabilities.KEY_HORIZONTAL_POSITION_AVAILABLE); + } + + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + setVerticalPositionAvailable (available) { + this.setParameter(SeatControlCapabilities.KEY_VERTICAL_POSITION_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getVerticalPositionAvailable () { + return this.getParameter(SeatControlCapabilities.KEY_VERTICAL_POSITION_AVAILABLE); + } + + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + setFrontVerticalPositionAvailable (available) { + this.setParameter(SeatControlCapabilities.KEY_FRONT_VERTICAL_POSITION_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getFrontVerticalPositionAvailable () { + return this.getParameter(SeatControlCapabilities.KEY_FRONT_VERTICAL_POSITION_AVAILABLE); + } + + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + setBackVerticalPositionAvailable (available) { + this.setParameter(SeatControlCapabilities.KEY_BACK_VERTICAL_POSITION_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getBackVerticalPositionAvailable () { + return this.getParameter(SeatControlCapabilities.KEY_BACK_VERTICAL_POSITION_AVAILABLE); + } + + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + setBackTiltAngleAvailable (available) { + this.setParameter(SeatControlCapabilities.KEY_BACK_TILT_ANGLE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getBackTiltAngleAvailable () { + return this.getParameter(SeatControlCapabilities.KEY_BACK_TILT_ANGLE_AVAILABLE); + } + + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + setHeadSupportHorizontalPositionAvailable (available) { + this.setParameter(SeatControlCapabilities.KEY_HEAD_SUPPORT_HORIZONTAL_POSITION_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getHeadSupportHorizontalPositionAvailable () { + return this.getParameter(SeatControlCapabilities.KEY_HEAD_SUPPORT_HORIZONTAL_POSITION_AVAILABLE); + } + + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + setHeadSupportVerticalPositionAvailable (available) { + this.setParameter(SeatControlCapabilities.KEY_HEAD_SUPPORT_VERTICAL_POSITION_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getHeadSupportVerticalPositionAvailable () { + return this.getParameter(SeatControlCapabilities.KEY_HEAD_SUPPORT_VERTICAL_POSITION_AVAILABLE); + } + + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + setMassageEnabledAvailable (available) { + this.setParameter(SeatControlCapabilities.KEY_MASSAGE_ENABLED_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getMassageEnabledAvailable () { + return this.getParameter(SeatControlCapabilities.KEY_MASSAGE_ENABLED_AVAILABLE); + } + + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + setMassageModeAvailable (available) { + this.setParameter(SeatControlCapabilities.KEY_MASSAGE_MODE_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getMassageModeAvailable () { + return this.getParameter(SeatControlCapabilities.KEY_MASSAGE_MODE_AVAILABLE); + } + + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + setMassageCushionFirmnessAvailable (available) { + this.setParameter(SeatControlCapabilities.KEY_MASSAGE_CUSHION_FIRMNESS_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getMassageCushionFirmnessAvailable () { + return this.getParameter(SeatControlCapabilities.KEY_MASSAGE_CUSHION_FIRMNESS_AVAILABLE); + } + + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + setMemoryAvailable (available) { + this.setParameter(SeatControlCapabilities.KEY_MEMORY_AVAILABLE, available); + return this; + } + + /** + * @return {Boolean} + */ + getMemoryAvailable () { + return this.getParameter(SeatControlCapabilities.KEY_MEMORY_AVAILABLE); + } +} + +SeatControlCapabilities.KEY_MODULE_NAME = 'moduleName'; +SeatControlCapabilities.KEY_MODULE_INFO = 'moduleInfo'; +SeatControlCapabilities.KEY_HEATING_ENABLED_AVAILABLE = 'heatingEnabledAvailable'; +SeatControlCapabilities.KEY_COOLING_ENABLED_AVAILABLE = 'coolingEnabledAvailable'; +SeatControlCapabilities.KEY_HEATING_LEVEL_AVAILABLE = 'heatingLevelAvailable'; +SeatControlCapabilities.KEY_COOLING_LEVEL_AVAILABLE = 'coolingLevelAvailable'; +SeatControlCapabilities.KEY_HORIZONTAL_POSITION_AVAILABLE = 'horizontalPositionAvailable'; +SeatControlCapabilities.KEY_VERTICAL_POSITION_AVAILABLE = 'verticalPositionAvailable'; +SeatControlCapabilities.KEY_FRONT_VERTICAL_POSITION_AVAILABLE = 'frontVerticalPositionAvailable'; +SeatControlCapabilities.KEY_BACK_VERTICAL_POSITION_AVAILABLE = 'backVerticalPositionAvailable'; +SeatControlCapabilities.KEY_BACK_TILT_ANGLE_AVAILABLE = 'backTiltAngleAvailable'; +SeatControlCapabilities.KEY_HEAD_SUPPORT_HORIZONTAL_POSITION_AVAILABLE = 'headSupportHorizontalPositionAvailable'; +SeatControlCapabilities.KEY_HEAD_SUPPORT_VERTICAL_POSITION_AVAILABLE = 'headSupportVerticalPositionAvailable'; +SeatControlCapabilities.KEY_MASSAGE_ENABLED_AVAILABLE = 'massageEnabledAvailable'; +SeatControlCapabilities.KEY_MASSAGE_MODE_AVAILABLE = 'massageModeAvailable'; +SeatControlCapabilities.KEY_MASSAGE_CUSHION_FIRMNESS_AVAILABLE = 'massageCushionFirmnessAvailable'; +SeatControlCapabilities.KEY_MEMORY_AVAILABLE = 'memoryAvailable'; + +export { SeatControlCapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/SeatControlData.js b/lib/js/src/rpc/structs/SeatControlData.js new file mode 100644 index 00000000..70a8e36f --- /dev/null +++ b/lib/js/src/rpc/structs/SeatControlData.js @@ -0,0 +1,329 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { MassageCushionFirmness } from './MassageCushionFirmness.js'; +import { SupportedSeat } from '../enums/SupportedSeat.js'; +import { RpcStruct } from '../RpcStruct.js'; +import { SeatMemoryAction } from './SeatMemoryAction.js'; +import { MassageModeData } from './MassageModeData.js'; + +/** + * Seat control data corresponds to "SEAT" ModuleType. + */ +class SeatControlData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {SupportedSeat} id - List possible seats that is a remote controllable seat. + * @return {SeatControlData} + */ + setId (id) { + this.validateType(SupportedSeat, id); + this.setParameter(SeatControlData.KEY_ID, id); + return this; + } + + /** + * @return {SupportedSeat} + */ + getId () { + return this.getObject(SupportedSeat, SeatControlData.KEY_ID); + } + + /** + * @param {Boolean} enabled + * @return {SeatControlData} + */ + setHeatingEnabled (enabled) { + this.setParameter(SeatControlData.KEY_HEATING_ENABLED, enabled); + return this; + } + + /** + * @return {Boolean} + */ + getHeatingEnabled () { + return this.getParameter(SeatControlData.KEY_HEATING_ENABLED); + } + + /** + * @param {Boolean} enabled + * @return {SeatControlData} + */ + setCoolingEnabled (enabled) { + this.setParameter(SeatControlData.KEY_COOLING_ENABLED, enabled); + return this; + } + + /** + * @return {Boolean} + */ + getCoolingEnabled () { + return this.getParameter(SeatControlData.KEY_COOLING_ENABLED); + } + + /** + * @param {Number} level + * @return {SeatControlData} + */ + setHeatingLevel (level) { + this.setParameter(SeatControlData.KEY_HEATING_LEVEL, level); + return this; + } + + /** + * @return {Number} + */ + getHeatingLevel () { + return this.getParameter(SeatControlData.KEY_HEATING_LEVEL); + } + + /** + * @param {Number} level + * @return {SeatControlData} + */ + setCoolingLevel (level) { + this.setParameter(SeatControlData.KEY_COOLING_LEVEL, level); + return this; + } + + /** + * @return {Number} + */ + getCoolingLevel () { + return this.getParameter(SeatControlData.KEY_COOLING_LEVEL); + } + + /** + * @param {Number} position + * @return {SeatControlData} + */ + setHorizontalPosition (position) { + this.setParameter(SeatControlData.KEY_HORIZONTAL_POSITION, position); + return this; + } + + /** + * @return {Number} + */ + getHorizontalPosition () { + return this.getParameter(SeatControlData.KEY_HORIZONTAL_POSITION); + } + + /** + * @param {Number} position + * @return {SeatControlData} + */ + setVerticalPosition (position) { + this.setParameter(SeatControlData.KEY_VERTICAL_POSITION, position); + return this; + } + + /** + * @return {Number} + */ + getVerticalPosition () { + return this.getParameter(SeatControlData.KEY_VERTICAL_POSITION); + } + + /** + * @param {Number} position + * @return {SeatControlData} + */ + setFrontVerticalPosition (position) { + this.setParameter(SeatControlData.KEY_FRONT_VERTICAL_POSITION, position); + return this; + } + + /** + * @return {Number} + */ + getFrontVerticalPosition () { + return this.getParameter(SeatControlData.KEY_FRONT_VERTICAL_POSITION); + } + + /** + * @param {Number} position + * @return {SeatControlData} + */ + setBackVerticalPosition (position) { + this.setParameter(SeatControlData.KEY_BACK_VERTICAL_POSITION, position); + return this; + } + + /** + * @return {Number} + */ + getBackVerticalPosition () { + return this.getParameter(SeatControlData.KEY_BACK_VERTICAL_POSITION); + } + + /** + * @param {Number} angle + * @return {SeatControlData} + */ + setBackTiltAngle (angle) { + this.setParameter(SeatControlData.KEY_BACK_TILT_ANGLE, angle); + return this; + } + + /** + * @return {Number} + */ + getBackTiltAngle () { + return this.getParameter(SeatControlData.KEY_BACK_TILT_ANGLE); + } + + /** + * @param {Number} position + * @return {SeatControlData} + */ + setHeadSupportHorizontalPosition (position) { + this.setParameter(SeatControlData.KEY_HEAD_SUPPORT_HORIZONTAL_POSITION, position); + return this; + } + + /** + * @return {Number} + */ + getHeadSupportHorizontalPosition () { + return this.getParameter(SeatControlData.KEY_HEAD_SUPPORT_HORIZONTAL_POSITION); + } + + /** + * @param {Number} position + * @return {SeatControlData} + */ + setHeadSupportVerticalPosition (position) { + this.setParameter(SeatControlData.KEY_HEAD_SUPPORT_VERTICAL_POSITION, position); + return this; + } + + /** + * @return {Number} + */ + getHeadSupportVerticalPosition () { + return this.getParameter(SeatControlData.KEY_HEAD_SUPPORT_VERTICAL_POSITION); + } + + /** + * @param {Boolean} enabled + * @return {SeatControlData} + */ + setMassageEnabled (enabled) { + this.setParameter(SeatControlData.KEY_MASSAGE_ENABLED, enabled); + return this; + } + + /** + * @return {Boolean} + */ + getMassageEnabled () { + return this.getParameter(SeatControlData.KEY_MASSAGE_ENABLED); + } + + /** + * @param {MassageModeData[]} mode - Specify the mode of a massage zone. + * @return {SeatControlData} + */ + setMassageMode (mode) { + this.validateType(MassageModeData, mode, true); + this.setParameter(SeatControlData.KEY_MASSAGE_MODE, mode); + return this; + } + + /** + * @return {MassageModeData[]} + */ + getMassageMode () { + return this.getObject(MassageModeData, SeatControlData.KEY_MASSAGE_MODE); + } + + /** + * @param {MassageCushionFirmness[]} firmness - The intensity or firmness of a cushion. + * @return {SeatControlData} + */ + setMassageCushionFirmness (firmness) { + this.validateType(MassageCushionFirmness, firmness, true); + this.setParameter(SeatControlData.KEY_MASSAGE_CUSHION_FIRMNESS, firmness); + return this; + } + + /** + * @return {MassageCushionFirmness[]} + */ + getMassageCushionFirmness () { + return this.getObject(MassageCushionFirmness, SeatControlData.KEY_MASSAGE_CUSHION_FIRMNESS); + } + + /** + * @param {SeatMemoryAction} memory + * @return {SeatControlData} + */ + setMemory (memory) { + this.validateType(SeatMemoryAction, memory); + this.setParameter(SeatControlData.KEY_MEMORY, memory); + return this; + } + + /** + * @return {SeatMemoryAction} + */ + getMemory () { + return this.getObject(SeatMemoryAction, SeatControlData.KEY_MEMORY); + } +} + +SeatControlData.KEY_ID = 'id'; +SeatControlData.KEY_HEATING_ENABLED = 'heatingEnabled'; +SeatControlData.KEY_COOLING_ENABLED = 'coolingEnabled'; +SeatControlData.KEY_HEATING_LEVEL = 'heatingLevel'; +SeatControlData.KEY_COOLING_LEVEL = 'coolingLevel'; +SeatControlData.KEY_HORIZONTAL_POSITION = 'horizontalPosition'; +SeatControlData.KEY_VERTICAL_POSITION = 'verticalPosition'; +SeatControlData.KEY_FRONT_VERTICAL_POSITION = 'frontVerticalPosition'; +SeatControlData.KEY_BACK_VERTICAL_POSITION = 'backVerticalPosition'; +SeatControlData.KEY_BACK_TILT_ANGLE = 'backTiltAngle'; +SeatControlData.KEY_HEAD_SUPPORT_HORIZONTAL_POSITION = 'headSupportHorizontalPosition'; +SeatControlData.KEY_HEAD_SUPPORT_VERTICAL_POSITION = 'headSupportVerticalPosition'; +SeatControlData.KEY_MASSAGE_ENABLED = 'massageEnabled'; +SeatControlData.KEY_MASSAGE_MODE = 'massageMode'; +SeatControlData.KEY_MASSAGE_CUSHION_FIRMNESS = 'massageCushionFirmness'; +SeatControlData.KEY_MEMORY = 'memory'; + +export { SeatControlData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/SeatLocation.js b/lib/js/src/rpc/structs/SeatLocation.js new file mode 100644 index 00000000..3fe46eab --- /dev/null +++ b/lib/js/src/rpc/structs/SeatLocation.js @@ -0,0 +1,68 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { Grid } from './Grid.js'; + +/** + * Describes the location of a seat. + */ +class SeatLocation extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Grid} grid - Describes a location (origin coordinates and span) of a vehicle component. + * @return {SeatLocation} + */ + setGrid (grid) { + this.validateType(Grid, grid); + this.setParameter(SeatLocation.KEY_GRID, grid); + return this; + } + + /** + * @return {Grid} + */ + getGrid () { + return this.getObject(Grid, SeatLocation.KEY_GRID); + } +} + +SeatLocation.KEY_GRID = 'grid'; + +export { SeatLocation }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/SeatLocationCapability.js b/lib/js/src/rpc/structs/SeatLocationCapability.js new file mode 100644 index 00000000..d70c3db7 --- /dev/null +++ b/lib/js/src/rpc/structs/SeatLocationCapability.js @@ -0,0 +1,119 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { SeatLocation } from './SeatLocation.js'; + +/** + * Contains information about the locations of each seat + */ +class SeatLocationCapability extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} rows + * @return {SeatLocationCapability} + */ + setRows (rows) { + this.setParameter(SeatLocationCapability.KEY_ROWS, rows); + return this; + } + + /** + * @return {Number} + */ + getRows () { + return this.getParameter(SeatLocationCapability.KEY_ROWS); + } + + /** + * @param {Number} columns + * @return {SeatLocationCapability} + */ + setColumns (columns) { + this.setParameter(SeatLocationCapability.KEY_COLUMNS, columns); + return this; + } + + /** + * @return {Number} + */ + getColumns () { + return this.getParameter(SeatLocationCapability.KEY_COLUMNS); + } + + /** + * @param {Number} levels + * @return {SeatLocationCapability} + */ + setLevels (levels) { + this.setParameter(SeatLocationCapability.KEY_LEVELS, levels); + return this; + } + + /** + * @return {Number} + */ + getLevels () { + return this.getParameter(SeatLocationCapability.KEY_LEVELS); + } + + /** + * @param {SeatLocation[]} seats - Contains a list of SeatLocation in the vehicle + * @return {SeatLocationCapability} + */ + setSeats (seats) { + this.validateType(SeatLocation, seats, true); + this.setParameter(SeatLocationCapability.KEY_SEATS, seats); + return this; + } + + /** + * @return {SeatLocation[]} + */ + getSeats () { + return this.getObject(SeatLocation, SeatLocationCapability.KEY_SEATS); + } +} + +SeatLocationCapability.KEY_ROWS = 'rows'; +SeatLocationCapability.KEY_COLUMNS = 'columns'; +SeatLocationCapability.KEY_LEVELS = 'levels'; +SeatLocationCapability.KEY_SEATS = 'seats'; + +export { SeatLocationCapability }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/SeatMemoryAction.js b/lib/js/src/rpc/structs/SeatMemoryAction.js new file mode 100644 index 00000000..f8148fb6 --- /dev/null +++ b/lib/js/src/rpc/structs/SeatMemoryAction.js @@ -0,0 +1,99 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { SeatMemoryActionType } from '../enums/SeatMemoryActionType.js'; + +class SeatMemoryAction extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} id + * @return {SeatMemoryAction} + */ + setId (id) { + this.setParameter(SeatMemoryAction.KEY_ID, id); + return this; + } + + /** + * @return {Number} + */ + getId () { + return this.getParameter(SeatMemoryAction.KEY_ID); + } + + /** + * @param {String} label + * @return {SeatMemoryAction} + */ + setLabel (label) { + this.setParameter(SeatMemoryAction.KEY_LABEL, label); + return this; + } + + /** + * @return {String} + */ + getLabel () { + return this.getParameter(SeatMemoryAction.KEY_LABEL); + } + + /** + * @param {SeatMemoryActionType} action + * @return {SeatMemoryAction} + */ + setAction (action) { + this.validateType(SeatMemoryActionType, action); + this.setParameter(SeatMemoryAction.KEY_ACTION, action); + return this; + } + + /** + * @return {SeatMemoryActionType} + */ + getAction () { + return this.getObject(SeatMemoryActionType, SeatMemoryAction.KEY_ACTION); + } +} + +SeatMemoryAction.KEY_ID = 'id'; +SeatMemoryAction.KEY_LABEL = 'label'; +SeatMemoryAction.KEY_ACTION = 'action'; + +export { SeatMemoryAction }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/SingleTireStatus.js b/lib/js/src/rpc/structs/SingleTireStatus.js new file mode 100644 index 00000000..3299370c --- /dev/null +++ b/lib/js/src/rpc/structs/SingleTireStatus.js @@ -0,0 +1,101 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { ComponentVolumeStatus } from '../enums/ComponentVolumeStatus.js'; +import { RpcStruct } from '../RpcStruct.js'; +import { TPMS } from '../enums/TPMS.js'; + +class SingleTireStatus extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {ComponentVolumeStatus} status - See ComponentVolumeStatus. + * @return {SingleTireStatus} + */ + setStatus (status) { + this.validateType(ComponentVolumeStatus, status); + this.setParameter(SingleTireStatus.KEY_STATUS, status); + return this; + } + + /** + * @return {ComponentVolumeStatus} + */ + getStatus () { + return this.getObject(ComponentVolumeStatus, SingleTireStatus.KEY_STATUS); + } + + /** + * @param {TPMS} tpms - The status of TPMS according to the particular tire. + * @return {SingleTireStatus} + */ + setTpms (tpms) { + this.validateType(TPMS, tpms); + this.setParameter(SingleTireStatus.KEY_TPMS, tpms); + return this; + } + + /** + * @return {TPMS} + */ + getTpms () { + return this.getObject(TPMS, SingleTireStatus.KEY_TPMS); + } + + /** + * @param {Number} pressure - The pressure value of the particular tire in kilo pascal. + * @return {SingleTireStatus} + */ + setPressure (pressure) { + this.setParameter(SingleTireStatus.KEY_PRESSURE, pressure); + return this; + } + + /** + * @return {Number} + */ + getPressure () { + return this.getParameter(SingleTireStatus.KEY_PRESSURE); + } +} + +SingleTireStatus.KEY_STATUS = 'status'; +SingleTireStatus.KEY_TPMS = 'tpms'; +SingleTireStatus.KEY_PRESSURE = 'pressure'; + +export { SingleTireStatus }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/SisData.js b/lib/js/src/rpc/structs/SisData.js new file mode 100644 index 00000000..d8d3272d --- /dev/null +++ b/lib/js/src/rpc/structs/SisData.js @@ -0,0 +1,137 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { GPSData } from './GPSData.js'; +import { RpcStruct } from '../RpcStruct.js'; +import { StationIDNumber } from './StationIDNumber.js'; + +class SisData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} name - Identifies the 4-alpha-character station call sign plus an optional (-FM) extension + * @return {SisData} + */ + setStationShortName (name) { + this.setParameter(SisData.KEY_STATION_SHORT_NAME, name); + return this; + } + + /** + * @return {String} + */ + getStationShortName () { + return this.getParameter(SisData.KEY_STATION_SHORT_NAME); + } + + /** + * @param {StationIDNumber} number - Used for network Application. Consists of Country Code and FCC Facility ID. + * @return {SisData} + */ + setStationIDNumber (number) { + this.validateType(StationIDNumber, number); + this.setParameter(SisData.KEY_STATION_IDNUMBER, number); + return this; + } + + /** + * @return {StationIDNumber} + */ + getStationIDNumber () { + return this.getObject(StationIDNumber, SisData.KEY_STATION_IDNUMBER); + } + + /** + * @param {String} name - Identifies the station call sign or other identifying information in the long format. + * @return {SisData} + */ + setStationLongName (name) { + this.setParameter(SisData.KEY_STATION_LONG_NAME, name); + return this; + } + + /** + * @return {String} + */ + getStationLongName () { + return this.getParameter(SisData.KEY_STATION_LONG_NAME); + } + + /** + * @param {GPSData} location - Provides the 3-dimensional geographic station location. + * @return {SisData} + */ + setStationLocation (location) { + this.validateType(GPSData, location); + this.setParameter(SisData.KEY_STATION_LOCATION, location); + return this; + } + + /** + * @return {GPSData} + */ + getStationLocation () { + return this.getObject(GPSData, SisData.KEY_STATION_LOCATION); + } + + /** + * @param {String} message - May be used to convey textual information of general interest to the consumer such as + * weather forecasts or public service announcements. Includes a high priority delivery + * feature to convey emergencies that may be in the listening area. + * @return {SisData} + */ + setStationMessage (message) { + this.setParameter(SisData.KEY_STATION_MESSAGE, message); + return this; + } + + /** + * @return {String} + */ + getStationMessage () { + return this.getParameter(SisData.KEY_STATION_MESSAGE); + } +} + +SisData.KEY_STATION_SHORT_NAME = 'stationShortName'; +SisData.KEY_STATION_IDNUMBER = 'stationIDNumber'; +SisData.KEY_STATION_LONG_NAME = 'stationLongName'; +SisData.KEY_STATION_LOCATION = 'stationLocation'; +SisData.KEY_STATION_MESSAGE = 'stationMessage'; + +export { SisData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/SoftButton.js b/lib/js/src/rpc/structs/SoftButton.js index fb875de4..14398b6d 100644 --- a/lib/js/src/rpc/structs/SoftButton.js +++ b/lib/js/src/rpc/structs/SoftButton.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -32,114 +33,116 @@ import { RpcStruct } from '../RpcStruct.js'; import { SoftButtonType } from '../enums/SoftButtonType.js'; -import { SystemAction } from '../enums/SystemAction.js'; import { Image } from './Image.js'; - +import { SystemAction } from '../enums/SystemAction.js'; class SoftButton extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {SoftButtonType} type - * @return {SoftButton} - */ + * @param {SoftButtonType} type - Describes, whether it is text, highlighted text, icon, or dynamic image. See + * softButtonType + * @return {SoftButton} + */ setType (type) { this.validateType(SoftButtonType, type); - this.setParameter(SoftButton.KEY_TYPE, type); return this; } /** - * @return {SoftButtonType} - */ + * @return {SoftButtonType} + */ getType () { return this.getObject(SoftButtonType, SoftButton.KEY_TYPE); } /** - * @param {String} text - * @return {SoftButton} - */ + * @param {String} text - Optional text to display (if defined as TEXT or BOTH) + * @return {SoftButton} + */ setText (text) { this.setParameter(SoftButton.KEY_TEXT, text); return this; } /** - * @return {String} - */ + * @return {String} + */ getText () { return this.getParameter(SoftButton.KEY_TEXT); } /** - * @param {Image} image - * @return {SoftButton} - */ + * @param {Image} image - Optional image struct for SoftButton (if defined as IMAGE or BOTH) + * @return {SoftButton} + */ setImage (image) { this.validateType(Image, image); - this.setParameter(SoftButton.KEY_IMAGE, image); return this; } /** - * @return {Image} - */ + * @return {Image} + */ getImage () { return this.getObject(Image, SoftButton.KEY_IMAGE); } /** - * @param {Boolean} isHighlighted - * @return {SoftButton} - */ - setIsHighlighted (isHighlighted) { - this.setParameter(SoftButton.KEY_IS_HIGHLIGHTED, isHighlighted); + * @param {Boolean} highlighted - True, if highlighted False, if not highlighted + * @return {SoftButton} + */ + setIsHighlighted (highlighted) { + this.setParameter(SoftButton.KEY_IS_HIGHLIGHTED, highlighted); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getIsHighlighted () { return this.getParameter(SoftButton.KEY_IS_HIGHLIGHTED); } /** - * @param {Number} softButtonID - * @return {SoftButton} - */ - setSoftButtonID (softButtonID) { - this.setParameter(SoftButton.KEY_SOFT_BUTTON_ID, softButtonID); + * @param {Number} id - Value which is returned via OnButtonPress / OnButtonEvent + * @return {SoftButton} + */ + setSoftButtonID (id) { + this.setParameter(SoftButton.KEY_SOFT_BUTTON_ID, id); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getSoftButtonID () { return this.getParameter(SoftButton.KEY_SOFT_BUTTON_ID); } - /** - * @param {SystemAction} systemAction - * @return {SoftButton} - */ - setSystemAction (systemAction) { - this.validateType(SystemAction, systemAction); - - this.setParameter(SoftButton.KEY_SYSTEM_ACTION, systemAction); + * @param {SystemAction} action - Parameter indicating whether selecting a SoftButton shall call a specific system + * action. This is intended to allow Notifications to bring the callee into full / + * focus; or in the case of persistent overlays, the overlay can persist when a + * SoftButton is pressed. + * @return {SoftButton} + */ + setSystemAction (action) { + this.validateType(SystemAction, action); + this.setParameter(SoftButton.KEY_SYSTEM_ACTION, action); return this; } /** - * @return {SystemAction} - */ + * @return {SystemAction} + */ getSystemAction () { return this.getObject(SystemAction, SoftButton.KEY_SYSTEM_ACTION); } @@ -152,4 +155,4 @@ SoftButton.KEY_IS_HIGHLIGHTED = 'isHighlighted'; SoftButton.KEY_SOFT_BUTTON_ID = 'softButtonID'; SoftButton.KEY_SYSTEM_ACTION = 'systemAction'; -export { SoftButton }; +export { SoftButton }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/SoftButtonCapabilities.js b/lib/js/src/rpc/structs/SoftButtonCapabilities.js index d76f975d..7c97360e 100644 --- a/lib/js/src/rpc/structs/SoftButtonCapabilities.js +++ b/lib/js/src/rpc/structs/SoftButtonCapabilities.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -32,87 +33,98 @@ import { RpcStruct } from '../RpcStruct.js'; +/** + * Contains information about a SoftButton's capabilities. + */ class SoftButtonCapabilities extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {Boolean} shortPressAvailable - * @return {SoftButtonCapabilities} - */ - setShortPressAvailable (shortPressAvailable) { - this.setParameter(SoftButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE, shortPressAvailable); + * @param {Boolean} available - The button supports a short press. Whenever the button is pressed short, + * onButtonPressed( SHORT) will be invoked. + * @return {SoftButtonCapabilities} + */ + setShortPressAvailable (available) { + this.setParameter(SoftButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE, available); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getShortPressAvailable () { return this.getParameter(SoftButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE); } /** - * @param {Boolean} longPressAvailable - * @return {SoftButtonCapabilities} - */ - setLongPressAvailable (longPressAvailable) { - this.setParameter(SoftButtonCapabilities.KEY_LONG_PRESS_AVAILABLE, longPressAvailable); + * @param {Boolean} available - The button supports a LONG press. Whenever the button is pressed long, + * onButtonPressed( LONG) will be invoked. + * @return {SoftButtonCapabilities} + */ + setLongPressAvailable (available) { + this.setParameter(SoftButtonCapabilities.KEY_LONG_PRESS_AVAILABLE, available); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getLongPressAvailable () { return this.getParameter(SoftButtonCapabilities.KEY_LONG_PRESS_AVAILABLE); } /** - * @param {Boolean} upDownAvailable - * @return {SoftButtonCapabilities} - */ - setUpDownAvailable (upDownAvailable) { - this.setParameter(SoftButtonCapabilities.KEY_UP_DOWN_AVAILABLE, upDownAvailable); + * @param {Boolean} available - The button supports "button down" and "button up". Whenever the button is pressed, + * onButtonEvent( DOWN) will be invoked. Whenever the button is released, + * onButtonEvent( UP) will be invoked. + * @return {SoftButtonCapabilities} + */ + setUpDownAvailable (available) { + this.setParameter(SoftButtonCapabilities.KEY_UP_DOWN_AVAILABLE, available); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getUpDownAvailable () { return this.getParameter(SoftButtonCapabilities.KEY_UP_DOWN_AVAILABLE); } /** - * @param {Boolean} imageSupported - * @return {SoftButtonCapabilities} - */ - setImageSupported (imageSupported) { - this.setParameter(SoftButtonCapabilities.KEY_IMAGE_SUPPORTED, imageSupported); + * @param {Boolean} supported - The button supports referencing a static or dynamic image. + * @return {SoftButtonCapabilities} + */ + setImageSupported (supported) { + this.setParameter(SoftButtonCapabilities.KEY_IMAGE_SUPPORTED, supported); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getImageSupported () { return this.getParameter(SoftButtonCapabilities.KEY_IMAGE_SUPPORTED); } /** - * @param {Boolean} textSupported - * @return {SoftButtonCapabilities} - */ - setTextSupported (textSupported) { - this.setParameter(SoftButtonCapabilities.KEY_TEXT_SUPPORTED, textSupported); + * @param {Boolean} supported - The button supports the use of text. If not included, the default value should be + * considered true that the button will support text. + * @return {SoftButtonCapabilities} + */ + setTextSupported (supported) { + this.setParameter(SoftButtonCapabilities.KEY_TEXT_SUPPORTED, supported); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getTextSupported () { return this.getParameter(SoftButtonCapabilities.KEY_TEXT_SUPPORTED); } @@ -124,4 +136,4 @@ SoftButtonCapabilities.KEY_UP_DOWN_AVAILABLE = 'upDownAvailable'; SoftButtonCapabilities.KEY_IMAGE_SUPPORTED = 'imageSupported'; SoftButtonCapabilities.KEY_TEXT_SUPPORTED = 'textSupported'; -export { SoftButtonCapabilities }; +export { SoftButtonCapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/StartTime.js b/lib/js/src/rpc/structs/StartTime.js new file mode 100644 index 00000000..d046ff64 --- /dev/null +++ b/lib/js/src/rpc/structs/StartTime.js @@ -0,0 +1,98 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; + +class StartTime extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} hours - The hour of the media clock. Some radios only support a max of 19 hours. If out of range, + * it will be rejected. + * @return {StartTime} + */ + setHours (hours) { + this.setParameter(StartTime.KEY_HOURS, hours); + return this; + } + + /** + * @return {Number} + */ + getHours () { + return this.getParameter(StartTime.KEY_HOURS); + } + + /** + * @param {Number} minutes + * @return {StartTime} + */ + setMinutes (minutes) { + this.setParameter(StartTime.KEY_MINUTES, minutes); + return this; + } + + /** + * @return {Number} + */ + getMinutes () { + return this.getParameter(StartTime.KEY_MINUTES); + } + + /** + * @param {Number} seconds + * @return {StartTime} + */ + setSeconds (seconds) { + this.setParameter(StartTime.KEY_SECONDS, seconds); + return this; + } + + /** + * @return {Number} + */ + getSeconds () { + return this.getParameter(StartTime.KEY_SECONDS); + } +} + +StartTime.KEY_HOURS = 'hours'; +StartTime.KEY_MINUTES = 'minutes'; +StartTime.KEY_SECONDS = 'seconds'; + +export { StartTime }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/StationIDNumber.js b/lib/js/src/rpc/structs/StationIDNumber.js new file mode 100644 index 00000000..c952db81 --- /dev/null +++ b/lib/js/src/rpc/structs/StationIDNumber.js @@ -0,0 +1,81 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; + +class StationIDNumber extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} code - Binary Representation of ITU Country Code. USA Code is 001. + * @return {StationIDNumber} + */ + setCountryCode (code) { + this.setParameter(StationIDNumber.KEY_COUNTRY_CODE, code); + return this; + } + + /** + * @return {Number} + */ + getCountryCode () { + return this.getParameter(StationIDNumber.KEY_COUNTRY_CODE); + } + + /** + * @param {Number} id - Binary representation of unique facility ID assigned by the FCC; FCC controlled for U.S. + * territory + * @return {StationIDNumber} + */ + setFccFacilityId (id) { + this.setParameter(StationIDNumber.KEY_FCC_FACILITY_ID, id); + return this; + } + + /** + * @return {Number} + */ + getFccFacilityId () { + return this.getParameter(StationIDNumber.KEY_FCC_FACILITY_ID); + } +} + +StationIDNumber.KEY_COUNTRY_CODE = 'countryCode'; +StationIDNumber.KEY_FCC_FACILITY_ID = 'fccFacilityId'; + +export { StationIDNumber }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/SystemCapability.js b/lib/js/src/rpc/structs/SystemCapability.js new file mode 100644 index 00000000..270614a7 --- /dev/null +++ b/lib/js/src/rpc/structs/SystemCapability.js @@ -0,0 +1,206 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { VideoStreamingCapability } from './VideoStreamingCapability.js'; +import { PhoneCapability } from './PhoneCapability.js'; +import { DisplayCapability } from './DisplayCapability.js'; +import { RemoteControlCapabilities } from './RemoteControlCapabilities.js'; +import { SeatLocationCapability } from './SeatLocationCapability.js'; +import { SystemCapabilityType } from '../enums/SystemCapabilityType.js'; +import { AppServicesCapabilities } from './AppServicesCapabilities.js'; +import { NavigationCapability } from './NavigationCapability.js'; +import { RpcStruct } from '../RpcStruct.js'; + +/** + * The systemCapabilityType identifies which data object exists in this struct. For example, if the SystemCapability + * Type is NAVIGATION then a "navigationCapability" should exist + */ +class SystemCapability extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {SystemCapabilityType} type - Used as a descriptor of what data to expect in this struct. The + * corresponding param to this enum should be included and the only other param + * included. + * @return {SystemCapability} + */ + setSystemCapabilityType (type) { + this.validateType(SystemCapabilityType, type); + this.setParameter(SystemCapability.KEY_SYSTEM_CAPABILITY_TYPE, type); + return this; + } + + /** + * @return {SystemCapabilityType} + */ + getSystemCapabilityType () { + return this.getObject(SystemCapabilityType, SystemCapability.KEY_SYSTEM_CAPABILITY_TYPE); + } + + /** + * @param {NavigationCapability} capability - Describes extended capabilities for onboard navigation system + * @return {SystemCapability} + */ + setNavigationCapability (capability) { + this.validateType(NavigationCapability, capability); + this.setParameter(SystemCapability.KEY_NAVIGATION_CAPABILITY, capability); + return this; + } + + /** + * @return {NavigationCapability} + */ + getNavigationCapability () { + return this.getObject(NavigationCapability, SystemCapability.KEY_NAVIGATION_CAPABILITY); + } + + /** + * @param {PhoneCapability} capability - Describes extended capabilities of the module's phone feature + * @return {SystemCapability} + */ + setPhoneCapability (capability) { + this.validateType(PhoneCapability, capability); + this.setParameter(SystemCapability.KEY_PHONE_CAPABILITY, capability); + return this; + } + + /** + * @return {PhoneCapability} + */ + getPhoneCapability () { + return this.getObject(PhoneCapability, SystemCapability.KEY_PHONE_CAPABILITY); + } + + /** + * @param {VideoStreamingCapability} capability - Describes extended capabilities of the module's phone feature + * @return {SystemCapability} + */ + setVideoStreamingCapability (capability) { + this.validateType(VideoStreamingCapability, capability); + this.setParameter(SystemCapability.KEY_VIDEO_STREAMING_CAPABILITY, capability); + return this; + } + + /** + * @return {VideoStreamingCapability} + */ + getVideoStreamingCapability () { + return this.getObject(VideoStreamingCapability, SystemCapability.KEY_VIDEO_STREAMING_CAPABILITY); + } + + /** + * @param {RemoteControlCapabilities} capability - Describes extended capabilities of the module's phone feature + * @return {SystemCapability} + */ + setRemoteControlCapability (capability) { + this.validateType(RemoteControlCapabilities, capability); + this.setParameter(SystemCapability.KEY_REMOTE_CONTROL_CAPABILITY, capability); + return this; + } + + /** + * @return {RemoteControlCapabilities} + */ + getRemoteControlCapability () { + return this.getObject(RemoteControlCapabilities, SystemCapability.KEY_REMOTE_CONTROL_CAPABILITY); + } + + /** + * @param {AppServicesCapabilities} capabilities - An array of currently available services. If this is an update to + * the capability the affected services will include an update + * reason in that item + * @return {SystemCapability} + */ + setAppServicesCapabilities (capabilities) { + this.validateType(AppServicesCapabilities, capabilities); + this.setParameter(SystemCapability.KEY_APP_SERVICES_CAPABILITIES, capabilities); + return this; + } + + /** + * @return {AppServicesCapabilities} + */ + getAppServicesCapabilities () { + return this.getObject(AppServicesCapabilities, SystemCapability.KEY_APP_SERVICES_CAPABILITIES); + } + + /** + * @param {SeatLocationCapability} capability - Contains information about the locations of each seat + * @return {SystemCapability} + */ + setSeatLocationCapability (capability) { + this.validateType(SeatLocationCapability, capability); + this.setParameter(SystemCapability.KEY_SEAT_LOCATION_CAPABILITY, capability); + return this; + } + + /** + * @return {SeatLocationCapability} + */ + getSeatLocationCapability () { + return this.getObject(SeatLocationCapability, SystemCapability.KEY_SEAT_LOCATION_CAPABILITY); + } + + /** + * @param {DisplayCapability[]} capabilities + * @return {SystemCapability} + */ + setDisplayCapabilities (capabilities) { + this.validateType(DisplayCapability, capabilities, true); + this.setParameter(SystemCapability.KEY_DISPLAY_CAPABILITIES, capabilities); + return this; + } + + /** + * @return {DisplayCapability[]} + */ + getDisplayCapabilities () { + return this.getObject(DisplayCapability, SystemCapability.KEY_DISPLAY_CAPABILITIES); + } +} + +SystemCapability.KEY_SYSTEM_CAPABILITY_TYPE = 'systemCapabilityType'; +SystemCapability.KEY_NAVIGATION_CAPABILITY = 'navigationCapability'; +SystemCapability.KEY_PHONE_CAPABILITY = 'phoneCapability'; +SystemCapability.KEY_VIDEO_STREAMING_CAPABILITY = 'videoStreamingCapability'; +SystemCapability.KEY_REMOTE_CONTROL_CAPABILITY = 'remoteControlCapability'; +SystemCapability.KEY_APP_SERVICES_CAPABILITIES = 'appServicesCapabilities'; +SystemCapability.KEY_SEAT_LOCATION_CAPABILITY = 'seatLocationCapability'; +SystemCapability.KEY_DISPLAY_CAPABILITIES = 'displayCapabilities'; + +export { SystemCapability }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/TTSChunk.js b/lib/js/src/rpc/structs/TTSChunk.js index f9f299ff..d63a55d4 100644 --- a/lib/js/src/rpc/structs/TTSChunk.js +++ b/lib/js/src/rpc/structs/TTSChunk.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -33,41 +34,48 @@ import { RpcStruct } from '../RpcStruct.js'; import { SpeechCapabilities } from '../enums/SpeechCapabilities.js'; +/** + * A TTS chunk, that consists of text/phonemes to speak or the name of a file to play, and a TTS type (like text or + * SAPI) + */ class TTSChunk extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {String} text - * @return {TTSChunk} - */ + * @param {String} text - The text or phonemes to speak, or the name of the audio file to play. May not be empty. + * @return {TTSChunk} + */ setText (text) { this.setParameter(TTSChunk.KEY_TEXT, text); return this; } /** - * @return {Number} - */ + * @return {String} + */ getText () { return this.getParameter(TTSChunk.KEY_TEXT); } /** - * @param {SpeechCapabilities} type - * @return {TTSChunk} - */ + * @param {SpeechCapabilities} type - Describes whether the TTS chunk is plain text, a specific phoneme set, or an + * audio file. See SpeechCapabilities + * @return {TTSChunk} + */ setType (type) { this.validateType(SpeechCapabilities, type); - this.setParameter(TTSChunk.KEY_TYPE, type); return this; } /** - * @return {SpeechCapabilities} - */ + * @return {SpeechCapabilities} + */ getType () { return this.getObject(SpeechCapabilities, TTSChunk.KEY_TYPE); } @@ -76,4 +84,4 @@ class TTSChunk extends RpcStruct { TTSChunk.KEY_TEXT = 'text'; TTSChunk.KEY_TYPE = 'type'; -export { TTSChunk }; +export { TTSChunk }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/Temperature.js b/lib/js/src/rpc/structs/Temperature.js new file mode 100644 index 00000000..692ce7c0 --- /dev/null +++ b/lib/js/src/rpc/structs/Temperature.js @@ -0,0 +1,83 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { TemperatureUnit } from '../enums/TemperatureUnit.js'; + +class Temperature extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {TemperatureUnit} unit - Temperature Unit + * @return {Temperature} + */ + setUnit (unit) { + this.validateType(TemperatureUnit, unit); + this.setParameter(Temperature.KEY_UNIT, unit); + return this; + } + + /** + * @return {TemperatureUnit} + */ + getUnit () { + return this.getObject(TemperatureUnit, Temperature.KEY_UNIT); + } + + /** + * @param {Number} value - Temperature Value in TemperatureUnit specified unit. Range depends on OEM and is not + * checked by SDL. + * @return {Temperature} + */ + setValue (value) { + this.setParameter(Temperature.KEY_VALUE, value); + return this; + } + + /** + * @return {Number} + */ + getValue () { + return this.getParameter(Temperature.KEY_VALUE); + } +} + +Temperature.KEY_UNIT = 'unit'; +Temperature.KEY_VALUE = 'value'; + +export { Temperature }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/TemplateColorScheme.js b/lib/js/src/rpc/structs/TemplateColorScheme.js index bc84641f..a6a26587 100644 --- a/lib/js/src/rpc/structs/TemplateColorScheme.js +++ b/lib/js/src/rpc/structs/TemplateColorScheme.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -33,61 +34,64 @@ import { RpcStruct } from '../RpcStruct.js'; import { RGBColor } from './RGBColor.js'; +/** + * A color scheme for all display layout templates. + */ class TemplateColorScheme extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {RGBColor} primaryColor - * @return {TemplateColorScheme} - */ - setPrimaryColor (primaryColor) { - this.validateType(RGBColor, primaryColor); - - this.setParameter(TemplateColorScheme.KEY_PRIMARY_COLOR, primaryColor); + * @param {RGBColor} color - The primary "accent" color + * @return {TemplateColorScheme} + */ + setPrimaryColor (color) { + this.validateType(RGBColor, color); + this.setParameter(TemplateColorScheme.KEY_PRIMARY_COLOR, color); return this; } /** - * @return {RGBColor} - */ + * @return {RGBColor} + */ getPrimaryColor () { return this.getObject(RGBColor, TemplateColorScheme.KEY_PRIMARY_COLOR); } /** - * @param {RGBColor} secondaryColor - * @return {TemplateColorScheme} - */ - setSecondaryColor (secondaryColor) { - this.validateType(RGBColor, secondaryColor); - - this.setParameter(TemplateColorScheme.KEY_SECONDARY_COLOR, secondaryColor); + * @param {RGBColor} color - The secondary "accent" color + * @return {TemplateColorScheme} + */ + setSecondaryColor (color) { + this.validateType(RGBColor, color); + this.setParameter(TemplateColorScheme.KEY_SECONDARY_COLOR, color); return this; } /** - * @return {RGBColor} - */ + * @return {RGBColor} + */ getSecondaryColor () { return this.getObject(RGBColor, TemplateColorScheme.KEY_SECONDARY_COLOR); } /** - * @param {RGBColor} backgroundColor - * @return {TemplateColorScheme} - */ - setBackgroundColor (backgroundColor) { - this.validateType(RGBColor, backgroundColor); - - this.setParameter(TemplateColorScheme.KEY_BACKGROUND_COLOR, backgroundColor); + * @param {RGBColor} color - The color of the background + * @return {TemplateColorScheme} + */ + setBackgroundColor (color) { + this.validateType(RGBColor, color); + this.setParameter(TemplateColorScheme.KEY_BACKGROUND_COLOR, color); return this; } /** - * @return {RGBColor} - */ + * @return {RGBColor} + */ getBackgroundColor () { return this.getObject(RGBColor, TemplateColorScheme.KEY_BACKGROUND_COLOR); } @@ -97,4 +101,4 @@ TemplateColorScheme.KEY_PRIMARY_COLOR = 'primaryColor'; TemplateColorScheme.KEY_SECONDARY_COLOR = 'secondaryColor'; TemplateColorScheme.KEY_BACKGROUND_COLOR = 'backgroundColor'; -export { TemplateColorScheme }; +export { TemplateColorScheme }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/TemplateConfiguration.js b/lib/js/src/rpc/structs/TemplateConfiguration.js new file mode 100644 index 00000000..a63db77e --- /dev/null +++ b/lib/js/src/rpc/structs/TemplateConfiguration.js @@ -0,0 +1,101 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { TemplateColorScheme } from './TemplateColorScheme.js'; + +class TemplateConfiguration extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} template - Predefined or dynamically created window template. Currently only predefined window + * template layouts are defined. + * @return {TemplateConfiguration} + */ + setTemplate (template) { + this.setParameter(TemplateConfiguration.KEY_TEMPLATE, template); + return this; + } + + /** + * @return {String} + */ + getTemplate () { + return this.getParameter(TemplateConfiguration.KEY_TEMPLATE); + } + + /** + * @param {TemplateColorScheme} scheme - A color scheme for all display layout templates. + * @return {TemplateConfiguration} + */ + setDayColorScheme (scheme) { + this.validateType(TemplateColorScheme, scheme); + this.setParameter(TemplateConfiguration.KEY_DAY_COLOR_SCHEME, scheme); + return this; + } + + /** + * @return {TemplateColorScheme} + */ + getDayColorScheme () { + return this.getObject(TemplateColorScheme, TemplateConfiguration.KEY_DAY_COLOR_SCHEME); + } + + /** + * @param {TemplateColorScheme} scheme - A color scheme for all display layout templates. + * @return {TemplateConfiguration} + */ + setNightColorScheme (scheme) { + this.validateType(TemplateColorScheme, scheme); + this.setParameter(TemplateConfiguration.KEY_NIGHT_COLOR_SCHEME, scheme); + return this; + } + + /** + * @return {TemplateColorScheme} + */ + getNightColorScheme () { + return this.getObject(TemplateColorScheme, TemplateConfiguration.KEY_NIGHT_COLOR_SCHEME); + } +} + +TemplateConfiguration.KEY_TEMPLATE = 'template'; +TemplateConfiguration.KEY_DAY_COLOR_SCHEME = 'dayColorScheme'; +TemplateConfiguration.KEY_NIGHT_COLOR_SCHEME = 'nightColorScheme'; + +export { TemplateConfiguration }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/TextField.js b/lib/js/src/rpc/structs/TextField.js index bb2332f9..4f7d4d72 100644 --- a/lib/js/src/rpc/structs/TextField.js +++ b/lib/js/src/rpc/structs/TextField.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -30,80 +31,80 @@ * POSSIBILITY OF SUCH DAMAGE. */ -import { RpcStruct } from '../RpcStruct.js'; import { TextFieldName } from '../enums/TextFieldName.js'; import { CharacterSet } from '../enums/CharacterSet.js'; +import { RpcStruct } from '../RpcStruct.js'; class TextField extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {TextFieldName} textFieldName - * @return {TextField} - */ - setTextFieldName (textFieldName) { - this.validateType(TextFieldName, textFieldName); - - this.setParameter(TextField.KEY_NAME, textFieldName); + * @param {TextFieldName} name - The name that identifies the field. See TextFieldName. + * @return {TextField} + */ + setName (name) { + this.validateType(TextFieldName, name); + this.setParameter(TextField.KEY_NAME, name); return this; } /** - * @return {TextFieldName} - */ - getTextFieldName () { + * @return {TextFieldName} + */ + getName () { return this.getObject(TextFieldName, TextField.KEY_NAME); } - /** - * @param {CharacterSet} textFieldName - * @return {TextField} - */ - setCharacterSet (characterSet) { - this.validateType(CharacterSet, characterSet); - - this.setParameter(TextField.KEY_CHARACTER_SET, characterSet); + * @param {CharacterSet} set - The character set that is supported in this field. See CharacterSet. + * @return {TextField} + */ + setCharacterSet (set) { + this.validateType(CharacterSet, set); + this.setParameter(TextField.KEY_CHARACTER_SET, set); return this; } /** - * @return {CharacterSet} - */ + * @return {CharacterSet} + */ getCharacterSet () { return this.getObject(CharacterSet, TextField.KEY_CHARACTER_SET); } /** - * @param {Number} width - * @return {TextField} - */ + * @param {Number} width - The number of characters in one row of this field. + * @return {TextField} + */ setWidth (width) { this.setParameter(TextField.KEY_WIDTH, width); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getWidth () { return this.getParameter(TextField.KEY_WIDTH); } /** - * @param {Number} rows - * @return {TextField} - */ + * @param {Number} rows - The number of rows of this field. + * @return {TextField} + */ setRows (rows) { this.setParameter(TextField.KEY_ROWS, rows); return this; } /** - * @return {Number} - */ + * @return {Number} + */ getRows () { return this.getParameter(TextField.KEY_ROWS); } @@ -114,4 +115,4 @@ TextField.KEY_CHARACTER_SET = 'characterSet'; TextField.KEY_WIDTH = 'width'; TextField.KEY_ROWS = 'rows'; -export { TextField }; +export { TextField }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/TireStatus.js b/lib/js/src/rpc/structs/TireStatus.js new file mode 100644 index 00000000..183c7182 --- /dev/null +++ b/lib/js/src/rpc/structs/TireStatus.js @@ -0,0 +1,177 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { SingleTireStatus } from './SingleTireStatus.js'; +import { WarningLightStatus } from '../enums/WarningLightStatus.js'; + +/** + * The status and pressure of the tires. + */ +class TireStatus extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {WarningLightStatus} telltale - Status of the Tire Pressure Telltale. See WarningLightStatus. + * @return {TireStatus} + */ + setPressureTelltale (telltale) { + this.validateType(WarningLightStatus, telltale); + this.setParameter(TireStatus.KEY_PRESSURE_TELLTALE, telltale); + return this; + } + + /** + * @return {WarningLightStatus} + */ + getPressureTelltale () { + return this.getObject(WarningLightStatus, TireStatus.KEY_PRESSURE_TELLTALE); + } + + /** + * @param {SingleTireStatus} front - The status of the left front tire. + * @return {TireStatus} + */ + setLeftFront (front) { + this.validateType(SingleTireStatus, front); + this.setParameter(TireStatus.KEY_LEFT_FRONT, front); + return this; + } + + /** + * @return {SingleTireStatus} + */ + getLeftFront () { + return this.getObject(SingleTireStatus, TireStatus.KEY_LEFT_FRONT); + } + + /** + * @param {SingleTireStatus} front - The status of the right front tire. + * @return {TireStatus} + */ + setRightFront (front) { + this.validateType(SingleTireStatus, front); + this.setParameter(TireStatus.KEY_RIGHT_FRONT, front); + return this; + } + + /** + * @return {SingleTireStatus} + */ + getRightFront () { + return this.getObject(SingleTireStatus, TireStatus.KEY_RIGHT_FRONT); + } + + /** + * @param {SingleTireStatus} rear - The status of the left rear tire. + * @return {TireStatus} + */ + setLeftRear (rear) { + this.validateType(SingleTireStatus, rear); + this.setParameter(TireStatus.KEY_LEFT_REAR, rear); + return this; + } + + /** + * @return {SingleTireStatus} + */ + getLeftRear () { + return this.getObject(SingleTireStatus, TireStatus.KEY_LEFT_REAR); + } + + /** + * @param {SingleTireStatus} rear - The status of the right rear tire. + * @return {TireStatus} + */ + setRightRear (rear) { + this.validateType(SingleTireStatus, rear); + this.setParameter(TireStatus.KEY_RIGHT_REAR, rear); + return this; + } + + /** + * @return {SingleTireStatus} + */ + getRightRear () { + return this.getObject(SingleTireStatus, TireStatus.KEY_RIGHT_REAR); + } + + /** + * @param {SingleTireStatus} rear - The status of the inner left rear. + * @return {TireStatus} + */ + setInnerLeftRear (rear) { + this.validateType(SingleTireStatus, rear); + this.setParameter(TireStatus.KEY_INNER_LEFT_REAR, rear); + return this; + } + + /** + * @return {SingleTireStatus} + */ + getInnerLeftRear () { + return this.getObject(SingleTireStatus, TireStatus.KEY_INNER_LEFT_REAR); + } + + /** + * @param {SingleTireStatus} rear - The status of the inner right rear. + * @return {TireStatus} + */ + setInnerRightRear (rear) { + this.validateType(SingleTireStatus, rear); + this.setParameter(TireStatus.KEY_INNER_RIGHT_REAR, rear); + return this; + } + + /** + * @return {SingleTireStatus} + */ + getInnerRightRear () { + return this.getObject(SingleTireStatus, TireStatus.KEY_INNER_RIGHT_REAR); + } +} + +TireStatus.KEY_PRESSURE_TELLTALE = 'pressureTelltale'; +TireStatus.KEY_LEFT_FRONT = 'leftFront'; +TireStatus.KEY_RIGHT_FRONT = 'rightFront'; +TireStatus.KEY_LEFT_REAR = 'leftRear'; +TireStatus.KEY_RIGHT_REAR = 'rightRear'; +TireStatus.KEY_INNER_LEFT_REAR = 'innerLeftRear'; +TireStatus.KEY_INNER_RIGHT_REAR = 'innerRightRear'; + +export { TireStatus }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/TouchCoord.js b/lib/js/src/rpc/structs/TouchCoord.js new file mode 100644 index 00000000..000abbc4 --- /dev/null +++ b/lib/js/src/rpc/structs/TouchCoord.js @@ -0,0 +1,80 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; + +class TouchCoord extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} x - The x coordinate of the touch. + * @return {TouchCoord} + */ + setX (x) { + this.setParameter(TouchCoord.KEY_X, x); + return this; + } + + /** + * @return {Number} + */ + getX () { + return this.getParameter(TouchCoord.KEY_X); + } + + /** + * @param {Number} y - The y coordinate of the touch. + * @return {TouchCoord} + */ + setY (y) { + this.setParameter(TouchCoord.KEY_Y, y); + return this; + } + + /** + * @return {Number} + */ + getY () { + return this.getParameter(TouchCoord.KEY_Y); + } +} + +TouchCoord.KEY_X = 'x'; +TouchCoord.KEY_Y = 'y'; + +export { TouchCoord }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/TouchEvent.js b/lib/js/src/rpc/structs/TouchEvent.js new file mode 100644 index 00000000..d1558d4a --- /dev/null +++ b/lib/js/src/rpc/structs/TouchEvent.js @@ -0,0 +1,106 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { TouchCoord } from './TouchCoord.js'; + +class TouchEvent extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} id - A touch's unique identifier. The application can track the current touch events by id. If a + * touch event has type begin, the id should be added to the set of touches. If a touch event + * has type end, the id should be removed from the set of touches. + * @return {TouchEvent} + */ + setId (id) { + this.setParameter(TouchEvent.KEY_ID, id); + return this; + } + + /** + * @return {Number} + */ + getId () { + return this.getParameter(TouchEvent.KEY_ID); + } + + /** + * @param {Number[]} ts - The time that the touch was recorded. This number can the time since the beginning of the + * session or something else as long as the units are in milliseconds. The timestamp is used + * to determined the rate of change of position of a touch. The application also uses the + * time to verify whether two touches, with different ids, are part of a single action by the + * user. If there is only a single timestamp in this array, it is the same for every + * coordinate in the coordinates array. + * @return {TouchEvent} + */ + setTs (ts) { + this.setParameter(TouchEvent.KEY_TS, ts); + return this; + } + + /** + * @return {Number[]} + */ + getTs () { + return this.getParameter(TouchEvent.KEY_TS); + } + + /** + * @param {TouchCoord[]} c + * @return {TouchEvent} + */ + setC (c) { + this.validateType(TouchCoord, c, true); + this.setParameter(TouchEvent.KEY_C, c); + return this; + } + + /** + * @return {TouchCoord[]} + */ + getC () { + return this.getObject(TouchCoord, TouchEvent.KEY_C); + } +} + +TouchEvent.KEY_ID = 'id'; +TouchEvent.KEY_TS = 'ts'; +TouchEvent.KEY_C = 'c'; + +export { TouchEvent }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/TouchEventCapabilities.js b/lib/js/src/rpc/structs/TouchEventCapabilities.js index ab0a4760..b686d702 100644 --- a/lib/js/src/rpc/structs/TouchEventCapabilities.js +++ b/lib/js/src/rpc/structs/TouchEventCapabilities.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -33,57 +34,57 @@ import { RpcStruct } from '../RpcStruct.js'; class TouchEventCapabilities extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } - /** - * @param {Boolean} pressAvailable - * @return {TouchEventCapabilities} - */ - setPressAvailable (pressAvailable) { - this.setParameter(TouchEventCapabilities.KEY_PRESS_AVAILABLE, pressAvailable); + * @param {Boolean} available + * @return {TouchEventCapabilities} + */ + setPressAvailable (available) { + this.setParameter(TouchEventCapabilities.KEY_PRESS_AVAILABLE, available); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getPressAvailable () { return this.getParameter(TouchEventCapabilities.KEY_PRESS_AVAILABLE); } /** - * @param {Boolean} multiTouchAvailable - * @return {TouchEventCapabilities} - */ - setMultiTouchAvailable (multiTouchAvailable) { - this.setParameter(TouchEventCapabilities.KEY_MULTI_TOUCH_AVAILABLE, multiTouchAvailable); + * @param {Boolean} available + * @return {TouchEventCapabilities} + */ + setMultiTouchAvailable (available) { + this.setParameter(TouchEventCapabilities.KEY_MULTI_TOUCH_AVAILABLE, available); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getMultiTouchAvailable () { return this.getParameter(TouchEventCapabilities.KEY_MULTI_TOUCH_AVAILABLE); } - - /** - * @param {Boolean} doublePressAvailable - * @return {TouchEventCapabilities} - */ - setDoublePressAvailable (doublePressAvailable) { - this.setParameter(TouchEventCapabilities.KEY_DOUBLE_PRESS_AVAILABLE, doublePressAvailable); + * @param {Boolean} available + * @return {TouchEventCapabilities} + */ + setDoublePressAvailable (available) { + this.setParameter(TouchEventCapabilities.KEY_DOUBLE_PRESS_AVAILABLE, available); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getDoublePressAvailable () { return this.getParameter(TouchEventCapabilities.KEY_DOUBLE_PRESS_AVAILABLE); } @@ -93,4 +94,4 @@ TouchEventCapabilities.KEY_PRESS_AVAILABLE = 'pressAvailable'; TouchEventCapabilities.KEY_MULTI_TOUCH_AVAILABLE = 'multiTouchAvailable'; TouchEventCapabilities.KEY_DOUBLE_PRESS_AVAILABLE = 'doublePressAvailable'; -export { TouchEventCapabilities }; +export { TouchEventCapabilities }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/Turn.js b/lib/js/src/rpc/structs/Turn.js new file mode 100644 index 00000000..e139cbae --- /dev/null +++ b/lib/js/src/rpc/structs/Turn.js @@ -0,0 +1,82 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { Image } from './Image.js'; + +class Turn extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} text - Individual turn text. Must provide at least text or icon for a given turn. + * @return {Turn} + */ + setNavigationText (text) { + this.setParameter(Turn.KEY_NAVIGATION_TEXT, text); + return this; + } + + /** + * @return {String} + */ + getNavigationText () { + return this.getParameter(Turn.KEY_NAVIGATION_TEXT); + } + + /** + * @param {Image} icon - Individual turn icon. Must provide at least text or icon for a given turn. + * @return {Turn} + */ + setTurnIcon (icon) { + this.validateType(Image, icon); + this.setParameter(Turn.KEY_TURN_ICON, icon); + return this; + } + + /** + * @return {Image} + */ + getTurnIcon () { + return this.getObject(Image, Turn.KEY_TURN_ICON); + } +} + +Turn.KEY_NAVIGATION_TEXT = 'navigationText'; +Turn.KEY_TURN_ICON = 'turnIcon'; + +export { Turn }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/VehicleDataResult.js b/lib/js/src/rpc/structs/VehicleDataResult.js new file mode 100644 index 00000000..700e29b3 --- /dev/null +++ b/lib/js/src/rpc/structs/VehicleDataResult.js @@ -0,0 +1,104 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { VehicleDataResultCode } from '../enums/VehicleDataResultCode.js'; +import { VehicleDataType } from '../enums/VehicleDataType.js'; + +/** + * Individual published data request result + */ +class VehicleDataResult extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {VehicleDataType} type - Defined published data element type. + * @return {VehicleDataResult} + */ + setDataType (type) { + this.validateType(VehicleDataType, type); + this.setParameter(VehicleDataResult.KEY_DATA_TYPE, type); + return this; + } + + /** + * @return {VehicleDataType} + */ + getDataType () { + return this.getObject(VehicleDataType, VehicleDataResult.KEY_DATA_TYPE); + } + + /** + * @param {VehicleDataResultCode} code - Published data result code. + * @return {VehicleDataResult} + */ + setResultCode (code) { + this.validateType(VehicleDataResultCode, code); + this.setParameter(VehicleDataResult.KEY_RESULT_CODE, code); + return this; + } + + /** + * @return {VehicleDataResultCode} + */ + getResultCode () { + return this.getObject(VehicleDataResultCode, VehicleDataResult.KEY_RESULT_CODE); + } + + /** + * @param {String} type - Type of requested oem specific parameter + * @return {VehicleDataResult} + */ + setOemCustomDataType (type) { + this.setParameter(VehicleDataResult.KEY_OEM_CUSTOM_DATA_TYPE, type); + return this; + } + + /** + * @return {String} + */ + getOemCustomDataType () { + return this.getParameter(VehicleDataResult.KEY_OEM_CUSTOM_DATA_TYPE); + } +} + +VehicleDataResult.KEY_DATA_TYPE = 'dataType'; +VehicleDataResult.KEY_RESULT_CODE = 'resultCode'; +VehicleDataResult.KEY_OEM_CUSTOM_DATA_TYPE = 'oemCustomDataType'; + +export { VehicleDataResult }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/VehicleType.js b/lib/js/src/rpc/structs/VehicleType.js index d80b4e92..ce4b3ff1 100644 --- a/lib/js/src/rpc/structs/VehicleType.js +++ b/lib/js/src/rpc/structs/VehicleType.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -33,71 +34,73 @@ import { RpcStruct } from '../RpcStruct.js'; class VehicleType extends RpcStruct { + /** + * @constructor + */ constructor (parameters) { super(parameters); } /** - * @param {String} make - * @return {VehicleType} - */ + * @param {String} make - Make of the vehicle, e.g. Ford + * @return {VehicleType} + */ setMake (make) { this.setParameter(VehicleType.KEY_MAKE, make); return this; } /** - * @return {String} - */ + * @return {String} + */ getMake () { return this.getParameter(VehicleType.KEY_MAKE); } /** - * @param {String} model - * @return {VehicleType} - */ + * @param {String} model - Model of the vehicle, e.g. Fiesta + * @return {VehicleType} + */ setModel (model) { this.setParameter(VehicleType.KEY_MODEL, model); return this; } /** - * @return {String} - */ + * @return {String} + */ getModel () { return this.getParameter(VehicleType.KEY_MODEL); } /** - * @param {String} modelYear - * @return {VehicleType} - */ - setModelYear (modelYear) { - this.setParameter(VehicleType.KEY_MODEL_YEAR, modelYear); + * @param {String} year - Model Year of the vehicle, e.g. 2013 + * @return {VehicleType} + */ + setModelYear (year) { + this.setParameter(VehicleType.KEY_MODEL_YEAR, year); return this; } /** - * @return {String} - */ + * @return {String} + */ getModelYear () { return this.getParameter(VehicleType.KEY_MODEL_YEAR); } - /** - * @param {String} trim - * @return {VehicleType} - */ + * @param {String} trim - Trim of the vehicle, e.g. SE + * @return {VehicleType} + */ setTrim (trim) { this.setParameter(VehicleType.KEY_TRIM, trim); return this; } /** - * @return {String} - */ + * @return {String} + */ getTrim () { return this.getParameter(VehicleType.KEY_TRIM); } @@ -108,4 +111,4 @@ VehicleType.KEY_MODEL = 'model'; VehicleType.KEY_MODEL_YEAR = 'modelYear'; VehicleType.KEY_TRIM = 'trim'; -export { VehicleType }; +export { VehicleType }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/VideoStreamingCapability.js b/lib/js/src/rpc/structs/VideoStreamingCapability.js index 345584da..73ab6b1c 100644 --- a/lib/js/src/rpc/structs/VideoStreamingCapability.js +++ b/lib/js/src/rpc/structs/VideoStreamingCapability.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -31,127 +32,136 @@ */ import { RpcStruct } from '../RpcStruct.js'; -import { VideoStreamingFormat } from './VideoStreamingFormat.js'; import { ImageResolution } from './ImageResolution.js'; +import { VideoStreamingFormat } from './VideoStreamingFormat.js'; +/** + * Contains information about this system's video streaming capabilities. + */ class VideoStreamingCapability extends RpcStruct { /** - * @constructor - */ - constructor () { - super(); + * @constructor + */ + constructor (parameters) { + super(parameters); } /** - * @param {ImageResolution} val - * @return {VideoStreamingCapability} - */ - setPreferredResolution (val) { - this.validateType(ImageResolution, val); - this.setParameter(VideoStreamingCapability.KEY_PREFERRED_RESOLUTION, val); + * @param {ImageResolution} resolution - The preferred resolution of a video stream for decoding and rendering on + * HMI. + * @return {VideoStreamingCapability} + */ + setPreferredResolution (resolution) { + this.validateType(ImageResolution, resolution); + this.setParameter(VideoStreamingCapability.KEY_PREFERRED_RESOLUTION, resolution); return this; } /** - * @return {ImageResolution} - */ + * @return {ImageResolution} + */ getPreferredResolution () { return this.getObject(ImageResolution, VideoStreamingCapability.KEY_PREFERRED_RESOLUTION); } /** - * @param {number} val - * @return {VideoStreamingCapability} - */ - setMaxBitrate (val) { - this.setParameter(VideoStreamingCapability.KEY_MAX_BITRATE, val); + * @param {Number} bitrate - The maximum bitrate of video stream that is supported, in kbps. + * @return {VideoStreamingCapability} + */ + setMaxBitrate (bitrate) { + this.setParameter(VideoStreamingCapability.KEY_MAX_BITRATE, bitrate); return this; } /** - * @return {number} - */ + * @return {Number} + */ getMaxBitrate () { return this.getParameter(VideoStreamingCapability.KEY_MAX_BITRATE); } - /** - * @param {VideoStreamingFormat[]} val - * @return {VideoStreamingCapability} - */ - setSupportedFormats (val) { - this.validateType(VideoStreamingFormat, val, true); - this.setParameter(VideoStreamingCapability.KEY_SUPPORTED_FORMATS, val); + * @param {VideoStreamingFormat[]} formats - Detailed information on each format supported by this system, in its + * preferred order (i.e. the first element in the array is most preferable + * to the system). Each object will contain a VideoStreamingFormat that + * describes what can be expected. + * @return {VideoStreamingCapability} + */ + setSupportedFormats (formats) { + this.validateType(VideoStreamingFormat, formats, true); + this.setParameter(VideoStreamingCapability.KEY_SUPPORTED_FORMATS, formats); + return this; } /** - * @return {VideoStreamingFormat[]} - */ + * @return {VideoStreamingFormat[]} + */ getSupportedFormats () { return this.getObject(VideoStreamingFormat, VideoStreamingCapability.KEY_SUPPORTED_FORMATS); } /** - * @param {Boolean} val - * @return {VideoStreamingCapability} - */ - setHapticSpatialDataSupported (val) { - this.setParameter(VideoStreamingCapability.KEY_HAPTIC_SPATIAL_DATA_SUPPORTED, val); + * @param {Boolean} supported - True if the system can utilize the haptic spatial data from the source being + * streamed. If not included, it can be assumed the module doesn't support haptic + * spatial data'. + * @return {VideoStreamingCapability} + */ + setHapticSpatialDataSupported (supported) { + this.setParameter(VideoStreamingCapability.KEY_HAPTIC_SPATIAL_DATA_SUPPORTED, supported); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getHapticSpatialDataSupported () { return this.getParameter(VideoStreamingCapability.KEY_HAPTIC_SPATIAL_DATA_SUPPORTED); } /** - * @param {number} val - * @return {VideoStreamingCapability} - */ - setDiagonalScreenSize (val) { - this.setParameter(VideoStreamingCapability.KEY_DIAGONAL_SCREEN_SIZE, val); + * @param {Number} size - The diagonal screen size in inches. + * @return {VideoStreamingCapability} + */ + setDiagonalScreenSize (size) { + this.setParameter(VideoStreamingCapability.KEY_DIAGONAL_SCREEN_SIZE, size); return this; } /** - * @return {number} - */ + * @return {Number} + */ getDiagonalScreenSize () { return this.getParameter(VideoStreamingCapability.KEY_DIAGONAL_SCREEN_SIZE); } /** - * @param {number} val - * @return {VideoStreamingCapability} - */ - setPixelPerInch (val) { - this.setParameter(VideoStreamingCapability.KEY_PIXEL_PER_INCH, val); + * @param {Number} inch - PPI is the diagonal resolution in pixels divided by the diagonal screen size in inches. + * @return {VideoStreamingCapability} + */ + setPixelPerInch (inch) { + this.setParameter(VideoStreamingCapability.KEY_PIXEL_PER_INCH, inch); return this; } /** - * @return {number} - */ + * @return {Number} + */ getPixelPerInch () { return this.getParameter(VideoStreamingCapability.KEY_PIXEL_PER_INCH); } /** - * @param {number} val - * @return {VideoStreamingCapability} - */ - setScale (val) { - this.setParameter(VideoStreamingCapability.KEY_SCALE, val); + * @param {Number} scale - The scaling factor the app should use to change the size of the projecting view. + * @return {VideoStreamingCapability} + */ + setScale (scale) { + this.setParameter(VideoStreamingCapability.KEY_SCALE, scale); return this; } /** - * @return {number} - */ + * @return {Number} + */ getScale () { return this.getParameter(VideoStreamingCapability.KEY_SCALE); } @@ -165,4 +175,4 @@ VideoStreamingCapability.KEY_DIAGONAL_SCREEN_SIZE = 'diagonalScreenSize'; VideoStreamingCapability.KEY_PIXEL_PER_INCH = 'pixelPerInch'; VideoStreamingCapability.KEY_SCALE = 'scale'; -export { VideoStreamingCapability }; +export { VideoStreamingCapability }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/VideoStreamingFormat.js b/lib/js/src/rpc/structs/VideoStreamingFormat.js index ede6a114..22520c62 100644 --- a/lib/js/src/rpc/structs/VideoStreamingFormat.js +++ b/lib/js/src/rpc/structs/VideoStreamingFormat.js @@ -1,5 +1,6 @@ +/* eslint-disable camelcase */ /* -* Copyright (c) 2019, Livio, Inc. +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,9 +14,9 @@ * disclaimer in the documentation and/or other materials provided with the * distribution. * -* Neither the name of the Livio Inc. nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -31,52 +32,56 @@ */ import { RpcStruct } from '../RpcStruct.js'; -import { VideoStreamingProtocol } from '../enums/VideoStreamingProtocol.js'; import { VideoStreamingCodec } from '../enums/VideoStreamingCodec.js'; +import { VideoStreamingProtocol } from '../enums/VideoStreamingProtocol.js'; +/** + * Video streaming formats and their specifications. + */ class VideoStreamingFormat extends RpcStruct { /** - * @constructor - */ - constructor () { - super(); + * @constructor + */ + constructor (parameters) { + super(parameters); } + /** - * @param {VideoStreamingProtocol} val - * @return {VideoStreamingFormat} - */ - setProtocol (val) { - this.validateType(VideoStreamingProtocol, val); - this.setParameter(VideoStreamingFormat.KEY_PROTOCOL, val); + * @param {VideoStreamingProtocol} protocol - Protocol type, see VideoStreamingProtocol + * @return {VideoStreamingFormat} + */ + setProtocol (protocol) { + this.validateType(VideoStreamingProtocol, protocol); + this.setParameter(VideoStreamingFormat.KEY_PROTOCOL, protocol); return this; } /** - * @return {VideoStreamingProtocol} - */ + * @return {VideoStreamingProtocol} + */ getProtocol () { - return this.getParameter(VideoStreamingFormat.KEY_PROTOCOL); + return this.getObject(VideoStreamingProtocol, VideoStreamingFormat.KEY_PROTOCOL); } /** - * @param {VideoStreamingCodec} val - * @return {VideoStreamingFormat} - */ - setCodec (val) { - this.validateType(VideoStreamingCodec, val); - this.setParameter(VideoStreamingFormat.KEY_CODEC, val); + * @param {VideoStreamingCodec} codec - Codec type, see VideoStreamingCodec + * @return {VideoStreamingFormat} + */ + setCodec (codec) { + this.validateType(VideoStreamingCodec, codec); + this.setParameter(VideoStreamingFormat.KEY_CODEC, codec); return this; } /** - * @return {VideoStreamingCodec} - */ + * @return {VideoStreamingCodec} + */ getCodec () { - return this.getParameter(VideoStreamingFormat.KEY_CODEC); + return this.getObject(VideoStreamingCodec, VideoStreamingFormat.KEY_CODEC); } } VideoStreamingFormat.KEY_PROTOCOL = 'protocol'; VideoStreamingFormat.KEY_CODEC = 'codec'; -export { VideoStreamingFormat }; +export { VideoStreamingFormat }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/VrHelpItem.js b/lib/js/src/rpc/structs/VrHelpItem.js new file mode 100644 index 00000000..8103308c --- /dev/null +++ b/lib/js/src/rpc/structs/VrHelpItem.js @@ -0,0 +1,99 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; +import { Image } from './Image.js'; + +class VrHelpItem extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} text - Text to display for VR Help item + * @return {VrHelpItem} + */ + setText (text) { + this.setParameter(VrHelpItem.KEY_TEXT, text); + return this; + } + + /** + * @return {String} + */ + getText () { + return this.getParameter(VrHelpItem.KEY_TEXT); + } + + /** + * @param {Image} image - Image struct for VR Help item + * @return {VrHelpItem} + */ + setImage (image) { + this.validateType(Image, image); + this.setParameter(VrHelpItem.KEY_IMAGE, image); + return this; + } + + /** + * @return {Image} + */ + getImage () { + return this.getObject(Image, VrHelpItem.KEY_IMAGE); + } + + /** + * @param {Number} position - Position to display item in VR Help list + * @return {VrHelpItem} + */ + setPosition (position) { + this.setParameter(VrHelpItem.KEY_POSITION, position); + return this; + } + + /** + * @return {Number} + */ + getPosition () { + return this.getParameter(VrHelpItem.KEY_POSITION); + } +} + +VrHelpItem.KEY_TEXT = 'text'; +VrHelpItem.KEY_IMAGE = 'image'; +VrHelpItem.KEY_POSITION = 'position'; + +export { VrHelpItem }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/WeatherAlert.js b/lib/js/src/rpc/structs/WeatherAlert.js new file mode 100644 index 00000000..6520340b --- /dev/null +++ b/lib/js/src/rpc/structs/WeatherAlert.js @@ -0,0 +1,151 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { DateTime } from './DateTime.js'; +import { RpcStruct } from '../RpcStruct.js'; + +class WeatherAlert extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {String} title + * @return {WeatherAlert} + */ + setTitle (title) { + this.setParameter(WeatherAlert.KEY_TITLE, title); + return this; + } + + /** + * @return {String} + */ + getTitle () { + return this.getParameter(WeatherAlert.KEY_TITLE); + } + + /** + * @param {String} summary + * @return {WeatherAlert} + */ + setSummary (summary) { + this.setParameter(WeatherAlert.KEY_SUMMARY, summary); + return this; + } + + /** + * @return {String} + */ + getSummary () { + return this.getParameter(WeatherAlert.KEY_SUMMARY); + } + + /** + * @param {DateTime} expires + * @return {WeatherAlert} + */ + setExpires (expires) { + this.validateType(DateTime, expires); + this.setParameter(WeatherAlert.KEY_EXPIRES, expires); + return this; + } + + /** + * @return {DateTime} + */ + getExpires () { + return this.getObject(DateTime, WeatherAlert.KEY_EXPIRES); + } + + /** + * @param {String[]} regions + * @return {WeatherAlert} + */ + setRegions (regions) { + this.setParameter(WeatherAlert.KEY_REGIONS, regions); + return this; + } + + /** + * @return {String[]} + */ + getRegions () { + return this.getParameter(WeatherAlert.KEY_REGIONS); + } + + /** + * @param {String} severity + * @return {WeatherAlert} + */ + setSeverity (severity) { + this.setParameter(WeatherAlert.KEY_SEVERITY, severity); + return this; + } + + /** + * @return {String} + */ + getSeverity () { + return this.getParameter(WeatherAlert.KEY_SEVERITY); + } + + /** + * @param {DateTime} issued + * @return {WeatherAlert} + */ + setTimeIssued (issued) { + this.validateType(DateTime, issued); + this.setParameter(WeatherAlert.KEY_TIME_ISSUED, issued); + return this; + } + + /** + * @return {DateTime} + */ + getTimeIssued () { + return this.getObject(DateTime, WeatherAlert.KEY_TIME_ISSUED); + } +} + +WeatherAlert.KEY_TITLE = 'title'; +WeatherAlert.KEY_SUMMARY = 'summary'; +WeatherAlert.KEY_EXPIRES = 'expires'; +WeatherAlert.KEY_REGIONS = 'regions'; +WeatherAlert.KEY_SEVERITY = 'severity'; +WeatherAlert.KEY_TIME_ISSUED = 'timeIssued'; + +export { WeatherAlert }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/WeatherData.js b/lib/js/src/rpc/structs/WeatherData.js new file mode 100644 index 00000000..a85161bc --- /dev/null +++ b/lib/js/src/rpc/structs/WeatherData.js @@ -0,0 +1,431 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { Temperature } from './Temperature.js'; +import { Image } from './Image.js'; +import { RpcStruct } from '../RpcStruct.js'; +import { DateTime } from './DateTime.js'; + +class WeatherData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Temperature} temperature + * @return {WeatherData} + */ + setCurrentTemperature (temperature) { + this.validateType(Temperature, temperature); + this.setParameter(WeatherData.KEY_CURRENT_TEMPERATURE, temperature); + return this; + } + + /** + * @return {Temperature} + */ + getCurrentTemperature () { + return this.getObject(Temperature, WeatherData.KEY_CURRENT_TEMPERATURE); + } + + /** + * @param {Temperature} high + * @return {WeatherData} + */ + setTemperatureHigh (high) { + this.validateType(Temperature, high); + this.setParameter(WeatherData.KEY_TEMPERATURE_HIGH, high); + return this; + } + + /** + * @return {Temperature} + */ + getTemperatureHigh () { + return this.getObject(Temperature, WeatherData.KEY_TEMPERATURE_HIGH); + } + + /** + * @param {Temperature} low + * @return {WeatherData} + */ + setTemperatureLow (low) { + this.validateType(Temperature, low); + this.setParameter(WeatherData.KEY_TEMPERATURE_LOW, low); + return this; + } + + /** + * @return {Temperature} + */ + getTemperatureLow () { + return this.getObject(Temperature, WeatherData.KEY_TEMPERATURE_LOW); + } + + /** + * @param {Temperature} temperature + * @return {WeatherData} + */ + setApparentTemperature (temperature) { + this.validateType(Temperature, temperature); + this.setParameter(WeatherData.KEY_APPARENT_TEMPERATURE, temperature); + return this; + } + + /** + * @return {Temperature} + */ + getApparentTemperature () { + return this.getObject(Temperature, WeatherData.KEY_APPARENT_TEMPERATURE); + } + + /** + * @param {Temperature} high + * @return {WeatherData} + */ + setApparentTemperatureHigh (high) { + this.validateType(Temperature, high); + this.setParameter(WeatherData.KEY_APPARENT_TEMPERATURE_HIGH, high); + return this; + } + + /** + * @return {Temperature} + */ + getApparentTemperatureHigh () { + return this.getObject(Temperature, WeatherData.KEY_APPARENT_TEMPERATURE_HIGH); + } + + /** + * @param {Temperature} low + * @return {WeatherData} + */ + setApparentTemperatureLow (low) { + this.validateType(Temperature, low); + this.setParameter(WeatherData.KEY_APPARENT_TEMPERATURE_LOW, low); + return this; + } + + /** + * @return {Temperature} + */ + getApparentTemperatureLow () { + return this.getObject(Temperature, WeatherData.KEY_APPARENT_TEMPERATURE_LOW); + } + + /** + * @param {String} summary + * @return {WeatherData} + */ + setWeatherSummary (summary) { + this.setParameter(WeatherData.KEY_WEATHER_SUMMARY, summary); + return this; + } + + /** + * @return {String} + */ + getWeatherSummary () { + return this.getParameter(WeatherData.KEY_WEATHER_SUMMARY); + } + + /** + * @param {DateTime} time + * @return {WeatherData} + */ + setTime (time) { + this.validateType(DateTime, time); + this.setParameter(WeatherData.KEY_TIME, time); + return this; + } + + /** + * @return {DateTime} + */ + getTime () { + return this.getObject(DateTime, WeatherData.KEY_TIME); + } + + /** + * @param {Number} humidity - 0 to 1, percentage humidity + * @return {WeatherData} + */ + setHumidity (humidity) { + this.setParameter(WeatherData.KEY_HUMIDITY, humidity); + return this; + } + + /** + * @return {Number} + */ + getHumidity () { + return this.getParameter(WeatherData.KEY_HUMIDITY); + } + + /** + * @param {Number} cover - 0 to 1, percentage cloud cover + * @return {WeatherData} + */ + setCloudCover (cover) { + this.setParameter(WeatherData.KEY_CLOUD_COVER, cover); + return this; + } + + /** + * @return {Number} + */ + getCloudCover () { + return this.getParameter(WeatherData.KEY_CLOUD_COVER); + } + + /** + * @param {Number} phase - 0 to 1, percentage of the moon seen, e.g. 0 = no moon, 0.25 = quarter moon + * @return {WeatherData} + */ + setMoonPhase (phase) { + this.setParameter(WeatherData.KEY_MOON_PHASE, phase); + return this; + } + + /** + * @return {Number} + */ + getMoonPhase () { + return this.getParameter(WeatherData.KEY_MOON_PHASE); + } + + /** + * @param {Number} bearing - In degrees, true north at 0 degrees + * @return {WeatherData} + */ + setWindBearing (bearing) { + this.setParameter(WeatherData.KEY_WIND_BEARING, bearing); + return this; + } + + /** + * @return {Number} + */ + getWindBearing () { + return this.getParameter(WeatherData.KEY_WIND_BEARING); + } + + /** + * @param {Number} gust - km/hr + * @return {WeatherData} + */ + setWindGust (gust) { + this.setParameter(WeatherData.KEY_WIND_GUST, gust); + return this; + } + + /** + * @return {Number} + */ + getWindGust () { + return this.getParameter(WeatherData.KEY_WIND_GUST); + } + + /** + * @param {Number} speed - km/hr + * @return {WeatherData} + */ + setWindSpeed (speed) { + this.setParameter(WeatherData.KEY_WIND_SPEED, speed); + return this; + } + + /** + * @return {Number} + */ + getWindSpeed () { + return this.getParameter(WeatherData.KEY_WIND_SPEED); + } + + /** + * @param {Number} bearing - In degrees, true north at 0 degrees + * @return {WeatherData} + */ + setNearestStormBearing (bearing) { + this.setParameter(WeatherData.KEY_NEAREST_STORM_BEARING, bearing); + return this; + } + + /** + * @return {Number} + */ + getNearestStormBearing () { + return this.getParameter(WeatherData.KEY_NEAREST_STORM_BEARING); + } + + /** + * @param {Number} distance - In km + * @return {WeatherData} + */ + setNearestStormDistance (distance) { + this.setParameter(WeatherData.KEY_NEAREST_STORM_DISTANCE, distance); + return this; + } + + /** + * @return {Number} + */ + getNearestStormDistance () { + return this.getParameter(WeatherData.KEY_NEAREST_STORM_DISTANCE); + } + + /** + * @param {Number} accumulation - cm + * @return {WeatherData} + */ + setPrecipAccumulation (accumulation) { + this.setParameter(WeatherData.KEY_PRECIP_ACCUMULATION, accumulation); + return this; + } + + /** + * @return {Number} + */ + getPrecipAccumulation () { + return this.getParameter(WeatherData.KEY_PRECIP_ACCUMULATION); + } + + /** + * @param {Number} intensity - cm of water per hour + * @return {WeatherData} + */ + setPrecipIntensity (intensity) { + this.setParameter(WeatherData.KEY_PRECIP_INTENSITY, intensity); + return this; + } + + /** + * @return {Number} + */ + getPrecipIntensity () { + return this.getParameter(WeatherData.KEY_PRECIP_INTENSITY); + } + + /** + * @param {Number} probability - 0 to 1, percentage chance + * @return {WeatherData} + */ + setPrecipProbability (probability) { + this.setParameter(WeatherData.KEY_PRECIP_PROBABILITY, probability); + return this; + } + + /** + * @return {Number} + */ + getPrecipProbability () { + return this.getParameter(WeatherData.KEY_PRECIP_PROBABILITY); + } + + /** + * @param {String} type - e.g. "rain", "snow", "sleet", "hail" + * @return {WeatherData} + */ + setPrecipType (type) { + this.setParameter(WeatherData.KEY_PRECIP_TYPE, type); + return this; + } + + /** + * @return {String} + */ + getPrecipType () { + return this.getParameter(WeatherData.KEY_PRECIP_TYPE); + } + + /** + * @param {Number} visibility - In km + * @return {WeatherData} + */ + setVisibility (visibility) { + this.setParameter(WeatherData.KEY_VISIBILITY, visibility); + return this; + } + + /** + * @return {Number} + */ + getVisibility () { + return this.getParameter(WeatherData.KEY_VISIBILITY); + } + + /** + * @param {Image} icon + * @return {WeatherData} + */ + setWeatherIcon (icon) { + this.validateType(Image, icon); + this.setParameter(WeatherData.KEY_WEATHER_ICON, icon); + return this; + } + + /** + * @return {Image} + */ + getWeatherIcon () { + return this.getObject(Image, WeatherData.KEY_WEATHER_ICON); + } +} + +WeatherData.KEY_CURRENT_TEMPERATURE = 'currentTemperature'; +WeatherData.KEY_TEMPERATURE_HIGH = 'temperatureHigh'; +WeatherData.KEY_TEMPERATURE_LOW = 'temperatureLow'; +WeatherData.KEY_APPARENT_TEMPERATURE = 'apparentTemperature'; +WeatherData.KEY_APPARENT_TEMPERATURE_HIGH = 'apparentTemperatureHigh'; +WeatherData.KEY_APPARENT_TEMPERATURE_LOW = 'apparentTemperatureLow'; +WeatherData.KEY_WEATHER_SUMMARY = 'weatherSummary'; +WeatherData.KEY_TIME = 'time'; +WeatherData.KEY_HUMIDITY = 'humidity'; +WeatherData.KEY_CLOUD_COVER = 'cloudCover'; +WeatherData.KEY_MOON_PHASE = 'moonPhase'; +WeatherData.KEY_WIND_BEARING = 'windBearing'; +WeatherData.KEY_WIND_GUST = 'windGust'; +WeatherData.KEY_WIND_SPEED = 'windSpeed'; +WeatherData.KEY_NEAREST_STORM_BEARING = 'nearestStormBearing'; +WeatherData.KEY_NEAREST_STORM_DISTANCE = 'nearestStormDistance'; +WeatherData.KEY_PRECIP_ACCUMULATION = 'precipAccumulation'; +WeatherData.KEY_PRECIP_INTENSITY = 'precipIntensity'; +WeatherData.KEY_PRECIP_PROBABILITY = 'precipProbability'; +WeatherData.KEY_PRECIP_TYPE = 'precipType'; +WeatherData.KEY_VISIBILITY = 'visibility'; +WeatherData.KEY_WEATHER_ICON = 'weatherIcon'; + +export { WeatherData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/WeatherServiceData.js b/lib/js/src/rpc/structs/WeatherServiceData.js new file mode 100644 index 00000000..2c93b8d5 --- /dev/null +++ b/lib/js/src/rpc/structs/WeatherServiceData.js @@ -0,0 +1,160 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { WeatherData } from './WeatherData.js'; +import { LocationDetails } from './LocationDetails.js'; +import { RpcStruct } from '../RpcStruct.js'; +import { WeatherAlert } from './WeatherAlert.js'; + +/** + * This data is related to what a weather service would provide + */ +class WeatherServiceData extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {LocationDetails} location + * @return {WeatherServiceData} + */ + setLocation (location) { + this.validateType(LocationDetails, location); + this.setParameter(WeatherServiceData.KEY_LOCATION, location); + return this; + } + + /** + * @return {LocationDetails} + */ + getLocation () { + return this.getObject(LocationDetails, WeatherServiceData.KEY_LOCATION); + } + + /** + * @param {WeatherData} forecast + * @return {WeatherServiceData} + */ + setCurrentForecast (forecast) { + this.validateType(WeatherData, forecast); + this.setParameter(WeatherServiceData.KEY_CURRENT_FORECAST, forecast); + return this; + } + + /** + * @return {WeatherData} + */ + getCurrentForecast () { + return this.getObject(WeatherData, WeatherServiceData.KEY_CURRENT_FORECAST); + } + + /** + * @param {WeatherData[]} forecast + * @return {WeatherServiceData} + */ + setMinuteForecast (forecast) { + this.validateType(WeatherData, forecast, true); + this.setParameter(WeatherServiceData.KEY_MINUTE_FORECAST, forecast); + return this; + } + + /** + * @return {WeatherData[]} + */ + getMinuteForecast () { + return this.getObject(WeatherData, WeatherServiceData.KEY_MINUTE_FORECAST); + } + + /** + * @param {WeatherData[]} forecast + * @return {WeatherServiceData} + */ + setHourlyForecast (forecast) { + this.validateType(WeatherData, forecast, true); + this.setParameter(WeatherServiceData.KEY_HOURLY_FORECAST, forecast); + return this; + } + + /** + * @return {WeatherData[]} + */ + getHourlyForecast () { + return this.getObject(WeatherData, WeatherServiceData.KEY_HOURLY_FORECAST); + } + + /** + * @param {WeatherData[]} forecast + * @return {WeatherServiceData} + */ + setMultidayForecast (forecast) { + this.validateType(WeatherData, forecast, true); + this.setParameter(WeatherServiceData.KEY_MULTIDAY_FORECAST, forecast); + return this; + } + + /** + * @return {WeatherData[]} + */ + getMultidayForecast () { + return this.getObject(WeatherData, WeatherServiceData.KEY_MULTIDAY_FORECAST); + } + + /** + * @param {WeatherAlert[]} alerts - This array should be ordered with the first object being the current day + * @return {WeatherServiceData} + */ + setAlerts (alerts) { + this.validateType(WeatherAlert, alerts, true); + this.setParameter(WeatherServiceData.KEY_ALERTS, alerts); + return this; + } + + /** + * @return {WeatherAlert[]} + */ + getAlerts () { + return this.getObject(WeatherAlert, WeatherServiceData.KEY_ALERTS); + } +} + +WeatherServiceData.KEY_LOCATION = 'location'; +WeatherServiceData.KEY_CURRENT_FORECAST = 'currentForecast'; +WeatherServiceData.KEY_MINUTE_FORECAST = 'minuteForecast'; +WeatherServiceData.KEY_HOURLY_FORECAST = 'hourlyForecast'; +WeatherServiceData.KEY_MULTIDAY_FORECAST = 'multidayForecast'; +WeatherServiceData.KEY_ALERTS = 'alerts'; + +export { WeatherServiceData }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/WeatherServiceManifest.js b/lib/js/src/rpc/structs/WeatherServiceManifest.js new file mode 100644 index 00000000..b3cbc6a3 --- /dev/null +++ b/lib/js/src/rpc/structs/WeatherServiceManifest.js @@ -0,0 +1,131 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { RpcStruct } from '../RpcStruct.js'; + +class WeatherServiceManifest extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Boolean} supported + * @return {WeatherServiceManifest} + */ + setCurrentForecastSupported (supported) { + this.setParameter(WeatherServiceManifest.KEY_CURRENT_FORECAST_SUPPORTED, supported); + return this; + } + + /** + * @return {Boolean} + */ + getCurrentForecastSupported () { + return this.getParameter(WeatherServiceManifest.KEY_CURRENT_FORECAST_SUPPORTED); + } + + /** + * @param {Number} amount + * @return {WeatherServiceManifest} + */ + setMaxMultidayForecastAmount (amount) { + this.setParameter(WeatherServiceManifest.KEY_MAX_MULTIDAY_FORECAST_AMOUNT, amount); + return this; + } + + /** + * @return {Number} + */ + getMaxMultidayForecastAmount () { + return this.getParameter(WeatherServiceManifest.KEY_MAX_MULTIDAY_FORECAST_AMOUNT); + } + + /** + * @param {Number} amount + * @return {WeatherServiceManifest} + */ + setMaxHourlyForecastAmount (amount) { + this.setParameter(WeatherServiceManifest.KEY_MAX_HOURLY_FORECAST_AMOUNT, amount); + return this; + } + + /** + * @return {Number} + */ + getMaxHourlyForecastAmount () { + return this.getParameter(WeatherServiceManifest.KEY_MAX_HOURLY_FORECAST_AMOUNT); + } + + /** + * @param {Number} amount + * @return {WeatherServiceManifest} + */ + setMaxMinutelyForecastAmount (amount) { + this.setParameter(WeatherServiceManifest.KEY_MAX_MINUTELY_FORECAST_AMOUNT, amount); + return this; + } + + /** + * @return {Number} + */ + getMaxMinutelyForecastAmount () { + return this.getParameter(WeatherServiceManifest.KEY_MAX_MINUTELY_FORECAST_AMOUNT); + } + + /** + * @param {Boolean} supported + * @return {WeatherServiceManifest} + */ + setWeatherForLocationSupported (supported) { + this.setParameter(WeatherServiceManifest.KEY_WEATHER_FOR_LOCATION_SUPPORTED, supported); + return this; + } + + /** + * @return {Boolean} + */ + getWeatherForLocationSupported () { + return this.getParameter(WeatherServiceManifest.KEY_WEATHER_FOR_LOCATION_SUPPORTED); + } +} + +WeatherServiceManifest.KEY_CURRENT_FORECAST_SUPPORTED = 'currentForecastSupported'; +WeatherServiceManifest.KEY_MAX_MULTIDAY_FORECAST_AMOUNT = 'maxMultidayForecastAmount'; +WeatherServiceManifest.KEY_MAX_HOURLY_FORECAST_AMOUNT = 'maxHourlyForecastAmount'; +WeatherServiceManifest.KEY_MAX_MINUTELY_FORECAST_AMOUNT = 'maxMinutelyForecastAmount'; +WeatherServiceManifest.KEY_WEATHER_FOR_LOCATION_SUPPORTED = 'weatherForLocationSupported'; + +export { WeatherServiceManifest }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/WindowCapability.js b/lib/js/src/rpc/structs/WindowCapability.js new file mode 100644 index 00000000..2e78c30b --- /dev/null +++ b/lib/js/src/rpc/structs/WindowCapability.js @@ -0,0 +1,215 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { ImageField } from './ImageField.js'; +import { TextField } from './TextField.js'; +import { ImageType } from '../enums/ImageType.js'; +import { MenuLayout } from '../enums/MenuLayout.js'; +import { RpcStruct } from '../RpcStruct.js'; +import { ButtonCapabilities } from './ButtonCapabilities.js'; +import { SoftButtonCapabilities } from './SoftButtonCapabilities.js'; + +class WindowCapability extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {Number} id - The specified ID of the window. This ID is either one used when sending the CreateWindow + * request, or one of the predefined window ID values from the enum PredefinedWindows. If + * ommited, value is assumed to be the main window on the main display. + * @return {WindowCapability} + */ + setWindowID (id) { + this.setParameter(WindowCapability.KEY_WINDOW_ID, id); + return this; + } + + /** + * @return {Number} + */ + getWindowID () { + return this.getParameter(WindowCapability.KEY_WINDOW_ID); + } + + /** + * @param {TextField[]} fields - A set of all fields that support text data. See TextField + * @return {WindowCapability} + */ + setTextFields (fields) { + this.validateType(TextField, fields, true); + this.setParameter(WindowCapability.KEY_TEXT_FIELDS, fields); + return this; + } + + /** + * @return {TextField[]} + */ + getTextFields () { + return this.getObject(TextField, WindowCapability.KEY_TEXT_FIELDS); + } + + /** + * @param {ImageField[]} fields - A set of all fields that support images. See ImageField + * @return {WindowCapability} + */ + setImageFields (fields) { + this.validateType(ImageField, fields, true); + this.setParameter(WindowCapability.KEY_IMAGE_FIELDS, fields); + return this; + } + + /** + * @return {ImageField[]} + */ + getImageFields () { + return this.getObject(ImageField, WindowCapability.KEY_IMAGE_FIELDS); + } + + /** + * @param {ImageType[]} supported - Provides information about image types supported by the system. + * @return {WindowCapability} + */ + setImageTypeSupported (supported) { + this.validateType(ImageType, supported, true); + this.setParameter(WindowCapability.KEY_IMAGE_TYPE_SUPPORTED, supported); + return this; + } + + /** + * @return {ImageType[]} + */ + getImageTypeSupported () { + return this.getObject(ImageType, WindowCapability.KEY_IMAGE_TYPE_SUPPORTED); + } + + /** + * @param {String[]} available - A set of all window templates available on the head unit. + * @return {WindowCapability} + */ + setTemplatesAvailable (available) { + this.setParameter(WindowCapability.KEY_TEMPLATES_AVAILABLE, available); + return this; + } + + /** + * @return {String[]} + */ + getTemplatesAvailable () { + return this.getParameter(WindowCapability.KEY_TEMPLATES_AVAILABLE); + } + + /** + * @param {Number} available - The number of on-window custom presets available (if any); otherwise omitted. + * @return {WindowCapability} + */ + setNumCustomPresetsAvailable (available) { + this.setParameter(WindowCapability.KEY_NUM_CUSTOM_PRESETS_AVAILABLE, available); + return this; + } + + /** + * @return {Number} + */ + getNumCustomPresetsAvailable () { + return this.getParameter(WindowCapability.KEY_NUM_CUSTOM_PRESETS_AVAILABLE); + } + + /** + * @param {ButtonCapabilities[]} capabilities - The number of buttons and the capabilities of each on-window button. + * @return {WindowCapability} + */ + setButtonCapabilities (capabilities) { + this.validateType(ButtonCapabilities, capabilities, true); + this.setParameter(WindowCapability.KEY_BUTTON_CAPABILITIES, capabilities); + return this; + } + + /** + * @return {ButtonCapabilities[]} + */ + getButtonCapabilities () { + return this.getObject(ButtonCapabilities, WindowCapability.KEY_BUTTON_CAPABILITIES); + } + + /** + * @param {SoftButtonCapabilities[]} capabilities - The number of soft buttons available on-window and the + * capabilities for each button. + * @return {WindowCapability} + */ + setSoftButtonCapabilities (capabilities) { + this.validateType(SoftButtonCapabilities, capabilities, true); + this.setParameter(WindowCapability.KEY_SOFT_BUTTON_CAPABILITIES, capabilities); + return this; + } + + /** + * @return {SoftButtonCapabilities[]} + */ + getSoftButtonCapabilities () { + return this.getObject(SoftButtonCapabilities, WindowCapability.KEY_SOFT_BUTTON_CAPABILITIES); + } + + /** + * @param {MenuLayout[]} available - An array of available menu layouts. If this parameter is not provided, only the + * `LIST` layout is assumed to be available + * @return {WindowCapability} + */ + setMenuLayoutsAvailable (available) { + this.validateType(MenuLayout, available, true); + this.setParameter(WindowCapability.KEY_MENU_LAYOUTS_AVAILABLE, available); + return this; + } + + /** + * @return {MenuLayout[]} + */ + getMenuLayoutsAvailable () { + return this.getObject(MenuLayout, WindowCapability.KEY_MENU_LAYOUTS_AVAILABLE); + } +} + +WindowCapability.KEY_WINDOW_ID = 'windowID'; +WindowCapability.KEY_TEXT_FIELDS = 'textFields'; +WindowCapability.KEY_IMAGE_FIELDS = 'imageFields'; +WindowCapability.KEY_IMAGE_TYPE_SUPPORTED = 'imageTypeSupported'; +WindowCapability.KEY_TEMPLATES_AVAILABLE = 'templatesAvailable'; +WindowCapability.KEY_NUM_CUSTOM_PRESETS_AVAILABLE = 'numCustomPresetsAvailable'; +WindowCapability.KEY_BUTTON_CAPABILITIES = 'buttonCapabilities'; +WindowCapability.KEY_SOFT_BUTTON_CAPABILITIES = 'softButtonCapabilities'; +WindowCapability.KEY_MENU_LAYOUTS_AVAILABLE = 'menuLayoutsAvailable'; + +export { WindowCapability }; \ No newline at end of file diff --git a/lib/js/src/rpc/structs/WindowTypeCapabilities.js b/lib/js/src/rpc/structs/WindowTypeCapabilities.js new file mode 100644 index 00000000..7b72a675 --- /dev/null +++ b/lib/js/src/rpc/structs/WindowTypeCapabilities.js @@ -0,0 +1,82 @@ +/* eslint-disable camelcase */ +/* +* Copyright (c) 2020, SmartDeviceLink Consortium, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following +* disclaimer in the documentation and/or other materials provided with the +* distribution. +* +* Neither the name of the SmartDeviceLink Consortium Inc. nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +import { WindowType } from '../enums/WindowType.js'; +import { RpcStruct } from '../RpcStruct.js'; + +class WindowTypeCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor (parameters) { + super(parameters); + } + + /** + * @param {WindowType} type + * @return {WindowTypeCapabilities} + */ + setType (type) { + this.validateType(WindowType, type); + this.setParameter(WindowTypeCapabilities.KEY_TYPE, type); + return this; + } + + /** + * @return {WindowType} + */ + getType () { + return this.getObject(WindowType, WindowTypeCapabilities.KEY_TYPE); + } + + /** + * @param {Number} windows + * @return {WindowTypeCapabilities} + */ + setMaximumNumberOfWindows (windows) { + this.setParameter(WindowTypeCapabilities.KEY_MAXIMUM_NUMBER_OF_WINDOWS, windows); + return this; + } + + /** + * @return {Number} + */ + getMaximumNumberOfWindows () { + return this.getParameter(WindowTypeCapabilities.KEY_MAXIMUM_NUMBER_OF_WINDOWS); + } +} + +WindowTypeCapabilities.KEY_TYPE = 'type'; +WindowTypeCapabilities.KEY_MAXIMUM_NUMBER_OF_WINDOWS = 'maximumNumberOfWindows'; + +export { WindowTypeCapabilities }; \ No newline at end of file diff --git a/lib/node/dist/index.js b/lib/node/dist/index.js index dab264e6..c8b33483 100644 --- a/lib/node/dist/index.js +++ b/lib/node/dist/index.js @@ -726,38 +726,251 @@ } - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * Contains detailed information about the registered application. + */ + + class AppInfo extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} name - The name displayed for the mobile application on the mobile device (can differ from the + * app name set in the initial RAI request). + * @return {AppInfo} + */ + + + setAppDisplayName(name) { + this.setParameter(AppInfo.KEY_APP_DISPLAY_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getAppDisplayName() { + return this.getParameter(AppInfo.KEY_APP_DISPLAY_NAME); + } + /** + * @param {String} id - The AppBundleID of an iOS application or package name of the Android application. This + * supports App Launch strategies for each platform. + * @return {AppInfo} + */ + + + setAppBundleID(id) { + this.setParameter(AppInfo.KEY_APP_BUNDLE_ID, id); + return this; + } + /** + * @return {String} + */ + + + getAppBundleID() { + return this.getParameter(AppInfo.KEY_APP_BUNDLE_ID); + } + /** + * @param {String} version - Represents the build version number of this particular mobile app. + * @return {AppInfo} + */ + + + setAppVersion(version) { + this.setParameter(AppInfo.KEY_APP_VERSION, version); + return this; + } + /** + * @return {String} + */ + + + getAppVersion() { + return this.getParameter(AppInfo.KEY_APP_VERSION); + } + /** + * @param {String} icon - A file reference to the icon utilized by this app (simplifies the process of setting an + * app icon during app registration). + * @return {AppInfo} + */ + + + setAppIcon(icon) { + this.setParameter(AppInfo.KEY_APP_ICON, icon); + return this; + } + /** + * @return {String} + */ + + + getAppIcon() { + return this.getParameter(AppInfo.KEY_APP_ICON); + } + + } + + AppInfo.KEY_APP_DISPLAY_NAME = 'appDisplayName'; + AppInfo.KEY_APP_BUNDLE_ID = 'appBundleID'; + AppInfo.KEY_APP_VERSION = 'appVersion'; + AppInfo.KEY_APP_ICON = 'appIcon'; + + /* eslint-disable camelcase */ + + class RGBColor extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} red + * @return {RGBColor} + */ + + + setRed(red) { + this.setParameter(RGBColor.KEY_RED, red); + return this; + } + /** + * @return {Number} + */ + + + getRed() { + return this.getParameter(RGBColor.KEY_RED); + } + /** + * @param {Number} green + * @return {RGBColor} + */ + + + setGreen(green) { + this.setParameter(RGBColor.KEY_GREEN, green); + return this; + } + /** + * @return {Number} + */ + + + getGreen() { + return this.getParameter(RGBColor.KEY_GREEN); + } + /** + * @param {Number} blue + * @return {RGBColor} + */ + + + setBlue(blue) { + this.setParameter(RGBColor.KEY_BLUE, blue); + return this; + } + /** + * @return {Number} + */ + + + getBlue() { + return this.getParameter(RGBColor.KEY_BLUE); + } + + } + + RGBColor.KEY_RED = 'red'; + RGBColor.KEY_GREEN = 'green'; + RGBColor.KEY_BLUE = 'blue'; + + /* eslint-disable camelcase */ + /** + * A color scheme for all display layout templates. + */ + + class TemplateColorScheme extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {RGBColor} color - The primary "accent" color + * @return {TemplateColorScheme} + */ + + + setPrimaryColor(color) { + this.validateType(RGBColor, color); + this.setParameter(TemplateColorScheme.KEY_PRIMARY_COLOR, color); + return this; + } + /** + * @return {RGBColor} + */ + + + getPrimaryColor() { + return this.getObject(RGBColor, TemplateColorScheme.KEY_PRIMARY_COLOR); + } + /** + * @param {RGBColor} color - The secondary "accent" color + * @return {TemplateColorScheme} + */ + + + setSecondaryColor(color) { + this.validateType(RGBColor, color); + this.setParameter(TemplateColorScheme.KEY_SECONDARY_COLOR, color); + return this; + } + /** + * @return {RGBColor} + */ + + + getSecondaryColor() { + return this.getObject(RGBColor, TemplateColorScheme.KEY_SECONDARY_COLOR); + } + /** + * @param {RGBColor} color - The color of the background + * @return {TemplateColorScheme} + */ + + + setBackgroundColor(color) { + this.validateType(RGBColor, color); + this.setParameter(TemplateColorScheme.KEY_BACKGROUND_COLOR, color); + return this; + } + /** + * @return {RGBColor} + */ + + + getBackgroundColor() { + return this.getObject(RGBColor, TemplateColorScheme.KEY_BACKGROUND_COLOR); + } + + } + + TemplateColorScheme.KEY_PRIMARY_COLOR = 'primaryColor'; + TemplateColorScheme.KEY_SECONDARY_COLOR = 'secondaryColor'; + TemplateColorScheme.KEY_BACKGROUND_COLOR = 'backgroundColor'; + + /* eslint-disable camelcase */ /** + * Enumeration linking function names with function IDs in SmartDeviceLink protocol. Assumes enumeration starts at + * value 0. * @typedef {Enum} FunctionID * @property {Object} _MAP */ @@ -770,676 +983,716 @@ super(); } /** - * @return {Number} - */ + * @return {Number} + */ + + + static get RESERVED() { + return FunctionID._MAP.RESERVED; + } + /** + * @return {Number} + */ static get RegisterAppInterface() { return FunctionID._MAP.RegisterAppInterface; } /** - * @return {Number} - */ + * @return {Number} + */ static get UnregisterAppInterface() { return FunctionID._MAP.UnregisterAppInterface; } /** - * @return {Number} - */ + * @return {Number} + */ static get SetGlobalProperties() { return FunctionID._MAP.SetGlobalProperties; } /** - * @return {Number} - */ + * @return {Number} + */ static get ResetGlobalProperties() { return FunctionID._MAP.ResetGlobalProperties; } /** - * @return {Number} - */ + * @return {Number} + */ static get AddCommand() { return FunctionID._MAP.AddCommand; } /** - * @return {Number} - */ + * @return {Number} + */ static get DeleteCommand() { return FunctionID._MAP.DeleteCommand; } /** - * @return {Number} - */ + * @return {Number} + */ static get AddSubMenu() { return FunctionID._MAP.AddSubMenu; } /** - * @return {Number} - */ + * @return {Number} + */ static get DeleteSubMenu() { return FunctionID._MAP.DeleteSubMenu; } /** - * @return {Number} - */ + * @return {Number} + */ static get CreateInteractionChoiceSet() { return FunctionID._MAP.CreateInteractionChoiceSet; } /** - * @return {Number} - */ + * @return {Number} + */ static get PerformInteraction() { return FunctionID._MAP.PerformInteraction; } /** - * @return {Number} - */ + * @return {Number} + */ static get DeleteInteractionChoiceSet() { return FunctionID._MAP.DeleteInteractionChoiceSet; } /** - * @return {Number} - */ + * @return {Number} + */ static get Alert() { return FunctionID._MAP.Alert; } /** - * @return {Number} - */ + * @return {Number} + */ static get Show() { return FunctionID._MAP.Show; } /** - * @return {Number} - */ + * @return {Number} + */ static get Speak() { return FunctionID._MAP.Speak; } /** - * @return {Number} - */ + * @return {Number} + */ static get SetMediaClockTimer() { return FunctionID._MAP.SetMediaClockTimer; } /** - * @return {Number} - */ + * @return {Number} + */ static get PerformAudioPassThru() { return FunctionID._MAP.PerformAudioPassThru; } /** - * @return {Number} - */ + * @return {Number} + */ static get EndAudioPassThru() { return FunctionID._MAP.EndAudioPassThru; } /** - * @return {Number} - */ + * @return {Number} + */ static get SubscribeButton() { return FunctionID._MAP.SubscribeButton; } /** - * @return {Number} - */ + * @return {Number} + */ static get UnsubscribeButton() { return FunctionID._MAP.UnsubscribeButton; } /** - * @return {Number} - */ + * @return {Number} + */ static get SubscribeVehicleData() { return FunctionID._MAP.SubscribeVehicleData; } /** - * @return {Number} - */ + * @return {Number} + */ static get UnsubscribeVehicleData() { return FunctionID._MAP.UnsubscribeVehicleData; } /** - * @return {Number} - */ + * @return {Number} + */ static get GetVehicleData() { return FunctionID._MAP.GetVehicleData; } /** - * @return {Number} - */ + * @return {Number} + */ static get ReadDID() { return FunctionID._MAP.ReadDID; } /** - * @return {Number} - */ + * @return {Number} + */ static get GetDTCs() { return FunctionID._MAP.GetDTCs; } /** - * @return {Number} - */ + * @return {Number} + */ static get ScrollableMessage() { return FunctionID._MAP.ScrollableMessage; } /** - * @return {Number} - */ + * @return {Number} + */ static get Slider() { return FunctionID._MAP.Slider; } /** - * @return {Number} - */ + * @return {Number} + */ static get ShowConstantTBT() { return FunctionID._MAP.ShowConstantTBT; } /** - * @return {Number} - */ + * @return {Number} + */ static get AlertManeuver() { return FunctionID._MAP.AlertManeuver; } /** - * @return {Number} - */ + * @return {Number} + */ static get UpdateTurnList() { return FunctionID._MAP.UpdateTurnList; } /** - * @return {Number} - */ + * @return {Number} + */ static get ChangeRegistration() { return FunctionID._MAP.ChangeRegistration; } /** - * @return {Number} - */ + * @return {Number} + */ static get GenericResponse() { return FunctionID._MAP.GenericResponse; } /** - * @return {Number} - */ + * @return {Number} + */ static get PutFile() { return FunctionID._MAP.PutFile; } /** - * @return {Number} - */ + * @return {Number} + */ static get DeleteFile() { return FunctionID._MAP.DeleteFile; } /** - * @return {Number} - */ + * @return {Number} + */ static get ListFiles() { return FunctionID._MAP.ListFiles; } /** - * @return {Number} - */ + * @return {Number} + */ static get SetAppIcon() { return FunctionID._MAP.SetAppIcon; } /** - * @return {Number} - */ + * @return {Number} + */ static get SetDisplayLayout() { return FunctionID._MAP.SetDisplayLayout; } /** - * @return {Number} - */ + * @return {Number} + */ static get DiagnosticMessage() { return FunctionID._MAP.DiagnosticMessage; } /** - * @return {Number} - */ + * @return {Number} + */ static get SystemRequest() { return FunctionID._MAP.SystemRequest; } /** - * @return {Number} - */ + * @return {Number} + */ static get SendLocation() { return FunctionID._MAP.SendLocation; } /** - * @return {Number} - */ + * @return {Number} + */ static get DialNumber() { return FunctionID._MAP.DialNumber; } /** - * @return {Number} - */ + * @return {Number} + */ static get ButtonPress() { return FunctionID._MAP.ButtonPress; } /** - * @return {Number} - */ + * @return {Number} + */ static get GetInteriorVehicleData() { return FunctionID._MAP.GetInteriorVehicleData; } /** - * @return {Number} - */ + * @return {Number} + */ static get SetInteriorVehicleData() { return FunctionID._MAP.SetInteriorVehicleData; } /** - * @return {Number} - */ + * @return {Number} + */ static get GetWayPoints() { return FunctionID._MAP.GetWayPoints; } /** - * @return {Number} - */ + * @return {Number} + */ static get SubscribeWayPoints() { return FunctionID._MAP.SubscribeWayPoints; } /** - * @return {Number} - */ + * @return {Number} + */ static get UnsubscribeWayPoints() { return FunctionID._MAP.UnsubscribeWayPoints; } /** - * @return {Number} - */ + * @return {Number} + */ static get GetSystemCapability() { return FunctionID._MAP.GetSystemCapability; } /** - * @return {Number} - */ + * @return {Number} + */ static get SendHapticData() { return FunctionID._MAP.SendHapticData; } /** - * @return {Number} - */ + * @return {Number} + */ static get SetCloudAppProperties() { return FunctionID._MAP.SetCloudAppProperties; } /** - * @return {Number} - */ + * @return {Number} + */ static get GetCloudAppProperties() { return FunctionID._MAP.GetCloudAppProperties; } /** - * @return {Number} - */ + * @return {Number} + */ static get PublishAppService() { return FunctionID._MAP.PublishAppService; } /** - * @return {Number} - */ + * @return {Number} + */ static get GetAppServiceData() { return FunctionID._MAP.GetAppServiceData; } /** - * @return {Number} - */ + * @return {Number} + */ static get GetFile() { return FunctionID._MAP.GetFile; } /** - * @return {Number} - */ + * @return {Number} + */ static get PerformAppServiceInteraction() { return FunctionID._MAP.PerformAppServiceInteraction; } /** - * @return {Number} - */ + * @return {Number} + */ static get UnpublishAppService() { return FunctionID._MAP.UnpublishAppService; } /** - * @return {Number} - */ + * @return {Number} + */ static get CancelInteraction() { return FunctionID._MAP.CancelInteraction; } /** - * @return {Number} - */ + * @return {Number} + */ static get CloseApplication() { return FunctionID._MAP.CloseApplication; } /** - * @return {Number} - */ + * @return {Number} + */ static get ShowAppMenu() { return FunctionID._MAP.ShowAppMenu; } /** - * @return {Number} - */ + * @return {Number} + */ static get CreateWindow() { return FunctionID._MAP.CreateWindow; } /** - * @return {Number} - */ + * @return {Number} + */ static get DeleteWindow() { return FunctionID._MAP.DeleteWindow; } /** - * @return {Number} - */ + * @return {Number} + */ static get GetInteriorVehicleDataConsent() { return FunctionID._MAP.GetInteriorVehicleDataConsent; } /** - * @return {Number} - */ + * @return {Number} + */ static get ReleaseInteriorVehicleDataModule() { return FunctionID._MAP.ReleaseInteriorVehicleDataModule; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnHMIStatus() { return FunctionID._MAP.OnHMIStatus; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnAppInterfaceUnregistered() { return FunctionID._MAP.OnAppInterfaceUnregistered; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnButtonEvent() { return FunctionID._MAP.OnButtonEvent; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnButtonPress() { return FunctionID._MAP.OnButtonPress; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnVehicleData() { return FunctionID._MAP.OnVehicleData; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnCommand() { return FunctionID._MAP.OnCommand; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnTBTClientState() { return FunctionID._MAP.OnTBTClientState; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnDriverDistraction() { return FunctionID._MAP.OnDriverDistraction; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnPermissionsChange() { return FunctionID._MAP.OnPermissionsChange; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnAudioPassThru() { return FunctionID._MAP.OnAudioPassThru; } /** - * @return {Number} - */ - + * @return {Number} + */ + static get OnLanguageChange() { return FunctionID._MAP.OnLanguageChange; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnKeyboardInput() { return FunctionID._MAP.OnKeyboardInput; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnTouchEvent() { return FunctionID._MAP.OnTouchEvent; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnSystemRequest() { return FunctionID._MAP.OnSystemRequest; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnHashChange() { return FunctionID._MAP.OnHashChange; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnInteriorVehicleData() { return FunctionID._MAP.OnInteriorVehicleData; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnWayPointChange() { return FunctionID._MAP.OnWayPointChange; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnRCStatus() { return FunctionID._MAP.OnRCStatus; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnAppServiceData() { return FunctionID._MAP.OnAppServiceData; } /** - * @return {Number} - */ + * @return {Number} + */ static get OnSystemCapabilityUpdated() { return FunctionID._MAP.OnSystemCapabilityUpdated; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * @return {Number} + */ + + + static get EncodedSyncPData() { + return FunctionID._MAP.EncodedSyncPData; + } + /** + * @return {Number} + */ + + + static get SdlPData() { + return FunctionID._MAP.SdlPData; + } + /** + * @return {Number} + */ + + + static get OnEncodedSyncPData() { + return FunctionID._MAP.OnEncodedSyncPData; + } + /** + * @return {Number} + */ + + + static get OnSyncPData() { + return FunctionID._MAP.OnSyncPData; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey(key) { return FunctionID._valueForKey(key, FunctionID._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue(value) { @@ -1449,6 +1702,7 @@ } FunctionID._MAP = Object.freeze({ + 'RESERVED': 0, 'RegisterAppInterface': 0x01, 'UnregisterAppInterface': 0x02, 'SetGlobalProperties': 0x03, @@ -1530,417 +1784,227 @@ 'OnWayPointChange': 0x8010, 'OnRCStatus': 0x8011, 'OnAppServiceData': 0x8012, - 'OnSystemCapabilityUpdated': 0x8013 + 'OnSystemCapabilityUpdated': 0x8013, + 'EncodedSyncPData': 0x10000, + 'SyncPData': 0x10001, + 'OnEncodedSyncPData': 0x18000, + 'OnSyncPData': 0x18001 }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ /** - * @typedef {Object} RpcMessage - * @property {RpcType} rpcType + * Contains information about the TTS capabilities. + * @typedef {Enum} SpeechCapabilities + * @property {Object} _MAP */ - class RpcMessage extends RpcStruct { - /* - { - "rpcType": "Request", - "functionName": "RegisterAppInterface", - "coorelationID": "320948", - "isEncrypted": false, - "parameters": { - "appName": "Hello" - }, - "bulkData": "...", - } - */ - - /** - * @constructor - */ - constructor(store = {}) { - super(store.parameters); - this._isEncrypted = false; - this._rpcType = store.rpcType; - this._functionName = store.functionName; - this._correlationID = store.correlationID; - this.setBulkData(store.bulkData); - } - /** - * @return {RpcType} - */ - - - getRPCType() { - return this._rpcType; - } + class SpeechCapabilities extends Enum { /** - * @param {RpcType} type - * @return {RpcMessage} - */ - - - setRPCType(type) { - this._rpcType = type; - return this; + * @constructor + */ + constructor() { + super(); } /** - * @return {FunctionID} type - */ + * @return {String} + */ - getFunctionName() { - return this._functionName; + static get SC_TEXT() { + return SpeechCapabilities._MAP.SC_TEXT; } /** - * @param {FunctionID} name - * @return {RpcMessage} - */ - + * @return {String} + */ - setFunctionName(name) { - if (typeof name !== 'string') { - this._functionName = FunctionID.keyForValue(name); - } else { - this._functionName = name; - } - return this; + static get SAPI_PHONEMES() { + return SpeechCapabilities._MAP.SAPI_PHONEMES; } /** - * @return {String} type - */ + * @return {String} + */ - getCorrelationId() { - return this._correlationID; + static get LHPLUS_PHONEMES() { + return SpeechCapabilities._MAP.LHPLUS_PHONEMES; } /** - * @param {String} name - * @return {RpcMessage} - */ + * @return {String} + */ - setCorrelationId(id) { - this._correlationID = id; - return this; + static get PRE_RECORDED() { + return SpeechCapabilities._MAP.PRE_RECORDED; } /** - * @return {Uint8Array} data - */ + * @return {String} + */ - getBulkData() { - return this._bulkData; + static get SILENCE() { + return SpeechCapabilities._MAP.SILENCE; } /** - * @param {UInt8Array} data - * @return {RpcMessage} - */ - + * @return {String} + */ - setBulkData(data = null) { - if (data !== null) { - this._bulkData = data.slice(0); - } else { - this._bulkData = null; - } - return this; + static get FILE() { + return SpeechCapabilities._MAP.FILE; } /** - * @return {Boolean} - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ - getIsEncrypted() { - return this._isEncrypted; + static valueForKey(key) { + return SpeechCapabilities._valueForKey(key, SpeechCapabilities._MAP); } /** - * @param {Boolean} bool - * @return {RpcMessage} - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ - setIsEncrypted(bool) { - this._isEncrypted = bool; - return this; + static keyForValue(value) { + return SpeechCapabilities._keyForValue(value, SpeechCapabilities._MAP); } } - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + SpeechCapabilities._MAP = Object.freeze({ + 'SC_TEXT': 'TEXT', + 'SAPI_PHONEMES': 'SAPI_PHONEMES', + 'LHPLUS_PHONEMES': 'LHPLUS_PHONEMES', + 'PRE_RECORDED': 'PRE_RECORDED', + 'SILENCE': 'SILENCE', + 'FILE': 'FILE' + }); + + /* eslint-disable camelcase */ /** - * @typedef {Enum} RpcType - * @property {Object} _MAP + * A TTS chunk, that consists of text/phonemes to speak or the name of a file to play, and a TTS type (like text or + * SAPI) */ - class RpcType extends Enum { - /** - * @constructor - */ - constructor() { - super(); - } + class TTSChunk extends RpcStruct { /** - * @return {Number} + * @constructor */ - - - static get NOTIFICATION() { - return RpcType._MAP.NOTIFICATION; + constructor(parameters) { + super(parameters); } /** - * @return {Number} + * @param {String} text - The text or phonemes to speak, or the name of the audio file to play. May not be empty. + * @return {TTSChunk} */ - static get RESPONSE() { - return RpcType._MAP.RESPONSE; + setText(text) { + this.setParameter(TTSChunk.KEY_TEXT, text); + return this; } /** - * @return {Number} + * @return {String} */ - static get REQUEST() { - return RpcType._MAP.REQUEST; + getText() { + return this.getParameter(TTSChunk.KEY_TEXT); } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * @param {SpeechCapabilities} type - Describes whether the TTS chunk is plain text, a specific phoneme set, or an + * audio file. See SpeechCapabilities + * @return {TTSChunk} + */ - static valueForKey(key) { - return RpcType._valueForKey(key, RpcType._MAP); + setType(type) { + this.validateType(SpeechCapabilities, type); + this.setParameter(TTSChunk.KEY_TYPE, type); + return this; } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * @return {SpeechCapabilities} + */ - static keyForValue(value) { - return RpcType._keyForValue(value, RpcType._MAP); + getType() { + return this.getObject(SpeechCapabilities, TTSChunk.KEY_TYPE); } } - RpcType._MAP = Object.freeze({ - 'NOTIFICATION': 0x2, - 'RESPONSE': 0x1, - 'REQUEST': 0x0 - }); - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - - class RpcRequest extends RpcMessage { - /** - * @constructor - */ - constructor(store) { - super(store); - this.setRPCType(RpcType.REQUEST); - this._promise = null; - } - /** - * @return {Promise} - */ - - - getOnRPCResponsePromise() { - return this._promise; - } - /** - * @param {Promise} promise - * @return {RpcMessage} - */ - - - setOnRPCResponsePromise(promise) { - this.validateType(Promise, promise); - this._promise = promise; - return this; - } - - } + TTSChunk.KEY_TEXT = 'text'; + TTSChunk.KEY_TYPE = 'type'; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * Specifies the version number of the SmartDeviceLink protocol that is supported by the mobile application + */ class SdlMsgVersion extends RpcStruct { + /** + * @constructor + */ constructor(parameters) { super(parameters); } /** - * @param {Number} the major version of this object - * @return {SdlMsgVersion} - */ + * @param {Number} version - The major version indicates versions that is not-compatible to previous versions. + * @return {SdlMsgVersion} + */ - setMajorVersion(value) { - this.setParameter(SdlMsgVersion.KEY_MAJOR_VERSION, value); + setMajorVersion(version) { + this.setParameter(SdlMsgVersion.KEY_MAJOR_VERSION, version); return this; } /** - * @return {Number} the major version of this object - */ + * @return {Number} + */ getMajorVersion() { return this.getParameter(SdlMsgVersion.KEY_MAJOR_VERSION); } /** - * @param {Number} the minor version of this object - * @return {SdlMsgVersion} - */ + * @param {Number} version - The minor version indicates a change to a previous version that should still allow to + * be run on an older version (with limited functionality) + * @return {SdlMsgVersion} + */ - setMinorVersion(value) { - this.setParameter(SdlMsgVersion.KEY_MINOR_VERSION, value); + setMinorVersion(version) { + this.setParameter(SdlMsgVersion.KEY_MINOR_VERSION, version); return this; } /** - * @return {Number} the minor version of this object - */ + * @return {Number} + */ getMinorVersion() { return this.getParameter(SdlMsgVersion.KEY_MINOR_VERSION); } /** - * @param {Number} the patch version of this object - * @return {SdlMsgVersion} - */ + * @param {Number} version - The patch version indicates a fix to existing functionality in a previous version that + * should still be able to be run on an older version + * @return {SdlMsgVersion} + */ - setPatchVersion(value) { - this.setParameter(SdlMsgVersion.KEY_PATCH_VERSION, value); + setPatchVersion(version) { + this.setParameter(SdlMsgVersion.KEY_PATCH_VERSION, version); return this; } /** - * @return {Number} the patch version of this objects - */ + * @return {Number} + */ getPatchVersion() { @@ -1953,43 +2017,17 @@ SdlMsgVersion.KEY_MINOR_VERSION = 'minorVersion'; SdlMsgVersion.KEY_PATCH_VERSION = 'patchVersion'; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ /** - * @typedef {Enum} SpeechCapabilities + * Enumeration listing possible app types. + * @typedef {Enum} AppHMIType * @property {Object} _MAP */ - class SpeechCapabilities extends Enum { + class AppHMIType extends Enum { + /** + * @constructor + */ constructor() { super(); } @@ -1998,632 +2036,563 @@ */ - static get SC_TEXT() { - return SpeechCapabilities._MAP.SC_TEXT; + static get DEFAULT() { + return AppHMIType._MAP.DEFAULT; } /** * @return {String} */ - static get SAPI_PHONEMES() { - return SpeechCapabilities._MAP.SAPI_PHONEMES; + static get COMMUNICATION() { + return AppHMIType._MAP.COMMUNICATION; } /** * @return {String} */ - static get LHPLUS_PHONEMES() { - return SpeechCapabilities._MAP.LHPLUS_PHONEMES; + static get MEDIA() { + return AppHMIType._MAP.MEDIA; } /** * @return {String} */ - static get PRE_RECORDED() { - return SpeechCapabilities._MAP.PRE_RECORDED; + static get MESSAGING() { + return AppHMIType._MAP.MESSAGING; } /** * @return {String} */ - static get SILENCE() { - return SpeechCapabilities._MAP.SILENCE; + static get NAVIGATION() { + return AppHMIType._MAP.NAVIGATION; } /** * @return {String} */ - static get FILE() { - return SpeechCapabilities._MAP.FILE; + static get INFORMATION() { + return AppHMIType._MAP.INFORMATION; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ - + * @return {String} + */ - static valueForKey(key) { - return SpeechCapabilities._valueForKey(key, SpeechCapabilities._MAP); + + static get SOCIAL() { + return AppHMIType._MAP.SOCIAL; } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * @return {String} + */ - static keyForValue(value) { - return SpeechCapabilities._keyForValue(value, SpeechCapabilities._MAP); + static get BACKGROUND_PROCESS() { + return AppHMIType._MAP.BACKGROUND_PROCESS; } + /** + * @return {String} + */ - } - SpeechCapabilities._MAP = Object.freeze({ - 'SC_TEXT': 'TEXT', - 'SAPI_PHONEMES': 'SAPI_PHONEMES', - 'LHPLUS_PHONEMES': 'LHPLUS_PHONEMES', - 'PRE_RECORDED': 'PRE_RECORDED', - 'SILENCE': 'SILENCE', - 'FILE': 'FILE' - }); + static get TESTING() { + return AppHMIType._MAP.TESTING; + } + /** + * @return {String} + */ - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - class TTSChunk extends RpcStruct { - constructor(parameters) { - super(parameters); + static get SYSTEM() { + return AppHMIType._MAP.SYSTEM; } /** - * @param {String} text - * @return {TTSChunk} - */ + * @return {String} + */ - setText(text) { - this.setParameter(TTSChunk.KEY_TEXT, text); - return this; + static get PROJECTION() { + return AppHMIType._MAP.PROJECTION; } /** - * @return {Number} - */ + * @return {String} + */ - getText() { - return this.getParameter(TTSChunk.KEY_TEXT); + static get REMOTE_CONTROL() { + return AppHMIType._MAP.REMOTE_CONTROL; } /** - * @param {SpeechCapabilities} type - * @return {TTSChunk} - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ - setType(type) { - this.validateType(SpeechCapabilities, type); - this.setParameter(TTSChunk.KEY_TYPE, type); - return this; + static valueForKey(key) { + return AppHMIType._valueForKey(key, AppHMIType._MAP); } /** - * @return {SpeechCapabilities} - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ - getType() { - return this.getObject(SpeechCapabilities, TTSChunk.KEY_TYPE); + static keyForValue(value) { + return AppHMIType._keyForValue(value, AppHMIType._MAP); } } - TTSChunk.KEY_TEXT = 'text'; - TTSChunk.KEY_TYPE = 'type'; + AppHMIType._MAP = Object.freeze({ + 'DEFAULT': 'DEFAULT', + 'COMMUNICATION': 'COMMUNICATION', + 'MEDIA': 'MEDIA', + 'MESSAGING': 'MESSAGING', + 'NAVIGATION': 'NAVIGATION', + 'INFORMATION': 'INFORMATION', + 'SOCIAL': 'SOCIAL', + 'BACKGROUND_PROCESS': 'BACKGROUND_PROCESS', + 'TESTING': 'TESTING', + 'SYSTEM': 'SYSTEM', + 'PROJECTION': 'PROJECTION', + 'REMOTE_CONTROL': 'REMOTE_CONTROL' + }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * @typedef {Enum} Language + * @property {Object} _MAP + */ - class DeviceInfo extends RpcStruct { - constructor(parameters) { - super(parameters); + class Language extends Enum { + /** + * @constructor + */ + constructor() { + super(); } /** - * @param {String} hardware - * @return {DeviceInfo} - */ + * English - US + * @return {String} + */ - setHardware(hardware) { - this.validateType(String, hardware); - this.setParameter(DeviceInfo.KEY_HARDWARE, hardware); - return this; + static get EN_US() { + return Language._MAP.EN_US; } /** - * @return {String} - */ + * Spanish - Mexico + * @return {String} + */ - getHardware() { - return this.getParameter(DeviceInfo.KEY_HARDWARE); + static get ES_MX() { + return Language._MAP.ES_MX; } /** - * @param {String} firmwareRev - * @return {DeviceInfo} - */ + * French - Canada + * @return {String} + */ - setFirmwareRev(firmwareRev) { - this.validateType(String, firmwareRev); - this.setParameter(DeviceInfo.KEY_FIRMWARE_REV, firmwareRev); - return this; + static get FR_CA() { + return Language._MAP.FR_CA; } /** - * @return {String} - */ + * German - Germany + * @return {String} + */ - getFirmwareRev() { - return this.getParameter(DeviceInfo.KEY_FIRMWARE_REV); + static get DE_DE() { + return Language._MAP.DE_DE; } /** - * @param {String} os - * @return {DeviceInfo} - */ + * Spanish - Spain + * @return {String} + */ - setOs(os) { - this.validateType(String, os); - this.setParameter(DeviceInfo.KEY_OS, os); - return this; + static get ES_ES() { + return Language._MAP.ES_ES; } /** - * @return {String} - */ + * English - GB + * @return {String} + */ - getOs() { - return this.getParameter(DeviceInfo.KEY_OS); + static get EN_GB() { + return Language._MAP.EN_GB; } /** - * @param {String} osVersion - * @return {DeviceInfo} - */ + * Russian - Russia + * @return {String} + */ - setOsVersion(osVersion) { - this.validateType(String, osVersion); - this.setParameter(DeviceInfo.KEY_OS_VERSION, osVersion); - return this; + static get RU_RU() { + return Language._MAP.RU_RU; } /** - * @return {String} - */ + * Turkish - Turkey + * @return {String} + */ - getOsVersion() { - return this.getParameter(DeviceInfo.KEY_OS_VERSION); + static get TR_TR() { + return Language._MAP.TR_TR; } /** - * @param {String} carrier - * @return {DeviceInfo} - */ + * Polish - Poland + * @return {String} + */ - setCarrier(carrier) { - this.validateType(String, carrier); - this.setParameter(DeviceInfo.KEY_CARRIER, carrier); - return this; + static get PL_PL() { + return Language._MAP.PL_PL; } /** - * @return {String} - */ + * French - France + * @return {String} + */ - getCarrier() { - return this.getParameter(DeviceInfo.KEY_CARRIER); + static get FR_FR() { + return Language._MAP.FR_FR; } /** - * @param {Number} maxNumberRFCOMMPorts - * @return {DeviceInfo} - */ + * Italian - Italy + * @return {String} + */ - setMaxNumberRFCOMMPorts(maxNumberRFCOMMPorts) { - this.validateType(Number, maxNumberRFCOMMPorts); - this.setParameter(DeviceInfo.KEY_MAX_NUMBER_RFCOMM_PORTS, maxNumberRFCOMMPorts); - return this; + static get IT_IT() { + return Language._MAP.IT_IT; } /** - * @return {Number} - */ + * Swedish - Sweden + * @return {String} + */ - getMaxNumberRFCOMMPorts() { - return this.getParameter(DeviceInfo.KEY_MAX_NUMBER_RFCOMM_PORTS); + static get SV_SE() { + return Language._MAP.SV_SE; } + /** + * Portuguese - Portugal + * @return {String} + */ - } - - DeviceInfo.KEY_HARDWARE = 'hardware'; - DeviceInfo.KEY_FIRMWARE_REV = 'firmwareRev'; - DeviceInfo.KEY_OS = 'os'; - DeviceInfo.KEY_OS_VERSION = 'osVersion'; - DeviceInfo.KEY_CARRIER = 'carrier'; - DeviceInfo.KEY_MAX_NUMBER_RFCOMM_PORTS = 'maxNumberRFCOMMPorts'; - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - class AppInfo extends RpcStruct { - constructor(parameters) { - super(parameters); + static get PT_PT() { + return Language._MAP.PT_PT; } /** - * @param {String} appDisplayName - * @return {AppInfo} - */ + * Dutch (Standard) - Netherlands + * @return {String} + */ - setAppDisplayName(appDisplayName) { - this.setParameter(AppInfo.KEY_APP_DISPLAY_NAME, appDisplayName); - return this; + static get NL_NL() { + return Language._MAP.NL_NL; } /** - * @return {String} - */ + * English - Australia + * @return {String} + */ - getAppDisplayName() { - return this.getParameter(AppInfo.KEY_APP_DISPLAY_NAME); + static get EN_AU() { + return Language._MAP.EN_AU; } /** - * @param {String} appBundleID - * @return {AppInfo} - */ + * Mandarin - China + * @return {String} + */ - setAppBundleID(appBundleID) { - this.setParameter(AppInfo.KEY_APP_BUNDLE_ID, appBundleID); - return this; + static get ZH_CN() { + return Language._MAP.ZH_CN; } /** - * @return {String} - */ + * Mandarin - Taiwan + * @return {String} + */ - getAppBundleID() { - return this.getParameter(AppInfo.KEY_APP_BUNDLE_ID); + static get ZH_TW() { + return Language._MAP.ZH_TW; } /** - * @param {String} appVersion - * @return {AppInfo} - */ + * Japanese - Japan + * @return {String} + */ - setAppVersion(appVersion) { - this.setParameter(AppInfo.KEY_APP_VERSION, appVersion); - return this; + static get JA_JP() { + return Language._MAP.JA_JP; } /** - * @return {String} - */ + * Arabic - Saudi Arabia + * @return {String} + */ - getAppVersion() { - return this.getParameter(AppInfo.KEY_APP_VERSION); + static get AR_SA() { + return Language._MAP.AR_SA; } /** - * @param {String} appIcon string of the app icon file name - * @return {AppInfo} - */ + * Korean - South Korea + * @return {String} + */ - setAppIcon(appIcon) { - this.setParameter(AppInfo.KEY_APP_ICON, appIcon); - return this; + static get KO_KR() { + return Language._MAP.KO_KR; } /** - * @return {String} - */ + * Portuguese - Brazil + * @return {String} + */ - getAppIcon() { - return this.getParameter(AppInfo.KEY_APP_ICON); + static get PT_BR() { + return Language._MAP.PT_BR; } + /** + * Czech - Czech Republic + * @return {String} + */ - } - - AppInfo.KEY_APP_DISPLAY_NAME = 'appDisplayName'; - AppInfo.KEY_APP_BUNDLE_ID = 'appBundleID'; - AppInfo.KEY_APP_VERSION = 'appVersion'; - AppInfo.KEY_APP_ICON = 'appIcon'; - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - class RGBColor extends RpcStruct { - constructor(parameters) { - super(parameters); + static get CS_CZ() { + return Language._MAP.CS_CZ; } /** - * @param {Number} redValue - * @return {RGBColor} - */ + * Danish - Denmark + * @return {String} + */ - setRedValue(redValue) { - this.setParameter(RGBColor.KEY_RED, redValue); - return this; + static get DA_DK() { + return Language._MAP.DA_DK; } /** - * @return {Number} - */ + * Norwegian - Norway + * @return {String} + */ - getRedValue() { - return this.getParameter(RGBColor.KEY_RED); + static get NO_NO() { + return Language._MAP.NO_NO; } /** - * @param {Number} greenValue - * @return {RGBColor} - */ + * Dutch (Flemish) - Belgium + * @return {String} + */ - setGreenValue(greenValue) { - this.setParameter(RGBColor.KEY_GREEN, greenValue); - return this; + static get NL_BE() { + return Language._MAP.NL_BE; } /** - * @return {Number} - */ + * Greek - Greece + * @return {String} + */ - getGreenValue() { - return this.getParameter(RGBColor.KEY_GREEN); + static get EL_GR() { + return Language._MAP.EL_GR; } /** - * @param {Number} blueValue - * @return {RGBColor} - */ + * Hungarian - Hungary + * @return {String} + */ - setBlueValue(blueValue) { - this.setParameter(RGBColor.KEY_BLUE, blueValue); - return this; + static get HU_HU() { + return Language._MAP.HU_HU; } /** - * @return {Number} - */ + * Finnish - Finland + * @return {String} + */ - getBlueValue() { - return this.getParameter(RGBColor.KEY_BLUE); + static get FI_FI() { + return Language._MAP.FI_FI; } + /** + * Slovak - Slovakia + * @return {String} + */ - } - - RGBColor.KEY_RED = 'red'; - RGBColor.KEY_GREEN = 'green'; - RGBColor.KEY_BLUE = 'blue'; - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - class TemplateColorScheme extends RpcStruct { - constructor(parameters) { - super(parameters); + static get SK_SK() { + return Language._MAP.SK_SK; } /** - * @param {RGBColor} primaryColor - * @return {TemplateColorScheme} - */ + * English - India + * @return {String} + */ - setPrimaryColor(primaryColor) { - this.validateType(RGBColor, primaryColor); - this.setParameter(TemplateColorScheme.KEY_PRIMARY_COLOR, primaryColor); - return this; + static get EN_IN() { + return Language._MAP.EN_IN; } /** - * @return {RGBColor} - */ + * Thai - Thailand + * @return {String} + */ - getPrimaryColor() { - return this.getObject(RGBColor, TemplateColorScheme.KEY_PRIMARY_COLOR); + static get TH_TH() { + return Language._MAP.TH_TH; } /** - * @param {RGBColor} secondaryColor - * @return {TemplateColorScheme} - */ + * English - Middle East + * @return {String} + */ - setSecondaryColor(secondaryColor) { - this.validateType(RGBColor, secondaryColor); - this.setParameter(TemplateColorScheme.KEY_SECONDARY_COLOR, secondaryColor); - return this; + static get EN_SA() { + return Language._MAP.EN_SA; } /** - * @return {RGBColor} - */ + * Hebrew - Israel + * @return {String} + */ - getSecondaryColor() { - return this.getObject(RGBColor, TemplateColorScheme.KEY_SECONDARY_COLOR); - } + static get HE_IL() { + return Language._MAP.HE_IL; + } /** - * @param {RGBColor} backgroundColor - * @return {TemplateColorScheme} - */ + * Romanian - Romania + * @return {String} + */ - setBackgroundColor(backgroundColor) { - this.validateType(RGBColor, backgroundColor); - this.setParameter(TemplateColorScheme.KEY_BACKGROUND_COLOR, backgroundColor); - return this; + static get RO_RO() { + return Language._MAP.RO_RO; } /** - * @return {RGBColor} - */ + * Ukrainian - Ukraine + * @return {String} + */ - getBackgroundColor() { - return this.getObject(RGBColor, TemplateColorScheme.KEY_BACKGROUND_COLOR); + static get UK_UA() { + return Language._MAP.UK_UA; + } + /** + * Indonesian - Indonesia + * @return {String} + */ + + + static get ID_ID() { + return Language._MAP.ID_ID; + } + /** + * Vietnamese - Vietnam + * @return {String} + */ + + + static get VI_VN() { + return Language._MAP.VI_VN; + } + /** + * Malay - Malaysia + * @return {String} + */ + + + static get MS_MY() { + return Language._MAP.MS_MY; + } + /** + * Hindi - India + * @return {String} + */ + + + static get HI_IN() { + return Language._MAP.HI_IN; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return Language._valueForKey(key, Language._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return Language._keyForValue(value, Language._MAP); } } - TemplateColorScheme.KEY_PRIMARY_COLOR = 'primaryColor'; - TemplateColorScheme.KEY_SECONDARY_COLOR = 'secondaryColor'; - TemplateColorScheme.KEY_BACKGROUND_COLOR = 'backgroundColor'; + Language._MAP = Object.freeze({ + 'EN_US': 'EN-US', + 'ES_MX': 'ES-MX', + 'FR_CA': 'FR-CA', + 'DE_DE': 'DE-DE', + 'ES_ES': 'ES-ES', + 'EN_GB': 'EN-GB', + 'RU_RU': 'RU-RU', + 'TR_TR': 'TR-TR', + 'PL_PL': 'PL-PL', + 'FR_FR': 'FR-FR', + 'IT_IT': 'IT-IT', + 'SV_SE': 'SV-SE', + 'PT_PT': 'PT-PT', + 'NL_NL': 'NL-NL', + 'EN_AU': 'EN-AU', + 'ZH_CN': 'ZH-CN', + 'ZH_TW': 'ZH-TW', + 'JA_JP': 'JA-JP', + 'AR_SA': 'AR-SA', + 'KO_KR': 'KO-KR', + 'PT_BR': 'PT-BR', + 'CS_CZ': 'CS-CZ', + 'DA_DK': 'DA-DK', + 'NO_NO': 'NO-NO', + 'NL_BE': 'NL-BE', + 'EL_GR': 'EL-GR', + 'HU_HU': 'HU-HU', + 'FI_FI': 'FI-FI', + 'SK_SK': 'SK-SK', + 'EN_IN': 'EN-IN', + 'TH_TH': 'TH-TH', + 'EN_SA': 'EN-SA', + 'HE_IL': 'HE-IL', + 'RO_RO': 'RO-RO', + 'UK_UA': 'UK-UA', + 'ID_ID': 'ID-ID', + 'VI_VN': 'VI-VN', + 'MS_MY': 'MS-MY', + 'HI_IN': 'HI-IN' + }); /* * Copyright (c) 2019, Livio, Inc. @@ -2657,928 +2626,793 @@ * POSSIBILITY OF SUCH DAMAGE. */ /** - * @typedef {Enum} Language - * @property {Object} _MAP + * @typedef {Object} RpcMessage + * @property {RpcType} rpcType */ - class Language extends Enum { - /** - * @constructor - */ - constructor() { - super(); + class RpcMessage extends RpcStruct { + /* + { + "rpcType": "Request", + "functionName": "RegisterAppInterface", + "coorelationID": "320948", + "isEncrypted": false, + "parameters": { + "appName": "Hello" + }, + "bulkData": "...", } - /** - * @return {String} - */ - + */ - static get EN_SA() { - return Language._MAP.EN_SA; + /** + * @constructor + */ + constructor(store = {}) { + super(store.parameters); + this._isEncrypted = false; + this._rpcType = store.rpcType; + this._functionName = store.functionName; + this._correlationID = store.correlationID; + this.setBulkData(store.bulkData); } /** - * @return {String} - */ + * @return {RpcType} + */ - static get HE_IL() { - return Language._MAP.HE_IL; + getRPCType() { + return this._rpcType; } /** - * @return {String} - */ + * @param {RpcType} type + * @return {RpcMessage} + */ - static get RO_RO() { - return Language._MAP.RO_RO; + setRPCType(type) { + this._rpcType = type; + return this; } /** - * @return {String} - */ + * @return {FunctionID} type + */ - static get UK_UA() { - return Language._MAP.UK_UA; + getFunctionName() { + return this._functionName; } /** - * @return {String} - */ + * @param {FunctionID} name + * @return {RpcMessage} + */ - static get ID_ID() { - return Language._MAP.ID_ID; + setFunctionName(name) { + if (typeof name !== 'string') { + this._functionName = FunctionID.keyForValue(name); + } else { + this._functionName = name; + } + + return this; } /** - * @return {String} - */ + * @return {String} type + */ - static get VI_VN() { - return Language._MAP.VI_VN; + getCorrelationId() { + return this._correlationID; } /** - * @return {String} - */ + * @param {String} name + * @return {RpcMessage} + */ - static get MS_MY() { - return Language._MAP.MS_MY; + setCorrelationId(id) { + this._correlationID = id; + return this; } /** - * @return {String} - */ + * @return {Uint8Array} data + */ - static get HI_IN() { - return Language._MAP.HI_IN; + getBulkData() { + return this._bulkData; } /** - * @return {String} - */ + * @param {UInt8Array} data + * @return {RpcMessage} + */ - static get NL_BE() { - return Language._MAP.NL_BE; + setBulkData(data = null) { + if (data !== null) { + this._bulkData = data.slice(0); + } else { + this._bulkData = null; + } + + return this; } /** - * @return {String} - */ + * @return {Boolean} + */ - static get EL_GR() { - return Language._MAP.EL_GR; + getIsEncrypted() { + return this._isEncrypted; } /** - * @return {String} - */ + * @param {Boolean} bool + * @return {RpcMessage} + */ - static get HU_HU() { - return Language._MAP.HU_HU; + setIsEncrypted(bool) { + this._isEncrypted = bool; + return this; } - /** - * @return {String} - */ + } - static get FI_FI() { - return Language._MAP.FI_FI; + /* + * Copyright (c) 2019, Livio, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Livio Inc. nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + /** + * @typedef {Enum} RpcType + * @property {Object} _MAP + */ + + class RpcType extends Enum { + /** + * @constructor + */ + constructor() { + super(); } /** - * @return {String} + * @return {Number} */ - static get SK_SK() { - return Language._MAP.SK_SK; + static get NOTIFICATION() { + return RpcType._MAP.NOTIFICATION; } /** - * @return {String} + * @return {Number} */ - static get EN_US() { - return Language._MAP.EN_US; + static get RESPONSE() { + return RpcType._MAP.RESPONSE; } /** - * @return {String} + * @return {Number} */ - static get ES_MX() { - return Language._MAP.ES_MX; + static get REQUEST() { + return RpcType._MAP.REQUEST; } /** - * @return {String} - */ + * Get the value for the given enum key + * @param value - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ - static get FR_CA() { - return Language._MAP.FR_CA; + static valueForKey(key) { + return RpcType._valueForKey(key, RpcType._MAP); } /** - * @return {String} - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ - static get DE_DE() { - return Language._MAP.DE_DE; + static keyForValue(value) { + return RpcType._keyForValue(value, RpcType._MAP); } - /** - * @return {String} - */ + } - static get ES_ES() { - return Language._MAP.ES_ES; - } - /** - * @return {String} - */ + RpcType._MAP = Object.freeze({ + 'NOTIFICATION': 0x2, + 'RESPONSE': 0x1, + 'REQUEST': 0x0 + }); + /* + * Copyright (c) 2019, Livio, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Livio Inc. nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ - static get EN_GB() { - return Language._MAP.EN_GB; + class RpcRequest extends RpcMessage { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setRPCType(RpcType.REQUEST); + this._promise = null; } /** - * @return {String} - */ + * @return {Promise} + */ - static get RU_RU() { - return Language._MAP.RU_RU; + getOnRPCResponsePromise() { + return this._promise; } /** - * @return {String} - */ + * @param {Promise} promise + * @return {RpcMessage} + */ - static get TR_TR() { - return Language._MAP.TR_TR; + setOnRPCResponsePromise(promise) { + this.validateType(Promise, promise); + this._promise = promise; + return this; } - /** - * @return {String} - */ + } + + /* eslint-disable camelcase */ + /** + * Various information about connecting device. + */ - static get PL_PL() { - return Language._MAP.PL_PL; - } + class DeviceInfo extends RpcStruct { /** - * @return {String} + * @constructor */ - - - static get FR_FR() { - return Language._MAP.FR_FR; + constructor(parameters) { + super(parameters); } /** - * @return {String} + * @param {String} hardware - Device model + * @return {DeviceInfo} */ - static get IT_IT() { - return Language._MAP.IT_IT; + setHardware(hardware) { + this.setParameter(DeviceInfo.KEY_HARDWARE, hardware); + return this; } /** * @return {String} */ - static get SV_SE() { - return Language._MAP.SV_SE; + getHardware() { + return this.getParameter(DeviceInfo.KEY_HARDWARE); } /** - * @return {String} + * @param {String} rev - Device firmware revision + * @return {DeviceInfo} */ - static get PT_PT() { - return Language._MAP.PT_PT; + setFirmwareRev(rev) { + this.setParameter(DeviceInfo.KEY_FIRMWARE_REV, rev); + return this; } /** * @return {String} */ - static get NL_NL() { - return Language._MAP.NL_NL; + getFirmwareRev() { + return this.getParameter(DeviceInfo.KEY_FIRMWARE_REV); } /** - * @return {String} + * @param {String} os - Device OS + * @return {DeviceInfo} */ - static get EN_AU() { - return Language._MAP.EN_AU; + setOs(os) { + this.setParameter(DeviceInfo.KEY_OS, os); + return this; } /** * @return {String} */ - static get ZH_CN() { - return Language._MAP.ZH_CN; + getOs() { + return this.getParameter(DeviceInfo.KEY_OS); } /** - * @return {String} + * @param {String} version - Device OS version + * @return {DeviceInfo} */ - static get ZH_TW() { - return Language._MAP.ZH_TW; + setOsVersion(version) { + this.setParameter(DeviceInfo.KEY_OS_VERSION, version); + return this; } /** * @return {String} */ - static get JA_JP() { - return Language._MAP.JA_JP; + getOsVersion() { + return this.getParameter(DeviceInfo.KEY_OS_VERSION); } /** - * @return {String} + * @param {String} carrier - Device mobile carrier (if applicable) + * @return {DeviceInfo} */ - static get AR_SA() { - return Language._MAP.AR_SA; + setCarrier(carrier) { + this.setParameter(DeviceInfo.KEY_CARRIER, carrier); + return this; } /** * @return {String} */ - static get KO_KR() { - return Language._MAP.KO_KR; + getCarrier() { + return this.getParameter(DeviceInfo.KEY_CARRIER); } /** - * @return {String} + * @param {Number} ports - Omitted if connected not via BT. + * @return {DeviceInfo} */ - static get PT_BR() { - return Language._MAP.PT_BR; + setMaxNumberRFCOMMPorts(ports) { + this.setParameter(DeviceInfo.KEY_MAX_NUMBER_RFCOMM_PORTS, ports); + return this; } /** - * @return {String} + * @return {Number} */ - static get CS_CZ() { - return Language._MAP.CS_CZ; + getMaxNumberRFCOMMPorts() { + return this.getParameter(DeviceInfo.KEY_MAX_NUMBER_RFCOMM_PORTS); } - /** - * @return {String} - */ + } - static get DA_DK() { - return Language._MAP.DA_DK; - } - /** - * @return {String} - */ + DeviceInfo.KEY_HARDWARE = 'hardware'; + DeviceInfo.KEY_FIRMWARE_REV = 'firmwareRev'; + DeviceInfo.KEY_OS = 'os'; + DeviceInfo.KEY_OS_VERSION = 'osVersion'; + DeviceInfo.KEY_CARRIER = 'carrier'; + DeviceInfo.KEY_MAX_NUMBER_RFCOMM_PORTS = 'maxNumberRFCOMMPorts'; + /* eslint-disable camelcase */ + /** + * Establishes an interface with a mobile application. Before registerAppInterface no other commands will be + * accepted/executed. + */ - static get NO_NO() { - return Language._MAP.NO_NO; - } + class RegisterAppInterface extends RpcRequest { /** - * @return {String} + * @constructor */ - - - static get EN_IN() { - return Language._MAP.EN_IN; + constructor(store) { + super(store); + this.setFunctionName(FunctionID.RegisterAppInterface); } /** - * @return {String} + * @param {String} fullAppId + * @return {RegisterAppInterface} */ - static get TH_TH() { - return Language._MAP.TH_TH; - } - /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ - - - static valueForKey(key) { - return Language._valueForKey(key, Language._MAP); - } - /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ - - - static keyForValue(value) { - return Language._keyForValue(value, Language._MAP); - } - - } - - Language._MAP = Object.freeze({ - 'EN_SA': 'EN-SA', - 'HE_IL': 'HE-IL', - 'RO_RO': 'RO-RO', - 'UK_UA': 'UK-UA', - 'ID_ID': 'ID-ID', - 'VI_VN': 'VI-VN', - 'MS_MY': 'MS-MY', - 'HI_IN': 'HI-IN', - 'NL_BE': 'NL-BE', - 'EL_GR': 'EL-GR', - 'HU_HU': 'HU-HU', - 'FI_FI': 'FI-FI', - 'SK_SK': 'SK-SK', - 'EN_US': 'EN-US', - 'ES_MX': 'ES-MX', - 'FR_CA': 'FR-CA', - 'DE_DE': 'DE-DE', - 'ES_ES': 'ES-ES', - 'EN_GB': 'EN-GB', - 'RU_RU': 'RU-RU', - 'TR_TR': 'TR-TR', - 'PL_PL': 'PL-PL', - 'FR_FR': 'FR-FR', - 'IT_IT': 'IT-IT', - 'SV_SE': 'SV-SE', - 'PT_PT': 'PT-PT', - 'NL_NL': 'NL-NL', - 'EN_AU': 'EN-AU', - 'ZH_CN': 'ZH-CN', - 'ZH_TW': 'ZH-TW', - 'JA_JP': 'JA-JP', - 'AR_SA': 'AR-SA', - 'KO_KR': 'KO-KR', - 'PT_BR': 'PT-BR', - 'CS_CZ': 'CS-CZ', - 'DA_DK': 'DA-DK', - 'NO_NO': 'NO-NO', - 'EN_IN': 'EN-IN', - 'TH_TH': 'TH-TH' - }); - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - /** - * @typedef {Enum} AppHMIType - * @property {Object} _MAP - */ - - class AppHMIType extends Enum { - constructor() { - super(); - } - /** - * @return {String} - */ - - - static get DEFAULT() { - return AppHMIType._MAP.DEFAULT; - } - /** - * @return {String} - */ - - - static get COMMUNICATION() { - return AppHMIType._MAP.COMMUNICATION; - } - /** - * @return {String} - */ - - - static get MEDIA() { - return AppHMIType._MAP.MEDIA; - } - /** - * @return {String} - */ - - - static get MESSAGING() { - return AppHMIType._MAP.MESSAGING; - } - /** - * @return {String} - */ - - - static get NAVIGATION() { - return AppHMIType._MAP.NAVIGATION; - } - /** - * @return {String} - */ - - - static get INFORMATION() { - return AppHMIType._MAP.INFORMATION; - } - /** - * @return {String} - */ + setFullAppId(fullAppId) { + this.validateType(String, fullAppId); + if (fullAppId !== null) { + fullAppId = fullAppId.toLowerCase(); + this.setParameter(RegisterAppInterface.KEY_FULL_APP_ID, fullAppId); + let appID; - static get SOCIAL() { - return AppHMIType._MAP.SOCIAL; - } - /** - * @return {String} - */ + if (fullAppId.length <= RegisterAppInterface.APP_ID_MAX_LENGTH) { + appID = fullAppId; + } else { + appID = fullAppId.replace('-', '').substring(0, RegisterAppInterface.APP_ID_MAX_LENGTH); + } + this._setAppId(appID); + } else { + this.setParameter(RegisterAppInterface.KEY_FULL_APP_ID, null); + } - static get BACKGROUND_PROCESS() { - return AppHMIType._MAP.BACKGROUND_PROCESS; + return this; } /** - * @return {String} + * @return {String} the app id */ - static get TESTING() { - return AppHMIType._MAP.TESTING; + getFullAppId() { + return this.getParameter(RegisterAppInterface.KEY_FULL_APP_ID); } /** - * @return {String} + * @param {String} appId - This method should not be accessed directly by developers. Only set the full ID and this + * param will be set. + * @return {RegisterAppInterface} */ - static get SYSTEM() { - return AppHMIType._MAP.SYSTEM; + _setAppId(appId) { + this.validateType(String, appId); + this.setParameter(RegisterAppInterface.KEY_APP_ID, appId); + return this; } /** - * @return {String} + * @return {String} the app id */ - static get PROJECTION() { - return AppHMIType._MAP.PROJECTION; + getAppId() { + return this.getParameter(RegisterAppInterface.KEY_APP_ID); } /** - * @return {String} + * @param {SdlMsgVersion} version - See SyncMsgVersion + * @return {RegisterAppInterface} */ - static get REMOTE_CONTROL() { - return AppHMIType._MAP.REMOTE_CONTROL; - } - /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ - - - static valueForKey(key) { - return AppHMIType._valueForKey(key, AppHMIType._MAP); - } - /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ - - - static keyForValue(value) { - return AppHMIType._keyForValue(value, AppHMIType._MAP); - } - - } - - AppHMIType._MAP = Object.freeze({ - 'DEFAULT': 'DEFAULT', - 'COMMUNICATION': 'COMMUNICATION', - 'MEDIA': 'MEDIA', - 'MESSAGING': 'MESSAGING', - 'NAVIGATION': 'NAVIGATION', - 'INFORMATION': 'INFORMATION', - 'SOCIAL': 'SOCIAL', - 'BACKGROUND_PROCESS': 'BACKGROUND_PROCESS', - 'TESTING': 'TESTING', - 'SYSTEM': 'SYSTEM', - 'PROJECTION': 'PROJECTION', - 'REMOTE_CONTROL': 'REMOTE_CONTROL' - }); - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - - class RegisterAppInterface extends RpcRequest { - constructor(store) { - super(store); - this.setFunctionName(FunctionID.RegisterAppInterface); - } - /** - * @param {SdlMsgVersion} The max RPC Spec version supported by this library - * @return {RegisterAppInterface} - */ - - - setSdlMsgVersion(sdlMsgVersion) { - this.validateType(SdlMsgVersion, sdlMsgVersion); - this.setParameter(RegisterAppInterface.KEY_SDL_MSG_VERSION, sdlMsgVersion); + setSdlMsgVersion(version) { + this.validateType(SdlMsgVersion, version); + this.setParameter(RegisterAppInterface.KEY_SDL_MSG_VERSION, version); return this; } /** - * @return {SdlMsgVersion} - */ + * @return {SdlMsgVersion} + */ getSdlMsgVersion() { return this.getObject(SdlMsgVersion, RegisterAppInterface.KEY_SDL_MSG_VERSION); } /** - * @param {String} appName the name of the app that is registering - * @return {RegisterAppInterface} - */ + * @param {String} name - The mobile application name, e.g. "My SDL App". Needs to be unique over all applications + * from the same device. May not be empty. May not start with a new line character. May not + * interfere with any name or synonym of previously registered applications from the same + * device and any predefined blacklist of words (global commands) Additional applications + * with the same name from the same device will be rejected. Only characters from char set + * @return {RegisterAppInterface} + */ - setAppName(appName) { - this.validateType(String, appName); - this.setParameter(RegisterAppInterface.KEY_APP_NAME, appName); + setAppName(name) { + this.setParameter(RegisterAppInterface.KEY_APP_NAME, name); return this; } /** - * @return {String} the app name - */ + * @return {String} + */ getAppName() { return this.getParameter(RegisterAppInterface.KEY_APP_NAME); } /** - * @param {Array} ttsNames TTS string for VR recognition of the mobile application name, e.g. "My S D L App". - * Meant to overcome any failing on speech engine in properly pronouncing / understanding - * app name. Needs to be unique over all applications from the same device. May not be - * empty. May not start with a new line character. Only characters from char set - * @return {RegisterAppInterface} - */ + * @param {TTSChunk[]} name - TTS string for VR recognition of the mobile application name, e.g. "My S D L App". + * Meant to overcome any failing on speech engine in properly pronouncing / understanding + * app name. Needs to be unique over all applications from the same device. May not be + * empty. May not start with a new line character. Only characters from char set + * @return {RegisterAppInterface} + */ - setTtsName(ttsNames) { - this.setParameter(RegisterAppInterface.KEY_TTS_NAME, ttsNames); + setTtsName(name) { + this.validateType(TTSChunk, name, true); + this.setParameter(RegisterAppInterface.KEY_TTS_NAME, name); return this; } /** - * @return {Array} - */ + * @return {TTSChunk[]} + */ getTtsName() { return this.getObject(TTSChunk, RegisterAppInterface.KEY_TTS_NAME); } /** - * @param {String} ngnppName Provides an abbreviated version of the app name (if needed), that will be displayed - * on the NGN media screen. If not provided, the appName is used instead (and - * will be truncated if too long)Only characters from char set. - * @return {RegisterAppInterface} - */ + * @param {String} name - Provides an abbreviated version of the app name (if needed), that will be displayed on the + * NGN media screen. If not provided, the appName is used instead (and will be truncated if + * too long) Only characters from char set + * @return {RegisterAppInterface} + */ - setNgnMediaScreenAppName(ngnppName) { - this.validateType(String, ngnppName); - this.setParameter(RegisterAppInterface.KEY_NGN_MEDIA_SCREEN_APP_NAME, ngnppName); + setNgnMediaScreenAppName(name) { + this.setParameter(RegisterAppInterface.KEY_NGN_MEDIA_SCREEN_APP_NAME, name); return this; } /** - * @return {String} an abbreviated version of the app name - */ + * @return {String} + */ getNgnMediaScreenAppName() { return this.getParameter(RegisterAppInterface.KEY_NGN_MEDIA_SCREEN_APP_NAME); } /** - * @param {Array} vrSynonyms Defines an additional voice recognition command. May not - * interfere with any app name of previously registered applications - * from the same device and any predefined blacklist of words (global - * commands)Only characters from char set - * @return {RegisterAppInterface} - */ + * @param {String[]} synonyms - Defines an additional voice recognition command. May not interfere with any app name + * of previously registered applications from the same device and any predefined + * blacklist of words (global commands) Only characters from char set + * @return {RegisterAppInterface} + */ - setVrSynonyms(vrSynonyms) { - this.setParameter(RegisterAppInterface.KEY_VR_SYNONYMS, vrSynonyms); + setVrSynonyms(synonyms) { + this.setParameter(RegisterAppInterface.KEY_VR_SYNONYMS, synonyms); return this; } /** - * @return {Array} - */ + * @return {String[]} + */ getVrSynonyms() { return this.getParameter(RegisterAppInterface.KEY_VR_SYNONYMS); } /** - * @param {Boolean} isMediaApplication Indicates if the application is a media or a non-media application. - * Only media applications will be able to stream audio to the module - * that is audible outside of the BT media source. - * @return {RegisterAppInterface} - */ + * @param {Boolean} application - Indicates if the application is a media or a non-media application. Only media + * applications will be able to stream audio to the module that is audible outside of + * the BT media source. + * @return {RegisterAppInterface} + */ - setIsMediaApplication(isMediaApplication) { - this.setParameter(RegisterAppInterface.KEY_IS_MEDIA_APPLICATION, isMediaApplication); + setIsMediaApplication(application) { + this.setParameter(RegisterAppInterface.KEY_IS_MEDIA_APPLICATION, application); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ getIsMediaApplication() { return this.getParameter(RegisterAppInterface.KEY_IS_MEDIA_APPLICATION); } /** - * @param {Language} languageDesired - * @return {RegisterAppInterface} - */ + * @param {Language} desired - See Language Current app's expected VR+TTS language If there is a mismatch with the + * module, the app will be able to change this registration with changeRegistration + * prior to app being brought into focus. + * @return {RegisterAppInterface} + */ - setLanguageDesired(languageDesired) { - this.validateType(Language, languageDesired); - this.setParameter(RegisterAppInterface.KEY_LANGUAGE_DESIRED, languageDesired); + setLanguageDesired(desired) { + this.validateType(Language, desired); + this.setParameter(RegisterAppInterface.KEY_LANGUAGE_DESIRED, desired); return this; } /** - * @return {Language} - */ + * @return {Language} + */ getLanguageDesired() { return this.getObject(Language, RegisterAppInterface.KEY_LANGUAGE_DESIRED); } /** - * @param {Language} hmiDisplayLanguageDesired - * @return {RegisterAppInterface} - */ + * @param {Language} desired - See Language Current app's expected display language If there is a mismatch with the + * module, the app will be able to change this registration with changeRegistration + * prior to app being brought into focus. + * @return {RegisterAppInterface} + */ - setHmiDisplayLanguageDesired(hmiDisplayLanguageDesired) { - this.validateType(Language, hmiDisplayLanguageDesired); - this.setParameter(RegisterAppInterface.KEY_HMI_DISPLAY_LANGUAGE_DESIRED, hmiDisplayLanguageDesired); + setHmiDisplayLanguageDesired(desired) { + this.validateType(Language, desired); + this.setParameter(RegisterAppInterface.KEY_HMI_DISPLAY_LANGUAGE_DESIRED, desired); return this; } /** - * @return {Language} - */ + * @return {Language} + */ getHmiDisplayLanguageDesired() { return this.getObject(Language, RegisterAppInterface.KEY_HMI_DISPLAY_LANGUAGE_DESIRED); } /** - * @param {Array} appHMIType - * @return {RegisterAppInterface} - */ + * @param {AppHMIType[]} type - See AppHMIType List of all applicable app HMI types stating which HMI + * classifications to be given to the app. + * @return {RegisterAppInterface} + */ - setAppHmiType(appHMIType) { - // TODO make validate type accept arrays - // this.validateType(AppHMIType, appHMIType); - this.setParameter(RegisterAppInterface.KEY_APP_HMI_TYPE, appHMIType); + setAppHMIType(type) { + this.validateType(AppHMIType, type, true); + this.setParameter(RegisterAppInterface.KEY_APP_HMI_TYPE, type); return this; } /** - * @return {Array} - */ + * @return {AppHMIType[]} + */ - getAppHmiType() { + getAppHMIType() { return this.getObject(AppHMIType, RegisterAppInterface.KEY_APP_HMI_TYPE); } /** - * @param {String} hashID the hash ID - * @return {RegisterAppInterface} - */ + * @param {String} id - ID used to uniquely identify current state of all app data that can persist through + * connection cycles (e.g. ignition cycles). This registered data (commands, submenus, choice + * sets, etc.) can be reestablished without needing to explicitly reregister each piece. If + * omitted, then the previous state of an app's commands, etc. will not be restored. When + * sending hashID, all RegisterAppInterface parameters should still be provided (e.g. ttsName, + * etc.). + * @return {RegisterAppInterface} + */ - setHashID(hashID) { - this.validateType(String, hashID); - this.setParameter(RegisterAppInterface.KEY_HASH_ID, hashID); + setHashID(id) { + this.setParameter(RegisterAppInterface.KEY_HASH_ID, id); return this; } /** - * @return {String} the hash ID - */ + * @return {String} + */ getHashID() { return this.getParameter(RegisterAppInterface.KEY_HASH_ID); } /** - * @param {DeviceInfo} deviceInfo + * @param {DeviceInfo} info - See DeviceInfo. * @return {RegisterAppInterface} */ - setDeviceInfo(deviceInfo) { - this.validateType(DeviceInfo, deviceInfo); - this.setParameter(RegisterAppInterface.KEY_DEVICE_INFO, deviceInfo); + setDeviceInfo(info) { + this.validateType(DeviceInfo, info); + this.setParameter(RegisterAppInterface.KEY_DEVICE_INFO, info); return this; } /** - * @return {DeviceInfo} - */ + * @return {DeviceInfo} + */ getDeviceInfo() { return this.getObject(DeviceInfo, RegisterAppInterface.KEY_DEVICE_INFO); } /** - * @param {String} appName This method should not be accessed directly by developers. Only set the full ID and this param will be set. - * @return {RegisterAppInterface} - */ - - - _setAppId(appId) { - this.validateType(String, appId); - this.setParameter(RegisterAppInterface.KEY_APP_ID, appId); - return this; - } - /** - * @return {String} the app id - */ - - - getAppId() { - return this.getParameter(RegisterAppInterface.KEY_APP_ID); - } - /** - * @param {String} fullAppId - * @return {RegisterAppInterface} - */ - - - setFullAppId(fullAppId) { - this.validateType(String, fullAppId); - - if (fullAppId !== null) { - fullAppId = fullAppId.toLowerCase(); - this.setParameter(RegisterAppInterface.KEY_FULL_APP_ID, fullAppId); - let appId; - - if (fullAppId.length <= RegisterAppInterface.APP_ID_MAX_LENGTH) { - appId = fullAppId; - } else { - appId = fullAppId.replace('-', '').substring(0, RegisterAppInterface.APP_ID_MAX_LENGTH); - } + * @param {String} id - ID used to validate app with policy table entries + * @return {RegisterAppInterface} + */ - this._setAppId(appId); - } else { - this.setParameter(RegisterAppInterface.KEY_FULL_APP_ID, null); - } + setFullAppID(id) { + this.setParameter(RegisterAppInterface.KEY_FULL_APP_ID, id); return this; } /** - * @return {String} the app id - */ + * @return {String} + */ - getFullAppId() { + getFullAppID() { return this.getParameter(RegisterAppInterface.KEY_FULL_APP_ID); } /** - * @param {AppInfo} appInfo + * @param {AppInfo} info - See AppInfo. * @return {RegisterAppInterface} */ - setAppInfo(appInfo) { - this.validateType(AppInfo, appInfo); - this.setParameter(RegisterAppInterface.KEY_APP_INFO, appInfo); + setAppInfo(info) { + this.validateType(AppInfo, info); + this.setParameter(RegisterAppInterface.KEY_APP_INFO, info); return this; } /** - * @return {AppInfo} - */ + * @return {AppInfo} + */ getAppInfo() { return this.getObject(AppInfo, RegisterAppInterface.KEY_APP_INFO); } /** - * @param {TemplateColorScheme} dayColorScheme + * @param {TemplateColorScheme} scheme - A color scheme for all display layout templates. * @return {RegisterAppInterface} */ - setDayColorScheme(dayColorScheme) { - this.validateType(TemplateColorScheme, dayColorScheme); - this.setParameter(RegisterAppInterface.KEY_DAY_COLOR_SCHEME, dayColorScheme); + setDayColorScheme(scheme) { + this.validateType(TemplateColorScheme, scheme); + this.setParameter(RegisterAppInterface.KEY_DAY_COLOR_SCHEME, scheme); return this; } /** - * @return {TemplateColorScheme} - */ + * @return {TemplateColorScheme} + */ getDayColorScheme() { return this.getObject(TemplateColorScheme, RegisterAppInterface.KEY_DAY_COLOR_SCHEME); } /** - * @param {TemplateColorScheme} nightColorScheme + * @param {TemplateColorScheme} scheme - A color scheme for all display layout templates. * @return {RegisterAppInterface} */ - setNightColorScheme(nightColorScheme) { - this.validateType(TemplateColorScheme, nightColorScheme); - this.setParameter(RegisterAppInterface.KEY_NIGHT_COLOR_SCHEME, nightColorScheme); + setNightColorScheme(scheme) { + this.validateType(TemplateColorScheme, scheme); + this.setParameter(RegisterAppInterface.KEY_NIGHT_COLOR_SCHEME, scheme); return this; } /** - * @return {TemplateColorScheme} - */ + * @return {TemplateColorScheme} + */ getNightColorScheme() { @@ -3587,7 +3421,6 @@ } - RegisterAppInterface.KEY_SYNC_MSG_VERSION = 'syncMsgVersion'; RegisterAppInterface.KEY_SDL_MSG_VERSION = 'syncMsgVersion'; RegisterAppInterface.KEY_APP_NAME = 'appName'; RegisterAppInterface.KEY_TTS_NAME = 'ttsName'; @@ -3606,37 +3439,7 @@ RegisterAppInterface.KEY_NIGHT_COLOR_SCHEME = 'nightColorScheme'; RegisterAppInterface.APP_ID_MAX_LENGTH = 10; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ /** * @typedef {Enum} Result * @property {Object} _MAP @@ -3650,6 +3453,7 @@ super(); } /** + * The request succeeded * @return {String} */ @@ -3658,6 +3462,7 @@ return Result._MAP.SUCCESS; } /** + * The request is not supported by the headunit * @return {String} */ @@ -3666,14 +3471,16 @@ return Result._MAP.UNSUPPORTED_REQUEST; } /** + * A button that was requested for subscription is not supported under the current system. * @return {String} */ static get UNSUPPORTED_RESOURCE() { - return Result._MAP.UNSUPPORTED_REQUEST; + return Result._MAP.UNSUPPORTED_RESOURCE; } /** + * RPC is not authorized in local policy table. * @return {String} */ @@ -3682,6 +3489,9 @@ return Result._MAP.DISALLOWED; } /** + * The requested command was rejected, e.g. because mobile app is in background and cannot perform any HMI + * commands. Or an HMI command (e.g. Speak) is rejected because a higher priority HMI command (e.g. Alert) is + * playing. * @return {String} */ @@ -3690,6 +3500,8 @@ return Result._MAP.REJECTED; } /** + * A command was aborted, for example due to user interaction (e.g. user pressed button). Or an HMI command (e.g. + * Speak) is aborted because a higher priority HMI command (e.g. Alert) was requested. * @return {String} */ @@ -3698,6 +3510,9 @@ return Result._MAP.ABORTED; } /** + * A command was ignored, because the intended result is already in effect. For example, SetMediaClockTimer was + * used to pause the media clock although the clock is paused already. NOTE: potentially replaces + * SUBSCRIBED_ALREADY * @return {String} */ @@ -3706,6 +3521,8 @@ return Result._MAP.IGNORED; } /** + * The user interrupted the RPC (e.g. PerformAudioPassThru) and indicated to start over. Note, the app must issue + * the new RPC. * @return {String} */ @@ -3714,6 +3531,8 @@ return Result._MAP.RETRY; } /** + * The data may not be changed, because it is currently in use. For example when trying to delete a command set + * that is currently involved in an interaction. * @return {String} */ @@ -3722,6 +3541,7 @@ return Result._MAP.IN_USE; } /** + * The requested vehicle data is not available on this vehicle or is not published. * @return {String} */ @@ -3730,6 +3550,7 @@ return Result._MAP.VEHICLE_DATA_NOT_AVAILABLE; } /** + * Overlay reached the maximum timeout and closed. * @return {String} */ @@ -3738,6 +3559,8 @@ return Result._MAP.TIMED_OUT; } /** + * The data sent is invalid. For example: Invalid Json syntax Parameters out of bounds (number or enum range) + * Mandatory parameters not provided Parameter provided with wrong type Invalid characters Empty string * @return {String} */ @@ -3754,6 +3577,8 @@ return Result._MAP.CHAR_LIMIT_EXCEEDED; } /** + * One of the provided IDs is not valid. For example This applies to CorrelationID, SubscriptionID, CommandID, + * MenuID, etc. * @return {String} */ @@ -3762,6 +3587,7 @@ return Result._MAP.INVALID_ID; } /** + * There was a conflict with an registered name (application or menu item) or vr command * @return {String} */ @@ -3770,6 +3596,7 @@ return Result._MAP.DUPLICATE_NAME; } /** + * An command can not be executed because no application has been registered with RegisterApplication. * @return {String} */ @@ -3778,6 +3605,8 @@ return Result._MAP.APPLICATION_NOT_REGISTERED; } /** + * The requested language is currently not supported. Might be because of a mismatch of the currently active + * language on the headunit and the requested language * @return {String} */ @@ -3786,6 +3615,7 @@ return Result._MAP.WRONG_LANGUAGE; } /** + * The system could not process the request because the necessary memory couldn't be allocated * @return {String} */ @@ -3794,6 +3624,8 @@ return Result._MAP.OUT_OF_MEMORY; } /** + * There are too many requests pending (means, that the response has not been delivered, yet).There may be a + * maximum of 1000 pending requests at a time. * @return {String} */ @@ -3802,6 +3634,7 @@ return Result._MAP.TOO_MANY_PENDING_REQUESTS; } /** + * There are already too many registered applications * @return {String} */ @@ -3810,6 +3643,7 @@ return Result._MAP.TOO_MANY_APPLICATIONS; } /** + * RegisterApplication has been called again, after a RegisterApplication was successful before. * @return {String} */ @@ -3818,6 +3652,7 @@ return Result._MAP.APPLICATION_REGISTERED_ALREADY; } /** + * The RPC (e.g. SubscribeVehicleData) executed successfully but one or more items have a warning or failure. * @return {String} */ @@ -3826,6 +3661,7 @@ return Result._MAP.WARNINGS; } /** + * Provided data is valid but something went wrong in the lower layers. * @return {String} */ @@ -3834,6 +3670,7 @@ return Result._MAP.GENERIC_ERROR; } /** + * RPC is included in a functional group explicitly blocked by the user. * @return {String} */ @@ -3842,6 +3679,8 @@ return Result._MAP.USER_DISALLOWED; } /** + * The RPC (e.g. ReadDID) executed successfully but the data exceeded the platform maximum threshold and thus, + * only part of the data is available. * @return {String} */ @@ -3850,6 +3689,7 @@ return Result._MAP.TRUNCATED_DATA; } /** + * Sync doesn't support the protocol that is requested by the mobile application * @return {String} */ @@ -3858,6 +3698,7 @@ return Result._MAP.UNSUPPORTED_VERSION; } /** + * The user has turned off access to vehicle data, and it is globally unavailable to mobile applications. * @return {String} */ @@ -3866,6 +3707,7 @@ return Result._MAP.VEHICLE_DATA_NOT_ALLOWED; } /** + * A specified file could not be found on the headunit. * @return {String} */ @@ -3874,6 +3716,7 @@ return Result._MAP.FILE_NOT_FOUND; } /** + * User selected to Cancel Route. * @return {String} */ @@ -3882,6 +3725,7 @@ return Result._MAP.CANCEL_ROUTE; } /** + * The RPC (e.g. Slider) executed successfully and the user elected to save the current position / value. * @return {String} */ @@ -3890,6 +3734,7 @@ return Result._MAP.SAVED; } /** + * The certificate provided during authentication is invalid. * @return {String} */ @@ -3898,6 +3743,7 @@ return Result._MAP.INVALID_CERT; } /** + * The certificate provided during authentication is expired. * @return {String} */ @@ -3906,6 +3752,8 @@ return Result._MAP.EXPIRED_CERT; } /** + * The provided hash ID does not match the hash of the current set of registered data or the core could not resume + * the previous data. * @return {String} */ @@ -3914,6 +3762,8 @@ return Result._MAP.RESUME_FAILED; } /** + * The requested information is currently not available. This is different than UNSUPPORTED_RESOURCE because it + * implies the data is at some point available. * @return {String} */ @@ -3922,6 +3772,7 @@ return Result._MAP.DATA_NOT_AVAILABLE; } /** + * The value being set is read only * @return {String} */ @@ -3930,6 +3781,7 @@ return Result._MAP.READ_ONLY; } /** + * The data sent failed to pass CRC check in receiver end * @return {String} */ @@ -3938,20 +3790,29 @@ return Result._MAP.CORRUPTED_DATA; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * SDL receives an un-encrypted RPC request that needs protection. + * @return {String} + */ + + + static get ENCRYPTION_NEEDED() { + return Result._MAP.ENCRYPTION_NEEDED; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey(key) { return Result._valueForKey(key, Result._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue(value) { @@ -3996,7 +3857,8 @@ 'RESUME_FAILED': 'RESUME_FAILED', 'DATA_NOT_AVAILABLE': 'DATA_NOT_AVAILABLE', 'READ_ONLY': 'READ_ONLY', - 'CORRUPTED_DATA': 'CORRUPTED_DATA' + 'CORRUPTED_DATA': 'CORRUPTED_DATA', + 'ENCRYPTION_NEEDED': 'ENCRYPTION_NEEDED' }); /* @@ -17804,539 +17666,342 @@ } - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ /** - * @typedef {Enum} ImageType - * @property {Object} _MAP + * Contains information about a SoftButton's capabilities. */ - class ImageType extends Enum { + class SoftButtonCapabilities extends RpcStruct { /** - * @constructor - */ - constructor() { - super(); + * @constructor + */ + constructor(parameters) { + super(parameters); } /** - * @return {String} + * @param {Boolean} available - The button supports a short press. Whenever the button is pressed short, + * onButtonPressed( SHORT) will be invoked. + * @return {SoftButtonCapabilities} */ - static get STATIC() { - return ImageType._MAP.STATIC; + setShortPressAvailable(available) { + this.setParameter(SoftButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE, available); + return this; } /** - * @return {String} + * @return {Boolean} */ - static get DYNAMIC() { - return ImageType._MAP.DYNAMIC; + getShortPressAvailable() { + return this.getParameter(SoftButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE); } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * @param {Boolean} available - The button supports a LONG press. Whenever the button is pressed long, + * onButtonPressed( LONG) will be invoked. + * @return {SoftButtonCapabilities} + */ - static valueForKey(key) { - return ImageType._valueForKey(key, ImageType._MAP); + setLongPressAvailable(available) { + this.setParameter(SoftButtonCapabilities.KEY_LONG_PRESS_AVAILABLE, available); + return this; } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ - - - static keyForValue(value) { - return ImageType._keyForValue(value, ImageType._MAP); - } - - } - - ImageType._MAP = Object.freeze({ - 'STATIC': 'STATIC', - 'DYNAMIC': 'DYNAMIC' - }); + * @return {Boolean} + */ - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - class Image extends RpcStruct { - /** - * @constructor - */ - constructor(parameters) { - super(parameters); + getLongPressAvailable() { + return this.getParameter(SoftButtonCapabilities.KEY_LONG_PRESS_AVAILABLE); } /** - * @param {String} value - * @return {Image} - */ + * @param {Boolean} available - The button supports "button down" and "button up". Whenever the button is pressed, + * onButtonEvent( DOWN) will be invoked. Whenever the button is released, + * onButtonEvent( UP) will be invoked. + * @return {SoftButtonCapabilities} + */ - setValue(value) { - this.setParameter(Image.KEY_VALUE, value); + setUpDownAvailable(available) { + this.setParameter(SoftButtonCapabilities.KEY_UP_DOWN_AVAILABLE, available); return this; } /** - * @return {String} - */ + * @return {Boolean} + */ - getValue() { - return this.getParameter(Image.KEY_VALUE); + getUpDownAvailable() { + return this.getParameter(SoftButtonCapabilities.KEY_UP_DOWN_AVAILABLE); } /** - * @param {ImageType} type - * @return {Image} - */ + * @param {Boolean} supported - The button supports referencing a static or dynamic image. + * @return {SoftButtonCapabilities} + */ - setImageType(type) { - this.validateType(ImageType, type); - this.setParameter(Image.KEY_IMAGE_TYPE, type); + setImageSupported(supported) { + this.setParameter(SoftButtonCapabilities.KEY_IMAGE_SUPPORTED, supported); return this; } /** - * @return {ImageType} - */ + * @return {Boolean} + */ - getImageType() { - return this.getObject(ImageType, Image.KEY_IMAGE_TYPE); + getImageSupported() { + return this.getParameter(SoftButtonCapabilities.KEY_IMAGE_SUPPORTED); } /** - * @param {Boolean} isTemplate - * @return {Image} - */ + * @param {Boolean} supported - The button supports the use of text. If not included, the default value should be + * considered true that the button will support text. + * @return {SoftButtonCapabilities} + */ - setIsTemplate(isTemplate) { - this.setParameter(Image.KEY_IS_TEMPLATE, isTemplate); + setTextSupported(supported) { + this.setParameter(SoftButtonCapabilities.KEY_TEXT_SUPPORTED, supported); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ - getIsTemplate() { - return this.getParameter(Image.KEY_IS_TEMPLATE); + getTextSupported() { + return this.getParameter(SoftButtonCapabilities.KEY_TEXT_SUPPORTED); } } - Image.KEY_VALUE = 'value'; - Image.KEY_IMAGE_TYPE = 'imageType'; - Image.KEY_IS_TEMPLATE = 'isTemplate'; + SoftButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE = 'shortPressAvailable'; + SoftButtonCapabilities.KEY_LONG_PRESS_AVAILABLE = 'longPressAvailable'; + SoftButtonCapabilities.KEY_UP_DOWN_AVAILABLE = 'upDownAvailable'; + SoftButtonCapabilities.KEY_IMAGE_SUPPORTED = 'imageSupported'; + SoftButtonCapabilities.KEY_TEXT_SUPPORTED = 'textSupported'; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * Contains a list of prerecorded speech items present on the platform. + * @typedef {Enum} PrerecordedSpeech + * @property {Object} _MAP + */ - class MenuParams extends RpcStruct { + class PrerecordedSpeech extends Enum { /** - * @constructor - */ - constructor(parameters) { - super(parameters); + * @constructor + */ + constructor() { + super(); } /** - * @param {Number} id - * @return {MenuParams} - */ + * @return {String} + */ - setParentID(id) { - this.setParameter(MenuParams.KEY_PARENT_ID, id); - return this; + static get HELP_JINGLE() { + return PrerecordedSpeech._MAP.HELP_JINGLE; } /** - * @return {Number} - */ + * @return {String} + */ - getParentID() { - return this.getParameter(MenuParams.KEY_PARENT_ID); + static get INITIAL_JINGLE() { + return PrerecordedSpeech._MAP.INITIAL_JINGLE; } /** - * @param {Number} position - * @return {MenuParams} - */ + * @return {String} + */ - setPosition(position) { - this.setParameter(MenuParams.KEY_POSITION, position); - return this; + static get LISTEN_JINGLE() { + return PrerecordedSpeech._MAP.LISTEN_JINGLE; } /** - * @return {Number} - */ + * @return {String} + */ - getPosition() { - return this.getParameter(MenuParams.KEY_POSITION); + static get POSITIVE_JINGLE() { + return PrerecordedSpeech._MAP.POSITIVE_JINGLE; } /** - * @param {String} menuName - * @return {MenuParams} - */ + * @return {String} + */ - setMenuName(menuName) { - this.setParameter(MenuParams.KEY_MENU_NAME, menuName); - return this; + static get NEGATIVE_JINGLE() { + return PrerecordedSpeech._MAP.NEGATIVE_JINGLE; } /** - * @param {String} - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ - getMenuName() { - return this.getParameter(MenuParams.KEY_MENU_NAME); + static valueForKey(key) { + return PrerecordedSpeech._valueForKey(key, PrerecordedSpeech._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return PrerecordedSpeech._keyForValue(value, PrerecordedSpeech._MAP); } } - MenuParams.KEY_PARENT_ID = 'parentID'; - MenuParams.KEY_POSITION = 'position'; - MenuParams.KEY_MENU_NAME = 'menuName'; + PrerecordedSpeech._MAP = Object.freeze({ + 'HELP_JINGLE': 'HELP_JINGLE', + 'INITIAL_JINGLE': 'INITIAL_JINGLE', + 'LISTEN_JINGLE': 'LISTEN_JINGLE', + 'POSITIVE_JINGLE': 'POSITIVE_JINGLE', + 'NEGATIVE_JINGLE': 'NEGATIVE_JINGLE' + }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * Contains information about on-screen preset capabilities. + */ - class AddCommand extends RpcRequest { + class PresetBankCapabilities extends RpcStruct { /** - * @constructor - */ - constructor(store) { - super(store); - this.setFunctionName(FunctionID.AddCommand); + * @constructor + */ + constructor(parameters) { + super(parameters); } /** - * @param {Number} id - * @return {AddCommand} - */ + * @param {Boolean} available - Onscreen custom presets are available. + * @return {PresetBankCapabilities} + */ - setCmdID(id) { - this.setParameter(AddCommand.KEY_CMD_ID, id); + setOnScreenPresetsAvailable(available) { + this.setParameter(PresetBankCapabilities.KEY_ON_SCREEN_PRESETS_AVAILABLE, available); return this; } /** - * @return {Number} - */ + * @return {Boolean} + */ - getCmdID() { - return this.getParameter(AddCommand.KEY_CMD_ID); + getOnScreenPresetsAvailable() { + return this.getParameter(PresetBankCapabilities.KEY_ON_SCREEN_PRESETS_AVAILABLE); } + + } + + PresetBankCapabilities.KEY_ON_SCREEN_PRESETS_AVAILABLE = 'onScreenPresetsAvailable'; + + /* eslint-disable camelcase */ + + class VehicleType extends RpcStruct { /** - * @param {MenuParams} menuParams - * @return {AddCommand} - */ + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} make - Make of the vehicle, e.g. Ford + * @return {VehicleType} + */ - setMenuParams(menuParams) { - this.validateType(MenuParams, menuParams); - this.setParameter(AddCommand.KEY_MENU_PARAMS, menuParams); + setMake(make) { + this.setParameter(VehicleType.KEY_MAKE, make); return this; } /** - * @return {MenuParams} - */ + * @return {String} + */ - getMenuParams() { - return this.getObject(MenuParams, AddCommand.KEY_MENU_PARAMS); + getMake() { + return this.getParameter(VehicleType.KEY_MAKE); } /** - * @param {Array} vrCommands - * @return {AddCommand} - */ + * @param {String} model - Model of the vehicle, e.g. Fiesta + * @return {VehicleType} + */ - setVrCommands(vrCommands) { - this.setParameter(AddCommand.KEY_VR_COMMANDS, vrCommands); + setModel(model) { + this.setParameter(VehicleType.KEY_MODEL, model); return this; } /** - * @return {Array} - */ + * @return {String} + */ - getVrCommands() { - return this.getParameter(AddCommand.KEY_VR_COMMANDS); + getModel() { + return this.getParameter(VehicleType.KEY_MODEL); } /** - * @param {Image} icon - * @return {AddCommand} - */ + * @param {String} year - Model Year of the vehicle, e.g. 2013 + * @return {VehicleType} + */ - setCmdIcon(icon) { - this.validateType(Image, icon); - this.setParameter(AddCommand.KEY_CMD_ICON, icon); + setModelYear(year) { + this.setParameter(VehicleType.KEY_MODEL_YEAR, year); return this; } /** - * @return {Image} - */ + * @return {String} + */ - getCmdIcon() { - return this.getObject(Image, AddCommand.KEY_CMD_ICON); + getModelYear() { + return this.getParameter(VehicleType.KEY_MODEL_YEAR); } + /** + * @param {String} trim - Trim of the vehicle, e.g. SE + * @return {VehicleType} + */ - } - - AddCommand.KEY_CMD_ICON = 'cmdIcon'; - AddCommand.KEY_MENU_PARAMS = 'menuParams'; - AddCommand.KEY_CMD_ID = 'cmdID'; - AddCommand.KEY_VR_COMMANDS = 'vrCommands'; - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - class AddCommandResponse extends RpcResponse { - /** - * @constructor - */ - constructor(store) { - super(store); - this.setFunctionName(FunctionID.AddCommand); + setTrim(trim) { + this.setParameter(VehicleType.KEY_TRIM, trim); + return this; } + /** + * @return {String} + */ - } - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - class RpcNotification extends RpcMessage { - /** - * @constructor - */ - constructor(store) { - super(store); - this.setRPCType(RpcType.NOTIFICATION); + getTrim() { + return this.getParameter(VehicleType.KEY_TRIM); } } - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + VehicleType.KEY_MAKE = 'make'; + VehicleType.KEY_MODEL = 'model'; + VehicleType.KEY_MODEL_YEAR = 'modelYear'; + VehicleType.KEY_TRIM = 'trim'; + + /* eslint-disable camelcase */ /** - * @typedef {Enum} HMILevel + * Contains information about the HMI zone capabilities. For future use. + * @typedef {Enum} HmiZoneCapabilities * @property {Object} _MAP */ - class HMILevel extends Enum { + class HmiZoneCapabilities extends Enum { + /** + * @constructor + */ constructor() { super(); } @@ -18345,665 +18010,584 @@ */ - static get HMI_FULL() { - return HMILevel._MAP.HMI_FULL; + static get FRONT() { + return HmiZoneCapabilities._MAP.FRONT; } /** * @return {String} */ - static get HMI_LIMITED() { - return HMILevel._MAP.HMI_LIMITED; - } - /** - * @return {String} - */ - - - static get HMI_BACKGROUND() { - return HMILevel._MAP.HMI_BACKGROUND; + static get BACK() { + return HmiZoneCapabilities._MAP.BACK; } /** - * @return {String} + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found */ - static get HMI_NONE() { - return HMILevel._MAP.HMI_NONE; - } - /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ - - static valueForKey(key) { - return HMILevel._valueForKey(key, HMILevel._MAP); + return HmiZoneCapabilities._valueForKey(key, HmiZoneCapabilities._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue(value) { - return HMILevel._keyForValue(value, HMILevel._MAP); + return HmiZoneCapabilities._keyForValue(value, HmiZoneCapabilities._MAP); } } - HMILevel._MAP = Object.freeze({ - 'HMI_FULL': 'FULL', - 'HMI_LIMITED': 'LIMITED', - 'HMI_BACKGROUND': 'BACKGROUND', - 'HMI_NONE': 'NONE' + HmiZoneCapabilities._MAP = Object.freeze({ + 'FRONT': 'FRONT', + 'BACK': 'BACK' }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ /** - * @typedef {Enum} AudioStreamingState + * @typedef {Enum} MediaClockFormat * @property {Object} _MAP */ - class AudioStreamingState extends Enum { + class MediaClockFormat extends Enum { + /** + * @constructor + */ constructor() { super(); } /** + * minutesFieldWidth = 2;minutesFieldMax = 19;secondsFieldWidth = 2;secondsFieldMax = 99;maxHours = 19;maxMinutes + * = 59;maxSeconds = 59; used for Type II and CID headunits * @return {String} */ - static get AUDIBLE() { - return AudioStreamingState._MAP.AUDIBLE; + static get CLOCK1() { + return MediaClockFormat._MAP.CLOCK1; } /** + * minutesFieldWidth = 3;minutesFieldMax = 199;secondsFieldWidth = 2;secondsFieldMax = 99;maxHours = 59;maxMinutes + * = 59;maxSeconds = 59; used for Type V headunit * @return {String} */ - static get ATTENUATED() { - return AudioStreamingState._MAP.ATTENUATED; + static get CLOCK2() { + return MediaClockFormat._MAP.CLOCK2; } /** + * minutesFieldWidth = 2;minutesFieldMax = 59;secondsFieldWidth = 2;secondsFieldMax = 59;maxHours = 9;maxMinutes = + * 59;maxSeconds = 59; used for GEN1.1 MFD3/4/5 headunits * @return {String} */ - static get NOT_AUDIBLE() { - return AudioStreamingState._MAP.NOT_AUDIBLE; + static get CLOCK3() { + return MediaClockFormat._MAP.CLOCK3; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * 5 characters possible Format: 1|sp c :|sp c c 1|sp : digit "1" or space c : character out of following + * character set: sp|0-9|[letters, see TypeII column in XLS. See :|sp : colon or space used for Type II headunit + * @return {String} + */ - static valueForKey(key) { - return AudioStreamingState._valueForKey(key, AudioStreamingState._MAP); + static get CLOCKTEXT1() { + return MediaClockFormat._MAP.CLOCKTEXT1; } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ - - - static keyForValue(value) { - return AudioStreamingState._keyForValue(value, AudioStreamingState._MAP); - } - - } - - AudioStreamingState._MAP = Object.freeze({ - 'AUDIBLE': 'AUDIBLE', - 'ATTENUATED': 'ATTENUATED', - 'NOT_AUDIBLE': 'NOT_AUDIBLE' - }); + * 5 chars possible Format: 1|sp c :|sp c c 1|sp : digit "1" or space c : character out of following character + * set: sp|0-9|[letters, see CID column in XLS. See :|sp : colon or space used for CID headunit NOTE: difference + * between CLOCKTEXT1 and CLOCKTEXT2 is the supported character set + * @return {String} + */ - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - /** - * @typedef {Enum} VideoStreamingState - * @property {Object} _MAP - */ - class VideoStreamingState extends Enum { - constructor() { - super(); + static get CLOCKTEXT2() { + return MediaClockFormat._MAP.CLOCKTEXT2; } /** + * 6 chars possible Format: 1|sp c c :|sp c c 1|sp : digit "1" or space c : character out of following character + * set: sp|0-9|[letters, see Type 5 column in XLS]. See :|sp : colon or space used for Type V headunit * @return {String} */ - static get STREAMABLE() { - return VideoStreamingState._MAP.STREAMABLE; + static get CLOCKTEXT3() { + return MediaClockFormat._MAP.CLOCKTEXT3; } /** + * 6 chars possible Format: c :|sp c c : c c :|sp : colon or space c : character out of following character set: + * sp|0-9|[letters]. used for GEN1.1 MFD3/4/5 headunits * @return {String} */ - static get NOT_STREAMABLE() { - return VideoStreamingState._MAP.NOT_STREAMABLE; + static get CLOCKTEXT4() { + return MediaClockFormat._MAP.CLOCKTEXT4; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey(key) { - return VideoStreamingState._valueForKey(key, VideoStreamingState._MAP); + return MediaClockFormat._valueForKey(key, MediaClockFormat._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue(value) { - return VideoStreamingState._keyForValue(value, VideoStreamingState._MAP); + return MediaClockFormat._keyForValue(value, MediaClockFormat._MAP); } } - VideoStreamingState._MAP = Object.freeze({ - 'STREAMABLE': 'STREAMABLE', - 'NOT_STREAMABLE': 'NOT_STREAMABLE' + MediaClockFormat._MAP = Object.freeze({ + 'CLOCK1': 'CLOCK1', + 'CLOCK2': 'CLOCK2', + 'CLOCK3': 'CLOCK3', + 'CLOCKTEXT1': 'CLOCKTEXT1', + 'CLOCKTEXT2': 'CLOCKTEXT2', + 'CLOCKTEXT3': 'CLOCKTEXT3', + 'CLOCKTEXT4': 'CLOCKTEXT4' }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - /** - * @typedef {Enum} SystemContext - * @property {Object} _MAP - */ + /* eslint-disable camelcase */ - class SystemContext extends Enum { - constructor() { - super(); - } + class ImageResolution extends RpcStruct { /** - * @return {String} + * @constructor */ - - - static get SYSCTXT_MAIN() { - return SystemContext._MAP.SYSCTXT_MAIN; + constructor(parameters) { + super(parameters); } /** - * @return {String} + * @param {Number} width - The image resolution width. + * @return {ImageResolution} */ - static get SYSCTXT_VRSESSION() { - return SystemContext._MAP.SYSCTXT_VRSESSION; + setResolutionWidth(width) { + this.setParameter(ImageResolution.KEY_RESOLUTION_WIDTH, width); + return this; } /** - * @return {String} + * @return {Number} */ - static get SYSCTXT_MENU() { - return SystemContext._MAP.SYSCTXT_MENU; + getResolutionWidth() { + return this.getParameter(ImageResolution.KEY_RESOLUTION_WIDTH); } /** - * @return {String} + * @param {Number} height - The image resolution height. + * @return {ImageResolution} */ - static get SYSCTXT_HMI_OBSCURED() { - return SystemContext._MAP.SYSCTXT_HMI_OBSCURED; + setResolutionHeight(height) { + this.setParameter(ImageResolution.KEY_RESOLUTION_HEIGHT, height); + return this; } /** - * @return {String} + * @return {Number} */ - static get SYSCTXT_ALERT() { - return SystemContext._MAP.SYSCTXT_ALERT; - } - /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ - - - static valueForKey(key) { - return SystemContext._valueForKey(key, SystemContext._MAP); - } - /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ - - - static keyForValue(value) { - return SystemContext._keyForValue(value, SystemContext._MAP); + getResolutionHeight() { + return this.getParameter(ImageResolution.KEY_RESOLUTION_HEIGHT); } } - SystemContext._MAP = Object.freeze({ - 'SYSCTXT_MAIN': 'MAIN', - 'SYSCTXT_VRSESSION': 'VRSESSION', - 'SYSCTXT_MENU': 'MENU', - 'SYSCTXT_HMI_OBSCURED': 'HMI_OBSCURED', - 'SYSCTXT_ALERT': 'ALERT' - }); - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - - class OnHmiStatus extends RpcNotification { - /** - * @constructor - */ - constructor(store) { - super(store); - this.setFunctionName(FunctionID.OnHMIStatus); - } - /** - * @param {HMILevel} hmiLevel - * @return {OnHmiStatus} - */ - - - setHMILevel(hmiLevel) { - this.validateType(HMILevel, hmiLevel); - this.setParameter(OnHmiStatus.KEY_HMI_LEVEL, hmiLevel); - return this; - } - /** - * @return {HMILevel} - */ - - - getHMILevel() { - return this.getObject(HMILevel, OnHmiStatus.KEY_HMI_LEVEL); - } - /** - * @param {AudioStreamingState} audioStreamingState - * @return {OnHmiStatus} - */ + ImageResolution.KEY_RESOLUTION_WIDTH = 'resolutionWidth'; + ImageResolution.KEY_RESOLUTION_HEIGHT = 'resolutionHeight'; + /* eslint-disable camelcase */ - setAudioStreamingState(audioStreamingState) { - this.validateType(AudioStreamingState, audioStreamingState); - this.setParameter(OnHmiStatus.KEY_AUDIO_STREAMING_STATE, audioStreamingState); - return this; - } + class TouchEventCapabilities extends RpcStruct { /** - * @return {AudioStreamingState} - */ - - - getAudioStreamingState() { - return this.getObject(AudioStreamingState, OnHmiStatus.KEY_AUDIO_STREAMING_STATE); + * @constructor + */ + constructor(parameters) { + super(parameters); } /** - * @param {SystemContext} systemContext - * @return {OnHmiStatus} - */ + * @param {Boolean} available + * @return {TouchEventCapabilities} + */ - setSystemContext(systemContext) { - this.validateType(SystemContext, systemContext); - this.setParameter(OnHmiStatus.KEY_SYSTEM_CONTEXT, systemContext); + setPressAvailable(available) { + this.setParameter(TouchEventCapabilities.KEY_PRESS_AVAILABLE, available); return this; } /** - * @return {SystemContext} - */ + * @return {Boolean} + */ - getSystemContext() { - return this.getObject(SystemContext, OnHmiStatus.KEY_SYSTEM_CONTEXT); + getPressAvailable() { + return this.getParameter(TouchEventCapabilities.KEY_PRESS_AVAILABLE); } /** - * @param {VideoStreamingState} videoStreamingState - * @return {OnHmiStatus} - */ + * @param {Boolean} available + * @return {TouchEventCapabilities} + */ - setVideoStreamingState(videoStreamingState) { - this.validateType(VideoStreamingState, videoStreamingState); - this.setParameter(OnHmiStatus.KEY_VIDEO_STREAMING_STATE, videoStreamingState); + setMultiTouchAvailable(available) { + this.setParameter(TouchEventCapabilities.KEY_MULTI_TOUCH_AVAILABLE, available); return this; } /** - * @return {VideoStreamingState} - */ + * @return {Boolean} + */ - getVideoStreamingState() { - return this.getObject(VideoStreamingState, OnHmiStatus.KEY_VIDEO_STREAMING_STATE); + getMultiTouchAvailable() { + return this.getParameter(TouchEventCapabilities.KEY_MULTI_TOUCH_AVAILABLE); } /** - * @param {Number} windowID - * @return {Show} - */ + * @param {Boolean} available + * @return {TouchEventCapabilities} + */ - setWindowID(windowID) { - this.setParameter(OnHmiStatus.KEY_WINDOW_ID, windowID); + setDoublePressAvailable(available) { + this.setParameter(TouchEventCapabilities.KEY_DOUBLE_PRESS_AVAILABLE, available); return this; } /** - * @return {Number} - */ + * @return {Boolean} + */ - getWindowID() { - return this.getParameter(OnHmiStatus.KEY_WINDOW_ID); + getDoublePressAvailable() { + return this.getParameter(TouchEventCapabilities.KEY_DOUBLE_PRESS_AVAILABLE); } } - OnHmiStatus.KEY_HMI_LEVEL = 'hmiLevel'; - OnHmiStatus.KEY_AUDIO_STREAMING_STATE = 'audioStreamingState'; - OnHmiStatus.KEY_SYSTEM_CONTEXT = 'systemContext'; - OnHmiStatus.KEY_VIDEO_STREAMING_STATE = 'videoStreamingState'; - OnHmiStatus.KEY_WINDOW_ID = 'windowID'; + TouchEventCapabilities.KEY_PRESS_AVAILABLE = 'pressAvailable'; + TouchEventCapabilities.KEY_MULTI_TOUCH_AVAILABLE = 'multiTouchAvailable'; + TouchEventCapabilities.KEY_DOUBLE_PRESS_AVAILABLE = 'doublePressAvailable'; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ - class OnLanguageChange extends RpcNotification { + class ScreenParams extends RpcStruct { /** - * @constructor - */ - constructor(store) { - super(store); - this.setFunctionName(FunctionID.OnLanguageChange); + * @constructor + */ + constructor(parameters) { + super(parameters); } /** - * @param {Language} language - * @return {OnLanguageChange} - */ + * @param {ImageResolution} resolution - The resolution of the prescribed screen area. + * @return {ScreenParams} + */ - setLanguage(language) { - this.validateType(Language, language); - this.setParameter(OnLanguageChange.KEY_LANGUAGE, language); + setResolution(resolution) { + this.validateType(ImageResolution, resolution); + this.setParameter(ScreenParams.KEY_RESOLUTION, resolution); return this; } /** - * @return {Language} - */ + * @return {ImageResolution} + */ - getLanguage() { - return this.getObject(Language, OnLanguageChange.KEY_LANGUAGE); + getResolution() { + return this.getObject(ImageResolution, ScreenParams.KEY_RESOLUTION); } /** - * @param {Language} language - * @return {OnLanguageChange} - */ + * @param {TouchEventCapabilities} available - Types of screen touch events available in screen area. + * @return {ScreenParams} + */ - setHMIDisplayLanguage(language) { - this.validateType(Language, language); - this.setParameter(OnLanguageChange.KEY_HMI_DISPLAY_LANGUAGE, language); + setTouchEventAvailable(available) { + this.validateType(TouchEventCapabilities, available); + this.setParameter(ScreenParams.KEY_TOUCH_EVENT_AVAILABLE, available); return this; } /** - * @return {Language} - */ + * @return {TouchEventCapabilities} + */ - getHMIDisplayLanguage() { - return this.getObject(Language, OnLanguageChange.KEY_HMI_DISPLAY_LANGUAGE); + getTouchEventAvailable() { + return this.getObject(TouchEventCapabilities, ScreenParams.KEY_TOUCH_EVENT_AVAILABLE); } } - OnLanguageChange.KEY_LANGUAGE = 'language'; - OnLanguageChange.KEY_HMI_DISPLAY_LANGUAGE = 'hmiDisplayLanguage'; + ScreenParams.KEY_RESOLUTION = 'resolution'; + ScreenParams.KEY_TOUCH_EVENT_AVAILABLE = 'touchEventAvailable'; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ /** - * @typedef {Enum} FileType + * @typedef {Enum} ImageFieldName * @property {Object} _MAP */ - class FileType extends Enum { + class ImageFieldName extends Enum { + /** + * @constructor + */ constructor() { super(); } /** + * The image field for SoftButton * @return {String} */ - static get GRAPHIC_BMP() { - return FileType._MAP.GRAPHIC_BMP; + static get softButtonImage() { + return ImageFieldName._MAP.softButtonImage; } /** + * The first image field for Choice * @return {String} */ - static get GRAPHIC_JPEG() { - return FileType._MAP.GRAPHIC_JPEG; + static get choiceImage() { + return ImageFieldName._MAP.choiceImage; } /** + * The secondary image field for Choice * @return {String} */ - static get GRAPHIC_PNG() { - return FileType._MAP.GRAPHIC_PNG; + static get choiceSecondaryImage() { + return ImageFieldName._MAP.choiceSecondaryImage; } /** + * The image field for vrHelpItem * @return {String} */ - static get AUDIO_WAVE() { - return FileType._MAP.AUDIO_WAVE; + static get vrHelpItem() { + return ImageFieldName._MAP.vrHelpItem; } /** + * The image field for Turn * @return {String} */ - static get AUDIO_AAC() { - return FileType._MAP.AUDIO_AAC; + static get turnIcon() { + return ImageFieldName._MAP.turnIcon; } /** + * The image field for the menu icon in SetGlobalProperties * @return {String} */ - static get BINARY() { - return FileType._MAP.BINARY; + static get menuIcon() { + return ImageFieldName._MAP.menuIcon; + } + /** + * The image field for AddCommand + * @return {String} + */ + + + static get cmdIcon() { + return ImageFieldName._MAP.cmdIcon; + } + /** + * The image field for the app icon (set by setAppIcon) + * @return {String} + */ + + + static get appIcon() { + return ImageFieldName._MAP.appIcon; + } + /** + * The primary image field for Show + * @return {String} + */ + + + static get graphic() { + return ImageFieldName._MAP.graphic; + } + /** + * The secondary image field for Show + * @return {String} + */ + + + static get secondaryGraphic() { + return ImageFieldName._MAP.secondaryGraphic; + } + /** + * The primary image field for ShowConstantTBT + * @return {String} + */ + + + static get showConstantTBTIcon() { + return ImageFieldName._MAP.showConstantTBTIcon; + } + /** + * The secondary image field for ShowConstantTBT + * @return {String} + */ + + + static get showConstantTBTNextTurnIcon() { + return ImageFieldName._MAP.showConstantTBTNextTurnIcon; + } + /** + * The optional image of a destination / location + * @return {String} + */ + + + static get locationImage() { + return ImageFieldName._MAP.locationImage; + } + /** + * The image field for Alert + * @return {String} + */ + + + static get alertIcon() { + return ImageFieldName._MAP.alertIcon; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return ImageFieldName._valueForKey(key, ImageFieldName._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return ImageFieldName._keyForValue(value, ImageFieldName._MAP); + } + + } + + ImageFieldName._MAP = Object.freeze({ + 'softButtonImage': 'softButtonImage', + 'choiceImage': 'choiceImage', + 'choiceSecondaryImage': 'choiceSecondaryImage', + 'vrHelpItem': 'vrHelpItem', + 'turnIcon': 'turnIcon', + 'menuIcon': 'menuIcon', + 'cmdIcon': 'cmdIcon', + 'appIcon': 'appIcon', + 'graphic': 'graphic', + 'secondaryGraphic': 'secondaryGraphic', + 'showConstantTBTIcon': 'showConstantTBTIcon', + 'showConstantTBTNextTurnIcon': 'showConstantTBTNextTurnIcon', + 'locationImage': 'locationImage', + 'alertIcon': 'alertIcon' + }); + + /* eslint-disable camelcase */ + /** + * Enumeration listing possible file types. + * @typedef {Enum} FileType + * @property {Object} _MAP + */ + + class FileType extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get GRAPHIC_BMP() { + return FileType._MAP.GRAPHIC_BMP; + } + /** + * @return {String} + */ + + + static get GRAPHIC_JPEG() { + return FileType._MAP.GRAPHIC_JPEG; + } + /** + * @return {String} + */ + + + static get GRAPHIC_PNG() { + return FileType._MAP.GRAPHIC_PNG; + } + /** + * @return {String} + */ + + + static get AUDIO_WAVE() { + return FileType._MAP.AUDIO_WAVE; + } + /** + * @return {String} + */ + + + static get AUDIO_MP3() { + return FileType._MAP.AUDIO_MP3; + } + /** + * @return {String} + */ + + + static get AUDIO_AAC() { + return FileType._MAP.AUDIO_AAC; + } + /** + * @return {String} + */ + + + static get BINARY() { + return FileType._MAP.BINARY; } /** * @return {String} @@ -19014,20 +18598,20 @@ return FileType._MAP.JSON; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey(key) { return FileType._valueForKey(key, FileType._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue(value) { @@ -19047,554 +18631,521 @@ 'JSON': 'JSON' }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ - class PutFile extends RpcRequest { + class ImageField extends RpcStruct { /** - * @constructor - */ - constructor(store) { - super(store); - this.setFunctionName(FunctionID.PutFile); - } // ------ Not part of the RPC spec itself ----- - + * @constructor + */ + constructor(parameters) { + super(parameters); + } /** - * @param {Uint8Array} fileData - * @return {PutFile} - */ + * @param {ImageFieldName} name - The name that identifies the field. See ImageFieldName. + * @return {ImageField} + */ - setFileData(fileData) { - this.setBulkData(fileData); + setName(name) { + this.validateType(ImageFieldName, name); + this.setParameter(ImageField.KEY_NAME, name); return this; } /** - * @return {Uint8Array} - */ - + * @return {ImageFieldName} + */ - getFileData() { - return this.getBulkData(); - } // ----------------- END ----------------------- + getName() { + return this.getObject(ImageFieldName, ImageField.KEY_NAME); + } /** - * @param {String} fileName - * @return {PutFile} - */ + * @param {FileType[]} supported - The image types that are supported in this field. See FileType. + * @return {ImageField} + */ - setFileName(fileName) { - this.setParameter(PutFile.KEY_FILE_NAME, fileName); + setImageTypeSupported(supported) { + this.validateType(FileType, supported, true); + this.setParameter(ImageField.KEY_IMAGE_TYPE_SUPPORTED, supported); return this; } /** - * @return {String} - */ + * @return {FileType[]} + */ - getFileName() { - return this.getParameter(PutFile.KEY_FILE_NAME); + getImageTypeSupported() { + return this.getObject(FileType, ImageField.KEY_IMAGE_TYPE_SUPPORTED); } /** - * @param {FileType} fileType - * @return {PutFile} - */ + * @param {ImageResolution} resolution - The image resolution of this field. + * @return {ImageField} + */ - setFileType(fileType) { - this.validateType(FileType, fileType); - this.setParameter(PutFile.KEY_FILE_TYPE, fileType); + setImageResolution(resolution) { + this.validateType(ImageResolution, resolution); + this.setParameter(ImageField.KEY_IMAGE_RESOLUTION, resolution); return this; } /** - * @return {FileType} - */ + * @return {ImageResolution} + */ - getFileType() { - return this.getObject(FileType, PutFile.KEY_MENU_PARAMS); + getImageResolution() { + return this.getObject(ImageResolution, ImageField.KEY_IMAGE_RESOLUTION); } - /** - * @param {Boolean} persistentFile - * @return {PutFile} - */ + } - setPersistentFile(persistentFile) { - this.setParameter(PutFile.KEY_PERSISTENT_FILE, persistentFile); - return this; + ImageField.KEY_NAME = 'name'; + ImageField.KEY_IMAGE_TYPE_SUPPORTED = 'imageTypeSupported'; + ImageField.KEY_IMAGE_RESOLUTION = 'imageResolution'; + + /* eslint-disable camelcase */ + /** + * See DAES for further infos regarding the displays + * @deprecated + * @typedef {Enum} DisplayType + * @property {Object} _MAP + */ + + class DisplayType extends Enum { + /** + * @deprecated + * @constructor + */ + constructor() { + super(); } /** - * @return {Boolean} - */ + * @deprecated + * @return {String} + */ - getPersistentFile() { - return this.getParameter(PutFile.KEY_PERSISTENT_FILE); + static get CID() { + return DisplayType._MAP.CID; } /** - * @param {Boolean} systemFile - * @return {PutFile} - */ + * @deprecated + * @return {String} + */ - setSystemFile(systemFile) { - this.setParameter(PutFile.KEY_SYSTEM_FILE, systemFile); - return this; + static get TYPE2() { + return DisplayType._MAP.TYPE2; } /** - * @return {Boolean} - */ + * @deprecated + * @return {String} + */ - getSystemFile() { - return this.getParameter(PutFile.KEY_SYSTEM_FILE); + static get TYPE5() { + return DisplayType._MAP.TYPE5; } /** - * @param {Number} offset - * @return {PutFile} - */ + * @deprecated + * @return {String} + */ - setOffset(offset) { - this.setParameter(PutFile.KEY_OFFSET, offset); - return this; + static get NGN() { + return DisplayType._MAP.NGN; } /** - * @return {Number} - */ + * @deprecated + * @return {String} + */ - getOffset() { - return this.getParameter(PutFile.KEY_OFFSET); + static get GEN2_8_DMA() { + return DisplayType._MAP.GEN2_8_DMA; } /** - * @param {Number} length - * @return {PutFile} - */ + * @deprecated + * @return {String} + */ - setLength(length) { - this.setParameter(PutFile.KEY_LENGTH, length); - return this; + static get GEN2_6_DMA() { + return DisplayType._MAP.GEN2_6_DMA; } /** - * @return {Number} - */ + * @deprecated + * @return {String} + */ - getLength() { - return this.getParameter(PutFile.KEY_LENGTH); + static get MFD3() { + return DisplayType._MAP.MFD3; } /** - * @param {Number} crc - * @return {PutFile} - */ + * @deprecated + * @return {String} + */ - setCRC(crc) { - this.setParameter(PutFile.KEY_CRC, crc); - return this; + static get MFD4() { + return DisplayType._MAP.MFD4; } /** - * @return {Number} - */ + * @deprecated + * @return {String} + */ - getCRC() { - return this.getParameter(PutFile.KEY_CRC); + static get MFD5() { + return DisplayType._MAP.MFD5; } + /** + * @deprecated + * @return {String} + */ - } - PutFile.KEY_FILE_NAME = 'syncFileName'; - PutFile.KEY_FILE_TYPE = 'fileType'; - PutFile.KEY_PERSISTENT_FILE = 'persistentFile'; - PutFile.KEY_SYSTEM_FILE = 'systemFile'; - PutFile.KEY_OFFSET = 'offset'; - PutFile.KEY_LENGTH = 'length'; - PutFile.KEY_CRC = 'crc'; + static get GEN3_8_INCH() { + return DisplayType._MAP.GEN3_8_INCH; + } + /** + * @deprecated + * @return {String} + */ - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - class PutFileResponse extends RpcResponse { - /** - * @constructor - */ - constructor(store) { - super(store); - this.setFunctionName(FunctionID.PutFile); + static get SDL_GENERIC() { + return DisplayType._MAP.SDL_GENERIC; } /** - * @param {Number} spaceAvailable - * @return {PutFileResponse} - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ - setSpaceAvailable(spaceAvailable) { - this.setParameter(PutFileResponse.KEY_SPACE_AVAILABLE, spaceAvailable); - return this; + static valueForKey(key) { + return DisplayType._valueForKey(key, DisplayType._MAP); } /** - * @return {Number} - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ - getSpaceAvailable() { - return this.getParameter(PutFileResponse.KEY_SPACE_AVAILABLE); + static keyForValue(value) { + return DisplayType._keyForValue(value, DisplayType._MAP); } } - PutFileResponse.KEY_SPACE_AVAILABLE = 'spaceAvailable'; + DisplayType._MAP = Object.freeze({ + 'CID': 'CID', + 'TYPE2': 'TYPE2', + 'TYPE5': 'TYPE5', + 'NGN': 'NGN', + 'GEN2_8_DMA': 'GEN2_8_DMA', + 'GEN2_6_DMA': 'GEN2_6_DMA', + 'MFD3': 'MFD3', + 'MFD4': 'MFD4', + 'MFD5': 'MFD5', + 'GEN3_8_INCH': 'GEN3_8-INCH', + 'SDL_GENERIC': 'SDL_GENERIC' + }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ /** * @typedef {Enum} TextFieldName * @property {Object} _MAP */ class TextFieldName extends Enum { + /** + * @constructor + */ constructor() { super(); } /** - * @return {String} - */ + * The first line of first set of main fields of the persistent display; applies to "Show" + * @return {String} + */ static get mainField1() { return TextFieldName._MAP.mainField1; } /** - * @return {String} - */ + * The second line of first set of main fields of the persistent display; applies to "Show" + * @return {String} + */ static get mainField2() { return TextFieldName._MAP.mainField2; } /** - * @return {String} - */ + * The first line of second set of main fields of persistent display; applies to "Show" + * @return {String} + */ static get mainField3() { return TextFieldName._MAP.mainField3; } /** - * @return {String} - */ + * The second line of second set of main fields of the persistent display; applies to "Show" + * @return {String} + */ static get mainField4() { return TextFieldName._MAP.mainField4; } /** - * @return {String} - */ + * The status bar on NGN; applies to "Show" + * @return {String} + */ static get statusBar() { return TextFieldName._MAP.statusBar; } /** - * @return {String} - */ + * Text value for MediaClock field; applies to "Show" + * @return {String} + */ static get mediaClock() { return TextFieldName._MAP.mediaClock; } /** - * @return {String} - */ + * The track field of NGN and GEN1.1 MFD displays. This field is only available for media applications; applies to + * "Show" + * @return {String} + */ static get mediaTrack() { return TextFieldName._MAP.mediaTrack; } /** - * @return {String} - */ + * The title of the new template that will be displayed; applies to "Show" + * @return {String} + */ static get templateTitle() { return TextFieldName._MAP.templateTitle; } /** - * @return {String} - */ + * The first line of the alert text field; applies to "Alert" + * @return {String} + */ static get alertText1() { return TextFieldName._MAP.alertText1; } /** - * @return {String} - */ + * The second line of the alert text field; applies to "Alert" + * @return {String} + */ static get alertText2() { return TextFieldName._MAP.alertText2; } /** - * @return {String} - */ + * The third line of the alert text field; applies to "Alert" + * @return {String} + */ static get alertText3() { return TextFieldName._MAP.alertText3; } /** - * @return {String} - */ + * Long form body of text that can include newlines and tabs; applies to "ScrollableMessage" + * @return {String} + */ static get scrollableMessageBody() { return TextFieldName._MAP.scrollableMessageBody; } /** - * @return {String} - */ + * First line suggestion for a user response (in the case of VR enabled interaction) + * @return {String} + */ static get initialInteractionText() { return TextFieldName._MAP.initialInteractionText; } /** - * @return {String} - */ + * First line of navigation text + * @return {String} + */ static get navigationText1() { return TextFieldName._MAP.navigationText1; } /** - * @return {String} - */ + * Second line of navigation text + * @return {String} + */ static get navigationText2() { return TextFieldName._MAP.navigationText2; } /** - * @return {String} - */ + * Estimated Time of Arrival time for navigation + * @return {String} + */ static get ETA() { return TextFieldName._MAP.ETA; } /** - * @return {String} - */ + * Total distance to destination for navigation + * @return {String} + */ static get totalDistance() { return TextFieldName._MAP.totalDistance; } /** - * @return {String} - */ + * First line of text for audio pass thru + * @return {String} + */ static get audioPassThruDisplayText1() { return TextFieldName._MAP.audioPassThruDisplayText1; } /** - * @return {String} - */ + * Second line of text for audio pass thru + * @return {String} + */ static get audioPassThruDisplayText2() { return TextFieldName._MAP.audioPassThruDisplayText2; } /** - * @return {String} - */ + * Header text for slider + * @return {String} + */ static get sliderHeader() { return TextFieldName._MAP.sliderHeader; } /** - * @return {String} - */ + * Footer text for slider + * @return {String} + */ static get sliderFooter() { return TextFieldName._MAP.sliderFooter; } /** - * @return {String} - */ + * Primary text for Choice + * @return {String} + */ static get menuName() { return TextFieldName._MAP.menuName; } /** - * @return {String} - */ + * Secondary text for Choice + * @return {String} + */ static get secondaryText() { return TextFieldName._MAP.secondaryText; } /** - * @return {String} - */ + * Tertiary text for Choice + * @return {String} + */ static get tertiaryText() { return TextFieldName._MAP.tertiaryText; } /** - * @return {String} - */ + * Optional text to label an app menu button (for certain touchscreen platforms). + * @return {String} + */ static get menuTitle() { return TextFieldName._MAP.menuTitle; } /** - * @return {String} - */ + * Optional name / title of intended location for SendLocation. + * @return {String} + */ static get locationName() { return TextFieldName._MAP.locationName; } /** - * @return {String} - */ + * Optional description of intended location / establishment (if applicable) for SendLocation. + * @return {String} + */ static get locationDescription() { return TextFieldName._MAP.locationDescription; } /** - * @return {String} - */ + * Optional location address (if applicable) for SendLocation. + * @return {String} + */ static get addressLines() { return TextFieldName._MAP.addressLines; } /** - * @return {String} - */ + * Optional hone number of intended location / establishment (if applicable) for SendLocation. + * @return {String} + */ static get phoneNumber() { return TextFieldName._MAP.phoneNumber; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey(key) { return TextFieldName._valueForKey(key, TextFieldName._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue(value) { @@ -19635,93 +19186,71 @@ 'phoneNumber': 'phoneNumber' }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ /** + * The list of potential character sets * @typedef {Enum} CharacterSet * @property {Object} _MAP */ class CharacterSet extends Enum { + /** + * @constructor + */ constructor() { super(); } /** - * @return {String} - */ + * See + * @return {String} + */ static get TYPE2SET() { return CharacterSet._MAP.TYPE2SET; } /** - * @return {String} - */ + * See + * @return {String} + */ static get TYPE5SET() { return CharacterSet._MAP.TYPE5SET; } /** - * @return {String} - */ + * See + * @return {String} + */ static get CID1SET() { return CharacterSet._MAP.CID1SET; } /** - * @return {String} - */ + * See + * @return {String} + */ static get CID2SET() { return CharacterSet._MAP.CID2SET; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey(key) { return CharacterSet._valueForKey(key, CharacterSet._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue(value) { @@ -19737,84 +19266,57 @@ 'CID2SET': 'CID2SET' }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ class TextField extends RpcStruct { + /** + * @constructor + */ constructor(parameters) { super(parameters); } /** - * @param {TextFieldName} textFieldName - * @return {TextField} - */ + * @param {TextFieldName} name - The name that identifies the field. See TextFieldName. + * @return {TextField} + */ - setTextFieldName(textFieldName) { - this.validateType(TextFieldName, textFieldName); - this.setParameter(TextField.KEY_NAME, textFieldName); + setName(name) { + this.validateType(TextFieldName, name); + this.setParameter(TextField.KEY_NAME, name); return this; } /** - * @return {TextFieldName} - */ + * @return {TextFieldName} + */ - getTextFieldName() { + getName() { return this.getObject(TextFieldName, TextField.KEY_NAME); } /** - * @param {CharacterSet} textFieldName - * @return {TextField} - */ + * @param {CharacterSet} set - The character set that is supported in this field. See CharacterSet. + * @return {TextField} + */ - setCharacterSet(characterSet) { - this.validateType(CharacterSet, characterSet); - this.setParameter(TextField.KEY_CHARACTER_SET, characterSet); + setCharacterSet(set) { + this.validateType(CharacterSet, set); + this.setParameter(TextField.KEY_CHARACTER_SET, set); return this; } /** - * @return {CharacterSet} - */ + * @return {CharacterSet} + */ getCharacterSet() { return this.getObject(CharacterSet, TextField.KEY_CHARACTER_SET); } /** - * @param {Number} width - * @return {TextField} - */ + * @param {Number} width - The number of characters in one row of this field. + * @return {TextField} + */ setWidth(width) { @@ -19822,17 +19324,17 @@ return this; } /** - * @return {Number} - */ + * @return {Number} + */ getWidth() { return this.getParameter(TextField.KEY_WIDTH); } /** - * @param {Number} rows - * @return {TextField} - */ + * @param {Number} rows - The number of rows of this field. + * @return {TextField} + */ setRows(rows) { @@ -19840,8 +19342,8 @@ return this; } /** - * @return {Number} - */ + * @return {Number} + */ getRows() { @@ -19855,756 +19357,548 @@ TextField.KEY_WIDTH = 'width'; TextField.KEY_ROWS = 'rows'; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * Contains information about the display capabilities. This struct is deprecated; please see the new SystemCapability + * DISPLAYS and corresponding struct DisplayCapability + * @deprecated + */ - class ImageResolution extends RpcStruct { + class DisplayCapabilities extends RpcStruct { + /** + * @deprecated + * @constructor + */ constructor(parameters) { super(parameters); } /** - * @param {Number} resolutionWidth - * @return {ImageResolution} - */ + * @deprecated + * @param {DisplayType} type - The type of the display. See DisplayType + * @return {DisplayCapabilities} + */ - setResolutionWidth(resolutionWidth) { - this.setParameter(ImageResolution.KEY_RESOLUTION_WIDTH, resolutionWidth); + setDisplayType(type) { + this.validateType(DisplayType, type); + this.setParameter(DisplayCapabilities.KEY_DISPLAY_TYPE, type); return this; } /** - * @return {Number} - */ + * @deprecated + * @return {DisplayType} + */ - getResolutionWidth() { - return this.getParameter(ImageResolution.KEY_RESOLUTION_WIDTH); + getDisplayType() { + return this.getObject(DisplayType, DisplayCapabilities.KEY_DISPLAY_TYPE); } /** - * @param {Number} resolutionHeight - * @return {ImageResolution} - */ + * @deprecated + * @param {String} name - The name of the display the app is connected to. + * @return {DisplayCapabilities} + */ - setResolutionHeight(resolutionHeight) { - this.setParameter(ImageResolution.KEY_RESOLUTION_HEIGHT, resolutionHeight); + setDisplayName(name) { + this.setParameter(DisplayCapabilities.KEY_DISPLAY_NAME, name); return this; } /** - * @return {Number} - */ - - - getResolutionHeight() { - return this.getParameter(ImageResolution.KEY_RESOLUTION_HEIGHT); - } - - } - - ImageResolution.KEY_RESOLUTION_WIDTH = 'resolutionWidth'; - ImageResolution.KEY_RESOLUTION_HEIGHT = 'resolutionHeight'; - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - /** - * @typedef {Enum} ImageFieldName - * @property {Object} _MAP - */ - - class ImageFieldName extends Enum { - constructor() { - super(); - } - /** - * @return {String} - */ - - - static get softButtonImage() { - return ImageFieldName._MAP.softButtonImage; - } - /** - * @return {String} - */ + * @deprecated + * @return {String} + */ - static get choiceImage() { - return ImageFieldName._MAP.choiceImage; + getDisplayName() { + return this.getParameter(DisplayCapabilities.KEY_DISPLAY_NAME); } /** - * @return {String} - */ + * @deprecated + * @param {TextField[]} fields - A set of all fields that support text data. See TextField + * @return {DisplayCapabilities} + */ - static get choiceSecondaryImage() { - return ImageFieldName._MAP.choiceSecondaryImage; + setTextFields(fields) { + this.validateType(TextField, fields, true); + this.setParameter(DisplayCapabilities.KEY_TEXT_FIELDS, fields); + return this; } /** - * @return {String} - */ + * @deprecated + * @return {TextField[]} + */ - static get vrHelpItem() { - return ImageFieldName._MAP.vrHelpItem; + getTextFields() { + return this.getObject(TextField, DisplayCapabilities.KEY_TEXT_FIELDS); } /** - * @return {String} - */ + * @deprecated + * @param {ImageField[]} fields - A set of all fields that support images. See ImageField + * @return {DisplayCapabilities} + */ - static get turnIcon() { - return ImageFieldName._MAP.turnIcon; + setImageFields(fields) { + this.validateType(ImageField, fields, true); + this.setParameter(DisplayCapabilities.KEY_IMAGE_FIELDS, fields); + return this; } /** - * @return {String} - */ + * @deprecated + * @return {ImageField[]} + */ - static get menuIcon() { - return ImageFieldName._MAP.menuIcon; + getImageFields() { + return this.getObject(ImageField, DisplayCapabilities.KEY_IMAGE_FIELDS); } /** - * @return {String} - */ + * @deprecated + * @param {MediaClockFormat[]} formats - A set of all supported formats of the media clock. See MediaClockFormat + * @return {DisplayCapabilities} + */ - static get cmdIcon() { - return ImageFieldName._MAP.cmdIcon; + setMediaClockFormats(formats) { + this.validateType(MediaClockFormat, formats, true); + this.setParameter(DisplayCapabilities.KEY_MEDIA_CLOCK_FORMATS, formats); + return this; } /** - * @return {String} - */ + * @deprecated + * @return {MediaClockFormat[]} + */ - static get appIcon() { - return ImageFieldName._MAP.appIcon; + getMediaClockFormats() { + return this.getObject(MediaClockFormat, DisplayCapabilities.KEY_MEDIA_CLOCK_FORMATS); } /** - * @return {String} - */ + * @deprecated + * @param {Boolean} supported - The display's persistent screen supports referencing a static or dynamic image. + * @return {DisplayCapabilities} + */ - static get graphic() { - return ImageFieldName._MAP.graphic; + setGraphicSupported(supported) { + this.setParameter(DisplayCapabilities.KEY_GRAPHIC_SUPPORTED, supported); + return this; } /** - * @return {String} - */ + * @deprecated + * @return {Boolean} + */ - static get secondaryGraphic() { - return ImageFieldName._MAP.secondaryGraphic; + getGraphicSupported() { + return this.getParameter(DisplayCapabilities.KEY_GRAPHIC_SUPPORTED); } /** - * @return {String} - */ + * @deprecated + * @param {String[]} available - A set of all predefined persistent display templates available on headunit. To be + * referenced in SetDisplayLayout. + * @return {DisplayCapabilities} + */ - static get showConstantTBTIcon() { - return ImageFieldName._MAP.showConstantTBTIcon; + setTemplatesAvailable(available) { + this.setParameter(DisplayCapabilities.KEY_TEMPLATES_AVAILABLE, available); + return this; } /** - * @return {String} - */ + * @deprecated + * @return {String[]} + */ - static get showConstantTBTNextTurnIcon() { - return ImageFieldName._MAP.showConstantTBTNextTurnIcon; + getTemplatesAvailable() { + return this.getParameter(DisplayCapabilities.KEY_TEMPLATES_AVAILABLE); } /** - * @return {String} - */ + * @deprecated + * @param {ScreenParams} params - A set of all parameters related to a prescribed screen area (e.g. for video / + * touch input). + * @return {DisplayCapabilities} + */ - static get locationImage() { - return ImageFieldName._MAP.locationImage; + setScreenParams(params) { + this.validateType(ScreenParams, params); + this.setParameter(DisplayCapabilities.KEY_SCREEN_PARAMS, params); + return this; } /** - * @return {String} - */ + * @deprecated + * @return {ScreenParams} + */ - static get alertIcon() { - return ImageFieldName._MAP.alertIcon; + getScreenParams() { + return this.getObject(ScreenParams, DisplayCapabilities.KEY_SCREEN_PARAMS); } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * @deprecated + * @param {Number} available - The number of on-screen custom presets available (if any); otherwise omitted. + * @return {DisplayCapabilities} + */ - static valueForKey(key) { - return ImageFieldName._valueForKey(key, ImageFieldName._MAP); + setNumCustomPresetsAvailable(available) { + this.setParameter(DisplayCapabilities.KEY_NUM_CUSTOM_PRESETS_AVAILABLE, available); + return this; } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * @deprecated + * @return {Number} + */ - static keyForValue(value) { - return ImageFieldName._keyForValue(value, ImageFieldName._MAP); + getNumCustomPresetsAvailable() { + return this.getParameter(DisplayCapabilities.KEY_NUM_CUSTOM_PRESETS_AVAILABLE); } } - ImageFieldName._MAP = Object.freeze({ - 'softButtonImage': 'softButtonImage', - 'choiceImage': 'choiceImage', - 'choiceSecondaryImage': 'choiceSecondaryImage', - 'vrHelpItem': 'vrHelpItem', - 'turnIcon': 'turnIcon', - 'menuIcon': 'menuIcon', - 'cmdIcon': 'cmdIcon', - 'appIcon': 'appIcon', - 'graphic': 'graphic', - 'secondaryGraphic': 'secondaryGraphic', - 'showConstantTBTIcon': 'showConstantTBTIcon', - 'showConstantTBTNextTurnIcon': 'showConstantTBTNextTurnIcon', - 'locationImage': 'locationImage', - 'alertIcon': 'alertIcon' - }); + DisplayCapabilities.KEY_DISPLAY_TYPE = 'displayType'; + DisplayCapabilities.KEY_DISPLAY_NAME = 'displayName'; + DisplayCapabilities.KEY_TEXT_FIELDS = 'textFields'; + DisplayCapabilities.KEY_IMAGE_FIELDS = 'imageFields'; + DisplayCapabilities.KEY_MEDIA_CLOCK_FORMATS = 'mediaClockFormats'; + DisplayCapabilities.KEY_GRAPHIC_SUPPORTED = 'graphicSupported'; + DisplayCapabilities.KEY_TEMPLATES_AVAILABLE = 'templatesAvailable'; + DisplayCapabilities.KEY_SCREEN_PARAMS = 'screenParams'; + DisplayCapabilities.KEY_NUM_CUSTOM_PRESETS_AVAILABLE = 'numCustomPresetsAvailable'; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * Describes different sampling options for PerformAudioPassThru. + * @typedef {Enum} SamplingRate + * @property {Object} _MAP + */ - class ImageField extends RpcStruct { - constructor(parameters) { - super(parameters); + class SamplingRate extends Enum { + /** + * @constructor + */ + constructor() { + super(); } /** - * @param {ImageFieldName} imageFieldName - * @return {ImageField} - */ + * Sampling rate of 8000 Hz. + * @return {String} + */ - setImageFieldName(imageFieldName) { - this.validateType(ImageFieldName, imageFieldName); - this.setParameter(ImageField.KEY_NAME, imageFieldName); - return this; + static get SamplingRate_8KHZ() { + return SamplingRate._MAP.SamplingRate_8KHZ; } /** - * @return {ImageFieldName} - */ + * Sampling rate of 16000 Hz. + * @return {String} + */ - getImageFieldName() { - return this.getObject(ImageFieldName, ImageField.KEY_NAME); + static get SamplingRate_16KHZ() { + return SamplingRate._MAP.SamplingRate_16KHZ; } /** - * @param {FileType[]} imageTypeSupported - * @return {ImageField} - */ + * Sampling rate of 22050 Hz. + * @return {String} + */ - setImageTypeSupported(imageTypeSupported) { - this.validateType(FileType, imageTypeSupported, true); - this.setParameter(ImageField.KEY_IMAGE_TYPE_SUPPORTED, imageTypeSupported); - return this; + static get SamplingRate_22KHZ() { + return SamplingRate._MAP.SamplingRate_22KHZ; } /** - * @return {FileType} - */ + * Sampling rate of 44100 Hz. + * @return {String} + */ - getImageTypeSupported() { - return this.getObject(FileType, ImageField.KEY_IMAGE_TYPE_SUPPORTED); + static get SamplingRate_44KHZ() { + return SamplingRate._MAP.SamplingRate_44KHZ; } /** - * @param {ImageResolution} imageResolution - * @return {ImageField} - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ - setImageResolution(imageResolution) { - this.validateType(ImageResolution, imageResolution); - this.setParameter(ImageField.KEY_IMAGE_RESOLUTION, imageResolution); - return this; + static valueForKey(key) { + return SamplingRate._valueForKey(key, SamplingRate._MAP); } /** - * @return {ImageResolution} - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ - getImageResolution() { - return this.getObject(ImageResolution, ImageField.KEY_IMAGE_RESOLUTION); + static keyForValue(value) { + return SamplingRate._keyForValue(value, SamplingRate._MAP); } } - ImageField.KEY_NAME = 'name'; - ImageField.KEY_IMAGE_TYPE_SUPPORTED = 'imageTypeSupported'; - ImageField.KEY_IMAGE_RESOLUTION = 'imageResolution'; - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - - class TouchEventCapabilities extends RpcStruct { - constructor(parameters) { - super(parameters); - } - /** - * @param {Boolean} pressAvailable - * @return {TouchEventCapabilities} - */ + SamplingRate._MAP = Object.freeze({ + 'SamplingRate_8KHZ': '8KHZ', + 'SamplingRate_16KHZ': '16KHZ', + 'SamplingRate_22KHZ': '22KHZ', + 'SamplingRate_44KHZ': '44KHZ' + }); + /* eslint-disable camelcase */ + /** + * Describes different quality options for PerformAudioPassThru. + * @typedef {Enum} BitsPerSample + * @property {Object} _MAP + */ - setPressAvailable(pressAvailable) { - this.setParameter(TouchEventCapabilities.KEY_PRESS_AVAILABLE, pressAvailable); - return this; - } + class BitsPerSample extends Enum { /** - * @return {Boolean} - */ - - - getPressAvailable() { - return this.getParameter(TouchEventCapabilities.KEY_PRESS_AVAILABLE); + * @constructor + */ + constructor() { + super(); } /** - * @param {Boolean} multiTouchAvailable - * @return {TouchEventCapabilities} - */ + * Audio sample is 8 bits wide, unsigned. + * @return {String} + */ - setMultiTouchAvailable(multiTouchAvailable) { - this.setParameter(TouchEventCapabilities.KEY_MULTI_TOUCH_AVAILABLE, multiTouchAvailable); - return this; + static get BitsPerSample_8_BIT() { + return BitsPerSample._MAP.BitsPerSample_8_BIT; } /** - * @return {Boolean} - */ + * Audio sample is 16 bits wide, signed, and in little endian. + * @return {String} + */ - getMultiTouchAvailable() { - return this.getParameter(TouchEventCapabilities.KEY_MULTI_TOUCH_AVAILABLE); + static get BitsPerSample_16_BIT() { + return BitsPerSample._MAP.BitsPerSample_16_BIT; } /** - * @param {Boolean} doublePressAvailable - * @return {TouchEventCapabilities} - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ - setDoublePressAvailable(doublePressAvailable) { - this.setParameter(TouchEventCapabilities.KEY_DOUBLE_PRESS_AVAILABLE, doublePressAvailable); - return this; + static valueForKey(key) { + return BitsPerSample._valueForKey(key, BitsPerSample._MAP); } /** - * @return {Boolean} - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ - getDoublePressAvailable() { - return this.getParameter(TouchEventCapabilities.KEY_DOUBLE_PRESS_AVAILABLE); + static keyForValue(value) { + return BitsPerSample._keyForValue(value, BitsPerSample._MAP); } } - TouchEventCapabilities.KEY_PRESS_AVAILABLE = 'pressAvailable'; - TouchEventCapabilities.KEY_MULTI_TOUCH_AVAILABLE = 'multiTouchAvailable'; - TouchEventCapabilities.KEY_DOUBLE_PRESS_AVAILABLE = 'doublePressAvailable'; + BitsPerSample._MAP = Object.freeze({ + 'BitsPerSample_8_BIT': '8_BIT', + 'BitsPerSample_16_BIT': '16_BIT' + }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * Describes different audio type options for PerformAudioPassThru. + * @typedef {Enum} AudioType + * @property {Object} _MAP + */ - class ScreenParams extends RpcStruct { - constructor(parameters) { - super(parameters); - } + class AudioType extends Enum { /** - * @param {ImageResolution} resolution - * @return {ScreenParams} - */ - - - setResolution(resolution) { - this.validateType(ImageResolution, resolution); - this.setParameter(ScreenParams.KEY_RESOLUTION, resolution); - return this; + * @constructor + */ + constructor() { + super(); } /** - * @return {ImageResolution} - */ + * Linear PCM. + * @return {String} + */ - getResolution() { - return this.getObject(ImageResolution, ScreenParams.KEY_RESOLUTION); + static get PCM() { + return AudioType._MAP.PCM; } /** - * @param {TouchEventCapabilities} touchEventCapabilities - * @return {ScreenParams} - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ - setTouchEventAvailable(touchEventCapabilities) { - this.validateType(TouchEventCapabilities, touchEventCapabilities); - this.setParameter(ScreenParams.KEY_TOUCH_EVENT_AVAILABLE, touchEventCapabilities); - return this; + static valueForKey(key) { + return AudioType._valueForKey(key, AudioType._MAP); } /** - * @return {TouchEventCapabilities} - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ - getTouchEventAvailable() { - return this.getObject(TouchEventCapabilities, ScreenParams.KEY_TOUCH_EVENT_AVAILABLE); + static keyForValue(value) { + return AudioType._keyForValue(value, AudioType._MAP); } } - ScreenParams.KEY_RESOLUTION = 'resolution'; - ScreenParams.KEY_TOUCH_EVENT_AVAILABLE = 'touchEventAvailable'; + AudioType._MAP = Object.freeze({ + 'PCM': 'PCM' + }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ /** - * @typedef {Enum} DisplayType - * @property {Object} _MAP + * Describes different audio type configurations for PerformAudioPassThru. e.g. {8kHz,8-bit,PCM} The audio is recorded + * in monaural. */ - class DisplayType extends Enum { - constructor() { - super(); - } + class AudioPassThruCapabilities extends RpcStruct { /** - * @return {String} + * @constructor */ - - - static get CID() { - return DisplayType._MAP.CID; + constructor(parameters) { + super(parameters); } /** - * @return {String} + * @param {SamplingRate} rate - Describes different sampling options for PerformAudioPassThru. + * @return {AudioPassThruCapabilities} */ - static get TYPE2() { - return DisplayType._MAP.TYPE2; + setSamplingRate(rate) { + this.validateType(SamplingRate, rate); + this.setParameter(AudioPassThruCapabilities.KEY_SAMPLING_RATE, rate); + return this; } /** - * @return {String} + * @return {SamplingRate} */ - static get TYPE5() { - return DisplayType._MAP.TYPE5; + getSamplingRate() { + return this.getObject(SamplingRate, AudioPassThruCapabilities.KEY_SAMPLING_RATE); } /** - * @return {String} + * @param {BitsPerSample} sample - Describes different quality options for PerformAudioPassThru. + * @return {AudioPassThruCapabilities} */ - static get NGN() { - return DisplayType._MAP.NGN; + setBitsPerSample(sample) { + this.validateType(BitsPerSample, sample); + this.setParameter(AudioPassThruCapabilities.KEY_BITS_PER_SAMPLE, sample); + return this; } /** - * @return {String} + * @return {BitsPerSample} */ - static get GEN2_8_DMA() { - return DisplayType._MAP.GEN2_8_DMA; + getBitsPerSample() { + return this.getObject(BitsPerSample, AudioPassThruCapabilities.KEY_BITS_PER_SAMPLE); } /** - * @return {String} + * @param {AudioType} type - Describes different audio type options for PerformAudioPassThru. + * @return {AudioPassThruCapabilities} */ - static get GEN2_6_DMA() { - return DisplayType._MAP.GEN2_6_DMA; + setAudioType(type) { + this.validateType(AudioType, type); + this.setParameter(AudioPassThruCapabilities.KEY_AUDIO_TYPE, type); + return this; } /** - * @return {String} + * @return {AudioType} */ - static get MFD3() { - return DisplayType._MAP.MFD3; + getAudioType() { + return this.getObject(AudioType, AudioPassThruCapabilities.KEY_AUDIO_TYPE); } - /** - * @return {String} - */ + } - static get MFD4() { - return DisplayType._MAP.MFD4; - } - /** - * @return {String} - */ + AudioPassThruCapabilities.KEY_SAMPLING_RATE = 'samplingRate'; + AudioPassThruCapabilities.KEY_BITS_PER_SAMPLE = 'bitsPerSample'; + AudioPassThruCapabilities.KEY_AUDIO_TYPE = 'audioType'; + /* eslint-disable camelcase */ + /** + * Contains information about the VR capabilities. + * @typedef {Enum} VrCapabilities + * @property {Object} _MAP + */ - static get MFD5() { - return DisplayType._MAP.MFD5; - } + class VrCapabilities extends Enum { /** - * @return {String} + * @constructor */ - - - static get GEN3_8_INCH() { - return DisplayType._MAP.GEN3_8_INCH; + constructor() { + super(); } /** * @return {String} */ - static get SDL_GENERIC() { - return DisplayType._MAP.SDL_GENERIC; + static get VR_TEXT() { + return VrCapabilities._MAP.VR_TEXT; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey(key) { - return DisplayType._valueForKey(key, DisplayType._MAP); + return VrCapabilities._valueForKey(key, VrCapabilities._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue(value) { - return DisplayType._keyForValue(value, DisplayType._MAP); + return VrCapabilities._keyForValue(value, VrCapabilities._MAP); } } - DisplayType._MAP = Object.freeze({ - 'CID': 'CID', - 'TYPE2': 'TYPE2', - 'TYPE5': 'TYPE5', - 'NGN': 'NGN', - 'GEN2_8_DMA': 'GEN2_8_DMA', - 'GEN2_6_DMA': 'GEN2_6_DMA', - 'MFD3': 'MFD3', - 'MFD4': 'MFD4', - 'TESTING': 'TESTING', - 'MFD5': 'MFD5', - 'GEN3_8_INCH': 'GEN3_8-INCH', - 'SDL_GENERIC': 'SDL_GENERIC' + VrCapabilities._MAP = Object.freeze({ + 'VR_TEXT': 'TEXT' }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ /** - * @typedef {Enum} MediaClockFormat + * Defines the hard (physical) and soft (touchscreen) buttons available from the module + * @typedef {Enum} ButtonName * @property {Object} _MAP */ - class MediaClockFormat extends Enum { + class ButtonName extends Enum { + /** + * @constructor + */ constructor() { super(); } @@ -20613,792 +19907,169 @@ */ - static get CLOCK1() { - return MediaClockFormat._MAP.CLOCK1; + static get OK() { + return ButtonName._MAP.OK; } /** + * The button name for the physical Play/Pause toggle that can be used by media apps. * @return {String} */ - static get CLOCK2() { - return MediaClockFormat._MAP.CLOCK2; + static get PLAY_PAUSE() { + return ButtonName._MAP.PLAY_PAUSE; } /** * @return {String} */ - static get CLOCK3() { - return MediaClockFormat._MAP.CLOCK3; + static get SEEKLEFT() { + return ButtonName._MAP.SEEKLEFT; } /** * @return {String} */ - static get CLOCKTEXT1() { - return MediaClockFormat._MAP.CLOCKTEXT1; + static get SEEKRIGHT() { + return ButtonName._MAP.SEEKRIGHT; } /** * @return {String} */ - static get CLOCKTEXT2() { - return MediaClockFormat._MAP.CLOCKTEXT2; + static get TUNEUP() { + return ButtonName._MAP.TUNEUP; } /** * @return {String} */ - static get CLOCKTEXT3() { - return MediaClockFormat._MAP.CLOCKTEXT3; + static get TUNEDOWN() { + return ButtonName._MAP.TUNEDOWN; } /** * @return {String} */ - static get CLOCKTEXT4() { - return MediaClockFormat._MAP.CLOCKTEXT4; + static get PRESET_0() { + return ButtonName._MAP.PRESET_0; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * @return {String} + */ - static valueForKey(key) { - return MediaClockFormat._valueForKey(key, MediaClockFormat._MAP); + static get PRESET_1() { + return ButtonName._MAP.PRESET_1; } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * @return {String} + */ - static keyForValue(value) { - return MediaClockFormat._keyForValue(value, MediaClockFormat._MAP); + static get PRESET_2() { + return ButtonName._MAP.PRESET_2; } + /** + * @return {String} + */ - } - - MediaClockFormat._MAP = Object.freeze({ - 'CLOCK1': 'CLOCK1', - 'CLOCK2': 'CLOCK2', - 'CLOCK3': 'CLOCK3', - 'CLOCKTEXT1': 'CLOCKTEXT1', - 'CLOCKTEXT2': 'CLOCKTEXT2', - 'CLOCKTEXT3': 'CLOCKTEXT3', - 'CLOCKTEXT4': 'CLOCKTEXT4' - }); - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - class DisplayCapabilities extends RpcStruct { - constructor(parameters) { - super(parameters); + static get PRESET_3() { + return ButtonName._MAP.PRESET_3; } /** - * @param {DisplayType} displayType - * @return {DisplayCapabilities} - */ + * @return {String} + */ - setDisplayType(displayType) { - this.validateType(DisplayType, displayType); - this.setParameter(DisplayCapabilities.KEY_DISPLAY_TYPE, displayType); - return this; + static get PRESET_4() { + return ButtonName._MAP.PRESET_4; } /** - * @return {DisplayType} - */ + * @return {String} + */ - getDisplayType() { - return this.getObject(DisplayType, DisplayCapabilities.KEY_DISPLAY_TYPE); + static get PRESET_5() { + return ButtonName._MAP.PRESET_5; } /** - * @param {String} displayName - * @return {DisplayCapabilities} - */ + * @return {String} + */ - setDisplayName(displayName) { - this.setParameter(DisplayCapabilities.KEY_DISPLAY_NAME, displayName); - return this; + static get PRESET_6() { + return ButtonName._MAP.PRESET_6; } /** - * @return {String} - */ + * @return {String} + */ - getDisplayName() { - return this.getParameter(DisplayCapabilities.KEY_DISPLAY_NAME); + static get PRESET_7() { + return ButtonName._MAP.PRESET_7; } /** - * @param {Array} textFields - * @return {DisplayCapabilities} - */ + * @return {String} + */ - setTextFields(textFields) { - // TODO make work with arrays - // this.validateType(TextField, textFields); - this.setParameter(DisplayCapabilities.KEY_TEXT_FIELDS, textFields); - return this; + static get PRESET_8() { + return ButtonName._MAP.PRESET_8; } /** - * @return {Array} - */ + * @return {String} + */ - getTextFields() { - return this.getObject(TextField, DisplayCapabilities.KEY_TEXT_FIELDS); + static get PRESET_9() { + return ButtonName._MAP.PRESET_9; } /** - * @param {Array} imageFields - * @return {DisplayCapabilities} - */ + * @return {String} + */ - setImageFields(imageFields) { - // TODO make work with arrays - // this.validateType(ImageField, imageFields); - this.setParameter(DisplayCapabilities.KEY_IMAGE_FIELDS, imageFields); - return this; + static get CUSTOM_BUTTON() { + return ButtonName._MAP.CUSTOM_BUTTON; } /** - * @return {Array} - */ + * @return {String} + */ - getImageFields() { - return this.getObject(ImageField, DisplayCapabilities.KEY_IMAGE_FIELDS); + static get SEARCH() { + return ButtonName._MAP.SEARCH; } /** - * @param {Array} mediaClockFormats - * @return {DisplayCapabilities} - */ + * @return {String} + */ - setMediaClockFormats(mediaClockFormats) { - // TODO make work with arrays - // this.validateType(ImageField, mediaClockFormats); - this.setParameter(DisplayCapabilities.KEY_MEDIA_CLOCK_FORMATS, mediaClockFormats); - return this; + static get AC_MAX() { + return ButtonName._MAP.AC_MAX; } /** - * @return {Array} - */ + * @return {String} + */ - getMediaClockFormats() { - return this.getObject(MediaClockFormat, DisplayCapabilities.KEY_MEDIA_CLOCK_FORMATS); + static get AC() { + return ButtonName._MAP.AC; } /** - * @param {Boolean} graphicSupported - * @return {DisplayCapabilities} - */ + * @return {String} + */ - setGraphicsSupported(graphicSupported) { - this.setParameter(DisplayCapabilities.KEY_GRAPHICS_SUPPORTED, graphicSupported); - return this; - } - /** - * @return {Boolean} - */ - - - getGraphicsSupported() { - return this.getParameter(DisplayCapabilities.KEY_GRAPHICS_SUPPORTED); - } - /** - * @param {Array} templatesAvailable - * @return {DisplayCapabilities} - */ - - - setTemplatesAvailable(templatesAvailable) { - // TODO make work with arrays - // this.validateType(String, templatesAvailable); - this.setParameter(DisplayCapabilities.KEY_TEMPLATES_AVAILABLE, templatesAvailable); - return this; - } - /** - * @return {Array} - */ - - - getTemplatesAvailable() { - return this.getParameter(DisplayCapabilities.KEY_TEMPLATES_AVAILABLE); - } - /** - * @param {ScreenParams} screenParams - * @return {DisplayCapabilities} - */ - - - setScreenParams(screenParams) { - this.validateType(ScreenParams, screenParams); - this.setParameter(DisplayCapabilities.KEY_SCREEN_PARAMS, screenParams); - return this; - } - /** - * @return {ScreenParams} - */ - - - getScreenParams() { - return this.getObject(ScreenParams, DisplayCapabilities.KEY_SCREEN_PARAMS); - } - /** - * @param {Array} numCustomPresetsAvailable - * @return {DisplayCapabilities} - */ - - - setNumCustomPresetsAvailable(numCustomPresetsAvailable) { - // TODO make work with arrays - // this.validateType(Number, numCustomPresetsAvailable); - this.setParameter(DisplayCapabilities.KEY_NUM_CUSTOM_PRESETS_AVAILABLE, numCustomPresetsAvailable); - return this; - } - /** - * @return {Array} - */ - - - getNumCustomPresetsAvailable() { - return this.getParameter(DisplayCapabilities.KEY_NUM_CUSTOM_PRESETS_AVAILABLE); - } - - } - - DisplayCapabilities.KEY_DISPLAY_TYPE = 'displayType'; - DisplayCapabilities.KEY_DISPLAY_NAME = 'displayName'; - DisplayCapabilities.KEY_TEXT_FIELDS = 'textFields'; - DisplayCapabilities.KEY_IMAGE_FIELDS = 'imageFields'; - DisplayCapabilities.KEY_MEDIA_CLOCK_FORMATS = 'mediaClockFormats'; - DisplayCapabilities.KEY_GRAPHICS_SUPPORTED = 'graphicSupported'; - DisplayCapabilities.KEY_TEMPLATES_AVAILABLE = 'templatesAvailable'; - DisplayCapabilities.KEY_SCREEN_PARAMS = 'screenParams'; - DisplayCapabilities.KEY_NUM_CUSTOM_PRESETS_AVAILABLE = 'numCustomPresetsAvailable'; - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - - class Grid extends RpcStruct { - constructor(parameters) { - super(parameters); - } - /** - * @param {Number} column - * @return {Grid} - */ - - - setColumn(column) { - this.setParameter(Grid.KEY_COLUMN, column); - return this; - } - /** - * @return {Number} - */ - - - getColumn() { - return this.getParameter(Grid.KEY_COLUMN); - } - /** - * @param {Number} row - * @return {Grid} - */ - - - setRow(row) { - this.setParameter(Grid.KEY_ROW, row); - return this; - } - /** - * @return {Number} - */ - - - getRow() { - return this.getParameter(Grid.KEY_ROW); - } - /** - * @param {Number} level - * @return {Grid} - */ - - - setLevel(level) { - this.setParameter(Grid.KEY_LEVEL, level); - return this; - } - /** - * @return {Number} - */ - - - getLevel() { - return this.getParameter(Grid.KEY_LEVEL); - } - /** - * @param {Number} columnSpan - * @return {Grid} - */ - - - setColumnSpan(columnSpan) { - this.setParameter(Grid.KEY_COLUMN_SPAN, columnSpan); - return this; - } - /** - * @return {Number} - */ - - - getColumnSpan() { - return this.getParameter(Grid.KEY_COLUMN_SPAN); - } - /** - * @param {Number} rowSpan - * @return {Grid} - */ - - - setRowSpan(rowSpan) { - this.setParameter(Grid.KEY_ROW_SPAN, rowSpan); - return this; - } - /** - * @return {Number} - */ - - - getRowSpan() { - return this.getParameter(Grid.KEY_ROW_SPAN); - } - /** - * @param {Number} levelSpan - * @return {Grid} - */ - - - setLevelSpan(levelSpan) { - this.setParameter(Grid.KEY_LEVEL_SPAN, levelSpan); - return this; - } - /** - * @return {Number} - */ - - - getLevelSpan() { - return this.getParameter(Grid.KEY_LEVEL_SPAN); - } - - } - - Grid.KEY_COLUMN = 'col'; - Grid.KEY_ROW = 'row'; - Grid.KEY_LEVEL = 'level'; - Grid.KEY_COLUMN_SPAN = 'colspan'; - Grid.KEY_ROW_SPAN = 'rowspan'; - Grid.KEY_LEVEL_SPAN = 'levelspan'; - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - - class ModuleInfo extends RpcStruct { - constructor(parameters) { - super(parameters); - } - /** - * @param {String} moduleId - * @return {ModuleInfo} - */ - - - setModuleId(moduleId) { - this.setParameter(ModuleInfo.KEY_MODULE_ID, moduleId); - return this; - } - /** - * @return {String} - */ - - - getModuleId() { - return this.getParameter(ModuleInfo.KEY_MODULE_ID); - } - /** - * @param {Grid} location - * @return {ModuleInfo} - */ - - - setLocation(location) { - this.validateType(Grid, location); - this.setParameter(ModuleInfo.KEY_LOCATION, location); - return this; - } - /** - * @return {Grid} - */ - - - getLocation() { - return this.getObject(Grid, ModuleInfo.KEY_LOCATION); - } - /** - * @param {Grid} serviceArea - * @return {ModuleInfo} - */ - - - setServiceArea(serviceArea) { - this.validateType(Grid, serviceArea); - this.setParameter(ModuleInfo.KEY_SERVICE_AREA, serviceArea); - return this; - } - /** - * @return {Grid} - */ - - - getServiceArea() { - return this.getObject(Grid, ModuleInfo.KEY_SERVICE_AREA); - } - /** - * @param {Boolean} allowMultipleAccess - * @return {ModuleInfo} - */ - - - setAllowMultipleAccess(allowMultipleAccess) { - this.setParameter(ModuleInfo.KEY_ALLOW_MULTIPLE_ACCESS, allowMultipleAccess); - return this; - } - /** - * @return {Boolean} - */ - - - getAllowMultipleAccess() { - return this.getParameter(ModuleInfo.KEY_ALLOW_MULTIPLE_ACCESS); - } - - } - - ModuleInfo.KEY_MODULE_ID = 'moduleId'; - ModuleInfo.KEY_LOCATION = 'location'; - ModuleInfo.KEY_SERVICE_AREA = 'serviceArea'; - ModuleInfo.KEY_ALLOW_MULTIPLE_ACCESS = 'allowMultipleAccess'; - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - /** - * @typedef {Enum} ButtonName - * @property {Object} _MAP - */ - - class ButtonName extends Enum { - constructor() { - super(); - } - /** - * @return {String} - */ - - - static get OK() { - return ButtonName._MAP.OK; - } - /** - * @return {String} - */ - - - static get PLAY_PAUSE() { - return ButtonName._MAP.PLAY_PAUSE; - } - /** - * @return {String} - */ - - - static get SEEKLEFT() { - return ButtonName._MAP.SEEKLEFT; - } - /** - * @return {String} - */ - - - static get SEEKRIGHT() { - return ButtonName._MAP.SEEKRIGHT; - } - /** - * @return {String} - */ - - - static get TUNEUP() { - return ButtonName._MAP.TUNEUP; - } - /** - * @return {String} - */ - - - static get TUNEDOWN() { - return ButtonName._MAP.TUNEDOWN; - } - /** - * @return {String} - */ - - - static get PRESET_0() { - return ButtonName._MAP.PRESET_0; - } - /** - * @return {String} - */ - - - static get PRESET_1() { - return ButtonName._MAP.PRESET_1; - } - /** - * @return {String} - */ - - - static get PRESET_2() { - return ButtonName._MAP.PRESET_2; - } - /** - * @return {String} - */ - - - static get PRESET_3() { - return ButtonName._MAP.PRESET_3; - } - /** - * @return {String} - */ - - - static get PRESET_4() { - return ButtonName._MAP.PRESET_4; - } - /** - * @return {String} - */ - - - static get PRESET_5() { - return ButtonName._MAP.PRESET_5; - } - /** - * @return {String} - */ - - - static get PRESET_6() { - return ButtonName._MAP.PRESET_6; - } - /** - * @return {String} - */ - - - static get PRESET_7() { - return ButtonName._MAP.PRESET_7; - } - /** - * @return {String} - */ - - - static get PRESET_8() { - return ButtonName._MAP.PRESET_8; - } - /** - * @return {String} - */ - - - static get PRESET_9() { - return ButtonName._MAP.PRESET_9; - } - /** - * @return {String} - */ - - - static get CUSTOM_BUTTON() { - return ButtonName._MAP.CUSTOM_BUTTON; - } - /** - * @return {String} - */ - - - static get SEARCH() { - return ButtonName._MAP.SEARCH; - } - /** - * @return {String} - */ - - - static get AC_MAX() { - return ButtonName._MAP.AC_MAX; - } - /** - * @return {String} - */ - - - static get AC() { - return ButtonName._MAP.AC; - } - /** - * @return {String} - */ - - - static get RECIRCULATE() { - return ButtonName._MAP.RECIRCULATE; + static get RECIRCULATE() { + return ButtonName._MAP.RECIRCULATE; } /** * @return {String} @@ -21609,6 +20280,9 @@ return ButtonName._MAP.NAV_PAN_UP_LEFT; } /** + * If supported, this toggles between a top-down view and an angled/3D view. If your app supports different, but + * substantially similar options, then you may implement those. If you don't implement these or similar options, + * do not subscribe to this button. * @return {String} */ @@ -21633,6 +20307,9 @@ return ButtonName._MAP.NAV_ROTATE_COUNTERCLOCKWISE; } /** + * If supported, this toggles between locking the orientation to north or to the vehicle's heading. If your app + * supports different, but substantially similar options, then you may implement those. If you don't implement + * these or similar options, do not subscribe to this button. * @return {String} */ @@ -21641,20 +20318,20 @@ return ButtonName._MAP.NAV_HEADING_TOGGLE; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey(key) { return ButtonName._valueForKey(key, ButtonName._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue(value) { @@ -21717,1828 +20394,1427 @@ 'NAV_HEADING_TOGGLE': 'NAV_HEADING_TOGGLE' }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * Describes a location (origin coordinates and span) of a vehicle component. + */ - class ButtonCapabilities extends RpcStruct { + class Grid extends RpcStruct { + /** + * @constructor + */ constructor(parameters) { super(parameters); } /** - * @param {ButtonName} name - * @return {ButtonCapabilities} - */ + * @param {Number} col + * @return {Grid} + */ - setName(name) { - this.validateType(ButtonName, name); - this.setParameter(ButtonCapabilities.KEY_NAME, name); + setColumn(col) { + this.setParameter(Grid.KEY_COLUMN, col); return this; } /** - * @return {ButtonName} - */ + * @return {Number} + */ - getName() { - return this.getObject(ButtonName, ButtonCapabilities.KEY_NAME); + getColumn() { + return this.getParameter(Grid.KEY_COLUMN); } /** - * @param {ModuleInfo} moduleInfo - * @return {ButtonCapabilities} - */ + * @param {Number} row + * @return {Grid} + */ - setModuleInfo(moduleInfo) { - this.validateType(ModuleInfo, moduleInfo); - this.setParameter(ButtonCapabilities.KEY_MODULE_INFO, moduleInfo); + setRow(row) { + this.setParameter(Grid.KEY_ROW, row); return this; } /** - * @return {ModuleInfo} - */ + * @return {Number} + */ - getModuleInfo() { - return this.getObject(ModuleInfo, ButtonCapabilities.KEY_MODULE_INFO); + getRow() { + return this.getParameter(Grid.KEY_ROW); } /** - * @param {Boolean} shortPressAvailable - * @return {ButtonCapabilities} - */ + * @param {Number} level + * @return {Grid} + */ - setShortPressAvailable(shortPressAvailable) { - this.setParameter(ButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE, shortPressAvailable); + setLevel(level) { + this.setParameter(Grid.KEY_LEVEL, level); return this; } /** - * @return {Boolean} - */ + * @return {Number} + */ - getShortPressAvailable() { - return this.getParameter(ButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE); + getLevel() { + return this.getParameter(Grid.KEY_LEVEL); } /** - * @param {Boolean} longPressAvailable - * @return {ButtonCapabilities} - */ + * @param {Number} colspan + * @return {Grid} + */ - setLongPressAvailable(longPressAvailable) { - this.setParameter(ButtonCapabilities.KEY_LONG_PRESS_AVAILABLE, longPressAvailable); + setColumnSpan(colspan) { + this.setParameter(Grid.KEY_COLUMN_SPAN, colspan); return this; } /** - * @return {Boolean} - */ + * @return {Number} + */ - getLongPressAvailable() { - return this.getParameter(ButtonCapabilities.KEY_LONG_PRESS_AVAILABLE); + getColumnSpan() { + return this.getParameter(Grid.KEY_COLUMN_SPAN); } /** - * @param {Boolean} upDownAvailable - * @return {ButtonCapabilities} - */ + * @param {Number} rowspan + * @return {Grid} + */ - setUpDownAvailable(upDownAvailable) { - this.setParameter(ButtonCapabilities.KEY_UP_DOWN_AVAILABLE, upDownAvailable); + setRowSpan(rowspan) { + this.setParameter(Grid.KEY_ROW_SPAN, rowspan); return this; } /** - * @return {Boolean} - */ + * @return {Number} + */ - getUpDownAvailable() { - return this.getParameter(ButtonCapabilities.KEY_UP_DOWN_AVAILABLE); + getRowSpan() { + return this.getParameter(Grid.KEY_ROW_SPAN); } + /** + * @param {Number} levelspan + * @return {Grid} + */ - } - - ButtonCapabilities.KEY_NAME = 'name'; - ButtonCapabilities.KEY_MODULE_INFO = 'moduleInfo'; - ButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE = 'shortPressAvailable'; - ButtonCapabilities.KEY_LONG_PRESS_AVAILABLE = 'longPressAvailable'; - ButtonCapabilities.KEY_UP_DOWN_AVAILABLE = 'upDownAvailable'; - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - class SoftButtonCapabilities extends RpcStruct { - constructor(parameters) { - super(parameters); + setLevelSpan(levelspan) { + this.setParameter(Grid.KEY_LEVEL_SPAN, levelspan); + return this; } /** - * @param {Boolean} shortPressAvailable - * @return {SoftButtonCapabilities} - */ + * @return {Number} + */ - setShortPressAvailable(shortPressAvailable) { - this.setParameter(SoftButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE, shortPressAvailable); - return this; + getLevelSpan() { + return this.getParameter(Grid.KEY_LEVEL_SPAN); } - /** - * @return {Boolean} - */ + } - getShortPressAvailable() { - return this.getParameter(SoftButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE); + Grid.KEY_COLUMN = 'col'; + Grid.KEY_ROW = 'row'; + Grid.KEY_LEVEL = 'level'; + Grid.KEY_COLUMN_SPAN = 'colspan'; + Grid.KEY_ROW_SPAN = 'rowspan'; + Grid.KEY_LEVEL_SPAN = 'levelspan'; + + /* eslint-disable camelcase */ + /** + * Information about a RC module + */ + + class ModuleInfo extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); } /** - * @param {Boolean} longPressAvailable - * @return {SoftButtonCapabilities} - */ + * @param {String} id - uuid of a module. "moduleId + moduleType" uniquely identify a module. + * @return {ModuleInfo} + */ - setLongPressAvailable(longPressAvailable) { - this.setParameter(SoftButtonCapabilities.KEY_LONG_PRESS_AVAILABLE, longPressAvailable); + setModuleId(id) { + this.setParameter(ModuleInfo.KEY_MODULE_ID, id); return this; } /** - * @return {Boolean} - */ + * @return {String} + */ - getLongPressAvailable() { - return this.getParameter(SoftButtonCapabilities.KEY_LONG_PRESS_AVAILABLE); + getModuleId() { + return this.getParameter(ModuleInfo.KEY_MODULE_ID); } /** - * @param {Boolean} upDownAvailable - * @return {SoftButtonCapabilities} - */ + * @param {Grid} location - Location of a module. + * @return {ModuleInfo} + */ - setUpDownAvailable(upDownAvailable) { - this.setParameter(SoftButtonCapabilities.KEY_UP_DOWN_AVAILABLE, upDownAvailable); + setLocation(location) { + this.validateType(Grid, location); + this.setParameter(ModuleInfo.KEY_LOCATION, location); return this; } /** - * @return {Boolean} - */ + * @return {Grid} + */ - getUpDownAvailable() { - return this.getParameter(SoftButtonCapabilities.KEY_UP_DOWN_AVAILABLE); + getLocation() { + return this.getObject(Grid, ModuleInfo.KEY_LOCATION); } /** - * @param {Boolean} imageSupported - * @return {SoftButtonCapabilities} - */ + * @param {Grid} area - Service area of a module. + * @return {ModuleInfo} + */ - setImageSupported(imageSupported) { - this.setParameter(SoftButtonCapabilities.KEY_IMAGE_SUPPORTED, imageSupported); + setServiceArea(area) { + this.validateType(Grid, area); + this.setParameter(ModuleInfo.KEY_SERVICE_AREA, area); return this; } /** - * @return {Boolean} - */ + * @return {Grid} + */ - getImageSupported() { - return this.getParameter(SoftButtonCapabilities.KEY_IMAGE_SUPPORTED); + getServiceArea() { + return this.getObject(Grid, ModuleInfo.KEY_SERVICE_AREA); } /** - * @param {Boolean} textSupported - * @return {SoftButtonCapabilities} - */ + * @param {Boolean} access - allow multiple users/apps to access the module or not + * @return {ModuleInfo} + */ - setTextSupported(textSupported) { - this.setParameter(SoftButtonCapabilities.KEY_TEXT_SUPPORTED, textSupported); + setAllowMultipleAccess(access) { + this.setParameter(ModuleInfo.KEY_ALLOW_MULTIPLE_ACCESS, access); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ - getTextSupported() { - return this.getParameter(SoftButtonCapabilities.KEY_TEXT_SUPPORTED); + getAllowMultipleAccess() { + return this.getParameter(ModuleInfo.KEY_ALLOW_MULTIPLE_ACCESS); } } - SoftButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE = 'shortPressAvailable'; - SoftButtonCapabilities.KEY_LONG_PRESS_AVAILABLE = 'longPressAvailable'; - SoftButtonCapabilities.KEY_UP_DOWN_AVAILABLE = 'upDownAvailable'; - SoftButtonCapabilities.KEY_IMAGE_SUPPORTED = 'imageSupported'; - SoftButtonCapabilities.KEY_TEXT_SUPPORTED = 'textSupported'; + ModuleInfo.KEY_MODULE_ID = 'moduleId'; + ModuleInfo.KEY_LOCATION = 'location'; + ModuleInfo.KEY_SERVICE_AREA = 'serviceArea'; + ModuleInfo.KEY_ALLOW_MULTIPLE_ACCESS = 'allowMultipleAccess'; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * Contains information about a button's capabilities. + */ - class PresetBankCapabilities extends RpcStruct { + class ButtonCapabilities extends RpcStruct { + /** + * @constructor + */ constructor(parameters) { super(parameters); } /** - * @param {Boolean} onScreenPresetsAvailable - * @return {PresetBankCapabilities} - */ + * @param {ButtonName} name - The name of the button. See ButtonName. + * @return {ButtonCapabilities} + */ - setOnScreenPresetsAvailable(onScreenPresetsAvailable) { - this.setParameter(PresetBankCapabilities.KEY_ON_SCREEN_PRESETS_AVAILABLE, onScreenPresetsAvailable); + setName(name) { + this.validateType(ButtonName, name); + this.setParameter(ButtonCapabilities.KEY_NAME, name); return this; } /** - * @return {Boolean} - */ - - - getOnScreenPresetsAvailable() { - return this.getParameter(PresetBankCapabilities.KEY_ON_SCREEN_PRESETS_AVAILABLE); - } - - } - - PresetBankCapabilities.KEY_ON_SCREEN_PRESETS_AVAILABLE = 'onScreenPresetsAvailable'; + * @return {ButtonName} + */ - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - class VehicleType extends RpcStruct { - constructor(parameters) { - super(parameters); + getName() { + return this.getObject(ButtonName, ButtonCapabilities.KEY_NAME); } /** - * @param {String} make - * @return {VehicleType} - */ + * @param {ModuleInfo} info - Information about a RC module, including its id. + * @return {ButtonCapabilities} + */ - setMake(make) { - this.setParameter(VehicleType.KEY_MAKE, make); + setModuleInfo(info) { + this.validateType(ModuleInfo, info); + this.setParameter(ButtonCapabilities.KEY_MODULE_INFO, info); return this; } /** - * @return {String} - */ + * @return {ModuleInfo} + */ - getMake() { - return this.getParameter(VehicleType.KEY_MAKE); + getModuleInfo() { + return this.getObject(ModuleInfo, ButtonCapabilities.KEY_MODULE_INFO); } /** - * @param {String} model - * @return {VehicleType} - */ + * @param {Boolean} available - The button supports a short press. Whenever the button is pressed short, + * onButtonPressed( SHORT) will be invoked. + * @return {ButtonCapabilities} + */ - setModel(model) { - this.setParameter(VehicleType.KEY_MODEL, model); + setShortPressAvailable(available) { + this.setParameter(ButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE, available); return this; } /** - * @return {String} - */ + * @return {Boolean} + */ - getModel() { - return this.getParameter(VehicleType.KEY_MODEL); + getShortPressAvailable() { + return this.getParameter(ButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE); } /** - * @param {String} modelYear - * @return {VehicleType} - */ + * @param {Boolean} available - The button supports a LONG press. Whenever the button is pressed long, + * onButtonPressed( LONG) will be invoked. + * @return {ButtonCapabilities} + */ - setModelYear(modelYear) { - this.setParameter(VehicleType.KEY_MODEL_YEAR, modelYear); + setLongPressAvailable(available) { + this.setParameter(ButtonCapabilities.KEY_LONG_PRESS_AVAILABLE, available); return this; } /** - * @return {String} - */ + * @return {Boolean} + */ - getModelYear() { - return this.getParameter(VehicleType.KEY_MODEL_YEAR); + getLongPressAvailable() { + return this.getParameter(ButtonCapabilities.KEY_LONG_PRESS_AVAILABLE); } /** - * @param {String} trim - * @return {VehicleType} - */ + * @param {Boolean} available - The button supports "button down" and "button up". Whenever the button is pressed, + * onButtonEvent( DOWN) will be invoked. Whenever the button is released, + * onButtonEvent( UP) will be invoked. + * @return {ButtonCapabilities} + */ - setTrim(trim) { - this.setParameter(VehicleType.KEY_TRIM, trim); + setUpDownAvailable(available) { + this.setParameter(ButtonCapabilities.KEY_UP_DOWN_AVAILABLE, available); return this; } /** - * @return {String} - */ + * @return {Boolean} + */ - getTrim() { - return this.getParameter(VehicleType.KEY_TRIM); + getUpDownAvailable() { + return this.getParameter(ButtonCapabilities.KEY_UP_DOWN_AVAILABLE); } } - VehicleType.KEY_MAKE = 'make'; - VehicleType.KEY_MODEL = 'model'; - VehicleType.KEY_MODEL_YEAR = 'modelYear'; - VehicleType.KEY_TRIM = 'trim'; + ButtonCapabilities.KEY_NAME = 'name'; + ButtonCapabilities.KEY_MODULE_INFO = 'moduleInfo'; + ButtonCapabilities.KEY_SHORT_PRESS_AVAILABLE = 'shortPressAvailable'; + ButtonCapabilities.KEY_LONG_PRESS_AVAILABLE = 'longPressAvailable'; + ButtonCapabilities.KEY_UP_DOWN_AVAILABLE = 'upDownAvailable'; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - /** - * @typedef {Enum} FileType - * @property {Object} _MAP - */ + /* eslint-disable camelcase */ - class HmiZoneCapabilities extends Enum { - constructor() { - super(); + class HMICapabilities extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); } /** - * @return {String} + * @param {Boolean} navigation - Availability of build in Nav. True: Available, False: Not Available + * @return {HMICapabilities} */ - static get FRONT() { - return HmiZoneCapabilities._MAP.FRONT; + setNavigation(navigation) { + this.setParameter(HMICapabilities.KEY_NAVIGATION, navigation); + return this; } /** - * @return {String} + * @return {Boolean} */ - static get BACK() { - return HmiZoneCapabilities._MAP.BACK; + getNavigation() { + return this.getParameter(HMICapabilities.KEY_NAVIGATION); } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * @param {Boolean} call - Availability of build in phone. True: Available, False: Not Available + * @return {HMICapabilities} + */ - static valueForKey(key) { - return HmiZoneCapabilities._valueForKey(key, HmiZoneCapabilities._MAP); + setPhoneCall(call) { + this.setParameter(HMICapabilities.KEY_PHONE_CALL, call); + return this; } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * @return {Boolean} + */ - static keyForValue(value) { - return HmiZoneCapabilities._keyForValue(value, HmiZoneCapabilities._MAP); + getPhoneCall() { + return this.getParameter(HMICapabilities.KEY_PHONE_CALL); } + /** + * @param {Boolean} streaming - Availability of video streaming. + * @return {HMICapabilities} + */ - } - - HmiZoneCapabilities._MAP = Object.freeze({ - 'FRONT': 'FRONT', - 'BACK': 'BACK' - }); - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - /** - * @typedef {Enum} PrerecordedSpeech - * @property {Object} _MAP - */ - class PrerecordedSpeech extends Enum { - constructor() { - super(); + setVideoStreaming(streaming) { + this.setParameter(HMICapabilities.KEY_VIDEO_STREAMING, streaming); + return this; } /** - * @return {String} + * @return {Boolean} */ - static get HELP_JINGLE() { - return PrerecordedSpeech._MAP.HELP_JINGLE; + getVideoStreaming() { + return this.getParameter(HMICapabilities.KEY_VIDEO_STREAMING); } /** - * @return {String} + * @param {Boolean} control - Availability of remote control feature. True: Available, False: Not Available + * @return {HMICapabilities} */ - static get INITIAL_JINGLE() { - return PrerecordedSpeech._MAP.INITIAL_JINGLE; + setRemoteControl(control) { + this.setParameter(HMICapabilities.KEY_REMOTE_CONTROL, control); + return this; } /** - * @return {String} + * @return {Boolean} */ - static get LISTEN_JINGLE() { - return PrerecordedSpeech._MAP.LISTEN_JINGLE; + getRemoteControl() { + return this.getParameter(HMICapabilities.KEY_REMOTE_CONTROL); } /** - * @return {String} + * @param {Boolean} services - Availability of App Services functionality. True: Available, False: Not Available + * @return {HMICapabilities} */ - static get POSITIVE_JINGLE() { - return PrerecordedSpeech._MAP.POSITIVE_JINGLE; + setAppServices(services) { + this.setParameter(HMICapabilities.KEY_APP_SERVICES, services); + return this; } /** - * @return {String} + * @return {Boolean} */ - static get NEGATIVE_JINGLE() { - return PrerecordedSpeech._MAP.NEGATIVE_JINGLE; + getAppServices() { + return this.getParameter(HMICapabilities.KEY_APP_SERVICES); } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * @param {Boolean} displays - Availability of displays capability. True: Available, False: Not Available + * @return {HMICapabilities} + */ - static valueForKey(key) { - return PrerecordedSpeech._valueForKey(key, PrerecordedSpeech._MAP); + setDisplays(displays) { + this.setParameter(HMICapabilities.KEY_DISPLAYS, displays); + return this; } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * @return {Boolean} + */ - static keyForValue(value) { - return PrerecordedSpeech._keyForValue(value, PrerecordedSpeech._MAP); + getDisplays() { + return this.getParameter(HMICapabilities.KEY_DISPLAYS); + } + /** + * @param {Boolean} location - Availability of seat location feature. True: Available, False: Not Available + * @return {HMICapabilities} + */ + + + setSeatLocation(location) { + this.setParameter(HMICapabilities.KEY_SEAT_LOCATION, location); + return this; + } + /** + * @return {Boolean} + */ + + + getSeatLocation() { + return this.getParameter(HMICapabilities.KEY_SEAT_LOCATION); } } - PrerecordedSpeech._MAP = Object.freeze({ - 'HELP_JINGLE': 'HELP_JINGLE', - 'INITIAL_JINGLE': 'INITIAL_JINGLE', - 'LISTEN_JINGLE': 'LISTEN_JINGLE', - 'POSITIVE_JINGLE': 'POSITIVE_JINGLE', - 'NEGATIVE_JINGLE': 'NEGATIVE_JINGLE' - }); + HMICapabilities.KEY_NAVIGATION = 'navigation'; + HMICapabilities.KEY_PHONE_CALL = 'phoneCall'; + HMICapabilities.KEY_VIDEO_STREAMING = 'videoStreaming'; + HMICapabilities.KEY_REMOTE_CONTROL = 'remoteControl'; + HMICapabilities.KEY_APP_SERVICES = 'appServices'; + HMICapabilities.KEY_DISPLAYS = 'displays'; + HMICapabilities.KEY_SEAT_LOCATION = 'seatLocation'; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ /** - * @typedef {Enum} SamplingRate - * @property {Object} _MAP + * The response to registerAppInterface */ - class SamplingRate extends Enum { - constructor() { - super(); + class RegisterAppInterfaceResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.RegisterAppInterface); } /** - * @return {String} + * @param {SdlMsgVersion} version - See SyncMsgVersion + * @return {RegisterAppInterfaceResponse} */ - static get SamplingRate_8KHZ() { - return SamplingRate._MAP.SamplingRate_8KHZ; + setSdlMsgVersion(version) { + this.validateType(SdlMsgVersion, version); + this.setParameter(RegisterAppInterfaceResponse.KEY_SDL_MSG_VERSION, version); + return this; } /** - * @return {String} + * @return {SdlMsgVersion} */ - static get SamplingRate_16KHZ() { - return SamplingRate._MAP.SamplingRate_16KHZ; + getSdlMsgVersion() { + return this.getObject(SdlMsgVersion, RegisterAppInterfaceResponse.KEY_SDL_MSG_VERSION); } /** - * @return {String} + * @param {Language} language - The currently active VR+TTS language on the module. See "Language" for options. + * @return {RegisterAppInterfaceResponse} */ - static get SamplingRate_22KHZ() { - return SamplingRate._MAP.SamplingRate_22KHZ; + setLanguage(language) { + this.validateType(Language, language); + this.setParameter(RegisterAppInterfaceResponse.KEY_LANGUAGE, language); + return this; } /** - * @return {String} + * @return {Language} */ - static get SamplingRate_44KHZ() { - return SamplingRate._MAP.SamplingRate_44KHZ; + getLanguage() { + return this.getObject(Language, RegisterAppInterfaceResponse.KEY_LANGUAGE); } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * @param {Language} language - The currently active display language on the module. See "Language" for options. + * @return {RegisterAppInterfaceResponse} + */ - static valueForKey(key) { - return SamplingRate._valueForKey(key, SamplingRate._MAP); + setHmiDisplayLanguage(language) { + this.validateType(Language, language); + this.setParameter(RegisterAppInterfaceResponse.KEY_HMI_DISPLAY_LANGUAGE, language); + return this; } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * @return {Language} + */ - static keyForValue(value) { - return SamplingRate._keyForValue(value, SamplingRate._MAP); + getHmiDisplayLanguage() { + return this.getObject(Language, RegisterAppInterfaceResponse.KEY_HMI_DISPLAY_LANGUAGE); } + /** + * @param {DisplayCapabilities} capabilities - See DisplayCapabilities. This parameter is deprecated and replaced by + * SystemCapability using DISPLAYS. + * @return {RegisterAppInterfaceResponse} + */ - } // We have to use SamplingRate_ prefix in the name because javascript will not - // allow the enum to start with a number - - - SamplingRate._MAP = Object.freeze({ - 'SamplingRate_8KHZ': '8KHZ', - 'SamplingRate_16KHZ': '16KHZ', - 'SamplingRate_22KHZ': '22KHZ', - 'SamplingRate_44KHZ': '44KHZ' - }); - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - /** - * @typedef {Enum} BitsPerSample - * @property {Object} _MAP - */ - class BitsPerSample extends Enum { - constructor() { - super(); + setDisplayCapabilities(capabilities) { + this.validateType(DisplayCapabilities, capabilities); + this.setParameter(RegisterAppInterfaceResponse.KEY_DISPLAY_CAPABILITIES, capabilities); + return this; } /** - * @return {String} + * @return {DisplayCapabilities} */ - static get BitsPerSample_8_BIT() { - return BitsPerSample._MAP.BitsPerSample_8_BIT; + getDisplayCapabilities() { + return this.getObject(DisplayCapabilities, RegisterAppInterfaceResponse.KEY_DISPLAY_CAPABILITIES); } /** - * @return {String} + * @param {ButtonCapabilities[]} capabilities - See ButtonCapabilities. This parameter is deprecated and replaced by + * SystemCapability using DISPLAYS. + * @return {RegisterAppInterfaceResponse} */ - static get BitsPerSample_16_BIT() { - return BitsPerSample._MAP.BitsPerSample_16_BIT; + setButtonCapabilities(capabilities) { + this.validateType(ButtonCapabilities, capabilities, true); + this.setParameter(RegisterAppInterfaceResponse.KEY_BUTTON_CAPABILITIES, capabilities); + return this; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * @return {ButtonCapabilities[]} + */ - static valueForKey(key) { - return BitsPerSample._valueForKey(key, BitsPerSample._MAP); + getButtonCapabilities() { + return this.getObject(ButtonCapabilities, RegisterAppInterfaceResponse.KEY_BUTTON_CAPABILITIES); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * @param {SoftButtonCapabilities[]} capabilities - If returned, the platform supports on-screen SoftButtons; see + * SoftButtonCapabilities. This parameter is deprecated and + * replaced by SystemCapability using DISPLAYS. + * @return {RegisterAppInterfaceResponse} + */ - static keyForValue(value) { - return BitsPerSample._keyForValue(value, BitsPerSample._MAP); + setSoftButtonCapabilities(capabilities) { + this.validateType(SoftButtonCapabilities, capabilities, true); + this.setParameter(RegisterAppInterfaceResponse.KEY_SOFT_BUTTON_CAPABILITIES, capabilities); + return this; } + /** + * @return {SoftButtonCapabilities[]} + */ - } // We have to use BitsPerSample_ prefix in the name because javascript will not - // allow the enum to start with a number - - - BitsPerSample._MAP = Object.freeze({ - 'BitsPerSample_8_BIT': '8_BIT', - 'BitsPerSample_16_BIT': '16_BIT' - }); - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - /** - * @typedef {Enum} AudioType - * @property {Object} _MAP - */ - class AudioType extends Enum { - constructor() { - super(); + getSoftButtonCapabilities() { + return this.getObject(SoftButtonCapabilities, RegisterAppInterfaceResponse.KEY_SOFT_BUTTON_CAPABILITIES); } /** - * @return {String} + * @param {PresetBankCapabilities} capabilities - If returned, the platform supports custom on-screen Presets; see + * PresetBankCapabilities. This parameter is deprecated and replaced + * by SystemCapability using DISPLAYS. + * @return {RegisterAppInterfaceResponse} */ - static get PCM() { - return AudioType._MAP.PCM; + setPresetBankCapabilities(capabilities) { + this.validateType(PresetBankCapabilities, capabilities); + this.setParameter(RegisterAppInterfaceResponse.KEY_PRESET_BANK_CAPABILITIES, capabilities); + return this; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * @return {PresetBankCapabilities} + */ - static valueForKey(key) { - return AudioType._valueForKey(key, AudioType._MAP); + getPresetBankCapabilities() { + return this.getObject(PresetBankCapabilities, RegisterAppInterfaceResponse.KEY_PRESET_BANK_CAPABILITIES); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * @param {HmiZoneCapabilities[]} capabilities - See HmiZoneCapabilities + * @return {RegisterAppInterfaceResponse} + */ - static keyForValue(value) { - return AudioType._keyForValue(value, AudioType._MAP); + setHmiZoneCapabilities(capabilities) { + this.validateType(HmiZoneCapabilities, capabilities, true); + this.setParameter(RegisterAppInterfaceResponse.KEY_HMI_ZONE_CAPABILITIES, capabilities); + return this; } + /** + * @return {HmiZoneCapabilities[]} + */ - } - - AudioType._MAP = Object.freeze({ - 'PCM': 'PCM' - }); - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - class AudioPassThruCapabilities extends RpcStruct { - constructor(parameters) { - super(parameters); + getHmiZoneCapabilities() { + return this.getObject(HmiZoneCapabilities, RegisterAppInterfaceResponse.KEY_HMI_ZONE_CAPABILITIES); } /** - * @param {SamplingRate} samplingRate - * @return {AudioPassThruCapabilities} - */ + * @param {SpeechCapabilities[]} capabilities - See SpeechCapabilities + * @return {RegisterAppInterfaceResponse} + */ - setSamplingRate(samplingRate) { - this.validateType(SamplingRate, samplingRate); - this.setParameter(AudioPassThruCapabilities.KEY_SAMPLING_RATE, samplingRate); + setSpeechCapabilities(capabilities) { + this.validateType(SpeechCapabilities, capabilities, true); + this.setParameter(RegisterAppInterfaceResponse.KEY_SPEECH_CAPABILITIES, capabilities); return this; } /** - * @return {SamplingRate} - */ + * @return {SpeechCapabilities[]} + */ - getSamplingRate() { - return this.getObject(SamplingRate, AudioPassThruCapabilities.KEY_SAMPLING_RATE); + getSpeechCapabilities() { + return this.getObject(SpeechCapabilities, RegisterAppInterfaceResponse.KEY_SPEECH_CAPABILITIES); } /** - * @param {BitsPerSample} bitsPerSample - * @return {AudioPassThruCapabilities} - */ + * @param {PrerecordedSpeech[]} speech - See PrerecordedSpeech + * @return {RegisterAppInterfaceResponse} + */ - setBitsPerSample(bitsPerSample) { - this.validateType(BitsPerSample, bitsPerSample); - this.setParameter(AudioPassThruCapabilities.KEY_BITS_PER_SAMPLE, bitsPerSample); + setPrerecordedSpeech(speech) { + this.validateType(PrerecordedSpeech, speech, true); + this.setParameter(RegisterAppInterfaceResponse.KEY_PRERECORDED_SPEECH, speech); return this; } /** - * @return {BitsPerSample} - */ + * @return {PrerecordedSpeech[]} + */ - getBitsPerSample() { - return this.getObject(BitsPerSample, AudioPassThruCapabilities.KEY_BITS_PER_SAMPLE); + getPrerecordedSpeech() { + return this.getObject(PrerecordedSpeech, RegisterAppInterfaceResponse.KEY_PRERECORDED_SPEECH); } /** - * @param {AudioType} bitsPerSample - * @return {AudioPassThruCapabilities} - */ + * @param {VrCapabilities[]} capabilities - See VrCapabilities + * @return {RegisterAppInterfaceResponse} + */ - setAudioType(audioType) { - this.validateType(AudioType, audioType); - this.setParameter(AudioPassThruCapabilities.KEY_AUDIO_TYPE, audioType); + setVrCapabilities(capabilities) { + this.validateType(VrCapabilities, capabilities, true); + this.setParameter(RegisterAppInterfaceResponse.KEY_VR_CAPABILITIES, capabilities); return this; } /** - * @return {AudioType} - */ + * @return {VrCapabilities[]} + */ - getAudioType() { - return this.getObject(AudioType, AudioPassThruCapabilities.KEY_AUDIO_TYPE); + getVrCapabilities() { + return this.getObject(VrCapabilities, RegisterAppInterfaceResponse.KEY_VR_CAPABILITIES); } + /** + * @param {AudioPassThruCapabilities[]} capabilities - See AudioPassThruCapability + * @return {RegisterAppInterfaceResponse} + */ - } - - AudioPassThruCapabilities.KEY_SAMPLING_RATE = 'samplingRate'; - AudioPassThruCapabilities.KEY_BITS_PER_SAMPLE = 'bitsPerSample'; - AudioPassThruCapabilities.KEY_AUDIO_TYPE = 'audioType'; - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - /** - * @typedef {Enum} VrCapabilities - * @property {Object} _MAP - */ - class VrCapabilities extends Enum { - constructor() { - super(); + setAudioPassThruCapabilities(capabilities) { + this.validateType(AudioPassThruCapabilities, capabilities, true); + this.setParameter(RegisterAppInterfaceResponse.KEY_AUDIO_PASS_THRU_CAPABILITIES, capabilities); + return this; } /** - * @return {String} + * @return {AudioPassThruCapabilities[]} */ - static get VR_TEXT() { - return VrCapabilities._MAP.VR_TEXT; + getAudioPassThruCapabilities() { + return this.getObject(AudioPassThruCapabilities, RegisterAppInterfaceResponse.KEY_AUDIO_PASS_THRU_CAPABILITIES); } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * @param {AudioPassThruCapabilities} capabilities - See AudioPassThruCapability + * @return {RegisterAppInterfaceResponse} + */ - static valueForKey(key) { - return VrCapabilities._valueForKey(key, VrCapabilities._MAP); + setPcmStreamCapabilities(capabilities) { + this.validateType(AudioPassThruCapabilities, capabilities); + this.setParameter(RegisterAppInterfaceResponse.KEY_PCM_STREAM_CAPABILITIES, capabilities); + return this; } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * @return {AudioPassThruCapabilities} + */ - static keyForValue(value) { - return VrCapabilities._keyForValue(value, VrCapabilities._MAP); + getPcmStreamCapabilities() { + return this.getObject(AudioPassThruCapabilities, RegisterAppInterfaceResponse.KEY_PCM_STREAM_CAPABILITIES); } + /** + * @param {VehicleType} type - Specifies the vehicle's type. See VehicleType. + * @return {RegisterAppInterfaceResponse} + */ - } - VrCapabilities._MAP = Object.freeze({ - 'VR_TEXT': 'TEXT' - }); + setVehicleType(type) { + this.validateType(VehicleType, type); + this.setParameter(RegisterAppInterfaceResponse.KEY_VEHICLE_TYPE, type); + return this; + } + /** + * @return {VehicleType} + */ - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - class HMICapabilities extends RpcStruct { - constructor(parameters) { - super(parameters); + getVehicleType() { + return this.getObject(VehicleType, RegisterAppInterfaceResponse.KEY_VEHICLE_TYPE); } /** - * @param {Boolean} navigation - * @return {HMICapabilities} - */ + * @param {Number[]} modes - Specifies the white-list of supported diagnostic modes (0x00-0xFF) capable for + * DiagnosticMessage requests. If a mode outside this list is requested, it will be + * rejected. + * @return {RegisterAppInterfaceResponse} + */ - setNavigation(navigation) { - this.setParameter(HMICapabilities.KEY_NAVIGATION, navigation); + setSupportedDiagModes(modes) { + this.setParameter(RegisterAppInterfaceResponse.KEY_SUPPORTED_DIAG_MODES, modes); return this; } /** - * @return {Boolean} - */ + * @return {Number[]} + */ - getNavigation() { - return this.getParameter(HMICapabilities.KEY_NAVIGATION); + getSupportedDiagModes() { + return this.getParameter(RegisterAppInterfaceResponse.KEY_SUPPORTED_DIAG_MODES); } /** - * @param {Boolean} phoneCall - * @return {HMICapabilities} - */ + * @param {HMICapabilities} capabilities - Specifies the HMI's capabilities. See HMICapabilities. + * @return {RegisterAppInterfaceResponse} + */ - setPhoneCall(phoneCall) { - this.setParameter(HMICapabilities.KEY_PHONE_CALL, phoneCall); + setHmiCapabilities(capabilities) { + this.validateType(HMICapabilities, capabilities); + this.setParameter(RegisterAppInterfaceResponse.KEY_HMI_CAPABILITIES, capabilities); return this; } /** - * @return {Boolean} - */ + * @return {HMICapabilities} + */ - getPhoneCall() { - return this.getParameter(HMICapabilities.KEY_PHONE_CALL); + getHmiCapabilities() { + return this.getObject(HMICapabilities, RegisterAppInterfaceResponse.KEY_HMI_CAPABILITIES); } /** - * @param {Boolean} videoStreaming - * @return {HMICapabilities} - */ + * @param {String} version - The SmartDeviceLink version. + * @return {RegisterAppInterfaceResponse} + */ - setVideoStreaming(videoStreaming) { - this.setParameter(HMICapabilities.KEY_VIDEO_STREAMING, videoStreaming); + setSdlVersion(version) { + this.setParameter(RegisterAppInterfaceResponse.KEY_SDL_VERSION, version); return this; } /** - * @return {Boolean} - */ + * @return {String} + */ - getVideoStreaming() { - return this.getParameter(HMICapabilities.KEY_VIDEO_STREAMING); + getSdlVersion() { + return this.getParameter(RegisterAppInterfaceResponse.KEY_SDL_VERSION); } /** - * @param {Boolean} remoteControl - * @return {HMICapabilities} - */ + * @param {String} version - The software version of the system that implements the SmartDeviceLink core. + * @return {RegisterAppInterfaceResponse} + */ - setRemoteControl(remoteControl) { - this.setParameter(HMICapabilities.KEY_REMOTE_CONTROL, remoteControl); + setSystemSoftwareVersion(version) { + this.setParameter(RegisterAppInterfaceResponse.KEY_SYSTEM_SOFTWARE_VERSION, version); return this; } /** - * @return {Boolean} - */ + * @return {String} + */ - getRemoteControl() { - return this.getParameter(HMICapabilities.KEY_REMOTE_CONTROL); + getSystemSoftwareVersion() { + return this.getParameter(RegisterAppInterfaceResponse.KEY_SYSTEM_SOFTWARE_VERSION); } /** - * @param {Boolean} appServices - * @return {HMICapabilities} - */ + * @param {Boolean} resumed - Existence of apps icon at system. If true, apps icon was resumed at system. If false, + * apps icon is not resumed at system + * @return {RegisterAppInterfaceResponse} + */ - setAppService(appServices) { - this.setParameter(HMICapabilities.KEY_APP_SERVICES, appServices); + setIconResumed(resumed) { + this.setParameter(RegisterAppInterfaceResponse.KEY_ICON_RESUMED, resumed); return this; } /** - * @return {Boolean} - */ + * @return {Boolean} + */ - getAppService() { - return this.getParameter(HMICapabilities.KEY_APP_SERVICES); + getIconResumed() { + return this.getParameter(RegisterAppInterfaceResponse.KEY_ICON_RESUMED); } + + } + + RegisterAppInterfaceResponse.KEY_SDL_MSG_VERSION = 'syncMsgVersion'; + RegisterAppInterfaceResponse.KEY_LANGUAGE = 'language'; + RegisterAppInterfaceResponse.KEY_HMI_DISPLAY_LANGUAGE = 'hmiDisplayLanguage'; + RegisterAppInterfaceResponse.KEY_DISPLAY_CAPABILITIES = 'displayCapabilities'; + RegisterAppInterfaceResponse.KEY_BUTTON_CAPABILITIES = 'buttonCapabilities'; + RegisterAppInterfaceResponse.KEY_SOFT_BUTTON_CAPABILITIES = 'softButtonCapabilities'; + RegisterAppInterfaceResponse.KEY_PRESET_BANK_CAPABILITIES = 'presetBankCapabilities'; + RegisterAppInterfaceResponse.KEY_HMI_ZONE_CAPABILITIES = 'hmiZoneCapabilities'; + RegisterAppInterfaceResponse.KEY_SPEECH_CAPABILITIES = 'speechCapabilities'; + RegisterAppInterfaceResponse.KEY_PRERECORDED_SPEECH = 'prerecordedSpeech'; + RegisterAppInterfaceResponse.KEY_VR_CAPABILITIES = 'vrCapabilities'; + RegisterAppInterfaceResponse.KEY_AUDIO_PASS_THRU_CAPABILITIES = 'audioPassThruCapabilities'; + RegisterAppInterfaceResponse.KEY_PCM_STREAM_CAPABILITIES = 'pcmStreamCapabilities'; + RegisterAppInterfaceResponse.KEY_VEHICLE_TYPE = 'vehicleType'; + RegisterAppInterfaceResponse.KEY_SUPPORTED_DIAG_MODES = 'supportedDiagModes'; + RegisterAppInterfaceResponse.KEY_HMI_CAPABILITIES = 'hmiCapabilities'; + RegisterAppInterfaceResponse.KEY_SDL_VERSION = 'sdlVersion'; + RegisterAppInterfaceResponse.KEY_SYSTEM_SOFTWARE_VERSION = 'systemSoftwareVersion'; + RegisterAppInterfaceResponse.KEY_ICON_RESUMED = 'iconResumed'; + + /* eslint-disable camelcase */ + /** + * Closes an interface from a mobile application. After unregisterAppInterface, no commands other than + * registerAppInterface will be accepted/executed. Will fail, if no registerAppInterface was completed successfully + * before. + */ + + class UnregisterAppInterface extends RpcRequest { /** - * @param {Boolean} displays - * @return {HMICapabilities} - */ + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.UnregisterAppInterface); + } + } - setDisplays(displays) { - this.setParameter(HMICapabilities.KEY_DISPLAYS, displays); - return this; + /* eslint-disable camelcase */ + + class UnregisterAppInterfaceResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.UnregisterAppInterface); } + + } + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} WindowType + * @property {Object} _MAP + */ + + class WindowType extends Enum { /** - * @return {Boolean} - */ + * @constructor + */ + constructor() { + super(); + } + /** + * This window type describes the main window on a display. + * @return {String} + */ - getDisplays() { - return this.getParameter(HMICapabilities.KEY_DISPLAYS); + static get MAIN() { + return WindowType._MAP.MAIN; } /** - * @param {Boolean} seatLocation - * @return {HMICapabilities} - */ + * A widget is a small window that the app can create to provide information and soft buttons for quick app + * control. + * @return {String} + */ - setSeatLocation(seatLocation) { - this.setParameter(HMICapabilities.KEY_SEAT_LOCATION, seatLocation); - return this; + static get WIDGET() { + return WindowType._MAP.WIDGET; } /** - * @return {Boolean} - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ - getSeatLocation() { - return this.getParameter(HMICapabilities.KEY_SEAT_LOCATION); + static valueForKey(key) { + return WindowType._valueForKey(key, WindowType._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return WindowType._keyForValue(value, WindowType._MAP); } } - HMICapabilities.KEY_NAVIGATION = 'navigation'; - HMICapabilities.KEY_PHONE_CALL = 'phoneCall'; - HMICapabilities.KEY_VIDEO_STREAMING = 'videoStreaming'; - HMICapabilities.KEY_REMOTE_CONTROL = 'remoteControl'; - HMICapabilities.KEY_APP_SERVICES = 'appServices'; - HMICapabilities.KEY_DISPLAYS = 'displays'; - HMICapabilities.KEY_SEAT_LOCATION = 'seatLocation'; + WindowType._MAP = Object.freeze({ + 'MAIN': 'MAIN', + 'WIDGET': 'WIDGET' + }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * Create a new window on the display with the specified window type. + */ - class RegisterAppInterfaceResponse extends RpcResponse { + class CreateWindow extends RpcRequest { + /** + * @constructor + */ constructor(store) { super(store); - this.setFunctionName(FunctionID.RegisterAppInterface); + this.setFunctionName(FunctionID.CreateWindow); } /** - * @param {SdlMsgVersion} The max RPC Spec version supported by this library - * @return {RegisterAppInterfaceResponse} - */ + * @param {Number} id - A unique ID to identify the window. The value of '0' will always be the default main window + * on the main display and should not be used in this context as it will already be created for + * the app. See PredefinedWindows enum. Creating a window with an ID that is already in use + * will be rejected with `INVALID_ID`. + * @return {CreateWindow} + */ - setSdlMsgVersion(sdlMsgVersion) { - this.validateType(SdlMsgVersion, sdlMsgVersion); - this.setParameter(RegisterAppInterfaceResponse.KEY_SDL_MSG_VERSION, sdlMsgVersion); + setWindowID(id) { + this.setParameter(CreateWindow.KEY_WINDOW_ID, id); return this; } /** - * @return {SdlMsgVersion} - */ + * @return {Number} + */ - getSdlMsgVersion() { - return this.getObject(SdlMsgVersion, RegisterAppInterfaceResponse.KEY_SDL_MSG_VERSION); + getWindowID() { + return this.getParameter(CreateWindow.KEY_WINDOW_ID); } /** - * @param {Language} language - * @return {RegisterAppInterfaceResponse} - */ + * @param {String} name - The window name to be used by the HMI. The name of the pre-created default window will + * match the app name. Multiple apps can share the same window name except for the default + * main window. Creating a window with a name which is already in use by the app will result + * in `DUPLICATE_NAME`. + * @return {CreateWindow} + */ - setLanguage(language) { - this.validateType(Language, language); - this.setParameter(RegisterAppInterfaceResponse.KEY_LANGUAGE, language); + setWindowName(name) { + this.setParameter(CreateWindow.KEY_WINDOW_NAME, name); return this; } /** - * @return {Language} - */ + * @return {String} + */ - getLanguage() { - return this.getObject(Language, RegisterAppInterfaceResponse.KEY_LANGUAGE); + getWindowName() { + return this.getParameter(CreateWindow.KEY_WINDOW_NAME); } /** - * @param {Language} hmiDisplayLanguage - * @return {RegisterAppInterfaceResponse} - */ + * @param {WindowType} type - The type of the window to be created. Main window or widget. + * @return {CreateWindow} + */ - setHmiDisplayLanguage(hmiDisplayLanguage) { - this.validateType(Language, hmiDisplayLanguage); - this.setParameter(RegisterAppInterfaceResponse.KEY_HMI_DISPLAY_LANGUAGE, hmiDisplayLanguage); + setType(type) { + this.validateType(WindowType, type); + this.setParameter(CreateWindow.KEY_TYPE, type); return this; } /** - * @return {Language} - */ + * @return {WindowType} + */ - getHmiDisplayLanguage() { - return this.getObject(Language, RegisterAppInterfaceResponse.KEY_HMI_DISPLAY_LANGUAGE); + getType() { + return this.getObject(WindowType, CreateWindow.KEY_TYPE); } /** - * @param {DisplayCapabilities} displayCapabilities - * @return {RegisterAppInterfaceResponse} - */ + * @param {String} type - Allows an app to create a widget related to a specific service type. As an example if a + * `MEDIA` app becomes active, this app becomes audible and is allowed to play audio. Actions + * such as skip or play/pause will be directed to this active media app. In case of widgets, + * the system can provide a single "media" widget which will act as a placeholder for the + * active media app. It is only allowed to have one window per service type. This means that + * a media app can only have a single MEDIA widget. Still the app can create widgets omitting + * this parameter. Those widgets would be available as app specific widgets that are + * permanently included in the HMI. This parameter is related to widgets only. The default + * main window, which is pre-created during app registration, will be created based on the + * HMI types specified in the app registration request. + * @return {CreateWindow} + */ - setDisplayCapabilities(displayCapabilities) { - this.validateType(DisplayCapabilities, displayCapabilities); - this.setParameter(RegisterAppInterfaceResponse.KEY_DISPLAY_CAPABILITIES, displayCapabilities); + setAssociatedServiceType(type) { + this.setParameter(CreateWindow.KEY_ASSOCIATED_SERVICE_TYPE, type); return this; } /** - * @return {DisplayCapabilities} - */ + * @return {String} + */ - getDisplayCapabilities() { - return this.getObject(DisplayCapabilities, RegisterAppInterfaceResponse.KEY_DISPLAY_CAPABILITIES); + getAssociatedServiceType() { + return this.getParameter(CreateWindow.KEY_ASSOCIATED_SERVICE_TYPE); } /** - * @param {Array} buttonCapabilities - * @return {RegisterAppInterfaceResponse} - */ + * @param {Number} id - Optional parameter. Specify whether the content sent to an existing window should be + * duplicated to the created window. If there isn't a window with the ID, the request will be + * rejected with `INVALID_DATA`. + * @return {CreateWindow} + */ - setButtonCapabilities(buttonCapabilities) { - // TODO make this work with arrays - // this.validateType(Language, buttonCapabilities); - this.setParameter(RegisterAppInterfaceResponse.KEY_BUTTON_CAPABILITIES, buttonCapabilities); + setDuplicateUpdatesFromWindowID(id) { + this.setParameter(CreateWindow.KEY_DUPLICATE_UPDATES_FROM_WINDOW_ID, id); return this; } /** - * @return {Array} - */ + * @return {Number} + */ - getButtonCapabilities() { - return this.getObject(ButtonCapabilities, RegisterAppInterfaceResponse.KEY_BUTTON_CAPABILITIES); + getDuplicateUpdatesFromWindowID() { + return this.getParameter(CreateWindow.KEY_DUPLICATE_UPDATES_FROM_WINDOW_ID); } - /** - * @param {Array} softButtonCapabilities - * @return {RegisterAppInterfaceResponse} - */ + } - setSoftButtonCapabilities(softButtonCapabilities) { - // TODO make this work with arrays - // this.validateType(SoftButtonCapabilities, softButtonCapabilities); - this.setParameter(RegisterAppInterfaceResponse.KEY_SOFT_BUTTON_CAPABILITIES, softButtonCapabilities); - return this; - } - /** - * @return {Array} - */ + CreateWindow.KEY_WINDOW_ID = 'windowID'; + CreateWindow.KEY_WINDOW_NAME = 'windowName'; + CreateWindow.KEY_TYPE = 'type'; + CreateWindow.KEY_ASSOCIATED_SERVICE_TYPE = 'associatedServiceType'; + CreateWindow.KEY_DUPLICATE_UPDATES_FROM_WINDOW_ID = 'duplicateUpdatesFromWindowID'; + /* eslint-disable camelcase */ - getSoftButtonCapabilities() { - return this.getObject(SoftButtonCapabilities, RegisterAppInterfaceResponse.KEY_SOFT_BUTTON_CAPABILITIES); - } + class CreateWindowResponse extends RpcResponse { /** - * @param {PresetBankCapabilities} presetBankCapabilities - * @return {RegisterAppInterfaceResponse} - */ - - - setPresetBankCapabilities(presetBankCapabilities) { - this.validateType(PresetBankCapabilities, presetBankCapabilities); - this.setParameter(RegisterAppInterfaceResponse.KEY_PRESET_BANK_CAPABILITIES, presetBankCapabilities); - return this; + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.CreateWindow); } - /** - * @return {PresetBankCapabilities} - */ + } - getPresetBankCapabilities() { - return this.getObject(PresetBankCapabilities, RegisterAppInterfaceResponse.KEY_PRESET_BANK_CAPABILITIES); + /* eslint-disable camelcase */ + /** + * Deletes previously created window of the SDL application. + */ + + class DeleteWindow extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.DeleteWindow); } /** - * @param {Array} hmiZoneCapabilities - * @return {RegisterAppInterfaceResponse} - */ + * @param {Number} id - A unique ID to identify the window. The value of '0' will always be the default main window + * on the main display and cannot be deleted. See PredefinedWindows enum. + * @return {DeleteWindow} + */ - setHmiZoneCapabilities(hmiZoneCapabilities) { - // TODO make this work for arrays - // this.validateType(HmiZoneCapabilities, hmiZoneCapabilities); - this.setParameter(RegisterAppInterfaceResponse.KEY_HMI_ZONE_CAPABILITIES, hmiZoneCapabilities); + setWindowID(id) { + this.setParameter(DeleteWindow.KEY_WINDOW_ID, id); return this; } /** - * @return {Array} - */ + * @return {Number} + */ - getHmiZoneCapabilities() { - return this.getObject(HmiZoneCapabilities, RegisterAppInterfaceResponse.KEY_HMI_ZONE_CAPABILITIES); + getWindowID() { + return this.getParameter(DeleteWindow.KEY_WINDOW_ID); } - /** - * @param {Array} speechCapabilities - * @return {RegisterAppInterfaceResponse} - */ + } - setSpeechCapabilities(speechCapabilities) { - // TODO make this work for arrays - // this.validateType(SpeechCapabilities, speechCapabilities); - this.setParameter(RegisterAppInterfaceResponse.KEY_SPEECH_CAPABILITIES, speechCapabilities); - return this; - } - /** - * @return {Array} - */ + DeleteWindow.KEY_WINDOW_ID = 'windowID'; + /* eslint-disable camelcase */ - getSpeechCapabilities() { - return this.getObject(SpeechCapabilities, RegisterAppInterfaceResponse.KEY_SPEECH_CAPABILITIES); - } + class DeleteWindowResponse extends RpcResponse { /** - * @param {Array} speechCapabilities - * @return {RegisterAppInterfaceResponse} - */ + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.DeleteWindow); + } + } - setPrerecordedSpeech(speechCapabilities) { - // TODO make this work for arrays - // this.validateType(PrerecordedSpeech, speechCapabilities); - this.setParameter(RegisterAppInterfaceResponse.KEY_PRERECORDED_SPEECH, speechCapabilities); - return this; + /* eslint-disable camelcase */ + /** + * Contains information about the type of image. + * @typedef {Enum} ImageType + * @property {Object} _MAP + */ + + class ImageType extends Enum { + /** + * @constructor + */ + constructor() { + super(); } /** - * @return {Array} - */ + * @return {String} + */ - getPrerecordedSpeech() { - return this.getObject(PrerecordedSpeech, RegisterAppInterfaceResponse.KEY_PRERECORDED_SPEECH); + static get STATIC() { + return ImageType._MAP.STATIC; } /** - * @param {Array} vrCapabilities - * @return {RegisterAppInterfaceResponse} - */ + * @return {String} + */ - setVrCapabilities(vrCapabilities) { - // TODO make this work for arrays - // this.validateType(VrCapabilities, vrCapabilities); - this.setParameter(RegisterAppInterfaceResponse.KEY_VR_CAPABILITIES, vrCapabilities); - return this; + static get DYNAMIC() { + return ImageType._MAP.DYNAMIC; } /** - * @return {Array} - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ - getVrCapabilities() { - return this.getObject(VrCapabilities, RegisterAppInterfaceResponse.KEY_VR_CAPABILITIES); + static valueForKey(key) { + return ImageType._valueForKey(key, ImageType._MAP); } /** - * @param {Array} audioPassThruCapabilities - * @return {RegisterAppInterfaceResponse} - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ - setAudioPassThruCapabilities(audioPassThruCapabilities) { - // TODO make this work for arrays - // this.validateType(AudioPassThruCapabilities, audioPassThruCapabilities); - this.setParameter(RegisterAppInterfaceResponse.KEY_AUDIO_PASS_THRU_CAPABILITIES, audioPassThruCapabilities); - return this; + static keyForValue(value) { + return ImageType._keyForValue(value, ImageType._MAP); } - /** - * @return {Array} - */ + } - getAudioPassThruCapabilities() { - return this.getObject(AudioPassThruCapabilities, RegisterAppInterfaceResponse.KEY_AUDIO_PASS_THRU_CAPABILITIES); + ImageType._MAP = Object.freeze({ + 'STATIC': 'STATIC', + 'DYNAMIC': 'DYNAMIC' + }); + + /* eslint-disable camelcase */ + + class Image extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); } /** - * @param {AudioPassThruCapabilities} pcmStreamCapabilities - * @return {RegisterAppInterfaceResponse} - */ + * @param {String} value - Either the static hex icon value or the binary image file name identifier (sent by + * PutFile). + * @return {Image} + */ - setPcmStreamCapabilities(pcmStreamCapabilities) { - this.validateType(AudioPassThruCapabilities, pcmStreamCapabilities); - this.setParameter(RegisterAppInterfaceResponse.KEY_PCM_STREAM_CAPABILITIES, pcmStreamCapabilities); + setValue(value) { + this.setParameter(Image.KEY_VALUE, value); return this; } /** - * @return {AudioPassThruCapabilities} - */ + * @return {String} + */ - getPcmStreamCapabilities() { - return this.getObject(AudioPassThruCapabilities, RegisterAppInterfaceResponse.KEY_PCM_STREAM_CAPABILITIES); + getValue() { + return this.getParameter(Image.KEY_VALUE); } /** - * @param {VehicleType} vehicleType - * @return {RegisterAppInterfaceResponse} - */ + * @param {ImageType} type - Describes, whether it is a static or dynamic image. + * @return {Image} + */ - setVehicleType(vehicleType) { - this.validateType(VehicleType, vehicleType); - this.setParameter(RegisterAppInterfaceResponse.KEY_VEHICLE_TYPE, vehicleType); + setImageType(type) { + this.validateType(ImageType, type); + this.setParameter(Image.KEY_IMAGE_TYPE, type); return this; } /** - * @return {VehicleType} - */ + * @return {ImageType} + */ - getVehicleType() { - return this.getObject(VehicleType, RegisterAppInterfaceResponse.KEY_VEHICLE_TYPE); + getImageType() { + return this.getObject(ImageType, Image.KEY_IMAGE_TYPE); } /** - * @param {Number} supportedDiagModes - * @return {RegisterAppInterfaceResponse} - */ + * @param {Boolean} template - If true, the image is a template image and can be recolored by the HMI + * @return {Image} + */ - setSupportedDiagModes(supportedDiagModes) { - this.setParameter(RegisterAppInterfaceResponse.KEY_SUPPORTED_DIAG_MODE, supportedDiagModes); + setIsTemplate(template) { + this.setParameter(Image.KEY_IS_TEMPLATE, template); return this; } /** - * @return {Number} - */ + * @return {Boolean} + */ - getSupportedDiagModes() { - return this.getParameter(RegisterAppInterfaceResponse.KEY_SUPPORTED_DIAG_MODE); + getIsTemplate() { + return this.getParameter(Image.KEY_IS_TEMPLATE); } - /** - * @param {HMICapabilities} hmiCapabilities - * @return {RegisterAppInterfaceResponse} - */ + } - setHMICapabilities(hmiCapabilities) { - this.validateType(HMICapabilities, hmiCapabilities); - this.setParameter(RegisterAppInterfaceResponse.KEY_HMI_CAPABILITIES, hmiCapabilities); - return this; - } - /** - * @return {HMICapabilities} - */ + Image.KEY_VALUE = 'value'; + Image.KEY_IMAGE_TYPE = 'imageType'; + Image.KEY_IS_TEMPLATE = 'isTemplate'; + /* eslint-disable camelcase */ - getHMICapabilities() { - return this.getObject(HMICapabilities, RegisterAppInterfaceResponse.KEY_HMI_CAPABILITIES); + class VrHelpItem extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); } /** - * @param {String} sdlVersion - * @return {RegisterAppInterfaceResponse} - */ + * @param {String} text - Text to display for VR Help item + * @return {VrHelpItem} + */ - setSdlVersion(sdlVersion) { - this.setParameter(RegisterAppInterfaceResponse.KEY_SDL_VERSION, sdlVersion); + setText(text) { + this.setParameter(VrHelpItem.KEY_TEXT, text); return this; } /** - * @return {String} - */ + * @return {String} + */ - getSdlVersion() { - return this.getParameter(RegisterAppInterfaceResponse.KEY_SDL_VERSION); + getText() { + return this.getParameter(VrHelpItem.KEY_TEXT); } /** - * @param {String} systemSoftwareVersion - * @return {RegisterAppInterfaceResponse} - */ + * @param {Image} image - Image struct for VR Help item + * @return {VrHelpItem} + */ - setSystemSoftwareVersion(systemSoftwareVersion) { - this.setParameter(RegisterAppInterfaceResponse.KEY_SYSTEM_SOFTWARE_VERSION, systemSoftwareVersion); + setImage(image) { + this.validateType(Image, image); + this.setParameter(VrHelpItem.KEY_IMAGE, image); return this; } /** - * @return {String} - */ + * @return {Image} + */ - getSystemSoftwareVersion() { - return this.getParameter(RegisterAppInterfaceResponse.KEY_SYSTEM_SOFTWARE_VERSION); + getImage() { + return this.getObject(Image, VrHelpItem.KEY_IMAGE); } /** - * @param {Boolean} iconResumed - * @return {RegisterAppInterfaceResponse} - */ + * @param {Number} position - Position to display item in VR Help list + * @return {VrHelpItem} + */ - setIconResumed(iconResumed) { - this.setParameter(RegisterAppInterfaceResponse.KEY_ICON_RESUMED, iconResumed); + setPosition(position) { + this.setParameter(VrHelpItem.KEY_POSITION, position); return this; } /** - * @return {Boolean} - */ + * @return {Number} + */ - getIconResumed() { - return this.getParameter(RegisterAppInterfaceResponse.KEY_ICON_RESUMED); + getPosition() { + return this.getParameter(VrHelpItem.KEY_POSITION); } } - RegisterAppInterfaceResponse.KEY_SDL_MSG_VERSION = 'syncMsgVersion'; - RegisterAppInterfaceResponse.KEY_LANGUAGE = 'language'; - RegisterAppInterfaceResponse.KEY_HMI_DISPLAY_LANGUAGE = 'hmiDisplayLanguage'; - RegisterAppInterfaceResponse.KEY_DISPLAY_CAPABILITIES = 'displayCapabilities'; - RegisterAppInterfaceResponse.KEY_BUTTON_CAPABILITIES = 'buttonCapabilities'; - RegisterAppInterfaceResponse.KEY_SOFT_BUTTON_CAPABILITIES = 'softButtonCapabilities'; - RegisterAppInterfaceResponse.KEY_PRESET_BANK_CAPABILITIES = 'presetBankCapabilities'; - RegisterAppInterfaceResponse.KEY_HMI_ZONE_CAPABILITIES = 'hmiZoneCapabilities'; - RegisterAppInterfaceResponse.KEY_SPEECH_CAPABILITIES = 'speechCapabilities'; - RegisterAppInterfaceResponse.KEY_PRERECORDED_SPEECH = 'prerecordedSpeech'; - RegisterAppInterfaceResponse.KEY_VR_CAPABILITIES = 'vrCapabilities'; - RegisterAppInterfaceResponse.KEY_AUDIO_PASS_THRU_CAPABILITIES = 'audioPassThruCapabilities'; - RegisterAppInterfaceResponse.KEY_PCM_STREAM_CAPABILITIES = 'pcmStreamCapabilities'; - RegisterAppInterfaceResponse.KEY_VEHICLE_TYPE = 'vehicleType'; - RegisterAppInterfaceResponse.KEY_SUPPORTED_DIAG_MODE = 'supportedDiagModes'; - RegisterAppInterfaceResponse.KEY_HMI_CAPABILITIES = 'hmiCapabilities'; - RegisterAppInterfaceResponse.KEY_SDL_VERSION = 'sdlVersion'; - RegisterAppInterfaceResponse.KEY_SYSTEM_SOFTWARE_VERSION = 'systemSoftwareVersion'; - RegisterAppInterfaceResponse.KEY_ICON_RESUMED = 'iconResumed'; + VrHelpItem.KEY_TEXT = 'text'; + VrHelpItem.KEY_IMAGE = 'image'; + VrHelpItem.KEY_POSITION = 'position'; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * Describes the location of a seat. + */ - class SetAppIcon extends RpcRequest { + class SeatLocation extends RpcStruct { /** - * @constructor - */ - constructor(store) { - super(store); - this.setFunctionName(FunctionID.SetAppIcon); + * @constructor + */ + constructor(parameters) { + super(parameters); } /** - * @param {String} fileName - * @return {SetAppIcon} - */ + * @param {Grid} grid - Describes a location (origin coordinates and span) of a vehicle component. + * @return {SeatLocation} + */ - setFileName(fileName) { - this.setParameter(SetAppIcon.KEY_FILE_NAME, fileName); + setGrid(grid) { + this.validateType(Grid, grid); + this.setParameter(SeatLocation.KEY_GRID, grid); return this; } /** - * @return {String} - */ + * @return {Grid} + */ - getFileName() { - return this.getParameter(SetAppIcon.KEY_FILE_NAME); + getGrid() { + return this.getObject(Grid, SeatLocation.KEY_GRID); } } - SetAppIcon.KEY_FILE_NAME = 'syncFileName'; - - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - - class SetAppIconResponse extends RpcResponse { - /** - * @constructor - */ - constructor(store) { - super(store); - this.setFunctionName(FunctionID.SetAppIcon); - } - - } + SeatLocation.KEY_GRID = 'grid'; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ /** - * @typedef {Enum} SoftButtonType + * How the main menu or submenu is laid out on screen + * @typedef {Enum} MenuLayout * @property {Object} _MAP */ - class SoftButtonType extends Enum { + class MenuLayout extends Enum { + /** + * @constructor + */ constructor() { super(); } @@ -23547,1664 +21823,20305 @@ */ - static get SBT_TEXT() { - return SoftButtonType._MAP.SBT_TEXT; + static get LIST() { + return MenuLayout._MAP.LIST; } /** * @return {String} */ - static get SBT_IMAGE() { - return SoftButtonType._MAP.SBT_IMAGE; + static get TILES() { + return MenuLayout._MAP.TILES; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return MenuLayout._valueForKey(key, MenuLayout._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return MenuLayout._keyForValue(value, MenuLayout._MAP); + } + + } + + MenuLayout._MAP = Object.freeze({ + 'LIST': 'LIST', + 'TILES': 'TILES' + }); + + /* eslint-disable camelcase */ + /** + * Enumeration listing possible keyboard layouts. + * @typedef {Enum} KeyboardLayout + * @property {Object} _MAP + */ + + class KeyboardLayout extends Enum { + /** + * @constructor + */ + constructor() { + super(); } /** * @return {String} */ - static get SBT_BOTH() { - return SoftButtonType._MAP.SBT_BOTH; + static get QWERTY() { + return KeyboardLayout._MAP.QWERTY; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * @return {String} + */ + + + static get QWERTZ() { + return KeyboardLayout._MAP.QWERTZ; + } + /** + * @return {String} + */ + + + static get AZERTY() { + return KeyboardLayout._MAP.AZERTY; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey(key) { - return SoftButtonType._valueForKey(key, SoftButtonType._MAP); + return KeyboardLayout._valueForKey(key, KeyboardLayout._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue(value) { - return SoftButtonType._keyForValue(value, SoftButtonType._MAP); + return KeyboardLayout._keyForValue(value, KeyboardLayout._MAP); } } - SoftButtonType._MAP = Object.freeze({ - 'SBT_TEXT': 'TEXT', - 'SBT_IMAGE': 'IMAGE', - 'SBT_BOTH': 'BOTH' + KeyboardLayout._MAP = Object.freeze({ + 'QWERTY': 'QWERTY', + 'QWERTZ': 'QWERTZ', + 'AZERTY': 'AZERTY' }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ /** - * @typedef {Enum} SystemAction + * Enumeration listing possible keyboard events. + * @typedef {Enum} KeypressMode * @property {Object} _MAP */ - class SystemAction extends Enum { + class KeypressMode extends Enum { + /** + * @constructor + */ constructor() { super(); } /** + * Each keypress is individually sent as the user presses the keyboard keys. * @return {String} */ - static get DEFAULT_ACTION() { - return SystemAction._MAP.DEFAULT_ACTION; + static get SINGLE_KEYPRESS() { + return KeypressMode._MAP.SINGLE_KEYPRESS; } /** + * The keypresses are queued and a string is eventually sent once the user chooses to submit their entry. * @return {String} */ - static get STEAL_FOCUS() { - return SystemAction._MAP.STEAL_FOCUS; + static get QUEUE_KEYPRESSES() { + return KeypressMode._MAP.QUEUE_KEYPRESSES; } /** + * The keypresses are queue and a string is sent each time the user presses a keyboard key; the string contains + * the entire current entry. * @return {String} */ - static get KEEP_CONTEXT() { - return SystemAction._MAP.KEEP_CONTEXT; + static get RESEND_CURRENT_ENTRY() { + return KeypressMode._MAP.RESEND_CURRENT_ENTRY; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey(key) { - return SystemAction._valueForKey(key, SystemAction._MAP); + return KeypressMode._valueForKey(key, KeypressMode._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue(value) { - return SystemAction._keyForValue(value, SystemAction._MAP); + return KeypressMode._keyForValue(value, KeypressMode._MAP); } } - SystemAction._MAP = Object.freeze({ - 'DEFAULT_ACTION': 'DEFAULT_ACTION', - 'STEAL_FOCUS': 'STEAL_FOCUS', - 'KEEP_CONTEXT': 'KEEP_CONTEXT' + KeypressMode._MAP = Object.freeze({ + 'SINGLE_KEYPRESS': 'SINGLE_KEYPRESS', + 'QUEUE_KEYPRESSES': 'QUEUE_KEYPRESSES', + 'RESEND_CURRENT_ENTRY': 'RESEND_CURRENT_ENTRY' }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * Configuration of on-screen keyboard (if available). + */ - class SoftButton extends RpcStruct { + class KeyboardProperties extends RpcStruct { + /** + * @constructor + */ constructor(parameters) { super(parameters); } /** - * @param {SoftButtonType} type - * @return {SoftButton} - */ + * @param {Language} language - The keyboard language. + * @return {KeyboardProperties} + */ - setType(type) { - this.validateType(SoftButtonType, type); - this.setParameter(SoftButton.KEY_TYPE, type); + setLanguage(language) { + this.validateType(Language, language); + this.setParameter(KeyboardProperties.KEY_LANGUAGE, language); return this; } /** - * @return {SoftButtonType} - */ + * @return {Language} + */ - getType() { - return this.getObject(SoftButtonType, SoftButton.KEY_TYPE); + getLanguage() { + return this.getObject(Language, KeyboardProperties.KEY_LANGUAGE); } /** - * @param {String} text - * @return {SoftButton} - */ + * @param {KeyboardLayout} layout - Desired keyboard layout. + * @return {KeyboardProperties} + */ - setText(text) { - this.setParameter(SoftButton.KEY_TEXT, text); + setKeyboardLayout(layout) { + this.validateType(KeyboardLayout, layout); + this.setParameter(KeyboardProperties.KEY_KEYBOARD_LAYOUT, layout); return this; } /** - * @return {String} - */ + * @return {KeyboardLayout} + */ - getText() { - return this.getParameter(SoftButton.KEY_TEXT); + getKeyboardLayout() { + return this.getObject(KeyboardLayout, KeyboardProperties.KEY_KEYBOARD_LAYOUT); } /** - * @param {Image} image - * @return {SoftButton} - */ + * @param {KeypressMode} mode - Desired keypress mode. If omitted, this value will be set to RESEND_CURRENT_ENTRY. + * @return {KeyboardProperties} + */ - setImage(image) { - this.validateType(Image, image); - this.setParameter(SoftButton.KEY_IMAGE, image); + setKeypressMode(mode) { + this.validateType(KeypressMode, mode); + this.setParameter(KeyboardProperties.KEY_KEYPRESS_MODE, mode); return this; } /** - * @return {Image} - */ + * @return {KeypressMode} + */ - getImage() { - return this.getObject(Image, SoftButton.KEY_IMAGE); + getKeypressMode() { + return this.getObject(KeypressMode, KeyboardProperties.KEY_KEYPRESS_MODE); } /** - * @param {Boolean} isHighlighted - * @return {SoftButton} - */ + * @param {String[]} list - Array of keyboard characters to enable. All omitted characters will be greyed out + * (disabled) on the keyboard. If omitted, the entire keyboard will be enabled. + * @return {KeyboardProperties} + */ - setIsHighlighted(isHighlighted) { - this.setParameter(SoftButton.KEY_IS_HIGHLIGHTED, isHighlighted); + setLimitedCharacterList(list) { + this.setParameter(KeyboardProperties.KEY_LIMITED_CHARACTER_LIST, list); return this; } /** - * @return {Boolean} - */ + * @return {String[]} + */ - getIsHighlighted() { - return this.getParameter(SoftButton.KEY_IS_HIGHLIGHTED); + getLimitedCharacterList() { + return this.getParameter(KeyboardProperties.KEY_LIMITED_CHARACTER_LIST); } /** - * @param {Number} softButtonID - * @return {SoftButton} - */ + * @param {String} text - Deprecated, use autoCompleteList instead. + * @return {KeyboardProperties} + */ - setSoftButtonID(softButtonID) { - this.setParameter(SoftButton.KEY_SOFT_BUTTON_ID, softButtonID); + setAutoCompleteText(text) { + this.setParameter(KeyboardProperties.KEY_AUTO_COMPLETE_TEXT, text); return this; } /** - * @return {Number} - */ + * @return {String} + */ - getSoftButtonID() { - return this.getParameter(SoftButton.KEY_SOFT_BUTTON_ID); + getAutoCompleteText() { + return this.getParameter(KeyboardProperties.KEY_AUTO_COMPLETE_TEXT); } /** - * @param {SystemAction} systemAction - * @return {SoftButton} - */ + * @param {String[]} list - Allows an app to prepopulate the text field with a list of suggested or completed + * entries as the user types. If empty, the auto-complete list will be removed from the + * screen. + * @return {KeyboardProperties} + */ - setSystemAction(systemAction) { - this.validateType(SystemAction, systemAction); - this.setParameter(SoftButton.KEY_SYSTEM_ACTION, systemAction); + setAutoCompleteList(list) { + this.setParameter(KeyboardProperties.KEY_AUTO_COMPLETE_LIST, list); return this; } /** - * @return {SystemAction} - */ + * @return {String[]} + */ - getSystemAction() { - return this.getObject(SystemAction, SoftButton.KEY_SYSTEM_ACTION); + getAutoCompleteList() { + return this.getParameter(KeyboardProperties.KEY_AUTO_COMPLETE_LIST); } } - SoftButton.KEY_TYPE = 'type'; - SoftButton.KEY_TEXT = 'text'; - SoftButton.KEY_IMAGE = 'image'; - SoftButton.KEY_IS_HIGHLIGHTED = 'isHighlighted'; - SoftButton.KEY_SOFT_BUTTON_ID = 'softButtonID'; - SoftButton.KEY_SYSTEM_ACTION = 'systemAction'; + KeyboardProperties.KEY_LANGUAGE = 'language'; + KeyboardProperties.KEY_KEYBOARD_LAYOUT = 'keyboardLayout'; + KeyboardProperties.KEY_KEYPRESS_MODE = 'keypressMode'; + KeyboardProperties.KEY_LIMITED_CHARACTER_LIST = 'limitedCharacterList'; + KeyboardProperties.KEY_AUTO_COMPLETE_TEXT = 'autoCompleteText'; + KeyboardProperties.KEY_AUTO_COMPLETE_LIST = 'autoCompleteList'; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ /** - * @typedef {Enum} MetadataType - * @property {Object} _MAP + * Allows setting global properties. */ - class MetadataType extends Enum { - constructor() { - super(); + class SetGlobalProperties extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SetGlobalProperties); } /** - * @return {String} + * @param {SeatLocation} location - Location of the user's seat. Default is driver's seat location if it is not set + * yet. + * @return {SetGlobalProperties} */ - static get mediaTitle() { - return MetadataType._MAP.mediaTitle; + setUserLocation(location) { + this.validateType(SeatLocation, location); + this.setParameter(SetGlobalProperties.KEY_USER_LOCATION, location); + return this; } /** - * @return {String} + * @return {SeatLocation} */ - static get mediaArtist() { - return MetadataType._MAP.mediaArtist; + getUserLocation() { + return this.getObject(SeatLocation, SetGlobalProperties.KEY_USER_LOCATION); } /** - * @return {String} + * @param {TTSChunk[]} prompt - The help prompt. An array of text chunks of type TTSChunk. See TTSChunk. The array + * must have at least one item. + * @return {SetGlobalProperties} */ - static get mediaAlbum() { - return MetadataType._MAP.mediaAlbum; + setHelpPrompt(prompt) { + this.validateType(TTSChunk, prompt, true); + this.setParameter(SetGlobalProperties.KEY_HELP_PROMPT, prompt); + return this; } /** - * @return {String} + * @return {TTSChunk[]} */ - static get mediaYear() { - return MetadataType._MAP.mediaYear; + getHelpPrompt() { + return this.getObject(TTSChunk, SetGlobalProperties.KEY_HELP_PROMPT); } /** - * @return {String} + * @param {TTSChunk[]} prompt - Help text for a wait timeout. An array of text chunks of type TTSChunk. See + * TTSChunk. The array must have at least one item. + * @return {SetGlobalProperties} */ - static get mediaGenre() { - return MetadataType._MAP.mediaGenre; + setTimeoutPrompt(prompt) { + this.validateType(TTSChunk, prompt, true); + this.setParameter(SetGlobalProperties.KEY_TIMEOUT_PROMPT, prompt); + return this; } /** - * @return {String} + * @return {TTSChunk[]} */ - static get mediaStation() { - return MetadataType._MAP.mediaStation; + getTimeoutPrompt() { + return this.getObject(TTSChunk, SetGlobalProperties.KEY_TIMEOUT_PROMPT); } /** - * @return {String} + * @param {String} title - VR Help Title text. If omitted on supported displays, the default module help title shall + * be used. If omitted and one or more vrHelp items are provided, the request will be + * rejected. + * @return {SetGlobalProperties} */ - static get rating() { - return MetadataType._MAP.rating; + setVrHelpTitle(title) { + this.setParameter(SetGlobalProperties.KEY_VR_HELP_TITLE, title); + return this; } /** * @return {String} */ - static get currentTemperature() { - return MetadataType._MAP.currentTemperature; + getVrHelpTitle() { + return this.getParameter(SetGlobalProperties.KEY_VR_HELP_TITLE); } /** - * @return {String} + * @param {VrHelpItem[]} help - VR Help Items. If omitted on supported displays, the default SmartDeviceLink VR help + * / What Can I Say? screen shall be used. If the list of VR Help Items contains + * nonsequential positions (e.g. [1,2,4]), the RPC shall be rejected. If omitted and a + * vrHelpTitle is provided, the request will be rejected. + * @return {SetGlobalProperties} */ - static get maximumTemperature() { - return MetadataType._MAP.maximumTemperature; + setVrHelp(help) { + this.validateType(VrHelpItem, help, true); + this.setParameter(SetGlobalProperties.KEY_VR_HELP, help); + return this; } /** - * @return {String} + * @return {VrHelpItem[]} */ - static get minimumTemperature() { - return MetadataType._MAP.minimumTemperature; + getVrHelp() { + return this.getObject(VrHelpItem, SetGlobalProperties.KEY_VR_HELP); } /** - * @return {String} + * @param {String} title - Optional text to label an app menu button (for certain touchscreen platforms). + * @return {SetGlobalProperties} */ - static get weatherTerm() { - return MetadataType._MAP.weatherTerm; + setMenuTitle(title) { + this.setParameter(SetGlobalProperties.KEY_MENU_TITLE, title); + return this; } /** * @return {String} */ - static get humidity() { - return MetadataType._MAP.humidity; + getMenuTitle() { + return this.getParameter(SetGlobalProperties.KEY_MENU_TITLE); } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * @param {Image} icon - Optional icon to draw on an app menu button (for certain touchscreen platforms). + * @return {SetGlobalProperties} + */ - static valueForKey(key) { - return MetadataType._valueForKey(key, MetadataType._MAP); + setMenuIcon(icon) { + this.validateType(Image, icon); + this.setParameter(SetGlobalProperties.KEY_MENU_ICON, icon); + return this; } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ - - - static keyForValue(value) { - return MetadataType._keyForValue(value, MetadataType._MAP); - } - - } - - MetadataType._MAP = Object.freeze({ - 'mediaTitle': 'mediaTitle', - 'mediaArtist': 'mediaArtist', - 'mediaAlbum': 'mediaAlbum', - 'mediaYear': 'mediaYear', - 'mediaGenre': 'mediaGenre', - 'mediaStation': 'mediaStation', - 'rating': 'rating', - 'currentTemperature': 'currentTemperature', - 'maximumTemperature': 'maximumTemperature', - 'minimumTemperature': 'minimumTemperature', - 'weatherTerm': 'weatherTerm', - 'humidity': 'humidity' - }); + * @return {Image} + */ - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - class MetadataTags extends RpcStruct { - /** - * @constructor - */ - constructor(parameters) { - super(parameters); + getMenuIcon() { + return this.getObject(Image, SetGlobalProperties.KEY_MENU_ICON); } /** - * @param {Array} mainField1 - * @return {MetadataTags} - */ + * @param {KeyboardProperties} properties - On-screen keyboard configuration (if available). + * @return {SetGlobalProperties} + */ - setMainField1(mainField1) { - this.setParameter(MetadataTags.KEY_MAIN_FIELD_1, mainField1); + setKeyboardProperties(properties) { + this.validateType(KeyboardProperties, properties); + this.setParameter(SetGlobalProperties.KEY_KEYBOARD_PROPERTIES, properties); return this; } /** - * @return {Array} - */ + * @return {KeyboardProperties} + */ - getMainField1() { - return this.getObject(MetadataType, MetadataTags.KEY_MAIN_FIELD_1); + getKeyboardProperties() { + return this.getObject(KeyboardProperties, SetGlobalProperties.KEY_KEYBOARD_PROPERTIES); } /** - * @param {Array} mainField2 - * @return {MetadataTags} - */ + * @param {MenuLayout} layout - Sets the layout of the main menu screen. If this is sent while a menu is already on- + * screen, the head unit will change the display to the new layout type. + * @return {SetGlobalProperties} + */ - setMainField2(mainField2) { - this.setParameter(MetadataTags.KEY_MAIN_FIELD_2, mainField2); + setMenuLayout(layout) { + this.validateType(MenuLayout, layout); + this.setParameter(SetGlobalProperties.KEY_MENU_LAYOUT, layout); return this; } /** - * @return {Array} - */ + * @return {MenuLayout} + */ - getMainField2() { - return this.getObject(MetadataType, MetadataTags.KEY_MAIN_FIELD_2); + getMenuLayout() { + return this.getObject(MenuLayout, SetGlobalProperties.KEY_MENU_LAYOUT); } + + } + + SetGlobalProperties.KEY_USER_LOCATION = 'userLocation'; + SetGlobalProperties.KEY_HELP_PROMPT = 'helpPrompt'; + SetGlobalProperties.KEY_TIMEOUT_PROMPT = 'timeoutPrompt'; + SetGlobalProperties.KEY_VR_HELP_TITLE = 'vrHelpTitle'; + SetGlobalProperties.KEY_VR_HELP = 'vrHelp'; + SetGlobalProperties.KEY_MENU_TITLE = 'menuTitle'; + SetGlobalProperties.KEY_MENU_ICON = 'menuIcon'; + SetGlobalProperties.KEY_KEYBOARD_PROPERTIES = 'keyboardProperties'; + SetGlobalProperties.KEY_MENU_LAYOUT = 'menuLayout'; + + /* eslint-disable camelcase */ + + class SetGlobalPropertiesResponse extends RpcResponse { /** - * @param {Array} mainField3 - * @return {MetadataTags} - */ + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SetGlobalProperties); + } + } - setMainField3(mainField3) { - this.setParameter(MetadataTags.KEY_MAIN_FIELD_3, mainField3); - return this; + /* eslint-disable camelcase */ + /** + * The different global properties. + * @typedef {Enum} GlobalProperty + * @property {Object} _MAP + */ + + class GlobalProperty extends Enum { + /** + * @constructor + */ + constructor() { + super(); } /** - * @return {Array} - */ + * Location of the user's seat of setGlobalProperties + * @return {String} + */ - getMainField3() { - return this.getObject(MetadataType, MetadataTags.KEY_MAIN_FIELD_3); + static get USER_LOCATION() { + return GlobalProperty._MAP.USER_LOCATION; } /** - * @param {Array} mainField4 - * @return {MetadataTags} - */ + * The property helpPrompt of setGlobalProperties + * @return {String} + */ - setMainField4(mainField4) { - this.setParameter(MetadataTags.KEY_MAIN_FIELD_4, mainField4); - return this; + static get HELPPROMPT() { + return GlobalProperty._MAP.HELPPROMPT; } /** - * @return {Array} - */ + * The property timeoutPrompt of setGlobalProperties + * @return {String} + */ - getMainField4() { - return this.getObject(MetadataType, MetadataTags.KEY_MAIN_FIELD_4); + static get TIMEOUTPROMPT() { + return GlobalProperty._MAP.TIMEOUTPROMPT; } + /** + * The property vrHelpTitle of setGlobalProperties + * @return {String} + */ - } - MetadataTags.KEY_MAIN_FIELD_1 = 'mainField1'; - MetadataTags.KEY_MAIN_FIELD_2 = 'mainField2'; - MetadataTags.KEY_MAIN_FIELD_3 = 'mainField3'; - MetadataTags.KEY_MAIN_FIELD_4 = 'mainField4'; + static get VRHELPTITLE() { + return GlobalProperty._MAP.VRHELPTITLE; + } + /** + * The property array of vrHelp of setGlobalProperties + * @return {String} + */ - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - /** - * @typedef {Enum} TextAlignment - * @property {Object} _MAP - */ - class TextAlignment extends Enum { - constructor() { - super(); + static get VRHELPITEMS() { + return GlobalProperty._MAP.VRHELPITEMS; } /** - * @return {String} - */ + * The property in-app menu name of setGlobalProperties + * @return {String} + */ - static get LEFT_ALIGNED() { - return TextAlignment._MAP.LEFT_ALIGNED; + static get MENUNAME() { + return GlobalProperty._MAP.MENUNAME; } /** - * @return {String} - */ + * The property in-app menu icon of setGlobalProperties + * @return {String} + */ - static get RIGHT_ALIGNED() { - return TextAlignment._MAP.RIGHT_ALIGNED; + static get MENUICON() { + return GlobalProperty._MAP.MENUICON; } /** - * @return {String} - */ + * The on-screen keyboard configuration of setGlobalProperties + * @return {String} + */ - static get CENTERED() { - return TextAlignment._MAP.CENTERED; + static get KEYBOARDPROPERTIES() { + return GlobalProperty._MAP.KEYBOARDPROPERTIES; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey(key) { - return TextAlignment._valueForKey(key, TextAlignment._MAP); + return GlobalProperty._valueForKey(key, GlobalProperty._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue(value) { - return TextAlignment._keyForValue(value, TextAlignment._MAP); + return GlobalProperty._keyForValue(value, GlobalProperty._MAP); } } - TextAlignment._MAP = Object.freeze({ - 'LEFT_ALIGNED': 'LEFT_ALIGNED', - 'RIGHT_ALIGNED': 'RIGHT_ALIGNED', - 'CENTERED': 'CENTERED' + GlobalProperty._MAP = Object.freeze({ + 'USER_LOCATION': 'USER_LOCATION', + 'HELPPROMPT': 'HELPPROMPT', + 'TIMEOUTPROMPT': 'TIMEOUTPROMPT', + 'VRHELPTITLE': 'VRHELPTITLE', + 'VRHELPITEMS': 'VRHELPITEMS', + 'MENUNAME': 'MENUNAME', + 'MENUICON': 'MENUICON', + 'KEYBOARDPROPERTIES': 'KEYBOARDPROPERTIES' }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * Allows resetting global properties. + */ - class Show extends RpcRequest { + class ResetGlobalProperties extends RpcRequest { /** - * @constructor - */ + * @constructor + */ constructor(store) { super(store); - this.setFunctionName(FunctionID.Show); + this.setFunctionName(FunctionID.ResetGlobalProperties); } /** - * @param {String} mainField1 - * @return {Show} - */ + * @param {GlobalProperty[]} properties - Contains the names of all global properties (like timeoutPrompt) that + * should be unset. Resetting means, that they have the same value as at + * start up (default) + * @return {ResetGlobalProperties} + */ - setMainField1(mainField1) { - this.setParameter(Show.KEY_MAIN_FIELD_1, mainField1); + setProperties(properties) { + this.validateType(GlobalProperty, properties, true); + this.setParameter(ResetGlobalProperties.KEY_PROPERTIES, properties); return this; } /** - * @return {String} - */ + * @return {GlobalProperty[]} + */ - getMainField1() { - return this.getParameter(Show.KEY_MAIN_FIELD_1); + getProperties() { + return this.getObject(GlobalProperty, ResetGlobalProperties.KEY_PROPERTIES); + } + + } + + ResetGlobalProperties.KEY_PROPERTIES = 'properties'; + + /* eslint-disable camelcase */ + + class ResetGlobalPropertiesResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ResetGlobalProperties); } + + } + + /* eslint-disable camelcase */ + + class MenuParams extends RpcStruct { /** - * @param {String} mainField2 - * @return {Show} - */ + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} id - unique ID of the sub menu, the command will be added to. If not provided, it will be + * provided to the top level of the in application menu. + * @return {MenuParams} + */ - setMainField2(mainField2) { - this.setParameter(Show.KEY_MAIN_FIELD_2, mainField2); + setParentID(id) { + this.setParameter(MenuParams.KEY_PARENT_ID, id); return this; } /** - * @return {String} - */ + * @return {Number} + */ - getMainField2() { - return this.getParameter(Show.KEY_MAIN_FIELD_2); + getParentID() { + return this.getParameter(MenuParams.KEY_PARENT_ID); } /** - * @param {String} mainField3 - * @return {Show} - */ + * @param {Number} position - Position within the items that are are at top level of the in application menu. 0 will + * insert at the front. 1 will insert at the second position. if position is greater or + * equal than the number of items on top level, the sub menu will be appended to the end. + * If this param was omitted the entry will be added at the end. + * @return {MenuParams} + */ - setMainField3(mainField3) { - this.setParameter(Show.KEY_MAIN_FIELD_3, mainField3); + setPosition(position) { + this.setParameter(MenuParams.KEY_POSITION, position); return this; } /** - * @return {String} - */ + * @return {Number} + */ - getMainField3() { - return this.getParameter(Show.KEY_MAIN_FIELD_3); + getPosition() { + return this.getParameter(MenuParams.KEY_POSITION); } /** - * @param {String} mainField4 - * @return {Show} - */ + * @param {String} name - Text to show in the menu for this sub menu. + * @return {MenuParams} + */ - setMainField4(mainField4) { - this.setParameter(Show.KEY_MAIN_FIELD_4, mainField4); + setMenuName(name) { + this.setParameter(MenuParams.KEY_MENU_NAME, name); return this; } /** - * @return {String} - */ + * @return {String} + */ - getMainField4() { - return this.getParameter(Show.KEY_MAIN_FIELD_4); + getMenuName() { + return this.getParameter(MenuParams.KEY_MENU_NAME); + } + + } + + MenuParams.KEY_PARENT_ID = 'parentID'; + MenuParams.KEY_POSITION = 'position'; + MenuParams.KEY_MENU_NAME = 'menuName'; + + /* eslint-disable camelcase */ + /** + * Adds a command to the in application menu. Either menuParams or vrCommands must be provided. + */ + + class AddCommand extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.AddCommand); } /** - * @param {TextAlignment} menuParams - * @return {Show} - */ + * @param {Number} id - unique ID of the command to add. + * @return {AddCommand} + */ - setAlignment(alignment) { - this.validateType(TextAlignment, alignment); - this.setParameter(Show.KEY_ALIGNMENT, alignment); + setCmdID(id) { + this.setParameter(AddCommand.KEY_CMD_ID, id); return this; } /** - * @return {TextAlignment} - */ + * @return {Number} + */ - getAlignment() { - return this.getObject(TextAlignment, Show.KEY_ALIGNMENT); + getCmdID() { + return this.getParameter(AddCommand.KEY_CMD_ID); } /** - * @param {String} statusBar - * @return {Show} - */ + * @param {MenuParams} params - Optional sub value containing menu parameters + * @return {AddCommand} + */ - setStatusBar(statusBar) { - this.setParameter(Show.KEY_STATUS_BAR, statusBar); + setMenuParams(params) { + this.validateType(MenuParams, params); + this.setParameter(AddCommand.KEY_MENU_PARAMS, params); return this; } /** - * @return {String} - */ + * @return {MenuParams} + */ - getStatusBar() { - return this.getParameter(Show.KEY_STATUS_BAR); + getMenuParams() { + return this.getObject(MenuParams, AddCommand.KEY_MENU_PARAMS); } /** - * @param {String} mediaClock - * @return {Show} - */ + * @param {String[]} commands - An array of strings to be used as VR synonyms for this command. If this array is + * provided, it may not be empty. + * @return {AddCommand} + */ - setMediaClock(mediaClock) { - this.setParameter(Show.KEY_MEDIA_CLOCK, mediaClock); + setVrCommands(commands) { + this.setParameter(AddCommand.KEY_VR_COMMANDS, commands); return this; } /** - * @return {String} - */ + * @return {String[]} + */ - getMediaClock() { - return this.getParameter(Show.KEY_MEDIA_CLOCK); + getVrCommands() { + return this.getParameter(AddCommand.KEY_VR_COMMANDS); } /** - * @param {String} mediaTrack - * @return {Show} - */ + * @param {Image} icon - Image struct determining whether static or dynamic icon. If omitted on supported displays, + * no (or the default if applicable) icon shall be displayed. + * @return {AddCommand} + */ - setMediaTrack(mediaTrack) { - this.setParameter(Show.KEY_MEDIA_TRACK, mediaTrack); + setCmdIcon(icon) { + this.validateType(Image, icon); + this.setParameter(AddCommand.KEY_CMD_ICON, icon); return this; } /** - * @return {String} - */ + * @return {Image} + */ - getMediaTrack() { - return this.getParameter(Show.KEY_MEDIA_TRACK); + getCmdIcon() { + return this.getObject(Image, AddCommand.KEY_CMD_ICON); } + + } + + AddCommand.KEY_CMD_ID = 'cmdID'; + AddCommand.KEY_MENU_PARAMS = 'menuParams'; + AddCommand.KEY_VR_COMMANDS = 'vrCommands'; + AddCommand.KEY_CMD_ICON = 'cmdIcon'; + + /* eslint-disable camelcase */ + + class AddCommandResponse extends RpcResponse { /** - * @param {Image} graphic - * @return {Show} - */ + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.AddCommand); + } + } - setGraphic(graphic) { - this.validateType(Image, graphic); - this.setParameter(Show.KEY_GRAPHIC, graphic); - return this; + /* eslint-disable camelcase */ + /** + * Deletes all commands from the in-application menu with the specified command id. + */ + + class DeleteCommand extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.DeleteCommand); } /** - * @return {Image} - */ + * @param {Number} id - ID of the command(s) to delete. + * @return {DeleteCommand} + */ - getGraphic() { - return this.getObject(Image, Show.KEY_GRAPHIC); + setCmdID(id) { + this.setParameter(DeleteCommand.KEY_CMD_ID, id); + return this; } /** - * @param {Image} secondaryGraphic - * @return {Show} - */ + * @return {Number} + */ - setSecondaryGraphic(secondaryGraphic) { - this.validateType(Image, secondaryGraphic); - this.setParameter(Show.KEY_SECONDARY_GRAPHIC, secondaryGraphic); - return this; + getCmdID() { + return this.getParameter(DeleteCommand.KEY_CMD_ID); } + + } + + DeleteCommand.KEY_CMD_ID = 'cmdID'; + + /* eslint-disable camelcase */ + + class DeleteCommandResponse extends RpcResponse { /** - * @return {Image} - */ + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.DeleteCommand); + } + } - getSecondaryGraphic() { - return this.getObject(Image, Show.KEY_SECONDARY_GRAPHIC); + /* eslint-disable camelcase */ + /** + * Adds a sub menu to the in-application menu. + */ + + class AddSubMenu extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.AddSubMenu); } /** - * @param {Array} softButtons - * @return {Show} - */ + * @param {Number} id - unique ID of the sub menu to add. + * @return {AddSubMenu} + */ - setSoftButtons(softButtons) { - // TODO make this work for arrays - // this.validateType(SoftButton, softButtons); - this.setParameter(Show.KEY_SOFT_BUTTONS, softButtons); + setMenuID(id) { + this.setParameter(AddSubMenu.KEY_MENU_ID, id); return this; } /** - * @return {Array} - */ + * @return {Number} + */ - getSoftButtons() { - return this.getObject(SoftButton, Show.KEY_SOFT_BUTTONS); + getMenuID() { + return this.getParameter(AddSubMenu.KEY_MENU_ID); } /** - * @param {Array} customPresets - * @return {Show} - */ + * @param {Number} position - Position within the items that are are at top level of the in application menu. 0 will + * insert at the front. 1 will insert at the second position. If position is greater or + * equal than the number of items on top level, the sub menu will be appended to the end. + * Position of any submenu will always be located before the return and exit options If + * this param was omitted the entry will be added at the end. + * @return {AddSubMenu} + */ - setCustomPresets(customPresets) { - this.setParameter(Show.KEY_CUSTOM_PRESETS, customPresets); + setPosition(position) { + this.setParameter(AddSubMenu.KEY_POSITION, position); return this; } /** - * @return {Array} - */ + * @return {Number} + */ - getCustomPresets() { - return this.getParameter(Show.KEY_CUSTOM_PRESETS); + getPosition() { + return this.getParameter(AddSubMenu.KEY_POSITION); } /** - * @param {MetadataTags} metadataTags - * @return {Show} - */ + * @param {String} name - Text to show in the menu for this sub menu. + * @return {AddSubMenu} + */ - setMetadataTags(metadataTags) { - this.validateType(MetadataTags, metadataTags); - this.setParameter(Show.KEY_METADATA_TAGS, metadataTags); + setMenuName(name) { + this.setParameter(AddSubMenu.KEY_MENU_NAME, name); return this; } /** - * @return {MetadataTags} - */ + * @return {String} + */ - getMetadataTags() { - return this.getObject(MetadataTags, Show.KEY_METADATA_TAGS); + getMenuName() { + return this.getParameter(AddSubMenu.KEY_MENU_NAME); } /** - * @param {String} templateTitle - * @return {Show} - */ + * @param {Image} icon - The image field for AddSubMenu + * @return {AddSubMenu} + */ - setTemplateTitle(templateTitle) { - this.setParameter(Show.KEY_TEMPLATE_TITLE, templateTitle); + setMenuIcon(icon) { + this.validateType(Image, icon); + this.setParameter(AddSubMenu.KEY_MENU_ICON, icon); return this; } /** - * @return {String} - */ + * @return {Image} + */ - getTemplateTitle() { - return this.getParameter(Show.KEY_TEMPLATE_TITLE); + getMenuIcon() { + return this.getObject(Image, AddSubMenu.KEY_MENU_ICON); } /** - * @param {Number} windowID - * @return {Show} - */ + * @param {MenuLayout} layout - Sets the layout of the submenu screen. + * @return {AddSubMenu} + */ - setWindowID(windowID) { - this.setParameter(Show.KEY_WINDOW_ID, windowID); + setMenuLayout(layout) { + this.validateType(MenuLayout, layout); + this.setParameter(AddSubMenu.KEY_MENU_LAYOUT, layout); return this; } /** - * @return {Number} - */ + * @return {MenuLayout} + */ - getWindowID() { - return this.getParameter(Show.KEY_WINDOW_ID); + getMenuLayout() { + return this.getObject(MenuLayout, AddSubMenu.KEY_MENU_LAYOUT); } } - Show.KEY_MAIN_FIELD_1 = 'mainField1'; - Show.KEY_MAIN_FIELD_2 = 'mainField2'; - Show.KEY_MAIN_FIELD_3 = 'mainField3'; - Show.KEY_MAIN_FIELD_4 = 'mainField4'; - Show.KEY_ALIGNMENT = 'alignment'; - Show.KEY_STATUS_BAR = 'statusBar'; - Show.KEY_MEDIA_CLOCK = 'mediaClock'; - Show.KEY_MEDIA_TRACK = 'mediaTrack'; - Show.KEY_GRAPHIC = 'graphic'; - Show.KEY_SECONDARY_GRAPHIC = 'secondaryGraphic'; - Show.KEY_SOFT_BUTTONS = 'softButtons'; - Show.KEY_CUSTOM_PRESETS = 'customPresets'; - Show.KEY_METADATA_TAGS = 'metadataTags'; - Show.KEY_TEMPLATE_TITLE = 'templateTitle'; - Show.KEY_WINDOW_ID = 'windowID'; + AddSubMenu.KEY_MENU_ID = 'menuID'; + AddSubMenu.KEY_POSITION = 'position'; + AddSubMenu.KEY_MENU_NAME = 'menuName'; + AddSubMenu.KEY_MENU_ICON = 'menuIcon'; + AddSubMenu.KEY_MENU_LAYOUT = 'menuLayout'; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ - class ShowResponse extends RpcResponse { + class AddSubMenuResponse extends RpcResponse { /** - * @constructor - */ + * @constructor + */ constructor(store) { super(store); - this.setFunctionName(FunctionID.Show); + this.setFunctionName(FunctionID.AddSubMenu); } } - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * Deletes a submenu from the in-application menu. + */ - class UnregisterAppInterface extends RpcRequest { + class DeleteSubMenu extends RpcRequest { /** - * @constructor - */ + * @constructor + */ constructor(store) { super(store); - this.setFunctionName(FunctionID.UnregisterAppInterface); + this.setFunctionName(FunctionID.DeleteSubMenu); + } + /** + * @param {Number} id - The "menuID" of the submenu to delete. (See addSubMenu.menuID) + * @return {DeleteSubMenu} + */ + + + setMenuID(id) { + this.setParameter(DeleteSubMenu.KEY_MENU_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getMenuID() { + return this.getParameter(DeleteSubMenu.KEY_MENU_ID); } } - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + DeleteSubMenu.KEY_MENU_ID = 'menuID'; - class UnregisterAppInterfaceResponse extends RpcResponse { + /* eslint-disable camelcase */ + + class DeleteSubMenuResponse extends RpcResponse { /** - * @constructor - */ + * @constructor + */ constructor(store) { super(store); - this.setFunctionName(FunctionID.UnregisterAppInterface); + this.setFunctionName(FunctionID.DeleteSubMenu); } } - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * Shows the built in menu view + */ - class RpcCreator { + class ShowAppMenu extends RpcRequest { /** - * Converts an SdlPacket to an RpcMessage - * @param {SdlPacket} sdlPacket - * @return {RpcMessage} + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ShowAppMenu); + } + /** + * @param {Number} id - If omitted the HMI opens the app's menu. If set to a sub-menu ID the HMI opens the + * corresponding sub-menu previously added using `AddSubMenu`. + * @return {ShowAppMenu} */ - static construct(sdlPacket) { - const payload = sdlPacket.getPayload(); - const binaryFrameHeader = BinaryFrameHeader.fromBinaryHeader(payload); - let message; - const rpcType = binaryFrameHeader.getRpcType(); - const rpcName = RpcType.keyForValue(rpcType); - const correlationId = binaryFrameHeader.getCorrelationId(); - const functionId = binaryFrameHeader.getFunctionId(); - const functionName = FunctionID.keyForValue(functionId); - const bulkData = binaryFrameHeader.getBulkData(); - const jsonData = binaryFrameHeader.getJsonData(); - const params = { - parameters: JsonRpcMarshaller.unmarshall(jsonData) - }; - switch (functionId) { - case FunctionID.AddCommand: - if (rpcType === RpcType.REQUEST) { - message = new AddCommand(params); - } else if (rpcType === RpcType.RESPONSE) { - message = new AddCommandResponse(params); - } - break; + setMenuID(id) { + this.setParameter(ShowAppMenu.KEY_MENU_ID, id); + return this; + } + /** + * @return {Number} + */ - case FunctionID.OnHMIStatus: - // TODO: should OnHMIStatus be OnHmiStatus, or the class name change to OnHMIStatus? or is this fine as is? - if (rpcType === RpcType.NOTIFICATION) { - message = new OnHmiStatus(params); - } - break; + getMenuID() { + return this.getParameter(ShowAppMenu.KEY_MENU_ID); + } - case FunctionID.OnLanguageChange: - if (rpcType === RpcType.NOTIFICATION) { - message = new OnLanguageChange(params); - } + } - break; + ShowAppMenu.KEY_MENU_ID = 'menuID'; - case FunctionID.PutFile: - if (rpcType === RpcType.REQUEST) { - message = new PutFile(params); - } else if (rpcType === RpcType.RESPONSE) { - message = new PutFileResponse(params); - } + /* eslint-disable camelcase */ - break; + class ShowAppMenuResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ShowAppMenu); + } - case FunctionID.RegisterAppInterface: - if (rpcType === RpcType.REQUEST) { - message = new RegisterAppInterface(params); - } else if (rpcType === RpcType.RESPONSE) { - message = new RegisterAppInterfaceResponse(params); - } + } - break; + /* eslint-disable camelcase */ + /** + * A choice is an option given to the user, which can be selected either by menu, or through voice recognition system. + */ - case FunctionID.SetAppIcon: - if (rpcType === RpcType.REQUEST) { - message = new SetAppIcon(params); - } else if (rpcType === RpcType.RESPONSE) { - message = new SetAppIconResponse(params); - } + class Choice extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} id + * @return {Choice} + */ - break; - case FunctionID.Show: - if (rpcType === RpcType.REQUEST) { - message = new Show(params); - } else if (rpcType === RpcType.RESPONSE) { - message = new ShowResponse(params); - } + setChoiceID(id) { + this.setParameter(Choice.KEY_CHOICE_ID, id); + return this; + } + /** + * @return {Number} + */ - break; - case FunctionID.UnregisterAppInterface: - if (rpcType === RpcType.REQUEST) { - message = new UnregisterAppInterface(params); - } else if (rpcType === RpcType.RESPONSE) { - message = new UnregisterAppInterfaceResponse(params); - } + getChoiceID() { + return this.getParameter(Choice.KEY_CHOICE_ID); + } + /** + * @param {String} name + * @return {Choice} + */ - break; - default: - message = null; - } + setMenuName(name) { + this.setParameter(Choice.KEY_MENU_NAME, name); + return this; + } + /** + * @return {String} + */ - if (message === null || message === undefined) { - // informs of missing classes - console.warn(`RpcCreator couldn't construct an RPC for the ${functionName} ${rpcName}`); - return null; - } - if (rpcType === RpcType.REQUEST || rpcType === RpcType.RESPONSE) { - message.setCorrelationId(correlationId); - } + getMenuName() { + return this.getParameter(Choice.KEY_MENU_NAME); + } + /** + * @param {String[]} commands + * @return {Choice} + */ - if (bulkData) { - message.setBulkData(bulkData); - } - return message; + setVrCommands(commands) { + this.setParameter(Choice.KEY_VR_COMMANDS, commands); + return this; + } + /** + * @return {String[]} + */ + + + getVrCommands() { + return this.getParameter(Choice.KEY_VR_COMMANDS); + } + /** + * @param {Image} image + * @return {Choice} + */ + + + setImage(image) { + this.validateType(Image, image); + this.setParameter(Choice.KEY_IMAGE, image); + return this; + } + /** + * @return {Image} + */ + + + getImage() { + return this.getObject(Image, Choice.KEY_IMAGE); + } + /** + * @param {String} text - Optional secondary text to display; e.g. address of POI in a search result entry + * @return {Choice} + */ + + + setSecondaryText(text) { + this.setParameter(Choice.KEY_SECONDARY_TEXT, text); + return this; + } + /** + * @return {String} + */ + + + getSecondaryText() { + return this.getParameter(Choice.KEY_SECONDARY_TEXT); + } + /** + * @param {String} text - Optional tertiary text to display; e.g. distance to POI for a search result entry + * @return {Choice} + */ + + + setTertiaryText(text) { + this.setParameter(Choice.KEY_TERTIARY_TEXT, text); + return this; + } + /** + * @return {String} + */ + + + getTertiaryText() { + return this.getParameter(Choice.KEY_TERTIARY_TEXT); + } + /** + * @param {Image} image - Optional secondary image struct for choice + * @return {Choice} + */ + + + setSecondaryImage(image) { + this.validateType(Image, image); + this.setParameter(Choice.KEY_SECONDARY_IMAGE, image); + return this; + } + /** + * @return {Image} + */ + + + getSecondaryImage() { + return this.getObject(Image, Choice.KEY_SECONDARY_IMAGE); } } - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + Choice.KEY_CHOICE_ID = 'choiceID'; + Choice.KEY_MENU_NAME = 'menuName'; + Choice.KEY_VR_COMMANDS = 'vrCommands'; + Choice.KEY_IMAGE = 'image'; + Choice.KEY_SECONDARY_TEXT = 'secondaryText'; + Choice.KEY_TERTIARY_TEXT = 'tertiaryText'; + Choice.KEY_SECONDARY_IMAGE = 'secondaryImage'; + + /* eslint-disable camelcase */ /** - * @typedef {Enum} VideoStreamingProtocol + * creates interaction choice set to be used later by performInteraction + */ + + class CreateInteractionChoiceSet extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.CreateInteractionChoiceSet); + } + /** + * @param {Number} id - Unique ID used for this interaction choice set. + * @return {CreateInteractionChoiceSet} + */ + + + setInteractionChoiceSetID(id) { + this.setParameter(CreateInteractionChoiceSet.KEY_INTERACTION_CHOICE_SET_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getInteractionChoiceSetID() { + return this.getParameter(CreateInteractionChoiceSet.KEY_INTERACTION_CHOICE_SET_ID); + } + /** + * @param {Choice[]} set - A choice is an option given to the user, which can be selected either by menu, or through + * voice recognition system. + * @return {CreateInteractionChoiceSet} + */ + + + setChoiceSet(set) { + this.validateType(Choice, set, true); + this.setParameter(CreateInteractionChoiceSet.KEY_CHOICE_SET, set); + return this; + } + /** + * @return {Choice[]} + */ + + + getChoiceSet() { + return this.getObject(Choice, CreateInteractionChoiceSet.KEY_CHOICE_SET); + } + + } + + CreateInteractionChoiceSet.KEY_INTERACTION_CHOICE_SET_ID = 'interactionChoiceSetID'; + CreateInteractionChoiceSet.KEY_CHOICE_SET = 'choiceSet'; + + /* eslint-disable camelcase */ + + class CreateInteractionChoiceSetResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.CreateInteractionChoiceSet); + } + + } + + /* eslint-disable camelcase */ + /** + * For touchscreen interactions, the mode of how the choices are presented. + * @typedef {Enum} LayoutMode * @property {Object} _MAP */ - class VideoStreamingProtocol extends Enum { + class LayoutMode extends Enum { /** - * @constructor - */ + * @constructor + */ constructor() { super(); } /** + * This mode causes the interaction to display the previous set of choices as icons. * @return {String} */ - static get RAW() { - return VideoStreamingProtocol._MAP.RAW; + static get ICON_ONLY() { + return LayoutMode._MAP.ICON_ONLY; } /** + * This mode causes the interaction to display the previous set of choices as icons along with a search field in + * the HMI. * @return {String} */ - static get RTP() { - return VideoStreamingProtocol._MAP.RTP; + static get ICON_WITH_SEARCH() { + return LayoutMode._MAP.ICON_WITH_SEARCH; } /** + * This mode causes the interaction to display the previous set of choices as a list. * @return {String} */ - static get RTSP() { - return VideoStreamingProtocol._MAP.RTSP; + static get LIST_ONLY() { + return LayoutMode._MAP.LIST_ONLY; } /** + * This mode causes the interaction to display the previous set of choices as a list along with a search field in + * the HMI. * @return {String} */ - static get RTMP() { - return VideoStreamingProtocol._MAP.RTMP; + static get LIST_WITH_SEARCH() { + return LayoutMode._MAP.LIST_WITH_SEARCH; } /** + * This mode causes the interaction to immediately display a keyboard entry through the HMI. * @return {String} */ - static get WEBM() { - return VideoStreamingProtocol._MAP.WEBM; + static get KEYBOARD() { + return LayoutMode._MAP.KEYBOARD; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey(key) { - return VideoStreamingProtocol._valueForKey(key, VideoStreamingProtocol._MAP); + return LayoutMode._valueForKey(key, LayoutMode._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue(value) { - return VideoStreamingProtocol._keyForValue(value, VideoStreamingProtocol._MAP); + return LayoutMode._keyForValue(value, LayoutMode._MAP); } } - VideoStreamingProtocol._MAP = Object.freeze({ + LayoutMode._MAP = Object.freeze({ + 'ICON_ONLY': 'ICON_ONLY', + 'ICON_WITH_SEARCH': 'ICON_WITH_SEARCH', + 'LIST_ONLY': 'LIST_ONLY', + 'LIST_WITH_SEARCH': 'LIST_WITH_SEARCH', + 'KEYBOARD': 'KEYBOARD' + }); + + /* eslint-disable camelcase */ + /** + * For application-requested interactions, this mode indicates the method in which the user is notified and uses the + * interaction. + * @typedef {Enum} InteractionMode + * @property {Object} _MAP + */ + + class InteractionMode extends Enum { /** - * Raw stream bytes that contains no timestamp data and is the lowest supported video streaming + * @constructor + */ + constructor() { + super(); + } + /** + * This mode causes the interaction to only occur on the display, meaning the choices are provided only via the + * display. No Voice Interaction. + * @return {String} */ - 'RAW': 'RAW', + + static get MANUAL_ONLY() { + return InteractionMode._MAP.MANUAL_ONLY; + } /** - * RTP facilitates the transfer of real-time data. Information provided by this protocol include - * timestamps (for synchronization), sequence numbers (for packet loss and reordering detection) - * and the payload format which indicates the encoded format of the data. + * This mode causes the interaction to only occur using the headunits VR system. Selections are made by saying the + * command. + * @return {String} */ - 'RTP': 'RTP', + + static get VR_ONLY() { + return InteractionMode._MAP.VR_ONLY; + } /** - * The transmission of streaming data itself is not a task of RTSP. Most RTSP servers use the - * Real-time Transport Protocol (RTP) in conjunction with Real-time Control Protocol (RTCP) for - * media stream delivery. However, some vendors implement proprietary transport protocols. + * This mode causes both a VR and display selection option for an interaction. The user will first be asked via + * Voice Interaction (if available). If this is unsuccessful, the system will switch to manual input. + * @return {String} */ - 'RTSP': 'RTSP', + + static get BOTH() { + return InteractionMode._MAP.BOTH; + } /** - * Real-Time Messaging Protocol (RTMP) was initially a proprietary protocol developed by - * Macromedia for streaming audio, video and data over the Internet, between a Flash player and - * a server. Macromedia is now owned by Adobe, which has released an incomplete version of the - * specification of the protocol for public use. + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found */ - 'RTMP': 'RTMP', + + static valueForKey(key) { + return InteractionMode._valueForKey(key, InteractionMode._MAP); + } /** - * The WebM container is based on a profile of Matroska. WebM initially supported VP8 video and - * Vorbis audio streams. In 2013 it was updated to accommodate VP9 video and Opus audio. + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found */ - 'WEBM': 'WEBM' + + + static keyForValue(value) { + return InteractionMode._keyForValue(value, InteractionMode._MAP); + } + + } + + InteractionMode._MAP = Object.freeze({ + 'MANUAL_ONLY': 'MANUAL_ONLY', + 'VR_ONLY': 'VR_ONLY', + 'BOTH': 'BOTH' }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ /** - * @typedef {Enum} VideoStreamingCodec - * @property {Object} _MAP + * Triggers an interaction (e.g. "Permit GPS?" - Yes, no, Always Allow). */ - class VideoStreamingCodec extends Enum { + class PerformInteraction extends RpcRequest { /** - * @constructor - */ - constructor() { - super(); + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.PerformInteraction); } /** - * @return {String} + * @param {String} text - Text to be displayed first. + * @return {PerformInteraction} */ - static get H264() { - return VideoStreamingCodec._MAP.H264; + setInitialText(text) { + this.setParameter(PerformInteraction.KEY_INITIAL_TEXT, text); + return this; } /** * @return {String} */ - static get H265() { - return VideoStreamingCodec._MAP.H265; + getInitialText() { + return this.getParameter(PerformInteraction.KEY_INITIAL_TEXT); + } + /** + * @param {TTSChunk[]} prompt - This is the initial prompt spoken to the user at the start of an interaction. An + * array of text chunks of type TTSChunk. See TTSChunk. The array must have at least + * one item. + * @return {PerformInteraction} + */ + + + setInitialPrompt(prompt) { + this.validateType(TTSChunk, prompt, true); + this.setParameter(PerformInteraction.KEY_INITIAL_PROMPT, prompt); + return this; + } + /** + * @return {TTSChunk[]} + */ + + + getInitialPrompt() { + return this.getObject(TTSChunk, PerformInteraction.KEY_INITIAL_PROMPT); + } + /** + * @param {InteractionMode} mode - See InteractionMode. + * @return {PerformInteraction} + */ + + + setInteractionMode(mode) { + this.validateType(InteractionMode, mode); + this.setParameter(PerformInteraction.KEY_INTERACTION_MODE, mode); + return this; + } + /** + * @return {InteractionMode} + */ + + + getInteractionMode() { + return this.getObject(InteractionMode, PerformInteraction.KEY_INTERACTION_MODE); + } + /** + * @param {Number[]} list - List of interaction choice set IDs to use with an interaction. + * @return {PerformInteraction} + */ + + + setInteractionChoiceSetIDList(list) { + this.setParameter(PerformInteraction.KEY_INTERACTION_CHOICE_SET_IDLIST, list); + return this; + } + /** + * @return {Number[]} + */ + + + getInteractionChoiceSetIDList() { + return this.getParameter(PerformInteraction.KEY_INTERACTION_CHOICE_SET_IDLIST); + } + /** + * @param {TTSChunk[]} prompt - Help text. This is the spoken string when a user speaks "help" when the interaction + * is occurring. An array of text chunks of type TTSChunk. See TTSChunk. The array must + * have at least one item. + * @return {PerformInteraction} + */ + + + setHelpPrompt(prompt) { + this.validateType(TTSChunk, prompt, true); + this.setParameter(PerformInteraction.KEY_HELP_PROMPT, prompt); + return this; + } + /** + * @return {TTSChunk[]} + */ + + + getHelpPrompt() { + return this.getObject(TTSChunk, PerformInteraction.KEY_HELP_PROMPT); + } + /** + * @param {TTSChunk[]} prompt - Timeout text. This text is spoken when a VR interaction times out. An array of text + * chunks of type TTSChunk. See TTSChunk. The array must have at least one item. + * @return {PerformInteraction} + */ + + + setTimeoutPrompt(prompt) { + this.validateType(TTSChunk, prompt, true); + this.setParameter(PerformInteraction.KEY_TIMEOUT_PROMPT, prompt); + return this; + } + /** + * @return {TTSChunk[]} + */ + + + getTimeoutPrompt() { + return this.getObject(TTSChunk, PerformInteraction.KEY_TIMEOUT_PROMPT); + } + /** + * @param {Number} timeout - Timeout in milliseconds. If omitted a standard value of 10000 milliseconds is used. + * Applies only to the menu portion of the interaction. The VR timeout will be handled by + * the platform. + * @return {PerformInteraction} + */ + + + setTimeout(timeout) { + this.setParameter(PerformInteraction.KEY_TIMEOUT, timeout); + return this; + } + /** + * @return {Number} + */ + + + getTimeout() { + return this.getParameter(PerformInteraction.KEY_TIMEOUT); + } + /** + * @param {VrHelpItem[]} help - Ability to send suggested VR Help Items to display on-screen during Perform + * Interaction. If omitted on supported displays, the default generated list of + * suggested choices shall be displayed. + * @return {PerformInteraction} + */ + + + setVrHelp(help) { + this.validateType(VrHelpItem, help, true); + this.setParameter(PerformInteraction.KEY_VR_HELP, help); + return this; + } + /** + * @return {VrHelpItem[]} + */ + + + getVrHelp() { + return this.getObject(VrHelpItem, PerformInteraction.KEY_VR_HELP); + } + /** + * @param {LayoutMode} layout - See LayoutMode. + * @return {PerformInteraction} + */ + + + setInteractionLayout(layout) { + this.validateType(LayoutMode, layout); + this.setParameter(PerformInteraction.KEY_INTERACTION_LAYOUT, layout); + return this; + } + /** + * @return {LayoutMode} + */ + + + getInteractionLayout() { + return this.getObject(LayoutMode, PerformInteraction.KEY_INTERACTION_LAYOUT); + } + /** + * @param {Number} id - An ID for this specific PerformInteraction to allow cancellation through the + * `CancelInteraction` RPC. + * @return {PerformInteraction} + */ + + + setCancelID(id) { + this.setParameter(PerformInteraction.KEY_CANCEL_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getCancelID() { + return this.getParameter(PerformInteraction.KEY_CANCEL_ID); + } + + } + + PerformInteraction.KEY_INITIAL_TEXT = 'initialText'; + PerformInteraction.KEY_INITIAL_PROMPT = 'initialPrompt'; + PerformInteraction.KEY_INTERACTION_MODE = 'interactionMode'; + PerformInteraction.KEY_INTERACTION_CHOICE_SET_IDLIST = 'interactionChoiceSetIDList'; + PerformInteraction.KEY_HELP_PROMPT = 'helpPrompt'; + PerformInteraction.KEY_TIMEOUT_PROMPT = 'timeoutPrompt'; + PerformInteraction.KEY_TIMEOUT = 'timeout'; + PerformInteraction.KEY_VR_HELP = 'vrHelp'; + PerformInteraction.KEY_INTERACTION_LAYOUT = 'interactionLayout'; + PerformInteraction.KEY_CANCEL_ID = 'cancelID'; + + /* eslint-disable camelcase */ + /** + * Indicates the source from where the command was triggered. + * @typedef {Enum} TriggerSource + * @property {Object} _MAP + */ + + class TriggerSource extends Enum { + /** + * @constructor + */ + constructor() { + super(); } /** * @return {String} */ - static get Theora() { - return VideoStreamingCodec._MAP.Theora; + static get TS_MENU() { + return TriggerSource._MAP.TS_MENU; } /** * @return {String} */ - static get VP8() { - return VideoStreamingCodec._MAP.VP8; + static get TS_VR() { + return TriggerSource._MAP.TS_VR; } /** * @return {String} */ - static get VP9() { - return VideoStreamingCodec._MAP.VP9; + static get TS_KEYBOARD() { + return TriggerSource._MAP.TS_KEYBOARD; } /** - * Get the value for the given enum key - * @param value - A key to find in the map of the subclass - * @return {*} - Returns a value if found, or null if not found - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ static valueForKey(key) { - return VideoStreamingCodec._valueForKey(key, VideoStreamingCodec._MAP); + return TriggerSource._valueForKey(key, TriggerSource._MAP); } /** - * Get the key for the given enum value - * @param value - A primitive value to find the matching key for in the map of the subclass - * @return {*} - Returns a key if found, or null if not found - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ static keyForValue(value) { - return VideoStreamingCodec._keyForValue(value, VideoStreamingCodec._MAP); + return TriggerSource._keyForValue(value, TriggerSource._MAP); } } - VideoStreamingCodec._MAP = Object.freeze({ + TriggerSource._MAP = Object.freeze({ + 'TS_MENU': 'MENU', + 'TS_VR': 'VR', + 'TS_KEYBOARD': 'KEYBOARD' + }); + + /* eslint-disable camelcase */ + + class PerformInteractionResponse extends RpcResponse { /** - * A block-oriented motion-compensation-based video compression standard. As of 2014 it is one - * of the most commonly used formats for the recording, compression, and distribution of video - * content. + * @constructor */ - 'H264': 'H264', - + constructor(store) { + super(store); + this.setFunctionName(FunctionID.PerformInteraction); + } /** - * High Efficiency Video Coding (HEVC), also known as H.265 and MPEG-H Part 2, is a video - * compression standard, one of several potential successors to the widely used AVC - * (H.264 or MPEG-4 Part 10). In comparison to AVC, HEVC offers about double the data - * compression ratio at the same level of video quality, or substantially improved video quality - * at the same bit rate. It supports resolutions up to 8192x4320, including 8K UHD. + * @param {Number} id - ID of the choice that was selected in response to PerformInteraction. Only is valid if + * general result is "success:true". + * @return {PerformInteractionResponse} */ - 'H265': 'H265', + + setChoiceID(id) { + this.setParameter(PerformInteractionResponse.KEY_CHOICE_ID, id); + return this; + } /** - * Theora is derived from the formerly proprietary VP3 codec, released into the public domain by - * On2 Technologies. It is broadly comparable in design and bitrate efficiency to MPEG-4 Part 2, - * early versions of Windows Media Video, and RealVideo while lacking some of the features - * present in some of these other codecs. It is comparable in open standards philosophy to the - * BBC's Dirac codec. + * @return {Number} */ - 'Theora': 'Theora', + + getChoiceID() { + return this.getParameter(PerformInteractionResponse.KEY_CHOICE_ID); + } /** - * VP8 can be multiplexed into the Matroska-based container format WebM along with Vorbis and - * Opus audio. The image format WebP is based on VP8's intra-frame coding. VP8's direct - * successor, VP9, and the emerging royalty-free internet video format AV1 from the Alliance - * for Open Media (AOMedia) are based on VP8. + * @param {String} entry - Manually entered text selection, e.g. through keyboard Can be returned in lieu of + * choiceID, depending on trigger source + * @return {PerformInteractionResponse} */ - 'VP8': 'VP8', + + setManualTextEntry(entry) { + this.setParameter(PerformInteractionResponse.KEY_MANUAL_TEXT_ENTRY, entry); + return this; + } /** - * Similar to VP8, but VP9 is customized for video resolutions beyond high-definition video - * (UHD) and also enables lossless compression. + * @return {String} */ - 'VP9': 'VP9' - }); - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - class VideoStreamingFormat extends RpcStruct { - /** - * @constructor - */ - constructor() { - super(); + getManualTextEntry() { + return this.getParameter(PerformInteractionResponse.KEY_MANUAL_TEXT_ENTRY); } /** - * @param {VideoStreamingProtocol} val - * @return {VideoStreamingFormat} - */ + * @param {TriggerSource} source - See TriggerSource Only is valid if resultCode is SUCCESS. + * @return {PerformInteractionResponse} + */ - setProtocol(val) { - this.validateType(VideoStreamingProtocol, val); - this.setParameter(VideoStreamingFormat.KEY_PROTOCOL, val); + setTriggerSource(source) { + this.validateType(TriggerSource, source); + this.setParameter(PerformInteractionResponse.KEY_TRIGGER_SOURCE, source); return this; } /** - * @return {VideoStreamingProtocol} - */ + * @return {TriggerSource} + */ - getProtocol() { - return this.getParameter(VideoStreamingFormat.KEY_PROTOCOL); + getTriggerSource() { + return this.getObject(TriggerSource, PerformInteractionResponse.KEY_TRIGGER_SOURCE); + } + + } + + PerformInteractionResponse.KEY_CHOICE_ID = 'choiceID'; + PerformInteractionResponse.KEY_MANUAL_TEXT_ENTRY = 'manualTextEntry'; + PerformInteractionResponse.KEY_TRIGGER_SOURCE = 'triggerSource'; + + /* eslint-disable camelcase */ + /** + * Deletes interaction choice set that has been created with "CreateInteractionChoiceSet". The interaction may only be + * deleted when not currently in use by a "performInteraction". + */ + + class DeleteInteractionChoiceSet extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.DeleteInteractionChoiceSet); } /** - * @param {VideoStreamingCodec} val - * @return {VideoStreamingFormat} - */ + * @param {Number} id - ID of the interaction choice set to delete. + * @return {DeleteInteractionChoiceSet} + */ - setCodec(val) { - this.validateType(VideoStreamingCodec, val); - this.setParameter(VideoStreamingFormat.KEY_CODEC, val); + setInteractionChoiceSetID(id) { + this.setParameter(DeleteInteractionChoiceSet.KEY_INTERACTION_CHOICE_SET_ID, id); return this; } /** - * @return {VideoStreamingCodec} - */ + * @return {Number} + */ - getCodec() { - return this.getParameter(VideoStreamingFormat.KEY_CODEC); + getInteractionChoiceSetID() { + return this.getParameter(DeleteInteractionChoiceSet.KEY_INTERACTION_CHOICE_SET_ID); + } + + } + + DeleteInteractionChoiceSet.KEY_INTERACTION_CHOICE_SET_ID = 'interactionChoiceSetID'; + + /* eslint-disable camelcase */ + + class DeleteInteractionChoiceSetResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.DeleteInteractionChoiceSet); + } + + } + + /* eslint-disable camelcase */ + /** + * Contains information about the SoftButton capabilities. + * @typedef {Enum} SoftButtonType + * @property {Object} _MAP + */ + + class SoftButtonType extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get SBT_TEXT() { + return SoftButtonType._MAP.SBT_TEXT; + } + /** + * @return {String} + */ + + + static get SBT_IMAGE() { + return SoftButtonType._MAP.SBT_IMAGE; + } + /** + * @return {String} + */ + + + static get SBT_BOTH() { + return SoftButtonType._MAP.SBT_BOTH; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return SoftButtonType._valueForKey(key, SoftButtonType._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return SoftButtonType._keyForValue(value, SoftButtonType._MAP); + } + + } + + SoftButtonType._MAP = Object.freeze({ + 'SBT_TEXT': 'TEXT', + 'SBT_IMAGE': 'IMAGE', + 'SBT_BOTH': 'BOTH' + }); + + /* eslint-disable camelcase */ + /** + * Enumeration that describes system actions that can be triggered. + * @typedef {Enum} SystemAction + * @property {Object} _MAP + */ + + class SystemAction extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * Default action occurs. Standard behavior (e.g. SoftButton clears overlay). + * @return {String} + */ + + + static get DEFAULT_ACTION() { + return SystemAction._MAP.DEFAULT_ACTION; + } + /** + * App is brought into HMI_FULL. + * @return {String} + */ + + + static get STEAL_FOCUS() { + return SystemAction._MAP.STEAL_FOCUS; + } + /** + * Current system context is maintained. An overlay is persisted even though a SoftButton has been pressed and the + * notification sent. + * @return {String} + */ + + + static get KEEP_CONTEXT() { + return SystemAction._MAP.KEEP_CONTEXT; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return SystemAction._valueForKey(key, SystemAction._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return SystemAction._keyForValue(value, SystemAction._MAP); + } + + } + + SystemAction._MAP = Object.freeze({ + 'DEFAULT_ACTION': 'DEFAULT_ACTION', + 'STEAL_FOCUS': 'STEAL_FOCUS', + 'KEEP_CONTEXT': 'KEEP_CONTEXT' + }); + + /* eslint-disable camelcase */ + + class SoftButton extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {SoftButtonType} type - Describes, whether it is text, highlighted text, icon, or dynamic image. See + * softButtonType + * @return {SoftButton} + */ + + + setType(type) { + this.validateType(SoftButtonType, type); + this.setParameter(SoftButton.KEY_TYPE, type); + return this; + } + /** + * @return {SoftButtonType} + */ + + + getType() { + return this.getObject(SoftButtonType, SoftButton.KEY_TYPE); + } + /** + * @param {String} text - Optional text to display (if defined as TEXT or BOTH) + * @return {SoftButton} + */ + + + setText(text) { + this.setParameter(SoftButton.KEY_TEXT, text); + return this; + } + /** + * @return {String} + */ + + + getText() { + return this.getParameter(SoftButton.KEY_TEXT); + } + /** + * @param {Image} image - Optional image struct for SoftButton (if defined as IMAGE or BOTH) + * @return {SoftButton} + */ + + + setImage(image) { + this.validateType(Image, image); + this.setParameter(SoftButton.KEY_IMAGE, image); + return this; + } + /** + * @return {Image} + */ + + + getImage() { + return this.getObject(Image, SoftButton.KEY_IMAGE); + } + /** + * @param {Boolean} highlighted - True, if highlighted False, if not highlighted + * @return {SoftButton} + */ + + + setIsHighlighted(highlighted) { + this.setParameter(SoftButton.KEY_IS_HIGHLIGHTED, highlighted); + return this; + } + /** + * @return {Boolean} + */ + + + getIsHighlighted() { + return this.getParameter(SoftButton.KEY_IS_HIGHLIGHTED); + } + /** + * @param {Number} id - Value which is returned via OnButtonPress / OnButtonEvent + * @return {SoftButton} + */ + + + setSoftButtonID(id) { + this.setParameter(SoftButton.KEY_SOFT_BUTTON_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getSoftButtonID() { + return this.getParameter(SoftButton.KEY_SOFT_BUTTON_ID); + } + /** + * @param {SystemAction} action - Parameter indicating whether selecting a SoftButton shall call a specific system + * action. This is intended to allow Notifications to bring the callee into full / + * focus; or in the case of persistent overlays, the overlay can persist when a + * SoftButton is pressed. + * @return {SoftButton} + */ + + + setSystemAction(action) { + this.validateType(SystemAction, action); + this.setParameter(SoftButton.KEY_SYSTEM_ACTION, action); + return this; + } + /** + * @return {SystemAction} + */ + + + getSystemAction() { + return this.getObject(SystemAction, SoftButton.KEY_SYSTEM_ACTION); + } + + } + + SoftButton.KEY_TYPE = 'type'; + SoftButton.KEY_TEXT = 'text'; + SoftButton.KEY_IMAGE = 'image'; + SoftButton.KEY_IS_HIGHLIGHTED = 'isHighlighted'; + SoftButton.KEY_SOFT_BUTTON_ID = 'softButtonID'; + SoftButton.KEY_SYSTEM_ACTION = 'systemAction'; + + /* eslint-disable camelcase */ + /** + * Shows an alert which typically consists of text-to-speech message and text on the display. At least either + * alertText1, alertText2 or TTSChunks need to be provided. + */ + + class Alert extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.Alert); + } + /** + * @param {String} text1 - The first line of the alert text field + * @return {Alert} + */ + + + setAlertText1(text1) { + this.setParameter(Alert.KEY_ALERT_TEXT_1, text1); + return this; + } + /** + * @return {String} + */ + + + getAlertText1() { + return this.getParameter(Alert.KEY_ALERT_TEXT_1); + } + /** + * @param {String} text2 - The second line of the alert text field + * @return {Alert} + */ + + + setAlertText2(text2) { + this.setParameter(Alert.KEY_ALERT_TEXT_2, text2); + return this; + } + /** + * @return {String} + */ + + + getAlertText2() { + return this.getParameter(Alert.KEY_ALERT_TEXT_2); + } + /** + * @param {String} text3 - The optional third line of the alert text field + * @return {Alert} + */ + + + setAlertText3(text3) { + this.setParameter(Alert.KEY_ALERT_TEXT_3, text3); + return this; + } + /** + * @return {String} + */ + + + getAlertText3() { + return this.getParameter(Alert.KEY_ALERT_TEXT_3); + } + /** + * @param {TTSChunk[]} chunks - An array of text chunks of type TTSChunk. See TTSChunk. The array must have at least + * one item. + * @return {Alert} + */ + + + setTtsChunks(chunks) { + this.validateType(TTSChunk, chunks, true); + this.setParameter(Alert.KEY_TTS_CHUNKS, chunks); + return this; + } + /** + * @return {TTSChunk[]} + */ + + + getTtsChunks() { + return this.getObject(TTSChunk, Alert.KEY_TTS_CHUNKS); + } + /** + * @param {Number} duration - Timeout in milliseconds. Typical timeouts are 3-5 seconds. If omitted, timeout is set + * to 5s. + * @return {Alert} + */ + + + setDuration(duration) { + this.setParameter(Alert.KEY_DURATION, duration); + return this; + } + /** + * @return {Number} + */ + + + getDuration() { + return this.getParameter(Alert.KEY_DURATION); + } + /** + * @param {Boolean} tone - Defines if tone should be played. Tone is played before TTS. If omitted, no tone is + * played. + * @return {Alert} + */ + + + setPlayTone(tone) { + this.setParameter(Alert.KEY_PLAY_TONE, tone); + return this; + } + /** + * @return {Boolean} + */ + + + getPlayTone() { + return this.getParameter(Alert.KEY_PLAY_TONE); + } + /** + * @param {Boolean} indicator - If supported on the given platform, the alert GUI will include some sort of + * animation indicating that loading of a feature is progressing. e.g. a spinning wheel + * or hourglass, etc. + * @return {Alert} + */ + + + setProgressIndicator(indicator) { + this.setParameter(Alert.KEY_PROGRESS_INDICATOR, indicator); + return this; + } + /** + * @return {Boolean} + */ + + + getProgressIndicator() { + return this.getParameter(Alert.KEY_PROGRESS_INDICATOR); + } + /** + * @param {SoftButton[]} buttons - App defined SoftButtons. If omitted on supported displays, the displayed alert + * shall not have any SoftButtons. + * @return {Alert} + */ + + + setSoftButtons(buttons) { + this.validateType(SoftButton, buttons, true); + this.setParameter(Alert.KEY_SOFT_BUTTONS, buttons); + return this; + } + /** + * @return {SoftButton[]} + */ + + + getSoftButtons() { + return this.getObject(SoftButton, Alert.KEY_SOFT_BUTTONS); + } + /** + * @param {Image} icon - Image struct determining whether static or dynamic icon. If omitted on supported displays, + * no (or the default if applicable) icon should be displayed. + * @return {Alert} + */ + + + setAlertIcon(icon) { + this.validateType(Image, icon); + this.setParameter(Alert.KEY_ALERT_ICON, icon); + return this; + } + /** + * @return {Image} + */ + + + getAlertIcon() { + return this.getObject(Image, Alert.KEY_ALERT_ICON); + } + /** + * @param {Number} id - An ID for this specific alert to allow cancellation through the `CancelInteraction` RPC. + * @return {Alert} + */ + + + setCancelID(id) { + this.setParameter(Alert.KEY_CANCEL_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getCancelID() { + return this.getParameter(Alert.KEY_CANCEL_ID); + } + + } + + Alert.KEY_ALERT_TEXT_1 = 'alertText1'; + Alert.KEY_ALERT_TEXT_2 = 'alertText2'; + Alert.KEY_ALERT_TEXT_3 = 'alertText3'; + Alert.KEY_TTS_CHUNKS = 'ttsChunks'; + Alert.KEY_DURATION = 'duration'; + Alert.KEY_PLAY_TONE = 'playTone'; + Alert.KEY_PROGRESS_INDICATOR = 'progressIndicator'; + Alert.KEY_SOFT_BUTTONS = 'softButtons'; + Alert.KEY_ALERT_ICON = 'alertIcon'; + Alert.KEY_CANCEL_ID = 'cancelID'; + + /* eslint-disable camelcase */ + + class AlertResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.Alert); + } + /** + * @param {Number} time - Amount of time (in seconds) that an app must wait before resending an alert. If provided, + * another system event or overlay currently has a higher priority than this alert. An app + * must not send an alert without waiting at least the amount of time dictated. + * @return {AlertResponse} + */ + + + setTryAgainTime(time) { + this.setParameter(AlertResponse.KEY_TRY_AGAIN_TIME, time); + return this; + } + /** + * @return {Number} + */ + + + getTryAgainTime() { + return this.getParameter(AlertResponse.KEY_TRY_AGAIN_TIME); + } + + } + + AlertResponse.KEY_TRY_AGAIN_TIME = 'tryAgainTime'; + + /* eslint-disable camelcase */ + /** + * The list of possible alignments, left, right, or centered + * @typedef {Enum} TextAlignment + * @property {Object} _MAP + */ + + class TextAlignment extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get LEFT_ALIGNED() { + return TextAlignment._MAP.LEFT_ALIGNED; + } + /** + * @return {String} + */ + + + static get RIGHT_ALIGNED() { + return TextAlignment._MAP.RIGHT_ALIGNED; + } + /** + * @return {String} + */ + + + static get CENTERED() { + return TextAlignment._MAP.CENTERED; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return TextAlignment._valueForKey(key, TextAlignment._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return TextAlignment._keyForValue(value, TextAlignment._MAP); + } + + } + + TextAlignment._MAP = Object.freeze({ + 'LEFT_ALIGNED': 'LEFT_ALIGNED', + 'RIGHT_ALIGNED': 'RIGHT_ALIGNED', + 'CENTERED': 'CENTERED' + }); + + /* eslint-disable camelcase */ + + class TemplateConfiguration extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} template - Predefined or dynamically created window template. Currently only predefined window + * template layouts are defined. + * @return {TemplateConfiguration} + */ + + + setTemplate(template) { + this.setParameter(TemplateConfiguration.KEY_TEMPLATE, template); + return this; + } + /** + * @return {String} + */ + + + getTemplate() { + return this.getParameter(TemplateConfiguration.KEY_TEMPLATE); + } + /** + * @param {TemplateColorScheme} scheme - A color scheme for all display layout templates. + * @return {TemplateConfiguration} + */ + + + setDayColorScheme(scheme) { + this.validateType(TemplateColorScheme, scheme); + this.setParameter(TemplateConfiguration.KEY_DAY_COLOR_SCHEME, scheme); + return this; + } + /** + * @return {TemplateColorScheme} + */ + + + getDayColorScheme() { + return this.getObject(TemplateColorScheme, TemplateConfiguration.KEY_DAY_COLOR_SCHEME); + } + /** + * @param {TemplateColorScheme} scheme - A color scheme for all display layout templates. + * @return {TemplateConfiguration} + */ + + + setNightColorScheme(scheme) { + this.validateType(TemplateColorScheme, scheme); + this.setParameter(TemplateConfiguration.KEY_NIGHT_COLOR_SCHEME, scheme); + return this; + } + /** + * @return {TemplateColorScheme} + */ + + + getNightColorScheme() { + return this.getObject(TemplateColorScheme, TemplateConfiguration.KEY_NIGHT_COLOR_SCHEME); + } + + } + + TemplateConfiguration.KEY_TEMPLATE = 'template'; + TemplateConfiguration.KEY_DAY_COLOR_SCHEME = 'dayColorScheme'; + TemplateConfiguration.KEY_NIGHT_COLOR_SCHEME = 'nightColorScheme'; + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} MetadataType + * @property {Object} _MAP + */ + + class MetadataType extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * The data in this field contains the title of the currently playing audio track. + * @return {String} + */ + + + static get mediaTitle() { + return MetadataType._MAP.mediaTitle; + } + /** + * The data in this field contains the artist or creator of the currently playing audio track. + * @return {String} + */ + + + static get mediaArtist() { + return MetadataType._MAP.mediaArtist; + } + /** + * The data in this field contains the album title of the currently playing audio track. + * @return {String} + */ + + + static get mediaAlbum() { + return MetadataType._MAP.mediaAlbum; + } + /** + * The data in this field contains the creation year of the currently playing audio track. + * @return {String} + */ + + + static get mediaYear() { + return MetadataType._MAP.mediaYear; + } + /** + * The data in this field contains the genre of the currently playing audio track. + * @return {String} + */ + + + static get mediaGenre() { + return MetadataType._MAP.mediaGenre; + } + /** + * The data in this field contains the name of the current source for the media. + * @return {String} + */ + + + static get mediaStation() { + return MetadataType._MAP.mediaStation; + } + /** + * The data in this field is a rating. + * @return {String} + */ + + + static get rating() { + return MetadataType._MAP.rating; + } + /** + * The data in this field is the current temperature. + * @return {String} + */ + + + static get currentTemperature() { + return MetadataType._MAP.currentTemperature; + } + /** + * The data in this field is the maximum temperature for the day. + * @return {String} + */ + + + static get maximumTemperature() { + return MetadataType._MAP.maximumTemperature; + } + /** + * The data in this field is the minimum temperature for the day. + * @return {String} + */ + + + static get minimumTemperature() { + return MetadataType._MAP.minimumTemperature; + } + /** + * The data in this field describes the current weather (ex. cloudy, clear, etc.). + * @return {String} + */ + + + static get weatherTerm() { + return MetadataType._MAP.weatherTerm; + } + /** + * The data in this field describes the current humidity value. + * @return {String} + */ + + + static get humidity() { + return MetadataType._MAP.humidity; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return MetadataType._valueForKey(key, MetadataType._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return MetadataType._keyForValue(value, MetadataType._MAP); + } + + } + + MetadataType._MAP = Object.freeze({ + 'mediaTitle': 'mediaTitle', + 'mediaArtist': 'mediaArtist', + 'mediaAlbum': 'mediaAlbum', + 'mediaYear': 'mediaYear', + 'mediaGenre': 'mediaGenre', + 'mediaStation': 'mediaStation', + 'rating': 'rating', + 'currentTemperature': 'currentTemperature', + 'maximumTemperature': 'maximumTemperature', + 'minimumTemperature': 'minimumTemperature', + 'weatherTerm': 'weatherTerm', + 'humidity': 'humidity' + }); + + /* eslint-disable camelcase */ + + class MetadataTags extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {MetadataType[]} field1 - The type of data contained in the "mainField1" text field. + * @return {MetadataTags} + */ + + + setMainField1(field1) { + this.validateType(MetadataType, field1, true); + this.setParameter(MetadataTags.KEY_MAIN_FIELD_1, field1); + return this; + } + /** + * @return {MetadataType[]} + */ + + + getMainField1() { + return this.getObject(MetadataType, MetadataTags.KEY_MAIN_FIELD_1); + } + /** + * @param {MetadataType[]} field2 - The type of data contained in the "mainField2" text field. + * @return {MetadataTags} + */ + + + setMainField2(field2) { + this.validateType(MetadataType, field2, true); + this.setParameter(MetadataTags.KEY_MAIN_FIELD_2, field2); + return this; + } + /** + * @return {MetadataType[]} + */ + + + getMainField2() { + return this.getObject(MetadataType, MetadataTags.KEY_MAIN_FIELD_2); + } + /** + * @param {MetadataType[]} field3 - The type of data contained in the "mainField3" text field. + * @return {MetadataTags} + */ + + + setMainField3(field3) { + this.validateType(MetadataType, field3, true); + this.setParameter(MetadataTags.KEY_MAIN_FIELD_3, field3); + return this; + } + /** + * @return {MetadataType[]} + */ + + + getMainField3() { + return this.getObject(MetadataType, MetadataTags.KEY_MAIN_FIELD_3); + } + /** + * @param {MetadataType[]} field4 - The type of data contained in the "mainField4" text field. + * @return {MetadataTags} + */ + + + setMainField4(field4) { + this.validateType(MetadataType, field4, true); + this.setParameter(MetadataTags.KEY_MAIN_FIELD_4, field4); + return this; + } + /** + * @return {MetadataType[]} + */ + + + getMainField4() { + return this.getObject(MetadataType, MetadataTags.KEY_MAIN_FIELD_4); + } + + } + + MetadataTags.KEY_MAIN_FIELD_1 = 'mainField1'; + MetadataTags.KEY_MAIN_FIELD_2 = 'mainField2'; + MetadataTags.KEY_MAIN_FIELD_3 = 'mainField3'; + MetadataTags.KEY_MAIN_FIELD_4 = 'mainField4'; + + /* eslint-disable camelcase */ + /** + * Updates the persistent display. Supported fields depend on display capabilities. + */ + + class Show extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.Show); + } + /** + * @param {String} field1 - The text that should be displayed in a single or upper display line. If this text is not + * set, the text of mainField1 stays unchanged. If this text is empty "", the field will be + * cleared. + * @return {Show} + */ + + + setMainField1(field1) { + this.setParameter(Show.KEY_MAIN_FIELD_1, field1); + return this; + } + /** + * @return {String} + */ + + + getMainField1() { + return this.getParameter(Show.KEY_MAIN_FIELD_1); + } + /** + * @param {String} field2 - The text that should be displayed on the second display line. If this text is not set, + * the text of mainField2 stays unchanged. If this text is empty "", the field will be + * cleared. + * @return {Show} + */ + + + setMainField2(field2) { + this.setParameter(Show.KEY_MAIN_FIELD_2, field2); + return this; + } + /** + * @return {String} + */ + + + getMainField2() { + return this.getParameter(Show.KEY_MAIN_FIELD_2); + } + /** + * @param {String} field3 - The text that should be displayed on the second "page" first display line. If this text + * is not set, the text of mainField3 stays unchanged. If this text is empty "", the field + * will be cleared. + * @return {Show} + */ + + + setMainField3(field3) { + this.setParameter(Show.KEY_MAIN_FIELD_3, field3); + return this; + } + /** + * @return {String} + */ + + + getMainField3() { + return this.getParameter(Show.KEY_MAIN_FIELD_3); + } + /** + * @param {String} field4 - The text that should be displayed on the second "page" second display line. If this text + * is not set, the text of mainField4 stays unchanged. If this text is empty "", the field + * will be cleared. + * @return {Show} + */ + + + setMainField4(field4) { + this.setParameter(Show.KEY_MAIN_FIELD_4, field4); + return this; + } + /** + * @return {String} + */ + + + getMainField4() { + return this.getParameter(Show.KEY_MAIN_FIELD_4); + } + /** + * @param {TextAlignment} alignment - Specifies how mainField1 and mainField2 texts should be aligned on display. If + * omitted, texts will be centered. + * @return {Show} + */ + + + setAlignment(alignment) { + this.validateType(TextAlignment, alignment); + this.setParameter(Show.KEY_ALIGNMENT, alignment); + return this; + } + /** + * @return {TextAlignment} + */ + + + getAlignment() { + return this.getObject(TextAlignment, Show.KEY_ALIGNMENT); + } + /** + * @param {String} bar - Requires investigation regarding the nav display capabilities. Potentially lower + * lowerStatusBar, upperStatusBar, titleBar, etc. + * @return {Show} + */ + + + setStatusBar(bar) { + this.setParameter(Show.KEY_STATUS_BAR, bar); + return this; + } + /** + * @return {String} + */ + + + getStatusBar() { + return this.getParameter(Show.KEY_STATUS_BAR); + } + /** + * @param {String} clock - Text value for MediaClock field. Has to be properly formatted by Mobile App according to + * the module's capabilities. If this text is set, any automatic media clock updates + * previously set with SetMediaClockTimer will be stopped. + * @return {Show} + */ + + + setMediaClock(clock) { + this.setParameter(Show.KEY_MEDIA_CLOCK, clock); + return this; + } + /** + * @return {String} + */ + + + getMediaClock() { + return this.getParameter(Show.KEY_MEDIA_CLOCK); + } + /** + * @param {String} track - The text that should be displayed in the track field. If this text is not set, the text + * of mediaTrack stays unchanged. If this text is empty "", the field will be cleared. + * @return {Show} + */ + + + setMediaTrack(track) { + this.setParameter(Show.KEY_MEDIA_TRACK, track); + return this; + } + /** + * @return {String} + */ + + + getMediaTrack() { + return this.getParameter(Show.KEY_MEDIA_TRACK); + } + /** + * @param {Image} graphic - Image struct determining whether static or dynamic image to display in app. If omitted + * on supported displays, the displayed graphic shall not change. + * @return {Show} + */ + + + setGraphic(graphic) { + this.validateType(Image, graphic); + this.setParameter(Show.KEY_GRAPHIC, graphic); + return this; + } + /** + * @return {Image} + */ + + + getGraphic() { + return this.getObject(Image, Show.KEY_GRAPHIC); + } + /** + * @param {Image} graphic - Image struct determining whether static or dynamic secondary image to display in app. If + * omitted on supported displays, the displayed secondary graphic shall not change. + * @return {Show} + */ + + + setSecondaryGraphic(graphic) { + this.validateType(Image, graphic); + this.setParameter(Show.KEY_SECONDARY_GRAPHIC, graphic); + return this; + } + /** + * @return {Image} + */ + + + getSecondaryGraphic() { + return this.getObject(Image, Show.KEY_SECONDARY_GRAPHIC); + } + /** + * @param {SoftButton[]} buttons - App defined SoftButtons. If omitted on supported displays, the currently + * displayed SoftButton values will not change. + * @return {Show} + */ + + + setSoftButtons(buttons) { + this.validateType(SoftButton, buttons, true); + this.setParameter(Show.KEY_SOFT_BUTTONS, buttons); + return this; + } + /** + * @return {SoftButton[]} + */ + + + getSoftButtons() { + return this.getObject(SoftButton, Show.KEY_SOFT_BUTTONS); + } + /** + * @param {String[]} presets - App labeled on-screen presets (i.e. on-screen media presets or dynamic search + * suggestions). If omitted on supported displays, the presets will be shown as not + * defined. + * @return {Show} + */ + + + setCustomPresets(presets) { + this.setParameter(Show.KEY_CUSTOM_PRESETS, presets); + return this; + } + /** + * @return {String[]} + */ + + + getCustomPresets() { + return this.getParameter(Show.KEY_CUSTOM_PRESETS); + } + /** + * @param {MetadataTags} tags - App defined metadata information. See MetadataStruct. Uses mainField1, mainField2, + * mainField3, mainField4. If omitted on supported displays, the currently set metadata + * tags will not change. If any text field contains no tags or the none tag, the + * metadata tag for that textfield should be removed. + * @return {Show} + */ + + + setMetadataTags(tags) { + this.validateType(MetadataTags, tags); + this.setParameter(Show.KEY_METADATA_TAGS, tags); + return this; + } + /** + * @return {MetadataTags} + */ + + + getMetadataTags() { + return this.getObject(MetadataTags, Show.KEY_METADATA_TAGS); + } + /** + * @param {String} title - The title of the new template that will be displayed. How this will be displayed is + * dependent on the OEM design and implementation of the template. + * @return {Show} + */ + + + setTemplateTitle(title) { + this.setParameter(Show.KEY_TEMPLATE_TITLE, title); + return this; + } + /** + * @return {String} + */ + + + getTemplateTitle() { + return this.getParameter(Show.KEY_TEMPLATE_TITLE); + } + /** + * @param {Number} id - This is the unique ID assigned to the window that this RPC is intended. If this param is not + * included, it will be assumed that this request is specifically for the main window on the + * main display. See PredefinedWindows enum. + * @return {Show} + */ + + + setWindowID(id) { + this.setParameter(Show.KEY_WINDOW_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getWindowID() { + return this.getParameter(Show.KEY_WINDOW_ID); + } + /** + * @param {TemplateConfiguration} configuration - Used to set an alternate template layout to a window. + * @return {Show} + */ + + + setTemplateConfiguration(configuration) { + this.validateType(TemplateConfiguration, configuration); + this.setParameter(Show.KEY_TEMPLATE_CONFIGURATION, configuration); + return this; + } + /** + * @return {TemplateConfiguration} + */ + + + getTemplateConfiguration() { + return this.getObject(TemplateConfiguration, Show.KEY_TEMPLATE_CONFIGURATION); + } + + } + + Show.KEY_MAIN_FIELD_1 = 'mainField1'; + Show.KEY_MAIN_FIELD_2 = 'mainField2'; + Show.KEY_MAIN_FIELD_3 = 'mainField3'; + Show.KEY_MAIN_FIELD_4 = 'mainField4'; + Show.KEY_ALIGNMENT = 'alignment'; + Show.KEY_STATUS_BAR = 'statusBar'; + Show.KEY_MEDIA_CLOCK = 'mediaClock'; + Show.KEY_MEDIA_TRACK = 'mediaTrack'; + Show.KEY_GRAPHIC = 'graphic'; + Show.KEY_SECONDARY_GRAPHIC = 'secondaryGraphic'; + Show.KEY_SOFT_BUTTONS = 'softButtons'; + Show.KEY_CUSTOM_PRESETS = 'customPresets'; + Show.KEY_METADATA_TAGS = 'metadataTags'; + Show.KEY_TEMPLATE_TITLE = 'templateTitle'; + Show.KEY_WINDOW_ID = 'windowID'; + Show.KEY_TEMPLATE_CONFIGURATION = 'templateConfiguration'; + + /* eslint-disable camelcase */ + + class ShowResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.Show); + } + + } + + /* eslint-disable camelcase */ + /** + * Speaks a text. + */ + + class Speak extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.Speak); + } + /** + * @param {TTSChunk[]} chunks - An array of text chunks of type TTSChunk. See TTSChunk. The array must have at least + * one item. + * @return {Speak} + */ + + + setTtsChunks(chunks) { + this.validateType(TTSChunk, chunks, true); + this.setParameter(Speak.KEY_TTS_CHUNKS, chunks); + return this; + } + /** + * @return {TTSChunk[]} + */ + + + getTtsChunks() { + return this.getObject(TTSChunk, Speak.KEY_TTS_CHUNKS); + } + + } + + Speak.KEY_TTS_CHUNKS = 'ttsChunks'; + + /* eslint-disable camelcase */ + + class SpeakResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.Speak); + } + + } + + /* eslint-disable camelcase */ + + class StartTime extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} hours - The hour of the media clock. Some radios only support a max of 19 hours. If out of range, + * it will be rejected. + * @return {StartTime} + */ + + + setHours(hours) { + this.setParameter(StartTime.KEY_HOURS, hours); + return this; + } + /** + * @return {Number} + */ + + + getHours() { + return this.getParameter(StartTime.KEY_HOURS); + } + /** + * @param {Number} minutes + * @return {StartTime} + */ + + + setMinutes(minutes) { + this.setParameter(StartTime.KEY_MINUTES, minutes); + return this; + } + /** + * @return {Number} + */ + + + getMinutes() { + return this.getParameter(StartTime.KEY_MINUTES); + } + /** + * @param {Number} seconds + * @return {StartTime} + */ + + + setSeconds(seconds) { + this.setParameter(StartTime.KEY_SECONDS, seconds); + return this; + } + /** + * @return {Number} + */ + + + getSeconds() { + return this.getParameter(StartTime.KEY_SECONDS); + } + + } + + StartTime.KEY_HOURS = 'hours'; + StartTime.KEY_MINUTES = 'minutes'; + StartTime.KEY_SECONDS = 'seconds'; + + /* eslint-disable camelcase */ + /** + * Describes how the media clock timer should behave on the platform + * @typedef {Enum} UpdateMode + * @property {Object} _MAP + */ + + class UpdateMode extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * Starts the media clock timer counting upwards, as in time elapsed. + * @return {String} + */ + + + static get COUNTUP() { + return UpdateMode._MAP.COUNTUP; + } + /** + * Starts the media clock timer counting downwards, as in time remaining. + * @return {String} + */ + + + static get COUNTDOWN() { + return UpdateMode._MAP.COUNTDOWN; + } + /** + * Pauses the media clock timer + * @return {String} + */ + + + static get PAUSE() { + return UpdateMode._MAP.PAUSE; + } + /** + * Resume the media clock timer + * @return {String} + */ + + + static get RESUME() { + return UpdateMode._MAP.RESUME; + } + /** + * Clears the media clock timer (previously done through Show->mediaClock) + * @return {String} + */ + + + static get CLEAR() { + return UpdateMode._MAP.CLEAR; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return UpdateMode._valueForKey(key, UpdateMode._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return UpdateMode._keyForValue(value, UpdateMode._MAP); + } + + } + + UpdateMode._MAP = Object.freeze({ + 'COUNTUP': 'COUNTUP', + 'COUNTDOWN': 'COUNTDOWN', + 'PAUSE': 'PAUSE', + 'RESUME': 'RESUME', + 'CLEAR': 'CLEAR' + }); + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} AudioStreamingIndicator + * @property {Object} _MAP + */ + + class AudioStreamingIndicator extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * Default playback indicator. By default the playback indicator should be PLAY_PAUSE when: - the media app is + * newly registered on the head unit (after RegisterAppInterface) - the media app was closed by the user (App + * enters HMI_NONE) - the app sends SetMediaClockTimer with audioStreamingIndicator not set to any value + * @return {String} + */ + + + static get PLAY_PAUSE() { + return AudioStreamingIndicator._MAP.PLAY_PAUSE; + } + /** + * Indicates that a button press of the Play/Pause button starts the audio playback. + * @return {String} + */ + + + static get PLAY() { + return AudioStreamingIndicator._MAP.PLAY; + } + /** + * Indicates that a button press of the Play/Pause button pauses the current audio playback. + * @return {String} + */ + + + static get PAUSE() { + return AudioStreamingIndicator._MAP.PAUSE; + } + /** + * Indicates that a button press of the Play/Pause button stops the current audio playback. + * @return {String} + */ + + + static get STOP() { + return AudioStreamingIndicator._MAP.STOP; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return AudioStreamingIndicator._valueForKey(key, AudioStreamingIndicator._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return AudioStreamingIndicator._keyForValue(value, AudioStreamingIndicator._MAP); + } + + } + + AudioStreamingIndicator._MAP = Object.freeze({ + 'PLAY_PAUSE': 'PLAY_PAUSE', + 'PLAY': 'PLAY', + 'PAUSE': 'PAUSE', + 'STOP': 'STOP' + }); + + /* eslint-disable camelcase */ + /** + * Sets the initial media clock value and automatic update method. + */ + + class SetMediaClockTimer extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SetMediaClockTimer); + } + /** + * @param {StartTime} time - See StartTime. startTime must be provided for "COUNTUP" and "COUNTDOWN". startTime will + * be ignored for "RESUME", and "CLEAR" startTime can be sent for "PAUSE", in which case + * it will update the paused startTime + * @return {SetMediaClockTimer} + */ + + + setStartTime(time) { + this.validateType(StartTime, time); + this.setParameter(SetMediaClockTimer.KEY_START_TIME, time); + return this; + } + /** + * @return {StartTime} + */ + + + getStartTime() { + return this.getObject(StartTime, SetMediaClockTimer.KEY_START_TIME); + } + /** + * @param {StartTime} time - See StartTime. endTime can be provided for "COUNTUP" and "COUNTDOWN"; to be used to + * calculate any visual progress bar (if not provided, this feature is ignored) If endTime + * is greater then startTime for COUNTDOWN or less than startTime for COUNTUP, then the + * request will return an INVALID_DATA. endTime will be ignored for "RESUME", and "CLEAR" + * endTime can be sent for "PAUSE", in which case it will update the paused endTime + * @return {SetMediaClockTimer} + */ + + + setEndTime(time) { + this.validateType(StartTime, time); + this.setParameter(SetMediaClockTimer.KEY_END_TIME, time); + return this; + } + /** + * @return {StartTime} + */ + + + getEndTime() { + return this.getObject(StartTime, SetMediaClockTimer.KEY_END_TIME); + } + /** + * @param {UpdateMode} mode - Enumeration to control the media clock. In case of pause, resume, or clear, the start + * time value is ignored and shall be left out. For resume, the time continues with the + * same value as it was when paused. + * @return {SetMediaClockTimer} + */ + + + setUpdateMode(mode) { + this.validateType(UpdateMode, mode); + this.setParameter(SetMediaClockTimer.KEY_UPDATE_MODE, mode); + return this; + } + /** + * @return {UpdateMode} + */ + + + getUpdateMode() { + return this.getObject(UpdateMode, SetMediaClockTimer.KEY_UPDATE_MODE); + } + /** + * @param {AudioStreamingIndicator} indicator - Enumeration for the indicator icon on a play/pause button. see + * AudioStreamingIndicator. + * @return {SetMediaClockTimer} + */ + + + setAudioStreamingIndicator(indicator) { + this.validateType(AudioStreamingIndicator, indicator); + this.setParameter(SetMediaClockTimer.KEY_AUDIO_STREAMING_INDICATOR, indicator); + return this; + } + /** + * @return {AudioStreamingIndicator} + */ + + + getAudioStreamingIndicator() { + return this.getObject(AudioStreamingIndicator, SetMediaClockTimer.KEY_AUDIO_STREAMING_INDICATOR); + } + + } + + SetMediaClockTimer.KEY_START_TIME = 'startTime'; + SetMediaClockTimer.KEY_END_TIME = 'endTime'; + SetMediaClockTimer.KEY_UPDATE_MODE = 'updateMode'; + SetMediaClockTimer.KEY_AUDIO_STREAMING_INDICATOR = 'audioStreamingIndicator'; + + /* eslint-disable camelcase */ + + class SetMediaClockTimerResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SetMediaClockTimer); + } + + } + + /* eslint-disable camelcase */ + /** + * Starts audio pass thru session + */ + + class PerformAudioPassThru extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.PerformAudioPassThru); + } + /** + * @param {TTSChunk[]} prompt - The module will speak this prompt before opening the audio pass thru session. An + * array of text chunks of type TTSChunk. See TTSChunk. The array must have at least + * one item. If omitted, then no initial prompt is spoken. + * @return {PerformAudioPassThru} + */ + + + setInitialPrompt(prompt) { + this.validateType(TTSChunk, prompt, true); + this.setParameter(PerformAudioPassThru.KEY_INITIAL_PROMPT, prompt); + return this; + } + /** + * @return {TTSChunk[]} + */ + + + getInitialPrompt() { + return this.getObject(TTSChunk, PerformAudioPassThru.KEY_INITIAL_PROMPT); + } + /** + * @param {String} text1 - First line of text displayed during audio capture. + * @return {PerformAudioPassThru} + */ + + + setAudioPassThruDisplayText1(text1) { + this.setParameter(PerformAudioPassThru.KEY_AUDIO_PASS_THRU_DISPLAY_TEXT_1, text1); + return this; + } + /** + * @return {String} + */ + + + getAudioPassThruDisplayText1() { + return this.getParameter(PerformAudioPassThru.KEY_AUDIO_PASS_THRU_DISPLAY_TEXT_1); + } + /** + * @param {String} text2 - Second line of text displayed during audio capture. + * @return {PerformAudioPassThru} + */ + + + setAudioPassThruDisplayText2(text2) { + this.setParameter(PerformAudioPassThru.KEY_AUDIO_PASS_THRU_DISPLAY_TEXT_2, text2); + return this; + } + /** + * @return {String} + */ + + + getAudioPassThruDisplayText2() { + return this.getParameter(PerformAudioPassThru.KEY_AUDIO_PASS_THRU_DISPLAY_TEXT_2); + } + /** + * @param {SamplingRate} rate - This value shall be allowed at 8 kHz or 16 or 22 or 44 kHz. + * @return {PerformAudioPassThru} + */ + + + setSamplingRate(rate) { + this.validateType(SamplingRate, rate); + this.setParameter(PerformAudioPassThru.KEY_SAMPLING_RATE, rate); + return this; + } + /** + * @return {SamplingRate} + */ + + + getSamplingRate() { + return this.getObject(SamplingRate, PerformAudioPassThru.KEY_SAMPLING_RATE); + } + /** + * @param {Number} duration - The maximum duration of audio recording in milliseconds. + * @return {PerformAudioPassThru} + */ + + + setMaxDuration(duration) { + this.setParameter(PerformAudioPassThru.KEY_MAX_DURATION, duration); + return this; + } + /** + * @return {Number} + */ + + + getMaxDuration() { + return this.getParameter(PerformAudioPassThru.KEY_MAX_DURATION); + } + /** + * @param {BitsPerSample} sample - Specifies the quality the audio is recorded. Currently 8 bit or 16 bit. + * @return {PerformAudioPassThru} + */ + + + setBitsPerSample(sample) { + this.validateType(BitsPerSample, sample); + this.setParameter(PerformAudioPassThru.KEY_BITS_PER_SAMPLE, sample); + return this; + } + /** + * @return {BitsPerSample} + */ + + + getBitsPerSample() { + return this.getObject(BitsPerSample, PerformAudioPassThru.KEY_BITS_PER_SAMPLE); + } + /** + * @param {AudioType} type - Specifies the type of audio data being requested. + * @return {PerformAudioPassThru} + */ + + + setAudioType(type) { + this.validateType(AudioType, type); + this.setParameter(PerformAudioPassThru.KEY_AUDIO_TYPE, type); + return this; + } + /** + * @return {AudioType} + */ + + + getAudioType() { + return this.getObject(AudioType, PerformAudioPassThru.KEY_AUDIO_TYPE); + } + /** + * @param {Boolean} audio - Defines if the current audio source should be muted during the APT session. If not, the + * audio source will play without interruption. If omitted, the value is set to true. + * @return {PerformAudioPassThru} + */ + + + setMuteAudio(audio) { + this.setParameter(PerformAudioPassThru.KEY_MUTE_AUDIO, audio); + return this; + } + /** + * @return {Boolean} + */ + + + getMuteAudio() { + return this.getParameter(PerformAudioPassThru.KEY_MUTE_AUDIO); + } + + } + + PerformAudioPassThru.KEY_INITIAL_PROMPT = 'initialPrompt'; + PerformAudioPassThru.KEY_AUDIO_PASS_THRU_DISPLAY_TEXT_1 = 'audioPassThruDisplayText1'; + PerformAudioPassThru.KEY_AUDIO_PASS_THRU_DISPLAY_TEXT_2 = 'audioPassThruDisplayText2'; + PerformAudioPassThru.KEY_SAMPLING_RATE = 'samplingRate'; + PerformAudioPassThru.KEY_MAX_DURATION = 'maxDuration'; + PerformAudioPassThru.KEY_BITS_PER_SAMPLE = 'bitsPerSample'; + PerformAudioPassThru.KEY_AUDIO_TYPE = 'audioType'; + PerformAudioPassThru.KEY_MUTE_AUDIO = 'muteAudio'; + + /* eslint-disable camelcase */ + + class PerformAudioPassThruResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.PerformAudioPassThru); + } + + } + + /* eslint-disable camelcase */ + /** + * When this request is invoked, the audio capture stops. + */ + + class EndAudioPassThru extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.EndAudioPassThru); + } + + } + + /* eslint-disable camelcase */ + + class EndAudioPassThruResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.EndAudioPassThru); + } + + } + + /* eslint-disable camelcase */ + /** + * Subscribes to built-in HMI buttons. The application will be notified by the OnButtonEvent and OnButtonPress. To + * unsubscribe the notifications, use unsubscribeButton. + */ + + class SubscribeButton extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SubscribeButton); + } + /** + * @param {ButtonName} name - Name of the button to subscribe. + * @return {SubscribeButton} + */ + + + setButtonName(name) { + this.validateType(ButtonName, name); + this.setParameter(SubscribeButton.KEY_BUTTON_NAME, name); + return this; + } + /** + * @return {ButtonName} + */ + + + getButtonName() { + return this.getObject(ButtonName, SubscribeButton.KEY_BUTTON_NAME); + } + + } + + SubscribeButton.KEY_BUTTON_NAME = 'buttonName'; + + /* eslint-disable camelcase */ + + class SubscribeButtonResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SubscribeButton); + } + + } + + /* eslint-disable camelcase */ + /** + * Unsubscribes from built-in HMI buttons. + */ + + class UnsubscribeButton extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.UnsubscribeButton); + } + /** + * @param {ButtonName} name - Name of the button to unsubscribe. + * @return {UnsubscribeButton} + */ + + + setButtonName(name) { + this.validateType(ButtonName, name); + this.setParameter(UnsubscribeButton.KEY_BUTTON_NAME, name); + return this; + } + /** + * @return {ButtonName} + */ + + + getButtonName() { + return this.getObject(ButtonName, UnsubscribeButton.KEY_BUTTON_NAME); + } + + } + + UnsubscribeButton.KEY_BUTTON_NAME = 'buttonName'; + + /* eslint-disable camelcase */ + + class UnsubscribeButtonResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.UnsubscribeButton); + } + + } + + /* eslint-disable camelcase */ + /** + * Subscribes for specific published data items. The data will be only sent if it has changed. The application will be + * notified by the onVehicleData notification whenever new data is available. To unsubscribe the notifications, use + * unsubscribe with the same subscriptionType. + */ + + class SubscribeVehicleData extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SubscribeVehicleData); + } + /** + * @param {Boolean} gps - See GPSData + * @return {SubscribeVehicleData} + */ + + + setGps(gps) { + this.setParameter(SubscribeVehicleData.KEY_GPS, gps); + return this; + } + /** + * @return {Boolean} + */ + + + getGps() { + return this.getParameter(SubscribeVehicleData.KEY_GPS); + } + /** + * @param {Boolean} speed - The vehicle speed in kilometers per hour + * @return {SubscribeVehicleData} + */ + + + setSpeed(speed) { + this.setParameter(SubscribeVehicleData.KEY_SPEED, speed); + return this; + } + /** + * @return {Boolean} + */ + + + getSpeed() { + return this.getParameter(SubscribeVehicleData.KEY_SPEED); + } + /** + * @param {Boolean} rpm - The number of revolutions per minute of the engine + * @return {SubscribeVehicleData} + */ + + + setRpm(rpm) { + this.setParameter(SubscribeVehicleData.KEY_RPM, rpm); + return this; + } + /** + * @return {Boolean} + */ + + + getRpm() { + return this.getParameter(SubscribeVehicleData.KEY_RPM); + } + /** + * @param {Boolean} level - The fuel level in the tank (percentage) + * @return {SubscribeVehicleData} + */ + + + setFuelLevel(level) { + this.setParameter(SubscribeVehicleData.KEY_FUEL_LEVEL, level); + return this; + } + /** + * @return {Boolean} + */ + + + getFuelLevel() { + return this.getParameter(SubscribeVehicleData.KEY_FUEL_LEVEL); + } + /** + * @param {Boolean} level_state - The fuel level state + * @return {SubscribeVehicleData} + */ + + + setFuelLevel_State(level_state) { + this.setParameter(SubscribeVehicleData.KEY_FUEL_LEVEL_STATE, level_state); + return this; + } + /** + * @return {Boolean} + */ + + + getFuelLevel_State() { + return this.getParameter(SubscribeVehicleData.KEY_FUEL_LEVEL_STATE); + } + /** + * @param {Boolean} consumption - The instantaneous fuel consumption in microlitres + * @return {SubscribeVehicleData} + */ + + + setInstantFuelConsumption(consumption) { + this.setParameter(SubscribeVehicleData.KEY_INSTANT_FUEL_CONSUMPTION, consumption); + return this; + } + /** + * @return {Boolean} + */ + + + getInstantFuelConsumption() { + return this.getParameter(SubscribeVehicleData.KEY_INSTANT_FUEL_CONSUMPTION); + } + /** + * @param {Boolean} range - The estimate range in KM the vehicle can travel based on fuel level and consumption + * @return {SubscribeVehicleData} + */ + + + setFuelRange(range) { + this.setParameter(SubscribeVehicleData.KEY_FUEL_RANGE, range); + return this; + } + /** + * @return {Boolean} + */ + + + getFuelRange() { + return this.getParameter(SubscribeVehicleData.KEY_FUEL_RANGE); + } + /** + * @param {Boolean} temperature - The external temperature in degrees celsius + * @return {SubscribeVehicleData} + */ + + + setExternalTemperature(temperature) { + this.setParameter(SubscribeVehicleData.KEY_EXTERNAL_TEMPERATURE, temperature); + return this; + } + /** + * @return {Boolean} + */ + + + getExternalTemperature() { + return this.getParameter(SubscribeVehicleData.KEY_EXTERNAL_TEMPERATURE); + } + /** + * @param {Boolean} signal - See TurnSignal + * @return {SubscribeVehicleData} + */ + + + setTurnSignal(signal) { + this.setParameter(SubscribeVehicleData.KEY_TURN_SIGNAL, signal); + return this; + } + /** + * @return {Boolean} + */ + + + getTurnSignal() { + return this.getParameter(SubscribeVehicleData.KEY_TURN_SIGNAL); + } + /** + * @param {Boolean} prndl - See PRNDL + * @return {SubscribeVehicleData} + */ + + + setPrndl(prndl) { + this.setParameter(SubscribeVehicleData.KEY_PRNDL, prndl); + return this; + } + /** + * @return {Boolean} + */ + + + getPrndl() { + return this.getParameter(SubscribeVehicleData.KEY_PRNDL); + } + /** + * @param {Boolean} pressure - See TireStatus + * @return {SubscribeVehicleData} + */ + + + setTirePressure(pressure) { + this.setParameter(SubscribeVehicleData.KEY_TIRE_PRESSURE, pressure); + return this; + } + /** + * @return {Boolean} + */ + + + getTirePressure() { + return this.getParameter(SubscribeVehicleData.KEY_TIRE_PRESSURE); + } + /** + * @param {Boolean} odometer - Odometer in km + * @return {SubscribeVehicleData} + */ + + + setOdometer(odometer) { + this.setParameter(SubscribeVehicleData.KEY_ODOMETER, odometer); + return this; + } + /** + * @return {Boolean} + */ + + + getOdometer() { + return this.getParameter(SubscribeVehicleData.KEY_ODOMETER); + } + /** + * @param {Boolean} status - The status of the seat belts + * @return {SubscribeVehicleData} + */ + + + setBeltStatus(status) { + this.setParameter(SubscribeVehicleData.KEY_BELT_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getBeltStatus() { + return this.getParameter(SubscribeVehicleData.KEY_BELT_STATUS); + } + /** + * @param {Boolean} information - The body information including power modes + * @return {SubscribeVehicleData} + */ + + + setBodyInformation(information) { + this.setParameter(SubscribeVehicleData.KEY_BODY_INFORMATION, information); + return this; + } + /** + * @return {Boolean} + */ + + + getBodyInformation() { + return this.getParameter(SubscribeVehicleData.KEY_BODY_INFORMATION); + } + /** + * @param {Boolean} status - The device status including signal and battery strength + * @return {SubscribeVehicleData} + */ + + + setDeviceStatus(status) { + this.setParameter(SubscribeVehicleData.KEY_DEVICE_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getDeviceStatus() { + return this.getParameter(SubscribeVehicleData.KEY_DEVICE_STATUS); + } + /** + * @param {Boolean} braking - The status of the brake pedal + * @return {SubscribeVehicleData} + */ + + + setDriverBraking(braking) { + this.setParameter(SubscribeVehicleData.KEY_DRIVER_BRAKING, braking); + return this; + } + /** + * @return {Boolean} + */ + + + getDriverBraking() { + return this.getParameter(SubscribeVehicleData.KEY_DRIVER_BRAKING); + } + /** + * @param {Boolean} status - The status of the wipers + * @return {SubscribeVehicleData} + */ + + + setWiperStatus(status) { + this.setParameter(SubscribeVehicleData.KEY_WIPER_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getWiperStatus() { + return this.getParameter(SubscribeVehicleData.KEY_WIPER_STATUS); + } + /** + * @param {Boolean} status - Status of the head lamps + * @return {SubscribeVehicleData} + */ + + + setHeadLampStatus(status) { + this.setParameter(SubscribeVehicleData.KEY_HEAD_LAMP_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getHeadLampStatus() { + return this.getParameter(SubscribeVehicleData.KEY_HEAD_LAMP_STATUS); + } + /** + * @param {Boolean} torque - Torque value for engine (in Nm) on non-diesel variants + * @return {SubscribeVehicleData} + */ + + + setEngineTorque(torque) { + this.setParameter(SubscribeVehicleData.KEY_ENGINE_TORQUE, torque); + return this; + } + /** + * @return {Boolean} + */ + + + getEngineTorque() { + return this.getParameter(SubscribeVehicleData.KEY_ENGINE_TORQUE); + } + /** + * @param {Boolean} position - Accelerator pedal position (percentage depressed) + * @return {SubscribeVehicleData} + */ + + + setAccPedalPosition(position) { + this.setParameter(SubscribeVehicleData.KEY_ACC_PEDAL_POSITION, position); + return this; + } + /** + * @return {Boolean} + */ + + + getAccPedalPosition() { + return this.getParameter(SubscribeVehicleData.KEY_ACC_PEDAL_POSITION); + } + /** + * @param {Boolean} angle - Current angle of the steering wheel (in deg) + * @return {SubscribeVehicleData} + */ + + + setSteeringWheelAngle(angle) { + this.setParameter(SubscribeVehicleData.KEY_STEERING_WHEEL_ANGLE, angle); + return this; + } + /** + * @return {Boolean} + */ + + + getSteeringWheelAngle() { + return this.getParameter(SubscribeVehicleData.KEY_STEERING_WHEEL_ANGLE); + } + /** + * @param {Boolean} life - The estimated percentage of remaining oil life of the engine. + * @return {SubscribeVehicleData} + */ + + + setEngineOilLife(life) { + this.setParameter(SubscribeVehicleData.KEY_ENGINE_OIL_LIFE, life); + return this; + } + /** + * @return {Boolean} + */ + + + getEngineOilLife() { + return this.getParameter(SubscribeVehicleData.KEY_ENGINE_OIL_LIFE); + } + /** + * @param {Boolean} status - The status of the park brake as provided by Electric Park Brake (EPB) system. + * @return {SubscribeVehicleData} + */ + + + setElectronicParkBrakeStatus(status) { + this.setParameter(SubscribeVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getElectronicParkBrakeStatus() { + return this.getParameter(SubscribeVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS); + } + /** + * @param {Boolean} id - Parameter used by cloud apps to identify a head unit + * @return {SubscribeVehicleData} + */ + + + setCloudAppVehicleID(id) { + this.setParameter(SubscribeVehicleData.KEY_CLOUD_APP_VEHICLE_ID, id); + return this; + } + /** + * @return {Boolean} + */ + + + getCloudAppVehicleID() { + return this.getParameter(SubscribeVehicleData.KEY_CLOUD_APP_VEHICLE_ID); + } + /** + * @param {Boolean} info - Emergency Call notification and confirmation data + * @return {SubscribeVehicleData} + */ + + + setECallInfo(info) { + this.setParameter(SubscribeVehicleData.KEY_E_CALL_INFO, info); + return this; + } + /** + * @return {Boolean} + */ + + + getECallInfo() { + return this.getParameter(SubscribeVehicleData.KEY_E_CALL_INFO); + } + /** + * @param {Boolean} status - The status of the air bags + * @return {SubscribeVehicleData} + */ + + + setAirbagStatus(status) { + this.setParameter(SubscribeVehicleData.KEY_AIRBAG_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getAirbagStatus() { + return this.getParameter(SubscribeVehicleData.KEY_AIRBAG_STATUS); + } + /** + * @param {Boolean} event - Information related to an emergency event (and if it occurred) + * @return {SubscribeVehicleData} + */ + + + setEmergencyEvent(event) { + this.setParameter(SubscribeVehicleData.KEY_EMERGENCY_EVENT, event); + return this; + } + /** + * @return {Boolean} + */ + + + getEmergencyEvent() { + return this.getParameter(SubscribeVehicleData.KEY_EMERGENCY_EVENT); + } + /** + * @param {Boolean} status - The status modes of the cluster + * @return {SubscribeVehicleData} + */ + + + setClusterModeStatus(status) { + this.setParameter(SubscribeVehicleData.KEY_CLUSTER_MODE_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getClusterModeStatus() { + return this.getParameter(SubscribeVehicleData.KEY_CLUSTER_MODE_STATUS); + } + /** + * @param {Boolean} key - Information related to the MyKey feature + * @return {SubscribeVehicleData} + */ + + + setMyKey(key) { + this.setParameter(SubscribeVehicleData.KEY_MY_KEY, key); + return this; + } + /** + * @return {Boolean} + */ + + + getMyKey() { + return this.getParameter(SubscribeVehicleData.KEY_MY_KEY); + } + + } + + SubscribeVehicleData.KEY_GPS = 'gps'; + SubscribeVehicleData.KEY_SPEED = 'speed'; + SubscribeVehicleData.KEY_RPM = 'rpm'; + SubscribeVehicleData.KEY_FUEL_LEVEL = 'fuelLevel'; + SubscribeVehicleData.KEY_FUEL_LEVEL_STATE = 'fuelLevel_State'; + SubscribeVehicleData.KEY_INSTANT_FUEL_CONSUMPTION = 'instantFuelConsumption'; + SubscribeVehicleData.KEY_FUEL_RANGE = 'fuelRange'; + SubscribeVehicleData.KEY_EXTERNAL_TEMPERATURE = 'externalTemperature'; + SubscribeVehicleData.KEY_TURN_SIGNAL = 'turnSignal'; + SubscribeVehicleData.KEY_PRNDL = 'prndl'; + SubscribeVehicleData.KEY_TIRE_PRESSURE = 'tirePressure'; + SubscribeVehicleData.KEY_ODOMETER = 'odometer'; + SubscribeVehicleData.KEY_BELT_STATUS = 'beltStatus'; + SubscribeVehicleData.KEY_BODY_INFORMATION = 'bodyInformation'; + SubscribeVehicleData.KEY_DEVICE_STATUS = 'deviceStatus'; + SubscribeVehicleData.KEY_DRIVER_BRAKING = 'driverBraking'; + SubscribeVehicleData.KEY_WIPER_STATUS = 'wiperStatus'; + SubscribeVehicleData.KEY_HEAD_LAMP_STATUS = 'headLampStatus'; + SubscribeVehicleData.KEY_ENGINE_TORQUE = 'engineTorque'; + SubscribeVehicleData.KEY_ACC_PEDAL_POSITION = 'accPedalPosition'; + SubscribeVehicleData.KEY_STEERING_WHEEL_ANGLE = 'steeringWheelAngle'; + SubscribeVehicleData.KEY_ENGINE_OIL_LIFE = 'engineOilLife'; + SubscribeVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS = 'electronicParkBrakeStatus'; + SubscribeVehicleData.KEY_CLOUD_APP_VEHICLE_ID = 'cloudAppVehicleID'; + SubscribeVehicleData.KEY_E_CALL_INFO = 'eCallInfo'; + SubscribeVehicleData.KEY_AIRBAG_STATUS = 'airbagStatus'; + SubscribeVehicleData.KEY_EMERGENCY_EVENT = 'emergencyEvent'; + SubscribeVehicleData.KEY_CLUSTER_MODE_STATUS = 'clusterModeStatus'; + SubscribeVehicleData.KEY_MY_KEY = 'myKey'; + + /* eslint-disable camelcase */ + /** + * Enumeration that describes possible result codes of a vehicle data entry request. + * @typedef {Enum} VehicleDataResultCode + * @property {Object} _MAP + */ + + class VehicleDataResultCode extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * Individual vehicle data item / DTC / DID request or subscription successful + * @return {String} + */ + + + static get VDRC_SUCCESS() { + return VehicleDataResultCode._MAP.VDRC_SUCCESS; + } + /** + * DTC / DID request successful, however, not all active DTCs or full contents of DID location available + * @return {String} + */ + + + static get VDRC_TRUNCATED_DATA() { + return VehicleDataResultCode._MAP.VDRC_TRUNCATED_DATA; + } + /** + * This vehicle data item is not allowed for this app by the OEM/Manufactorer of the connected module. + * @return {String} + */ + + + static get VDRC_DISALLOWED() { + return VehicleDataResultCode._MAP.VDRC_DISALLOWED; + } + /** + * The user has not granted access to this type of vehicle data item at this time. + * @return {String} + */ + + + static get VDRC_USER_DISALLOWED() { + return VehicleDataResultCode._MAP.VDRC_USER_DISALLOWED; + } + /** + * The ECU ID referenced is not a valid ID on the bus / system. + * @return {String} + */ + + + static get VDRC_INVALID_ID() { + return VehicleDataResultCode._MAP.VDRC_INVALID_ID; + } + /** + * The requested vehicle data item / DTC / DID is not currently available or responding on the bus / system. + * @return {String} + */ + + + static get VDRC_DATA_NOT_AVAILABLE() { + return VehicleDataResultCode._MAP.VDRC_DATA_NOT_AVAILABLE; + } + /** + * The vehicle data item is already subscribed. + * @return {String} + */ + + + static get VDRC_DATA_ALREADY_SUBSCRIBED() { + return VehicleDataResultCode._MAP.VDRC_DATA_ALREADY_SUBSCRIBED; + } + /** + * The vehicle data item cannot be unsubscribed because it is not currently subscribed. + * @return {String} + */ + + + static get VDRC_DATA_NOT_SUBSCRIBED() { + return VehicleDataResultCode._MAP.VDRC_DATA_NOT_SUBSCRIBED; + } + /** + * The request for this item is ignored because it is already in progress. + * @return {String} + */ + + + static get VDRC_IGNORED() { + return VehicleDataResultCode._MAP.VDRC_IGNORED; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return VehicleDataResultCode._valueForKey(key, VehicleDataResultCode._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return VehicleDataResultCode._keyForValue(value, VehicleDataResultCode._MAP); + } + + } + + VehicleDataResultCode._MAP = Object.freeze({ + 'VDRC_SUCCESS': 'SUCCESS', + 'VDRC_TRUNCATED_DATA': 'TRUNCATED_DATA', + 'VDRC_DISALLOWED': 'DISALLOWED', + 'VDRC_USER_DISALLOWED': 'USER_DISALLOWED', + 'VDRC_INVALID_ID': 'INVALID_ID', + 'VDRC_DATA_NOT_AVAILABLE': 'VEHICLE_DATA_NOT_AVAILABLE', + 'VDRC_DATA_ALREADY_SUBSCRIBED': 'DATA_ALREADY_SUBSCRIBED', + 'VDRC_DATA_NOT_SUBSCRIBED': 'DATA_NOT_SUBSCRIBED', + 'VDRC_IGNORED': 'IGNORED' + }); + + /* eslint-disable camelcase */ + /** + * Defines the data types that can be published and subscribed to. + * @typedef {Enum} VehicleDataType + * @property {Object} _MAP + */ + + class VehicleDataType extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * Notifies GPSData may be subscribed + * @return {String} + */ + + + static get VEHICLEDATA_GPS() { + return VehicleDataType._MAP.VEHICLEDATA_GPS; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_SPEED() { + return VehicleDataType._MAP.VEHICLEDATA_SPEED; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_RPM() { + return VehicleDataType._MAP.VEHICLEDATA_RPM; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_FUELLEVEL() { + return VehicleDataType._MAP.VEHICLEDATA_FUELLEVEL; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_FUELLEVEL_STATE() { + return VehicleDataType._MAP.VEHICLEDATA_FUELLEVEL_STATE; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_FUELCONSUMPTION() { + return VehicleDataType._MAP.VEHICLEDATA_FUELCONSUMPTION; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_EXTERNTEMP() { + return VehicleDataType._MAP.VEHICLEDATA_EXTERNTEMP; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_VIN() { + return VehicleDataType._MAP.VEHICLEDATA_VIN; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_PRNDL() { + return VehicleDataType._MAP.VEHICLEDATA_PRNDL; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_TIREPRESSURE() { + return VehicleDataType._MAP.VEHICLEDATA_TIREPRESSURE; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_ODOMETER() { + return VehicleDataType._MAP.VEHICLEDATA_ODOMETER; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_BELTSTATUS() { + return VehicleDataType._MAP.VEHICLEDATA_BELTSTATUS; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_BODYINFO() { + return VehicleDataType._MAP.VEHICLEDATA_BODYINFO; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_DEVICESTATUS() { + return VehicleDataType._MAP.VEHICLEDATA_DEVICESTATUS; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_ECALLINFO() { + return VehicleDataType._MAP.VEHICLEDATA_ECALLINFO; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_AIRBAGSTATUS() { + return VehicleDataType._MAP.VEHICLEDATA_AIRBAGSTATUS; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_EMERGENCYEVENT() { + return VehicleDataType._MAP.VEHICLEDATA_EMERGENCYEVENT; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_CLUSTERMODESTATUS() { + return VehicleDataType._MAP.VEHICLEDATA_CLUSTERMODESTATUS; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_MYKEY() { + return VehicleDataType._MAP.VEHICLEDATA_MYKEY; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_BRAKING() { + return VehicleDataType._MAP.VEHICLEDATA_BRAKING; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_WIPERSTATUS() { + return VehicleDataType._MAP.VEHICLEDATA_WIPERSTATUS; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_HEADLAMPSTATUS() { + return VehicleDataType._MAP.VEHICLEDATA_HEADLAMPSTATUS; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_BATTVOLTAGE() { + return VehicleDataType._MAP.VEHICLEDATA_BATTVOLTAGE; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_ENGINETORQUE() { + return VehicleDataType._MAP.VEHICLEDATA_ENGINETORQUE; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_ACCPEDAL() { + return VehicleDataType._MAP.VEHICLEDATA_ACCPEDAL; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_STEERINGWHEEL() { + return VehicleDataType._MAP.VEHICLEDATA_STEERINGWHEEL; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_TURNSIGNAL() { + return VehicleDataType._MAP.VEHICLEDATA_TURNSIGNAL; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_FUELRANGE() { + return VehicleDataType._MAP.VEHICLEDATA_FUELRANGE; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_ENGINEOILLIFE() { + return VehicleDataType._MAP.VEHICLEDATA_ENGINEOILLIFE; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_ELECTRONICPARKBRAKESTATUS() { + return VehicleDataType._MAP.VEHICLEDATA_ELECTRONICPARKBRAKESTATUS; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_CLOUDAPPVEHICLEID() { + return VehicleDataType._MAP.VEHICLEDATA_CLOUDAPPVEHICLEID; + } + /** + * @return {String} + */ + + + static get VEHICLEDATA_OEM_CUSTOM_DATA() { + return VehicleDataType._MAP.VEHICLEDATA_OEM_CUSTOM_DATA; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return VehicleDataType._valueForKey(key, VehicleDataType._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return VehicleDataType._keyForValue(value, VehicleDataType._MAP); + } + + } + + VehicleDataType._MAP = Object.freeze({ + 'VEHICLEDATA_GPS': 'VEHICLEDATA_GPS', + 'VEHICLEDATA_SPEED': 'VEHICLEDATA_SPEED', + 'VEHICLEDATA_RPM': 'VEHICLEDATA_RPM', + 'VEHICLEDATA_FUELLEVEL': 'VEHICLEDATA_FUELLEVEL', + 'VEHICLEDATA_FUELLEVEL_STATE': 'VEHICLEDATA_FUELLEVEL_STATE', + 'VEHICLEDATA_FUELCONSUMPTION': 'VEHICLEDATA_FUELCONSUMPTION', + 'VEHICLEDATA_EXTERNTEMP': 'VEHICLEDATA_EXTERNTEMP', + 'VEHICLEDATA_VIN': 'VEHICLEDATA_VIN', + 'VEHICLEDATA_PRNDL': 'VEHICLEDATA_PRNDL', + 'VEHICLEDATA_TIREPRESSURE': 'VEHICLEDATA_TIREPRESSURE', + 'VEHICLEDATA_ODOMETER': 'VEHICLEDATA_ODOMETER', + 'VEHICLEDATA_BELTSTATUS': 'VEHICLEDATA_BELTSTATUS', + 'VEHICLEDATA_BODYINFO': 'VEHICLEDATA_BODYINFO', + 'VEHICLEDATA_DEVICESTATUS': 'VEHICLEDATA_DEVICESTATUS', + 'VEHICLEDATA_ECALLINFO': 'VEHICLEDATA_ECALLINFO', + 'VEHICLEDATA_AIRBAGSTATUS': 'VEHICLEDATA_AIRBAGSTATUS', + 'VEHICLEDATA_EMERGENCYEVENT': 'VEHICLEDATA_EMERGENCYEVENT', + 'VEHICLEDATA_CLUSTERMODESTATUS': 'VEHICLEDATA_CLUSTERMODESTATUS', + 'VEHICLEDATA_MYKEY': 'VEHICLEDATA_MYKEY', + 'VEHICLEDATA_BRAKING': 'VEHICLEDATA_BRAKING', + 'VEHICLEDATA_WIPERSTATUS': 'VEHICLEDATA_WIPERSTATUS', + 'VEHICLEDATA_HEADLAMPSTATUS': 'VEHICLEDATA_HEADLAMPSTATUS', + 'VEHICLEDATA_BATTVOLTAGE': 'VEHICLEDATA_BATTVOLTAGE', + 'VEHICLEDATA_ENGINETORQUE': 'VEHICLEDATA_ENGINETORQUE', + 'VEHICLEDATA_ACCPEDAL': 'VEHICLEDATA_ACCPEDAL', + 'VEHICLEDATA_STEERINGWHEEL': 'VEHICLEDATA_STEERINGWHEEL', + 'VEHICLEDATA_TURNSIGNAL': 'VEHICLEDATA_TURNSIGNAL', + 'VEHICLEDATA_FUELRANGE': 'VEHICLEDATA_FUELRANGE', + 'VEHICLEDATA_ENGINEOILLIFE': 'VEHICLEDATA_ENGINEOILLIFE', + 'VEHICLEDATA_ELECTRONICPARKBRAKESTATUS': 'VEHICLEDATA_ELECTRONICPARKBRAKESTATUS', + 'VEHICLEDATA_CLOUDAPPVEHICLEID': 'VEHICLEDATA_CLOUDAPPVEHICLEID', + 'VEHICLEDATA_OEM_CUSTOM_DATA': 'VEHICLEDATA_OEM_CUSTOM_DATA' + }); + + /* eslint-disable camelcase */ + /** + * Individual published data request result + */ + + class VehicleDataResult extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {VehicleDataType} type - Defined published data element type. + * @return {VehicleDataResult} + */ + + + setDataType(type) { + this.validateType(VehicleDataType, type); + this.setParameter(VehicleDataResult.KEY_DATA_TYPE, type); + return this; + } + /** + * @return {VehicleDataType} + */ + + + getDataType() { + return this.getObject(VehicleDataType, VehicleDataResult.KEY_DATA_TYPE); + } + /** + * @param {VehicleDataResultCode} code - Published data result code. + * @return {VehicleDataResult} + */ + + + setResultCode(code) { + this.validateType(VehicleDataResultCode, code); + this.setParameter(VehicleDataResult.KEY_RESULT_CODE, code); + return this; + } + /** + * @return {VehicleDataResultCode} + */ + + + getResultCode() { + return this.getObject(VehicleDataResultCode, VehicleDataResult.KEY_RESULT_CODE); + } + /** + * @param {String} type - Type of requested oem specific parameter + * @return {VehicleDataResult} + */ + + + setOemCustomDataType(type) { + this.setParameter(VehicleDataResult.KEY_OEM_CUSTOM_DATA_TYPE, type); + return this; + } + /** + * @return {String} + */ + + + getOemCustomDataType() { + return this.getParameter(VehicleDataResult.KEY_OEM_CUSTOM_DATA_TYPE); + } + + } + + VehicleDataResult.KEY_DATA_TYPE = 'dataType'; + VehicleDataResult.KEY_RESULT_CODE = 'resultCode'; + VehicleDataResult.KEY_OEM_CUSTOM_DATA_TYPE = 'oemCustomDataType'; + + /* eslint-disable camelcase */ + + class SubscribeVehicleDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SubscribeVehicleData); + } + /** + * @param {VehicleDataResult} gps - See GPSData + * @return {SubscribeVehicleDataResponse} + */ + + + setGps(gps) { + this.validateType(VehicleDataResult, gps); + this.setParameter(SubscribeVehicleDataResponse.KEY_GPS, gps); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getGps() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_GPS); + } + /** + * @param {VehicleDataResult} speed - The vehicle speed in kilometers per hour + * @return {SubscribeVehicleDataResponse} + */ + + + setSpeed(speed) { + this.validateType(VehicleDataResult, speed); + this.setParameter(SubscribeVehicleDataResponse.KEY_SPEED, speed); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getSpeed() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_SPEED); + } + /** + * @param {VehicleDataResult} rpm - The number of revolutions per minute of the engine + * @return {SubscribeVehicleDataResponse} + */ + + + setRpm(rpm) { + this.validateType(VehicleDataResult, rpm); + this.setParameter(SubscribeVehicleDataResponse.KEY_RPM, rpm); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getRpm() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_RPM); + } + /** + * @param {VehicleDataResult} level - The fuel level in the tank (percentage) + * @return {SubscribeVehicleDataResponse} + */ + + + setFuelLevel(level) { + this.validateType(VehicleDataResult, level); + this.setParameter(SubscribeVehicleDataResponse.KEY_FUEL_LEVEL, level); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getFuelLevel() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_FUEL_LEVEL); + } + /** + * @param {VehicleDataResult} level_state - The fuel level state + * @return {SubscribeVehicleDataResponse} + */ + + + setFuelLevel_State(level_state) { + this.validateType(VehicleDataResult, level_state); + this.setParameter(SubscribeVehicleDataResponse.KEY_FUEL_LEVEL_STATE, level_state); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getFuelLevel_State() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_FUEL_LEVEL_STATE); + } + /** + * @param {VehicleDataResult} consumption - The instantaneous fuel consumption in microlitres + * @return {SubscribeVehicleDataResponse} + */ + + + setInstantFuelConsumption(consumption) { + this.validateType(VehicleDataResult, consumption); + this.setParameter(SubscribeVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION, consumption); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getInstantFuelConsumption() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION); + } + /** + * @param {VehicleDataResult} range - The estimate range in KM the vehicle can travel based on fuel level and + * consumption + * @return {SubscribeVehicleDataResponse} + */ + + + setFuelRange(range) { + this.validateType(VehicleDataResult, range); + this.setParameter(SubscribeVehicleDataResponse.KEY_FUEL_RANGE, range); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getFuelRange() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_FUEL_RANGE); + } + /** + * @param {VehicleDataResult} temperature - The external temperature in degrees celsius. + * @return {SubscribeVehicleDataResponse} + */ + + + setExternalTemperature(temperature) { + this.validateType(VehicleDataResult, temperature); + this.setParameter(SubscribeVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE, temperature); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getExternalTemperature() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE); + } + /** + * @param {VehicleDataResult} signal - See TurnSignal + * @return {SubscribeVehicleDataResponse} + */ + + + setTurnSignal(signal) { + this.validateType(VehicleDataResult, signal); + this.setParameter(SubscribeVehicleDataResponse.KEY_TURN_SIGNAL, signal); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getTurnSignal() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_TURN_SIGNAL); + } + /** + * @param {VehicleDataResult} prndl - See PRNDL + * @return {SubscribeVehicleDataResponse} + */ + + + setPrndl(prndl) { + this.validateType(VehicleDataResult, prndl); + this.setParameter(SubscribeVehicleDataResponse.KEY_PRNDL, prndl); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getPrndl() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_PRNDL); + } + /** + * @param {VehicleDataResult} pressure - See TireStatus + * @return {SubscribeVehicleDataResponse} + */ + + + setTirePressure(pressure) { + this.validateType(VehicleDataResult, pressure); + this.setParameter(SubscribeVehicleDataResponse.KEY_TIRE_PRESSURE, pressure); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getTirePressure() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_TIRE_PRESSURE); + } + /** + * @param {VehicleDataResult} odometer - Odometer in km + * @return {SubscribeVehicleDataResponse} + */ + + + setOdometer(odometer) { + this.validateType(VehicleDataResult, odometer); + this.setParameter(SubscribeVehicleDataResponse.KEY_ODOMETER, odometer); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getOdometer() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_ODOMETER); + } + /** + * @param {VehicleDataResult} status - The status of the seat belts + * @return {SubscribeVehicleDataResponse} + */ + + + setBeltStatus(status) { + this.validateType(VehicleDataResult, status); + this.setParameter(SubscribeVehicleDataResponse.KEY_BELT_STATUS, status); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getBeltStatus() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_BELT_STATUS); + } + /** + * @param {VehicleDataResult} information - The body information including power modes + * @return {SubscribeVehicleDataResponse} + */ + + + setBodyInformation(information) { + this.validateType(VehicleDataResult, information); + this.setParameter(SubscribeVehicleDataResponse.KEY_BODY_INFORMATION, information); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getBodyInformation() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_BODY_INFORMATION); + } + /** + * @param {VehicleDataResult} status - The device status including signal and battery strength + * @return {SubscribeVehicleDataResponse} + */ + + + setDeviceStatus(status) { + this.validateType(VehicleDataResult, status); + this.setParameter(SubscribeVehicleDataResponse.KEY_DEVICE_STATUS, status); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getDeviceStatus() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_DEVICE_STATUS); + } + /** + * @param {VehicleDataResult} braking - The status of the brake pedal + * @return {SubscribeVehicleDataResponse} + */ + + + setDriverBraking(braking) { + this.validateType(VehicleDataResult, braking); + this.setParameter(SubscribeVehicleDataResponse.KEY_DRIVER_BRAKING, braking); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getDriverBraking() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_DRIVER_BRAKING); + } + /** + * @param {VehicleDataResult} status - The status of the wipers + * @return {SubscribeVehicleDataResponse} + */ + + + setWiperStatus(status) { + this.validateType(VehicleDataResult, status); + this.setParameter(SubscribeVehicleDataResponse.KEY_WIPER_STATUS, status); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getWiperStatus() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_WIPER_STATUS); + } + /** + * @param {VehicleDataResult} status - Status of the head lamps + * @return {SubscribeVehicleDataResponse} + */ + + + setHeadLampStatus(status) { + this.validateType(VehicleDataResult, status); + this.setParameter(SubscribeVehicleDataResponse.KEY_HEAD_LAMP_STATUS, status); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getHeadLampStatus() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_HEAD_LAMP_STATUS); + } + /** + * @param {VehicleDataResult} torque - Torque value for engine (in Nm) on non-diesel variants + * @return {SubscribeVehicleDataResponse} + */ + + + setEngineTorque(torque) { + this.validateType(VehicleDataResult, torque); + this.setParameter(SubscribeVehicleDataResponse.KEY_ENGINE_TORQUE, torque); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getEngineTorque() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_ENGINE_TORQUE); + } + /** + * @param {VehicleDataResult} position - Accelerator pedal position (percentage depressed) + * @return {SubscribeVehicleDataResponse} + */ + + + setAccPedalPosition(position) { + this.validateType(VehicleDataResult, position); + this.setParameter(SubscribeVehicleDataResponse.KEY_ACC_PEDAL_POSITION, position); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getAccPedalPosition() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_ACC_PEDAL_POSITION); + } + /** + * @param {VehicleDataResult} angle - Current angle of the steering wheel (in deg) + * @return {SubscribeVehicleDataResponse} + */ + + + setSteeringWheelAngle(angle) { + this.validateType(VehicleDataResult, angle); + this.setParameter(SubscribeVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE, angle); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getSteeringWheelAngle() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE); + } + /** + * @param {VehicleDataResult} life - The estimated percentage of remaining oil life of the engine. + * @return {SubscribeVehicleDataResponse} + */ + + + setEngineOilLife(life) { + this.validateType(VehicleDataResult, life); + this.setParameter(SubscribeVehicleDataResponse.KEY_ENGINE_OIL_LIFE, life); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getEngineOilLife() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_ENGINE_OIL_LIFE); + } + /** + * @param {VehicleDataResult} status - The status of the park brake as provided by Electric Park Brake (EPB) system. + * @return {SubscribeVehicleDataResponse} + */ + + + setElectronicParkBrakeStatus(status) { + this.validateType(VehicleDataResult, status); + this.setParameter(SubscribeVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS, status); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getElectronicParkBrakeStatus() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS); + } + /** + * @param {VehicleDataResult} id - Parameter used by cloud apps to identify a head unit + * @return {SubscribeVehicleDataResponse} + */ + + + setCloudAppVehicleID(id) { + this.validateType(VehicleDataResult, id); + this.setParameter(SubscribeVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID, id); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getCloudAppVehicleID() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID); + } + /** + * @param {VehicleDataResult} info - Emergency Call notification and confirmation data + * @return {SubscribeVehicleDataResponse} + */ + + + setECallInfo(info) { + this.validateType(VehicleDataResult, info); + this.setParameter(SubscribeVehicleDataResponse.KEY_E_CALL_INFO, info); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getECallInfo() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_E_CALL_INFO); + } + /** + * @param {VehicleDataResult} status - The status of the air bags + * @return {SubscribeVehicleDataResponse} + */ + + + setAirbagStatus(status) { + this.validateType(VehicleDataResult, status); + this.setParameter(SubscribeVehicleDataResponse.KEY_AIRBAG_STATUS, status); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getAirbagStatus() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_AIRBAG_STATUS); + } + /** + * @param {VehicleDataResult} event - Information related to an emergency event (and if it occurred) + * @return {SubscribeVehicleDataResponse} + */ + + + setEmergencyEvent(event) { + this.validateType(VehicleDataResult, event); + this.setParameter(SubscribeVehicleDataResponse.KEY_EMERGENCY_EVENT, event); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getEmergencyEvent() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_EMERGENCY_EVENT); + } + /** + * @param {VehicleDataResult} modes - The status modes of the cluster + * @return {SubscribeVehicleDataResponse} + */ + + + setClusterModes(modes) { + this.validateType(VehicleDataResult, modes); + this.setParameter(SubscribeVehicleDataResponse.KEY_CLUSTER_MODES, modes); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getClusterModes() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_CLUSTER_MODES); + } + /** + * @param {VehicleDataResult} key - Information related to the MyKey feature + * @return {SubscribeVehicleDataResponse} + */ + + + setMyKey(key) { + this.validateType(VehicleDataResult, key); + this.setParameter(SubscribeVehicleDataResponse.KEY_MY_KEY, key); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getMyKey() { + return this.getObject(VehicleDataResult, SubscribeVehicleDataResponse.KEY_MY_KEY); + } + + } + + SubscribeVehicleDataResponse.KEY_GPS = 'gps'; + SubscribeVehicleDataResponse.KEY_SPEED = 'speed'; + SubscribeVehicleDataResponse.KEY_RPM = 'rpm'; + SubscribeVehicleDataResponse.KEY_FUEL_LEVEL = 'fuelLevel'; + SubscribeVehicleDataResponse.KEY_FUEL_LEVEL_STATE = 'fuelLevel_State'; + SubscribeVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION = 'instantFuelConsumption'; + SubscribeVehicleDataResponse.KEY_FUEL_RANGE = 'fuelRange'; + SubscribeVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE = 'externalTemperature'; + SubscribeVehicleDataResponse.KEY_TURN_SIGNAL = 'turnSignal'; + SubscribeVehicleDataResponse.KEY_PRNDL = 'prndl'; + SubscribeVehicleDataResponse.KEY_TIRE_PRESSURE = 'tirePressure'; + SubscribeVehicleDataResponse.KEY_ODOMETER = 'odometer'; + SubscribeVehicleDataResponse.KEY_BELT_STATUS = 'beltStatus'; + SubscribeVehicleDataResponse.KEY_BODY_INFORMATION = 'bodyInformation'; + SubscribeVehicleDataResponse.KEY_DEVICE_STATUS = 'deviceStatus'; + SubscribeVehicleDataResponse.KEY_DRIVER_BRAKING = 'driverBraking'; + SubscribeVehicleDataResponse.KEY_WIPER_STATUS = 'wiperStatus'; + SubscribeVehicleDataResponse.KEY_HEAD_LAMP_STATUS = 'headLampStatus'; + SubscribeVehicleDataResponse.KEY_ENGINE_TORQUE = 'engineTorque'; + SubscribeVehicleDataResponse.KEY_ACC_PEDAL_POSITION = 'accPedalPosition'; + SubscribeVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE = 'steeringWheelAngle'; + SubscribeVehicleDataResponse.KEY_ENGINE_OIL_LIFE = 'engineOilLife'; + SubscribeVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS = 'electronicParkBrakeStatus'; + SubscribeVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID = 'cloudAppVehicleID'; + SubscribeVehicleDataResponse.KEY_E_CALL_INFO = 'eCallInfo'; + SubscribeVehicleDataResponse.KEY_AIRBAG_STATUS = 'airbagStatus'; + SubscribeVehicleDataResponse.KEY_EMERGENCY_EVENT = 'emergencyEvent'; + SubscribeVehicleDataResponse.KEY_CLUSTER_MODES = 'clusterModes'; + SubscribeVehicleDataResponse.KEY_MY_KEY = 'myKey'; + + /* eslint-disable camelcase */ + /** + * This function is used to unsubscribe the notifications from the subscribeVehicleData function. + */ + + class UnsubscribeVehicleData extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.UnsubscribeVehicleData); + } + /** + * @param {Boolean} gps - See GPSData + * @return {UnsubscribeVehicleData} + */ + + + setGps(gps) { + this.setParameter(UnsubscribeVehicleData.KEY_GPS, gps); + return this; + } + /** + * @return {Boolean} + */ + + + getGps() { + return this.getParameter(UnsubscribeVehicleData.KEY_GPS); + } + /** + * @param {Boolean} speed - The vehicle speed in kilometers per hour + * @return {UnsubscribeVehicleData} + */ + + + setSpeed(speed) { + this.setParameter(UnsubscribeVehicleData.KEY_SPEED, speed); + return this; + } + /** + * @return {Boolean} + */ + + + getSpeed() { + return this.getParameter(UnsubscribeVehicleData.KEY_SPEED); + } + /** + * @param {Boolean} rpm - The number of revolutions per minute of the engine + * @return {UnsubscribeVehicleData} + */ + + + setRpm(rpm) { + this.setParameter(UnsubscribeVehicleData.KEY_RPM, rpm); + return this; + } + /** + * @return {Boolean} + */ + + + getRpm() { + return this.getParameter(UnsubscribeVehicleData.KEY_RPM); + } + /** + * @param {Boolean} level - The fuel level in the tank (percentage) + * @return {UnsubscribeVehicleData} + */ + + + setFuelLevel(level) { + this.setParameter(UnsubscribeVehicleData.KEY_FUEL_LEVEL, level); + return this; + } + /** + * @return {Boolean} + */ + + + getFuelLevel() { + return this.getParameter(UnsubscribeVehicleData.KEY_FUEL_LEVEL); + } + /** + * @param {Boolean} level_state - The fuel level state + * @return {UnsubscribeVehicleData} + */ + + + setFuelLevel_State(level_state) { + this.setParameter(UnsubscribeVehicleData.KEY_FUEL_LEVEL_STATE, level_state); + return this; + } + /** + * @return {Boolean} + */ + + + getFuelLevel_State() { + return this.getParameter(UnsubscribeVehicleData.KEY_FUEL_LEVEL_STATE); + } + /** + * @param {Boolean} consumption - The instantaneous fuel consumption in microlitres + * @return {UnsubscribeVehicleData} + */ + + + setInstantFuelConsumption(consumption) { + this.setParameter(UnsubscribeVehicleData.KEY_INSTANT_FUEL_CONSUMPTION, consumption); + return this; + } + /** + * @return {Boolean} + */ + + + getInstantFuelConsumption() { + return this.getParameter(UnsubscribeVehicleData.KEY_INSTANT_FUEL_CONSUMPTION); + } + /** + * @param {Boolean} range - The estimate range in KM the vehicle can travel based on fuel level and consumption + * @return {UnsubscribeVehicleData} + */ + + + setFuelRange(range) { + this.setParameter(UnsubscribeVehicleData.KEY_FUEL_RANGE, range); + return this; + } + /** + * @return {Boolean} + */ + + + getFuelRange() { + return this.getParameter(UnsubscribeVehicleData.KEY_FUEL_RANGE); + } + /** + * @param {Boolean} temperature - The external temperature in degrees celsius. + * @return {UnsubscribeVehicleData} + */ + + + setExternalTemperature(temperature) { + this.setParameter(UnsubscribeVehicleData.KEY_EXTERNAL_TEMPERATURE, temperature); + return this; + } + /** + * @return {Boolean} + */ + + + getExternalTemperature() { + return this.getParameter(UnsubscribeVehicleData.KEY_EXTERNAL_TEMPERATURE); + } + /** + * @param {Boolean} signal - See TurnSignal + * @return {UnsubscribeVehicleData} + */ + + + setTurnSignal(signal) { + this.setParameter(UnsubscribeVehicleData.KEY_TURN_SIGNAL, signal); + return this; + } + /** + * @return {Boolean} + */ + + + getTurnSignal() { + return this.getParameter(UnsubscribeVehicleData.KEY_TURN_SIGNAL); + } + /** + * @param {Boolean} prndl - See PRNDL + * @return {UnsubscribeVehicleData} + */ + + + setPrndl(prndl) { + this.setParameter(UnsubscribeVehicleData.KEY_PRNDL, prndl); + return this; + } + /** + * @return {Boolean} + */ + + + getPrndl() { + return this.getParameter(UnsubscribeVehicleData.KEY_PRNDL); + } + /** + * @param {Boolean} pressure - See TireStatus + * @return {UnsubscribeVehicleData} + */ + + + setTirePressure(pressure) { + this.setParameter(UnsubscribeVehicleData.KEY_TIRE_PRESSURE, pressure); + return this; + } + /** + * @return {Boolean} + */ + + + getTirePressure() { + return this.getParameter(UnsubscribeVehicleData.KEY_TIRE_PRESSURE); + } + /** + * @param {Boolean} odometer - Odometer in km + * @return {UnsubscribeVehicleData} + */ + + + setOdometer(odometer) { + this.setParameter(UnsubscribeVehicleData.KEY_ODOMETER, odometer); + return this; + } + /** + * @return {Boolean} + */ + + + getOdometer() { + return this.getParameter(UnsubscribeVehicleData.KEY_ODOMETER); + } + /** + * @param {Boolean} status - The status of the seat belts + * @return {UnsubscribeVehicleData} + */ + + + setBeltStatus(status) { + this.setParameter(UnsubscribeVehicleData.KEY_BELT_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getBeltStatus() { + return this.getParameter(UnsubscribeVehicleData.KEY_BELT_STATUS); + } + /** + * @param {Boolean} information - The body information including power modes + * @return {UnsubscribeVehicleData} + */ + + + setBodyInformation(information) { + this.setParameter(UnsubscribeVehicleData.KEY_BODY_INFORMATION, information); + return this; + } + /** + * @return {Boolean} + */ + + + getBodyInformation() { + return this.getParameter(UnsubscribeVehicleData.KEY_BODY_INFORMATION); + } + /** + * @param {Boolean} status - The device status including signal and battery strength + * @return {UnsubscribeVehicleData} + */ + + + setDeviceStatus(status) { + this.setParameter(UnsubscribeVehicleData.KEY_DEVICE_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getDeviceStatus() { + return this.getParameter(UnsubscribeVehicleData.KEY_DEVICE_STATUS); + } + /** + * @param {Boolean} braking - The status of the brake pedal + * @return {UnsubscribeVehicleData} + */ + + + setDriverBraking(braking) { + this.setParameter(UnsubscribeVehicleData.KEY_DRIVER_BRAKING, braking); + return this; + } + /** + * @return {Boolean} + */ + + + getDriverBraking() { + return this.getParameter(UnsubscribeVehicleData.KEY_DRIVER_BRAKING); + } + /** + * @param {Boolean} status - The status of the wipers + * @return {UnsubscribeVehicleData} + */ + + + setWiperStatus(status) { + this.setParameter(UnsubscribeVehicleData.KEY_WIPER_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getWiperStatus() { + return this.getParameter(UnsubscribeVehicleData.KEY_WIPER_STATUS); + } + /** + * @param {Boolean} status - Status of the head lamps + * @return {UnsubscribeVehicleData} + */ + + + setHeadLampStatus(status) { + this.setParameter(UnsubscribeVehicleData.KEY_HEAD_LAMP_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getHeadLampStatus() { + return this.getParameter(UnsubscribeVehicleData.KEY_HEAD_LAMP_STATUS); + } + /** + * @param {Boolean} torque - Torque value for engine (in Nm) on non-diesel variants + * @return {UnsubscribeVehicleData} + */ + + + setEngineTorque(torque) { + this.setParameter(UnsubscribeVehicleData.KEY_ENGINE_TORQUE, torque); + return this; + } + /** + * @return {Boolean} + */ + + + getEngineTorque() { + return this.getParameter(UnsubscribeVehicleData.KEY_ENGINE_TORQUE); + } + /** + * @param {Boolean} position - Accelerator pedal position (percentage depressed) + * @return {UnsubscribeVehicleData} + */ + + + setAccPedalPosition(position) { + this.setParameter(UnsubscribeVehicleData.KEY_ACC_PEDAL_POSITION, position); + return this; + } + /** + * @return {Boolean} + */ + + + getAccPedalPosition() { + return this.getParameter(UnsubscribeVehicleData.KEY_ACC_PEDAL_POSITION); + } + /** + * @param {Boolean} angle - Current angle of the steering wheel (in deg) + * @return {UnsubscribeVehicleData} + */ + + + setSteeringWheelAngle(angle) { + this.setParameter(UnsubscribeVehicleData.KEY_STEERING_WHEEL_ANGLE, angle); + return this; + } + /** + * @return {Boolean} + */ + + + getSteeringWheelAngle() { + return this.getParameter(UnsubscribeVehicleData.KEY_STEERING_WHEEL_ANGLE); + } + /** + * @param {Boolean} life - The estimated percentage of remaining oil life of the engine. + * @return {UnsubscribeVehicleData} + */ + + + setEngineOilLife(life) { + this.setParameter(UnsubscribeVehicleData.KEY_ENGINE_OIL_LIFE, life); + return this; + } + /** + * @return {Boolean} + */ + + + getEngineOilLife() { + return this.getParameter(UnsubscribeVehicleData.KEY_ENGINE_OIL_LIFE); + } + /** + * @param {Boolean} status - The status of the park brake as provided by Electric Park Brake (EPB) system. + * @return {UnsubscribeVehicleData} + */ + + + setElectronicParkBrakeStatus(status) { + this.setParameter(UnsubscribeVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getElectronicParkBrakeStatus() { + return this.getParameter(UnsubscribeVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS); + } + /** + * @param {Boolean} id - Parameter used by cloud apps to identify a head unit + * @return {UnsubscribeVehicleData} + */ + + + setCloudAppVehicleID(id) { + this.setParameter(UnsubscribeVehicleData.KEY_CLOUD_APP_VEHICLE_ID, id); + return this; + } + /** + * @return {Boolean} + */ + + + getCloudAppVehicleID() { + return this.getParameter(UnsubscribeVehicleData.KEY_CLOUD_APP_VEHICLE_ID); + } + /** + * @param {Boolean} info - Emergency Call notification and confirmation data + * @return {UnsubscribeVehicleData} + */ + + + setECallInfo(info) { + this.setParameter(UnsubscribeVehicleData.KEY_E_CALL_INFO, info); + return this; + } + /** + * @return {Boolean} + */ + + + getECallInfo() { + return this.getParameter(UnsubscribeVehicleData.KEY_E_CALL_INFO); + } + /** + * @param {Boolean} status - The status of the air bags + * @return {UnsubscribeVehicleData} + */ + + + setAirbagStatus(status) { + this.setParameter(UnsubscribeVehicleData.KEY_AIRBAG_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getAirbagStatus() { + return this.getParameter(UnsubscribeVehicleData.KEY_AIRBAG_STATUS); + } + /** + * @param {Boolean} event - Information related to an emergency event (and if it occurred) + * @return {UnsubscribeVehicleData} + */ + + + setEmergencyEvent(event) { + this.setParameter(UnsubscribeVehicleData.KEY_EMERGENCY_EVENT, event); + return this; + } + /** + * @return {Boolean} + */ + + + getEmergencyEvent() { + return this.getParameter(UnsubscribeVehicleData.KEY_EMERGENCY_EVENT); + } + /** + * @param {Boolean} status - The status modes of the cluster + * @return {UnsubscribeVehicleData} + */ + + + setClusterModeStatus(status) { + this.setParameter(UnsubscribeVehicleData.KEY_CLUSTER_MODE_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getClusterModeStatus() { + return this.getParameter(UnsubscribeVehicleData.KEY_CLUSTER_MODE_STATUS); + } + /** + * @param {Boolean} key - Information related to the MyKey feature + * @return {UnsubscribeVehicleData} + */ + + + setMyKey(key) { + this.setParameter(UnsubscribeVehicleData.KEY_MY_KEY, key); + return this; + } + /** + * @return {Boolean} + */ + + + getMyKey() { + return this.getParameter(UnsubscribeVehicleData.KEY_MY_KEY); + } + + } + + UnsubscribeVehicleData.KEY_GPS = 'gps'; + UnsubscribeVehicleData.KEY_SPEED = 'speed'; + UnsubscribeVehicleData.KEY_RPM = 'rpm'; + UnsubscribeVehicleData.KEY_FUEL_LEVEL = 'fuelLevel'; + UnsubscribeVehicleData.KEY_FUEL_LEVEL_STATE = 'fuelLevel_State'; + UnsubscribeVehicleData.KEY_INSTANT_FUEL_CONSUMPTION = 'instantFuelConsumption'; + UnsubscribeVehicleData.KEY_FUEL_RANGE = 'fuelRange'; + UnsubscribeVehicleData.KEY_EXTERNAL_TEMPERATURE = 'externalTemperature'; + UnsubscribeVehicleData.KEY_TURN_SIGNAL = 'turnSignal'; + UnsubscribeVehicleData.KEY_PRNDL = 'prndl'; + UnsubscribeVehicleData.KEY_TIRE_PRESSURE = 'tirePressure'; + UnsubscribeVehicleData.KEY_ODOMETER = 'odometer'; + UnsubscribeVehicleData.KEY_BELT_STATUS = 'beltStatus'; + UnsubscribeVehicleData.KEY_BODY_INFORMATION = 'bodyInformation'; + UnsubscribeVehicleData.KEY_DEVICE_STATUS = 'deviceStatus'; + UnsubscribeVehicleData.KEY_DRIVER_BRAKING = 'driverBraking'; + UnsubscribeVehicleData.KEY_WIPER_STATUS = 'wiperStatus'; + UnsubscribeVehicleData.KEY_HEAD_LAMP_STATUS = 'headLampStatus'; + UnsubscribeVehicleData.KEY_ENGINE_TORQUE = 'engineTorque'; + UnsubscribeVehicleData.KEY_ACC_PEDAL_POSITION = 'accPedalPosition'; + UnsubscribeVehicleData.KEY_STEERING_WHEEL_ANGLE = 'steeringWheelAngle'; + UnsubscribeVehicleData.KEY_ENGINE_OIL_LIFE = 'engineOilLife'; + UnsubscribeVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS = 'electronicParkBrakeStatus'; + UnsubscribeVehicleData.KEY_CLOUD_APP_VEHICLE_ID = 'cloudAppVehicleID'; + UnsubscribeVehicleData.KEY_E_CALL_INFO = 'eCallInfo'; + UnsubscribeVehicleData.KEY_AIRBAG_STATUS = 'airbagStatus'; + UnsubscribeVehicleData.KEY_EMERGENCY_EVENT = 'emergencyEvent'; + UnsubscribeVehicleData.KEY_CLUSTER_MODE_STATUS = 'clusterModeStatus'; + UnsubscribeVehicleData.KEY_MY_KEY = 'myKey'; + + /* eslint-disable camelcase */ + + class UnsubscribeVehicleDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.UnsubscribeVehicleData); + } + /** + * @param {VehicleDataResult} gps - See GPSData + * @return {UnsubscribeVehicleDataResponse} + */ + + + setGps(gps) { + this.validateType(VehicleDataResult, gps); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_GPS, gps); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getGps() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_GPS); + } + /** + * @param {VehicleDataResult} speed - The vehicle speed in kilometers per hour + * @return {UnsubscribeVehicleDataResponse} + */ + + + setSpeed(speed) { + this.validateType(VehicleDataResult, speed); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_SPEED, speed); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getSpeed() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_SPEED); + } + /** + * @param {VehicleDataResult} rpm - The number of revolutions per minute of the engine + * @return {UnsubscribeVehicleDataResponse} + */ + + + setRpm(rpm) { + this.validateType(VehicleDataResult, rpm); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_RPM, rpm); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getRpm() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_RPM); + } + /** + * @param {VehicleDataResult} level - The fuel level in the tank (percentage) + * @return {UnsubscribeVehicleDataResponse} + */ + + + setFuelLevel(level) { + this.validateType(VehicleDataResult, level); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_FUEL_LEVEL, level); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getFuelLevel() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_FUEL_LEVEL); + } + /** + * @param {VehicleDataResult} level_state - The fuel level state + * @return {UnsubscribeVehicleDataResponse} + */ + + + setFuelLevel_State(level_state) { + this.validateType(VehicleDataResult, level_state); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_FUEL_LEVEL_STATE, level_state); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getFuelLevel_State() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_FUEL_LEVEL_STATE); + } + /** + * @param {VehicleDataResult} consumption - The instantaneous fuel consumption in microlitres + * @return {UnsubscribeVehicleDataResponse} + */ + + + setInstantFuelConsumption(consumption) { + this.validateType(VehicleDataResult, consumption); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION, consumption); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getInstantFuelConsumption() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION); + } + /** + * @param {VehicleDataResult} range - The estimate range in KM the vehicle can travel based on fuel level and + * consumption + * @return {UnsubscribeVehicleDataResponse} + */ + + + setFuelRange(range) { + this.validateType(VehicleDataResult, range); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_FUEL_RANGE, range); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getFuelRange() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_FUEL_RANGE); + } + /** + * @param {VehicleDataResult} temperature - The external temperature in degrees celsius + * @return {UnsubscribeVehicleDataResponse} + */ + + + setExternalTemperature(temperature) { + this.validateType(VehicleDataResult, temperature); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE, temperature); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getExternalTemperature() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE); + } + /** + * @param {VehicleDataResult} signal - See TurnSignal + * @return {UnsubscribeVehicleDataResponse} + */ + + + setTurnSignal(signal) { + this.validateType(VehicleDataResult, signal); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_TURN_SIGNAL, signal); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getTurnSignal() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_TURN_SIGNAL); + } + /** + * @param {VehicleDataResult} prndl - See PRNDL + * @return {UnsubscribeVehicleDataResponse} + */ + + + setPrndl(prndl) { + this.validateType(VehicleDataResult, prndl); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_PRNDL, prndl); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getPrndl() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_PRNDL); + } + /** + * @param {VehicleDataResult} pressure - See TireStatus + * @return {UnsubscribeVehicleDataResponse} + */ + + + setTirePressure(pressure) { + this.validateType(VehicleDataResult, pressure); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_TIRE_PRESSURE, pressure); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getTirePressure() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_TIRE_PRESSURE); + } + /** + * @param {VehicleDataResult} odometer - Odometer in km + * @return {UnsubscribeVehicleDataResponse} + */ + + + setOdometer(odometer) { + this.validateType(VehicleDataResult, odometer); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_ODOMETER, odometer); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getOdometer() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_ODOMETER); + } + /** + * @param {VehicleDataResult} status - The status of the seat belts + * @return {UnsubscribeVehicleDataResponse} + */ + + + setBeltStatus(status) { + this.validateType(VehicleDataResult, status); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_BELT_STATUS, status); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getBeltStatus() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_BELT_STATUS); + } + /** + * @param {VehicleDataResult} information - The body information including power modes + * @return {UnsubscribeVehicleDataResponse} + */ + + + setBodyInformation(information) { + this.validateType(VehicleDataResult, information); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_BODY_INFORMATION, information); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getBodyInformation() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_BODY_INFORMATION); + } + /** + * @param {VehicleDataResult} status - The device status including signal and battery strength + * @return {UnsubscribeVehicleDataResponse} + */ + + + setDeviceStatus(status) { + this.validateType(VehicleDataResult, status); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_DEVICE_STATUS, status); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getDeviceStatus() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_DEVICE_STATUS); + } + /** + * @param {VehicleDataResult} braking - The status of the brake pedal + * @return {UnsubscribeVehicleDataResponse} + */ + + + setDriverBraking(braking) { + this.validateType(VehicleDataResult, braking); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_DRIVER_BRAKING, braking); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getDriverBraking() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_DRIVER_BRAKING); + } + /** + * @param {VehicleDataResult} status - The status of the wipers + * @return {UnsubscribeVehicleDataResponse} + */ + + + setWiperStatus(status) { + this.validateType(VehicleDataResult, status); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_WIPER_STATUS, status); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getWiperStatus() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_WIPER_STATUS); + } + /** + * @param {VehicleDataResult} status - Status of the head lamps + * @return {UnsubscribeVehicleDataResponse} + */ + + + setHeadLampStatus(status) { + this.validateType(VehicleDataResult, status); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_HEAD_LAMP_STATUS, status); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getHeadLampStatus() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_HEAD_LAMP_STATUS); + } + /** + * @param {VehicleDataResult} torque - Torque value for engine (in Nm) on non-diesel variants + * @return {UnsubscribeVehicleDataResponse} + */ + + + setEngineTorque(torque) { + this.validateType(VehicleDataResult, torque); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_ENGINE_TORQUE, torque); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getEngineTorque() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_ENGINE_TORQUE); + } + /** + * @param {VehicleDataResult} position - Accelerator pedal position (percentage depressed) + * @return {UnsubscribeVehicleDataResponse} + */ + + + setAccPedalPosition(position) { + this.validateType(VehicleDataResult, position); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_ACC_PEDAL_POSITION, position); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getAccPedalPosition() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_ACC_PEDAL_POSITION); + } + /** + * @param {VehicleDataResult} angle - Current angle of the steering wheel (in deg) + * @return {UnsubscribeVehicleDataResponse} + */ + + + setSteeringWheelAngle(angle) { + this.validateType(VehicleDataResult, angle); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE, angle); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getSteeringWheelAngle() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE); + } + /** + * @param {VehicleDataResult} life - The estimated percentage of remaining oil life of the engine. + * @return {UnsubscribeVehicleDataResponse} + */ + + + setEngineOilLife(life) { + this.validateType(VehicleDataResult, life); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_ENGINE_OIL_LIFE, life); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getEngineOilLife() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_ENGINE_OIL_LIFE); + } + /** + * @param {VehicleDataResult} status - The status of the park brake as provided by Electric Park Brake (EPB) system. + * @return {UnsubscribeVehicleDataResponse} + */ + + + setElectronicParkBrakeStatus(status) { + this.validateType(VehicleDataResult, status); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS, status); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getElectronicParkBrakeStatus() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS); + } + /** + * @param {VehicleDataResult} id - Parameter used by cloud apps to identify a head unit + * @return {UnsubscribeVehicleDataResponse} + */ + + + setCloudAppVehicleID(id) { + this.validateType(VehicleDataResult, id); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID, id); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getCloudAppVehicleID() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID); + } + /** + * @param {VehicleDataResult} info - Emergency Call notification and confirmation data + * @return {UnsubscribeVehicleDataResponse} + */ + + + setECallInfo(info) { + this.validateType(VehicleDataResult, info); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_E_CALL_INFO, info); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getECallInfo() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_E_CALL_INFO); + } + /** + * @param {VehicleDataResult} status - The status of the air bags + * @return {UnsubscribeVehicleDataResponse} + */ + + + setAirbagStatus(status) { + this.validateType(VehicleDataResult, status); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_AIRBAG_STATUS, status); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getAirbagStatus() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_AIRBAG_STATUS); + } + /** + * @param {VehicleDataResult} event - Information related to an emergency event (and if it occurred) + * @return {UnsubscribeVehicleDataResponse} + */ + + + setEmergencyEvent(event) { + this.validateType(VehicleDataResult, event); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_EMERGENCY_EVENT, event); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getEmergencyEvent() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_EMERGENCY_EVENT); + } + /** + * @param {VehicleDataResult} modes - The status modes of the cluster + * @return {UnsubscribeVehicleDataResponse} + */ + + + setClusterModes(modes) { + this.validateType(VehicleDataResult, modes); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_CLUSTER_MODES, modes); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getClusterModes() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_CLUSTER_MODES); + } + /** + * @param {VehicleDataResult} key - Information related to the MyKey feature + * @return {UnsubscribeVehicleDataResponse} + */ + + + setMyKey(key) { + this.validateType(VehicleDataResult, key); + this.setParameter(UnsubscribeVehicleDataResponse.KEY_MY_KEY, key); + return this; + } + /** + * @return {VehicleDataResult} + */ + + + getMyKey() { + return this.getObject(VehicleDataResult, UnsubscribeVehicleDataResponse.KEY_MY_KEY); + } + + } + + UnsubscribeVehicleDataResponse.KEY_GPS = 'gps'; + UnsubscribeVehicleDataResponse.KEY_SPEED = 'speed'; + UnsubscribeVehicleDataResponse.KEY_RPM = 'rpm'; + UnsubscribeVehicleDataResponse.KEY_FUEL_LEVEL = 'fuelLevel'; + UnsubscribeVehicleDataResponse.KEY_FUEL_LEVEL_STATE = 'fuelLevel_State'; + UnsubscribeVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION = 'instantFuelConsumption'; + UnsubscribeVehicleDataResponse.KEY_FUEL_RANGE = 'fuelRange'; + UnsubscribeVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE = 'externalTemperature'; + UnsubscribeVehicleDataResponse.KEY_TURN_SIGNAL = 'turnSignal'; + UnsubscribeVehicleDataResponse.KEY_PRNDL = 'prndl'; + UnsubscribeVehicleDataResponse.KEY_TIRE_PRESSURE = 'tirePressure'; + UnsubscribeVehicleDataResponse.KEY_ODOMETER = 'odometer'; + UnsubscribeVehicleDataResponse.KEY_BELT_STATUS = 'beltStatus'; + UnsubscribeVehicleDataResponse.KEY_BODY_INFORMATION = 'bodyInformation'; + UnsubscribeVehicleDataResponse.KEY_DEVICE_STATUS = 'deviceStatus'; + UnsubscribeVehicleDataResponse.KEY_DRIVER_BRAKING = 'driverBraking'; + UnsubscribeVehicleDataResponse.KEY_WIPER_STATUS = 'wiperStatus'; + UnsubscribeVehicleDataResponse.KEY_HEAD_LAMP_STATUS = 'headLampStatus'; + UnsubscribeVehicleDataResponse.KEY_ENGINE_TORQUE = 'engineTorque'; + UnsubscribeVehicleDataResponse.KEY_ACC_PEDAL_POSITION = 'accPedalPosition'; + UnsubscribeVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE = 'steeringWheelAngle'; + UnsubscribeVehicleDataResponse.KEY_ENGINE_OIL_LIFE = 'engineOilLife'; + UnsubscribeVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS = 'electronicParkBrakeStatus'; + UnsubscribeVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID = 'cloudAppVehicleID'; + UnsubscribeVehicleDataResponse.KEY_E_CALL_INFO = 'eCallInfo'; + UnsubscribeVehicleDataResponse.KEY_AIRBAG_STATUS = 'airbagStatus'; + UnsubscribeVehicleDataResponse.KEY_EMERGENCY_EVENT = 'emergencyEvent'; + UnsubscribeVehicleDataResponse.KEY_CLUSTER_MODES = 'clusterModes'; + UnsubscribeVehicleDataResponse.KEY_MY_KEY = 'myKey'; + + /* eslint-disable camelcase */ + /** + * Non periodic vehicle data read request. + */ + + class GetVehicleData extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetVehicleData); + } + /** + * @param {Boolean} gps - See GPSData + * @return {GetVehicleData} + */ + + + setGps(gps) { + this.setParameter(GetVehicleData.KEY_GPS, gps); + return this; + } + /** + * @return {Boolean} + */ + + + getGps() { + return this.getParameter(GetVehicleData.KEY_GPS); + } + /** + * @param {Boolean} speed - The vehicle speed in kilometers per hour + * @return {GetVehicleData} + */ + + + setSpeed(speed) { + this.setParameter(GetVehicleData.KEY_SPEED, speed); + return this; + } + /** + * @return {Boolean} + */ + + + getSpeed() { + return this.getParameter(GetVehicleData.KEY_SPEED); + } + /** + * @param {Boolean} rpm - The number of revolutions per minute of the engine + * @return {GetVehicleData} + */ + + + setRpm(rpm) { + this.setParameter(GetVehicleData.KEY_RPM, rpm); + return this; + } + /** + * @return {Boolean} + */ + + + getRpm() { + return this.getParameter(GetVehicleData.KEY_RPM); + } + /** + * @param {Boolean} level - The fuel level in the tank (percentage) + * @return {GetVehicleData} + */ + + + setFuelLevel(level) { + this.setParameter(GetVehicleData.KEY_FUEL_LEVEL, level); + return this; + } + /** + * @return {Boolean} + */ + + + getFuelLevel() { + return this.getParameter(GetVehicleData.KEY_FUEL_LEVEL); + } + /** + * @param {Boolean} level_state - The fuel level state + * @return {GetVehicleData} + */ + + + setFuelLevel_State(level_state) { + this.setParameter(GetVehicleData.KEY_FUEL_LEVEL_STATE, level_state); + return this; + } + /** + * @return {Boolean} + */ + + + getFuelLevel_State() { + return this.getParameter(GetVehicleData.KEY_FUEL_LEVEL_STATE); + } + /** + * @param {Boolean} consumption - The instantaneous fuel consumption in microlitres + * @return {GetVehicleData} + */ + + + setInstantFuelConsumption(consumption) { + this.setParameter(GetVehicleData.KEY_INSTANT_FUEL_CONSUMPTION, consumption); + return this; + } + /** + * @return {Boolean} + */ + + + getInstantFuelConsumption() { + return this.getParameter(GetVehicleData.KEY_INSTANT_FUEL_CONSUMPTION); + } + /** + * @param {Boolean} range - The estimate range in KM the vehicle can travel based on fuel level and consumption + * @return {GetVehicleData} + */ + + + setFuelRange(range) { + this.setParameter(GetVehicleData.KEY_FUEL_RANGE, range); + return this; + } + /** + * @return {Boolean} + */ + + + getFuelRange() { + return this.getParameter(GetVehicleData.KEY_FUEL_RANGE); + } + /** + * @param {Boolean} temperature - The external temperature in degrees celsius + * @return {GetVehicleData} + */ + + + setExternalTemperature(temperature) { + this.setParameter(GetVehicleData.KEY_EXTERNAL_TEMPERATURE, temperature); + return this; + } + /** + * @return {Boolean} + */ + + + getExternalTemperature() { + return this.getParameter(GetVehicleData.KEY_EXTERNAL_TEMPERATURE); + } + /** + * @param {Boolean} signal - See TurnSignal + * @return {GetVehicleData} + */ + + + setTurnSignal(signal) { + this.setParameter(GetVehicleData.KEY_TURN_SIGNAL, signal); + return this; + } + /** + * @return {Boolean} + */ + + + getTurnSignal() { + return this.getParameter(GetVehicleData.KEY_TURN_SIGNAL); + } + /** + * @param {Boolean} vin - Vehicle identification number + * @return {GetVehicleData} + */ + + + setVin(vin) { + this.setParameter(GetVehicleData.KEY_VIN, vin); + return this; + } + /** + * @return {Boolean} + */ + + + getVin() { + return this.getParameter(GetVehicleData.KEY_VIN); + } + /** + * @param {Boolean} prndl - See PRNDL + * @return {GetVehicleData} + */ + + + setPrndl(prndl) { + this.setParameter(GetVehicleData.KEY_PRNDL, prndl); + return this; + } + /** + * @return {Boolean} + */ + + + getPrndl() { + return this.getParameter(GetVehicleData.KEY_PRNDL); + } + /** + * @param {Boolean} pressure - See TireStatus + * @return {GetVehicleData} + */ + + + setTirePressure(pressure) { + this.setParameter(GetVehicleData.KEY_TIRE_PRESSURE, pressure); + return this; + } + /** + * @return {Boolean} + */ + + + getTirePressure() { + return this.getParameter(GetVehicleData.KEY_TIRE_PRESSURE); + } + /** + * @param {Boolean} odometer - Odometer in km + * @return {GetVehicleData} + */ + + + setOdometer(odometer) { + this.setParameter(GetVehicleData.KEY_ODOMETER, odometer); + return this; + } + /** + * @return {Boolean} + */ + + + getOdometer() { + return this.getParameter(GetVehicleData.KEY_ODOMETER); + } + /** + * @param {Boolean} status - The status of the seat belts + * @return {GetVehicleData} + */ + + + setBeltStatus(status) { + this.setParameter(GetVehicleData.KEY_BELT_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getBeltStatus() { + return this.getParameter(GetVehicleData.KEY_BELT_STATUS); + } + /** + * @param {Boolean} information - The body information including ignition status and internal temp + * @return {GetVehicleData} + */ + + + setBodyInformation(information) { + this.setParameter(GetVehicleData.KEY_BODY_INFORMATION, information); + return this; + } + /** + * @return {Boolean} + */ + + + getBodyInformation() { + return this.getParameter(GetVehicleData.KEY_BODY_INFORMATION); + } + /** + * @param {Boolean} status - The device status including signal and battery strength + * @return {GetVehicleData} + */ + + + setDeviceStatus(status) { + this.setParameter(GetVehicleData.KEY_DEVICE_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getDeviceStatus() { + return this.getParameter(GetVehicleData.KEY_DEVICE_STATUS); + } + /** + * @param {Boolean} braking - The status of the brake pedal + * @return {GetVehicleData} + */ + + + setDriverBraking(braking) { + this.setParameter(GetVehicleData.KEY_DRIVER_BRAKING, braking); + return this; + } + /** + * @return {Boolean} + */ + + + getDriverBraking() { + return this.getParameter(GetVehicleData.KEY_DRIVER_BRAKING); + } + /** + * @param {Boolean} status - The status of the wipers + * @return {GetVehicleData} + */ + + + setWiperStatus(status) { + this.setParameter(GetVehicleData.KEY_WIPER_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getWiperStatus() { + return this.getParameter(GetVehicleData.KEY_WIPER_STATUS); + } + /** + * @param {Boolean} status - Status of the head lamps + * @return {GetVehicleData} + */ + + + setHeadLampStatus(status) { + this.setParameter(GetVehicleData.KEY_HEAD_LAMP_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getHeadLampStatus() { + return this.getParameter(GetVehicleData.KEY_HEAD_LAMP_STATUS); + } + /** + * @param {Boolean} torque - Torque value for engine (in Nm) on non-diesel variants + * @return {GetVehicleData} + */ + + + setEngineTorque(torque) { + this.setParameter(GetVehicleData.KEY_ENGINE_TORQUE, torque); + return this; + } + /** + * @return {Boolean} + */ + + + getEngineTorque() { + return this.getParameter(GetVehicleData.KEY_ENGINE_TORQUE); + } + /** + * @param {Boolean} position - Accelerator pedal position (percentage depressed) + * @return {GetVehicleData} + */ + + + setAccPedalPosition(position) { + this.setParameter(GetVehicleData.KEY_ACC_PEDAL_POSITION, position); + return this; + } + /** + * @return {Boolean} + */ + + + getAccPedalPosition() { + return this.getParameter(GetVehicleData.KEY_ACC_PEDAL_POSITION); + } + /** + * @param {Boolean} angle - Current angle of the steering wheel (in deg) + * @return {GetVehicleData} + */ + + + setSteeringWheelAngle(angle) { + this.setParameter(GetVehicleData.KEY_STEERING_WHEEL_ANGLE, angle); + return this; + } + /** + * @return {Boolean} + */ + + + getSteeringWheelAngle() { + return this.getParameter(GetVehicleData.KEY_STEERING_WHEEL_ANGLE); + } + /** + * @param {Boolean} life - The estimated percentage of remaining oil life of the engine. + * @return {GetVehicleData} + */ + + + setEngineOilLife(life) { + this.setParameter(GetVehicleData.KEY_ENGINE_OIL_LIFE, life); + return this; + } + /** + * @return {Boolean} + */ + + + getEngineOilLife() { + return this.getParameter(GetVehicleData.KEY_ENGINE_OIL_LIFE); + } + /** + * @param {Boolean} status - The status of the park brake as provided by Electric Park Brake (EPB) system. + * @return {GetVehicleData} + */ + + + setElectronicParkBrakeStatus(status) { + this.setParameter(GetVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getElectronicParkBrakeStatus() { + return this.getParameter(GetVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS); + } + /** + * @param {Boolean} id - Parameter used by cloud apps to identify a head unit + * @return {GetVehicleData} + */ + + + setCloudAppVehicleID(id) { + this.setParameter(GetVehicleData.KEY_CLOUD_APP_VEHICLE_ID, id); + return this; + } + /** + * @return {Boolean} + */ + + + getCloudAppVehicleID() { + return this.getParameter(GetVehicleData.KEY_CLOUD_APP_VEHICLE_ID); + } + /** + * @param {Boolean} info - Emergency Call notification and confirmation data + * @return {GetVehicleData} + */ + + + setECallInfo(info) { + this.setParameter(GetVehicleData.KEY_E_CALL_INFO, info); + return this; + } + /** + * @return {Boolean} + */ + + + getECallInfo() { + return this.getParameter(GetVehicleData.KEY_E_CALL_INFO); + } + /** + * @param {Boolean} status - The status of the air bags + * @return {GetVehicleData} + */ + + + setAirbagStatus(status) { + this.setParameter(GetVehicleData.KEY_AIRBAG_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getAirbagStatus() { + return this.getParameter(GetVehicleData.KEY_AIRBAG_STATUS); + } + /** + * @param {Boolean} event - Information related to an emergency event (and if it occurred) + * @return {GetVehicleData} + */ + + + setEmergencyEvent(event) { + this.setParameter(GetVehicleData.KEY_EMERGENCY_EVENT, event); + return this; + } + /** + * @return {Boolean} + */ + + + getEmergencyEvent() { + return this.getParameter(GetVehicleData.KEY_EMERGENCY_EVENT); + } + /** + * @param {Boolean} status - The status modes of the cluster + * @return {GetVehicleData} + */ + + + setClusterModeStatus(status) { + this.setParameter(GetVehicleData.KEY_CLUSTER_MODE_STATUS, status); + return this; + } + /** + * @return {Boolean} + */ + + + getClusterModeStatus() { + return this.getParameter(GetVehicleData.KEY_CLUSTER_MODE_STATUS); + } + /** + * @param {Boolean} key - Information related to the MyKey feature + * @return {GetVehicleData} + */ + + + setMyKey(key) { + this.setParameter(GetVehicleData.KEY_MY_KEY, key); + return this; + } + /** + * @return {Boolean} + */ + + + getMyKey() { + return this.getParameter(GetVehicleData.KEY_MY_KEY); + } + + } + + GetVehicleData.KEY_GPS = 'gps'; + GetVehicleData.KEY_SPEED = 'speed'; + GetVehicleData.KEY_RPM = 'rpm'; + GetVehicleData.KEY_FUEL_LEVEL = 'fuelLevel'; + GetVehicleData.KEY_FUEL_LEVEL_STATE = 'fuelLevel_State'; + GetVehicleData.KEY_INSTANT_FUEL_CONSUMPTION = 'instantFuelConsumption'; + GetVehicleData.KEY_FUEL_RANGE = 'fuelRange'; + GetVehicleData.KEY_EXTERNAL_TEMPERATURE = 'externalTemperature'; + GetVehicleData.KEY_TURN_SIGNAL = 'turnSignal'; + GetVehicleData.KEY_VIN = 'vin'; + GetVehicleData.KEY_PRNDL = 'prndl'; + GetVehicleData.KEY_TIRE_PRESSURE = 'tirePressure'; + GetVehicleData.KEY_ODOMETER = 'odometer'; + GetVehicleData.KEY_BELT_STATUS = 'beltStatus'; + GetVehicleData.KEY_BODY_INFORMATION = 'bodyInformation'; + GetVehicleData.KEY_DEVICE_STATUS = 'deviceStatus'; + GetVehicleData.KEY_DRIVER_BRAKING = 'driverBraking'; + GetVehicleData.KEY_WIPER_STATUS = 'wiperStatus'; + GetVehicleData.KEY_HEAD_LAMP_STATUS = 'headLampStatus'; + GetVehicleData.KEY_ENGINE_TORQUE = 'engineTorque'; + GetVehicleData.KEY_ACC_PEDAL_POSITION = 'accPedalPosition'; + GetVehicleData.KEY_STEERING_WHEEL_ANGLE = 'steeringWheelAngle'; + GetVehicleData.KEY_ENGINE_OIL_LIFE = 'engineOilLife'; + GetVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS = 'electronicParkBrakeStatus'; + GetVehicleData.KEY_CLOUD_APP_VEHICLE_ID = 'cloudAppVehicleID'; + GetVehicleData.KEY_E_CALL_INFO = 'eCallInfo'; + GetVehicleData.KEY_AIRBAG_STATUS = 'airbagStatus'; + GetVehicleData.KEY_EMERGENCY_EVENT = 'emergencyEvent'; + GetVehicleData.KEY_CLUSTER_MODE_STATUS = 'clusterModeStatus'; + GetVehicleData.KEY_MY_KEY = 'myKey'; + + /* eslint-disable camelcase */ + /** + * Reflects the status of a vehicle data event; e.g. a seat belt event status. + * @typedef {Enum} VehicleDataEventStatus + * @property {Object} _MAP + */ + + class VehicleDataEventStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get VDES_NO_EVENT() { + return VehicleDataEventStatus._MAP.VDES_NO_EVENT; + } + /** + * @return {String} + */ + + + static get VDES_NO() { + return VehicleDataEventStatus._MAP.VDES_NO; + } + /** + * @return {String} + */ + + + static get VDES_YES() { + return VehicleDataEventStatus._MAP.VDES_YES; + } + /** + * @return {String} + */ + + + static get VDES_NOT_SUPPORTED() { + return VehicleDataEventStatus._MAP.VDES_NOT_SUPPORTED; + } + /** + * @return {String} + */ + + + static get VDES_FAULT() { + return VehicleDataEventStatus._MAP.VDES_FAULT; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return VehicleDataEventStatus._valueForKey(key, VehicleDataEventStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return VehicleDataEventStatus._keyForValue(value, VehicleDataEventStatus._MAP); + } + + } + + VehicleDataEventStatus._MAP = Object.freeze({ + 'VDES_NO_EVENT': 'NO_EVENT', + 'VDES_NO': 'NO', + 'VDES_YES': 'YES', + 'VDES_NOT_SUPPORTED': 'NOT_SUPPORTED', + 'VDES_FAULT': 'FAULT' + }); + + /* eslint-disable camelcase */ + + class AirbagStatus extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsDrvBag_D_Ltchd". See VehicleDataEventStatus. + * @return {AirbagStatus} + */ + + + setDriverAirbagDeployed(deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_DRIVER_AIRBAG_DEPLOYED, deployed); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getDriverAirbagDeployed() { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_DRIVER_AIRBAG_DEPLOYED); + } + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsDrvSideBag_D_Ltchd". See + * VehicleDataEventStatus. + * @return {AirbagStatus} + */ + + + setDriverSideAirbagDeployed(deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_DRIVER_SIDE_AIRBAG_DEPLOYED, deployed); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getDriverSideAirbagDeployed() { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_DRIVER_SIDE_AIRBAG_DEPLOYED); + } + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsDrvCrtnBag_D_Ltchd". See + * VehicleDataEventStatus. + * @return {AirbagStatus} + */ + + + setDriverCurtainAirbagDeployed(deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_DRIVER_CURTAIN_AIRBAG_DEPLOYED, deployed); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getDriverCurtainAirbagDeployed() { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_DRIVER_CURTAIN_AIRBAG_DEPLOYED); + } + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsPasBag_D_Ltchd". See VehicleDataEventStatus. + * @return {AirbagStatus} + */ + + + setPassengerAirbagDeployed(deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_PASSENGER_AIRBAG_DEPLOYED, deployed); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getPassengerAirbagDeployed() { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_PASSENGER_AIRBAG_DEPLOYED); + } + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsPasCrtnBag_D_Ltchd". See + * VehicleDataEventStatus. + * @return {AirbagStatus} + */ + + + setPassengerCurtainAirbagDeployed(deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_PASSENGER_CURTAIN_AIRBAG_DEPLOYED, deployed); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getPassengerCurtainAirbagDeployed() { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_PASSENGER_CURTAIN_AIRBAG_DEPLOYED); + } + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsKneeDrvBag_D_Ltchd". See + * VehicleDataEventStatus. + * @return {AirbagStatus} + */ + + + setDriverKneeAirbagDeployed(deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_DRIVER_KNEE_AIRBAG_DEPLOYED, deployed); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getDriverKneeAirbagDeployed() { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_DRIVER_KNEE_AIRBAG_DEPLOYED); + } + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsPasSideBag_D_Ltchd". See + * VehicleDataEventStatus. + * @return {AirbagStatus} + */ + + + setPassengerSideAirbagDeployed(deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_PASSENGER_SIDE_AIRBAG_DEPLOYED, deployed); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getPassengerSideAirbagDeployed() { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_PASSENGER_SIDE_AIRBAG_DEPLOYED); + } + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsKneePasBag_D_Ltchd". See + * VehicleDataEventStatus. + * @return {AirbagStatus} + */ + + + setPassengerKneeAirbagDeployed(deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(AirbagStatus.KEY_PASSENGER_KNEE_AIRBAG_DEPLOYED, deployed); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getPassengerKneeAirbagDeployed() { + return this.getObject(VehicleDataEventStatus, AirbagStatus.KEY_PASSENGER_KNEE_AIRBAG_DEPLOYED); + } + + } + + AirbagStatus.KEY_DRIVER_AIRBAG_DEPLOYED = 'driverAirbagDeployed'; + AirbagStatus.KEY_DRIVER_SIDE_AIRBAG_DEPLOYED = 'driverSideAirbagDeployed'; + AirbagStatus.KEY_DRIVER_CURTAIN_AIRBAG_DEPLOYED = 'driverCurtainAirbagDeployed'; + AirbagStatus.KEY_PASSENGER_AIRBAG_DEPLOYED = 'passengerAirbagDeployed'; + AirbagStatus.KEY_PASSENGER_CURTAIN_AIRBAG_DEPLOYED = 'passengerCurtainAirbagDeployed'; + AirbagStatus.KEY_DRIVER_KNEE_AIRBAG_DEPLOYED = 'driverKneeAirbagDeployed'; + AirbagStatus.KEY_PASSENGER_SIDE_AIRBAG_DEPLOYED = 'passengerSideAirbagDeployed'; + AirbagStatus.KEY_PASSENGER_KNEE_AIRBAG_DEPLOYED = 'passengerKneeAirbagDeployed'; + + /* eslint-disable camelcase */ + /** + * Reflects the status of the current power mode. + * @typedef {Enum} PowerModeStatus + * @property {Object} _MAP + */ + + class PowerModeStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get KEY_OUT() { + return PowerModeStatus._MAP.KEY_OUT; + } + /** + * @return {String} + */ + + + static get KEY_RECENTLY_OUT() { + return PowerModeStatus._MAP.KEY_RECENTLY_OUT; + } + /** + * @return {String} + */ + + + static get KEY_APPROVED_0() { + return PowerModeStatus._MAP.KEY_APPROVED_0; + } + /** + * @return {String} + */ + + + static get POST_ACCESORY_0() { + return PowerModeStatus._MAP.POST_ACCESORY_0; + } + /** + * @return {String} + */ + + + static get ACCESORY_1() { + return PowerModeStatus._MAP.ACCESORY_1; + } + /** + * @return {String} + */ + + + static get POST_IGNITION_1() { + return PowerModeStatus._MAP.POST_IGNITION_1; + } + /** + * @return {String} + */ + + + static get IGNITION_ON_2() { + return PowerModeStatus._MAP.IGNITION_ON_2; + } + /** + * @return {String} + */ + + + static get RUNNING_2() { + return PowerModeStatus._MAP.RUNNING_2; + } + /** + * @return {String} + */ + + + static get CRANK_3() { + return PowerModeStatus._MAP.CRANK_3; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return PowerModeStatus._valueForKey(key, PowerModeStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return PowerModeStatus._keyForValue(value, PowerModeStatus._MAP); + } + + } + + PowerModeStatus._MAP = Object.freeze({ + 'KEY_OUT': 'KEY_OUT', + 'KEY_RECENTLY_OUT': 'KEY_RECENTLY_OUT', + 'KEY_APPROVED_0': 'KEY_APPROVED_0', + 'POST_ACCESORY_0': 'POST_ACCESORY_0', + 'ACCESORY_1': 'ACCESORY_1', + 'POST_IGNITION_1': 'POST_IGNITION_1', + 'IGNITION_ON_2': 'IGNITION_ON_2', + 'RUNNING_2': 'RUNNING_2', + 'CRANK_3': 'CRANK_3' + }); + + /* eslint-disable camelcase */ + /** + * Reflects the status of the current car mode. + * @typedef {Enum} CarModeStatus + * @property {Object} _MAP + */ + + class CarModeStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get CMS_NORMAL() { + return CarModeStatus._MAP.CMS_NORMAL; + } + /** + * @return {String} + */ + + + static get CMS_FACTORY() { + return CarModeStatus._MAP.CMS_FACTORY; + } + /** + * @return {String} + */ + + + static get CMS_TRANSPORT() { + return CarModeStatus._MAP.CMS_TRANSPORT; + } + /** + * @return {String} + */ + + + static get CMS_CRASH() { + return CarModeStatus._MAP.CMS_CRASH; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return CarModeStatus._valueForKey(key, CarModeStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return CarModeStatus._keyForValue(value, CarModeStatus._MAP); + } + + } + + CarModeStatus._MAP = Object.freeze({ + 'CMS_NORMAL': 'NORMAL', + 'CMS_FACTORY': 'FACTORY', + 'CMS_TRANSPORT': 'TRANSPORT', + 'CMS_CRASH': 'CRASH' + }); + + /* eslint-disable camelcase */ + /** + * Reflects the status of the current power mode qualification. + * @typedef {Enum} PowerModeQualificationStatus + * @property {Object} _MAP + */ + + class PowerModeQualificationStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get POWER_MODE_UNDEFINED() { + return PowerModeQualificationStatus._MAP.POWER_MODE_UNDEFINED; + } + /** + * @return {String} + */ + + + static get POWER_MODE_EVALUATION_IN_PROGRESS() { + return PowerModeQualificationStatus._MAP.POWER_MODE_EVALUATION_IN_PROGRESS; + } + /** + * @return {String} + */ + + + static get NOT_DEFINED() { + return PowerModeQualificationStatus._MAP.NOT_DEFINED; + } + /** + * @return {String} + */ + + + static get POWER_MODE_OK() { + return PowerModeQualificationStatus._MAP.POWER_MODE_OK; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return PowerModeQualificationStatus._valueForKey(key, PowerModeQualificationStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return PowerModeQualificationStatus._keyForValue(value, PowerModeQualificationStatus._MAP); + } + + } + + PowerModeQualificationStatus._MAP = Object.freeze({ + 'POWER_MODE_UNDEFINED': 'POWER_MODE_UNDEFINED', + 'POWER_MODE_EVALUATION_IN_PROGRESS': 'POWER_MODE_EVALUATION_IN_PROGRESS', + 'NOT_DEFINED': 'NOT_DEFINED', + 'POWER_MODE_OK': 'POWER_MODE_OK' + }); + + /* eslint-disable camelcase */ + + class ClusterModeStatus extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Boolean} active - References signal "PowerMode_UB". + * @return {ClusterModeStatus} + */ + + + setPowerModeActive(active) { + this.setParameter(ClusterModeStatus.KEY_POWER_MODE_ACTIVE, active); + return this; + } + /** + * @return {Boolean} + */ + + + getPowerModeActive() { + return this.getParameter(ClusterModeStatus.KEY_POWER_MODE_ACTIVE); + } + /** + * @param {PowerModeQualificationStatus} status - References signal "PowerModeQF". See PowerModeQualificationStatus. + * @return {ClusterModeStatus} + */ + + + setPowerModeQualificationStatus(status) { + this.validateType(PowerModeQualificationStatus, status); + this.setParameter(ClusterModeStatus.KEY_POWER_MODE_QUALIFICATION_STATUS, status); + return this; + } + /** + * @return {PowerModeQualificationStatus} + */ + + + getPowerModeQualificationStatus() { + return this.getObject(PowerModeQualificationStatus, ClusterModeStatus.KEY_POWER_MODE_QUALIFICATION_STATUS); + } + /** + * @param {CarModeStatus} status - References signal "CarMode". See CarMode. + * @return {ClusterModeStatus} + */ + + + setCarModeStatus(status) { + this.validateType(CarModeStatus, status); + this.setParameter(ClusterModeStatus.KEY_CAR_MODE_STATUS, status); + return this; + } + /** + * @return {CarModeStatus} + */ + + + getCarModeStatus() { + return this.getObject(CarModeStatus, ClusterModeStatus.KEY_CAR_MODE_STATUS); + } + /** + * @param {PowerModeStatus} status - References signal "PowerMode". See PowerMode. + * @return {ClusterModeStatus} + */ + + + setPowerModeStatus(status) { + this.validateType(PowerModeStatus, status); + this.setParameter(ClusterModeStatus.KEY_POWER_MODE_STATUS, status); + return this; + } + /** + * @return {PowerModeStatus} + */ + + + getPowerModeStatus() { + return this.getObject(PowerModeStatus, ClusterModeStatus.KEY_POWER_MODE_STATUS); + } + + } + + ClusterModeStatus.KEY_POWER_MODE_ACTIVE = 'powerModeActive'; + ClusterModeStatus.KEY_POWER_MODE_QUALIFICATION_STATUS = 'powerModeQualificationStatus'; + ClusterModeStatus.KEY_CAR_MODE_STATUS = 'carModeStatus'; + ClusterModeStatus.KEY_POWER_MODE_STATUS = 'powerModeStatus'; + + /* eslint-disable camelcase */ + /** + * Reflects the status of the RCM fuel cutoff. + * @typedef {Enum} FuelCutoffStatus + * @property {Object} _MAP + */ + + class FuelCutoffStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get FCS_TERMINATE_FUEL() { + return FuelCutoffStatus._MAP.FCS_TERMINATE_FUEL; + } + /** + * @return {String} + */ + + + static get FCS_NORMAL_OPERATION() { + return FuelCutoffStatus._MAP.FCS_NORMAL_OPERATION; + } + /** + * @return {String} + */ + + + static get FCS_FAULT() { + return FuelCutoffStatus._MAP.FCS_FAULT; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return FuelCutoffStatus._valueForKey(key, FuelCutoffStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return FuelCutoffStatus._keyForValue(value, FuelCutoffStatus._MAP); + } + + } + + FuelCutoffStatus._MAP = Object.freeze({ + 'FCS_TERMINATE_FUEL': 'TERMINATE_FUEL', + 'FCS_NORMAL_OPERATION': 'NORMAL_OPERATION', + 'FCS_FAULT': 'FAULT' + }); + + /* eslint-disable camelcase */ + /** + * Reflects the emergency event status of the vehicle. + * @typedef {Enum} EmergencyEventType + * @property {Object} _MAP + */ + + class EmergencyEventType extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get EET_NO_EVENT() { + return EmergencyEventType._MAP.EET_NO_EVENT; + } + /** + * @return {String} + */ + + + static get EET_FRONTAL() { + return EmergencyEventType._MAP.EET_FRONTAL; + } + /** + * @return {String} + */ + + + static get EET_SIDE() { + return EmergencyEventType._MAP.EET_SIDE; + } + /** + * @return {String} + */ + + + static get EET_REAR() { + return EmergencyEventType._MAP.EET_REAR; + } + /** + * @return {String} + */ + + + static get EET_ROLLOVER() { + return EmergencyEventType._MAP.EET_ROLLOVER; + } + /** + * @return {String} + */ + + + static get EET_NOT_SUPPORTED() { + return EmergencyEventType._MAP.EET_NOT_SUPPORTED; + } + /** + * @return {String} + */ + + + static get EET_FAULT() { + return EmergencyEventType._MAP.EET_FAULT; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return EmergencyEventType._valueForKey(key, EmergencyEventType._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return EmergencyEventType._keyForValue(value, EmergencyEventType._MAP); + } + + } + + EmergencyEventType._MAP = Object.freeze({ + 'EET_NO_EVENT': 'NO_EVENT', + 'EET_FRONTAL': 'FRONTAL', + 'EET_SIDE': 'SIDE', + 'EET_REAR': 'REAR', + 'EET_ROLLOVER': 'ROLLOVER', + 'EET_NOT_SUPPORTED': 'NOT_SUPPORTED', + 'EET_FAULT': 'FAULT' + }); + + /* eslint-disable camelcase */ + + class EmergencyEvent extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {EmergencyEventType} type - References signal "VedsEvntType_D_Ltchd". See EmergencyEventType. + * @return {EmergencyEvent} + */ + + + setEmergencyEventType(type) { + this.validateType(EmergencyEventType, type); + this.setParameter(EmergencyEvent.KEY_EMERGENCY_EVENT_TYPE, type); + return this; + } + /** + * @return {EmergencyEventType} + */ + + + getEmergencyEventType() { + return this.getObject(EmergencyEventType, EmergencyEvent.KEY_EMERGENCY_EVENT_TYPE); + } + /** + * @param {FuelCutoffStatus} status - References signal "RCM_FuelCutoff". See FuelCutoffStatus. + * @return {EmergencyEvent} + */ + + + setFuelCutoffStatus(status) { + this.validateType(FuelCutoffStatus, status); + this.setParameter(EmergencyEvent.KEY_FUEL_CUTOFF_STATUS, status); + return this; + } + /** + * @return {FuelCutoffStatus} + */ + + + getFuelCutoffStatus() { + return this.getObject(FuelCutoffStatus, EmergencyEvent.KEY_FUEL_CUTOFF_STATUS); + } + /** + * @param {VehicleDataEventStatus} event - References signal "VedsEvntRoll_D_Ltchd". See VehicleDataEventStatus. + * @return {EmergencyEvent} + */ + + + setRolloverEvent(event) { + this.validateType(VehicleDataEventStatus, event); + this.setParameter(EmergencyEvent.KEY_ROLLOVER_EVENT, event); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getRolloverEvent() { + return this.getObject(VehicleDataEventStatus, EmergencyEvent.KEY_ROLLOVER_EVENT); + } + /** + * @param {Number} velocity - References signal "VedsMaxDeltaV_D_Ltchd". Change in velocity in KPH. Additional + * reserved values: 0x00 No event 0xFE Not supported 0xFF Fault + * @return {EmergencyEvent} + */ + + + setMaximumChangeVelocity(velocity) { + this.setParameter(EmergencyEvent.KEY_MAXIMUM_CHANGE_VELOCITY, velocity); + return this; + } + /** + * @return {Number} + */ + + + getMaximumChangeVelocity() { + return this.getParameter(EmergencyEvent.KEY_MAXIMUM_CHANGE_VELOCITY); + } + /** + * @param {VehicleDataEventStatus} events - References signal "VedsMultiEvnt_D_Ltchd". See VehicleDataEventStatus. + * @return {EmergencyEvent} + */ + + + setMultipleEvents(events) { + this.validateType(VehicleDataEventStatus, events); + this.setParameter(EmergencyEvent.KEY_MULTIPLE_EVENTS, events); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getMultipleEvents() { + return this.getObject(VehicleDataEventStatus, EmergencyEvent.KEY_MULTIPLE_EVENTS); + } + + } + + EmergencyEvent.KEY_EMERGENCY_EVENT_TYPE = 'emergencyEventType'; + EmergencyEvent.KEY_FUEL_CUTOFF_STATUS = 'fuelCutoffStatus'; + EmergencyEvent.KEY_ROLLOVER_EVENT = 'rolloverEvent'; + EmergencyEvent.KEY_MAXIMUM_CHANGE_VELOCITY = 'maximumChangeVelocity'; + EmergencyEvent.KEY_MULTIPLE_EVENTS = 'multipleEvents'; + + /* eslint-disable camelcase */ + /** + * Enumeration that describes the status of the turn light indicator. + * @typedef {Enum} TurnSignal + * @property {Object} _MAP + */ + + class TurnSignal extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * Turn signal is OFF + * @return {String} + */ + + + static get OFF() { + return TurnSignal._MAP.OFF; + } + /** + * Left turn signal is on + * @return {String} + */ + + + static get LEFT() { + return TurnSignal._MAP.LEFT; + } + /** + * Right turn signal is on + * @return {String} + */ + + + static get RIGHT() { + return TurnSignal._MAP.RIGHT; + } + /** + * Both signals (left and right) are on. + * @return {String} + */ + + + static get BOTH() { + return TurnSignal._MAP.BOTH; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return TurnSignal._valueForKey(key, TurnSignal._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return TurnSignal._keyForValue(value, TurnSignal._MAP); + } + + } + + TurnSignal._MAP = Object.freeze({ + 'OFF': 'OFF', + 'LEFT': 'LEFT', + 'RIGHT': 'RIGHT', + 'BOTH': 'BOTH' + }); + + /* eslint-disable camelcase */ + /** + * Reflects the status of the ambient light sensor. + * @typedef {Enum} AmbientLightStatus + * @property {Object} _MAP + */ + + class AmbientLightStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get NIGHT() { + return AmbientLightStatus._MAP.NIGHT; + } + /** + * @return {String} + */ + + + static get TWILIGHT_1() { + return AmbientLightStatus._MAP.TWILIGHT_1; + } + /** + * @return {String} + */ + + + static get TWILIGHT_2() { + return AmbientLightStatus._MAP.TWILIGHT_2; + } + /** + * @return {String} + */ + + + static get TWILIGHT_3() { + return AmbientLightStatus._MAP.TWILIGHT_3; + } + /** + * @return {String} + */ + + + static get TWILIGHT_4() { + return AmbientLightStatus._MAP.TWILIGHT_4; + } + /** + * @return {String} + */ + + + static get DAY() { + return AmbientLightStatus._MAP.DAY; + } + /** + * @return {String} + */ + + + static get ALS_UNKNOWN() { + return AmbientLightStatus._MAP.ALS_UNKNOWN; + } + /** + * @return {String} + */ + + + static get INVALID() { + return AmbientLightStatus._MAP.INVALID; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return AmbientLightStatus._valueForKey(key, AmbientLightStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return AmbientLightStatus._keyForValue(value, AmbientLightStatus._MAP); + } + + } + + AmbientLightStatus._MAP = Object.freeze({ + 'NIGHT': 'NIGHT', + 'TWILIGHT_1': 'TWILIGHT_1', + 'TWILIGHT_2': 'TWILIGHT_2', + 'TWILIGHT_3': 'TWILIGHT_3', + 'TWILIGHT_4': 'TWILIGHT_4', + 'DAY': 'DAY', + 'ALS_UNKNOWN': 'UNKNOWN', + 'INVALID': 'INVALID' + }); + + /* eslint-disable camelcase */ + + class HeadLampStatus extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Boolean} on - Status of the low beam lamps. References signal "HeadLampLoActv_B_Stat". + * @return {HeadLampStatus} + */ + + + setLowBeamsOn(on) { + this.setParameter(HeadLampStatus.KEY_LOW_BEAMS_ON, on); + return this; + } + /** + * @return {Boolean} + */ + + + getLowBeamsOn() { + return this.getParameter(HeadLampStatus.KEY_LOW_BEAMS_ON); + } + /** + * @param {Boolean} on - Status of the high beam lamps. References signal "HeadLghtHiOn_B_Stat". + * @return {HeadLampStatus} + */ + + + setHighBeamsOn(on) { + this.setParameter(HeadLampStatus.KEY_HIGH_BEAMS_ON, on); + return this; + } + /** + * @return {Boolean} + */ + + + getHighBeamsOn() { + return this.getParameter(HeadLampStatus.KEY_HIGH_BEAMS_ON); + } + /** + * @param {AmbientLightStatus} status - Status of the ambient light sensor. + * @return {HeadLampStatus} + */ + + + setAmbientLightSensorStatus(status) { + this.validateType(AmbientLightStatus, status); + this.setParameter(HeadLampStatus.KEY_AMBIENT_LIGHT_SENSOR_STATUS, status); + return this; + } + /** + * @return {AmbientLightStatus} + */ + + + getAmbientLightSensorStatus() { + return this.getObject(AmbientLightStatus, HeadLampStatus.KEY_AMBIENT_LIGHT_SENSOR_STATUS); + } + + } + + HeadLampStatus.KEY_LOW_BEAMS_ON = 'lowBeamsOn'; + HeadLampStatus.KEY_HIGH_BEAMS_ON = 'highBeamsOn'; + HeadLampStatus.KEY_AMBIENT_LIGHT_SENSOR_STATUS = 'ambientLightSensorStatus'; + + /* eslint-disable camelcase */ + /** + * Reflects the current primary audio source (if selected). + * @typedef {Enum} PrimaryAudioSource + * @property {Object} _MAP + */ + + class PrimaryAudioSource extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get NO_SOURCE_SELECTED() { + return PrimaryAudioSource._MAP.NO_SOURCE_SELECTED; + } + /** + * @return {String} + */ + + + static get CD() { + return PrimaryAudioSource._MAP.CD; + } + /** + * @return {String} + */ + + + static get USB() { + return PrimaryAudioSource._MAP.USB; + } + /** + * @return {String} + */ + + + static get USB2() { + return PrimaryAudioSource._MAP.USB2; + } + /** + * @return {String} + */ + + + static get BLUETOOTH_STEREO_BTST() { + return PrimaryAudioSource._MAP.BLUETOOTH_STEREO_BTST; + } + /** + * @return {String} + */ + + + static get LINE_IN() { + return PrimaryAudioSource._MAP.LINE_IN; + } + /** + * @return {String} + */ + + + static get IPOD() { + return PrimaryAudioSource._MAP.IPOD; + } + /** + * @return {String} + */ + + + static get MOBILE_APP() { + return PrimaryAudioSource._MAP.MOBILE_APP; + } + /** + * @return {String} + */ + + + static get AM() { + return PrimaryAudioSource._MAP.AM; + } + /** + * @return {String} + */ + + + static get FM() { + return PrimaryAudioSource._MAP.FM; + } + /** + * @return {String} + */ + + + static get XM() { + return PrimaryAudioSource._MAP.XM; + } + /** + * @return {String} + */ + + + static get DAB() { + return PrimaryAudioSource._MAP.DAB; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return PrimaryAudioSource._valueForKey(key, PrimaryAudioSource._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return PrimaryAudioSource._keyForValue(value, PrimaryAudioSource._MAP); + } + + } + + PrimaryAudioSource._MAP = Object.freeze({ + 'NO_SOURCE_SELECTED': 'NO_SOURCE_SELECTED', + 'CD': 'CD', + 'USB': 'USB', + 'USB2': 'USB2', + 'BLUETOOTH_STEREO_BTST': 'BLUETOOTH_STEREO_BTST', + 'LINE_IN': 'LINE_IN', + 'IPOD': 'IPOD', + 'MOBILE_APP': 'MOBILE_APP', + 'AM': 'AM', + 'FM': 'FM', + 'XM': 'XM', + 'DAB': 'DAB' + }); + + /* eslint-disable camelcase */ + /** + * Reflects the reported battery status of the connected device, if reported. + * @typedef {Enum} DeviceLevelStatus + * @property {Object} _MAP + */ + + class DeviceLevelStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get ZERO_LEVEL_BARS() { + return DeviceLevelStatus._MAP.ZERO_LEVEL_BARS; + } + /** + * @return {String} + */ + + + static get ONE_LEVEL_BARS() { + return DeviceLevelStatus._MAP.ONE_LEVEL_BARS; + } + /** + * @return {String} + */ + + + static get TWO_LEVEL_BARS() { + return DeviceLevelStatus._MAP.TWO_LEVEL_BARS; + } + /** + * @return {String} + */ + + + static get THREE_LEVEL_BARS() { + return DeviceLevelStatus._MAP.THREE_LEVEL_BARS; + } + /** + * @return {String} + */ + + + static get FOUR_LEVEL_BARS() { + return DeviceLevelStatus._MAP.FOUR_LEVEL_BARS; + } + /** + * @return {String} + */ + + + static get NOT_PROVIDED() { + return DeviceLevelStatus._MAP.NOT_PROVIDED; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return DeviceLevelStatus._valueForKey(key, DeviceLevelStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return DeviceLevelStatus._keyForValue(value, DeviceLevelStatus._MAP); + } + + } + + DeviceLevelStatus._MAP = Object.freeze({ + 'ZERO_LEVEL_BARS': 'ZERO_LEVEL_BARS', + 'ONE_LEVEL_BARS': 'ONE_LEVEL_BARS', + 'TWO_LEVEL_BARS': 'TWO_LEVEL_BARS', + 'THREE_LEVEL_BARS': 'THREE_LEVEL_BARS', + 'FOUR_LEVEL_BARS': 'FOUR_LEVEL_BARS', + 'NOT_PROVIDED': 'NOT_PROVIDED' + }); + + /* eslint-disable camelcase */ + + class DeviceStatus extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Boolean} on - References signal "CPM_VoiceRec_STAT". + * @return {DeviceStatus} + */ + + + setVoiceRecOn(on) { + this.setParameter(DeviceStatus.KEY_VOICE_REC_ON, on); + return this; + } + /** + * @return {Boolean} + */ + + + getVoiceRecOn() { + return this.getParameter(DeviceStatus.KEY_VOICE_REC_ON); + } + /** + * @param {Boolean} on - References signal "BT_ICON". + * @return {DeviceStatus} + */ + + + setBtIconOn(on) { + this.setParameter(DeviceStatus.KEY_BT_ICON_ON, on); + return this; + } + /** + * @return {Boolean} + */ + + + getBtIconOn() { + return this.getParameter(DeviceStatus.KEY_BT_ICON_ON); + } + /** + * @param {Boolean} active - References signal "CPM_Call_Active_STAT". + * @return {DeviceStatus} + */ + + + setCallActive(active) { + this.setParameter(DeviceStatus.KEY_CALL_ACTIVE, active); + return this; + } + /** + * @return {Boolean} + */ + + + getCallActive() { + return this.getParameter(DeviceStatus.KEY_CALL_ACTIVE); + } + /** + * @param {Boolean} roaming - References signal "CPM_Phone_Roaming_STAT". + * @return {DeviceStatus} + */ + + + setPhoneRoaming(roaming) { + this.setParameter(DeviceStatus.KEY_PHONE_ROAMING, roaming); + return this; + } + /** + * @return {Boolean} + */ + + + getPhoneRoaming() { + return this.getParameter(DeviceStatus.KEY_PHONE_ROAMING); + } + /** + * @param {Boolean} available - References signal "CPM_TextMsg_AVAL". + * @return {DeviceStatus} + */ + + + setTextMsgAvailable(available) { + this.setParameter(DeviceStatus.KEY_TEXT_MSG_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getTextMsgAvailable() { + return this.getParameter(DeviceStatus.KEY_TEXT_MSG_AVAILABLE); + } + /** + * @param {DeviceLevelStatus} status - Device battery level status. References signal "CPM_Batt_Level_STAT". See + * DeviceLevelStatus. + * @return {DeviceStatus} + */ + + + setBattLevelStatus(status) { + this.validateType(DeviceLevelStatus, status); + this.setParameter(DeviceStatus.KEY_BATT_LEVEL_STATUS, status); + return this; + } + /** + * @return {DeviceLevelStatus} + */ + + + getBattLevelStatus() { + return this.getObject(DeviceLevelStatus, DeviceStatus.KEY_BATT_LEVEL_STATUS); + } + /** + * @param {Boolean} muted - References signal "CPM_Stereo_Audio_Output". + * @return {DeviceStatus} + */ + + + setStereoAudioOutputMuted(muted) { + this.setParameter(DeviceStatus.KEY_STEREO_AUDIO_OUTPUT_MUTED, muted); + return this; + } + /** + * @return {Boolean} + */ + + + getStereoAudioOutputMuted() { + return this.getParameter(DeviceStatus.KEY_STEREO_AUDIO_OUTPUT_MUTED); + } + /** + * @param {Boolean} muted - References signal "CPM_Mono_Audio_Output". + * @return {DeviceStatus} + */ + + + setMonoAudioOutputMuted(muted) { + this.setParameter(DeviceStatus.KEY_MONO_AUDIO_OUTPUT_MUTED, muted); + return this; + } + /** + * @return {Boolean} + */ + + + getMonoAudioOutputMuted() { + return this.getParameter(DeviceStatus.KEY_MONO_AUDIO_OUTPUT_MUTED); + } + /** + * @param {DeviceLevelStatus} status - Device signal level status. References signal "CPM_Signal_Strength_STAT". See + * DeviceLevelStatus. + * @return {DeviceStatus} + */ + + + setSignalLevelStatus(status) { + this.validateType(DeviceLevelStatus, status); + this.setParameter(DeviceStatus.KEY_SIGNAL_LEVEL_STATUS, status); + return this; + } + /** + * @return {DeviceLevelStatus} + */ + + + getSignalLevelStatus() { + return this.getObject(DeviceLevelStatus, DeviceStatus.KEY_SIGNAL_LEVEL_STATUS); + } + /** + * @param {PrimaryAudioSource} source - References signal "CPM_Stereo_PAS_Source". See PrimaryAudioSource. + * @return {DeviceStatus} + */ + + + setPrimaryAudioSource(source) { + this.validateType(PrimaryAudioSource, source); + this.setParameter(DeviceStatus.KEY_PRIMARY_AUDIO_SOURCE, source); + return this; + } + /** + * @return {PrimaryAudioSource} + */ + + + getPrimaryAudioSource() { + return this.getObject(PrimaryAudioSource, DeviceStatus.KEY_PRIMARY_AUDIO_SOURCE); + } + /** + * @param {Boolean} active - References signal "eCall_Event". + * @return {DeviceStatus} + */ + + + setECallEventActive(active) { + this.setParameter(DeviceStatus.KEY_E_CALL_EVENT_ACTIVE, active); + return this; + } + /** + * @return {Boolean} + */ + + + getECallEventActive() { + return this.getParameter(DeviceStatus.KEY_E_CALL_EVENT_ACTIVE); + } + + } + + DeviceStatus.KEY_VOICE_REC_ON = 'voiceRecOn'; + DeviceStatus.KEY_BT_ICON_ON = 'btIconOn'; + DeviceStatus.KEY_CALL_ACTIVE = 'callActive'; + DeviceStatus.KEY_PHONE_ROAMING = 'phoneRoaming'; + DeviceStatus.KEY_TEXT_MSG_AVAILABLE = 'textMsgAvailable'; + DeviceStatus.KEY_BATT_LEVEL_STATUS = 'battLevelStatus'; + DeviceStatus.KEY_STEREO_AUDIO_OUTPUT_MUTED = 'stereoAudioOutputMuted'; + DeviceStatus.KEY_MONO_AUDIO_OUTPUT_MUTED = 'monoAudioOutputMuted'; + DeviceStatus.KEY_SIGNAL_LEVEL_STATUS = 'signalLevelStatus'; + DeviceStatus.KEY_PRIMARY_AUDIO_SOURCE = 'primaryAudioSource'; + DeviceStatus.KEY_E_CALL_EVENT_ACTIVE = 'eCallEventActive'; + + /* eslint-disable camelcase */ + /** + * Reflects the status of the wipers. + * @typedef {Enum} WiperStatus + * @property {Object} _MAP + */ + + class WiperStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get OFF() { + return WiperStatus._MAP.OFF; + } + /** + * @return {String} + */ + + + static get AUTO_OFF() { + return WiperStatus._MAP.AUTO_OFF; + } + /** + * @return {String} + */ + + + static get OFF_MOVING() { + return WiperStatus._MAP.OFF_MOVING; + } + /** + * @return {String} + */ + + + static get MAN_INT_OFF() { + return WiperStatus._MAP.MAN_INT_OFF; + } + /** + * @return {String} + */ + + + static get MAN_INT_ON() { + return WiperStatus._MAP.MAN_INT_ON; + } + /** + * @return {String} + */ + + + static get MAN_LOW() { + return WiperStatus._MAP.MAN_LOW; + } + /** + * @return {String} + */ + + + static get MAN_HIGH() { + return WiperStatus._MAP.MAN_HIGH; + } + /** + * @return {String} + */ + + + static get MAN_FLICK() { + return WiperStatus._MAP.MAN_FLICK; + } + /** + * @return {String} + */ + + + static get WASH() { + return WiperStatus._MAP.WASH; + } + /** + * @return {String} + */ + + + static get AUTO_LOW() { + return WiperStatus._MAP.AUTO_LOW; + } + /** + * @return {String} + */ + + + static get AUTO_HIGH() { + return WiperStatus._MAP.AUTO_HIGH; + } + /** + * @return {String} + */ + + + static get COURTESYWIPE() { + return WiperStatus._MAP.COURTESYWIPE; + } + /** + * @return {String} + */ + + + static get AUTO_ADJUST() { + return WiperStatus._MAP.AUTO_ADJUST; + } + /** + * @return {String} + */ + + + static get STALLED() { + return WiperStatus._MAP.STALLED; + } + /** + * @return {String} + */ + + + static get NO_DATA_EXISTS() { + return WiperStatus._MAP.NO_DATA_EXISTS; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return WiperStatus._valueForKey(key, WiperStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return WiperStatus._keyForValue(value, WiperStatus._MAP); + } + + } + + WiperStatus._MAP = Object.freeze({ + 'OFF': 'OFF', + 'AUTO_OFF': 'AUTO_OFF', + 'OFF_MOVING': 'OFF_MOVING', + 'MAN_INT_OFF': 'MAN_INT_OFF', + 'MAN_INT_ON': 'MAN_INT_ON', + 'MAN_LOW': 'MAN_LOW', + 'MAN_HIGH': 'MAN_HIGH', + 'MAN_FLICK': 'MAN_FLICK', + 'WASH': 'WASH', + 'AUTO_LOW': 'AUTO_LOW', + 'AUTO_HIGH': 'AUTO_HIGH', + 'COURTESYWIPE': 'COURTESYWIPE', + 'AUTO_ADJUST': 'AUTO_ADJUST', + 'STALLED': 'STALLED', + 'NO_DATA_EXISTS': 'NO_DATA_EXISTS' + }); + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} ElectronicParkBrakeStatus + * @property {Object} _MAP + */ + + class ElectronicParkBrakeStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * Park brake actuators have been fully applied. + * @return {String} + */ + + + static get CLOSED() { + return ElectronicParkBrakeStatus._MAP.CLOSED; + } + /** + * Park brake actuators are transitioning to either Apply/Closed or Release/Open state. + * @return {String} + */ + + + static get TRANSITION() { + return ElectronicParkBrakeStatus._MAP.TRANSITION; + } + /** + * Park brake actuators are released. + * @return {String} + */ + + + static get OPEN() { + return ElectronicParkBrakeStatus._MAP.OPEN; + } + /** + * When driver pulls the Electronic Park Brake switch while driving "at speed". + * @return {String} + */ + + + static get DRIVE_ACTIVE() { + return ElectronicParkBrakeStatus._MAP.DRIVE_ACTIVE; + } + /** + * When system has a fault or is under maintenance. + * @return {String} + */ + + + static get FAULT() { + return ElectronicParkBrakeStatus._MAP.FAULT; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return ElectronicParkBrakeStatus._valueForKey(key, ElectronicParkBrakeStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return ElectronicParkBrakeStatus._keyForValue(value, ElectronicParkBrakeStatus._MAP); + } + + } + + ElectronicParkBrakeStatus._MAP = Object.freeze({ + 'CLOSED': 'CLOSED', + 'TRANSITION': 'TRANSITION', + 'OPEN': 'OPEN', + 'DRIVE_ACTIVE': 'DRIVE_ACTIVE', + 'FAULT': 'FAULT' + }); + + /* eslint-disable camelcase */ + /** + * Reflects the status of a binary vehicle data item. + * @typedef {Enum} VehicleDataStatus + * @property {Object} _MAP + */ + + class VehicleDataStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get VDS_NO_DATA_EXISTS() { + return VehicleDataStatus._MAP.VDS_NO_DATA_EXISTS; + } + /** + * @return {String} + */ + + + static get VDS_OFF() { + return VehicleDataStatus._MAP.VDS_OFF; + } + /** + * @return {String} + */ + + + static get VDS_ON() { + return VehicleDataStatus._MAP.VDS_ON; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return VehicleDataStatus._valueForKey(key, VehicleDataStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return VehicleDataStatus._keyForValue(value, VehicleDataStatus._MAP); + } + + } + + VehicleDataStatus._MAP = Object.freeze({ + 'VDS_NO_DATA_EXISTS': 'NO_DATA_EXISTS', + 'VDS_OFF': 'OFF', + 'VDS_ON': 'ON' + }); + + /* eslint-disable camelcase */ + + class MyKey extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {VehicleDataStatus} e911override - Indicates whether e911 override is on. References signal + * "MyKey_e911Override_St". See VehicleDataStatus. + * @return {MyKey} + */ + + + setE911Override(e911override) { + this.validateType(VehicleDataStatus, e911override); + this.setParameter(MyKey.KEY_E911OVERRIDE, e911override); + return this; + } + /** + * @return {VehicleDataStatus} + */ + + + getE911Override() { + return this.getObject(VehicleDataStatus, MyKey.KEY_E911OVERRIDE); + } + + } + + MyKey.KEY_E911OVERRIDE = 'e911Override'; + + /* eslint-disable camelcase */ + /** + * The list of potential compass directions + * @typedef {Enum} CompassDirection + * @property {Object} _MAP + */ + + class CompassDirection extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get NORTH() { + return CompassDirection._MAP.NORTH; + } + /** + * @return {String} + */ + + + static get NORTHWEST() { + return CompassDirection._MAP.NORTHWEST; + } + /** + * @return {String} + */ + + + static get WEST() { + return CompassDirection._MAP.WEST; + } + /** + * @return {String} + */ + + + static get SOUTHWEST() { + return CompassDirection._MAP.SOUTHWEST; + } + /** + * @return {String} + */ + + + static get SOUTH() { + return CompassDirection._MAP.SOUTH; + } + /** + * @return {String} + */ + + + static get SOUTHEAST() { + return CompassDirection._MAP.SOUTHEAST; + } + /** + * @return {String} + */ + + + static get EAST() { + return CompassDirection._MAP.EAST; + } + /** + * @return {String} + */ + + + static get NORTHEAST() { + return CompassDirection._MAP.NORTHEAST; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return CompassDirection._valueForKey(key, CompassDirection._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return CompassDirection._keyForValue(value, CompassDirection._MAP); + } + + } + + CompassDirection._MAP = Object.freeze({ + 'NORTH': 'NORTH', + 'NORTHWEST': 'NORTHWEST', + 'WEST': 'WEST', + 'SOUTHWEST': 'SOUTHWEST', + 'SOUTH': 'SOUTH', + 'SOUTHEAST': 'SOUTHEAST', + 'EAST': 'EAST', + 'NORTHEAST': 'NORTHEAST' + }); + + /* eslint-disable camelcase */ + /** + * The supported dimensions of the GPS + * @typedef {Enum} Dimension + * @property {Object} _MAP + */ + + class Dimension extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * No GPS at all + * @return {String} + */ + + + static get Dimension_NO_FIX() { + return Dimension._MAP.Dimension_NO_FIX; + } + /** + * Longitude and latitude + * @return {String} + */ + + + static get Dimension_2D() { + return Dimension._MAP.Dimension_2D; + } + /** + * Longitude and latitude and altitude + * @return {String} + */ + + + static get Dimension_3D() { + return Dimension._MAP.Dimension_3D; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return Dimension._valueForKey(key, Dimension._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return Dimension._keyForValue(value, Dimension._MAP); + } + + } + + Dimension._MAP = Object.freeze({ + 'Dimension_NO_FIX': 'NO_FIX', + 'Dimension_2D': '2D', + 'Dimension_3D': '3D' + }); + + /* eslint-disable camelcase */ + /** + * Struct with the GPS data. + */ + + class GPSData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} degrees + * @return {GPSData} + */ + + + setLongitudeDegrees(degrees) { + this.setParameter(GPSData.KEY_LONGITUDE_DEGREES, degrees); + return this; + } + /** + * @return {Number} + */ + + + getLongitudeDegrees() { + return this.getParameter(GPSData.KEY_LONGITUDE_DEGREES); + } + /** + * @param {Number} degrees + * @return {GPSData} + */ + + + setLatitudeDegrees(degrees) { + this.setParameter(GPSData.KEY_LATITUDE_DEGREES, degrees); + return this; + } + /** + * @return {Number} + */ + + + getLatitudeDegrees() { + return this.getParameter(GPSData.KEY_LATITUDE_DEGREES); + } + /** + * @param {Number} year - The current UTC year. + * @return {GPSData} + */ + + + setUtcYear(year) { + this.setParameter(GPSData.KEY_UTC_YEAR, year); + return this; + } + /** + * @return {Number} + */ + + + getUtcYear() { + return this.getParameter(GPSData.KEY_UTC_YEAR); + } + /** + * @param {Number} month - The current UTC month. + * @return {GPSData} + */ + + + setUtcMonth(month) { + this.setParameter(GPSData.KEY_UTC_MONTH, month); + return this; + } + /** + * @return {Number} + */ + + + getUtcMonth() { + return this.getParameter(GPSData.KEY_UTC_MONTH); + } + /** + * @param {Number} day - The current UTC day. + * @return {GPSData} + */ + + + setUtcDay(day) { + this.setParameter(GPSData.KEY_UTC_DAY, day); + return this; + } + /** + * @return {Number} + */ + + + getUtcDay() { + return this.getParameter(GPSData.KEY_UTC_DAY); + } + /** + * @param {Number} hours - The current UTC hour. + * @return {GPSData} + */ + + + setUtcHours(hours) { + this.setParameter(GPSData.KEY_UTC_HOURS, hours); + return this; + } + /** + * @return {Number} + */ + + + getUtcHours() { + return this.getParameter(GPSData.KEY_UTC_HOURS); + } + /** + * @param {Number} minutes - The current UTC minute. + * @return {GPSData} + */ + + + setUtcMinutes(minutes) { + this.setParameter(GPSData.KEY_UTC_MINUTES, minutes); + return this; + } + /** + * @return {Number} + */ + + + getUtcMinutes() { + return this.getParameter(GPSData.KEY_UTC_MINUTES); + } + /** + * @param {Number} seconds - The current UTC second. + * @return {GPSData} + */ + + + setUtcSeconds(seconds) { + this.setParameter(GPSData.KEY_UTC_SECONDS, seconds); + return this; + } + /** + * @return {Number} + */ + + + getUtcSeconds() { + return this.getParameter(GPSData.KEY_UTC_SECONDS); + } + /** + * @param {CompassDirection} direction - See CompassDirection. + * @return {GPSData} + */ + + + setCompassDirection(direction) { + this.validateType(CompassDirection, direction); + this.setParameter(GPSData.KEY_COMPASS_DIRECTION, direction); + return this; + } + /** + * @return {CompassDirection} + */ + + + getCompassDirection() { + return this.getObject(CompassDirection, GPSData.KEY_COMPASS_DIRECTION); + } + /** + * @param {Number} pdop - PDOP. If undefined or unavailable, then value shall be set to 0. + * @return {GPSData} + */ + + + setPdop(pdop) { + this.setParameter(GPSData.KEY_PDOP, pdop); + return this; + } + /** + * @return {Number} + */ + + + getPdop() { + return this.getParameter(GPSData.KEY_PDOP); + } + /** + * @param {Number} hdop - HDOP. If value is unknown, value shall be set to 0. + * @return {GPSData} + */ + + + setHdop(hdop) { + this.setParameter(GPSData.KEY_HDOP, hdop); + return this; + } + /** + * @return {Number} + */ + + + getHdop() { + return this.getParameter(GPSData.KEY_HDOP); + } + /** + * @param {Number} vdop - VDOP. If value is unknown, value shall be set to 0. + * @return {GPSData} + */ + + + setVdop(vdop) { + this.setParameter(GPSData.KEY_VDOP, vdop); + return this; + } + /** + * @return {Number} + */ + + + getVdop() { + return this.getParameter(GPSData.KEY_VDOP); + } + /** + * @param {Boolean} actual - True, if actual. False, if inferred. + * @return {GPSData} + */ + + + setActual(actual) { + this.setParameter(GPSData.KEY_ACTUAL, actual); + return this; + } + /** + * @return {Boolean} + */ + + + getActual() { + return this.getParameter(GPSData.KEY_ACTUAL); + } + /** + * @param {Number} satellites - Number of satellites in view + * @return {GPSData} + */ + + + setSatellites(satellites) { + this.setParameter(GPSData.KEY_SATELLITES, satellites); + return this; + } + /** + * @return {Number} + */ + + + getSatellites() { + return this.getParameter(GPSData.KEY_SATELLITES); + } + /** + * @param {Dimension} dimension - See Dimension + * @return {GPSData} + */ + + + setDimension(dimension) { + this.validateType(Dimension, dimension); + this.setParameter(GPSData.KEY_DIMENSION, dimension); + return this; + } + /** + * @return {Dimension} + */ + + + getDimension() { + return this.getObject(Dimension, GPSData.KEY_DIMENSION); + } + /** + * @param {Number} altitude - Altitude in meters + * @return {GPSData} + */ + + + setAltitude(altitude) { + this.setParameter(GPSData.KEY_ALTITUDE, altitude); + return this; + } + /** + * @return {Number} + */ + + + getAltitude() { + return this.getParameter(GPSData.KEY_ALTITUDE); + } + /** + * @param {Number} heading - The heading. North is 0. Resolution is 0.01 + * @return {GPSData} + */ + + + setHeading(heading) { + this.setParameter(GPSData.KEY_HEADING, heading); + return this; + } + /** + * @return {Number} + */ + + + getHeading() { + return this.getParameter(GPSData.KEY_HEADING); + } + /** + * @param {Number} speed - The speed in KPH + * @return {GPSData} + */ + + + setSpeed(speed) { + this.setParameter(GPSData.KEY_SPEED, speed); + return this; + } + /** + * @return {Number} + */ + + + getSpeed() { + return this.getParameter(GPSData.KEY_SPEED); + } + /** + * @param {Boolean} shifted - True, if GPS lat/long, time, and altitude have been purposefully shifted (requires a + * proprietary algorithm to unshift). False, if the GPS data is raw and un-shifted. If + * not provided, then value is assumed False. + * @return {GPSData} + */ + + + setShifted(shifted) { + this.setParameter(GPSData.KEY_SHIFTED, shifted); + return this; + } + /** + * @return {Boolean} + */ + + + getShifted() { + return this.getParameter(GPSData.KEY_SHIFTED); + } + + } + + GPSData.KEY_LONGITUDE_DEGREES = 'longitudeDegrees'; + GPSData.KEY_LATITUDE_DEGREES = 'latitudeDegrees'; + GPSData.KEY_UTC_YEAR = 'utcYear'; + GPSData.KEY_UTC_MONTH = 'utcMonth'; + GPSData.KEY_UTC_DAY = 'utcDay'; + GPSData.KEY_UTC_HOURS = 'utcHours'; + GPSData.KEY_UTC_MINUTES = 'utcMinutes'; + GPSData.KEY_UTC_SECONDS = 'utcSeconds'; + GPSData.KEY_COMPASS_DIRECTION = 'compassDirection'; + GPSData.KEY_PDOP = 'pdop'; + GPSData.KEY_HDOP = 'hdop'; + GPSData.KEY_VDOP = 'vdop'; + GPSData.KEY_ACTUAL = 'actual'; + GPSData.KEY_SATELLITES = 'satellites'; + GPSData.KEY_DIMENSION = 'dimension'; + GPSData.KEY_ALTITUDE = 'altitude'; + GPSData.KEY_HEADING = 'heading'; + GPSData.KEY_SPEED = 'speed'; + GPSData.KEY_SHIFTED = 'shifted'; + + /* eslint-disable camelcase */ + /** + * The selected gear. + * @typedef {Enum} PRNDL + * @property {Object} _MAP + */ + + class PRNDL extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * Parking + * @return {String} + */ + + + static get PARK() { + return PRNDL._MAP.PARK; + } + /** + * Reverse gear + * @return {String} + */ + + + static get REVERSE() { + return PRNDL._MAP.REVERSE; + } + /** + * No gear + * @return {String} + */ + + + static get NEUTRAL() { + return PRNDL._MAP.NEUTRAL; + } + /** + * @return {String} + */ + + + static get DRIVE() { + return PRNDL._MAP.DRIVE; + } + /** + * Drive Sport mode + * @return {String} + */ + + + static get SPORT() { + return PRNDL._MAP.SPORT; + } + /** + * 1st gear hold + * @return {String} + */ + + + static get LOWGEAR() { + return PRNDL._MAP.LOWGEAR; + } + /** + * @return {String} + */ + + + static get FIRST() { + return PRNDL._MAP.FIRST; + } + /** + * @return {String} + */ + + + static get SECOND() { + return PRNDL._MAP.SECOND; + } + /** + * @return {String} + */ + + + static get THIRD() { + return PRNDL._MAP.THIRD; + } + /** + * @return {String} + */ + + + static get FOURTH() { + return PRNDL._MAP.FOURTH; + } + /** + * @return {String} + */ + + + static get FIFTH() { + return PRNDL._MAP.FIFTH; + } + /** + * @return {String} + */ + + + static get SIXTH() { + return PRNDL._MAP.SIXTH; + } + /** + * @return {String} + */ + + + static get SEVENTH() { + return PRNDL._MAP.SEVENTH; + } + /** + * @return {String} + */ + + + static get EIGHTH() { + return PRNDL._MAP.EIGHTH; + } + /** + * @return {String} + */ + + + static get UNKNOWN() { + return PRNDL._MAP.UNKNOWN; + } + /** + * @return {String} + */ + + + static get FAULT() { + return PRNDL._MAP.FAULT; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return PRNDL._valueForKey(key, PRNDL._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return PRNDL._keyForValue(value, PRNDL._MAP); + } + + } + + PRNDL._MAP = Object.freeze({ + 'PARK': 'PARK', + 'REVERSE': 'REVERSE', + 'NEUTRAL': 'NEUTRAL', + 'DRIVE': 'DRIVE', + 'SPORT': 'SPORT', + 'LOWGEAR': 'LOWGEAR', + 'FIRST': 'FIRST', + 'SECOND': 'SECOND', + 'THIRD': 'THIRD', + 'FOURTH': 'FOURTH', + 'FIFTH': 'FIFTH', + 'SIXTH': 'SIXTH', + 'SEVENTH': 'SEVENTH', + 'EIGHTH': 'EIGHTH', + 'UNKNOWN': 'UNKNOWN', + 'FAULT': 'FAULT' + }); + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} FuelType + * @property {Object} _MAP + */ + + class FuelType extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get GASOLINE() { + return FuelType._MAP.GASOLINE; + } + /** + * @return {String} + */ + + + static get DIESEL() { + return FuelType._MAP.DIESEL; + } + /** + * For vehicles using compressed natural gas. + * @return {String} + */ + + + static get CNG() { + return FuelType._MAP.CNG; + } + /** + * For vehicles using liquefied petroleum gas. + * @return {String} + */ + + + static get LPG() { + return FuelType._MAP.LPG; + } + /** + * For FCEV (fuel cell electric vehicle). + * @return {String} + */ + + + static get HYDROGEN() { + return FuelType._MAP.HYDROGEN; + } + /** + * For BEV (Battery Electric Vehicle), PHEV (Plug-in Hybrid Electric Vehicle), solar vehicles and other vehicles + * which run on a battery. + * @return {String} + */ + + + static get BATTERY() { + return FuelType._MAP.BATTERY; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return FuelType._valueForKey(key, FuelType._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return FuelType._keyForValue(value, FuelType._MAP); + } + + } + + FuelType._MAP = Object.freeze({ + 'GASOLINE': 'GASOLINE', + 'DIESEL': 'DIESEL', + 'CNG': 'CNG', + 'LPG': 'LPG', + 'HYDROGEN': 'HYDROGEN', + 'BATTERY': 'BATTERY' + }); + + /* eslint-disable camelcase */ + + class FuelRange extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {FuelType} type + * @return {FuelRange} + */ + + + setType(type) { + this.validateType(FuelType, type); + this.setParameter(FuelRange.KEY_TYPE, type); + return this; + } + /** + * @return {FuelType} + */ + + + getType() { + return this.getObject(FuelType, FuelRange.KEY_TYPE); + } + /** + * @param {Number} range - The estimate range in KM the vehicle can travel based on fuel level and consumption. + * @return {FuelRange} + */ + + + setRange(range) { + this.setParameter(FuelRange.KEY_RANGE, range); + return this; + } + /** + * @return {Number} + */ + + + getRange() { + return this.getParameter(FuelRange.KEY_RANGE); + } + + } + + FuelRange.KEY_TYPE = 'type'; + FuelRange.KEY_RANGE = 'range'; + + /* eslint-disable camelcase */ + /** + * Reflects the status of a vehicle data notification. + * @typedef {Enum} VehicleDataNotificationStatus + * @property {Object} _MAP + */ + + class VehicleDataNotificationStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get VDNS_NOT_SUPPORTED() { + return VehicleDataNotificationStatus._MAP.VDNS_NOT_SUPPORTED; + } + /** + * @return {String} + */ + + + static get VDNS_NORMAL() { + return VehicleDataNotificationStatus._MAP.VDNS_NORMAL; + } + /** + * @return {String} + */ + + + static get VDNS_ACTIVE() { + return VehicleDataNotificationStatus._MAP.VDNS_ACTIVE; + } + /** + * @return {String} + */ + + + static get VDNS_NOT_USED() { + return VehicleDataNotificationStatus._MAP.VDNS_NOT_USED; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return VehicleDataNotificationStatus._valueForKey(key, VehicleDataNotificationStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return VehicleDataNotificationStatus._keyForValue(value, VehicleDataNotificationStatus._MAP); + } + + } + + VehicleDataNotificationStatus._MAP = Object.freeze({ + 'VDNS_NOT_SUPPORTED': 'NOT_SUPPORTED', + 'VDNS_NORMAL': 'NORMAL', + 'VDNS_ACTIVE': 'ACTIVE', + 'VDNS_NOT_USED': 'NOT_USED' + }); + + /* eslint-disable camelcase */ + /** + * Reflects the status of the eCall Notification. + * @typedef {Enum} ECallConfirmationStatus + * @property {Object} _MAP + */ + + class ECallConfirmationStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get ECCS_NORMAL() { + return ECallConfirmationStatus._MAP.ECCS_NORMAL; + } + /** + * @return {String} + */ + + + static get ECCS_CALL_IN_PROGRESS() { + return ECallConfirmationStatus._MAP.ECCS_CALL_IN_PROGRESS; + } + /** + * @return {String} + */ + + + static get ECCS_CALL_CANCELLED() { + return ECallConfirmationStatus._MAP.ECCS_CALL_CANCELLED; + } + /** + * @return {String} + */ + + + static get CALL_COMPLETED() { + return ECallConfirmationStatus._MAP.CALL_COMPLETED; + } + /** + * @return {String} + */ + + + static get ECCS_CALL_UNSUCCESSFUL() { + return ECallConfirmationStatus._MAP.ECCS_CALL_UNSUCCESSFUL; + } + /** + * @return {String} + */ + + + static get ECCS_ECALL_CONFIGURED_OFF() { + return ECallConfirmationStatus._MAP.ECCS_ECALL_CONFIGURED_OFF; + } + /** + * @return {String} + */ + + + static get ECCS_CALL_COMPLETE_DTMF_TIMEOUT() { + return ECallConfirmationStatus._MAP.ECCS_CALL_COMPLETE_DTMF_TIMEOUT; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return ECallConfirmationStatus._valueForKey(key, ECallConfirmationStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return ECallConfirmationStatus._keyForValue(value, ECallConfirmationStatus._MAP); + } + + } + + ECallConfirmationStatus._MAP = Object.freeze({ + 'ECCS_NORMAL': 'NORMAL', + 'ECCS_CALL_IN_PROGRESS': 'CALL_IN_PROGRESS', + 'ECCS_CALL_CANCELLED': 'CALL_CANCELLED', + 'CALL_COMPLETED': 'CALL_COMPLETED', + 'ECCS_CALL_UNSUCCESSFUL': 'CALL_UNSUCCESSFUL', + 'ECCS_ECALL_CONFIGURED_OFF': 'ECALL_CONFIGURED_OFF', + 'ECCS_CALL_COMPLETE_DTMF_TIMEOUT': 'CALL_COMPLETE_DTMF_TIMEOUT' + }); + + /* eslint-disable camelcase */ + + class ECallInfo extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {VehicleDataNotificationStatus} status - References signal "eCallNotification_4A". See + * VehicleDataNotificationStatus. + * @return {ECallInfo} + */ + + + setECallNotificationStatus(status) { + this.validateType(VehicleDataNotificationStatus, status); + this.setParameter(ECallInfo.KEY_E_CALL_NOTIFICATION_STATUS, status); + return this; + } + /** + * @return {VehicleDataNotificationStatus} + */ + + + getECallNotificationStatus() { + return this.getObject(VehicleDataNotificationStatus, ECallInfo.KEY_E_CALL_NOTIFICATION_STATUS); + } + /** + * @param {VehicleDataNotificationStatus} status - References signal "eCallNotification". See + * VehicleDataNotificationStatus. + * @return {ECallInfo} + */ + + + setAuxECallNotificationStatus(status) { + this.validateType(VehicleDataNotificationStatus, status); + this.setParameter(ECallInfo.KEY_AUX_ECALL_NOTIFICATION_STATUS, status); + return this; + } + /** + * @return {VehicleDataNotificationStatus} + */ + + + getAuxECallNotificationStatus() { + return this.getObject(VehicleDataNotificationStatus, ECallInfo.KEY_AUX_ECALL_NOTIFICATION_STATUS); + } + /** + * @param {ECallConfirmationStatus} status - References signal "eCallConfirmation". See ECallConfirmationStatus. + * @return {ECallInfo} + */ + + + setECallConfirmationStatus(status) { + this.validateType(ECallConfirmationStatus, status); + this.setParameter(ECallInfo.KEY_E_CALL_CONFIRMATION_STATUS, status); + return this; + } + /** + * @return {ECallConfirmationStatus} + */ + + + getECallConfirmationStatus() { + return this.getObject(ECallConfirmationStatus, ECallInfo.KEY_E_CALL_CONFIRMATION_STATUS); + } + + } + + ECallInfo.KEY_E_CALL_NOTIFICATION_STATUS = 'eCallNotificationStatus'; + ECallInfo.KEY_AUX_ECALL_NOTIFICATION_STATUS = 'auxECallNotificationStatus'; + ECallInfo.KEY_E_CALL_CONFIRMATION_STATUS = 'eCallConfirmationStatus'; + + /* eslint-disable camelcase */ + + class BeltStatus extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsDrvBelt_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + + + setDriverBeltDeployed(deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(BeltStatus.KEY_DRIVER_BELT_DEPLOYED, deployed); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getDriverBeltDeployed() { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_DRIVER_BELT_DEPLOYED); + } + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsPasBelt_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + + + setPassengerBeltDeployed(deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(BeltStatus.KEY_PASSENGER_BELT_DEPLOYED, deployed); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getPassengerBeltDeployed() { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_PASSENGER_BELT_DEPLOYED); + } + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw1PasBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + + + setPassengerBuckleBelted(belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_PASSENGER_BUCKLE_BELTED, belted); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getPassengerBuckleBelted() { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_PASSENGER_BUCKLE_BELTED); + } + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw1DrvBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + + + setDriverBuckleBelted(belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_DRIVER_BUCKLE_BELTED, belted); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getDriverBuckleBelted() { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_DRIVER_BUCKLE_BELTED); + } + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw2lBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + + + setLeftRow2BuckleBelted(belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_LEFT_ROW2BUCKLE_BELTED, belted); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getLeftRow2BuckleBelted() { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_LEFT_ROW2BUCKLE_BELTED); + } + /** + * @param {VehicleDataEventStatus} detected - References signal "VedsRw1PasChld_D_Ltchd". See + * VehicleDataEventStatus. + * @return {BeltStatus} + */ + + + setPassengerChildDetected(detected) { + this.validateType(VehicleDataEventStatus, detected); + this.setParameter(BeltStatus.KEY_PASSENGER_CHILD_DETECTED, detected); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getPassengerChildDetected() { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_PASSENGER_CHILD_DETECTED); + } + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw2rBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + + + setRightRow2BuckleBelted(belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_RIGHT_ROW2BUCKLE_BELTED, belted); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getRightRow2BuckleBelted() { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_RIGHT_ROW2BUCKLE_BELTED); + } + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw2mBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + + + setMiddleRow2BuckleBelted(belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_MIDDLE_ROW2BUCKLE_BELTED, belted); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getMiddleRow2BuckleBelted() { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_MIDDLE_ROW2BUCKLE_BELTED); + } + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw3mBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + + + setMiddleRow3BuckleBelted(belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_MIDDLE_ROW3BUCKLE_BELTED, belted); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getMiddleRow3BuckleBelted() { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_MIDDLE_ROW3BUCKLE_BELTED); + } + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw3lBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + + + setLeftRow3BuckleBelted(belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_LEFT_ROW3BUCKLE_BELTED, belted); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getLeftRow3BuckleBelted() { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_LEFT_ROW3BUCKLE_BELTED); + } + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw3rBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + + + setRightRow3BuckleBelted(belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_RIGHT_ROW3BUCKLE_BELTED, belted); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getRightRow3BuckleBelted() { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_RIGHT_ROW3BUCKLE_BELTED); + } + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw2lRib_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + + + setLeftRearInflatableBelted(belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_LEFT_REAR_INFLATABLE_BELTED, belted); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getLeftRearInflatableBelted() { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_LEFT_REAR_INFLATABLE_BELTED); + } + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw2rRib_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + + + setRightRearInflatableBelted(belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_RIGHT_REAR_INFLATABLE_BELTED, belted); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getRightRearInflatableBelted() { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_RIGHT_REAR_INFLATABLE_BELTED); + } + /** + * @param {VehicleDataEventStatus} deployed - References signal "VedsRw1mBelt_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + + + setMiddleRow1BeltDeployed(deployed) { + this.validateType(VehicleDataEventStatus, deployed); + this.setParameter(BeltStatus.KEY_MIDDLE_ROW1BELT_DEPLOYED, deployed); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getMiddleRow1BeltDeployed() { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_MIDDLE_ROW1BELT_DEPLOYED); + } + /** + * @param {VehicleDataEventStatus} belted - References signal "VedsRw1mBckl_D_Ltchd". See VehicleDataEventStatus. + * @return {BeltStatus} + */ + + + setMiddleRow1BuckleBelted(belted) { + this.validateType(VehicleDataEventStatus, belted); + this.setParameter(BeltStatus.KEY_MIDDLE_ROW1BUCKLE_BELTED, belted); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getMiddleRow1BuckleBelted() { + return this.getObject(VehicleDataEventStatus, BeltStatus.KEY_MIDDLE_ROW1BUCKLE_BELTED); + } + + } + + BeltStatus.KEY_DRIVER_BELT_DEPLOYED = 'driverBeltDeployed'; + BeltStatus.KEY_PASSENGER_BELT_DEPLOYED = 'passengerBeltDeployed'; + BeltStatus.KEY_PASSENGER_BUCKLE_BELTED = 'passengerBuckleBelted'; + BeltStatus.KEY_DRIVER_BUCKLE_BELTED = 'driverBuckleBelted'; + BeltStatus.KEY_LEFT_ROW2BUCKLE_BELTED = 'leftRow2BuckleBelted'; + BeltStatus.KEY_PASSENGER_CHILD_DETECTED = 'passengerChildDetected'; + BeltStatus.KEY_RIGHT_ROW2BUCKLE_BELTED = 'rightRow2BuckleBelted'; + BeltStatus.KEY_MIDDLE_ROW2BUCKLE_BELTED = 'middleRow2BuckleBelted'; + BeltStatus.KEY_MIDDLE_ROW3BUCKLE_BELTED = 'middleRow3BuckleBelted'; + BeltStatus.KEY_LEFT_ROW3BUCKLE_BELTED = 'leftRow3BuckleBelted'; + BeltStatus.KEY_RIGHT_ROW3BUCKLE_BELTED = 'rightRow3BuckleBelted'; + BeltStatus.KEY_LEFT_REAR_INFLATABLE_BELTED = 'leftRearInflatableBelted'; + BeltStatus.KEY_RIGHT_REAR_INFLATABLE_BELTED = 'rightRearInflatableBelted'; + BeltStatus.KEY_MIDDLE_ROW1BELT_DEPLOYED = 'middleRow1BeltDeployed'; + BeltStatus.KEY_MIDDLE_ROW1BUCKLE_BELTED = 'middleRow1BuckleBelted'; + + /* eslint-disable camelcase */ + /** + * The volume status of a vehicle component. + * @typedef {Enum} ComponentVolumeStatus + * @property {Object} _MAP + */ + + class ComponentVolumeStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get CVS_UNKNOWN() { + return ComponentVolumeStatus._MAP.CVS_UNKNOWN; + } + /** + * @return {String} + */ + + + static get CVS_NORMAL() { + return ComponentVolumeStatus._MAP.CVS_NORMAL; + } + /** + * @return {String} + */ + + + static get CVS_LOW() { + return ComponentVolumeStatus._MAP.CVS_LOW; + } + /** + * @return {String} + */ + + + static get CVS_FAULT() { + return ComponentVolumeStatus._MAP.CVS_FAULT; + } + /** + * @return {String} + */ + + + static get CVS_ALERT() { + return ComponentVolumeStatus._MAP.CVS_ALERT; + } + /** + * @return {String} + */ + + + static get CVS_NOT_SUPPORTED() { + return ComponentVolumeStatus._MAP.CVS_NOT_SUPPORTED; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return ComponentVolumeStatus._valueForKey(key, ComponentVolumeStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return ComponentVolumeStatus._keyForValue(value, ComponentVolumeStatus._MAP); + } + + } + + ComponentVolumeStatus._MAP = Object.freeze({ + 'CVS_UNKNOWN': 'UNKNOWN', + 'CVS_NORMAL': 'NORMAL', + 'CVS_LOW': 'LOW', + 'CVS_FAULT': 'FAULT', + 'CVS_ALERT': 'ALERT', + 'CVS_NOT_SUPPORTED': 'NOT_SUPPORTED' + }); + + /* eslint-disable camelcase */ + /** + * Reflects the status of ignition. + * @typedef {Enum} IgnitionStatus + * @property {Object} _MAP + */ + + class IgnitionStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get IS_UNKNOWN() { + return IgnitionStatus._MAP.IS_UNKNOWN; + } + /** + * @return {String} + */ + + + static get IS_OFF() { + return IgnitionStatus._MAP.IS_OFF; + } + /** + * @return {String} + */ + + + static get IS_ACCESSORY() { + return IgnitionStatus._MAP.IS_ACCESSORY; + } + /** + * @return {String} + */ + + + static get IS_RUN() { + return IgnitionStatus._MAP.IS_RUN; + } + /** + * @return {String} + */ + + + static get IS_START() { + return IgnitionStatus._MAP.IS_START; + } + /** + * @return {String} + */ + + + static get IS_INVALID() { + return IgnitionStatus._MAP.IS_INVALID; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return IgnitionStatus._valueForKey(key, IgnitionStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return IgnitionStatus._keyForValue(value, IgnitionStatus._MAP); + } + + } + + IgnitionStatus._MAP = Object.freeze({ + 'IS_UNKNOWN': 'UNKNOWN', + 'IS_OFF': 'OFF', + 'IS_ACCESSORY': 'ACCESSORY', + 'IS_RUN': 'RUN', + 'IS_START': 'START', + 'IS_INVALID': 'INVALID' + }); + + /* eslint-disable camelcase */ + /** + * Reflects the ignition switch stability. + * @typedef {Enum} IgnitionStableStatus + * @property {Object} _MAP + */ + + class IgnitionStableStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get IGNITION_SWITCH_NOT_STABLE() { + return IgnitionStableStatus._MAP.IGNITION_SWITCH_NOT_STABLE; + } + /** + * @return {String} + */ + + + static get IGNITION_SWITCH_STABLE() { + return IgnitionStableStatus._MAP.IGNITION_SWITCH_STABLE; + } + /** + * @return {String} + */ + + + static get MISSING_FROM_TRANSMITTER() { + return IgnitionStableStatus._MAP.MISSING_FROM_TRANSMITTER; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return IgnitionStableStatus._valueForKey(key, IgnitionStableStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return IgnitionStableStatus._keyForValue(value, IgnitionStableStatus._MAP); + } + + } + + IgnitionStableStatus._MAP = Object.freeze({ + 'IGNITION_SWITCH_NOT_STABLE': 'IGNITION_SWITCH_NOT_STABLE', + 'IGNITION_SWITCH_STABLE': 'IGNITION_SWITCH_STABLE', + 'MISSING_FROM_TRANSMITTER': 'MISSING_FROM_TRANSMITTER' + }); + + /* eslint-disable camelcase */ + + class BodyInformation extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Boolean} active - References signal "PrkBrkActv_B_Actl". + * @return {BodyInformation} + */ + + + setParkBrakeActive(active) { + this.setParameter(BodyInformation.KEY_PARK_BRAKE_ACTIVE, active); + return this; + } + /** + * @return {Boolean} + */ + + + getParkBrakeActive() { + return this.getParameter(BodyInformation.KEY_PARK_BRAKE_ACTIVE); + } + /** + * @param {IgnitionStableStatus} status - References signal "Ignition_Switch_Stable". See IgnitionStableStatus. + * @return {BodyInformation} + */ + + + setIgnitionStableStatus(status) { + this.validateType(IgnitionStableStatus, status); + this.setParameter(BodyInformation.KEY_IGNITION_STABLE_STATUS, status); + return this; + } + /** + * @return {IgnitionStableStatus} + */ + + + getIgnitionStableStatus() { + return this.getObject(IgnitionStableStatus, BodyInformation.KEY_IGNITION_STABLE_STATUS); + } + /** + * @param {IgnitionStatus} status - References signal "Ignition_status". See IgnitionStatus. + * @return {BodyInformation} + */ + + + setIgnitionStatus(status) { + this.validateType(IgnitionStatus, status); + this.setParameter(BodyInformation.KEY_IGNITION_STATUS, status); + return this; + } + /** + * @return {IgnitionStatus} + */ + + + getIgnitionStatus() { + return this.getObject(IgnitionStatus, BodyInformation.KEY_IGNITION_STATUS); + } + /** + * @param {Boolean} ajar - References signal "DrStatDrv_B_Actl". + * @return {BodyInformation} + */ + + + setDriverDoorAjar(ajar) { + this.setParameter(BodyInformation.KEY_DRIVER_DOOR_AJAR, ajar); + return this; + } + /** + * @return {Boolean} + */ + + + getDriverDoorAjar() { + return this.getParameter(BodyInformation.KEY_DRIVER_DOOR_AJAR); + } + /** + * @param {Boolean} ajar - References signal "DrStatPsngr_B_Actl". + * @return {BodyInformation} + */ + + + setPassengerDoorAjar(ajar) { + this.setParameter(BodyInformation.KEY_PASSENGER_DOOR_AJAR, ajar); + return this; + } + /** + * @return {Boolean} + */ + + + getPassengerDoorAjar() { + return this.getParameter(BodyInformation.KEY_PASSENGER_DOOR_AJAR); + } + /** + * @param {Boolean} ajar - References signal "DrStatRl_B_Actl". + * @return {BodyInformation} + */ + + + setRearLeftDoorAjar(ajar) { + this.setParameter(BodyInformation.KEY_REAR_LEFT_DOOR_AJAR, ajar); + return this; + } + /** + * @return {Boolean} + */ + + + getRearLeftDoorAjar() { + return this.getParameter(BodyInformation.KEY_REAR_LEFT_DOOR_AJAR); + } + /** + * @param {Boolean} ajar - References signal "DrStatRr_B_Actl". + * @return {BodyInformation} + */ + + + setRearRightDoorAjar(ajar) { + this.setParameter(BodyInformation.KEY_REAR_RIGHT_DOOR_AJAR, ajar); + return this; + } + /** + * @return {Boolean} + */ + + + getRearRightDoorAjar() { + return this.getParameter(BodyInformation.KEY_REAR_RIGHT_DOOR_AJAR); + } + + } + + BodyInformation.KEY_PARK_BRAKE_ACTIVE = 'parkBrakeActive'; + BodyInformation.KEY_IGNITION_STABLE_STATUS = 'ignitionStableStatus'; + BodyInformation.KEY_IGNITION_STATUS = 'ignitionStatus'; + BodyInformation.KEY_DRIVER_DOOR_AJAR = 'driverDoorAjar'; + BodyInformation.KEY_PASSENGER_DOOR_AJAR = 'passengerDoorAjar'; + BodyInformation.KEY_REAR_LEFT_DOOR_AJAR = 'rearLeftDoorAjar'; + BodyInformation.KEY_REAR_RIGHT_DOOR_AJAR = 'rearRightDoorAjar'; + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} TPMS + * @property {Object} _MAP + */ + + class TPMS extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * If set the status of the tire is not known. + * @return {String} + */ + + + static get UNKNOWN() { + return TPMS._MAP.UNKNOWN; + } + /** + * TPMS does not function. + * @return {String} + */ + + + static get SYSTEM_FAULT() { + return TPMS._MAP.SYSTEM_FAULT; + } + /** + * The sensor of the tire does not function. + * @return {String} + */ + + + static get SENSOR_FAULT() { + return TPMS._MAP.SENSOR_FAULT; + } + /** + * TPMS is reporting a low tire pressure for the tire. + * @return {String} + */ + + + static get LOW() { + return TPMS._MAP.LOW; + } + /** + * TPMS is active and the tire pressure is monitored. + * @return {String} + */ + + + static get SYSTEM_ACTIVE() { + return TPMS._MAP.SYSTEM_ACTIVE; + } + /** + * TPMS is reporting that the tire must be trained. + * @return {String} + */ + + + static get TRAIN() { + return TPMS._MAP.TRAIN; + } + /** + * TPMS reports the training for the tire is completed. + * @return {String} + */ + + + static get TRAINING_COMPLETE() { + return TPMS._MAP.TRAINING_COMPLETE; + } + /** + * TPMS reports the tire is not trained. + * @return {String} + */ + + + static get NOT_TRAINED() { + return TPMS._MAP.NOT_TRAINED; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return TPMS._valueForKey(key, TPMS._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return TPMS._keyForValue(value, TPMS._MAP); + } + + } + + TPMS._MAP = Object.freeze({ + 'UNKNOWN': 'UNKNOWN', + 'SYSTEM_FAULT': 'SYSTEM_FAULT', + 'SENSOR_FAULT': 'SENSOR_FAULT', + 'LOW': 'LOW', + 'SYSTEM_ACTIVE': 'SYSTEM_ACTIVE', + 'TRAIN': 'TRAIN', + 'TRAINING_COMPLETE': 'TRAINING_COMPLETE', + 'NOT_TRAINED': 'NOT_TRAINED' + }); + + /* eslint-disable camelcase */ + + class SingleTireStatus extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {ComponentVolumeStatus} status - See ComponentVolumeStatus. + * @return {SingleTireStatus} + */ + + + setStatus(status) { + this.validateType(ComponentVolumeStatus, status); + this.setParameter(SingleTireStatus.KEY_STATUS, status); + return this; + } + /** + * @return {ComponentVolumeStatus} + */ + + + getStatus() { + return this.getObject(ComponentVolumeStatus, SingleTireStatus.KEY_STATUS); + } + /** + * @param {TPMS} tpms - The status of TPMS according to the particular tire. + * @return {SingleTireStatus} + */ + + + setTpms(tpms) { + this.validateType(TPMS, tpms); + this.setParameter(SingleTireStatus.KEY_TPMS, tpms); + return this; + } + /** + * @return {TPMS} + */ + + + getTpms() { + return this.getObject(TPMS, SingleTireStatus.KEY_TPMS); + } + /** + * @param {Number} pressure - The pressure value of the particular tire in kilo pascal. + * @return {SingleTireStatus} + */ + + + setPressure(pressure) { + this.setParameter(SingleTireStatus.KEY_PRESSURE, pressure); + return this; + } + /** + * @return {Number} + */ + + + getPressure() { + return this.getParameter(SingleTireStatus.KEY_PRESSURE); + } + + } + + SingleTireStatus.KEY_STATUS = 'status'; + SingleTireStatus.KEY_TPMS = 'tpms'; + SingleTireStatus.KEY_PRESSURE = 'pressure'; + + /* eslint-disable camelcase */ + /** + * Reflects the status of a cluster instrument warning light. + * @typedef {Enum} WarningLightStatus + * @property {Object} _MAP + */ + + class WarningLightStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get WLS_OFF() { + return WarningLightStatus._MAP.WLS_OFF; + } + /** + * @return {String} + */ + + + static get WLS_ON() { + return WarningLightStatus._MAP.WLS_ON; + } + /** + * @return {String} + */ + + + static get WLS_FLASH() { + return WarningLightStatus._MAP.WLS_FLASH; + } + /** + * @return {String} + */ + + + static get WLS_NOT_USED() { + return WarningLightStatus._MAP.WLS_NOT_USED; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return WarningLightStatus._valueForKey(key, WarningLightStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return WarningLightStatus._keyForValue(value, WarningLightStatus._MAP); + } + + } + + WarningLightStatus._MAP = Object.freeze({ + 'WLS_OFF': 'OFF', + 'WLS_ON': 'ON', + 'WLS_FLASH': 'FLASH', + 'WLS_NOT_USED': 'NOT_USED' + }); + + /* eslint-disable camelcase */ + /** + * The status and pressure of the tires. + */ + + class TireStatus extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {WarningLightStatus} telltale - Status of the Tire Pressure Telltale. See WarningLightStatus. + * @return {TireStatus} + */ + + + setPressureTelltale(telltale) { + this.validateType(WarningLightStatus, telltale); + this.setParameter(TireStatus.KEY_PRESSURE_TELLTALE, telltale); + return this; + } + /** + * @return {WarningLightStatus} + */ + + + getPressureTelltale() { + return this.getObject(WarningLightStatus, TireStatus.KEY_PRESSURE_TELLTALE); + } + /** + * @param {SingleTireStatus} front - The status of the left front tire. + * @return {TireStatus} + */ + + + setLeftFront(front) { + this.validateType(SingleTireStatus, front); + this.setParameter(TireStatus.KEY_LEFT_FRONT, front); + return this; + } + /** + * @return {SingleTireStatus} + */ + + + getLeftFront() { + return this.getObject(SingleTireStatus, TireStatus.KEY_LEFT_FRONT); + } + /** + * @param {SingleTireStatus} front - The status of the right front tire. + * @return {TireStatus} + */ + + + setRightFront(front) { + this.validateType(SingleTireStatus, front); + this.setParameter(TireStatus.KEY_RIGHT_FRONT, front); + return this; + } + /** + * @return {SingleTireStatus} + */ + + + getRightFront() { + return this.getObject(SingleTireStatus, TireStatus.KEY_RIGHT_FRONT); + } + /** + * @param {SingleTireStatus} rear - The status of the left rear tire. + * @return {TireStatus} + */ + + + setLeftRear(rear) { + this.validateType(SingleTireStatus, rear); + this.setParameter(TireStatus.KEY_LEFT_REAR, rear); + return this; + } + /** + * @return {SingleTireStatus} + */ + + + getLeftRear() { + return this.getObject(SingleTireStatus, TireStatus.KEY_LEFT_REAR); + } + /** + * @param {SingleTireStatus} rear - The status of the right rear tire. + * @return {TireStatus} + */ + + + setRightRear(rear) { + this.validateType(SingleTireStatus, rear); + this.setParameter(TireStatus.KEY_RIGHT_REAR, rear); + return this; + } + /** + * @return {SingleTireStatus} + */ + + + getRightRear() { + return this.getObject(SingleTireStatus, TireStatus.KEY_RIGHT_REAR); + } + /** + * @param {SingleTireStatus} rear - The status of the inner left rear. + * @return {TireStatus} + */ + + + setInnerLeftRear(rear) { + this.validateType(SingleTireStatus, rear); + this.setParameter(TireStatus.KEY_INNER_LEFT_REAR, rear); + return this; + } + /** + * @return {SingleTireStatus} + */ + + + getInnerLeftRear() { + return this.getObject(SingleTireStatus, TireStatus.KEY_INNER_LEFT_REAR); + } + /** + * @param {SingleTireStatus} rear - The status of the inner right rear. + * @return {TireStatus} + */ + + + setInnerRightRear(rear) { + this.validateType(SingleTireStatus, rear); + this.setParameter(TireStatus.KEY_INNER_RIGHT_REAR, rear); + return this; + } + /** + * @return {SingleTireStatus} + */ + + + getInnerRightRear() { + return this.getObject(SingleTireStatus, TireStatus.KEY_INNER_RIGHT_REAR); + } + + } + + TireStatus.KEY_PRESSURE_TELLTALE = 'pressureTelltale'; + TireStatus.KEY_LEFT_FRONT = 'leftFront'; + TireStatus.KEY_RIGHT_FRONT = 'rightFront'; + TireStatus.KEY_LEFT_REAR = 'leftRear'; + TireStatus.KEY_RIGHT_REAR = 'rightRear'; + TireStatus.KEY_INNER_LEFT_REAR = 'innerLeftRear'; + TireStatus.KEY_INNER_RIGHT_REAR = 'innerRightRear'; + + /* eslint-disable camelcase */ + + class GetVehicleDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetVehicleData); + } + /** + * @param {GPSData} gps - See GPSData + * @return {GetVehicleDataResponse} + */ + + + setGps(gps) { + this.validateType(GPSData, gps); + this.setParameter(GetVehicleDataResponse.KEY_GPS, gps); + return this; + } + /** + * @return {GPSData} + */ + + + getGps() { + return this.getObject(GPSData, GetVehicleDataResponse.KEY_GPS); + } + /** + * @param {Number} speed - The vehicle speed in kilometers per hour + * @return {GetVehicleDataResponse} + */ + + + setSpeed(speed) { + this.setParameter(GetVehicleDataResponse.KEY_SPEED, speed); + return this; + } + /** + * @return {Number} + */ + + + getSpeed() { + return this.getParameter(GetVehicleDataResponse.KEY_SPEED); + } + /** + * @param {Number} rpm - The number of revolutions per minute of the engine + * @return {GetVehicleDataResponse} + */ + + + setRpm(rpm) { + this.setParameter(GetVehicleDataResponse.KEY_RPM, rpm); + return this; + } + /** + * @return {Number} + */ + + + getRpm() { + return this.getParameter(GetVehicleDataResponse.KEY_RPM); + } + /** + * @param {Number} level - The fuel level in the tank (percentage) + * @return {GetVehicleDataResponse} + */ + + + setFuelLevel(level) { + this.setParameter(GetVehicleDataResponse.KEY_FUEL_LEVEL, level); + return this; + } + /** + * @return {Number} + */ + + + getFuelLevel() { + return this.getParameter(GetVehicleDataResponse.KEY_FUEL_LEVEL); + } + /** + * @param {ComponentVolumeStatus} level_state - The fuel level state + * @return {GetVehicleDataResponse} + */ + + + setFuelLevel_State(level_state) { + this.validateType(ComponentVolumeStatus, level_state); + this.setParameter(GetVehicleDataResponse.KEY_FUEL_LEVEL_STATE, level_state); + return this; + } + /** + * @return {ComponentVolumeStatus} + */ + + + getFuelLevel_State() { + return this.getObject(ComponentVolumeStatus, GetVehicleDataResponse.KEY_FUEL_LEVEL_STATE); + } + /** + * @param {Number} consumption - The instantaneous fuel consumption in microlitres + * @return {GetVehicleDataResponse} + */ + + + setInstantFuelConsumption(consumption) { + this.setParameter(GetVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION, consumption); + return this; + } + /** + * @return {Number} + */ + + + getInstantFuelConsumption() { + return this.getParameter(GetVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION); + } + /** + * @param {FuelRange[]} range - The estimate range in KM the vehicle can travel based on fuel level and consumption + * @return {GetVehicleDataResponse} + */ + + + setFuelRange(range) { + this.validateType(FuelRange, range, true); + this.setParameter(GetVehicleDataResponse.KEY_FUEL_RANGE, range); + return this; + } + /** + * @return {FuelRange[]} + */ + + + getFuelRange() { + return this.getObject(FuelRange, GetVehicleDataResponse.KEY_FUEL_RANGE); + } + /** + * @param {Number} temperature - The external temperature in degrees celsius + * @return {GetVehicleDataResponse} + */ + + + setExternalTemperature(temperature) { + this.setParameter(GetVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE, temperature); + return this; + } + /** + * @return {Number} + */ + + + getExternalTemperature() { + return this.getParameter(GetVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE); + } + /** + * @param {TurnSignal} signal - See TurnSignal + * @return {GetVehicleDataResponse} + */ + + + setTurnSignal(signal) { + this.validateType(TurnSignal, signal); + this.setParameter(GetVehicleDataResponse.KEY_TURN_SIGNAL, signal); + return this; + } + /** + * @return {TurnSignal} + */ + + + getTurnSignal() { + return this.getObject(TurnSignal, GetVehicleDataResponse.KEY_TURN_SIGNAL); + } + /** + * @param {String} vin - Vehicle identification number + * @return {GetVehicleDataResponse} + */ + + + setVin(vin) { + this.setParameter(GetVehicleDataResponse.KEY_VIN, vin); + return this; + } + /** + * @return {String} + */ + + + getVin() { + return this.getParameter(GetVehicleDataResponse.KEY_VIN); + } + /** + * @param {PRNDL} prndl - See PRNDL + * @return {GetVehicleDataResponse} + */ + + + setPrndl(prndl) { + this.validateType(PRNDL, prndl); + this.setParameter(GetVehicleDataResponse.KEY_PRNDL, prndl); + return this; + } + /** + * @return {PRNDL} + */ + + + getPrndl() { + return this.getObject(PRNDL, GetVehicleDataResponse.KEY_PRNDL); + } + /** + * @param {TireStatus} pressure - See TireStatus + * @return {GetVehicleDataResponse} + */ + + + setTirePressure(pressure) { + this.validateType(TireStatus, pressure); + this.setParameter(GetVehicleDataResponse.KEY_TIRE_PRESSURE, pressure); + return this; + } + /** + * @return {TireStatus} + */ + + + getTirePressure() { + return this.getObject(TireStatus, GetVehicleDataResponse.KEY_TIRE_PRESSURE); + } + /** + * @param {Number} odometer - Odometer in km + * @return {GetVehicleDataResponse} + */ + + + setOdometer(odometer) { + this.setParameter(GetVehicleDataResponse.KEY_ODOMETER, odometer); + return this; + } + /** + * @return {Number} + */ + + + getOdometer() { + return this.getParameter(GetVehicleDataResponse.KEY_ODOMETER); + } + /** + * @param {BeltStatus} status - The status of the seat belts + * @return {GetVehicleDataResponse} + */ + + + setBeltStatus(status) { + this.validateType(BeltStatus, status); + this.setParameter(GetVehicleDataResponse.KEY_BELT_STATUS, status); + return this; + } + /** + * @return {BeltStatus} + */ + + + getBeltStatus() { + return this.getObject(BeltStatus, GetVehicleDataResponse.KEY_BELT_STATUS); + } + /** + * @param {BodyInformation} information - The body information including power modes + * @return {GetVehicleDataResponse} + */ + + + setBodyInformation(information) { + this.validateType(BodyInformation, information); + this.setParameter(GetVehicleDataResponse.KEY_BODY_INFORMATION, information); + return this; + } + /** + * @return {BodyInformation} + */ + + + getBodyInformation() { + return this.getObject(BodyInformation, GetVehicleDataResponse.KEY_BODY_INFORMATION); + } + /** + * @param {DeviceStatus} status - The device status including signal and battery strength + * @return {GetVehicleDataResponse} + */ + + + setDeviceStatus(status) { + this.validateType(DeviceStatus, status); + this.setParameter(GetVehicleDataResponse.KEY_DEVICE_STATUS, status); + return this; + } + /** + * @return {DeviceStatus} + */ + + + getDeviceStatus() { + return this.getObject(DeviceStatus, GetVehicleDataResponse.KEY_DEVICE_STATUS); + } + /** + * @param {VehicleDataEventStatus} braking - The status of the brake pedal + * @return {GetVehicleDataResponse} + */ + + + setDriverBraking(braking) { + this.validateType(VehicleDataEventStatus, braking); + this.setParameter(GetVehicleDataResponse.KEY_DRIVER_BRAKING, braking); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getDriverBraking() { + return this.getObject(VehicleDataEventStatus, GetVehicleDataResponse.KEY_DRIVER_BRAKING); + } + /** + * @param {WiperStatus} status - The status of the wipers + * @return {GetVehicleDataResponse} + */ + + + setWiperStatus(status) { + this.validateType(WiperStatus, status); + this.setParameter(GetVehicleDataResponse.KEY_WIPER_STATUS, status); + return this; + } + /** + * @return {WiperStatus} + */ + + + getWiperStatus() { + return this.getObject(WiperStatus, GetVehicleDataResponse.KEY_WIPER_STATUS); + } + /** + * @param {HeadLampStatus} status - Status of the head lamps + * @return {GetVehicleDataResponse} + */ + + + setHeadLampStatus(status) { + this.validateType(HeadLampStatus, status); + this.setParameter(GetVehicleDataResponse.KEY_HEAD_LAMP_STATUS, status); + return this; + } + /** + * @return {HeadLampStatus} + */ + + + getHeadLampStatus() { + return this.getObject(HeadLampStatus, GetVehicleDataResponse.KEY_HEAD_LAMP_STATUS); + } + /** + * @param {Number} torque - Torque value for engine (in Nm) on non-diesel variants + * @return {GetVehicleDataResponse} + */ + + + setEngineTorque(torque) { + this.setParameter(GetVehicleDataResponse.KEY_ENGINE_TORQUE, torque); + return this; + } + /** + * @return {Number} + */ + + + getEngineTorque() { + return this.getParameter(GetVehicleDataResponse.KEY_ENGINE_TORQUE); + } + /** + * @param {Number} position - Accelerator pedal position (percentage depressed) + * @return {GetVehicleDataResponse} + */ + + + setAccPedalPosition(position) { + this.setParameter(GetVehicleDataResponse.KEY_ACC_PEDAL_POSITION, position); + return this; + } + /** + * @return {Number} + */ + + + getAccPedalPosition() { + return this.getParameter(GetVehicleDataResponse.KEY_ACC_PEDAL_POSITION); + } + /** + * @param {Number} angle - Current angle of the steering wheel (in deg) + * @return {GetVehicleDataResponse} + */ + + + setSteeringWheelAngle(angle) { + this.setParameter(GetVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE, angle); + return this; + } + /** + * @return {Number} + */ + + + getSteeringWheelAngle() { + return this.getParameter(GetVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE); + } + /** + * @param {Number} life - The estimated percentage of remaining oil life of the engine. + * @return {GetVehicleDataResponse} + */ + + + setEngineOilLife(life) { + this.setParameter(GetVehicleDataResponse.KEY_ENGINE_OIL_LIFE, life); + return this; + } + /** + * @return {Number} + */ + + + getEngineOilLife() { + return this.getParameter(GetVehicleDataResponse.KEY_ENGINE_OIL_LIFE); + } + /** + * @param {ElectronicParkBrakeStatus} status - The status of the park brake as provided by Electric Park Brake (EPB) + * system. + * @return {GetVehicleDataResponse} + */ + + + setElectronicParkBrakeStatus(status) { + this.validateType(ElectronicParkBrakeStatus, status); + this.setParameter(GetVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS, status); + return this; + } + /** + * @return {ElectronicParkBrakeStatus} + */ + + + getElectronicParkBrakeStatus() { + return this.getObject(ElectronicParkBrakeStatus, GetVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS); + } + /** + * @param {String} id - Parameter used by cloud apps to identify a head unit + * @return {GetVehicleDataResponse} + */ + + + setCloudAppVehicleID(id) { + this.setParameter(GetVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID, id); + return this; + } + /** + * @return {String} + */ + + + getCloudAppVehicleID() { + return this.getParameter(GetVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID); + } + /** + * @param {ECallInfo} info - Emergency Call notification and confirmation data + * @return {GetVehicleDataResponse} + */ + + + setECallInfo(info) { + this.validateType(ECallInfo, info); + this.setParameter(GetVehicleDataResponse.KEY_E_CALL_INFO, info); + return this; + } + /** + * @return {ECallInfo} + */ + + + getECallInfo() { + return this.getObject(ECallInfo, GetVehicleDataResponse.KEY_E_CALL_INFO); + } + /** + * @param {AirbagStatus} status - The status of the air bags + * @return {GetVehicleDataResponse} + */ + + + setAirbagStatus(status) { + this.validateType(AirbagStatus, status); + this.setParameter(GetVehicleDataResponse.KEY_AIRBAG_STATUS, status); + return this; + } + /** + * @return {AirbagStatus} + */ + + + getAirbagStatus() { + return this.getObject(AirbagStatus, GetVehicleDataResponse.KEY_AIRBAG_STATUS); + } + /** + * @param {EmergencyEvent} event - Information related to an emergency event (and if it occurred) + * @return {GetVehicleDataResponse} + */ + + + setEmergencyEvent(event) { + this.validateType(EmergencyEvent, event); + this.setParameter(GetVehicleDataResponse.KEY_EMERGENCY_EVENT, event); + return this; + } + /** + * @return {EmergencyEvent} + */ + + + getEmergencyEvent() { + return this.getObject(EmergencyEvent, GetVehicleDataResponse.KEY_EMERGENCY_EVENT); + } + /** + * @param {ClusterModeStatus} status - The status modes of the cluster + * @return {GetVehicleDataResponse} + */ + + + setClusterModeStatus(status) { + this.validateType(ClusterModeStatus, status); + this.setParameter(GetVehicleDataResponse.KEY_CLUSTER_MODE_STATUS, status); + return this; + } + /** + * @return {ClusterModeStatus} + */ + + + getClusterModeStatus() { + return this.getObject(ClusterModeStatus, GetVehicleDataResponse.KEY_CLUSTER_MODE_STATUS); + } + /** + * @param {MyKey} key - Information related to the MyKey feature + * @return {GetVehicleDataResponse} + */ + + + setMyKey(key) { + this.validateType(MyKey, key); + this.setParameter(GetVehicleDataResponse.KEY_MY_KEY, key); + return this; + } + /** + * @return {MyKey} + */ + + + getMyKey() { + return this.getObject(MyKey, GetVehicleDataResponse.KEY_MY_KEY); + } + + } + + GetVehicleDataResponse.KEY_GPS = 'gps'; + GetVehicleDataResponse.KEY_SPEED = 'speed'; + GetVehicleDataResponse.KEY_RPM = 'rpm'; + GetVehicleDataResponse.KEY_FUEL_LEVEL = 'fuelLevel'; + GetVehicleDataResponse.KEY_FUEL_LEVEL_STATE = 'fuelLevel_State'; + GetVehicleDataResponse.KEY_INSTANT_FUEL_CONSUMPTION = 'instantFuelConsumption'; + GetVehicleDataResponse.KEY_FUEL_RANGE = 'fuelRange'; + GetVehicleDataResponse.KEY_EXTERNAL_TEMPERATURE = 'externalTemperature'; + GetVehicleDataResponse.KEY_TURN_SIGNAL = 'turnSignal'; + GetVehicleDataResponse.KEY_VIN = 'vin'; + GetVehicleDataResponse.KEY_PRNDL = 'prndl'; + GetVehicleDataResponse.KEY_TIRE_PRESSURE = 'tirePressure'; + GetVehicleDataResponse.KEY_ODOMETER = 'odometer'; + GetVehicleDataResponse.KEY_BELT_STATUS = 'beltStatus'; + GetVehicleDataResponse.KEY_BODY_INFORMATION = 'bodyInformation'; + GetVehicleDataResponse.KEY_DEVICE_STATUS = 'deviceStatus'; + GetVehicleDataResponse.KEY_DRIVER_BRAKING = 'driverBraking'; + GetVehicleDataResponse.KEY_WIPER_STATUS = 'wiperStatus'; + GetVehicleDataResponse.KEY_HEAD_LAMP_STATUS = 'headLampStatus'; + GetVehicleDataResponse.KEY_ENGINE_TORQUE = 'engineTorque'; + GetVehicleDataResponse.KEY_ACC_PEDAL_POSITION = 'accPedalPosition'; + GetVehicleDataResponse.KEY_STEERING_WHEEL_ANGLE = 'steeringWheelAngle'; + GetVehicleDataResponse.KEY_ENGINE_OIL_LIFE = 'engineOilLife'; + GetVehicleDataResponse.KEY_ELECTRONIC_PARK_BRAKE_STATUS = 'electronicParkBrakeStatus'; + GetVehicleDataResponse.KEY_CLOUD_APP_VEHICLE_ID = 'cloudAppVehicleID'; + GetVehicleDataResponse.KEY_E_CALL_INFO = 'eCallInfo'; + GetVehicleDataResponse.KEY_AIRBAG_STATUS = 'airbagStatus'; + GetVehicleDataResponse.KEY_EMERGENCY_EVENT = 'emergencyEvent'; + GetVehicleDataResponse.KEY_CLUSTER_MODE_STATUS = 'clusterModeStatus'; + GetVehicleDataResponse.KEY_MY_KEY = 'myKey'; + + /* eslint-disable camelcase */ + /** + * Non periodic vehicle data read request + */ + + class ReadDID extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ReadDID); + } + /** + * @param {Number} name - Name of ECU. + * @return {ReadDID} + */ + + + setEcuName(name) { + this.setParameter(ReadDID.KEY_ECU_NAME, name); + return this; + } + /** + * @return {Number} + */ + + + getEcuName() { + return this.getParameter(ReadDID.KEY_ECU_NAME); + } + /** + * @param {Number[]} location - Get raw data from vehicle data DID location(s) + * @return {ReadDID} + */ + + + setDidLocation(location) { + this.setParameter(ReadDID.KEY_DID_LOCATION, location); + return this; + } + /** + * @return {Number[]} + */ + + + getDidLocation() { + return this.getParameter(ReadDID.KEY_DID_LOCATION); + } + + } + + ReadDID.KEY_ECU_NAME = 'ecuName'; + ReadDID.KEY_DID_LOCATION = 'didLocation'; + + /* eslint-disable camelcase */ + /** + * Individual requested DID result and data + */ + + class DIDResult extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {VehicleDataResultCode} code - Individual DID result code. + * @return {DIDResult} + */ + + + setResultCode(code) { + this.validateType(VehicleDataResultCode, code); + this.setParameter(DIDResult.KEY_RESULT_CODE, code); + return this; + } + /** + * @return {VehicleDataResultCode} + */ + + + getResultCode() { + return this.getObject(VehicleDataResultCode, DIDResult.KEY_RESULT_CODE); + } + /** + * @param {Number} location - Location of raw data from vehicle data DID + * @return {DIDResult} + */ + + + setDidLocation(location) { + this.setParameter(DIDResult.KEY_DID_LOCATION, location); + return this; + } + /** + * @return {Number} + */ + + + getDidLocation() { + return this.getParameter(DIDResult.KEY_DID_LOCATION); + } + /** + * @param {String} data - Raw DID-based data returned for requested element. + * @return {DIDResult} + */ + + + setData(data) { + this.setParameter(DIDResult.KEY_DATA, data); + return this; + } + /** + * @return {String} + */ + + + getData() { + return this.getParameter(DIDResult.KEY_DATA); + } + + } + + DIDResult.KEY_RESULT_CODE = 'resultCode'; + DIDResult.KEY_DID_LOCATION = 'didLocation'; + DIDResult.KEY_DATA = 'data'; + + /* eslint-disable camelcase */ + + class ReadDIDResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ReadDID); + } + /** + * @param {DIDResult[]} result - Array of requested DID results (with data if available). + * @return {ReadDIDResponse} + */ + + + setDidResult(result) { + this.validateType(DIDResult, result, true); + this.setParameter(ReadDIDResponse.KEY_DID_RESULT, result); + return this; + } + /** + * @return {DIDResult[]} + */ + + + getDidResult() { + return this.getObject(DIDResult, ReadDIDResponse.KEY_DID_RESULT); + } + + } + + ReadDIDResponse.KEY_DID_RESULT = 'didResult'; + + /* eslint-disable camelcase */ + /** + * Vehicle module diagnostic trouble code request. + */ + + class GetDTCs extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetDTCs); + } + /** + * @param {Number} name - Name of ECU. + * @return {GetDTCs} + */ + + + setEcuName(name) { + this.setParameter(GetDTCs.KEY_ECU_NAME, name); + return this; + } + /** + * @return {Number} + */ + + + getEcuName() { + return this.getParameter(GetDTCs.KEY_ECU_NAME); + } + /** + * @param {Number} mask - DTC Mask Byte to be sent in diagnostic request to module . + * @return {GetDTCs} + */ + + + setDtcMask(mask) { + this.setParameter(GetDTCs.KEY_DTC_MASK, mask); + return this; + } + /** + * @return {Number} + */ + + + getDtcMask() { + return this.getParameter(GetDTCs.KEY_DTC_MASK); + } + + } + + GetDTCs.KEY_ECU_NAME = 'ecuName'; + GetDTCs.KEY_DTC_MASK = 'dtcMask'; + + /* eslint-disable camelcase */ + + class GetDTCsResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetDTCs); + } + /** + * @param {Number} header - 2 byte ECU Header for DTC response (as defined in VHR_Layout_Specification_DTCs.pdf) + * @return {GetDTCsResponse} + */ + + + setEcuHeader(header) { + this.setParameter(GetDTCsResponse.KEY_ECU_HEADER, header); + return this; + } + /** + * @return {Number} + */ + + + getEcuHeader() { + return this.getParameter(GetDTCsResponse.KEY_ECU_HEADER); + } + /** + * @param {String[]} dtc - Array of all reported DTCs on module (ecuHeader contains information if list is + * truncated). Each DTC is represented by 4 bytes (3 bytes of data and 1 byte status as + * defined in VHR_Layout_Specification_DTCs.pdf). + * @return {GetDTCsResponse} + */ + + + setDtc(dtc) { + this.setParameter(GetDTCsResponse.KEY_DTC, dtc); + return this; + } + /** + * @return {String[]} + */ + + + getDtc() { + return this.getParameter(GetDTCsResponse.KEY_DTC); + } + + } + + GetDTCsResponse.KEY_ECU_HEADER = 'ecuHeader'; + GetDTCsResponse.KEY_DTC = 'dtc'; + + /* eslint-disable camelcase */ + /** + * Non periodic vehicle diagnostic request + */ + + class DiagnosticMessage extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.DiagnosticMessage); + } + /** + * @param {Number} id - Name of target ECU. + * @return {DiagnosticMessage} + */ + + + setTargetID(id) { + this.setParameter(DiagnosticMessage.KEY_TARGET_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getTargetID() { + return this.getParameter(DiagnosticMessage.KEY_TARGET_ID); + } + /** + * @param {Number} length - Length of message (in bytes). + * @return {DiagnosticMessage} + */ + + + setMessageLength(length) { + this.setParameter(DiagnosticMessage.KEY_MESSAGE_LENGTH, length); + return this; + } + /** + * @return {Number} + */ + + + getMessageLength() { + return this.getParameter(DiagnosticMessage.KEY_MESSAGE_LENGTH); + } + /** + * @param {Number[]} data - Array of bytes comprising CAN message. + * @return {DiagnosticMessage} + */ + + + setMessageData(data) { + this.setParameter(DiagnosticMessage.KEY_MESSAGE_DATA, data); + return this; + } + /** + * @return {Number[]} + */ + + + getMessageData() { + return this.getParameter(DiagnosticMessage.KEY_MESSAGE_DATA); + } + + } + + DiagnosticMessage.KEY_TARGET_ID = 'targetID'; + DiagnosticMessage.KEY_MESSAGE_LENGTH = 'messageLength'; + DiagnosticMessage.KEY_MESSAGE_DATA = 'messageData'; + + /* eslint-disable camelcase */ + + class DiagnosticMessageResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.DiagnosticMessage); + } + /** + * @param {Number[]} result - Array of bytes comprising CAN message result. + * @return {DiagnosticMessageResponse} + */ + + + setMessageDataResult(result) { + this.setParameter(DiagnosticMessageResponse.KEY_MESSAGE_DATA_RESULT, result); + return this; + } + /** + * @return {Number[]} + */ + + + getMessageDataResult() { + return this.getParameter(DiagnosticMessageResponse.KEY_MESSAGE_DATA_RESULT); + } + + } + + DiagnosticMessageResponse.KEY_MESSAGE_DATA_RESULT = 'messageDataResult'; + + /* eslint-disable camelcase */ + /** + * Creates a full screen overlay containing a large block of formatted text that can be scrolled with up to 8 + * SoftButtons defined + */ + + class ScrollableMessage extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ScrollableMessage); + } + /** + * @param {String} body - Body of text that can include newlines and tabs. + * @return {ScrollableMessage} + */ + + + setScrollableMessageBody(body) { + this.setParameter(ScrollableMessage.KEY_SCROLLABLE_MESSAGE_BODY, body); + return this; + } + /** + * @return {String} + */ + + + getScrollableMessageBody() { + return this.getParameter(ScrollableMessage.KEY_SCROLLABLE_MESSAGE_BODY); + } + /** + * @param {Number} timeout - App defined timeout. Indicates how long of a timeout from the last action (i.e. + * scrolling message resets timeout). + * @return {ScrollableMessage} + */ + + + setTimeout(timeout) { + this.setParameter(ScrollableMessage.KEY_TIMEOUT, timeout); + return this; + } + /** + * @return {Number} + */ + + + getTimeout() { + return this.getParameter(ScrollableMessage.KEY_TIMEOUT); + } + /** + * @param {SoftButton[]} buttons - App defined SoftButtons. If omitted on supported displays, only the system + * defined "Close" SoftButton will be displayed. + * @return {ScrollableMessage} + */ + + + setSoftButtons(buttons) { + this.validateType(SoftButton, buttons, true); + this.setParameter(ScrollableMessage.KEY_SOFT_BUTTONS, buttons); + return this; + } + /** + * @return {SoftButton[]} + */ + + + getSoftButtons() { + return this.getObject(SoftButton, ScrollableMessage.KEY_SOFT_BUTTONS); + } + /** + * @param {Number} id - An ID for this specific ScrollableMessage to allow cancellation through the + * `CancelInteraction` RPC. + * @return {ScrollableMessage} + */ + + + setCancelID(id) { + this.setParameter(ScrollableMessage.KEY_CANCEL_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getCancelID() { + return this.getParameter(ScrollableMessage.KEY_CANCEL_ID); + } + + } + + ScrollableMessage.KEY_SCROLLABLE_MESSAGE_BODY = 'scrollableMessageBody'; + ScrollableMessage.KEY_TIMEOUT = 'timeout'; + ScrollableMessage.KEY_SOFT_BUTTONS = 'softButtons'; + ScrollableMessage.KEY_CANCEL_ID = 'cancelID'; + + /* eslint-disable camelcase */ + + class ScrollableMessageResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ScrollableMessage); + } + + } + + /* eslint-disable camelcase */ + /** + * Creates a full screen or pop-up overlay (depending on platform) with a single user controlled slider. + */ + + class Slider extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.Slider); + } + /** + * @param {Number} ticks - Number of selectable items on a horizontal axis + * @return {Slider} + */ + + + setNumTicks(ticks) { + this.setParameter(Slider.KEY_NUM_TICKS, ticks); + return this; + } + /** + * @return {Number} + */ + + + getNumTicks() { + return this.getParameter(Slider.KEY_NUM_TICKS); + } + /** + * @param {Number} position - Initial position of slider control (cannot exceed numTicks) + * @return {Slider} + */ + + + setPosition(position) { + this.setParameter(Slider.KEY_POSITION, position); + return this; + } + /** + * @return {Number} + */ + + + getPosition() { + return this.getParameter(Slider.KEY_POSITION); + } + /** + * @param {String} header - Text header to display + * @return {Slider} + */ + + + setSliderHeader(header) { + this.setParameter(Slider.KEY_SLIDER_HEADER, header); + return this; + } + /** + * @return {String} + */ + + + getSliderHeader() { + return this.getParameter(Slider.KEY_SLIDER_HEADER); + } + /** + * @param {String[]} footer - Text footer to display (meant to display min/max threshold descriptors). For a static + * text footer, only one footer string shall be provided in the array. For a dynamic text + * footer, the number of footer text string in the array must match the numTicks value. + * For a dynamic text footer, text array string should correlate with potential slider + * position index. If omitted on supported displays, no footer text shall be displayed. + * @return {Slider} + */ + + + setSliderFooter(footer) { + this.setParameter(Slider.KEY_SLIDER_FOOTER, footer); + return this; + } + /** + * @return {String[]} + */ + + + getSliderFooter() { + return this.getParameter(Slider.KEY_SLIDER_FOOTER); + } + /** + * @param {Number} timeout - App defined timeout. Indicates how long of a timeout from the last action (i.e. sliding + * control resets timeout). If omitted, the value is set to 10000. + * @return {Slider} + */ + + + setTimeout(timeout) { + this.setParameter(Slider.KEY_TIMEOUT, timeout); + return this; + } + /** + * @return {Number} + */ + + + getTimeout() { + return this.getParameter(Slider.KEY_TIMEOUT); + } + /** + * @param {Number} id - An ID for this specific Slider to allow cancellation through the `CancelInteraction` RPC. + * @return {Slider} + */ + + + setCancelID(id) { + this.setParameter(Slider.KEY_CANCEL_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getCancelID() { + return this.getParameter(Slider.KEY_CANCEL_ID); + } + + } + + Slider.KEY_NUM_TICKS = 'numTicks'; + Slider.KEY_POSITION = 'position'; + Slider.KEY_SLIDER_HEADER = 'sliderHeader'; + Slider.KEY_SLIDER_FOOTER = 'sliderFooter'; + Slider.KEY_TIMEOUT = 'timeout'; + Slider.KEY_CANCEL_ID = 'cancelID'; + + /* eslint-disable camelcase */ + + class SliderResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.Slider); + } + /** + * @param {Number} position - Current slider value returned when saved or canceled (aborted) This value is only + * returned for resultCodes "SAVED" or "ABORTED" + * @return {SliderResponse} + */ + + + setSliderPosition(position) { + this.setParameter(SliderResponse.KEY_SLIDER_POSITION, position); + return this; + } + /** + * @return {Number} + */ + + + getSliderPosition() { + return this.getParameter(SliderResponse.KEY_SLIDER_POSITION); + } + + } + + SliderResponse.KEY_SLIDER_POSITION = 'sliderPosition'; + + /* eslint-disable camelcase */ + + class ShowConstantTBT extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ShowConstantTBT); + } + /** + * @param {String} text1 + * @return {ShowConstantTBT} + */ + + + setNavigationText1(text1) { + this.setParameter(ShowConstantTBT.KEY_NAVIGATION_TEXT_1, text1); + return this; + } + /** + * @return {String} + */ + + + getNavigationText1() { + return this.getParameter(ShowConstantTBT.KEY_NAVIGATION_TEXT_1); + } + /** + * @param {String} text2 + * @return {ShowConstantTBT} + */ + + + setNavigationText2(text2) { + this.setParameter(ShowConstantTBT.KEY_NAVIGATION_TEXT_2, text2); + return this; + } + /** + * @return {String} + */ + + + getNavigationText2() { + return this.getParameter(ShowConstantTBT.KEY_NAVIGATION_TEXT_2); + } + /** + * @param {String} eta + * @return {ShowConstantTBT} + */ + + + setEta(eta) { + this.setParameter(ShowConstantTBT.KEY_ETA, eta); + return this; + } + /** + * @return {String} + */ + + + getEta() { + return this.getParameter(ShowConstantTBT.KEY_ETA); + } + /** + * @param {String} destination + * @return {ShowConstantTBT} + */ + + + setTimeToDestination(destination) { + this.setParameter(ShowConstantTBT.KEY_TIME_TO_DESTINATION, destination); + return this; + } + /** + * @return {String} + */ + + + getTimeToDestination() { + return this.getParameter(ShowConstantTBT.KEY_TIME_TO_DESTINATION); + } + /** + * @param {String} distance + * @return {ShowConstantTBT} + */ + + + setTotalDistance(distance) { + this.setParameter(ShowConstantTBT.KEY_TOTAL_DISTANCE, distance); + return this; + } + /** + * @return {String} + */ + + + getTotalDistance() { + return this.getParameter(ShowConstantTBT.KEY_TOTAL_DISTANCE); + } + /** + * @param {Image} icon + * @return {ShowConstantTBT} + */ + + + setTurnIcon(icon) { + this.validateType(Image, icon); + this.setParameter(ShowConstantTBT.KEY_TURN_ICON, icon); + return this; + } + /** + * @return {Image} + */ + + + getTurnIcon() { + return this.getObject(Image, ShowConstantTBT.KEY_TURN_ICON); + } + /** + * @param {Image} icon + * @return {ShowConstantTBT} + */ + + + setNextTurnIcon(icon) { + this.validateType(Image, icon); + this.setParameter(ShowConstantTBT.KEY_NEXT_TURN_ICON, icon); + return this; + } + /** + * @return {Image} + */ + + + getNextTurnIcon() { + return this.getObject(Image, ShowConstantTBT.KEY_NEXT_TURN_ICON); + } + /** + * @param {Number} maneuver - Fraction of distance till next maneuver (starting from when AlertManeuver is + * triggered). Used to calculate progress bar. + * @return {ShowConstantTBT} + */ + + + setDistanceToManeuver(maneuver) { + this.setParameter(ShowConstantTBT.KEY_DISTANCE_TO_MANEUVER, maneuver); + return this; + } + /** + * @return {Number} + */ + + + getDistanceToManeuver() { + return this.getParameter(ShowConstantTBT.KEY_DISTANCE_TO_MANEUVER); + } + /** + * @param {Number} scale - Distance till next maneuver (starting from) from previous maneuver. Used to calculate + * progress bar. + * @return {ShowConstantTBT} + */ + + + setDistanceToManeuverScale(scale) { + this.setParameter(ShowConstantTBT.KEY_DISTANCE_TO_MANEUVER_SCALE, scale); + return this; + } + /** + * @return {Number} + */ + + + getDistanceToManeuverScale() { + return this.getParameter(ShowConstantTBT.KEY_DISTANCE_TO_MANEUVER_SCALE); + } + /** + * @param {Boolean} complete - If and when a maneuver has completed while an AlertManeuver is active, the app must + * send this value set to TRUE in order to clear the AlertManeuver overlay. If omitted + * the value will be assumed as FALSE. + * @return {ShowConstantTBT} + */ + + + setManeuverComplete(complete) { + this.setParameter(ShowConstantTBT.KEY_MANEUVER_COMPLETE, complete); + return this; + } + /** + * @return {Boolean} + */ + + + getManeuverComplete() { + return this.getParameter(ShowConstantTBT.KEY_MANEUVER_COMPLETE); + } + /** + * @param {SoftButton[]} buttons - Three dynamic SoftButtons available (first SoftButton is fixed to "Turns"). If + * omitted on supported displays, the currently displayed SoftButton values will not + * change. + * @return {ShowConstantTBT} + */ + + + setSoftButtons(buttons) { + this.validateType(SoftButton, buttons, true); + this.setParameter(ShowConstantTBT.KEY_SOFT_BUTTONS, buttons); + return this; + } + /** + * @return {SoftButton[]} + */ + + + getSoftButtons() { + return this.getObject(SoftButton, ShowConstantTBT.KEY_SOFT_BUTTONS); + } + + } + + ShowConstantTBT.KEY_NAVIGATION_TEXT_1 = 'navigationText1'; + ShowConstantTBT.KEY_NAVIGATION_TEXT_2 = 'navigationText2'; + ShowConstantTBT.KEY_ETA = 'eta'; + ShowConstantTBT.KEY_TIME_TO_DESTINATION = 'timeToDestination'; + ShowConstantTBT.KEY_TOTAL_DISTANCE = 'totalDistance'; + ShowConstantTBT.KEY_TURN_ICON = 'turnIcon'; + ShowConstantTBT.KEY_NEXT_TURN_ICON = 'nextTurnIcon'; + ShowConstantTBT.KEY_DISTANCE_TO_MANEUVER = 'distanceToManeuver'; + ShowConstantTBT.KEY_DISTANCE_TO_MANEUVER_SCALE = 'distanceToManeuverScale'; + ShowConstantTBT.KEY_MANEUVER_COMPLETE = 'maneuverComplete'; + ShowConstantTBT.KEY_SOFT_BUTTONS = 'softButtons'; + + /* eslint-disable camelcase */ + + class ShowConstantTBTResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ShowConstantTBT); + } + + } + + /* eslint-disable camelcase */ + + class AlertManeuver extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.AlertManeuver); + } + /** + * @param {TTSChunk[]} chunks - An array of text chunks of type TTSChunk. See TTSChunk + * @return {AlertManeuver} + */ + + + setTtsChunks(chunks) { + this.validateType(TTSChunk, chunks, true); + this.setParameter(AlertManeuver.KEY_TTS_CHUNKS, chunks); + return this; + } + /** + * @return {TTSChunk[]} + */ + + + getTtsChunks() { + return this.getObject(TTSChunk, AlertManeuver.KEY_TTS_CHUNKS); + } + /** + * @param {SoftButton[]} buttons - If omitted on supported displays, only the system defined "Close" SoftButton + * shall be displayed. + * @return {AlertManeuver} + */ + + + setSoftButtons(buttons) { + this.validateType(SoftButton, buttons, true); + this.setParameter(AlertManeuver.KEY_SOFT_BUTTONS, buttons); + return this; + } + /** + * @return {SoftButton[]} + */ + + + getSoftButtons() { + return this.getObject(SoftButton, AlertManeuver.KEY_SOFT_BUTTONS); + } + + } + + AlertManeuver.KEY_TTS_CHUNKS = 'ttsChunks'; + AlertManeuver.KEY_SOFT_BUTTONS = 'softButtons'; + + /* eslint-disable camelcase */ + + class AlertManeuverResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.AlertManeuver); + } + + } + + /* eslint-disable camelcase */ + + class Turn extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} text - Individual turn text. Must provide at least text or icon for a given turn. + * @return {Turn} + */ + + + setNavigationText(text) { + this.setParameter(Turn.KEY_NAVIGATION_TEXT, text); + return this; + } + /** + * @return {String} + */ + + + getNavigationText() { + return this.getParameter(Turn.KEY_NAVIGATION_TEXT); + } + /** + * @param {Image} icon - Individual turn icon. Must provide at least text or icon for a given turn. + * @return {Turn} + */ + + + setTurnIcon(icon) { + this.validateType(Image, icon); + this.setParameter(Turn.KEY_TURN_ICON, icon); + return this; + } + /** + * @return {Image} + */ + + + getTurnIcon() { + return this.getObject(Image, Turn.KEY_TURN_ICON); + } + + } + + Turn.KEY_NAVIGATION_TEXT = 'navigationText'; + Turn.KEY_TURN_ICON = 'turnIcon'; + + /* eslint-disable camelcase */ + + class UpdateTurnList extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.UpdateTurnList); + } + /** + * @param {Turn[]} list + * @return {UpdateTurnList} + */ + + + setTurnList(list) { + this.validateType(Turn, list, true); + this.setParameter(UpdateTurnList.KEY_TURN_LIST, list); + return this; + } + /** + * @return {Turn[]} + */ + + + getTurnList() { + return this.getObject(Turn, UpdateTurnList.KEY_TURN_LIST); + } + /** + * @param {SoftButton[]} buttons - If omitted on supported displays, app-defined SoftButton will be left blank. + * @return {UpdateTurnList} + */ + + + setSoftButtons(buttons) { + this.validateType(SoftButton, buttons, true); + this.setParameter(UpdateTurnList.KEY_SOFT_BUTTONS, buttons); + return this; + } + /** + * @return {SoftButton[]} + */ + + + getSoftButtons() { + return this.getObject(SoftButton, UpdateTurnList.KEY_SOFT_BUTTONS); + } + + } + + UpdateTurnList.KEY_TURN_LIST = 'turnList'; + UpdateTurnList.KEY_SOFT_BUTTONS = 'softButtons'; + + /* eslint-disable camelcase */ + + class UpdateTurnListResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.UpdateTurnList); + } + + } + + /* eslint-disable camelcase */ + + class ChangeRegistration extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ChangeRegistration); + } + /** + * @param {Language} language - Requested voice engine (VR+TTS) language registration + * @return {ChangeRegistration} + */ + + + setLanguage(language) { + this.validateType(Language, language); + this.setParameter(ChangeRegistration.KEY_LANGUAGE, language); + return this; + } + /** + * @return {Language} + */ + + + getLanguage() { + return this.getObject(Language, ChangeRegistration.KEY_LANGUAGE); + } + /** + * @param {Language} language - Request display language registration + * @return {ChangeRegistration} + */ + + + setHmiDisplayLanguage(language) { + this.validateType(Language, language); + this.setParameter(ChangeRegistration.KEY_HMI_DISPLAY_LANGUAGE, language); + return this; + } + /** + * @return {Language} + */ + + + getHmiDisplayLanguage() { + return this.getObject(Language, ChangeRegistration.KEY_HMI_DISPLAY_LANGUAGE); + } + /** + * @param {String} name - Request new app name registration + * @return {ChangeRegistration} + */ + + + setAppName(name) { + this.setParameter(ChangeRegistration.KEY_APP_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getAppName() { + return this.getParameter(ChangeRegistration.KEY_APP_NAME); + } + /** + * @param {TTSChunk[]} name - Request new ttsName registration + * @return {ChangeRegistration} + */ + + + setTtsName(name) { + this.validateType(TTSChunk, name, true); + this.setParameter(ChangeRegistration.KEY_TTS_NAME, name); + return this; + } + /** + * @return {TTSChunk[]} + */ + + + getTtsName() { + return this.getObject(TTSChunk, ChangeRegistration.KEY_TTS_NAME); + } + /** + * @param {String} name - Request new app short name registration + * @return {ChangeRegistration} + */ + + + setNgnMediaScreenAppName(name) { + this.setParameter(ChangeRegistration.KEY_NGN_MEDIA_SCREEN_APP_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getNgnMediaScreenAppName() { + return this.getParameter(ChangeRegistration.KEY_NGN_MEDIA_SCREEN_APP_NAME); + } + /** + * @param {String[]} synonyms - Request new VR synonyms registration + * @return {ChangeRegistration} + */ + + + setVrSynonyms(synonyms) { + this.setParameter(ChangeRegistration.KEY_VR_SYNONYMS, synonyms); + return this; + } + /** + * @return {String[]} + */ + + + getVrSynonyms() { + return this.getParameter(ChangeRegistration.KEY_VR_SYNONYMS); + } + + } + + ChangeRegistration.KEY_LANGUAGE = 'language'; + ChangeRegistration.KEY_HMI_DISPLAY_LANGUAGE = 'hmiDisplayLanguage'; + ChangeRegistration.KEY_APP_NAME = 'appName'; + ChangeRegistration.KEY_TTS_NAME = 'ttsName'; + ChangeRegistration.KEY_NGN_MEDIA_SCREEN_APP_NAME = 'ngnMediaScreenAppName'; + ChangeRegistration.KEY_VR_SYNONYMS = 'vrSynonyms'; + + /* eslint-disable camelcase */ + + class ChangeRegistrationResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ChangeRegistration); + } + + } + + /* eslint-disable camelcase */ + /** + * Generic Response is sent, when the name of a received msg cannot be retrieved. Only used in case of an error. + * Currently, only resultCode INVALID_DATA is used. + */ + + class GenericResponseResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GenericResponse); + } + + } + + /* eslint-disable camelcase */ + /** + * Used to push a binary data onto the module from a mobile device, such as icons and album art Not supported on first + * generation of SDL enabled modules. Binary data is in binary part of hybrid msg. + */ + + class PutFile extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.PutFile); + } // ------ Not part of the RPC spec itself ----- + + /** + * @param {Uint8Array} fileData + * @return {PutFile} + */ + + + setFileData(fileData) { + this.setBulkData(fileData); + return this; + } + /** + * @return {Uint8Array} + */ + + + getFileData() { + return this.getBulkData(); + } // ----------------- END ----------------------- + + /** + * @param {String} name - File reference name. + * @return {PutFile} + */ + + + setFileName(name) { + this.setParameter(PutFile.KEY_FILE_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getFileName() { + return this.getParameter(PutFile.KEY_FILE_NAME); + } + /** + * @param {FileType} type - Selected file type. + * @return {PutFile} + */ + + + setFileType(type) { + this.validateType(FileType, type); + this.setParameter(PutFile.KEY_FILE_TYPE, type); + return this; + } + /** + * @return {FileType} + */ + + + getFileType() { + return this.getObject(FileType, PutFile.KEY_FILE_TYPE); + } + /** + * @param {Boolean} file - Indicates if the file is meant to persist between sessions / ignition cycles. If set to + * TRUE, then the system will aim to persist this file through session / cycles. While files + * with this designation will have priority over others, they are subject to deletion by the + * system at any time. In the event of automatic deletion by the system, the app will + * receive a rejection and have to resend the file. If omitted, the value will be set to + * false. + * @return {PutFile} + */ + + + setPersistentFile(file) { + this.setParameter(PutFile.KEY_PERSISTENT_FILE, file); + return this; + } + /** + * @return {Boolean} + */ + + + getPersistentFile() { + return this.getParameter(PutFile.KEY_PERSISTENT_FILE); + } + /** + * @param {Boolean} file - Indicates if the file is meant to be passed thru core to elsewhere on the system. If set + * to TRUE, then the system will instead pass the data thru as it arrives to a predetermined + * area outside of core. If omitted, the value will be set to false. + * @return {PutFile} + */ + + + setSystemFile(file) { + this.setParameter(PutFile.KEY_SYSTEM_FILE, file); + return this; + } + /** + * @return {Boolean} + */ + + + getSystemFile() { + return this.getParameter(PutFile.KEY_SYSTEM_FILE); + } + /** + * @param {Number} offset - Optional offset in bytes for resuming partial data chunks + * @return {PutFile} + */ + + + setOffset(offset) { + this.setParameter(PutFile.KEY_OFFSET, offset); + return this; + } + /** + * @return {Number} + */ + + + getOffset() { + return this.getParameter(PutFile.KEY_OFFSET); + } + /** + * @param {Number} length - Optional length in bytes for resuming partial data chunks If offset is set to 0, then + * length is the total length of the file to be downloaded + * @return {PutFile} + */ + + + setLength(length) { + this.setParameter(PutFile.KEY_LENGTH, length); + return this; + } + /** + * @return {Number} + */ + + + getLength() { + return this.getParameter(PutFile.KEY_LENGTH); + } + /** + * @param {Number} crc - Additional CRC32 checksum to protect data integrity up to 512 Mbits + * @return {PutFile} + */ + + + setCrc(crc) { + this.setParameter(PutFile.KEY_CRC, crc); + return this; + } + /** + * @return {Number} + */ + + + getCrc() { + return this.getParameter(PutFile.KEY_CRC); + } + + } + + PutFile.KEY_FILE_NAME = 'syncFileName'; + PutFile.KEY_FILE_TYPE = 'fileType'; + PutFile.KEY_PERSISTENT_FILE = 'persistentFile'; + PutFile.KEY_SYSTEM_FILE = 'systemFile'; + PutFile.KEY_OFFSET = 'offset'; + PutFile.KEY_LENGTH = 'length'; + PutFile.KEY_CRC = 'crc'; + + /* eslint-disable camelcase */ + /** + * Response is sent, when the file data was copied (success case). Or when an error occurred. Not supported on first + * generation SDL enabled vehicles. + */ + + class PutFileResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.PutFile); + } + /** + * @param {Number} available - Provides the total local space available in SDL Core for the registered app. If the + * transfer has systemFile enabled, then the value will be set to 0 automatically. + * @return {PutFileResponse} + */ + + + setSpaceAvailable(available) { + this.setParameter(PutFileResponse.KEY_SPACE_AVAILABLE, available); + return this; + } + /** + * @return {Number} + */ + + + getSpaceAvailable() { + return this.getParameter(PutFileResponse.KEY_SPACE_AVAILABLE); + } + + } + + PutFileResponse.KEY_SPACE_AVAILABLE = 'spaceAvailable'; + + /* eslint-disable camelcase */ + /** + * This request is sent to the module to retrieve a file + */ + + class GetFile extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetFile); + } + /** + * @param {String} name - File name that should be retrieved + * @return {GetFile} + */ + + + setFileName(name) { + this.setParameter(GetFile.KEY_FILE_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getFileName() { + return this.getParameter(GetFile.KEY_FILE_NAME); + } + /** + * @param {String} id - ID of the service that should have uploaded the requested file. + * @return {GetFile} + */ + + + setAppServiceId(id) { + this.setParameter(GetFile.KEY_APP_SERVICE_ID, id); + return this; + } + /** + * @return {String} + */ + + + getAppServiceId() { + return this.getParameter(GetFile.KEY_APP_SERVICE_ID); + } + /** + * @param {FileType} type - Selected file type. + * @return {GetFile} + */ + + + setFileType(type) { + this.validateType(FileType, type); + this.setParameter(GetFile.KEY_FILE_TYPE, type); + return this; + } + /** + * @return {FileType} + */ + + + getFileType() { + return this.getObject(FileType, GetFile.KEY_FILE_TYPE); + } + /** + * @param {Number} offset - Optional offset in bytes for resuming partial data chunks + * @return {GetFile} + */ + + + setOffset(offset) { + this.setParameter(GetFile.KEY_OFFSET, offset); + return this; + } + /** + * @return {Number} + */ + + + getOffset() { + return this.getParameter(GetFile.KEY_OFFSET); + } + /** + * @param {Number} length - Optional length in bytes for resuming partial data chunks If offset is set to 0, then + * length is the total length of the file to be retrieved + * @return {GetFile} + */ + + + setLength(length) { + this.setParameter(GetFile.KEY_LENGTH, length); + return this; + } + /** + * @return {Number} + */ + + + getLength() { + return this.getParameter(GetFile.KEY_LENGTH); + } + + } + + GetFile.KEY_FILE_NAME = 'fileName'; + GetFile.KEY_APP_SERVICE_ID = 'appServiceId'; + GetFile.KEY_FILE_TYPE = 'fileType'; + GetFile.KEY_OFFSET = 'offset'; + GetFile.KEY_LENGTH = 'length'; + + /* eslint-disable camelcase */ + /** + * This response includes the data that is requested from the specific service + */ + + class GetFileResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetFile); + } + /** + * @param {Number} offset - Optional offset in bytes for resuming partial data chunks + * @return {GetFileResponse} + */ + + + setOffset(offset) { + this.setParameter(GetFileResponse.KEY_OFFSET, offset); + return this; + } + /** + * @return {Number} + */ + + + getOffset() { + return this.getParameter(GetFileResponse.KEY_OFFSET); + } + /** + * @param {Number} length - Optional length in bytes for resuming partial data chunks if offset is set to 0, then + * length is the total length of the file to be downloaded + * @return {GetFileResponse} + */ + + + setLength(length) { + this.setParameter(GetFileResponse.KEY_LENGTH, length); + return this; + } + /** + * @return {Number} + */ + + + getLength() { + return this.getParameter(GetFileResponse.KEY_LENGTH); + } + /** + * @param {FileType} type - File type that is being sent in response. + * @return {GetFileResponse} + */ + + + setFileType(type) { + this.validateType(FileType, type); + this.setParameter(GetFileResponse.KEY_FILE_TYPE, type); + return this; + } + /** + * @return {FileType} + */ + + + getFileType() { + return this.getObject(FileType, GetFileResponse.KEY_FILE_TYPE); + } + /** + * @param {Number} crc - Additional CRC32 checksum to protect data integrity up to 512 Mbits + * @return {GetFileResponse} + */ + + + setCrc(crc) { + this.setParameter(GetFileResponse.KEY_CRC, crc); + return this; + } + /** + * @return {Number} + */ + + + getCrc() { + return this.getParameter(GetFileResponse.KEY_CRC); + } + + } + + GetFileResponse.KEY_OFFSET = 'offset'; + GetFileResponse.KEY_LENGTH = 'length'; + GetFileResponse.KEY_FILE_TYPE = 'fileType'; + GetFileResponse.KEY_CRC = 'crc'; + + /* eslint-disable camelcase */ + /** + * Used to delete a file resident on the module in the app's local cache. Not supported on first generation SDL enabled + * vehicles. + */ + + class DeleteFile extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.DeleteFile); + } + /** + * @param {String} name - File reference name. + * @return {DeleteFile} + */ + + + setSdlFileName(name) { + this.setParameter(DeleteFile.KEY_SDL_FILE_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getSdlFileName() { + return this.getParameter(DeleteFile.KEY_SDL_FILE_NAME); + } + + } + + DeleteFile.KEY_SDL_FILE_NAME = 'syncFileName'; + + /* eslint-disable camelcase */ + /** + * Response is sent, when the file data was deleted (success case). Or when an error occurred. Not supported on First + * generation SDL enabled vehicles. + */ + + class DeleteFileResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.DeleteFile); + } + /** + * @param {Number} available - Provides the total local space available on the module for the registered app. + * @return {DeleteFileResponse} + */ + + + setSpaceAvailable(available) { + this.setParameter(DeleteFileResponse.KEY_SPACE_AVAILABLE, available); + return this; + } + /** + * @return {Number} + */ + + + getSpaceAvailable() { + return this.getParameter(DeleteFileResponse.KEY_SPACE_AVAILABLE); + } + + } + + DeleteFileResponse.KEY_SPACE_AVAILABLE = 'spaceAvailable'; + + /* eslint-disable camelcase */ + /** + * Requests the current list of resident filenames for the registered app. Not supported on first generation SDL + * enabled vehicles. + */ + + class ListFiles extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ListFiles); + } + + } + + /* eslint-disable camelcase */ + /** + * Returns the current list of resident filenames for the registered app along with the current space available Not + * supported on First generation SDL enabled vehicles. + */ + + class ListFilesResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ListFiles); + } + /** + * @param {String[]} filenames - An array of all filenames resident on the module for the given registered app. If + * omitted, then no files currently reside on the system. + * @return {ListFilesResponse} + */ + + + setFilenames(filenames) { + this.setParameter(ListFilesResponse.KEY_FILENAMES, filenames); + return this; + } + /** + * @return {String[]} + */ + + + getFilenames() { + return this.getParameter(ListFilesResponse.KEY_FILENAMES); + } + /** + * @param {Number} available - Provides the total local space available on the module for the registered app. + * @return {ListFilesResponse} + */ + + + setSpaceAvailable(available) { + this.setParameter(ListFilesResponse.KEY_SPACE_AVAILABLE, available); + return this; + } + /** + * @return {Number} + */ + + + getSpaceAvailable() { + return this.getParameter(ListFilesResponse.KEY_SPACE_AVAILABLE); + } + + } + + ListFilesResponse.KEY_FILENAMES = 'filenames'; + ListFilesResponse.KEY_SPACE_AVAILABLE = 'spaceAvailable'; + + /* eslint-disable camelcase */ + /** + * Used to set existing local file on the module as the app's icon Not supported on first generation SDL enabled + * vehicles. + */ + + class SetAppIcon extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SetAppIcon); + } + /** + * @param {String} name - File reference name. + * @return {SetAppIcon} + */ + + + setFileName(name) { + this.setParameter(SetAppIcon.KEY_FILE_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getFileName() { + return this.getParameter(SetAppIcon.KEY_FILE_NAME); + } + + } + + SetAppIcon.KEY_FILE_NAME = 'syncFileName'; + + /* eslint-disable camelcase */ + /** + * Response is sent, when the file data was copied (success case). Or when an error occurred. Not supported on First + * generation SDL enabled vehicles. + */ + + class SetAppIconResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SetAppIcon); + } + + } + + /* eslint-disable camelcase */ + /** + * This RPC is deprecated. Use Show RPC to change layout. + * @deprecated + */ + + class SetDisplayLayout extends RpcRequest { + /** + * @deprecated + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SetDisplayLayout); + } + /** + * @deprecated + * @param {String} layout - Predefined or dynamically created screen layout. Currently only predefined screen + * layouts are defined. + * @return {SetDisplayLayout} + */ + + + setDisplayLayout(layout) { + this.setParameter(SetDisplayLayout.KEY_DISPLAY_LAYOUT, layout); + return this; + } + /** + * @deprecated + * @return {String} + */ + + + getDisplayLayout() { + return this.getParameter(SetDisplayLayout.KEY_DISPLAY_LAYOUT); + } + /** + * @deprecated + * @param {TemplateColorScheme} scheme - A color scheme for all display layout templates. + * @return {SetDisplayLayout} + */ + + + setDayColorScheme(scheme) { + this.validateType(TemplateColorScheme, scheme); + this.setParameter(SetDisplayLayout.KEY_DAY_COLOR_SCHEME, scheme); + return this; + } + /** + * @deprecated + * @return {TemplateColorScheme} + */ + + + getDayColorScheme() { + return this.getObject(TemplateColorScheme, SetDisplayLayout.KEY_DAY_COLOR_SCHEME); + } + /** + * @deprecated + * @param {TemplateColorScheme} scheme - A color scheme for all display layout templates. + * @return {SetDisplayLayout} + */ + + + setNightColorScheme(scheme) { + this.validateType(TemplateColorScheme, scheme); + this.setParameter(SetDisplayLayout.KEY_NIGHT_COLOR_SCHEME, scheme); + return this; + } + /** + * @deprecated + * @return {TemplateColorScheme} + */ + + + getNightColorScheme() { + return this.getObject(TemplateColorScheme, SetDisplayLayout.KEY_NIGHT_COLOR_SCHEME); + } + + } + + SetDisplayLayout.KEY_DISPLAY_LAYOUT = 'displayLayout'; + SetDisplayLayout.KEY_DAY_COLOR_SCHEME = 'dayColorScheme'; + SetDisplayLayout.KEY_NIGHT_COLOR_SCHEME = 'nightColorScheme'; + + /* eslint-disable camelcase */ + /** + * This RPC is deprecated. Use Show RPC to change layout. + * @deprecated + */ + + class SetDisplayLayoutResponse extends RpcResponse { + /** + * @deprecated + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SetDisplayLayout); + } + /** + * @deprecated + * @param {DisplayCapabilities} capabilities - See DisplayCapabilities + * @return {SetDisplayLayoutResponse} + */ + + + setDisplayCapabilities(capabilities) { + this.validateType(DisplayCapabilities, capabilities); + this.setParameter(SetDisplayLayoutResponse.KEY_DISPLAY_CAPABILITIES, capabilities); + return this; + } + /** + * @deprecated + * @return {DisplayCapabilities} + */ + + + getDisplayCapabilities() { + return this.getObject(DisplayCapabilities, SetDisplayLayoutResponse.KEY_DISPLAY_CAPABILITIES); + } + /** + * @deprecated + * @param {ButtonCapabilities[]} capabilities - See ButtonCapabilities + * @return {SetDisplayLayoutResponse} + */ + + + setButtonCapabilities(capabilities) { + this.validateType(ButtonCapabilities, capabilities, true); + this.setParameter(SetDisplayLayoutResponse.KEY_BUTTON_CAPABILITIES, capabilities); + return this; + } + /** + * @deprecated + * @return {ButtonCapabilities[]} + */ + + + getButtonCapabilities() { + return this.getObject(ButtonCapabilities, SetDisplayLayoutResponse.KEY_BUTTON_CAPABILITIES); + } + /** + * @deprecated + * @param {SoftButtonCapabilities[]} capabilities - If returned, the platform supports on-screen SoftButtons; see + * SoftButtonCapabilities. + * @return {SetDisplayLayoutResponse} + */ + + + setSoftButtonCapabilities(capabilities) { + this.validateType(SoftButtonCapabilities, capabilities, true); + this.setParameter(SetDisplayLayoutResponse.KEY_SOFT_BUTTON_CAPABILITIES, capabilities); + return this; + } + /** + * @deprecated + * @return {SoftButtonCapabilities[]} + */ + + + getSoftButtonCapabilities() { + return this.getObject(SoftButtonCapabilities, SetDisplayLayoutResponse.KEY_SOFT_BUTTON_CAPABILITIES); + } + /** + * @deprecated + * @param {PresetBankCapabilities} capabilities - If returned, the platform supports custom on-screen Presets; see + * PresetBankCapabilities. + * @return {SetDisplayLayoutResponse} + */ + + + setPresetBankCapabilities(capabilities) { + this.validateType(PresetBankCapabilities, capabilities); + this.setParameter(SetDisplayLayoutResponse.KEY_PRESET_BANK_CAPABILITIES, capabilities); + return this; + } + /** + * @deprecated + * @return {PresetBankCapabilities} + */ + + + getPresetBankCapabilities() { + return this.getObject(PresetBankCapabilities, SetDisplayLayoutResponse.KEY_PRESET_BANK_CAPABILITIES); + } + + } + + SetDisplayLayoutResponse.KEY_DISPLAY_CAPABILITIES = 'displayCapabilities'; + SetDisplayLayoutResponse.KEY_BUTTON_CAPABILITIES = 'buttonCapabilities'; + SetDisplayLayoutResponse.KEY_SOFT_BUTTON_CAPABILITIES = 'softButtonCapabilities'; + SetDisplayLayoutResponse.KEY_PRESET_BANK_CAPABILITIES = 'presetBankCapabilities'; + + /* eslint-disable camelcase */ + /** + * Enumeration listing possible asynchronous requests. + * @typedef {Enum} RequestType + * @property {Object} _MAP + */ + + class RequestType extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get HTTP() { + return RequestType._MAP.HTTP; + } + /** + * @return {String} + */ + + + static get FILE_RESUME() { + return RequestType._MAP.FILE_RESUME; + } + /** + * @return {String} + */ + + + static get AUTH_REQUEST() { + return RequestType._MAP.AUTH_REQUEST; + } + /** + * @return {String} + */ + + + static get AUTH_CHALLENGE() { + return RequestType._MAP.AUTH_CHALLENGE; + } + /** + * @return {String} + */ + + + static get AUTH_ACK() { + return RequestType._MAP.AUTH_ACK; + } + /** + * @return {String} + */ + + + static get PROPRIETARY() { + return RequestType._MAP.PROPRIETARY; + } + /** + * @return {String} + */ + + + static get QUERY_APPS() { + return RequestType._MAP.QUERY_APPS; + } + /** + * @return {String} + */ + + + static get LAUNCH_APP() { + return RequestType._MAP.LAUNCH_APP; + } + /** + * @return {String} + */ + + + static get LOCK_SCREEN_ICON_URL() { + return RequestType._MAP.LOCK_SCREEN_ICON_URL; + } + /** + * @return {String} + */ + + + static get TRAFFIC_MESSAGE_CHANNEL() { + return RequestType._MAP.TRAFFIC_MESSAGE_CHANNEL; + } + /** + * @return {String} + */ + + + static get DRIVER_PROFILE() { + return RequestType._MAP.DRIVER_PROFILE; + } + /** + * @return {String} + */ + + + static get VOICE_SEARCH() { + return RequestType._MAP.VOICE_SEARCH; + } + /** + * @return {String} + */ + + + static get NAVIGATION() { + return RequestType._MAP.NAVIGATION; + } + /** + * @return {String} + */ + + + static get PHONE() { + return RequestType._MAP.PHONE; + } + /** + * @return {String} + */ + + + static get CLIMATE() { + return RequestType._MAP.CLIMATE; + } + /** + * @return {String} + */ + + + static get SETTINGS() { + return RequestType._MAP.SETTINGS; + } + /** + * @return {String} + */ + + + static get VEHICLE_DIAGNOSTICS() { + return RequestType._MAP.VEHICLE_DIAGNOSTICS; + } + /** + * @return {String} + */ + + + static get EMERGENCY() { + return RequestType._MAP.EMERGENCY; + } + /** + * @return {String} + */ + + + static get MEDIA() { + return RequestType._MAP.MEDIA; + } + /** + * @return {String} + */ + + + static get FOTA() { + return RequestType._MAP.FOTA; + } + /** + * @return {String} + */ + + + static get OEM_SPECIFIC() { + return RequestType._MAP.OEM_SPECIFIC; + } + /** + * @return {String} + */ + + + static get ICON_URL() { + return RequestType._MAP.ICON_URL; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return RequestType._valueForKey(key, RequestType._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return RequestType._keyForValue(value, RequestType._MAP); + } + + } + + RequestType._MAP = Object.freeze({ + 'HTTP': 'HTTP', + 'FILE_RESUME': 'FILE_RESUME', + 'AUTH_REQUEST': 'AUTH_REQUEST', + 'AUTH_CHALLENGE': 'AUTH_CHALLENGE', + 'AUTH_ACK': 'AUTH_ACK', + 'PROPRIETARY': 'PROPRIETARY', + 'QUERY_APPS': 'QUERY_APPS', + 'LAUNCH_APP': 'LAUNCH_APP', + 'LOCK_SCREEN_ICON_URL': 'LOCK_SCREEN_ICON_URL', + 'TRAFFIC_MESSAGE_CHANNEL': 'TRAFFIC_MESSAGE_CHANNEL', + 'DRIVER_PROFILE': 'DRIVER_PROFILE', + 'VOICE_SEARCH': 'VOICE_SEARCH', + 'NAVIGATION': 'NAVIGATION', + 'PHONE': 'PHONE', + 'CLIMATE': 'CLIMATE', + 'SETTINGS': 'SETTINGS', + 'VEHICLE_DIAGNOSTICS': 'VEHICLE_DIAGNOSTICS', + 'EMERGENCY': 'EMERGENCY', + 'MEDIA': 'MEDIA', + 'FOTA': 'FOTA', + 'OEM_SPECIFIC': 'OEM_SPECIFIC', + 'ICON_URL': 'ICON_URL' + }); + + /* eslint-disable camelcase */ + /** + * An asynchronous request from the device; binary data can be included in hybrid part of message for some requests + * (such as HTTP, Proprietary, or Authentication requests) + */ + + class SystemRequest extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SystemRequest); + } + /** + * @param {RequestType} type - The type of system request. Note that Proprietary requests should forward the binary + * data to the known proprietary module on the system. + * @return {SystemRequest} + */ + + + setRequestType(type) { + this.validateType(RequestType, type); + this.setParameter(SystemRequest.KEY_REQUEST_TYPE, type); + return this; + } + /** + * @return {RequestType} + */ + + + getRequestType() { + return this.getObject(RequestType, SystemRequest.KEY_REQUEST_TYPE); + } + /** + * @param {String} type - This parameter is filled for supporting OEM proprietary data exchanges. + * @return {SystemRequest} + */ + + + setRequestSubType(type) { + this.setParameter(SystemRequest.KEY_REQUEST_SUB_TYPE, type); + return this; + } + /** + * @return {String} + */ + + + getRequestSubType() { + return this.getParameter(SystemRequest.KEY_REQUEST_SUB_TYPE); + } + /** + * @param {String} name - Filename of HTTP data to store in predefined system staging area. Mandatory if requestType + * is HTTP. PROPRIETARY requestType should ignore this parameter. + * @return {SystemRequest} + */ + + + setFileName(name) { + this.setParameter(SystemRequest.KEY_FILE_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getFileName() { + return this.getParameter(SystemRequest.KEY_FILE_NAME); + } + + } + + SystemRequest.KEY_REQUEST_TYPE = 'requestType'; + SystemRequest.KEY_REQUEST_SUB_TYPE = 'requestSubType'; + SystemRequest.KEY_FILE_NAME = 'fileName'; + + /* eslint-disable camelcase */ + + class SystemRequestResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SystemRequest); + } + + } + + /* eslint-disable camelcase */ + /** + * The mode in which the SendLocation request is sent + * @typedef {Enum} DeliveryMode + * @property {Object} _MAP + */ + + class DeliveryMode extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get PROMPT() { + return DeliveryMode._MAP.PROMPT; + } + /** + * @return {String} + */ + + + static get DESTINATION() { + return DeliveryMode._MAP.DESTINATION; + } + /** + * @return {String} + */ + + + static get QUEUE() { + return DeliveryMode._MAP.QUEUE; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return DeliveryMode._valueForKey(key, DeliveryMode._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return DeliveryMode._keyForValue(value, DeliveryMode._MAP); + } + + } + + DeliveryMode._MAP = Object.freeze({ + 'PROMPT': 'PROMPT', + 'DESTINATION': 'DESTINATION', + 'QUEUE': 'QUEUE' + }); + + /* eslint-disable camelcase */ + + class DateTime extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} millisecond - Milliseconds + * @return {DateTime} + */ + + + setMillisecond(millisecond) { + this.setParameter(DateTime.KEY_MILLISECOND, millisecond); + return this; + } + /** + * @return {Number} + */ + + + getMillisecond() { + return this.getParameter(DateTime.KEY_MILLISECOND); + } + /** + * @param {Number} second - Seconds part of time + * @return {DateTime} + */ + + + setSecond(second) { + this.setParameter(DateTime.KEY_SECOND, second); + return this; + } + /** + * @return {Number} + */ + + + getSecond() { + return this.getParameter(DateTime.KEY_SECOND); + } + /** + * @param {Number} minute - Minutes part of time + * @return {DateTime} + */ + + + setMinute(minute) { + this.setParameter(DateTime.KEY_MINUTE, minute); + return this; + } + /** + * @return {Number} + */ + + + getMinute() { + return this.getParameter(DateTime.KEY_MINUTE); + } + /** + * @param {Number} hour - Hours part of time. Note that this structure accepts time only in 24 Hr format + * @return {DateTime} + */ + + + setHour(hour) { + this.setParameter(DateTime.KEY_HOUR, hour); + return this; + } + /** + * @return {Number} + */ + + + getHour() { + return this.getParameter(DateTime.KEY_HOUR); + } + /** + * @param {Number} day - Day of the month + * @return {DateTime} + */ + + + setDay(day) { + this.setParameter(DateTime.KEY_DAY, day); + return this; + } + /** + * @return {Number} + */ + + + getDay() { + return this.getParameter(DateTime.KEY_DAY); + } + /** + * @param {Number} month - Month of the year + * @return {DateTime} + */ + + + setMonth(month) { + this.setParameter(DateTime.KEY_MONTH, month); + return this; + } + /** + * @return {Number} + */ + + + getMonth() { + return this.getParameter(DateTime.KEY_MONTH); + } + /** + * @param {Number} year - The year in YYYY format + * @return {DateTime} + */ + + + setYear(year) { + this.setParameter(DateTime.KEY_YEAR, year); + return this; + } + /** + * @return {Number} + */ + + + getYear() { + return this.getParameter(DateTime.KEY_YEAR); + } + /** + * @param {Number} tz_hour - Time zone offset in Hours wrt UTC. + * @return {DateTime} + */ + + + setTz_hour(tz_hour) { + this.setParameter(DateTime.KEY_TZ_HOUR, tz_hour); + return this; + } + /** + * @return {Number} + */ + + + getTz_hour() { + return this.getParameter(DateTime.KEY_TZ_HOUR); + } + /** + * @param {Number} tz_minute - Time zone offset in Min wrt UTC. + * @return {DateTime} + */ + + + setTz_minute(tz_minute) { + this.setParameter(DateTime.KEY_TZ_MINUTE, tz_minute); + return this; + } + /** + * @return {Number} + */ + + + getTz_minute() { + return this.getParameter(DateTime.KEY_TZ_MINUTE); + } + + } + + DateTime.KEY_MILLISECOND = 'millisecond'; + DateTime.KEY_SECOND = 'second'; + DateTime.KEY_MINUTE = 'minute'; + DateTime.KEY_HOUR = 'hour'; + DateTime.KEY_DAY = 'day'; + DateTime.KEY_MONTH = 'month'; + DateTime.KEY_YEAR = 'year'; + DateTime.KEY_TZ_HOUR = 'tz_hour'; + DateTime.KEY_TZ_MINUTE = 'tz_minute'; + + /* eslint-disable camelcase */ + + class OASISAddress extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} name - Name of the country (localized) + * @return {OASISAddress} + */ + + + setCountryName(name) { + this.setParameter(OASISAddress.KEY_COUNTRY_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getCountryName() { + return this.getParameter(OASISAddress.KEY_COUNTRY_NAME); + } + /** + * @param {String} code - Name of country (ISO 3166-2) + * @return {OASISAddress} + */ + + + setCountryCode(code) { + this.setParameter(OASISAddress.KEY_COUNTRY_CODE, code); + return this; + } + /** + * @return {String} + */ + + + getCountryCode() { + return this.getParameter(OASISAddress.KEY_COUNTRY_CODE); + } + /** + * @param {String} code - (PLZ, ZIP, PIN, CAP etc.) + * @return {OASISAddress} + */ + + + setPostalCode(code) { + this.setParameter(OASISAddress.KEY_POSTAL_CODE, code); + return this; + } + /** + * @return {String} + */ + + + getPostalCode() { + return this.getParameter(OASISAddress.KEY_POSTAL_CODE); + } + /** + * @param {String} area - Portion of country (e.g. state) + * @return {OASISAddress} + */ + + + setAdministrativeArea(area) { + this.setParameter(OASISAddress.KEY_ADMINISTRATIVE_AREA, area); + return this; + } + /** + * @return {String} + */ + + + getAdministrativeArea() { + return this.getParameter(OASISAddress.KEY_ADMINISTRATIVE_AREA); + } + /** + * @param {String} area - Portion of e.g. state (e.g. county) + * @return {OASISAddress} + */ + + + setSubAdministrativeArea(area) { + this.setParameter(OASISAddress.KEY_SUB_ADMINISTRATIVE_AREA, area); + return this; + } + /** + * @return {String} + */ + + + getSubAdministrativeArea() { + return this.getParameter(OASISAddress.KEY_SUB_ADMINISTRATIVE_AREA); + } + /** + * @param {String} locality - Hypernym for e.g. city/village + * @return {OASISAddress} + */ + + + setLocality(locality) { + this.setParameter(OASISAddress.KEY_LOCALITY, locality); + return this; + } + /** + * @return {String} + */ + + + getLocality() { + return this.getParameter(OASISAddress.KEY_LOCALITY); + } + /** + * @param {String} locality - Hypernym for e.g. district + * @return {OASISAddress} + */ + + + setSubLocality(locality) { + this.setParameter(OASISAddress.KEY_SUB_LOCALITY, locality); + return this; + } + /** + * @return {String} + */ + + + getSubLocality() { + return this.getParameter(OASISAddress.KEY_SUB_LOCALITY); + } + /** + * @param {String} thoroughfare - Hypernym for street, road etc. + * @return {OASISAddress} + */ + + + setThoroughfare(thoroughfare) { + this.setParameter(OASISAddress.KEY_THOROUGHFARE, thoroughfare); + return this; + } + /** + * @return {String} + */ + + + getThoroughfare() { + return this.getParameter(OASISAddress.KEY_THOROUGHFARE); + } + /** + * @param {String} thoroughfare - Portion of thoroughfare e.g. house number + * @return {OASISAddress} + */ + + + setSubThoroughfare(thoroughfare) { + this.setParameter(OASISAddress.KEY_SUB_THOROUGHFARE, thoroughfare); + return this; + } + /** + * @return {String} + */ + + + getSubThoroughfare() { + return this.getParameter(OASISAddress.KEY_SUB_THOROUGHFARE); + } + + } + + OASISAddress.KEY_COUNTRY_NAME = 'countryName'; + OASISAddress.KEY_COUNTRY_CODE = 'countryCode'; + OASISAddress.KEY_POSTAL_CODE = 'postalCode'; + OASISAddress.KEY_ADMINISTRATIVE_AREA = 'administrativeArea'; + OASISAddress.KEY_SUB_ADMINISTRATIVE_AREA = 'subAdministrativeArea'; + OASISAddress.KEY_LOCALITY = 'locality'; + OASISAddress.KEY_SUB_LOCALITY = 'subLocality'; + OASISAddress.KEY_THOROUGHFARE = 'thoroughfare'; + OASISAddress.KEY_SUB_THOROUGHFARE = 'subThoroughfare'; + + /* eslint-disable camelcase */ + + class SendLocation extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SendLocation); + } + /** + * @param {Number} degrees + * @return {SendLocation} + */ + + + setLongitudeDegrees(degrees) { + this.setParameter(SendLocation.KEY_LONGITUDE_DEGREES, degrees); + return this; + } + /** + * @return {Number} + */ + + + getLongitudeDegrees() { + return this.getParameter(SendLocation.KEY_LONGITUDE_DEGREES); + } + /** + * @param {Number} degrees + * @return {SendLocation} + */ + + + setLatitudeDegrees(degrees) { + this.setParameter(SendLocation.KEY_LATITUDE_DEGREES, degrees); + return this; + } + /** + * @return {Number} + */ + + + getLatitudeDegrees() { + return this.getParameter(SendLocation.KEY_LATITUDE_DEGREES); + } + /** + * @param {String} name - Name / title of intended location + * @return {SendLocation} + */ + + + setLocationName(name) { + this.setParameter(SendLocation.KEY_LOCATION_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getLocationName() { + return this.getParameter(SendLocation.KEY_LOCATION_NAME); + } + /** + * @param {String} description - Description intended location / establishment (if applicable) + * @return {SendLocation} + */ + + + setLocationDescription(description) { + this.setParameter(SendLocation.KEY_LOCATION_DESCRIPTION, description); + return this; + } + /** + * @return {String} + */ + + + getLocationDescription() { + return this.getParameter(SendLocation.KEY_LOCATION_DESCRIPTION); + } + /** + * @param {String[]} lines - Location address (if applicable) + * @return {SendLocation} + */ + + + setAddressLines(lines) { + this.setParameter(SendLocation.KEY_ADDRESS_LINES, lines); + return this; + } + /** + * @return {String[]} + */ + + + getAddressLines() { + return this.getParameter(SendLocation.KEY_ADDRESS_LINES); + } + /** + * @param {String} number - Phone number of intended location / establishment (if applicable) + * @return {SendLocation} + */ + + + setPhoneNumber(number) { + this.setParameter(SendLocation.KEY_PHONE_NUMBER, number); + return this; + } + /** + * @return {String} + */ + + + getPhoneNumber() { + return this.getParameter(SendLocation.KEY_PHONE_NUMBER); + } + /** + * @param {Image} image - Image / icon of intended location (if applicable and supported) + * @return {SendLocation} + */ + + + setLocationImage(image) { + this.validateType(Image, image); + this.setParameter(SendLocation.KEY_LOCATION_IMAGE, image); + return this; + } + /** + * @return {Image} + */ + + + getLocationImage() { + return this.getObject(Image, SendLocation.KEY_LOCATION_IMAGE); + } + /** + * @param {DateTime} stamp - timestamp in ISO 8601 format + * @return {SendLocation} + */ + + + setTimeStamp(stamp) { + this.validateType(DateTime, stamp); + this.setParameter(SendLocation.KEY_TIME_STAMP, stamp); + return this; + } + /** + * @return {DateTime} + */ + + + getTimeStamp() { + return this.getObject(DateTime, SendLocation.KEY_TIME_STAMP); + } + /** + * @param {OASISAddress} address - Address to be used for setting destination + * @return {SendLocation} + */ + + + setAddress(address) { + this.validateType(OASISAddress, address); + this.setParameter(SendLocation.KEY_ADDRESS, address); + return this; + } + /** + * @return {OASISAddress} + */ + + + getAddress() { + return this.getObject(OASISAddress, SendLocation.KEY_ADDRESS); + } + /** + * @param {DeliveryMode} mode - Defines the mode of prompt for user + * @return {SendLocation} + */ + + + setDeliveryMode(mode) { + this.validateType(DeliveryMode, mode); + this.setParameter(SendLocation.KEY_DELIVERY_MODE, mode); + return this; + } + /** + * @return {DeliveryMode} + */ + + + getDeliveryMode() { + return this.getObject(DeliveryMode, SendLocation.KEY_DELIVERY_MODE); + } + + } + + SendLocation.KEY_LONGITUDE_DEGREES = 'longitudeDegrees'; + SendLocation.KEY_LATITUDE_DEGREES = 'latitudeDegrees'; + SendLocation.KEY_LOCATION_NAME = 'locationName'; + SendLocation.KEY_LOCATION_DESCRIPTION = 'locationDescription'; + SendLocation.KEY_ADDRESS_LINES = 'addressLines'; + SendLocation.KEY_PHONE_NUMBER = 'phoneNumber'; + SendLocation.KEY_LOCATION_IMAGE = 'locationImage'; + SendLocation.KEY_TIME_STAMP = 'timeStamp'; + SendLocation.KEY_ADDRESS = 'address'; + SendLocation.KEY_DELIVERY_MODE = 'deliveryMode'; + + /* eslint-disable camelcase */ + + class SendLocationResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SendLocation); + } + + } + + /* eslint-disable camelcase */ + /** + * Dials a phone number and switches to phone application. + */ + + class DialNumber extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.DialNumber); + } + /** + * @param {String} number - Phone number is a string, which can be up to 40 chars. All characters shall be stripped + * from string except digits 0-9 and * # , ; + + * @return {DialNumber} + */ + + + setNumber(number) { + this.setParameter(DialNumber.KEY_NUMBER, number); + return this; + } + /** + * @return {String} + */ + + + getNumber() { + return this.getParameter(DialNumber.KEY_NUMBER); + } + + } + + DialNumber.KEY_NUMBER = 'number'; + + /* eslint-disable camelcase */ + + class DialNumberResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.DialNumber); + } + + } + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} ButtonPressMode + * @property {Object} _MAP + */ + + class ButtonPressMode extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * A button was released, after it was pressed for a long time Actual timing is defined by the headunit and may + * vary + * @return {String} + */ + + + static get LONG() { + return ButtonPressMode._MAP.LONG; + } + /** + * A button was released, after it was pressed for a short time Actual timing is defined by the headunit and may + * vary + * @return {String} + */ + + + static get SHORT() { + return ButtonPressMode._MAP.SHORT; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return ButtonPressMode._valueForKey(key, ButtonPressMode._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return ButtonPressMode._keyForValue(value, ButtonPressMode._MAP); + } + + } + + ButtonPressMode._MAP = Object.freeze({ + 'LONG': 'LONG', + 'SHORT': 'SHORT' + }); + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} ModuleType + * @property {Object} _MAP + */ + + class ModuleType extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get CLIMATE() { + return ModuleType._MAP.CLIMATE; + } + /** + * @return {String} + */ + + + static get RADIO() { + return ModuleType._MAP.RADIO; + } + /** + * @return {String} + */ + + + static get SEAT() { + return ModuleType._MAP.SEAT; + } + /** + * @return {String} + */ + + + static get AUDIO() { + return ModuleType._MAP.AUDIO; + } + /** + * @return {String} + */ + + + static get LIGHT() { + return ModuleType._MAP.LIGHT; + } + /** + * @return {String} + */ + + + static get HMI_SETTINGS() { + return ModuleType._MAP.HMI_SETTINGS; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return ModuleType._valueForKey(key, ModuleType._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return ModuleType._keyForValue(value, ModuleType._MAP); + } + + } + + ModuleType._MAP = Object.freeze({ + 'CLIMATE': 'CLIMATE', + 'RADIO': 'RADIO', + 'SEAT': 'SEAT', + 'AUDIO': 'AUDIO', + 'LIGHT': 'LIGHT', + 'HMI_SETTINGS': 'HMI_SETTINGS' + }); + + /* eslint-disable camelcase */ + + class ButtonPress extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ButtonPress); + } + /** + * @param {ModuleType} type - The module where the button should be pressed + * @return {ButtonPress} + */ + + + setModuleType(type) { + this.validateType(ModuleType, type); + this.setParameter(ButtonPress.KEY_MODULE_TYPE, type); + return this; + } + /** + * @return {ModuleType} + */ + + + getModuleType() { + return this.getObject(ModuleType, ButtonPress.KEY_MODULE_TYPE); + } + /** + * @param {String} id - Id of a module, published by System Capability. + * @return {ButtonPress} + */ + + + setModuleId(id) { + this.setParameter(ButtonPress.KEY_MODULE_ID, id); + return this; + } + /** + * @return {String} + */ + + + getModuleId() { + return this.getParameter(ButtonPress.KEY_MODULE_ID); + } + /** + * @param {ButtonName} name - The name of supported RC climate or radio button. + * @return {ButtonPress} + */ + + + setButtonName(name) { + this.validateType(ButtonName, name); + this.setParameter(ButtonPress.KEY_BUTTON_NAME, name); + return this; + } + /** + * @return {ButtonName} + */ + + + getButtonName() { + return this.getObject(ButtonName, ButtonPress.KEY_BUTTON_NAME); + } + /** + * @param {ButtonPressMode} mode - Indicates whether this is a LONG or SHORT button press event. + * @return {ButtonPress} + */ + + + setButtonPressMode(mode) { + this.validateType(ButtonPressMode, mode); + this.setParameter(ButtonPress.KEY_BUTTON_PRESS_MODE, mode); + return this; + } + /** + * @return {ButtonPressMode} + */ + + + getButtonPressMode() { + return this.getObject(ButtonPressMode, ButtonPress.KEY_BUTTON_PRESS_MODE); + } + + } + + ButtonPress.KEY_MODULE_TYPE = 'moduleType'; + ButtonPress.KEY_MODULE_ID = 'moduleId'; + ButtonPress.KEY_BUTTON_NAME = 'buttonName'; + ButtonPress.KEY_BUTTON_PRESS_MODE = 'buttonPressMode'; + + /* eslint-disable camelcase */ + + class ButtonPressResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ButtonPress); + } + + } + + /* eslint-disable camelcase */ + + class GetInteriorVehicleData extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetInteriorVehicleData); + } + /** + * @param {ModuleType} type - The type of a RC module to retrieve module data from the vehicle. In the future, this + * should be the Identification of a module. + * @return {GetInteriorVehicleData} + */ + + + setModuleType(type) { + this.validateType(ModuleType, type); + this.setParameter(GetInteriorVehicleData.KEY_MODULE_TYPE, type); + return this; + } + /** + * @return {ModuleType} + */ + + + getModuleType() { + return this.getObject(ModuleType, GetInteriorVehicleData.KEY_MODULE_TYPE); + } + /** + * @param {String} id - Id of a module, published by System Capability. + * @return {GetInteriorVehicleData} + */ + + + setModuleId(id) { + this.setParameter(GetInteriorVehicleData.KEY_MODULE_ID, id); + return this; + } + /** + * @return {String} + */ + + + getModuleId() { + return this.getParameter(GetInteriorVehicleData.KEY_MODULE_ID); + } + /** + * @param {Boolean} subscribe - If subscribe is true, the head unit will register OnInteriorVehicleData + * notifications for the requested module (moduleId and moduleType). If subscribe is + * false, the head unit will unregister OnInteriorVehicleData notifications for the + * requested module (moduleId and moduleType). If subscribe is not included, the + * subscription status of the app for the requested module (moduleId and moduleType) + * will remain unchanged. + * @return {GetInteriorVehicleData} + */ + + + setSubscribe(subscribe) { + this.setParameter(GetInteriorVehicleData.KEY_SUBSCRIBE, subscribe); + return this; + } + /** + * @return {Boolean} + */ + + + getSubscribe() { + return this.getParameter(GetInteriorVehicleData.KEY_SUBSCRIBE); + } + + } + + GetInteriorVehicleData.KEY_MODULE_TYPE = 'moduleType'; + GetInteriorVehicleData.KEY_MODULE_ID = 'moduleId'; + GetInteriorVehicleData.KEY_SUBSCRIBE = 'subscribe'; + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} DisplayMode + * @property {Object} _MAP + */ + + class DisplayMode extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get DAY() { + return DisplayMode._MAP.DAY; + } + /** + * @return {String} + */ + + + static get NIGHT() { + return DisplayMode._MAP.NIGHT; + } + /** + * @return {String} + */ + + + static get AUTO() { + return DisplayMode._MAP.AUTO; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return DisplayMode._valueForKey(key, DisplayMode._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return DisplayMode._keyForValue(value, DisplayMode._MAP); + } + + } + + DisplayMode._MAP = Object.freeze({ + 'DAY': 'DAY', + 'NIGHT': 'NIGHT', + 'AUTO': 'AUTO' + }); + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} DistanceUnit + * @property {Object} _MAP + */ + + class DistanceUnit extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get MILES() { + return DistanceUnit._MAP.MILES; + } + /** + * @return {String} + */ + + + static get KILOMETERS() { + return DistanceUnit._MAP.KILOMETERS; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return DistanceUnit._valueForKey(key, DistanceUnit._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return DistanceUnit._keyForValue(value, DistanceUnit._MAP); + } + + } + + DistanceUnit._MAP = Object.freeze({ + 'MILES': 'MILES', + 'KILOMETERS': 'KILOMETERS' + }); + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} TemperatureUnit + * @property {Object} _MAP + */ + + class TemperatureUnit extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get FAHRENHEIT() { + return TemperatureUnit._MAP.FAHRENHEIT; + } + /** + * @return {String} + */ + + + static get CELSIUS() { + return TemperatureUnit._MAP.CELSIUS; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return TemperatureUnit._valueForKey(key, TemperatureUnit._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return TemperatureUnit._keyForValue(value, TemperatureUnit._MAP); + } + + } + + TemperatureUnit._MAP = Object.freeze({ + 'FAHRENHEIT': 'FAHRENHEIT', + 'CELSIUS': 'CELSIUS' + }); + + /* eslint-disable camelcase */ + /** + * Corresponds to "HMI_SETTINGS" ModuleType + */ + + class HMISettingsControlData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {DisplayMode} mode + * @return {HMISettingsControlData} + */ + + + setDisplayMode(mode) { + this.validateType(DisplayMode, mode); + this.setParameter(HMISettingsControlData.KEY_DISPLAY_MODE, mode); + return this; + } + /** + * @return {DisplayMode} + */ + + + getDisplayMode() { + return this.getObject(DisplayMode, HMISettingsControlData.KEY_DISPLAY_MODE); + } + /** + * @param {TemperatureUnit} unit + * @return {HMISettingsControlData} + */ + + + setTemperatureUnit(unit) { + this.validateType(TemperatureUnit, unit); + this.setParameter(HMISettingsControlData.KEY_TEMPERATURE_UNIT, unit); + return this; + } + /** + * @return {TemperatureUnit} + */ + + + getTemperatureUnit() { + return this.getObject(TemperatureUnit, HMISettingsControlData.KEY_TEMPERATURE_UNIT); + } + /** + * @param {DistanceUnit} unit + * @return {HMISettingsControlData} + */ + + + setDistanceUnit(unit) { + this.validateType(DistanceUnit, unit); + this.setParameter(HMISettingsControlData.KEY_DISTANCE_UNIT, unit); + return this; + } + /** + * @return {DistanceUnit} + */ + + + getDistanceUnit() { + return this.getObject(DistanceUnit, HMISettingsControlData.KEY_DISTANCE_UNIT); + } + + } + + HMISettingsControlData.KEY_DISPLAY_MODE = 'displayMode'; + HMISettingsControlData.KEY_TEMPERATURE_UNIT = 'temperatureUnit'; + HMISettingsControlData.KEY_DISTANCE_UNIT = 'distanceUnit'; + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} RadioBand + * @property {Object} _MAP + */ + + class RadioBand extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get AM() { + return RadioBand._MAP.AM; + } + /** + * @return {String} + */ + + + static get FM() { + return RadioBand._MAP.FM; + } + /** + * @return {String} + */ + + + static get XM() { + return RadioBand._MAP.XM; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return RadioBand._valueForKey(key, RadioBand._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return RadioBand._keyForValue(value, RadioBand._MAP); + } + + } + + RadioBand._MAP = Object.freeze({ + 'AM': 'AM', + 'FM': 'FM', + 'XM': 'XM' + }); + + /* eslint-disable camelcase */ + + class RdsData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} ps - Program Service Name + * @return {RdsData} + */ + + + setPS(ps) { + this.setParameter(RdsData.KEY_PS, ps); + return this; + } + /** + * @return {String} + */ + + + getPS() { + return this.getParameter(RdsData.KEY_PS); + } + /** + * @param {String} rt - Radio Text + * @return {RdsData} + */ + + + setRT(rt) { + this.setParameter(RdsData.KEY_RT, rt); + return this; + } + /** + * @return {String} + */ + + + getRT() { + return this.getParameter(RdsData.KEY_RT); + } + /** + * @param {String} ct - The clock text in UTC format as YYYY-MM-DDThh:mm:ss.sTZD + * @return {RdsData} + */ + + + setCT(ct) { + this.setParameter(RdsData.KEY_CT, ct); + return this; + } + /** + * @return {String} + */ + + + getCT() { + return this.getParameter(RdsData.KEY_CT); + } + /** + * @param {String} pi - Program Identification - the call sign for the radio station + * @return {RdsData} + */ + + + setPI(pi) { + this.setParameter(RdsData.KEY_PI, pi); + return this; + } + /** + * @return {String} + */ + + + getPI() { + return this.getParameter(RdsData.KEY_PI); + } + /** + * @param {Number} pty - The program type - The region should be used to differentiate between EU and North America + * program types + * @return {RdsData} + */ + + + setPTY(pty) { + this.setParameter(RdsData.KEY_PTY, pty); + return this; + } + /** + * @return {Number} + */ + + + getPTY() { + return this.getParameter(RdsData.KEY_PTY); + } + /** + * @param {Boolean} tp - Traffic Program Identification - Identifies a station that offers traffic + * @return {RdsData} + */ + + + setTP(tp) { + this.setParameter(RdsData.KEY_TP, tp); + return this; + } + /** + * @return {Boolean} + */ + + + getTP() { + return this.getParameter(RdsData.KEY_TP); + } + /** + * @param {Boolean} ta - Traffic Announcement Identification - Indicates an ongoing traffic announcement + * @return {RdsData} + */ + + + setTA(ta) { + this.setParameter(RdsData.KEY_TA, ta); + return this; + } + /** + * @return {Boolean} + */ + + + getTA() { + return this.getParameter(RdsData.KEY_TA); + } + /** + * @param {String} reg - Region + * @return {RdsData} + */ + + + setREG(reg) { + this.setParameter(RdsData.KEY_REG, reg); + return this; + } + /** + * @return {String} + */ + + + getREG() { + return this.getParameter(RdsData.KEY_REG); + } + + } + + RdsData.KEY_PS = 'PS'; + RdsData.KEY_RT = 'RT'; + RdsData.KEY_CT = 'CT'; + RdsData.KEY_PI = 'PI'; + RdsData.KEY_PTY = 'PTY'; + RdsData.KEY_TP = 'TP'; + RdsData.KEY_TA = 'TA'; + RdsData.KEY_REG = 'REG'; + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} RadioState + * @property {Object} _MAP + */ + + class RadioState extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get ACQUIRING() { + return RadioState._MAP.ACQUIRING; + } + /** + * @return {String} + */ + + + static get ACQUIRED() { + return RadioState._MAP.ACQUIRED; + } + /** + * @return {String} + */ + + + static get MULTICAST() { + return RadioState._MAP.MULTICAST; + } + /** + * @return {String} + */ + + + static get NOT_FOUND() { + return RadioState._MAP.NOT_FOUND; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return RadioState._valueForKey(key, RadioState._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return RadioState._keyForValue(value, RadioState._MAP); + } + + } + + RadioState._MAP = Object.freeze({ + 'ACQUIRING': 'ACQUIRING', + 'ACQUIRED': 'ACQUIRED', + 'MULTICAST': 'MULTICAST', + 'NOT_FOUND': 'NOT_FOUND' + }); + + /* eslint-disable camelcase */ + + class StationIDNumber extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} code - Binary Representation of ITU Country Code. USA Code is 001. + * @return {StationIDNumber} + */ + + + setCountryCode(code) { + this.setParameter(StationIDNumber.KEY_COUNTRY_CODE, code); + return this; + } + /** + * @return {Number} + */ + + + getCountryCode() { + return this.getParameter(StationIDNumber.KEY_COUNTRY_CODE); + } + /** + * @param {Number} id - Binary representation of unique facility ID assigned by the FCC; FCC controlled for U.S. + * territory + * @return {StationIDNumber} + */ + + + setFccFacilityId(id) { + this.setParameter(StationIDNumber.KEY_FCC_FACILITY_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getFccFacilityId() { + return this.getParameter(StationIDNumber.KEY_FCC_FACILITY_ID); + } + + } + + StationIDNumber.KEY_COUNTRY_CODE = 'countryCode'; + StationIDNumber.KEY_FCC_FACILITY_ID = 'fccFacilityId'; + + /* eslint-disable camelcase */ + + class SisData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} name - Identifies the 4-alpha-character station call sign plus an optional (-FM) extension + * @return {SisData} + */ + + + setStationShortName(name) { + this.setParameter(SisData.KEY_STATION_SHORT_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getStationShortName() { + return this.getParameter(SisData.KEY_STATION_SHORT_NAME); + } + /** + * @param {StationIDNumber} number - Used for network Application. Consists of Country Code and FCC Facility ID. + * @return {SisData} + */ + + + setStationIDNumber(number) { + this.validateType(StationIDNumber, number); + this.setParameter(SisData.KEY_STATION_IDNUMBER, number); + return this; + } + /** + * @return {StationIDNumber} + */ + + + getStationIDNumber() { + return this.getObject(StationIDNumber, SisData.KEY_STATION_IDNUMBER); + } + /** + * @param {String} name - Identifies the station call sign or other identifying information in the long format. + * @return {SisData} + */ + + + setStationLongName(name) { + this.setParameter(SisData.KEY_STATION_LONG_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getStationLongName() { + return this.getParameter(SisData.KEY_STATION_LONG_NAME); + } + /** + * @param {GPSData} location - Provides the 3-dimensional geographic station location. + * @return {SisData} + */ + + + setStationLocation(location) { + this.validateType(GPSData, location); + this.setParameter(SisData.KEY_STATION_LOCATION, location); + return this; + } + /** + * @return {GPSData} + */ + + + getStationLocation() { + return this.getObject(GPSData, SisData.KEY_STATION_LOCATION); + } + /** + * @param {String} message - May be used to convey textual information of general interest to the consumer such as + * weather forecasts or public service announcements. Includes a high priority delivery + * feature to convey emergencies that may be in the listening area. + * @return {SisData} + */ + + + setStationMessage(message) { + this.setParameter(SisData.KEY_STATION_MESSAGE, message); + return this; + } + /** + * @return {String} + */ + + + getStationMessage() { + return this.getParameter(SisData.KEY_STATION_MESSAGE); + } + + } + + SisData.KEY_STATION_SHORT_NAME = 'stationShortName'; + SisData.KEY_STATION_IDNUMBER = 'stationIDNumber'; + SisData.KEY_STATION_LONG_NAME = 'stationLongName'; + SisData.KEY_STATION_LOCATION = 'stationLocation'; + SisData.KEY_STATION_MESSAGE = 'stationMessage'; + + /* eslint-disable camelcase */ + + class RadioControlData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} integer - The integer part of the frequency ie for 101.7 this value should be 101 + * @return {RadioControlData} + */ + + + setFrequencyInteger(integer) { + this.setParameter(RadioControlData.KEY_FREQUENCY_INTEGER, integer); + return this; + } + /** + * @return {Number} + */ + + + getFrequencyInteger() { + return this.getParameter(RadioControlData.KEY_FREQUENCY_INTEGER); + } + /** + * @param {Number} fraction - The fractional part of the frequency for 101.7 is 7 + * @return {RadioControlData} + */ + + + setFrequencyFraction(fraction) { + this.setParameter(RadioControlData.KEY_FREQUENCY_FRACTION, fraction); + return this; + } + /** + * @return {Number} + */ + + + getFrequencyFraction() { + return this.getParameter(RadioControlData.KEY_FREQUENCY_FRACTION); + } + /** + * @param {RadioBand} band + * @return {RadioControlData} + */ + + + setBand(band) { + this.validateType(RadioBand, band); + this.setParameter(RadioControlData.KEY_BAND, band); + return this; + } + /** + * @return {RadioBand} + */ + + + getBand() { + return this.getObject(RadioBand, RadioControlData.KEY_BAND); + } + /** + * @param {RdsData} data + * @return {RadioControlData} + */ + + + setRdsData(data) { + this.validateType(RdsData, data); + this.setParameter(RadioControlData.KEY_RDS_DATA, data); + return this; + } + /** + * @return {RdsData} + */ + + + getRdsData() { + return this.getObject(RdsData, RadioControlData.KEY_RDS_DATA); + } + /** + * @param {Boolean} enable - True if the hd radio is on, false if the radio is off + * @return {RadioControlData} + */ + + + setHdRadioEnable(enable) { + this.setParameter(RadioControlData.KEY_HD_RADIO_ENABLE, enable); + return this; + } + /** + * @return {Boolean} + */ + + + getHdRadioEnable() { + return this.getParameter(RadioControlData.KEY_HD_RADIO_ENABLE); + } + /** + * @param {Number} ds - Number of HD sub-channels if available + * @return {RadioControlData} + */ + + + setAvailableHDs(ds) { + this.setParameter(RadioControlData.KEY_AVAILABLE_HDS, ds); + return this; + } + /** + * @return {Number} + */ + + + getAvailableHDs() { + return this.getParameter(RadioControlData.KEY_AVAILABLE_HDS); + } + /** + * @param {Number[]} channels - The list of available HD sub-channel indexes. Empty list means no Hd channel is + * available. Read-only. + * @return {RadioControlData} + */ + + + setAvailableHdChannels(channels) { + this.setParameter(RadioControlData.KEY_AVAILABLE_HD_CHANNELS, channels); + return this; + } + /** + * @return {Number[]} + */ + + + getAvailableHdChannels() { + return this.getParameter(RadioControlData.KEY_AVAILABLE_HD_CHANNELS); + } + /** + * @param {Number} channel - Current HD sub-channel if available + * @return {RadioControlData} + */ + + + setHdChannel(channel) { + this.setParameter(RadioControlData.KEY_HD_CHANNEL, channel); + return this; + } + /** + * @return {Number} + */ + + + getHdChannel() { + return this.getParameter(RadioControlData.KEY_HD_CHANNEL); + } + /** + * @param {Number} strength + * @return {RadioControlData} + */ + + + setSignalStrength(strength) { + this.setParameter(RadioControlData.KEY_SIGNAL_STRENGTH, strength); + return this; + } + /** + * @return {Number} + */ + + + getSignalStrength() { + return this.getParameter(RadioControlData.KEY_SIGNAL_STRENGTH); + } + /** + * @param {Number} threshold - If the signal strength falls below the set value for this parameter, the radio will + * tune to an alternative frequency + * @return {RadioControlData} + */ + + + setSignalChangeThreshold(threshold) { + this.setParameter(RadioControlData.KEY_SIGNAL_CHANGE_THRESHOLD, threshold); + return this; + } + /** + * @return {Number} + */ + + + getSignalChangeThreshold() { + return this.getParameter(RadioControlData.KEY_SIGNAL_CHANGE_THRESHOLD); + } + /** + * @param {Boolean} enable - True if the radio is on, false if the radio is off. If set to false, no other data will + * be included. + * @return {RadioControlData} + */ + + + setRadioEnable(enable) { + this.setParameter(RadioControlData.KEY_RADIO_ENABLE, enable); + return this; + } + /** + * @return {Boolean} + */ + + + getRadioEnable() { + return this.getParameter(RadioControlData.KEY_RADIO_ENABLE); + } + /** + * @param {RadioState} state + * @return {RadioControlData} + */ + + + setState(state) { + this.validateType(RadioState, state); + this.setParameter(RadioControlData.KEY_STATE, state); + return this; + } + /** + * @return {RadioState} + */ + + + getState() { + return this.getObject(RadioState, RadioControlData.KEY_STATE); + } + /** + * @param {SisData} data - Read-only Station Information Service (SIS) data provides basic information about the + * station such as call sign, as well as information not displayable to the consumer such as + * the station identification number + * @return {RadioControlData} + */ + + + setSisData(data) { + this.validateType(SisData, data); + this.setParameter(RadioControlData.KEY_SIS_DATA, data); + return this; + } + /** + * @return {SisData} + */ + + + getSisData() { + return this.getObject(SisData, RadioControlData.KEY_SIS_DATA); + } + + } + + RadioControlData.KEY_FREQUENCY_INTEGER = 'frequencyInteger'; + RadioControlData.KEY_FREQUENCY_FRACTION = 'frequencyFraction'; + RadioControlData.KEY_BAND = 'band'; + RadioControlData.KEY_RDS_DATA = 'rdsData'; + RadioControlData.KEY_HD_RADIO_ENABLE = 'hdRadioEnable'; + RadioControlData.KEY_AVAILABLE_HDS = 'availableHDs'; + RadioControlData.KEY_AVAILABLE_HD_CHANNELS = 'availableHdChannels'; + RadioControlData.KEY_HD_CHANNEL = 'hdChannel'; + RadioControlData.KEY_SIGNAL_STRENGTH = 'signalStrength'; + RadioControlData.KEY_SIGNAL_CHANGE_THRESHOLD = 'signalChangeThreshold'; + RadioControlData.KEY_RADIO_ENABLE = 'radioEnable'; + RadioControlData.KEY_STATE = 'state'; + RadioControlData.KEY_SIS_DATA = 'sisData'; + + /* eslint-disable camelcase */ + + class Temperature extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {TemperatureUnit} unit - Temperature Unit + * @return {Temperature} + */ + + + setUnit(unit) { + this.validateType(TemperatureUnit, unit); + this.setParameter(Temperature.KEY_UNIT, unit); + return this; + } + /** + * @return {TemperatureUnit} + */ + + + getUnit() { + return this.getObject(TemperatureUnit, Temperature.KEY_UNIT); + } + /** + * @param {Number} value - Temperature Value in TemperatureUnit specified unit. Range depends on OEM and is not + * checked by SDL. + * @return {Temperature} + */ + + + setValue(value) { + this.setParameter(Temperature.KEY_VALUE, value); + return this; + } + /** + * @return {Number} + */ + + + getValue() { + return this.getParameter(Temperature.KEY_VALUE); + } + + } + + Temperature.KEY_UNIT = 'unit'; + Temperature.KEY_VALUE = 'value'; + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} VentilationMode + * @property {Object} _MAP + */ + + class VentilationMode extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get UPPER() { + return VentilationMode._MAP.UPPER; + } + /** + * @return {String} + */ + + + static get LOWER() { + return VentilationMode._MAP.LOWER; + } + /** + * @return {String} + */ + + + static get BOTH() { + return VentilationMode._MAP.BOTH; + } + /** + * @return {String} + */ + + + static get NONE() { + return VentilationMode._MAP.NONE; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return VentilationMode._valueForKey(key, VentilationMode._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return VentilationMode._keyForValue(value, VentilationMode._MAP); + } + + } + + VentilationMode._MAP = Object.freeze({ + 'UPPER': 'UPPER', + 'LOWER': 'LOWER', + 'BOTH': 'BOTH', + 'NONE': 'NONE' + }); + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} DefrostZone + * @property {Object} _MAP + */ + + class DefrostZone extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get FRONT() { + return DefrostZone._MAP.FRONT; + } + /** + * @return {String} + */ + + + static get REAR() { + return DefrostZone._MAP.REAR; + } + /** + * @return {String} + */ + + + static get ALL() { + return DefrostZone._MAP.ALL; + } + /** + * @return {String} + */ + + + static get NONE() { + return DefrostZone._MAP.NONE; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return DefrostZone._valueForKey(key, DefrostZone._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return DefrostZone._keyForValue(value, DefrostZone._MAP); + } + + } + + DefrostZone._MAP = Object.freeze({ + 'FRONT': 'FRONT', + 'REAR': 'REAR', + 'ALL': 'ALL', + 'NONE': 'NONE' + }); + + /* eslint-disable camelcase */ + + class ClimateControlData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} speed + * @return {ClimateControlData} + */ + + + setFanSpeed(speed) { + this.setParameter(ClimateControlData.KEY_FAN_SPEED, speed); + return this; + } + /** + * @return {Number} + */ + + + getFanSpeed() { + return this.getParameter(ClimateControlData.KEY_FAN_SPEED); + } + /** + * @param {Temperature} temperature + * @return {ClimateControlData} + */ + + + setCurrentTemperature(temperature) { + this.validateType(Temperature, temperature); + this.setParameter(ClimateControlData.KEY_CURRENT_TEMPERATURE, temperature); + return this; + } + /** + * @return {Temperature} + */ + + + getCurrentTemperature() { + return this.getObject(Temperature, ClimateControlData.KEY_CURRENT_TEMPERATURE); + } + /** + * @param {Temperature} temperature + * @return {ClimateControlData} + */ + + + setDesiredTemperature(temperature) { + this.validateType(Temperature, temperature); + this.setParameter(ClimateControlData.KEY_DESIRED_TEMPERATURE, temperature); + return this; + } + /** + * @return {Temperature} + */ + + + getDesiredTemperature() { + return this.getObject(Temperature, ClimateControlData.KEY_DESIRED_TEMPERATURE); + } + /** + * @param {Boolean} enable + * @return {ClimateControlData} + */ + + + setAcEnable(enable) { + this.setParameter(ClimateControlData.KEY_AC_ENABLE, enable); + return this; + } + /** + * @return {Boolean} + */ + + + getAcEnable() { + return this.getParameter(ClimateControlData.KEY_AC_ENABLE); + } + /** + * @param {Boolean} enable + * @return {ClimateControlData} + */ + + + setCirculateAirEnable(enable) { + this.setParameter(ClimateControlData.KEY_CIRCULATE_AIR_ENABLE, enable); + return this; + } + /** + * @return {Boolean} + */ + + + getCirculateAirEnable() { + return this.getParameter(ClimateControlData.KEY_CIRCULATE_AIR_ENABLE); + } + /** + * @param {Boolean} enable + * @return {ClimateControlData} + */ + + + setAutoModeEnable(enable) { + this.setParameter(ClimateControlData.KEY_AUTO_MODE_ENABLE, enable); + return this; + } + /** + * @return {Boolean} + */ + + + getAutoModeEnable() { + return this.getParameter(ClimateControlData.KEY_AUTO_MODE_ENABLE); + } + /** + * @param {DefrostZone} zone + * @return {ClimateControlData} + */ + + + setDefrostZone(zone) { + this.validateType(DefrostZone, zone); + this.setParameter(ClimateControlData.KEY_DEFROST_ZONE, zone); + return this; + } + /** + * @return {DefrostZone} + */ + + + getDefrostZone() { + return this.getObject(DefrostZone, ClimateControlData.KEY_DEFROST_ZONE); + } + /** + * @param {Boolean} enable + * @return {ClimateControlData} + */ + + + setDualModeEnable(enable) { + this.setParameter(ClimateControlData.KEY_DUAL_MODE_ENABLE, enable); + return this; + } + /** + * @return {Boolean} + */ + + + getDualModeEnable() { + return this.getParameter(ClimateControlData.KEY_DUAL_MODE_ENABLE); + } + /** + * @param {Boolean} enable + * @return {ClimateControlData} + */ + + + setAcMaxEnable(enable) { + this.setParameter(ClimateControlData.KEY_AC_MAX_ENABLE, enable); + return this; + } + /** + * @return {Boolean} + */ + + + getAcMaxEnable() { + return this.getParameter(ClimateControlData.KEY_AC_MAX_ENABLE); + } + /** + * @param {VentilationMode} mode + * @return {ClimateControlData} + */ + + + setVentilationMode(mode) { + this.validateType(VentilationMode, mode); + this.setParameter(ClimateControlData.KEY_VENTILATION_MODE, mode); + return this; + } + /** + * @return {VentilationMode} + */ + + + getVentilationMode() { + return this.getObject(VentilationMode, ClimateControlData.KEY_VENTILATION_MODE); + } + /** + * @param {Boolean} enable - value false means disabled/turn off, value true means enabled/turn on. + * @return {ClimateControlData} + */ + + + setHeatedSteeringWheelEnable(enable) { + this.setParameter(ClimateControlData.KEY_HEATED_STEERING_WHEEL_ENABLE, enable); + return this; + } + /** + * @return {Boolean} + */ + + + getHeatedSteeringWheelEnable() { + return this.getParameter(ClimateControlData.KEY_HEATED_STEERING_WHEEL_ENABLE); + } + /** + * @param {Boolean} enable - value false means disabled, value true means enabled. + * @return {ClimateControlData} + */ + + + setHeatedWindshieldEnable(enable) { + this.setParameter(ClimateControlData.KEY_HEATED_WINDSHIELD_ENABLE, enable); + return this; + } + /** + * @return {Boolean} + */ + + + getHeatedWindshieldEnable() { + return this.getParameter(ClimateControlData.KEY_HEATED_WINDSHIELD_ENABLE); + } + /** + * @param {Boolean} enable - value false means disabled, value true means enabled. + * @return {ClimateControlData} + */ + + + setHeatedRearWindowEnable(enable) { + this.setParameter(ClimateControlData.KEY_HEATED_REAR_WINDOW_ENABLE, enable); + return this; + } + /** + * @return {Boolean} + */ + + + getHeatedRearWindowEnable() { + return this.getParameter(ClimateControlData.KEY_HEATED_REAR_WINDOW_ENABLE); + } + /** + * @param {Boolean} enable - value false means disabled, value true means enabled. + * @return {ClimateControlData} + */ + + + setHeatedMirrorsEnable(enable) { + this.setParameter(ClimateControlData.KEY_HEATED_MIRRORS_ENABLE, enable); + return this; + } + /** + * @return {Boolean} + */ + + + getHeatedMirrorsEnable() { + return this.getParameter(ClimateControlData.KEY_HEATED_MIRRORS_ENABLE); + } + /** + * @param {Boolean} enable - True if the climate module is on, false if the climate module is off + * @return {ClimateControlData} + */ + + + setClimateEnable(enable) { + this.setParameter(ClimateControlData.KEY_CLIMATE_ENABLE, enable); + return this; + } + /** + * @return {Boolean} + */ + + + getClimateEnable() { + return this.getParameter(ClimateControlData.KEY_CLIMATE_ENABLE); + } + + } + + ClimateControlData.KEY_FAN_SPEED = 'fanSpeed'; + ClimateControlData.KEY_CURRENT_TEMPERATURE = 'currentTemperature'; + ClimateControlData.KEY_DESIRED_TEMPERATURE = 'desiredTemperature'; + ClimateControlData.KEY_AC_ENABLE = 'acEnable'; + ClimateControlData.KEY_CIRCULATE_AIR_ENABLE = 'circulateAirEnable'; + ClimateControlData.KEY_AUTO_MODE_ENABLE = 'autoModeEnable'; + ClimateControlData.KEY_DEFROST_ZONE = 'defrostZone'; + ClimateControlData.KEY_DUAL_MODE_ENABLE = 'dualModeEnable'; + ClimateControlData.KEY_AC_MAX_ENABLE = 'acMaxEnable'; + ClimateControlData.KEY_VENTILATION_MODE = 'ventilationMode'; + ClimateControlData.KEY_HEATED_STEERING_WHEEL_ENABLE = 'heatedSteeringWheelEnable'; + ClimateControlData.KEY_HEATED_WINDSHIELD_ENABLE = 'heatedWindshieldEnable'; + ClimateControlData.KEY_HEATED_REAR_WINDOW_ENABLE = 'heatedRearWindowEnable'; + ClimateControlData.KEY_HEATED_MIRRORS_ENABLE = 'heatedMirrorsEnable'; + ClimateControlData.KEY_CLIMATE_ENABLE = 'climateEnable'; + + /* eslint-disable camelcase */ + /** + * Defines the each Equalizer channel settings. + */ + + class EqualizerSettings extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} id + * @return {EqualizerSettings} + */ + + + setChannelId(id) { + this.setParameter(EqualizerSettings.KEY_CHANNEL_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getChannelId() { + return this.getParameter(EqualizerSettings.KEY_CHANNEL_ID); + } + /** + * @param {String} name - read-only channel / frequency name (e.i. "Treble, Midrange, Bass" or "125 Hz") + * @return {EqualizerSettings} + */ + + + setChannelName(name) { + this.setParameter(EqualizerSettings.KEY_CHANNEL_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getChannelName() { + return this.getParameter(EqualizerSettings.KEY_CHANNEL_NAME); + } + /** + * @param {Number} setting - Reflects the setting, from 0%-100%. + * @return {EqualizerSettings} + */ + + + setChannelSetting(setting) { + this.setParameter(EqualizerSettings.KEY_CHANNEL_SETTING, setting); + return this; + } + /** + * @return {Number} + */ + + + getChannelSetting() { + return this.getParameter(EqualizerSettings.KEY_CHANNEL_SETTING); + } + + } + + EqualizerSettings.KEY_CHANNEL_ID = 'channelId'; + EqualizerSettings.KEY_CHANNEL_NAME = 'channelName'; + EqualizerSettings.KEY_CHANNEL_SETTING = 'channelSetting'; + + /* eslint-disable camelcase */ + + class AudioControlData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {PrimaryAudioSource} source - In a getter response or a notification, it is the current primary audio + * source of the system. In a setter request, it is the target audio source + * that the system shall switch to. If the value is MOBILE_APP, the system + * shall switch to the mobile media app that issues the setter RPC. + * @return {AudioControlData} + */ + + + setSource(source) { + this.validateType(PrimaryAudioSource, source); + this.setParameter(AudioControlData.KEY_SOURCE, source); + return this; + } + /** + * @return {PrimaryAudioSource} + */ + + + getSource() { + return this.getObject(PrimaryAudioSource, AudioControlData.KEY_SOURCE); + } + /** + * @param {Boolean} context - This parameter shall not be present in any getter responses or notifications. This + * parameter is optional in a setter request. The default value is false if it is not + * included. If it is false, the system not only changes the audio source but also brings + * the default application or system UI associated with the audio source to foreground. + * If it is true, the system only changes the audio source, but keeps the current + * application in foreground. + * @return {AudioControlData} + */ + + + setKeepContext(context) { + this.setParameter(AudioControlData.KEY_KEEP_CONTEXT, context); + return this; + } + /** + * @return {Boolean} + */ + + + getKeepContext() { + return this.getParameter(AudioControlData.KEY_KEEP_CONTEXT); + } + /** + * @param {Number} volume - Reflects the volume of audio, from 0%-100%. + * @return {AudioControlData} + */ + + + setVolume(volume) { + this.setParameter(AudioControlData.KEY_VOLUME, volume); + return this; + } + /** + * @return {Number} + */ + + + getVolume() { + return this.getParameter(AudioControlData.KEY_VOLUME); + } + /** + * @param {EqualizerSettings[]} settings - Defines the list of supported channels (band) and their current/desired + * settings on HMI + * @return {AudioControlData} + */ + + + setEqualizerSettings(settings) { + this.validateType(EqualizerSettings, settings, true); + this.setParameter(AudioControlData.KEY_EQUALIZER_SETTINGS, settings); + return this; + } + /** + * @return {EqualizerSettings[]} + */ + + + getEqualizerSettings() { + return this.getObject(EqualizerSettings, AudioControlData.KEY_EQUALIZER_SETTINGS); + } + + } + + AudioControlData.KEY_SOURCE = 'source'; + AudioControlData.KEY_KEEP_CONTEXT = 'keepContext'; + AudioControlData.KEY_VOLUME = 'volume'; + AudioControlData.KEY_EQUALIZER_SETTINGS = 'equalizerSettings'; + + /* eslint-disable camelcase */ + /** + * List possible cushions of a multi-contour massage seat. + * @typedef {Enum} MassageCushion + * @property {Object} _MAP + */ + + class MassageCushion extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get TOP_LUMBAR() { + return MassageCushion._MAP.TOP_LUMBAR; + } + /** + * @return {String} + */ + + + static get MIDDLE_LUMBAR() { + return MassageCushion._MAP.MIDDLE_LUMBAR; + } + /** + * @return {String} + */ + + + static get BOTTOM_LUMBAR() { + return MassageCushion._MAP.BOTTOM_LUMBAR; + } + /** + * @return {String} + */ + + + static get BACK_BOLSTERS() { + return MassageCushion._MAP.BACK_BOLSTERS; + } + /** + * @return {String} + */ + + + static get SEAT_BOLSTERS() { + return MassageCushion._MAP.SEAT_BOLSTERS; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return MassageCushion._valueForKey(key, MassageCushion._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return MassageCushion._keyForValue(value, MassageCushion._MAP); + } + + } + + MassageCushion._MAP = Object.freeze({ + 'TOP_LUMBAR': 'TOP_LUMBAR', + 'MIDDLE_LUMBAR': 'MIDDLE_LUMBAR', + 'BOTTOM_LUMBAR': 'BOTTOM_LUMBAR', + 'BACK_BOLSTERS': 'BACK_BOLSTERS', + 'SEAT_BOLSTERS': 'SEAT_BOLSTERS' + }); + + /* eslint-disable camelcase */ + /** + * The intensity or firmness of a cushion. + */ + + class MassageCushionFirmness extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {MassageCushion} cushion - List possible cushions of a multi-contour massage seat. + * @return {MassageCushionFirmness} + */ + + + setCushion(cushion) { + this.validateType(MassageCushion, cushion); + this.setParameter(MassageCushionFirmness.KEY_CUSHION, cushion); + return this; + } + /** + * @return {MassageCushion} + */ + + + getCushion() { + return this.getObject(MassageCushion, MassageCushionFirmness.KEY_CUSHION); + } + /** + * @param {Number} firmness + * @return {MassageCushionFirmness} + */ + + + setFirmness(firmness) { + this.setParameter(MassageCushionFirmness.KEY_FIRMNESS, firmness); + return this; + } + /** + * @return {Number} + */ + + + getFirmness() { + return this.getParameter(MassageCushionFirmness.KEY_FIRMNESS); + } + + } + + MassageCushionFirmness.KEY_CUSHION = 'cushion'; + MassageCushionFirmness.KEY_FIRMNESS = 'firmness'; + + /* eslint-disable camelcase */ + /** + * List possible seats that is a remote controllable seat. + * @deprecated + * @typedef {Enum} SupportedSeat + * @property {Object} _MAP + */ + + class SupportedSeat extends Enum { + /** + * @deprecated + * @constructor + */ + constructor() { + super(); + } + /** + * @deprecated + * @return {String} + */ + + + static get DRIVER() { + return SupportedSeat._MAP.DRIVER; + } + /** + * @deprecated + * @return {String} + */ + + + static get FRONT_PASSENGER() { + return SupportedSeat._MAP.FRONT_PASSENGER; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return SupportedSeat._valueForKey(key, SupportedSeat._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return SupportedSeat._keyForValue(value, SupportedSeat._MAP); + } + + } + + SupportedSeat._MAP = Object.freeze({ + 'DRIVER': 'DRIVER', + 'FRONT_PASSENGER': 'FRONT_PASSENGER' + }); + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} SeatMemoryActionType + * @property {Object} _MAP + */ + + class SeatMemoryActionType extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * Save current seat postions and settings to seat memory. + * @return {String} + */ + + + static get SAVE() { + return SeatMemoryActionType._MAP.SAVE; + } + /** + * Restore / apply the seat memory settings to the current seat. + * @return {String} + */ + + + static get RESTORE() { + return SeatMemoryActionType._MAP.RESTORE; + } + /** + * No action to be performed. + * @return {String} + */ + + + static get NONE() { + return SeatMemoryActionType._MAP.NONE; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return SeatMemoryActionType._valueForKey(key, SeatMemoryActionType._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return SeatMemoryActionType._keyForValue(value, SeatMemoryActionType._MAP); + } + + } + + SeatMemoryActionType._MAP = Object.freeze({ + 'SAVE': 'SAVE', + 'RESTORE': 'RESTORE', + 'NONE': 'NONE' + }); + + /* eslint-disable camelcase */ + + class SeatMemoryAction extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} id + * @return {SeatMemoryAction} + */ + + + setId(id) { + this.setParameter(SeatMemoryAction.KEY_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getId() { + return this.getParameter(SeatMemoryAction.KEY_ID); + } + /** + * @param {String} label + * @return {SeatMemoryAction} + */ + + + setLabel(label) { + this.setParameter(SeatMemoryAction.KEY_LABEL, label); + return this; + } + /** + * @return {String} + */ + + + getLabel() { + return this.getParameter(SeatMemoryAction.KEY_LABEL); + } + /** + * @param {SeatMemoryActionType} action + * @return {SeatMemoryAction} + */ + + + setAction(action) { + this.validateType(SeatMemoryActionType, action); + this.setParameter(SeatMemoryAction.KEY_ACTION, action); + return this; + } + /** + * @return {SeatMemoryActionType} + */ + + + getAction() { + return this.getObject(SeatMemoryActionType, SeatMemoryAction.KEY_ACTION); + } + + } + + SeatMemoryAction.KEY_ID = 'id'; + SeatMemoryAction.KEY_LABEL = 'label'; + SeatMemoryAction.KEY_ACTION = 'action'; + + /* eslint-disable camelcase */ + /** + * List possible zones of a multi-contour massage seat. + * @typedef {Enum} MassageZone + * @property {Object} _MAP + */ + + class MassageZone extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * The back of a multi-contour massage seat. or SEAT_BACK + * @return {String} + */ + + + static get LUMBAR() { + return MassageZone._MAP.LUMBAR; + } + /** + * The bottom a multi-contour massage seat. or SEAT_BOTTOM + * @return {String} + */ + + + static get SEAT_CUSHION() { + return MassageZone._MAP.SEAT_CUSHION; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return MassageZone._valueForKey(key, MassageZone._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return MassageZone._keyForValue(value, MassageZone._MAP); + } + + } + + MassageZone._MAP = Object.freeze({ + 'LUMBAR': 'LUMBAR', + 'SEAT_CUSHION': 'SEAT_CUSHION' + }); + + /* eslint-disable camelcase */ + /** + * List possible modes of a massage zone. + * @typedef {Enum} MassageMode + * @property {Object} _MAP + */ + + class MassageMode extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get OFF() { + return MassageMode._MAP.OFF; + } + /** + * @return {String} + */ + + + static get LOW() { + return MassageMode._MAP.LOW; + } + /** + * @return {String} + */ + + + static get HIGH() { + return MassageMode._MAP.HIGH; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return MassageMode._valueForKey(key, MassageMode._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return MassageMode._keyForValue(value, MassageMode._MAP); + } + + } + + MassageMode._MAP = Object.freeze({ + 'OFF': 'OFF', + 'LOW': 'LOW', + 'HIGH': 'HIGH' + }); + + /* eslint-disable camelcase */ + /** + * Specify the mode of a massage zone. + */ + + class MassageModeData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {MassageZone} zone - List possible zones of a multi-contour massage seat. + * @return {MassageModeData} + */ + + + setMassageZone(zone) { + this.validateType(MassageZone, zone); + this.setParameter(MassageModeData.KEY_MASSAGE_ZONE, zone); + return this; + } + /** + * @return {MassageZone} + */ + + + getMassageZone() { + return this.getObject(MassageZone, MassageModeData.KEY_MASSAGE_ZONE); + } + /** + * @param {MassageMode} mode - List possible modes of a massage zone. + * @return {MassageModeData} + */ + + + setMassageMode(mode) { + this.validateType(MassageMode, mode); + this.setParameter(MassageModeData.KEY_MASSAGE_MODE, mode); + return this; + } + /** + * @return {MassageMode} + */ + + + getMassageMode() { + return this.getObject(MassageMode, MassageModeData.KEY_MASSAGE_MODE); + } + + } + + MassageModeData.KEY_MASSAGE_ZONE = 'massageZone'; + MassageModeData.KEY_MASSAGE_MODE = 'massageMode'; + + /* eslint-disable camelcase */ + /** + * Seat control data corresponds to "SEAT" ModuleType. + */ + + class SeatControlData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {SupportedSeat} id - List possible seats that is a remote controllable seat. + * @return {SeatControlData} + */ + + + setId(id) { + this.validateType(SupportedSeat, id); + this.setParameter(SeatControlData.KEY_ID, id); + return this; + } + /** + * @return {SupportedSeat} + */ + + + getId() { + return this.getObject(SupportedSeat, SeatControlData.KEY_ID); + } + /** + * @param {Boolean} enabled + * @return {SeatControlData} + */ + + + setHeatingEnabled(enabled) { + this.setParameter(SeatControlData.KEY_HEATING_ENABLED, enabled); + return this; + } + /** + * @return {Boolean} + */ + + + getHeatingEnabled() { + return this.getParameter(SeatControlData.KEY_HEATING_ENABLED); + } + /** + * @param {Boolean} enabled + * @return {SeatControlData} + */ + + + setCoolingEnabled(enabled) { + this.setParameter(SeatControlData.KEY_COOLING_ENABLED, enabled); + return this; + } + /** + * @return {Boolean} + */ + + + getCoolingEnabled() { + return this.getParameter(SeatControlData.KEY_COOLING_ENABLED); + } + /** + * @param {Number} level + * @return {SeatControlData} + */ + + + setHeatingLevel(level) { + this.setParameter(SeatControlData.KEY_HEATING_LEVEL, level); + return this; + } + /** + * @return {Number} + */ + + + getHeatingLevel() { + return this.getParameter(SeatControlData.KEY_HEATING_LEVEL); + } + /** + * @param {Number} level + * @return {SeatControlData} + */ + + + setCoolingLevel(level) { + this.setParameter(SeatControlData.KEY_COOLING_LEVEL, level); + return this; + } + /** + * @return {Number} + */ + + + getCoolingLevel() { + return this.getParameter(SeatControlData.KEY_COOLING_LEVEL); + } + /** + * @param {Number} position + * @return {SeatControlData} + */ + + + setHorizontalPosition(position) { + this.setParameter(SeatControlData.KEY_HORIZONTAL_POSITION, position); + return this; + } + /** + * @return {Number} + */ + + + getHorizontalPosition() { + return this.getParameter(SeatControlData.KEY_HORIZONTAL_POSITION); + } + /** + * @param {Number} position + * @return {SeatControlData} + */ + + + setVerticalPosition(position) { + this.setParameter(SeatControlData.KEY_VERTICAL_POSITION, position); + return this; + } + /** + * @return {Number} + */ + + + getVerticalPosition() { + return this.getParameter(SeatControlData.KEY_VERTICAL_POSITION); + } + /** + * @param {Number} position + * @return {SeatControlData} + */ + + + setFrontVerticalPosition(position) { + this.setParameter(SeatControlData.KEY_FRONT_VERTICAL_POSITION, position); + return this; + } + /** + * @return {Number} + */ + + + getFrontVerticalPosition() { + return this.getParameter(SeatControlData.KEY_FRONT_VERTICAL_POSITION); + } + /** + * @param {Number} position + * @return {SeatControlData} + */ + + + setBackVerticalPosition(position) { + this.setParameter(SeatControlData.KEY_BACK_VERTICAL_POSITION, position); + return this; + } + /** + * @return {Number} + */ + + + getBackVerticalPosition() { + return this.getParameter(SeatControlData.KEY_BACK_VERTICAL_POSITION); + } + /** + * @param {Number} angle + * @return {SeatControlData} + */ + + + setBackTiltAngle(angle) { + this.setParameter(SeatControlData.KEY_BACK_TILT_ANGLE, angle); + return this; + } + /** + * @return {Number} + */ + + + getBackTiltAngle() { + return this.getParameter(SeatControlData.KEY_BACK_TILT_ANGLE); + } + /** + * @param {Number} position + * @return {SeatControlData} + */ + + + setHeadSupportHorizontalPosition(position) { + this.setParameter(SeatControlData.KEY_HEAD_SUPPORT_HORIZONTAL_POSITION, position); + return this; + } + /** + * @return {Number} + */ + + + getHeadSupportHorizontalPosition() { + return this.getParameter(SeatControlData.KEY_HEAD_SUPPORT_HORIZONTAL_POSITION); + } + /** + * @param {Number} position + * @return {SeatControlData} + */ + + + setHeadSupportVerticalPosition(position) { + this.setParameter(SeatControlData.KEY_HEAD_SUPPORT_VERTICAL_POSITION, position); + return this; + } + /** + * @return {Number} + */ + + + getHeadSupportVerticalPosition() { + return this.getParameter(SeatControlData.KEY_HEAD_SUPPORT_VERTICAL_POSITION); + } + /** + * @param {Boolean} enabled + * @return {SeatControlData} + */ + + + setMassageEnabled(enabled) { + this.setParameter(SeatControlData.KEY_MASSAGE_ENABLED, enabled); + return this; + } + /** + * @return {Boolean} + */ + + + getMassageEnabled() { + return this.getParameter(SeatControlData.KEY_MASSAGE_ENABLED); + } + /** + * @param {MassageModeData[]} mode - Specify the mode of a massage zone. + * @return {SeatControlData} + */ + + + setMassageMode(mode) { + this.validateType(MassageModeData, mode, true); + this.setParameter(SeatControlData.KEY_MASSAGE_MODE, mode); + return this; + } + /** + * @return {MassageModeData[]} + */ + + + getMassageMode() { + return this.getObject(MassageModeData, SeatControlData.KEY_MASSAGE_MODE); + } + /** + * @param {MassageCushionFirmness[]} firmness - The intensity or firmness of a cushion. + * @return {SeatControlData} + */ + + + setMassageCushionFirmness(firmness) { + this.validateType(MassageCushionFirmness, firmness, true); + this.setParameter(SeatControlData.KEY_MASSAGE_CUSHION_FIRMNESS, firmness); + return this; + } + /** + * @return {MassageCushionFirmness[]} + */ + + + getMassageCushionFirmness() { + return this.getObject(MassageCushionFirmness, SeatControlData.KEY_MASSAGE_CUSHION_FIRMNESS); + } + /** + * @param {SeatMemoryAction} memory + * @return {SeatControlData} + */ + + + setMemory(memory) { + this.validateType(SeatMemoryAction, memory); + this.setParameter(SeatControlData.KEY_MEMORY, memory); + return this; + } + /** + * @return {SeatMemoryAction} + */ + + + getMemory() { + return this.getObject(SeatMemoryAction, SeatControlData.KEY_MEMORY); + } + + } + + SeatControlData.KEY_ID = 'id'; + SeatControlData.KEY_HEATING_ENABLED = 'heatingEnabled'; + SeatControlData.KEY_COOLING_ENABLED = 'coolingEnabled'; + SeatControlData.KEY_HEATING_LEVEL = 'heatingLevel'; + SeatControlData.KEY_COOLING_LEVEL = 'coolingLevel'; + SeatControlData.KEY_HORIZONTAL_POSITION = 'horizontalPosition'; + SeatControlData.KEY_VERTICAL_POSITION = 'verticalPosition'; + SeatControlData.KEY_FRONT_VERTICAL_POSITION = 'frontVerticalPosition'; + SeatControlData.KEY_BACK_VERTICAL_POSITION = 'backVerticalPosition'; + SeatControlData.KEY_BACK_TILT_ANGLE = 'backTiltAngle'; + SeatControlData.KEY_HEAD_SUPPORT_HORIZONTAL_POSITION = 'headSupportHorizontalPosition'; + SeatControlData.KEY_HEAD_SUPPORT_VERTICAL_POSITION = 'headSupportVerticalPosition'; + SeatControlData.KEY_MASSAGE_ENABLED = 'massageEnabled'; + SeatControlData.KEY_MASSAGE_MODE = 'massageMode'; + SeatControlData.KEY_MASSAGE_CUSHION_FIRMNESS = 'massageCushionFirmness'; + SeatControlData.KEY_MEMORY = 'memory'; + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} LightStatus + * @property {Object} _MAP + */ + + class LightStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get ON() { + return LightStatus._MAP.ON; + } + /** + * @return {String} + */ + + + static get OFF() { + return LightStatus._MAP.OFF; + } + /** + * @return {String} + */ + + + static get RAMP_UP() { + return LightStatus._MAP.RAMP_UP; + } + /** + * @return {String} + */ + + + static get RAMP_DOWN() { + return LightStatus._MAP.RAMP_DOWN; + } + /** + * @return {String} + */ + + + static get UNKNOWN() { + return LightStatus._MAP.UNKNOWN; + } + /** + * @return {String} + */ + + + static get INVALID() { + return LightStatus._MAP.INVALID; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return LightStatus._valueForKey(key, LightStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return LightStatus._keyForValue(value, LightStatus._MAP); + } + + } + + LightStatus._MAP = Object.freeze({ + 'ON': 'ON', + 'OFF': 'OFF', + 'RAMP_UP': 'RAMP_UP', + 'RAMP_DOWN': 'RAMP_DOWN', + 'UNKNOWN': 'UNKNOWN', + 'INVALID': 'INVALID' + }); + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} LightName + * @property {Object} _MAP + */ + + class LightName extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {Number} + */ + + + static get FRONT_LEFT_HIGH_BEAM() { + return LightName._MAP.FRONT_LEFT_HIGH_BEAM; + } + /** + * @return {Number} + */ + + + static get FRONT_RIGHT_HIGH_BEAM() { + return LightName._MAP.FRONT_RIGHT_HIGH_BEAM; + } + /** + * @return {Number} + */ + + + static get FRONT_LEFT_LOW_BEAM() { + return LightName._MAP.FRONT_LEFT_LOW_BEAM; + } + /** + * @return {Number} + */ + + + static get FRONT_RIGHT_LOW_BEAM() { + return LightName._MAP.FRONT_RIGHT_LOW_BEAM; + } + /** + * @return {Number} + */ + + + static get FRONT_LEFT_PARKING_LIGHT() { + return LightName._MAP.FRONT_LEFT_PARKING_LIGHT; + } + /** + * @return {Number} + */ + + + static get FRONT_RIGHT_PARKING_LIGHT() { + return LightName._MAP.FRONT_RIGHT_PARKING_LIGHT; + } + /** + * @return {Number} + */ + + + static get FRONT_LEFT_FOG_LIGHT() { + return LightName._MAP.FRONT_LEFT_FOG_LIGHT; + } + /** + * @return {Number} + */ + + + static get FRONT_RIGHT_FOG_LIGHT() { + return LightName._MAP.FRONT_RIGHT_FOG_LIGHT; + } + /** + * @return {Number} + */ + + + static get FRONT_LEFT_DAYTIME_RUNNING_LIGHT() { + return LightName._MAP.FRONT_LEFT_DAYTIME_RUNNING_LIGHT; + } + /** + * @return {Number} + */ + + + static get FRONT_RIGHT_DAYTIME_RUNNING_LIGHT() { + return LightName._MAP.FRONT_RIGHT_DAYTIME_RUNNING_LIGHT; + } + /** + * @return {Number} + */ + + + static get FRONT_LEFT_TURN_LIGHT() { + return LightName._MAP.FRONT_LEFT_TURN_LIGHT; + } + /** + * @return {Number} + */ + + + static get FRONT_RIGHT_TURN_LIGHT() { + return LightName._MAP.FRONT_RIGHT_TURN_LIGHT; + } + /** + * @return {Number} + */ + + + static get REAR_LEFT_FOG_LIGHT() { + return LightName._MAP.REAR_LEFT_FOG_LIGHT; + } + /** + * @return {Number} + */ + + + static get REAR_RIGHT_FOG_LIGHT() { + return LightName._MAP.REAR_RIGHT_FOG_LIGHT; + } + /** + * @return {Number} + */ + + + static get REAR_LEFT_TAIL_LIGHT() { + return LightName._MAP.REAR_LEFT_TAIL_LIGHT; + } + /** + * @return {Number} + */ + + + static get REAR_RIGHT_TAIL_LIGHT() { + return LightName._MAP.REAR_RIGHT_TAIL_LIGHT; + } + /** + * @return {Number} + */ + + + static get REAR_LEFT_BRAKE_LIGHT() { + return LightName._MAP.REAR_LEFT_BRAKE_LIGHT; + } + /** + * @return {Number} + */ + + + static get REAR_RIGHT_BRAKE_LIGHT() { + return LightName._MAP.REAR_RIGHT_BRAKE_LIGHT; + } + /** + * @return {Number} + */ + + + static get REAR_LEFT_TURN_LIGHT() { + return LightName._MAP.REAR_LEFT_TURN_LIGHT; + } + /** + * @return {Number} + */ + + + static get REAR_RIGHT_TURN_LIGHT() { + return LightName._MAP.REAR_RIGHT_TURN_LIGHT; + } + /** + * @return {Number} + */ + + + static get REAR_REGISTRATION_PLATE_LIGHT() { + return LightName._MAP.REAR_REGISTRATION_PLATE_LIGHT; + } + /** + * Include all high beam lights: front_left and front_right. + * @return {Number} + */ + + + static get HIGH_BEAMS() { + return LightName._MAP.HIGH_BEAMS; + } + /** + * Include all low beam lights: front_left and front_right. + * @return {Number} + */ + + + static get LOW_BEAMS() { + return LightName._MAP.LOW_BEAMS; + } + /** + * Include all fog lights: front_left, front_right, rear_left and rear_right. + * @return {Number} + */ + + + static get FOG_LIGHTS() { + return LightName._MAP.FOG_LIGHTS; + } + /** + * Include all daytime running lights: front_left and front_right. + * @return {Number} + */ + + + static get RUNNING_LIGHTS() { + return LightName._MAP.RUNNING_LIGHTS; + } + /** + * Include all parking lights: front_left and front_right. + * @return {Number} + */ + + + static get PARKING_LIGHTS() { + return LightName._MAP.PARKING_LIGHTS; + } + /** + * Include all brake lights: rear_left and rear_right. + * @return {Number} + */ + + + static get BRAKE_LIGHTS() { + return LightName._MAP.BRAKE_LIGHTS; + } + /** + * @return {Number} + */ + + + static get REAR_REVERSING_LIGHTS() { + return LightName._MAP.REAR_REVERSING_LIGHTS; + } + /** + * @return {Number} + */ + + + static get SIDE_MARKER_LIGHTS() { + return LightName._MAP.SIDE_MARKER_LIGHTS; + } + /** + * Include all left turn signal lights: front_left, rear_left, left_side and mirror_mounted. + * @return {Number} + */ + + + static get LEFT_TURN_LIGHTS() { + return LightName._MAP.LEFT_TURN_LIGHTS; + } + /** + * Include all right turn signal lights: front_right, rear_right, right_side and mirror_mounted. + * @return {Number} + */ + + + static get RIGHT_TURN_LIGHTS() { + return LightName._MAP.RIGHT_TURN_LIGHTS; + } + /** + * Include all hazard lights: front_left, front_right, rear_left and rear_right. + * @return {Number} + */ + + + static get HAZARD_LIGHTS() { + return LightName._MAP.HAZARD_LIGHTS; + } + /** + * Cargo lamps illuminate the cargo area. + * @return {Number} + */ + + + static get REAR_CARGO_LIGHTS() { + return LightName._MAP.REAR_CARGO_LIGHTS; + } + /** + * Truck bed lamps light up the bed of the truck. + * @return {Number} + */ + + + static get REAR_TRUCK_BED_LIGHTS() { + return LightName._MAP.REAR_TRUCK_BED_LIGHTS; + } + /** + * Trailer lights are lamps mounted on a trailer hitch. + * @return {Number} + */ + + + static get REAR_TRAILER_LIGHTS() { + return LightName._MAP.REAR_TRAILER_LIGHTS; + } + /** + * It is the spotlights mounted on the left side of a vehicle. + * @return {Number} + */ + + + static get LEFT_SPOT_LIGHTS() { + return LightName._MAP.LEFT_SPOT_LIGHTS; + } + /** + * It is the spotlights mounted on the right side of a vehicle. + * @return {Number} + */ + + + static get RIGHT_SPOT_LIGHTS() { + return LightName._MAP.RIGHT_SPOT_LIGHTS; + } + /** + * Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door. + * @return {Number} + */ + + + static get LEFT_PUDDLE_LIGHTS() { + return LightName._MAP.LEFT_PUDDLE_LIGHTS; + } + /** + * Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door. + * @return {Number} + */ + + + static get RIGHT_PUDDLE_LIGHTS() { + return LightName._MAP.RIGHT_PUDDLE_LIGHTS; + } + /** + * @return {Number} + */ + + + static get AMBIENT_LIGHTS() { + return LightName._MAP.AMBIENT_LIGHTS; + } + /** + * @return {Number} + */ + + + static get OVERHEAD_LIGHTS() { + return LightName._MAP.OVERHEAD_LIGHTS; + } + /** + * @return {Number} + */ + + + static get READING_LIGHTS() { + return LightName._MAP.READING_LIGHTS; + } + /** + * @return {Number} + */ + + + static get TRUNK_LIGHTS() { + return LightName._MAP.TRUNK_LIGHTS; + } + /** + * Include exterior lights located in front of the vehicle. For example, fog lights and low beams. + * @return {Number} + */ + + + static get EXTERIOR_FRONT_LIGHTS() { + return LightName._MAP.EXTERIOR_FRONT_LIGHTS; + } + /** + * Include exterior lights located at the back of the vehicle. For example, license plate lights, reverse lights, + * cargo lights, bed lights and trailer assist lights. + * @return {Number} + */ + + + static get EXTERIOR_REAR_LIGHTS() { + return LightName._MAP.EXTERIOR_REAR_LIGHTS; + } + /** + * Include exterior lights located at the left side of the vehicle. For example, left puddle lights and spot + * lights. + * @return {Number} + */ + + + static get EXTERIOR_LEFT_LIGHTS() { + return LightName._MAP.EXTERIOR_LEFT_LIGHTS; + } + /** + * Include exterior lights located at the right side of the vehicle. For example, right puddle lights and spot + * lights. + * @return {Number} + */ + + + static get EXTERIOR_RIGHT_LIGHTS() { + return LightName._MAP.EXTERIOR_RIGHT_LIGHTS; + } + /** + * Include all exterior lights around the vehicle. + * @return {Number} + */ + + + static get EXTERIOR_ALL_LIGHTS() { + return LightName._MAP.EXTERIOR_ALL_LIGHTS; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return LightName._valueForKey(key, LightName._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return LightName._keyForValue(value, LightName._MAP); + } + + } + + LightName._MAP = Object.freeze({ + 'FRONT_LEFT_HIGH_BEAM': 0, + 'FRONT_RIGHT_HIGH_BEAM': 1, + 'FRONT_LEFT_LOW_BEAM': 2, + 'FRONT_RIGHT_LOW_BEAM': 3, + 'FRONT_LEFT_PARKING_LIGHT': 4, + 'FRONT_RIGHT_PARKING_LIGHT': 5, + 'FRONT_LEFT_FOG_LIGHT': 6, + 'FRONT_RIGHT_FOG_LIGHT': 7, + 'FRONT_LEFT_DAYTIME_RUNNING_LIGHT': 8, + 'FRONT_RIGHT_DAYTIME_RUNNING_LIGHT': 9, + 'FRONT_LEFT_TURN_LIGHT': 10, + 'FRONT_RIGHT_TURN_LIGHT': 11, + 'REAR_LEFT_FOG_LIGHT': 12, + 'REAR_RIGHT_FOG_LIGHT': 13, + 'REAR_LEFT_TAIL_LIGHT': 14, + 'REAR_RIGHT_TAIL_LIGHT': 15, + 'REAR_LEFT_BRAKE_LIGHT': 16, + 'REAR_RIGHT_BRAKE_LIGHT': 17, + 'REAR_LEFT_TURN_LIGHT': 18, + 'REAR_RIGHT_TURN_LIGHT': 19, + 'REAR_REGISTRATION_PLATE_LIGHT': 20, + 'HIGH_BEAMS': 501, + 'LOW_BEAMS': 502, + 'FOG_LIGHTS': 503, + 'RUNNING_LIGHTS': 504, + 'PARKING_LIGHTS': 505, + 'BRAKE_LIGHTS': 506, + 'REAR_REVERSING_LIGHTS': 507, + 'SIDE_MARKER_LIGHTS': 508, + 'LEFT_TURN_LIGHTS': 509, + 'RIGHT_TURN_LIGHTS': 510, + 'HAZARD_LIGHTS': 511, + 'REAR_CARGO_LIGHTS': 512, + 'REAR_TRUCK_BED_LIGHTS': 513, + 'REAR_TRAILER_LIGHTS': 514, + 'LEFT_SPOT_LIGHTS': 515, + 'RIGHT_SPOT_LIGHTS': 516, + 'LEFT_PUDDLE_LIGHTS': 517, + 'RIGHT_PUDDLE_LIGHTS': 518, + 'AMBIENT_LIGHTS': 801, + 'OVERHEAD_LIGHTS': 802, + 'READING_LIGHTS': 803, + 'TRUNK_LIGHTS': 804, + 'EXTERIOR_FRONT_LIGHTS': 901, + 'EXTERIOR_REAR_LIGHTS': 902, + 'EXTERIOR_LEFT_LIGHTS': 903, + 'EXTERIOR_RIGHT_LIGHTS': 904, + 'EXTERIOR_ALL_LIGHTS': 905 + }); + + /* eslint-disable camelcase */ + + class LightState extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {LightName} id - The name of a light or a group of lights. + * @return {LightState} + */ + + + setId(id) { + this.validateType(LightName, id); + this.setParameter(LightState.KEY_ID, id); + return this; + } + /** + * @return {LightName} + */ + + + getId() { + return this.getObject(LightName, LightState.KEY_ID); + } + /** + * @param {LightStatus} status + * @return {LightState} + */ + + + setStatus(status) { + this.validateType(LightStatus, status); + this.setParameter(LightState.KEY_STATUS, status); + return this; + } + /** + * @return {LightStatus} + */ + + + getStatus() { + return this.getObject(LightStatus, LightState.KEY_STATUS); + } + /** + * @param {Number} density + * @return {LightState} + */ + + + setDensity(density) { + this.setParameter(LightState.KEY_DENSITY, density); + return this; + } + /** + * @return {Number} + */ + + + getDensity() { + return this.getParameter(LightState.KEY_DENSITY); + } + /** + * @param {RGBColor} color + * @return {LightState} + */ + + + setColor(color) { + this.validateType(RGBColor, color); + this.setParameter(LightState.KEY_COLOR, color); + return this; + } + /** + * @return {RGBColor} + */ + + + getColor() { + return this.getObject(RGBColor, LightState.KEY_COLOR); + } + + } + + LightState.KEY_ID = 'id'; + LightState.KEY_STATUS = 'status'; + LightState.KEY_DENSITY = 'density'; + LightState.KEY_COLOR = 'color'; + + /* eslint-disable camelcase */ + + class LightControlData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {LightState[]} state - An array of LightNames and their current or desired status. No change to the status + * of the LightNames that are not listed in the array. + * @return {LightControlData} + */ + + + setLightState(state) { + this.validateType(LightState, state, true); + this.setParameter(LightControlData.KEY_LIGHT_STATE, state); + return this; + } + /** + * @return {LightState[]} + */ + + + getLightState() { + return this.getObject(LightState, LightControlData.KEY_LIGHT_STATE); + } + + } + + LightControlData.KEY_LIGHT_STATE = 'lightState'; + + /* eslint-disable camelcase */ + /** + * The moduleType indicates which type of data should be changed and identifies which data object exists in this + * struct. For example, if the moduleType is CLIMATE then a "climateControlData" should exist + */ + + class ModuleData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {ModuleType} type + * @return {ModuleData} + */ + + + setModuleType(type) { + this.validateType(ModuleType, type); + this.setParameter(ModuleData.KEY_MODULE_TYPE, type); + return this; + } + /** + * @return {ModuleType} + */ + + + getModuleType() { + return this.getObject(ModuleType, ModuleData.KEY_MODULE_TYPE); + } + /** + * @param {String} id - Id of a module, published by System Capability. + * @return {ModuleData} + */ + + + setModuleId(id) { + this.setParameter(ModuleData.KEY_MODULE_ID, id); + return this; + } + /** + * @return {String} + */ + + + getModuleId() { + return this.getParameter(ModuleData.KEY_MODULE_ID); + } + /** + * @param {RadioControlData} data + * @return {ModuleData} + */ + + + setRadioControlData(data) { + this.validateType(RadioControlData, data); + this.setParameter(ModuleData.KEY_RADIO_CONTROL_DATA, data); + return this; + } + /** + * @return {RadioControlData} + */ + + + getRadioControlData() { + return this.getObject(RadioControlData, ModuleData.KEY_RADIO_CONTROL_DATA); + } + /** + * @param {ClimateControlData} data + * @return {ModuleData} + */ + + + setClimateControlData(data) { + this.validateType(ClimateControlData, data); + this.setParameter(ModuleData.KEY_CLIMATE_CONTROL_DATA, data); + return this; + } + /** + * @return {ClimateControlData} + */ + + + getClimateControlData() { + return this.getObject(ClimateControlData, ModuleData.KEY_CLIMATE_CONTROL_DATA); + } + /** + * @param {SeatControlData} data - Seat control data corresponds to "SEAT" ModuleType. + * @return {ModuleData} + */ + + + setSeatControlData(data) { + this.validateType(SeatControlData, data); + this.setParameter(ModuleData.KEY_SEAT_CONTROL_DATA, data); + return this; + } + /** + * @return {SeatControlData} + */ + + + getSeatControlData() { + return this.getObject(SeatControlData, ModuleData.KEY_SEAT_CONTROL_DATA); + } + /** + * @param {AudioControlData} data + * @return {ModuleData} + */ + + + setAudioControlData(data) { + this.validateType(AudioControlData, data); + this.setParameter(ModuleData.KEY_AUDIO_CONTROL_DATA, data); + return this; + } + /** + * @return {AudioControlData} + */ + + + getAudioControlData() { + return this.getObject(AudioControlData, ModuleData.KEY_AUDIO_CONTROL_DATA); + } + /** + * @param {LightControlData} data + * @return {ModuleData} + */ + + + setLightControlData(data) { + this.validateType(LightControlData, data); + this.setParameter(ModuleData.KEY_LIGHT_CONTROL_DATA, data); + return this; + } + /** + * @return {LightControlData} + */ + + + getLightControlData() { + return this.getObject(LightControlData, ModuleData.KEY_LIGHT_CONTROL_DATA); + } + /** + * @param {HMISettingsControlData} data - Corresponds to "HMI_SETTINGS" ModuleType + * @return {ModuleData} + */ + + + setHmiSettingsControlData(data) { + this.validateType(HMISettingsControlData, data); + this.setParameter(ModuleData.KEY_HMI_SETTINGS_CONTROL_DATA, data); + return this; + } + /** + * @return {HMISettingsControlData} + */ + + + getHmiSettingsControlData() { + return this.getObject(HMISettingsControlData, ModuleData.KEY_HMI_SETTINGS_CONTROL_DATA); + } + + } + + ModuleData.KEY_MODULE_TYPE = 'moduleType'; + ModuleData.KEY_MODULE_ID = 'moduleId'; + ModuleData.KEY_RADIO_CONTROL_DATA = 'radioControlData'; + ModuleData.KEY_CLIMATE_CONTROL_DATA = 'climateControlData'; + ModuleData.KEY_SEAT_CONTROL_DATA = 'seatControlData'; + ModuleData.KEY_AUDIO_CONTROL_DATA = 'audioControlData'; + ModuleData.KEY_LIGHT_CONTROL_DATA = 'lightControlData'; + ModuleData.KEY_HMI_SETTINGS_CONTROL_DATA = 'hmiSettingsControlData'; + + /* eslint-disable camelcase */ + + class GetInteriorVehicleDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetInteriorVehicleData); + } + /** + * @param {ModuleData} data - The moduleType indicates which type of data should be changed and identifies which + * data object exists in this struct. For example, if the moduleType is CLIMATE then a + * "climateControlData" should exist + * @return {GetInteriorVehicleDataResponse} + */ + + + setModuleData(data) { + this.validateType(ModuleData, data); + this.setParameter(GetInteriorVehicleDataResponse.KEY_MODULE_DATA, data); + return this; + } + /** + * @return {ModuleData} + */ + + + getModuleData() { + return this.getObject(ModuleData, GetInteriorVehicleDataResponse.KEY_MODULE_DATA); + } + /** + * @param {Boolean} subscribed - It is a conditional-mandatory parameter: must be returned in case "subscribe" + * parameter was present in the related request. if "true" - the "moduleType" from + * request is successfully subscribed and the head unit will send + * onInteriorVehicleData notifications for the moduleType. if "false" - the + * "moduleType" from request is either unsubscribed or failed to subscribe. + * @return {GetInteriorVehicleDataResponse} + */ + + + setIsSubscribed(subscribed) { + this.setParameter(GetInteriorVehicleDataResponse.KEY_IS_SUBSCRIBED, subscribed); + return this; + } + /** + * @return {Boolean} + */ + + + getIsSubscribed() { + return this.getParameter(GetInteriorVehicleDataResponse.KEY_IS_SUBSCRIBED); + } + + } + + GetInteriorVehicleDataResponse.KEY_MODULE_DATA = 'moduleData'; + GetInteriorVehicleDataResponse.KEY_IS_SUBSCRIBED = 'isSubscribed'; + + /* eslint-disable camelcase */ + + class GetInteriorVehicleDataConsent extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetInteriorVehicleDataConsent); + } + /** + * @param {ModuleType} type - The module type that the app requests to control. + * @return {GetInteriorVehicleDataConsent} + */ + + + setModuleType(type) { + this.validateType(ModuleType, type); + this.setParameter(GetInteriorVehicleDataConsent.KEY_MODULE_TYPE, type); + return this; + } + /** + * @return {ModuleType} + */ + + + getModuleType() { + return this.getObject(ModuleType, GetInteriorVehicleDataConsent.KEY_MODULE_TYPE); + } + /** + * @param {String[]} ids - Ids of a module of same type, published by System Capability. + * @return {GetInteriorVehicleDataConsent} + */ + + + setModuleIds(ids) { + this.setParameter(GetInteriorVehicleDataConsent.KEY_MODULE_IDS, ids); + return this; + } + /** + * @return {String[]} + */ + + + getModuleIds() { + return this.getParameter(GetInteriorVehicleDataConsent.KEY_MODULE_IDS); + } + + } + + GetInteriorVehicleDataConsent.KEY_MODULE_TYPE = 'moduleType'; + GetInteriorVehicleDataConsent.KEY_MODULE_IDS = 'moduleIds'; + + /* eslint-disable camelcase */ + + class GetInteriorVehicleDataConsentResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetInteriorVehicleDataConsent); + } + /** + * @param {Boolean[]} allowed - This array has the same size as "moduleIds" in the request and each element + * corresponds to one moduleId If true, SDL grants the permission for the requested + * module If false, SDL denies the permission for the requested module. + * @return {GetInteriorVehicleDataConsentResponse} + */ + + + setAllowed(allowed) { + this.setParameter(GetInteriorVehicleDataConsentResponse.KEY_ALLOWED, allowed); + return this; + } + /** + * @return {Boolean[]} + */ + + + getAllowed() { + return this.getParameter(GetInteriorVehicleDataConsentResponse.KEY_ALLOWED); + } + + } + + GetInteriorVehicleDataConsentResponse.KEY_ALLOWED = 'allowed'; + + /* eslint-disable camelcase */ + + class ReleaseInteriorVehicleDataModule extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ReleaseInteriorVehicleDataModule); + } + /** + * @param {ModuleType} type + * @return {ReleaseInteriorVehicleDataModule} + */ + + + setModuleType(type) { + this.validateType(ModuleType, type); + this.setParameter(ReleaseInteriorVehicleDataModule.KEY_MODULE_TYPE, type); + return this; + } + /** + * @return {ModuleType} + */ + + + getModuleType() { + return this.getObject(ModuleType, ReleaseInteriorVehicleDataModule.KEY_MODULE_TYPE); + } + /** + * @param {String} id - Id of a module, published by System Capability. + * @return {ReleaseInteriorVehicleDataModule} + */ + + + setModuleId(id) { + this.setParameter(ReleaseInteriorVehicleDataModule.KEY_MODULE_ID, id); + return this; + } + /** + * @return {String} + */ + + + getModuleId() { + return this.getParameter(ReleaseInteriorVehicleDataModule.KEY_MODULE_ID); + } + + } + + ReleaseInteriorVehicleDataModule.KEY_MODULE_TYPE = 'moduleType'; + ReleaseInteriorVehicleDataModule.KEY_MODULE_ID = 'moduleId'; + + /* eslint-disable camelcase */ + + class ReleaseInteriorVehicleDataModuleResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.ReleaseInteriorVehicleDataModule); + } + + } + + /* eslint-disable camelcase */ + + class SetInteriorVehicleData extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SetInteriorVehicleData); + } + /** + * @param {ModuleData} data - The module data to set for the requested RC module. + * @return {SetInteriorVehicleData} + */ + + + setModuleData(data) { + this.validateType(ModuleData, data); + this.setParameter(SetInteriorVehicleData.KEY_MODULE_DATA, data); + return this; + } + /** + * @return {ModuleData} + */ + + + getModuleData() { + return this.getObject(ModuleData, SetInteriorVehicleData.KEY_MODULE_DATA); + } + + } + + SetInteriorVehicleData.KEY_MODULE_DATA = 'moduleData'; + + /* eslint-disable camelcase */ + /** + * Used to set the values of one remote control module + */ + + class SetInteriorVehicleDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SetInteriorVehicleData); + } + /** + * @param {ModuleData} data - The moduleType indicates which type of data should be changed and identifies which + * data object exists in this struct. For example, if the moduleType is CLIMATE then a + * "climateControlData" should exist + * @return {SetInteriorVehicleDataResponse} + */ + + + setModuleData(data) { + this.validateType(ModuleData, data); + this.setParameter(SetInteriorVehicleDataResponse.KEY_MODULE_DATA, data); + return this; + } + /** + * @return {ModuleData} + */ + + + getModuleData() { + return this.getObject(ModuleData, SetInteriorVehicleDataResponse.KEY_MODULE_DATA); + } + + } + + SetInteriorVehicleDataResponse.KEY_MODULE_DATA = 'moduleData'; + + /* eslint-disable camelcase */ + /** + * To subscribe in getting changes for Waypoints/destinations + */ + + class SubscribeWayPoints extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SubscribeWayPoints); + } + + } + + /* eslint-disable camelcase */ + + class SubscribeWayPointsResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SubscribeWayPoints); + } + + } + + /* eslint-disable camelcase */ + /** + * Describes what kind of waypoint is requested/provided. + * @typedef {Enum} WayPointType + * @property {Object} _MAP + */ + + class WayPointType extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get ALL() { + return WayPointType._MAP.ALL; + } + /** + * @return {String} + */ + + + static get DESTINATION() { + return WayPointType._MAP.DESTINATION; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return WayPointType._valueForKey(key, WayPointType._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return WayPointType._keyForValue(value, WayPointType._MAP); + } + + } + + WayPointType._MAP = Object.freeze({ + 'ALL': 'ALL', + 'DESTINATION': 'DESTINATION' + }); + + /* eslint-disable camelcase */ + /** + * Request for getting waypoint/destination data. + */ + + class GetWayPoints extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetWayPoints); + } + /** + * @param {WayPointType} type - To request for either the destination only or for all waypoints including + * destination + * @return {GetWayPoints} + */ + + + setWayPointType(type) { + this.validateType(WayPointType, type); + this.setParameter(GetWayPoints.KEY_WAY_POINT_TYPE, type); + return this; + } + /** + * @return {WayPointType} + */ + + + getWayPointType() { + return this.getObject(WayPointType, GetWayPoints.KEY_WAY_POINT_TYPE); + } + + } + + GetWayPoints.KEY_WAY_POINT_TYPE = 'wayPointType'; + + /* eslint-disable camelcase */ + + class Coordinate extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} degrees - Latitude of the location. + * @return {Coordinate} + */ + + + setLatitudeDegrees(degrees) { + this.setParameter(Coordinate.KEY_LATITUDE_DEGREES, degrees); + return this; + } + /** + * @return {Number} + */ + + + getLatitudeDegrees() { + return this.getParameter(Coordinate.KEY_LATITUDE_DEGREES); + } + /** + * @param {Number} degrees - Longitude of the location. + * @return {Coordinate} + */ + + + setLongitudeDegrees(degrees) { + this.setParameter(Coordinate.KEY_LONGITUDE_DEGREES, degrees); + return this; + } + /** + * @return {Number} + */ + + + getLongitudeDegrees() { + return this.getParameter(Coordinate.KEY_LONGITUDE_DEGREES); + } + + } + + Coordinate.KEY_LATITUDE_DEGREES = 'latitudeDegrees'; + Coordinate.KEY_LONGITUDE_DEGREES = 'longitudeDegrees'; + + /* eslint-disable camelcase */ + + class LocationDetails extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Coordinate} coordinate - Latitude/Longitude of the location. + * @return {LocationDetails} + */ + + + setCoordinate(coordinate) { + this.validateType(Coordinate, coordinate); + this.setParameter(LocationDetails.KEY_COORDINATE, coordinate); + return this; + } + /** + * @return {Coordinate} + */ + + + getCoordinate() { + return this.getObject(Coordinate, LocationDetails.KEY_COORDINATE); + } + /** + * @param {String} name - Name of location. + * @return {LocationDetails} + */ + + + setLocationName(name) { + this.setParameter(LocationDetails.KEY_LOCATION_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getLocationName() { + return this.getParameter(LocationDetails.KEY_LOCATION_NAME); + } + /** + * @param {String[]} lines - Location address for display purposes only + * @return {LocationDetails} + */ + + + setAddressLines(lines) { + this.setParameter(LocationDetails.KEY_ADDRESS_LINES, lines); + return this; + } + /** + * @return {String[]} + */ + + + getAddressLines() { + return this.getParameter(LocationDetails.KEY_ADDRESS_LINES); + } + /** + * @param {String} description - Description intended location / establishment (if applicable) + * @return {LocationDetails} + */ + + + setLocationDescription(description) { + this.setParameter(LocationDetails.KEY_LOCATION_DESCRIPTION, description); + return this; + } + /** + * @return {String} + */ + + + getLocationDescription() { + return this.getParameter(LocationDetails.KEY_LOCATION_DESCRIPTION); + } + /** + * @param {String} number - Phone number of location / establishment. + * @return {LocationDetails} + */ + + + setPhoneNumber(number) { + this.setParameter(LocationDetails.KEY_PHONE_NUMBER, number); + return this; + } + /** + * @return {String} + */ + + + getPhoneNumber() { + return this.getParameter(LocationDetails.KEY_PHONE_NUMBER); + } + /** + * @param {Image} image - Image / icon of intended location. + * @return {LocationDetails} + */ + + + setLocationImage(image) { + this.validateType(Image, image); + this.setParameter(LocationDetails.KEY_LOCATION_IMAGE, image); + return this; + } + /** + * @return {Image} + */ + + + getLocationImage() { + return this.getObject(Image, LocationDetails.KEY_LOCATION_IMAGE); + } + /** + * @param {OASISAddress} address - Address to be used by navigation engines for search + * @return {LocationDetails} + */ + + + setSearchAddress(address) { + this.validateType(OASISAddress, address); + this.setParameter(LocationDetails.KEY_SEARCH_ADDRESS, address); + return this; + } + /** + * @return {OASISAddress} + */ + + + getSearchAddress() { + return this.getObject(OASISAddress, LocationDetails.KEY_SEARCH_ADDRESS); + } + + } + + LocationDetails.KEY_COORDINATE = 'coordinate'; + LocationDetails.KEY_LOCATION_NAME = 'locationName'; + LocationDetails.KEY_ADDRESS_LINES = 'addressLines'; + LocationDetails.KEY_LOCATION_DESCRIPTION = 'locationDescription'; + LocationDetails.KEY_PHONE_NUMBER = 'phoneNumber'; + LocationDetails.KEY_LOCATION_IMAGE = 'locationImage'; + LocationDetails.KEY_SEARCH_ADDRESS = 'searchAddress'; + + /* eslint-disable camelcase */ + + class GetWayPointsResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetWayPoints); + } + /** + * @param {LocationDetails[]} points - See LocationDetails + * @return {GetWayPointsResponse} + */ + + + setWayPoints(points) { + this.validateType(LocationDetails, points, true); + this.setParameter(GetWayPointsResponse.KEY_WAY_POINTS, points); + return this; + } + /** + * @return {LocationDetails[]} + */ + + + getWayPoints() { + return this.getObject(LocationDetails, GetWayPointsResponse.KEY_WAY_POINTS); + } + + } + + GetWayPointsResponse.KEY_WAY_POINTS = 'wayPoints'; + + /* eslint-disable camelcase */ + /** + * Request to unsubscribe from WayPoints and Destination + */ + + class UnsubscribeWayPoints extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.UnsubscribeWayPoints); + } + + } + + /* eslint-disable camelcase */ + + class UnsubscribeWayPointsResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.UnsubscribeWayPoints); + } + /** + * @param {LocationDetails[]} points - See LocationDetails + * @return {UnsubscribeWayPointsResponse} + */ + + + setWayPoints(points) { + this.validateType(LocationDetails, points, true); + this.setParameter(UnsubscribeWayPointsResponse.KEY_WAY_POINTS, points); + return this; + } + /** + * @return {LocationDetails[]} + */ + + + getWayPoints() { + return this.getObject(LocationDetails, UnsubscribeWayPointsResponse.KEY_WAY_POINTS); + } + + } + + UnsubscribeWayPointsResponse.KEY_WAY_POINTS = 'wayPoints'; + + /* eslint-disable camelcase */ + /** + * Enumerations of all available system capability types + * @typedef {Enum} SystemCapabilityType + * @property {Object} _MAP + */ + + class SystemCapabilityType extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get NAVIGATION() { + return SystemCapabilityType._MAP.NAVIGATION; + } + /** + * @return {String} + */ + + + static get PHONE_CALL() { + return SystemCapabilityType._MAP.PHONE_CALL; + } + /** + * @return {String} + */ + + + static get VIDEO_STREAMING() { + return SystemCapabilityType._MAP.VIDEO_STREAMING; + } + /** + * @return {String} + */ + + + static get REMOTE_CONTROL() { + return SystemCapabilityType._MAP.REMOTE_CONTROL; + } + /** + * @return {String} + */ + + + static get APP_SERVICES() { + return SystemCapabilityType._MAP.APP_SERVICES; + } + /** + * @return {String} + */ + + + static get SEAT_LOCATION() { + return SystemCapabilityType._MAP.SEAT_LOCATION; + } + /** + * @return {String} + */ + + + static get DISPLAYS() { + return SystemCapabilityType._MAP.DISPLAYS; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return SystemCapabilityType._valueForKey(key, SystemCapabilityType._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return SystemCapabilityType._keyForValue(value, SystemCapabilityType._MAP); + } + + } + + SystemCapabilityType._MAP = Object.freeze({ + 'NAVIGATION': 'NAVIGATION', + 'PHONE_CALL': 'PHONE_CALL', + 'VIDEO_STREAMING': 'VIDEO_STREAMING', + 'REMOTE_CONTROL': 'REMOTE_CONTROL', + 'APP_SERVICES': 'APP_SERVICES', + 'SEAT_LOCATION': 'SEAT_LOCATION', + 'DISPLAYS': 'DISPLAYS' + }); + + /* eslint-disable camelcase */ + /** + * Request for expanded information about a supported system/HMI capability + */ + + class GetSystemCapability extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetSystemCapability); + } + /** + * @param {SystemCapabilityType} type - The type of system capability to get more information on + * @return {GetSystemCapability} + */ + + + setSystemCapabilityType(type) { + this.validateType(SystemCapabilityType, type); + this.setParameter(GetSystemCapability.KEY_SYSTEM_CAPABILITY_TYPE, type); + return this; + } + /** + * @return {SystemCapabilityType} + */ + + + getSystemCapabilityType() { + return this.getObject(SystemCapabilityType, GetSystemCapability.KEY_SYSTEM_CAPABILITY_TYPE); + } + /** + * @param {Boolean} subscribe - Flag to subscribe to updates of the supplied service capability type. If true, the + * requester will be subscribed. If false, the requester will not be subscribed and be + * removed as a subscriber if it was previously subscribed. + * @return {GetSystemCapability} + */ + + + setSubscribe(subscribe) { + this.setParameter(GetSystemCapability.KEY_SUBSCRIBE, subscribe); + return this; + } + /** + * @return {Boolean} + */ + + + getSubscribe() { + return this.getParameter(GetSystemCapability.KEY_SUBSCRIBE); + } + + } + + GetSystemCapability.KEY_SYSTEM_CAPABILITY_TYPE = 'systemCapabilityType'; + GetSystemCapability.KEY_SUBSCRIBE = 'subscribe'; + + /* eslint-disable camelcase */ + /** + * Enum for each type of video streaming codec. + * @typedef {Enum} VideoStreamingCodec + * @property {Object} _MAP + */ + + class VideoStreamingCodec extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * A block-oriented motion-compensation-based video compression standard. As of 2014 it is one of the most + * commonly used formats for the recording, compression, and distribution of video content. + * @return {String} + */ + + + static get H264() { + return VideoStreamingCodec._MAP.H264; + } + /** + * High Efficiency Video Coding (HEVC), also known as H.265 and MPEG-H Part 2, is a video compression standard, + * one of several potential successors to the widely used AVC (H.264 or MPEG-4 Part 10). In comparison to AVC, + * HEVC offers about double the data compression ratio at the same level of video quality, or substantially + * improved video quality at the same bit rate. It supports resolutions up to 8192x4320, including 8K UHD. + * @return {String} + */ + + + static get H265() { + return VideoStreamingCodec._MAP.H265; + } + /** + * Theora is derived from the formerly proprietary VP3 codec, released into the public domain by On2 Technologies. + * It is broadly comparable in design and bitrate efficiency to MPEG-4 Part 2, early versions of Windows Media + * Video, and RealVideo while lacking some of the features present in some of these other codecs. It is comparable + * in open standards philosophy to the BBC's Dirac codec. + * @return {String} + */ + + + static get Theora() { + return VideoStreamingCodec._MAP.Theora; + } + /** + * VP8 can be multiplexed into the Matroska-based container format WebM along with Vorbis and Opus audio. The + * image format WebP is based on VP8's intra-frame coding. VP8's direct successor, VP9, and the emerging royalty- + * free internet video format AV1 from the Alliance for Open Media (AOMedia) are based on VP8. + * @return {String} + */ + + + static get VP8() { + return VideoStreamingCodec._MAP.VP8; + } + /** + * Similar to VP8, but VP9 is customized for video resolutions beyond high-definition video (UHD) and also enables + * lossless compression. + * @return {String} + */ + + + static get VP9() { + return VideoStreamingCodec._MAP.VP9; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return VideoStreamingCodec._valueForKey(key, VideoStreamingCodec._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return VideoStreamingCodec._keyForValue(value, VideoStreamingCodec._MAP); + } + + } + + VideoStreamingCodec._MAP = Object.freeze({ + 'H264': 'H264', + 'H265': 'H265', + 'Theora': 'Theora', + 'VP8': 'VP8', + 'VP9': 'VP9' + }); + + /* eslint-disable camelcase */ + /** + * Enum for each type of video streaming protocol type. + * @typedef {Enum} VideoStreamingProtocol + * @property {Object} _MAP + */ + + class VideoStreamingProtocol extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * Raw stream bytes that contains no timestamp data and is the lowest supported video streaming + * @return {String} + */ + + + static get RAW() { + return VideoStreamingProtocol._MAP.RAW; + } + /** + * RTP facilitates the transfer of real-time data. Information provided by this protocol include timestamps (for + * synchronization), sequence numbers (for packet loss and reordering detection) and the payload format which + * indicates the encoded format of the data. + * @return {String} + */ + + + static get RTP() { + return VideoStreamingProtocol._MAP.RTP; + } + /** + * The transmission of streaming data itself is not a task of RTSP. Most RTSP servers use the Real-time Transport + * Protocol (RTP) in conjunction with Real-time Control Protocol (RTCP) for media stream delivery. However, some + * vendors implement proprietary transport protocols. + * @return {String} + */ + + + static get RTSP() { + return VideoStreamingProtocol._MAP.RTSP; + } + /** + * Real-Time Messaging Protocol (RTMP) was initially a proprietary protocol developed by Macromedia for streaming + * audio, video and data over the Internet, between a Flash player and a server. Macromedia is now owned by Adobe, + * which has released an incomplete version of the specification of the protocol for public use. + * @return {String} + */ + + + static get RTMP() { + return VideoStreamingProtocol._MAP.RTMP; + } + /** + * The WebM container is based on a profile of Matroska. WebM initially supported VP8 video and Vorbis audio + * streams. In 2013 it was updated to accommodate VP9 video and Opus audio. + * @return {String} + */ + + + static get WEBM() { + return VideoStreamingProtocol._MAP.WEBM; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return VideoStreamingProtocol._valueForKey(key, VideoStreamingProtocol._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return VideoStreamingProtocol._keyForValue(value, VideoStreamingProtocol._MAP); + } + + } + + VideoStreamingProtocol._MAP = Object.freeze({ + 'RAW': 'RAW', + 'RTP': 'RTP', + 'RTSP': 'RTSP', + 'RTMP': 'RTMP', + 'WEBM': 'WEBM' + }); + + /* eslint-disable camelcase */ + /** + * Video streaming formats and their specifications. + */ + + class VideoStreamingFormat extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {VideoStreamingProtocol} protocol - Protocol type, see VideoStreamingProtocol + * @return {VideoStreamingFormat} + */ + + + setProtocol(protocol) { + this.validateType(VideoStreamingProtocol, protocol); + this.setParameter(VideoStreamingFormat.KEY_PROTOCOL, protocol); + return this; + } + /** + * @return {VideoStreamingProtocol} + */ + + + getProtocol() { + return this.getObject(VideoStreamingProtocol, VideoStreamingFormat.KEY_PROTOCOL); + } + /** + * @param {VideoStreamingCodec} codec - Codec type, see VideoStreamingCodec + * @return {VideoStreamingFormat} + */ + + + setCodec(codec) { + this.validateType(VideoStreamingCodec, codec); + this.setParameter(VideoStreamingFormat.KEY_CODEC, codec); + return this; + } + /** + * @return {VideoStreamingCodec} + */ + + + getCodec() { + return this.getObject(VideoStreamingCodec, VideoStreamingFormat.KEY_CODEC); } } @@ -25212,6 +42129,9841 @@ VideoStreamingFormat.KEY_PROTOCOL = 'protocol'; VideoStreamingFormat.KEY_CODEC = 'codec'; + /* eslint-disable camelcase */ + /** + * Contains information about this system's video streaming capabilities. + */ + + class VideoStreamingCapability extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {ImageResolution} resolution - The preferred resolution of a video stream for decoding and rendering on + * HMI. + * @return {VideoStreamingCapability} + */ + + + setPreferredResolution(resolution) { + this.validateType(ImageResolution, resolution); + this.setParameter(VideoStreamingCapability.KEY_PREFERRED_RESOLUTION, resolution); + return this; + } + /** + * @return {ImageResolution} + */ + + + getPreferredResolution() { + return this.getObject(ImageResolution, VideoStreamingCapability.KEY_PREFERRED_RESOLUTION); + } + /** + * @param {Number} bitrate - The maximum bitrate of video stream that is supported, in kbps. + * @return {VideoStreamingCapability} + */ + + + setMaxBitrate(bitrate) { + this.setParameter(VideoStreamingCapability.KEY_MAX_BITRATE, bitrate); + return this; + } + /** + * @return {Number} + */ + + + getMaxBitrate() { + return this.getParameter(VideoStreamingCapability.KEY_MAX_BITRATE); + } + /** + * @param {VideoStreamingFormat[]} formats - Detailed information on each format supported by this system, in its + * preferred order (i.e. the first element in the array is most preferable + * to the system). Each object will contain a VideoStreamingFormat that + * describes what can be expected. + * @return {VideoStreamingCapability} + */ + + + setSupportedFormats(formats) { + this.validateType(VideoStreamingFormat, formats, true); + this.setParameter(VideoStreamingCapability.KEY_SUPPORTED_FORMATS, formats); + return this; + } + /** + * @return {VideoStreamingFormat[]} + */ + + + getSupportedFormats() { + return this.getObject(VideoStreamingFormat, VideoStreamingCapability.KEY_SUPPORTED_FORMATS); + } + /** + * @param {Boolean} supported - True if the system can utilize the haptic spatial data from the source being + * streamed. If not included, it can be assumed the module doesn't support haptic + * spatial data'. + * @return {VideoStreamingCapability} + */ + + + setHapticSpatialDataSupported(supported) { + this.setParameter(VideoStreamingCapability.KEY_HAPTIC_SPATIAL_DATA_SUPPORTED, supported); + return this; + } + /** + * @return {Boolean} + */ + + + getHapticSpatialDataSupported() { + return this.getParameter(VideoStreamingCapability.KEY_HAPTIC_SPATIAL_DATA_SUPPORTED); + } + /** + * @param {Number} size - The diagonal screen size in inches. + * @return {VideoStreamingCapability} + */ + + + setDiagonalScreenSize(size) { + this.setParameter(VideoStreamingCapability.KEY_DIAGONAL_SCREEN_SIZE, size); + return this; + } + /** + * @return {Number} + */ + + + getDiagonalScreenSize() { + return this.getParameter(VideoStreamingCapability.KEY_DIAGONAL_SCREEN_SIZE); + } + /** + * @param {Number} inch - PPI is the diagonal resolution in pixels divided by the diagonal screen size in inches. + * @return {VideoStreamingCapability} + */ + + + setPixelPerInch(inch) { + this.setParameter(VideoStreamingCapability.KEY_PIXEL_PER_INCH, inch); + return this; + } + /** + * @return {Number} + */ + + + getPixelPerInch() { + return this.getParameter(VideoStreamingCapability.KEY_PIXEL_PER_INCH); + } + /** + * @param {Number} scale - The scaling factor the app should use to change the size of the projecting view. + * @return {VideoStreamingCapability} + */ + + + setScale(scale) { + this.setParameter(VideoStreamingCapability.KEY_SCALE, scale); + return this; + } + /** + * @return {Number} + */ + + + getScale() { + return this.getParameter(VideoStreamingCapability.KEY_SCALE); + } + + } + + VideoStreamingCapability.KEY_PREFERRED_RESOLUTION = 'preferredResolution'; + VideoStreamingCapability.KEY_MAX_BITRATE = 'maxBitrate'; + VideoStreamingCapability.KEY_SUPPORTED_FORMATS = 'supportedFormats'; + VideoStreamingCapability.KEY_HAPTIC_SPATIAL_DATA_SUPPORTED = 'hapticSpatialDataSupported'; + VideoStreamingCapability.KEY_DIAGONAL_SCREEN_SIZE = 'diagonalScreenSize'; + VideoStreamingCapability.KEY_PIXEL_PER_INCH = 'pixelPerInch'; + VideoStreamingCapability.KEY_SCALE = 'scale'; + + /* eslint-disable camelcase */ + /** + * Extended capabilities of the module's phone feature + */ + + class PhoneCapability extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Boolean} enabled - If the module has the ability to perform dial number + * @return {PhoneCapability} + */ + + + setDialNumberEnabled(enabled) { + this.setParameter(PhoneCapability.KEY_DIAL_NUMBER_ENABLED, enabled); + return this; + } + /** + * @return {Boolean} + */ + + + getDialNumberEnabled() { + return this.getParameter(PhoneCapability.KEY_DIAL_NUMBER_ENABLED); + } + + } + + PhoneCapability.KEY_DIAL_NUMBER_ENABLED = 'dialNumberEnabled'; + + /* eslint-disable camelcase */ + + class WindowTypeCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {WindowType} type + * @return {WindowTypeCapabilities} + */ + + + setType(type) { + this.validateType(WindowType, type); + this.setParameter(WindowTypeCapabilities.KEY_TYPE, type); + return this; + } + /** + * @return {WindowType} + */ + + + getType() { + return this.getObject(WindowType, WindowTypeCapabilities.KEY_TYPE); + } + /** + * @param {Number} windows + * @return {WindowTypeCapabilities} + */ + + + setMaximumNumberOfWindows(windows) { + this.setParameter(WindowTypeCapabilities.KEY_MAXIMUM_NUMBER_OF_WINDOWS, windows); + return this; + } + /** + * @return {Number} + */ + + + getMaximumNumberOfWindows() { + return this.getParameter(WindowTypeCapabilities.KEY_MAXIMUM_NUMBER_OF_WINDOWS); + } + + } + + WindowTypeCapabilities.KEY_TYPE = 'type'; + WindowTypeCapabilities.KEY_MAXIMUM_NUMBER_OF_WINDOWS = 'maximumNumberOfWindows'; + + /* eslint-disable camelcase */ + + class WindowCapability extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} id - The specified ID of the window. This ID is either one used when sending the CreateWindow + * request, or one of the predefined window ID values from the enum PredefinedWindows. If + * ommited, value is assumed to be the main window on the main display. + * @return {WindowCapability} + */ + + + setWindowID(id) { + this.setParameter(WindowCapability.KEY_WINDOW_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getWindowID() { + return this.getParameter(WindowCapability.KEY_WINDOW_ID); + } + /** + * @param {TextField[]} fields - A set of all fields that support text data. See TextField + * @return {WindowCapability} + */ + + + setTextFields(fields) { + this.validateType(TextField, fields, true); + this.setParameter(WindowCapability.KEY_TEXT_FIELDS, fields); + return this; + } + /** + * @return {TextField[]} + */ + + + getTextFields() { + return this.getObject(TextField, WindowCapability.KEY_TEXT_FIELDS); + } + /** + * @param {ImageField[]} fields - A set of all fields that support images. See ImageField + * @return {WindowCapability} + */ + + + setImageFields(fields) { + this.validateType(ImageField, fields, true); + this.setParameter(WindowCapability.KEY_IMAGE_FIELDS, fields); + return this; + } + /** + * @return {ImageField[]} + */ + + + getImageFields() { + return this.getObject(ImageField, WindowCapability.KEY_IMAGE_FIELDS); + } + /** + * @param {ImageType[]} supported - Provides information about image types supported by the system. + * @return {WindowCapability} + */ + + + setImageTypeSupported(supported) { + this.validateType(ImageType, supported, true); + this.setParameter(WindowCapability.KEY_IMAGE_TYPE_SUPPORTED, supported); + return this; + } + /** + * @return {ImageType[]} + */ + + + getImageTypeSupported() { + return this.getObject(ImageType, WindowCapability.KEY_IMAGE_TYPE_SUPPORTED); + } + /** + * @param {String[]} available - A set of all window templates available on the head unit. + * @return {WindowCapability} + */ + + + setTemplatesAvailable(available) { + this.setParameter(WindowCapability.KEY_TEMPLATES_AVAILABLE, available); + return this; + } + /** + * @return {String[]} + */ + + + getTemplatesAvailable() { + return this.getParameter(WindowCapability.KEY_TEMPLATES_AVAILABLE); + } + /** + * @param {Number} available - The number of on-window custom presets available (if any); otherwise omitted. + * @return {WindowCapability} + */ + + + setNumCustomPresetsAvailable(available) { + this.setParameter(WindowCapability.KEY_NUM_CUSTOM_PRESETS_AVAILABLE, available); + return this; + } + /** + * @return {Number} + */ + + + getNumCustomPresetsAvailable() { + return this.getParameter(WindowCapability.KEY_NUM_CUSTOM_PRESETS_AVAILABLE); + } + /** + * @param {ButtonCapabilities[]} capabilities - The number of buttons and the capabilities of each on-window button. + * @return {WindowCapability} + */ + + + setButtonCapabilities(capabilities) { + this.validateType(ButtonCapabilities, capabilities, true); + this.setParameter(WindowCapability.KEY_BUTTON_CAPABILITIES, capabilities); + return this; + } + /** + * @return {ButtonCapabilities[]} + */ + + + getButtonCapabilities() { + return this.getObject(ButtonCapabilities, WindowCapability.KEY_BUTTON_CAPABILITIES); + } + /** + * @param {SoftButtonCapabilities[]} capabilities - The number of soft buttons available on-window and the + * capabilities for each button. + * @return {WindowCapability} + */ + + + setSoftButtonCapabilities(capabilities) { + this.validateType(SoftButtonCapabilities, capabilities, true); + this.setParameter(WindowCapability.KEY_SOFT_BUTTON_CAPABILITIES, capabilities); + return this; + } + /** + * @return {SoftButtonCapabilities[]} + */ + + + getSoftButtonCapabilities() { + return this.getObject(SoftButtonCapabilities, WindowCapability.KEY_SOFT_BUTTON_CAPABILITIES); + } + /** + * @param {MenuLayout[]} available - An array of available menu layouts. If this parameter is not provided, only the + * `LIST` layout is assumed to be available + * @return {WindowCapability} + */ + + + setMenuLayoutsAvailable(available) { + this.validateType(MenuLayout, available, true); + this.setParameter(WindowCapability.KEY_MENU_LAYOUTS_AVAILABLE, available); + return this; + } + /** + * @return {MenuLayout[]} + */ + + + getMenuLayoutsAvailable() { + return this.getObject(MenuLayout, WindowCapability.KEY_MENU_LAYOUTS_AVAILABLE); + } + + } + + WindowCapability.KEY_WINDOW_ID = 'windowID'; + WindowCapability.KEY_TEXT_FIELDS = 'textFields'; + WindowCapability.KEY_IMAGE_FIELDS = 'imageFields'; + WindowCapability.KEY_IMAGE_TYPE_SUPPORTED = 'imageTypeSupported'; + WindowCapability.KEY_TEMPLATES_AVAILABLE = 'templatesAvailable'; + WindowCapability.KEY_NUM_CUSTOM_PRESETS_AVAILABLE = 'numCustomPresetsAvailable'; + WindowCapability.KEY_BUTTON_CAPABILITIES = 'buttonCapabilities'; + WindowCapability.KEY_SOFT_BUTTON_CAPABILITIES = 'softButtonCapabilities'; + WindowCapability.KEY_MENU_LAYOUTS_AVAILABLE = 'menuLayoutsAvailable'; + + /* eslint-disable camelcase */ + + class DisplayCapability extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} name + * @return {DisplayCapability} + */ + + + setDisplayName(name) { + this.setParameter(DisplayCapability.KEY_DISPLAY_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getDisplayName() { + return this.getParameter(DisplayCapability.KEY_DISPLAY_NAME); + } + /** + * @param {WindowTypeCapabilities[]} supported - Informs the application how many windows the app is allowed to + * create per type. + * @return {DisplayCapability} + */ + + + setWindowTypeSupported(supported) { + this.validateType(WindowTypeCapabilities, supported, true); + this.setParameter(DisplayCapability.KEY_WINDOW_TYPE_SUPPORTED, supported); + return this; + } + /** + * @return {WindowTypeCapabilities[]} + */ + + + getWindowTypeSupported() { + return this.getObject(WindowTypeCapabilities, DisplayCapability.KEY_WINDOW_TYPE_SUPPORTED); + } + /** + * @param {WindowCapability[]} capabilities - Contains a list of capabilities of all windows related to the app. + * Once the app has registered the capabilities of all windows are + * provided. GetSystemCapability still allows requesting window + * capabilities of all windows. After registration, only windows with + * capabilities changed will be included. Following cases will cause only + * affected windows to be included: 1. App creates a new window. After + * the window is created, a system capability notification will be sent + * related only to the created window. 2. App sets a new layout to the + * window. The new layout changes window capabilties. The notification + * will reflect those changes to the single window. + * @return {DisplayCapability} + */ + + + setWindowCapabilities(capabilities) { + this.validateType(WindowCapability, capabilities, true); + this.setParameter(DisplayCapability.KEY_WINDOW_CAPABILITIES, capabilities); + return this; + } + /** + * @return {WindowCapability[]} + */ + + + getWindowCapabilities() { + return this.getObject(WindowCapability, DisplayCapability.KEY_WINDOW_CAPABILITIES); + } + + } + + DisplayCapability.KEY_DISPLAY_NAME = 'displayName'; + DisplayCapability.KEY_WINDOW_TYPE_SUPPORTED = 'windowTypeSupported'; + DisplayCapability.KEY_WINDOW_CAPABILITIES = 'windowCapabilities'; + + /* eslint-disable camelcase */ + + class AudioControlCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} name - The short friendly name of the light control module. It should not be used to identify a + * module by mobile application. + * @return {AudioControlCapabilities} + */ + + + setModuleName(name) { + this.setParameter(AudioControlCapabilities.KEY_MODULE_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getModuleName() { + return this.getParameter(AudioControlCapabilities.KEY_MODULE_NAME); + } + /** + * @param {ModuleInfo} info - Information about a RC module, including its id. + * @return {AudioControlCapabilities} + */ + + + setModuleInfo(info) { + this.validateType(ModuleInfo, info); + this.setParameter(AudioControlCapabilities.KEY_MODULE_INFO, info); + return this; + } + /** + * @return {ModuleInfo} + */ + + + getModuleInfo() { + return this.getObject(ModuleInfo, AudioControlCapabilities.KEY_MODULE_INFO); + } + /** + * @param {Boolean} available - Availability of the control of audio source. + * @return {AudioControlCapabilities} + */ + + + setSourceAvailable(available) { + this.setParameter(AudioControlCapabilities.KEY_SOURCE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getSourceAvailable() { + return this.getParameter(AudioControlCapabilities.KEY_SOURCE_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the keepContext parameter. + * @return {AudioControlCapabilities} + */ + + + setKeepContextAvailable(available) { + this.setParameter(AudioControlCapabilities.KEY_KEEP_CONTEXT_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getKeepContextAvailable() { + return this.getParameter(AudioControlCapabilities.KEY_KEEP_CONTEXT_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of audio volume. + * @return {AudioControlCapabilities} + */ + + + setVolumeAvailable(available) { + this.setParameter(AudioControlCapabilities.KEY_VOLUME_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getVolumeAvailable() { + return this.getParameter(AudioControlCapabilities.KEY_VOLUME_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of Equalizer Settings. + * @return {AudioControlCapabilities} + */ + + + setEqualizerAvailable(available) { + this.setParameter(AudioControlCapabilities.KEY_EQUALIZER_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getEqualizerAvailable() { + return this.getParameter(AudioControlCapabilities.KEY_EQUALIZER_AVAILABLE); + } + /** + * @param {Number} id - Must be included if equalizerAvailable=true, and assume all IDs starting from 1 to this + * value are valid + * @return {AudioControlCapabilities} + */ + + + setEqualizerMaxChannelId(id) { + this.setParameter(AudioControlCapabilities.KEY_EQUALIZER_MAX_CHANNEL_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getEqualizerMaxChannelId() { + return this.getParameter(AudioControlCapabilities.KEY_EQUALIZER_MAX_CHANNEL_ID); + } + + } + + AudioControlCapabilities.KEY_MODULE_NAME = 'moduleName'; + AudioControlCapabilities.KEY_MODULE_INFO = 'moduleInfo'; + AudioControlCapabilities.KEY_SOURCE_AVAILABLE = 'sourceAvailable'; + AudioControlCapabilities.KEY_KEEP_CONTEXT_AVAILABLE = 'keepContextAvailable'; + AudioControlCapabilities.KEY_VOLUME_AVAILABLE = 'volumeAvailable'; + AudioControlCapabilities.KEY_EQUALIZER_AVAILABLE = 'equalizerAvailable'; + AudioControlCapabilities.KEY_EQUALIZER_MAX_CHANNEL_ID = 'equalizerMaxChannelId'; + + /* eslint-disable camelcase */ + + class LightCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {LightName} name + * @return {LightCapabilities} + */ + + + setName(name) { + this.validateType(LightName, name); + this.setParameter(LightCapabilities.KEY_NAME, name); + return this; + } + /** + * @return {LightName} + */ + + + getName() { + return this.getObject(LightName, LightCapabilities.KEY_NAME); + } + /** + * @param {Boolean} available - Indicates if the status (ON/OFF) can be set remotely. App shall not use read-only + * values (RAMP_UP/RAMP_DOWN/UNKNOWN/INVALID) in a setInteriorVehicleData request. + * @return {LightCapabilities} + */ + + + setStatusAvailable(available) { + this.setParameter(LightCapabilities.KEY_STATUS_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getStatusAvailable() { + return this.getParameter(LightCapabilities.KEY_STATUS_AVAILABLE); + } + /** + * @param {Boolean} available - Indicates if the light's density can be set remotely (similar to a dimmer). + * @return {LightCapabilities} + */ + + + setDensityAvailable(available) { + this.setParameter(LightCapabilities.KEY_DENSITY_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getDensityAvailable() { + return this.getParameter(LightCapabilities.KEY_DENSITY_AVAILABLE); + } + /** + * @param {Boolean} available - Indicates if the light's color can be set remotely by using the sRGB color space. + * @return {LightCapabilities} + */ + + + setRgbColorSpaceAvailable(available) { + this.setParameter(LightCapabilities.KEY_RGB_COLOR_SPACE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getRgbColorSpaceAvailable() { + return this.getParameter(LightCapabilities.KEY_RGB_COLOR_SPACE_AVAILABLE); + } + + } + + LightCapabilities.KEY_NAME = 'name'; + LightCapabilities.KEY_STATUS_AVAILABLE = 'statusAvailable'; + LightCapabilities.KEY_DENSITY_AVAILABLE = 'densityAvailable'; + LightCapabilities.KEY_RGB_COLOR_SPACE_AVAILABLE = 'rgbColorSpaceAvailable'; + + /* eslint-disable camelcase */ + + class LightControlCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} name - The short friendly name of the light control module. It should not be used to identify a + * module by mobile application. + * @return {LightControlCapabilities} + */ + + + setModuleName(name) { + this.setParameter(LightControlCapabilities.KEY_MODULE_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getModuleName() { + return this.getParameter(LightControlCapabilities.KEY_MODULE_NAME); + } + /** + * @param {ModuleInfo} info - Information about a RC module, including its id. + * @return {LightControlCapabilities} + */ + + + setModuleInfo(info) { + this.validateType(ModuleInfo, info); + this.setParameter(LightControlCapabilities.KEY_MODULE_INFO, info); + return this; + } + /** + * @return {ModuleInfo} + */ + + + getModuleInfo() { + return this.getObject(ModuleInfo, LightControlCapabilities.KEY_MODULE_INFO); + } + /** + * @param {LightCapabilities[]} lights - An array of available LightCapabilities that are controllable. + * @return {LightControlCapabilities} + */ + + + setSupportedLights(lights) { + this.validateType(LightCapabilities, lights, true); + this.setParameter(LightControlCapabilities.KEY_SUPPORTED_LIGHTS, lights); + return this; + } + /** + * @return {LightCapabilities[]} + */ + + + getSupportedLights() { + return this.getObject(LightCapabilities, LightControlCapabilities.KEY_SUPPORTED_LIGHTS); + } + + } + + LightControlCapabilities.KEY_MODULE_NAME = 'moduleName'; + LightControlCapabilities.KEY_MODULE_INFO = 'moduleInfo'; + LightControlCapabilities.KEY_SUPPORTED_LIGHTS = 'supportedLights'; + + /* eslint-disable camelcase */ + /** + * Contains information about a climate control module's capabilities. + */ + + class ClimateControlCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} name - The short friendly name of the climate control module. It should not be used to identify a + * module by mobile application. + * @return {ClimateControlCapabilities} + */ + + + setModuleName(name) { + this.setParameter(ClimateControlCapabilities.KEY_MODULE_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getModuleName() { + return this.getParameter(ClimateControlCapabilities.KEY_MODULE_NAME); + } + /** + * @param {ModuleInfo} info - Information about a RC module, including its id. + * @return {ClimateControlCapabilities} + */ + + + setModuleInfo(info) { + this.validateType(ModuleInfo, info); + this.setParameter(ClimateControlCapabilities.KEY_MODULE_INFO, info); + return this; + } + /** + * @return {ModuleInfo} + */ + + + getModuleInfo() { + return this.getObject(ModuleInfo, ClimateControlCapabilities.KEY_MODULE_INFO); + } + /** + * @param {Boolean} available - Availability of the reading of current temperature. True: Available, False: Not + * Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + + + setCurrentTemperatureAvailable(available) { + this.setParameter(ClimateControlCapabilities.KEY_CURRENT_TEMPERATURE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getCurrentTemperatureAvailable() { + return this.getParameter(ClimateControlCapabilities.KEY_CURRENT_TEMPERATURE_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of fan speed. True: Available, False: Not Available, Not + * present: Not Available. + * @return {ClimateControlCapabilities} + */ + + + setFanSpeedAvailable(available) { + this.setParameter(ClimateControlCapabilities.KEY_FAN_SPEED_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getFanSpeedAvailable() { + return this.getParameter(ClimateControlCapabilities.KEY_FAN_SPEED_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of desired temperature. True: Available, False: Not + * Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + + + setDesiredTemperatureAvailable(available) { + this.setParameter(ClimateControlCapabilities.KEY_DESIRED_TEMPERATURE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getDesiredTemperatureAvailable() { + return this.getParameter(ClimateControlCapabilities.KEY_DESIRED_TEMPERATURE_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of turn on/off AC. True: Available, False: Not + * Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + + + setAcEnableAvailable(available) { + this.setParameter(ClimateControlCapabilities.KEY_AC_ENABLE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getAcEnableAvailable() { + return this.getParameter(ClimateControlCapabilities.KEY_AC_ENABLE_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of enable/disable air conditioning is ON on the maximum + * level. True: Available, False: Not Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + + + setAcMaxEnableAvailable(available) { + this.setParameter(ClimateControlCapabilities.KEY_AC_MAX_ENABLE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getAcMaxEnableAvailable() { + return this.getParameter(ClimateControlCapabilities.KEY_AC_MAX_ENABLE_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of enable/disable circulate Air mode. True: Available, + * False: Not Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + + + setCirculateAirEnableAvailable(available) { + this.setParameter(ClimateControlCapabilities.KEY_CIRCULATE_AIR_ENABLE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getCirculateAirEnableAvailable() { + return this.getParameter(ClimateControlCapabilities.KEY_CIRCULATE_AIR_ENABLE_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of enable/disable auto mode. True: Available, False: Not + * Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + + + setAutoModeEnableAvailable(available) { + this.setParameter(ClimateControlCapabilities.KEY_AUTO_MODE_ENABLE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getAutoModeEnableAvailable() { + return this.getParameter(ClimateControlCapabilities.KEY_AUTO_MODE_ENABLE_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of enable/disable dual mode. True: Available, False: Not + * Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + + + setDualModeEnableAvailable(available) { + this.setParameter(ClimateControlCapabilities.KEY_DUAL_MODE_ENABLE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getDualModeEnableAvailable() { + return this.getParameter(ClimateControlCapabilities.KEY_DUAL_MODE_ENABLE_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of defrost zones. True: Available, False: Not Available, + * Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + + + setDefrostZoneAvailable(available) { + this.setParameter(ClimateControlCapabilities.KEY_DEFROST_ZONE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getDefrostZoneAvailable() { + return this.getParameter(ClimateControlCapabilities.KEY_DEFROST_ZONE_AVAILABLE); + } + /** + * @param {DefrostZone[]} zone - A set of all defrost zones that are controllable. + * @return {ClimateControlCapabilities} + */ + + + setDefrostZone(zone) { + this.validateType(DefrostZone, zone, true); + this.setParameter(ClimateControlCapabilities.KEY_DEFROST_ZONE, zone); + return this; + } + /** + * @return {DefrostZone[]} + */ + + + getDefrostZone() { + return this.getObject(DefrostZone, ClimateControlCapabilities.KEY_DEFROST_ZONE); + } + /** + * @param {Boolean} available - Availability of the control of air ventilation mode. True: Available, False: Not + * Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + + + setVentilationModeAvailable(available) { + this.setParameter(ClimateControlCapabilities.KEY_VENTILATION_MODE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getVentilationModeAvailable() { + return this.getParameter(ClimateControlCapabilities.KEY_VENTILATION_MODE_AVAILABLE); + } + /** + * @param {VentilationMode[]} mode - A set of all ventilation modes that are controllable. + * @return {ClimateControlCapabilities} + */ + + + setVentilationMode(mode) { + this.validateType(VentilationMode, mode, true); + this.setParameter(ClimateControlCapabilities.KEY_VENTILATION_MODE, mode); + return this; + } + /** + * @return {VentilationMode[]} + */ + + + getVentilationMode() { + return this.getObject(VentilationMode, ClimateControlCapabilities.KEY_VENTILATION_MODE); + } + /** + * @param {Boolean} available - Availability of the control (enable/disable) of heated Steering Wheel. True: + * Available, False: Not Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + + + setHeatedSteeringWheelAvailable(available) { + this.setParameter(ClimateControlCapabilities.KEY_HEATED_STEERING_WHEEL_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getHeatedSteeringWheelAvailable() { + return this.getParameter(ClimateControlCapabilities.KEY_HEATED_STEERING_WHEEL_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control (enable/disable) of heated Windshield. True: Available, + * False: Not Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + + + setHeatedWindshieldAvailable(available) { + this.setParameter(ClimateControlCapabilities.KEY_HEATED_WINDSHIELD_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getHeatedWindshieldAvailable() { + return this.getParameter(ClimateControlCapabilities.KEY_HEATED_WINDSHIELD_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control (enable/disable) of heated Rear Window. True: Available, + * False: Not Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + + + setHeatedRearWindowAvailable(available) { + this.setParameter(ClimateControlCapabilities.KEY_HEATED_REAR_WINDOW_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getHeatedRearWindowAvailable() { + return this.getParameter(ClimateControlCapabilities.KEY_HEATED_REAR_WINDOW_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control (enable/disable) of heated Mirrors. True: Available, + * False: Not Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + + + setHeatedMirrorsAvailable(available) { + this.setParameter(ClimateControlCapabilities.KEY_HEATED_MIRRORS_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getHeatedMirrorsAvailable() { + return this.getParameter(ClimateControlCapabilities.KEY_HEATED_MIRRORS_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of enable/disable climate control. True: Available, + * False: Not Available, Not present: Not Available. + * @return {ClimateControlCapabilities} + */ + + + setClimateEnableAvailable(available) { + this.setParameter(ClimateControlCapabilities.KEY_CLIMATE_ENABLE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getClimateEnableAvailable() { + return this.getParameter(ClimateControlCapabilities.KEY_CLIMATE_ENABLE_AVAILABLE); + } + + } + + ClimateControlCapabilities.KEY_MODULE_NAME = 'moduleName'; + ClimateControlCapabilities.KEY_MODULE_INFO = 'moduleInfo'; + ClimateControlCapabilities.KEY_CURRENT_TEMPERATURE_AVAILABLE = 'currentTemperatureAvailable'; + ClimateControlCapabilities.KEY_FAN_SPEED_AVAILABLE = 'fanSpeedAvailable'; + ClimateControlCapabilities.KEY_DESIRED_TEMPERATURE_AVAILABLE = 'desiredTemperatureAvailable'; + ClimateControlCapabilities.KEY_AC_ENABLE_AVAILABLE = 'acEnableAvailable'; + ClimateControlCapabilities.KEY_AC_MAX_ENABLE_AVAILABLE = 'acMaxEnableAvailable'; + ClimateControlCapabilities.KEY_CIRCULATE_AIR_ENABLE_AVAILABLE = 'circulateAirEnableAvailable'; + ClimateControlCapabilities.KEY_AUTO_MODE_ENABLE_AVAILABLE = 'autoModeEnableAvailable'; + ClimateControlCapabilities.KEY_DUAL_MODE_ENABLE_AVAILABLE = 'dualModeEnableAvailable'; + ClimateControlCapabilities.KEY_DEFROST_ZONE_AVAILABLE = 'defrostZoneAvailable'; + ClimateControlCapabilities.KEY_DEFROST_ZONE = 'defrostZone'; + ClimateControlCapabilities.KEY_VENTILATION_MODE_AVAILABLE = 'ventilationModeAvailable'; + ClimateControlCapabilities.KEY_VENTILATION_MODE = 'ventilationMode'; + ClimateControlCapabilities.KEY_HEATED_STEERING_WHEEL_AVAILABLE = 'heatedSteeringWheelAvailable'; + ClimateControlCapabilities.KEY_HEATED_WINDSHIELD_AVAILABLE = 'heatedWindshieldAvailable'; + ClimateControlCapabilities.KEY_HEATED_REAR_WINDOW_AVAILABLE = 'heatedRearWindowAvailable'; + ClimateControlCapabilities.KEY_HEATED_MIRRORS_AVAILABLE = 'heatedMirrorsAvailable'; + ClimateControlCapabilities.KEY_CLIMATE_ENABLE_AVAILABLE = 'climateEnableAvailable'; + + /* eslint-disable camelcase */ + + class SeatControlCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} name - The short friendly name of the light control module. It should not be used to identify a + * module by mobile application. + * @return {SeatControlCapabilities} + */ + + + setModuleName(name) { + this.setParameter(SeatControlCapabilities.KEY_MODULE_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getModuleName() { + return this.getParameter(SeatControlCapabilities.KEY_MODULE_NAME); + } + /** + * @param {ModuleInfo} info - Information about a RC module, including its id. + * @return {SeatControlCapabilities} + */ + + + setModuleInfo(info) { + this.validateType(ModuleInfo, info); + this.setParameter(SeatControlCapabilities.KEY_MODULE_INFO, info); + return this; + } + /** + * @return {ModuleInfo} + */ + + + getModuleInfo() { + return this.getObject(ModuleInfo, SeatControlCapabilities.KEY_MODULE_INFO); + } + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + + + setHeatingEnabledAvailable(available) { + this.setParameter(SeatControlCapabilities.KEY_HEATING_ENABLED_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getHeatingEnabledAvailable() { + return this.getParameter(SeatControlCapabilities.KEY_HEATING_ENABLED_AVAILABLE); + } + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + + + setCoolingEnabledAvailable(available) { + this.setParameter(SeatControlCapabilities.KEY_COOLING_ENABLED_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getCoolingEnabledAvailable() { + return this.getParameter(SeatControlCapabilities.KEY_COOLING_ENABLED_AVAILABLE); + } + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + + + setHeatingLevelAvailable(available) { + this.setParameter(SeatControlCapabilities.KEY_HEATING_LEVEL_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getHeatingLevelAvailable() { + return this.getParameter(SeatControlCapabilities.KEY_HEATING_LEVEL_AVAILABLE); + } + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + + + setCoolingLevelAvailable(available) { + this.setParameter(SeatControlCapabilities.KEY_COOLING_LEVEL_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getCoolingLevelAvailable() { + return this.getParameter(SeatControlCapabilities.KEY_COOLING_LEVEL_AVAILABLE); + } + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + + + setHorizontalPositionAvailable(available) { + this.setParameter(SeatControlCapabilities.KEY_HORIZONTAL_POSITION_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getHorizontalPositionAvailable() { + return this.getParameter(SeatControlCapabilities.KEY_HORIZONTAL_POSITION_AVAILABLE); + } + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + + + setVerticalPositionAvailable(available) { + this.setParameter(SeatControlCapabilities.KEY_VERTICAL_POSITION_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getVerticalPositionAvailable() { + return this.getParameter(SeatControlCapabilities.KEY_VERTICAL_POSITION_AVAILABLE); + } + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + + + setFrontVerticalPositionAvailable(available) { + this.setParameter(SeatControlCapabilities.KEY_FRONT_VERTICAL_POSITION_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getFrontVerticalPositionAvailable() { + return this.getParameter(SeatControlCapabilities.KEY_FRONT_VERTICAL_POSITION_AVAILABLE); + } + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + + + setBackVerticalPositionAvailable(available) { + this.setParameter(SeatControlCapabilities.KEY_BACK_VERTICAL_POSITION_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getBackVerticalPositionAvailable() { + return this.getParameter(SeatControlCapabilities.KEY_BACK_VERTICAL_POSITION_AVAILABLE); + } + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + + + setBackTiltAngleAvailable(available) { + this.setParameter(SeatControlCapabilities.KEY_BACK_TILT_ANGLE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getBackTiltAngleAvailable() { + return this.getParameter(SeatControlCapabilities.KEY_BACK_TILT_ANGLE_AVAILABLE); + } + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + + + setHeadSupportHorizontalPositionAvailable(available) { + this.setParameter(SeatControlCapabilities.KEY_HEAD_SUPPORT_HORIZONTAL_POSITION_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getHeadSupportHorizontalPositionAvailable() { + return this.getParameter(SeatControlCapabilities.KEY_HEAD_SUPPORT_HORIZONTAL_POSITION_AVAILABLE); + } + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + + + setHeadSupportVerticalPositionAvailable(available) { + this.setParameter(SeatControlCapabilities.KEY_HEAD_SUPPORT_VERTICAL_POSITION_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getHeadSupportVerticalPositionAvailable() { + return this.getParameter(SeatControlCapabilities.KEY_HEAD_SUPPORT_VERTICAL_POSITION_AVAILABLE); + } + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + + + setMassageEnabledAvailable(available) { + this.setParameter(SeatControlCapabilities.KEY_MASSAGE_ENABLED_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getMassageEnabledAvailable() { + return this.getParameter(SeatControlCapabilities.KEY_MASSAGE_ENABLED_AVAILABLE); + } + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + + + setMassageModeAvailable(available) { + this.setParameter(SeatControlCapabilities.KEY_MASSAGE_MODE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getMassageModeAvailable() { + return this.getParameter(SeatControlCapabilities.KEY_MASSAGE_MODE_AVAILABLE); + } + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + + + setMassageCushionFirmnessAvailable(available) { + this.setParameter(SeatControlCapabilities.KEY_MASSAGE_CUSHION_FIRMNESS_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getMassageCushionFirmnessAvailable() { + return this.getParameter(SeatControlCapabilities.KEY_MASSAGE_CUSHION_FIRMNESS_AVAILABLE); + } + /** + * @param {Boolean} available + * @return {SeatControlCapabilities} + */ + + + setMemoryAvailable(available) { + this.setParameter(SeatControlCapabilities.KEY_MEMORY_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getMemoryAvailable() { + return this.getParameter(SeatControlCapabilities.KEY_MEMORY_AVAILABLE); + } + + } + + SeatControlCapabilities.KEY_MODULE_NAME = 'moduleName'; + SeatControlCapabilities.KEY_MODULE_INFO = 'moduleInfo'; + SeatControlCapabilities.KEY_HEATING_ENABLED_AVAILABLE = 'heatingEnabledAvailable'; + SeatControlCapabilities.KEY_COOLING_ENABLED_AVAILABLE = 'coolingEnabledAvailable'; + SeatControlCapabilities.KEY_HEATING_LEVEL_AVAILABLE = 'heatingLevelAvailable'; + SeatControlCapabilities.KEY_COOLING_LEVEL_AVAILABLE = 'coolingLevelAvailable'; + SeatControlCapabilities.KEY_HORIZONTAL_POSITION_AVAILABLE = 'horizontalPositionAvailable'; + SeatControlCapabilities.KEY_VERTICAL_POSITION_AVAILABLE = 'verticalPositionAvailable'; + SeatControlCapabilities.KEY_FRONT_VERTICAL_POSITION_AVAILABLE = 'frontVerticalPositionAvailable'; + SeatControlCapabilities.KEY_BACK_VERTICAL_POSITION_AVAILABLE = 'backVerticalPositionAvailable'; + SeatControlCapabilities.KEY_BACK_TILT_ANGLE_AVAILABLE = 'backTiltAngleAvailable'; + SeatControlCapabilities.KEY_HEAD_SUPPORT_HORIZONTAL_POSITION_AVAILABLE = 'headSupportHorizontalPositionAvailable'; + SeatControlCapabilities.KEY_HEAD_SUPPORT_VERTICAL_POSITION_AVAILABLE = 'headSupportVerticalPositionAvailable'; + SeatControlCapabilities.KEY_MASSAGE_ENABLED_AVAILABLE = 'massageEnabledAvailable'; + SeatControlCapabilities.KEY_MASSAGE_MODE_AVAILABLE = 'massageModeAvailable'; + SeatControlCapabilities.KEY_MASSAGE_CUSHION_FIRMNESS_AVAILABLE = 'massageCushionFirmnessAvailable'; + SeatControlCapabilities.KEY_MEMORY_AVAILABLE = 'memoryAvailable'; + + /* eslint-disable camelcase */ + /** + * Contains information about a radio control module's capabilities. + */ + + class RadioControlCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} name - The short friendly name of the climate control module. It should not be used to identify a + * module by mobile application. + * @return {RadioControlCapabilities} + */ + + + setModuleName(name) { + this.setParameter(RadioControlCapabilities.KEY_MODULE_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getModuleName() { + return this.getParameter(RadioControlCapabilities.KEY_MODULE_NAME); + } + /** + * @param {ModuleInfo} info - Information about a RC module, including its id. + * @return {RadioControlCapabilities} + */ + + + setModuleInfo(info) { + this.validateType(ModuleInfo, info); + this.setParameter(RadioControlCapabilities.KEY_MODULE_INFO, info); + return this; + } + /** + * @return {ModuleInfo} + */ + + + getModuleInfo() { + return this.getObject(ModuleInfo, RadioControlCapabilities.KEY_MODULE_INFO); + } + /** + * @param {Boolean} available - Availability of the control of enable/disable radio. True: Available, False: Not + * Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + + + setRadioEnableAvailable(available) { + this.setParameter(RadioControlCapabilities.KEY_RADIO_ENABLE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getRadioEnableAvailable() { + return this.getParameter(RadioControlCapabilities.KEY_RADIO_ENABLE_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of radio band. True: Available, False: Not Available, + * Not present: Not Available. + * @return {RadioControlCapabilities} + */ + + + setRadioBandAvailable(available) { + this.setParameter(RadioControlCapabilities.KEY_RADIO_BAND_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getRadioBandAvailable() { + return this.getParameter(RadioControlCapabilities.KEY_RADIO_BAND_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of radio frequency. True: Available, False: Not + * Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + + + setRadioFrequencyAvailable(available) { + this.setParameter(RadioControlCapabilities.KEY_RADIO_FREQUENCY_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getRadioFrequencyAvailable() { + return this.getParameter(RadioControlCapabilities.KEY_RADIO_FREQUENCY_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of HD radio channel. True: Available, False: Not + * Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + + + setHdChannelAvailable(available) { + this.setParameter(RadioControlCapabilities.KEY_HD_CHANNEL_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getHdChannelAvailable() { + return this.getParameter(RadioControlCapabilities.KEY_HD_CHANNEL_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the getting Radio Data System (RDS) data. True: Available, False: + * Not Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + + + setRdsDataAvailable(available) { + this.setParameter(RadioControlCapabilities.KEY_RDS_DATA_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getRdsDataAvailable() { + return this.getParameter(RadioControlCapabilities.KEY_RDS_DATA_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the getting the number of available HD channels. True: Available, + * False: Not Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + + + setAvailableHDsAvailable(available) { + this.setParameter(RadioControlCapabilities.KEY_AVAILABLE_HDS_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getAvailableHDsAvailable() { + return this.getParameter(RadioControlCapabilities.KEY_AVAILABLE_HDS_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the list of available HD sub-channel indexes. True: Available, + * False: Not Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + + + setAvailableHdChannelsAvailable(available) { + this.setParameter(RadioControlCapabilities.KEY_AVAILABLE_HD_CHANNELS_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getAvailableHdChannelsAvailable() { + return this.getParameter(RadioControlCapabilities.KEY_AVAILABLE_HD_CHANNELS_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the getting the Radio state. True: Available, False: Not Available, + * Not present: Not Available. + * @return {RadioControlCapabilities} + */ + + + setStateAvailable(available) { + this.setParameter(RadioControlCapabilities.KEY_STATE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getStateAvailable() { + return this.getParameter(RadioControlCapabilities.KEY_STATE_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the getting the signal strength. True: Available, False: Not + * Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + + + setSignalStrengthAvailable(available) { + this.setParameter(RadioControlCapabilities.KEY_SIGNAL_STRENGTH_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getSignalStrengthAvailable() { + return this.getParameter(RadioControlCapabilities.KEY_SIGNAL_STRENGTH_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the getting the signal Change Threshold. True: Available, False: Not + * Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + + + setSignalChangeThresholdAvailable(available) { + this.setParameter(RadioControlCapabilities.KEY_SIGNAL_CHANGE_THRESHOLD_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getSignalChangeThresholdAvailable() { + return this.getParameter(RadioControlCapabilities.KEY_SIGNAL_CHANGE_THRESHOLD_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the getting HD radio Station Information Service (SIS) data. True: + * Available, False: Not Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + + + setSisDataAvailable(available) { + this.setParameter(RadioControlCapabilities.KEY_SIS_DATA_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getSisDataAvailable() { + return this.getParameter(RadioControlCapabilities.KEY_SIS_DATA_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of enable/disable HD radio. True: Available, False: Not + * Available, Not present: Not Available. + * @return {RadioControlCapabilities} + */ + + + setHdRadioEnableAvailable(available) { + this.setParameter(RadioControlCapabilities.KEY_HD_RADIO_ENABLE_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getHdRadioEnableAvailable() { + return this.getParameter(RadioControlCapabilities.KEY_HD_RADIO_ENABLE_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of sirius XM radio. True: Available, False: Not Available, Not present: + * Not Available. + * @return {RadioControlCapabilities} + */ + + + setSiriusxmRadioAvailable(available) { + this.setParameter(RadioControlCapabilities.KEY_SIRIUSXM_RADIO_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getSiriusxmRadioAvailable() { + return this.getParameter(RadioControlCapabilities.KEY_SIRIUSXM_RADIO_AVAILABLE); + } + + } + + RadioControlCapabilities.KEY_MODULE_NAME = 'moduleName'; + RadioControlCapabilities.KEY_MODULE_INFO = 'moduleInfo'; + RadioControlCapabilities.KEY_RADIO_ENABLE_AVAILABLE = 'radioEnableAvailable'; + RadioControlCapabilities.KEY_RADIO_BAND_AVAILABLE = 'radioBandAvailable'; + RadioControlCapabilities.KEY_RADIO_FREQUENCY_AVAILABLE = 'radioFrequencyAvailable'; + RadioControlCapabilities.KEY_HD_CHANNEL_AVAILABLE = 'hdChannelAvailable'; + RadioControlCapabilities.KEY_RDS_DATA_AVAILABLE = 'rdsDataAvailable'; + RadioControlCapabilities.KEY_AVAILABLE_HDS_AVAILABLE = 'availableHDsAvailable'; + RadioControlCapabilities.KEY_AVAILABLE_HD_CHANNELS_AVAILABLE = 'availableHdChannelsAvailable'; + RadioControlCapabilities.KEY_STATE_AVAILABLE = 'stateAvailable'; + RadioControlCapabilities.KEY_SIGNAL_STRENGTH_AVAILABLE = 'signalStrengthAvailable'; + RadioControlCapabilities.KEY_SIGNAL_CHANGE_THRESHOLD_AVAILABLE = 'signalChangeThresholdAvailable'; + RadioControlCapabilities.KEY_SIS_DATA_AVAILABLE = 'sisDataAvailable'; + RadioControlCapabilities.KEY_HD_RADIO_ENABLE_AVAILABLE = 'hdRadioEnableAvailable'; + RadioControlCapabilities.KEY_SIRIUSXM_RADIO_AVAILABLE = 'siriusxmRadioAvailable'; + + /* eslint-disable camelcase */ + + class HMISettingsControlCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} name - The short friendly name of the hmi setting module. It should not be used to identify a + * module by mobile application. + * @return {HMISettingsControlCapabilities} + */ + + + setModuleName(name) { + this.setParameter(HMISettingsControlCapabilities.KEY_MODULE_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getModuleName() { + return this.getParameter(HMISettingsControlCapabilities.KEY_MODULE_NAME); + } + /** + * @param {ModuleInfo} info - Information about a RC module, including its id. + * @return {HMISettingsControlCapabilities} + */ + + + setModuleInfo(info) { + this.validateType(ModuleInfo, info); + this.setParameter(HMISettingsControlCapabilities.KEY_MODULE_INFO, info); + return this; + } + /** + * @return {ModuleInfo} + */ + + + getModuleInfo() { + return this.getObject(ModuleInfo, HMISettingsControlCapabilities.KEY_MODULE_INFO); + } + /** + * @param {Boolean} available - Availability of the control of distance unit. + * @return {HMISettingsControlCapabilities} + */ + + + setDistanceUnitAvailable(available) { + this.setParameter(HMISettingsControlCapabilities.KEY_DISTANCE_UNIT_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getDistanceUnitAvailable() { + return this.getParameter(HMISettingsControlCapabilities.KEY_DISTANCE_UNIT_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of temperature unit. + * @return {HMISettingsControlCapabilities} + */ + + + setTemperatureUnitAvailable(available) { + this.setParameter(HMISettingsControlCapabilities.KEY_TEMPERATURE_UNIT_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getTemperatureUnitAvailable() { + return this.getParameter(HMISettingsControlCapabilities.KEY_TEMPERATURE_UNIT_AVAILABLE); + } + /** + * @param {Boolean} available - Availability of the control of HMI display mode. + * @return {HMISettingsControlCapabilities} + */ + + + setDisplayModeUnitAvailable(available) { + this.setParameter(HMISettingsControlCapabilities.KEY_DISPLAY_MODE_UNIT_AVAILABLE, available); + return this; + } + /** + * @return {Boolean} + */ + + + getDisplayModeUnitAvailable() { + return this.getParameter(HMISettingsControlCapabilities.KEY_DISPLAY_MODE_UNIT_AVAILABLE); + } + + } + + HMISettingsControlCapabilities.KEY_MODULE_NAME = 'moduleName'; + HMISettingsControlCapabilities.KEY_MODULE_INFO = 'moduleInfo'; + HMISettingsControlCapabilities.KEY_DISTANCE_UNIT_AVAILABLE = 'distanceUnitAvailable'; + HMISettingsControlCapabilities.KEY_TEMPERATURE_UNIT_AVAILABLE = 'temperatureUnitAvailable'; + HMISettingsControlCapabilities.KEY_DISPLAY_MODE_UNIT_AVAILABLE = 'displayModeUnitAvailable'; + + /* eslint-disable camelcase */ + + class RemoteControlCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {ClimateControlCapabilities[]} capabilities - If included, the platform supports RC climate controls. For + * this baseline version, maxsize=1. i.e. only one climate + * control module is supported. + * @return {RemoteControlCapabilities} + */ + + + setClimateControlCapabilities(capabilities) { + this.validateType(ClimateControlCapabilities, capabilities, true); + this.setParameter(RemoteControlCapabilities.KEY_CLIMATE_CONTROL_CAPABILITIES, capabilities); + return this; + } + /** + * @return {ClimateControlCapabilities[]} + */ + + + getClimateControlCapabilities() { + return this.getObject(ClimateControlCapabilities, RemoteControlCapabilities.KEY_CLIMATE_CONTROL_CAPABILITIES); + } + /** + * @param {RadioControlCapabilities[]} capabilities - If included, the platform supports RC radio controls.For this + * baseline version, maxsize=1. i.e. only one radio control + * module is supported. + * @return {RemoteControlCapabilities} + */ + + + setRadioControlCapabilities(capabilities) { + this.validateType(RadioControlCapabilities, capabilities, true); + this.setParameter(RemoteControlCapabilities.KEY_RADIO_CONTROL_CAPABILITIES, capabilities); + return this; + } + /** + * @return {RadioControlCapabilities[]} + */ + + + getRadioControlCapabilities() { + return this.getObject(RadioControlCapabilities, RemoteControlCapabilities.KEY_RADIO_CONTROL_CAPABILITIES); + } + /** + * @param {ButtonCapabilities[]} capabilities - If included, the platform supports RC button controls with the + * included button names. + * @return {RemoteControlCapabilities} + */ + + + setButtonCapabilities(capabilities) { + this.validateType(ButtonCapabilities, capabilities, true); + this.setParameter(RemoteControlCapabilities.KEY_BUTTON_CAPABILITIES, capabilities); + return this; + } + /** + * @return {ButtonCapabilities[]} + */ + + + getButtonCapabilities() { + return this.getObject(ButtonCapabilities, RemoteControlCapabilities.KEY_BUTTON_CAPABILITIES); + } + /** + * @param {AudioControlCapabilities[]} capabilities - If included, the platform supports audio controls. + * @return {RemoteControlCapabilities} + */ + + + setAudioControlCapabilities(capabilities) { + this.validateType(AudioControlCapabilities, capabilities, true); + this.setParameter(RemoteControlCapabilities.KEY_AUDIO_CONTROL_CAPABILITIES, capabilities); + return this; + } + /** + * @return {AudioControlCapabilities[]} + */ + + + getAudioControlCapabilities() { + return this.getObject(AudioControlCapabilities, RemoteControlCapabilities.KEY_AUDIO_CONTROL_CAPABILITIES); + } + /** + * @param {HMISettingsControlCapabilities} capabilities - If included, the platform supports hmi setting controls. + * @return {RemoteControlCapabilities} + */ + + + setHmiSettingsControlCapabilities(capabilities) { + this.validateType(HMISettingsControlCapabilities, capabilities); + this.setParameter(RemoteControlCapabilities.KEY_HMI_SETTINGS_CONTROL_CAPABILITIES, capabilities); + return this; + } + /** + * @return {HMISettingsControlCapabilities} + */ + + + getHmiSettingsControlCapabilities() { + return this.getObject(HMISettingsControlCapabilities, RemoteControlCapabilities.KEY_HMI_SETTINGS_CONTROL_CAPABILITIES); + } + /** + * @param {LightControlCapabilities} capabilities - If included, the platform supports light controls. + * @return {RemoteControlCapabilities} + */ + + + setLightControlCapabilities(capabilities) { + this.validateType(LightControlCapabilities, capabilities); + this.setParameter(RemoteControlCapabilities.KEY_LIGHT_CONTROL_CAPABILITIES, capabilities); + return this; + } + /** + * @return {LightControlCapabilities} + */ + + + getLightControlCapabilities() { + return this.getObject(LightControlCapabilities, RemoteControlCapabilities.KEY_LIGHT_CONTROL_CAPABILITIES); + } + /** + * @param {SeatControlCapabilities[]} capabilities - If included, the platform supports seat controls. + * @return {RemoteControlCapabilities} + */ + + + setSeatControlCapabilities(capabilities) { + this.validateType(SeatControlCapabilities, capabilities, true); + this.setParameter(RemoteControlCapabilities.KEY_SEAT_CONTROL_CAPABILITIES, capabilities); + return this; + } + /** + * @return {SeatControlCapabilities[]} + */ + + + getSeatControlCapabilities() { + return this.getObject(SeatControlCapabilities, RemoteControlCapabilities.KEY_SEAT_CONTROL_CAPABILITIES); + } + + } + + RemoteControlCapabilities.KEY_CLIMATE_CONTROL_CAPABILITIES = 'climateControlCapabilities'; + RemoteControlCapabilities.KEY_RADIO_CONTROL_CAPABILITIES = 'radioControlCapabilities'; + RemoteControlCapabilities.KEY_BUTTON_CAPABILITIES = 'buttonCapabilities'; + RemoteControlCapabilities.KEY_AUDIO_CONTROL_CAPABILITIES = 'audioControlCapabilities'; + RemoteControlCapabilities.KEY_HMI_SETTINGS_CONTROL_CAPABILITIES = 'hmiSettingsControlCapabilities'; + RemoteControlCapabilities.KEY_LIGHT_CONTROL_CAPABILITIES = 'lightControlCapabilities'; + RemoteControlCapabilities.KEY_SEAT_CONTROL_CAPABILITIES = 'seatControlCapabilities'; + + /* eslint-disable camelcase */ + /** + * Contains information about the locations of each seat + */ + + class SeatLocationCapability extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} rows + * @return {SeatLocationCapability} + */ + + + setRows(rows) { + this.setParameter(SeatLocationCapability.KEY_ROWS, rows); + return this; + } + /** + * @return {Number} + */ + + + getRows() { + return this.getParameter(SeatLocationCapability.KEY_ROWS); + } + /** + * @param {Number} columns + * @return {SeatLocationCapability} + */ + + + setColumns(columns) { + this.setParameter(SeatLocationCapability.KEY_COLUMNS, columns); + return this; + } + /** + * @return {Number} + */ + + + getColumns() { + return this.getParameter(SeatLocationCapability.KEY_COLUMNS); + } + /** + * @param {Number} levels + * @return {SeatLocationCapability} + */ + + + setLevels(levels) { + this.setParameter(SeatLocationCapability.KEY_LEVELS, levels); + return this; + } + /** + * @return {Number} + */ + + + getLevels() { + return this.getParameter(SeatLocationCapability.KEY_LEVELS); + } + /** + * @param {SeatLocation[]} seats - Contains a list of SeatLocation in the vehicle + * @return {SeatLocationCapability} + */ + + + setSeats(seats) { + this.validateType(SeatLocation, seats, true); + this.setParameter(SeatLocationCapability.KEY_SEATS, seats); + return this; + } + /** + * @return {SeatLocation[]} + */ + + + getSeats() { + return this.getObject(SeatLocation, SeatLocationCapability.KEY_SEATS); + } + + } + + SeatLocationCapability.KEY_ROWS = 'rows'; + SeatLocationCapability.KEY_COLUMNS = 'columns'; + SeatLocationCapability.KEY_LEVELS = 'levels'; + SeatLocationCapability.KEY_SEATS = 'seats'; + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} ServiceUpdateReason + * @property {Object} _MAP + */ + + class ServiceUpdateReason extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * The service has just been published with the module and once activated to the primary service of its type, it + * will be ready for possible consumption. + * @return {String} + */ + + + static get PUBLISHED() { + return ServiceUpdateReason._MAP.PUBLISHED; + } + /** + * The service has just been unpublished with the module and is no longer accessible + * @return {String} + */ + + + static get REMOVED() { + return ServiceUpdateReason._MAP.REMOVED; + } + /** + * The service is activated as the primary service of this type. All requests dealing with this service type will + * be handled by this service. + * @return {String} + */ + + + static get ACTIVATED() { + return ServiceUpdateReason._MAP.ACTIVATED; + } + /** + * The service has been deactivated as the primary service of its type + * @return {String} + */ + + + static get DEACTIVATED() { + return ServiceUpdateReason._MAP.DEACTIVATED; + } + /** + * The service has updated its manifest. This could imply updated capabilities + * @return {String} + */ + + + static get MANIFEST_UPDATE() { + return ServiceUpdateReason._MAP.MANIFEST_UPDATE; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return ServiceUpdateReason._valueForKey(key, ServiceUpdateReason._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return ServiceUpdateReason._keyForValue(value, ServiceUpdateReason._MAP); + } + + } + + ServiceUpdateReason._MAP = Object.freeze({ + 'PUBLISHED': 'PUBLISHED', + 'REMOVED': 'REMOVED', + 'ACTIVATED': 'ACTIVATED', + 'DEACTIVATED': 'DEACTIVATED', + 'MANIFEST_UPDATE': 'MANIFEST_UPDATE' + }); + + /* eslint-disable camelcase */ + + class NavigationServiceManifest extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Boolean} points - Informs the subscriber if this service can actually accept way points. + * @return {NavigationServiceManifest} + */ + + + setAcceptsWayPoints(points) { + this.setParameter(NavigationServiceManifest.KEY_ACCEPTS_WAY_POINTS, points); + return this; + } + /** + * @return {Boolean} + */ + + + getAcceptsWayPoints() { + return this.getParameter(NavigationServiceManifest.KEY_ACCEPTS_WAY_POINTS); + } + + } + + NavigationServiceManifest.KEY_ACCEPTS_WAY_POINTS = 'acceptsWayPoints'; + + /* eslint-disable camelcase */ + + class WeatherServiceManifest extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Boolean} supported + * @return {WeatherServiceManifest} + */ + + + setCurrentForecastSupported(supported) { + this.setParameter(WeatherServiceManifest.KEY_CURRENT_FORECAST_SUPPORTED, supported); + return this; + } + /** + * @return {Boolean} + */ + + + getCurrentForecastSupported() { + return this.getParameter(WeatherServiceManifest.KEY_CURRENT_FORECAST_SUPPORTED); + } + /** + * @param {Number} amount + * @return {WeatherServiceManifest} + */ + + + setMaxMultidayForecastAmount(amount) { + this.setParameter(WeatherServiceManifest.KEY_MAX_MULTIDAY_FORECAST_AMOUNT, amount); + return this; + } + /** + * @return {Number} + */ + + + getMaxMultidayForecastAmount() { + return this.getParameter(WeatherServiceManifest.KEY_MAX_MULTIDAY_FORECAST_AMOUNT); + } + /** + * @param {Number} amount + * @return {WeatherServiceManifest} + */ + + + setMaxHourlyForecastAmount(amount) { + this.setParameter(WeatherServiceManifest.KEY_MAX_HOURLY_FORECAST_AMOUNT, amount); + return this; + } + /** + * @return {Number} + */ + + + getMaxHourlyForecastAmount() { + return this.getParameter(WeatherServiceManifest.KEY_MAX_HOURLY_FORECAST_AMOUNT); + } + /** + * @param {Number} amount + * @return {WeatherServiceManifest} + */ + + + setMaxMinutelyForecastAmount(amount) { + this.setParameter(WeatherServiceManifest.KEY_MAX_MINUTELY_FORECAST_AMOUNT, amount); + return this; + } + /** + * @return {Number} + */ + + + getMaxMinutelyForecastAmount() { + return this.getParameter(WeatherServiceManifest.KEY_MAX_MINUTELY_FORECAST_AMOUNT); + } + /** + * @param {Boolean} supported + * @return {WeatherServiceManifest} + */ + + + setWeatherForLocationSupported(supported) { + this.setParameter(WeatherServiceManifest.KEY_WEATHER_FOR_LOCATION_SUPPORTED, supported); + return this; + } + /** + * @return {Boolean} + */ + + + getWeatherForLocationSupported() { + return this.getParameter(WeatherServiceManifest.KEY_WEATHER_FOR_LOCATION_SUPPORTED); + } + + } + + WeatherServiceManifest.KEY_CURRENT_FORECAST_SUPPORTED = 'currentForecastSupported'; + WeatherServiceManifest.KEY_MAX_MULTIDAY_FORECAST_AMOUNT = 'maxMultidayForecastAmount'; + WeatherServiceManifest.KEY_MAX_HOURLY_FORECAST_AMOUNT = 'maxHourlyForecastAmount'; + WeatherServiceManifest.KEY_MAX_MINUTELY_FORECAST_AMOUNT = 'maxMinutelyForecastAmount'; + WeatherServiceManifest.KEY_WEATHER_FOR_LOCATION_SUPPORTED = 'weatherForLocationSupported'; + + /* eslint-disable camelcase */ + + class MediaServiceManifest extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + + } + + /* eslint-disable camelcase */ + /** + * This manifest contains all the information necessary for the service to be published, activated, and consumers able + * to interact with it + */ + + class AppServiceManifest extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} name - Unique name of this service + * @return {AppServiceManifest} + */ + + + setServiceName(name) { + this.setParameter(AppServiceManifest.KEY_SERVICE_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getServiceName() { + return this.getParameter(AppServiceManifest.KEY_SERVICE_NAME); + } + /** + * @param {String} type - The type of service that is to be offered by this app. See AppServiceType for known enum + * equivalent types. Parameter is a string to allow for new service types to be used by apps + * on older versions of SDL Core. + * @return {AppServiceManifest} + */ + + + setServiceType(type) { + this.setParameter(AppServiceManifest.KEY_SERVICE_TYPE, type); + return this; + } + /** + * @return {String} + */ + + + getServiceType() { + return this.getParameter(AppServiceManifest.KEY_SERVICE_TYPE); + } + /** + * @param {Image} icon - The icon to be associated with this service. Most likely the same as the appIcon. + * @return {AppServiceManifest} + */ + + + setServiceIcon(icon) { + this.validateType(Image, icon); + this.setParameter(AppServiceManifest.KEY_SERVICE_ICON, icon); + return this; + } + /** + * @return {Image} + */ + + + getServiceIcon() { + return this.getObject(Image, AppServiceManifest.KEY_SERVICE_ICON); + } + /** + * @param {Boolean} consumers - If true, app service consumers beyond the IVI system will be able to access this + * service. If false, only the IVI system will be able consume the service. If not + * provided, it is assumed to be false. + * @return {AppServiceManifest} + */ + + + setAllowAppConsumers(consumers) { + this.setParameter(AppServiceManifest.KEY_ALLOW_APP_CONSUMERS, consumers); + return this; + } + /** + * @return {Boolean} + */ + + + getAllowAppConsumers() { + return this.getParameter(AppServiceManifest.KEY_ALLOW_APP_CONSUMERS); + } + /** + * @param {SdlMsgVersion} version - This is the max RPC Spec version the app service understands. This is important + * during the RPC passthrough functionality. If not included, it is assumed the max + * version of the module is acceptable. + * @return {AppServiceManifest} + */ + + + setRpcSpecVersion(version) { + this.validateType(SdlMsgVersion, version); + this.setParameter(AppServiceManifest.KEY_RPC_SPEC_VERSION, version); + return this; + } + /** + * @return {SdlMsgVersion} + */ + + + getRpcSpecVersion() { + return this.getObject(SdlMsgVersion, AppServiceManifest.KEY_RPC_SPEC_VERSION); + } + /** + * @param {Number[]} cs - This field contains the Function IDs for the RPCs that this service intends to handle + * correctly. This means the service will provide meaningful responses. + * @return {AppServiceManifest} + */ + + + setHandledRPCs(cs) { + this.setParameter(AppServiceManifest.KEY_HANDLED_RPCS, cs); + return this; + } + /** + * @return {Number[]} + */ + + + getHandledRPCs() { + return this.getParameter(AppServiceManifest.KEY_HANDLED_RPCS); + } + /** + * @param {MediaServiceManifest} manifest + * @return {AppServiceManifest} + */ + + + setMediaServiceManifest(manifest) { + this.validateType(MediaServiceManifest, manifest); + this.setParameter(AppServiceManifest.KEY_MEDIA_SERVICE_MANIFEST, manifest); + return this; + } + /** + * @return {MediaServiceManifest} + */ + + + getMediaServiceManifest() { + return this.getObject(MediaServiceManifest, AppServiceManifest.KEY_MEDIA_SERVICE_MANIFEST); + } + /** + * @param {WeatherServiceManifest} manifest + * @return {AppServiceManifest} + */ + + + setWeatherServiceManifest(manifest) { + this.validateType(WeatherServiceManifest, manifest); + this.setParameter(AppServiceManifest.KEY_WEATHER_SERVICE_MANIFEST, manifest); + return this; + } + /** + * @return {WeatherServiceManifest} + */ + + + getWeatherServiceManifest() { + return this.getObject(WeatherServiceManifest, AppServiceManifest.KEY_WEATHER_SERVICE_MANIFEST); + } + /** + * @param {NavigationServiceManifest} manifest + * @return {AppServiceManifest} + */ + + + setNavigationServiceManifest(manifest) { + this.validateType(NavigationServiceManifest, manifest); + this.setParameter(AppServiceManifest.KEY_NAVIGATION_SERVICE_MANIFEST, manifest); + return this; + } + /** + * @return {NavigationServiceManifest} + */ + + + getNavigationServiceManifest() { + return this.getObject(NavigationServiceManifest, AppServiceManifest.KEY_NAVIGATION_SERVICE_MANIFEST); + } + + } + + AppServiceManifest.KEY_SERVICE_NAME = 'serviceName'; + AppServiceManifest.KEY_SERVICE_TYPE = 'serviceType'; + AppServiceManifest.KEY_SERVICE_ICON = 'serviceIcon'; + AppServiceManifest.KEY_ALLOW_APP_CONSUMERS = 'allowAppConsumers'; + AppServiceManifest.KEY_RPC_SPEC_VERSION = 'rpcSpecVersion'; + AppServiceManifest.KEY_HANDLED_RPCS = 'handledRPCs'; + AppServiceManifest.KEY_MEDIA_SERVICE_MANIFEST = 'mediaServiceManifest'; + AppServiceManifest.KEY_WEATHER_SERVICE_MANIFEST = 'weatherServiceManifest'; + AppServiceManifest.KEY_NAVIGATION_SERVICE_MANIFEST = 'navigationServiceManifest'; + + /* eslint-disable camelcase */ + /** + * This is the record of an app service publisher that the module has. It should contain the most up to date + * information including the service's active state + */ + + class AppServiceRecord extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} id - A unique ID tied to this specific service record. The ID is supplied by the module that + * services publish themselves. + * @return {AppServiceRecord} + */ + + + setServiceID(id) { + this.setParameter(AppServiceRecord.KEY_SERVICE_ID, id); + return this; + } + /** + * @return {String} + */ + + + getServiceID() { + return this.getParameter(AppServiceRecord.KEY_SERVICE_ID); + } + /** + * @param {AppServiceManifest} manifest - Manifest for the service that this record is for. + * @return {AppServiceRecord} + */ + + + setServiceManifest(manifest) { + this.validateType(AppServiceManifest, manifest); + this.setParameter(AppServiceRecord.KEY_SERVICE_MANIFEST, manifest); + return this; + } + /** + * @return {AppServiceManifest} + */ + + + getServiceManifest() { + return this.getObject(AppServiceManifest, AppServiceRecord.KEY_SERVICE_MANIFEST); + } + /** + * @param {Boolean} published - If true, the service is published and available. If false, the service has likely + * just been unpublished, and should be considered unavailable. + * @return {AppServiceRecord} + */ + + + setServicePublished(published) { + this.setParameter(AppServiceRecord.KEY_SERVICE_PUBLISHED, published); + return this; + } + /** + * @return {Boolean} + */ + + + getServicePublished() { + return this.getParameter(AppServiceRecord.KEY_SERVICE_PUBLISHED); + } + /** + * @param {Boolean} active - If true, the service is the active primary service of the supplied service type. It + * will receive all potential RPCs that are passed through to that service type. If false, + * it is not the primary service of the supplied type. See servicePublished for its + * availability. + * @return {AppServiceRecord} + */ + + + setServiceActive(active) { + this.setParameter(AppServiceRecord.KEY_SERVICE_ACTIVE, active); + return this; + } + /** + * @return {Boolean} + */ + + + getServiceActive() { + return this.getParameter(AppServiceRecord.KEY_SERVICE_ACTIVE); + } + + } + + AppServiceRecord.KEY_SERVICE_ID = 'serviceID'; + AppServiceRecord.KEY_SERVICE_MANIFEST = 'serviceManifest'; + AppServiceRecord.KEY_SERVICE_PUBLISHED = 'servicePublished'; + AppServiceRecord.KEY_SERVICE_ACTIVE = 'serviceActive'; + + /* eslint-disable camelcase */ + + class AppServiceCapability extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {ServiceUpdateReason} reason - Only included in OnSystemCapabilityUpdated. Update reason for service + * record. + * @return {AppServiceCapability} + */ + + + setUpdateReason(reason) { + this.validateType(ServiceUpdateReason, reason); + this.setParameter(AppServiceCapability.KEY_UPDATE_REASON, reason); + return this; + } + /** + * @return {ServiceUpdateReason} + */ + + + getUpdateReason() { + return this.getObject(ServiceUpdateReason, AppServiceCapability.KEY_UPDATE_REASON); + } + /** + * @param {AppServiceRecord} record - Service record for a specific app service provider + * @return {AppServiceCapability} + */ + + + setUpdatedAppServiceRecord(record) { + this.validateType(AppServiceRecord, record); + this.setParameter(AppServiceCapability.KEY_UPDATED_APP_SERVICE_RECORD, record); + return this; + } + /** + * @return {AppServiceRecord} + */ + + + getUpdatedAppServiceRecord() { + return this.getObject(AppServiceRecord, AppServiceCapability.KEY_UPDATED_APP_SERVICE_RECORD); + } + + } + + AppServiceCapability.KEY_UPDATE_REASON = 'updateReason'; + AppServiceCapability.KEY_UPDATED_APP_SERVICE_RECORD = 'updatedAppServiceRecord'; + + /* eslint-disable camelcase */ + /** + * Capabilities of app services including what service types are supported and the current state of services. + */ + + class AppServicesCapabilities extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {AppServiceCapability[]} services - An array of currently available services. If this is an update to the + * capability the affected services will include an update reason in that + * item + * @return {AppServicesCapabilities} + */ + + + setAppServices(services) { + this.validateType(AppServiceCapability, services, true); + this.setParameter(AppServicesCapabilities.KEY_APP_SERVICES, services); + return this; + } + /** + * @return {AppServiceCapability[]} + */ + + + getAppServices() { + return this.getObject(AppServiceCapability, AppServicesCapabilities.KEY_APP_SERVICES); + } + + } + + AppServicesCapabilities.KEY_APP_SERVICES = 'appServices'; + + /* eslint-disable camelcase */ + /** + * Extended capabilities for an onboard navigation system + */ + + class NavigationCapability extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Boolean} enabled - If the module has the ability to add locations to the onboard nav + * @return {NavigationCapability} + */ + + + setSendLocationEnabled(enabled) { + this.setParameter(NavigationCapability.KEY_SEND_LOCATION_ENABLED, enabled); + return this; + } + /** + * @return {Boolean} + */ + + + getSendLocationEnabled() { + return this.getParameter(NavigationCapability.KEY_SEND_LOCATION_ENABLED); + } + /** + * @param {Boolean} enabled - If the module has the ability to return way points from onboard nav + * @return {NavigationCapability} + */ + + + setGetWayPointsEnabled(enabled) { + this.setParameter(NavigationCapability.KEY_GET_WAY_POINTS_ENABLED, enabled); + return this; + } + /** + * @return {Boolean} + */ + + + getGetWayPointsEnabled() { + return this.getParameter(NavigationCapability.KEY_GET_WAY_POINTS_ENABLED); + } + + } + + NavigationCapability.KEY_SEND_LOCATION_ENABLED = 'sendLocationEnabled'; + NavigationCapability.KEY_GET_WAY_POINTS_ENABLED = 'getWayPointsEnabled'; + + /* eslint-disable camelcase */ + /** + * The systemCapabilityType identifies which data object exists in this struct. For example, if the SystemCapability + * Type is NAVIGATION then a "navigationCapability" should exist + */ + + class SystemCapability extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {SystemCapabilityType} type - Used as a descriptor of what data to expect in this struct. The + * corresponding param to this enum should be included and the only other param + * included. + * @return {SystemCapability} + */ + + + setSystemCapabilityType(type) { + this.validateType(SystemCapabilityType, type); + this.setParameter(SystemCapability.KEY_SYSTEM_CAPABILITY_TYPE, type); + return this; + } + /** + * @return {SystemCapabilityType} + */ + + + getSystemCapabilityType() { + return this.getObject(SystemCapabilityType, SystemCapability.KEY_SYSTEM_CAPABILITY_TYPE); + } + /** + * @param {NavigationCapability} capability - Describes extended capabilities for onboard navigation system + * @return {SystemCapability} + */ + + + setNavigationCapability(capability) { + this.validateType(NavigationCapability, capability); + this.setParameter(SystemCapability.KEY_NAVIGATION_CAPABILITY, capability); + return this; + } + /** + * @return {NavigationCapability} + */ + + + getNavigationCapability() { + return this.getObject(NavigationCapability, SystemCapability.KEY_NAVIGATION_CAPABILITY); + } + /** + * @param {PhoneCapability} capability - Describes extended capabilities of the module's phone feature + * @return {SystemCapability} + */ + + + setPhoneCapability(capability) { + this.validateType(PhoneCapability, capability); + this.setParameter(SystemCapability.KEY_PHONE_CAPABILITY, capability); + return this; + } + /** + * @return {PhoneCapability} + */ + + + getPhoneCapability() { + return this.getObject(PhoneCapability, SystemCapability.KEY_PHONE_CAPABILITY); + } + /** + * @param {VideoStreamingCapability} capability - Describes extended capabilities of the module's phone feature + * @return {SystemCapability} + */ + + + setVideoStreamingCapability(capability) { + this.validateType(VideoStreamingCapability, capability); + this.setParameter(SystemCapability.KEY_VIDEO_STREAMING_CAPABILITY, capability); + return this; + } + /** + * @return {VideoStreamingCapability} + */ + + + getVideoStreamingCapability() { + return this.getObject(VideoStreamingCapability, SystemCapability.KEY_VIDEO_STREAMING_CAPABILITY); + } + /** + * @param {RemoteControlCapabilities} capability - Describes extended capabilities of the module's phone feature + * @return {SystemCapability} + */ + + + setRemoteControlCapability(capability) { + this.validateType(RemoteControlCapabilities, capability); + this.setParameter(SystemCapability.KEY_REMOTE_CONTROL_CAPABILITY, capability); + return this; + } + /** + * @return {RemoteControlCapabilities} + */ + + + getRemoteControlCapability() { + return this.getObject(RemoteControlCapabilities, SystemCapability.KEY_REMOTE_CONTROL_CAPABILITY); + } + /** + * @param {AppServicesCapabilities} capabilities - An array of currently available services. If this is an update to + * the capability the affected services will include an update + * reason in that item + * @return {SystemCapability} + */ + + + setAppServicesCapabilities(capabilities) { + this.validateType(AppServicesCapabilities, capabilities); + this.setParameter(SystemCapability.KEY_APP_SERVICES_CAPABILITIES, capabilities); + return this; + } + /** + * @return {AppServicesCapabilities} + */ + + + getAppServicesCapabilities() { + return this.getObject(AppServicesCapabilities, SystemCapability.KEY_APP_SERVICES_CAPABILITIES); + } + /** + * @param {SeatLocationCapability} capability - Contains information about the locations of each seat + * @return {SystemCapability} + */ + + + setSeatLocationCapability(capability) { + this.validateType(SeatLocationCapability, capability); + this.setParameter(SystemCapability.KEY_SEAT_LOCATION_CAPABILITY, capability); + return this; + } + /** + * @return {SeatLocationCapability} + */ + + + getSeatLocationCapability() { + return this.getObject(SeatLocationCapability, SystemCapability.KEY_SEAT_LOCATION_CAPABILITY); + } + /** + * @param {DisplayCapability[]} capabilities + * @return {SystemCapability} + */ + + + setDisplayCapabilities(capabilities) { + this.validateType(DisplayCapability, capabilities, true); + this.setParameter(SystemCapability.KEY_DISPLAY_CAPABILITIES, capabilities); + return this; + } + /** + * @return {DisplayCapability[]} + */ + + + getDisplayCapabilities() { + return this.getObject(DisplayCapability, SystemCapability.KEY_DISPLAY_CAPABILITIES); + } + + } + + SystemCapability.KEY_SYSTEM_CAPABILITY_TYPE = 'systemCapabilityType'; + SystemCapability.KEY_NAVIGATION_CAPABILITY = 'navigationCapability'; + SystemCapability.KEY_PHONE_CAPABILITY = 'phoneCapability'; + SystemCapability.KEY_VIDEO_STREAMING_CAPABILITY = 'videoStreamingCapability'; + SystemCapability.KEY_REMOTE_CONTROL_CAPABILITY = 'remoteControlCapability'; + SystemCapability.KEY_APP_SERVICES_CAPABILITIES = 'appServicesCapabilities'; + SystemCapability.KEY_SEAT_LOCATION_CAPABILITY = 'seatLocationCapability'; + SystemCapability.KEY_DISPLAY_CAPABILITIES = 'displayCapabilities'; + + /* eslint-disable camelcase */ + + class GetSystemCapabilityResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetSystemCapability); + } + /** + * @param {SystemCapability} capability - The systemCapabilityType identifies which data object exists in this + * struct. For example, if the SystemCapability Type is NAVIGATION then a + * "navigationCapability" should exist + * @return {GetSystemCapabilityResponse} + */ + + + setSystemCapability(capability) { + this.validateType(SystemCapability, capability); + this.setParameter(GetSystemCapabilityResponse.KEY_SYSTEM_CAPABILITY, capability); + return this; + } + /** + * @return {SystemCapability} + */ + + + getSystemCapability() { + return this.getObject(SystemCapability, GetSystemCapabilityResponse.KEY_SYSTEM_CAPABILITY); + } + + } + + GetSystemCapabilityResponse.KEY_SYSTEM_CAPABILITY = 'systemCapability'; + + /* eslint-disable camelcase */ + + class Rectangle extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} x - The upper left X-coordinate of the rectangle + * @return {Rectangle} + */ + + + setX(x) { + this.setParameter(Rectangle.KEY_X, x); + return this; + } + /** + * @return {Number} + */ + + + getX() { + return this.getParameter(Rectangle.KEY_X); + } + /** + * @param {Number} y - The upper left Y-coordinate of the rectangle + * @return {Rectangle} + */ + + + setY(y) { + this.setParameter(Rectangle.KEY_Y, y); + return this; + } + /** + * @return {Number} + */ + + + getY() { + return this.getParameter(Rectangle.KEY_Y); + } + /** + * @param {Number} width - The width of the rectangle + * @return {Rectangle} + */ + + + setWidth(width) { + this.setParameter(Rectangle.KEY_WIDTH, width); + return this; + } + /** + * @return {Number} + */ + + + getWidth() { + return this.getParameter(Rectangle.KEY_WIDTH); + } + /** + * @param {Number} height - The height of the rectangle + * @return {Rectangle} + */ + + + setHeight(height) { + this.setParameter(Rectangle.KEY_HEIGHT, height); + return this; + } + /** + * @return {Number} + */ + + + getHeight() { + return this.getParameter(Rectangle.KEY_HEIGHT); + } + + } + + Rectangle.KEY_X = 'x'; + Rectangle.KEY_Y = 'y'; + Rectangle.KEY_WIDTH = 'width'; + Rectangle.KEY_HEIGHT = 'height'; + + /* eslint-disable camelcase */ + /** + * Defines haptic data for each user control object for video streaming application + */ + + class HapticRect extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} id - A user control spatial identifier + * @return {HapticRect} + */ + + + setId(id) { + this.setParameter(HapticRect.KEY_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getId() { + return this.getParameter(HapticRect.KEY_ID); + } + /** + * @param {Rectangle} rect - The position of the haptic rectangle to be highlighted. The center of this rectangle + * will be "touched" when a press occurs. + * @return {HapticRect} + */ + + + setRect(rect) { + this.validateType(Rectangle, rect); + this.setParameter(HapticRect.KEY_RECT, rect); + return this; + } + /** + * @return {Rectangle} + */ + + + getRect() { + return this.getObject(Rectangle, HapticRect.KEY_RECT); + } + + } + + HapticRect.KEY_ID = 'id'; + HapticRect.KEY_RECT = 'rect'; + + /* eslint-disable camelcase */ + /** + * Send the spatial data gathered from SDLCarWindow or VirtualDisplayEncoder to the HMI. This data will be utilized by + * the HMI to determine how and when haptic events should occur + */ + + class SendHapticData extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SendHapticData); + } + /** + * @param {HapticRect[]} data - Array of spatial data structures that represent the locations of all user controls + * present on the HMI. This data should be updated if/when the application presents a + * new screen. When a request is sent, if successful, it will replace all spatial data + * previously sent through RPC. If an empty array is sent, the existing spatial data + * will be cleared + * @return {SendHapticData} + */ + + + setHapticRectData(data) { + this.validateType(HapticRect, data, true); + this.setParameter(SendHapticData.KEY_HAPTIC_RECT_DATA, data); + return this; + } + /** + * @return {HapticRect[]} + */ + + + getHapticRectData() { + return this.getObject(HapticRect, SendHapticData.KEY_HAPTIC_RECT_DATA); + } + + } + + SendHapticData.KEY_HAPTIC_RECT_DATA = 'hapticRectData'; + + /* eslint-disable camelcase */ + + class SendHapticDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SendHapticData); + } + + } + + /* eslint-disable camelcase */ + /** + * Enumeration for the user's preference of which app type to use when both are available + * @typedef {Enum} HybridAppPreference + * @property {Object} _MAP + */ + + class HybridAppPreference extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get MOBILE() { + return HybridAppPreference._MAP.MOBILE; + } + /** + * @return {String} + */ + + + static get CLOUD() { + return HybridAppPreference._MAP.CLOUD; + } + /** + * @return {String} + */ + + + static get BOTH() { + return HybridAppPreference._MAP.BOTH; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return HybridAppPreference._valueForKey(key, HybridAppPreference._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return HybridAppPreference._keyForValue(value, HybridAppPreference._MAP); + } + + } + + HybridAppPreference._MAP = Object.freeze({ + 'MOBILE': 'MOBILE', + 'CLOUD': 'CLOUD', + 'BOTH': 'BOTH' + }); + + /* eslint-disable camelcase */ + + class CloudAppProperties extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String[]} nicknames - An array of app names a cloud app is allowed to register with. If included in a + * SetCloudAppProperties request, this value will overwrite the existing "nicknames" + * field in the app policies section of the policy table. + * @return {CloudAppProperties} + */ + + + setNicknames(nicknames) { + this.setParameter(CloudAppProperties.KEY_NICKNAMES, nicknames); + return this; + } + /** + * @return {String[]} + */ + + + getNicknames() { + return this.getParameter(CloudAppProperties.KEY_NICKNAMES); + } + /** + * @param {String} id + * @return {CloudAppProperties} + */ + + + setAppID(id) { + this.setParameter(CloudAppProperties.KEY_APP_ID, id); + return this; + } + /** + * @return {String} + */ + + + getAppID() { + return this.getParameter(CloudAppProperties.KEY_APP_ID); + } + /** + * @param {Boolean} enabled - If true, cloud app will be included in HMI RPC UpdateAppList + * @return {CloudAppProperties} + */ + + + setEnabled(enabled) { + this.setParameter(CloudAppProperties.KEY_ENABLED, enabled); + return this; + } + /** + * @return {Boolean} + */ + + + getEnabled() { + return this.getParameter(CloudAppProperties.KEY_ENABLED); + } + /** + * @param {String} token - Used to authenticate websocket connection on app activation + * @return {CloudAppProperties} + */ + + + setAuthToken(token) { + this.setParameter(CloudAppProperties.KEY_AUTH_TOKEN, token); + return this; + } + /** + * @return {String} + */ + + + getAuthToken() { + return this.getParameter(CloudAppProperties.KEY_AUTH_TOKEN); + } + /** + * @param {String} type - Specifies the connection type Core should use + * @return {CloudAppProperties} + */ + + + setCloudTransportType(type) { + this.setParameter(CloudAppProperties.KEY_CLOUD_TRANSPORT_TYPE, type); + return this; + } + /** + * @return {String} + */ + + + getCloudTransportType() { + return this.getParameter(CloudAppProperties.KEY_CLOUD_TRANSPORT_TYPE); + } + /** + * @param {HybridAppPreference} preference - Specifies the user preference to use the cloud app version or mobile + * app version when both are available + * @return {CloudAppProperties} + */ + + + setHybridAppPreference(preference) { + this.validateType(HybridAppPreference, preference); + this.setParameter(CloudAppProperties.KEY_HYBRID_APP_PREFERENCE, preference); + return this; + } + /** + * @return {HybridAppPreference} + */ + + + getHybridAppPreference() { + return this.getObject(HybridAppPreference, CloudAppProperties.KEY_HYBRID_APP_PREFERENCE); + } + /** + * @param {String} endpoint - Specifies the endpoint which Core will attempt to connect to when this app is selected + * @return {CloudAppProperties} + */ + + + setEndpoint(endpoint) { + this.setParameter(CloudAppProperties.KEY_ENDPOINT, endpoint); + return this; + } + /** + * @return {String} + */ + + + getEndpoint() { + return this.getParameter(CloudAppProperties.KEY_ENDPOINT); + } + + } + + CloudAppProperties.KEY_NICKNAMES = 'nicknames'; + CloudAppProperties.KEY_APP_ID = 'appID'; + CloudAppProperties.KEY_ENABLED = 'enabled'; + CloudAppProperties.KEY_AUTH_TOKEN = 'authToken'; + CloudAppProperties.KEY_CLOUD_TRANSPORT_TYPE = 'cloudTransportType'; + CloudAppProperties.KEY_HYBRID_APP_PREFERENCE = 'hybridAppPreference'; + CloudAppProperties.KEY_ENDPOINT = 'endpoint'; + + /* eslint-disable camelcase */ + /** + * RPC used to enable/disable a cloud application and set its cloud-related policy properties + */ + + class SetCloudAppProperties extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SetCloudAppProperties); + } + /** + * @param {CloudAppProperties} properties - The new cloud application properties + * @return {SetCloudAppProperties} + */ + + + setProperties(properties) { + this.validateType(CloudAppProperties, properties); + this.setParameter(SetCloudAppProperties.KEY_PROPERTIES, properties); + return this; + } + /** + * @return {CloudAppProperties} + */ + + + getProperties() { + return this.getObject(CloudAppProperties, SetCloudAppProperties.KEY_PROPERTIES); + } + + } + + SetCloudAppProperties.KEY_PROPERTIES = 'properties'; + + /* eslint-disable camelcase */ + /** + * The response to SetCloudAppProperties + */ + + class SetCloudAppPropertiesResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.SetCloudAppProperties); + } + + } + + /* eslint-disable camelcase */ + /** + * RPC used to get the current properties of a cloud application + */ + + class GetCloudAppProperties extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetCloudAppProperties); + } + /** + * @param {String} id + * @return {GetCloudAppProperties} + */ + + + setAppID(id) { + this.setParameter(GetCloudAppProperties.KEY_APP_ID, id); + return this; + } + /** + * @return {String} + */ + + + getAppID() { + return this.getParameter(GetCloudAppProperties.KEY_APP_ID); + } + + } + + GetCloudAppProperties.KEY_APP_ID = 'appID'; + + /* eslint-disable camelcase */ + /** + * The response to GetCloudAppProperties + */ + + class GetCloudAppPropertiesResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetCloudAppProperties); + } + /** + * @param {CloudAppProperties} properties - The requested cloud application properties + * @return {GetCloudAppPropertiesResponse} + */ + + + setProperties(properties) { + this.validateType(CloudAppProperties, properties); + this.setParameter(GetCloudAppPropertiesResponse.KEY_PROPERTIES, properties); + return this; + } + /** + * @return {CloudAppProperties} + */ + + + getProperties() { + return this.getObject(CloudAppProperties, GetCloudAppPropertiesResponse.KEY_PROPERTIES); + } + + } + + GetCloudAppPropertiesResponse.KEY_PROPERTIES = 'properties'; + + /* eslint-disable camelcase */ + /** + * Registers a service offered by this app on the module. Subsequent calls with the same service type will update the + * manifest for that service. + */ + + class PublishAppService extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.PublishAppService); + } + /** + * @param {AppServiceManifest} manifest - The manifest of the service that wishes to be published. If already + * published, the updated manifest for this service. + * @return {PublishAppService} + */ + + + setAppServiceManifest(manifest) { + this.validateType(AppServiceManifest, manifest); + this.setParameter(PublishAppService.KEY_APP_SERVICE_MANIFEST, manifest); + return this; + } + /** + * @return {AppServiceManifest} + */ + + + getAppServiceManifest() { + return this.getObject(AppServiceManifest, PublishAppService.KEY_APP_SERVICE_MANIFEST); + } + + } + + PublishAppService.KEY_APP_SERVICE_MANIFEST = 'appServiceManifest'; + + /* eslint-disable camelcase */ + /** + * Response to the request to register a service offered by this app on the module + */ + + class PublishAppServiceResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.PublishAppService); + } + /** + * @param {AppServiceRecord} record - If the request was successful, this object will be the current status of the + * service record for the published service. This will include the Core supplied + * service ID. + * @return {PublishAppServiceResponse} + */ + + + setAppServiceRecord(record) { + this.validateType(AppServiceRecord, record); + this.setParameter(PublishAppServiceResponse.KEY_APP_SERVICE_RECORD, record); + return this; + } + /** + * @return {AppServiceRecord} + */ + + + getAppServiceRecord() { + return this.getObject(AppServiceRecord, PublishAppServiceResponse.KEY_APP_SERVICE_RECORD); + } + + } + + PublishAppServiceResponse.KEY_APP_SERVICE_RECORD = 'appServiceRecord'; + + /* eslint-disable camelcase */ + /** + * Unpublish an existing service published by this application. + */ + + class UnpublishAppService extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.UnpublishAppService); + } + /** + * @param {String} id - The ID of the service to be unpublished. + * @return {UnpublishAppService} + */ + + + setServiceID(id) { + this.setParameter(UnpublishAppService.KEY_SERVICE_ID, id); + return this; + } + /** + * @return {String} + */ + + + getServiceID() { + return this.getParameter(UnpublishAppService.KEY_SERVICE_ID); + } + + } + + UnpublishAppService.KEY_SERVICE_ID = 'serviceID'; + + /* eslint-disable camelcase */ + /** + * The response to UnpublishAppService + */ + + class UnpublishAppServiceResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.UnpublishAppService); + } + + } + + /* eslint-disable camelcase */ + /** + * This request asks the module for current data related to the specific service. It also includes an option to + * subscribe to that service for future updates + */ + + class GetAppServiceData extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetAppServiceData); + } + /** + * @param {String} type - The type of service that is to be offered by this app. See AppServiceType for known enum + * equivalent types. Parameter is a string to allow for new service types to be used by apps + * on older versions of SDL Core. + * @return {GetAppServiceData} + */ + + + setServiceType(type) { + this.setParameter(GetAppServiceData.KEY_SERVICE_TYPE, type); + return this; + } + /** + * @return {String} + */ + + + getServiceType() { + return this.getParameter(GetAppServiceData.KEY_SERVICE_TYPE); + } + /** + * @param {Boolean} subscribe - If true, the consumer is requesting to subscribe to all future updates from the + * service publisher. If false, the consumer doesn't wish to subscribe and should be + * unsubscribed if it was previously subscribed. + * @return {GetAppServiceData} + */ + + + setSubscribe(subscribe) { + this.setParameter(GetAppServiceData.KEY_SUBSCRIBE, subscribe); + return this; + } + /** + * @return {Boolean} + */ + + + getSubscribe() { + return this.getParameter(GetAppServiceData.KEY_SUBSCRIBE); + } + + } + + GetAppServiceData.KEY_SERVICE_TYPE = 'serviceType'; + GetAppServiceData.KEY_SUBSCRIBE = 'subscribe'; + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} NavigationJunction + * @property {Object} _MAP + */ + + class NavigationJunction extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * A junction that represents a standard intersection with a single road crossing another. + * @return {String} + */ + + + static get REGULAR() { + return NavigationJunction._MAP.REGULAR; + } + /** + * A junction where the road splits off into two paths; a fork in the road. + * @return {String} + */ + + + static get BIFURCATION() { + return NavigationJunction._MAP.BIFURCATION; + } + /** + * A junction that has multiple intersections and paths. + * @return {String} + */ + + + static get MULTI_CARRIAGEWAY() { + return NavigationJunction._MAP.MULTI_CARRIAGEWAY; + } + /** + * A junction where traffic moves in a single direction around a central, non-traversable point to reach one of + * the connecting roads. + * @return {String} + */ + + + static get ROUNDABOUT() { + return NavigationJunction._MAP.ROUNDABOUT; + } + /** + * Similar to a roundabout, however the center of the roundabout is fully traversable. Also known as a mini- + * roundabout. + * @return {String} + */ + + + static get TRAVERSABLE_ROUNDABOUT() { + return NavigationJunction._MAP.TRAVERSABLE_ROUNDABOUT; + } + /** + * A junction where lefts diverge to the right, then curve to the left, converting a left turn to a crossing + * maneuver. + * @return {String} + */ + + + static get JUGHANDLE() { + return NavigationJunction._MAP.JUGHANDLE; + } + /** + * Multiple way intersection that allows traffic to flow based on priority; most commonly right of way and first + * in, first out. + * @return {String} + */ + + + static get ALL_WAY_YIELD() { + return NavigationJunction._MAP.ALL_WAY_YIELD; + } + /** + * A junction designated for traffic turn arounds. + * @return {String} + */ + + + static get TURN_AROUND() { + return NavigationJunction._MAP.TURN_AROUND; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return NavigationJunction._valueForKey(key, NavigationJunction._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return NavigationJunction._keyForValue(value, NavigationJunction._MAP); + } + + } + + NavigationJunction._MAP = Object.freeze({ + 'REGULAR': 'REGULAR', + 'BIFURCATION': 'BIFURCATION', + 'MULTI_CARRIAGEWAY': 'MULTI_CARRIAGEWAY', + 'ROUNDABOUT': 'ROUNDABOUT', + 'TRAVERSABLE_ROUNDABOUT': 'TRAVERSABLE_ROUNDABOUT', + 'JUGHANDLE': 'JUGHANDLE', + 'ALL_WAY_YIELD': 'ALL_WAY_YIELD', + 'TURN_AROUND': 'TURN_AROUND' + }); + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} Direction + * @property {Object} _MAP + */ + + class Direction extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get LEFT() { + return Direction._MAP.LEFT; + } + /** + * @return {String} + */ + + + static get RIGHT() { + return Direction._MAP.RIGHT; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return Direction._valueForKey(key, Direction._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return Direction._keyForValue(value, Direction._MAP); + } + + } + + Direction._MAP = Object.freeze({ + 'LEFT': 'LEFT', + 'RIGHT': 'RIGHT' + }); + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} NavigationAction + * @property {Object} _MAP + */ + + class NavigationAction extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * Using this action plus a supplied direction can give the type of turn. + * @return {String} + */ + + + static get TURN() { + return NavigationAction._MAP.TURN; + } + /** + * @return {String} + */ + + + static get EXIT() { + return NavigationAction._MAP.EXIT; + } + /** + * @return {String} + */ + + + static get STAY() { + return NavigationAction._MAP.STAY; + } + /** + * @return {String} + */ + + + static get MERGE() { + return NavigationAction._MAP.MERGE; + } + /** + * @return {String} + */ + + + static get FERRY() { + return NavigationAction._MAP.FERRY; + } + /** + * @return {String} + */ + + + static get CAR_SHUTTLE_TRAIN() { + return NavigationAction._MAP.CAR_SHUTTLE_TRAIN; + } + /** + * @return {String} + */ + + + static get WAYPOINT() { + return NavigationAction._MAP.WAYPOINT; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return NavigationAction._valueForKey(key, NavigationAction._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return NavigationAction._keyForValue(value, NavigationAction._MAP); + } + + } + + NavigationAction._MAP = Object.freeze({ + 'TURN': 'TURN', + 'EXIT': 'EXIT', + 'STAY': 'STAY', + 'MERGE': 'MERGE', + 'FERRY': 'FERRY', + 'CAR_SHUTTLE_TRAIN': 'CAR_SHUTTLE_TRAIN', + 'WAYPOINT': 'WAYPOINT' + }); + + /* eslint-disable camelcase */ + + class NavigationInstruction extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {LocationDetails} details + * @return {NavigationInstruction} + */ + + + setLocationDetails(details) { + this.validateType(LocationDetails, details); + this.setParameter(NavigationInstruction.KEY_LOCATION_DETAILS, details); + return this; + } + /** + * @return {LocationDetails} + */ + + + getLocationDetails() { + return this.getObject(LocationDetails, NavigationInstruction.KEY_LOCATION_DETAILS); + } + /** + * @param {NavigationAction} action + * @return {NavigationInstruction} + */ + + + setAction(action) { + this.validateType(NavigationAction, action); + this.setParameter(NavigationInstruction.KEY_ACTION, action); + return this; + } + /** + * @return {NavigationAction} + */ + + + getAction() { + return this.getObject(NavigationAction, NavigationInstruction.KEY_ACTION); + } + /** + * @param {DateTime} eta + * @return {NavigationInstruction} + */ + + + setEta(eta) { + this.validateType(DateTime, eta); + this.setParameter(NavigationInstruction.KEY_ETA, eta); + return this; + } + /** + * @return {DateTime} + */ + + + getEta() { + return this.getObject(DateTime, NavigationInstruction.KEY_ETA); + } + /** + * @param {Number} bearing - The angle at which this instruction takes place. For example, 0 would mean straight, + * less than 45 is bearing right, greater than 135 is sharp right, between 45 and 135 is a + * regular right, and 180 is a U-Turn, etc. + * @return {NavigationInstruction} + */ + + + setBearing(bearing) { + this.setParameter(NavigationInstruction.KEY_BEARING, bearing); + return this; + } + /** + * @return {Number} + */ + + + getBearing() { + return this.getParameter(NavigationInstruction.KEY_BEARING); + } + /** + * @param {NavigationJunction} type + * @return {NavigationInstruction} + */ + + + setJunctionType(type) { + this.validateType(NavigationJunction, type); + this.setParameter(NavigationInstruction.KEY_JUNCTION_TYPE, type); + return this; + } + /** + * @return {NavigationJunction} + */ + + + getJunctionType() { + return this.getObject(NavigationJunction, NavigationInstruction.KEY_JUNCTION_TYPE); + } + /** + * @param {Direction} side - Used to infer which side of the road this instruction takes place. For a U-Turn + * (action=TURN, bearing=180) this will determine which direction the turn should take + * place. + * @return {NavigationInstruction} + */ + + + setDrivingSide(side) { + this.validateType(Direction, side); + this.setParameter(NavigationInstruction.KEY_DRIVING_SIDE, side); + return this; + } + /** + * @return {Direction} + */ + + + getDrivingSide() { + return this.getObject(Direction, NavigationInstruction.KEY_DRIVING_SIDE); + } + /** + * @param {String} details - This is a string representation of this instruction, used to display instructions to + * the users. This is not intended to be read aloud to the users, see the param prompt in + * NavigationServiceData for that. + * @return {NavigationInstruction} + */ + + + setDetails(details) { + this.setParameter(NavigationInstruction.KEY_DETAILS, details); + return this; + } + /** + * @return {String} + */ + + + getDetails() { + return this.getParameter(NavigationInstruction.KEY_DETAILS); + } + /** + * @param {Image} image - An image representation of this instruction. + * @return {NavigationInstruction} + */ + + + setImage(image) { + this.validateType(Image, image); + this.setParameter(NavigationInstruction.KEY_IMAGE, image); + return this; + } + /** + * @return {Image} + */ + + + getImage() { + return this.getObject(Image, NavigationInstruction.KEY_IMAGE); + } + + } + + NavigationInstruction.KEY_LOCATION_DETAILS = 'locationDetails'; + NavigationInstruction.KEY_ACTION = 'action'; + NavigationInstruction.KEY_ETA = 'eta'; + NavigationInstruction.KEY_BEARING = 'bearing'; + NavigationInstruction.KEY_JUNCTION_TYPE = 'junctionType'; + NavigationInstruction.KEY_DRIVING_SIDE = 'drivingSide'; + NavigationInstruction.KEY_DETAILS = 'details'; + NavigationInstruction.KEY_IMAGE = 'image'; + + /* eslint-disable camelcase */ + /** + * This data is related to what a navigation service would provide. + */ + + class NavigationServiceData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {DateTime} stamp - This is the timestamp of when the data was generated. This is to ensure any time or + * distance given in the data can accurately be adjusted if necessary. + * @return {NavigationServiceData} + */ + + + setTimeStamp(stamp) { + this.validateType(DateTime, stamp); + this.setParameter(NavigationServiceData.KEY_TIME_STAMP, stamp); + return this; + } + /** + * @return {DateTime} + */ + + + getTimeStamp() { + return this.getObject(DateTime, NavigationServiceData.KEY_TIME_STAMP); + } + /** + * @param {LocationDetails} origin + * @return {NavigationServiceData} + */ + + + setOrigin(origin) { + this.validateType(LocationDetails, origin); + this.setParameter(NavigationServiceData.KEY_ORIGIN, origin); + return this; + } + /** + * @return {LocationDetails} + */ + + + getOrigin() { + return this.getObject(LocationDetails, NavigationServiceData.KEY_ORIGIN); + } + /** + * @param {LocationDetails} destination + * @return {NavigationServiceData} + */ + + + setDestination(destination) { + this.validateType(LocationDetails, destination); + this.setParameter(NavigationServiceData.KEY_DESTINATION, destination); + return this; + } + /** + * @return {LocationDetails} + */ + + + getDestination() { + return this.getObject(LocationDetails, NavigationServiceData.KEY_DESTINATION); + } + /** + * @param {DateTime} eta + * @return {NavigationServiceData} + */ + + + setDestinationETA(eta) { + this.validateType(DateTime, eta); + this.setParameter(NavigationServiceData.KEY_DESTINATION_ETA, eta); + return this; + } + /** + * @return {DateTime} + */ + + + getDestinationETA() { + return this.getObject(DateTime, NavigationServiceData.KEY_DESTINATION_ETA); + } + /** + * @param {NavigationInstruction[]} instructions - This array should be ordered with all remaining instructions. The + * start of this array should always contain the next instruction. + * @return {NavigationServiceData} + */ + + + setInstructions(instructions) { + this.validateType(NavigationInstruction, instructions, true); + this.setParameter(NavigationServiceData.KEY_INSTRUCTIONS, instructions); + return this; + } + /** + * @return {NavigationInstruction[]} + */ + + + getInstructions() { + return this.getObject(NavigationInstruction, NavigationServiceData.KEY_INSTRUCTIONS); + } + /** + * @param {DateTime} eta + * @return {NavigationServiceData} + */ + + + setNextInstructionETA(eta) { + this.validateType(DateTime, eta); + this.setParameter(NavigationServiceData.KEY_NEXT_INSTRUCTION_ETA, eta); + return this; + } + /** + * @return {DateTime} + */ + + + getNextInstructionETA() { + return this.getObject(DateTime, NavigationServiceData.KEY_NEXT_INSTRUCTION_ETA); + } + /** + * @param {Number} distance - The distance to this instruction from current location. This should only be updated + * ever .1 unit of distance. For more accuracy the consumer can use the GPS location of + * itself and the next instruction. + * @return {NavigationServiceData} + */ + + + setNextInstructionDistance(distance) { + this.setParameter(NavigationServiceData.KEY_NEXT_INSTRUCTION_DISTANCE, distance); + return this; + } + /** + * @return {Number} + */ + + + getNextInstructionDistance() { + return this.getParameter(NavigationServiceData.KEY_NEXT_INSTRUCTION_DISTANCE); + } + /** + * @param {Number} scale - Distance till next maneuver (starting from) from previous maneuver. + * @return {NavigationServiceData} + */ + + + setNextInstructionDistanceScale(scale) { + this.setParameter(NavigationServiceData.KEY_NEXT_INSTRUCTION_DISTANCE_SCALE, scale); + return this; + } + /** + * @return {Number} + */ + + + getNextInstructionDistanceScale() { + return this.getParameter(NavigationServiceData.KEY_NEXT_INSTRUCTION_DISTANCE_SCALE); + } + /** + * @param {String} prompt - This is a prompt message that should be conveyed to the user through either display or + * voice (TTS). This param will change often as it should represent the following: + * approaching instruction, post instruction, alerts that affect the current navigation + * session, etc. + * @return {NavigationServiceData} + */ + + + setPrompt(prompt) { + this.setParameter(NavigationServiceData.KEY_PROMPT, prompt); + return this; + } + /** + * @return {String} + */ + + + getPrompt() { + return this.getParameter(NavigationServiceData.KEY_PROMPT); + } + + } + + NavigationServiceData.KEY_TIME_STAMP = 'timeStamp'; + NavigationServiceData.KEY_ORIGIN = 'origin'; + NavigationServiceData.KEY_DESTINATION = 'destination'; + NavigationServiceData.KEY_DESTINATION_ETA = 'destinationETA'; + NavigationServiceData.KEY_INSTRUCTIONS = 'instructions'; + NavigationServiceData.KEY_NEXT_INSTRUCTION_ETA = 'nextInstructionETA'; + NavigationServiceData.KEY_NEXT_INSTRUCTION_DISTANCE = 'nextInstructionDistance'; + NavigationServiceData.KEY_NEXT_INSTRUCTION_DISTANCE_SCALE = 'nextInstructionDistanceScale'; + NavigationServiceData.KEY_PROMPT = 'prompt'; + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} MediaType + * @property {Object} _MAP + */ + + class MediaType extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get MUSIC() { + return MediaType._MAP.MUSIC; + } + /** + * @return {String} + */ + + + static get PODCAST() { + return MediaType._MAP.PODCAST; + } + /** + * @return {String} + */ + + + static get AUDIOBOOK() { + return MediaType._MAP.AUDIOBOOK; + } + /** + * @return {String} + */ + + + static get OTHER() { + return MediaType._MAP.OTHER; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return MediaType._valueForKey(key, MediaType._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return MediaType._keyForValue(value, MediaType._MAP); + } + + } + + MediaType._MAP = Object.freeze({ + 'MUSIC': 'MUSIC', + 'PODCAST': 'PODCAST', + 'AUDIOBOOK': 'AUDIOBOOK', + 'OTHER': 'OTHER' + }); + + /* eslint-disable camelcase */ + /** + * This data is related to what a media service should provide + */ + + class MediaServiceData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {MediaType} type - The type of the currently playing or paused track. + * @return {MediaServiceData} + */ + + + setMediaType(type) { + this.validateType(MediaType, type); + this.setParameter(MediaServiceData.KEY_MEDIA_TYPE, type); + return this; + } + /** + * @return {MediaType} + */ + + + getMediaType() { + return this.getObject(MediaType, MediaServiceData.KEY_MEDIA_TYPE); + } + /** + * @param {String} title - Music: The name of the current track Podcast: The name of the current episode Audiobook: + * The name of the current chapter + * @return {MediaServiceData} + */ + + + setMediaTitle(title) { + this.setParameter(MediaServiceData.KEY_MEDIA_TITLE, title); + return this; + } + /** + * @return {String} + */ + + + getMediaTitle() { + return this.getParameter(MediaServiceData.KEY_MEDIA_TITLE); + } + /** + * @param {String} artist - Music: The name of the current album artist Podcast: The provider of the podcast (hosts, + * network, company) Audiobook: The book author's name + * @return {MediaServiceData} + */ + + + setMediaArtist(artist) { + this.setParameter(MediaServiceData.KEY_MEDIA_ARTIST, artist); + return this; + } + /** + * @return {String} + */ + + + getMediaArtist() { + return this.getParameter(MediaServiceData.KEY_MEDIA_ARTIST); + } + /** + * @param {String} album - Music: The name of the current album Podcast: The name of the current podcast show + * Audiobook: The name of the current book + * @return {MediaServiceData} + */ + + + setMediaAlbum(album) { + this.setParameter(MediaServiceData.KEY_MEDIA_ALBUM, album); + return this; + } + /** + * @return {String} + */ + + + getMediaAlbum() { + return this.getParameter(MediaServiceData.KEY_MEDIA_ALBUM); + } + /** + * @param {String} name - Music: The name of the playlist or radio station, if the user is playing from a playlist, + * otherwise, Null Podcast: The name of the playlist, if the user is playing from a playlist, + * otherwise, Null Audiobook: Likely not applicable, possibly a collection or "playlist" of + * books + * @return {MediaServiceData} + */ + + + setPlaylistName(name) { + this.setParameter(MediaServiceData.KEY_PLAYLIST_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getPlaylistName() { + return this.getParameter(MediaServiceData.KEY_PLAYLIST_NAME); + } + /** + * @param {Boolean} explicit - Whether or not the content currently playing (e.g. the track, episode, or book) + * contains explicit content + * @return {MediaServiceData} + */ + + + setIsExplicit(explicit) { + this.setParameter(MediaServiceData.KEY_IS_EXPLICIT, explicit); + return this; + } + /** + * @return {Boolean} + */ + + + getIsExplicit() { + return this.getParameter(MediaServiceData.KEY_IS_EXPLICIT); + } + /** + * @param {Number} progress - Music: The current progress of the track in seconds Podcast: The current progress of + * the episode in seconds Audiobook: The current progress of the current segment (e.g. + * the chapter) in seconds + * @return {MediaServiceData} + */ + + + setTrackPlaybackProgress(progress) { + this.setParameter(MediaServiceData.KEY_TRACK_PLAYBACK_PROGRESS, progress); + return this; + } + /** + * @return {Number} + */ + + + getTrackPlaybackProgress() { + return this.getParameter(MediaServiceData.KEY_TRACK_PLAYBACK_PROGRESS); + } + /** + * @param {Number} duration - Music: The total duration of the track in seconds Podcast: The total duration of the + * episode in seconds Audiobook: The total duration of the current segment (e.g. the + * chapter) in seconds + * @return {MediaServiceData} + */ + + + setTrackPlaybackDuration(duration) { + this.setParameter(MediaServiceData.KEY_TRACK_PLAYBACK_DURATION, duration); + return this; + } + /** + * @return {Number} + */ + + + getTrackPlaybackDuration() { + return this.getParameter(MediaServiceData.KEY_TRACK_PLAYBACK_DURATION); + } + /** + * @param {Number} progress - Music: The current progress of the playback queue in seconds Podcast: The current + * progress of the playback queue in seconds Audiobook: The current progress of the + * playback queue (e.g. the book) in seconds + * @return {MediaServiceData} + */ + + + setQueuePlaybackProgress(progress) { + this.setParameter(MediaServiceData.KEY_QUEUE_PLAYBACK_PROGRESS, progress); + return this; + } + /** + * @return {Number} + */ + + + getQueuePlaybackProgress() { + return this.getParameter(MediaServiceData.KEY_QUEUE_PLAYBACK_PROGRESS); + } + /** + * @param {Number} duration - Music: The total duration of the playback queue in seconds Podcast: The total duration + * of the playback queue in seconds Audiobook: The total duration of the playback queue + * (e.g. the book) in seconds + * @return {MediaServiceData} + */ + + + setQueuePlaybackDuration(duration) { + this.setParameter(MediaServiceData.KEY_QUEUE_PLAYBACK_DURATION, duration); + return this; + } + /** + * @return {Number} + */ + + + getQueuePlaybackDuration() { + return this.getParameter(MediaServiceData.KEY_QUEUE_PLAYBACK_DURATION); + } + /** + * @param {Number} number - Music: The current number (1 based) of the track in the playback queue Podcast: The + * current number (1 based) of the episode in the playback queue Audiobook: The current + * number (1 based) of the episode in the playback queue (e.g. the chapter number in the + * book) + * @return {MediaServiceData} + */ + + + setQueueCurrentTrackNumber(number) { + this.setParameter(MediaServiceData.KEY_QUEUE_CURRENT_TRACK_NUMBER, number); + return this; + } + /** + * @return {Number} + */ + + + getQueueCurrentTrackNumber() { + return this.getParameter(MediaServiceData.KEY_QUEUE_CURRENT_TRACK_NUMBER); + } + /** + * @param {Number} count - Music: The total number of tracks in the playback queue Podcast: The total number of + * episodes in the playback queue Audiobook: The total number of sections in the playback + * queue (e.g. the number of chapters in the book) + * @return {MediaServiceData} + */ + + + setQueueTotalTrackCount(count) { + this.setParameter(MediaServiceData.KEY_QUEUE_TOTAL_TRACK_COUNT, count); + return this; + } + /** + * @return {Number} + */ + + + getQueueTotalTrackCount() { + return this.getParameter(MediaServiceData.KEY_QUEUE_TOTAL_TRACK_COUNT); + } + /** + * @param {Image} image - Music: The album art of the current track Podcast: The podcast or chapter artwork of the + * current podcast episode Audiobook: The book or chapter artwork of the current audiobook + * @return {MediaServiceData} + */ + + + setMediaImage(image) { + this.validateType(Image, image); + this.setParameter(MediaServiceData.KEY_MEDIA_IMAGE, image); + return this; + } + /** + * @return {Image} + */ + + + getMediaImage() { + return this.getObject(Image, MediaServiceData.KEY_MEDIA_IMAGE); + } + + } + + MediaServiceData.KEY_MEDIA_TYPE = 'mediaType'; + MediaServiceData.KEY_MEDIA_TITLE = 'mediaTitle'; + MediaServiceData.KEY_MEDIA_ARTIST = 'mediaArtist'; + MediaServiceData.KEY_MEDIA_ALBUM = 'mediaAlbum'; + MediaServiceData.KEY_PLAYLIST_NAME = 'playlistName'; + MediaServiceData.KEY_IS_EXPLICIT = 'isExplicit'; + MediaServiceData.KEY_TRACK_PLAYBACK_PROGRESS = 'trackPlaybackProgress'; + MediaServiceData.KEY_TRACK_PLAYBACK_DURATION = 'trackPlaybackDuration'; + MediaServiceData.KEY_QUEUE_PLAYBACK_PROGRESS = 'queuePlaybackProgress'; + MediaServiceData.KEY_QUEUE_PLAYBACK_DURATION = 'queuePlaybackDuration'; + MediaServiceData.KEY_QUEUE_CURRENT_TRACK_NUMBER = 'queueCurrentTrackNumber'; + MediaServiceData.KEY_QUEUE_TOTAL_TRACK_COUNT = 'queueTotalTrackCount'; + MediaServiceData.KEY_MEDIA_IMAGE = 'mediaImage'; + + /* eslint-disable camelcase */ + + class WeatherData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Temperature} temperature + * @return {WeatherData} + */ + + + setCurrentTemperature(temperature) { + this.validateType(Temperature, temperature); + this.setParameter(WeatherData.KEY_CURRENT_TEMPERATURE, temperature); + return this; + } + /** + * @return {Temperature} + */ + + + getCurrentTemperature() { + return this.getObject(Temperature, WeatherData.KEY_CURRENT_TEMPERATURE); + } + /** + * @param {Temperature} high + * @return {WeatherData} + */ + + + setTemperatureHigh(high) { + this.validateType(Temperature, high); + this.setParameter(WeatherData.KEY_TEMPERATURE_HIGH, high); + return this; + } + /** + * @return {Temperature} + */ + + + getTemperatureHigh() { + return this.getObject(Temperature, WeatherData.KEY_TEMPERATURE_HIGH); + } + /** + * @param {Temperature} low + * @return {WeatherData} + */ + + + setTemperatureLow(low) { + this.validateType(Temperature, low); + this.setParameter(WeatherData.KEY_TEMPERATURE_LOW, low); + return this; + } + /** + * @return {Temperature} + */ + + + getTemperatureLow() { + return this.getObject(Temperature, WeatherData.KEY_TEMPERATURE_LOW); + } + /** + * @param {Temperature} temperature + * @return {WeatherData} + */ + + + setApparentTemperature(temperature) { + this.validateType(Temperature, temperature); + this.setParameter(WeatherData.KEY_APPARENT_TEMPERATURE, temperature); + return this; + } + /** + * @return {Temperature} + */ + + + getApparentTemperature() { + return this.getObject(Temperature, WeatherData.KEY_APPARENT_TEMPERATURE); + } + /** + * @param {Temperature} high + * @return {WeatherData} + */ + + + setApparentTemperatureHigh(high) { + this.validateType(Temperature, high); + this.setParameter(WeatherData.KEY_APPARENT_TEMPERATURE_HIGH, high); + return this; + } + /** + * @return {Temperature} + */ + + + getApparentTemperatureHigh() { + return this.getObject(Temperature, WeatherData.KEY_APPARENT_TEMPERATURE_HIGH); + } + /** + * @param {Temperature} low + * @return {WeatherData} + */ + + + setApparentTemperatureLow(low) { + this.validateType(Temperature, low); + this.setParameter(WeatherData.KEY_APPARENT_TEMPERATURE_LOW, low); + return this; + } + /** + * @return {Temperature} + */ + + + getApparentTemperatureLow() { + return this.getObject(Temperature, WeatherData.KEY_APPARENT_TEMPERATURE_LOW); + } + /** + * @param {String} summary + * @return {WeatherData} + */ + + + setWeatherSummary(summary) { + this.setParameter(WeatherData.KEY_WEATHER_SUMMARY, summary); + return this; + } + /** + * @return {String} + */ + + + getWeatherSummary() { + return this.getParameter(WeatherData.KEY_WEATHER_SUMMARY); + } + /** + * @param {DateTime} time + * @return {WeatherData} + */ + + + setTime(time) { + this.validateType(DateTime, time); + this.setParameter(WeatherData.KEY_TIME, time); + return this; + } + /** + * @return {DateTime} + */ + + + getTime() { + return this.getObject(DateTime, WeatherData.KEY_TIME); + } + /** + * @param {Number} humidity - 0 to 1, percentage humidity + * @return {WeatherData} + */ + + + setHumidity(humidity) { + this.setParameter(WeatherData.KEY_HUMIDITY, humidity); + return this; + } + /** + * @return {Number} + */ + + + getHumidity() { + return this.getParameter(WeatherData.KEY_HUMIDITY); + } + /** + * @param {Number} cover - 0 to 1, percentage cloud cover + * @return {WeatherData} + */ + + + setCloudCover(cover) { + this.setParameter(WeatherData.KEY_CLOUD_COVER, cover); + return this; + } + /** + * @return {Number} + */ + + + getCloudCover() { + return this.getParameter(WeatherData.KEY_CLOUD_COVER); + } + /** + * @param {Number} phase - 0 to 1, percentage of the moon seen, e.g. 0 = no moon, 0.25 = quarter moon + * @return {WeatherData} + */ + + + setMoonPhase(phase) { + this.setParameter(WeatherData.KEY_MOON_PHASE, phase); + return this; + } + /** + * @return {Number} + */ + + + getMoonPhase() { + return this.getParameter(WeatherData.KEY_MOON_PHASE); + } + /** + * @param {Number} bearing - In degrees, true north at 0 degrees + * @return {WeatherData} + */ + + + setWindBearing(bearing) { + this.setParameter(WeatherData.KEY_WIND_BEARING, bearing); + return this; + } + /** + * @return {Number} + */ + + + getWindBearing() { + return this.getParameter(WeatherData.KEY_WIND_BEARING); + } + /** + * @param {Number} gust - km/hr + * @return {WeatherData} + */ + + + setWindGust(gust) { + this.setParameter(WeatherData.KEY_WIND_GUST, gust); + return this; + } + /** + * @return {Number} + */ + + + getWindGust() { + return this.getParameter(WeatherData.KEY_WIND_GUST); + } + /** + * @param {Number} speed - km/hr + * @return {WeatherData} + */ + + + setWindSpeed(speed) { + this.setParameter(WeatherData.KEY_WIND_SPEED, speed); + return this; + } + /** + * @return {Number} + */ + + + getWindSpeed() { + return this.getParameter(WeatherData.KEY_WIND_SPEED); + } + /** + * @param {Number} bearing - In degrees, true north at 0 degrees + * @return {WeatherData} + */ + + + setNearestStormBearing(bearing) { + this.setParameter(WeatherData.KEY_NEAREST_STORM_BEARING, bearing); + return this; + } + /** + * @return {Number} + */ + + + getNearestStormBearing() { + return this.getParameter(WeatherData.KEY_NEAREST_STORM_BEARING); + } + /** + * @param {Number} distance - In km + * @return {WeatherData} + */ + + + setNearestStormDistance(distance) { + this.setParameter(WeatherData.KEY_NEAREST_STORM_DISTANCE, distance); + return this; + } + /** + * @return {Number} + */ + + + getNearestStormDistance() { + return this.getParameter(WeatherData.KEY_NEAREST_STORM_DISTANCE); + } + /** + * @param {Number} accumulation - cm + * @return {WeatherData} + */ + + + setPrecipAccumulation(accumulation) { + this.setParameter(WeatherData.KEY_PRECIP_ACCUMULATION, accumulation); + return this; + } + /** + * @return {Number} + */ + + + getPrecipAccumulation() { + return this.getParameter(WeatherData.KEY_PRECIP_ACCUMULATION); + } + /** + * @param {Number} intensity - cm of water per hour + * @return {WeatherData} + */ + + + setPrecipIntensity(intensity) { + this.setParameter(WeatherData.KEY_PRECIP_INTENSITY, intensity); + return this; + } + /** + * @return {Number} + */ + + + getPrecipIntensity() { + return this.getParameter(WeatherData.KEY_PRECIP_INTENSITY); + } + /** + * @param {Number} probability - 0 to 1, percentage chance + * @return {WeatherData} + */ + + + setPrecipProbability(probability) { + this.setParameter(WeatherData.KEY_PRECIP_PROBABILITY, probability); + return this; + } + /** + * @return {Number} + */ + + + getPrecipProbability() { + return this.getParameter(WeatherData.KEY_PRECIP_PROBABILITY); + } + /** + * @param {String} type - e.g. "rain", "snow", "sleet", "hail" + * @return {WeatherData} + */ + + + setPrecipType(type) { + this.setParameter(WeatherData.KEY_PRECIP_TYPE, type); + return this; + } + /** + * @return {String} + */ + + + getPrecipType() { + return this.getParameter(WeatherData.KEY_PRECIP_TYPE); + } + /** + * @param {Number} visibility - In km + * @return {WeatherData} + */ + + + setVisibility(visibility) { + this.setParameter(WeatherData.KEY_VISIBILITY, visibility); + return this; + } + /** + * @return {Number} + */ + + + getVisibility() { + return this.getParameter(WeatherData.KEY_VISIBILITY); + } + /** + * @param {Image} icon + * @return {WeatherData} + */ + + + setWeatherIcon(icon) { + this.validateType(Image, icon); + this.setParameter(WeatherData.KEY_WEATHER_ICON, icon); + return this; + } + /** + * @return {Image} + */ + + + getWeatherIcon() { + return this.getObject(Image, WeatherData.KEY_WEATHER_ICON); + } + + } + + WeatherData.KEY_CURRENT_TEMPERATURE = 'currentTemperature'; + WeatherData.KEY_TEMPERATURE_HIGH = 'temperatureHigh'; + WeatherData.KEY_TEMPERATURE_LOW = 'temperatureLow'; + WeatherData.KEY_APPARENT_TEMPERATURE = 'apparentTemperature'; + WeatherData.KEY_APPARENT_TEMPERATURE_HIGH = 'apparentTemperatureHigh'; + WeatherData.KEY_APPARENT_TEMPERATURE_LOW = 'apparentTemperatureLow'; + WeatherData.KEY_WEATHER_SUMMARY = 'weatherSummary'; + WeatherData.KEY_TIME = 'time'; + WeatherData.KEY_HUMIDITY = 'humidity'; + WeatherData.KEY_CLOUD_COVER = 'cloudCover'; + WeatherData.KEY_MOON_PHASE = 'moonPhase'; + WeatherData.KEY_WIND_BEARING = 'windBearing'; + WeatherData.KEY_WIND_GUST = 'windGust'; + WeatherData.KEY_WIND_SPEED = 'windSpeed'; + WeatherData.KEY_NEAREST_STORM_BEARING = 'nearestStormBearing'; + WeatherData.KEY_NEAREST_STORM_DISTANCE = 'nearestStormDistance'; + WeatherData.KEY_PRECIP_ACCUMULATION = 'precipAccumulation'; + WeatherData.KEY_PRECIP_INTENSITY = 'precipIntensity'; + WeatherData.KEY_PRECIP_PROBABILITY = 'precipProbability'; + WeatherData.KEY_PRECIP_TYPE = 'precipType'; + WeatherData.KEY_VISIBILITY = 'visibility'; + WeatherData.KEY_WEATHER_ICON = 'weatherIcon'; + + /* eslint-disable camelcase */ + + class WeatherAlert extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} title + * @return {WeatherAlert} + */ + + + setTitle(title) { + this.setParameter(WeatherAlert.KEY_TITLE, title); + return this; + } + /** + * @return {String} + */ + + + getTitle() { + return this.getParameter(WeatherAlert.KEY_TITLE); + } + /** + * @param {String} summary + * @return {WeatherAlert} + */ + + + setSummary(summary) { + this.setParameter(WeatherAlert.KEY_SUMMARY, summary); + return this; + } + /** + * @return {String} + */ + + + getSummary() { + return this.getParameter(WeatherAlert.KEY_SUMMARY); + } + /** + * @param {DateTime} expires + * @return {WeatherAlert} + */ + + + setExpires(expires) { + this.validateType(DateTime, expires); + this.setParameter(WeatherAlert.KEY_EXPIRES, expires); + return this; + } + /** + * @return {DateTime} + */ + + + getExpires() { + return this.getObject(DateTime, WeatherAlert.KEY_EXPIRES); + } + /** + * @param {String[]} regions + * @return {WeatherAlert} + */ + + + setRegions(regions) { + this.setParameter(WeatherAlert.KEY_REGIONS, regions); + return this; + } + /** + * @return {String[]} + */ + + + getRegions() { + return this.getParameter(WeatherAlert.KEY_REGIONS); + } + /** + * @param {String} severity + * @return {WeatherAlert} + */ + + + setSeverity(severity) { + this.setParameter(WeatherAlert.KEY_SEVERITY, severity); + return this; + } + /** + * @return {String} + */ + + + getSeverity() { + return this.getParameter(WeatherAlert.KEY_SEVERITY); + } + /** + * @param {DateTime} issued + * @return {WeatherAlert} + */ + + + setTimeIssued(issued) { + this.validateType(DateTime, issued); + this.setParameter(WeatherAlert.KEY_TIME_ISSUED, issued); + return this; + } + /** + * @return {DateTime} + */ + + + getTimeIssued() { + return this.getObject(DateTime, WeatherAlert.KEY_TIME_ISSUED); + } + + } + + WeatherAlert.KEY_TITLE = 'title'; + WeatherAlert.KEY_SUMMARY = 'summary'; + WeatherAlert.KEY_EXPIRES = 'expires'; + WeatherAlert.KEY_REGIONS = 'regions'; + WeatherAlert.KEY_SEVERITY = 'severity'; + WeatherAlert.KEY_TIME_ISSUED = 'timeIssued'; + + /* eslint-disable camelcase */ + /** + * This data is related to what a weather service would provide + */ + + class WeatherServiceData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {LocationDetails} location + * @return {WeatherServiceData} + */ + + + setLocation(location) { + this.validateType(LocationDetails, location); + this.setParameter(WeatherServiceData.KEY_LOCATION, location); + return this; + } + /** + * @return {LocationDetails} + */ + + + getLocation() { + return this.getObject(LocationDetails, WeatherServiceData.KEY_LOCATION); + } + /** + * @param {WeatherData} forecast + * @return {WeatherServiceData} + */ + + + setCurrentForecast(forecast) { + this.validateType(WeatherData, forecast); + this.setParameter(WeatherServiceData.KEY_CURRENT_FORECAST, forecast); + return this; + } + /** + * @return {WeatherData} + */ + + + getCurrentForecast() { + return this.getObject(WeatherData, WeatherServiceData.KEY_CURRENT_FORECAST); + } + /** + * @param {WeatherData[]} forecast + * @return {WeatherServiceData} + */ + + + setMinuteForecast(forecast) { + this.validateType(WeatherData, forecast, true); + this.setParameter(WeatherServiceData.KEY_MINUTE_FORECAST, forecast); + return this; + } + /** + * @return {WeatherData[]} + */ + + + getMinuteForecast() { + return this.getObject(WeatherData, WeatherServiceData.KEY_MINUTE_FORECAST); + } + /** + * @param {WeatherData[]} forecast + * @return {WeatherServiceData} + */ + + + setHourlyForecast(forecast) { + this.validateType(WeatherData, forecast, true); + this.setParameter(WeatherServiceData.KEY_HOURLY_FORECAST, forecast); + return this; + } + /** + * @return {WeatherData[]} + */ + + + getHourlyForecast() { + return this.getObject(WeatherData, WeatherServiceData.KEY_HOURLY_FORECAST); + } + /** + * @param {WeatherData[]} forecast + * @return {WeatherServiceData} + */ + + + setMultidayForecast(forecast) { + this.validateType(WeatherData, forecast, true); + this.setParameter(WeatherServiceData.KEY_MULTIDAY_FORECAST, forecast); + return this; + } + /** + * @return {WeatherData[]} + */ + + + getMultidayForecast() { + return this.getObject(WeatherData, WeatherServiceData.KEY_MULTIDAY_FORECAST); + } + /** + * @param {WeatherAlert[]} alerts - This array should be ordered with the first object being the current day + * @return {WeatherServiceData} + */ + + + setAlerts(alerts) { + this.validateType(WeatherAlert, alerts, true); + this.setParameter(WeatherServiceData.KEY_ALERTS, alerts); + return this; + } + /** + * @return {WeatherAlert[]} + */ + + + getAlerts() { + return this.getObject(WeatherAlert, WeatherServiceData.KEY_ALERTS); + } + + } + + WeatherServiceData.KEY_LOCATION = 'location'; + WeatherServiceData.KEY_CURRENT_FORECAST = 'currentForecast'; + WeatherServiceData.KEY_MINUTE_FORECAST = 'minuteForecast'; + WeatherServiceData.KEY_HOURLY_FORECAST = 'hourlyForecast'; + WeatherServiceData.KEY_MULTIDAY_FORECAST = 'multidayForecast'; + WeatherServiceData.KEY_ALERTS = 'alerts'; + + /* eslint-disable camelcase */ + /** + * Contains all the current data of the app service. The serviceType will link to which of the service data objects are + * included in this object (e.g. if the service type is MEDIA, the mediaServiceData param should be included). + */ + + class AppServiceData extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} type - The type of service that is to be offered by this app. See AppServiceType for known enum + * equivalent types. Parameter is a string to allow for new service types to be used by apps + * on older versions of SDL Core. + * @return {AppServiceData} + */ + + + setServiceType(type) { + this.setParameter(AppServiceData.KEY_SERVICE_TYPE, type); + return this; + } + /** + * @return {String} + */ + + + getServiceType() { + return this.getParameter(AppServiceData.KEY_SERVICE_TYPE); + } + /** + * @param {String} id + * @return {AppServiceData} + */ + + + setServiceID(id) { + this.setParameter(AppServiceData.KEY_SERVICE_ID, id); + return this; + } + /** + * @return {String} + */ + + + getServiceID() { + return this.getParameter(AppServiceData.KEY_SERVICE_ID); + } + /** + * @param {MediaServiceData} data - This data is related to what a media service should provide + * @return {AppServiceData} + */ + + + setMediaServiceData(data) { + this.validateType(MediaServiceData, data); + this.setParameter(AppServiceData.KEY_MEDIA_SERVICE_DATA, data); + return this; + } + /** + * @return {MediaServiceData} + */ + + + getMediaServiceData() { + return this.getObject(MediaServiceData, AppServiceData.KEY_MEDIA_SERVICE_DATA); + } + /** + * @param {WeatherServiceData} data - This data is related to what a weather service would provide + * @return {AppServiceData} + */ + + + setWeatherServiceData(data) { + this.validateType(WeatherServiceData, data); + this.setParameter(AppServiceData.KEY_WEATHER_SERVICE_DATA, data); + return this; + } + /** + * @return {WeatherServiceData} + */ + + + getWeatherServiceData() { + return this.getObject(WeatherServiceData, AppServiceData.KEY_WEATHER_SERVICE_DATA); + } + /** + * @param {NavigationServiceData} data - This data is related to what a navigation service would provide. + * @return {AppServiceData} + */ + + + setNavigationServiceData(data) { + this.validateType(NavigationServiceData, data); + this.setParameter(AppServiceData.KEY_NAVIGATION_SERVICE_DATA, data); + return this; + } + /** + * @return {NavigationServiceData} + */ + + + getNavigationServiceData() { + return this.getObject(NavigationServiceData, AppServiceData.KEY_NAVIGATION_SERVICE_DATA); + } + + } + + AppServiceData.KEY_SERVICE_TYPE = 'serviceType'; + AppServiceData.KEY_SERVICE_ID = 'serviceID'; + AppServiceData.KEY_MEDIA_SERVICE_DATA = 'mediaServiceData'; + AppServiceData.KEY_WEATHER_SERVICE_DATA = 'weatherServiceData'; + AppServiceData.KEY_NAVIGATION_SERVICE_DATA = 'navigationServiceData'; + + /* eslint-disable camelcase */ + /** + * This response includes the data that was requested from the specific service + */ + + class GetAppServiceDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.GetAppServiceData); + } + /** + * @param {AppServiceData} data - Contains all the current data of the app service. The serviceType will link to + * which of the service data objects are included in this object (e.g. if the service + * type is MEDIA, the mediaServiceData param should be included). + * @return {GetAppServiceDataResponse} + */ + + + setServiceData(data) { + this.validateType(AppServiceData, data); + this.setParameter(GetAppServiceDataResponse.KEY_SERVICE_DATA, data); + return this; + } + /** + * @return {AppServiceData} + */ + + + getServiceData() { + return this.getObject(AppServiceData, GetAppServiceDataResponse.KEY_SERVICE_DATA); + } + + } + + GetAppServiceDataResponse.KEY_SERVICE_DATA = 'serviceData'; + + /* eslint-disable camelcase */ + + class PerformAppServiceInteraction extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.PerformAppServiceInteraction); + } + /** + * @param {String} uri - Fully qualified URI based on a predetermined scheme provided by the app service. SDL makes + * no guarantee that this URI is correct. + * @return {PerformAppServiceInteraction} + */ + + + setServiceUri(uri) { + this.setParameter(PerformAppServiceInteraction.KEY_SERVICE_URI, uri); + return this; + } + /** + * @return {String} + */ + + + getServiceUri() { + return this.getParameter(PerformAppServiceInteraction.KEY_SERVICE_URI); + } + /** + * @param {String} id - The service ID that the app consumer wishes to send this URI. + * @return {PerformAppServiceInteraction} + */ + + + setServiceID(id) { + this.setParameter(PerformAppServiceInteraction.KEY_SERVICE_ID, id); + return this; + } + /** + * @return {String} + */ + + + getServiceID() { + return this.getParameter(PerformAppServiceInteraction.KEY_SERVICE_ID); + } + /** + * @param {String} app - This string is the appID of the app requesting the app service provider take the specific + * action. + * @return {PerformAppServiceInteraction} + */ + + + setOriginApp(app) { + this.setParameter(PerformAppServiceInteraction.KEY_ORIGIN_APP, app); + return this; + } + /** + * @return {String} + */ + + + getOriginApp() { + return this.getParameter(PerformAppServiceInteraction.KEY_ORIGIN_APP); + } + /** + * @param {Boolean} active - This flag signals the requesting consumer would like this service to become the active + * primary service of the destination's type. + * @return {PerformAppServiceInteraction} + */ + + + setRequestServiceActive(active) { + this.setParameter(PerformAppServiceInteraction.KEY_REQUEST_SERVICE_ACTIVE, active); + return this; + } + /** + * @return {Boolean} + */ + + + getRequestServiceActive() { + return this.getParameter(PerformAppServiceInteraction.KEY_REQUEST_SERVICE_ACTIVE); + } + + } + + PerformAppServiceInteraction.KEY_SERVICE_URI = 'serviceUri'; + PerformAppServiceInteraction.KEY_SERVICE_ID = 'serviceID'; + PerformAppServiceInteraction.KEY_ORIGIN_APP = 'originApp'; + PerformAppServiceInteraction.KEY_REQUEST_SERVICE_ACTIVE = 'requestServiceActive'; + + /* eslint-disable camelcase */ + + class PerformAppServiceInteractionResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.PerformAppServiceInteraction); + } + /** + * @param {String} result - The service can provide specific result strings to the consumer through this param. + * @return {PerformAppServiceInteractionResponse} + */ + + + setServiceSpecificResult(result) { + this.setParameter(PerformAppServiceInteractionResponse.KEY_SERVICE_SPECIFIC_RESULT, result); + return this; + } + /** + * @return {String} + */ + + + getServiceSpecificResult() { + return this.getParameter(PerformAppServiceInteractionResponse.KEY_SERVICE_SPECIFIC_RESULT); + } + + } + + PerformAppServiceInteractionResponse.KEY_SERVICE_SPECIFIC_RESULT = 'serviceSpecificResult'; + + /* eslint-disable camelcase */ + /** + * Close an active interaction on the HMI. + */ + + class CancelInteraction extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.CancelInteraction); + } + /** + * @param {Number} id - The ID of the specific interaction you want to dismiss. If not set, the most recent of the + * RPC type set in functionID will be dismissed. + * @return {CancelInteraction} + */ + + + setCancelID(id) { + this.setParameter(CancelInteraction.KEY_CANCEL_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getCancelID() { + return this.getParameter(CancelInteraction.KEY_CANCEL_ID); + } + /** + * @param {Number} id - The ID of the type of interaction the developer wants to dismiss. Only values 10, + * (PerformInteractionID), 12 (AlertID), 25 (ScrollableMessageID), and 26 (SliderID) are + * permitted. + * @return {CancelInteraction} + */ + + + setFunctionID(id) { + this.setParameter(CancelInteraction.KEY_FUNCTION_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getFunctionID() { + return this.getParameter(CancelInteraction.KEY_FUNCTION_ID); + } + + } + + CancelInteraction.KEY_CANCEL_ID = 'cancelID'; + CancelInteraction.KEY_FUNCTION_ID = 'functionID'; + + /* eslint-disable camelcase */ + /** + * If no applicable request can be dismissed, the result will be IGNORED. + */ + + class CancelInteractionResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.CancelInteraction); + } + + } + + /* eslint-disable camelcase */ + /** + * Request from the application to exit the foreground and enter HMI_NONE. + */ + + class CloseApplication extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.CloseApplication); + } + + } + + /* eslint-disable camelcase */ + + class CloseApplicationResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.CloseApplication); + } + + } + + /* eslint-disable camelcase */ + /** + * Enumeration that describes possible contexts an app's HMI might be in. Communicated to whichever app is in HMI FULL, + * except Alert. + * @typedef {Enum} SystemContext + * @property {Object} _MAP + */ + + class SystemContext extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * The app's persistent display (whether media/non-media/navigation) is fully visible onscreen. + * @return {String} + */ + + + static get SYSCTXT_MAIN() { + return SystemContext._MAP.SYSCTXT_MAIN; + } + /** + * The system is currently in a VR session (with whatever dedicated VR screen being overlaid onscreen). + * @return {String} + */ + + + static get SYSCTXT_VRSESSION() { + return SystemContext._MAP.SYSCTXT_VRSESSION; + } + /** + * The system is currently displaying an in-App menu onscreen. + * @return {String} + */ + + + static get SYSCTXT_MENU() { + return SystemContext._MAP.SYSCTXT_MENU; + } + /** + * The app's display HMI is currently being obscured by either a system or other app's overlay. + * @return {String} + */ + + + static get SYSCTXT_HMI_OBSCURED() { + return SystemContext._MAP.SYSCTXT_HMI_OBSCURED; + } + /** + * Broadcast only to whichever app has an alert currently being displayed. + * @return {String} + */ + + + static get SYSCTXT_ALERT() { + return SystemContext._MAP.SYSCTXT_ALERT; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return SystemContext._valueForKey(key, SystemContext._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return SystemContext._keyForValue(value, SystemContext._MAP); + } + + } + + SystemContext._MAP = Object.freeze({ + 'SYSCTXT_MAIN': 'MAIN', + 'SYSCTXT_VRSESSION': 'VRSESSION', + 'SYSCTXT_MENU': 'MENU', + 'SYSCTXT_HMI_OBSCURED': 'HMI_OBSCURED', + 'SYSCTXT_ALERT': 'ALERT' + }); + + /* + * Copyright (c) 2019, Livio, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Livio Inc. nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + + class RpcNotification extends RpcMessage { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setRPCType(RpcType.NOTIFICATION); + } + + } + + /* eslint-disable camelcase */ + /** + * Enumeration that describes possible states of audio streaming. + * @typedef {Enum} AudioStreamingState + * @property {Object} _MAP + */ + + class AudioStreamingState extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get AUDIBLE() { + return AudioStreamingState._MAP.AUDIBLE; + } + /** + * @return {String} + */ + + + static get ATTENUATED() { + return AudioStreamingState._MAP.ATTENUATED; + } + /** + * @return {String} + */ + + + static get NOT_AUDIBLE() { + return AudioStreamingState._MAP.NOT_AUDIBLE; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return AudioStreamingState._valueForKey(key, AudioStreamingState._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return AudioStreamingState._keyForValue(value, AudioStreamingState._MAP); + } + + } + + AudioStreamingState._MAP = Object.freeze({ + 'AUDIBLE': 'AUDIBLE', + 'ATTENUATED': 'ATTENUATED', + 'NOT_AUDIBLE': 'NOT_AUDIBLE' + }); + + /* eslint-disable camelcase */ + /** + * Enumeration that describes current levels of HMI. + * @typedef {Enum} HMILevel + * @property {Object} _MAP + */ + + class HMILevel extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get HMI_FULL() { + return HMILevel._MAP.HMI_FULL; + } + /** + * @return {String} + */ + + + static get HMI_LIMITED() { + return HMILevel._MAP.HMI_LIMITED; + } + /** + * @return {String} + */ + + + static get HMI_BACKGROUND() { + return HMILevel._MAP.HMI_BACKGROUND; + } + /** + * @return {String} + */ + + + static get HMI_NONE() { + return HMILevel._MAP.HMI_NONE; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return HMILevel._valueForKey(key, HMILevel._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return HMILevel._keyForValue(value, HMILevel._MAP); + } + + } + + HMILevel._MAP = Object.freeze({ + 'HMI_FULL': 'FULL', + 'HMI_LIMITED': 'LIMITED', + 'HMI_BACKGROUND': 'BACKGROUND', + 'HMI_NONE': 'NONE' + }); + + /* eslint-disable camelcase */ + /** + * Enumeration that describes possible states of video streaming. + * @typedef {Enum} VideoStreamingState + * @property {Object} _MAP + */ + + class VideoStreamingState extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get STREAMABLE() { + return VideoStreamingState._MAP.STREAMABLE; + } + /** + * @return {String} + */ + + + static get NOT_STREAMABLE() { + return VideoStreamingState._MAP.NOT_STREAMABLE; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return VideoStreamingState._valueForKey(key, VideoStreamingState._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return VideoStreamingState._keyForValue(value, VideoStreamingState._MAP); + } + + } + + VideoStreamingState._MAP = Object.freeze({ + 'STREAMABLE': 'STREAMABLE', + 'NOT_STREAMABLE': 'NOT_STREAMABLE' + }); + + /* eslint-disable camelcase */ + + class OnHMIStatus extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnHMIStatus); + } + /** + * @param {HMILevel} level - See HMILevel + * @return {OnHMIStatus} + */ + + + setHmiLevel(level) { + this.validateType(HMILevel, level); + this.setParameter(OnHMIStatus.KEY_HMI_LEVEL, level); + return this; + } + /** + * @return {HMILevel} + */ + + + getHmiLevel() { + return this.getObject(HMILevel, OnHMIStatus.KEY_HMI_LEVEL); + } + /** + * @param {AudioStreamingState} state - See AudioStreamingState + * @return {OnHMIStatus} + */ + + + setAudioStreamingState(state) { + this.validateType(AudioStreamingState, state); + this.setParameter(OnHMIStatus.KEY_AUDIO_STREAMING_STATE, state); + return this; + } + /** + * @return {AudioStreamingState} + */ + + + getAudioStreamingState() { + return this.getObject(AudioStreamingState, OnHMIStatus.KEY_AUDIO_STREAMING_STATE); + } + /** + * @param {SystemContext} context - See SystemContext + * @return {OnHMIStatus} + */ + + + setSystemContext(context) { + this.validateType(SystemContext, context); + this.setParameter(OnHMIStatus.KEY_SYSTEM_CONTEXT, context); + return this; + } + /** + * @return {SystemContext} + */ + + + getSystemContext() { + return this.getObject(SystemContext, OnHMIStatus.KEY_SYSTEM_CONTEXT); + } + /** + * @param {VideoStreamingState} state - See VideoStreamingState. If it is NOT_STREAMABLE, the app must stop + * streaming video to SDL Core(stop service). + * @return {OnHMIStatus} + */ + + + setVideoStreamingState(state) { + this.validateType(VideoStreamingState, state); + this.setParameter(OnHMIStatus.KEY_VIDEO_STREAMING_STATE, state); + return this; + } + /** + * @return {VideoStreamingState} + */ + + + getVideoStreamingState() { + return this.getObject(VideoStreamingState, OnHMIStatus.KEY_VIDEO_STREAMING_STATE); + } + /** + * @param {Number} id - This is the unique ID assigned to the window that this RPC is intended. If this param is not + * included, it will be assumed that this request is specifically for the main window on the + * main display. See PredefinedWindows enum. + * @return {OnHMIStatus} + */ + + + setWindowID(id) { + this.setParameter(OnHMIStatus.KEY_WINDOW_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getWindowID() { + return this.getParameter(OnHMIStatus.KEY_WINDOW_ID); + } + + } + + OnHMIStatus.KEY_HMI_LEVEL = 'hmiLevel'; + OnHMIStatus.KEY_AUDIO_STREAMING_STATE = 'audioStreamingState'; + OnHMIStatus.KEY_SYSTEM_CONTEXT = 'systemContext'; + OnHMIStatus.KEY_VIDEO_STREAMING_STATE = 'videoStreamingState'; + OnHMIStatus.KEY_WINDOW_ID = 'windowID'; + + /* eslint-disable camelcase */ + /** + * Error code, which comes from the module side. + * @typedef {Enum} AppInterfaceUnregisteredReason + * @property {Object} _MAP + */ + + class AppInterfaceUnregisteredReason extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get IGNITION_OFF() { + return AppInterfaceUnregisteredReason._MAP.IGNITION_OFF; + } + /** + * @return {String} + */ + + + static get BLUETOOTH_OFF() { + return AppInterfaceUnregisteredReason._MAP.BLUETOOTH_OFF; + } + /** + * @return {String} + */ + + + static get USB_DISCONNECTED() { + return AppInterfaceUnregisteredReason._MAP.USB_DISCONNECTED; + } + /** + * @return {String} + */ + + + static get REQUEST_WHILE_IN_NONE_HMI_LEVEL() { + return AppInterfaceUnregisteredReason._MAP.REQUEST_WHILE_IN_NONE_HMI_LEVEL; + } + /** + * @return {String} + */ + + + static get TOO_MANY_REQUESTS() { + return AppInterfaceUnregisteredReason._MAP.TOO_MANY_REQUESTS; + } + /** + * @return {String} + */ + + + static get DRIVER_DISTRACTION_VIOLATION() { + return AppInterfaceUnregisteredReason._MAP.DRIVER_DISTRACTION_VIOLATION; + } + /** + * @return {String} + */ + + + static get LANGUAGE_CHANGE() { + return AppInterfaceUnregisteredReason._MAP.LANGUAGE_CHANGE; + } + /** + * @return {String} + */ + + + static get MASTER_RESET() { + return AppInterfaceUnregisteredReason._MAP.MASTER_RESET; + } + /** + * @return {String} + */ + + + static get FACTORY_DEFAULTS() { + return AppInterfaceUnregisteredReason._MAP.FACTORY_DEFAULTS; + } + /** + * @return {String} + */ + + + static get APP_UNAUTHORIZED() { + return AppInterfaceUnregisteredReason._MAP.APP_UNAUTHORIZED; + } + /** + * @return {String} + */ + + + static get PROTOCOL_VIOLATION() { + return AppInterfaceUnregisteredReason._MAP.PROTOCOL_VIOLATION; + } + /** + * @return {String} + */ + + + static get UNSUPPORTED_HMI_RESOURCE() { + return AppInterfaceUnregisteredReason._MAP.UNSUPPORTED_HMI_RESOURCE; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return AppInterfaceUnregisteredReason._valueForKey(key, AppInterfaceUnregisteredReason._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return AppInterfaceUnregisteredReason._keyForValue(value, AppInterfaceUnregisteredReason._MAP); + } + + } + + AppInterfaceUnregisteredReason._MAP = Object.freeze({ + 'IGNITION_OFF': 'IGNITION_OFF', + 'BLUETOOTH_OFF': 'BLUETOOTH_OFF', + 'USB_DISCONNECTED': 'USB_DISCONNECTED', + 'REQUEST_WHILE_IN_NONE_HMI_LEVEL': 'REQUEST_WHILE_IN_NONE_HMI_LEVEL', + 'TOO_MANY_REQUESTS': 'TOO_MANY_REQUESTS', + 'DRIVER_DISTRACTION_VIOLATION': 'DRIVER_DISTRACTION_VIOLATION', + 'LANGUAGE_CHANGE': 'LANGUAGE_CHANGE', + 'MASTER_RESET': 'MASTER_RESET', + 'FACTORY_DEFAULTS': 'FACTORY_DEFAULTS', + 'APP_UNAUTHORIZED': 'APP_UNAUTHORIZED', + 'PROTOCOL_VIOLATION': 'PROTOCOL_VIOLATION', + 'UNSUPPORTED_HMI_RESOURCE': 'UNSUPPORTED_HMI_RESOURCE' + }); + + /* eslint-disable camelcase */ + + class OnAppInterfaceUnregistered extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnAppInterfaceUnregistered); + } + /** + * @param {AppInterfaceUnregisteredReason} reason - See AppInterfaceUnregisteredReason + * @return {OnAppInterfaceUnregistered} + */ + + + setReason(reason) { + this.validateType(AppInterfaceUnregisteredReason, reason); + this.setParameter(OnAppInterfaceUnregistered.KEY_REASON, reason); + return this; + } + /** + * @return {AppInterfaceUnregisteredReason} + */ + + + getReason() { + return this.getObject(AppInterfaceUnregisteredReason, OnAppInterfaceUnregistered.KEY_REASON); + } + + } + + OnAppInterfaceUnregistered.KEY_REASON = 'reason'; + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} ButtonEventMode + * @property {Object} _MAP + */ + + class ButtonEventMode extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * A button has been released up + * @return {String} + */ + + + static get BUTTONUP() { + return ButtonEventMode._MAP.BUTTONUP; + } + /** + * A button has been pressed down + * @return {String} + */ + + + static get BUTTONDOWN() { + return ButtonEventMode._MAP.BUTTONDOWN; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return ButtonEventMode._valueForKey(key, ButtonEventMode._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return ButtonEventMode._keyForValue(value, ButtonEventMode._MAP); + } + + } + + ButtonEventMode._MAP = Object.freeze({ + 'BUTTONUP': 'BUTTONUP', + 'BUTTONDOWN': 'BUTTONDOWN' + }); + + /* eslint-disable camelcase */ + /** + * Notifies application of UP/DOWN events for buttons to which the application is subscribed. + */ + + class OnButtonEvent extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnButtonEvent); + } + /** + * @param {ButtonName} name - Defines the hard (physical) and soft (touchscreen) buttons available from the module + * @return {OnButtonEvent} + */ + + + setButtonName(name) { + this.validateType(ButtonName, name); + this.setParameter(OnButtonEvent.KEY_BUTTON_NAME, name); + return this; + } + /** + * @return {ButtonName} + */ + + + getButtonName() { + return this.getObject(ButtonName, OnButtonEvent.KEY_BUTTON_NAME); + } + /** + * @param {ButtonEventMode} mode - Indicates whether this is an UP or DOWN event. + * @return {OnButtonEvent} + */ + + + setButtonEventMode(mode) { + this.validateType(ButtonEventMode, mode); + this.setParameter(OnButtonEvent.KEY_BUTTON_EVENT_MODE, mode); + return this; + } + /** + * @return {ButtonEventMode} + */ + + + getButtonEventMode() { + return this.getObject(ButtonEventMode, OnButtonEvent.KEY_BUTTON_EVENT_MODE); + } + /** + * @param {Number} id - If ButtonName is "CUSTOM_BUTTON", this references the integer ID passed by a custom button. + * (e.g. softButton ID) + * @return {OnButtonEvent} + */ + + + setCustomButtonID(id) { + this.setParameter(OnButtonEvent.KEY_CUSTOM_BUTTON_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getCustomButtonID() { + return this.getParameter(OnButtonEvent.KEY_CUSTOM_BUTTON_ID); + } + + } + + OnButtonEvent.KEY_BUTTON_NAME = 'buttonName'; + OnButtonEvent.KEY_BUTTON_EVENT_MODE = 'buttonEventMode'; + OnButtonEvent.KEY_CUSTOM_BUTTON_ID = 'customButtonID'; + + /* eslint-disable camelcase */ + /** + * Notifies application of LONG/SHORT press events for buttons to which the application is subscribed. + */ + + class OnButtonPress extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnButtonPress); + } + /** + * @param {ButtonName} name - Defines the hard (physical) and soft (touchscreen) buttons available from the module + * @return {OnButtonPress} + */ + + + setButtonName(name) { + this.validateType(ButtonName, name); + this.setParameter(OnButtonPress.KEY_BUTTON_NAME, name); + return this; + } + /** + * @return {ButtonName} + */ + + + getButtonName() { + return this.getObject(ButtonName, OnButtonPress.KEY_BUTTON_NAME); + } + /** + * @param {ButtonPressMode} mode - Indicates whether this is a LONG or SHORT button press event. + * @return {OnButtonPress} + */ + + + setButtonPressMode(mode) { + this.validateType(ButtonPressMode, mode); + this.setParameter(OnButtonPress.KEY_BUTTON_PRESS_MODE, mode); + return this; + } + /** + * @return {ButtonPressMode} + */ + + + getButtonPressMode() { + return this.getObject(ButtonPressMode, OnButtonPress.KEY_BUTTON_PRESS_MODE); + } + /** + * @param {Number} id - If ButtonName is "CUSTOM_BUTTON", this references the integer ID passed by a custom button. + * (e.g. softButton ID) + * @return {OnButtonPress} + */ + + + setCustomButtonID(id) { + this.setParameter(OnButtonPress.KEY_CUSTOM_BUTTON_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getCustomButtonID() { + return this.getParameter(OnButtonPress.KEY_CUSTOM_BUTTON_ID); + } + + } + + OnButtonPress.KEY_BUTTON_NAME = 'buttonName'; + OnButtonPress.KEY_BUTTON_PRESS_MODE = 'buttonPressMode'; + OnButtonPress.KEY_CUSTOM_BUTTON_ID = 'customButtonID'; + + /* eslint-disable camelcase */ + /** + * Callback for the periodic and non periodic vehicle data read function. + */ + + class OnVehicleData extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnVehicleData); + } + /** + * @param {GPSData} gps - See GPSData + * @return {OnVehicleData} + */ + + + setGps(gps) { + this.validateType(GPSData, gps); + this.setParameter(OnVehicleData.KEY_GPS, gps); + return this; + } + /** + * @return {GPSData} + */ + + + getGps() { + return this.getObject(GPSData, OnVehicleData.KEY_GPS); + } + /** + * @param {Number} speed - The vehicle speed in kilometers per hour + * @return {OnVehicleData} + */ + + + setSpeed(speed) { + this.setParameter(OnVehicleData.KEY_SPEED, speed); + return this; + } + /** + * @return {Number} + */ + + + getSpeed() { + return this.getParameter(OnVehicleData.KEY_SPEED); + } + /** + * @param {Number} rpm - The number of revolutions per minute of the engine + * @return {OnVehicleData} + */ + + + setRpm(rpm) { + this.setParameter(OnVehicleData.KEY_RPM, rpm); + return this; + } + /** + * @return {Number} + */ + + + getRpm() { + return this.getParameter(OnVehicleData.KEY_RPM); + } + /** + * @param {Number} level - The fuel level in the tank (percentage) + * @return {OnVehicleData} + */ + + + setFuelLevel(level) { + this.setParameter(OnVehicleData.KEY_FUEL_LEVEL, level); + return this; + } + /** + * @return {Number} + */ + + + getFuelLevel() { + return this.getParameter(OnVehicleData.KEY_FUEL_LEVEL); + } + /** + * @param {ComponentVolumeStatus} level_state - The fuel level state + * @return {OnVehicleData} + */ + + + setFuelLevel_State(level_state) { + this.validateType(ComponentVolumeStatus, level_state); + this.setParameter(OnVehicleData.KEY_FUEL_LEVEL_STATE, level_state); + return this; + } + /** + * @return {ComponentVolumeStatus} + */ + + + getFuelLevel_State() { + return this.getObject(ComponentVolumeStatus, OnVehicleData.KEY_FUEL_LEVEL_STATE); + } + /** + * @param {Number} consumption - The instantaneous fuel consumption in microlitres + * @return {OnVehicleData} + */ + + + setInstantFuelConsumption(consumption) { + this.setParameter(OnVehicleData.KEY_INSTANT_FUEL_CONSUMPTION, consumption); + return this; + } + /** + * @return {Number} + */ + + + getInstantFuelConsumption() { + return this.getParameter(OnVehicleData.KEY_INSTANT_FUEL_CONSUMPTION); + } + /** + * @param {FuelRange[]} range - The estimate range in KM the vehicle can travel based on fuel level and consumption + * @return {OnVehicleData} + */ + + + setFuelRange(range) { + this.validateType(FuelRange, range, true); + this.setParameter(OnVehicleData.KEY_FUEL_RANGE, range); + return this; + } + /** + * @return {FuelRange[]} + */ + + + getFuelRange() { + return this.getObject(FuelRange, OnVehicleData.KEY_FUEL_RANGE); + } + /** + * @param {Number} temperature - The external temperature in degrees celsius + * @return {OnVehicleData} + */ + + + setExternalTemperature(temperature) { + this.setParameter(OnVehicleData.KEY_EXTERNAL_TEMPERATURE, temperature); + return this; + } + /** + * @return {Number} + */ + + + getExternalTemperature() { + return this.getParameter(OnVehicleData.KEY_EXTERNAL_TEMPERATURE); + } + /** + * @param {TurnSignal} signal - See TurnSignal + * @return {OnVehicleData} + */ + + + setTurnSignal(signal) { + this.validateType(TurnSignal, signal); + this.setParameter(OnVehicleData.KEY_TURN_SIGNAL, signal); + return this; + } + /** + * @return {TurnSignal} + */ + + + getTurnSignal() { + return this.getObject(TurnSignal, OnVehicleData.KEY_TURN_SIGNAL); + } + /** + * @param {String} vin - Vehicle identification number. + * @return {OnVehicleData} + */ + + + setVin(vin) { + this.setParameter(OnVehicleData.KEY_VIN, vin); + return this; + } + /** + * @return {String} + */ + + + getVin() { + return this.getParameter(OnVehicleData.KEY_VIN); + } + /** + * @param {PRNDL} prndl - See PRNDL + * @return {OnVehicleData} + */ + + + setPrndl(prndl) { + this.validateType(PRNDL, prndl); + this.setParameter(OnVehicleData.KEY_PRNDL, prndl); + return this; + } + /** + * @return {PRNDL} + */ + + + getPrndl() { + return this.getObject(PRNDL, OnVehicleData.KEY_PRNDL); + } + /** + * @param {TireStatus} pressure - See TireStatus + * @return {OnVehicleData} + */ + + + setTirePressure(pressure) { + this.validateType(TireStatus, pressure); + this.setParameter(OnVehicleData.KEY_TIRE_PRESSURE, pressure); + return this; + } + /** + * @return {TireStatus} + */ + + + getTirePressure() { + return this.getObject(TireStatus, OnVehicleData.KEY_TIRE_PRESSURE); + } + /** + * @param {Number} odometer - Odometer in km + * @return {OnVehicleData} + */ + + + setOdometer(odometer) { + this.setParameter(OnVehicleData.KEY_ODOMETER, odometer); + return this; + } + /** + * @return {Number} + */ + + + getOdometer() { + return this.getParameter(OnVehicleData.KEY_ODOMETER); + } + /** + * @param {BeltStatus} status - The status of the seat belts + * @return {OnVehicleData} + */ + + + setBeltStatus(status) { + this.validateType(BeltStatus, status); + this.setParameter(OnVehicleData.KEY_BELT_STATUS, status); + return this; + } + /** + * @return {BeltStatus} + */ + + + getBeltStatus() { + return this.getObject(BeltStatus, OnVehicleData.KEY_BELT_STATUS); + } + /** + * @param {BodyInformation} information - The body information including power modes + * @return {OnVehicleData} + */ + + + setBodyInformation(information) { + this.validateType(BodyInformation, information); + this.setParameter(OnVehicleData.KEY_BODY_INFORMATION, information); + return this; + } + /** + * @return {BodyInformation} + */ + + + getBodyInformation() { + return this.getObject(BodyInformation, OnVehicleData.KEY_BODY_INFORMATION); + } + /** + * @param {DeviceStatus} status - The device status including signal and battery strength + * @return {OnVehicleData} + */ + + + setDeviceStatus(status) { + this.validateType(DeviceStatus, status); + this.setParameter(OnVehicleData.KEY_DEVICE_STATUS, status); + return this; + } + /** + * @return {DeviceStatus} + */ + + + getDeviceStatus() { + return this.getObject(DeviceStatus, OnVehicleData.KEY_DEVICE_STATUS); + } + /** + * @param {VehicleDataEventStatus} braking - The status of the brake pedal + * @return {OnVehicleData} + */ + + + setDriverBraking(braking) { + this.validateType(VehicleDataEventStatus, braking); + this.setParameter(OnVehicleData.KEY_DRIVER_BRAKING, braking); + return this; + } + /** + * @return {VehicleDataEventStatus} + */ + + + getDriverBraking() { + return this.getObject(VehicleDataEventStatus, OnVehicleData.KEY_DRIVER_BRAKING); + } + /** + * @param {WiperStatus} status - The status of the wipers + * @return {OnVehicleData} + */ + + + setWiperStatus(status) { + this.validateType(WiperStatus, status); + this.setParameter(OnVehicleData.KEY_WIPER_STATUS, status); + return this; + } + /** + * @return {WiperStatus} + */ + + + getWiperStatus() { + return this.getObject(WiperStatus, OnVehicleData.KEY_WIPER_STATUS); + } + /** + * @param {HeadLampStatus} status - Status of the head lamps + * @return {OnVehicleData} + */ + + + setHeadLampStatus(status) { + this.validateType(HeadLampStatus, status); + this.setParameter(OnVehicleData.KEY_HEAD_LAMP_STATUS, status); + return this; + } + /** + * @return {HeadLampStatus} + */ + + + getHeadLampStatus() { + return this.getObject(HeadLampStatus, OnVehicleData.KEY_HEAD_LAMP_STATUS); + } + /** + * @param {Number} torque - Torque value for engine (in Nm) on non-diesel variants + * @return {OnVehicleData} + */ + + + setEngineTorque(torque) { + this.setParameter(OnVehicleData.KEY_ENGINE_TORQUE, torque); + return this; + } + /** + * @return {Number} + */ + + + getEngineTorque() { + return this.getParameter(OnVehicleData.KEY_ENGINE_TORQUE); + } + /** + * @param {Number} position - Accelerator pedal position (percentage depressed) + * @return {OnVehicleData} + */ + + + setAccPedalPosition(position) { + this.setParameter(OnVehicleData.KEY_ACC_PEDAL_POSITION, position); + return this; + } + /** + * @return {Number} + */ + + + getAccPedalPosition() { + return this.getParameter(OnVehicleData.KEY_ACC_PEDAL_POSITION); + } + /** + * @param {Number} angle - Current angle of the steering wheel (in deg) + * @return {OnVehicleData} + */ + + + setSteeringWheelAngle(angle) { + this.setParameter(OnVehicleData.KEY_STEERING_WHEEL_ANGLE, angle); + return this; + } + /** + * @return {Number} + */ + + + getSteeringWheelAngle() { + return this.getParameter(OnVehicleData.KEY_STEERING_WHEEL_ANGLE); + } + /** + * @param {Number} life - The estimated percentage of remaining oil life of the engine. + * @return {OnVehicleData} + */ + + + setEngineOilLife(life) { + this.setParameter(OnVehicleData.KEY_ENGINE_OIL_LIFE, life); + return this; + } + /** + * @return {Number} + */ + + + getEngineOilLife() { + return this.getParameter(OnVehicleData.KEY_ENGINE_OIL_LIFE); + } + /** + * @param {ElectronicParkBrakeStatus} status - The status of the park brake as provided by Electric Park Brake (EPB) + * system. + * @return {OnVehicleData} + */ + + + setElectronicParkBrakeStatus(status) { + this.validateType(ElectronicParkBrakeStatus, status); + this.setParameter(OnVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS, status); + return this; + } + /** + * @return {ElectronicParkBrakeStatus} + */ + + + getElectronicParkBrakeStatus() { + return this.getObject(ElectronicParkBrakeStatus, OnVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS); + } + /** + * @param {String} id - Parameter used by cloud apps to identify a head unit + * @return {OnVehicleData} + */ + + + setCloudAppVehicleID(id) { + this.setParameter(OnVehicleData.KEY_CLOUD_APP_VEHICLE_ID, id); + return this; + } + /** + * @return {String} + */ + + + getCloudAppVehicleID() { + return this.getParameter(OnVehicleData.KEY_CLOUD_APP_VEHICLE_ID); + } + /** + * @param {ECallInfo} info - Emergency Call notification and confirmation data + * @return {OnVehicleData} + */ + + + setECallInfo(info) { + this.validateType(ECallInfo, info); + this.setParameter(OnVehicleData.KEY_E_CALL_INFO, info); + return this; + } + /** + * @return {ECallInfo} + */ + + + getECallInfo() { + return this.getObject(ECallInfo, OnVehicleData.KEY_E_CALL_INFO); + } + /** + * @param {AirbagStatus} status - The status of the air bags + * @return {OnVehicleData} + */ + + + setAirbagStatus(status) { + this.validateType(AirbagStatus, status); + this.setParameter(OnVehicleData.KEY_AIRBAG_STATUS, status); + return this; + } + /** + * @return {AirbagStatus} + */ + + + getAirbagStatus() { + return this.getObject(AirbagStatus, OnVehicleData.KEY_AIRBAG_STATUS); + } + /** + * @param {EmergencyEvent} event - Information related to an emergency event (and if it occurred) + * @return {OnVehicleData} + */ + + + setEmergencyEvent(event) { + this.validateType(EmergencyEvent, event); + this.setParameter(OnVehicleData.KEY_EMERGENCY_EVENT, event); + return this; + } + /** + * @return {EmergencyEvent} + */ + + + getEmergencyEvent() { + return this.getObject(EmergencyEvent, OnVehicleData.KEY_EMERGENCY_EVENT); + } + /** + * @param {ClusterModeStatus} status - The status modes of the cluster + * @return {OnVehicleData} + */ + + + setClusterModeStatus(status) { + this.validateType(ClusterModeStatus, status); + this.setParameter(OnVehicleData.KEY_CLUSTER_MODE_STATUS, status); + return this; + } + /** + * @return {ClusterModeStatus} + */ + + + getClusterModeStatus() { + return this.getObject(ClusterModeStatus, OnVehicleData.KEY_CLUSTER_MODE_STATUS); + } + /** + * @param {MyKey} key - Information related to the MyKey feature + * @return {OnVehicleData} + */ + + + setMyKey(key) { + this.validateType(MyKey, key); + this.setParameter(OnVehicleData.KEY_MY_KEY, key); + return this; + } + /** + * @return {MyKey} + */ + + + getMyKey() { + return this.getObject(MyKey, OnVehicleData.KEY_MY_KEY); + } + + } + + OnVehicleData.KEY_GPS = 'gps'; + OnVehicleData.KEY_SPEED = 'speed'; + OnVehicleData.KEY_RPM = 'rpm'; + OnVehicleData.KEY_FUEL_LEVEL = 'fuelLevel'; + OnVehicleData.KEY_FUEL_LEVEL_STATE = 'fuelLevel_State'; + OnVehicleData.KEY_INSTANT_FUEL_CONSUMPTION = 'instantFuelConsumption'; + OnVehicleData.KEY_FUEL_RANGE = 'fuelRange'; + OnVehicleData.KEY_EXTERNAL_TEMPERATURE = 'externalTemperature'; + OnVehicleData.KEY_TURN_SIGNAL = 'turnSignal'; + OnVehicleData.KEY_VIN = 'vin'; + OnVehicleData.KEY_PRNDL = 'prndl'; + OnVehicleData.KEY_TIRE_PRESSURE = 'tirePressure'; + OnVehicleData.KEY_ODOMETER = 'odometer'; + OnVehicleData.KEY_BELT_STATUS = 'beltStatus'; + OnVehicleData.KEY_BODY_INFORMATION = 'bodyInformation'; + OnVehicleData.KEY_DEVICE_STATUS = 'deviceStatus'; + OnVehicleData.KEY_DRIVER_BRAKING = 'driverBraking'; + OnVehicleData.KEY_WIPER_STATUS = 'wiperStatus'; + OnVehicleData.KEY_HEAD_LAMP_STATUS = 'headLampStatus'; + OnVehicleData.KEY_ENGINE_TORQUE = 'engineTorque'; + OnVehicleData.KEY_ACC_PEDAL_POSITION = 'accPedalPosition'; + OnVehicleData.KEY_STEERING_WHEEL_ANGLE = 'steeringWheelAngle'; + OnVehicleData.KEY_ENGINE_OIL_LIFE = 'engineOilLife'; + OnVehicleData.KEY_ELECTRONIC_PARK_BRAKE_STATUS = 'electronicParkBrakeStatus'; + OnVehicleData.KEY_CLOUD_APP_VEHICLE_ID = 'cloudAppVehicleID'; + OnVehicleData.KEY_E_CALL_INFO = 'eCallInfo'; + OnVehicleData.KEY_AIRBAG_STATUS = 'airbagStatus'; + OnVehicleData.KEY_EMERGENCY_EVENT = 'emergencyEvent'; + OnVehicleData.KEY_CLUSTER_MODE_STATUS = 'clusterModeStatus'; + OnVehicleData.KEY_MY_KEY = 'myKey'; + + /* eslint-disable camelcase */ + + class OnCommand extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnCommand); + } + /** + * @param {Number} id - Command ID, which is related to a specific menu entry + * @return {OnCommand} + */ + + + setCmdID(id) { + this.setParameter(OnCommand.KEY_CMD_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getCmdID() { + return this.getParameter(OnCommand.KEY_CMD_ID); + } + /** + * @param {TriggerSource} source - See TriggerSource + * @return {OnCommand} + */ + + + setTriggerSource(source) { + this.validateType(TriggerSource, source); + this.setParameter(OnCommand.KEY_TRIGGER_SOURCE, source); + return this; + } + /** + * @return {TriggerSource} + */ + + + getTriggerSource() { + return this.getObject(TriggerSource, OnCommand.KEY_TRIGGER_SOURCE); + } + + } + + OnCommand.KEY_CMD_ID = 'cmdID'; + OnCommand.KEY_TRIGGER_SOURCE = 'triggerSource'; + + /* eslint-disable camelcase */ + /** + * Enumeration that describes possible states of turn-by-turn client or SmartDeviceLink app. + * @typedef {Enum} TBTState + * @property {Object} _MAP + */ + + class TBTState extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get ROUTE_UPDATE_REQUEST() { + return TBTState._MAP.ROUTE_UPDATE_REQUEST; + } + /** + * @return {String} + */ + + + static get ROUTE_ACCEPTED() { + return TBTState._MAP.ROUTE_ACCEPTED; + } + /** + * @return {String} + */ + + + static get ROUTE_REFUSED() { + return TBTState._MAP.ROUTE_REFUSED; + } + /** + * @return {String} + */ + + + static get ROUTE_CANCELLED() { + return TBTState._MAP.ROUTE_CANCELLED; + } + /** + * @return {String} + */ + + + static get ETA_REQUEST() { + return TBTState._MAP.ETA_REQUEST; + } + /** + * @return {String} + */ + + + static get NEXT_TURN_REQUEST() { + return TBTState._MAP.NEXT_TURN_REQUEST; + } + /** + * @return {String} + */ + + + static get ROUTE_STATUS_REQUEST() { + return TBTState._MAP.ROUTE_STATUS_REQUEST; + } + /** + * @return {String} + */ + + + static get ROUTE_SUMMARY_REQUEST() { + return TBTState._MAP.ROUTE_SUMMARY_REQUEST; + } + /** + * @return {String} + */ + + + static get TRIP_STATUS_REQUEST() { + return TBTState._MAP.TRIP_STATUS_REQUEST; + } + /** + * @return {String} + */ + + + static get ROUTE_UPDATE_REQUEST_TIMEOUT() { + return TBTState._MAP.ROUTE_UPDATE_REQUEST_TIMEOUT; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return TBTState._valueForKey(key, TBTState._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return TBTState._keyForValue(value, TBTState._MAP); + } + + } + + TBTState._MAP = Object.freeze({ + 'ROUTE_UPDATE_REQUEST': 'ROUTE_UPDATE_REQUEST', + 'ROUTE_ACCEPTED': 'ROUTE_ACCEPTED', + 'ROUTE_REFUSED': 'ROUTE_REFUSED', + 'ROUTE_CANCELLED': 'ROUTE_CANCELLED', + 'ETA_REQUEST': 'ETA_REQUEST', + 'NEXT_TURN_REQUEST': 'NEXT_TURN_REQUEST', + 'ROUTE_STATUS_REQUEST': 'ROUTE_STATUS_REQUEST', + 'ROUTE_SUMMARY_REQUEST': 'ROUTE_SUMMARY_REQUEST', + 'TRIP_STATUS_REQUEST': 'TRIP_STATUS_REQUEST', + 'ROUTE_UPDATE_REQUEST_TIMEOUT': 'ROUTE_UPDATE_REQUEST_TIMEOUT' + }); + + /* eslint-disable camelcase */ + /** + * Provides applications with notifications specific to the current TBT client status on the module + */ + + class OnTBTClientState extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnTBTClientState); + } + /** + * @param {TBTState} state - Current State of TBT client + * @return {OnTBTClientState} + */ + + + setState(state) { + this.validateType(TBTState, state); + this.setParameter(OnTBTClientState.KEY_STATE, state); + return this; + } + /** + * @return {TBTState} + */ + + + getState() { + return this.getObject(TBTState, OnTBTClientState.KEY_STATE); + } + + } + + OnTBTClientState.KEY_STATE = 'state'; + + /* eslint-disable camelcase */ + /** + * Enumeration that describes possible states of driver distraction. + * @typedef {Enum} DriverDistractionState + * @property {Object} _MAP + */ + + class DriverDistractionState extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get DD_ON() { + return DriverDistractionState._MAP.DD_ON; + } + /** + * @return {String} + */ + + + static get DD_OFF() { + return DriverDistractionState._MAP.DD_OFF; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return DriverDistractionState._valueForKey(key, DriverDistractionState._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return DriverDistractionState._keyForValue(value, DriverDistractionState._MAP); + } + + } + + DriverDistractionState._MAP = Object.freeze({ + 'DD_ON': 'DD_ON', + 'DD_OFF': 'DD_OFF' + }); + + /* eslint-disable camelcase */ + /** + * Provides driver distraction state to mobile applications + */ + + class OnDriverDistraction extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnDriverDistraction); + } + /** + * @param {DriverDistractionState} state - Current State of Driver Distraction + * @return {OnDriverDistraction} + */ + + + setState(state) { + this.validateType(DriverDistractionState, state); + this.setParameter(OnDriverDistraction.KEY_STATE, state); + return this; + } + /** + * @return {DriverDistractionState} + */ + + + getState() { + return this.getObject(DriverDistractionState, OnDriverDistraction.KEY_STATE); + } + /** + * @param {Boolean} enabled - If enabled, the lock screen will be able to be dismissed while connected to SDL, + * allowing users the ability to interact with the app. Dismissals should include a + * warning to the user and ensure that they are not the driver. + * @return {OnDriverDistraction} + */ + + + setLockScreenDismissalEnabled(enabled) { + this.setParameter(OnDriverDistraction.KEY_LOCK_SCREEN_DISMISSAL_ENABLED, enabled); + return this; + } + /** + * @return {Boolean} + */ + + + getLockScreenDismissalEnabled() { + return this.getParameter(OnDriverDistraction.KEY_LOCK_SCREEN_DISMISSAL_ENABLED); + } + /** + * @param {String} warning - Warning message to be displayed on the lock screen when dismissal is enabled. This + * warning should be used to ensure that the user is not the driver of the vehicle, ex. + * `Swipe down to dismiss, acknowledging that you are not the driver.`. This parameter + * must be present if "lockScreenDismissalEnabled" is set to true. + * @return {OnDriverDistraction} + */ + + + setLockScreenDismissalWarning(warning) { + this.setParameter(OnDriverDistraction.KEY_LOCK_SCREEN_DISMISSAL_WARNING, warning); + return this; + } + /** + * @return {String} + */ + + + getLockScreenDismissalWarning() { + return this.getParameter(OnDriverDistraction.KEY_LOCK_SCREEN_DISMISSAL_WARNING); + } + + } + + OnDriverDistraction.KEY_STATE = 'state'; + OnDriverDistraction.KEY_LOCK_SCREEN_DISMISSAL_ENABLED = 'lockScreenDismissalEnabled'; + OnDriverDistraction.KEY_LOCK_SCREEN_DISMISSAL_WARNING = 'lockScreenDismissalWarning'; + + /* eslint-disable camelcase */ + + class HMIPermissions extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {HMILevel[]} allowed - A set of all HMI levels that are permitted for this given RPC. + * @return {HMIPermissions} + */ + + + setAllowed(allowed) { + this.validateType(HMILevel, allowed, true); + this.setParameter(HMIPermissions.KEY_ALLOWED, allowed); + return this; + } + /** + * @return {HMILevel[]} + */ + + + getAllowed() { + return this.getObject(HMILevel, HMIPermissions.KEY_ALLOWED); + } + /** + * @param {HMILevel[]} disallowed - A set of all HMI levels that are prohibited for this given RPC. + * @return {HMIPermissions} + */ + + + setUserDisallowed(disallowed) { + this.validateType(HMILevel, disallowed, true); + this.setParameter(HMIPermissions.KEY_USER_DISALLOWED, disallowed); + return this; + } + /** + * @return {HMILevel[]} + */ + + + getUserDisallowed() { + return this.getObject(HMILevel, HMIPermissions.KEY_USER_DISALLOWED); + } + + } + + HMIPermissions.KEY_ALLOWED = 'allowed'; + HMIPermissions.KEY_USER_DISALLOWED = 'userDisallowed'; + + /* eslint-disable camelcase */ + + class ParameterPermissions extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String[]} allowed - A set of all parameters that are permitted for this given RPC. + * @return {ParameterPermissions} + */ + + + setAllowed(allowed) { + this.setParameter(ParameterPermissions.KEY_ALLOWED, allowed); + return this; + } + /** + * @return {String[]} + */ + + + getAllowed() { + return this.getParameter(ParameterPermissions.KEY_ALLOWED); + } + /** + * @param {String[]} disallowed - A set of all parameters that are prohibited for this given RPC. + * @return {ParameterPermissions} + */ + + + setUserDisallowed(disallowed) { + this.setParameter(ParameterPermissions.KEY_USER_DISALLOWED, disallowed); + return this; + } + /** + * @return {String[]} + */ + + + getUserDisallowed() { + return this.getParameter(ParameterPermissions.KEY_USER_DISALLOWED); + } + + } + + ParameterPermissions.KEY_ALLOWED = 'allowed'; + ParameterPermissions.KEY_USER_DISALLOWED = 'userDisallowed'; + + /* eslint-disable camelcase */ + + class PermissionItem extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {String} name - Name of the individual RPC in the policy table. + * @return {PermissionItem} + */ + + + setRpcName(name) { + this.setParameter(PermissionItem.KEY_RPC_NAME, name); + return this; + } + /** + * @return {String} + */ + + + getRpcName() { + return this.getParameter(PermissionItem.KEY_RPC_NAME); + } + /** + * @param {HMIPermissions} permissions + * @return {PermissionItem} + */ + + + setHmiPermissions(permissions) { + this.validateType(HMIPermissions, permissions); + this.setParameter(PermissionItem.KEY_HMI_PERMISSIONS, permissions); + return this; + } + /** + * @return {HMIPermissions} + */ + + + getHmiPermissions() { + return this.getObject(HMIPermissions, PermissionItem.KEY_HMI_PERMISSIONS); + } + /** + * @param {ParameterPermissions} permissions + * @return {PermissionItem} + */ + + + setParameterPermissions(permissions) { + this.validateType(ParameterPermissions, permissions); + this.setParameter(PermissionItem.KEY_PARAMETER_PERMISSIONS, permissions); + return this; + } + /** + * @return {ParameterPermissions} + */ + + + getParameterPermissions() { + return this.getObject(ParameterPermissions, PermissionItem.KEY_PARAMETER_PERMISSIONS); + } + /** + * @param {Boolean} encryption + * @return {PermissionItem} + */ + + + setRequireEncryption(encryption) { + this.setParameter(PermissionItem.KEY_REQUIRE_ENCRYPTION, encryption); + return this; + } + /** + * @return {Boolean} + */ + + + getRequireEncryption() { + return this.getParameter(PermissionItem.KEY_REQUIRE_ENCRYPTION); + } + + } + + PermissionItem.KEY_RPC_NAME = 'rpcName'; + PermissionItem.KEY_HMI_PERMISSIONS = 'hmiPermissions'; + PermissionItem.KEY_PARAMETER_PERMISSIONS = 'parameterPermissions'; + PermissionItem.KEY_REQUIRE_ENCRYPTION = 'requireEncryption'; + + /* eslint-disable camelcase */ + /** + * Provides update to app of which policy-table-enabled functions are available + */ + + class OnPermissionsChange extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnPermissionsChange); + } + /** + * @param {PermissionItem[]} item - Change in permissions for a given set of RPCs + * @return {OnPermissionsChange} + */ + + + setPermissionItem(item) { + this.validateType(PermissionItem, item, true); + this.setParameter(OnPermissionsChange.KEY_PERMISSION_ITEM, item); + return this; + } + /** + * @return {PermissionItem[]} + */ + + + getPermissionItem() { + return this.getObject(PermissionItem, OnPermissionsChange.KEY_PERMISSION_ITEM); + } + /** + * @param {Boolean} encryption + * @return {OnPermissionsChange} + */ + + + setRequireEncryption(encryption) { + this.setParameter(OnPermissionsChange.KEY_REQUIRE_ENCRYPTION, encryption); + return this; + } + /** + * @return {Boolean} + */ + + + getRequireEncryption() { + return this.getParameter(OnPermissionsChange.KEY_REQUIRE_ENCRYPTION); + } + + } + + OnPermissionsChange.KEY_PERMISSION_ITEM = 'permissionItem'; + OnPermissionsChange.KEY_REQUIRE_ENCRYPTION = 'requireEncryption'; + + /* eslint-disable camelcase */ + /** + * Binary data is in binary part of hybrid msg + */ + + class OnAudioPassThru extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnAudioPassThru); + } + + } + + /* eslint-disable camelcase */ + + class OnLanguageChange extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnLanguageChange); + } + /** + * @param {Language} language - Current SDL voice engine (VR+TTS) language + * @return {OnLanguageChange} + */ + + + setLanguage(language) { + this.validateType(Language, language); + this.setParameter(OnLanguageChange.KEY_LANGUAGE, language); + return this; + } + /** + * @return {Language} + */ + + + getLanguage() { + return this.getObject(Language, OnLanguageChange.KEY_LANGUAGE); + } + /** + * @param {Language} language - Current display language + * @return {OnLanguageChange} + */ + + + setHmiDisplayLanguage(language) { + this.validateType(Language, language); + this.setParameter(OnLanguageChange.KEY_HMI_DISPLAY_LANGUAGE, language); + return this; + } + /** + * @return {Language} + */ + + + getHmiDisplayLanguage() { + return this.getObject(Language, OnLanguageChange.KEY_HMI_DISPLAY_LANGUAGE); + } + + } + + OnLanguageChange.KEY_LANGUAGE = 'language'; + OnLanguageChange.KEY_HMI_DISPLAY_LANGUAGE = 'hmiDisplayLanguage'; + + /* eslint-disable camelcase */ + /** + * Enumeration listing possible keyboard events. + * @typedef {Enum} KeyboardEvent + * @property {Object} _MAP + */ + + class KeyboardEvent extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get KEYPRESS() { + return KeyboardEvent._MAP.KEYPRESS; + } + /** + * @return {String} + */ + + + static get ENTRY_SUBMITTED() { + return KeyboardEvent._MAP.ENTRY_SUBMITTED; + } + /** + * @return {String} + */ + + + static get ENTRY_VOICE() { + return KeyboardEvent._MAP.ENTRY_VOICE; + } + /** + * @return {String} + */ + + + static get ENTRY_CANCELLED() { + return KeyboardEvent._MAP.ENTRY_CANCELLED; + } + /** + * @return {String} + */ + + + static get ENTRY_ABORTED() { + return KeyboardEvent._MAP.ENTRY_ABORTED; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return KeyboardEvent._valueForKey(key, KeyboardEvent._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return KeyboardEvent._keyForValue(value, KeyboardEvent._MAP); + } + + } + + KeyboardEvent._MAP = Object.freeze({ + 'KEYPRESS': 'KEYPRESS', + 'ENTRY_SUBMITTED': 'ENTRY_SUBMITTED', + 'ENTRY_VOICE': 'ENTRY_VOICE', + 'ENTRY_CANCELLED': 'ENTRY_CANCELLED', + 'ENTRY_ABORTED': 'ENTRY_ABORTED' + }); + + /* eslint-disable camelcase */ + /** + * On-screen keyboard event. Can be full string or individual keypresses depending on keyboard mode. + */ + + class OnKeyboardInput extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnKeyboardInput); + } + /** + * @param {KeyboardEvent} event - On-screen keyboard input data. + * @return {OnKeyboardInput} + */ + + + setEvent(event) { + this.validateType(KeyboardEvent, event); + this.setParameter(OnKeyboardInput.KEY_EVENT, event); + return this; + } + /** + * @return {KeyboardEvent} + */ + + + getEvent() { + return this.getObject(KeyboardEvent, OnKeyboardInput.KEY_EVENT); + } + /** + * @param {String} data - On-screen keyboard input data. For dynamic keypress events, this will be the current + * compounded string of entry text. For entry submission events, this will be the full text + * entry (this will always return regardless of the mode). For entry cancelled and entry + * aborted events, this data param will be omitted. + * @return {OnKeyboardInput} + */ + + + setData(data) { + this.setParameter(OnKeyboardInput.KEY_DATA, data); + return this; + } + /** + * @return {String} + */ + + + getData() { + return this.getParameter(OnKeyboardInput.KEY_DATA); + } + + } + + OnKeyboardInput.KEY_EVENT = 'event'; + OnKeyboardInput.KEY_DATA = 'data'; + + /* eslint-disable camelcase */ + + class TouchCoord extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} x - The x coordinate of the touch. + * @return {TouchCoord} + */ + + + setX(x) { + this.setParameter(TouchCoord.KEY_X, x); + return this; + } + /** + * @return {Number} + */ + + + getX() { + return this.getParameter(TouchCoord.KEY_X); + } + /** + * @param {Number} y - The y coordinate of the touch. + * @return {TouchCoord} + */ + + + setY(y) { + this.setParameter(TouchCoord.KEY_Y, y); + return this; + } + /** + * @return {Number} + */ + + + getY() { + return this.getParameter(TouchCoord.KEY_Y); + } + + } + + TouchCoord.KEY_X = 'x'; + TouchCoord.KEY_Y = 'y'; + + /* eslint-disable camelcase */ + + class TouchEvent extends RpcStruct { + /** + * @constructor + */ + constructor(parameters) { + super(parameters); + } + /** + * @param {Number} id - A touch's unique identifier. The application can track the current touch events by id. If a + * touch event has type begin, the id should be added to the set of touches. If a touch event + * has type end, the id should be removed from the set of touches. + * @return {TouchEvent} + */ + + + setId(id) { + this.setParameter(TouchEvent.KEY_ID, id); + return this; + } + /** + * @return {Number} + */ + + + getId() { + return this.getParameter(TouchEvent.KEY_ID); + } + /** + * @param {Number[]} ts - The time that the touch was recorded. This number can the time since the beginning of the + * session or something else as long as the units are in milliseconds. The timestamp is used + * to determined the rate of change of position of a touch. The application also uses the + * time to verify whether two touches, with different ids, are part of a single action by the + * user. If there is only a single timestamp in this array, it is the same for every + * coordinate in the coordinates array. + * @return {TouchEvent} + */ + + + setTs(ts) { + this.setParameter(TouchEvent.KEY_TS, ts); + return this; + } + /** + * @return {Number[]} + */ + + + getTs() { + return this.getParameter(TouchEvent.KEY_TS); + } + /** + * @param {TouchCoord[]} c + * @return {TouchEvent} + */ + + + setC(c) { + this.validateType(TouchCoord, c, true); + this.setParameter(TouchEvent.KEY_C, c); + return this; + } + /** + * @return {TouchCoord[]} + */ + + + getC() { + return this.getObject(TouchCoord, TouchEvent.KEY_C); + } + + } + + TouchEvent.KEY_ID = 'id'; + TouchEvent.KEY_TS = 'ts'; + TouchEvent.KEY_C = 'c'; + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} TouchType + * @property {Object} _MAP + */ + + class TouchType extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get BEGIN() { + return TouchType._MAP.BEGIN; + } + /** + * @return {String} + */ + + + static get MOVE() { + return TouchType._MAP.MOVE; + } + /** + * @return {String} + */ + + + static get END() { + return TouchType._MAP.END; + } + /** + * @return {String} + */ + + + static get CANCEL() { + return TouchType._MAP.CANCEL; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return TouchType._valueForKey(key, TouchType._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return TouchType._keyForValue(value, TouchType._MAP); + } + + } + + TouchType._MAP = Object.freeze({ + 'BEGIN': 'BEGIN', + 'MOVE': 'MOVE', + 'END': 'END', + 'CANCEL': 'CANCEL' + }); + + /* eslint-disable camelcase */ + /** + * Notifies about touch events on the screen's prescribed area + */ + + class OnTouchEvent extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnTouchEvent); + } + /** + * @param {TouchType} type - The type of touch event. + * @return {OnTouchEvent} + */ + + + setType(type) { + this.validateType(TouchType, type); + this.setParameter(OnTouchEvent.KEY_TYPE, type); + return this; + } + /** + * @return {TouchType} + */ + + + getType() { + return this.getObject(TouchType, OnTouchEvent.KEY_TYPE); + } + /** + * @param {TouchEvent[]} event - List of all individual touches involved in this event. + * @return {OnTouchEvent} + */ + + + setEvent(event) { + this.validateType(TouchEvent, event, true); + this.setParameter(OnTouchEvent.KEY_EVENT, event); + return this; + } + /** + * @return {TouchEvent[]} + */ + + + getEvent() { + return this.getObject(TouchEvent, OnTouchEvent.KEY_EVENT); + } + + } + + OnTouchEvent.KEY_TYPE = 'type'; + OnTouchEvent.KEY_EVENT = 'event'; + + /* eslint-disable camelcase */ + /** + * An asynchronous request from the system for specific data from the device or the cloud or response to a request from + * the device or cloud Binary data can be included in hybrid part of message for some requests (such as Authentication + * request responses) + */ + + class OnSystemRequest extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnSystemRequest); + } + /** + * @param {RequestType} type - The type of system request. + * @return {OnSystemRequest} + */ + + + setRequestType(type) { + this.validateType(RequestType, type); + this.setParameter(OnSystemRequest.KEY_REQUEST_TYPE, type); + return this; + } + /** + * @return {RequestType} + */ + + + getRequestType() { + return this.getObject(RequestType, OnSystemRequest.KEY_REQUEST_TYPE); + } + /** + * @param {String} type - This parameter is filled for supporting OEM proprietary data exchanges. + * @return {OnSystemRequest} + */ + + + setRequestSubType(type) { + this.setParameter(OnSystemRequest.KEY_REQUEST_SUB_TYPE, type); + return this; + } + /** + * @return {String} + */ + + + getRequestSubType() { + return this.getParameter(OnSystemRequest.KEY_REQUEST_SUB_TYPE); + } + /** + * @param {String} url - Optional URL for HTTP requests. If blank, the binary data shall be forwarded to the app. If + * not blank, the binary data shall be forwarded to the url with a provided timeout in + * seconds. + * @return {OnSystemRequest} + */ + + + setUrl(url) { + this.setParameter(OnSystemRequest.KEY_URL, url); + return this; + } + /** + * @return {String} + */ + + + getUrl() { + return this.getParameter(OnSystemRequest.KEY_URL); + } + /** + * @param {Number} timeout - Optional timeout for HTTP requests Required if a URL is provided + * @return {OnSystemRequest} + */ + + + setTimeout(timeout) { + this.setParameter(OnSystemRequest.KEY_TIMEOUT, timeout); + return this; + } + /** + * @return {Number} + */ + + + getTimeout() { + return this.getParameter(OnSystemRequest.KEY_TIMEOUT); + } + /** + * @param {FileType} type - Optional file type (meant for HTTP file requests). + * @return {OnSystemRequest} + */ + + + setFileType(type) { + this.validateType(FileType, type); + this.setParameter(OnSystemRequest.KEY_FILE_TYPE, type); + return this; + } + /** + * @return {FileType} + */ + + + getFileType() { + return this.getObject(FileType, OnSystemRequest.KEY_FILE_TYPE); + } + /** + * @param {Number} offset - Optional offset in bytes for resuming partial data chunks + * @return {OnSystemRequest} + */ + + + setOffset(offset) { + this.setParameter(OnSystemRequest.KEY_OFFSET, offset); + return this; + } + /** + * @return {Number} + */ + + + getOffset() { + return this.getParameter(OnSystemRequest.KEY_OFFSET); + } + /** + * @param {Number} length - Optional length in bytes for resuming partial data chunks + * @return {OnSystemRequest} + */ + + + setLength(length) { + this.setParameter(OnSystemRequest.KEY_LENGTH, length); + return this; + } + /** + * @return {Number} + */ + + + getLength() { + return this.getParameter(OnSystemRequest.KEY_LENGTH); + } + + } + + OnSystemRequest.KEY_REQUEST_TYPE = 'requestType'; + OnSystemRequest.KEY_REQUEST_SUB_TYPE = 'requestSubType'; + OnSystemRequest.KEY_URL = 'url'; + OnSystemRequest.KEY_TIMEOUT = 'timeout'; + OnSystemRequest.KEY_FILE_TYPE = 'fileType'; + OnSystemRequest.KEY_OFFSET = 'offset'; + OnSystemRequest.KEY_LENGTH = 'length'; + + /* eslint-disable camelcase */ + /** + * Notification containing an updated hashID which can be used over connection cycles (i.e. loss of connection, + * ignition cycles, etc.). Sent after initial registration and subsequently after any change in the calculated hash of + * all persisted app data. + */ + + class OnHashChange extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnHashChange); + } + /** + * @param {String} id - Calculated hash ID to be referenced during RegisterAppInterface. + * @return {OnHashChange} + */ + + + setHashID(id) { + this.setParameter(OnHashChange.KEY_HASH_ID, id); + return this; + } + /** + * @return {String} + */ + + + getHashID() { + return this.getParameter(OnHashChange.KEY_HASH_ID); + } + + } + + OnHashChange.KEY_HASH_ID = 'hashID'; + + /* eslint-disable camelcase */ + /** + * Notification which provides the entire LocationDetails when there is a change to any waypoints or destination. + */ + + class OnWayPointChange extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnWayPointChange); + } + /** + * @param {LocationDetails[]} points - See LocationDetails + * @return {OnWayPointChange} + */ + + + setWayPoints(points) { + this.validateType(LocationDetails, points, true); + this.setParameter(OnWayPointChange.KEY_WAY_POINTS, points); + return this; + } + /** + * @return {LocationDetails[]} + */ + + + getWayPoints() { + return this.getObject(LocationDetails, OnWayPointChange.KEY_WAY_POINTS); + } + + } + + OnWayPointChange.KEY_WAY_POINTS = 'wayPoints'; + + /* eslint-disable camelcase */ + + class OnInteriorVehicleData extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnInteriorVehicleData); + } + /** + * @param {ModuleData} data - The moduleType indicates which type of data should be changed and identifies which + * data object exists in this struct. For example, if the moduleType is CLIMATE then a + * "climateControlData" should exist + * @return {OnInteriorVehicleData} + */ + + + setModuleData(data) { + this.validateType(ModuleData, data); + this.setParameter(OnInteriorVehicleData.KEY_MODULE_DATA, data); + return this; + } + /** + * @return {ModuleData} + */ + + + getModuleData() { + return this.getObject(ModuleData, OnInteriorVehicleData.KEY_MODULE_DATA); + } + + } + + OnInteriorVehicleData.KEY_MODULE_DATA = 'moduleData'; + + /* eslint-disable camelcase */ + /** + * Issued by SDL to notify the application about remote control status change on SDL + */ + + class OnRCStatus extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnRCStatus); + } + /** + * @param {Boolean} allowed - If "true" - RC is allowed; if "false" - RC is disallowed. + * @return {OnRCStatus} + */ + + + setAllowed(allowed) { + this.setParameter(OnRCStatus.KEY_ALLOWED, allowed); + return this; + } + /** + * @return {Boolean} + */ + + + getAllowed() { + return this.getParameter(OnRCStatus.KEY_ALLOWED); + } + /** + * @param {ModuleData[]} modules - Contains a list (zero or more) of module types that are allocated to the + * application. + * @return {OnRCStatus} + */ + + + setAllocatedModules(modules) { + this.validateType(ModuleData, modules, true); + this.setParameter(OnRCStatus.KEY_ALLOCATED_MODULES, modules); + return this; + } + /** + * @return {ModuleData[]} + */ + + + getAllocatedModules() { + return this.getObject(ModuleData, OnRCStatus.KEY_ALLOCATED_MODULES); + } + /** + * @param {ModuleData[]} modules - Contains a list (zero or more) of module types that are free to access for the + * application. + * @return {OnRCStatus} + */ + + + setFreeModules(modules) { + this.validateType(ModuleData, modules, true); + this.setParameter(OnRCStatus.KEY_FREE_MODULES, modules); + return this; + } + /** + * @return {ModuleData[]} + */ + + + getFreeModules() { + return this.getObject(ModuleData, OnRCStatus.KEY_FREE_MODULES); + } + + } + + OnRCStatus.KEY_ALLOWED = 'allowed'; + OnRCStatus.KEY_ALLOCATED_MODULES = 'allocatedModules'; + OnRCStatus.KEY_FREE_MODULES = 'freeModules'; + + /* eslint-disable camelcase */ + /** + * This notification includes the data that is updated from the specific service + */ + + class OnAppServiceData extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnAppServiceData); + } + /** + * @param {AppServiceData} data - Contains all the current data of the app service. The serviceType will link to + * which of the service data objects are included in this object (e.g. if the service + * type is MEDIA, the mediaServiceData param should be included). + * @return {OnAppServiceData} + */ + + + setServiceData(data) { + this.validateType(AppServiceData, data); + this.setParameter(OnAppServiceData.KEY_SERVICE_DATA, data); + return this; + } + /** + * @return {AppServiceData} + */ + + + getServiceData() { + return this.getObject(AppServiceData, OnAppServiceData.KEY_SERVICE_DATA); + } + + } + + OnAppServiceData.KEY_SERVICE_DATA = 'serviceData'; + + /* eslint-disable camelcase */ + /** + * A notification to inform the connected device that a specific system capability has changed. + */ + + class OnSystemCapabilityUpdated extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnSystemCapabilityUpdated); + } + /** + * @param {SystemCapability} capability - The system capability that has been updated + * @return {OnSystemCapabilityUpdated} + */ + + + setSystemCapability(capability) { + this.validateType(SystemCapability, capability); + this.setParameter(OnSystemCapabilityUpdated.KEY_SYSTEM_CAPABILITY, capability); + return this; + } + /** + * @return {SystemCapability} + */ + + + getSystemCapability() { + return this.getObject(SystemCapability, OnSystemCapabilityUpdated.KEY_SYSTEM_CAPABILITY); + } + + } + + OnSystemCapabilityUpdated.KEY_SYSTEM_CAPABILITY = 'systemCapability'; + + /* eslint-disable camelcase */ + /** + * Allows encoded data in the form of SyncP packets to be sent to the SYNC module. Legacy / v1 Protocol implementation; + * use SyncPData instead. *** DEPRECATED *** + */ + + class EncodedSyncPData extends RpcRequest { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.EncodedSyncPData); + } + /** + * @param {String[]} data - Contains base64 encoded string of SyncP packets. + * @return {EncodedSyncPData} + */ + + + setData(data) { + this.setParameter(EncodedSyncPData.KEY_DATA, data); + return this; + } + /** + * @return {String[]} + */ + + + getData() { + return this.getParameter(EncodedSyncPData.KEY_DATA); + } + + } + + EncodedSyncPData.KEY_DATA = 'data'; + + /* eslint-disable camelcase */ + + class EncodedSyncPDataResponse extends RpcResponse { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.EncodedSyncPData); + } + + } + + /* eslint-disable camelcase */ + /** + * Callback including encoded data of any SyncP packets that SYNC needs to send back to the mobile device. Legacy / v1 + * Protocol implementation; responds to EncodedSyncPData. *** DEPRECATED *** + */ + + class OnEncodedSyncPData extends RpcNotification { + /** + * @constructor + */ + constructor(store) { + super(store); + this.setFunctionName(FunctionID.OnEncodedSyncPData); + } + /** + * @param {String[]} data - Contains base64 encoded string of SyncP packets. + * @return {OnEncodedSyncPData} + */ + + + setData(data) { + this.setParameter(OnEncodedSyncPData.KEY_DATA, data); + return this; + } + /** + * @return {String[]} + */ + + + getData() { + return this.getParameter(OnEncodedSyncPData.KEY_DATA); + } + /** + * @param {String} url - If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data shall + * be forwarded to the provided URL. + * @return {OnEncodedSyncPData} + */ + + + setURL(url) { + this.setParameter(OnEncodedSyncPData.KEY_URL, url); + return this; + } + /** + * @return {String} + */ + + + getURL() { + return this.getParameter(OnEncodedSyncPData.KEY_URL); + } + /** + * @param {Number} timeout - If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data + * shall be forwarded with the provided timeout in seconds. + * @return {OnEncodedSyncPData} + */ + + + setTimeout(timeout) { + this.setParameter(OnEncodedSyncPData.KEY_TIMEOUT, timeout); + return this; + } + /** + * @return {Number} + */ + + + getTimeout() { + return this.getParameter(OnEncodedSyncPData.KEY_TIMEOUT); + } + + } + + OnEncodedSyncPData.KEY_DATA = 'data'; + OnEncodedSyncPData.KEY_URL = 'URL'; + OnEncodedSyncPData.KEY_TIMEOUT = 'Timeout'; + + /* eslint-disable camelcase */ + + class RpcCreator { + /** + * Converts an SdlPacket to an RpcMessage + * @param {SdlPacket} sdlPacket + * @return {RpcMessage} + */ + static construct(sdlPacket) { + const payload = sdlPacket.getPayload(); + const binaryFrameHeader = BinaryFrameHeader.fromBinaryHeader(payload); + let message; + const rpcType = binaryFrameHeader.getRpcType(); + const rpcName = RpcType.keyForValue(rpcType); + const correlationId = binaryFrameHeader.getCorrelationId(); + const functionId = binaryFrameHeader.getFunctionId(); + const functionName = FunctionID.keyForValue(functionId); + const bulkData = binaryFrameHeader.getBulkData(); + const jsonData = binaryFrameHeader.getJsonData(); + const params = { + parameters: JsonRpcMarshaller.unmarshall(jsonData) + }; + + switch (functionId) { + case FunctionID.RegisterAppInterface: + if (rpcType === RpcType.REQUEST) { + message = new RegisterAppInterface(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new RegisterAppInterfaceResponse(params); + } + + break; + + case FunctionID.UnregisterAppInterface: + if (rpcType === RpcType.REQUEST) { + message = new UnregisterAppInterface(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new UnregisterAppInterfaceResponse(params); + } + + break; + + case FunctionID.CreateWindow: + if (rpcType === RpcType.REQUEST) { + message = new CreateWindow(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new CreateWindowResponse(params); + } + + break; + + case FunctionID.DeleteWindow: + if (rpcType === RpcType.REQUEST) { + message = new DeleteWindow(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new DeleteWindowResponse(params); + } + + break; + + case FunctionID.SetGlobalProperties: + if (rpcType === RpcType.REQUEST) { + message = new SetGlobalProperties(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new SetGlobalPropertiesResponse(params); + } + + break; + + case FunctionID.ResetGlobalProperties: + if (rpcType === RpcType.REQUEST) { + message = new ResetGlobalProperties(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new ResetGlobalPropertiesResponse(params); + } + + break; + + case FunctionID.AddCommand: + if (rpcType === RpcType.REQUEST) { + message = new AddCommand(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new AddCommandResponse(params); + } + + break; + + case FunctionID.DeleteCommand: + if (rpcType === RpcType.REQUEST) { + message = new DeleteCommand(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new DeleteCommandResponse(params); + } + + break; + + case FunctionID.AddSubMenu: + if (rpcType === RpcType.REQUEST) { + message = new AddSubMenu(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new AddSubMenuResponse(params); + } + + break; + + case FunctionID.DeleteSubMenu: + if (rpcType === RpcType.REQUEST) { + message = new DeleteSubMenu(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new DeleteSubMenuResponse(params); + } + + break; + + case FunctionID.ShowAppMenu: + if (rpcType === RpcType.REQUEST) { + message = new ShowAppMenu(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new ShowAppMenuResponse(params); + } + + break; + + case FunctionID.CreateInteractionChoiceSet: + if (rpcType === RpcType.REQUEST) { + message = new CreateInteractionChoiceSet(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new CreateInteractionChoiceSetResponse(params); + } + + break; + + case FunctionID.PerformInteraction: + if (rpcType === RpcType.REQUEST) { + message = new PerformInteraction(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new PerformInteractionResponse(params); + } + + break; + + case FunctionID.DeleteInteractionChoiceSet: + if (rpcType === RpcType.REQUEST) { + message = new DeleteInteractionChoiceSet(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new DeleteInteractionChoiceSetResponse(params); + } + + break; + + case FunctionID.Alert: + if (rpcType === RpcType.REQUEST) { + message = new Alert(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new AlertResponse(params); + } + + break; + + case FunctionID.Show: + if (rpcType === RpcType.REQUEST) { + message = new Show(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new ShowResponse(params); + } + + break; + + case FunctionID.Speak: + if (rpcType === RpcType.REQUEST) { + message = new Speak(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new SpeakResponse(params); + } + + break; + + case FunctionID.SetMediaClockTimer: + if (rpcType === RpcType.REQUEST) { + message = new SetMediaClockTimer(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new SetMediaClockTimerResponse(params); + } + + break; + + case FunctionID.PerformAudioPassThru: + if (rpcType === RpcType.REQUEST) { + message = new PerformAudioPassThru(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new PerformAudioPassThruResponse(params); + } + + break; + + case FunctionID.EndAudioPassThru: + if (rpcType === RpcType.REQUEST) { + message = new EndAudioPassThru(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new EndAudioPassThruResponse(params); + } + + break; + + case FunctionID.SubscribeButton: + if (rpcType === RpcType.REQUEST) { + message = new SubscribeButton(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new SubscribeButtonResponse(params); + } + + break; + + case FunctionID.UnsubscribeButton: + if (rpcType === RpcType.REQUEST) { + message = new UnsubscribeButton(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new UnsubscribeButtonResponse(params); + } + + break; + + case FunctionID.SubscribeVehicleData: + if (rpcType === RpcType.REQUEST) { + message = new SubscribeVehicleData(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new SubscribeVehicleDataResponse(params); + } + + break; + + case FunctionID.UnsubscribeVehicleData: + if (rpcType === RpcType.REQUEST) { + message = new UnsubscribeVehicleData(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new UnsubscribeVehicleDataResponse(params); + } + + break; + + case FunctionID.GetVehicleData: + if (rpcType === RpcType.REQUEST) { + message = new GetVehicleData(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new GetVehicleDataResponse(params); + } + + break; + + case FunctionID.ReadDID: + if (rpcType === RpcType.REQUEST) { + message = new ReadDID(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new ReadDIDResponse(params); + } + + break; + + case FunctionID.GetDTCs: + if (rpcType === RpcType.REQUEST) { + message = new GetDTCs(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new GetDTCsResponse(params); + } + + break; + + case FunctionID.DiagnosticMessage: + if (rpcType === RpcType.REQUEST) { + message = new DiagnosticMessage(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new DiagnosticMessageResponse(params); + } + + break; + + case FunctionID.ScrollableMessage: + if (rpcType === RpcType.REQUEST) { + message = new ScrollableMessage(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new ScrollableMessageResponse(params); + } + + break; + + case FunctionID.Slider: + if (rpcType === RpcType.REQUEST) { + message = new Slider(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new SliderResponse(params); + } + + break; + + case FunctionID.ShowConstantTBT: + if (rpcType === RpcType.REQUEST) { + message = new ShowConstantTBT(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new ShowConstantTBTResponse(params); + } + + break; + + case FunctionID.AlertManeuver: + if (rpcType === RpcType.REQUEST) { + message = new AlertManeuver(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new AlertManeuverResponse(params); + } + + break; + + case FunctionID.UpdateTurnList: + if (rpcType === RpcType.REQUEST) { + message = new UpdateTurnList(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new UpdateTurnListResponse(params); + } + + break; + + case FunctionID.ChangeRegistration: + if (rpcType === RpcType.REQUEST) { + message = new ChangeRegistration(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new ChangeRegistrationResponse(params); + } + + break; + + case FunctionID.GenericResponse: + if (rpcType === RpcType.RESPONSE) { + message = new GenericResponseResponse(params); + } + + break; + + case FunctionID.PutFile: + if (rpcType === RpcType.REQUEST) { + message = new PutFile(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new PutFileResponse(params); + } + + break; + + case FunctionID.GetFile: + if (rpcType === RpcType.REQUEST) { + message = new GetFile(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new GetFileResponse(params); + } + + break; + + case FunctionID.DeleteFile: + if (rpcType === RpcType.REQUEST) { + message = new DeleteFile(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new DeleteFileResponse(params); + } + + break; + + case FunctionID.ListFiles: + if (rpcType === RpcType.REQUEST) { + message = new ListFiles(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new ListFilesResponse(params); + } + + break; + + case FunctionID.SetAppIcon: + if (rpcType === RpcType.REQUEST) { + message = new SetAppIcon(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new SetAppIconResponse(params); + } + + break; + + case FunctionID.SetDisplayLayout: + if (rpcType === RpcType.REQUEST) { + message = new SetDisplayLayout(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new SetDisplayLayoutResponse(params); + } + + break; + + case FunctionID.SystemRequest: + if (rpcType === RpcType.REQUEST) { + message = new SystemRequest(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new SystemRequestResponse(params); + } + + break; + + case FunctionID.SendLocation: + if (rpcType === RpcType.REQUEST) { + message = new SendLocation(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new SendLocationResponse(params); + } + + break; + + case FunctionID.DialNumber: + if (rpcType === RpcType.REQUEST) { + message = new DialNumber(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new DialNumberResponse(params); + } + + break; + + case FunctionID.ButtonPress: + if (rpcType === RpcType.REQUEST) { + message = new ButtonPress(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new ButtonPressResponse(params); + } + + break; + + case FunctionID.GetInteriorVehicleData: + if (rpcType === RpcType.REQUEST) { + message = new GetInteriorVehicleData(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new GetInteriorVehicleDataResponse(params); + } + + break; + + case FunctionID.GetInteriorVehicleDataConsent: + if (rpcType === RpcType.REQUEST) { + message = new GetInteriorVehicleDataConsent(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new GetInteriorVehicleDataConsentResponse(params); + } + + break; + + case FunctionID.ReleaseInteriorVehicleDataModule: + if (rpcType === RpcType.REQUEST) { + message = new ReleaseInteriorVehicleDataModule(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new ReleaseInteriorVehicleDataModuleResponse(params); + } + + break; + + case FunctionID.SetInteriorVehicleData: + if (rpcType === RpcType.REQUEST) { + message = new SetInteriorVehicleData(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new SetInteriorVehicleDataResponse(params); + } + + break; + + case FunctionID.SubscribeWayPoints: + if (rpcType === RpcType.REQUEST) { + message = new SubscribeWayPoints(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new SubscribeWayPointsResponse(params); + } + + break; + + case FunctionID.GetWayPoints: + if (rpcType === RpcType.REQUEST) { + message = new GetWayPoints(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new GetWayPointsResponse(params); + } + + break; + + case FunctionID.UnsubscribeWayPoints: + if (rpcType === RpcType.REQUEST) { + message = new UnsubscribeWayPoints(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new UnsubscribeWayPointsResponse(params); + } + + break; + + case FunctionID.GetSystemCapability: + if (rpcType === RpcType.REQUEST) { + message = new GetSystemCapability(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new GetSystemCapabilityResponse(params); + } + + break; + + case FunctionID.SendHapticData: + if (rpcType === RpcType.REQUEST) { + message = new SendHapticData(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new SendHapticDataResponse(params); + } + + break; + + case FunctionID.SetCloudAppProperties: + if (rpcType === RpcType.REQUEST) { + message = new SetCloudAppProperties(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new SetCloudAppPropertiesResponse(params); + } + + break; + + case FunctionID.GetCloudAppProperties: + if (rpcType === RpcType.REQUEST) { + message = new GetCloudAppProperties(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new GetCloudAppPropertiesResponse(params); + } + + break; + + case FunctionID.PublishAppService: + if (rpcType === RpcType.REQUEST) { + message = new PublishAppService(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new PublishAppServiceResponse(params); + } + + break; + + case FunctionID.UnpublishAppService: + if (rpcType === RpcType.REQUEST) { + message = new UnpublishAppService(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new UnpublishAppServiceResponse(params); + } + + break; + + case FunctionID.GetAppServiceData: + if (rpcType === RpcType.REQUEST) { + message = new GetAppServiceData(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new GetAppServiceDataResponse(params); + } + + break; + + case FunctionID.PerformAppServiceInteraction: + if (rpcType === RpcType.REQUEST) { + message = new PerformAppServiceInteraction(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new PerformAppServiceInteractionResponse(params); + } + + break; + + case FunctionID.CancelInteraction: + if (rpcType === RpcType.REQUEST) { + message = new CancelInteraction(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new CancelInteractionResponse(params); + } + + break; + + case FunctionID.CloseApplication: + if (rpcType === RpcType.REQUEST) { + message = new CloseApplication(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new CloseApplicationResponse(params); + } + + break; + + case FunctionID.OnHMIStatus: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnHMIStatus(params); + } + + break; + + case FunctionID.OnAppInterfaceUnregistered: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnAppInterfaceUnregistered(params); + } + + break; + + case FunctionID.OnButtonEvent: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnButtonEvent(params); + } + + break; + + case FunctionID.OnButtonPress: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnButtonPress(params); + } + + break; + + case FunctionID.OnVehicleData: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnVehicleData(params); + } + + break; + + case FunctionID.OnCommand: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnCommand(params); + } + + break; + + case FunctionID.OnTBTClientState: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnTBTClientState(params); + } + + break; + + case FunctionID.OnDriverDistraction: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnDriverDistraction(params); + } + + break; + + case FunctionID.OnPermissionsChange: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnPermissionsChange(params); + } + + break; + + case FunctionID.OnAudioPassThru: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnAudioPassThru(params); + } + + break; + + case FunctionID.OnLanguageChange: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnLanguageChange(params); + } + + break; + + case FunctionID.OnKeyboardInput: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnKeyboardInput(params); + } + + break; + + case FunctionID.OnTouchEvent: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnTouchEvent(params); + } + + break; + + case FunctionID.OnSystemRequest: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnSystemRequest(params); + } + + break; + + case FunctionID.OnHashChange: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnHashChange(params); + } + + break; + + case FunctionID.OnWayPointChange: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnWayPointChange(params); + } + + break; + + case FunctionID.OnInteriorVehicleData: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnInteriorVehicleData(params); + } + + break; + + case FunctionID.OnRCStatus: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnRCStatus(params); + } + + break; + + case FunctionID.OnAppServiceData: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnAppServiceData(params); + } + + break; + + case FunctionID.OnSystemCapabilityUpdated: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnSystemCapabilityUpdated(params); + } + + break; + + case FunctionID.EncodedSyncPData: + if (rpcType === RpcType.REQUEST) { + message = new EncodedSyncPData(params); + } else if (rpcType === RpcType.RESPONSE) { + message = new EncodedSyncPDataResponse(params); + } + + break; + + case FunctionID.OnEncodedSyncPData: + if (rpcType === RpcType.NOTIFICATION) { + message = new OnEncodedSyncPData(params); + } + + break; + + default: + message = null; + } + + if (message === null || message === undefined) { + // informs of missing classes + console.warn(`RpcCreator couldn't construct an RPC for the ${functionName} ${rpcName}`); + return null; + } + + if (rpcType === RpcType.REQUEST || rpcType === RpcType.RESPONSE) { + message.setCorrelationId(correlationId); + } + + if (bulkData) { + message.setBulkData(bulkData); + } + + return message; + } + + } + /* * Copyright (c) 2019, Livio, Inc. * All rights reserved. @@ -28087,7 +54839,7 @@ _createRegisterAppInterface() { const registerAppInterface = new RegisterAppInterface(); - registerAppInterface.setSdlMsgVersion(new SdlMsgVersion().setMajorVersion(LifecycleManager.MAX_RPC_VERSION.getMajor()).setMinorVersion(LifecycleManager.MAX_RPC_VERSION.getMinor()).setPatchVersion(LifecycleManager.MAX_RPC_VERSION.getPatch())).setAppName(this._appConfig.getAppName()).setFullAppId(this._appConfig.getAppId()).setNgnMediaScreenAppName(this._appConfig.getShortAppName()).setAppHmiType(this._appConfig.getAppTypes()).setLanguageDesired(this._appConfig.getLanguageDesired()).setHmiDisplayLanguageDesired(this._appConfig.getHmiDisplayLanguageDesired()).setIsMediaApplication(this._appConfig.isMediaApp()).setDayColorScheme(this._appConfig.getDayColorScheme()).setNightColorScheme(this._appConfig.getNightColorScheme()).setCorrelationId(LifecycleManager.REGISTER_APP_INTERFACE_CORRELATION_ID); // TODO Add all possible items + registerAppInterface.setSdlMsgVersion(new SdlMsgVersion().setMajorVersion(LifecycleManager.MAX_RPC_VERSION.getMajor()).setMinorVersion(LifecycleManager.MAX_RPC_VERSION.getMinor()).setPatchVersion(LifecycleManager.MAX_RPC_VERSION.getPatch())).setAppName(this._appConfig.getAppName()).setFullAppId(this._appConfig.getAppId()).setNgnMediaScreenAppName(this._appConfig.getShortAppName()).setAppHMIType(this._appConfig.getAppTypes()).setLanguageDesired(this._appConfig.getLanguageDesired()).setHmiDisplayLanguageDesired(this._appConfig.getHmiDisplayLanguageDesired()).setIsMediaApplication(this._appConfig.isMediaApp()).setDayColorScheme(this._appConfig.getDayColorScheme()).setNightColorScheme(this._appConfig.getNightColorScheme()).setCorrelationId(LifecycleManager.REGISTER_APP_INTERFACE_CORRELATION_ID); // TODO Add all possible items return registerAppInterface; } @@ -28109,8 +54861,8 @@ case FunctionID.OnHMIStatus: { // send a single onProxyConnected, when we go from a null HMI level to a defined HMI level - const shouldInit = rpcMessage.getHMILevel() !== null && rpcMessage.getHMILevel() !== undefined && this._currentHMIStatus === null; - this._currentHMIStatus = rpcMessage.getHMILevel(); + const shouldInit = rpcMessage.getHmiLevel() !== null && rpcMessage.getHmiLevel() !== undefined && this._currentHMIStatus === null; + this._currentHMIStatus = rpcMessage.getHmiLevel(); if (this._lifecycleListener !== null && this._lifecycleListener !== undefined && shouldInit) { this._lifecycleListener.onProxyConnected(this); @@ -28153,182 +54905,747 @@ LifecycleManager.REGISTER_APP_INTERFACE_CORRELATION_ID = 65529; LifecycleManager.UNREGISTER_APP_INTERFACE_CORRELATION_ID = 65530; - /* - * Copyright (c) 2019, Livio, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of the Livio Inc. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ + /* eslint-disable camelcase */ + /** + * @typedef {Enum} AppServiceType + * @property {Object} _MAP + */ - class VideoStreamingCapability extends RpcStruct { + class AppServiceType extends Enum { /** - * @constructor - */ + * @constructor + */ constructor() { super(); } /** - * @param {ImageResolution} val - * @return {VideoStreamingCapability} - */ + * @return {String} + */ - setPreferredResolution(val) { - this.validateType(ImageResolution, val); - this.setParameter(VideoStreamingCapability.KEY_PREFERRED_RESOLUTION, val); - return this; + static get MEDIA() { + return AppServiceType._MAP.MEDIA; } /** - * @return {ImageResolution} - */ + * @return {String} + */ - getPreferredResolution() { - return this.getObject(ImageResolution, VideoStreamingCapability.KEY_PREFERRED_RESOLUTION); + static get WEATHER() { + return AppServiceType._MAP.WEATHER; } /** - * @param {number} val - * @return {VideoStreamingCapability} - */ + * @return {String} + */ - setMaxBitrate(val) { - this.setParameter(VideoStreamingCapability.KEY_MAX_BITRATE, val); - return this; + static get NAVIGATION() { + return AppServiceType._MAP.NAVIGATION; } /** - * @return {number} - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ - getMaxBitrate() { - return this.getParameter(VideoStreamingCapability.KEY_MAX_BITRATE); + static valueForKey(key) { + return AppServiceType._valueForKey(key, AppServiceType._MAP); } /** - * @param {VideoStreamingFormat[]} val - * @return {VideoStreamingCapability} - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ - setSupportedFormats(val) { - this.validateType(VideoStreamingFormat, val, true); - this.setParameter(VideoStreamingCapability.KEY_SUPPORTED_FORMATS, val); + static keyForValue(value) { + return AppServiceType._keyForValue(value, AppServiceType._MAP); } + + } + + AppServiceType._MAP = Object.freeze({ + 'MEDIA': 'MEDIA', + 'WEATHER': 'WEATHER', + 'NAVIGATION': 'NAVIGATION' + }); + + /* eslint-disable camelcase */ + /** + * Reflects the status of a vehicle maintenance mode. + * @typedef {Enum} MaintenanceModeStatus + * @property {Object} _MAP + */ + + class MaintenanceModeStatus extends Enum { /** - * @return {VideoStreamingFormat[]} - */ + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ - getSupportedFormats() { - return this.getObject(VideoStreamingFormat, VideoStreamingCapability.KEY_SUPPORTED_FORMATS); + static get MMS_NORMAL() { + return MaintenanceModeStatus._MAP.MMS_NORMAL; } /** - * @param {Boolean} val - * @return {VideoStreamingCapability} - */ + * @return {String} + */ - setHapticSpatialDataSupported(val) { - this.setParameter(VideoStreamingCapability.KEY_HAPTIC_SPATIAL_DATA_SUPPORTED, val); - return this; + static get MMS_NEAR() { + return MaintenanceModeStatus._MAP.MMS_NEAR; } /** - * @return {Boolean} - */ + * @return {String} + */ - getHapticSpatialDataSupported() { - return this.getParameter(VideoStreamingCapability.KEY_HAPTIC_SPATIAL_DATA_SUPPORTED); + static get MMS_ACTIVE() { + return MaintenanceModeStatus._MAP.MMS_ACTIVE; } /** - * @param {number} val - * @return {VideoStreamingCapability} - */ + * @return {String} + */ - setDiagonalScreenSize(val) { - this.setParameter(VideoStreamingCapability.KEY_DIAGONAL_SCREEN_SIZE, val); - return this; + static get MMS_FEATURE_NOT_PRESENT() { + return MaintenanceModeStatus._MAP.MMS_FEATURE_NOT_PRESENT; } /** - * @return {number} - */ + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ - getDiagonalScreenSize() { - return this.getParameter(VideoStreamingCapability.KEY_DIAGONAL_SCREEN_SIZE); + static valueForKey(key) { + return MaintenanceModeStatus._valueForKey(key, MaintenanceModeStatus._MAP); } /** - * @param {number} val - * @return {VideoStreamingCapability} - */ + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ - setPixelPerInch(val) { - this.setParameter(VideoStreamingCapability.KEY_PIXEL_PER_INCH, val); - return this; + static keyForValue(value) { + return MaintenanceModeStatus._keyForValue(value, MaintenanceModeStatus._MAP); } + + } + + MaintenanceModeStatus._MAP = Object.freeze({ + 'MMS_NORMAL': 'NORMAL', + 'MMS_NEAR': 'NEAR', + 'MMS_ACTIVE': 'ACTIVE', + 'MMS_FEATURE_NOT_PRESENT': 'FEATURE_NOT_PRESENT' + }); + + /* eslint-disable camelcase */ + /** + * Enumeration that describes possible permission states of a policy table entry. + * @typedef {Enum} PermissionStatus + * @property {Object} _MAP + */ + + class PermissionStatus extends Enum { /** - * @return {number} - */ + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ - getPixelPerInch() { - return this.getParameter(VideoStreamingCapability.KEY_PIXEL_PER_INCH); + static get PS_ALLOWED() { + return PermissionStatus._MAP.PS_ALLOWED; } /** - * @param {number} val - * @return {VideoStreamingCapability} - */ + * @return {String} + */ - setScale(val) { - this.setParameter(VideoStreamingCapability.KEY_SCALE, val); - return this; + static get PS_DISALLOWED() { + return PermissionStatus._MAP.PS_DISALLOWED; } /** - * @return {number} - */ + * @return {String} + */ - getScale() { - return this.getParameter(VideoStreamingCapability.KEY_SCALE); + static get PS_USER_DISALLOWED() { + return PermissionStatus._MAP.PS_USER_DISALLOWED; + } + /** + * @return {String} + */ + + + static get PS_USER_CONSENT_PENDING() { + return PermissionStatus._MAP.PS_USER_CONSENT_PENDING; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return PermissionStatus._valueForKey(key, PermissionStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return PermissionStatus._keyForValue(value, PermissionStatus._MAP); } } - VideoStreamingCapability.KEY_PREFERRED_RESOLUTION = 'preferredResolution'; - VideoStreamingCapability.KEY_MAX_BITRATE = 'maxBitrate'; - VideoStreamingCapability.KEY_SUPPORTED_FORMATS = 'supportedFormats'; - VideoStreamingCapability.KEY_HAPTIC_SPATIAL_DATA_SUPPORTED = 'hapticSpatialDataSupported'; - VideoStreamingCapability.KEY_DIAGONAL_SCREEN_SIZE = 'diagonalScreenSize'; - VideoStreamingCapability.KEY_PIXEL_PER_INCH = 'pixelPerInch'; - VideoStreamingCapability.KEY_SCALE = 'scale'; + PermissionStatus._MAP = Object.freeze({ + 'PS_ALLOWED': 'ALLOWED', + 'PS_DISALLOWED': 'DISALLOWED', + 'PS_USER_DISALLOWED': 'USER_DISALLOWED', + 'PS_USER_CONSENT_PENDING': 'USER_CONSENT_PENDING' + }); + + /* eslint-disable camelcase */ + /** + * Predefined screen layout. + * @typedef {Enum} PredefinedLayout + * @property {Object} _MAP + */ + + class PredefinedLayout extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * Default media / non-media screen. Can be set as a root screen. + * @return {String} + */ + + + static get DEFAULT() { + return PredefinedLayout._MAP.DEFAULT; + } + /** + * Default Media screen. Can be set as a root screen. + * @return {String} + */ + + + static get MEDIA() { + return PredefinedLayout._MAP.MEDIA; + } + /** + * Default Non-media screen. Can be set as a root screen. + * @return {String} + */ + + + static get NON_MEDIA() { + return PredefinedLayout._MAP.NON_MEDIA; + } + /** + * Custom root media screen containing app-defined onscreen presets. Can be set as a root screen. + * @return {String} + */ + + + static get ONSCREEN_PRESETS() { + return PredefinedLayout._MAP.ONSCREEN_PRESETS; + } + /** + * Custom root template screen containing full screen map with navigation controls. Can be set as a root screen. + * @return {String} + */ + + + static get NAV_FULLSCREEN_MAP() { + return PredefinedLayout._MAP.NAV_FULLSCREEN_MAP; + } + /** + * Custom root template screen containing video represented list. Can be set as a root screen. + * @return {String} + */ + + + static get NAV_LIST() { + return PredefinedLayout._MAP.NAV_LIST; + } + /** + * Custom root template screen containing video represented keyboard. Can be set as a root screen. + * @return {String} + */ + + + static get NAV_KEYBOARD() { + return PredefinedLayout._MAP.NAV_KEYBOARD; + } + /** + * Custom root template screen containing half-screen graphic with lines of text. Can be set as a root screen. + * @return {String} + */ + + + static get GRAPHIC_WITH_TEXT() { + return PredefinedLayout._MAP.GRAPHIC_WITH_TEXT; + } + /** + * Custom root template screen containing lines of text with half-screen graphic. Can be set as a root screen. + * @return {String} + */ + + + static get TEXT_WITH_GRAPHIC() { + return PredefinedLayout._MAP.TEXT_WITH_GRAPHIC; + } + /** + * Custom root template screen containing only tiled SoftButtons. Can be set as a root screen. + * @return {String} + */ + + + static get TILES_ONLY() { + return PredefinedLayout._MAP.TILES_ONLY; + } + /** + * Custom root template screen containing only text SoftButtons. Can be set as a root screen. + * @return {String} + */ + + + static get TEXTBUTTONS_ONLY() { + return PredefinedLayout._MAP.TEXTBUTTONS_ONLY; + } + /** + * Custom root template screen containing half-screen graphic with tiled SoftButtons. Can be set as a root screen. + * @return {String} + */ + + + static get GRAPHIC_WITH_TILES() { + return PredefinedLayout._MAP.GRAPHIC_WITH_TILES; + } + /** + * Custom root template screen containing tiled SoftButtons with half-screen graphic. Can be set as a root screen. + * @return {String} + */ + + + static get TILES_WITH_GRAPHIC() { + return PredefinedLayout._MAP.TILES_WITH_GRAPHIC; + } + /** + * Custom root template screen containing half-screen graphic with text and SoftButtons. Can be set as a root + * screen. + * @return {String} + */ + + + static get GRAPHIC_WITH_TEXT_AND_SOFTBUTTONS() { + return PredefinedLayout._MAP.GRAPHIC_WITH_TEXT_AND_SOFTBUTTONS; + } + /** + * Custom root template screen containing text and SoftButtons with half-screen graphic. Can be set as a root + * screen. + * @return {String} + */ + + + static get TEXT_AND_SOFTBUTTONS_WITH_GRAPHIC() { + return PredefinedLayout._MAP.TEXT_AND_SOFTBUTTONS_WITH_GRAPHIC; + } + /** + * Custom root template screen containing half-screen graphic with text only SoftButtons. Can be set as a root + * screen. + * @return {String} + */ + + + static get GRAPHIC_WITH_TEXTBUTTONS() { + return PredefinedLayout._MAP.GRAPHIC_WITH_TEXTBUTTONS; + } + /** + * Custom root template screen containing text only SoftButtons with half-screen graphic. Can be set as a root + * screen. + * @return {String} + */ + + + static get TEXTBUTTONS_WITH_GRAPHIC() { + return PredefinedLayout._MAP.TEXTBUTTONS_WITH_GRAPHIC; + } + /** + * Custom root template screen containing a large graphic and SoftButtons. Can be set as a root screen. + * @return {String} + */ + + + static get LARGE_GRAPHIC_WITH_SOFTBUTTONS() { + return PredefinedLayout._MAP.LARGE_GRAPHIC_WITH_SOFTBUTTONS; + } + /** + * Custom root template screen containing two graphics and SoftButtons. Can be set as a root screen. + * @return {String} + */ + + + static get DOUBLE_GRAPHIC_WITH_SOFTBUTTONS() { + return PredefinedLayout._MAP.DOUBLE_GRAPHIC_WITH_SOFTBUTTONS; + } + /** + * Custom root template screen containing only a large graphic. Can be set as a root screen. + * @return {String} + */ + + + static get LARGE_GRAPHIC_ONLY() { + return PredefinedLayout._MAP.LARGE_GRAPHIC_ONLY; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return PredefinedLayout._valueForKey(key, PredefinedLayout._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return PredefinedLayout._keyForValue(value, PredefinedLayout._MAP); + } + + } + + PredefinedLayout._MAP = Object.freeze({ + 'DEFAULT': 'DEFAULT', + 'MEDIA': 'MEDIA', + 'NON_MEDIA': 'NON-MEDIA', + 'ONSCREEN_PRESETS': 'ONSCREEN_PRESETS', + 'NAV_FULLSCREEN_MAP': 'NAV_FULLSCREEN_MAP', + 'NAV_LIST': 'NAV_LIST', + 'NAV_KEYBOARD': 'NAV_KEYBOARD', + 'GRAPHIC_WITH_TEXT': 'GRAPHIC_WITH_TEXT', + 'TEXT_WITH_GRAPHIC': 'TEXT_WITH_GRAPHIC', + 'TILES_ONLY': 'TILES_ONLY', + 'TEXTBUTTONS_ONLY': 'TEXTBUTTONS_ONLY', + 'GRAPHIC_WITH_TILES': 'GRAPHIC_WITH_TILES', + 'TILES_WITH_GRAPHIC': 'TILES_WITH_GRAPHIC', + 'GRAPHIC_WITH_TEXT_AND_SOFTBUTTONS': 'GRAPHIC_WITH_TEXT_AND_SOFTBUTTONS', + 'TEXT_AND_SOFTBUTTONS_WITH_GRAPHIC': 'TEXT_AND_SOFTBUTTONS_WITH_GRAPHIC', + 'GRAPHIC_WITH_TEXTBUTTONS': 'GRAPHIC_WITH_TEXTBUTTONS', + 'TEXTBUTTONS_WITH_GRAPHIC': 'TEXTBUTTONS_WITH_GRAPHIC', + 'LARGE_GRAPHIC_WITH_SOFTBUTTONS': 'LARGE_GRAPHIC_WITH_SOFTBUTTONS', + 'DOUBLE_GRAPHIC_WITH_SOFTBUTTONS': 'DOUBLE_GRAPHIC_WITH_SOFTBUTTONS', + 'LARGE_GRAPHIC_ONLY': 'LARGE_GRAPHIC_ONLY' + }); + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} PredefinedWindows + * @property {Object} _MAP + */ + + class PredefinedWindows extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * The default window is a main window pre-created on behalf of the app. + * @return {Number} + */ + + + static get DEFAULT_WINDOW() { + return PredefinedWindows._MAP.DEFAULT_WINDOW; + } + /** + * The primary widget of the app. + * @return {Number} + */ + + + static get PRIMARY_WIDGET() { + return PredefinedWindows._MAP.PRIMARY_WIDGET; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return PredefinedWindows._valueForKey(key, PredefinedWindows._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return PredefinedWindows._keyForValue(value, PredefinedWindows._MAP); + } + + } + + PredefinedWindows._MAP = Object.freeze({ + 'DEFAULT_WINDOW': 0, + 'PRIMARY_WIDGET': 1 + }); + + /* eslint-disable camelcase */ + /** + * @typedef {Enum} TimerMode + * @property {Object} _MAP + */ + + class TimerMode extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * Causes the media clock timer to update from 0:00 to a specified time + * @return {String} + */ + + + static get UP() { + return TimerMode._MAP.UP; + } + /** + * Causes the media clock timer to update from a specified time to 0:00 + * @return {String} + */ + + + static get DOWN() { + return TimerMode._MAP.DOWN; + } + /** + * Indicates to not use the media clock timer + * @return {String} + */ + + + static get NONE() { + return TimerMode._MAP.NONE; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return TimerMode._valueForKey(key, TimerMode._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return TimerMode._keyForValue(value, TimerMode._MAP); + } + + } + + TimerMode._MAP = Object.freeze({ + 'UP': 'UP', + 'DOWN': 'DOWN', + 'NONE': 'NONE' + }); + + /* eslint-disable camelcase */ + /** + * Reflects the status of given vehicle component. + * @typedef {Enum} VehicleDataActiveStatus + * @property {Object} _MAP + */ + + class VehicleDataActiveStatus extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {String} + */ + + + static get VDAS_INACTIVE_NOT_CONFIRMED() { + return VehicleDataActiveStatus._MAP.VDAS_INACTIVE_NOT_CONFIRMED; + } + /** + * @return {String} + */ + + + static get VDAS_INACTIVE_CONFIRMED() { + return VehicleDataActiveStatus._MAP.VDAS_INACTIVE_CONFIRMED; + } + /** + * @return {String} + */ + + + static get VDAS_ACTIVE_NOT_CONFIRMED() { + return VehicleDataActiveStatus._MAP.VDAS_ACTIVE_NOT_CONFIRMED; + } + /** + * @return {String} + */ + + + static get VDAS_ACTIVE_CONFIRMED() { + return VehicleDataActiveStatus._MAP.VDAS_ACTIVE_CONFIRMED; + } + /** + * @return {String} + */ + + + static get VDAS_FAULT() { + return VehicleDataActiveStatus._MAP.VDAS_FAULT; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return VehicleDataActiveStatus._valueForKey(key, VehicleDataActiveStatus._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return VehicleDataActiveStatus._keyForValue(value, VehicleDataActiveStatus._MAP); + } + + } + + VehicleDataActiveStatus._MAP = Object.freeze({ + 'VDAS_INACTIVE_NOT_CONFIRMED': 'INACTIVE_NOT_CONFIRMED', + 'VDAS_INACTIVE_CONFIRMED': 'INACTIVE_CONFIRMED', + 'VDAS_ACTIVE_NOT_CONFIRMED': 'ACTIVE_NOT_CONFIRMED', + 'VDAS_ACTIVE_CONFIRMED': 'ACTIVE_CONFIRMED', + 'VDAS_FAULT': 'FAULT' + }); + + /* eslint-disable camelcase */ + /** + * Enumeration linking message types with function types in WiPro protocol. Assumes enumeration starts at value 0. + * @typedef {Enum} messageType + * @property {Object} _MAP + */ + + class messageType extends Enum { + /** + * @constructor + */ + constructor() { + super(); + } + /** + * @return {Number} + */ + + + static get request() { + return messageType._MAP.request; + } + /** + * @return {Number} + */ + + + static get response() { + return messageType._MAP.response; + } + /** + * @return {Number} + */ + + + static get notification() { + return messageType._MAP.notification; + } + /** + * Get the value for the given enum key + * @param key - A key to find in the map of the subclass + * @return {*} - Returns a value if found, or null if not found + */ + + + static valueForKey(key) { + return messageType._valueForKey(key, messageType._MAP); + } + /** + * Get the key for the given enum value + * @param value - A primitive value to find the matching key for in the map of the subclass + * @return {*} - Returns a key if found, or null if not found + */ + + + static keyForValue(value) { + return messageType._keyForValue(value, messageType._MAP); + } + + } + + messageType._MAP = Object.freeze({ + 'request': 0, + 'response': 1, + 'notification': 2 + }); /* * Copyright (c) 2019, Livio, Inc. @@ -29044,80 +56361,367 @@ RpcResponse, RpcStruct, enums: { + AmbientLightStatus, AppHMIType, + AppInterfaceUnregisteredReason, + AppServiceType, + AudioStreamingIndicator, AudioStreamingState, AudioType, BitsPerSample, + ButtonEventMode, ButtonName, + ButtonPressMode, + CarModeStatus, CharacterSet, + CompassDirection, + ComponentVolumeStatus, + DefrostZone, + DeliveryMode, + DeviceLevelStatus, + Dimension, + Direction, + DisplayMode, DisplayType, + DistanceUnit, + DriverDistractionState, + ECallConfirmationStatus, + ElectronicParkBrakeStatus, + EmergencyEventType, FileType, + FuelCutoffStatus, + FuelType, FunctionID, + GlobalProperty, HMILevel, HmiZoneCapabilities, + HybridAppPreference, + IgnitionStableStatus, + IgnitionStatus, ImageFieldName, ImageType, + InteractionMode, + KeyboardEvent, + KeyboardLayout, + KeypressMode, Language, + LayoutMode, + LightName, + LightStatus, + MaintenanceModeStatus, + MassageCushion, + MassageMode, + MassageZone, MediaClockFormat, + MediaType, + MenuLayout, MetadataType, + ModuleType, + NavigationAction, + NavigationJunction, + PRNDL, + PermissionStatus, + PowerModeQualificationStatus, + PowerModeStatus, + PredefinedLayout, + PredefinedWindows, PrerecordedSpeech, + PrimaryAudioSource, + RadioBand, + RadioState, + RequestType, Result, RpcType, SamplingRate, + SeatMemoryActionType, + ServiceUpdateReason, SoftButtonType, SpeechCapabilities, + SupportedSeat, SystemAction, + SystemCapabilityType, SystemContext, + TBTState, + TPMS, + TemperatureUnit, TextAlignment, TextFieldName, + TimerMode, + TouchType, + TriggerSource, + TurnSignal, + UpdateMode, + VehicleDataActiveStatus, + VehicleDataEventStatus, + VehicleDataNotificationStatus, + VehicleDataResultCode, + VehicleDataStatus, + VehicleDataType, + VentilationMode, VideoStreamingCodec, VideoStreamingProtocol, VideoStreamingState, - VrCapabilities + VrCapabilities, + WarningLightStatus, + WayPointType, + WindowType, + WiperStatus, + messageType }, messages: { AddCommand, AddCommandResponse, - OnHmiStatus, + AddSubMenu, + AddSubMenuResponse, + Alert, + AlertManeuver, + AlertManeuverResponse, + AlertResponse, + ButtonPress, + ButtonPressResponse, + CancelInteraction, + CancelInteractionResponse, + ChangeRegistration, + ChangeRegistrationResponse, + CloseApplication, + CloseApplicationResponse, + CreateInteractionChoiceSet, + CreateInteractionChoiceSetResponse, + CreateWindow, + CreateWindowResponse, + DeleteCommand, + DeleteCommandResponse, + DeleteFile, + DeleteFileResponse, + DeleteInteractionChoiceSet, + DeleteInteractionChoiceSetResponse, + DeleteSubMenu, + DeleteSubMenuResponse, + DeleteWindow, + DeleteWindowResponse, + DiagnosticMessage, + DiagnosticMessageResponse, + DialNumber, + DialNumberResponse, + EncodedSyncPData, + EncodedSyncPDataResponse, + EndAudioPassThru, + EndAudioPassThruResponse, + GenericResponseResponse, + GetAppServiceData, + GetAppServiceDataResponse, + GetCloudAppProperties, + GetCloudAppPropertiesResponse, + GetDTCs, + GetDTCsResponse, + GetFile, + GetFileResponse, + GetInteriorVehicleData, + GetInteriorVehicleDataConsent, + GetInteriorVehicleDataConsentResponse, + GetInteriorVehicleDataResponse, + GetSystemCapability, + GetSystemCapabilityResponse, + GetVehicleData, + GetVehicleDataResponse, + GetWayPoints, + GetWayPointsResponse, + ListFiles, + ListFilesResponse, + OnAppInterfaceUnregistered, + OnAppServiceData, + OnAudioPassThru, + OnButtonEvent, + OnButtonPress, + OnCommand, + OnDriverDistraction, + OnEncodedSyncPData, + OnHMIStatus, + OnHashChange, + OnInteriorVehicleData, + OnKeyboardInput, OnLanguageChange, + OnPermissionsChange, + OnRCStatus, + OnSystemCapabilityUpdated, + OnSystemRequest, + OnTBTClientState, + OnTouchEvent, + OnVehicleData, + OnWayPointChange, + PerformAppServiceInteraction, + PerformAppServiceInteractionResponse, + PerformAudioPassThru, + PerformAudioPassThruResponse, + PerformInteraction, + PerformInteractionResponse, + PublishAppService, + PublishAppServiceResponse, PutFile, PutFileResponse, + ReadDID, + ReadDIDResponse, RegisterAppInterface, RegisterAppInterfaceResponse, + ReleaseInteriorVehicleDataModule, + ReleaseInteriorVehicleDataModuleResponse, + ResetGlobalProperties, + ResetGlobalPropertiesResponse, + ScrollableMessage, + ScrollableMessageResponse, + SendHapticData, + SendHapticDataResponse, + SendLocation, + SendLocationResponse, SetAppIcon, SetAppIconResponse, + SetCloudAppProperties, + SetCloudAppPropertiesResponse, + SetDisplayLayout, + SetDisplayLayoutResponse, + SetGlobalProperties, + SetGlobalPropertiesResponse, + SetInteriorVehicleData, + SetInteriorVehicleDataResponse, + SetMediaClockTimer, + SetMediaClockTimerResponse, Show, + ShowAppMenu, + ShowAppMenuResponse, + ShowConstantTBT, + ShowConstantTBTResponse, ShowResponse, + Slider, + SliderResponse, + Speak, + SpeakResponse, + SubscribeButton, + SubscribeButtonResponse, + SubscribeVehicleData, + SubscribeVehicleDataResponse, + SubscribeWayPoints, + SubscribeWayPointsResponse, + SystemRequest, + SystemRequestResponse, + UnpublishAppService, + UnpublishAppServiceResponse, UnregisterAppInterface, - UnregisterAppInterfaceResponse + UnregisterAppInterfaceResponse, + UnsubscribeButton, + UnsubscribeButtonResponse, + UnsubscribeVehicleData, + UnsubscribeVehicleDataResponse, + UnsubscribeWayPoints, + UnsubscribeWayPointsResponse, + UpdateTurnList, + UpdateTurnListResponse }, structs: { + AirbagStatus, AppInfo, + AppServiceCapability, + AppServiceData, + AppServiceManifest, + AppServiceRecord, + AppServicesCapabilities, + AudioControlCapabilities, + AudioControlData, AudioPassThruCapabilities, + BeltStatus, + BodyInformation, ButtonCapabilities, + Choice, + ClimateControlCapabilities, + ClimateControlData, + CloudAppProperties, + ClusterModeStatus, + Coordinate, + DIDResult, + DateTime, DeviceInfo, + DeviceStatus, DisplayCapabilities, + DisplayCapability, + ECallInfo, + EmergencyEvent, + EqualizerSettings, + FuelRange, + GPSData, Grid, HMICapabilities, + HMIPermissions, + HMISettingsControlCapabilities, + HMISettingsControlData, + HapticRect, + HeadLampStatus, Image, ImageField, ImageResolution, + KeyboardProperties, + LightCapabilities, + LightControlCapabilities, + LightControlData, + LightState, + LocationDetails, + MassageCushionFirmness, + MassageModeData, + MediaServiceData, + MediaServiceManifest, MenuParams, MetadataTags, + ModuleData, ModuleInfo, + MyKey, + NavigationCapability, + NavigationInstruction, + NavigationServiceData, + NavigationServiceManifest, + OASISAddress, + ParameterPermissions, + PermissionItem, + PhoneCapability, PresetBankCapabilities, RGBColor, + RadioControlCapabilities, + RadioControlData, + RdsData, + Rectangle, + RemoteControlCapabilities, ScreenParams, SdlMsgVersion, + SeatControlCapabilities, + SeatControlData, + SeatLocation, + SeatLocationCapability, + SeatMemoryAction, + SingleTireStatus, + SisData, SoftButton, SoftButtonCapabilities, + StartTime, + StationIDNumber, + SystemCapability, TTSChunk, + Temperature, TemplateColorScheme, + TemplateConfiguration, TextField, + TireStatus, + TouchCoord, + TouchEvent, TouchEventCapabilities, + Turn, + VehicleDataResult, VehicleType, VideoStreamingCapability, - VideoStreamingFormat + VideoStreamingFormat, + VrHelpItem, + WeatherAlert, + WeatherData, + WeatherServiceData, + WeatherServiceManifest, + WindowCapability, + WindowTypeCapabilities } }, session: { @@ -29167,4 +56771,4 @@ return SDL; }))); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3RtcC9tYW5hZ2VyL0FwcENvbmZpZy5qcyIsIi4uL3RtcC9tYW5hZ2VyL2xpZmVjeWNsZS9MaWZlY3ljbGVMaXN0ZW5lci5qcyIsIi4uL3RtcC91dGlsL0VudW0uanMiLCIuLi90bXAvcnBjL1JwY1N0cnVjdC5qcyIsIi4uL3RtcC9ycGMvZW51bXMvRnVuY3Rpb25JRC5qcyIsIi4uL3RtcC9ycGMvUnBjTWVzc2FnZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvUnBjVHlwZS5qcyIsIi4uL3RtcC9ycGMvUnBjUmVxdWVzdC5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9TZGxNc2dWZXJzaW9uLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9TcGVlY2hDYXBhYmlsaXRpZXMuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvVFRTQ2h1bmsuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvRGV2aWNlSW5mby5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9BcHBJbmZvLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1JHQkNvbG9yLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1RlbXBsYXRlQ29sb3JTY2hlbWUuanMiLCIuLi90bXAvcnBjL2VudW1zL0xhbmd1YWdlLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9BcHBITUlUeXBlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9SZWdpc3RlckFwcEludGVyZmFjZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvUmVzdWx0LmpzIiwiLi4vdG1wL3JwYy9ScGNSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvUnBjTGlzdGVuZXIuanMiLCIuLi90bXAvcHJvdG9jb2wvU2RsUHJvdG9jb2xMaXN0ZW5lci5qcyIsIi4uL3RtcC9wcm90b2NvbC9lbnVtcy9GcmFtZVR5cGUuanMiLCIuLi8uLi8uLi90aGlyZF9wYXJ0eS9ic29uLmNvbW1vbi5qcyIsIi4uL3RtcC91dGlsL0Jzb24uanMiLCIuLi90bXAvcHJvdG9jb2wvU2RsUGFja2V0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JvbGx1cC1wbHVnaW4tbm9kZS1nbG9iYWxzL3NyYy9nbG9iYWwuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyLWVzNi9iYXNlNjQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyLWVzNi9pZWVlNzU0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2J1ZmZlci1lczYvaXNBcnJheS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXItZXM2L2luZGV4LmpzIiwiLi4vdG1wL3V0aWwvVGV4dEVuY29kZXIuanMiLCIuLi90bXAvdXRpbC9Kc29uUnBjTWFyc2hhbGxlci5qcyIsIi4uL3RtcC9wcm90b2NvbC9CaW5hcnlGcmFtZUhlYWRlci5qcyIsIi4uL3RtcC9wcm90b2NvbC9NZXNzYWdlRnJhbWVEaXNhc3NlbWJsZXIuanMiLCIuLi90bXAvdHJhbnNwb3J0L1RyYW5zcG9ydExpc3RlbmVyLmpzIiwiLi4vdG1wL3V0aWwvVmVyc2lvbi5qcyIsIi4uL3RtcC9wcm90b2NvbC9lbnVtcy9TZXJ2aWNlVHlwZS5qcyIsIi4uL3RtcC9wcm90b2NvbC9NZXNzYWdlRnJhbWVBc3NlbWJsZXIuanMiLCIuLi90bXAvcHJvdG9jb2wvZW51bXMvQ29udHJvbEZyYW1lVGFncy5qcyIsIi4uL3RtcC91dGlsL0JpdENvbnZlcnRlci5qcyIsIi4uL3RtcC9wcm90b2NvbC9TZGxQYWNrZXRGYWN0b3J5LmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9JbWFnZVR5cGUuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvSW1hZ2UuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvTWVudVBhcmFtcy5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvQWRkQ29tbWFuZC5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvQWRkQ29tbWFuZFJlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9ScGNOb3RpZmljYXRpb24uanMiLCIuLi90bXAvcnBjL2VudW1zL0hNSUxldmVsLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9BdWRpb1N0cmVhbWluZ1N0YXRlLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9WaWRlb1N0cmVhbWluZ1N0YXRlLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9TeXN0ZW1Db250ZXh0LmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9PbkhtaVN0YXR1cy5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvT25MYW5ndWFnZUNoYW5nZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvRmlsZVR5cGUuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1B1dEZpbGUuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1B1dEZpbGVSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvVGV4dEZpZWxkTmFtZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvQ2hhcmFjdGVyU2V0LmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1RleHRGaWVsZC5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9JbWFnZVJlc29sdXRpb24uanMiLCIuLi90bXAvcnBjL2VudW1zL0ltYWdlRmllbGROYW1lLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0ltYWdlRmllbGQuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvVG91Y2hFdmVudENhcGFiaWxpdGllcy5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9TY3JlZW5QYXJhbXMuanMiLCIuLi90bXAvcnBjL2VudW1zL0Rpc3BsYXlUeXBlLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9NZWRpYUNsb2NrRm9ybWF0LmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0Rpc3BsYXlDYXBhYmlsaXRpZXMuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvR3JpZC5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9Nb2R1bGVJbmZvLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9CdXR0b25OYW1lLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0J1dHRvbkNhcGFiaWxpdGllcy5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9Tb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1ByZXNldEJhbmtDYXBhYmlsaXRpZXMuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvVmVoaWNsZVR5cGUuanMiLCIuLi90bXAvcnBjL2VudW1zL0htaVpvbmVDYXBhYmlsaXRpZXMuanMiLCIuLi90bXAvcnBjL2VudW1zL1ByZXJlY29yZGVkU3BlZWNoLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9TYW1wbGluZ1JhdGUuanMiLCIuLi90bXAvcnBjL2VudW1zL0JpdHNQZXJTYW1wbGUuanMiLCIuLi90bXAvcnBjL2VudW1zL0F1ZGlvVHlwZS5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9BdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9WckNhcGFiaWxpdGllcy5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9ITUlDYXBhYmlsaXRpZXMuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1NldEFwcEljb24uanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1NldEFwcEljb25SZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvU29mdEJ1dHRvblR5cGUuanMiLCIuLi90bXAvcnBjL2VudW1zL1N5c3RlbUFjdGlvbi5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9Tb2Z0QnV0dG9uLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9NZXRhZGF0YVR5cGUuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvTWV0YWRhdGFUYWdzLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9UZXh0QWxpZ25tZW50LmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TaG93LmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TaG93UmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1VucmVnaXN0ZXJBcHBJbnRlcmZhY2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1VucmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvUnBjQ3JlYXRvci5qcyIsIi4uL3RtcC9ycGMvZW51bXMvVmlkZW9TdHJlYW1pbmdQcm90b2NvbC5qcyIsIi4uL3RtcC9ycGMvZW51bXMvVmlkZW9TdHJlYW1pbmdDb2RlYy5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9WaWRlb1N0cmVhbWluZ0Zvcm1hdC5qcyIsIi4uL3RtcC9wcm90b2NvbC9TZGxQcm90b2NvbEJhc2UuanMiLCIuLi90bXAvdHJhbnNwb3J0L2VudW1zL1RyYW5zcG9ydFR5cGUuanMiLCIuLi90bXAvdHJhbnNwb3J0L1NkbFBzbS5qcyIsIi4uL3RtcC90cmFuc3BvcnQvVHJhbnNwb3J0QmFzZS5qcyIsIi4uL3RtcC90cmFuc3BvcnQvV2ViU29ja2V0Q2xpZW50LmpzIiwiLi4vdG1wL3RyYW5zcG9ydC9UcmFuc3BvcnRDYWxsYmFjay5qcyIsIi4uL3RtcC90cmFuc3BvcnQvVHJhbnNwb3J0TWFuYWdlckJhc2UuanMiLCIuLi90bXAvdHJhbnNwb3J0L1dlYlNvY2tldFNlcnZlci5qcyIsIi4uL3RtcC90cmFuc3BvcnQvVHJhbnNwb3J0TWFuYWdlci5qcyIsIi4uL3RtcC9wcm90b2NvbC9TZGxQcm90b2NvbC5qcyIsIi4uL3RtcC9zZXNzaW9uL1NlcnZpY2VMaXN0ZW5lck1hcC5qcyIsIi4uL3RtcC9zdHJlYW1pbmcvdmlkZW8vVmlkZW9TdHJlYW1pbmdQYXJhbWV0ZXJzLmpzIiwiLi4vdG1wL3Nlc3Npb24vU2RsU2Vzc2lvbi5qcyIsIi4uL3RtcC9zZXNzaW9uL1NkbFNlc3Npb25MaXN0ZW5lci5qcyIsIi4uL3RtcC91dGlsL0FycmF5VG9vbHMuanMiLCIuLi90bXAvbWFuYWdlci9saWZlY3ljbGUvTGlmZWN5Y2xlTWFuYWdlci5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9WaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuanMiLCIuLi90bXAvc2Vzc2lvbi9TZGxTZXJ2aWNlTGlzdGVuZXIuanMiLCIuLi90bXAvdHJhbnNwb3J0L0N1c3RvbVRyYW5zcG9ydC5qcyIsIi4uL3RtcC90cmFuc3BvcnQvVHJhbnNwb3J0Q29uZmlnQmFzZS5qcyIsIi4uL3RtcC90cmFuc3BvcnQvQ3VzdG9tVHJhbnNwb3J0Q29uZmlnLmpzIiwiLi4vdG1wL3RyYW5zcG9ydC9Tc2xDb25maWcuanMiLCIuLi90bXAvdHJhbnNwb3J0L1dlYlNvY2tldENsaWVudENvbmZpZy5qcyIsIi4uL3RtcC90cmFuc3BvcnQvdXRpbC9UcmFuc3BvcnRSZWNvcmQuanMiLCIuLi90bXAvdHJhbnNwb3J0L1dlYlNvY2tldFNlcnZlckNvbmZpZy5qcyIsIi4uL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG4vLyBUT0RPIFRoaXMgY2xhc3MgbWF5IG9yIG1heSBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHJlbGVhc2UuIFdlIHNob3VsZCBkZXRlcm1pbmUgaWZcbi8vIHRoZXJlIGlzIGEgYmV0dGVyIGNvZGluZyBwYXR0ZXJuIGZvciB0aGlzIGZvciBqYXZhc2NyaXB0LlxuXG5jbGFzcyBBcHBDb25maWcge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydENvbmZpZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2FwcElkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYXBwTmFtZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2ljb25OYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5faWNvbkZpbGUgPSBudWxsO1xuICAgICAgICB0aGlzLl9zaG9ydEFwcE5hbWUgPSBudWxsO1xuICAgICAgICB0aGlzLl90dHNOYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdnJTeW5vbnltcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2lzTWVkaWFBcHAgPSBudWxsO1xuICAgICAgICB0aGlzLl9sYW5ndWFnZURlc2lyZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9obWlEaXNwbGF5TGFuZ3VhZ2VEZXNpcmVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYXBwVHlwZXMgPSBudWxsO1xuICAgICAgICB0aGlzLl9kYXlDb2xvclNjaGVtZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX25pZ2h0Q29sb3JTY2hlbWUgPSBudWxsO1xuICAgICAgICB0aGlzLl9taW5pbXVtUlBDVmVyc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuX21pbmltdW1Qcm90b2NvbFZlcnNpb24gPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtUcmFuc3BvcnRDb25maWdCYXNlfSB0cmFuc3BvcnRDb25maWdcbiAgICAqIEByZXR1cm4ge0FwcENvbmZpZ31cbiAgICAqL1xuICAgIHNldFRyYW5zcG9ydENvbmZpZyAodHJhbnNwb3J0Q29uZmlnKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydENvbmZpZyA9IHRyYW5zcG9ydENvbmZpZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtUcmFuc3BvcnRDb25maWdCYXNlfVxuICAgICovXG4gICAgZ2V0VHJhbnNwb3J0Q29uZmlnICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydENvbmZpZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBhcHBJZFxuICAgICogQHJldHVybiB7QXBwQ29uZmlnfVxuICAgICovXG4gICAgc2V0QXBwSWQgKGFwcElkKSB7XG4gICAgICAgIHRoaXMuX2FwcElkID0gYXBwSWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0QXBwSWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwSWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gYXBwTmFtZVxuICAgICogQHJldHVybiB7QXBwQ29uZmlnfVxuICAgICovXG4gICAgc2V0QXBwTmFtZSAoYXBwTmFtZSkge1xuICAgICAgICB0aGlzLl9hcHBOYW1lID0gYXBwTmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBnZXRBcHBOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcE5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gaWNvbk5hbWVcbiAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gZmlsZURhdGFcbiAgICAqIEByZXR1cm4ge0FwcENvbmZpZ31cbiAgICAqL1xuICAgIHNldEFwcEljb24gKGljb25OYW1lID0gJ2ljb24ucG5nJywgZmlsZURhdGEpIHtcbiAgICAgICAgLy8gVE9ETyBjcmVhdGUgU2RsQXJ0d29ya1xuICAgICAgICB0aGlzLl9pY29uTmFtZSA9IGljb25OYW1lO1xuICAgICAgICB0aGlzLl9pY29uRmlsZSA9IGZpbGVEYXRhO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0QXBwSWNvbk5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faWNvbk5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtVaW50OEFycmF5fVxuICAgICovXG4gICAgZ2V0QXBwSWNvbkZpbGVEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ljb25GaWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHNob3J0QXBwTmFtZVxuICAgICogQHJldHVybiB7QXBwQ29uZmlnfVxuICAgICovXG4gICAgc2V0U2hvcnRBcHBOYW1lIChzaG9ydEFwcE5hbWUpIHtcbiAgICAgICAgdGhpcy5fc2hvcnRBcHBOYW1lID0gc2hvcnRBcHBOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIGdldFNob3J0QXBwTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaG9ydEFwcE5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0FycmF5PFRUU0NodW5rPn0gdHRzTmFtZVxuICAgICogQHJldHVybiB7QXBwQ29uZmlnfVxuICAgICovXG4gICAgc2V0VHRzTmFtZSAodHRzTmFtZSkge1xuICAgICAgICB0aGlzLl90dHNOYW1lID0gdHRzTmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtBcnJheTxUVFNDaHVuaz59XG4gICAgKi9cbiAgICBnZXRUdHNOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R0c05hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0FycmF5PFN0cmluZz59IHZyU3lub255bXNcbiAgICAqIEByZXR1cm4ge0FwcENvbmZpZ31cbiAgICAqL1xuICAgIHNldFZyU3lub255bXMgKHZyU3lub255bXMpIHtcbiAgICAgICAgdGhpcy5fdnJTeW5vbnltcyA9IHZyU3lub255bXM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn1cbiAgICAqL1xuICAgIGdldFZyU3lub255bXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdnJTeW5vbnltcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNNZWRpYUFwcFxuICAgICogQHJldHVybiB7QXBwQ29uZmlnfVxuICAgICovXG4gICAgc2V0SXNNZWRpYUFwcCAoaXNNZWRpYUFwcCkge1xuICAgICAgICB0aGlzLl9pc01lZGlhQXBwID0gaXNNZWRpYUFwcDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgaXNNZWRpYUFwcCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc01lZGlhQXBwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtMYW5ndWFnZX0gbGFuZ3VhZ2VEZXNpcmVkXG4gICAgKiBAcmV0dXJuIHtBcHBDb25maWd9XG4gICAgKi9cbiAgICBzZXRMYW5ndWFnZURlc2lyZWQgKGxhbmd1YWdlRGVzaXJlZCkge1xuICAgICAgICB0aGlzLl9sYW5ndWFnZURlc2lyZWQgPSBsYW5ndWFnZURlc2lyZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TGFuZ3VhZ2V9XG4gICAgKi9cbiAgICBnZXRMYW5ndWFnZURlc2lyZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VEZXNpcmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtMYW5ndWFnZX0gaG1pRGlzcGxheUxhbmd1YWdlRGVzaXJlZFxuICAgICogQHJldHVybiB7QXBwQ29uZmlnfVxuICAgICovXG4gICAgc2V0SG1pRGlzcGxheUxhbmd1YWdlRGVzaXJlZCAoaG1pRGlzcGxheUxhbmd1YWdlRGVzaXJlZCkge1xuICAgICAgICB0aGlzLl9obWlEaXNwbGF5TGFuZ3VhZ2VEZXNpcmVkID0gaG1pRGlzcGxheUxhbmd1YWdlRGVzaXJlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtMYW5ndWFnZX1cbiAgICAqL1xuICAgIGdldEhtaURpc3BsYXlMYW5ndWFnZURlc2lyZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faG1pRGlzcGxheUxhbmd1YWdlRGVzaXJlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7QXJyYXk8QXBwSE1JVHlwZT59IGFwcFR5cGVzIGFuIGFycmF5IG9mIG9yZGVyZWQgYXBwIHR5cGVzXG4gICAgKiBAcmV0dXJuIHtBcHBDb25maWd9XG4gICAgKi9cbiAgICBzZXRBcHBUeXBlcyAoYXBwVHlwZXMpIHtcbiAgICAgICAgdGhpcy5fYXBwVHlwZXMgPSBhcHBUeXBlcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtBcnJheTxBcHBITUlUeXBlPn1cbiAgICAqL1xuICAgIGdldEFwcFR5cGVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcFR5cGVzO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1RlbXBsYXRlQ29sb3JTY2hlbWV9IGRheUNvbG9yU2NoZW1lXG4gICAgKiBAcmV0dXJuIHtBcHBDb25maWd9XG4gICAgKi9cbiAgICBzZXREYXlDb2xvclNjaGVtZSAoZGF5Q29sb3JTY2hlbWUpIHtcbiAgICAgICAgdGhpcy5fZGF5Q29sb3JTY2hlbWUgPSBkYXlDb2xvclNjaGVtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUNvbG9yU2NoZW1lfVxuICAgICovXG4gICAgZ2V0RGF5Q29sb3JTY2hlbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF5Q29sb3JTY2hlbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1RlbXBsYXRlQ29sb3JTY2hlbWV9IG5pZ2h0Q29sb3JTY2hlbWVcbiAgICAqIEByZXR1cm4ge0FwcENvbmZpZ31cbiAgICAqL1xuICAgIHNldE5pZ2h0Q29sb3JTY2hlbWUgKG5pZ2h0Q29sb3JTY2hlbWUpIHtcbiAgICAgICAgdGhpcy5fbmlnaHRDb2xvclNjaGVtZSA9IG5pZ2h0Q29sb3JTY2hlbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7VGVtcGxhdGVDb2xvclNjaGVtZX1cbiAgICAqL1xuICAgIGdldE5pZ2h0Q29sb3JTY2hlbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmlnaHRDb2xvclNjaGVtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFRoZSBtaW5pbXVtIFJQQyB2ZXJzaW9uIHRoYXQgd2lsbCBiZSBwZXJtaXR0ZWQgdG8gY29ubmVjdC5cbiAgICAqIElmIHRoZSBSUEMgdmVyc2lvbiBvZiB0aGUgaGVhZCB1bml0IGNvbm5lY3RlZCBpcyBiZWxvdyB0aGlzIHZlcnNpb24sIGFuIFVucmVnaXN0ZXJBcHBJbnRlcmZhY2Ugd2lsbCBiZSBzZW50LlxuICAgICpcbiAgICAqIEBwYXJhbSB7VmVyc2lvbn0gbWluaW11bVJQQ1ZlcnNpb25cbiAgICAqIEByZXR1cm4ge0FwcENvbmZpZ31cbiAgICAqL1xuICAgIHNldE1pbmltdW1SUENWZXJzaW9uIChtaW5pbXVtUlBDVmVyc2lvbikge1xuICAgICAgICB0aGlzLl9taW5pbXVtUlBDVmVyc2lvbiA9IG1pbmltdW1SUENWZXJzaW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICogQHJldHVybiB7VmVyc2lvbn1cbiAgICAqL1xuICAgIGdldE1pbmltdW1SUENWZXJzaW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pbmltdW1SUENWZXJzaW9uO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgKiBTZXRzIHRoZSBtaW5pbXVtIHByb3RvY29sIHZlcnNpb24gdGhhdCB3aWxsIGJlIHBlcm1pdHRlZCB0byBjb25uZWN0LlxuICAgICogSWYgdGhlIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIGhlYWQgdW5pdCBjb25uZWN0ZWQgaXMgYmVsb3cgdGhpcyB2ZXJzaW9uLFxuICAgICogdGhlIGFwcCB3aWxsIGRpc2Nvbm5lY3Qgd2l0aCBhbiBFbmRTZXJ2aWNlIHByb3RvY29sIG1lc3NhZ2UgYW5kIHdpbGwgbm90IHJlZ2lzdGVyLlxuICAgICogQHBhcmFtIHtWZXJzaW9ufSBtaW5pbXVtUHJvdG9jb2xWZXJzaW9uXG4gICAgKiBAcmV0dXJuIHtBcHBDb25maWd9XG4gICAgKi9cbiAgICBzZXRNaW5pbXVtUHJvdG9jb2xWZXJzaW9uIChtaW5pbXVtUHJvdG9jb2xWZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuX21pbmltdW1Qcm90b2NvbFZlcnNpb24gPSBtaW5pbXVtUHJvdG9jb2xWZXJzaW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1ZlcnNpb259XG4gICAgKi9cbiAgICBnZXRNaW5pbXVtUHJvdG9jb2xWZXJzaW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pbmltdW1Qcm90b2NvbFZlcnNpb247XG4gICAgfVxufVxuXG5leHBvcnQgeyBBcHBDb25maWcgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMaWZlY3ljbGVMaXN0ZW5lclxuICovXG5jbGFzcyBMaWZlY3ljbGVMaXN0ZW5lciB7XG4gICAgLyoqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuX29uUHJveHlDb25uZWN0ZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblByb3h5Q2xvc2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25TZXJ2aWNlU3RhcnRlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uU2VydmljZUVuZGVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25FcnJvciA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBzZXRPblByb3h5Q29ubmVjdGVkIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9vblByb3h5Q29ubmVjdGVkID0gbGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBzZXRPblByb3h5Q2xvc2VkIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9vblByb3h5Q2xvc2VkID0gbGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBzZXRPblNlcnZpY2VTdGFydGVkIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9vblNlcnZpY2VTdGFydGVkID0gbGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBzZXRPblNlcnZpY2VFbmRlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25TZXJ2aWNlRW5kZWQgPSBsaXN0ZW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHNldE9uRXJyb3IgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX29uRXJyb3IgPSBsaXN0ZW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0xpZmVjeWNsZU1hbmFnZXJ9IGxpZmVjeWNsZU1hbmFnZXJcblxuICAgICAqL1xuICAgIG9uUHJveHlDb25uZWN0ZWQgKGxpZmVjeWNsZU1hbmFnZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vblByb3h5Q29ubmVjdGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vblByb3h5Q29ubmVjdGVkKGxpZmVjeWNsZU1hbmFnZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtMaWZlY3ljbGVNYW5hZ2VyfSBsaWZlY3ljbGVNYW5hZ2VyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGluZm9cbiAgICAgKiBAcGFyYW0ge1NkbERpc2Nvbm5lY3RlZFJlYXNvbn0gcmVhc29uXG4gICAgICovXG4gICAgb25Qcm94eUNsb3NlZCAobGlmZWN5Y2xlTWFuYWdlciwgaW5mbywgcmVhc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25Qcm94eUNsb3NlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25Qcm94eUNsb3NlZChsaWZlY3ljbGVNYW5hZ2VyLCBpbmZvLCByZWFzb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKi9cbiAgICBvblNlcnZpY2VTdGFydGVkIChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklELCBjb3JyZWxhdGlvbklEKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25TZXJ2aWNlU3RhcnRlZChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklELCBjb3JyZWxhdGlvbklEKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICovXG4gICAgb25TZXJ2aWNlRW5kZWQgKHNlcnZpY2VUeXBlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25TZXJ2aWNlRW5kZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uU2VydmljZUVuZGVkKHNlcnZpY2VUeXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TGlmZWN5Y2xlTWFuYWdlcn0gbGlmZWN5Y2xlTWFuYWdlclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmZvXG4gICAgICovXG4gICAgb25FcnJvciAobGlmZWN5Y2xlTWFuYWdlciwgaW5mbykge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IobGlmZWN5Y2xlTWFuYWdlciwgaW5mbyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7IExpZmVjeWNsZUxpc3RlbmVyIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmNsYXNzIEVudW0ge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIC8vIGludGVudGlvbmFsbHkgZW1wdHlcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgYSBnaXZlbiB2YWx1ZSBpZiB0aGUgdmFsdWUgaXMgZm91bmQgd2l0aGluIHRoZSBrZXk6dmFsdWUgbWFwXG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIGluIHRoZSBtYXBcbiAgICAqIEBwYXJhbSBtYXAge09iamVjdH0gLSBBbiBtYXAgb2Ygc3RyaW5nIHByb3BlcnRpZXMgdG8gcHJpbWl0aXZlIHZhbHVlc1xuICAgICogQHJldHVybiB7bnVsbHxTdHJpbmd9IC0gUmV0dXJucyBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIF9rZXlGb3JWYWx1ZSAodmFsdWUsIG1hcCkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtYXApIHtcbiAgICAgICAgICAgIGlmIChtYXBba2V5XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBBIG1ldGhvZCBmb3Igc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgdGhhdCBkb2VzIHdoYXQgX2tleUZvclZhbHVlIGRvZXNcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21ldGhvZCBtdXN0IGJlIG92ZXJyaWRkZW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGlmIHRoZSBrZXkgaXMgZm91bmQgd2l0aGluIHRoZSBrZXk6dmFsdWUgbWFwXG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIGluIHRoZSBtYXBcbiAgICAqIEBwYXJhbSBtYXAge09iamVjdH0gLSBBbiBtYXAgb2Ygc3RyaW5nIHByb3BlcnRpZXMgdG8gcHJpbWl0aXZlIHZhbHVlc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMgX3ZhbHVlRm9yS2V5IChrZXksIG1hcCkge1xuICAgICAgICByZXR1cm4gbWFwW2tleV0gfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEEgbWV0aG9kIGZvciBzdWJjbGFzc2VzIHRvIGltcGxlbWVudCB0aGF0IGRvZXMgd2hhdCBfdmFsdWVGb3JLZXkgZG9lc1xuICAgICogQHBhcmFtIHZhbHVlIC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbWV0aG9kIG11c3QgYmUgb3ZlcnJpZGRlbicpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgRW51bSB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vdXRpbC9FbnVtLmpzJztcblxuY2xhc3MgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9pc0Zvcm1hdFJlcXVlc3RlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9ycGNTcGVjVmVyc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICovXG4gICAgZ2V0UGFyYW1ldGVycyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICAgICogQHJldHVybiB7Kn1cbiAgICAqL1xuICAgIGdldFBhcmFtZXRlciAoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJzW2tleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgKiBAcmV0dXJuIHtScGNTdHJ1Y3R9XG4gICAgKi9cbiAgICBzZXRQYXJhbWV0ZXIgKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fcGFyYW1ldGVyc1trZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcGFyYW1ldGVyc1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRDbGFzc1xuICAgICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICovXG4gICAgZ2V0T2JqZWN0ICh0Q2xhc3MsIGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0T2JqZWN0KHRDbGFzcywgdGhpcy5nZXRQYXJhbWV0ZXIoa2V5KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0Q2xhc3NcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAgICAqIEBwcml2YXRlXG4gICAgKiBAcmV0dXJuIHtudWxsfE9iamVjdH1cbiAgICAqL1xuICAgIF9mb3JtYXRPYmplY3QgKHRDbGFzcywgb2JqKSB7XG4gICAgICAgIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKG9iai5jb25zdHJ1Y3RvciA9PT0gdENsYXNzKSB7XG4gICAgICAgICAgICAvLyBpZiB0Q2xhc3MgaXMgU3RyaW5nIGFuZCBvYmogaXMgYSBTdHJpbmcsIHRoaXMgc2hvdWxkIGV4ZWN1dGVcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH0gZWxzZSBpZiAob2JqLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsgLy8gdGhpcyBjb3ZlcnMgdGhlIEVudW0gY2FzZSB0b29cbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH0gZWxzZSBpZiAob2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcbiAgICAgICAgICAgIGlmICh0Q2xhc3MucHJvdG90eXBlIGluc3RhbmNlb2YgUnBjU3RydWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0Q2xhc3Mob2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKG9iai5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHtcbiAgICAgICAgICAgIGlmIChvYmoubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dEFycmF5ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iaikge1xuICAgICAgICAgICAgICAgICAgICBvdXRBcnJheS5wdXNoKHRoaXMuX2Zvcm1hdE9iamVjdCh0Q2xhc3MsIGl0ZW0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dEFycmF5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdENsYXNzXG4gICAgKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzQXJyYXkgKGZhbHNlKVxuICAgICovXG4gICAgdmFsaWRhdGVUeXBlICh0Q2xhc3MsIG9iaiwgaXNBcnJheSA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmoubmFtZX0gbXVzdCBiZSBhbiBhcnJheSBjb250YWluaW5nIGl0ZW1zIG9mIHR5cGUgJHt0Q2xhc3MubmFtZX1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iaikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZSh0Q2xhc3MsIGl0ZW0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAodENsYXNzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEVudW0gJiYgdENsYXNzLmtleUZvclZhbHVlKG9iaikgPT09IG51bGwpXG4gICAgICAgICAgICB8fCAodENsYXNzLnByb3RvdHlwZSBpbnN0YW5jZW9mIFJwY1N0cnVjdCAmJiBvYmogIT09IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9PSB0Q2xhc3MpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iai5uYW1lfSBtdXN0IGJlIG9mIHR5cGUgJHt0Q2xhc3MubmFtZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgUnBjU3RydWN0IH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBGdW5jdGlvbklEXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBGdW5jdGlvbklEIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBSZWdpc3RlckFwcEludGVyZmFjZSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuUmVnaXN0ZXJBcHBJbnRlcmZhY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVucmVnaXN0ZXJBcHBJbnRlcmZhY2UgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlVucmVnaXN0ZXJBcHBJbnRlcmZhY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNldEdsb2JhbFByb3BlcnRpZXMgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlNldEdsb2JhbFByb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJlc2V0R2xvYmFsUHJvcGVydGllcyAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuUmVzZXRHbG9iYWxQcm9wZXJ0aWVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBBZGRDb21tYW5kICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5BZGRDb21tYW5kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBEZWxldGVDb21tYW5kICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5EZWxldGVDb21tYW5kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBBZGRTdWJNZW51ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5BZGRTdWJNZW51O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBEZWxldGVTdWJNZW51ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5EZWxldGVTdWJNZW51O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBDcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldCAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuQ3JlYXRlSW50ZXJhY3Rpb25DaG9pY2VTZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBlcmZvcm1JbnRlcmFjdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuUGVyZm9ybUludGVyYWN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBEZWxldGVJbnRlcmFjdGlvbkNob2ljZVNldCAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuRGVsZXRlSW50ZXJhY3Rpb25DaG9pY2VTZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IEFsZXJ0ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5BbGVydDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgU2hvdyAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuU2hvdztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgU3BlYWsgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlNwZWFrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBTZXRNZWRpYUNsb2NrVGltZXIgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlNldE1lZGlhQ2xvY2tUaW1lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgUGVyZm9ybUF1ZGlvUGFzc1RocnUgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlBlcmZvcm1BdWRpb1Bhc3NUaHJ1O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBFbmRBdWRpb1Bhc3NUaHJ1ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5FbmRBdWRpb1Bhc3NUaHJ1O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBTdWJzY3JpYmVCdXR0b24gKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlN1YnNjcmliZUJ1dHRvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgVW5zdWJzY3JpYmVCdXR0b24gKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlVuc3Vic2NyaWJlQnV0dG9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBTdWJzY3JpYmVWZWhpY2xlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuU3Vic2NyaWJlVmVoaWNsZURhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVuc3Vic2NyaWJlVmVoaWNsZURhdGEgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlVuc3Vic2NyaWJlVmVoaWNsZURhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IEdldFZlaGljbGVEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5HZXRWZWhpY2xlRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgUmVhZERJRCAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuUmVhZERJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgR2V0RFRDcyAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuR2V0RFRDcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgU2Nyb2xsYWJsZU1lc3NhZ2UgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlNjcm9sbGFibGVNZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBTbGlkZXIgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlNsaWRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgU2hvd0NvbnN0YW50VEJUICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5TaG93Q29uc3RhbnRUQlQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IEFsZXJ0TWFuZXV2ZXIgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkFsZXJ0TWFuZXV2ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVwZGF0ZVR1cm5MaXN0ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5VcGRhdGVUdXJuTGlzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ2hhbmdlUmVnaXN0cmF0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5DaGFuZ2VSZWdpc3RyYXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IEdlbmVyaWNSZXNwb25zZSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuR2VuZXJpY1Jlc3BvbnNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBQdXRGaWxlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5QdXRGaWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBEZWxldGVGaWxlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5EZWxldGVGaWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBMaXN0RmlsZXMgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkxpc3RGaWxlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgU2V0QXBwSWNvbiAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuU2V0QXBwSWNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgU2V0RGlzcGxheUxheW91dCAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuU2V0RGlzcGxheUxheW91dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgRGlhZ25vc3RpY01lc3NhZ2UgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkRpYWdub3N0aWNNZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBTeXN0ZW1SZXF1ZXN0ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5TeXN0ZW1SZXF1ZXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBTZW5kTG9jYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlNlbmRMb2NhdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgRGlhbE51bWJlciAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuRGlhbE51bWJlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgQnV0dG9uUHJlc3MgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkJ1dHRvblByZXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBHZXRJbnRlcmlvclZlaGljbGVEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5HZXRJbnRlcmlvclZlaGljbGVEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBTZXRJbnRlcmlvclZlaGljbGVEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5TZXRJbnRlcmlvclZlaGljbGVEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBHZXRXYXlQb2ludHMgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkdldFdheVBvaW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgU3Vic2NyaWJlV2F5UG9pbnRzICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5TdWJzY3JpYmVXYXlQb2ludHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVuc3Vic2NyaWJlV2F5UG9pbnRzICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5VbnN1YnNjcmliZVdheVBvaW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgR2V0U3lzdGVtQ2FwYWJpbGl0eSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuR2V0U3lzdGVtQ2FwYWJpbGl0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgU2VuZEhhcHRpY0RhdGEgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlNlbmRIYXB0aWNEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBTZXRDbG91ZEFwcFByb3BlcnRpZXMgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlNldENsb3VkQXBwUHJvcGVydGllcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgR2V0Q2xvdWRBcHBQcm9wZXJ0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5HZXRDbG91ZEFwcFByb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IFB1Ymxpc2hBcHBTZXJ2aWNlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5QdWJsaXNoQXBwU2VydmljZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgR2V0QXBwU2VydmljZURhdGEgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkdldEFwcFNlcnZpY2VEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBHZXRGaWxlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5HZXRGaWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBQZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5QZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBVbnB1Ymxpc2hBcHBTZXJ2aWNlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5VbnB1Ymxpc2hBcHBTZXJ2aWNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBDYW5jZWxJbnRlcmFjdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuQ2FuY2VsSW50ZXJhY3Rpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IENsb3NlQXBwbGljYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkNsb3NlQXBwbGljYXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNob3dBcHBNZW51ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5TaG93QXBwTWVudTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ3JlYXRlV2luZG93ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5DcmVhdGVXaW5kb3c7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IERlbGV0ZVdpbmRvdyAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuRGVsZXRlV2luZG93O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBHZXRJbnRlcmlvclZlaGljbGVEYXRhQ29uc2VudCAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJlbGVhc2VJbnRlcmlvclZlaGljbGVEYXRhTW9kdWxlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5SZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgT25ITUlTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLk9uSE1JU3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBPbkFwcEludGVyZmFjZVVucmVnaXN0ZXJlZCAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuT25BcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9uQnV0dG9uRXZlbnQgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLk9uQnV0dG9uRXZlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9uQnV0dG9uUHJlc3MgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLk9uQnV0dG9uUHJlc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9uVmVoaWNsZURhdGEgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLk9uVmVoaWNsZURhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9uQ29tbWFuZCAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuT25Db21tYW5kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBPblRCVENsaWVudFN0YXRlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5PblRCVENsaWVudFN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBPbkRyaXZlckRpc3RyYWN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5PbkRyaXZlckRpc3RyYWN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBPblBlcm1pc3Npb25zQ2hhbmdlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5PblBlcm1pc3Npb25zQ2hhbmdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBPbkF1ZGlvUGFzc1RocnUgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLk9uQXVkaW9QYXNzVGhydTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgT25MYW5ndWFnZUNoYW5nZSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuT25MYW5ndWFnZUNoYW5nZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgT25LZXlib2FyZElucHV0ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5PbktleWJvYXJkSW5wdXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9uVG91Y2hFdmVudCAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuT25Ub3VjaEV2ZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBPblN5c3RlbVJlcXVlc3QgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLk9uU3lzdGVtUmVxdWVzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgT25IYXNoQ2hhbmdlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5Pbkhhc2hDaGFuZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9uSW50ZXJpb3JWZWhpY2xlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuT25JbnRlcmlvclZlaGljbGVEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBPbldheVBvaW50Q2hhbmdlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5PbldheVBvaW50Q2hhbmdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBPblJDU3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5PblJDU3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBPbkFwcFNlcnZpY2VEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5PbkFwcFNlcnZpY2VEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBPblN5c3RlbUNhcGFiaWxpdHlVcGRhdGVkICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5PblN5c3RlbUNhcGFiaWxpdHlVcGRhdGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl92YWx1ZUZvcktleShrZXksIEZ1bmN0aW9uSUQuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX2tleUZvclZhbHVlKHZhbHVlLCBGdW5jdGlvbklELl9NQVApO1xuICAgIH1cbn1cblxuRnVuY3Rpb25JRC5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ1JlZ2lzdGVyQXBwSW50ZXJmYWNlJzogICAgICAgICAgICAgICAgMHgwMSxcbiAgICAnVW5yZWdpc3RlckFwcEludGVyZmFjZSc6ICAgICAgICAgICAgICAweDAyLFxuICAgICdTZXRHbG9iYWxQcm9wZXJ0aWVzJzogICAgICAgICAgICAgICAgIDB4MDMsXG4gICAgJ1Jlc2V0R2xvYmFsUHJvcGVydGllcyc6ICAgICAgICAgICAgICAgMHgwNCxcbiAgICAnQWRkQ29tbWFuZCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1LFxuICAgICdEZWxldGVDb21tYW5kJzogICAgICAgICAgICAgICAgICAgICAgIDB4MDYsXG4gICAgJ0FkZFN1Yk1lbnUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNyxcbiAgICAnRGVsZXRlU3ViTWVudSc6ICAgICAgICAgICAgICAgICAgICAgICAweDA4LFxuICAgICdDcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldCc6ICAgICAgICAgIDB4MDksXG4gICAgJ1BlcmZvcm1JbnRlcmFjdGlvbic6ICAgICAgICAgICAgICAgICAgMHgwQSxcbiAgICAnRGVsZXRlSW50ZXJhY3Rpb25DaG9pY2VTZXQnOiAgICAgICAgICAweDBCLFxuICAgICdBbGVydCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEMsXG4gICAgJ1Nob3cnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRCxcbiAgICAnU3BlYWsnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBFLFxuICAgICdTZXRNZWRpYUNsb2NrVGltZXInOiAgICAgICAgICAgICAgICAgIDB4MEYsXG4gICAgJ1BlcmZvcm1BdWRpb1Bhc3NUaHJ1JzogICAgICAgICAgICAgICAgMHgxMCxcbiAgICAnRW5kQXVkaW9QYXNzVGhydSc6ICAgICAgICAgICAgICAgICAgICAweDExLFxuICAgICdTdWJzY3JpYmVCdXR0b24nOiAgICAgICAgICAgICAgICAgICAgIDB4MTIsXG4gICAgJ1Vuc3Vic2NyaWJlQnV0dG9uJzogICAgICAgICAgICAgICAgICAgMHgxMyxcbiAgICAnU3Vic2NyaWJlVmVoaWNsZURhdGEnOiAgICAgICAgICAgICAgICAweDE0LFxuICAgICdVbnN1YnNjcmliZVZlaGljbGVEYXRhJzogICAgICAgICAgICAgIDB4MTUsXG4gICAgJ0dldFZlaGljbGVEYXRhJzogICAgICAgICAgICAgICAgICAgICAgMHgxNixcbiAgICAnUmVhZERJRCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE3LFxuICAgICdHZXREVENzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgsXG4gICAgJ1Njcm9sbGFibGVNZXNzYWdlJzogICAgICAgICAgICAgICAgICAgMHgxOSxcbiAgICAnU2xpZGVyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFBLFxuICAgICdTaG93Q29uc3RhbnRUQlQnOiAgICAgICAgICAgICAgICAgICAgIDB4MUIsXG4gICAgJ0FsZXJ0TWFuZXV2ZXInOiAgICAgICAgICAgICAgICAgICAgICAgMHgxQyxcbiAgICAnVXBkYXRlVHVybkxpc3QnOiAgICAgICAgICAgICAgICAgICAgICAweDFELFxuICAgICdDaGFuZ2VSZWdpc3RyYXRpb24nOiAgICAgICAgICAgICAgICAgIDB4MUUsXG4gICAgJ0dlbmVyaWNSZXNwb25zZSc6ICAgICAgICAgICAgICAgICAgICAgMHgxRixcbiAgICAnUHV0RmlsZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwLFxuICAgICdEZWxldGVGaWxlJzogICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEsXG4gICAgJ0xpc3RGaWxlcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMixcbiAgICAnU2V0QXBwSWNvbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAweDIzLFxuICAgICdTZXREaXNwbGF5TGF5b3V0JzogICAgICAgICAgICAgICAgICAgIDB4MjQsXG4gICAgJ0RpYWdub3N0aWNNZXNzYWdlJzogICAgICAgICAgICAgICAgICAgMHgyNSxcbiAgICAnU3lzdGVtUmVxdWVzdCc6ICAgICAgICAgICAgICAgICAgICAgICAweDI2LFxuICAgICdTZW5kTG9jYXRpb24nOiAgICAgICAgICAgICAgICAgICAgICAgIDB4MjcsXG4gICAgJ0RpYWxOdW1iZXInOiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyOCxcbiAgICAnQnV0dG9uUHJlc3MnOiAgICAgICAgICAgICAgICAgICAgICAgICAweDI5LFxuICAgICdHZXRJbnRlcmlvclZlaGljbGVEYXRhJzogICAgICAgICAgICAgIDB4MkIsXG4gICAgJ1NldEludGVyaW9yVmVoaWNsZURhdGEnOiAgICAgICAgICAgICAgMHgyQyxcbiAgICAnR2V0V2F5UG9pbnRzJzogICAgICAgICAgICAgICAgICAgICAgICAweDJELFxuICAgICdTdWJzY3JpYmVXYXlQb2ludHMnOiAgICAgICAgICAgICAgICAgIDB4MkUsXG4gICAgJ1Vuc3Vic2NyaWJlV2F5UG9pbnRzJzogICAgICAgICAgICAgICAgMHgyRixcbiAgICAnR2V0U3lzdGVtQ2FwYWJpbGl0eSc6ICAgICAgICAgICAgICAgICAweDMwLFxuICAgICdTZW5kSGFwdGljRGF0YSc6ICAgICAgICAgICAgICAgICAgICAgIDB4MzEsXG4gICAgJ1NldENsb3VkQXBwUHJvcGVydGllcyc6ICAgICAgICAgICAgICAgMHgzMixcbiAgICAnR2V0Q2xvdWRBcHBQcm9wZXJ0aWVzJzogICAgICAgICAgICAgICAweDMzLFxuICAgICdQdWJsaXNoQXBwU2VydmljZSc6ICAgICAgICAgICAgICAgICAgIDB4MzQsXG4gICAgJ0dldEFwcFNlcnZpY2VEYXRhJzogICAgICAgICAgICAgICAgICAgMHgzNSxcbiAgICAnR2V0RmlsZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM2LFxuICAgICdQZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9uJzogICAgICAgIDB4MzcsXG4gICAgJ1VucHVibGlzaEFwcFNlcnZpY2UnOiAgICAgICAgICAgICAgICAgMHgzOCxcbiAgICAnQ2FuY2VsSW50ZXJhY3Rpb24nOiAgICAgICAgICAgICAgICAgICAweDM5LFxuICAgICdDbG9zZUFwcGxpY2F0aW9uJzogICAgICAgICAgICAgICAgICAgIDB4M0EsXG4gICAgJ1Nob3dBcHBNZW51JzogICAgICAgICAgICAgICAgICAgICAgICAgMHgzQixcbiAgICAnQ3JlYXRlV2luZG93JzogICAgICAgICAgICAgICAgICAgICAgICAweDNDLFxuICAgICdEZWxldGVXaW5kb3cnOiAgICAgICAgICAgICAgICAgICAgICAgIDB4M0QsXG4gICAgJ0dldEludGVyaW9yVmVoaWNsZURhdGFDb25zZW50JzogICAgICAgMHgzRSxcbiAgICAnUmVsZWFzZUludGVyaW9yVmVoaWNsZURhdGFNb2R1bGUnOiAgICAweDNGLFxuICAgICdPbkhNSVN0YXR1cyc6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCxcbiAgICAnT25BcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWQnOiAgICAgICAgICAweDgwMDEsXG4gICAgJ09uQnV0dG9uRXZlbnQnOiAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAyLFxuICAgICdPbkJ1dHRvblByZXNzJzogICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMyxcbiAgICAnT25WZWhpY2xlRGF0YSc6ICAgICAgICAgICAgICAgICAgICAgICAweDgwMDQsXG4gICAgJ09uQ29tbWFuZCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA1LFxuICAgICdPblRCVENsaWVudFN0YXRlJzogICAgICAgICAgICAgICAgICAgIDB4ODAwNixcbiAgICAnT25Ecml2ZXJEaXN0cmFjdGlvbic6ICAgICAgICAgICAgICAgICAweDgwMDcsXG4gICAgJ09uUGVybWlzc2lvbnNDaGFuZ2UnOiAgICAgICAgICAgICAgICAgMHg4MDA4LFxuICAgICdPbkF1ZGlvUGFzc1RocnUnOiAgICAgICAgICAgICAgICAgICAgIDB4ODAwOSxcbiAgICAnT25MYW5ndWFnZUNoYW5nZSc6ICAgICAgICAgICAgICAgICAgICAweDgwMEEsXG4gICAgJ09uS2V5Ym9hcmRJbnB1dCc6ICAgICAgICAgICAgICAgICAgICAgMHg4MDBCLFxuICAgICdPblRvdWNoRXZlbnQnOiAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwQyxcbiAgICAnT25TeXN0ZW1SZXF1ZXN0JzogICAgICAgICAgICAgICAgICAgICAweDgwMEQsXG4gICAgJ09uSGFzaENoYW5nZSc6ICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDBFLFxuICAgICdPbkludGVyaW9yVmVoaWNsZURhdGEnOiAgICAgICAgICAgICAgIDB4ODAwRixcbiAgICAnT25XYXlQb2ludENoYW5nZSc6ICAgICAgICAgICAgICAgICAgICAweDgwMTAsXG4gICAgJ09uUkNTdGF0dXMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDExLFxuICAgICdPbkFwcFNlcnZpY2VEYXRhJzogICAgICAgICAgICAgICAgICAgIDB4ODAxMixcbiAgICAnT25TeXN0ZW1DYXBhYmlsaXR5VXBkYXRlZCc6ICAgICAgICAgICAweDgwMTMsXG59KTtcblxuZXhwb3J0IHsgRnVuY3Rpb25JRCB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBScGNNZXNzYWdlXG4gKiBAcHJvcGVydHkge1JwY1R5cGV9IHJwY1R5cGVcbiAqL1xuY2xhc3MgUnBjTWVzc2FnZSBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLypcbiAgICB7XG4gICAgICAgIFwicnBjVHlwZVwiOiBcIlJlcXVlc3RcIixcbiAgICAgICAgXCJmdW5jdGlvbk5hbWVcIjogXCJSZWdpc3RlckFwcEludGVyZmFjZVwiLFxuICAgICAgICBcImNvb3JlbGF0aW9uSURcIjogXCIzMjA5NDhcIixcbiAgICAgICAgXCJpc0VuY3J5cHRlZFwiOiBmYWxzZSxcbiAgICAgICAgXCJwYXJhbWV0ZXJzXCI6IHtcbiAgICAgICAgICAgIFwiYXBwTmFtZVwiOiBcIkhlbGxvXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJidWxrRGF0YVwiOiBcIi4uLlwiLFxuICAgIH1cbiAgICAqL1xuXG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHN0b3JlLnBhcmFtZXRlcnMpO1xuICAgICAgICB0aGlzLl9pc0VuY3J5cHRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9ycGNUeXBlID0gc3RvcmUucnBjVHlwZTtcbiAgICAgICAgdGhpcy5fZnVuY3Rpb25OYW1lID0gc3RvcmUuZnVuY3Rpb25OYW1lO1xuICAgICAgICB0aGlzLl9jb3JyZWxhdGlvbklEID0gc3RvcmUuY29ycmVsYXRpb25JRDtcbiAgICAgICAgdGhpcy5zZXRCdWxrRGF0YShzdG9yZS5idWxrRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtScGNUeXBlfVxuICAgICovXG4gICAgZ2V0UlBDVHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ycGNUeXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtScGNUeXBlfSB0eXBlXG4gICAgKiBAcmV0dXJuIHtScGNNZXNzYWdlfVxuICAgICovXG4gICAgc2V0UlBDVHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLl9ycGNUeXBlID0gdHlwZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0Z1bmN0aW9uSUR9IHR5cGVcbiAgICAqL1xuICAgIGdldEZ1bmN0aW9uTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mdW5jdGlvbk5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Z1bmN0aW9uSUR9IG5hbWVcbiAgICAqIEByZXR1cm4ge1JwY01lc3NhZ2V9XG4gICAgKi9cbiAgICBzZXRGdW5jdGlvbk5hbWUgKG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5fZnVuY3Rpb25OYW1lID0gRnVuY3Rpb25JRC5rZXlGb3JWYWx1ZShuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2Z1bmN0aW9uTmFtZSA9IG5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ30gdHlwZVxuICAgICovXG4gICAgZ2V0Q29ycmVsYXRpb25JZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3JyZWxhdGlvbklEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAqIEByZXR1cm4ge1JwY01lc3NhZ2V9XG4gICAgKi9cbiAgICBzZXRDb3JyZWxhdGlvbklkIChpZCkge1xuICAgICAgICB0aGlzLl9jb3JyZWxhdGlvbklEID0gaWQ7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtVaW50OEFycmF5fSBkYXRhXG4gICAgKi9cbiAgICBnZXRCdWxrRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWxrRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7VUludDhBcnJheX0gZGF0YVxuICAgICogQHJldHVybiB7UnBjTWVzc2FnZX1cbiAgICAqL1xuICAgIHNldEJ1bGtEYXRhIChkYXRhID0gbnVsbCkge1xuICAgICAgICBpZiAoZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fYnVsa0RhdGEgPSBkYXRhLnNsaWNlKDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYnVsa0RhdGEgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0SXNFbmNyeXB0ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNFbmNyeXB0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJvb2xcbiAgICAqIEByZXR1cm4ge1JwY01lc3NhZ2V9XG4gICAgKi9cbiAgICBzZXRJc0VuY3J5cHRlZCAoYm9vbCkge1xuICAgICAgICB0aGlzLl9pc0VuY3J5cHRlZCA9IGJvb2w7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgeyBScGNNZXNzYWdlIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IFJwY1R5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFJwY1R5cGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5PVElGSUNBVElPTiAoKSB7XG4gICAgICAgIHJldHVybiBScGNUeXBlLl9NQVAuTk9USUZJQ0FUSU9OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJFU1BPTlNFICgpIHtcbiAgICAgICAgcmV0dXJuIFJwY1R5cGUuX01BUC5SRVNQT05TRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSRVFVRVNUICgpIHtcbiAgICAgICAgcmV0dXJuIFJwY1R5cGUuX01BUC5SRVFVRVNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBScGNUeXBlLl92YWx1ZUZvcktleShrZXksIFJwY1R5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFJwY1R5cGUuX2tleUZvclZhbHVlKHZhbHVlLCBScGNUeXBlLl9NQVApO1xuICAgIH1cbn1cblxuUnBjVHlwZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ05PVElGSUNBVElPTic6IDB4MixcbiAgICAnUkVTUE9OU0UnOiAweDEsXG4gICAgJ1JFUVVFU1QnOiAweDAsXG59KTtcblxuZXhwb3J0IHsgUnBjVHlwZSB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cblxuaW1wb3J0IHsgUnBjTWVzc2FnZSB9IGZyb20gJy4vUnBjTWVzc2FnZS5qcyc7XG5pbXBvcnQgeyBScGNUeXBlIH0gZnJvbSAnLi9lbnVtcy9ScGNUeXBlLmpzJztcblxuY2xhc3MgUnBjUmVxdWVzdCBleHRlbmRzIFJwY01lc3NhZ2Uge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldFJQQ1R5cGUoUnBjVHlwZS5SRVFVRVNUKTtcbiAgICAgICAgdGhpcy5fcHJvbWlzZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICovXG4gICAgZ2V0T25SUENSZXNwb25zZVByb21pc2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7UHJvbWlzZX0gcHJvbWlzZVxuICAgICogQHJldHVybiB7UnBjTWVzc2FnZX1cbiAgICAqL1xuICAgIHNldE9uUlBDUmVzcG9uc2VQcm9taXNlIChwcm9taXNlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFByb21pc2UsIHByb21pc2UpO1xuXG4gICAgICAgIHRoaXMuX3Byb21pc2UgPSBwcm9taXNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCB7IFJwY1JlcXVlc3QgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcblxuY2xhc3MgU2RsTXNnVmVyc2lvbiBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIG1ham9yIHZlcnNpb24gb2YgdGhpcyBvYmplY3RcbiAgICAqIEByZXR1cm4ge1NkbE1zZ1ZlcnNpb259XG4gICAgKi9cbiAgICBzZXRNYWpvclZlcnNpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNkbE1zZ1ZlcnNpb24uS0VZX01BSk9SX1ZFUlNJT04sIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoaXMgb2JqZWN0XG4gICAgKi9cbiAgICBnZXRNYWpvclZlcnNpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2RsTXNnVmVyc2lvbi5LRVlfTUFKT1JfVkVSU0lPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIG1pbm9yIHZlcnNpb24gb2YgdGhpcyBvYmplY3RcbiAgICAqIEByZXR1cm4ge1NkbE1zZ1ZlcnNpb259XG4gICAgKi9cbiAgICBzZXRNaW5vclZlcnNpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNkbE1zZ1ZlcnNpb24uS0VZX01JTk9SX1ZFUlNJT04sIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBtaW5vciB2ZXJzaW9uIG9mIHRoaXMgb2JqZWN0XG4gICAgKi9cbiAgICBnZXRNaW5vclZlcnNpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2RsTXNnVmVyc2lvbi5LRVlfTUlOT1JfVkVSU0lPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIHBhdGNoIHZlcnNpb24gb2YgdGhpcyBvYmplY3RcbiAgICAqIEByZXR1cm4ge1NkbE1zZ1ZlcnNpb259XG4gICAgKi9cbiAgICBzZXRQYXRjaFZlcnNpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNkbE1zZ1ZlcnNpb24uS0VZX1BBVENIX1ZFUlNJT04sIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBwYXRjaCB2ZXJzaW9uIG9mIHRoaXMgb2JqZWN0c1xuICAgICovXG4gICAgZ2V0UGF0Y2hWZXJzaW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNkbE1zZ1ZlcnNpb24uS0VZX1BBVENIX1ZFUlNJT04pO1xuICAgIH1cbn1cblxuU2RsTXNnVmVyc2lvbi5LRVlfTUFKT1JfVkVSU0lPTiA9ICdtYWpvclZlcnNpb24nO1xuU2RsTXNnVmVyc2lvbi5LRVlfTUlOT1JfVkVSU0lPTiA9ICdtaW5vclZlcnNpb24nO1xuU2RsTXNnVmVyc2lvbi5LRVlfUEFUQ0hfVkVSU0lPTiA9ICdwYXRjaFZlcnNpb24nO1xuXG5leHBvcnQgeyBTZGxNc2dWZXJzaW9uIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IFNwZWVjaENhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgU3BlZWNoQ2FwYWJpbGl0aWVzIGV4dGVuZHMgRW51bSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNDX1RFWFQgKCkge1xuICAgICAgICByZXR1cm4gU3BlZWNoQ2FwYWJpbGl0aWVzLl9NQVAuU0NfVEVYVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTQVBJX1BIT05FTUVTICgpIHtcbiAgICAgICAgcmV0dXJuIFNwZWVjaENhcGFiaWxpdGllcy5fTUFQLlNBUElfUEhPTkVNRVM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTEhQTFVTX1BIT05FTUVTICgpIHtcbiAgICAgICAgcmV0dXJuIFNwZWVjaENhcGFiaWxpdGllcy5fTUFQLkxIUExVU19QSE9ORU1FUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQUkVfUkVDT1JERUQgKCkge1xuICAgICAgICByZXR1cm4gU3BlZWNoQ2FwYWJpbGl0aWVzLl9NQVAuUFJFX1JFQ09SREVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNJTEVOQ0UgKCkge1xuICAgICAgICByZXR1cm4gU3BlZWNoQ2FwYWJpbGl0aWVzLl9NQVAuU0lMRU5DRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGSUxFICgpIHtcbiAgICAgICAgcmV0dXJuIFNwZWVjaENhcGFiaWxpdGllcy5fTUFQLkZJTEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFNwZWVjaENhcGFiaWxpdGllcy5fdmFsdWVGb3JLZXkoa2V5LCBTcGVlY2hDYXBhYmlsaXRpZXMuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFNwZWVjaENhcGFiaWxpdGllcy5fa2V5Rm9yVmFsdWUodmFsdWUsIFNwZWVjaENhcGFiaWxpdGllcy5fTUFQKTtcbiAgICB9XG59XG5cblNwZWVjaENhcGFiaWxpdGllcy5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ1NDX1RFWFQnOiAnVEVYVCcsXG4gICAgJ1NBUElfUEhPTkVNRVMnOiAnU0FQSV9QSE9ORU1FUycsXG4gICAgJ0xIUExVU19QSE9ORU1FUyc6ICdMSFBMVVNfUEhPTkVNRVMnLFxuICAgICdQUkVfUkVDT1JERUQnOiAnUFJFX1JFQ09SREVEJyxcbiAgICAnU0lMRU5DRSc6ICdTSUxFTkNFJyxcbiAgICAnRklMRSc6ICdGSUxFJyxcbn0pO1xuXG5leHBvcnQgeyBTcGVlY2hDYXBhYmlsaXRpZXMgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IFNwZWVjaENhcGFiaWxpdGllcyB9IGZyb20gJy4uL2VudW1zL1NwZWVjaENhcGFiaWxpdGllcy5qcyc7XG5cbmNsYXNzIFRUU0NodW5rIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0XG4gICAgKiBAcmV0dXJuIHtUVFNDaHVua31cbiAgICAqL1xuICAgIHNldFRleHQgKHRleHQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVFRTQ2h1bmsuS0VZX1RFWFQsIHRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIGdldFRleHQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVFRTQ2h1bmsuS0VZX1RFWFQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTcGVlY2hDYXBhYmlsaXRpZXN9IHR5cGVcbiAgICAqIEByZXR1cm4ge1RUU0NodW5rfVxuICAgICovXG4gICAgc2V0VHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTcGVlY2hDYXBhYmlsaXRpZXMsIHR5cGUpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFRUU0NodW5rLktFWV9UWVBFLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTcGVlY2hDYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBnZXRUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFNwZWVjaENhcGFiaWxpdGllcywgVFRTQ2h1bmsuS0VZX1RZUEUpO1xuICAgIH1cbn1cblxuVFRTQ2h1bmsuS0VZX1RFWFQgPSAndGV4dCc7XG5UVFNDaHVuay5LRVlfVFlQRSA9ICd0eXBlJztcblxuZXhwb3J0IHsgVFRTQ2h1bmsgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG5jbGFzcyBEZXZpY2VJbmZvIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBoYXJkd2FyZVxuICAgICogQHJldHVybiB7RGV2aWNlSW5mb31cbiAgICAqL1xuICAgIHNldEhhcmR3YXJlIChoYXJkd2FyZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTdHJpbmcsIGhhcmR3YXJlKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEZXZpY2VJbmZvLktFWV9IQVJEV0FSRSwgaGFyZHdhcmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIGdldEhhcmR3YXJlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERldmljZUluZm8uS0VZX0hBUkRXQVJFKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IGZpcm13YXJlUmV2XG4gICAgKiBAcmV0dXJuIHtEZXZpY2VJbmZvfVxuICAgICovXG4gICAgc2V0RmlybXdhcmVSZXYgKGZpcm13YXJlUmV2KSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFN0cmluZywgZmlybXdhcmVSZXYpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERldmljZUluZm8uS0VZX0ZJUk1XQVJFX1JFViwgZmlybXdhcmVSZXYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIGdldEZpcm13YXJlUmV2ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERldmljZUluZm8uS0VZX0ZJUk1XQVJFX1JFVik7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBvc1xuICAgICogQHJldHVybiB7RGV2aWNlSW5mb31cbiAgICAqL1xuICAgIHNldE9zIChvcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTdHJpbmcsIG9zKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEZXZpY2VJbmZvLktFWV9PUywgb3MpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIGdldE9zICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERldmljZUluZm8uS0VZX09TKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBvc1ZlcnNpb25cbiAgICAqIEByZXR1cm4ge0RldmljZUluZm99XG4gICAgKi9cbiAgICBzZXRPc1ZlcnNpb24gKG9zVmVyc2lvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTdHJpbmcsIG9zVmVyc2lvbik7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGV2aWNlSW5mby5LRVlfT1NfVkVSU0lPTiwgb3NWZXJzaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBnZXRPc1ZlcnNpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGV2aWNlSW5mby5LRVlfT1NfVkVSU0lPTik7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBjYXJyaWVyXG4gICAgKiBAcmV0dXJuIHtEZXZpY2VJbmZvfVxuICAgICovXG4gICAgc2V0Q2FycmllciAoY2Fycmllcikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTdHJpbmcsIGNhcnJpZXIpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERldmljZUluZm8uS0VZX0NBUlJJRVIsIGNhcnJpZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIGdldENhcnJpZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGV2aWNlSW5mby5LRVlfQ0FSUklFUik7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBtYXhOdW1iZXJSRkNPTU1Qb3J0c1xuICAgICogQHJldHVybiB7RGV2aWNlSW5mb31cbiAgICAqL1xuICAgIHNldE1heE51bWJlclJGQ09NTVBvcnRzIChtYXhOdW1iZXJSRkNPTU1Qb3J0cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShOdW1iZXIsIG1heE51bWJlclJGQ09NTVBvcnRzKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEZXZpY2VJbmZvLktFWV9NQVhfTlVNQkVSX1JGQ09NTV9QT1JUUywgbWF4TnVtYmVyUkZDT01NUG9ydHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIGdldE1heE51bWJlclJGQ09NTVBvcnRzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERldmljZUluZm8uS0VZX01BWF9OVU1CRVJfUkZDT01NX1BPUlRTKTtcbiAgICB9XG59XG5cbkRldmljZUluZm8uS0VZX0hBUkRXQVJFID0gJ2hhcmR3YXJlJztcbkRldmljZUluZm8uS0VZX0ZJUk1XQVJFX1JFViA9ICdmaXJtd2FyZVJldic7XG5EZXZpY2VJbmZvLktFWV9PUyA9ICdvcyc7XG5EZXZpY2VJbmZvLktFWV9PU19WRVJTSU9OID0gJ29zVmVyc2lvbic7XG5EZXZpY2VJbmZvLktFWV9DQVJSSUVSID0gJ2NhcnJpZXInO1xuRGV2aWNlSW5mby5LRVlfTUFYX05VTUJFUl9SRkNPTU1fUE9SVFMgPSAnbWF4TnVtYmVyUkZDT01NUG9ydHMnO1xuXG5leHBvcnQgeyBEZXZpY2VJbmZvIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcblxuY2xhc3MgQXBwSW5mbyBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gYXBwRGlzcGxheU5hbWVcbiAgICAqIEByZXR1cm4ge0FwcEluZm99XG4gICAgKi9cbiAgICBzZXRBcHBEaXNwbGF5TmFtZSAoYXBwRGlzcGxheU5hbWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXBwSW5mby5LRVlfQVBQX0RJU1BMQVlfTkFNRSwgYXBwRGlzcGxheU5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIGdldEFwcERpc3BsYXlOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEFwcEluZm8uS0VZX0FQUF9ESVNQTEFZX05BTUUpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gYXBwQnVuZGxlSURcbiAgICAqIEByZXR1cm4ge0FwcEluZm99XG4gICAgKi9cbiAgICBzZXRBcHBCdW5kbGVJRCAoYXBwQnVuZGxlSUQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXBwSW5mby5LRVlfQVBQX0JVTkRMRV9JRCwgYXBwQnVuZGxlSUQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIGdldEFwcEJ1bmRsZUlEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEFwcEluZm8uS0VZX0FQUF9CVU5ETEVfSUQpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gYXBwVmVyc2lvblxuICAgICogQHJldHVybiB7QXBwSW5mb31cbiAgICAqL1xuICAgIHNldEFwcFZlcnNpb24gKGFwcFZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXBwSW5mby5LRVlfQVBQX1ZFUlNJT04sIGFwcFZlcnNpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIGdldEFwcFZlcnNpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQXBwSW5mby5LRVlfQVBQX1ZFUlNJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IGFwcEljb24gc3RyaW5nIG9mIHRoZSBhcHAgaWNvbiBmaWxlIG5hbWVcbiAgICAqIEByZXR1cm4ge0FwcEluZm99XG4gICAgKi9cbiAgICBzZXRBcHBJY29uIChhcHBJY29uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFwcEluZm8uS0VZX0FQUF9JQ09OLCBhcHBJY29uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBnZXRBcHBJY29uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEFwcEluZm8uS0VZX0FQUF9JQ09OKTtcbiAgICB9XG59XG5cbkFwcEluZm8uS0VZX0FQUF9ESVNQTEFZX05BTUUgPSAnYXBwRGlzcGxheU5hbWUnO1xuQXBwSW5mby5LRVlfQVBQX0JVTkRMRV9JRCA9ICdhcHBCdW5kbGVJRCc7XG5BcHBJbmZvLktFWV9BUFBfVkVSU0lPTiA9ICdhcHBWZXJzaW9uJztcbkFwcEluZm8uS0VZX0FQUF9JQ09OID0gJ2FwcEljb24nO1xuXG5leHBvcnQgeyBBcHBJbmZvIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcblxuY2xhc3MgUkdCQ29sb3IgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtOdW1iZXJ9IHJlZFZhbHVlXG4gICAgKiBAcmV0dXJuIHtSR0JDb2xvcn1cbiAgICAqL1xuICAgIHNldFJlZFZhbHVlIChyZWRWYWx1ZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSR0JDb2xvci5LRVlfUkVELCByZWRWYWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgZ2V0UmVkVmFsdWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUkdCQ29sb3IuS0VZX1JFRCk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBncmVlblZhbHVlXG4gICAgKiBAcmV0dXJuIHtSR0JDb2xvcn1cbiAgICAqL1xuICAgIHNldEdyZWVuVmFsdWUgKGdyZWVuVmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUkdCQ29sb3IuS0VZX0dSRUVOLCBncmVlblZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBnZXRHcmVlblZhbHVlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJHQkNvbG9yLktFWV9HUkVFTik7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBibHVlVmFsdWVcbiAgICAqIEByZXR1cm4ge1JHQkNvbG9yfVxuICAgICovXG4gICAgc2V0Qmx1ZVZhbHVlIChibHVlVmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUkdCQ29sb3IuS0VZX0JMVUUsIGJsdWVWYWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgZ2V0Qmx1ZVZhbHVlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJHQkNvbG9yLktFWV9CTFVFKTtcbiAgICB9XG59XG5cblJHQkNvbG9yLktFWV9SRUQgPSAncmVkJztcblJHQkNvbG9yLktFWV9HUkVFTiA9ICdncmVlbic7XG5SR0JDb2xvci5LRVlfQkxVRSA9ICdibHVlJztcblxuZXhwb3J0IHsgUkdCQ29sb3IgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgUkdCQ29sb3IgfSBmcm9tICcuL1JHQkNvbG9yLmpzJztcblxuY2xhc3MgVGVtcGxhdGVDb2xvclNjaGVtZSBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1JHQkNvbG9yfSBwcmltYXJ5Q29sb3JcbiAgICAqIEByZXR1cm4ge1RlbXBsYXRlQ29sb3JTY2hlbWV9XG4gICAgKi9cbiAgICBzZXRQcmltYXJ5Q29sb3IgKHByaW1hcnlDb2xvcikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShSR0JDb2xvciwgcHJpbWFyeUNvbG9yKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihUZW1wbGF0ZUNvbG9yU2NoZW1lLktFWV9QUklNQVJZX0NPTE9SLCBwcmltYXJ5Q29sb3IpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1JHQkNvbG9yfVxuICAgICovXG4gICAgZ2V0UHJpbWFyeUNvbG9yICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFJHQkNvbG9yLCBUZW1wbGF0ZUNvbG9yU2NoZW1lLktFWV9QUklNQVJZX0NPTE9SKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7UkdCQ29sb3J9IHNlY29uZGFyeUNvbG9yXG4gICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUNvbG9yU2NoZW1lfVxuICAgICovXG4gICAgc2V0U2Vjb25kYXJ5Q29sb3IgKHNlY29uZGFyeUNvbG9yKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFJHQkNvbG9yLCBzZWNvbmRhcnlDb2xvcik7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVGVtcGxhdGVDb2xvclNjaGVtZS5LRVlfU0VDT05EQVJZX0NPTE9SLCBzZWNvbmRhcnlDb2xvcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7UkdCQ29sb3J9XG4gICAgKi9cbiAgICBnZXRTZWNvbmRhcnlDb2xvciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChSR0JDb2xvciwgVGVtcGxhdGVDb2xvclNjaGVtZS5LRVlfU0VDT05EQVJZX0NPTE9SKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7UkdCQ29sb3J9IGJhY2tncm91bmRDb2xvclxuICAgICogQHJldHVybiB7VGVtcGxhdGVDb2xvclNjaGVtZX1cbiAgICAqL1xuICAgIHNldEJhY2tncm91bmRDb2xvciAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFJHQkNvbG9yLCBiYWNrZ3JvdW5kQ29sb3IpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFRlbXBsYXRlQ29sb3JTY2hlbWUuS0VZX0JBQ0tHUk9VTkRfQ09MT1IsIGJhY2tncm91bmRDb2xvcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7UkdCQ29sb3J9XG4gICAgKi9cbiAgICBnZXRCYWNrZ3JvdW5kQ29sb3IgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoUkdCQ29sb3IsIFRlbXBsYXRlQ29sb3JTY2hlbWUuS0VZX0JBQ0tHUk9VTkRfQ09MT1IpO1xuICAgIH1cbn1cblxuVGVtcGxhdGVDb2xvclNjaGVtZS5LRVlfUFJJTUFSWV9DT0xPUiA9ICdwcmltYXJ5Q29sb3InO1xuVGVtcGxhdGVDb2xvclNjaGVtZS5LRVlfU0VDT05EQVJZX0NPTE9SID0gJ3NlY29uZGFyeUNvbG9yJztcblRlbXBsYXRlQ29sb3JTY2hlbWUuS0VZX0JBQ0tHUk9VTkRfQ09MT1IgPSAnYmFja2dyb3VuZENvbG9yJztcblxuZXhwb3J0IHsgVGVtcGxhdGVDb2xvclNjaGVtZSB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBMYW5ndWFnZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgTGFuZ3VhZ2UgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRU5fU0EgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5FTl9TQTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBIRV9JTCAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkhFX0lMO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJPX1JPICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuUk9fUk87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVUtfVUEgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5VS19VQTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBJRF9JRCAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLklEX0lEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZJX1ZOICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuVklfVk47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTVNfTVkgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5NU19NWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBISV9JTiAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkhJX0lOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5MX0JFICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuTkxfQkU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRUxfR1IgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5FTF9HUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBIVV9IVSAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkhVX0hVO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZJX0ZJICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuRklfRkk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU0tfU0sgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5TS19TSztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFTl9VUyAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkVOX1VTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEVTX01YICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuRVNfTVg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRlJfQ0EgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5GUl9DQTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBERV9ERSAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkRFX0RFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEVTX0VTICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuRVNfRVM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRU5fR0IgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5FTl9HQjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSVV9SVSAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLlJVX1JVO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRSX1RSICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuVFJfVFI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUExfUEwgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5QTF9QTDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGUl9GUiAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkZSX0ZSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IElUX0lUICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuSVRfSVQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU1ZfU0UgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5TVl9TRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQVF9QVCAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLlBUX1BUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5MX05MICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuTkxfTkw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRU5fQVUgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5FTl9BVTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBaSF9DTiAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLlpIX0NOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFpIX1RXICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuWkhfVFc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgSkFfSlAgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5KQV9KUDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBUl9TQSAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkFSX1NBO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEtPX0tSICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuS09fS1I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUFRfQlIgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5QVF9CUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDU19DWiAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkNTX0NaO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERBX0RLICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuREFfREs7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTk9fTk8gKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5OT19OTztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFTl9JTiAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkVOX0lOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRIX1RIICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuVEhfVEg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl92YWx1ZUZvcktleShrZXksIExhbmd1YWdlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fa2V5Rm9yVmFsdWUodmFsdWUsIExhbmd1YWdlLl9NQVApO1xuICAgIH1cbn1cblxuTGFuZ3VhZ2UuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdFTl9TQSc6ICdFTi1TQScsXG4gICAgJ0hFX0lMJzogJ0hFLUlMJyxcbiAgICAnUk9fUk8nOiAnUk8tUk8nLFxuICAgICdVS19VQSc6ICdVSy1VQScsXG4gICAgJ0lEX0lEJzogJ0lELUlEJyxcbiAgICAnVklfVk4nOiAnVkktVk4nLFxuICAgICdNU19NWSc6ICdNUy1NWScsXG4gICAgJ0hJX0lOJzogJ0hJLUlOJyxcbiAgICAnTkxfQkUnOiAnTkwtQkUnLFxuICAgICdFTF9HUic6ICdFTC1HUicsXG4gICAgJ0hVX0hVJzogJ0hVLUhVJyxcbiAgICAnRklfRkknOiAnRkktRkknLFxuICAgICdTS19TSyc6ICdTSy1TSycsXG4gICAgJ0VOX1VTJzogJ0VOLVVTJyxcbiAgICAnRVNfTVgnOiAnRVMtTVgnLFxuICAgICdGUl9DQSc6ICdGUi1DQScsXG4gICAgJ0RFX0RFJzogJ0RFLURFJyxcbiAgICAnRVNfRVMnOiAnRVMtRVMnLFxuICAgICdFTl9HQic6ICdFTi1HQicsXG4gICAgJ1JVX1JVJzogJ1JVLVJVJyxcbiAgICAnVFJfVFInOiAnVFItVFInLFxuICAgICdQTF9QTCc6ICdQTC1QTCcsXG4gICAgJ0ZSX0ZSJzogJ0ZSLUZSJyxcbiAgICAnSVRfSVQnOiAnSVQtSVQnLFxuICAgICdTVl9TRSc6ICdTVi1TRScsXG4gICAgJ1BUX1BUJzogJ1BULVBUJyxcbiAgICAnTkxfTkwnOiAnTkwtTkwnLFxuICAgICdFTl9BVSc6ICdFTi1BVScsXG4gICAgJ1pIX0NOJzogJ1pILUNOJyxcbiAgICAnWkhfVFcnOiAnWkgtVFcnLFxuICAgICdKQV9KUCc6ICdKQS1KUCcsXG4gICAgJ0FSX1NBJzogJ0FSLVNBJyxcbiAgICAnS09fS1InOiAnS08tS1InLFxuICAgICdQVF9CUic6ICdQVC1CUicsXG4gICAgJ0NTX0NaJzogJ0NTLUNaJyxcbiAgICAnREFfREsnOiAnREEtREsnLFxuICAgICdOT19OTyc6ICdOTy1OTycsXG4gICAgJ0VOX0lOJzogJ0VOLUlOJyxcbiAgICAnVEhfVEgnOiAnVEgtVEgnLFxufSk7XG5cblxuZXhwb3J0IHsgTGFuZ3VhZ2UgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IEFwcEhNSVR5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIEFwcEhNSVR5cGUgZXh0ZW5kcyBFbnVtIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgREVGQVVMVCAoKSB7XG4gICAgICAgIHJldHVybiBBcHBITUlUeXBlLl9NQVAuREVGQVVMVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDT01NVU5JQ0FUSU9OICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEhNSVR5cGUuX01BUC5DT01NVU5JQ0FUSU9OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE1FRElBICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEhNSVR5cGUuX01BUC5NRURJQTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBNRVNTQUdJTkcgKCkge1xuICAgICAgICByZXR1cm4gQXBwSE1JVHlwZS5fTUFQLk1FU1NBR0lORztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOQVZJR0FUSU9OICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEhNSVR5cGUuX01BUC5OQVZJR0FUSU9OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IElORk9STUFUSU9OICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEhNSVR5cGUuX01BUC5JTkZPUk1BVElPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTT0NJQUwgKCkge1xuICAgICAgICByZXR1cm4gQXBwSE1JVHlwZS5fTUFQLlNPQ0lBTDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBCQUNLR1JPVU5EX1BST0NFU1MgKCkge1xuICAgICAgICByZXR1cm4gQXBwSE1JVHlwZS5fTUFQLkJBQ0tHUk9VTkRfUFJPQ0VTUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBURVNUSU5HICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEhNSVR5cGUuX01BUC5URVNUSU5HO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNZU1RFTSAoKSB7XG4gICAgICAgIHJldHVybiBBcHBITUlUeXBlLl9NQVAuU1lTVEVNO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBST0pFQ1RJT04gKCkge1xuICAgICAgICByZXR1cm4gQXBwSE1JVHlwZS5fTUFQLlBST0pFQ1RJT047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUkVNT1RFX0NPTlRST0wgKCkge1xuICAgICAgICByZXR1cm4gQXBwSE1JVHlwZS5fTUFQLlJFTU9URV9DT05UUk9MO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBBcHBITUlUeXBlLl92YWx1ZUZvcktleShrZXksIEFwcEhNSVR5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEFwcEhNSVR5cGUuX2tleUZvclZhbHVlKHZhbHVlLCBBcHBITUlUeXBlLl9NQVApO1xuICAgIH1cbn1cblxuQXBwSE1JVHlwZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0RFRkFVTFQnOiAnREVGQVVMVCcsXG4gICAgJ0NPTU1VTklDQVRJT04nOiAnQ09NTVVOSUNBVElPTicsXG4gICAgJ01FRElBJzogJ01FRElBJyxcbiAgICAnTUVTU0FHSU5HJzogJ01FU1NBR0lORycsXG4gICAgJ05BVklHQVRJT04nOiAnTkFWSUdBVElPTicsXG4gICAgJ0lORk9STUFUSU9OJzogJ0lORk9STUFUSU9OJyxcbiAgICAnU09DSUFMJzogJ1NPQ0lBTCcsXG4gICAgJ0JBQ0tHUk9VTkRfUFJPQ0VTUyc6ICdCQUNLR1JPVU5EX1BST0NFU1MnLFxuICAgICdURVNUSU5HJzogJ1RFU1RJTkcnLFxuICAgICdTWVNURU0nOiAnU1lTVEVNJyxcbiAgICAnUFJPSkVDVElPTic6ICdQUk9KRUNUSU9OJyxcbiAgICAnUkVNT1RFX0NPTlRST0wnOiAnUkVNT1RFX0NPTlRST0wnLFxufSk7XG5cbmV4cG9ydCB7IEFwcEhNSVR5cGUgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgU2RsTXNnVmVyc2lvbiB9IGZyb20gJy4uL3N0cnVjdHMvU2RsTXNnVmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBUVFNDaHVuayB9IGZyb20gJy4uL3N0cnVjdHMvVFRTQ2h1bmsuanMnO1xuaW1wb3J0IHsgRGV2aWNlSW5mbyB9IGZyb20gJy4uL3N0cnVjdHMvRGV2aWNlSW5mby5qcyc7XG5pbXBvcnQgeyBBcHBJbmZvIH0gZnJvbSAnLi4vc3RydWN0cy9BcHBJbmZvLmpzJztcbmltcG9ydCB7IFRlbXBsYXRlQ29sb3JTY2hlbWUgfSBmcm9tICcuLi9zdHJ1Y3RzL1RlbXBsYXRlQ29sb3JTY2hlbWUuanMnO1xuXG5pbXBvcnQgeyBMYW5ndWFnZSB9IGZyb20gJy4uL2VudW1zL0xhbmd1YWdlLmpzJztcbmltcG9ydCB7IEFwcEhNSVR5cGUgfSBmcm9tICcuLi9lbnVtcy9BcHBITUlUeXBlLmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuY2xhc3MgUmVnaXN0ZXJBcHBJbnRlcmZhY2UgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlJlZ2lzdGVyQXBwSW50ZXJmYWNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U2RsTXNnVmVyc2lvbn0gVGhlIG1heCBSUEMgU3BlYyB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGlzIGxpYnJhcnlcbiAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlfVxuICAgICovXG4gICAgc2V0U2RsTXNnVmVyc2lvbiAoc2RsTXNnVmVyc2lvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTZGxNc2dWZXJzaW9uLCBzZGxNc2dWZXJzaW9uKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfU0RMX01TR19WRVJTSU9OLCBzZGxNc2dWZXJzaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTZGxNc2dWZXJzaW9ufVxuICAgICovXG4gICAgZ2V0U2RsTXNnVmVyc2lvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTZGxNc2dWZXJzaW9uLCBSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfU0RMX01TR19WRVJTSU9OKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IGFwcE5hbWUgdGhlIG5hbWUgb2YgdGhlIGFwcCB0aGF0IGlzIHJlZ2lzdGVyaW5nXG4gICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAqL1xuICAgIHNldEFwcE5hbWUgKGFwcE5hbWUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU3RyaW5nLCBhcHBOYW1lKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfQVBQX05BTUUsIGFwcE5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIGFwcCBuYW1lXG4gICAgKi9cbiAgICBnZXRBcHBOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9BUFBfTkFNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXk8VFRTQ2h1bms+fSB0dHNOYW1lcyBUVFMgc3RyaW5nIGZvciBWUiByZWNvZ25pdGlvbiBvZiB0aGUgbW9iaWxlIGFwcGxpY2F0aW9uIG5hbWUsIGUuZy4gXCJNeSBTIEQgTCBBcHBcIi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYW50IHRvIG92ZXJjb21lIGFueSBmYWlsaW5nIG9uIHNwZWVjaCBlbmdpbmUgaW4gcHJvcGVybHkgcHJvbm91bmNpbmcgLyB1bmRlcnN0YW5kaW5nXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgbmFtZS4gTmVlZHMgdG8gYmUgdW5pcXVlIG92ZXIgYWxsIGFwcGxpY2F0aW9ucyBmcm9tIHRoZSBzYW1lIGRldmljZS4gTWF5IG5vdCBiZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkuIE1heSBub3Qgc3RhcnQgd2l0aCBhIG5ldyBsaW5lIGNoYXJhY3Rlci4gT25seSBjaGFyYWN0ZXJzIGZyb20gY2hhciBzZXRcbiAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2V9XG4gICAqL1xuICAgIHNldFR0c05hbWUgKHR0c05hbWVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9UVFNfTkFNRSwgdHRzTmFtZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0FycmF5PFRUU0NodW5rPn1cbiAgICAqL1xuICAgIGdldFR0c05hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVFRTQ2h1bmssIFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9UVFNfTkFNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gIG5nbnBwTmFtZSBQcm92aWRlcyBhbiBhYmJyZXZpYXRlZCB2ZXJzaW9uIG9mIHRoZSBhcHAgbmFtZSAoaWYgbmVlZGVkKSwgdGhhdCB3aWxsIGJlIGRpc3BsYXllZFxuICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIE5HTiBtZWRpYSBzY3JlZW4uIElmIG5vdCBwcm92aWRlZCwgdGhlIGFwcE5hbWUgaXMgdXNlZCBpbnN0ZWFkIChhbmRcbiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdHJ1bmNhdGVkIGlmIHRvbyBsb25nKU9ubHkgY2hhcmFjdGVycyBmcm9tIGNoYXIgc2V0LlxuICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2V9XG4gICAgKi9cbiAgICBzZXROZ25NZWRpYVNjcmVlbkFwcE5hbWUgKG5nbnBwTmFtZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTdHJpbmcsIG5nbnBwTmFtZSk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX05HTl9NRURJQV9TQ1JFRU5fQVBQX05BTUUsIG5nbnBwTmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfSBhbiBhYmJyZXZpYXRlZCB2ZXJzaW9uIG9mIHRoZSBhcHAgbmFtZVxuICAgICovXG4gICAgZ2V0TmduTWVkaWFTY3JlZW5BcHBOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9OR05fTUVESUFfU0NSRUVOX0FQUF9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gdnJTeW5vbnltcyBEZWZpbmVzIGFuIGFkZGl0aW9uYWwgdm9pY2UgcmVjb2duaXRpb24gY29tbWFuZC4gTWF5IG5vdFxuICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmVyZSB3aXRoIGFueSBhcHAgbmFtZSBvZiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgYXBwbGljYXRpb25zXG4gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgc2FtZSBkZXZpY2UgYW5kIGFueSBwcmVkZWZpbmVkIGJsYWNrbGlzdCBvZiB3b3JkcyAoZ2xvYmFsXG4gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMpT25seSBjaGFyYWN0ZXJzIGZyb20gY2hhciBzZXRcbiAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlfVxuICAgICovXG4gICAgc2V0VnJTeW5vbnltcyAodnJTeW5vbnltcykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfVlJfU1lOT05ZTVMsIHZyU3lub255bXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59XG4gICAgKi9cbiAgICBnZXRWclN5bm9ueW1zICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9WUl9TWU5PTllNUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzTWVkaWFBcHBsaWNhdGlvbiBJbmRpY2F0ZXMgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGEgbWVkaWEgb3IgYSBub24tbWVkaWEgYXBwbGljYXRpb24uXG4gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IG1lZGlhIGFwcGxpY2F0aW9ucyB3aWxsIGJlIGFibGUgdG8gc3RyZWFtIGF1ZGlvIHRvIHRoZSBtb2R1bGVcbiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgaXMgYXVkaWJsZSBvdXRzaWRlIG9mIHRoZSBCVCBtZWRpYSBzb3VyY2UuXG4gICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAqL1xuICAgIHNldElzTWVkaWFBcHBsaWNhdGlvbiAoaXNNZWRpYUFwcGxpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9JU19NRURJQV9BUFBMSUNBVElPTiwgaXNNZWRpYUFwcGxpY2F0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0SXNNZWRpYUFwcGxpY2F0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9JU19NRURJQV9BUFBMSUNBVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0xhbmd1YWdlfSBsYW5ndWFnZURlc2lyZWRcbiAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlfVxuICAgICovXG4gICAgc2V0TGFuZ3VhZ2VEZXNpcmVkIChsYW5ndWFnZURlc2lyZWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTGFuZ3VhZ2UsIGxhbmd1YWdlRGVzaXJlZCk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0xBTkdVQUdFX0RFU0lSRUQsIGxhbmd1YWdlRGVzaXJlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TGFuZ3VhZ2V9XG4gICAgKi9cbiAgICBnZXRMYW5ndWFnZURlc2lyZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTGFuZ3VhZ2UsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9MQU5HVUFHRV9ERVNJUkVEKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtMYW5ndWFnZX0gaG1pRGlzcGxheUxhbmd1YWdlRGVzaXJlZFxuICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2V9XG4gICAgKi9cbiAgICBzZXRIbWlEaXNwbGF5TGFuZ3VhZ2VEZXNpcmVkIChobWlEaXNwbGF5TGFuZ3VhZ2VEZXNpcmVkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKExhbmd1YWdlLCBobWlEaXNwbGF5TGFuZ3VhZ2VEZXNpcmVkKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfSE1JX0RJU1BMQVlfTEFOR1VBR0VfREVTSVJFRCwgaG1pRGlzcGxheUxhbmd1YWdlRGVzaXJlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TGFuZ3VhZ2V9XG4gICAgKi9cbiAgICBnZXRIbWlEaXNwbGF5TGFuZ3VhZ2VEZXNpcmVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KExhbmd1YWdlLCBSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfSE1JX0RJU1BMQVlfTEFOR1VBR0VfREVTSVJFRCk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7QXJyYXk8QXBwSE1JVHlwZT59IGFwcEhNSVR5cGVcbiAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlfVxuICAgICovXG4gICAgc2V0QXBwSG1pVHlwZSAoYXBwSE1JVHlwZSkge1xuICAgICAgICAvLyBUT0RPIG1ha2UgdmFsaWRhdGUgdHlwZSBhY2NlcHQgYXJyYXlzXG4gICAgICAgIC8vIHRoaXMudmFsaWRhdGVUeXBlKEFwcEhNSVR5cGUsIGFwcEhNSVR5cGUpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9BUFBfSE1JX1RZUEUsIGFwcEhNSVR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0FycmF5PEFwcEhNSVR5cGU+fVxuICAgICovXG4gICAgZ2V0QXBwSG1pVHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChBcHBITUlUeXBlLCBSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfQVBQX0hNSV9UWVBFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBoYXNoSUQgdGhlIGhhc2ggSURcbiAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlfVxuICAgICovXG4gICAgc2V0SGFzaElEIChoYXNoSUQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU3RyaW5nLCBoYXNoSUQpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9IQVNIX0lELCBoYXNoSUQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIGhhc2ggSURcbiAgICAqL1xuICAgIGdldEhhc2hJRCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfSEFTSF9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtEZXZpY2VJbmZvfSBkZXZpY2VJbmZvXG4gICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2V9XG4gICAgICovXG4gICAgc2V0RGV2aWNlSW5mbyAoZGV2aWNlSW5mbykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShEZXZpY2VJbmZvLCBkZXZpY2VJbmZvKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfREVWSUNFX0lORk8sIGRldmljZUluZm8pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0RldmljZUluZm99XG4gICAgKi9cbiAgICBnZXREZXZpY2VJbmZvICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KERldmljZUluZm8sIFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9ERVZJQ0VfSU5GTyk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBhcHBOYW1lIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgYWNjZXNzZWQgZGlyZWN0bHkgYnkgZGV2ZWxvcGVycy4gT25seSBzZXQgdGhlIGZ1bGwgSUQgYW5kIHRoaXMgcGFyYW0gd2lsbCBiZSBzZXQuXG4gICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAqL1xuICAgIF9zZXRBcHBJZCAoYXBwSWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU3RyaW5nLCBhcHBJZCk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0FQUF9JRCwgYXBwSWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIGFwcCBpZFxuICAgICovXG4gICAgZ2V0QXBwSWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0FQUF9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gZnVsbEFwcElkXG4gICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAqL1xuICAgIHNldEZ1bGxBcHBJZCAoZnVsbEFwcElkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFN0cmluZywgZnVsbEFwcElkKTtcblxuICAgICAgICBpZiAoZnVsbEFwcElkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBmdWxsQXBwSWQgPSBmdWxsQXBwSWQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9GVUxMX0FQUF9JRCwgZnVsbEFwcElkKTtcbiAgICAgICAgICAgIGxldCBhcHBJZDtcbiAgICAgICAgICAgIGlmIChmdWxsQXBwSWQubGVuZ3RoIDw9IFJlZ2lzdGVyQXBwSW50ZXJmYWNlLkFQUF9JRF9NQVhfTEVOR1RIKSB7XG4gICAgICAgICAgICAgICAgYXBwSWQgPSBmdWxsQXBwSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFwcElkID0gZnVsbEFwcElkLnJlcGxhY2UoJy0nLCAnJykuc3Vic3RyaW5nKDAsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlLkFQUF9JRF9NQVhfTEVOR1RIKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NldEFwcElkKGFwcElkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9GVUxMX0FQUF9JRCwgbnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIGFwcCBpZFxuICAgICovXG4gICAgZ2V0RnVsbEFwcElkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9GVUxMX0FQUF9JRCk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FwcEluZm99IGFwcEluZm9cbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAgKi9cbiAgICBzZXRBcHBJbmZvIChhcHBJbmZvKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEFwcEluZm8sIGFwcEluZm8pO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9BUFBfSU5GTywgYXBwSW5mbyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7QXBwSW5mb31cbiAgICAqL1xuICAgIGdldEFwcEluZm8gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQXBwSW5mbywgUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0FQUF9JTkZPKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RlbXBsYXRlQ29sb3JTY2hlbWV9IGRheUNvbG9yU2NoZW1lXG4gICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2V9XG4gICAgICovXG4gICAgc2V0RGF5Q29sb3JTY2hlbWUgKGRheUNvbG9yU2NoZW1lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRlbXBsYXRlQ29sb3JTY2hlbWUsIGRheUNvbG9yU2NoZW1lKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfREFZX0NPTE9SX1NDSEVNRSwgZGF5Q29sb3JTY2hlbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1RlbXBsYXRlQ29sb3JTY2hlbWV9XG4gICAgKi9cbiAgICBnZXREYXlDb2xvclNjaGVtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUZW1wbGF0ZUNvbG9yU2NoZW1lLCBSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfREFZX0NPTE9SX1NDSEVNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUZW1wbGF0ZUNvbG9yU2NoZW1lfSBuaWdodENvbG9yU2NoZW1lXG4gICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2V9XG4gICAgICovXG4gICAgc2V0TmlnaHRDb2xvclNjaGVtZSAobmlnaHRDb2xvclNjaGVtZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShUZW1wbGF0ZUNvbG9yU2NoZW1lLCBuaWdodENvbG9yU2NoZW1lKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfTklHSFRfQ09MT1JfU0NIRU1FLCBuaWdodENvbG9yU2NoZW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUNvbG9yU2NoZW1lfVxuICAgICovXG4gICAgZ2V0TmlnaHRDb2xvclNjaGVtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUZW1wbGF0ZUNvbG9yU2NoZW1lLCBSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfTklHSFRfQ09MT1JfU0NIRU1FKTtcbiAgICB9XG59XG5cblJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9TWU5DX01TR19WRVJTSU9OID0gJ3N5bmNNc2dWZXJzaW9uJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9TRExfTVNHX1ZFUlNJT04gPSAnc3luY01zZ1ZlcnNpb24nO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0FQUF9OQU1FID0gJ2FwcE5hbWUnO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX1RUU19OQU1FID0gJ3R0c05hbWUnO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX05HTl9NRURJQV9TQ1JFRU5fQVBQX05BTUUgPSAnbmduTWVkaWFTY3JlZW5BcHBOYW1lJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9WUl9TWU5PTllNUyA9ICd2clN5bm9ueW1zJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9JU19NRURJQV9BUFBMSUNBVElPTiA9ICdpc01lZGlhQXBwbGljYXRpb24nO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0xBTkdVQUdFX0RFU0lSRUQgPSAnbGFuZ3VhZ2VEZXNpcmVkJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9ITUlfRElTUExBWV9MQU5HVUFHRV9ERVNJUkVEID0gJ2htaURpc3BsYXlMYW5ndWFnZURlc2lyZWQnO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0FQUF9ITUlfVFlQRSA9ICdhcHBITUlUeXBlJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9IQVNIX0lEID0gJ2hhc2hJRCc7XG5SZWdpc3RlckFwcEludGVyZmFjZS5LRVlfREVWSUNFX0lORk8gPSAnZGV2aWNlSW5mbyc7XG5SZWdpc3RlckFwcEludGVyZmFjZS5LRVlfQVBQX0lEID0gJ2FwcElEJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9GVUxMX0FQUF9JRCA9ICdmdWxsQXBwSUQnO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0FQUF9JTkZPID0gJ2FwcEluZm8nO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0RBWV9DT0xPUl9TQ0hFTUUgPSAnZGF5Q29sb3JTY2hlbWUnO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX05JR0hUX0NPTE9SX1NDSEVNRSA9ICduaWdodENvbG9yU2NoZW1lJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlLkFQUF9JRF9NQVhfTEVOR1RIID0gMTA7XG5cbmV4cG9ydCB7IFJlZ2lzdGVyQXBwSW50ZXJmYWNlIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IFJlc3VsdFxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgUmVzdWx0IGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNVQ0NFU1MgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuU1VDQ0VTUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBVTlNVUFBPUlRFRF9SRVFVRVNUICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLlVOU1VQUE9SVEVEX1JFUVVFU1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVU5TVVBQT1JURURfUkVTT1VSQ0UgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuVU5TVVBQT1JURURfUkVRVUVTVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBESVNBTExPV0VEICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLkRJU0FMTE9XRUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUkVKRUNURUQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuUkVKRUNURUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQUJPUlRFRCAoKSB7XG4gICAgICAgIHJldHVybiBSZXN1bHQuX01BUC5BQk9SVEVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IElHTk9SRUQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuSUdOT1JFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSRVRSWSAoKSB7XG4gICAgICAgIHJldHVybiBSZXN1bHQuX01BUC5SRVRSWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBJTl9VU0UgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuSU5fVVNFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZFSElDTEVfREFUQV9OT1RfQVZBSUxBQkxFICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLlZFSElDTEVfREFUQV9OT1RfQVZBSUxBQkxFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRJTUVEX09VVCAoKSB7XG4gICAgICAgIHJldHVybiBSZXN1bHQuX01BUC5USU1FRF9PVVQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgSU5WQUxJRF9EQVRBICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLklOVkFMSURfREFUQTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDSEFSX0xJTUlUX0VYQ0VFREVEICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLkNIQVJfTElNSVRfRVhDRUVERUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgSU5WQUxJRF9JRCAoKSB7XG4gICAgICAgIHJldHVybiBSZXN1bHQuX01BUC5JTlZBTElEX0lEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERVUExJQ0FURV9OQU1FICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLkRVUExJQ0FURV9OQU1FO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEFQUExJQ0FUSU9OX05PVF9SRUdJU1RFUkVEICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLkFQUExJQ0FUSU9OX05PVF9SRUdJU1RFUkVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFdST05HX0xBTkdVQUdFICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLldST05HX0xBTkdVQUdFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9VVF9PRl9NRU1PUlkgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuT1VUX09GX01FTU9SWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBUT09fTUFOWV9QRU5ESU5HX1JFUVVFU1RTICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLlRPT19NQU5ZX1BFTkRJTkdfUkVRVUVTVFM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVE9PX01BTllfQVBQTElDQVRJT05TICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLlRPT19NQU5ZX0FQUExJQ0FUSU9OUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBUFBMSUNBVElPTl9SRUdJU1RFUkVEX0FMUkVBRFkgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuQVBQTElDQVRJT05fUkVHSVNURVJFRF9BTFJFQURZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFdBUk5JTkdTICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLldBUk5JTkdTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEdFTkVSSUNfRVJST1IgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuR0VORVJJQ19FUlJPUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBVU0VSX0RJU0FMTE9XRUQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuVVNFUl9ESVNBTExPV0VEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRSVU5DQVRFRF9EQVRBICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLlRSVU5DQVRFRF9EQVRBO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVOU1VQUE9SVEVEX1ZFUlNJT04gKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuVU5TVVBQT1JURURfVkVSU0lPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFX0RBVEFfTk9UX0FMTE9XRUQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuVkVISUNMRV9EQVRBX05PVF9BTExPV0VEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZJTEVfTk9UX0ZPVU5EICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLkZJTEVfTk9UX0ZPVU5EO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENBTkNFTF9ST1VURSAoKSB7XG4gICAgICAgIHJldHVybiBSZXN1bHQuX01BUC5DQU5DRUxfUk9VVEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU0FWRUQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuU0FWRUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgSU5WQUxJRF9DRVJUICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLklOVkFMSURfQ0VSVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFWFBJUkVEX0NFUlQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuRVhQSVJFRF9DRVJUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJFU1VNRV9GQUlMRUQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuUkVTVU1FX0ZBSUxFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBEQVRBX05PVF9BVkFJTEFCTEUgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuREFUQV9OT1RfQVZBSUxBQkxFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJFQURfT05MWSAoKSB7XG4gICAgICAgIHJldHVybiBSZXN1bHQuX01BUC5SRUFEX09OTFk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ09SUlVQVEVEX0RBVEEgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuQ09SUlVQVEVEX0RBVEE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fdmFsdWVGb3JLZXkoa2V5LCBSZXN1bHQuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fa2V5Rm9yVmFsdWUodmFsdWUsIFJlc3VsdC5fTUFQKTtcbiAgICB9XG59XG5cblJlc3VsdC5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ1NVQ0NFU1MnOiAnU1VDQ0VTUycsXG4gICAgJ1VOU1VQUE9SVEVEX1JFUVVFU1QnOiAnVU5TVVBQT1JURURfUkVRVUVTVCcsXG4gICAgJ1VOU1VQUE9SVEVEX1JFU09VUkNFJzogJ1VOU1VQUE9SVEVEX1JFU09VUkNFJyxcbiAgICAnRElTQUxMT1dFRCc6ICdESVNBTExPV0VEJyxcbiAgICAnUkVKRUNURUQnOiAnUkVKRUNURUQnLFxuICAgICdBQk9SVEVEJzogJ0FCT1JURUQnLFxuICAgICdJR05PUkVEJzogJ0lHTk9SRUQnLFxuICAgICdSRVRSWSc6ICdSRVRSWScsXG4gICAgJ0lOX1VTRSc6ICdJTl9VU0UnLFxuICAgICdWRUhJQ0xFX0RBVEFfTk9UX0FWQUlMQUJMRSc6ICdWRUhJQ0xFX0RBVEFfTk9UX0FWQUlMQUJMRScsXG4gICAgJ1RJTUVEX09VVCc6ICdUSU1FRF9PVVQnLFxuICAgICdJTlZBTElEX0RBVEEnOiAnSU5WQUxJRF9EQVRBJyxcbiAgICAnQ0hBUl9MSU1JVF9FWENFRURFRCc6ICdDSEFSX0xJTUlUX0VYQ0VFREVEJyxcbiAgICAnSU5WQUxJRF9JRCc6ICdJTlZBTElEX0lEJyxcbiAgICAnRFVQTElDQVRFX05BTUUnOiAnRFVQTElDQVRFX05BTUUnLFxuICAgICdBUFBMSUNBVElPTl9OT1RfUkVHSVNURVJFRCc6ICdBUFBMSUNBVElPTl9OT1RfUkVHSVNURVJFRCcsXG4gICAgJ1dST05HX0xBTkdVQUdFJzogJ1dST05HX0xBTkdVQUdFJyxcbiAgICAnT1VUX09GX01FTU9SWSc6ICdPVVRfT0ZfTUVNT1JZJyxcbiAgICAnVE9PX01BTllfUEVORElOR19SRVFVRVNUUyc6ICdUT09fTUFOWV9QRU5ESU5HX1JFUVVFU1RTJyxcbiAgICAnVE9PX01BTllfQVBQTElDQVRJT05TJzogJ1RPT19NQU5ZX0FQUExJQ0FUSU9OUycsXG4gICAgJ0FQUExJQ0FUSU9OX1JFR0lTVEVSRURfQUxSRUFEWSc6ICdBUFBMSUNBVElPTl9SRUdJU1RFUkVEX0FMUkVBRFknLFxuICAgICdXQVJOSU5HUyc6ICdXQVJOSU5HUycsXG4gICAgJ0dFTkVSSUNfRVJST1InOiAnR0VORVJJQ19FUlJPUicsXG4gICAgJ1VTRVJfRElTQUxMT1dFRCc6ICdVU0VSX0RJU0FMTE9XRUQnLFxuICAgICdUUlVOQ0FURURfREFUQSc6ICdUUlVOQ0FURURfREFUQScsXG4gICAgJ1VOU1VQUE9SVEVEX1ZFUlNJT04nOiAnVU5TVVBQT1JURURfVkVSU0lPTicsXG4gICAgJ1ZFSElDTEVfREFUQV9OT1RfQUxMT1dFRCc6ICdWRUhJQ0xFX0RBVEFfTk9UX0FMTE9XRUQnLFxuICAgICdGSUxFX05PVF9GT1VORCc6ICdGSUxFX05PVF9GT1VORCcsXG4gICAgJ0NBTkNFTF9ST1VURSc6ICdDQU5DRUxfUk9VVEUnLFxuICAgICdTQVZFRCc6ICdTQVZFRCcsXG4gICAgJ0lOVkFMSURfQ0VSVCc6ICdJTlZBTElEX0NFUlQnLFxuICAgICdFWFBJUkVEX0NFUlQnOiAnRVhQSVJFRF9DRVJUJyxcbiAgICAnUkVTVU1FX0ZBSUxFRCc6ICdSRVNVTUVfRkFJTEVEJyxcbiAgICAnREFUQV9OT1RfQVZBSUxBQkxFJzogJ0RBVEFfTk9UX0FWQUlMQUJMRScsXG4gICAgJ1JFQURfT05MWSc6ICdSRUFEX09OTFknLFxuICAgICdDT1JSVVBURURfREFUQSc6ICdDT1JSVVBURURfREFUQScsXG59KTtcblxuZXhwb3J0IHsgUmVzdWx0IH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjTWVzc2FnZSB9IGZyb20gJy4vUnBjTWVzc2FnZS5qcyc7XG5pbXBvcnQgeyBScGNUeXBlIH0gZnJvbSAnLi9lbnVtcy9ScGNUeXBlLmpzJztcbmltcG9ydCB7IFJlc3VsdCB9IGZyb20gJy4vZW51bXMvUmVzdWx0LmpzJztcblxuY2xhc3MgUnBjUmVzcG9uc2UgZXh0ZW5kcyBScGNNZXNzYWdlIHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRSUENUeXBlKFJwY1R5cGUuUkVTUE9OU0UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAqL1xuICAgIGdldFN1Y2Nlc3MgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUnBjUmVzcG9uc2UuS0VZX1NVQ0NFU1MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7UnBjUmVzcG9uc2V9XG4gICAgKi9cbiAgICBzZXRTdWNjZXNzIChzdWNjZXNzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJwY1Jlc3BvbnNlLktFWV9TVUNDRVNTLCBzdWNjZXNzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBnZXRJbmZvICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJwY1Jlc3BvbnNlLktFWV9JTkZPKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1JwY1Jlc3BvbnNlfVxuICAgICovXG4gICAgc2V0SW5mbyAoaW5mbykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihScGNSZXNwb25zZS5LRVlfSU5GTywgaW5mbyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7UmVzdWx0fVxuICAgICovXG4gICAgZ2V0UmVzdWx0Q29kZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChSZXN1bHQsIFJwY1Jlc3BvbnNlLktFWV9SRVNVTFRfQ09ERSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtScGNSZXNwb25zZX1cbiAgICAqL1xuICAgIHNldFJlc3VsdENvZGUgKHJlc3VsdENvZGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoUmVzdWx0LCByZXN1bHRDb2RlKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihScGNSZXNwb25zZS5LRVlfUkVTVUxUX0NPREUsIHJlc3VsdENvZGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cblJwY1Jlc3BvbnNlLktFWV9TVUNDRVNTICAgICA9ICdzdWNjZXNzJztcblJwY1Jlc3BvbnNlLktFWV9JTkZPICAgICAgICA9ICdpbmZvJztcblJwY1Jlc3BvbnNlLktFWV9SRVNVTFRfQ09ERSA9ICdyZXN1bHRDb2RlJztcblxuZXhwb3J0IHsgUnBjUmVzcG9uc2UgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5jbGFzcyBScGNMaXN0ZW5lciB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICB0aGlzLl9vblJwY01lc3NhZ2UgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICAgKiBAcmV0dXJuIHtScGNMaXN0ZW5lcn1cbiAgICAgKi9cbiAgICBzZXRPblJwY01lc3NhZ2UgKGZ1bmMpIHtcbiAgICAgICAgdGhpcy5fb25ScGNNZXNzYWdlID0gZnVuYztcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UnBjTWVzc2FnZX0gcnBjTWVzc2FnZVxuICAgICAqL1xuICAgIG9uUnBjTWVzc2FnZSAocnBjTWVzc2FnZSkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uUnBjTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25ScGNNZXNzYWdlKHJwY01lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBScGNMaXN0ZW5lciB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2RsUHJvdG9jb2xMaXN0ZW5lclxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gc2V0T25ScGNNZXNzYWdlUmVjZWl2ZWRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IG9uUnBjTWVzc2FnZVJlY2VpdmVkXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBzZXRPblByb3RvY29sU2Vzc2lvblN0YXJ0ZWRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IG9uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZFxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gc2V0T25Qcm90b2NvbFNlc3Npb25FbmRlZFxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gb25Qcm90b2NvbFNlc3Npb25FbmRlZFxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gc2V0T25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZFxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gb25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZFxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gc2V0R2V0U2Vzc2lvbklkXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBnZXRTZXNzaW9uSWRcbiAqL1xuY2xhc3MgU2RsUHJvdG9jb2xMaXN0ZW5lciB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICB0aGlzLl9vblJwY01lc3NhZ2VSZWNlaXZlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uRW5kZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZ2V0U2Vzc2lvbklkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25UcmFuc3BvcnRDb25uZWN0ZWQgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25UcmFuc3BvcnRDb25uZWN0ZWQgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX29uVHJhbnNwb3J0Q29ubmVjdGVkID0gbGlzdGVuZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25ScGNNZXNzYWdlUmVjZWl2ZWQgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX29uUnBjTWVzc2FnZVJlY2VpdmVkID0gbGlzdGVuZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7UnBjTWVzc2FnZX0gcnBjTWVzc2FnZVxuICAgICAqL1xuICAgIG9uUnBjTWVzc2FnZVJlY2VpdmVkIChycGNNZXNzYWdlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25ScGNNZXNzYWdlUmVjZWl2ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uUnBjTWVzc2FnZVJlY2VpdmVkKHJwY01lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBzZXRPblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZCA9IGxpc3RlbmVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cblxuICAgIG9uVHJhbnNwb3J0Q29ubmVjdGVkICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vblRyYW5zcG9ydENvbm5lY3RlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25UcmFuc3BvcnRDb25uZWN0ZWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZSB0aGUgb25Qcm90b2NvbFNlc3Npb25TdGFydGVkIGxpc3RlbmVyIHdpdGggdGhlIGV2ZW50IGRhdGFcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSWRcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdmVyc2lvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb3JyZWxhdGlvbklkXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhhc2hJZFxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNFbmNyeXB0ZWRcbiAgICAgKi9cbiAgICBvblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQgKHNlcnZpY2VUeXBlLCBzZXNzaW9uSWQsIHZlcnNpb24sIGNvcnJlbGF0aW9uSWQsIGhhc2hJZCwgaXNFbmNyeXB0ZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklkLCB2ZXJzaW9uLCBjb3JyZWxhdGlvbklkLCBoYXNoSWQsIGlzRW5jcnlwdGVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25Qcm90b2NvbFNlc3Npb25FbmRlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25FbmRlZCA9IGxpc3RlbmVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2UgdGhlIG9uUHJvdG9jb2xTZXNzaW9uRW5kZWQgbGlzdGVuZXIgd2l0aCB0aGUgZXZlbnQgZGF0YVxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNlc3Npb25JZFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb3JyZWxhdGlvbklkXG4gICAgICovXG4gICAgb25Qcm90b2NvbFNlc3Npb25FbmRlZCAoc2VydmljZVR5cGUsIHNlc3Npb25JZCwgY29ycmVsYXRpb25JZCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uRW5kZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uRW5kZWQoc2VydmljZVR5cGUsIHNlc3Npb25JZCwgY29ycmVsYXRpb25JZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHNldE9uUHJvdG9jb2xTZXNzaW9uRW5kZWROQUNLZWQgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uRW5kZWROQUNLZWQgPSBsaXN0ZW5lcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlIHRoZSBvblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkIGxpc3RlbmVyIHdpdGggdGhlIGV2ZW50IGRhdGFcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSWRcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29ycmVsYXRpb25JZFxuICAgICAqL1xuICAgIG9uUHJvdG9jb2xTZXNzaW9uRW5kZWROQUNLZWQgKHNlcnZpY2VUeXBlLCBzZXNzaW9uSWQsIGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkKHNlcnZpY2VUeXBlLCBzZXNzaW9uSWQsIGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZ2V0dGVyXG4gICAgICovXG4gICAgc2V0R2V0U2Vzc2lvbklkIChnZXR0ZXIpIHtcbiAgICAgICAgdGhpcy5fZ2V0U2Vzc2lvbklkID0gZ2V0dGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2UgdGhlIGdldFNlc3Npb25JZCBnZXR0ZXJcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBzZXNzaW9uSWRcbiAgICAgKi9cbiAgICBnZXRTZXNzaW9uSWQgKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2dldFNlc3Npb25JZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNlc3Npb25JZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBnZXREZXNpcmVkVmlkZW9QYXJhbXMgZ2V0dGVyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZ2V0dGVyXG4gICAgICovXG4gICAgc2V0R2V0RGVzaXJlZFZpZGVvUGFyYW1zIChnZXR0ZXIpIHtcbiAgICAgICAgdGhpcy5fZ2V0RGVzaXJlZFZpZGVvUGFyYW1zID0gZ2V0dGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2UgdGhlIGdldERlc2lyZWRWaWRlb1BhcmFtcyBnZXR0ZXJcbiAgICAgKiBAcmV0dXJucyB7VmlkZW9TdHJlYW1pbmdQYXJhbWV0ZXJzfVxuICAgICAqL1xuICAgIGdldERlc2lyZWRWaWRlb1BhcmFtcyAoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fZ2V0RGVzaXJlZFZpZGVvUGFyYW1zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RGVzaXJlZFZpZGVvUGFyYW1zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzZXRTZXRBY2NlcHRlZFZpZGVvUGFyYW1zIHNldHRlclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHNldHRlclxuICAgICAqL1xuICAgIHNldFNldEFjY2VwdGVkVmlkZW9QYXJhbXMgKHNldHRlcikge1xuICAgICAgICB0aGlzLl9zZXRBY2NlcHRlZFZpZGVvUGFyYW1zID0gc2V0dGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEludm9rZSB0aGUgc2V0QWNjZXB0ZWRWaWRlb1BhcmFtcyBzZXR0ZXJcbiAgICAgKiBAcGFyYW0ge1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVyc30gcGFyYW1zXG4gICAgICovXG4gICAgc2V0QWNjZXB0ZWRWaWRlb1BhcmFtcyAocGFyYW1zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2V0QWNjZXB0ZWRWaWRlb1BhcmFtcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fc2V0QWNjZXB0ZWRWaWRlb1BhcmFtcyhwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgU2RsUHJvdG9jb2xMaXN0ZW5lciB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gRnJhbWVUeXBlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBGcmFtZVR5cGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBDT05UUk9MICgpIHtcbiAgICAgICAgcmV0dXJuIEZyYW1lVHlwZS5fTUFQLkNPTlRST0w7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZJUlNUICgpIHtcbiAgICAgICAgcmV0dXJuIEZyYW1lVHlwZS5fTUFQLkZJUlNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBDT05TRUNVVElWRSAoKSB7XG4gICAgICAgIHJldHVybiBGcmFtZVR5cGUuX01BUC5DT05TRUNVVElWRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgU0lOR0xFICgpIHtcbiAgICAgICAgcmV0dXJuIEZyYW1lVHlwZS5fTUFQLlNJTkdMRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gRnJhbWVUeXBlLl92YWx1ZUZvcktleShrZXksIEZyYW1lVHlwZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gRnJhbWVUeXBlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgRnJhbWVUeXBlLl9NQVApO1xuICAgIH1cbn1cblxuRnJhbWVUeXBlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnQ09OVFJPTCc6IDB4MDAsXG4gICAgJ0ZJUlNUJzogMHgwMixcbiAgICAnQ09OU0VDVVRJVkUnOiAweDAzLFxuICAgICdTSU5HTEUnOiAweDAxLFxufSk7XG5cbmV4cG9ydCB7IEZyYW1lVHlwZSB9O1xuIiwiZXhwb3J0c1tcImJzb25cIl0gPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDIpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG52YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSxldmFsKShcInRoaXNcIik7XG59IGNhdGNoKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIilcblx0XHRnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG5cblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKGdsb2JhbCkgey8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG5cblxudmFyIGJhc2U2NCA9IF9fd2VicGFja19yZXF1aXJlX18oMylcbnZhciBpZWVlNzU0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KVxudmFyIGlzQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuXG4vKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi99LmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXygwKSkpXG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24oZ2xvYmFsLCBCdWZmZXIpIHsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuXHQgdHJ1ZSA/IGZhY3RvcnkoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyg2KSwgX193ZWJwYWNrX3JlcXVpcmVfXygxKSkgOlxuXHR0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ2xvbmcnLCAnYnVmZmVyJ10sIGZhY3RvcnkpIDpcblx0KGZhY3RvcnkoKGdsb2JhbC5CU09OID0ge30pLGdsb2JhbC5sb25nLGdsb2JhbC5CdWZmZXIpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLGxvbmcsYnVmZmVyKSB7ICd1c2Ugc3RyaWN0JztcblxuXHRsb25nID0gbG9uZyAmJiBsb25nLmhhc093blByb3BlcnR5KCdkZWZhdWx0JykgPyBsb25nWydkZWZhdWx0J10gOiBsb25nO1xuXHRidWZmZXIgPSBidWZmZXIgJiYgYnVmZmVyLmhhc093blByb3BlcnR5KCdkZWZhdWx0JykgPyBidWZmZXJbJ2RlZmF1bHQnXSA6IGJ1ZmZlcjtcblxuXHR2YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9O1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuLCBtb2R1bGUpIHtcblx0XHRyZXR1cm4gbW9kdWxlID0geyBleHBvcnRzOiB7fSB9LCBmbihtb2R1bGUsIG1vZHVsZS5leHBvcnRzKSwgbW9kdWxlLmV4cG9ydHM7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlIChuKSB7XG5cdFx0cmV0dXJuIG4gJiYgbi5kZWZhdWx0IHx8IG47XG5cdH1cblxuXHR2YXIgbWFwID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuXG5cdCAgaWYgKHR5cGVvZiBjb21tb25qc0dsb2JhbC5NYXAgIT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICBtb2R1bGUuZXhwb3J0cyA9IGNvbW1vbmpzR2xvYmFsLk1hcDtcblx0ICAgIG1vZHVsZS5leHBvcnRzLk1hcCA9IGNvbW1vbmpzR2xvYmFsLk1hcDtcblx0ICB9IGVsc2Uge1xuXHQgICAgLy8gV2Ugd2lsbCByZXR1cm4gYSBwb2x5ZmlsbFxuXHQgICAgdmFyIE1hcCA9IGZ1bmN0aW9uIE1hcChhcnJheSkge1xuXHQgICAgICB0aGlzLl9rZXlzID0gW107XG5cdCAgICAgIHRoaXMuX3ZhbHVlcyA9IHt9O1xuXG5cdCAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICBpZiAoYXJyYXlbaV0gPT0gbnVsbCkgY29udGludWU7IC8vIHNraXAgbnVsbCBhbmQgdW5kZWZpbmVkXG5cblx0ICAgICAgICB2YXIgZW50cnkgPSBhcnJheVtpXTtcblx0ICAgICAgICB2YXIga2V5ID0gZW50cnlbMF07XG5cdCAgICAgICAgdmFyIHZhbHVlID0gZW50cnlbMV07IC8vIEFkZCB0aGUga2V5IHRvIHRoZSBsaXN0IG9mIGtleXMgaW4gb3JkZXJcblxuXHQgICAgICAgIHRoaXMuX2tleXMucHVzaChrZXkpOyAvLyBBZGQgdGhlIGtleSBhbmQgdmFsdWUgdG8gdGhlIHZhbHVlcyBkaWN0aW9uYXJ5IHdpdGggYSBwb2ludFxuXHQgICAgICAgIC8vIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgb3JkZXJlZCBrZXlzIGxpc3RcblxuXG5cdCAgICAgICAgdGhpcy5fdmFsdWVzW2tleV0gPSB7XG5cdCAgICAgICAgICB2OiB2YWx1ZSxcblx0ICAgICAgICAgIGk6IHRoaXMuX2tleXMubGVuZ3RoIC0gMVxuXHQgICAgICAgIH07XG5cdCAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIE1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHRoaXMuX2tleXMgPSBbXTtcblx0ICAgICAgdGhpcy5fdmFsdWVzID0ge307XG5cdCAgICB9O1xuXG5cdCAgICBNYXAucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChrZXkpIHtcblx0ICAgICAgdmFyIHZhbHVlID0gdGhpcy5fdmFsdWVzW2tleV07XG5cdCAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7IC8vIERlbGV0ZSBlbnRyeVxuXG5cdCAgICAgIGRlbGV0ZSB0aGlzLl92YWx1ZXNba2V5XTsgLy8gUmVtb3ZlIHRoZSBrZXkgZnJvbSB0aGUgb3JkZXJlZCBrZXlzIGxpc3RcblxuXHQgICAgICB0aGlzLl9rZXlzLnNwbGljZSh2YWx1ZS5pLCAxKTtcblxuXHQgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgIH07XG5cblx0ICAgIE1hcC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXHQgICAgICB2YXIgaW5kZXggPSAwO1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG5cdCAgICAgICAgICB2YXIga2V5ID0gc2VsZi5fa2V5c1tpbmRleCsrXTtcblx0ICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHZhbHVlOiBrZXkgIT09IHVuZGVmaW5lZCA/IFtrZXksIHNlbGYuX3ZhbHVlc1trZXldLnZdIDogdW5kZWZpbmVkLFxuXHQgICAgICAgICAgICBkb25lOiBrZXkgIT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZVxuXHQgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICB9O1xuXG5cdCAgICBNYXAucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHNlbGYpIHtcblx0ICAgICAgc2VsZiA9IHNlbGYgfHwgdGhpcztcblxuXHQgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2tleXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICB2YXIga2V5ID0gdGhpcy5fa2V5c1tpXTsgLy8gQ2FsbCB0aGUgZm9yRWFjaCBjYWxsYmFja1xuXG5cdCAgICAgICAgY2FsbGJhY2suY2FsbChzZWxmLCB0aGlzLl92YWx1ZXNba2V5XS52LCBrZXksIHNlbGYpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICBNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc1trZXldID8gdGhpcy5fdmFsdWVzW2tleV0udiA6IHVuZGVmaW5lZDtcblx0ICAgIH07XG5cblx0ICAgIE1hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzW2tleV0gIT0gbnVsbDtcblx0ICAgIH07XG5cblx0ICAgIE1hcC5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXHQgICAgICB2YXIgaW5kZXggPSAwO1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG5cdCAgICAgICAgICB2YXIga2V5ID0gc2VsZi5fa2V5c1tpbmRleCsrXTtcblx0ICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHZhbHVlOiBrZXkgIT09IHVuZGVmaW5lZCA/IGtleSA6IHVuZGVmaW5lZCxcblx0ICAgICAgICAgICAgZG9uZToga2V5ICE9PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWVcblx0ICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgfTtcblxuXHQgICAgTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHQgICAgICBpZiAodGhpcy5fdmFsdWVzW2tleV0pIHtcblx0ICAgICAgICB0aGlzLl92YWx1ZXNba2V5XS52ID0gdmFsdWU7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICAgIH0gLy8gQWRkIHRoZSBrZXkgdG8gdGhlIGxpc3Qgb2Yga2V5cyBpbiBvcmRlclxuXG5cblx0ICAgICAgdGhpcy5fa2V5cy5wdXNoKGtleSk7IC8vIEFkZCB0aGUga2V5IGFuZCB2YWx1ZSB0byB0aGUgdmFsdWVzIGRpY3Rpb25hcnkgd2l0aCBhIHBvaW50XG5cdCAgICAgIC8vIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgb3JkZXJlZCBrZXlzIGxpc3RcblxuXG5cdCAgICAgIHRoaXMuX3ZhbHVlc1trZXldID0ge1xuXHQgICAgICAgIHY6IHZhbHVlLFxuXHQgICAgICAgIGk6IHRoaXMuX2tleXMubGVuZ3RoIC0gMVxuXHQgICAgICB9O1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cblx0ICAgIE1hcC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICAgIHZhciBpbmRleCA9IDA7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcblx0ICAgICAgICAgIHZhciBrZXkgPSBzZWxmLl9rZXlzW2luZGV4KytdO1xuXHQgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdmFsdWU6IGtleSAhPT0gdW5kZWZpbmVkID8gc2VsZi5fdmFsdWVzW2tleV0udiA6IHVuZGVmaW5lZCxcblx0ICAgICAgICAgICAgZG9uZToga2V5ICE9PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWVcblx0ICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgfTsgLy8gTGFzdCBpc21hc3RlclxuXG5cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShNYXAucHJvdG90eXBlLCAnc2l6ZScsIHtcblx0ICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX2tleXMubGVuZ3RoO1xuXHQgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIG1vZHVsZS5leHBvcnRzID0gTWFwO1xuXHQgIH1cblx0fSk7XG5cdHZhciBtYXBfMSA9IG1hcC5NYXA7XG5cblx0LyoqXG5cdCAqIEBpZ25vcmVcblx0ICovXG5cblxuXHRsb25nLnByb3RvdHlwZS50b0V4dGVuZGVkSlNPTiA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cdCAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWxheGVkKSByZXR1cm4gdGhpcy50b051bWJlcigpO1xuXHQgIHJldHVybiB7XG5cdCAgICAkbnVtYmVyTG9uZzogdGhpcy50b1N0cmluZygpXG5cdCAgfTtcblx0fTtcblx0LyoqXG5cdCAqIEBpZ25vcmVcblx0ICovXG5cblxuXHRsb25nLmZyb21FeHRlbmRlZEpTT04gPSBmdW5jdGlvbiAoZG9jLCBvcHRpb25zKSB7XG5cdCAgdmFyIHJlc3VsdCA9IGxvbmcuZnJvbVN0cmluZyhkb2MuJG51bWJlckxvbmcpO1xuXHQgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMucmVsYXhlZCA/IHJlc3VsdC50b051bWJlcigpIDogcmVzdWx0O1xuXHR9O1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsb25nLnByb3RvdHlwZSwgJ19ic29udHlwZScsIHtcblx0ICB2YWx1ZTogJ0xvbmcnXG5cdH0pO1xuXHR2YXIgbG9uZ18xID0gbG9uZztcblxuXHQvKipcblx0ICogQSBjbGFzcyByZXByZXNlbnRhdGlvbiBvZiB0aGUgQlNPTiBEb3VibGUgdHlwZS5cblx0ICovXG5cblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuXHRmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cblx0ZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuXHR2YXIgRG91YmxlID1cblx0LyojX19QVVJFX18qL1xuXHRmdW5jdGlvbiAoKSB7XG5cdCAgLyoqXG5cdCAgICogQ3JlYXRlIGEgRG91YmxlIHR5cGVcblx0ICAgKlxuXHQgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSB0aGUgbnVtYmVyIHdlIHdhbnQgdG8gcmVwcmVzZW50IGFzIGEgZG91YmxlLlxuXHQgICAqIEByZXR1cm4ge0RvdWJsZX1cblx0ICAgKi9cblx0ICBmdW5jdGlvbiBEb3VibGUodmFsdWUpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBEb3VibGUpO1xuXG5cdCAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgfVxuXHQgIC8qKlxuXHQgICAqIEFjY2VzcyB0aGUgbnVtYmVyIHZhbHVlLlxuXHQgICAqXG5cdCAgICogQG1ldGhvZFxuXHQgICAqIEByZXR1cm4ge251bWJlcn0gcmV0dXJucyB0aGUgd3JhcHBlZCBkb3VibGUgbnVtYmVyLlxuXHQgICAqL1xuXG5cblx0ICBfY3JlYXRlQ2xhc3MoRG91YmxlLCBbe1xuXHQgICAga2V5OiBcInZhbHVlT2ZcIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwidG9KU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwidG9FeHRlbmRlZEpTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b0V4dGVuZGVkSlNPTihvcHRpb25zKSB7XG5cdCAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVsYXhlZCAmJiBpc0Zpbml0ZSh0aGlzLnZhbHVlKSkgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgJG51bWJlckRvdWJsZTogdGhpcy52YWx1ZS50b1N0cmluZygpXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfV0sIFt7XG5cdCAgICBrZXk6IFwiZnJvbUV4dGVuZGVkSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21FeHRlbmRlZEpTT04oZG9jLCBvcHRpb25zKSB7XG5cdCAgICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMucmVsYXhlZCA/IHBhcnNlRmxvYXQoZG9jLiRudW1iZXJEb3VibGUpIDogbmV3IERvdWJsZShwYXJzZUZsb2F0KGRvYy4kbnVtYmVyRG91YmxlKSk7XG5cdCAgICB9XG5cdCAgfV0pO1xuXG5cdCAgcmV0dXJuIERvdWJsZTtcblx0fSgpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEb3VibGUucHJvdG90eXBlLCAnX2Jzb250eXBlJywge1xuXHQgIHZhbHVlOiAnRG91YmxlJ1xuXHR9KTtcblx0dmFyIGRvdWJsZV8xID0gRG91YmxlO1xuXG5cdGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrJDEoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDEodGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQxKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMShDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDEoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cblx0ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5cdGZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5cdGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cblxuXHRmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG5cdGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cdC8qKlxuXHQgKiBAY2xhc3Ncblx0ICogQHBhcmFtIHtudW1iZXJ9IGxvdyAgdGhlIGxvdyAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBUaW1lc3RhbXAuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIHRoZSBoaWdoIChzaWduZWQpIDMyIGJpdHMgb2YgdGhlIFRpbWVzdGFtcC5cblx0ICogQHJldHVybiB7VGltZXN0YW1wfVxuXHQgKi9cblxuXG5cdHZhciBUaW1lc3RhbXAgPVxuXHQvKiNfX1BVUkVfXyovXG5cdGZ1bmN0aW9uIChfTG9uZykge1xuXHQgIF9pbmhlcml0cyhUaW1lc3RhbXAsIF9Mb25nKTtcblxuXHQgIGZ1bmN0aW9uIFRpbWVzdGFtcChsb3csIGhpZ2gpIHtcblx0ICAgIHZhciBfdGhpcztcblxuXHQgICAgX2NsYXNzQ2FsbENoZWNrJDEodGhpcywgVGltZXN0YW1wKTtcblxuXHQgICAgaWYgKGxvbmdfMS5pc0xvbmcobG93KSkge1xuXHQgICAgICBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9nZXRQcm90b3R5cGVPZihUaW1lc3RhbXApLmNhbGwodGhpcywgbG93LmxvdywgbG93LmhpZ2gpKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX2dldFByb3RvdHlwZU9mKFRpbWVzdGFtcCkuY2FsbCh0aGlzLCBsb3csIGhpZ2gpKTtcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzKTtcblx0ICB9XG5cdCAgLyoqXG5cdCAgICogUmV0dXJuIHRoZSBKU09OIHZhbHVlLlxuXHQgICAqXG5cdCAgICogQG1ldGhvZFxuXHQgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIEpTT04gcmVwcmVzZW50YXRpb24uXG5cdCAgICovXG5cblxuXHQgIF9jcmVhdGVDbGFzcyQxKFRpbWVzdGFtcCwgW3tcblx0ICAgIGtleTogXCJ0b0pTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgJHRpbWVzdGFtcDogdGhpcy50b1N0cmluZygpXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIFJldHVybnMgYSBUaW1lc3RhbXAgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuICgzMi1iaXQpIGludGVnZXIgdmFsdWUuXG5cdCAgICAgKlxuXHQgICAgICogQG1ldGhvZFxuXHQgICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIHRoZSAzMi1iaXQgaW50ZWdlciBpbiBxdWVzdGlvbi5cblx0ICAgICAqIEByZXR1cm4ge1RpbWVzdGFtcH0gdGhlIHRpbWVzdGFtcC5cblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInRvRXh0ZW5kZWRKU09OXCIsXG5cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9FeHRlbmRlZEpTT04oKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgJHRpbWVzdGFtcDoge1xuXHQgICAgICAgICAgdDogdGhpcy5oaWdoLFxuXHQgICAgICAgICAgaTogdGhpcy5sb3dcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfV0sIFt7XG5cdCAgICBrZXk6IFwiZnJvbUludFwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21JbnQodmFsdWUpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBUaW1lc3RhbXAobG9uZ18xLmZyb21JbnQodmFsdWUpKTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogUmV0dXJucyBhIFRpbWVzdGFtcCByZXByZXNlbnRpbmcgdGhlIGdpdmVuIG51bWJlciB2YWx1ZSwgcHJvdmlkZWQgdGhhdCBpdCBpcyBhIGZpbml0ZSBudW1iZXIuIE90aGVyd2lzZSwgemVybyBpcyByZXR1cm5lZC5cblx0ICAgICAqXG5cdCAgICAgKiBAbWV0aG9kXG5cdCAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgdGhlIG51bWJlciBpbiBxdWVzdGlvbi5cblx0ICAgICAqIEByZXR1cm4ge1RpbWVzdGFtcH0gdGhlIHRpbWVzdGFtcC5cblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcImZyb21OdW1iZXJcIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tTnVtYmVyKHZhbHVlKSB7XG5cdCAgICAgIHJldHVybiBuZXcgVGltZXN0YW1wKGxvbmdfMS5mcm9tTnVtYmVyKHZhbHVlKSk7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIFJldHVybnMgYSBUaW1lc3RhbXAgZm9yIHRoZSBnaXZlbiBoaWdoIGFuZCBsb3cgYml0cy4gRWFjaCBpcyBhc3N1bWVkIHRvIHVzZSAzMiBiaXRzLlxuXHQgICAgICpcblx0ICAgICAqIEBtZXRob2Rcblx0ICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3dCaXRzIHRoZSBsb3cgMzItYml0cy5cblx0ICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoQml0cyB0aGUgaGlnaCAzMi1iaXRzLlxuXHQgICAgICogQHJldHVybiB7VGltZXN0YW1wfSB0aGUgdGltZXN0YW1wLlxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwiZnJvbUJpdHNcIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tQml0cyhsb3dCaXRzLCBoaWdoQml0cykge1xuXHQgICAgICByZXR1cm4gbmV3IFRpbWVzdGFtcChsb3dCaXRzLCBoaWdoQml0cyk7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIFJldHVybnMgYSBUaW1lc3RhbXAgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLCBvcHRpb25hbGx5IHVzaW5nIHRoZSBnaXZlbiByYWRpeC5cblx0ICAgICAqXG5cdCAgICAgKiBAbWV0aG9kXG5cdCAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBUaW1lc3RhbXAuXG5cdCAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdF9yYWRpeF0gdGhlIHJhZGl4IGluIHdoaWNoIHRoZSB0ZXh0IGlzIHdyaXR0ZW4uXG5cdCAgICAgKiBAcmV0dXJuIHtUaW1lc3RhbXB9IHRoZSB0aW1lc3RhbXAuXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJmcm9tU3RyaW5nXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbVN0cmluZyhzdHIsIG9wdF9yYWRpeCkge1xuXHQgICAgICByZXR1cm4gbmV3IFRpbWVzdGFtcChsb25nXzEuZnJvbVN0cmluZyhzdHIsIG9wdF9yYWRpeCkpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJmcm9tRXh0ZW5kZWRKU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUV4dGVuZGVkSlNPTihkb2MpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBUaW1lc3RhbXAoZG9jLiR0aW1lc3RhbXAuaSwgZG9jLiR0aW1lc3RhbXAudCk7XG5cdCAgICB9XG5cdCAgfV0pO1xuXG5cdCAgcmV0dXJuIFRpbWVzdGFtcDtcblx0fShsb25nXzEpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUaW1lc3RhbXAucHJvdG90eXBlLCAnX2Jzb250eXBlJywge1xuXHQgIHZhbHVlOiAnVGltZXN0YW1wJ1xuXHR9KTtcblx0dmFyIHRpbWVzdGFtcCA9IFRpbWVzdGFtcDtcblxuXHR2YXIgZW1wdHkgPSB7fTtcblxuXHR2YXIgZW1wdHkkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0XHRkZWZhdWx0OiBlbXB0eVxuXHR9KTtcblxuXHR2YXIgcmVxdWlyZSQkMCA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UoZW1wdHkkMSk7XG5cblx0LyogZ2xvYmFsIHdpbmRvdyAqL1xuXG5cdC8qKlxuXHQgKiBOb3JtYWxpemVzIG91ciBleHBlY3RlZCBzdHJpbmdpZmllZCBmb3JtIG9mIGEgZnVuY3Rpb24gYWNyb3NzIHZlcnNpb25zIG9mIG5vZGVcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIHN0cmluZ2lmeVxuXHQgKi9cblxuXG5cdGZ1bmN0aW9uIG5vcm1hbGl6ZWRGdW5jdGlvblN0cmluZyhmbikge1xuXHQgIHJldHVybiBmbi50b1N0cmluZygpLnJlcGxhY2UoJ2Z1bmN0aW9uKCcsICdmdW5jdGlvbiAoJyk7XG5cdH1cblxuXHRmdW5jdGlvbiBpbnNlY3VyZVJhbmRvbUJ5dGVzKHNpemUpIHtcblx0ICB2YXIgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG5cblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuXHQgICAgcmVzdWx0W2ldID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KTtcblx0ICB9XG5cblx0ICByZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0dmFyIHJhbmRvbUJ5dGVzID0gaW5zZWN1cmVSYW5kb21CeXRlcztcblxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNyeXB0byAmJiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuXHQgIHJhbmRvbUJ5dGVzID0gZnVuY3Rpb24gcmFuZG9tQnl0ZXMoc2l6ZSkge1xuXHQgICAgcmV0dXJuIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KHNpemUpKTtcblx0ICB9O1xuXHR9IGVsc2Uge1xuXHQgIHRyeSB7XG5cdCAgICByYW5kb21CeXRlcyA9IHJlcXVpcmUkJDAucmFuZG9tQnl0ZXM7XG5cdCAgfSBjYXRjaCAoZSkge30gLy8ga2VlcCB0aGUgZmFsbGJhY2tcblx0ICAvLyBOT1RFOiBpbiB0cmFuc3BpbGVkIGNhc2VzIHRoZSBhYm92ZSByZXF1aXJlIG1pZ2h0IHJldHVybiBudWxsL3VuZGVmaW5lZFxuXG5cblx0ICBpZiAocmFuZG9tQnl0ZXMgPT0gbnVsbCkge1xuXHQgICAgcmFuZG9tQnl0ZXMgPSBpbnNlY3VyZVJhbmRvbUJ5dGVzO1xuXHQgIH1cblx0fVxuXG5cdHZhciB1dGlscyA9IHtcblx0ICBub3JtYWxpemVkRnVuY3Rpb25TdHJpbmc6IG5vcm1hbGl6ZWRGdW5jdGlvblN0cmluZyxcblx0ICByYW5kb21CeXRlczogcmFuZG9tQnl0ZXNcblx0fTtcblxuXHQvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcblx0Ly8gYmFzZWQgb2ZmIGh0dHBzOi8vZ2l0aHViLmNvbS9kZWZ1bmN0em9tYmllL25vZGUtcHJvY2Vzcy9ibG9iL21hc3Rlci9icm93c2VyLmpzXG5cdGZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG5cdCAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG5cdH1cblxuXHRmdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCkge1xuXHQgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG5cdH1cblxuXHR2YXIgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG5cdHZhciBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuXG5cdGlmICh0eXBlb2YgZ2xvYmFsLnNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcblx0ICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcblx0fVxuXG5cdGlmICh0eXBlb2YgZ2xvYmFsLmNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG5cdCAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcblx0ICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuXHQgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICB9IC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG5cblxuXHQgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuXHQgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG5cdCAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuXHQgIH1cblxuXHQgIHRyeSB7XG5cdCAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG5cdCAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuXHQgIH0gY2F0Y2ggKGUpIHtcblx0ICAgIHRyeSB7XG5cdCAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuXHQgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG5cdCAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG5cdCAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcblx0ICAgIH1cblx0ICB9XG5cdH1cblxuXHRmdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG5cdCAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG5cdCAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcblx0ICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICB9IC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcblxuXG5cdCAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG5cdCAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG5cdCAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgfVxuXG5cdCAgdHJ5IHtcblx0ICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3Ncblx0ICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICB9IGNhdGNoIChlKSB7XG5cdCAgICB0cnkge1xuXHQgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG5cdCAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuXHQgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cblx0ICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuXHQgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcblx0ICAgIH1cblx0ICB9XG5cdH1cblxuXHR2YXIgcXVldWUgPSBbXTtcblx0dmFyIGRyYWluaW5nID0gZmFsc2U7XG5cdHZhciBjdXJyZW50UXVldWU7XG5cdHZhciBxdWV1ZUluZGV4ID0gLTE7XG5cblx0ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuXHQgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuXHQgICAgcmV0dXJuO1xuXHQgIH1cblxuXHQgIGRyYWluaW5nID0gZmFsc2U7XG5cblx0ICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuXHQgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcblx0ICB9IGVsc2Uge1xuXHQgICAgcXVldWVJbmRleCA9IC0xO1xuXHQgIH1cblxuXHQgIGlmIChxdWV1ZS5sZW5ndGgpIHtcblx0ICAgIGRyYWluUXVldWUoKTtcblx0ICB9XG5cdH1cblxuXHRmdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuXHQgIGlmIChkcmFpbmluZykge1xuXHQgICAgcmV0dXJuO1xuXHQgIH1cblxuXHQgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuXHQgIGRyYWluaW5nID0gdHJ1ZTtcblx0ICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuXG5cdCAgd2hpbGUgKGxlbikge1xuXHQgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG5cdCAgICBxdWV1ZSA9IFtdO1xuXG5cdCAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG5cdCAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcblx0ICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgcXVldWVJbmRleCA9IC0xO1xuXHQgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuXHQgIH1cblxuXHQgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG5cdCAgZHJhaW5pbmcgPSBmYWxzZTtcblx0ICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG5cdH1cblxuXHRmdW5jdGlvbiBuZXh0VGljayhmdW4pIHtcblx0ICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG5cblx0ICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcblx0ICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG5cblx0ICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuXHQgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcblx0ICB9XG5cdH0gLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuXG5cdGZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuXHQgIHRoaXMuZnVuID0gZnVuO1xuXHQgIHRoaXMuYXJyYXkgPSBhcnJheTtcblx0fVxuXG5cdEl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcblx0ICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcblx0fTtcblxuXHR2YXIgdGl0bGUgPSAnYnJvd3Nlcic7XG5cdHZhciBwbGF0Zm9ybSA9ICdicm93c2VyJztcblx0dmFyIGJyb3dzZXIgPSB0cnVlO1xuXHR2YXIgZW52ID0ge307XG5cdHZhciBhcmd2ID0gW107XG5cdHZhciB2ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5cblx0dmFyIHZlcnNpb25zID0ge307XG5cdHZhciByZWxlYXNlID0ge307XG5cdHZhciBjb25maWcgPSB7fTtcblxuXHRmdW5jdGlvbiBub29wKCkge31cblxuXHR2YXIgb24gPSBub29wO1xuXHR2YXIgYWRkTGlzdGVuZXIgPSBub29wO1xuXHR2YXIgb25jZSA9IG5vb3A7XG5cdHZhciBvZmYgPSBub29wO1xuXHR2YXIgcmVtb3ZlTGlzdGVuZXIgPSBub29wO1xuXHR2YXIgcmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcblx0dmFyIGVtaXQgPSBub29wO1xuXHRmdW5jdGlvbiBiaW5kaW5nKG5hbWUpIHtcblx0ICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG5cdH1cblx0ZnVuY3Rpb24gY3dkKCkge1xuXHQgIHJldHVybiAnLyc7XG5cdH1cblx0ZnVuY3Rpb24gY2hkaXIoZGlyKSB7XG5cdCAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcblx0fVxuXHRmdW5jdGlvbiB1bWFzaygpIHtcblx0ICByZXR1cm4gMDtcblx0fSAvLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9rdW1hdmlzL2Jyb3dzZXItcHJvY2Vzcy1ocnRpbWUvYmxvYi9tYXN0ZXIvaW5kZXguanNcblxuXHR2YXIgcGVyZm9ybWFuY2UgPSBnbG9iYWwucGVyZm9ybWFuY2UgfHwge307XG5cblx0dmFyIHBlcmZvcm1hbmNlTm93ID0gcGVyZm9ybWFuY2Uubm93IHx8IHBlcmZvcm1hbmNlLm1vek5vdyB8fCBwZXJmb3JtYW5jZS5tc05vdyB8fCBwZXJmb3JtYW5jZS5vTm93IHx8IHBlcmZvcm1hbmNlLndlYmtpdE5vdyB8fCBmdW5jdGlvbiAoKSB7XG5cdCAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXHR9OyAvLyBnZW5lcmF0ZSB0aW1lc3RhbXAgb3IgZGVsdGFcblx0Ly8gc2VlIGh0dHA6Ly9ub2RlanMub3JnL2FwaS9wcm9jZXNzLmh0bWwjcHJvY2Vzc19wcm9jZXNzX2hydGltZVxuXG5cblx0ZnVuY3Rpb24gaHJ0aW1lKHByZXZpb3VzVGltZXN0YW1wKSB7XG5cdCAgdmFyIGNsb2NrdGltZSA9IHBlcmZvcm1hbmNlTm93LmNhbGwocGVyZm9ybWFuY2UpICogMWUtMztcblx0ICB2YXIgc2Vjb25kcyA9IE1hdGguZmxvb3IoY2xvY2t0aW1lKTtcblx0ICB2YXIgbmFub3NlY29uZHMgPSBNYXRoLmZsb29yKGNsb2NrdGltZSAlIDEgKiAxZTkpO1xuXG5cdCAgaWYgKHByZXZpb3VzVGltZXN0YW1wKSB7XG5cdCAgICBzZWNvbmRzID0gc2Vjb25kcyAtIHByZXZpb3VzVGltZXN0YW1wWzBdO1xuXHQgICAgbmFub3NlY29uZHMgPSBuYW5vc2Vjb25kcyAtIHByZXZpb3VzVGltZXN0YW1wWzFdO1xuXG5cdCAgICBpZiAobmFub3NlY29uZHMgPCAwKSB7XG5cdCAgICAgIHNlY29uZHMtLTtcblx0ICAgICAgbmFub3NlY29uZHMgKz0gMWU5O1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiBbc2Vjb25kcywgbmFub3NlY29uZHNdO1xuXHR9XG5cdHZhciBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xuXHRmdW5jdGlvbiB1cHRpbWUoKSB7XG5cdCAgdmFyIGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKTtcblx0ICB2YXIgZGlmID0gY3VycmVudFRpbWUgLSBzdGFydFRpbWU7XG5cdCAgcmV0dXJuIGRpZiAvIDEwMDA7XG5cdH1cblx0dmFyIHByb2Nlc3MgPSB7XG5cdCAgbmV4dFRpY2s6IG5leHRUaWNrLFxuXHQgIHRpdGxlOiB0aXRsZSxcblx0ICBicm93c2VyOiBicm93c2VyLFxuXHQgIGVudjogZW52LFxuXHQgIGFyZ3Y6IGFyZ3YsXG5cdCAgdmVyc2lvbjogdmVyc2lvbixcblx0ICB2ZXJzaW9uczogdmVyc2lvbnMsXG5cdCAgb246IG9uLFxuXHQgIGFkZExpc3RlbmVyOiBhZGRMaXN0ZW5lcixcblx0ICBvbmNlOiBvbmNlLFxuXHQgIG9mZjogb2ZmLFxuXHQgIHJlbW92ZUxpc3RlbmVyOiByZW1vdmVMaXN0ZW5lcixcblx0ICByZW1vdmVBbGxMaXN0ZW5lcnM6IHJlbW92ZUFsbExpc3RlbmVycyxcblx0ICBlbWl0OiBlbWl0LFxuXHQgIGJpbmRpbmc6IGJpbmRpbmcsXG5cdCAgY3dkOiBjd2QsXG5cdCAgY2hkaXI6IGNoZGlyLFxuXHQgIHVtYXNrOiB1bWFzayxcblx0ICBocnRpbWU6IGhydGltZSxcblx0ICBwbGF0Zm9ybTogcGxhdGZvcm0sXG5cdCAgcmVsZWFzZTogcmVsZWFzZSxcblx0ICBjb25maWc6IGNvbmZpZyxcblx0ICB1cHRpbWU6IHVwdGltZVxuXHR9O1xuXG5cdHZhciBpbmhlcml0cztcblxuXHRpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcblx0ICBpbmhlcml0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuXHQgICAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcblx0ICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yO1xuXHQgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcblx0ICAgICAgY29uc3RydWN0b3I6IHtcblx0ICAgICAgICB2YWx1ZTogY3Rvcixcblx0ICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcblx0ICAgICAgICB3cml0YWJsZTogdHJ1ZSxcblx0ICAgICAgICBjb25maWd1cmFibGU6IHRydWVcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgfTtcblx0fSBlbHNlIHtcblx0ICBpbmhlcml0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuXHQgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3I7XG5cblx0ICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uIFRlbXBDdG9yKCkge307XG5cblx0ICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGU7XG5cdCAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpO1xuXHQgICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yO1xuXHQgIH07XG5cdH1cblxuXHR2YXIgaW5oZXJpdHMkMSA9IGluaGVyaXRzO1xuXG5cdGZ1bmN0aW9uIF90eXBlb2YkMShvYmopIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YkMSA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mJDEgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZiQxKG9iaik7IH1cblx0dmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5cdGZ1bmN0aW9uIGZvcm1hdChmKSB7XG5cdCAgaWYgKCFpc1N0cmluZyhmKSkge1xuXHQgICAgdmFyIG9iamVjdHMgPSBbXTtcblxuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcblx0ICB9XG5cblx0ICB2YXIgaSA9IDE7XG5cdCAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cdCAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuXHQgIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uICh4KSB7XG5cdCAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcblx0ICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG5cblx0ICAgIHN3aXRjaCAoeCkge1xuXHQgICAgICBjYXNlICclcyc6XG5cdCAgICAgICAgcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuXG5cdCAgICAgIGNhc2UgJyVkJzpcblx0ICAgICAgICByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG5cblx0ICAgICAgY2FzZSAnJWonOlxuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcblx0ICAgICAgICB9IGNhdGNoIChfKSB7XG5cdCAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuXHQgICAgICAgIH1cblxuXHQgICAgICBkZWZhdWx0OlxuXHQgICAgICAgIHJldHVybiB4O1xuXHQgICAgfVxuXHQgIH0pO1xuXG5cdCAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcblx0ICAgIGlmIChpc051bGwoeCkgfHwgIWlzT2JqZWN0KHgpKSB7XG5cdCAgICAgIHN0ciArPSAnICcgKyB4O1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgc3RyICs9ICcgJyArIGluc3BlY3QoeCk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHN0cjtcblx0fVxuXHQvLyBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuXHQvLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuXG5cdGZ1bmN0aW9uIGRlcHJlY2F0ZShmbiwgbXNnKSB7XG5cdCAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cblx0ICBpZiAoaXNVbmRlZmluZWQoZ2xvYmFsLnByb2Nlc3MpKSB7XG5cdCAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICB9O1xuXHQgIH1cblxuXHQgIHZhciB3YXJuZWQgPSBmYWxzZTtcblxuXHQgIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG5cdCAgICBpZiAoIXdhcm5lZCkge1xuXHQgICAgICB7XG5cdCAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuXHQgICAgICB9XG5cblx0ICAgICAgd2FybmVkID0gdHJ1ZTtcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG5cdH1cblx0dmFyIGRlYnVncyA9IHt9O1xuXHR2YXIgZGVidWdFbnZpcm9uO1xuXHRmdW5jdGlvbiBkZWJ1Z2xvZyhzZXQpIHtcblx0ICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSkgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcblx0ICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcblxuXHQgIGlmICghZGVidWdzW3NldF0pIHtcblx0ICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuXHQgICAgICB2YXIgcGlkID0gMDtcblxuXHQgICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbXNnID0gZm9ybWF0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG5cdCAgICAgIH07XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uICgpIHt9O1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiBkZWJ1Z3Nbc2V0XTtcblx0fVxuXHQvKipcblx0ICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuXHQgKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cblx0ICovXG5cblx0LyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuXG5cdGZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG5cdCAgLy8gZGVmYXVsdCBvcHRpb25zXG5cdCAgdmFyIGN0eCA9IHtcblx0ICAgIHNlZW46IFtdLFxuXHQgICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3Jcblx0ICB9OyAvLyBsZWdhY3kuLi5cblxuXHQgIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcblx0ICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuXG5cdCAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuXHQgICAgLy8gbGVnYWN5Li4uXG5cdCAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG5cdCAgfSBlbHNlIGlmIChvcHRzKSB7XG5cdCAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG5cdCAgICBfZXh0ZW5kKGN0eCwgb3B0cyk7XG5cdCAgfSAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG5cblxuXHQgIGlmIChpc1VuZGVmaW5lZChjdHguc2hvd0hpZGRlbikpIGN0eC5zaG93SGlkZGVuID0gZmFsc2U7XG5cdCAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG5cdCAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG5cdCAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jdXN0b21JbnNwZWN0KSkgY3R4LmN1c3RvbUluc3BlY3QgPSB0cnVlO1xuXHQgIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG5cdCAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xuXHR9IC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNncmFwaGljc1xuXG5cdGluc3BlY3QuY29sb3JzID0ge1xuXHQgICdib2xkJzogWzEsIDIyXSxcblx0ICAnaXRhbGljJzogWzMsIDIzXSxcblx0ICAndW5kZXJsaW5lJzogWzQsIDI0XSxcblx0ICAnaW52ZXJzZSc6IFs3LCAyN10sXG5cdCAgJ3doaXRlJzogWzM3LCAzOV0sXG5cdCAgJ2dyZXknOiBbOTAsIDM5XSxcblx0ICAnYmxhY2snOiBbMzAsIDM5XSxcblx0ICAnYmx1ZSc6IFszNCwgMzldLFxuXHQgICdjeWFuJzogWzM2LCAzOV0sXG5cdCAgJ2dyZWVuJzogWzMyLCAzOV0sXG5cdCAgJ21hZ2VudGEnOiBbMzUsIDM5XSxcblx0ICAncmVkJzogWzMxLCAzOV0sXG5cdCAgJ3llbGxvdyc6IFszMywgMzldXG5cdH07IC8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuXG5cdGluc3BlY3Quc3R5bGVzID0ge1xuXHQgICdzcGVjaWFsJzogJ2N5YW4nLFxuXHQgICdudW1iZXInOiAneWVsbG93Jyxcblx0ICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuXHQgICd1bmRlZmluZWQnOiAnZ3JleScsXG5cdCAgJ251bGwnOiAnYm9sZCcsXG5cdCAgJ3N0cmluZyc6ICdncmVlbicsXG5cdCAgJ2RhdGUnOiAnbWFnZW50YScsXG5cdCAgLy8gXCJuYW1lXCI6IGludGVudGlvbmFsbHkgbm90IHN0eWxpbmdcblx0ICAncmVnZXhwJzogJ3JlZCdcblx0fTtcblxuXHRmdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG5cdCAgdmFyIHN0eWxlID0gaW5zcGVjdC5zdHlsZXNbc3R5bGVUeXBlXTtcblxuXHQgIGlmIChzdHlsZSkge1xuXHQgICAgcmV0dXJuIFwiXFx4MUJbXCIgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgKyBcIlxceDFCW1wiICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuXHQgIH0gZWxzZSB7XG5cdCAgICByZXR1cm4gc3RyO1xuXHQgIH1cblx0fVxuXG5cdGZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG5cdCAgcmV0dXJuIHN0cjtcblx0fVxuXG5cdGZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG5cdCAgdmFyIGhhc2ggPSB7fTtcblx0ICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uICh2YWwsIGlkeCkge1xuXHQgICAgaGFzaFt2YWxdID0gdHJ1ZTtcblx0ICB9KTtcblx0ICByZXR1cm4gaGFzaDtcblx0fVxuXG5cdGZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuXHQgIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cblx0ICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcblx0ICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiYgdmFsdWUgJiYgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJiAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcblx0ICB2YWx1ZS5pbnNwZWN0ICE9PSBpbnNwZWN0ICYmIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuXHQgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcblx0ICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcblxuXHQgICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG5cdCAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuXHQgICAgfVxuXG5cdCAgICByZXR1cm4gcmV0O1xuXHQgIH0gLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcblxuXG5cdCAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcblxuXHQgIGlmIChwcmltaXRpdmUpIHtcblx0ICAgIHJldHVybiBwcmltaXRpdmU7XG5cdCAgfSAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG5cblxuXHQgIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuXHQgIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG5cdCAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG5cdCAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuXHQgIH0gLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuXHQgIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG5cblxuXHQgIGlmIChpc0Vycm9yKHZhbHVlKSAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcblx0ICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG5cdCAgfSAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG5cblxuXHQgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuXHQgICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG5cdCAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG5cdCAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG5cdCAgICB9XG5cblx0ICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcblx0ICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcblx0ICAgIH1cblxuXHQgICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcblx0ICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuXHQgICAgfVxuXG5cdCAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcblx0ICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICB2YXIgYmFzZSA9ICcnLFxuXHQgICAgICBhcnJheSA9IGZhbHNlLFxuXHQgICAgICBicmFjZXMgPSBbJ3snLCAnfSddOyAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG5cblx0ICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0ICAgIGFycmF5ID0gdHJ1ZTtcblx0ICAgIGJyYWNlcyA9IFsnWycsICddJ107XG5cdCAgfSAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcblxuXG5cdCAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG5cdCAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuXHQgICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG5cdCAgfSAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuXG5cblx0ICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG5cdCAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcblx0ICB9IC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuXG5cblx0ICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuXHQgICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuXHQgIH0gLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuXG5cblx0ICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcblx0ICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG5cdCAgfVxuXG5cdCAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG5cdCAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcblx0ICB9XG5cblx0ICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuXHQgICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuXHQgICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cdCAgdmFyIG91dHB1dDtcblxuXHQgIGlmIChhcnJheSkge1xuXHQgICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcblx0ICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuXHQgICAgfSk7XG5cdCAgfVxuXG5cdCAgY3R4LnNlZW4ucG9wKCk7XG5cdCAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG5cdCAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG5cblx0ICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG5cdCAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJykucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuXHQgICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuXHQgIH1cblxuXHQgIGlmIChpc051bWJlcih2YWx1ZSkpIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG5cdCAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpOyAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG5cblx0ICBpZiAoaXNOdWxsKHZhbHVlKSkgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG5cdCAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcblx0fVxuXG5cdGZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcblx0ICB2YXIgb3V0cHV0ID0gW107XG5cblx0ICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuXHQgICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG5cdCAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIFN0cmluZyhpKSwgdHJ1ZSkpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgb3V0cHV0LnB1c2goJycpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdCAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcblx0ICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCB0cnVlKSk7XG5cdCAgICB9XG5cdCAgfSk7XG5cdCAgcmV0dXJuIG91dHB1dDtcblx0fVxuXG5cdGZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcblx0ICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuXHQgIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHtcblx0ICAgIHZhbHVlOiB2YWx1ZVtrZXldXG5cdCAgfTtcblxuXHQgIGlmIChkZXNjLmdldCkge1xuXHQgICAgaWYgKGRlc2Muc2V0KSB7XG5cdCAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgaWYgKGRlc2Muc2V0KSB7XG5cdCAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuXHQgICAgbmFtZSA9ICdbJyArIGtleSArICddJztcblx0ICB9XG5cblx0ICBpZiAoIXN0cikge1xuXHQgICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG5cdCAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuXHQgICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuXHQgICAgICAgIGlmIChhcnJheSkge1xuXHQgICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24gKGxpbmUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuXHQgICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uIChsaW5lKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG5cdCAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcblx0ICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG5cdCAgICAgIHJldHVybiBzdHI7XG5cdCAgICB9XG5cblx0ICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG5cblx0ICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuXHQgICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcblx0ICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIikucmVwbGFjZSgvXFxcXFwiL2csICdcIicpLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG5cdCAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xuXHR9XG5cblx0ZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcblx0ICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbiAocHJldiwgY3VyKSB7XG5cdCAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIDtcblx0ICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcblx0ICB9LCAwKTtcblxuXHQgIGlmIChsZW5ndGggPiA2MCkge1xuXHQgICAgcmV0dXJuIGJyYWNlc1swXSArIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgKyAnICcgKyBvdXRwdXQuam9pbignLFxcbiAgJykgKyAnICcgKyBicmFjZXNbMV07XG5cdCAgfVxuXG5cdCAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcblx0fSAvLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcblx0Ly8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5cblxuXHRmdW5jdGlvbiBpc0FycmF5KGFyKSB7XG5cdCAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xuXHR9XG5cdGZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcblx0ICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xuXHR9XG5cdGZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcblx0ICByZXR1cm4gYXJnID09PSBudWxsO1xuXHR9XG5cdGZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuXHQgIHJldHVybiBhcmcgPT0gbnVsbDtcblx0fVxuXHRmdW5jdGlvbiBpc051bWJlcihhcmcpIHtcblx0ICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG5cdH1cblx0ZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG5cdCAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xuXHR9XG5cdGZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuXHQgIHJldHVybiBfdHlwZW9mJDEoYXJnKSA9PT0gJ3N5bWJvbCc7XG5cdH1cblx0ZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG5cdCAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xuXHR9XG5cdGZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG5cdCAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xuXHR9XG5cdGZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuXHQgIHJldHVybiBfdHlwZW9mJDEoYXJnKSA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xuXHR9XG5cdGZ1bmN0aW9uIGlzRGF0ZShkKSB7XG5cdCAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG5cdH1cblx0ZnVuY3Rpb24gaXNFcnJvcihlKSB7XG5cdCAgcmV0dXJuIGlzT2JqZWN0KGUpICYmIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xuXHR9XG5cdGZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG5cdCAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG5cdH1cblx0ZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG5cdCAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fCB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHwgX3R5cGVvZiQxKGFyZykgPT09ICdzeW1ib2wnIHx8IC8vIEVTNiBzeW1ib2xcblx0ICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcblx0fVxuXHRmdW5jdGlvbiBpc0J1ZmZlcihtYXliZUJ1Zikge1xuXHQgIHJldHVybiBCdWZmZXIuaXNCdWZmZXIobWF5YmVCdWYpO1xuXHR9XG5cblx0ZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuXHQgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG5cdH1cblxuXHRmdW5jdGlvbiBwYWQobikge1xuXHQgIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xuXHR9XG5cblx0dmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTsgLy8gMjYgRmViIDE2OjE5OjM0XG5cblx0ZnVuY3Rpb24gdGltZXN0YW1wJDEoKSB7XG5cdCAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuXHQgIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLCBwYWQoZC5nZXRNaW51dGVzKCkpLCBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG5cdCAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcblx0fSAvLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5cblxuXHRmdW5jdGlvbiBsb2coKSB7XG5cdCAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAkMSgpLCBmb3JtYXQuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG5cdH1cblx0ZnVuY3Rpb24gX2V4dGVuZChvcmlnaW4sIGFkZCkge1xuXHQgIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3Rcblx0ICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblx0ICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG5cdCAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcblxuXHQgIHdoaWxlIChpLS0pIHtcblx0ICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcblx0ICB9XG5cblx0ICByZXR1cm4gb3JpZ2luO1xuXHR9XG5cblx0ZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG5cdCAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xuXHR9XG5cblx0dmFyIHV0aWwgPSB7XG5cdCAgaW5oZXJpdHM6IGluaGVyaXRzJDEsXG5cdCAgX2V4dGVuZDogX2V4dGVuZCxcblx0ICBsb2c6IGxvZyxcblx0ICBpc0J1ZmZlcjogaXNCdWZmZXIsXG5cdCAgaXNQcmltaXRpdmU6IGlzUHJpbWl0aXZlLFxuXHQgIGlzRnVuY3Rpb246IGlzRnVuY3Rpb24sXG5cdCAgaXNFcnJvcjogaXNFcnJvcixcblx0ICBpc0RhdGU6IGlzRGF0ZSxcblx0ICBpc09iamVjdDogaXNPYmplY3QsXG5cdCAgaXNSZWdFeHA6IGlzUmVnRXhwLFxuXHQgIGlzVW5kZWZpbmVkOiBpc1VuZGVmaW5lZCxcblx0ICBpc1N5bWJvbDogaXNTeW1ib2wsXG5cdCAgaXNTdHJpbmc6IGlzU3RyaW5nLFxuXHQgIGlzTnVtYmVyOiBpc051bWJlcixcblx0ICBpc051bGxPclVuZGVmaW5lZDogaXNOdWxsT3JVbmRlZmluZWQsXG5cdCAgaXNOdWxsOiBpc051bGwsXG5cdCAgaXNCb29sZWFuOiBpc0Jvb2xlYW4sXG5cdCAgaXNBcnJheTogaXNBcnJheSxcblx0ICBpbnNwZWN0OiBpbnNwZWN0LFxuXHQgIGRlcHJlY2F0ZTogZGVwcmVjYXRlLFxuXHQgIGZvcm1hdDogZm9ybWF0LFxuXHQgIGRlYnVnbG9nOiBkZWJ1Z2xvZ1xuXHR9O1xuXG5cdHZhciB1dGlsJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdFx0Zm9ybWF0OiBmb3JtYXQsXG5cdFx0ZGVwcmVjYXRlOiBkZXByZWNhdGUsXG5cdFx0ZGVidWdsb2c6IGRlYnVnbG9nLFxuXHRcdGluc3BlY3Q6IGluc3BlY3QsXG5cdFx0aXNBcnJheTogaXNBcnJheSxcblx0XHRpc0Jvb2xlYW46IGlzQm9vbGVhbixcblx0XHRpc051bGw6IGlzTnVsbCxcblx0XHRpc051bGxPclVuZGVmaW5lZDogaXNOdWxsT3JVbmRlZmluZWQsXG5cdFx0aXNOdW1iZXI6IGlzTnVtYmVyLFxuXHRcdGlzU3RyaW5nOiBpc1N0cmluZyxcblx0XHRpc1N5bWJvbDogaXNTeW1ib2wsXG5cdFx0aXNVbmRlZmluZWQ6IGlzVW5kZWZpbmVkLFxuXHRcdGlzUmVnRXhwOiBpc1JlZ0V4cCxcblx0XHRpc09iamVjdDogaXNPYmplY3QsXG5cdFx0aXNEYXRlOiBpc0RhdGUsXG5cdFx0aXNFcnJvcjogaXNFcnJvcixcblx0XHRpc0Z1bmN0aW9uOiBpc0Z1bmN0aW9uLFxuXHRcdGlzUHJpbWl0aXZlOiBpc1ByaW1pdGl2ZSxcblx0XHRpc0J1ZmZlcjogaXNCdWZmZXIsXG5cdFx0bG9nOiBsb2csXG5cdFx0aW5oZXJpdHM6IGluaGVyaXRzJDEsXG5cdFx0X2V4dGVuZDogX2V4dGVuZCxcblx0XHRkZWZhdWx0OiB1dGlsXG5cdH0pO1xuXG5cdHZhciB1dGlsJDIgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKHV0aWwkMSk7XG5cblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrJDIoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDIodGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQyKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMihDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDIoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cblx0dmFyIEJ1ZmZlciQxID0gYnVmZmVyLkJ1ZmZlcjtcblx0dmFyIHJhbmRvbUJ5dGVzJDEgPSB1dGlscy5yYW5kb21CeXRlcztcblx0dmFyIGRlcHJlY2F0ZSQxID0gdXRpbCQyLmRlcHJlY2F0ZTsgLy8gY29uc3RhbnRzXG5cblx0dmFyIFBST0NFU1NfVU5JUVVFID0gcmFuZG9tQnl0ZXMkMSg1KTsgLy8gUmVndWxhciBleHByZXNzaW9uIHRoYXQgY2hlY2tzIGZvciBoZXggdmFsdWVcblxuXHR2YXIgY2hlY2tGb3JIZXhSZWdFeHAgPSBuZXcgUmVnRXhwKCdeWzAtOWEtZkEtRl17MjR9JCcpO1xuXHR2YXIgaGFzQnVmZmVyVHlwZSA9IGZhbHNlOyAvLyBDaGVjayBpZiBidWZmZXIgZXhpc3RzXG5cblx0dHJ5IHtcblx0ICBpZiAoQnVmZmVyJDEgJiYgQnVmZmVyJDEuZnJvbSkgaGFzQnVmZmVyVHlwZSA9IHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHQgIGhhc0J1ZmZlclR5cGUgPSBmYWxzZTtcblx0fSAvLyBQcmVjb21wdXRlZCBoZXggdGFibGUgZW5hYmxlcyBzcGVlZHkgaGV4IHN0cmluZyBjb252ZXJzaW9uXG5cblxuXHR2YXIgaGV4VGFibGUgPSBbXTtcblxuXHRmb3IgKHZhciBfaSA9IDA7IF9pIDwgMjU2OyBfaSsrKSB7XG5cdCAgaGV4VGFibGVbX2ldID0gKF9pIDw9IDE1ID8gJzAnIDogJycpICsgX2kudG9TdHJpbmcoMTYpO1xuXHR9IC8vIExvb2t1cCB0YWJsZXNcblxuXG5cdHZhciBkZWNvZGVMb29rdXAgPSBbXTtcblx0dmFyIGkgPSAwO1xuXG5cdHdoaWxlIChpIDwgMTApIHtcblx0ICBkZWNvZGVMb29rdXBbMHgzMCArIGldID0gaSsrO1xuXHR9XG5cblx0d2hpbGUgKGkgPCAxNikge1xuXHQgIGRlY29kZUxvb2t1cFsweDQxIC0gMTAgKyBpXSA9IGRlY29kZUxvb2t1cFsweDYxIC0gMTAgKyBpXSA9IGkrKztcblx0fVxuXG5cdHZhciBfQnVmZmVyID0gQnVmZmVyJDE7XG5cblx0ZnVuY3Rpb24gY29udmVydFRvSGV4KGJ5dGVzKSB7XG5cdCAgcmV0dXJuIGJ5dGVzLnRvU3RyaW5nKCdoZXgnKTtcblx0fVxuXG5cdGZ1bmN0aW9uIG1ha2VPYmplY3RJZEVycm9yKGludmFsaWRTdHJpbmcsIGluZGV4KSB7XG5cdCAgdmFyIGludmFsaWRDaGFyYWN0ZXIgPSBpbnZhbGlkU3RyaW5nW2luZGV4XTtcblx0ICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIk9iamVjdElkIHN0cmluZyBcXFwiXCIuY29uY2F0KGludmFsaWRTdHJpbmcsIFwiXFxcIiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlciBcXFwiXCIpLmNvbmNhdChpbnZhbGlkQ2hhcmFjdGVyLCBcIlxcXCIgd2l0aCBjaGFyYWN0ZXIgY29kZSAoXCIpLmNvbmNhdChpbnZhbGlkU3RyaW5nLmNoYXJDb2RlQXQoaW5kZXgpLCBcIikuIEFsbCBjaGFyYWN0ZXIgY29kZXMgZm9yIGEgbm9uLWhleCBzdHJpbmcgbXVzdCBiZSBsZXNzIHRoYW4gMjU2LlwiKSk7XG5cdH1cblx0LyoqXG5cdCAqIEEgY2xhc3MgcmVwcmVzZW50YXRpb24gb2YgdGhlIEJTT04gT2JqZWN0SWQgdHlwZS5cblx0ICovXG5cblxuXHR2YXIgT2JqZWN0SWQgPVxuXHQvKiNfX1BVUkVfXyovXG5cdGZ1bmN0aW9uICgpIHtcblx0ICAvKipcblx0ICAgKiBDcmVhdGUgYW4gT2JqZWN0SWQgdHlwZVxuXHQgICAqXG5cdCAgICogQHBhcmFtIHsoc3RyaW5nfEJ1ZmZlcnxudW1iZXIpfSBpZCBDYW4gYmUgYSAyNCBieXRlIGhleCBzdHJpbmcsIDEyIGJ5dGUgYmluYXJ5IEJ1ZmZlciwgb3IgYSBOdW1iZXIuXG5cdCAgICogQHByb3BlcnR5IHtudW1iZXJ9IGdlbmVyYXRpb25UaW1lIFRoZSBnZW5lcmF0aW9uIHRpbWUgb2YgdGhpcyBPYmplY3RJZCBpbnN0YW5jZVxuXHQgICAqIEByZXR1cm4ge09iamVjdElkfSBpbnN0YW5jZSBvZiBPYmplY3RJZC5cblx0ICAgKi9cblx0ICBmdW5jdGlvbiBPYmplY3RJZChpZCkge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrJDIodGhpcywgT2JqZWN0SWQpO1xuXG5cdCAgICAvLyBEdWNrLXR5cGluZyB0byBzdXBwb3J0IE9iamVjdElkIGZyb20gZGlmZmVyZW50IG5wbSBwYWNrYWdlc1xuXHQgICAgaWYgKGlkIGluc3RhbmNlb2YgT2JqZWN0SWQpIHJldHVybiBpZDsgLy8gVGhlIG1vc3QgY29tbW9uIHVzZWNhc2UgKGJsYW5rIGlkLCBuZXcgb2JqZWN0SWQgaW5zdGFuY2UpXG5cblx0ICAgIGlmIChpZCA9PSBudWxsIHx8IHR5cGVvZiBpZCA9PT0gJ251bWJlcicpIHtcblx0ICAgICAgLy8gR2VuZXJhdGUgYSBuZXcgaWRcblx0ICAgICAgdGhpcy5pZCA9IE9iamVjdElkLmdlbmVyYXRlKGlkKTsgLy8gSWYgd2UgYXJlIGNhY2hpbmcgdGhlIGhleCBzdHJpbmdcblxuXHQgICAgICBpZiAoT2JqZWN0SWQuY2FjaGVIZXhTdHJpbmcpIHRoaXMuX19pZCA9IHRoaXMudG9TdHJpbmcoJ2hleCcpOyAvLyBSZXR1cm4gdGhlIG9iamVjdFxuXG5cdCAgICAgIHJldHVybjtcblx0ICAgIH0gLy8gQ2hlY2sgaWYgdGhlIHBhc3NlZCBpbiBpZCBpcyB2YWxpZFxuXG5cblx0ICAgIHZhciB2YWxpZCA9IE9iamVjdElkLmlzVmFsaWQoaWQpOyAvLyBUaHJvdyBhbiBlcnJvciBpZiBpdCdzIG5vdCBhIHZhbGlkIHNldHVwXG5cblx0ICAgIGlmICghdmFsaWQgJiYgaWQgIT0gbnVsbCkge1xuXHQgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBwYXNzZWQgaW4gbXVzdCBiZSBhIHNpbmdsZSBTdHJpbmcgb2YgMTIgYnl0ZXMgb3IgYSBzdHJpbmcgb2YgMjQgaGV4IGNoYXJhY3RlcnMnKTtcblx0ICAgIH0gZWxzZSBpZiAodmFsaWQgJiYgdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPT09IDI0ICYmIGhhc0J1ZmZlclR5cGUpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBPYmplY3RJZChCdWZmZXIkMS5mcm9tKGlkLCAnaGV4JykpO1xuXHQgICAgfSBlbHNlIGlmICh2YWxpZCAmJiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmIGlkLmxlbmd0aCA9PT0gMjQpIHtcblx0ICAgICAgcmV0dXJuIE9iamVjdElkLmNyZWF0ZUZyb21IZXhTdHJpbmcoaWQpO1xuXHQgICAgfSBlbHNlIGlmIChpZCAhPSBudWxsICYmIGlkLmxlbmd0aCA9PT0gMTIpIHtcblx0ICAgICAgLy8gYXNzdW1lIDEyIGJ5dGUgc3RyaW5nXG5cdCAgICAgIHRoaXMuaWQgPSBpZDtcblx0ICAgIH0gZWxzZSBpZiAoaWQgIT0gbnVsbCAmJiBpZC50b0hleFN0cmluZykge1xuXHQgICAgICAvLyBEdWNrLXR5cGluZyB0byBzdXBwb3J0IE9iamVjdElkIGZyb20gZGlmZmVyZW50IG5wbSBwYWNrYWdlc1xuXHQgICAgICByZXR1cm4gT2JqZWN0SWQuY3JlYXRlRnJvbUhleFN0cmluZyhpZC50b0hleFN0cmluZygpKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IHBhc3NlZCBpbiBtdXN0IGJlIGEgc2luZ2xlIFN0cmluZyBvZiAxMiBieXRlcyBvciBhIHN0cmluZyBvZiAyNCBoZXggY2hhcmFjdGVycycpO1xuXHQgICAgfVxuXG5cdCAgICBpZiAoT2JqZWN0SWQuY2FjaGVIZXhTdHJpbmcpIHRoaXMuX19pZCA9IHRoaXMudG9TdHJpbmcoJ2hleCcpO1xuXHQgIH1cblx0ICAvKipcblx0ICAgKiBSZXR1cm4gdGhlIE9iamVjdElkIGlkIGFzIGEgMjQgYnl0ZSBoZXggc3RyaW5nIHJlcHJlc2VudGF0aW9uXG5cdCAgICpcblx0ICAgKiBAbWV0aG9kXG5cdCAgICogQHJldHVybiB7c3RyaW5nfSByZXR1cm4gdGhlIDI0IGJ5dGUgaGV4IHN0cmluZyByZXByZXNlbnRhdGlvbi5cblx0ICAgKi9cblxuXG5cdCAgX2NyZWF0ZUNsYXNzJDIoT2JqZWN0SWQsIFt7XG5cdCAgICBrZXk6IFwidG9IZXhTdHJpbmdcIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b0hleFN0cmluZygpIHtcblx0ICAgICAgaWYgKE9iamVjdElkLmNhY2hlSGV4U3RyaW5nICYmIHRoaXMuX19pZCkgcmV0dXJuIHRoaXMuX19pZDtcblx0ICAgICAgdmFyIGhleFN0cmluZyA9ICcnO1xuXG5cdCAgICAgIGlmICghdGhpcy5pZCB8fCAhdGhpcy5pZC5sZW5ndGgpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIE9iamVjdElkLCBPYmplY3RJZC5pZCBtdXN0IGJlIGVpdGhlciBhIHN0cmluZyBvciBhIEJ1ZmZlciwgYnV0IGlzIFsnICsgSlNPTi5zdHJpbmdpZnkodGhpcy5pZCkgKyAnXScpO1xuXHQgICAgICB9XG5cblx0ICAgICAgaWYgKHRoaXMuaWQgaW5zdGFuY2VvZiBfQnVmZmVyKSB7XG5cdCAgICAgICAgaGV4U3RyaW5nID0gY29udmVydFRvSGV4KHRoaXMuaWQpO1xuXHQgICAgICAgIGlmIChPYmplY3RJZC5jYWNoZUhleFN0cmluZykgdGhpcy5fX2lkID0gaGV4U3RyaW5nO1xuXHQgICAgICAgIHJldHVybiBoZXhTdHJpbmc7XG5cdCAgICAgIH1cblxuXHQgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCB0aGlzLmlkLmxlbmd0aDsgX2kyKyspIHtcblx0ICAgICAgICB2YXIgaGV4Q2hhciA9IGhleFRhYmxlW3RoaXMuaWQuY2hhckNvZGVBdChfaTIpXTtcblxuXHQgICAgICAgIGlmICh0eXBlb2YgaGV4Q2hhciAhPT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgIHRocm93IG1ha2VPYmplY3RJZEVycm9yKHRoaXMuaWQsIF9pMik7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgaGV4U3RyaW5nICs9IGhleENoYXI7XG5cdCAgICAgIH1cblxuXHQgICAgICBpZiAoT2JqZWN0SWQuY2FjaGVIZXhTdHJpbmcpIHRoaXMuX19pZCA9IGhleFN0cmluZztcblx0ICAgICAgcmV0dXJuIGhleFN0cmluZztcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogVXBkYXRlIHRoZSBPYmplY3RJZCBpbmRleCB1c2VkIGluIGdlbmVyYXRpbmcgbmV3IE9iamVjdElkJ3Mgb24gdGhlIGRyaXZlclxuXHQgICAgICpcblx0ICAgICAqIEBtZXRob2Rcblx0ICAgICAqIEByZXR1cm4ge251bWJlcn0gcmV0dXJucyBuZXh0IGluZGV4IHZhbHVlLlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwidG9TdHJpbmdcIixcblxuXHQgICAgLyoqXG5cdCAgICAgKiBDb252ZXJ0cyB0aGUgaWQgaW50byBhIDI0IGJ5dGUgaGV4IHN0cmluZyBmb3IgcHJpbnRpbmdcblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFRoZSBCdWZmZXIgdG9TdHJpbmcgZm9ybWF0IHBhcmFtZXRlci5cblx0ICAgICAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJuIHRoZSAyNCBieXRlIGhleCBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZyhmb3JtYXQpIHtcblx0ICAgICAgLy8gSXMgdGhlIGlkIGEgYnVmZmVyIHRoZW4gdXNlIHRoZSBidWZmZXIgdG9TdHJpbmcgbWV0aG9kIHRvIHJldHVybiB0aGUgZm9ybWF0XG5cdCAgICAgIGlmICh0aGlzLmlkICYmIHRoaXMuaWQuY29weSkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmlkLnRvU3RyaW5nKHR5cGVvZiBmb3JtYXQgPT09ICdzdHJpbmcnID8gZm9ybWF0IDogJ2hleCcpO1xuXHQgICAgICB9XG5cblx0ICAgICAgcmV0dXJuIHRoaXMudG9IZXhTdHJpbmcoKTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQ29udmVydHMgdG8gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7U3RyaW5nfSByZXR1cm4gdGhlIDI0IGJ5dGUgaGV4IHN0cmluZyByZXByZXNlbnRhdGlvbi5cblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInRvSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudG9IZXhTdHJpbmcoKTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQ29tcGFyZXMgdGhlIGVxdWFsaXR5IG9mIHRoaXMgT2JqZWN0SWQgd2l0aCBgb3RoZXJJRGAuXG5cdCAgICAgKlxuXHQgICAgICogQG1ldGhvZFxuXHQgICAgICogQHBhcmFtIHtvYmplY3R9IG90aGVySWQgT2JqZWN0SWQgaW5zdGFuY2UgdG8gY29tcGFyZSBhZ2FpbnN0LlxuXHQgICAgICogQHJldHVybiB7Ym9vbGVhbn0gdGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgdHdvIE9iamVjdElkJ3Ncblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcImVxdWFsc1wiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcklkKSB7XG5cdCAgICAgIGlmIChvdGhlcklkIGluc3RhbmNlb2YgT2JqZWN0SWQpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpID09PSBvdGhlcklkLnRvU3RyaW5nKCk7XG5cdCAgICAgIH1cblxuXHQgICAgICBpZiAodHlwZW9mIG90aGVySWQgPT09ICdzdHJpbmcnICYmIE9iamVjdElkLmlzVmFsaWQob3RoZXJJZCkgJiYgb3RoZXJJZC5sZW5ndGggPT09IDEyICYmIHRoaXMuaWQgaW5zdGFuY2VvZiBfQnVmZmVyKSB7XG5cdCAgICAgICAgcmV0dXJuIG90aGVySWQgPT09IHRoaXMuaWQudG9TdHJpbmcoJ2JpbmFyeScpO1xuXHQgICAgICB9XG5cblx0ICAgICAgaWYgKHR5cGVvZiBvdGhlcklkID09PSAnc3RyaW5nJyAmJiBPYmplY3RJZC5pc1ZhbGlkKG90aGVySWQpICYmIG90aGVySWQubGVuZ3RoID09PSAyNCkge1xuXHQgICAgICAgIHJldHVybiBvdGhlcklkLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMudG9IZXhTdHJpbmcoKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIGlmICh0eXBlb2Ygb3RoZXJJZCA9PT0gJ3N0cmluZycgJiYgT2JqZWN0SWQuaXNWYWxpZChvdGhlcklkKSAmJiBvdGhlcklkLmxlbmd0aCA9PT0gMTIpIHtcblx0ICAgICAgICByZXR1cm4gb3RoZXJJZCA9PT0gdGhpcy5pZDtcblx0ICAgICAgfVxuXG5cdCAgICAgIGlmIChvdGhlcklkICE9IG51bGwgJiYgKG90aGVySWQgaW5zdGFuY2VvZiBPYmplY3RJZCB8fCBvdGhlcklkLnRvSGV4U3RyaW5nKSkge1xuXHQgICAgICAgIHJldHVybiBvdGhlcklkLnRvSGV4U3RyaW5nKCkgPT09IHRoaXMudG9IZXhTdHJpbmcoKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogUmV0dXJucyB0aGUgZ2VuZXJhdGlvbiBkYXRlIChhY2N1cmF0ZSB1cCB0byB0aGUgc2Vjb25kKSB0aGF0IHRoaXMgSUQgd2FzIGdlbmVyYXRlZC5cblx0ICAgICAqXG5cdCAgICAgKiBAbWV0aG9kXG5cdCAgICAgKiBAcmV0dXJuIHtEYXRlfSB0aGUgZ2VuZXJhdGlvbiBkYXRlXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJnZXRUaW1lc3RhbXBcIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRUaW1lc3RhbXAoKSB7XG5cdCAgICAgIHZhciB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpO1xuXHQgICAgICB2YXIgdGltZSA9IHRoaXMuaWQucmVhZFVJbnQzMkJFKDApO1xuXHQgICAgICB0aW1lc3RhbXAuc2V0VGltZShNYXRoLmZsb29yKHRpbWUpICogMTAwMCk7XG5cdCAgICAgIHJldHVybiB0aW1lc3RhbXA7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInRvRXh0ZW5kZWRKU09OXCIsXG5cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9FeHRlbmRlZEpTT04oKSB7XG5cdCAgICAgIGlmICh0aGlzLnRvSGV4U3RyaW5nKSByZXR1cm4ge1xuXHQgICAgICAgICRvaWQ6IHRoaXMudG9IZXhTdHJpbmcoKVxuXHQgICAgICB9O1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgICRvaWQ6IHRoaXMudG9TdHJpbmcoJ2hleCcpXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfV0sIFt7XG5cdCAgICBrZXk6IFwiZ2V0SW5jXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0SW5jKCkge1xuXHQgICAgICByZXR1cm4gT2JqZWN0SWQuaW5kZXggPSAoT2JqZWN0SWQuaW5kZXggKyAxKSAlIDB4ZmZmZmZmO1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBHZW5lcmF0ZSBhIDEyIGJ5dGUgaWQgYnVmZmVyIHVzZWQgaW4gT2JqZWN0SWQnc1xuXHQgICAgICpcblx0ICAgICAqIEBtZXRob2Rcblx0ICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdGltZV0gb3B0aW9uYWwgcGFyYW1ldGVyIGFsbG93aW5nIHRvIHBhc3MgaW4gYSBzZWNvbmQgYmFzZWQgdGltZXN0YW1wLlxuXHQgICAgICogQHJldHVybiB7QnVmZmVyfSByZXR1cm4gdGhlIDEyIGJ5dGUgaWQgYnVmZmVyIHN0cmluZy5cblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcImdlbmVyYXRlXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZ2VuZXJhdGUodGltZSkge1xuXHQgICAgICBpZiAoJ251bWJlcicgIT09IHR5cGVvZiB0aW1lKSB7XG5cdCAgICAgICAgdGltZSA9IH5+KERhdGUubm93KCkgLyAxMDAwKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIHZhciBpbmMgPSBPYmplY3RJZC5nZXRJbmMoKTtcblx0ICAgICAgdmFyIGJ1ZmZlciQkMSA9IEJ1ZmZlciQxLmFsbG9jKDEyKTsgLy8gNC1ieXRlIHRpbWVzdGFtcFxuXG5cdCAgICAgIGJ1ZmZlciQkMVszXSA9IHRpbWUgJiAweGZmO1xuXHQgICAgICBidWZmZXIkJDFbMl0gPSB0aW1lID4+IDggJiAweGZmO1xuXHQgICAgICBidWZmZXIkJDFbMV0gPSB0aW1lID4+IDE2ICYgMHhmZjtcblx0ICAgICAgYnVmZmVyJCQxWzBdID0gdGltZSA+PiAyNCAmIDB4ZmY7IC8vIDUtYnl0ZSBwcm9jZXNzIHVuaXF1ZVxuXG5cdCAgICAgIGJ1ZmZlciQkMVs0XSA9IFBST0NFU1NfVU5JUVVFWzBdO1xuXHQgICAgICBidWZmZXIkJDFbNV0gPSBQUk9DRVNTX1VOSVFVRVsxXTtcblx0ICAgICAgYnVmZmVyJCQxWzZdID0gUFJPQ0VTU19VTklRVUVbMl07XG5cdCAgICAgIGJ1ZmZlciQkMVs3XSA9IFBST0NFU1NfVU5JUVVFWzNdO1xuXHQgICAgICBidWZmZXIkJDFbOF0gPSBQUk9DRVNTX1VOSVFVRVs0XTsgLy8gMy1ieXRlIGNvdW50ZXJcblxuXHQgICAgICBidWZmZXIkJDFbMTFdID0gaW5jICYgMHhmZjtcblx0ICAgICAgYnVmZmVyJCQxWzEwXSA9IGluYyA+PiA4ICYgMHhmZjtcblx0ICAgICAgYnVmZmVyJCQxWzldID0gaW5jID4+IDE2ICYgMHhmZjtcblx0ICAgICAgcmV0dXJuIGJ1ZmZlciQkMTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwiY3JlYXRlUGtcIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVQaygpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBPYmplY3RJZCgpO1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBDcmVhdGVzIGFuIE9iamVjdElkIGZyb20gYSBzZWNvbmQgYmFzZWQgbnVtYmVyLCB3aXRoIHRoZSByZXN0IG9mIHRoZSBPYmplY3RJZCB6ZXJvZWQgb3V0LiBVc2VkIGZvciBjb21wYXJpc29ucyBvciBzb3J0aW5nIHRoZSBPYmplY3RJZC5cblx0ICAgICAqXG5cdCAgICAgKiBAbWV0aG9kXG5cdCAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSBhbiBpbnRlZ2VyIG51bWJlciByZXByZXNlbnRpbmcgYSBudW1iZXIgb2Ygc2Vjb25kcy5cblx0ICAgICAqIEByZXR1cm4ge09iamVjdElkfSByZXR1cm4gdGhlIGNyZWF0ZWQgT2JqZWN0SWRcblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcImNyZWF0ZUZyb21UaW1lXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlRnJvbVRpbWUodGltZSkge1xuXHQgICAgICB2YXIgYnVmZmVyJCQxID0gQnVmZmVyJDEuZnJvbShbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pOyAvLyBFbmNvZGUgdGltZSBpbnRvIGZpcnN0IDQgYnl0ZXNcblxuXHQgICAgICBidWZmZXIkJDFbM10gPSB0aW1lICYgMHhmZjtcblx0ICAgICAgYnVmZmVyJCQxWzJdID0gdGltZSA+PiA4ICYgMHhmZjtcblx0ICAgICAgYnVmZmVyJCQxWzFdID0gdGltZSA+PiAxNiAmIDB4ZmY7XG5cdCAgICAgIGJ1ZmZlciQkMVswXSA9IHRpbWUgPj4gMjQgJiAweGZmOyAvLyBSZXR1cm4gdGhlIG5ldyBvYmplY3RJZFxuXG5cdCAgICAgIHJldHVybiBuZXcgT2JqZWN0SWQoYnVmZmVyJCQxKTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQ3JlYXRlcyBhbiBPYmplY3RJZCBmcm9tIGEgaGV4IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBPYmplY3RJZC5cblx0ICAgICAqXG5cdCAgICAgKiBAbWV0aG9kXG5cdCAgICAgKiBAcGFyYW0ge3N0cmluZ30gaGV4U3RyaW5nIGNyZWF0ZSBhIE9iamVjdElkIGZyb20gYSBwYXNzZWQgaW4gMjQgYnl0ZSBoZXhzdHJpbmcuXG5cdCAgICAgKiBAcmV0dXJuIHtPYmplY3RJZH0gcmV0dXJuIHRoZSBjcmVhdGVkIE9iamVjdElkXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJjcmVhdGVGcm9tSGV4U3RyaW5nXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlRnJvbUhleFN0cmluZyhzdHJpbmcpIHtcblx0ICAgICAgLy8gVGhyb3cgYW4gZXJyb3IgaWYgaXQncyBub3QgYSB2YWxpZCBzZXR1cFxuXHQgICAgICBpZiAodHlwZW9mIHN0cmluZyA9PT0gJ3VuZGVmaW5lZCcgfHwgc3RyaW5nICE9IG51bGwgJiYgc3RyaW5nLmxlbmd0aCAhPT0gMjQpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBwYXNzZWQgaW4gbXVzdCBiZSBhIHNpbmdsZSBTdHJpbmcgb2YgMTIgYnl0ZXMgb3IgYSBzdHJpbmcgb2YgMjQgaGV4IGNoYXJhY3RlcnMnKTtcblx0ICAgICAgfSAvLyBVc2UgQnVmZmVyLmZyb20gbWV0aG9kIGlmIGF2YWlsYWJsZVxuXG5cblx0ICAgICAgaWYgKGhhc0J1ZmZlclR5cGUpIHJldHVybiBuZXcgT2JqZWN0SWQoQnVmZmVyJDEuZnJvbShzdHJpbmcsICdoZXgnKSk7IC8vIENhbGN1bGF0ZSBsZW5ndGhzXG5cblx0ICAgICAgdmFyIGFycmF5ID0gbmV3IF9CdWZmZXIoMTIpO1xuXHQgICAgICB2YXIgbiA9IDA7XG5cdCAgICAgIHZhciBpID0gMDtcblxuXHQgICAgICB3aGlsZSAoaSA8IDI0KSB7XG5cdCAgICAgICAgYXJyYXlbbisrXSA9IGRlY29kZUxvb2t1cFtzdHJpbmcuY2hhckNvZGVBdChpKyspXSA8PCA0IHwgZGVjb2RlTG9va3VwW3N0cmluZy5jaGFyQ29kZUF0KGkrKyldO1xuXHQgICAgICB9XG5cblx0ICAgICAgcmV0dXJuIG5ldyBPYmplY3RJZChhcnJheSk7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgYnNvbiBPYmplY3RJZFxuXHQgICAgICpcblx0ICAgICAqIEBtZXRob2Rcblx0ICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGJzb24gT2JqZWN0SWQsIHJldHVybiBmYWxzZSBvdGhlcndpc2UuXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJpc1ZhbGlkXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gaXNWYWxpZChpZCkge1xuXHQgICAgICBpZiAoaWQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG5cdCAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdudW1iZXInKSB7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH1cblxuXHQgICAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuXHQgICAgICAgIHJldHVybiBpZC5sZW5ndGggPT09IDEyIHx8IGlkLmxlbmd0aCA9PT0gMjQgJiYgY2hlY2tGb3JIZXhSZWdFeHAudGVzdChpZCk7XG5cdCAgICAgIH1cblxuXHQgICAgICBpZiAoaWQgaW5zdGFuY2VvZiBPYmplY3RJZCkge1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9XG5cblx0ICAgICAgaWYgKGlkIGluc3RhbmNlb2YgX0J1ZmZlciAmJiBpZC5sZW5ndGggPT09IDEyKSB7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH0gLy8gRHVjay1UeXBpbmcgZGV0ZWN0aW9uIG9mIE9iamVjdElkIGxpa2Ugb2JqZWN0c1xuXG5cblx0ICAgICAgaWYgKGlkLnRvSGV4U3RyaW5nKSB7XG5cdCAgICAgICAgcmV0dXJuIGlkLmlkLmxlbmd0aCA9PT0gMTIgfHwgaWQuaWQubGVuZ3RoID09PSAyNCAmJiBjaGVja0ZvckhleFJlZ0V4cC50ZXN0KGlkLmlkKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwiZnJvbUV4dGVuZGVkSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21FeHRlbmRlZEpTT04oZG9jKSB7XG5cdCAgICAgIHJldHVybiBuZXcgT2JqZWN0SWQoZG9jLiRvaWQpO1xuXHQgICAgfVxuXHQgIH1dKTtcblxuXHQgIHJldHVybiBPYmplY3RJZDtcblx0fSgpOyAvLyBEZXByZWNhdGVkIG1ldGhvZHNcblxuXG5cdE9iamVjdElkLmdldF9pbmMgPSBkZXByZWNhdGUkMShmdW5jdGlvbiAoKSB7XG5cdCAgcmV0dXJuIE9iamVjdElkLmdldEluYygpO1xuXHR9LCAnUGxlYXNlIHVzZSB0aGUgc3RhdGljIGBPYmplY3RJZC5nZXRJbmMoKWAgaW5zdGVhZCcpO1xuXHRPYmplY3RJZC5wcm90b3R5cGUuZ2V0X2luYyA9IGRlcHJlY2F0ZSQxKGZ1bmN0aW9uICgpIHtcblx0ICByZXR1cm4gT2JqZWN0SWQuZ2V0SW5jKCk7XG5cdH0sICdQbGVhc2UgdXNlIHRoZSBzdGF0aWMgYE9iamVjdElkLmdldEluYygpYCBpbnN0ZWFkJyk7XG5cdE9iamVjdElkLnByb3RvdHlwZS5nZXRJbmMgPSBkZXByZWNhdGUkMShmdW5jdGlvbiAoKSB7XG5cdCAgcmV0dXJuIE9iamVjdElkLmdldEluYygpO1xuXHR9LCAnUGxlYXNlIHVzZSB0aGUgc3RhdGljIGBPYmplY3RJZC5nZXRJbmMoKWAgaW5zdGVhZCcpO1xuXHRPYmplY3RJZC5wcm90b3R5cGUuZ2VuZXJhdGUgPSBkZXByZWNhdGUkMShmdW5jdGlvbiAodGltZSkge1xuXHQgIHJldHVybiBPYmplY3RJZC5nZW5lcmF0ZSh0aW1lKTtcblx0fSwgJ1BsZWFzZSB1c2UgdGhlIHN0YXRpYyBgT2JqZWN0SWQuZ2VuZXJhdGUodGltZSlgIGluc3RlYWQnKTtcblx0LyoqXG5cdCAqIEBpZ25vcmVcblx0ICovXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdElkLnByb3RvdHlwZSwgJ2dlbmVyYXRpb25UaW1lJywge1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5pZFszXSB8IHRoaXMuaWRbMl0gPDwgOCB8IHRoaXMuaWRbMV0gPDwgMTYgfCB0aGlzLmlkWzBdIDw8IDI0O1xuXHQgIH0sXG5cdCAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcblx0ICAgIC8vIEVuY29kZSB0aW1lIGludG8gZmlyc3QgNCBieXRlc1xuXHQgICAgdGhpcy5pZFszXSA9IHZhbHVlICYgMHhmZjtcblx0ICAgIHRoaXMuaWRbMl0gPSB2YWx1ZSA+PiA4ICYgMHhmZjtcblx0ICAgIHRoaXMuaWRbMV0gPSB2YWx1ZSA+PiAxNiAmIDB4ZmY7XG5cdCAgICB0aGlzLmlkWzBdID0gdmFsdWUgPj4gMjQgJiAweGZmO1xuXHQgIH1cblx0fSk7XG5cdC8qKlxuXHQgKiBDb252ZXJ0cyB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIElkLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybiB0aGUgMjQgYnl0ZSBoZXggc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuXHQgKiBAaWdub3JlXG5cdCAqL1xuXG5cdE9iamVjdElkLnByb3RvdHlwZVt1dGlsJDIuaW5zcGVjdC5jdXN0b20gfHwgJ2luc3BlY3QnXSA9IE9iamVjdElkLnByb3RvdHlwZS50b1N0cmluZztcblx0LyoqXG5cdCAqIEBpZ25vcmVcblx0ICovXG5cblx0T2JqZWN0SWQuaW5kZXggPSB+fihNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYpOyAvLyBJbiA0LjAuMCBhbmQgNC4wLjEsIHRoaXMgcHJvcGVydHkgbmFtZSB3YXMgY2hhbmdlZCB0byBPYmplY3RJZCB0byBtYXRjaCB0aGUgY2xhc3MgbmFtZS5cblx0Ly8gVGhpcyBjYXVzZWQgaW50ZXJvcGVyYWJpbGl0eSBwcm9ibGVtcyB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5LCBzbyBpblxuXHQvLyBsYXRlciBidWlsZHMgd2UgY2hhbmdlZCBpdCBiYWNrIHRvIE9iamVjdElEIChjYXBpdGFsIEQpIHRvIG1hdGNoIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbnMuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdElkLnByb3RvdHlwZSwgJ19ic29udHlwZScsIHtcblx0ICB2YWx1ZTogJ09iamVjdElEJ1xuXHR9KTtcblx0dmFyIG9iamVjdGlkID0gT2JqZWN0SWQ7XG5cblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrJDMoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cblx0ZnVuY3Rpb24gYWxwaGFiZXRpemUoc3RyKSB7XG5cdCAgcmV0dXJuIHN0ci5zcGxpdCgnJykuc29ydCgpLmpvaW4oJycpO1xuXHR9XG5cdC8qKlxuXHQgKiBBIGNsYXNzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBCU09OIFJlZ0V4cCB0eXBlLlxuXHQgKi9cblxuXG5cdHZhciBCU09OUmVnRXhwID1cblx0LyojX19QVVJFX18qL1xuXHRmdW5jdGlvbiAoKSB7XG5cdCAgLyoqXG5cdCAgICogQ3JlYXRlIGEgUmVnRXhwIHR5cGVcblx0ICAgKlxuXHQgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaFxuXHQgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gb3B0aW9uc1xuXHQgICAqL1xuXHQgIGZ1bmN0aW9uIEJTT05SZWdFeHAocGF0dGVybiwgb3B0aW9ucykge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrJDModGhpcywgQlNPTlJlZ0V4cCk7XG5cblx0ICAgIC8vIEV4ZWN1dGVcblx0ICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm4gfHwgJyc7XG5cdCAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zID8gYWxwaGFiZXRpemUob3B0aW9ucykgOiAnJzsgLy8gVmFsaWRhdGUgb3B0aW9uc1xuXG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xuXHQgICAgICBpZiAoISh0aGlzLm9wdGlvbnNbaV0gPT09ICdpJyB8fCB0aGlzLm9wdGlvbnNbaV0gPT09ICdtJyB8fCB0aGlzLm9wdGlvbnNbaV0gPT09ICd4JyB8fCB0aGlzLm9wdGlvbnNbaV0gPT09ICdsJyB8fCB0aGlzLm9wdGlvbnNbaV0gPT09ICdzJyB8fCB0aGlzLm9wdGlvbnNbaV0gPT09ICd1JykpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcmVndWxhciBleHByZXNzaW9uIG9wdGlvbiBbXCIuY29uY2F0KHRoaXMub3B0aW9uc1tpXSwgXCJdIGlzIG5vdCBzdXBwb3J0ZWRcIikpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXHQgIC8qKlxuXHQgICAqIEBpZ25vcmVcblx0ICAgKi9cblxuXG5cdCAgX2NyZWF0ZUNsYXNzJDMoQlNPTlJlZ0V4cCwgW3tcblx0ICAgIGtleTogXCJ0b0V4dGVuZGVkSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvRXh0ZW5kZWRKU09OKCkge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgICRyZWd1bGFyRXhwcmVzc2lvbjoge1xuXHQgICAgICAgICAgcGF0dGVybjogdGhpcy5wYXR0ZXJuLFxuXHQgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zXG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH1dLCBbe1xuXHQgICAga2V5OiBcImZyb21FeHRlbmRlZEpTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tRXh0ZW5kZWRKU09OKGRvYykge1xuXHQgICAgICByZXR1cm4gbmV3IEJTT05SZWdFeHAoZG9jLiRyZWd1bGFyRXhwcmVzc2lvbi5wYXR0ZXJuLCBkb2MuJHJlZ3VsYXJFeHByZXNzaW9uLm9wdGlvbnMuc3BsaXQoJycpLnNvcnQoKS5qb2luKCcnKSk7XG5cdCAgICB9XG5cdCAgfV0pO1xuXG5cdCAgcmV0dXJuIEJTT05SZWdFeHA7XG5cdH0oKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoQlNPTlJlZ0V4cC5wcm90b3R5cGUsICdfYnNvbnR5cGUnLCB7XG5cdCAgdmFsdWU6ICdCU09OUmVnRXhwJ1xuXHR9KTtcblx0dmFyIHJlZ2V4cCA9IEJTT05SZWdFeHA7XG5cblx0LyoqXG5cdCAqIEEgY2xhc3MgcmVwcmVzZW50YXRpb24gb2YgdGhlIEJTT04gU3ltYm9sIHR5cGUuXG5cdCAqL1xuXG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQ0KGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuXHRmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQ0KHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuXHRmdW5jdGlvbiBfY3JlYXRlQ2xhc3MkNChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDQoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ0KENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5cdHZhciBCU09OU3ltYm9sID1cblx0LyojX19QVVJFX18qL1xuXHRmdW5jdGlvbiAoKSB7XG5cdCAgLyoqXG5cdCAgICogQ3JlYXRlIGEgU3ltYm9sIHR5cGVcblx0ICAgKlxuXHQgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc3ltYm9sLlxuXHQgICAqL1xuXHQgIGZ1bmN0aW9uIEJTT05TeW1ib2wodmFsdWUpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayQ0KHRoaXMsIEJTT05TeW1ib2wpO1xuXG5cdCAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgfVxuXHQgIC8qKlxuXHQgICAqIEFjY2VzcyB0aGUgd3JhcHBlZCBzdHJpbmcgdmFsdWUuXG5cdCAgICpcblx0ICAgKiBAbWV0aG9kXG5cdCAgICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSB3cmFwcGVkIHN0cmluZy5cblx0ICAgKi9cblxuXG5cdCAgX2NyZWF0ZUNsYXNzJDQoQlNPTlN5bWJvbCwgW3tcblx0ICAgIGtleTogXCJ2YWx1ZU9mXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWVPZigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInRvU3RyaW5nXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJpbnNwZWN0XCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gaW5zcGVjdCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInRvSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInRvRXh0ZW5kZWRKU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9FeHRlbmRlZEpTT04oKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgJHN5bWJvbDogdGhpcy52YWx1ZVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH1dLCBbe1xuXHQgICAga2V5OiBcImZyb21FeHRlbmRlZEpTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tRXh0ZW5kZWRKU09OKGRvYykge1xuXHQgICAgICByZXR1cm4gbmV3IEJTT05TeW1ib2woZG9jLiRzeW1ib2wpO1xuXHQgICAgfVxuXHQgIH1dKTtcblxuXHQgIHJldHVybiBCU09OU3ltYm9sO1xuXHR9KCk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KEJTT05TeW1ib2wucHJvdG90eXBlLCAnX2Jzb250eXBlJywge1xuXHQgIHZhbHVlOiAnU3ltYm9sJ1xuXHR9KTtcblx0dmFyIHN5bWJvbCA9IEJTT05TeW1ib2w7XG5cblx0LyoqXG5cdCAqIEEgY2xhc3MgcmVwcmVzZW50YXRpb24gb2YgYSBCU09OIEludDMyIHR5cGUuXG5cdCAqL1xuXG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQ1KGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuXHRmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQ1KHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuXHRmdW5jdGlvbiBfY3JlYXRlQ2xhc3MkNShDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDUoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ1KENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5cdHZhciBJbnQzMiA9XG5cdC8qI19fUFVSRV9fKi9cblx0ZnVuY3Rpb24gKCkge1xuXHQgIC8qKlxuXHQgICAqIENyZWF0ZSBhbiBJbnQzMiB0eXBlXG5cdCAgICpcblx0ICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgdGhlIG51bWJlciB3ZSB3YW50IHRvIHJlcHJlc2VudCBhcyBhbiBpbnQzMi5cblx0ICAgKiBAcmV0dXJuIHtJbnQzMn1cblx0ICAgKi9cblx0ICBmdW5jdGlvbiBJbnQzMih2YWx1ZSkge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrJDUodGhpcywgSW50MzIpO1xuXG5cdCAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgfVxuXHQgIC8qKlxuXHQgICAqIEFjY2VzcyB0aGUgbnVtYmVyIHZhbHVlLlxuXHQgICAqXG5cdCAgICogQG1ldGhvZFxuXHQgICAqIEByZXR1cm4ge251bWJlcn0gcmV0dXJucyB0aGUgd3JhcHBlZCBpbnQzMiBudW1iZXIuXG5cdCAgICovXG5cblxuXHQgIF9jcmVhdGVDbGFzcyQ1KEludDMyLCBbe1xuXHQgICAga2V5OiBcInZhbHVlT2ZcIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwidG9KU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwidG9FeHRlbmRlZEpTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b0V4dGVuZGVkSlNPTihvcHRpb25zKSB7XG5cdCAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVsYXhlZCkgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgJG51bWJlckludDogdGhpcy52YWx1ZS50b1N0cmluZygpXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfV0sIFt7XG5cdCAgICBrZXk6IFwiZnJvbUV4dGVuZGVkSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21FeHRlbmRlZEpTT04oZG9jLCBvcHRpb25zKSB7XG5cdCAgICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMucmVsYXhlZCA/IHBhcnNlSW50KGRvYy4kbnVtYmVySW50LCAxMCkgOiBuZXcgSW50MzIoZG9jLiRudW1iZXJJbnQpO1xuXHQgICAgfVxuXHQgIH1dKTtcblxuXHQgIHJldHVybiBJbnQzMjtcblx0fSgpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnQzMi5wcm90b3R5cGUsICdfYnNvbnR5cGUnLCB7XG5cdCAgdmFsdWU6ICdJbnQzMidcblx0fSk7XG5cdHZhciBpbnRfMzIgPSBJbnQzMjtcblxuXHQvKipcblx0ICogQSBjbGFzcyByZXByZXNlbnRhdGlvbiBvZiB0aGUgQlNPTiBDb2RlIHR5cGUuXG5cdCAqL1xuXG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQ2KGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuXHRmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQ2KHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuXHRmdW5jdGlvbiBfY3JlYXRlQ2xhc3MkNihDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDYoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ2KENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5cdHZhciBDb2RlID1cblx0LyojX19QVVJFX18qL1xuXHRmdW5jdGlvbiAoKSB7XG5cdCAgLyoqXG5cdCAgICogQ3JlYXRlIGEgQ29kZSB0eXBlXG5cdCAgICpcblx0ICAgKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24pfSBjb2RlIGEgc3RyaW5nIG9yIGZ1bmN0aW9uLlxuXHQgICAqIEBwYXJhbSB7T2JqZWN0fSBbc2NvcGVdIGFuIG9wdGlvbmFsIHNjb3BlIGZvciB0aGUgZnVuY3Rpb24uXG5cdCAgICogQHJldHVybiB7Q29kZX1cblx0ICAgKi9cblx0ICBmdW5jdGlvbiBDb2RlKGNvZGUsIHNjb3BlKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2skNih0aGlzLCBDb2RlKTtcblxuXHQgICAgdGhpcy5jb2RlID0gY29kZTtcblx0ICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcblx0ICB9XG5cdCAgLyoqXG5cdCAgICogQGlnbm9yZVxuXHQgICAqL1xuXG5cblx0ICBfY3JlYXRlQ2xhc3MkNihDb2RlLCBbe1xuXHQgICAga2V5OiBcInRvSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICBzY29wZTogdGhpcy5zY29wZSxcblx0ICAgICAgICBjb2RlOiB0aGlzLmNvZGVcblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwidG9FeHRlbmRlZEpTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b0V4dGVuZGVkSlNPTigpIHtcblx0ICAgICAgaWYgKHRoaXMuc2NvcGUpIHtcblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgJGNvZGU6IHRoaXMuY29kZSxcblx0ICAgICAgICAgICRzY29wZTogdGhpcy5zY29wZVxuXHQgICAgICAgIH07XG5cdCAgICAgIH1cblxuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgICRjb2RlOiB0aGlzLmNvZGVcblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cblx0ICB9XSwgW3tcblx0ICAgIGtleTogXCJmcm9tRXh0ZW5kZWRKU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUV4dGVuZGVkSlNPTihkb2MpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBDb2RlKGRvYy4kY29kZSwgZG9jLiRzY29wZSk7XG5cdCAgICB9XG5cdCAgfV0pO1xuXG5cdCAgcmV0dXJuIENvZGU7XG5cdH0oKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29kZS5wcm90b3R5cGUsICdfYnNvbnR5cGUnLCB7XG5cdCAgdmFsdWU6ICdDb2RlJ1xuXHR9KTtcblx0dmFyIGNvZGUgPSBDb2RlO1xuXG5cdHZhciBCdWZmZXIkMiA9IGJ1ZmZlci5CdWZmZXI7XG5cdHZhciBQQVJTRV9TVFJJTkdfUkVHRVhQID0gL14oXFwrfC0pPyhcXGQrfChcXGQqXFwuXFxkKikpPyhFfGUpPyhbLStdKT8oXFxkKyk/JC87XG5cdHZhciBQQVJTRV9JTkZfUkVHRVhQID0gL14oXFwrfC0pPyhJbmZpbml0eXxpbmYpJC9pO1xuXHR2YXIgUEFSU0VfTkFOX1JFR0VYUCA9IC9eKFxcK3wtKT9OYU4kL2k7XG5cdHZhciBFWFBPTkVOVF9NQVggPSA2MTExO1xuXHR2YXIgRVhQT05FTlRfTUlOID0gLTYxNzY7XG5cdHZhciBFWFBPTkVOVF9CSUFTID0gNjE3Njtcblx0dmFyIE1BWF9ESUdJVFMgPSAzNDsgLy8gTmFuIHZhbHVlIGJpdHMgYXMgMzIgYml0IHZhbHVlcyAoZHVlIHRvIGxhY2sgb2YgbG9uZ3MpXG5cblx0dmFyIE5BTl9CVUZGRVIgPSBbMHg3YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0ucmV2ZXJzZSgpOyAvLyBJbmZpbml0eSB2YWx1ZSBiaXRzIDMyIGJpdCB2YWx1ZXMgKGR1ZSB0byBsYWNrIG9mIGxvbmdzKVxuXG5cdHZhciBJTkZfTkVHQVRJVkVfQlVGRkVSID0gWzB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLnJldmVyc2UoKTtcblx0dmFyIElORl9QT1NJVElWRV9CVUZGRVIgPSBbMHg3OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0ucmV2ZXJzZSgpO1xuXHR2YXIgRVhQT05FTlRfUkVHRVggPSAvXihbLStdKT8oXFxkKyk/JC87IC8vIERldGVjdCBpZiB0aGUgdmFsdWUgaXMgYSBkaWdpdFxuXG5cdGZ1bmN0aW9uIGlzRGlnaXQodmFsdWUpIHtcblx0ICByZXR1cm4gIWlzTmFOKHBhcnNlSW50KHZhbHVlLCAxMCkpO1xuXHR9IC8vIERpdmlkZSB0d28gdWludDEyOCB2YWx1ZXNcblxuXG5cdGZ1bmN0aW9uIGRpdmlkZXUxMjgodmFsdWUpIHtcblx0ICB2YXIgRElWSVNPUiA9IGxvbmdfMS5mcm9tTnVtYmVyKDEwMDAgKiAxMDAwICogMTAwMCk7XG5cblx0ICB2YXIgX3JlbSA9IGxvbmdfMS5mcm9tTnVtYmVyKDApO1xuXG5cdCAgaWYgKCF2YWx1ZS5wYXJ0c1swXSAmJiAhdmFsdWUucGFydHNbMV0gJiYgIXZhbHVlLnBhcnRzWzJdICYmICF2YWx1ZS5wYXJ0c1szXSkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgcXVvdGllbnQ6IHZhbHVlLFxuXHQgICAgICByZW06IF9yZW1cblx0ICAgIH07XG5cdCAgfVxuXG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPD0gMzsgaSsrKSB7XG5cdCAgICAvLyBBZGp1c3QgcmVtYWluZGVyIHRvIG1hdGNoIHZhbHVlIG9mIG5leHQgZGl2aWRlbmRcblx0ICAgIF9yZW0gPSBfcmVtLnNoaWZ0TGVmdCgzMik7IC8vIEFkZCB0aGUgZGl2aWRlZCB0byBfcmVtXG5cblx0ICAgIF9yZW0gPSBfcmVtLmFkZChuZXcgbG9uZ18xKHZhbHVlLnBhcnRzW2ldLCAwKSk7XG5cdCAgICB2YWx1ZS5wYXJ0c1tpXSA9IF9yZW0uZGl2KERJVklTT1IpLmxvdztcblx0ICAgIF9yZW0gPSBfcmVtLm1vZHVsbyhESVZJU09SKTtcblx0ICB9XG5cblx0ICByZXR1cm4ge1xuXHQgICAgcXVvdGllbnQ6IHZhbHVlLFxuXHQgICAgcmVtOiBfcmVtXG5cdCAgfTtcblx0fSAvLyBNdWx0aXBseSB0d28gTG9uZyB2YWx1ZXMgYW5kIHJldHVybiB0aGUgMTI4IGJpdCB2YWx1ZVxuXG5cblx0ZnVuY3Rpb24gbXVsdGlwbHk2NHgyKGxlZnQsIHJpZ2h0KSB7XG5cdCAgaWYgKCFsZWZ0ICYmICFyaWdodCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgaGlnaDogbG9uZ18xLmZyb21OdW1iZXIoMCksXG5cdCAgICAgIGxvdzogbG9uZ18xLmZyb21OdW1iZXIoMClcblx0ICAgIH07XG5cdCAgfVxuXG5cdCAgdmFyIGxlZnRIaWdoID0gbGVmdC5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpO1xuXHQgIHZhciBsZWZ0TG93ID0gbmV3IGxvbmdfMShsZWZ0LmdldExvd0JpdHMoKSwgMCk7XG5cdCAgdmFyIHJpZ2h0SGlnaCA9IHJpZ2h0LnNoaWZ0UmlnaHRVbnNpZ25lZCgzMik7XG5cdCAgdmFyIHJpZ2h0TG93ID0gbmV3IGxvbmdfMShyaWdodC5nZXRMb3dCaXRzKCksIDApO1xuXHQgIHZhciBwcm9kdWN0SGlnaCA9IGxlZnRIaWdoLm11bHRpcGx5KHJpZ2h0SGlnaCk7XG5cdCAgdmFyIHByb2R1Y3RNaWQgPSBsZWZ0SGlnaC5tdWx0aXBseShyaWdodExvdyk7XG5cdCAgdmFyIHByb2R1Y3RNaWQyID0gbGVmdExvdy5tdWx0aXBseShyaWdodEhpZ2gpO1xuXHQgIHZhciBwcm9kdWN0TG93ID0gbGVmdExvdy5tdWx0aXBseShyaWdodExvdyk7XG5cdCAgcHJvZHVjdEhpZ2ggPSBwcm9kdWN0SGlnaC5hZGQocHJvZHVjdE1pZC5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpKTtcblx0ICBwcm9kdWN0TWlkID0gbmV3IGxvbmdfMShwcm9kdWN0TWlkLmdldExvd0JpdHMoKSwgMCkuYWRkKHByb2R1Y3RNaWQyKS5hZGQocHJvZHVjdExvdy5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpKTtcblx0ICBwcm9kdWN0SGlnaCA9IHByb2R1Y3RIaWdoLmFkZChwcm9kdWN0TWlkLnNoaWZ0UmlnaHRVbnNpZ25lZCgzMikpO1xuXHQgIHByb2R1Y3RMb3cgPSBwcm9kdWN0TWlkLnNoaWZ0TGVmdCgzMikuYWRkKG5ldyBsb25nXzEocHJvZHVjdExvdy5nZXRMb3dCaXRzKCksIDApKTsgLy8gUmV0dXJuIHRoZSAxMjggYml0IHJlc3VsdFxuXG5cdCAgcmV0dXJuIHtcblx0ICAgIGhpZ2g6IHByb2R1Y3RIaWdoLFxuXHQgICAgbG93OiBwcm9kdWN0TG93XG5cdCAgfTtcblx0fVxuXG5cdGZ1bmN0aW9uIGxlc3NUaGFuKGxlZnQsIHJpZ2h0KSB7XG5cdCAgLy8gTWFrZSB2YWx1ZXMgdW5zaWduZWRcblx0ICB2YXIgdWhsZWZ0ID0gbGVmdC5oaWdoID4+PiAwO1xuXHQgIHZhciB1aHJpZ2h0ID0gcmlnaHQuaGlnaCA+Pj4gMDsgLy8gQ29tcGFyZSBoaWdoIGJpdHMgZmlyc3RcblxuXHQgIGlmICh1aGxlZnQgPCB1aHJpZ2h0KSB7XG5cdCAgICByZXR1cm4gdHJ1ZTtcblx0ICB9IGVsc2UgaWYgKHVobGVmdCA9PT0gdWhyaWdodCkge1xuXHQgICAgdmFyIHVsbGVmdCA9IGxlZnQubG93ID4+PiAwO1xuXHQgICAgdmFyIHVscmlnaHQgPSByaWdodC5sb3cgPj4+IDA7XG5cdCAgICBpZiAodWxsZWZ0IDwgdWxyaWdodCkgcmV0dXJuIHRydWU7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0ZnVuY3Rpb24gaW52YWxpZEVycihzdHJpbmcsIG1lc3NhZ2UpIHtcblx0ICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiXFxcIlwiLmNvbmNhdChzdHJpbmcsIFwiXFxcIiBpcyBub3QgYSB2YWxpZCBEZWNpbWFsMTI4IHN0cmluZyAtIFwiKS5jb25jYXQobWVzc2FnZSkpO1xuXHR9XG5cdC8qKlxuXHQgKiBBIGNsYXNzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBCU09OIERlY2ltYWwxMjggdHlwZS5cblx0ICpcblx0ICogQGNsYXNzXG5cdCAqIEBwYXJhbSB7QnVmZmVyfSBieXRlcyBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSByYXcgRGVjaW1hbDEyOCBieXRlcy5cblx0ICogQHJldHVybiB7RG91YmxlfVxuXHQgKi9cblxuXG5cdGZ1bmN0aW9uIERlY2ltYWwxMjgoYnl0ZXMpIHtcblx0ICB0aGlzLmJ5dGVzID0gYnl0ZXM7XG5cdH1cblx0LyoqXG5cdCAqIENyZWF0ZSBhIERlY2ltYWwxMjggaW5zdGFuY2UgZnJvbSBhIHN0cmluZyByZXByZXNlbnRhdGlvblxuXHQgKlxuXHQgKiBAbWV0aG9kXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgYSBudW1lcmljIHN0cmluZyByZXByZXNlbnRhdGlvbi5cblx0ICogQHJldHVybiB7RGVjaW1hbDEyOH0gcmV0dXJucyBhIERlY2ltYWwxMjggaW5zdGFuY2UuXG5cdCAqL1xuXG5cblx0RGVjaW1hbDEyOC5mcm9tU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHQgIC8vIFBhcnNlIHN0YXRlIHRyYWNraW5nXG5cdCAgdmFyIGlzTmVnYXRpdmUgPSBmYWxzZTtcblx0ICB2YXIgc2F3UmFkaXggPSBmYWxzZTtcblx0ICB2YXIgZm91bmROb25aZXJvID0gZmFsc2U7IC8vIFRvdGFsIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMgKG5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgemVybylcblxuXHQgIHZhciBzaWduaWZpY2FudERpZ2l0cyA9IDA7IC8vIFRvdGFsIG51bWJlciBvZiBzaWduaWZpY2FuZCBkaWdpdHMgcmVhZFxuXG5cdCAgdmFyIG5EaWdpdHNSZWFkID0gMDsgLy8gVG90YWwgbnVtYmVyIG9mIGRpZ2l0cyAobm8gbGVhZGluZyB6ZXJvcylcblxuXHQgIHZhciBuRGlnaXRzID0gMDsgLy8gVGhlIG51bWJlciBvZiB0aGUgZGlnaXRzIGFmdGVyIHJhZGl4XG5cblx0ICB2YXIgcmFkaXhQb3NpdGlvbiA9IDA7IC8vIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgbm9uLXplcm8gaW4gKnN0cipcblxuXHQgIHZhciBmaXJzdE5vblplcm8gPSAwOyAvLyBEaWdpdHMgQXJyYXlcblxuXHQgIHZhciBkaWdpdHMgPSBbMF07IC8vIFRoZSBudW1iZXIgb2YgZGlnaXRzIGluIGRpZ2l0c1xuXG5cdCAgdmFyIG5EaWdpdHNTdG9yZWQgPSAwOyAvLyBJbnNlcnRpb24gcG9pbnRlciBmb3IgZGlnaXRzXG5cblx0ICB2YXIgZGlnaXRzSW5zZXJ0ID0gMDsgLy8gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24temVybyBkaWdpdFxuXG5cdCAgdmFyIGZpcnN0RGlnaXQgPSAwOyAvLyBUaGUgaW5kZXggb2YgdGhlIGxhc3QgZGlnaXRcblxuXHQgIHZhciBsYXN0RGlnaXQgPSAwOyAvLyBFeHBvbmVudFxuXG5cdCAgdmFyIGV4cG9uZW50ID0gMDsgLy8gbG9vcCBpbmRleCBvdmVyIGFycmF5XG5cblx0ICB2YXIgaSA9IDA7IC8vIFRoZSBoaWdoIDE3IGRpZ2l0cyBvZiB0aGUgc2lnbmlmaWNhbmRcblxuXHQgIHZhciBzaWduaWZpY2FuZEhpZ2ggPSBbMCwgMF07IC8vIFRoZSBsb3cgMTcgZGlnaXRzIG9mIHRoZSBzaWduaWZpY2FuZFxuXG5cdCAgdmFyIHNpZ25pZmljYW5kTG93ID0gWzAsIDBdOyAvLyBUaGUgYmlhc2VkIGV4cG9uZW50XG5cblx0ICB2YXIgYmlhc2VkRXhwb25lbnQgPSAwOyAvLyBSZWFkIGluZGV4XG5cblx0ICB2YXIgaW5kZXggPSAwOyAvLyBOYWl2ZWx5IHByZXZlbnQgYWdhaW5zdCBSRURPUyBhdHRhY2tzLlxuXHQgIC8vIFRPRE86IGltcGxlbWVudGluZyBhIGN1c3RvbSBwYXJzaW5nIGZvciB0aGlzLCBvciByZWZhY3RvcmluZyB0aGUgcmVnZXggd291bGQgeWllbGRcblx0ICAvLyAgICAgICBmdXJ0aGVyIGdhaW5zLlxuXG5cdCAgaWYgKHN0cmluZy5sZW5ndGggPj0gNzAwMCkge1xuXHQgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignJyArIHN0cmluZyArICcgbm90IGEgdmFsaWQgRGVjaW1hbDEyOCBzdHJpbmcnKTtcblx0ICB9IC8vIFJlc3VsdHNcblxuXG5cdCAgdmFyIHN0cmluZ01hdGNoID0gc3RyaW5nLm1hdGNoKFBBUlNFX1NUUklOR19SRUdFWFApO1xuXHQgIHZhciBpbmZNYXRjaCA9IHN0cmluZy5tYXRjaChQQVJTRV9JTkZfUkVHRVhQKTtcblx0ICB2YXIgbmFuTWF0Y2ggPSBzdHJpbmcubWF0Y2goUEFSU0VfTkFOX1JFR0VYUCk7IC8vIFZhbGlkYXRlIHRoZSBzdHJpbmdcblxuXHQgIGlmICghc3RyaW5nTWF0Y2ggJiYgIWluZk1hdGNoICYmICFuYW5NYXRjaCB8fCBzdHJpbmcubGVuZ3RoID09PSAwKSB7XG5cdCAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcnICsgc3RyaW5nICsgJyBub3QgYSB2YWxpZCBEZWNpbWFsMTI4IHN0cmluZycpO1xuXHQgIH1cblxuXHQgIGlmIChzdHJpbmdNYXRjaCkge1xuXHQgICAgLy8gZnVsbF9tYXRjaCA9IHN0cmluZ01hdGNoWzBdXG5cdCAgICAvLyBzaWduID0gc3RyaW5nTWF0Y2hbMV1cblx0ICAgIHZhciB1bnNpZ25lZE51bWJlciA9IHN0cmluZ01hdGNoWzJdOyAvLyBzdHJpbmdNYXRjaFszXSBpcyB1bmRlZmluZWQgaWYgYSB3aG9sZSBudW1iZXIgKGV4IFwiMVwiLCAxMlwiKVxuXHQgICAgLy8gYnV0IGRlZmluZWQgaWYgYSBudW1iZXIgdy8gZGVjaW1hbCBpbiBpdCAoZXggXCIxLjAsIDEyLjJcIilcblxuXHQgICAgdmFyIGUgPSBzdHJpbmdNYXRjaFs0XTtcblx0ICAgIHZhciBleHBTaWduID0gc3RyaW5nTWF0Y2hbNV07XG5cdCAgICB2YXIgZXhwTnVtYmVyID0gc3RyaW5nTWF0Y2hbNl07IC8vIHRoZXkgcHJvdmlkZWQgZSwgYnV0IGRpZG4ndCBnaXZlIGFuIGV4cG9uZW50IG51bWJlci4gZm9yIGV4IFwiMWVcIlxuXG5cdCAgICBpZiAoZSAmJiBleHBOdW1iZXIgPT09IHVuZGVmaW5lZCkgaW52YWxpZEVycihzdHJpbmcsICdtaXNzaW5nIGV4cG9uZW50IHBvd2VyJyk7IC8vIHRoZXkgcHJvdmlkZWQgZSwgYnV0IGRpZG4ndCBnaXZlIGEgbnVtYmVyIGJlZm9yZSBpdC4gZm9yIGV4IFwiZTFcIlxuXG5cdCAgICBpZiAoZSAmJiB1bnNpZ25lZE51bWJlciA9PT0gdW5kZWZpbmVkKSBpbnZhbGlkRXJyKHN0cmluZywgJ21pc3NpbmcgZXhwb25lbnQgYmFzZScpO1xuXG5cdCAgICBpZiAoZSA9PT0gdW5kZWZpbmVkICYmIChleHBTaWduIHx8IGV4cE51bWJlcikpIHtcblx0ICAgICAgaW52YWxpZEVycihzdHJpbmcsICdtaXNzaW5nIGUgYmVmb3JlIGV4cG9uZW50Jyk7XG5cdCAgICB9XG5cdCAgfSAvLyBHZXQgdGhlIG5lZ2F0aXZlIG9yIHBvc2l0aXZlIHNpZ25cblxuXG5cdCAgaWYgKHN0cmluZ1tpbmRleF0gPT09ICcrJyB8fCBzdHJpbmdbaW5kZXhdID09PSAnLScpIHtcblx0ICAgIGlzTmVnYXRpdmUgPSBzdHJpbmdbaW5kZXgrK10gPT09ICctJztcblx0ICB9IC8vIENoZWNrIGlmIHVzZXIgcGFzc2VkIEluZmluaXR5IG9yIE5hTlxuXG5cblx0ICBpZiAoIWlzRGlnaXQoc3RyaW5nW2luZGV4XSkgJiYgc3RyaW5nW2luZGV4XSAhPT0gJy4nKSB7XG5cdCAgICBpZiAoc3RyaW5nW2luZGV4XSA9PT0gJ2knIHx8IHN0cmluZ1tpbmRleF0gPT09ICdJJykge1xuXHQgICAgICByZXR1cm4gbmV3IERlY2ltYWwxMjgoQnVmZmVyJDIuZnJvbShpc05lZ2F0aXZlID8gSU5GX05FR0FUSVZFX0JVRkZFUiA6IElORl9QT1NJVElWRV9CVUZGRVIpKTtcblx0ICAgIH0gZWxzZSBpZiAoc3RyaW5nW2luZGV4XSA9PT0gJ04nKSB7XG5cdCAgICAgIHJldHVybiBuZXcgRGVjaW1hbDEyOChCdWZmZXIkMi5mcm9tKE5BTl9CVUZGRVIpKTtcblx0ICAgIH1cblx0ICB9IC8vIFJlYWQgYWxsIHRoZSBkaWdpdHNcblxuXG5cdCAgd2hpbGUgKGlzRGlnaXQoc3RyaW5nW2luZGV4XSkgfHwgc3RyaW5nW2luZGV4XSA9PT0gJy4nKSB7XG5cdCAgICBpZiAoc3RyaW5nW2luZGV4XSA9PT0gJy4nKSB7XG5cdCAgICAgIGlmIChzYXdSYWRpeCkgaW52YWxpZEVycihzdHJpbmcsICdjb250YWlucyBtdWx0aXBsZSBwZXJpb2RzJyk7XG5cdCAgICAgIHNhd1JhZGl4ID0gdHJ1ZTtcblx0ICAgICAgaW5kZXggPSBpbmRleCArIDE7XG5cdCAgICAgIGNvbnRpbnVlO1xuXHQgICAgfVxuXG5cdCAgICBpZiAobkRpZ2l0c1N0b3JlZCA8IDM0KSB7XG5cdCAgICAgIGlmIChzdHJpbmdbaW5kZXhdICE9PSAnMCcgfHwgZm91bmROb25aZXJvKSB7XG5cdCAgICAgICAgaWYgKCFmb3VuZE5vblplcm8pIHtcblx0ICAgICAgICAgIGZpcnN0Tm9uWmVybyA9IG5EaWdpdHNSZWFkO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGZvdW5kTm9uWmVybyA9IHRydWU7IC8vIE9ubHkgc3RvcmUgMzQgZGlnaXRzXG5cblx0ICAgICAgICBkaWdpdHNbZGlnaXRzSW5zZXJ0KytdID0gcGFyc2VJbnQoc3RyaW5nW2luZGV4XSwgMTApO1xuXHQgICAgICAgIG5EaWdpdHNTdG9yZWQgPSBuRGlnaXRzU3RvcmVkICsgMTtcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBpZiAoZm91bmROb25aZXJvKSBuRGlnaXRzID0gbkRpZ2l0cyArIDE7XG5cdCAgICBpZiAoc2F3UmFkaXgpIHJhZGl4UG9zaXRpb24gPSByYWRpeFBvc2l0aW9uICsgMTtcblx0ICAgIG5EaWdpdHNSZWFkID0gbkRpZ2l0c1JlYWQgKyAxO1xuXHQgICAgaW5kZXggPSBpbmRleCArIDE7XG5cdCAgfVxuXG5cdCAgaWYgKHNhd1JhZGl4ICYmICFuRGlnaXRzUmVhZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignJyArIHN0cmluZyArICcgbm90IGEgdmFsaWQgRGVjaW1hbDEyOCBzdHJpbmcnKTsgLy8gUmVhZCBleHBvbmVudCBpZiBleGlzdHNcblxuXHQgIGlmIChzdHJpbmdbaW5kZXhdID09PSAnZScgfHwgc3RyaW5nW2luZGV4XSA9PT0gJ0UnKSB7XG5cdCAgICAvLyBSZWFkIGV4cG9uZW50IGRpZ2l0c1xuXHQgICAgdmFyIG1hdGNoID0gc3RyaW5nLnN1YnN0cigrK2luZGV4KS5tYXRjaChFWFBPTkVOVF9SRUdFWCk7IC8vIE5vIGRpZ2l0cyByZWFkXG5cblx0ICAgIGlmICghbWF0Y2ggfHwgIW1hdGNoWzJdKSByZXR1cm4gbmV3IERlY2ltYWwxMjgoQnVmZmVyJDIuZnJvbShOQU5fQlVGRkVSKSk7IC8vIEdldCBleHBvbmVudFxuXG5cdCAgICBleHBvbmVudCA9IHBhcnNlSW50KG1hdGNoWzBdLCAxMCk7IC8vIEFkanVzdCB0aGUgaW5kZXhcblxuXHQgICAgaW5kZXggPSBpbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcblx0ICB9IC8vIFJldHVybiBub3QgYSBudW1iZXJcblxuXG5cdCAgaWYgKHN0cmluZ1tpbmRleF0pIHJldHVybiBuZXcgRGVjaW1hbDEyOChCdWZmZXIkMi5mcm9tKE5BTl9CVUZGRVIpKTsgLy8gRG9uZSByZWFkaW5nIGlucHV0XG5cdCAgLy8gRmluZCBmaXJzdCBub24temVybyBkaWdpdCBpbiBkaWdpdHNcblxuXHQgIGZpcnN0RGlnaXQgPSAwO1xuXG5cdCAgaWYgKCFuRGlnaXRzU3RvcmVkKSB7XG5cdCAgICBmaXJzdERpZ2l0ID0gMDtcblx0ICAgIGxhc3REaWdpdCA9IDA7XG5cdCAgICBkaWdpdHNbMF0gPSAwO1xuXHQgICAgbkRpZ2l0cyA9IDE7XG5cdCAgICBuRGlnaXRzU3RvcmVkID0gMTtcblx0ICAgIHNpZ25pZmljYW50RGlnaXRzID0gMDtcblx0ICB9IGVsc2Uge1xuXHQgICAgbGFzdERpZ2l0ID0gbkRpZ2l0c1N0b3JlZCAtIDE7XG5cdCAgICBzaWduaWZpY2FudERpZ2l0cyA9IG5EaWdpdHM7XG5cblx0ICAgIGlmIChzaWduaWZpY2FudERpZ2l0cyAhPT0gMSkge1xuXHQgICAgICB3aGlsZSAoc3RyaW5nW2ZpcnN0Tm9uWmVybyArIHNpZ25pZmljYW50RGlnaXRzIC0gMV0gPT09ICcwJykge1xuXHQgICAgICAgIHNpZ25pZmljYW50RGlnaXRzID0gc2lnbmlmaWNhbnREaWdpdHMgLSAxO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSAvLyBOb3JtYWxpemF0aW9uIG9mIGV4cG9uZW50XG5cdCAgLy8gQ29ycmVjdCBleHBvbmVudCBiYXNlZCBvbiByYWRpeCBwb3NpdGlvbiwgYW5kIHNoaWZ0IHNpZ25pZmljYW5kIGFzIG5lZWRlZFxuXHQgIC8vIHRvIHJlcHJlc2VudCB1c2VyIGlucHV0XG5cdCAgLy8gT3ZlcmZsb3cgcHJldmVudGlvblxuXG5cblx0ICBpZiAoZXhwb25lbnQgPD0gcmFkaXhQb3NpdGlvbiAmJiByYWRpeFBvc2l0aW9uIC0gZXhwb25lbnQgPiAxIDw8IDE0KSB7XG5cdCAgICBleHBvbmVudCA9IEVYUE9ORU5UX01JTjtcblx0ICB9IGVsc2Uge1xuXHQgICAgZXhwb25lbnQgPSBleHBvbmVudCAtIHJhZGl4UG9zaXRpb247XG5cdCAgfSAvLyBBdHRlbXB0IHRvIG5vcm1hbGl6ZSB0aGUgZXhwb25lbnRcblxuXG5cdCAgd2hpbGUgKGV4cG9uZW50ID4gRVhQT05FTlRfTUFYKSB7XG5cdCAgICAvLyBTaGlmdCBleHBvbmVudCB0byBzaWduaWZpY2FuZCBhbmQgZGVjcmVhc2Vcblx0ICAgIGxhc3REaWdpdCA9IGxhc3REaWdpdCArIDE7XG5cblx0ICAgIGlmIChsYXN0RGlnaXQgLSBmaXJzdERpZ2l0ID4gTUFYX0RJR0lUUykge1xuXHQgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgemVybyB0aGVuIGp1c3QgaGFyZCBjbGFtcCwgb3RoZXJ3aXNlIGZhaWxcblx0ICAgICAgdmFyIGRpZ2l0c1N0cmluZyA9IGRpZ2l0cy5qb2luKCcnKTtcblxuXHQgICAgICBpZiAoZGlnaXRzU3RyaW5nLm1hdGNoKC9eMCskLykpIHtcblx0ICAgICAgICBleHBvbmVudCA9IEVYUE9ORU5UX01BWDtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgfVxuXG5cdCAgICAgIGludmFsaWRFcnIoc3RyaW5nLCAnb3ZlcmZsb3cnKTtcblx0ICAgIH1cblxuXHQgICAgZXhwb25lbnQgPSBleHBvbmVudCAtIDE7XG5cdCAgfVxuXG5cdCAgd2hpbGUgKGV4cG9uZW50IDwgRVhQT05FTlRfTUlOIHx8IG5EaWdpdHNTdG9yZWQgPCBuRGlnaXRzKSB7XG5cdCAgICAvLyBTaGlmdCBsYXN0IGRpZ2l0LiBjYW4gb25seSBkbyB0aGlzIGlmIDwgc2lnbmlmaWNhbnQgZGlnaXRzIHRoYW4gIyBzdG9yZWQuXG5cdCAgICBpZiAobGFzdERpZ2l0ID09PSAwICYmIHNpZ25pZmljYW50RGlnaXRzIDwgbkRpZ2l0c1N0b3JlZCkge1xuXHQgICAgICBleHBvbmVudCA9IEVYUE9ORU5UX01JTjtcblx0ICAgICAgc2lnbmlmaWNhbnREaWdpdHMgPSAwO1xuXHQgICAgICBicmVhaztcblx0ICAgIH1cblxuXHQgICAgaWYgKG5EaWdpdHNTdG9yZWQgPCBuRGlnaXRzKSB7XG5cdCAgICAgIC8vIGFkanVzdCB0byBtYXRjaCBkaWdpdHMgbm90IHN0b3JlZFxuXHQgICAgICBuRGlnaXRzID0gbkRpZ2l0cyAtIDE7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAvLyBhZGp1c3QgdG8gcm91bmRcblx0ICAgICAgbGFzdERpZ2l0ID0gbGFzdERpZ2l0IC0gMTtcblx0ICAgIH1cblxuXHQgICAgaWYgKGV4cG9uZW50IDwgRVhQT05FTlRfTUFYKSB7XG5cdCAgICAgIGV4cG9uZW50ID0gZXhwb25lbnQgKyAxO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHplcm8gdGhlbiBqdXN0IGhhcmQgY2xhbXAsIG90aGVyd2lzZSBmYWlsXG5cdCAgICAgIHZhciBfZGlnaXRzU3RyaW5nID0gZGlnaXRzLmpvaW4oJycpO1xuXG5cdCAgICAgIGlmIChfZGlnaXRzU3RyaW5nLm1hdGNoKC9eMCskLykpIHtcblx0ICAgICAgICBleHBvbmVudCA9IEVYUE9ORU5UX01BWDtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgfVxuXG5cdCAgICAgIGludmFsaWRFcnIoc3RyaW5nLCAnb3ZlcmZsb3cnKTtcblx0ICAgIH1cblx0ICB9IC8vIFJvdW5kXG5cdCAgLy8gV2UndmUgbm9ybWFsaXplZCB0aGUgZXhwb25lbnQsIGJ1dCBtaWdodCBzdGlsbCBuZWVkIHRvIHJvdW5kLlxuXG5cblx0ICBpZiAobGFzdERpZ2l0IC0gZmlyc3REaWdpdCArIDEgPCBzaWduaWZpY2FudERpZ2l0cykge1xuXHQgICAgdmFyIGVuZE9mU3RyaW5nID0gbkRpZ2l0c1JlYWQ7IC8vIElmIHdlIGhhdmUgc2VlbiBhIHJhZGl4IHBvaW50LCAnc3RyaW5nJyBpcyAxIGxvbmdlciB0aGFuIHdlIGhhdmVcblx0ICAgIC8vIGRvY3VtZW50ZWQgd2l0aCBuZGlnaXRzX3JlYWQsIHNvIGluYyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG5vbnplcm9cblx0ICAgIC8vIGRpZ2l0IGFuZCB0aGUgcG9zaXRpb24gdGhhdCBkaWdpdHMgYXJlIHJlYWQgdG8uXG5cblx0ICAgIGlmIChzYXdSYWRpeCkge1xuXHQgICAgICBmaXJzdE5vblplcm8gPSBmaXJzdE5vblplcm8gKyAxO1xuXHQgICAgICBlbmRPZlN0cmluZyA9IGVuZE9mU3RyaW5nICsgMTtcblx0ICAgIH0gLy8gaWYgbmVnYXRpdmUsIHdlIG5lZWQgdG8gaW5jcmVtZW50IGFnYWluIHRvIGFjY291bnQgZm9yIC0gc2lnbiBhdCBzdGFydC5cblxuXG5cdCAgICBpZiAoaXNOZWdhdGl2ZSkge1xuXHQgICAgICBmaXJzdE5vblplcm8gPSBmaXJzdE5vblplcm8gKyAxO1xuXHQgICAgICBlbmRPZlN0cmluZyA9IGVuZE9mU3RyaW5nICsgMTtcblx0ICAgIH1cblxuXHQgICAgdmFyIHJvdW5kRGlnaXQgPSBwYXJzZUludChzdHJpbmdbZmlyc3ROb25aZXJvICsgbGFzdERpZ2l0ICsgMV0sIDEwKTtcblx0ICAgIHZhciByb3VuZEJpdCA9IDA7XG5cblx0ICAgIGlmIChyb3VuZERpZ2l0ID49IDUpIHtcblx0ICAgICAgcm91bmRCaXQgPSAxO1xuXG5cdCAgICAgIGlmIChyb3VuZERpZ2l0ID09PSA1KSB7XG5cdCAgICAgICAgcm91bmRCaXQgPSBkaWdpdHNbbGFzdERpZ2l0XSAlIDIgPT09IDE7XG5cblx0ICAgICAgICBmb3IgKGkgPSBmaXJzdE5vblplcm8gKyBsYXN0RGlnaXQgKyAyOyBpIDwgZW5kT2ZTdHJpbmc7IGkrKykge1xuXHQgICAgICAgICAgaWYgKHBhcnNlSW50KHN0cmluZ1tpXSwgMTApKSB7XG5cdCAgICAgICAgICAgIHJvdW5kQml0ID0gMTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIGlmIChyb3VuZEJpdCkge1xuXHQgICAgICB2YXIgZElkeCA9IGxhc3REaWdpdDtcblxuXHQgICAgICBmb3IgKDsgZElkeCA+PSAwOyBkSWR4LS0pIHtcblx0ICAgICAgICBpZiAoKytkaWdpdHNbZElkeF0gPiA5KSB7XG5cdCAgICAgICAgICBkaWdpdHNbZElkeF0gPSAwOyAvLyBvdmVyZmxvd2VkIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXRcblxuXHQgICAgICAgICAgaWYgKGRJZHggPT09IDApIHtcblx0ICAgICAgICAgICAgaWYgKGV4cG9uZW50IDwgRVhQT05FTlRfTUFYKSB7XG5cdCAgICAgICAgICAgICAgZXhwb25lbnQgPSBleHBvbmVudCArIDE7XG5cdCAgICAgICAgICAgICAgZGlnaXRzW2RJZHhdID0gMTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICByZXR1cm4gbmV3IERlY2ltYWwxMjgoQnVmZmVyJDIuZnJvbShpc05lZ2F0aXZlID8gSU5GX05FR0FUSVZFX0JVRkZFUiA6IElORl9QT1NJVElWRV9CVUZGRVIpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0gLy8gRW5jb2RlIHNpZ25pZmljYW5kXG5cdCAgLy8gVGhlIGhpZ2ggMTcgZGlnaXRzIG9mIHRoZSBzaWduaWZpY2FuZFxuXG5cblx0ICBzaWduaWZpY2FuZEhpZ2ggPSBsb25nXzEuZnJvbU51bWJlcigwKTsgLy8gVGhlIGxvdyAxNyBkaWdpdHMgb2YgdGhlIHNpZ25pZmljYW5kXG5cblx0ICBzaWduaWZpY2FuZExvdyA9IGxvbmdfMS5mcm9tTnVtYmVyKDApOyAvLyByZWFkIGEgemVyb1xuXG5cdCAgaWYgKHNpZ25pZmljYW50RGlnaXRzID09PSAwKSB7XG5cdCAgICBzaWduaWZpY2FuZEhpZ2ggPSBsb25nXzEuZnJvbU51bWJlcigwKTtcblx0ICAgIHNpZ25pZmljYW5kTG93ID0gbG9uZ18xLmZyb21OdW1iZXIoMCk7XG5cdCAgfSBlbHNlIGlmIChsYXN0RGlnaXQgLSBmaXJzdERpZ2l0IDwgMTcpIHtcblx0ICAgIHZhciBfZElkeCA9IGZpcnN0RGlnaXQ7XG5cdCAgICBzaWduaWZpY2FuZExvdyA9IGxvbmdfMS5mcm9tTnVtYmVyKGRpZ2l0c1tfZElkeCsrXSk7XG5cdCAgICBzaWduaWZpY2FuZEhpZ2ggPSBuZXcgbG9uZ18xKDAsIDApO1xuXG5cdCAgICBmb3IgKDsgX2RJZHggPD0gbGFzdERpZ2l0OyBfZElkeCsrKSB7XG5cdCAgICAgIHNpZ25pZmljYW5kTG93ID0gc2lnbmlmaWNhbmRMb3cubXVsdGlwbHkobG9uZ18xLmZyb21OdW1iZXIoMTApKTtcblx0ICAgICAgc2lnbmlmaWNhbmRMb3cgPSBzaWduaWZpY2FuZExvdy5hZGQobG9uZ18xLmZyb21OdW1iZXIoZGlnaXRzW19kSWR4XSkpO1xuXHQgICAgfVxuXHQgIH0gZWxzZSB7XG5cdCAgICB2YXIgX2RJZHgyID0gZmlyc3REaWdpdDtcblx0ICAgIHNpZ25pZmljYW5kSGlnaCA9IGxvbmdfMS5mcm9tTnVtYmVyKGRpZ2l0c1tfZElkeDIrK10pO1xuXG5cdCAgICBmb3IgKDsgX2RJZHgyIDw9IGxhc3REaWdpdCAtIDE3OyBfZElkeDIrKykge1xuXHQgICAgICBzaWduaWZpY2FuZEhpZ2ggPSBzaWduaWZpY2FuZEhpZ2gubXVsdGlwbHkobG9uZ18xLmZyb21OdW1iZXIoMTApKTtcblx0ICAgICAgc2lnbmlmaWNhbmRIaWdoID0gc2lnbmlmaWNhbmRIaWdoLmFkZChsb25nXzEuZnJvbU51bWJlcihkaWdpdHNbX2RJZHgyXSkpO1xuXHQgICAgfVxuXG5cdCAgICBzaWduaWZpY2FuZExvdyA9IGxvbmdfMS5mcm9tTnVtYmVyKGRpZ2l0c1tfZElkeDIrK10pO1xuXG5cdCAgICBmb3IgKDsgX2RJZHgyIDw9IGxhc3REaWdpdDsgX2RJZHgyKyspIHtcblx0ICAgICAgc2lnbmlmaWNhbmRMb3cgPSBzaWduaWZpY2FuZExvdy5tdWx0aXBseShsb25nXzEuZnJvbU51bWJlcigxMCkpO1xuXHQgICAgICBzaWduaWZpY2FuZExvdyA9IHNpZ25pZmljYW5kTG93LmFkZChsb25nXzEuZnJvbU51bWJlcihkaWdpdHNbX2RJZHgyXSkpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHZhciBzaWduaWZpY2FuZCA9IG11bHRpcGx5NjR4MihzaWduaWZpY2FuZEhpZ2gsIGxvbmdfMS5mcm9tU3RyaW5nKCcxMDAwMDAwMDAwMDAwMDAwMDAnKSk7XG5cdCAgc2lnbmlmaWNhbmQubG93ID0gc2lnbmlmaWNhbmQubG93LmFkZChzaWduaWZpY2FuZExvdyk7XG5cblx0ICBpZiAobGVzc1RoYW4oc2lnbmlmaWNhbmQubG93LCBzaWduaWZpY2FuZExvdykpIHtcblx0ICAgIHNpZ25pZmljYW5kLmhpZ2ggPSBzaWduaWZpY2FuZC5oaWdoLmFkZChsb25nXzEuZnJvbU51bWJlcigxKSk7XG5cdCAgfSAvLyBCaWFzZWQgZXhwb25lbnRcblxuXG5cdCAgYmlhc2VkRXhwb25lbnQgPSBleHBvbmVudCArIEVYUE9ORU5UX0JJQVM7XG5cdCAgdmFyIGRlYyA9IHtcblx0ICAgIGxvdzogbG9uZ18xLmZyb21OdW1iZXIoMCksXG5cdCAgICBoaWdoOiBsb25nXzEuZnJvbU51bWJlcigwKVxuXHQgIH07IC8vIEVuY29kZSBjb21iaW5hdGlvbiwgZXhwb25lbnQsIGFuZCBzaWduaWZpY2FuZC5cblxuXHQgIGlmIChzaWduaWZpY2FuZC5oaWdoLnNoaWZ0UmlnaHRVbnNpZ25lZCg0OSkuYW5kKGxvbmdfMS5mcm9tTnVtYmVyKDEpKS5lcXVhbHMobG9uZ18xLmZyb21OdW1iZXIoMSkpKSB7XG5cdCAgICAvLyBFbmNvZGUgJzExJyBpbnRvIGJpdHMgMSB0byAzXG5cdCAgICBkZWMuaGlnaCA9IGRlYy5oaWdoLm9yKGxvbmdfMS5mcm9tTnVtYmVyKDB4Mykuc2hpZnRMZWZ0KDYxKSk7XG5cdCAgICBkZWMuaGlnaCA9IGRlYy5oaWdoLm9yKGxvbmdfMS5mcm9tTnVtYmVyKGJpYXNlZEV4cG9uZW50KS5hbmQobG9uZ18xLmZyb21OdW1iZXIoMHgzZmZmKS5zaGlmdExlZnQoNDcpKSk7XG5cdCAgICBkZWMuaGlnaCA9IGRlYy5oaWdoLm9yKHNpZ25pZmljYW5kLmhpZ2guYW5kKGxvbmdfMS5mcm9tTnVtYmVyKDB4N2ZmZmZmZmZmZmZmKSkpO1xuXHQgIH0gZWxzZSB7XG5cdCAgICBkZWMuaGlnaCA9IGRlYy5oaWdoLm9yKGxvbmdfMS5mcm9tTnVtYmVyKGJpYXNlZEV4cG9uZW50ICYgMHgzZmZmKS5zaGlmdExlZnQoNDkpKTtcblx0ICAgIGRlYy5oaWdoID0gZGVjLmhpZ2gub3Ioc2lnbmlmaWNhbmQuaGlnaC5hbmQobG9uZ18xLmZyb21OdW1iZXIoMHgxZmZmZmZmZmZmZmZmKSkpO1xuXHQgIH1cblxuXHQgIGRlYy5sb3cgPSBzaWduaWZpY2FuZC5sb3c7IC8vIEVuY29kZSBzaWduXG5cblx0ICBpZiAoaXNOZWdhdGl2ZSkge1xuXHQgICAgZGVjLmhpZ2ggPSBkZWMuaGlnaC5vcihsb25nXzEuZnJvbVN0cmluZygnOTIyMzM3MjAzNjg1NDc3NTgwOCcpKTtcblx0ICB9IC8vIEVuY29kZSBpbnRvIGEgYnVmZmVyXG5cblxuXHQgIHZhciBidWZmZXIkJDEgPSBCdWZmZXIkMi5hbGxvYygxNik7XG5cdCAgaW5kZXggPSAwOyAvLyBFbmNvZGUgdGhlIGxvdyA2NCBiaXRzIG9mIHRoZSBkZWNpbWFsXG5cdCAgLy8gRW5jb2RlIGxvdyBiaXRzXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBkZWMubG93LmxvdyAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gZGVjLmxvdy5sb3cgPj4gOCAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gZGVjLmxvdy5sb3cgPj4gMTYgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGRlYy5sb3cubG93ID4+IDI0ICYgMHhmZjsgLy8gRW5jb2RlIGhpZ2ggYml0c1xuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gZGVjLmxvdy5oaWdoICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBkZWMubG93LmhpZ2ggPj4gOCAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gZGVjLmxvdy5oaWdoID4+IDE2ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBkZWMubG93LmhpZ2ggPj4gMjQgJiAweGZmOyAvLyBFbmNvZGUgdGhlIGhpZ2ggNjQgYml0cyBvZiB0aGUgZGVjaW1hbFxuXHQgIC8vIEVuY29kZSBsb3cgYml0c1xuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gZGVjLmhpZ2gubG93ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBkZWMuaGlnaC5sb3cgPj4gOCAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gZGVjLmhpZ2gubG93ID4+IDE2ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBkZWMuaGlnaC5sb3cgPj4gMjQgJiAweGZmOyAvLyBFbmNvZGUgaGlnaCBiaXRzXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBkZWMuaGlnaC5oaWdoICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBkZWMuaGlnaC5oaWdoID4+IDggJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGRlYy5oaWdoLmhpZ2ggPj4gMTYgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGRlYy5oaWdoLmhpZ2ggPj4gMjQgJiAweGZmOyAvLyBSZXR1cm4gdGhlIG5ldyBEZWNpbWFsMTI4XG5cblx0ICByZXR1cm4gbmV3IERlY2ltYWwxMjgoYnVmZmVyJCQxKTtcblx0fTsgLy8gRXh0cmFjdCBsZWFzdCBzaWduaWZpY2FudCA1IGJpdHNcblxuXG5cdHZhciBDT01CSU5BVElPTl9NQVNLID0gMHgxZjsgLy8gRXh0cmFjdCBsZWFzdCBzaWduaWZpY2FudCAxNCBiaXRzXG5cblx0dmFyIEVYUE9ORU5UX01BU0sgPSAweDNmZmY7IC8vIFZhbHVlIG9mIGNvbWJpbmF0aW9uIGZpZWxkIGZvciBJbmZcblxuXHR2YXIgQ09NQklOQVRJT05fSU5GSU5JVFkgPSAzMDsgLy8gVmFsdWUgb2YgY29tYmluYXRpb24gZmllbGQgZm9yIE5hTlxuXG5cdHZhciBDT01CSU5BVElPTl9OQU4gPSAzMTtcblx0LyoqXG5cdCAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmF3IERlY2ltYWwxMjggdmFsdWVcblx0ICpcblx0ICogQG1ldGhvZFxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IHJldHVybnMgYSBEZWNpbWFsMTI4IHN0cmluZyByZXByZXNlbnRhdGlvbi5cblx0ICovXG5cblx0RGVjaW1hbDEyOC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG5cdCAgLy8gTm90ZTogYml0cyBpbiB0aGlzIHJvdXRpbmUgYXJlIHJlZmVycmVkIHRvIHN0YXJ0aW5nIGF0IDAsXG5cdCAgLy8gZnJvbSB0aGUgc2lnbiBiaXQsIHRvd2FyZHMgdGhlIGNvZWZmaWNpZW50LlxuXHQgIC8vIGJpdHMgMCAtIDMxXG5cdCAgdmFyIGhpZ2g7IC8vIGJpdHMgMzIgLSA2M1xuXG5cdCAgdmFyIG1pZGg7IC8vIGJpdHMgNjQgLSA5NVxuXG5cdCAgdmFyIG1pZGw7IC8vIGJpdHMgOTYgLSAxMjdcblxuXHQgIHZhciBsb3c7IC8vIGJpdHMgMSAtIDVcblxuXHQgIHZhciBjb21iaW5hdGlvbjsgLy8gZGVjb2RlZCBiaWFzZWQgZXhwb25lbnQgKDE0IGJpdHMpXG5cblx0ICB2YXIgYmlhc2VkX2V4cG9uZW50OyAvLyB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW5kIGRpZ2l0c1xuXG5cdCAgdmFyIHNpZ25pZmljYW5kX2RpZ2l0cyA9IDA7IC8vIHRoZSBiYXNlLTEwIGRpZ2l0cyBpbiB0aGUgc2lnbmlmaWNhbmRcblxuXHQgIHZhciBzaWduaWZpY2FuZCA9IG5ldyBBcnJheSgzNik7XG5cblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ25pZmljYW5kLmxlbmd0aDsgaSsrKSB7XG5cdCAgICBzaWduaWZpY2FuZFtpXSA9IDA7XG5cdCAgfSAvLyByZWFkIHBvaW50ZXIgaW50byBzaWduaWZpY2FuZFxuXG5cblx0ICB2YXIgaW5kZXggPSAwOyAvLyB1bmJpYXNlZCBleHBvbmVudFxuXG5cdCAgdmFyIGV4cG9uZW50OyAvLyB0aGUgZXhwb25lbnQgaWYgc2NpZW50aWZpYyBub3RhdGlvbiBpcyB1c2VkXG5cblx0ICB2YXIgc2NpZW50aWZpY19leHBvbmVudDsgLy8gdHJ1ZSBpZiB0aGUgbnVtYmVyIGlzIHplcm9cblxuXHQgIHZhciBpc196ZXJvID0gZmFsc2U7IC8vIHRoZSBtb3N0IHNpZ25pZmNhbnQgc2lnbmlmaWNhbmQgYml0cyAoNTAtNDYpXG5cblx0ICB2YXIgc2lnbmlmaWNhbmRfbXNiOyAvLyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3Igc2lnbmlmaWNhbmQgZGVjb2RpbmdcblxuXHQgIHZhciBzaWduaWZpY2FuZDEyOCA9IHtcblx0ICAgIHBhcnRzOiBuZXcgQXJyYXkoNClcblx0ICB9OyAvLyBpbmRleGluZyB2YXJpYWJsZXNcblxuXHQgIHZhciBqLCBrOyAvLyBPdXRwdXQgc3RyaW5nXG5cblx0ICB2YXIgc3RyaW5nID0gW107IC8vIFVucGFjayBpbmRleFxuXG5cdCAgaW5kZXggPSAwOyAvLyBCdWZmZXIgcmVmZXJlbmNlXG5cblx0ICB2YXIgYnVmZmVyJCQxID0gdGhpcy5ieXRlczsgLy8gVW5wYWNrIHRoZSBsb3cgNjRiaXRzIGludG8gYSBsb25nXG5cblx0ICBsb3cgPSBidWZmZXIkJDFbaW5kZXgrK10gfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgOCB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAyNDtcblx0ICBtaWRsID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7IC8vIFVucGFjayB0aGUgaGlnaCA2NGJpdHMgaW50byBhIGxvbmdcblxuXHQgIG1pZGggPSBidWZmZXIkJDFbaW5kZXgrK10gfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgOCB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAyNDtcblx0ICBoaWdoID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7IC8vIFVucGFjayBpbmRleFxuXG5cdCAgaW5kZXggPSAwOyAvLyBDcmVhdGUgdGhlIHN0YXRlIG9mIHRoZSBkZWNpbWFsXG5cblx0ICB2YXIgZGVjID0ge1xuXHQgICAgbG93OiBuZXcgbG9uZ18xKGxvdywgbWlkbCksXG5cdCAgICBoaWdoOiBuZXcgbG9uZ18xKG1pZGgsIGhpZ2gpXG5cdCAgfTtcblxuXHQgIGlmIChkZWMuaGlnaC5sZXNzVGhhbihsb25nXzEuWkVSTykpIHtcblx0ICAgIHN0cmluZy5wdXNoKCctJyk7XG5cdCAgfSAvLyBEZWNvZGUgY29tYmluYXRpb24gZmllbGQgYW5kIGV4cG9uZW50XG5cblxuXHQgIGNvbWJpbmF0aW9uID0gaGlnaCA+PiAyNiAmIENPTUJJTkFUSU9OX01BU0s7XG5cblx0ICBpZiAoY29tYmluYXRpb24gPj4gMyA9PT0gMykge1xuXHQgICAgLy8gQ2hlY2sgZm9yICdzcGVjaWFsJyB2YWx1ZXNcblx0ICAgIGlmIChjb21iaW5hdGlvbiA9PT0gQ09NQklOQVRJT05fSU5GSU5JVFkpIHtcblx0ICAgICAgcmV0dXJuIHN0cmluZy5qb2luKCcnKSArICdJbmZpbml0eSc7XG5cdCAgICB9IGVsc2UgaWYgKGNvbWJpbmF0aW9uID09PSBDT01CSU5BVElPTl9OQU4pIHtcblx0ICAgICAgcmV0dXJuICdOYU4nO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgYmlhc2VkX2V4cG9uZW50ID0gaGlnaCA+PiAxNSAmIEVYUE9ORU5UX01BU0s7XG5cdCAgICAgIHNpZ25pZmljYW5kX21zYiA9IDB4MDggKyAoaGlnaCA+PiAxNCAmIDB4MDEpO1xuXHQgICAgfVxuXHQgIH0gZWxzZSB7XG5cdCAgICBzaWduaWZpY2FuZF9tc2IgPSBoaWdoID4+IDE0ICYgMHgwNztcblx0ICAgIGJpYXNlZF9leHBvbmVudCA9IGhpZ2ggPj4gMTcgJiBFWFBPTkVOVF9NQVNLO1xuXHQgIH1cblxuXHQgIGV4cG9uZW50ID0gYmlhc2VkX2V4cG9uZW50IC0gRVhQT05FTlRfQklBUzsgLy8gQ3JlYXRlIHN0cmluZyBvZiBzaWduaWZpY2FuZCBkaWdpdHNcblx0ICAvLyBDb252ZXJ0IHRoZSAxMTQtYml0IGJpbmFyeSBudW1iZXIgcmVwcmVzZW50ZWQgYnlcblx0ICAvLyAoc2lnbmlmaWNhbmRfaGlnaCwgc2lnbmlmaWNhbmRfbG93KSB0byBhdCBtb3N0IDM0IGRlY2ltYWxcblx0ICAvLyBkaWdpdHMgdGhyb3VnaCBtb2R1bG8gYW5kIGRpdmlzaW9uLlxuXG5cdCAgc2lnbmlmaWNhbmQxMjgucGFydHNbMF0gPSAoaGlnaCAmIDB4M2ZmZikgKyAoKHNpZ25pZmljYW5kX21zYiAmIDB4ZikgPDwgMTQpO1xuXHQgIHNpZ25pZmljYW5kMTI4LnBhcnRzWzFdID0gbWlkaDtcblx0ICBzaWduaWZpY2FuZDEyOC5wYXJ0c1syXSA9IG1pZGw7XG5cdCAgc2lnbmlmaWNhbmQxMjgucGFydHNbM10gPSBsb3c7XG5cblx0ICBpZiAoc2lnbmlmaWNhbmQxMjgucGFydHNbMF0gPT09IDAgJiYgc2lnbmlmaWNhbmQxMjgucGFydHNbMV0gPT09IDAgJiYgc2lnbmlmaWNhbmQxMjgucGFydHNbMl0gPT09IDAgJiYgc2lnbmlmaWNhbmQxMjgucGFydHNbM10gPT09IDApIHtcblx0ICAgIGlzX3plcm8gPSB0cnVlO1xuXHQgIH0gZWxzZSB7XG5cdCAgICBmb3IgKGsgPSAzOyBrID49IDA7IGstLSkge1xuXHQgICAgICB2YXIgbGVhc3RfZGlnaXRzID0gMDsgLy8gUGVmb3JtIHRoZSBkaXZpZGVcblxuXHQgICAgICB2YXIgcmVzdWx0ID0gZGl2aWRldTEyOChzaWduaWZpY2FuZDEyOCk7XG5cdCAgICAgIHNpZ25pZmljYW5kMTI4ID0gcmVzdWx0LnF1b3RpZW50O1xuXHQgICAgICBsZWFzdF9kaWdpdHMgPSByZXN1bHQucmVtLmxvdzsgLy8gV2Ugbm93IGhhdmUgdGhlIDkgbGVhc3Qgc2lnbmlmaWNhbnQgZGlnaXRzIChpbiBiYXNlIDIpLlxuXHQgICAgICAvLyBDb252ZXJ0IGFuZCBvdXRwdXQgdG8gc3RyaW5nLlxuXG5cdCAgICAgIGlmICghbGVhc3RfZGlnaXRzKSBjb250aW51ZTtcblxuXHQgICAgICBmb3IgKGogPSA4OyBqID49IDA7IGotLSkge1xuXHQgICAgICAgIC8vIHNpZ25pZmljYW5kW2sgKiA5ICsgal0gPSBNYXRoLnJvdW5kKGxlYXN0X2RpZ2l0cyAlIDEwKTtcblx0ICAgICAgICBzaWduaWZpY2FuZFtrICogOSArIGpdID0gbGVhc3RfZGlnaXRzICUgMTA7IC8vIGxlYXN0X2RpZ2l0cyA9IE1hdGgucm91bmQobGVhc3RfZGlnaXRzIC8gMTApO1xuXG5cdCAgICAgICAgbGVhc3RfZGlnaXRzID0gTWF0aC5mbG9vcihsZWFzdF9kaWdpdHMgLyAxMCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9IC8vIE91dHB1dCBmb3JtYXQgb3B0aW9uczpcblx0ICAvLyBTY2llbnRpZmljIC0gWy1dZC5kZGRFKCsvLSlkZCBvciBbLV1kRSgrLy0pZGRcblx0ICAvLyBSZWd1bGFyICAgIC0gZGRkLmRkZFxuXG5cblx0ICBpZiAoaXNfemVybykge1xuXHQgICAgc2lnbmlmaWNhbmRfZGlnaXRzID0gMTtcblx0ICAgIHNpZ25pZmljYW5kW2luZGV4XSA9IDA7XG5cdCAgfSBlbHNlIHtcblx0ICAgIHNpZ25pZmljYW5kX2RpZ2l0cyA9IDM2O1xuXG5cdCAgICB3aGlsZSAoIXNpZ25pZmljYW5kW2luZGV4XSkge1xuXHQgICAgICBzaWduaWZpY2FuZF9kaWdpdHMgPSBzaWduaWZpY2FuZF9kaWdpdHMgLSAxO1xuXHQgICAgICBpbmRleCA9IGluZGV4ICsgMTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBzY2llbnRpZmljX2V4cG9uZW50ID0gc2lnbmlmaWNhbmRfZGlnaXRzIC0gMSArIGV4cG9uZW50OyAvLyBUaGUgc2NpZW50aWZpYyBleHBvbmVudCBjaGVja3MgYXJlIGRpY3RhdGVkIGJ5IHRoZSBzdHJpbmcgY29udmVyc2lvblxuXHQgIC8vIHNwZWNpZmljYXRpb24gYW5kIGFyZSBzb21ld2hhdCBhcmJpdHJhcnkgY3V0b2Zmcy5cblx0ICAvL1xuXHQgIC8vIFdlIG11c3QgY2hlY2sgZXhwb25lbnQgPiAwLCBiZWNhdXNlIGlmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZSBudW1iZXJcblx0ICAvLyBoYXMgdHJhaWxpbmcgemVyb3MuICBIb3dldmVyLCB3ZSAqY2Fubm90KiBvdXRwdXQgdGhlc2UgdHJhaWxpbmcgemVyb3MsXG5cdCAgLy8gYmVjYXVzZSBkb2luZyBzbyB3b3VsZCBjaGFuZ2UgdGhlIHByZWNpc2lvbiBvZiB0aGUgdmFsdWUsIGFuZCB3b3VsZFxuXHQgIC8vIGNoYW5nZSBzdG9yZWQgZGF0YSBpZiB0aGUgc3RyaW5nIGNvbnZlcnRlZCBudW1iZXIgaXMgcm91bmQgdHJpcHBlZC5cblxuXHQgIGlmIChzY2llbnRpZmljX2V4cG9uZW50ID49IDM0IHx8IHNjaWVudGlmaWNfZXhwb25lbnQgPD0gLTcgfHwgZXhwb25lbnQgPiAwKSB7XG5cdCAgICAvLyBTY2llbnRpZmljIGZvcm1hdFxuXHQgICAgLy8gaWYgdGhlcmUgYXJlIHRvbyBtYW55IHNpZ25pZmljYW50IGRpZ2l0cywgd2Ugc2hvdWxkIGp1c3QgYmUgdHJlYXRpbmcgbnVtYmVyc1xuXHQgICAgLy8gYXMgKyBvciAtIDAgYW5kIHVzaW5nIHRoZSBub24tc2NpZW50aWZpYyBleHBvbmVudCAodGhpcyBpcyBmb3IgdGhlIFwiaW52YWxpZFxuXHQgICAgLy8gcmVwcmVzZW50YXRpb24gc2hvdWxkIGJlIHRyZWF0ZWQgYXMgMC8tMFwiIHNwZWMgY2FzZXMgaW4gZGVjaW1hbDEyOC0xLmpzb24pXG5cdCAgICBpZiAoc2lnbmlmaWNhbmRfZGlnaXRzID4gMzQpIHtcblx0ICAgICAgc3RyaW5nLnB1c2goMCk7XG5cdCAgICAgIGlmIChleHBvbmVudCA+IDApIHN0cmluZy5wdXNoKCdFKycgKyBleHBvbmVudCk7ZWxzZSBpZiAoZXhwb25lbnQgPCAwKSBzdHJpbmcucHVzaCgnRScgKyBleHBvbmVudCk7XG5cdCAgICAgIHJldHVybiBzdHJpbmcuam9pbignJyk7XG5cdCAgICB9XG5cblx0ICAgIHN0cmluZy5wdXNoKHNpZ25pZmljYW5kW2luZGV4KytdKTtcblx0ICAgIHNpZ25pZmljYW5kX2RpZ2l0cyA9IHNpZ25pZmljYW5kX2RpZ2l0cyAtIDE7XG5cblx0ICAgIGlmIChzaWduaWZpY2FuZF9kaWdpdHMpIHtcblx0ICAgICAgc3RyaW5nLnB1c2goJy4nKTtcblx0ICAgIH1cblxuXHQgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHNpZ25pZmljYW5kX2RpZ2l0czsgX2krKykge1xuXHQgICAgICBzdHJpbmcucHVzaChzaWduaWZpY2FuZFtpbmRleCsrXSk7XG5cdCAgICB9IC8vIEV4cG9uZW50XG5cblxuXHQgICAgc3RyaW5nLnB1c2goJ0UnKTtcblxuXHQgICAgaWYgKHNjaWVudGlmaWNfZXhwb25lbnQgPiAwKSB7XG5cdCAgICAgIHN0cmluZy5wdXNoKCcrJyArIHNjaWVudGlmaWNfZXhwb25lbnQpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgc3RyaW5nLnB1c2goc2NpZW50aWZpY19leHBvbmVudCk7XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIC8vIFJlZ3VsYXIgZm9ybWF0IHdpdGggbm8gZGVjaW1hbCBwbGFjZVxuXHQgICAgaWYgKGV4cG9uZW50ID49IDApIHtcblx0ICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgc2lnbmlmaWNhbmRfZGlnaXRzOyBfaTIrKykge1xuXHQgICAgICAgIHN0cmluZy5wdXNoKHNpZ25pZmljYW5kW2luZGV4KytdKTtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdmFyIHJhZGl4X3Bvc2l0aW9uID0gc2lnbmlmaWNhbmRfZGlnaXRzICsgZXhwb25lbnQ7IC8vIG5vbi16ZXJvIGRpZ2l0cyBiZWZvcmUgcmFkaXhcblxuXHQgICAgICBpZiAocmFkaXhfcG9zaXRpb24gPiAwKSB7XG5cdCAgICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgcmFkaXhfcG9zaXRpb247IF9pMysrKSB7XG5cdCAgICAgICAgICBzdHJpbmcucHVzaChzaWduaWZpY2FuZFtpbmRleCsrXSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHN0cmluZy5wdXNoKCcwJyk7XG5cdCAgICAgIH1cblxuXHQgICAgICBzdHJpbmcucHVzaCgnLicpOyAvLyBhZGQgbGVhZGluZyB6ZXJvcyBhZnRlciByYWRpeFxuXG5cdCAgICAgIHdoaWxlIChyYWRpeF9wb3NpdGlvbisrIDwgMCkge1xuXHQgICAgICAgIHN0cmluZy5wdXNoKCcwJyk7XG5cdCAgICAgIH1cblxuXHQgICAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBzaWduaWZpY2FuZF9kaWdpdHMgLSBNYXRoLm1heChyYWRpeF9wb3NpdGlvbiAtIDEsIDApOyBfaTQrKykge1xuXHQgICAgICAgIHN0cmluZy5wdXNoKHNpZ25pZmljYW5kW2luZGV4KytdKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiBzdHJpbmcuam9pbignJyk7XG5cdH07XG5cblx0RGVjaW1hbDEyOC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXHQgIHJldHVybiB7XG5cdCAgICAkbnVtYmVyRGVjaW1hbDogdGhpcy50b1N0cmluZygpXG5cdCAgfTtcblx0fTtcblx0LyoqXG5cdCAqIEBpZ25vcmVcblx0ICovXG5cblxuXHREZWNpbWFsMTI4LnByb3RvdHlwZS50b0V4dGVuZGVkSlNPTiA9IGZ1bmN0aW9uICgpIHtcblx0ICByZXR1cm4ge1xuXHQgICAgJG51bWJlckRlY2ltYWw6IHRoaXMudG9TdHJpbmcoKVxuXHQgIH07XG5cdH07XG5cdC8qKlxuXHQgKiBAaWdub3JlXG5cdCAqL1xuXG5cblx0RGVjaW1hbDEyOC5mcm9tRXh0ZW5kZWRKU09OID0gZnVuY3Rpb24gKGRvYykge1xuXHQgIHJldHVybiBEZWNpbWFsMTI4LmZyb21TdHJpbmcoZG9jLiRudW1iZXJEZWNpbWFsKTtcblx0fTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVjaW1hbDEyOC5wcm90b3R5cGUsICdfYnNvbnR5cGUnLCB7XG5cdCAgdmFsdWU6ICdEZWNpbWFsMTI4J1xuXHR9KTtcblx0dmFyIGRlY2ltYWwxMjggPSBEZWNpbWFsMTI4O1xuXG5cdC8qKlxuXHQgKiBBIGNsYXNzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBCU09OIE1pbktleSB0eXBlLlxuXHQgKi9cblxuXHRmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2skNyhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cblx0ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkNyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cblx0ZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDcoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ3KENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkNyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuXHR2YXIgTWluS2V5ID1cblx0LyojX19QVVJFX18qL1xuXHRmdW5jdGlvbiAoKSB7XG5cdCAgLyoqXG5cdCAgICogQ3JlYXRlIGEgTWluS2V5IHR5cGVcblx0ICAgKlxuXHQgICAqIEByZXR1cm4ge01pbktleX0gQSBNaW5LZXkgaW5zdGFuY2Vcblx0ICAgKi9cblx0ICBmdW5jdGlvbiBNaW5LZXkoKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2skNyh0aGlzLCBNaW5LZXkpO1xuXHQgIH1cblx0ICAvKipcblx0ICAgKiBAaWdub3JlXG5cdCAgICovXG5cblxuXHQgIF9jcmVhdGVDbGFzcyQ3KE1pbktleSwgW3tcblx0ICAgIGtleTogXCJ0b0V4dGVuZGVkSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvRXh0ZW5kZWRKU09OKCkge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgICRtaW5LZXk6IDFcblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cblx0ICB9XSwgW3tcblx0ICAgIGtleTogXCJmcm9tRXh0ZW5kZWRKU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUV4dGVuZGVkSlNPTigpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBNaW5LZXkoKTtcblx0ICAgIH1cblx0ICB9XSk7XG5cblx0ICByZXR1cm4gTWluS2V5O1xuXHR9KCk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KE1pbktleS5wcm90b3R5cGUsICdfYnNvbnR5cGUnLCB7XG5cdCAgdmFsdWU6ICdNaW5LZXknXG5cdH0pO1xuXHR2YXIgbWluX2tleSA9IE1pbktleTtcblxuXHQvKipcblx0ICogQSBjbGFzcyByZXByZXNlbnRhdGlvbiBvZiB0aGUgQlNPTiBNYXhLZXkgdHlwZS5cblx0ICovXG5cblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrJDgoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDgodGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQ4KENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkOChDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDgoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cblx0dmFyIE1heEtleSA9XG5cdC8qI19fUFVSRV9fKi9cblx0ZnVuY3Rpb24gKCkge1xuXHQgIC8qKlxuXHQgICAqIENyZWF0ZSBhIE1heEtleSB0eXBlXG5cdCAgICpcblx0ICAgKiBAcmV0dXJuIHtNYXhLZXl9IEEgTWF4S2V5IGluc3RhbmNlXG5cdCAgICovXG5cdCAgZnVuY3Rpb24gTWF4S2V5KCkge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrJDgodGhpcywgTWF4S2V5KTtcblx0ICB9XG5cdCAgLyoqXG5cdCAgICogQGlnbm9yZVxuXHQgICAqL1xuXG5cblx0ICBfY3JlYXRlQ2xhc3MkOChNYXhLZXksIFt7XG5cdCAgICBrZXk6IFwidG9FeHRlbmRlZEpTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b0V4dGVuZGVkSlNPTigpIHtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAkbWF4S2V5OiAxXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfV0sIFt7XG5cdCAgICBrZXk6IFwiZnJvbUV4dGVuZGVkSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21FeHRlbmRlZEpTT04oKSB7XG5cdCAgICAgIHJldHVybiBuZXcgTWF4S2V5KCk7XG5cdCAgICB9XG5cdCAgfV0pO1xuXG5cdCAgcmV0dXJuIE1heEtleTtcblx0fSgpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShNYXhLZXkucHJvdG90eXBlLCAnX2Jzb250eXBlJywge1xuXHQgIHZhbHVlOiAnTWF4S2V5J1xuXHR9KTtcblx0dmFyIG1heF9rZXkgPSBNYXhLZXk7XG5cblx0LyoqXG5cdCAqIEEgY2xhc3MgcmVwcmVzZW50YXRpb24gb2YgdGhlIEJTT04gREJSZWYgdHlwZS5cblx0ICovXG5cblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrJDkoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDkodGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQ5KENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkOShDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDkoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cblx0dmFyIERCUmVmID1cblx0LyojX19QVVJFX18qL1xuXHRmdW5jdGlvbiAoKSB7XG5cdCAgLyoqXG5cdCAgICogQ3JlYXRlIGEgREJSZWYgdHlwZVxuXHQgICAqXG5cdCAgICogQHBhcmFtIHtzdHJpbmd9IGNvbGxlY3Rpb24gdGhlIGNvbGxlY3Rpb24gbmFtZS5cblx0ICAgKiBAcGFyYW0ge09iamVjdElkfSBvaWQgdGhlIHJlZmVyZW5jZSBPYmplY3RJZC5cblx0ICAgKiBAcGFyYW0ge3N0cmluZ30gW2RiXSBvcHRpb25hbCBkYiBuYW1lLCBpZiBvbWl0dGVkIHRoZSByZWZlcmVuY2UgaXMgbG9jYWwgdG8gdGhlIGN1cnJlbnQgZGIuXG5cdCAgICogQHJldHVybiB7REJSZWZ9XG5cdCAgICovXG5cdCAgZnVuY3Rpb24gREJSZWYoY29sbGVjdGlvbiwgb2lkLCBkYiwgZmllbGRzKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2skOSh0aGlzLCBEQlJlZik7XG5cblx0ICAgIC8vIGNoZWNrIGlmIG5hbWVzcGFjZSBoYXMgYmVlbiBwcm92aWRlZFxuXHQgICAgdmFyIHBhcnRzID0gY29sbGVjdGlvbi5zcGxpdCgnLicpO1xuXG5cdCAgICBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG5cdCAgICAgIGRiID0gcGFydHMuc2hpZnQoKTtcblx0ICAgICAgY29sbGVjdGlvbiA9IHBhcnRzLnNoaWZ0KCk7XG5cdCAgICB9XG5cblx0ICAgIHRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG5cdCAgICB0aGlzLm9pZCA9IG9pZDtcblx0ICAgIHRoaXMuZGIgPSBkYjtcblx0ICAgIHRoaXMuZmllbGRzID0gZmllbGRzIHx8IHt9O1xuXHQgIH1cblx0ICAvKipcblx0ICAgKiBAaWdub3JlXG5cdCAgICogQGFwaSBwcml2YXRlXG5cdCAgICovXG5cblxuXHQgIF9jcmVhdGVDbGFzcyQ5KERCUmVmLCBbe1xuXHQgICAga2V5OiBcInRvSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcblx0ICAgICAgdmFyIG8gPSBPYmplY3QuYXNzaWduKHtcblx0ICAgICAgICAkcmVmOiB0aGlzLmNvbGxlY3Rpb24sXG5cdCAgICAgICAgJGlkOiB0aGlzLm9pZFxuXHQgICAgICB9LCB0aGlzLmZpZWxkcyk7XG5cdCAgICAgIGlmICh0aGlzLmRiICE9IG51bGwpIG8uJGRiID0gdGhpcy5kYjtcblx0ICAgICAgcmV0dXJuIG87XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInRvRXh0ZW5kZWRKU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9FeHRlbmRlZEpTT04oKSB7XG5cdCAgICAgIHZhciBvID0ge1xuXHQgICAgICAgICRyZWY6IHRoaXMuY29sbGVjdGlvbixcblx0ICAgICAgICAkaWQ6IHRoaXMub2lkXG5cdCAgICAgIH07XG5cdCAgICAgIGlmICh0aGlzLmRiKSBvLiRkYiA9IHRoaXMuZGI7XG5cdCAgICAgIG8gPSBPYmplY3QuYXNzaWduKG8sIHRoaXMuZmllbGRzKTtcblx0ICAgICAgcmV0dXJuIG87XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfV0sIFt7XG5cdCAgICBrZXk6IFwiZnJvbUV4dGVuZGVkSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21FeHRlbmRlZEpTT04oZG9jKSB7XG5cdCAgICAgIHZhciBjb3B5ID0gT2JqZWN0LmFzc2lnbih7fSwgZG9jKTtcblx0ICAgICAgWyckcmVmJywgJyRpZCcsICckZGInXS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG5cdCAgICAgICAgcmV0dXJuIGRlbGV0ZSBjb3B5W2tdO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIG5ldyBEQlJlZihkb2MuJHJlZiwgZG9jLiRpZCwgZG9jLiRkYiwgY29weSk7XG5cdCAgICB9XG5cdCAgfV0pO1xuXG5cdCAgcmV0dXJuIERCUmVmO1xuXHR9KCk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KERCUmVmLnByb3RvdHlwZSwgJ19ic29udHlwZScsIHtcblx0ICB2YWx1ZTogJ0RCUmVmJ1xuXHR9KTsgLy8gdGhlIDEueCBwYXJzZXIgdXNlZCBhIFwibmFtZXNwYWNlXCIgcHJvcGVydHksIHdoaWxlIDQueCB1c2VzIFwiY29sbGVjdGlvblwiLiBUbyBlbnN1cmUgYmFja3dhcmRzXG5cdC8vIGNvbXBhdGliaWxpdHksIGxldCdzIGV4cG9zZSBcIm5hbWVzcGFjZVwiXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KERCUmVmLnByb3RvdHlwZSwgJ25hbWVzcGFjZScsIHtcblx0ICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcblx0ICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb247XG5cdCAgfSxcblx0ICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWwpIHtcblx0ICAgIHRoaXMuY29sbGVjdGlvbiA9IHZhbDtcblx0ICB9LFxuXHQgIGNvbmZpZ3VyYWJsZTogZmFsc2Vcblx0fSk7XG5cdHZhciBkYl9yZWYgPSBEQlJlZjtcblxuXHRmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2skYShpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cblx0ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkYSh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cblx0ZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJGEoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyRhKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkYShDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuXHR2YXIgQnVmZmVyJDMgPSBidWZmZXIuQnVmZmVyO1xuXHQvKipcblx0ICogQSBjbGFzcyByZXByZXNlbnRhdGlvbiBvZiB0aGUgQlNPTiBCaW5hcnkgdHlwZS5cblx0ICovXG5cblx0dmFyIEJpbmFyeSA9XG5cdC8qI19fUFVSRV9fKi9cblx0ZnVuY3Rpb24gKCkge1xuXHQgIC8qKlxuXHQgICAqIENyZWF0ZSBhIEJpbmFyeSB0eXBlXG5cdCAgICpcblx0ICAgKiBTdWIgdHlwZXNcblx0ICAgKiAgLSAqKkJTT04uQlNPTl9CSU5BUllfU1VCVFlQRV9ERUZBVUxUKiosIGRlZmF1bHQgQlNPTiB0eXBlLlxuXHQgICAqICAtICoqQlNPTi5CU09OX0JJTkFSWV9TVUJUWVBFX0ZVTkNUSU9OKiosIEJTT04gZnVuY3Rpb24gdHlwZS5cblx0ICAgKiAgLSAqKkJTT04uQlNPTl9CSU5BUllfU1VCVFlQRV9CWVRFX0FSUkFZKiosIEJTT04gYnl0ZSBhcnJheSB0eXBlLlxuXHQgICAqICAtICoqQlNPTi5CU09OX0JJTkFSWV9TVUJUWVBFX1VVSUQqKiwgQlNPTiB1dWlkIHR5cGUuXG5cdCAgICogIC0gKipCU09OLkJTT05fQklOQVJZX1NVQlRZUEVfTUQ1KiosIEJTT04gbWQ1IHR5cGUuXG5cdCAgICogIC0gKipCU09OLkJTT05fQklOQVJZX1NVQlRZUEVfVVNFUl9ERUZJTkVEKiosIEJTT04gdXNlciBkZWZpbmVkIHR5cGUuXG5cdCAgICpcblx0ICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIGEgYnVmZmVyIG9iamVjdCBjb250YWluaW5nIHRoZSBiaW5hcnkgZGF0YS5cblx0ICAgKiBAcGFyYW0ge051bWJlcn0gW3N1YlR5cGVdIHRoZSBvcHRpb24gYmluYXJ5IHR5cGUuXG5cdCAgICogQHJldHVybiB7QmluYXJ5fVxuXHQgICAqL1xuXHQgIGZ1bmN0aW9uIEJpbmFyeShidWZmZXIkJDEsIHN1YlR5cGUpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayRhKHRoaXMsIEJpbmFyeSk7XG5cblx0ICAgIGlmIChidWZmZXIkJDEgIT0gbnVsbCAmJiAhKHR5cGVvZiBidWZmZXIkJDEgPT09ICdzdHJpbmcnKSAmJiAhQnVmZmVyJDMuaXNCdWZmZXIoYnVmZmVyJCQxKSAmJiAhKGJ1ZmZlciQkMSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpICYmICFBcnJheS5pc0FycmF5KGJ1ZmZlciQkMSkpIHtcblx0ICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb25seSBTdHJpbmcsIEJ1ZmZlciwgVWludDhBcnJheSBvciBBcnJheSBhY2NlcHRlZCcpO1xuXHQgICAgfVxuXG5cdCAgICB0aGlzLnN1Yl90eXBlID0gc3ViVHlwZSA9PSBudWxsID8gQlNPTl9CSU5BUllfU1VCVFlQRV9ERUZBVUxUIDogc3ViVHlwZTtcblx0ICAgIHRoaXMucG9zaXRpb24gPSAwO1xuXG5cdCAgICBpZiAoYnVmZmVyJCQxICE9IG51bGwgJiYgIShidWZmZXIkJDEgaW5zdGFuY2VvZiBOdW1iZXIpKSB7XG5cdCAgICAgIC8vIE9ubHkgYWNjZXB0IEJ1ZmZlciwgVWludDhBcnJheSBvciBBcnJheXNcblx0ICAgICAgaWYgKHR5cGVvZiBidWZmZXIkJDEgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgLy8gRGlmZmVyZW50IHdheXMgb2Ygd3JpdGluZyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXNcblx0ICAgICAgICBpZiAodHlwZW9mIEJ1ZmZlciQzICE9PSAndW5kZWZpbmVkJykge1xuXHQgICAgICAgICAgdGhpcy5idWZmZXIgPSBCdWZmZXIkMy5mcm9tKGJ1ZmZlciQkMSk7XG5cdCAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgfHwgQXJyYXkuaXNBcnJheShidWZmZXIkJDEpKSB7XG5cdCAgICAgICAgICB0aGlzLmJ1ZmZlciA9IHdyaXRlU3RyaW5nVG9BcnJheShidWZmZXIkJDEpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvbmx5IFN0cmluZywgQnVmZmVyLCBVaW50OEFycmF5IG9yIEFycmF5IGFjY2VwdGVkJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyJCQxO1xuXHQgICAgICB9XG5cblx0ICAgICAgdGhpcy5wb3NpdGlvbiA9IGJ1ZmZlciQkMS5sZW5ndGg7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBpZiAodHlwZW9mIEJ1ZmZlciQzICE9PSAndW5kZWZpbmVkJykge1xuXHQgICAgICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyJDMuYWxsb2MoQmluYXJ5LkJVRkZFUl9TSVpFKTtcblx0ICAgICAgfSBlbHNlIGlmICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KG5ldyBBcnJheUJ1ZmZlcihCaW5hcnkuQlVGRkVSX1NJWkUpKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheShCaW5hcnkuQlVGRkVSX1NJWkUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXHQgIC8qKlxuXHQgICAqIFVwZGF0ZXMgdGhpcyBiaW5hcnkgd2l0aCBieXRlX3ZhbHVlLlxuXHQgICAqXG5cdCAgICogQG1ldGhvZFxuXHQgICAqIEBwYXJhbSB7c3RyaW5nfSBieXRlX3ZhbHVlIGEgc2luZ2xlIGJ5dGUgd2Ugd2lzaCB0byB3cml0ZS5cblx0ICAgKi9cblxuXG5cdCAgX2NyZWF0ZUNsYXNzJGEoQmluYXJ5LCBbe1xuXHQgICAga2V5OiBcInB1dFwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHB1dChieXRlX3ZhbHVlKSB7XG5cdCAgICAgIC8vIElmIGl0J3MgYSBzdHJpbmcgYW5kIGEgaGFzIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyIHRocm93IGFuIGVycm9yXG5cdCAgICAgIGlmIChieXRlX3ZhbHVlWydsZW5ndGgnXSAhPSBudWxsICYmIHR5cGVvZiBieXRlX3ZhbHVlICE9PSAnbnVtYmVyJyAmJiBieXRlX3ZhbHVlLmxlbmd0aCAhPT0gMSkgdGhyb3cgbmV3IFR5cGVFcnJvcignb25seSBhY2NlcHRzIHNpbmdsZSBjaGFyYWN0ZXIgU3RyaW5nLCBVaW50OEFycmF5IG9yIEFycmF5Jyk7XG5cdCAgICAgIGlmICh0eXBlb2YgYnl0ZV92YWx1ZSAhPT0gJ251bWJlcicgJiYgYnl0ZV92YWx1ZSA8IDAgfHwgYnl0ZV92YWx1ZSA+IDI1NSkgdGhyb3cgbmV3IFR5cGVFcnJvcignb25seSBhY2NlcHRzIG51bWJlciBpbiBhIHZhbGlkIHVuc2lnbmVkIGJ5dGUgcmFuZ2UgMC0yNTUnKTsgLy8gRGVjb2RlIHRoZSBieXRlIHZhbHVlIG9uY2VcblxuXHQgICAgICB2YXIgZGVjb2RlZF9ieXRlID0gbnVsbDtcblxuXHQgICAgICBpZiAodHlwZW9mIGJ5dGVfdmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgZGVjb2RlZF9ieXRlID0gYnl0ZV92YWx1ZS5jaGFyQ29kZUF0KDApO1xuXHQgICAgICB9IGVsc2UgaWYgKGJ5dGVfdmFsdWVbJ2xlbmd0aCddICE9IG51bGwpIHtcblx0ICAgICAgICBkZWNvZGVkX2J5dGUgPSBieXRlX3ZhbHVlWzBdO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGRlY29kZWRfYnl0ZSA9IGJ5dGVfdmFsdWU7XG5cdCAgICAgIH1cblxuXHQgICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoID4gdGhpcy5wb3NpdGlvbikge1xuXHQgICAgICAgIHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb24rK10gPSBkZWNvZGVkX2J5dGU7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBCdWZmZXIkMyAhPT0gJ3VuZGVmaW5lZCcgJiYgQnVmZmVyJDMuaXNCdWZmZXIodGhpcy5idWZmZXIpKSB7XG5cdCAgICAgICAgICAvLyBDcmVhdGUgYWRkaXRpb25hbCBvdmVyZmxvdyBidWZmZXJcblx0ICAgICAgICAgIHZhciBidWZmZXIkJDEgPSBCdWZmZXIkMy5hbGxvYyhCaW5hcnkuQlVGRkVSX1NJWkUgKyB0aGlzLmJ1ZmZlci5sZW5ndGgpOyAvLyBDb21iaW5lIHRoZSB0d28gYnVmZmVycyB0b2dldGhlclxuXG5cdCAgICAgICAgICB0aGlzLmJ1ZmZlci5jb3B5KGJ1ZmZlciQkMSwgMCwgMCwgdGhpcy5idWZmZXIubGVuZ3RoKTtcblx0ICAgICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyJCQxO1xuXHQgICAgICAgICAgdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXSA9IGRlY29kZWRfYnl0ZTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdmFyIF9idWZmZXIgPSBudWxsOyAvLyBDcmVhdGUgYSBuZXcgYnVmZmVyICh0eXBlZCBvciBub3JtYWwgYXJyYXkpXG5cblx0ICAgICAgICAgIGlmIChpc1VpbnQ4QXJyYXkodGhpcy5idWZmZXIpKSB7XG5cdCAgICAgICAgICAgIF9idWZmZXIgPSBuZXcgVWludDhBcnJheShuZXcgQXJyYXlCdWZmZXIoQmluYXJ5LkJVRkZFUl9TSVpFICsgdGhpcy5idWZmZXIubGVuZ3RoKSk7XG5cdCAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICBfYnVmZmVyID0gbmV3IEFycmF5KEJpbmFyeS5CVUZGRVJfU0laRSArIHRoaXMuYnVmZmVyLmxlbmd0aCk7XG5cdCAgICAgICAgICB9IC8vIFdlIG5lZWQgdG8gY29weSBhbGwgdGhlIGNvbnRlbnQgdG8gdGhlIG5ldyBhcnJheVxuXG5cblx0ICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5idWZmZXIubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgX2J1ZmZlcltpXSA9IHRoaXMuYnVmZmVyW2ldO1xuXHQgICAgICAgICAgfSAvLyBSZWFzc2lnbiB0aGUgYnVmZmVyXG5cblxuXHQgICAgICAgICAgdGhpcy5idWZmZXIgPSBfYnVmZmVyOyAvLyBXcml0ZSB0aGUgYnl0ZVxuXG5cdCAgICAgICAgICB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uKytdID0gZGVjb2RlZF9ieXRlO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBXcml0ZXMgYSBidWZmZXIgb3Igc3RyaW5nIHRvIHRoZSBiaW5hcnkuXG5cdCAgICAgKlxuXHQgICAgICogQG1ldGhvZFxuXHQgICAgICogQHBhcmFtIHsoQnVmZmVyfHN0cmluZyl9IHN0cmluZyBhIHN0cmluZyBvciBidWZmZXIgdG8gYmUgd3JpdHRlbiB0byB0aGUgQmluYXJ5IEJTT04gb2JqZWN0LlxuXHQgICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCBzcGVjaWZ5IHRoZSBiaW5hcnkgb2Ygd2hlcmUgdG8gd3JpdGUgdGhlIGNvbnRlbnQuXG5cdCAgICAgKiBAcmV0dXJuIHtudWxsfVxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwid3JpdGVcIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB3cml0ZShzdHJpbmcsIG9mZnNldCkge1xuXHQgICAgICBvZmZzZXQgPSB0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJyA/IG9mZnNldCA6IHRoaXMucG9zaXRpb247IC8vIElmIHRoZSBidWZmZXIgaXMgdG8gc21hbGwgbGV0J3MgZXh0ZW5kIHRoZSBidWZmZXJcblxuXHQgICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoIDwgb2Zmc2V0ICsgc3RyaW5nLmxlbmd0aCkge1xuXHQgICAgICAgIHZhciBidWZmZXIkJDEgPSBudWxsOyAvLyBJZiB3ZSBhcmUgaW4gbm9kZS5qc1xuXG5cdCAgICAgICAgaWYgKHR5cGVvZiBCdWZmZXIkMyAhPT0gJ3VuZGVmaW5lZCcgJiYgQnVmZmVyJDMuaXNCdWZmZXIodGhpcy5idWZmZXIpKSB7XG5cdCAgICAgICAgICBidWZmZXIkJDEgPSBCdWZmZXIkMy5hbGxvYyh0aGlzLmJ1ZmZlci5sZW5ndGggKyBzdHJpbmcubGVuZ3RoKTtcblx0ICAgICAgICAgIHRoaXMuYnVmZmVyLmNvcHkoYnVmZmVyJCQxLCAwLCAwLCB0aGlzLmJ1ZmZlci5sZW5ndGgpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoaXNVaW50OEFycmF5KHRoaXMuYnVmZmVyKSkge1xuXHQgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGJ1ZmZlclxuXHQgICAgICAgICAgYnVmZmVyJCQxID0gbmV3IFVpbnQ4QXJyYXkobmV3IEFycmF5QnVmZmVyKHRoaXMuYnVmZmVyLmxlbmd0aCArIHN0cmluZy5sZW5ndGgpKTsgLy8gQ29weSB0aGUgY29udGVudFxuXG5cdCAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucG9zaXRpb247IGkrKykge1xuXHQgICAgICAgICAgICBidWZmZXIkJDFbaV0gPSB0aGlzLmJ1ZmZlcltpXTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IC8vIEFzc2lnbiB0aGUgbmV3IGJ1ZmZlclxuXG5cblx0ICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlciQkMTtcblx0ICAgICAgfVxuXG5cdCAgICAgIGlmICh0eXBlb2YgQnVmZmVyJDMgIT09ICd1bmRlZmluZWQnICYmIEJ1ZmZlciQzLmlzQnVmZmVyKHN0cmluZykgJiYgQnVmZmVyJDMuaXNCdWZmZXIodGhpcy5idWZmZXIpKSB7XG5cdCAgICAgICAgc3RyaW5nLmNvcHkodGhpcy5idWZmZXIsIG9mZnNldCwgMCwgc3RyaW5nLmxlbmd0aCk7XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG9mZnNldCArIHN0cmluZy5sZW5ndGggPiB0aGlzLnBvc2l0aW9uID8gb2Zmc2V0ICsgc3RyaW5nLmxlbmd0aCA6IHRoaXMucG9zaXRpb247IC8vIG9mZnNldCA9IHN0cmluZy5sZW5ndGhcblx0ICAgICAgfSBlbHNlIGlmICh0eXBlb2YgQnVmZmVyJDMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnICYmIEJ1ZmZlciQzLmlzQnVmZmVyKHRoaXMuYnVmZmVyKSkge1xuXHQgICAgICAgIHRoaXMuYnVmZmVyLndyaXRlKHN0cmluZywgb2Zmc2V0LCAnYmluYXJ5Jyk7XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG9mZnNldCArIHN0cmluZy5sZW5ndGggPiB0aGlzLnBvc2l0aW9uID8gb2Zmc2V0ICsgc3RyaW5nLmxlbmd0aCA6IHRoaXMucG9zaXRpb247IC8vIG9mZnNldCA9IHN0cmluZy5sZW5ndGg7XG5cdCAgICAgIH0gZWxzZSBpZiAoaXNVaW50OEFycmF5KHN0cmluZykgfHwgQXJyYXkuaXNBcnJheShzdHJpbmcpICYmIHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHN0cmluZy5sZW5ndGg7IF9pKyspIHtcblx0ICAgICAgICAgIHRoaXMuYnVmZmVyW29mZnNldCsrXSA9IHN0cmluZ1tfaV07XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG9mZnNldCA+IHRoaXMucG9zaXRpb24gPyBvZmZzZXQgOiB0aGlzLnBvc2l0aW9uO1xuXHQgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgc3RyaW5nLmxlbmd0aDsgX2kyKyspIHtcblx0ICAgICAgICAgIHRoaXMuYnVmZmVyW29mZnNldCsrXSA9IHN0cmluZy5jaGFyQ29kZUF0KF9pMik7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG9mZnNldCA+IHRoaXMucG9zaXRpb24gPyBvZmZzZXQgOiB0aGlzLnBvc2l0aW9uO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIFJlYWRzICoqbGVuZ3RoKiogYnl0ZXMgc3RhcnRpbmcgYXQgKipwb3NpdGlvbioqLlxuXHQgICAgICpcblx0ICAgICAqIEBtZXRob2Rcblx0ICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvbiByZWFkIGZyb20gdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBCaW5hcnkuXG5cdCAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cblx0ICAgICAqIEByZXR1cm4ge0J1ZmZlcn1cblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInJlYWRcIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiByZWFkKHBvc2l0aW9uLCBsZW5ndGgpIHtcblx0ICAgICAgbGVuZ3RoID0gbGVuZ3RoICYmIGxlbmd0aCA+IDAgPyBsZW5ndGggOiB0aGlzLnBvc2l0aW9uOyAvLyBMZXQncyByZXR1cm4gdGhlIGRhdGEgYmFzZWQgb24gdGhlIHR5cGUgd2UgaGF2ZVxuXG5cdCAgICAgIGlmICh0aGlzLmJ1ZmZlclsnc2xpY2UnXSkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyBsZW5ndGgpO1xuXHQgICAgICB9IC8vIENyZWF0ZSBhIGJ1ZmZlciB0byBrZWVwIHRoZSByZXN1bHRcblxuXG5cdCAgICAgIHZhciBidWZmZXIkJDEgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgVWludDhBcnJheShuZXcgQXJyYXlCdWZmZXIobGVuZ3RoKSkgOiBuZXcgQXJyYXkobGVuZ3RoKTtcblxuXHQgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgYnVmZmVyJCQxW2ldID0gdGhpcy5idWZmZXJbcG9zaXRpb24rK107XG5cdCAgICAgIH0gLy8gUmV0dXJuIHRoZSBidWZmZXJcblxuXG5cdCAgICAgIHJldHVybiBidWZmZXIkJDE7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgYmluYXJ5IGFzIGEgc3RyaW5nLlxuXHQgICAgICpcblx0ICAgICAqIEBtZXRob2Rcblx0ICAgICAqIEByZXR1cm4ge3N0cmluZ31cblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInZhbHVlXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoYXNSYXcpIHtcblx0ICAgICAgYXNSYXcgPSBhc1JhdyA9PSBudWxsID8gZmFsc2UgOiBhc1JhdzsgLy8gT3B0aW1pemUgdG8gc2VyaWFsaXplIGZvciB0aGUgc2l0dWF0aW9uIHdoZXJlIHRoZSBkYXRhID09IHNpemUgb2YgYnVmZmVyXG5cblx0ICAgICAgaWYgKGFzUmF3ICYmIHR5cGVvZiBCdWZmZXIkMyAhPT0gJ3VuZGVmaW5lZCcgJiYgQnVmZmVyJDMuaXNCdWZmZXIodGhpcy5idWZmZXIpICYmIHRoaXMuYnVmZmVyLmxlbmd0aCA9PT0gdGhpcy5wb3NpdGlvbikgcmV0dXJuIHRoaXMuYnVmZmVyOyAvLyBJZiBpdCdzIGEgbm9kZS5qcyBidWZmZXIgb2JqZWN0XG5cblx0ICAgICAgaWYgKHR5cGVvZiBCdWZmZXIkMyAhPT0gJ3VuZGVmaW5lZCcgJiYgQnVmZmVyJDMuaXNCdWZmZXIodGhpcy5idWZmZXIpKSB7XG5cdCAgICAgICAgcmV0dXJuIGFzUmF3ID8gdGhpcy5idWZmZXIuc2xpY2UoMCwgdGhpcy5wb3NpdGlvbikgOiB0aGlzLmJ1ZmZlci50b1N0cmluZygnYmluYXJ5JywgMCwgdGhpcy5wb3NpdGlvbik7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgaWYgKGFzUmF3KSB7XG5cdCAgICAgICAgICAvLyB3ZSBzdXBwb3J0IHRoZSBzbGljZSBjb21tYW5kIHVzZSBpdFxuXHQgICAgICAgICAgaWYgKHRoaXMuYnVmZmVyWydzbGljZSddICE9IG51bGwpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLnNsaWNlKDAsIHRoaXMucG9zaXRpb24pO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGJ1ZmZlciB0byBjb3B5IGNvbnRlbnQgdG9cblx0ICAgICAgICAgICAgdmFyIG5ld0J1ZmZlciA9IGlzVWludDhBcnJheSh0aGlzLmJ1ZmZlcikgPyBuZXcgVWludDhBcnJheShuZXcgQXJyYXlCdWZmZXIodGhpcy5wb3NpdGlvbikpIDogbmV3IEFycmF5KHRoaXMucG9zaXRpb24pOyAvLyBDb3B5IGNvbnRlbnRcblxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucG9zaXRpb247IGkrKykge1xuXHQgICAgICAgICAgICAgIG5ld0J1ZmZlcltpXSA9IHRoaXMuYnVmZmVyW2ldO1xuXHQgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgYnVmZmVyXG5cblxuXHQgICAgICAgICAgICByZXR1cm4gbmV3QnVmZmVyO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICByZXR1cm4gY29udmVydEFycmF5dG9VdGY4QmluYXJ5U3RyaW5nKHRoaXMuYnVmZmVyLCAwLCB0aGlzLnBvc2l0aW9uKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogTGVuZ3RoLlxuXHQgICAgICpcblx0ICAgICAqIEBtZXRob2Rcblx0ICAgICAqIEByZXR1cm4ge251bWJlcn0gdGhlIGxlbmd0aCBvZiB0aGUgYmluYXJ5LlxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwibGVuZ3RoXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gbGVuZ3RoKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbjtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwidG9KU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5idWZmZXIgIT0gbnVsbCA/IHRoaXMuYnVmZmVyLnRvU3RyaW5nKCdiYXNlNjQnKSA6ICcnO1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKGZvcm1hdCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5idWZmZXIgIT0gbnVsbCA/IHRoaXMuYnVmZmVyLnNsaWNlKDAsIHRoaXMucG9zaXRpb24pLnRvU3RyaW5nKGZvcm1hdCkgOiAnJztcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwidG9FeHRlbmRlZEpTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b0V4dGVuZGVkSlNPTigpIHtcblx0ICAgICAgdmFyIGJhc2U2NFN0cmluZyA9IEJ1ZmZlciQzLmlzQnVmZmVyKHRoaXMuYnVmZmVyKSA/IHRoaXMuYnVmZmVyLnRvU3RyaW5nKCdiYXNlNjQnKSA6IEJ1ZmZlciQzLmZyb20odGhpcy5idWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblx0ICAgICAgdmFyIHN1YlR5cGUgPSBOdW1iZXIodGhpcy5zdWJfdHlwZSkudG9TdHJpbmcoMTYpO1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgICRiaW5hcnk6IHtcblx0ICAgICAgICAgIGJhc2U2NDogYmFzZTY0U3RyaW5nLFxuXHQgICAgICAgICAgc3ViVHlwZTogc3ViVHlwZS5sZW5ndGggPT09IDEgPyAnMCcgKyBzdWJUeXBlIDogc3ViVHlwZVxuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cblx0ICB9XSwgW3tcblx0ICAgIGtleTogXCJmcm9tRXh0ZW5kZWRKU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUV4dGVuZGVkSlNPTihkb2MpIHtcblx0ICAgICAgdmFyIHR5cGUgPSBkb2MuJGJpbmFyeS5zdWJUeXBlID8gcGFyc2VJbnQoZG9jLiRiaW5hcnkuc3ViVHlwZSwgMTYpIDogMDtcblx0ICAgICAgdmFyIGRhdGEgPSBCdWZmZXIkMy5mcm9tKGRvYy4kYmluYXJ5LmJhc2U2NCwgJ2Jhc2U2NCcpO1xuXHQgICAgICByZXR1cm4gbmV3IEJpbmFyeShkYXRhLCB0eXBlKTtcblx0ICAgIH1cblx0ICB9XSk7XG5cblx0ICByZXR1cm4gQmluYXJ5O1xuXHR9KCk7XG5cdC8qKlxuXHQgKiBCaW5hcnkgZGVmYXVsdCBzdWJ0eXBlXG5cdCAqIEBpZ25vcmVcblx0ICovXG5cblxuXHR2YXIgQlNPTl9CSU5BUllfU1VCVFlQRV9ERUZBVUxUID0gMDtcblxuXHRmdW5jdGlvbiBpc1VpbnQ4QXJyYXkob2JqKSB7XG5cdCAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBVaW50OEFycmF5XSc7XG5cdH1cblx0LyoqXG5cdCAqIEBpZ25vcmVcblx0ICovXG5cblxuXHRmdW5jdGlvbiB3cml0ZVN0cmluZ1RvQXJyYXkoZGF0YSkge1xuXHQgIC8vIENyZWF0ZSBhIGJ1ZmZlclxuXHQgIHZhciBidWZmZXIkJDEgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgVWludDhBcnJheShuZXcgQXJyYXlCdWZmZXIoZGF0YS5sZW5ndGgpKSA6IG5ldyBBcnJheShkYXRhLmxlbmd0aCk7IC8vIFdyaXRlIHRoZSBjb250ZW50IHRvIHRoZSBidWZmZXJcblxuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuXHQgICAgYnVmZmVyJCQxW2ldID0gZGF0YS5jaGFyQ29kZUF0KGkpO1xuXHQgIH0gLy8gV3JpdGUgdGhlIHN0cmluZyB0byB0aGUgYnVmZmVyXG5cblxuXHQgIHJldHVybiBidWZmZXIkJDE7XG5cdH1cblx0LyoqXG5cdCAqIENvbnZlcnQgQXJyYXkgb3QgVWludDhBcnJheSB0byBCaW5hcnkgU3RyaW5nXG5cdCAqXG5cdCAqIEBpZ25vcmVcblx0ICovXG5cblxuXHRmdW5jdGlvbiBjb252ZXJ0QXJyYXl0b1V0ZjhCaW5hcnlTdHJpbmcoYnl0ZUFycmF5LCBzdGFydEluZGV4LCBlbmRJbmRleCkge1xuXHQgIHZhciByZXN1bHQgPSAnJztcblxuXHQgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgZW5kSW5kZXg7IGkrKykge1xuXHQgICAgcmVzdWx0ID0gcmVzdWx0ICsgU3RyaW5nLmZyb21DaGFyQ29kZShieXRlQXJyYXlbaV0pO1xuXHQgIH1cblxuXHQgIHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRCaW5hcnkuQlVGRkVSX1NJWkUgPSAyNTY7XG5cdC8qKlxuXHQgKiBEZWZhdWx0IEJTT04gdHlwZVxuXHQgKlxuXHQgKiBAY2xhc3Njb25zdGFudCBTVUJUWVBFX0RFRkFVTFRcblx0ICoqL1xuXG5cdEJpbmFyeS5TVUJUWVBFX0RFRkFVTFQgPSAwO1xuXHQvKipcblx0ICogRnVuY3Rpb24gQlNPTiB0eXBlXG5cdCAqXG5cdCAqIEBjbGFzc2NvbnN0YW50IFNVQlRZUEVfREVGQVVMVFxuXHQgKiovXG5cblx0QmluYXJ5LlNVQlRZUEVfRlVOQ1RJT04gPSAxO1xuXHQvKipcblx0ICogQnl0ZSBBcnJheSBCU09OIHR5cGVcblx0ICpcblx0ICogQGNsYXNzY29uc3RhbnQgU1VCVFlQRV9ERUZBVUxUXG5cdCAqKi9cblxuXHRCaW5hcnkuU1VCVFlQRV9CWVRFX0FSUkFZID0gMjtcblx0LyoqXG5cdCAqIE9MRCBVVUlEIEJTT04gdHlwZVxuXHQgKlxuXHQgKiBAY2xhc3Njb25zdGFudCBTVUJUWVBFX0RFRkFVTFRcblx0ICoqL1xuXG5cdEJpbmFyeS5TVUJUWVBFX1VVSURfT0xEID0gMztcblx0LyoqXG5cdCAqIFVVSUQgQlNPTiB0eXBlXG5cdCAqXG5cdCAqIEBjbGFzc2NvbnN0YW50IFNVQlRZUEVfREVGQVVMVFxuXHQgKiovXG5cblx0QmluYXJ5LlNVQlRZUEVfVVVJRCA9IDQ7XG5cdC8qKlxuXHQgKiBNRDUgQlNPTiB0eXBlXG5cdCAqXG5cdCAqIEBjbGFzc2NvbnN0YW50IFNVQlRZUEVfREVGQVVMVFxuXHQgKiovXG5cblx0QmluYXJ5LlNVQlRZUEVfTUQ1ID0gNTtcblx0LyoqXG5cdCAqIFVzZXIgQlNPTiB0eXBlXG5cdCAqXG5cdCAqIEBjbGFzc2NvbnN0YW50IFNVQlRZUEVfREVGQVVMVFxuXHQgKiovXG5cblx0QmluYXJ5LlNVQlRZUEVfVVNFUl9ERUZJTkVEID0gMTI4O1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoQmluYXJ5LnByb3RvdHlwZSwgJ19ic29udHlwZScsIHtcblx0ICB2YWx1ZTogJ0JpbmFyeSdcblx0fSk7XG5cdHZhciBiaW5hcnkgPSBCaW5hcnk7XG5cblx0dmFyIGNvbnN0YW50cyA9IHtcblx0ICAvLyBCU09OIE1BWCBWQUxVRVNcblx0ICBCU09OX0lOVDMyX01BWDogMHg3ZmZmZmZmZixcblx0ICBCU09OX0lOVDMyX01JTjogLTB4ODAwMDAwMDAsXG5cdCAgQlNPTl9JTlQ2NF9NQVg6IE1hdGgucG93KDIsIDYzKSAtIDEsXG5cdCAgQlNPTl9JTlQ2NF9NSU46IC1NYXRoLnBvdygyLCA2MyksXG5cdCAgLy8gSlMgTUFYIFBSRUNJU0UgVkFMVUVTXG5cdCAgSlNfSU5UX01BWDogMHgyMDAwMDAwMDAwMDAwMCxcblx0ICAvLyBBbnkgaW50ZWdlciB1cCB0byAyXjUzIGNhbiBiZSBwcmVjaXNlbHkgcmVwcmVzZW50ZWQgYnkgYSBkb3VibGUuXG5cdCAgSlNfSU5UX01JTjogLTB4MjAwMDAwMDAwMDAwMDAsXG5cdCAgLy8gQW55IGludGVnZXIgZG93biB0byAtMl41MyBjYW4gYmUgcHJlY2lzZWx5IHJlcHJlc2VudGVkIGJ5IGEgZG91YmxlLlxuXG5cdCAgLyoqXG5cdCAgICogTnVtYmVyIEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX05VTUJFUlxuXHQgICAqKi9cblx0ICBCU09OX0RBVEFfTlVNQkVSOiAxLFxuXG5cdCAgLyoqXG5cdCAgICogU3RyaW5nIEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX1NUUklOR1xuXHQgICAqKi9cblx0ICBCU09OX0RBVEFfU1RSSU5HOiAyLFxuXG5cdCAgLyoqXG5cdCAgICogT2JqZWN0IEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX09CSkVDVFxuXHQgICAqKi9cblx0ICBCU09OX0RBVEFfT0JKRUNUOiAzLFxuXG5cdCAgLyoqXG5cdCAgICogQXJyYXkgQlNPTiBUeXBlXG5cdCAgICpcblx0ICAgKiBAY2xhc3Njb25zdGFudCBCU09OX0RBVEFfQVJSQVlcblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX0FSUkFZOiA0LFxuXG5cdCAgLyoqXG5cdCAgICogQmluYXJ5IEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX0JJTkFSWVxuXHQgICAqKi9cblx0ICBCU09OX0RBVEFfQklOQVJZOiA1LFxuXG5cdCAgLyoqXG5cdCAgICogQmluYXJ5IEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX1VOREVGSU5FRFxuXHQgICAqKi9cblx0ICBCU09OX0RBVEFfVU5ERUZJTkVEOiA2LFxuXG5cdCAgLyoqXG5cdCAgICogT2JqZWN0SWQgQlNPTiBUeXBlXG5cdCAgICpcblx0ICAgKiBAY2xhc3Njb25zdGFudCBCU09OX0RBVEFfT0lEXG5cdCAgICoqL1xuXHQgIEJTT05fREFUQV9PSUQ6IDcsXG5cblx0ICAvKipcblx0ICAgKiBCb29sZWFuIEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX0JPT0xFQU5cblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX0JPT0xFQU46IDgsXG5cblx0ICAvKipcblx0ICAgKiBEYXRlIEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX0RBVEVcblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX0RBVEU6IDksXG5cblx0ICAvKipcblx0ICAgKiBudWxsIEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX05VTExcblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX05VTEw6IDEwLFxuXG5cdCAgLyoqXG5cdCAgICogUmVnRXhwIEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX1JFR0VYUFxuXHQgICAqKi9cblx0ICBCU09OX0RBVEFfUkVHRVhQOiAxMSxcblxuXHQgIC8qKlxuXHQgICAqIENvZGUgQlNPTiBUeXBlXG5cdCAgICpcblx0ICAgKiBAY2xhc3Njb25zdGFudCBCU09OX0RBVEFfREJQT0lOVEVSXG5cdCAgICoqL1xuXHQgIEJTT05fREFUQV9EQlBPSU5URVI6IDEyLFxuXG5cdCAgLyoqXG5cdCAgICogQ29kZSBCU09OIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fREFUQV9DT0RFXG5cdCAgICoqL1xuXHQgIEJTT05fREFUQV9DT0RFOiAxMyxcblxuXHQgIC8qKlxuXHQgICAqIFN5bWJvbCBCU09OIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fREFUQV9TWU1CT0xcblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX1NZTUJPTDogMTQsXG5cblx0ICAvKipcblx0ICAgKiBDb2RlIHdpdGggU2NvcGUgQlNPTiBUeXBlXG5cdCAgICpcblx0ICAgKiBAY2xhc3Njb25zdGFudCBCU09OX0RBVEFfQ09ERV9XX1NDT1BFXG5cdCAgICoqL1xuXHQgIEJTT05fREFUQV9DT0RFX1dfU0NPUEU6IDE1LFxuXG5cdCAgLyoqXG5cdCAgICogMzIgYml0IEludGVnZXIgQlNPTiBUeXBlXG5cdCAgICpcblx0ICAgKiBAY2xhc3Njb25zdGFudCBCU09OX0RBVEFfSU5UXG5cdCAgICoqL1xuXHQgIEJTT05fREFUQV9JTlQ6IDE2LFxuXG5cdCAgLyoqXG5cdCAgICogVGltZXN0YW1wIEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX1RJTUVTVEFNUFxuXHQgICAqKi9cblx0ICBCU09OX0RBVEFfVElNRVNUQU1QOiAxNyxcblxuXHQgIC8qKlxuXHQgICAqIExvbmcgQlNPTiBUeXBlXG5cdCAgICpcblx0ICAgKiBAY2xhc3Njb25zdGFudCBCU09OX0RBVEFfTE9OR1xuXHQgICAqKi9cblx0ICBCU09OX0RBVEFfTE9ORzogMTgsXG5cblx0ICAvKipcblx0ICAgKiBMb25nIEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX0RFQ0lNQUwxMjhcblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX0RFQ0lNQUwxMjg6IDE5LFxuXG5cdCAgLyoqXG5cdCAgICogTWluS2V5IEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX01JTl9LRVlcblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX01JTl9LRVk6IDB4ZmYsXG5cblx0ICAvKipcblx0ICAgKiBNYXhLZXkgQlNPTiBUeXBlXG5cdCAgICpcblx0ICAgKiBAY2xhc3Njb25zdGFudCBCU09OX0RBVEFfTUFYX0tFWVxuXHQgICAqKi9cblx0ICBCU09OX0RBVEFfTUFYX0tFWTogMHg3ZixcblxuXHQgIC8qKlxuXHQgICAqIEJpbmFyeSBEZWZhdWx0IFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVFxuXHQgICAqKi9cblx0ICBCU09OX0JJTkFSWV9TVUJUWVBFX0RFRkFVTFQ6IDAsXG5cblx0ICAvKipcblx0ICAgKiBCaW5hcnkgRnVuY3Rpb24gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9CSU5BUllfU1VCVFlQRV9GVU5DVElPTlxuXHQgICAqKi9cblx0ICBCU09OX0JJTkFSWV9TVUJUWVBFX0ZVTkNUSU9OOiAxLFxuXG5cdCAgLyoqXG5cdCAgICogQmluYXJ5IEJ5dGUgQXJyYXkgVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9CSU5BUllfU1VCVFlQRV9CWVRFX0FSUkFZXG5cdCAgICoqL1xuXHQgIEJTT05fQklOQVJZX1NVQlRZUEVfQllURV9BUlJBWTogMixcblxuXHQgIC8qKlxuXHQgICAqIEJpbmFyeSBVVUlEIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fQklOQVJZX1NVQlRZUEVfVVVJRFxuXHQgICAqKi9cblx0ICBCU09OX0JJTkFSWV9TVUJUWVBFX1VVSUQ6IDMsXG5cblx0ICAvKipcblx0ICAgKiBCaW5hcnkgTUQ1IFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fQklOQVJZX1NVQlRZUEVfTUQ1XG5cdCAgICoqL1xuXHQgIEJTT05fQklOQVJZX1NVQlRZUEVfTUQ1OiA0LFxuXG5cdCAgLyoqXG5cdCAgICogQmluYXJ5IFVzZXIgRGVmaW5lZCBUeXBlXG5cdCAgICpcblx0ICAgKiBAY2xhc3Njb25zdGFudCBCU09OX0JJTkFSWV9TVUJUWVBFX1VTRVJfREVGSU5FRFxuXHQgICAqKi9cblx0ICBCU09OX0JJTkFSWV9TVUJUWVBFX1VTRVJfREVGSU5FRDogMTI4XG5cdH07XG5cblx0ZnVuY3Rpb24gX3R5cGVvZiQyKG9iaikgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiQyID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YkMiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mJDIob2JqKTsgfVxuXHQvLyBjb25zdCBNYXAgPSByZXF1aXJlKCcuL21hcCcpO1xuXG5cdC8qKlxuXHQgKiBAbmFtZXNwYWNlIEVKU09OXG5cdCAqL1xuXHQvLyBhbGwgdGhlIHR5cGVzIHdoZXJlIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55IHNwZWNpYWwgcHJvY2Vzc2luZyBhbmQgY2FuIGp1c3QgcGFzcyB0aGUgRUpTT05cblx0Ly9zdHJhaWdodCB0byB0eXBlLmZyb21FeHRlbmRlZEpTT05cblxuXG5cdHZhciBrZXlzVG9Db2RlY3MgPSB7XG5cdCAgJG9pZDogb2JqZWN0aWQsXG5cdCAgJGJpbmFyeTogYmluYXJ5LFxuXHQgICRzeW1ib2w6IHN5bWJvbCxcblx0ICAkbnVtYmVySW50OiBpbnRfMzIsXG5cdCAgJG51bWJlckRlY2ltYWw6IGRlY2ltYWwxMjgsXG5cdCAgJG51bWJlckRvdWJsZTogZG91YmxlXzEsXG5cdCAgJG51bWJlckxvbmc6IGxvbmdfMSxcblx0ICAkbWluS2V5OiBtaW5fa2V5LFxuXHQgICRtYXhLZXk6IG1heF9rZXksXG5cdCAgJHJlZ3VsYXJFeHByZXNzaW9uOiByZWdleHAsXG5cdCAgJHRpbWVzdGFtcDogdGltZXN0YW1wXG5cdH07XG5cblx0ZnVuY3Rpb24gZGVzZXJpYWxpemVWYWx1ZShzZWxmLCBrZXksIHZhbHVlLCBvcHRpb25zKSB7XG5cdCAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcblx0ICAgIGlmIChvcHRpb25zLnJlbGF4ZWQpIHtcblx0ICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgfSAvLyBpZiBpdCdzIGFuIGludGVnZXIsIHNob3VsZCBpbnRlcnByZXQgYXMgc21hbGxlc3QgQlNPTiBpbnRlZ2VyXG5cdCAgICAvLyB0aGF0IGNhbiByZXByZXNlbnQgaXQgZXhhY3RseS4gKGlmIG91dCBvZiByYW5nZSwgaW50ZXJwcmV0IGFzIGRvdWJsZS4pXG5cblxuXHQgICAgaWYgKE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZSkge1xuXHQgICAgICBpZiAodmFsdWUgPj0gQlNPTl9JTlQzMl9NSU4gJiYgdmFsdWUgPD0gQlNPTl9JTlQzMl9NQVgpIHJldHVybiBuZXcgaW50XzMyKHZhbHVlKTtcblx0ICAgICAgaWYgKHZhbHVlID49IEJTT05fSU5UNjRfTUlOICYmIHZhbHVlIDw9IEJTT05fSU5UNjRfTUFYKSByZXR1cm4gbmV3IGxvbmdfMS5mcm9tTnVtYmVyKHZhbHVlKTtcblx0ICAgIH0gLy8gSWYgdGhlIG51bWJlciBpcyBhIG5vbi1pbnRlZ2VyIG9yIG91dCBvZiBpbnRlZ2VyIHJhbmdlLCBzaG91bGQgaW50ZXJwcmV0IGFzIEJTT04gRG91YmxlLlxuXG5cblx0ICAgIHJldHVybiBuZXcgZG91YmxlXzEodmFsdWUpO1xuXHQgIH0gLy8gZnJvbSBoZXJlIG9uIG91dCB3ZSdyZSBsb29raW5nIGZvciBic29uIHR5cGVzLCBzbyBiYWlsIGlmIGl0cyBub3QgYW4gb2JqZWN0XG5cblxuXHQgIGlmICh2YWx1ZSA9PSBudWxsIHx8IF90eXBlb2YkMih2YWx1ZSkgIT09ICdvYmplY3QnKSByZXR1cm4gdmFsdWU7IC8vIHVwZ3JhZGUgZGVwcmVjYXRlZCB1bmRlZmluZWQgdG8gbnVsbFxuXG5cdCAgaWYgKHZhbHVlLiR1bmRlZmluZWQpIHJldHVybiBudWxsO1xuXHQgIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpLmZpbHRlcihmdW5jdGlvbiAoaykge1xuXHQgICAgcmV0dXJuIGsuc3RhcnRzV2l0aCgnJCcpICYmIHZhbHVlW2tdICE9IG51bGw7XG5cdCAgfSk7XG5cblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcblx0ICAgIHZhciBjID0ga2V5c1RvQ29kZWNzW2tleXNbaV1dO1xuXHQgICAgaWYgKGMpIHJldHVybiBjLmZyb21FeHRlbmRlZEpTT04odmFsdWUsIG9wdGlvbnMpO1xuXHQgIH1cblxuXHQgIGlmICh2YWx1ZS4kZGF0ZSAhPSBudWxsKSB7XG5cdCAgICB2YXIgZCA9IHZhbHVlLiRkYXRlO1xuXHQgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xuXHQgICAgaWYgKHR5cGVvZiBkID09PSAnc3RyaW5nJykgZGF0ZS5zZXRUaW1lKERhdGUucGFyc2UoZCkpO2Vsc2UgaWYgKGxvbmdfMS5pc0xvbmcoZCkpIGRhdGUuc2V0VGltZShkLnRvTnVtYmVyKCkpO2Vsc2UgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJyAmJiBvcHRpb25zLnJlbGF4ZWQpIGRhdGUuc2V0VGltZShkKTtcblx0ICAgIHJldHVybiBkYXRlO1xuXHQgIH1cblxuXHQgIGlmICh2YWx1ZS4kY29kZSAhPSBudWxsKSB7XG5cdCAgICB2YXIgY29weSA9IE9iamVjdC5hc3NpZ24oe30sIHZhbHVlKTtcblxuXHQgICAgaWYgKHZhbHVlLiRzY29wZSkge1xuXHQgICAgICBjb3B5LiRzY29wZSA9IGRlc2VyaWFsaXplVmFsdWUoc2VsZiwgbnVsbCwgdmFsdWUuJHNjb3BlKTtcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIGNvZGUuZnJvbUV4dGVuZGVkSlNPTih2YWx1ZSk7XG5cdCAgfVxuXG5cdCAgaWYgKHZhbHVlLiRyZWYgIT0gbnVsbCB8fCB2YWx1ZS4kZGJQb2ludGVyICE9IG51bGwpIHtcblx0ICAgIHZhciB2ID0gdmFsdWUuJHJlZiA/IHZhbHVlIDogdmFsdWUuJGRiUG9pbnRlcjsgLy8gd2UgcnVuIGludG8gdGhpcyBpbiBhIFwiZGVnZW5lcmF0ZSBFSlNPTlwiIGNhc2UgKHdpdGggJGlkIGFuZCAkcmVmIG9yZGVyIGZsaXBwZWQpXG5cdCAgICAvLyBiZWNhdXNlIG9mIHRoZSBvcmRlciBKU09OLnBhcnNlIGdvZXMgdGhyb3VnaCB0aGUgZG9jdW1lbnRcblxuXHQgICAgaWYgKHYgaW5zdGFuY2VvZiBkYl9yZWYpIHJldHVybiB2O1xuXHQgICAgdmFyIGRvbGxhcktleXMgPSBPYmplY3Qua2V5cyh2KS5maWx0ZXIoZnVuY3Rpb24gKGspIHtcblx0ICAgICAgcmV0dXJuIGsuc3RhcnRzV2l0aCgnJCcpO1xuXHQgICAgfSk7XG5cdCAgICB2YXIgdmFsaWQgPSB0cnVlO1xuXHQgICAgZG9sbGFyS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG5cdCAgICAgIGlmIChbJyRyZWYnLCAnJGlkJywgJyRkYiddLmluZGV4T2YoaykgPT09IC0xKSB2YWxpZCA9IGZhbHNlO1xuXHQgICAgfSk7IC8vIG9ubHkgbWFrZSBEQlJlZiBpZiAkIGtleXMgYXJlIGFsbCB2YWxpZFxuXG5cdCAgICBpZiAodmFsaWQpIHJldHVybiBkYl9yZWYuZnJvbUV4dGVuZGVkSlNPTih2KTtcblx0ICB9XG5cblx0ICByZXR1cm4gdmFsdWU7XG5cdH1cblx0LyoqXG5cdCAqIFBhcnNlIGFuIEV4dGVuZGVkIEpTT04gc3RyaW5nLCBjb25zdHJ1Y3RpbmcgdGhlIEphdmFTY3JpcHQgdmFsdWUgb3Igb2JqZWN0IGRlc2NyaWJlZCBieSB0aGF0XG5cdCAqIHN0cmluZy5cblx0ICpcblx0ICogQG1lbWJlcm9mIEVKU09OXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gT3B0aW9uYWwgc2V0dGluZ3Ncblx0ICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5yZWxheGVkPXRydWVdIEF0dGVtcHQgdG8gcmV0dXJuIG5hdGl2ZSBKUyB0eXBlcyB3aGVyZSBwb3NzaWJsZSwgcmF0aGVyIHRoYW4gQlNPTiB0eXBlcyAoaWYgdHJ1ZSlcblx0ICogQHJldHVybiB7b2JqZWN0fVxuXHQgKlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBjb25zdCB7IEVKU09OIH0gPSByZXF1aXJlKCdic29uJyk7XG5cdCAqIGNvbnN0IHRleHQgPSAneyBcImludDMyXCI6IHsgXCIkbnVtYmVySW50XCI6IFwiMTBcIiB9IH0nO1xuXHQgKlxuXHQgKiAvLyBwcmludHMgeyBpbnQzMjogeyBbU3RyaW5nOiAnMTAnXSBfYnNvbnR5cGU6ICdJbnQzMicsIHZhbHVlOiAnMTAnIH0gfVxuXHQgKiBjb25zb2xlLmxvZyhFSlNPTi5wYXJzZSh0ZXh0LCB7IHJlbGF4ZWQ6IGZhbHNlIH0pKTtcblx0ICpcblx0ICogLy8gcHJpbnRzIHsgaW50MzI6IDEwIH1cblx0ICogY29uc29sZS5sb2coRUpTT04ucGFyc2UodGV4dCkpO1xuXHQgKi9cblxuXG5cdGZ1bmN0aW9uIHBhcnNlKHRleHQsIG9wdGlvbnMpIHtcblx0ICB2YXIgX3RoaXMgPSB0aGlzO1xuXG5cdCAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHtcblx0ICAgIHJlbGF4ZWQ6IHRydWVcblx0ICB9LCBvcHRpb25zKTsgLy8gcmVsYXhlZCBpbXBsaWVzIG5vdCBzdHJpY3RcblxuXHQgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZWxheGVkID09PSAnYm9vbGVhbicpIG9wdGlvbnMuc3RyaWN0ID0gIW9wdGlvbnMucmVsYXhlZDtcblx0ICBpZiAodHlwZW9mIG9wdGlvbnMuc3RyaWN0ID09PSAnYm9vbGVhbicpIG9wdGlvbnMucmVsYXhlZCA9ICFvcHRpb25zLnN0cmljdDtcblx0ICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHQgICAgcmV0dXJuIGRlc2VyaWFsaXplVmFsdWUoX3RoaXMsIGtleSwgdmFsdWUsIG9wdGlvbnMpO1xuXHQgIH0pO1xuXHR9IC8vXG5cdC8vIFNlcmlhbGl6ZXJcblx0Ly9cblx0Ly8gTUFYIElOVDMyIGJvdW5kYXJpZXNcblxuXG5cdHZhciBCU09OX0lOVDMyX01BWCA9IDB4N2ZmZmZmZmYsXG5cdCAgICBCU09OX0lOVDMyX01JTiA9IC0weDgwMDAwMDAwLFxuXHQgICAgQlNPTl9JTlQ2NF9NQVggPSAweDdmZmZmZmZmZmZmZmZmZmYsXG5cdCAgICBCU09OX0lOVDY0X01JTiA9IC0weDgwMDAwMDAwMDAwMDAwMDA7XG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIEJTT04gZG9jdW1lbnQgdG8gYW4gRXh0ZW5kZWQgSlNPTiBzdHJpbmcsIG9wdGlvbmFsbHkgcmVwbGFjaW5nIHZhbHVlcyBpZiBhIHJlcGxhY2VyXG5cdCAqIGZ1bmN0aW9uIGlzIHNwZWNpZmllZCBvciBvcHRpb25hbGx5IGluY2x1ZGluZyBvbmx5IHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcyBpZiBhIHJlcGxhY2VyIGFycmF5XG5cdCAqIGlzIHNwZWNpZmllZC5cblx0ICpcblx0ICogQG1lbWJlcm9mIEVKU09OXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBleHRlbmRlZCBKU09OXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb258YXJyYXl9IFtyZXBsYWNlcl0gQSBmdW5jdGlvbiB0aGF0IGFsdGVycyB0aGUgYmVoYXZpb3Igb2YgdGhlIHN0cmluZ2lmaWNhdGlvbiBwcm9jZXNzLCBvciBhbiBhcnJheSBvZiBTdHJpbmcgYW5kIE51bWJlciBvYmplY3RzIHRoYXQgc2VydmUgYXMgYSB3aGl0ZWxpc3QgZm9yIHNlbGVjdGluZy9maWx0ZXJpbmcgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHZhbHVlIG9iamVjdCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgSlNPTiBzdHJpbmcuIElmIHRoaXMgdmFsdWUgaXMgbnVsbCBvciBub3QgcHJvdmlkZWQsIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgYXJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgSlNPTiBzdHJpbmdcblx0ICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbc3BhY2VdIEEgU3RyaW5nIG9yIE51bWJlciBvYmplY3QgdGhhdCdzIHVzZWQgdG8gaW5zZXJ0IHdoaXRlIHNwYWNlIGludG8gdGhlIG91dHB1dCBKU09OIHN0cmluZyBmb3IgcmVhZGFiaWxpdHkgcHVycG9zZXMuXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gT3B0aW9uYWwgc2V0dGluZ3Ncblx0ICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5yZWxheGVkPXRydWVdIEVuYWJsZWQgRXh0ZW5kZWQgSlNPTidzIGByZWxheGVkYCBtb2RlXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqXG5cdCAqIEBleGFtcGxlXG5cdCAqIGNvbnN0IHsgRUpTT04gfSA9IHJlcXVpcmUoJ2Jzb24nKTtcblx0ICogY29uc3QgSW50MzIgPSByZXF1aXJlKCdtb25nb2RiJykuSW50MzI7XG5cdCAqIGNvbnN0IGRvYyA9IHsgaW50MzI6IG5ldyBJbnQzMigxMCkgfTtcblx0ICpcblx0ICogLy8gcHJpbnRzICd7XCJpbnQzMlwiOntcIiRudW1iZXJJbnRcIjpcIjEwXCJ9fSdcblx0ICogY29uc29sZS5sb2coRUpTT04uc3RyaW5naWZ5KGRvYywgeyByZWxheGVkOiBmYWxzZSB9KSk7XG5cdCAqXG5cdCAqIC8vIHByaW50cyAne1wiaW50MzJcIjoxMH0nXG5cdCAqIGNvbnNvbGUubG9nKEVKU09OLnN0cmluZ2lmeShkb2MpKTtcblx0ICovXG5cblx0ZnVuY3Rpb24gc3RyaW5naWZ5KHZhbHVlLCByZXBsYWNlciwgc3BhY2UsIG9wdGlvbnMpIHtcblx0ICBpZiAoc3BhY2UgIT0gbnVsbCAmJiBfdHlwZW9mJDIoc3BhY2UpID09PSAnb2JqZWN0Jykge1xuXHQgICAgb3B0aW9ucyA9IHNwYWNlO1xuXHQgICAgc3BhY2UgPSAwO1xuXHQgIH1cblxuXHQgIGlmIChyZXBsYWNlciAhPSBudWxsICYmIF90eXBlb2YkMihyZXBsYWNlcikgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHJlcGxhY2VyKSkge1xuXHQgICAgb3B0aW9ucyA9IHJlcGxhY2VyO1xuXHQgICAgcmVwbGFjZXIgPSBudWxsO1xuXHQgICAgc3BhY2UgPSAwO1xuXHQgIH1cblxuXHQgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB7XG5cdCAgICByZWxheGVkOiB0cnVlXG5cdCAgfSwgb3B0aW9ucyk7XG5cdCAgdmFyIGRvYyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gc2VyaWFsaXplQXJyYXkodmFsdWUsIG9wdGlvbnMpIDogc2VyaWFsaXplRG9jdW1lbnQodmFsdWUsIG9wdGlvbnMpO1xuXHQgIHJldHVybiBKU09OLnN0cmluZ2lmeShkb2MsIHJlcGxhY2VyLCBzcGFjZSk7XG5cdH1cblx0LyoqXG5cdCAqIFNlcmlhbGl6ZXMgYW4gb2JqZWN0IHRvIGFuIEV4dGVuZGVkIEpTT04gc3RyaW5nLCBhbmQgcmVwYXJzZSBpdCBhcyBhIEphdmFTY3JpcHQgb2JqZWN0LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2YgRUpTT05cblx0ICogQHBhcmFtIHtvYmplY3R9IGJzb24gVGhlIG9iamVjdCB0byBzZXJpYWxpemVcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBPcHRpb25hbCBzZXR0aW5ncyBwYXNzZWQgdG8gdGhlIGBzdHJpbmdpZnlgIGZ1bmN0aW9uXG5cdCAqIEByZXR1cm4ge29iamVjdH1cblx0ICovXG5cblxuXHRmdW5jdGlvbiBzZXJpYWxpemUoYnNvbiwgb3B0aW9ucykge1xuXHQgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHQgIHJldHVybiBKU09OLnBhcnNlKHN0cmluZ2lmeShic29uLCBvcHRpb25zKSk7XG5cdH1cblx0LyoqXG5cdCAqIERlc2VyaWFsaXplcyBhbiBFeHRlbmRlZCBKU09OIG9iamVjdCBpbnRvIGEgcGxhaW4gSmF2YVNjcmlwdCBvYmplY3Qgd2l0aCBuYXRpdmUvQlNPTiB0eXBlc1xuXHQgKlxuXHQgKiBAbWVtYmVyb2YgRUpTT05cblx0ICogQHBhcmFtIHtvYmplY3R9IGVqc29uIFRoZSBFeHRlbmRlZCBKU09OIG9iamVjdCB0byBkZXNlcmlhbGl6ZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIE9wdGlvbmFsIHNldHRpbmdzIHBhc3NlZCB0byB0aGUgcGFyc2UgbWV0aG9kXG5cdCAqIEByZXR1cm4ge29iamVjdH1cblx0ICovXG5cblxuXHRmdW5jdGlvbiBkZXNlcmlhbGl6ZShlanNvbiwgb3B0aW9ucykge1xuXHQgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHQgIHJldHVybiBwYXJzZShKU09OLnN0cmluZ2lmeShlanNvbiksIG9wdGlvbnMpO1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplQXJyYXkoYXJyYXksIG9wdGlvbnMpIHtcblx0ICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uICh2KSB7XG5cdCAgICByZXR1cm4gc2VyaWFsaXplVmFsdWUodiwgb3B0aW9ucyk7XG5cdCAgfSk7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRJU09TdHJpbmcoZGF0ZSkge1xuXHQgIHZhciBpc29TdHIgPSBkYXRlLnRvSVNPU3RyaW5nKCk7IC8vIHdlIHNob3VsZCBvbmx5IHNob3cgbWlsbGlzZWNvbmRzIGluIHRpbWVzdGFtcCBpZiB0aGV5J3JlIG5vbi16ZXJvXG5cblx0ICByZXR1cm4gZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKSAhPT0gMCA/IGlzb1N0ciA6IGlzb1N0ci5zbGljZSgwLCAtNSkgKyAnWic7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVWYWx1ZSh2YWx1ZSwgb3B0aW9ucykge1xuXHQgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHNlcmlhbGl6ZUFycmF5KHZhbHVlLCBvcHRpb25zKTtcblx0ICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG5cblx0ICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG5cdCAgICB2YXIgZGF0ZU51bSA9IHZhbHVlLmdldFRpbWUoKSxcblx0ICAgICAgICAvLyBpcyBpdCBpbiB5ZWFyIHJhbmdlIDE5NzAtOTk5OT9cblx0ICAgIGluUmFuZ2UgPSBkYXRlTnVtID4gLTEgJiYgZGF0ZU51bSA8IDI1MzQwMjMxODgwMDAwMDtcblx0ICAgIHJldHVybiBvcHRpb25zLnJlbGF4ZWQgJiYgaW5SYW5nZSA/IHtcblx0ICAgICAgJGRhdGU6IGdldElTT1N0cmluZyh2YWx1ZSlcblx0ICAgIH0gOiB7XG5cdCAgICAgICRkYXRlOiB7XG5cdCAgICAgICAgJG51bWJlckxvbmc6IHZhbHVlLmdldFRpbWUoKS50b1N0cmluZygpXG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgfVxuXG5cdCAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgIW9wdGlvbnMucmVsYXhlZCkge1xuXHQgICAgLy8gaXQncyBhbiBpbnRlZ2VyXG5cdCAgICBpZiAoTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlKSB7XG5cdCAgICAgIHZhciBpbnQzMlJhbmdlID0gdmFsdWUgPj0gQlNPTl9JTlQzMl9NSU4gJiYgdmFsdWUgPD0gQlNPTl9JTlQzMl9NQVgsXG5cdCAgICAgICAgICBpbnQ2NFJhbmdlID0gdmFsdWUgPj0gQlNPTl9JTlQ2NF9NSU4gJiYgdmFsdWUgPD0gQlNPTl9JTlQ2NF9NQVg7IC8vIGludGVycHJldCBhcyBiZWluZyBvZiB0aGUgc21hbGxlc3QgQlNPTiBpbnRlZ2VyIHR5cGUgdGhhdCBjYW4gcmVwcmVzZW50IHRoZSBudW1iZXIgZXhhY3RseVxuXG5cdCAgICAgIGlmIChpbnQzMlJhbmdlKSByZXR1cm4ge1xuXHQgICAgICAgICRudW1iZXJJbnQ6IHZhbHVlLnRvU3RyaW5nKClcblx0ICAgICAgfTtcblx0ICAgICAgaWYgKGludDY0UmFuZ2UpIHJldHVybiB7XG5cdCAgICAgICAgJG51bWJlckxvbmc6IHZhbHVlLnRvU3RyaW5nKClcblx0ICAgICAgfTtcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgJG51bWJlckRvdWJsZTogdmFsdWUudG9TdHJpbmcoKVxuXHQgICAgfTtcblx0ICB9XG5cblx0ICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcblx0ICAgIHZhciBmbGFncyA9IHZhbHVlLmZsYWdzO1xuXG5cdCAgICBpZiAoZmxhZ3MgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICBmbGFncyA9IHZhbHVlLnRvU3RyaW5nKCkubWF0Y2goL1tnaW11eV0qJC8pWzBdO1xuXHQgICAgfVxuXG5cdCAgICB2YXIgcnggPSBuZXcgcmVnZXhwKHZhbHVlLnNvdXJjZSwgZmxhZ3MpO1xuXHQgICAgcmV0dXJuIHJ4LnRvRXh0ZW5kZWRKU09OKCk7XG5cdCAgfVxuXG5cdCAgaWYgKHZhbHVlICE9IG51bGwgJiYgX3R5cGVvZiQyKHZhbHVlKSA9PT0gJ29iamVjdCcpIHJldHVybiBzZXJpYWxpemVEb2N1bWVudCh2YWx1ZSwgb3B0aW9ucyk7XG5cdCAgcmV0dXJuIHZhbHVlO1xuXHR9XG5cblx0dmFyIEJTT05fVFlQRV9NQVBQSU5HUyA9IHtcblx0ICBCaW5hcnk6IGZ1bmN0aW9uIEJpbmFyeShvKSB7XG5cdCAgICByZXR1cm4gbmV3IGJpbmFyeShvLnZhbHVlKCksIG8uc3VidHlwZSk7XG5cdCAgfSxcblx0ICBDb2RlOiBmdW5jdGlvbiBDb2RlKG8pIHtcblx0ICAgIHJldHVybiBuZXcgY29kZShvLmNvZGUsIG8uc2NvcGUpO1xuXHQgIH0sXG5cdCAgREJSZWY6IGZ1bmN0aW9uIERCUmVmKG8pIHtcblx0ICAgIHJldHVybiBuZXcgZGJfcmVmKG8uY29sbGVjdGlvbiB8fCBvLm5hbWVzcGFjZSwgby5vaWQsIG8uZGIsIG8uZmllbGRzKTtcblx0ICB9LFxuXHQgIC8vIFwibmFtZXNwYWNlXCIgZm9yIDEueCBsaWJyYXJ5IGJhY2t3YXJkcyBjb21wYXRcblx0ICBEZWNpbWFsMTI4OiBmdW5jdGlvbiBEZWNpbWFsMTI4KG8pIHtcblx0ICAgIHJldHVybiBuZXcgZGVjaW1hbDEyOChvLmJ5dGVzKTtcblx0ICB9LFxuXHQgIERvdWJsZTogZnVuY3Rpb24gRG91YmxlKG8pIHtcblx0ICAgIHJldHVybiBuZXcgZG91YmxlXzEoby52YWx1ZSk7XG5cdCAgfSxcblx0ICBJbnQzMjogZnVuY3Rpb24gSW50MzIobykge1xuXHQgICAgcmV0dXJuIG5ldyBpbnRfMzIoby52YWx1ZSk7XG5cdCAgfSxcblx0ICBMb25nOiBmdW5jdGlvbiBMb25nKG8pIHtcblx0ICAgIHJldHVybiBsb25nXzEuZnJvbUJpdHMoIC8vIHVuZGVyc2NvcmUgdmFyaWFudHMgZm9yIDEueCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHQgICAgby5sb3cgIT0gbnVsbCA/IG8ubG93IDogby5sb3dfLCBvLmxvdyAhPSBudWxsID8gby5oaWdoIDogby5oaWdoXywgby5sb3cgIT0gbnVsbCA/IG8udW5zaWduZWQgOiBvLnVuc2lnbmVkXyk7XG5cdCAgfSxcblx0ICBNYXhLZXk6IGZ1bmN0aW9uIE1heEtleSgpIHtcblx0ICAgIHJldHVybiBuZXcgbWF4X2tleSgpO1xuXHQgIH0sXG5cdCAgTWluS2V5OiBmdW5jdGlvbiBNaW5LZXkoKSB7XG5cdCAgICByZXR1cm4gbmV3IG1pbl9rZXkoKTtcblx0ICB9LFxuXHQgIE9iamVjdElEOiBmdW5jdGlvbiBPYmplY3RJRChvKSB7XG5cdCAgICByZXR1cm4gbmV3IG9iamVjdGlkKG8pO1xuXHQgIH0sXG5cdCAgT2JqZWN0SWQ6IGZ1bmN0aW9uIE9iamVjdElkKG8pIHtcblx0ICAgIHJldHVybiBuZXcgb2JqZWN0aWQobyk7XG5cdCAgfSxcblx0ICAvLyBzdXBwb3J0IDQuMC4wLzQuMC4xIGJlZm9yZSBfYnNvbnR5cGUgd2FzIHJldmVydGVkIGJhY2sgdG8gT2JqZWN0SURcblx0ICBCU09OUmVnRXhwOiBmdW5jdGlvbiBCU09OUmVnRXhwKG8pIHtcblx0ICAgIHJldHVybiBuZXcgcmVnZXhwKG8ucGF0dGVybiwgby5vcHRpb25zKTtcblx0ICB9LFxuXHQgIFN5bWJvbDogZnVuY3Rpb24gU3ltYm9sKG8pIHtcblx0ICAgIHJldHVybiBuZXcgc3ltYm9sKG8udmFsdWUpO1xuXHQgIH0sXG5cdCAgVGltZXN0YW1wOiBmdW5jdGlvbiBUaW1lc3RhbXAobykge1xuXHQgICAgcmV0dXJuIHRpbWVzdGFtcC5mcm9tQml0cyhvLmxvdywgby5oaWdoKTtcblx0ICB9XG5cdH07XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplRG9jdW1lbnQoZG9jLCBvcHRpb25zKSB7XG5cdCAgaWYgKGRvYyA9PSBudWxsIHx8IF90eXBlb2YkMihkb2MpICE9PSAnb2JqZWN0JykgdGhyb3cgbmV3IEVycm9yKCdub3QgYW4gb2JqZWN0IGluc3RhbmNlJyk7XG5cdCAgdmFyIGJzb250eXBlID0gZG9jLl9ic29udHlwZTtcblxuXHQgIGlmICh0eXBlb2YgYnNvbnR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICAvLyBJdCdzIGEgcmVndWxhciBvYmplY3QuIFJlY3Vyc2l2ZWx5IHNlcmlhbGl6ZSBpdHMgcHJvcGVydHkgdmFsdWVzLlxuXHQgICAgdmFyIF9kb2MgPSB7fTtcblxuXHQgICAgZm9yICh2YXIgbmFtZSBpbiBkb2MpIHtcblx0ICAgICAgX2RvY1tuYW1lXSA9IHNlcmlhbGl6ZVZhbHVlKGRvY1tuYW1lXSwgb3B0aW9ucyk7XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiBfZG9jO1xuXHQgIH0gZWxzZSBpZiAodHlwZW9mIGJzb250eXBlID09PSAnc3RyaW5nJykge1xuXHQgICAgLy8gdGhlIFwiZG9jdW1lbnRcIiBpcyByZWFsbHkganVzdCBhIEJTT04gdHlwZSBvYmplY3Rcblx0ICAgIHZhciBfZG9jMiA9IGRvYztcblxuXHQgICAgaWYgKHR5cGVvZiBfZG9jMi50b0V4dGVuZGVkSlNPTiAhPT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAvLyBUaGVyZSdzIG5vIEVKU09OIHNlcmlhbGl6YXRpb24gZnVuY3Rpb24gb24gdGhlIG9iamVjdC4gSXQncyBwcm9iYWJseSBhblxuXHQgICAgICAvLyBvYmplY3QgY3JlYXRlZCBieSBhIHByZXZpb3VzIHZlcnNpb24gb2YgdGhpcyBsaWJyYXJ5IChvciBhbm90aGVyIGxpYnJhcnkpXG5cdCAgICAgIC8vIHRoYXQncyBkdWNrLXR5cGluZyBvYmplY3RzIHRvIGxvb2sgbGlrZSB0aGV5IHdlcmUgZ2VuZXJhdGVkIGJ5IHRoaXMgbGlicmFyeSkuXG5cdCAgICAgIC8vIENvcHkgdGhlIG9iamVjdCBpbnRvIHRoaXMgbGlicmFyeSdzIHZlcnNpb24gb2YgdGhhdCB0eXBlLlxuXHQgICAgICB2YXIgbWFwcGVyID0gQlNPTl9UWVBFX01BUFBJTkdTW2Jzb250eXBlXTtcblxuXHQgICAgICBpZiAoIW1hcHBlcikge1xuXHQgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1VucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJyArIGJzb250eXBlKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIF9kb2MyID0gbWFwcGVyKF9kb2MyKTtcblx0ICAgIH0gLy8gVHdvIEJTT04gdHlwZXMgbWF5IGhhdmUgbmVzdGVkIG9iamVjdHMgdGhhdCBtYXkgbmVlZCB0byBiZSBzZXJpYWxpemVkIHRvb1xuXG5cblx0ICAgIGlmIChic29udHlwZSA9PT0gJ0NvZGUnICYmIF9kb2MyLnNjb3BlKSB7XG5cdCAgICAgIF9kb2MyID0gbmV3IGNvZGUoX2RvYzIuY29kZSwgc2VyaWFsaXplVmFsdWUoX2RvYzIuc2NvcGUsIG9wdGlvbnMpKTtcblx0ICAgIH0gZWxzZSBpZiAoYnNvbnR5cGUgPT09ICdEQlJlZicgJiYgX2RvYzIub2lkKSB7XG5cdCAgICAgIF9kb2MyID0gbmV3IGRiX3JlZihfZG9jMi5jb2xsZWN0aW9uLCBzZXJpYWxpemVWYWx1ZShfZG9jMi5vaWQsIG9wdGlvbnMpLCBfZG9jMi5kYiwgX2RvYzIuZmllbGRzKTtcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIF9kb2MyLnRvRXh0ZW5kZWRKU09OKG9wdGlvbnMpO1xuXHQgIH0gZWxzZSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ19ic29udHlwZSBtdXN0IGJlIGEgc3RyaW5nLCBidXQgd2FzOiAnICsgX3R5cGVvZiQyKGJzb250eXBlKSk7XG5cdCAgfVxuXHR9XG5cblx0dmFyIGV4dGVuZGVkX2pzb24gPSB7XG5cdCAgcGFyc2U6IHBhcnNlLFxuXHQgIGRlc2VyaWFsaXplOiBkZXNlcmlhbGl6ZSxcblx0ICBzZXJpYWxpemU6IHNlcmlhbGl6ZSxcblx0ICBzdHJpbmdpZnk6IHN0cmluZ2lmeVxuXHR9O1xuXG5cdHZhciBGSVJTVF9CSVQgPSAweDgwO1xuXHR2YXIgRklSU1RfVFdPX0JJVFMgPSAweGMwO1xuXHR2YXIgRklSU1RfVEhSRUVfQklUUyA9IDB4ZTA7XG5cdHZhciBGSVJTVF9GT1VSX0JJVFMgPSAweGYwO1xuXHR2YXIgRklSU1RfRklWRV9CSVRTID0gMHhmODtcblx0dmFyIFRXT19CSVRfQ0hBUiA9IDB4YzA7XG5cdHZhciBUSFJFRV9CSVRfQ0hBUiA9IDB4ZTA7XG5cdHZhciBGT1VSX0JJVF9DSEFSID0gMHhmMDtcblx0dmFyIENPTlRJTlVJTkdfQ0hBUiA9IDB4ODA7XG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIGlmIHRoZSBwYXNzZWQgaW4gYnl0ZXMgYXJlIHZhbGlkIHV0Zjhcblx0ICogQHBhcmFtIHtCdWZmZXJ8VWludDhBcnJheX0gYnl0ZXMgQW4gYXJyYXkgb2YgOC1iaXQgYnl0ZXMuIE11c3QgYmUgaW5kZXhhYmxlIGFuZCBoYXZlIGxlbmd0aCBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0ge051bWJlcn0gc3RhcnQgVGhlIGluZGV4IHRvIHN0YXJ0IHZhbGlkYXRpbmdcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGVuZCBUaGUgaW5kZXggdG8gZW5kIHZhbGlkYXRpbmdcblx0ICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsaWQgdXRmOFxuXHQgKi9cblxuXHRmdW5jdGlvbiB2YWxpZGF0ZVV0ZjgoYnl0ZXMsIHN0YXJ0LCBlbmQpIHtcblx0ICB2YXIgY29udGludWF0aW9uID0gMDtcblxuXHQgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAxKSB7XG5cdCAgICB2YXIgYnl0ZSA9IGJ5dGVzW2ldO1xuXG5cdCAgICBpZiAoY29udGludWF0aW9uKSB7XG5cdCAgICAgIGlmICgoYnl0ZSAmIEZJUlNUX1RXT19CSVRTKSAhPT0gQ09OVElOVUlOR19DSEFSKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cblx0ICAgICAgY29udGludWF0aW9uIC09IDE7XG5cdCAgICB9IGVsc2UgaWYgKGJ5dGUgJiBGSVJTVF9CSVQpIHtcblx0ICAgICAgaWYgKChieXRlICYgRklSU1RfVEhSRUVfQklUUykgPT09IFRXT19CSVRfQ0hBUikge1xuXHQgICAgICAgIGNvbnRpbnVhdGlvbiA9IDE7XG5cdCAgICAgIH0gZWxzZSBpZiAoKGJ5dGUgJiBGSVJTVF9GT1VSX0JJVFMpID09PSBUSFJFRV9CSVRfQ0hBUikge1xuXHQgICAgICAgIGNvbnRpbnVhdGlvbiA9IDI7XG5cdCAgICAgIH0gZWxzZSBpZiAoKGJ5dGUgJiBGSVJTVF9GSVZFX0JJVFMpID09PSBGT1VSX0JJVF9DSEFSKSB7XG5cdCAgICAgICAgY29udGludWF0aW9uID0gMztcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cblx0ICByZXR1cm4gIWNvbnRpbnVhdGlvbjtcblx0fVxuXG5cdHZhciB2YWxpZGF0ZVV0ZjhfMSA9IHZhbGlkYXRlVXRmODtcblx0dmFyIHZhbGlkYXRlX3V0ZjggPSB7XG5cdCAgdmFsaWRhdGVVdGY4OiB2YWxpZGF0ZVV0ZjhfMVxuXHR9O1xuXG5cdHZhciBCdWZmZXIkNCA9IGJ1ZmZlci5CdWZmZXI7XG5cdHZhciB2YWxpZGF0ZVV0ZjgkMSA9IHZhbGlkYXRlX3V0ZjgudmFsaWRhdGVVdGY4OyAvLyBJbnRlcm5hbCBsb25nIHZlcnNpb25zXG5cblx0dmFyIEpTX0lOVF9NQVhfTE9ORyA9IGxvbmdfMS5mcm9tTnVtYmVyKGNvbnN0YW50cy5KU19JTlRfTUFYKTtcblx0dmFyIEpTX0lOVF9NSU5fTE9ORyA9IGxvbmdfMS5mcm9tTnVtYmVyKGNvbnN0YW50cy5KU19JTlRfTUlOKTtcblx0dmFyIGZ1bmN0aW9uQ2FjaGUgPSB7fTtcblxuXHRmdW5jdGlvbiBkZXNlcmlhbGl6ZSQxKGJ1ZmZlciQkMSwgb3B0aW9ucywgaXNBcnJheSkge1xuXHQgIG9wdGlvbnMgPSBvcHRpb25zID09IG51bGwgPyB7fSA6IG9wdGlvbnM7XG5cdCAgdmFyIGluZGV4ID0gb3B0aW9ucyAmJiBvcHRpb25zLmluZGV4ID8gb3B0aW9ucy5pbmRleCA6IDA7IC8vIFJlYWQgdGhlIGRvY3VtZW50IHNpemVcblxuXHQgIHZhciBzaXplID0gYnVmZmVyJCQxW2luZGV4XSB8IGJ1ZmZlciQkMVtpbmRleCArIDFdIDw8IDggfCBidWZmZXIkJDFbaW5kZXggKyAyXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCArIDNdIDw8IDI0O1xuXG5cdCAgaWYgKHNpemUgPCA1KSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoXCJic29uIHNpemUgbXVzdCBiZSA+PSA1LCBpcyBcIi5jb25jYXQoc2l6ZSkpO1xuXHQgIH1cblxuXHQgIGlmIChvcHRpb25zLmFsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplICYmIGJ1ZmZlciQkMS5sZW5ndGggPCBzaXplKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoXCJidWZmZXIgbGVuZ3RoIFwiLmNvbmNhdChidWZmZXIkJDEubGVuZ3RoLCBcIiBtdXN0IGJlID49IGJzb24gc2l6ZSBcIikuY29uY2F0KHNpemUpKTtcblx0ICB9XG5cblx0ICBpZiAoIW9wdGlvbnMuYWxsb3dPYmplY3RTbWFsbGVyVGhhbkJ1ZmZlclNpemUgJiYgYnVmZmVyJCQxLmxlbmd0aCAhPT0gc2l6ZSkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKFwiYnVmZmVyIGxlbmd0aCBcIi5jb25jYXQoYnVmZmVyJCQxLmxlbmd0aCwgXCIgbXVzdCA9PT0gYnNvbiBzaXplIFwiKS5jb25jYXQoc2l6ZSkpO1xuXHQgIH1cblxuXHQgIGlmIChzaXplICsgaW5kZXggPiBidWZmZXIkJDEubGVuZ3RoKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoXCIoYnNvbiBzaXplIFwiLmNvbmNhdChzaXplLCBcIiArIG9wdGlvbnMuaW5kZXggXCIpLmNvbmNhdChpbmRleCwgXCIgbXVzdCBiZSA8PSBidWZmZXIgbGVuZ3RoIFwiKS5jb25jYXQoQnVmZmVyJDQuYnl0ZUxlbmd0aChidWZmZXIkJDEpLCBcIilcIikpO1xuXHQgIH0gLy8gSWxsZWdhbCBlbmQgdmFsdWVcblxuXG5cdCAgaWYgKGJ1ZmZlciQkMVtpbmRleCArIHNpemUgLSAxXSAhPT0gMCkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKFwiT25lIG9iamVjdCwgc2l6ZWQgY29ycmVjdGx5LCB3aXRoIGEgc3BvdCBmb3IgYW4gRU9PLCBidXQgdGhlIEVPTyBpc24ndCAweDAwXCIpO1xuXHQgIH0gLy8gU3RhcnQgZGVzZXJpYWxpenRpb25cblxuXG5cdCAgcmV0dXJuIGRlc2VyaWFsaXplT2JqZWN0KGJ1ZmZlciQkMSwgaW5kZXgsIG9wdGlvbnMsIGlzQXJyYXkpO1xuXHR9XG5cblx0ZnVuY3Rpb24gZGVzZXJpYWxpemVPYmplY3QoYnVmZmVyJCQxLCBpbmRleCwgb3B0aW9ucywgaXNBcnJheSkge1xuXHQgIHZhciBldmFsRnVuY3Rpb25zID0gb3B0aW9uc1snZXZhbEZ1bmN0aW9ucyddID09IG51bGwgPyBmYWxzZSA6IG9wdGlvbnNbJ2V2YWxGdW5jdGlvbnMnXTtcblx0ICB2YXIgY2FjaGVGdW5jdGlvbnMgPSBvcHRpb25zWydjYWNoZUZ1bmN0aW9ucyddID09IG51bGwgPyBmYWxzZSA6IG9wdGlvbnNbJ2NhY2hlRnVuY3Rpb25zJ107XG5cdCAgdmFyIGNhY2hlRnVuY3Rpb25zQ3JjMzIgPSBvcHRpb25zWydjYWNoZUZ1bmN0aW9uc0NyYzMyJ10gPT0gbnVsbCA/IGZhbHNlIDogb3B0aW9uc1snY2FjaGVGdW5jdGlvbnNDcmMzMiddO1xuXHQgIGlmICghY2FjaGVGdW5jdGlvbnNDcmMzMikgdmFyIGNyYzMyID0gbnVsbDtcblx0ICB2YXIgZmllbGRzQXNSYXcgPSBvcHRpb25zWydmaWVsZHNBc1JhdyddID09IG51bGwgPyBudWxsIDogb3B0aW9uc1snZmllbGRzQXNSYXcnXTsgLy8gUmV0dXJuIHJhdyBic29uIGJ1ZmZlciBpbnN0ZWFkIG9mIHBhcnNpbmcgaXRcblxuXHQgIHZhciByYXcgPSBvcHRpb25zWydyYXcnXSA9PSBudWxsID8gZmFsc2UgOiBvcHRpb25zWydyYXcnXTsgLy8gUmV0dXJuIEJTT05SZWdFeHAgb2JqZWN0cyBpbnN0ZWFkIG9mIG5hdGl2ZSByZWd1bGFyIGV4cHJlc3Npb25zXG5cblx0ICB2YXIgYnNvblJlZ0V4cCA9IHR5cGVvZiBvcHRpb25zWydic29uUmVnRXhwJ10gPT09ICdib29sZWFuJyA/IG9wdGlvbnNbJ2Jzb25SZWdFeHAnXSA6IGZhbHNlOyAvLyBDb250cm9scyB0aGUgcHJvbW90aW9uIG9mIHZhbHVlcyB2cyB3cmFwcGVyIGNsYXNzZXNcblxuXHQgIHZhciBwcm9tb3RlQnVmZmVycyA9IG9wdGlvbnNbJ3Byb21vdGVCdWZmZXJzJ10gPT0gbnVsbCA/IGZhbHNlIDogb3B0aW9uc1sncHJvbW90ZUJ1ZmZlcnMnXTtcblx0ICB2YXIgcHJvbW90ZUxvbmdzID0gb3B0aW9uc1sncHJvbW90ZUxvbmdzJ10gPT0gbnVsbCA/IHRydWUgOiBvcHRpb25zWydwcm9tb3RlTG9uZ3MnXTtcblx0ICB2YXIgcHJvbW90ZVZhbHVlcyA9IG9wdGlvbnNbJ3Byb21vdGVWYWx1ZXMnXSA9PSBudWxsID8gdHJ1ZSA6IG9wdGlvbnNbJ3Byb21vdGVWYWx1ZXMnXTsgLy8gU2V0IHRoZSBzdGFydCBpbmRleFxuXG5cdCAgdmFyIHN0YXJ0SW5kZXggPSBpbmRleDsgLy8gVmFsaWRhdGUgdGhhdCB3ZSBoYXZlIGF0IGxlYXN0IDQgYnl0ZXMgb2YgYnVmZmVyXG5cblx0ICBpZiAoYnVmZmVyJCQxLmxlbmd0aCA8IDUpIHRocm93IG5ldyBFcnJvcignY29ycnVwdCBic29uIG1lc3NhZ2UgPCA1IGJ5dGVzIGxvbmcnKTsgLy8gUmVhZCB0aGUgZG9jdW1lbnQgc2l6ZVxuXG5cdCAgdmFyIHNpemUgPSBidWZmZXIkJDFbaW5kZXgrK10gfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgOCB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAyNDsgLy8gRW5zdXJlIGJ1ZmZlciBpcyB2YWxpZCBzaXplXG5cblx0ICBpZiAoc2l6ZSA8IDUgfHwgc2l6ZSA+IGJ1ZmZlciQkMS5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignY29ycnVwdCBic29uIG1lc3NhZ2UnKTsgLy8gQ3JlYXRlIGhvbGRpbmcgb2JqZWN0XG5cblx0ICB2YXIgb2JqZWN0ID0gaXNBcnJheSA/IFtdIDoge307IC8vIFVzZWQgZm9yIGFycmF5cyB0byBza2lwIGhhdmluZyB0byBwZXJmb3JtIHV0ZjggZGVjb2RpbmdcblxuXHQgIHZhciBhcnJheUluZGV4ID0gMDtcblx0ICB2YXIgZG9uZSA9IGZhbHNlOyAvLyBXaGlsZSB3ZSBoYXZlIG1vcmUgbGVmdCBkYXRhIGxlZnQga2VlcCBwYXJzaW5nXG5cblx0ICB3aGlsZSAoIWRvbmUpIHtcblx0ICAgIC8vIFJlYWQgdGhlIHR5cGVcblx0ICAgIHZhciBlbGVtZW50VHlwZSA9IGJ1ZmZlciQkMVtpbmRleCsrXTsgLy8gSWYgd2UgZ2V0IGEgemVybyBpdCdzIHRoZSBsYXN0IGJ5dGUsIGV4aXRcblxuXHQgICAgaWYgKGVsZW1lbnRUeXBlID09PSAwKSBicmVhazsgLy8gR2V0IHRoZSBzdGFydCBzZWFyY2ggaW5kZXhcblxuXHQgICAgdmFyIGkgPSBpbmRleDsgLy8gTG9jYXRlIHRoZSBlbmQgb2YgdGhlIGMgc3RyaW5nXG5cblx0ICAgIHdoaWxlIChidWZmZXIkJDFbaV0gIT09IDB4MDAgJiYgaSA8IGJ1ZmZlciQkMS5sZW5ndGgpIHtcblx0ICAgICAgaSsrO1xuXHQgICAgfSAvLyBJZiBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBkb2N1bWVudFxuXG5cblx0ICAgIGlmIChpID49IEJ1ZmZlciQ0LmJ5dGVMZW5ndGgoYnVmZmVyJCQxKSkgdGhyb3cgbmV3IEVycm9yKCdCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nJyk7XG5cdCAgICB2YXIgbmFtZSA9IGlzQXJyYXkgPyBhcnJheUluZGV4KysgOiBidWZmZXIkJDEudG9TdHJpbmcoJ3V0ZjgnLCBpbmRleCwgaSk7XG5cdCAgICBpbmRleCA9IGkgKyAxO1xuXG5cdCAgICBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfU1RSSU5HKSB7XG5cdCAgICAgIHZhciBzdHJpbmdTaXplID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7XG5cdCAgICAgIGlmIChzdHJpbmdTaXplIDw9IDAgfHwgc3RyaW5nU2l6ZSA+IGJ1ZmZlciQkMS5sZW5ndGggLSBpbmRleCB8fCBidWZmZXIkJDFbaW5kZXggKyBzdHJpbmdTaXplIC0gMV0gIT09IDApIHRocm93IG5ldyBFcnJvcignYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbicpO1xuXG5cdCAgICAgIGlmICghdmFsaWRhdGVVdGY4JDEoYnVmZmVyJCQxLCBpbmRleCwgaW5kZXggKyBzdHJpbmdTaXplIC0gMSkpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgVVRGLTggc3RyaW5nIGluIEJTT04gZG9jdW1lbnQnKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIHZhciBzID0gYnVmZmVyJCQxLnRvU3RyaW5nKCd1dGY4JywgaW5kZXgsIGluZGV4ICsgc3RyaW5nU2l6ZSAtIDEpO1xuXHQgICAgICBvYmplY3RbbmFtZV0gPSBzO1xuXHQgICAgICBpbmRleCA9IGluZGV4ICsgc3RyaW5nU2l6ZTtcblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfT0lEKSB7XG5cdCAgICAgIHZhciBvaWQgPSBCdWZmZXIkNC5hbGxvYygxMik7XG5cdCAgICAgIGJ1ZmZlciQkMS5jb3B5KG9pZCwgMCwgaW5kZXgsIGluZGV4ICsgMTIpO1xuXHQgICAgICBvYmplY3RbbmFtZV0gPSBuZXcgb2JqZWN0aWQob2lkKTtcblx0ICAgICAgaW5kZXggPSBpbmRleCArIDEyO1xuXHQgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gY29uc3RhbnRzLkJTT05fREFUQV9JTlQgJiYgcHJvbW90ZVZhbHVlcyA9PT0gZmFsc2UpIHtcblx0ICAgICAgb2JqZWN0W25hbWVdID0gbmV3IGludF8zMihidWZmZXIkJDFbaW5kZXgrK10gfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgOCB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAyNCk7XG5cdCAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBjb25zdGFudHMuQlNPTl9EQVRBX0lOVCkge1xuXHQgICAgICBvYmplY3RbbmFtZV0gPSBidWZmZXIkJDFbaW5kZXgrK10gfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgOCB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAyNDtcblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfTlVNQkVSICYmIHByb21vdGVWYWx1ZXMgPT09IGZhbHNlKSB7XG5cdCAgICAgIG9iamVjdFtuYW1lXSA9IG5ldyBkb3VibGVfMShidWZmZXIkJDEucmVhZERvdWJsZUxFKGluZGV4KSk7XG5cdCAgICAgIGluZGV4ID0gaW5kZXggKyA4O1xuXHQgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gY29uc3RhbnRzLkJTT05fREFUQV9OVU1CRVIpIHtcblx0ICAgICAgb2JqZWN0W25hbWVdID0gYnVmZmVyJCQxLnJlYWREb3VibGVMRShpbmRleCk7XG5cdCAgICAgIGluZGV4ID0gaW5kZXggKyA4O1xuXHQgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gY29uc3RhbnRzLkJTT05fREFUQV9EQVRFKSB7XG5cdCAgICAgIHZhciBsb3dCaXRzID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7XG5cdCAgICAgIHZhciBoaWdoQml0cyA9IGJ1ZmZlciQkMVtpbmRleCsrXSB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCA4IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDE2IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDI0O1xuXHQgICAgICBvYmplY3RbbmFtZV0gPSBuZXcgRGF0ZShuZXcgbG9uZ18xKGxvd0JpdHMsIGhpZ2hCaXRzKS50b051bWJlcigpKTtcblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfQk9PTEVBTikge1xuXHQgICAgICBpZiAoYnVmZmVyJCQxW2luZGV4XSAhPT0gMCAmJiBidWZmZXIkJDFbaW5kZXhdICE9PSAxKSB0aHJvdyBuZXcgRXJyb3IoJ2lsbGVnYWwgYm9vbGVhbiB0eXBlIHZhbHVlJyk7XG5cdCAgICAgIG9iamVjdFtuYW1lXSA9IGJ1ZmZlciQkMVtpbmRleCsrXSA9PT0gMTtcblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfT0JKRUNUKSB7XG5cdCAgICAgIHZhciBfaW5kZXggPSBpbmRleDtcblx0ICAgICAgdmFyIG9iamVjdFNpemUgPSBidWZmZXIkJDFbaW5kZXhdIHwgYnVmZmVyJCQxW2luZGV4ICsgMV0gPDwgOCB8IGJ1ZmZlciQkMVtpbmRleCArIDJdIDw8IDE2IHwgYnVmZmVyJCQxW2luZGV4ICsgM10gPDwgMjQ7XG5cdCAgICAgIGlmIChvYmplY3RTaXplIDw9IDAgfHwgb2JqZWN0U2l6ZSA+IGJ1ZmZlciQkMS5sZW5ndGggLSBpbmRleCkgdGhyb3cgbmV3IEVycm9yKCdiYWQgZW1iZWRkZWQgZG9jdW1lbnQgbGVuZ3RoIGluIGJzb24nKTsgLy8gV2UgaGF2ZSBhIHJhdyB2YWx1ZVxuXG5cdCAgICAgIGlmIChyYXcpIHtcblx0ICAgICAgICBvYmplY3RbbmFtZV0gPSBidWZmZXIkJDEuc2xpY2UoaW5kZXgsIGluZGV4ICsgb2JqZWN0U2l6ZSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgb2JqZWN0W25hbWVdID0gZGVzZXJpYWxpemVPYmplY3QoYnVmZmVyJCQxLCBfaW5kZXgsIG9wdGlvbnMsIGZhbHNlKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIGluZGV4ID0gaW5kZXggKyBvYmplY3RTaXplO1xuXHQgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gY29uc3RhbnRzLkJTT05fREFUQV9BUlJBWSkge1xuXHQgICAgICB2YXIgX2luZGV4MiA9IGluZGV4O1xuXG5cdCAgICAgIHZhciBfb2JqZWN0U2l6ZSA9IGJ1ZmZlciQkMVtpbmRleF0gfCBidWZmZXIkJDFbaW5kZXggKyAxXSA8PCA4IHwgYnVmZmVyJCQxW2luZGV4ICsgMl0gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXggKyAzXSA8PCAyNDtcblxuXHQgICAgICB2YXIgYXJyYXlPcHRpb25zID0gb3B0aW9uczsgLy8gU3RvcCBpbmRleFxuXG5cdCAgICAgIHZhciBzdG9wSW5kZXggPSBpbmRleCArIF9vYmplY3RTaXplOyAvLyBBbGwgZWxlbWVudHMgb2YgYXJyYXkgdG8gYmUgcmV0dXJuZWQgYXMgcmF3IGJzb25cblxuXHQgICAgICBpZiAoZmllbGRzQXNSYXcgJiYgZmllbGRzQXNSYXdbbmFtZV0pIHtcblx0ICAgICAgICBhcnJheU9wdGlvbnMgPSB7fTtcblxuXHQgICAgICAgIGZvciAodmFyIG4gaW4gb3B0aW9ucykge1xuXHQgICAgICAgICAgYXJyYXlPcHRpb25zW25dID0gb3B0aW9uc1tuXTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBhcnJheU9wdGlvbnNbJ3JhdyddID0gdHJ1ZTtcblx0ICAgICAgfVxuXG5cdCAgICAgIG9iamVjdFtuYW1lXSA9IGRlc2VyaWFsaXplT2JqZWN0KGJ1ZmZlciQkMSwgX2luZGV4MiwgYXJyYXlPcHRpb25zLCB0cnVlKTtcblx0ICAgICAgaW5kZXggPSBpbmRleCArIF9vYmplY3RTaXplO1xuXHQgICAgICBpZiAoYnVmZmVyJCQxW2luZGV4IC0gMV0gIT09IDApIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcnJheSB0ZXJtaW5hdG9yIGJ5dGUnKTtcblx0ICAgICAgaWYgKGluZGV4ICE9PSBzdG9wSW5kZXgpIHRocm93IG5ldyBFcnJvcignY29ycnVwdGVkIGFycmF5IGJzb24nKTtcblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfVU5ERUZJTkVEKSB7XG5cdCAgICAgIG9iamVjdFtuYW1lXSA9IHVuZGVmaW5lZDtcblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfTlVMTCkge1xuXHQgICAgICBvYmplY3RbbmFtZV0gPSBudWxsO1xuXHQgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gY29uc3RhbnRzLkJTT05fREFUQV9MT05HKSB7XG5cdCAgICAgIC8vIFVucGFjayB0aGUgbG93IGFuZCBoaWdoIGJpdHNcblx0ICAgICAgdmFyIF9sb3dCaXRzID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7XG5cblx0ICAgICAgdmFyIF9oaWdoQml0cyA9IGJ1ZmZlciQkMVtpbmRleCsrXSB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCA4IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDE2IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDI0O1xuXG5cdCAgICAgIHZhciBsb25nJCQxID0gbmV3IGxvbmdfMShfbG93Qml0cywgX2hpZ2hCaXRzKTsgLy8gUHJvbW90ZSB0aGUgbG9uZyBpZiBwb3NzaWJsZVxuXG5cdCAgICAgIGlmIChwcm9tb3RlTG9uZ3MgJiYgcHJvbW90ZVZhbHVlcyA9PT0gdHJ1ZSkge1xuXHQgICAgICAgIG9iamVjdFtuYW1lXSA9IGxvbmckJDEubGVzc1RoYW5PckVxdWFsKEpTX0lOVF9NQVhfTE9ORykgJiYgbG9uZyQkMS5ncmVhdGVyVGhhbk9yRXF1YWwoSlNfSU5UX01JTl9MT05HKSA/IGxvbmckJDEudG9OdW1iZXIoKSA6IGxvbmckJDE7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgb2JqZWN0W25hbWVdID0gbG9uZyQkMTtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gY29uc3RhbnRzLkJTT05fREFUQV9ERUNJTUFMMTI4KSB7XG5cdCAgICAgIC8vIEJ1ZmZlciB0byBjb250YWluIHRoZSBkZWNpbWFsIGJ5dGVzXG5cdCAgICAgIHZhciBieXRlcyA9IEJ1ZmZlciQ0LmFsbG9jKDE2KTsgLy8gQ29weSB0aGUgbmV4dCAxNiBieXRlcyBpbnRvIHRoZSBieXRlcyBidWZmZXJcblxuXHQgICAgICBidWZmZXIkJDEuY29weShieXRlcywgMCwgaW5kZXgsIGluZGV4ICsgMTYpOyAvLyBVcGRhdGUgaW5kZXhcblxuXHQgICAgICBpbmRleCA9IGluZGV4ICsgMTY7IC8vIEFzc2lnbiB0aGUgbmV3IERlY2ltYWwxMjggdmFsdWVcblxuXHQgICAgICB2YXIgZGVjaW1hbDEyOCQkMSA9IG5ldyBkZWNpbWFsMTI4KGJ5dGVzKTsgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGl2ZSBtYXBwZXIgdXNlIHRoYXRcblxuXHQgICAgICBvYmplY3RbbmFtZV0gPSBkZWNpbWFsMTI4JCQxLnRvT2JqZWN0ID8gZGVjaW1hbDEyOCQkMS50b09iamVjdCgpIDogZGVjaW1hbDEyOCQkMTtcblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfQklOQVJZKSB7XG5cdCAgICAgIHZhciBiaW5hcnlTaXplID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7XG5cdCAgICAgIHZhciB0b3RhbEJpbmFyeVNpemUgPSBiaW5hcnlTaXplO1xuXHQgICAgICB2YXIgc3ViVHlwZSA9IGJ1ZmZlciQkMVtpbmRleCsrXTsgLy8gRGlkIHdlIGhhdmUgYSBuZWdhdGl2ZSBiaW5hcnkgc2l6ZSwgdGhyb3dcblxuXHQgICAgICBpZiAoYmluYXJ5U2l6ZSA8IDApIHRocm93IG5ldyBFcnJvcignTmVnYXRpdmUgYmluYXJ5IHR5cGUgZWxlbWVudCBzaXplIGZvdW5kJyk7IC8vIElzIHRoZSBsZW5ndGggbG9uZ2VyIHRoYW4gdGhlIGRvY3VtZW50XG5cblx0ICAgICAgaWYgKGJpbmFyeVNpemUgPiBCdWZmZXIkNC5ieXRlTGVuZ3RoKGJ1ZmZlciQkMSkpIHRocm93IG5ldyBFcnJvcignQmluYXJ5IHR5cGUgc2l6ZSBsYXJnZXIgdGhhbiBkb2N1bWVudCBzaXplJyk7IC8vIERlY29kZSBhcyByYXcgQnVmZmVyIG9iamVjdCBpZiBvcHRpb25zIHNwZWNpZmllcyBpdFxuXG5cdCAgICAgIGlmIChidWZmZXIkJDFbJ3NsaWNlJ10gIT0gbnVsbCkge1xuXHQgICAgICAgIC8vIElmIHdlIGhhdmUgc3VidHlwZSAyIHNraXAgdGhlIDQgYnl0ZXMgZm9yIHRoZSBzaXplXG5cdCAgICAgICAgaWYgKHN1YlR5cGUgPT09IGJpbmFyeS5TVUJUWVBFX0JZVEVfQVJSQVkpIHtcblx0ICAgICAgICAgIGJpbmFyeVNpemUgPSBidWZmZXIkJDFbaW5kZXgrK10gfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgOCB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAyNDtcblx0ICAgICAgICAgIGlmIChiaW5hcnlTaXplIDwgMCkgdGhyb3cgbmV3IEVycm9yKCdOZWdhdGl2ZSBiaW5hcnkgdHlwZSBlbGVtZW50IHNpemUgZm91bmQgZm9yIHN1YnR5cGUgMHgwMicpO1xuXHQgICAgICAgICAgaWYgKGJpbmFyeVNpemUgPiB0b3RhbEJpbmFyeVNpemUgLSA0KSB0aHJvdyBuZXcgRXJyb3IoJ0JpbmFyeSB0eXBlIHdpdGggc3VidHlwZSAweDAyIGNvbnRhaW5zIHRvIGxvbmcgYmluYXJ5IHNpemUnKTtcblx0ICAgICAgICAgIGlmIChiaW5hcnlTaXplIDwgdG90YWxCaW5hcnlTaXplIC0gNCkgdGhyb3cgbmV3IEVycm9yKCdCaW5hcnkgdHlwZSB3aXRoIHN1YnR5cGUgMHgwMiBjb250YWlucyB0byBzaG9ydCBiaW5hcnkgc2l6ZScpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGlmIChwcm9tb3RlQnVmZmVycyAmJiBwcm9tb3RlVmFsdWVzKSB7XG5cdCAgICAgICAgICBvYmplY3RbbmFtZV0gPSBidWZmZXIkJDEuc2xpY2UoaW5kZXgsIGluZGV4ICsgYmluYXJ5U2l6ZSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIG9iamVjdFtuYW1lXSA9IG5ldyBiaW5hcnkoYnVmZmVyJCQxLnNsaWNlKGluZGV4LCBpbmRleCArIGJpbmFyeVNpemUpLCBzdWJUeXBlKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdmFyIF9idWZmZXIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgVWludDhBcnJheShuZXcgQXJyYXlCdWZmZXIoYmluYXJ5U2l6ZSkpIDogbmV3IEFycmF5KGJpbmFyeVNpemUpOyAvLyBJZiB3ZSBoYXZlIHN1YnR5cGUgMiBza2lwIHRoZSA0IGJ5dGVzIGZvciB0aGUgc2l6ZVxuXG5cblx0ICAgICAgICBpZiAoc3ViVHlwZSA9PT0gYmluYXJ5LlNVQlRZUEVfQllURV9BUlJBWSkge1xuXHQgICAgICAgICAgYmluYXJ5U2l6ZSA9IGJ1ZmZlciQkMVtpbmRleCsrXSB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCA4IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDE2IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDI0O1xuXHQgICAgICAgICAgaWYgKGJpbmFyeVNpemUgPCAwKSB0aHJvdyBuZXcgRXJyb3IoJ05lZ2F0aXZlIGJpbmFyeSB0eXBlIGVsZW1lbnQgc2l6ZSBmb3VuZCBmb3Igc3VidHlwZSAweDAyJyk7XG5cdCAgICAgICAgICBpZiAoYmluYXJ5U2l6ZSA+IHRvdGFsQmluYXJ5U2l6ZSAtIDQpIHRocm93IG5ldyBFcnJvcignQmluYXJ5IHR5cGUgd2l0aCBzdWJ0eXBlIDB4MDIgY29udGFpbnMgdG8gbG9uZyBiaW5hcnkgc2l6ZScpO1xuXHQgICAgICAgICAgaWYgKGJpbmFyeVNpemUgPCB0b3RhbEJpbmFyeVNpemUgLSA0KSB0aHJvdyBuZXcgRXJyb3IoJ0JpbmFyeSB0eXBlIHdpdGggc3VidHlwZSAweDAyIGNvbnRhaW5zIHRvIHNob3J0IGJpbmFyeSBzaXplJyk7XG5cdCAgICAgICAgfSAvLyBDb3B5IHRoZSBkYXRhXG5cblxuXHQgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiaW5hcnlTaXplOyBpKyspIHtcblx0ICAgICAgICAgIF9idWZmZXJbaV0gPSBidWZmZXIkJDFbaW5kZXggKyBpXTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBpZiAocHJvbW90ZUJ1ZmZlcnMgJiYgcHJvbW90ZVZhbHVlcykge1xuXHQgICAgICAgICAgb2JqZWN0W25hbWVdID0gX2J1ZmZlcjtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgb2JqZWN0W25hbWVdID0gbmV3IGJpbmFyeShfYnVmZmVyLCBzdWJUeXBlKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0gLy8gVXBkYXRlIHRoZSBpbmRleFxuXG5cblx0ICAgICAgaW5kZXggPSBpbmRleCArIGJpbmFyeVNpemU7XG5cdCAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBjb25zdGFudHMuQlNPTl9EQVRBX1JFR0VYUCAmJiBic29uUmVnRXhwID09PSBmYWxzZSkge1xuXHQgICAgICAvLyBHZXQgdGhlIHN0YXJ0IHNlYXJjaCBpbmRleFxuXHQgICAgICBpID0gaW5kZXg7IC8vIExvY2F0ZSB0aGUgZW5kIG9mIHRoZSBjIHN0cmluZ1xuXG5cdCAgICAgIHdoaWxlIChidWZmZXIkJDFbaV0gIT09IDB4MDAgJiYgaSA8IGJ1ZmZlciQkMS5sZW5ndGgpIHtcblx0ICAgICAgICBpKys7XG5cdCAgICAgIH0gLy8gSWYgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgZG9jdW1lbnRcblxuXG5cdCAgICAgIGlmIChpID49IGJ1ZmZlciQkMS5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZycpOyAvLyBSZXR1cm4gdGhlIEMgc3RyaW5nXG5cblx0ICAgICAgdmFyIHNvdXJjZSA9IGJ1ZmZlciQkMS50b1N0cmluZygndXRmOCcsIGluZGV4LCBpKTsgLy8gQ3JlYXRlIHRoZSByZWdleHBcblxuXHQgICAgICBpbmRleCA9IGkgKyAxOyAvLyBHZXQgdGhlIHN0YXJ0IHNlYXJjaCBpbmRleFxuXG5cdCAgICAgIGkgPSBpbmRleDsgLy8gTG9jYXRlIHRoZSBlbmQgb2YgdGhlIGMgc3RyaW5nXG5cblx0ICAgICAgd2hpbGUgKGJ1ZmZlciQkMVtpXSAhPT0gMHgwMCAmJiBpIDwgYnVmZmVyJCQxLmxlbmd0aCkge1xuXHQgICAgICAgIGkrKztcblx0ICAgICAgfSAvLyBJZiBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBkb2N1bWVudFxuXG5cblx0ICAgICAgaWYgKGkgPj0gYnVmZmVyJCQxLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nJyk7IC8vIFJldHVybiB0aGUgQyBzdHJpbmdcblxuXHQgICAgICB2YXIgcmVnRXhwT3B0aW9ucyA9IGJ1ZmZlciQkMS50b1N0cmluZygndXRmOCcsIGluZGV4LCBpKTtcblx0ICAgICAgaW5kZXggPSBpICsgMTsgLy8gRm9yIGVhY2ggb3B0aW9uIGFkZCB0aGUgY29ycmVzcG9uZGluZyBvbmUgZm9yIGphdmFzY3JpcHRcblxuXHQgICAgICB2YXIgb3B0aW9uc0FycmF5ID0gbmV3IEFycmF5KHJlZ0V4cE9wdGlvbnMubGVuZ3RoKTsgLy8gUGFyc2Ugb3B0aW9uc1xuXG5cdCAgICAgIGZvciAoaSA9IDA7IGkgPCByZWdFeHBPcHRpb25zLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgc3dpdGNoIChyZWdFeHBPcHRpb25zW2ldKSB7XG5cdCAgICAgICAgICBjYXNlICdtJzpcblx0ICAgICAgICAgICAgb3B0aW9uc0FycmF5W2ldID0gJ20nO1xuXHQgICAgICAgICAgICBicmVhaztcblxuXHQgICAgICAgICAgY2FzZSAncyc6XG5cdCAgICAgICAgICAgIG9wdGlvbnNBcnJheVtpXSA9ICdnJztcblx0ICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgIGNhc2UgJ2knOlxuXHQgICAgICAgICAgICBvcHRpb25zQXJyYXlbaV0gPSAnaSc7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXG5cdCAgICAgIG9iamVjdFtuYW1lXSA9IG5ldyBSZWdFeHAoc291cmNlLCBvcHRpb25zQXJyYXkuam9pbignJykpO1xuXHQgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gY29uc3RhbnRzLkJTT05fREFUQV9SRUdFWFAgJiYgYnNvblJlZ0V4cCA9PT0gdHJ1ZSkge1xuXHQgICAgICAvLyBHZXQgdGhlIHN0YXJ0IHNlYXJjaCBpbmRleFxuXHQgICAgICBpID0gaW5kZXg7IC8vIExvY2F0ZSB0aGUgZW5kIG9mIHRoZSBjIHN0cmluZ1xuXG5cdCAgICAgIHdoaWxlIChidWZmZXIkJDFbaV0gIT09IDB4MDAgJiYgaSA8IGJ1ZmZlciQkMS5sZW5ndGgpIHtcblx0ICAgICAgICBpKys7XG5cdCAgICAgIH0gLy8gSWYgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgZG9jdW1lbnRcblxuXG5cdCAgICAgIGlmIChpID49IGJ1ZmZlciQkMS5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZycpOyAvLyBSZXR1cm4gdGhlIEMgc3RyaW5nXG5cblx0ICAgICAgdmFyIF9zb3VyY2UgPSBidWZmZXIkJDEudG9TdHJpbmcoJ3V0ZjgnLCBpbmRleCwgaSk7XG5cblx0ICAgICAgaW5kZXggPSBpICsgMTsgLy8gR2V0IHRoZSBzdGFydCBzZWFyY2ggaW5kZXhcblxuXHQgICAgICBpID0gaW5kZXg7IC8vIExvY2F0ZSB0aGUgZW5kIG9mIHRoZSBjIHN0cmluZ1xuXG5cdCAgICAgIHdoaWxlIChidWZmZXIkJDFbaV0gIT09IDB4MDAgJiYgaSA8IGJ1ZmZlciQkMS5sZW5ndGgpIHtcblx0ICAgICAgICBpKys7XG5cdCAgICAgIH0gLy8gSWYgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgZG9jdW1lbnRcblxuXG5cdCAgICAgIGlmIChpID49IGJ1ZmZlciQkMS5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZycpOyAvLyBSZXR1cm4gdGhlIEMgc3RyaW5nXG5cblx0ICAgICAgdmFyIF9yZWdFeHBPcHRpb25zID0gYnVmZmVyJCQxLnRvU3RyaW5nKCd1dGY4JywgaW5kZXgsIGkpO1xuXG5cdCAgICAgIGluZGV4ID0gaSArIDE7IC8vIFNldCB0aGUgb2JqZWN0XG5cblx0ICAgICAgb2JqZWN0W25hbWVdID0gbmV3IHJlZ2V4cChfc291cmNlLCBfcmVnRXhwT3B0aW9ucyk7XG5cdCAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBjb25zdGFudHMuQlNPTl9EQVRBX1NZTUJPTCkge1xuXHQgICAgICB2YXIgX3N0cmluZ1NpemUgPSBidWZmZXIkJDFbaW5kZXgrK10gfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgOCB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAyNDtcblxuXHQgICAgICBpZiAoX3N0cmluZ1NpemUgPD0gMCB8fCBfc3RyaW5nU2l6ZSA+IGJ1ZmZlciQkMS5sZW5ndGggLSBpbmRleCB8fCBidWZmZXIkJDFbaW5kZXggKyBfc3RyaW5nU2l6ZSAtIDFdICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24nKTsgLy8gc3ltYm9sIGlzIGRlcHJlY2F0ZWQgLSB1cGdyYWRlIHRvIHN0cmluZy5cblxuXHQgICAgICBvYmplY3RbbmFtZV0gPSBidWZmZXIkJDEudG9TdHJpbmcoJ3V0ZjgnLCBpbmRleCwgaW5kZXggKyBfc3RyaW5nU2l6ZSAtIDEpO1xuXHQgICAgICBpbmRleCA9IGluZGV4ICsgX3N0cmluZ1NpemU7XG5cdCAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBjb25zdGFudHMuQlNPTl9EQVRBX1RJTUVTVEFNUCkge1xuXHQgICAgICB2YXIgX2xvd0JpdHMyID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7XG5cblx0ICAgICAgdmFyIF9oaWdoQml0czIgPSBidWZmZXIkJDFbaW5kZXgrK10gfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgOCB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAyNDtcblxuXHQgICAgICBvYmplY3RbbmFtZV0gPSBuZXcgdGltZXN0YW1wKF9sb3dCaXRzMiwgX2hpZ2hCaXRzMik7XG5cdCAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBjb25zdGFudHMuQlNPTl9EQVRBX01JTl9LRVkpIHtcblx0ICAgICAgb2JqZWN0W25hbWVdID0gbmV3IG1pbl9rZXkoKTtcblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfTUFYX0tFWSkge1xuXHQgICAgICBvYmplY3RbbmFtZV0gPSBuZXcgbWF4X2tleSgpO1xuXHQgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gY29uc3RhbnRzLkJTT05fREFUQV9DT0RFKSB7XG5cdCAgICAgIHZhciBfc3RyaW5nU2l6ZTIgPSBidWZmZXIkJDFbaW5kZXgrK10gfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgOCB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAyNDtcblxuXHQgICAgICBpZiAoX3N0cmluZ1NpemUyIDw9IDAgfHwgX3N0cmluZ1NpemUyID4gYnVmZmVyJCQxLmxlbmd0aCAtIGluZGV4IHx8IGJ1ZmZlciQkMVtpbmRleCArIF9zdHJpbmdTaXplMiAtIDFdICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24nKTtcblx0ICAgICAgdmFyIGZ1bmN0aW9uU3RyaW5nID0gYnVmZmVyJCQxLnRvU3RyaW5nKCd1dGY4JywgaW5kZXgsIGluZGV4ICsgX3N0cmluZ1NpemUyIC0gMSk7IC8vIElmIHdlIGFyZSBldmFsdWF0aW5nIHRoZSBmdW5jdGlvbnNcblxuXHQgICAgICBpZiAoZXZhbEZ1bmN0aW9ucykge1xuXHQgICAgICAgIC8vIElmIHdlIGhhdmUgY2FjaGUgZW5hYmxlZCBsZXQncyBsb29rIGZvciB0aGUgbWQ1IG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgY2FjaGVcblx0ICAgICAgICBpZiAoY2FjaGVGdW5jdGlvbnMpIHtcblx0ICAgICAgICAgIHZhciBoYXNoID0gY2FjaGVGdW5jdGlvbnNDcmMzMiA/IGNyYzMyKGZ1bmN0aW9uU3RyaW5nKSA6IGZ1bmN0aW9uU3RyaW5nOyAvLyBHb3QgdG8gZG8gdGhpcyB0byBhdm9pZCBWOCBkZW9wdGltaXppbmcgdGhlIGNhbGwgZHVlIHRvIGZpbmRpbmcgZXZhbFxuXG5cdCAgICAgICAgICBvYmplY3RbbmFtZV0gPSBpc29sYXRlRXZhbFdpdGhIYXNoKGZ1bmN0aW9uQ2FjaGUsIGhhc2gsIGZ1bmN0aW9uU3RyaW5nLCBvYmplY3QpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBvYmplY3RbbmFtZV0gPSBpc29sYXRlRXZhbChmdW5jdGlvblN0cmluZyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIG9iamVjdFtuYW1lXSA9IG5ldyBjb2RlKGZ1bmN0aW9uU3RyaW5nKTtcblx0ICAgICAgfSAvLyBVcGRhdGUgcGFyc2UgaW5kZXggcG9zaXRpb25cblxuXG5cdCAgICAgIGluZGV4ID0gaW5kZXggKyBfc3RyaW5nU2l6ZTI7XG5cdCAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBjb25zdGFudHMuQlNPTl9EQVRBX0NPREVfV19TQ09QRSkge1xuXHQgICAgICB2YXIgdG90YWxTaXplID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7IC8vIEVsZW1lbnQgY2Fubm90IGJlIHNob3J0ZXIgdGhhbiB0b3RhbFNpemUgKyBzdHJpbmdTaXplICsgZG9jdW1lbnRTaXplICsgdGVybWluYXRvclxuXG5cdCAgICAgIGlmICh0b3RhbFNpemUgPCA0ICsgNCArIDQgKyAxKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBzaG9ydGVyIG1pbmltdW0gZXhwZWN0ZWQgbGVuZ3RoJyk7XG5cdCAgICAgIH0gLy8gR2V0IHRoZSBjb2RlIHN0cmluZyBzaXplXG5cblxuXHQgICAgICB2YXIgX3N0cmluZ1NpemUzID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7IC8vIENoZWNrIGlmIHdlIGhhdmUgYSB2YWxpZCBzdHJpbmdcblxuXG5cdCAgICAgIGlmIChfc3RyaW5nU2l6ZTMgPD0gMCB8fCBfc3RyaW5nU2l6ZTMgPiBidWZmZXIkJDEubGVuZ3RoIC0gaW5kZXggfHwgYnVmZmVyJCQxW2luZGV4ICsgX3N0cmluZ1NpemUzIC0gMV0gIT09IDApIHRocm93IG5ldyBFcnJvcignYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbicpOyAvLyBKYXZhc2NyaXB0IGZ1bmN0aW9uXG5cblx0ICAgICAgdmFyIF9mdW5jdGlvblN0cmluZyA9IGJ1ZmZlciQkMS50b1N0cmluZygndXRmOCcsIGluZGV4LCBpbmRleCArIF9zdHJpbmdTaXplMyAtIDEpOyAvLyBVcGRhdGUgcGFyc2UgaW5kZXggcG9zaXRpb25cblxuXG5cdCAgICAgIGluZGV4ID0gaW5kZXggKyBfc3RyaW5nU2l6ZTM7IC8vIFBhcnNlIHRoZSBlbGVtZW50XG5cblx0ICAgICAgdmFyIF9pbmRleDMgPSBpbmRleDsgLy8gRGVjb2RlIHRoZSBzaXplIG9mIHRoZSBvYmplY3QgZG9jdW1lbnRcblxuXHQgICAgICB2YXIgX29iamVjdFNpemUyID0gYnVmZmVyJCQxW2luZGV4XSB8IGJ1ZmZlciQkMVtpbmRleCArIDFdIDw8IDggfCBidWZmZXIkJDFbaW5kZXggKyAyXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCArIDNdIDw8IDI0OyAvLyBEZWNvZGUgdGhlIHNjb3BlIG9iamVjdFxuXG5cblx0ICAgICAgdmFyIHNjb3BlT2JqZWN0ID0gZGVzZXJpYWxpemVPYmplY3QoYnVmZmVyJCQxLCBfaW5kZXgzLCBvcHRpb25zLCBmYWxzZSk7IC8vIEFkanVzdCB0aGUgaW5kZXhcblxuXHQgICAgICBpbmRleCA9IGluZGV4ICsgX29iamVjdFNpemUyOyAvLyBDaGVjayBpZiBmaWVsZCBsZW5ndGggaXMgdG8gc2hvcnRcblxuXHQgICAgICBpZiAodG90YWxTaXplIDwgNCArIDQgKyBfb2JqZWN0U2l6ZTIgKyBfc3RyaW5nU2l6ZTMpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvZGVfd19zY29wZSB0b3RhbCBzaXplIGlzIHRvIHNob3J0LCB0cnVuY2F0aW5nIHNjb3BlJyk7XG5cdCAgICAgIH0gLy8gQ2hlY2sgaWYgdG90YWxTaXplIGZpZWxkIGlzIHRvIGxvbmdcblxuXG5cdCAgICAgIGlmICh0b3RhbFNpemUgPiA0ICsgNCArIF9vYmplY3RTaXplMiArIF9zdHJpbmdTaXplMykge1xuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcignY29kZV93X3Njb3BlIHRvdGFsIHNpemUgaXMgdG8gbG9uZywgY2xpcHMgb3V0ZXIgZG9jdW1lbnQnKTtcblx0ICAgICAgfSAvLyBJZiB3ZSBhcmUgZXZhbHVhdGluZyB0aGUgZnVuY3Rpb25zXG5cblxuXHQgICAgICBpZiAoZXZhbEZ1bmN0aW9ucykge1xuXHQgICAgICAgIC8vIElmIHdlIGhhdmUgY2FjaGUgZW5hYmxlZCBsZXQncyBsb29rIGZvciB0aGUgbWQ1IG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgY2FjaGVcblx0ICAgICAgICBpZiAoY2FjaGVGdW5jdGlvbnMpIHtcblx0ICAgICAgICAgIHZhciBfaGFzaCA9IGNhY2hlRnVuY3Rpb25zQ3JjMzIgPyBjcmMzMihfZnVuY3Rpb25TdHJpbmcpIDogX2Z1bmN0aW9uU3RyaW5nOyAvLyBHb3QgdG8gZG8gdGhpcyB0byBhdm9pZCBWOCBkZW9wdGltaXppbmcgdGhlIGNhbGwgZHVlIHRvIGZpbmRpbmcgZXZhbFxuXG5cblx0ICAgICAgICAgIG9iamVjdFtuYW1lXSA9IGlzb2xhdGVFdmFsV2l0aEhhc2goZnVuY3Rpb25DYWNoZSwgX2hhc2gsIF9mdW5jdGlvblN0cmluZywgb2JqZWN0KTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgb2JqZWN0W25hbWVdID0gaXNvbGF0ZUV2YWwoX2Z1bmN0aW9uU3RyaW5nKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBvYmplY3RbbmFtZV0uc2NvcGUgPSBzY29wZU9iamVjdDtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBvYmplY3RbbmFtZV0gPSBuZXcgY29kZShfZnVuY3Rpb25TdHJpbmcsIHNjb3BlT2JqZWN0KTtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gY29uc3RhbnRzLkJTT05fREFUQV9EQlBPSU5URVIpIHtcblx0ICAgICAgLy8gR2V0IHRoZSBjb2RlIHN0cmluZyBzaXplXG5cdCAgICAgIHZhciBfc3RyaW5nU2l6ZTQgPSBidWZmZXIkJDFbaW5kZXgrK10gfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgOCB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAyNDsgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHZhbGlkIHN0cmluZ1xuXG5cblx0ICAgICAgaWYgKF9zdHJpbmdTaXplNCA8PSAwIHx8IF9zdHJpbmdTaXplNCA+IGJ1ZmZlciQkMS5sZW5ndGggLSBpbmRleCB8fCBidWZmZXIkJDFbaW5kZXggKyBfc3RyaW5nU2l6ZTQgLSAxXSAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdiYWQgc3RyaW5nIGxlbmd0aCBpbiBic29uJyk7IC8vIE5hbWVzcGFjZVxuXG5cdCAgICAgIGlmICghdmFsaWRhdGVVdGY4JDEoYnVmZmVyJCQxLCBpbmRleCwgaW5kZXggKyBfc3RyaW5nU2l6ZTQgLSAxKSkge1xuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBVVEYtOCBzdHJpbmcgaW4gQlNPTiBkb2N1bWVudCcpO1xuXHQgICAgICB9XG5cblx0ICAgICAgdmFyIG5hbWVzcGFjZSA9IGJ1ZmZlciQkMS50b1N0cmluZygndXRmOCcsIGluZGV4LCBpbmRleCArIF9zdHJpbmdTaXplNCAtIDEpOyAvLyBVcGRhdGUgcGFyc2UgaW5kZXggcG9zaXRpb25cblxuXHQgICAgICBpbmRleCA9IGluZGV4ICsgX3N0cmluZ1NpemU0OyAvLyBSZWFkIHRoZSBvaWRcblxuXHQgICAgICB2YXIgb2lkQnVmZmVyID0gQnVmZmVyJDQuYWxsb2MoMTIpO1xuXHQgICAgICBidWZmZXIkJDEuY29weShvaWRCdWZmZXIsIDAsIGluZGV4LCBpbmRleCArIDEyKTtcblxuXHQgICAgICB2YXIgX29pZCA9IG5ldyBvYmplY3RpZChvaWRCdWZmZXIpOyAvLyBVcGRhdGUgdGhlIGluZGV4XG5cblxuXHQgICAgICBpbmRleCA9IGluZGV4ICsgMTI7IC8vIFVwZ3JhZGUgdG8gREJSZWYgdHlwZVxuXG5cdCAgICAgIG9iamVjdFtuYW1lXSA9IG5ldyBkYl9yZWYobmFtZXNwYWNlLCBfb2lkKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcignRGV0ZWN0ZWQgdW5rbm93biBCU09OIHR5cGUgJyArIGVsZW1lbnRUeXBlLnRvU3RyaW5nKDE2KSArICcgZm9yIGZpZWxkbmFtZSBcIicgKyBuYW1lICsgJ1wiLCBhcmUgeW91IHVzaW5nIHRoZSBsYXRlc3QgQlNPTiBwYXJzZXI/Jyk7XG5cdCAgICB9XG5cdCAgfSAvLyBDaGVjayBpZiB0aGUgZGVzZXJpYWxpemF0aW9uIHdhcyBhZ2FpbnN0IGEgdmFsaWQgYXJyYXkvb2JqZWN0XG5cblxuXHQgIGlmIChzaXplICE9PSBpbmRleCAtIHN0YXJ0SW5kZXgpIHtcblx0ICAgIGlmIChpc0FycmF5KSB0aHJvdyBuZXcgRXJyb3IoJ2NvcnJ1cHQgYXJyYXkgYnNvbicpO1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdjb3JydXB0IG9iamVjdCBic29uJyk7XG5cdCAgfSAvLyBjaGVjayBpZiBvYmplY3QncyAkIGtleXMgYXJlIHRob3NlIG9mIGEgREJSZWZcblxuXG5cdCAgdmFyIGRvbGxhcktleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpLmZpbHRlcihmdW5jdGlvbiAoaykge1xuXHQgICAgcmV0dXJuIGsuc3RhcnRzV2l0aCgnJCcpO1xuXHQgIH0pO1xuXHQgIHZhciB2YWxpZCA9IHRydWU7XG5cdCAgZG9sbGFyS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG5cdCAgICBpZiAoWyckcmVmJywgJyRpZCcsICckZGInXS5pbmRleE9mKGspID09PSAtMSkgdmFsaWQgPSBmYWxzZTtcblx0ICB9KTsgLy8gaWYgYSAka2V5IG5vdCBpbiBcIiRyZWZcIiwgXCIkaWRcIiwgXCIkZGJcIiwgZG9uJ3QgbWFrZSBhIERCUmVmXG5cblx0ICBpZiAoIXZhbGlkKSByZXR1cm4gb2JqZWN0O1xuXG5cdCAgaWYgKG9iamVjdFsnJGlkJ10gIT0gbnVsbCAmJiBvYmplY3RbJyRyZWYnXSAhPSBudWxsKSB7XG5cdCAgICB2YXIgY29weSA9IE9iamVjdC5hc3NpZ24oe30sIG9iamVjdCk7XG5cdCAgICBkZWxldGUgY29weS4kcmVmO1xuXHQgICAgZGVsZXRlIGNvcHkuJGlkO1xuXHQgICAgZGVsZXRlIGNvcHkuJGRiO1xuXHQgICAgcmV0dXJuIG5ldyBkYl9yZWYob2JqZWN0LiRyZWYsIG9iamVjdC4kaWQsIG9iamVjdC4kZGIgfHwgbnVsbCwgY29weSk7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIG9iamVjdDtcblx0fVxuXHQvKipcblx0ICogRW5zdXJlIGV2YWwgaXMgaXNvbGF0ZWQuXG5cdCAqXG5cdCAqIEBpZ25vcmVcblx0ICogQGFwaSBwcml2YXRlXG5cdCAqL1xuXG5cblx0ZnVuY3Rpb24gaXNvbGF0ZUV2YWxXaXRoSGFzaChmdW5jdGlvbkNhY2hlLCBoYXNoLCBmdW5jdGlvblN0cmluZywgb2JqZWN0KSB7XG5cdCAgLy8gQ29udGFpbnMgdGhlIHZhbHVlIHdlIGFyZSBnb2luZyB0byBzZXRcblx0ICB2YXIgdmFsdWUgPSBudWxsOyAvLyBDaGVjayBmb3IgY2FjaGUgaGl0LCBldmFsIGlmIG1pc3NpbmcgYW5kIHJldHVybiBjYWNoZWQgZnVuY3Rpb25cblxuXHQgIGlmIChmdW5jdGlvbkNhY2hlW2hhc2hdID09IG51bGwpIHtcblx0ICAgIGV2YWwoJ3ZhbHVlID0gJyArIGZ1bmN0aW9uU3RyaW5nKTtcblx0ICAgIGZ1bmN0aW9uQ2FjaGVbaGFzaF0gPSB2YWx1ZTtcblx0ICB9IC8vIFNldCB0aGUgb2JqZWN0XG5cblxuXHQgIHJldHVybiBmdW5jdGlvbkNhY2hlW2hhc2hdLmJpbmQob2JqZWN0KTtcblx0fVxuXHQvKipcblx0ICogRW5zdXJlIGV2YWwgaXMgaXNvbGF0ZWQuXG5cdCAqXG5cdCAqIEBpZ25vcmVcblx0ICogQGFwaSBwcml2YXRlXG5cdCAqL1xuXG5cblx0ZnVuY3Rpb24gaXNvbGF0ZUV2YWwoZnVuY3Rpb25TdHJpbmcpIHtcblx0ICAvLyBDb250YWlucyB0aGUgdmFsdWUgd2UgYXJlIGdvaW5nIHRvIHNldFxuXHQgIHZhciB2YWx1ZSA9IG51bGw7IC8vIEV2YWwgdGhlIGZ1bmN0aW9uXG5cblx0ICBldmFsKCd2YWx1ZSA9ICcgKyBmdW5jdGlvblN0cmluZyk7XG5cdCAgcmV0dXJuIHZhbHVlO1xuXHR9XG5cblx0dmFyIGRlc2VyaWFsaXplciA9IGRlc2VyaWFsaXplJDE7XG5cblx0Ly8gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblx0Ly9cblx0Ly8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG5cdC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXHQvL1xuXHQvLyAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG5cdC8vICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG5cdC8vXG5cdC8vICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcblx0Ly8gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuXHQvLyAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblx0Ly9cblx0Ly8gICogTmVpdGhlciB0aGUgbmFtZSBvZiBGYWlyIE9ha3MgTGFicywgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcblx0Ly8gICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG5cdC8vICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuXHQvL1xuXHQvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuXHQvLyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG5cdC8vIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG5cdC8vIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkVcblx0Ly8gTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuXHQvLyBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuXHQvLyBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Ncblx0Ly8gSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cblx0Ly8gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcblx0Ly8gQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcblx0Ly8gUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG5cdC8vXG5cdC8vXG5cdC8vIE1vZGlmaWNhdGlvbnMgdG8gd3JpdGVJRUVFNzU0IHRvIHN1cHBvcnQgbmVnYXRpdmUgemVyb2VzIG1hZGUgYnkgQnJpYW4gV2hpdGVcblxuXHRmdW5jdGlvbiByZWFkSUVFRTc1NChidWZmZXIkJDEsIG9mZnNldCwgZW5kaWFuLCBtTGVuLCBuQnl0ZXMpIHtcblx0ICB2YXIgZSxcblx0ICAgICAgbSxcblx0ICAgICAgYkJFID0gZW5kaWFuID09PSAnYmlnJyxcblx0ICAgICAgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMSxcblx0ICAgICAgZU1heCA9ICgxIDw8IGVMZW4pIC0gMSxcblx0ICAgICAgZUJpYXMgPSBlTWF4ID4+IDEsXG5cdCAgICAgIG5CaXRzID0gLTcsXG5cdCAgICAgIGkgPSBiQkUgPyAwIDogbkJ5dGVzIC0gMSxcblx0ICAgICAgZCA9IGJCRSA/IDEgOiAtMSxcblx0ICAgICAgcyA9IGJ1ZmZlciQkMVtvZmZzZXQgKyBpXTtcblx0ICBpICs9IGQ7XG5cdCAgZSA9IHMgJiAoMSA8PCAtbkJpdHMpIC0gMTtcblx0ICBzID4+PSAtbkJpdHM7XG5cdCAgbkJpdHMgKz0gZUxlbjtcblxuXHQgIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyJCQxW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHtcblx0ICB9XG5cblx0ICBtID0gZSAmICgxIDw8IC1uQml0cykgLSAxO1xuXHQgIGUgPj49IC1uQml0cztcblx0ICBuQml0cyArPSBtTGVuO1xuXG5cdCAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXIkJDFbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge1xuXHQgIH1cblxuXHQgIGlmIChlID09PSAwKSB7XG5cdCAgICBlID0gMSAtIGVCaWFzO1xuXHQgIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuXHQgICAgcmV0dXJuIG0gPyBOYU4gOiAocyA/IC0xIDogMSkgKiBJbmZpbml0eTtcblx0ICB9IGVsc2Uge1xuXHQgICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKTtcblx0ICAgIGUgPSBlIC0gZUJpYXM7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbik7XG5cdH1cblxuXHRmdW5jdGlvbiB3cml0ZUlFRUU3NTQoYnVmZmVyJCQxLCB2YWx1ZSwgb2Zmc2V0LCBlbmRpYW4sIG1MZW4sIG5CeXRlcykge1xuXHQgIHZhciBlLFxuXHQgICAgICBtLFxuXHQgICAgICBjLFxuXHQgICAgICBiQkUgPSBlbmRpYW4gPT09ICdiaWcnLFxuXHQgICAgICBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxLFxuXHQgICAgICBlTWF4ID0gKDEgPDwgZUxlbikgLSAxLFxuXHQgICAgICBlQmlhcyA9IGVNYXggPj4gMSxcblx0ICAgICAgcnQgPSBtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMCxcblx0ICAgICAgaSA9IGJCRSA/IG5CeXRlcyAtIDEgOiAwLFxuXHQgICAgICBkID0gYkJFID8gLTEgOiAxLFxuXHQgICAgICBzID0gdmFsdWUgPCAwIHx8IHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDAgPyAxIDogMDtcblx0ICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKTtcblxuXHQgIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG5cdCAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDA7XG5cdCAgICBlID0gZU1heDtcblx0ICB9IGVsc2Uge1xuXHQgICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpO1xuXG5cdCAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG5cdCAgICAgIGUtLTtcblx0ICAgICAgYyAqPSAyO1xuXHQgICAgfVxuXG5cdCAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcblx0ICAgICAgdmFsdWUgKz0gcnQgLyBjO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpO1xuXHQgICAgfVxuXG5cdCAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcblx0ICAgICAgZSsrO1xuXHQgICAgICBjIC89IDI7XG5cdCAgICB9XG5cblx0ICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuXHQgICAgICBtID0gMDtcblx0ICAgICAgZSA9IGVNYXg7XG5cdCAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG5cdCAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKTtcblx0ICAgICAgZSA9IGUgKyBlQmlhcztcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKTtcblx0ICAgICAgZSA9IDA7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgaWYgKGlzTmFOKHZhbHVlKSkgbSA9IDA7XG5cblx0ICB3aGlsZSAobUxlbiA+PSA4KSB7XG5cdCAgICBidWZmZXIkJDFbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZjtcblx0ICAgIGkgKz0gZDtcblx0ICAgIG0gLz0gMjU2O1xuXHQgICAgbUxlbiAtPSA4O1xuXHQgIH1cblxuXHQgIGUgPSBlIDw8IG1MZW4gfCBtO1xuXHQgIGlmIChpc05hTih2YWx1ZSkpIGUgKz0gODtcblx0ICBlTGVuICs9IG1MZW47XG5cblx0ICB3aGlsZSAoZUxlbiA+IDApIHtcblx0ICAgIGJ1ZmZlciQkMVtvZmZzZXQgKyBpXSA9IGUgJiAweGZmO1xuXHQgICAgaSArPSBkO1xuXHQgICAgZSAvPSAyNTY7XG5cdCAgICBlTGVuIC09IDg7XG5cdCAgfVxuXG5cdCAgYnVmZmVyJCQxW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4O1xuXHR9XG5cblx0dmFyIGZsb2F0X3BhcnNlciA9IHtcblx0ICByZWFkSUVFRTc1NDogcmVhZElFRUU3NTQsXG5cdCAgd3JpdGVJRUVFNzU0OiB3cml0ZUlFRUU3NTRcblx0fTtcblxuXHRmdW5jdGlvbiBfdHlwZW9mJDMob2JqKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mJDMgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiQzID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2YkMyhvYmopOyB9XG5cblx0dmFyIEJ1ZmZlciQ1ID0gYnVmZmVyLkJ1ZmZlcjtcblx0dmFyIHdyaXRlSUVFRTc1NCQxID0gZmxvYXRfcGFyc2VyLndyaXRlSUVFRTc1NDtcblx0dmFyIG5vcm1hbGl6ZWRGdW5jdGlvblN0cmluZyQxID0gdXRpbHMubm9ybWFsaXplZEZ1bmN0aW9uU3RyaW5nO1xuXHR2YXIgcmVnZXhwJDEgPSAvXFx4MDAvOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRyb2wtcmVnZXhcblxuXHR2YXIgaWdub3JlS2V5cyA9IG5ldyBTZXQoWyckZGInLCAnJHJlZicsICckaWQnLCAnJGNsdXN0ZXJUaW1lJ10pOyAvLyBUbyBlbnN1cmUgdGhhdCAwLjQgb2Ygbm9kZSB3b3JrcyBjb3JyZWN0bHlcblxuXHR2YXIgaXNEYXRlJDEgPSBmdW5jdGlvbiBpc0RhdGUoZCkge1xuXHQgIHJldHVybiBfdHlwZW9mJDMoZCkgPT09ICdvYmplY3QnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xuXHR9O1xuXG5cdHZhciBpc1JlZ0V4cCQxID0gZnVuY3Rpb24gaXNSZWdFeHAoZCkge1xuXHQgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZCkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xuXHR9O1xuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZVN0cmluZyhidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCBpc0FycmF5KSB7XG5cdCAgLy8gRW5jb2RlIFN0cmluZyB0eXBlXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9TVFJJTkc7IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblx0ICB2YXIgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXHQgIGluZGV4ID0gaW5kZXggKyBudW1iZXJPZldyaXR0ZW5CeXRlcyArIDE7XG5cdCAgYnVmZmVyJCQxW2luZGV4IC0gMV0gPSAwOyAvLyBXcml0ZSB0aGUgc3RyaW5nXG5cblx0ICB2YXIgc2l6ZSA9IGJ1ZmZlciQkMS53cml0ZSh2YWx1ZSwgaW5kZXggKyA0LCAndXRmOCcpOyAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIHRvIGJ1ZmZlclxuXG5cdCAgYnVmZmVyJCQxW2luZGV4ICsgM10gPSBzaXplICsgMSA+PiAyNCAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4ICsgMl0gPSBzaXplICsgMSA+PiAxNiAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4ICsgMV0gPSBzaXplICsgMSA+PiA4ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXhdID0gc2l6ZSArIDEgJiAweGZmOyAvLyBVcGRhdGUgaW5kZXhcblxuXHQgIGluZGV4ID0gaW5kZXggKyA0ICsgc2l6ZTsgLy8gV3JpdGUgemVyb1xuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMDtcblx0ICByZXR1cm4gaW5kZXg7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVOdW1iZXIoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgaXNBcnJheSkge1xuXHQgIC8vIFdlIGhhdmUgYW4gaW50ZWdlciB2YWx1ZVxuXHQgIGlmIChNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWUgJiYgdmFsdWUgPj0gY29uc3RhbnRzLkpTX0lOVF9NSU4gJiYgdmFsdWUgPD0gY29uc3RhbnRzLkpTX0lOVF9NQVgpIHtcblx0ICAgIC8vIElmIHRoZSB2YWx1ZSBmaXRzIGluIDMyIGJpdHMgZW5jb2RlIGFzIGludCwgaWYgaXQgZml0cyBpbiBhIGRvdWJsZVxuXHQgICAgLy8gZW5jb2RlIGl0IGFzIGEgZG91YmxlLCBvdGhlcndpc2UgbG9uZ1xuXHQgICAgaWYgKHZhbHVlID49IGNvbnN0YW50cy5CU09OX0lOVDMyX01JTiAmJiB2YWx1ZSA8PSBjb25zdGFudHMuQlNPTl9JTlQzMl9NQVgpIHtcblx0ICAgICAgLy8gU2V0IGludCB0eXBlIDMyIGJpdHMgb3IgbGVzc1xuXHQgICAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX0lOVDsgLy8gTnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXNcblxuXHQgICAgICB2YXIgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXHQgICAgICBpbmRleCA9IGluZGV4ICsgbnVtYmVyT2ZXcml0dGVuQnl0ZXM7XG5cdCAgICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7IC8vIFdyaXRlIHRoZSBpbnQgdmFsdWVcblxuXHQgICAgICBidWZmZXIkJDFbaW5kZXgrK10gPSB2YWx1ZSAmIDB4ZmY7XG5cdCAgICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IHZhbHVlID4+IDggJiAweGZmO1xuXHQgICAgICBidWZmZXIkJDFbaW5kZXgrK10gPSB2YWx1ZSA+PiAxNiAmIDB4ZmY7XG5cdCAgICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IHZhbHVlID4+IDI0ICYgMHhmZjtcblx0ICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gY29uc3RhbnRzLkpTX0lOVF9NSU4gJiYgdmFsdWUgPD0gY29uc3RhbnRzLkpTX0lOVF9NQVgpIHtcblx0ICAgICAgLy8gRW5jb2RlIGFzIGRvdWJsZVxuXHQgICAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX05VTUJFUjsgLy8gTnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXNcblxuXHQgICAgICB2YXIgX251bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblxuXHQgICAgICBpbmRleCA9IGluZGV4ICsgX251bWJlck9mV3JpdHRlbkJ5dGVzO1xuXHQgICAgICBidWZmZXIkJDFbaW5kZXgrK10gPSAwOyAvLyBXcml0ZSBmbG9hdFxuXG5cdCAgICAgIHdyaXRlSUVFRTc1NCQxKGJ1ZmZlciQkMSwgdmFsdWUsIGluZGV4LCAnbGl0dGxlJywgNTIsIDgpOyAvLyBBanVzdCBpbmRleFxuXG5cdCAgICAgIGluZGV4ID0gaW5kZXggKyA4O1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgLy8gU2V0IGxvbmcgdHlwZVxuXHQgICAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX0xPTkc7IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblx0ICAgICAgdmFyIF9udW1iZXJPZldyaXR0ZW5CeXRlczIgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXG5cdCAgICAgIGluZGV4ID0gaW5kZXggKyBfbnVtYmVyT2ZXcml0dGVuQnl0ZXMyO1xuXHQgICAgICBidWZmZXIkJDFbaW5kZXgrK10gPSAwO1xuXHQgICAgICB2YXIgbG9uZ1ZhbCA9IGxvbmdfMS5mcm9tTnVtYmVyKHZhbHVlKTtcblx0ICAgICAgdmFyIGxvd0JpdHMgPSBsb25nVmFsLmdldExvd0JpdHMoKTtcblx0ICAgICAgdmFyIGhpZ2hCaXRzID0gbG9uZ1ZhbC5nZXRIaWdoQml0cygpOyAvLyBFbmNvZGUgbG93IGJpdHNcblxuXHQgICAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBsb3dCaXRzICYgMHhmZjtcblx0ICAgICAgYnVmZmVyJCQxW2luZGV4KytdID0gbG93Qml0cyA+PiA4ICYgMHhmZjtcblx0ICAgICAgYnVmZmVyJCQxW2luZGV4KytdID0gbG93Qml0cyA+PiAxNiAmIDB4ZmY7XG5cdCAgICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGxvd0JpdHMgPj4gMjQgJiAweGZmOyAvLyBFbmNvZGUgaGlnaCBiaXRzXG5cblx0ICAgICAgYnVmZmVyJCQxW2luZGV4KytdID0gaGlnaEJpdHMgJiAweGZmO1xuXHQgICAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBoaWdoQml0cyA+PiA4ICYgMHhmZjtcblx0ICAgICAgYnVmZmVyJCQxW2luZGV4KytdID0gaGlnaEJpdHMgPj4gMTYgJiAweGZmO1xuXHQgICAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBoaWdoQml0cyA+PiAyNCAmIDB4ZmY7XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIC8vIEVuY29kZSBhcyBkb3VibGVcblx0ICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGNvbnN0YW50cy5CU09OX0RBVEFfTlVNQkVSOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgICB2YXIgX251bWJlck9mV3JpdHRlbkJ5dGVzMyA9ICFpc0FycmF5ID8gYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICd1dGY4JykgOiBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ2FzY2lpJyk7IC8vIEVuY29kZSB0aGUgbmFtZVxuXG5cblx0ICAgIGluZGV4ID0gaW5kZXggKyBfbnVtYmVyT2ZXcml0dGVuQnl0ZXMzO1xuXHQgICAgYnVmZmVyJCQxW2luZGV4KytdID0gMDsgLy8gV3JpdGUgZmxvYXRcblxuXHQgICAgd3JpdGVJRUVFNzU0JDEoYnVmZmVyJCQxLCB2YWx1ZSwgaW5kZXgsICdsaXR0bGUnLCA1MiwgOCk7IC8vIEFqdXN0IGluZGV4XG5cblx0ICAgIGluZGV4ID0gaW5kZXggKyA4O1xuXHQgIH1cblxuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZU51bGwoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgaXNBcnJheSkge1xuXHQgIC8vIFNldCBsb25nIHR5cGVcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX05VTEw7IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblx0ICB2YXIgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXHQgIGluZGV4ID0gaW5kZXggKyBudW1iZXJPZldyaXR0ZW5CeXRlcztcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAwO1xuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZUJvb2xlYW4oYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgaXNBcnJheSkge1xuXHQgIC8vIFdyaXRlIHRoZSB0eXBlXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9CT09MRUFOOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICBpbmRleCA9IGluZGV4ICsgbnVtYmVyT2ZXcml0dGVuQnl0ZXM7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMDsgLy8gRW5jb2RlIHRoZSBib29sZWFuIHZhbHVlXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSB2YWx1ZSA/IDEgOiAwO1xuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZURhdGUoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgaXNBcnJheSkge1xuXHQgIC8vIFdyaXRlIHRoZSB0eXBlXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9EQVRFOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICBpbmRleCA9IGluZGV4ICsgbnVtYmVyT2ZXcml0dGVuQnl0ZXM7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMDsgLy8gV3JpdGUgdGhlIGRhdGVcblxuXHQgIHZhciBkYXRlSW5NaWxpcyA9IGxvbmdfMS5mcm9tTnVtYmVyKHZhbHVlLmdldFRpbWUoKSk7XG5cdCAgdmFyIGxvd0JpdHMgPSBkYXRlSW5NaWxpcy5nZXRMb3dCaXRzKCk7XG5cdCAgdmFyIGhpZ2hCaXRzID0gZGF0ZUluTWlsaXMuZ2V0SGlnaEJpdHMoKTsgLy8gRW5jb2RlIGxvdyBiaXRzXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBsb3dCaXRzICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBsb3dCaXRzID4+IDggJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGxvd0JpdHMgPj4gMTYgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGxvd0JpdHMgPj4gMjQgJiAweGZmOyAvLyBFbmNvZGUgaGlnaCBiaXRzXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBoaWdoQml0cyAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gaGlnaEJpdHMgPj4gOCAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gaGlnaEJpdHMgPj4gMTYgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGhpZ2hCaXRzID4+IDI0ICYgMHhmZjtcblx0ICByZXR1cm4gaW5kZXg7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVSZWdFeHAoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgaXNBcnJheSkge1xuXHQgIC8vIFdyaXRlIHRoZSB0eXBlXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9SRUdFWFA7IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblx0ICB2YXIgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXHQgIGluZGV4ID0gaW5kZXggKyBudW1iZXJPZldyaXR0ZW5CeXRlcztcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAwO1xuXG5cdCAgaWYgKHZhbHVlLnNvdXJjZSAmJiB2YWx1ZS5zb3VyY2UubWF0Y2gocmVnZXhwJDEpICE9IG51bGwpIHtcblx0ICAgIHRocm93IEVycm9yKCd2YWx1ZSAnICsgdmFsdWUuc291cmNlICsgJyBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMnKTtcblx0ICB9IC8vIEFkanVzdCB0aGUgaW5kZXhcblxuXG5cdCAgaW5kZXggPSBpbmRleCArIGJ1ZmZlciQkMS53cml0ZSh2YWx1ZS5zb3VyY2UsIGluZGV4LCAndXRmOCcpOyAvLyBXcml0ZSB6ZXJvXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAweDAwOyAvLyBXcml0ZSB0aGUgcGFyYW1ldGVyc1xuXG5cdCAgaWYgKHZhbHVlLmlnbm9yZUNhc2UpIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDB4Njk7IC8vIGlcblxuXHQgIGlmICh2YWx1ZS5nbG9iYWwpIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDB4NzM7IC8vIHNcblxuXHQgIGlmICh2YWx1ZS5tdWx0aWxpbmUpIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDB4NmQ7IC8vIG1cblx0ICAvLyBBZGQgZW5kaW5nIHplcm9cblxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDB4MDA7XG5cdCAgcmV0dXJuIGluZGV4O1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplQlNPTlJlZ0V4cChidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCBpc0FycmF5KSB7XG5cdCAgLy8gV3JpdGUgdGhlIHR5cGVcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX1JFR0VYUDsgLy8gTnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXNcblxuXHQgIHZhciBudW1iZXJPZldyaXR0ZW5CeXRlcyA9ICFpc0FycmF5ID8gYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICd1dGY4JykgOiBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ2FzY2lpJyk7IC8vIEVuY29kZSB0aGUgbmFtZVxuXG5cdCAgaW5kZXggPSBpbmRleCArIG51bWJlck9mV3JpdHRlbkJ5dGVzO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7IC8vIENoZWNrIHRoZSBwYXR0ZXJuIGZvciAwIGJ5dGVzXG5cblx0ICBpZiAodmFsdWUucGF0dGVybi5tYXRjaChyZWdleHAkMSkgIT0gbnVsbCkge1xuXHQgICAgLy8gVGhlIEJTT04gc3BlYyBkb2Vzbid0IGFsbG93IGtleXMgd2l0aCBudWxsIGJ5dGVzIGJlY2F1c2Uga2V5cyBhcmVcblx0ICAgIC8vIG51bGwtdGVybWluYXRlZC5cblx0ICAgIHRocm93IEVycm9yKCdwYXR0ZXJuICcgKyB2YWx1ZS5wYXR0ZXJuICsgJyBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMnKTtcblx0ICB9IC8vIEFkanVzdCB0aGUgaW5kZXhcblxuXG5cdCAgaW5kZXggPSBpbmRleCArIGJ1ZmZlciQkMS53cml0ZSh2YWx1ZS5wYXR0ZXJuLCBpbmRleCwgJ3V0ZjgnKTsgLy8gV3JpdGUgemVyb1xuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMHgwMDsgLy8gV3JpdGUgdGhlIG9wdGlvbnNcblxuXHQgIGluZGV4ID0gaW5kZXggKyBidWZmZXIkJDEud3JpdGUodmFsdWUub3B0aW9ucy5zcGxpdCgnJykuc29ydCgpLmpvaW4oJycpLCBpbmRleCwgJ3V0ZjgnKTsgLy8gQWRkIGVuZGluZyB6ZXJvXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAweDAwO1xuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZU1pbk1heChidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCBpc0FycmF5KSB7XG5cdCAgLy8gV3JpdGUgdGhlIHR5cGUgb2YgZWl0aGVyIG1pbiBvciBtYXgga2V5XG5cdCAgaWYgKHZhbHVlID09PSBudWxsKSB7XG5cdCAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX05VTEw7XG5cdCAgfSBlbHNlIGlmICh2YWx1ZS5fYnNvbnR5cGUgPT09ICdNaW5LZXknKSB7XG5cdCAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX01JTl9LRVk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGNvbnN0YW50cy5CU09OX0RBVEFfTUFYX0tFWTtcblx0ICB9IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblxuXHQgIHZhciBudW1iZXJPZldyaXR0ZW5CeXRlcyA9ICFpc0FycmF5ID8gYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICd1dGY4JykgOiBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ2FzY2lpJyk7IC8vIEVuY29kZSB0aGUgbmFtZVxuXG5cdCAgaW5kZXggPSBpbmRleCArIG51bWJlck9mV3JpdHRlbkJ5dGVzO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7XG5cdCAgcmV0dXJuIGluZGV4O1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplT2JqZWN0SWQoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgaXNBcnJheSkge1xuXHQgIC8vIFdyaXRlIHRoZSB0eXBlXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9PSUQ7IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblx0ICB2YXIgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXHQgIGluZGV4ID0gaW5kZXggKyBudW1iZXJPZldyaXR0ZW5CeXRlcztcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAwOyAvLyBXcml0ZSB0aGUgb2JqZWN0SWQgaW50byB0aGUgc2hhcmVkIGJ1ZmZlclxuXG5cdCAgaWYgKHR5cGVvZiB2YWx1ZS5pZCA9PT0gJ3N0cmluZycpIHtcblx0ICAgIGJ1ZmZlciQkMS53cml0ZSh2YWx1ZS5pZCwgaW5kZXgsICdiaW5hcnknKTtcblx0ICB9IGVsc2UgaWYgKHZhbHVlLmlkICYmIHZhbHVlLmlkLmNvcHkpIHtcblx0ICAgIHZhbHVlLmlkLmNvcHkoYnVmZmVyJCQxLCBpbmRleCwgMCwgMTIpO1xuXHQgIH0gZWxzZSB7XG5cdCAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvYmplY3QgWycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgKyAnXSBpcyBub3QgYSB2YWxpZCBPYmplY3RJZCcpO1xuXHQgIH0gLy8gQWp1c3QgaW5kZXhcblxuXG5cdCAgcmV0dXJuIGluZGV4ICsgMTI7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVCdWZmZXIoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgaXNBcnJheSkge1xuXHQgIC8vIFdyaXRlIHRoZSB0eXBlXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9CSU5BUlk7IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblx0ICB2YXIgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXHQgIGluZGV4ID0gaW5kZXggKyBudW1iZXJPZldyaXR0ZW5CeXRlcztcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAwOyAvLyBHZXQgc2l6ZSBvZiB0aGUgYnVmZmVyIChjdXJyZW50IHdyaXRlIHBvaW50KVxuXG5cdCAgdmFyIHNpemUgPSB2YWx1ZS5sZW5ndGg7IC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgdG8gYnVmZmVyXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBzaXplICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBzaXplID4+IDggJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IHNpemUgPj4gMTYgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IHNpemUgPj4gMjQgJiAweGZmOyAvLyBXcml0ZSB0aGUgZGVmYXVsdCBzdWJ0eXBlXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9CSU5BUllfU1VCVFlQRV9ERUZBVUxUOyAvLyBDb3B5IHRoZSBjb250ZW50IGZvcm0gdGhlIGJpbmFyeSBmaWVsZCB0byB0aGUgYnVmZmVyXG5cblx0ICB2YWx1ZS5jb3B5KGJ1ZmZlciQkMSwgaW5kZXgsIDAsIHNpemUpOyAvLyBBZGp1c3QgdGhlIGluZGV4XG5cblx0ICBpbmRleCA9IGluZGV4ICsgc2l6ZTtcblx0ICByZXR1cm4gaW5kZXg7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVPYmplY3QoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgY2hlY2tLZXlzLCBkZXB0aCwgc2VyaWFsaXplRnVuY3Rpb25zLCBpZ25vcmVVbmRlZmluZWQsIGlzQXJyYXksIHBhdGgpIHtcblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcblx0ICAgIGlmIChwYXRoW2ldID09PSB2YWx1ZSkgdGhyb3cgbmV3IEVycm9yKCdjeWNsaWMgZGVwZW5kZW5jeSBkZXRlY3RlZCcpO1xuXHQgIH0gLy8gUHVzaCB2YWx1ZSB0byBzdGFja1xuXG5cblx0ICBwYXRoLnB1c2godmFsdWUpOyAvLyBXcml0ZSB0aGUgdHlwZVxuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBjb25zdGFudHMuQlNPTl9EQVRBX0FSUkFZIDogY29uc3RhbnRzLkJTT05fREFUQV9PQkpFQ1Q7IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblx0ICB2YXIgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXHQgIGluZGV4ID0gaW5kZXggKyBudW1iZXJPZldyaXR0ZW5CeXRlcztcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAwO1xuXHQgIHZhciBlbmRJbmRleCA9IHNlcmlhbGl6ZUludG8oYnVmZmVyJCQxLCB2YWx1ZSwgY2hlY2tLZXlzLCBpbmRleCwgZGVwdGggKyAxLCBzZXJpYWxpemVGdW5jdGlvbnMsIGlnbm9yZVVuZGVmaW5lZCwgcGF0aCk7IC8vIFBvcCBzdGFja1xuXG5cdCAgcGF0aC5wb3AoKTtcblx0ICByZXR1cm4gZW5kSW5kZXg7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVEZWNpbWFsMTI4KGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGlzQXJyYXkpIHtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX0RFQ0lNQUwxMjg7IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblx0ICB2YXIgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXHQgIGluZGV4ID0gaW5kZXggKyBudW1iZXJPZldyaXR0ZW5CeXRlcztcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAwOyAvLyBXcml0ZSB0aGUgZGF0YSBmcm9tIHRoZSB2YWx1ZVxuXG5cdCAgdmFsdWUuYnl0ZXMuY29weShidWZmZXIkJDEsIGluZGV4LCAwLCAxNik7XG5cdCAgcmV0dXJuIGluZGV4ICsgMTY7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVMb25nKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGlzQXJyYXkpIHtcblx0ICAvLyBXcml0ZSB0aGUgdHlwZVxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IHZhbHVlLl9ic29udHlwZSA9PT0gJ0xvbmcnID8gY29uc3RhbnRzLkJTT05fREFUQV9MT05HIDogY29uc3RhbnRzLkJTT05fREFUQV9USU1FU1RBTVA7IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblx0ICB2YXIgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXHQgIGluZGV4ID0gaW5kZXggKyBudW1iZXJPZldyaXR0ZW5CeXRlcztcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAwOyAvLyBXcml0ZSB0aGUgZGF0ZVxuXG5cdCAgdmFyIGxvd0JpdHMgPSB2YWx1ZS5nZXRMb3dCaXRzKCk7XG5cdCAgdmFyIGhpZ2hCaXRzID0gdmFsdWUuZ2V0SGlnaEJpdHMoKTsgLy8gRW5jb2RlIGxvdyBiaXRzXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBsb3dCaXRzICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBsb3dCaXRzID4+IDggJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGxvd0JpdHMgPj4gMTYgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGxvd0JpdHMgPj4gMjQgJiAweGZmOyAvLyBFbmNvZGUgaGlnaCBiaXRzXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBoaWdoQml0cyAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gaGlnaEJpdHMgPj4gOCAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gaGlnaEJpdHMgPj4gMTYgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGhpZ2hCaXRzID4+IDI0ICYgMHhmZjtcblx0ICByZXR1cm4gaW5kZXg7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVJbnQzMihidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCBpc0FycmF5KSB7XG5cdCAgLy8gU2V0IGludCB0eXBlIDMyIGJpdHMgb3IgbGVzc1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGNvbnN0YW50cy5CU09OX0RBVEFfSU5UOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICBpbmRleCA9IGluZGV4ICsgbnVtYmVyT2ZXcml0dGVuQnl0ZXM7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMDsgLy8gV3JpdGUgdGhlIGludCB2YWx1ZVxuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gdmFsdWUgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IHZhbHVlID4+IDggJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IHZhbHVlID4+IDE2ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSB2YWx1ZSA+PiAyNCAmIDB4ZmY7XG5cdCAgcmV0dXJuIGluZGV4O1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplRG91YmxlKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGlzQXJyYXkpIHtcblx0ICAvLyBFbmNvZGUgYXMgZG91YmxlXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9OVU1CRVI7IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblx0ICB2YXIgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXHQgIGluZGV4ID0gaW5kZXggKyBudW1iZXJPZldyaXR0ZW5CeXRlcztcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAwOyAvLyBXcml0ZSBmbG9hdFxuXG5cdCAgd3JpdGVJRUVFNzU0JDEoYnVmZmVyJCQxLCB2YWx1ZS52YWx1ZSwgaW5kZXgsICdsaXR0bGUnLCA1MiwgOCk7IC8vIEFkanVzdCBpbmRleFxuXG5cdCAgaW5kZXggPSBpbmRleCArIDg7XG5cdCAgcmV0dXJuIGluZGV4O1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplRnVuY3Rpb24oYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgY2hlY2tLZXlzLCBkZXB0aCwgaXNBcnJheSkge1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGNvbnN0YW50cy5CU09OX0RBVEFfQ09ERTsgLy8gTnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXNcblxuXHQgIHZhciBudW1iZXJPZldyaXR0ZW5CeXRlcyA9ICFpc0FycmF5ID8gYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICd1dGY4JykgOiBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ2FzY2lpJyk7IC8vIEVuY29kZSB0aGUgbmFtZVxuXG5cdCAgaW5kZXggPSBpbmRleCArIG51bWJlck9mV3JpdHRlbkJ5dGVzO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7IC8vIEZ1bmN0aW9uIHN0cmluZ1xuXG5cdCAgdmFyIGZ1bmN0aW9uU3RyaW5nID0gbm9ybWFsaXplZEZ1bmN0aW9uU3RyaW5nJDEodmFsdWUpOyAvLyBXcml0ZSB0aGUgc3RyaW5nXG5cblx0ICB2YXIgc2l6ZSA9IGJ1ZmZlciQkMS53cml0ZShmdW5jdGlvblN0cmluZywgaW5kZXggKyA0LCAndXRmOCcpICsgMTsgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIHN0cmluZyB0byBidWZmZXJcblxuXHQgIGJ1ZmZlciQkMVtpbmRleF0gPSBzaXplICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXggKyAxXSA9IHNpemUgPj4gOCAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4ICsgMl0gPSBzaXplID4+IDE2ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXggKyAzXSA9IHNpemUgPj4gMjQgJiAweGZmOyAvLyBVcGRhdGUgaW5kZXhcblxuXHQgIGluZGV4ID0gaW5kZXggKyA0ICsgc2l6ZSAtIDE7IC8vIFdyaXRlIHplcm9cblxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7XG5cdCAgcmV0dXJuIGluZGV4O1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplQ29kZShidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCBjaGVja0tleXMsIGRlcHRoLCBzZXJpYWxpemVGdW5jdGlvbnMsIGlnbm9yZVVuZGVmaW5lZCwgaXNBcnJheSkge1xuXHQgIGlmICh2YWx1ZS5zY29wZSAmJiBfdHlwZW9mJDModmFsdWUuc2NvcGUpID09PSAnb2JqZWN0Jykge1xuXHQgICAgLy8gV3JpdGUgdGhlIHR5cGVcblx0ICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGNvbnN0YW50cy5CU09OX0RBVEFfQ09ERV9XX1NDT1BFOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgICB2YXIgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXHQgICAgaW5kZXggPSBpbmRleCArIG51bWJlck9mV3JpdHRlbkJ5dGVzO1xuXHQgICAgYnVmZmVyJCQxW2luZGV4KytdID0gMDsgLy8gU3RhcnRpbmcgaW5kZXhcblxuXHQgICAgdmFyIHN0YXJ0SW5kZXggPSBpbmRleDsgLy8gU2VyaWFsaXplIHRoZSBmdW5jdGlvblxuXHQgICAgLy8gR2V0IHRoZSBmdW5jdGlvbiBzdHJpbmdcblxuXHQgICAgdmFyIGZ1bmN0aW9uU3RyaW5nID0gdHlwZW9mIHZhbHVlLmNvZGUgPT09ICdzdHJpbmcnID8gdmFsdWUuY29kZSA6IHZhbHVlLmNvZGUudG9TdHJpbmcoKTsgLy8gSW5kZXggYWRqdXN0bWVudFxuXG5cdCAgICBpbmRleCA9IGluZGV4ICsgNDsgLy8gV3JpdGUgc3RyaW5nIGludG8gYnVmZmVyXG5cblx0ICAgIHZhciBjb2RlU2l6ZSA9IGJ1ZmZlciQkMS53cml0ZShmdW5jdGlvblN0cmluZywgaW5kZXggKyA0LCAndXRmOCcpICsgMTsgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIHN0cmluZyB0byBidWZmZXJcblxuXHQgICAgYnVmZmVyJCQxW2luZGV4XSA9IGNvZGVTaXplICYgMHhmZjtcblx0ICAgIGJ1ZmZlciQkMVtpbmRleCArIDFdID0gY29kZVNpemUgPj4gOCAmIDB4ZmY7XG5cdCAgICBidWZmZXIkJDFbaW5kZXggKyAyXSA9IGNvZGVTaXplID4+IDE2ICYgMHhmZjtcblx0ICAgIGJ1ZmZlciQkMVtpbmRleCArIDNdID0gY29kZVNpemUgPj4gMjQgJiAweGZmOyAvLyBXcml0ZSBlbmQgMFxuXG5cdCAgICBidWZmZXIkJDFbaW5kZXggKyA0ICsgY29kZVNpemUgLSAxXSA9IDA7IC8vIFdyaXRlIHRoZVxuXG5cdCAgICBpbmRleCA9IGluZGV4ICsgY29kZVNpemUgKyA0OyAvL1xuXHQgICAgLy8gU2VyaWFsaXplIHRoZSBzY29wZSB2YWx1ZVxuXG5cdCAgICB2YXIgZW5kSW5kZXggPSBzZXJpYWxpemVJbnRvKGJ1ZmZlciQkMSwgdmFsdWUuc2NvcGUsIGNoZWNrS2V5cywgaW5kZXgsIGRlcHRoICsgMSwgc2VyaWFsaXplRnVuY3Rpb25zLCBpZ25vcmVVbmRlZmluZWQpO1xuXHQgICAgaW5kZXggPSBlbmRJbmRleCAtIDE7IC8vIFdyaXQgdGhlIHRvdGFsXG5cblx0ICAgIHZhciB0b3RhbFNpemUgPSBlbmRJbmRleCAtIHN0YXJ0SW5kZXg7IC8vIFdyaXRlIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBvYmplY3RcblxuXHQgICAgYnVmZmVyJCQxW3N0YXJ0SW5kZXgrK10gPSB0b3RhbFNpemUgJiAweGZmO1xuXHQgICAgYnVmZmVyJCQxW3N0YXJ0SW5kZXgrK10gPSB0b3RhbFNpemUgPj4gOCAmIDB4ZmY7XG5cdCAgICBidWZmZXIkJDFbc3RhcnRJbmRleCsrXSA9IHRvdGFsU2l6ZSA+PiAxNiAmIDB4ZmY7XG5cdCAgICBidWZmZXIkJDFbc3RhcnRJbmRleCsrXSA9IHRvdGFsU2l6ZSA+PiAyNCAmIDB4ZmY7IC8vIFdyaXRlIHRyYWlsaW5nIHplcm9cblxuXHQgICAgYnVmZmVyJCQxW2luZGV4KytdID0gMDtcblx0ICB9IGVsc2Uge1xuXHQgICAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9DT0RFOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgICB2YXIgX251bWJlck9mV3JpdHRlbkJ5dGVzNCA9ICFpc0FycmF5ID8gYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICd1dGY4JykgOiBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ2FzY2lpJyk7IC8vIEVuY29kZSB0aGUgbmFtZVxuXG5cblx0ICAgIGluZGV4ID0gaW5kZXggKyBfbnVtYmVyT2ZXcml0dGVuQnl0ZXM0O1xuXHQgICAgYnVmZmVyJCQxW2luZGV4KytdID0gMDsgLy8gRnVuY3Rpb24gc3RyaW5nXG5cblx0ICAgIHZhciBfZnVuY3Rpb25TdHJpbmcgPSB2YWx1ZS5jb2RlLnRvU3RyaW5nKCk7IC8vIFdyaXRlIHRoZSBzdHJpbmdcblxuXG5cdCAgICB2YXIgc2l6ZSA9IGJ1ZmZlciQkMS53cml0ZShfZnVuY3Rpb25TdHJpbmcsIGluZGV4ICsgNCwgJ3V0ZjgnKSArIDE7IC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgdG8gYnVmZmVyXG5cblx0ICAgIGJ1ZmZlciQkMVtpbmRleF0gPSBzaXplICYgMHhmZjtcblx0ICAgIGJ1ZmZlciQkMVtpbmRleCArIDFdID0gc2l6ZSA+PiA4ICYgMHhmZjtcblx0ICAgIGJ1ZmZlciQkMVtpbmRleCArIDJdID0gc2l6ZSA+PiAxNiAmIDB4ZmY7XG5cdCAgICBidWZmZXIkJDFbaW5kZXggKyAzXSA9IHNpemUgPj4gMjQgJiAweGZmOyAvLyBVcGRhdGUgaW5kZXhcblxuXHQgICAgaW5kZXggPSBpbmRleCArIDQgKyBzaXplIC0gMTsgLy8gV3JpdGUgemVyb1xuXG5cdCAgICBidWZmZXIkJDFbaW5kZXgrK10gPSAwO1xuXHQgIH1cblxuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZUJpbmFyeShidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCBpc0FycmF5KSB7XG5cdCAgLy8gV3JpdGUgdGhlIHR5cGVcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX0JJTkFSWTsgLy8gTnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXNcblxuXHQgIHZhciBudW1iZXJPZldyaXR0ZW5CeXRlcyA9ICFpc0FycmF5ID8gYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICd1dGY4JykgOiBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ2FzY2lpJyk7IC8vIEVuY29kZSB0aGUgbmFtZVxuXG5cdCAgaW5kZXggPSBpbmRleCArIG51bWJlck9mV3JpdHRlbkJ5dGVzO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7IC8vIEV4dHJhY3QgdGhlIGJ1ZmZlclxuXG5cdCAgdmFyIGRhdGEgPSB2YWx1ZS52YWx1ZSh0cnVlKTsgLy8gQ2FsY3VsYXRlIHNpemVcblxuXHQgIHZhciBzaXplID0gdmFsdWUucG9zaXRpb247IC8vIEFkZCB0aGUgZGVwcmVjYXRlZCAwMiB0eXBlIDQgYnl0ZXMgb2Ygc2l6ZSB0byB0b3RhbFxuXG5cdCAgaWYgKHZhbHVlLnN1Yl90eXBlID09PSBiaW5hcnkuU1VCVFlQRV9CWVRFX0FSUkFZKSBzaXplID0gc2l6ZSArIDQ7IC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgdG8gYnVmZmVyXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBzaXplICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBzaXplID4+IDggJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IHNpemUgPj4gMTYgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IHNpemUgPj4gMjQgJiAweGZmOyAvLyBXcml0ZSB0aGUgc3VidHlwZSB0byB0aGUgYnVmZmVyXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSB2YWx1ZS5zdWJfdHlwZTsgLy8gSWYgd2UgaGF2ZSBiaW5hcnkgdHlwZSAyIHRoZSA0IGZpcnN0IGJ5dGVzIGFyZSB0aGUgc2l6ZVxuXG5cdCAgaWYgKHZhbHVlLnN1Yl90eXBlID09PSBiaW5hcnkuU1VCVFlQRV9CWVRFX0FSUkFZKSB7XG5cdCAgICBzaXplID0gc2l6ZSAtIDQ7XG5cdCAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBzaXplICYgMHhmZjtcblx0ICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IHNpemUgPj4gOCAmIDB4ZmY7XG5cdCAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBzaXplID4+IDE2ICYgMHhmZjtcblx0ICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IHNpemUgPj4gMjQgJiAweGZmO1xuXHQgIH0gLy8gV3JpdGUgdGhlIGRhdGEgdG8gdGhlIG9iamVjdFxuXG5cblx0ICBkYXRhLmNvcHkoYnVmZmVyJCQxLCBpbmRleCwgMCwgdmFsdWUucG9zaXRpb24pOyAvLyBBZGp1c3QgdGhlIGluZGV4XG5cblx0ICBpbmRleCA9IGluZGV4ICsgdmFsdWUucG9zaXRpb247XG5cdCAgcmV0dXJuIGluZGV4O1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplU3ltYm9sKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGlzQXJyYXkpIHtcblx0ICAvLyBXcml0ZSB0aGUgdHlwZVxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGNvbnN0YW50cy5CU09OX0RBVEFfU1lNQk9MOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICBpbmRleCA9IGluZGV4ICsgbnVtYmVyT2ZXcml0dGVuQnl0ZXM7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMDsgLy8gV3JpdGUgdGhlIHN0cmluZ1xuXG5cdCAgdmFyIHNpemUgPSBidWZmZXIkJDEud3JpdGUodmFsdWUudmFsdWUsIGluZGV4ICsgNCwgJ3V0ZjgnKSArIDE7IC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgdG8gYnVmZmVyXG5cblx0ICBidWZmZXIkJDFbaW5kZXhdID0gc2l6ZSAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4ICsgMV0gPSBzaXplID4+IDggJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCArIDJdID0gc2l6ZSA+PiAxNiAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4ICsgM10gPSBzaXplID4+IDI0ICYgMHhmZjsgLy8gVXBkYXRlIGluZGV4XG5cblx0ICBpbmRleCA9IGluZGV4ICsgNCArIHNpemUgLSAxOyAvLyBXcml0ZSB6ZXJvXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAweDAwO1xuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZURCUmVmKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGRlcHRoLCBzZXJpYWxpemVGdW5jdGlvbnMsIGlzQXJyYXkpIHtcblx0ICAvLyBXcml0ZSB0aGUgdHlwZVxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGNvbnN0YW50cy5CU09OX0RBVEFfT0JKRUNUOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICBpbmRleCA9IGluZGV4ICsgbnVtYmVyT2ZXcml0dGVuQnl0ZXM7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMDtcblx0ICB2YXIgc3RhcnRJbmRleCA9IGluZGV4O1xuXHQgIHZhciBlbmRJbmRleDtcblx0ICB2YXIgb3V0cHV0ID0ge1xuXHQgICAgJHJlZjogdmFsdWUuY29sbGVjdGlvbiB8fCB2YWx1ZS5uYW1lc3BhY2UsXG5cdCAgICAvLyBcIm5hbWVzcGFjZVwiIHdhcyB3aGF0IGxpYnJhcnkgMS54IGNhbGxlZCBcImNvbGxlY3Rpb25cIlxuXHQgICAgJGlkOiB2YWx1ZS5vaWRcblx0ICB9O1xuXHQgIGlmICh2YWx1ZS5kYiAhPSBudWxsKSBvdXRwdXQuJGRiID0gdmFsdWUuZGI7XG5cdCAgb3V0cHV0ID0gT2JqZWN0LmFzc2lnbihvdXRwdXQsIHZhbHVlLmZpZWxkcyk7XG5cdCAgZW5kSW5kZXggPSBzZXJpYWxpemVJbnRvKGJ1ZmZlciQkMSwgb3V0cHV0LCBmYWxzZSwgaW5kZXgsIGRlcHRoICsgMSwgc2VyaWFsaXplRnVuY3Rpb25zKTsgLy8gQ2FsY3VsYXRlIG9iamVjdCBzaXplXG5cblx0ICB2YXIgc2l6ZSA9IGVuZEluZGV4IC0gc3RhcnRJbmRleDsgLy8gV3JpdGUgdGhlIHNpemVcblxuXHQgIGJ1ZmZlciQkMVtzdGFydEluZGV4KytdID0gc2l6ZSAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW3N0YXJ0SW5kZXgrK10gPSBzaXplID4+IDggJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtzdGFydEluZGV4KytdID0gc2l6ZSA+PiAxNiAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW3N0YXJ0SW5kZXgrK10gPSBzaXplID4+IDI0ICYgMHhmZjsgLy8gU2V0IGluZGV4XG5cblx0ICByZXR1cm4gZW5kSW5kZXg7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVJbnRvKGJ1ZmZlciQkMSwgb2JqZWN0LCBjaGVja0tleXMsIHN0YXJ0aW5nSW5kZXgsIGRlcHRoLCBzZXJpYWxpemVGdW5jdGlvbnMsIGlnbm9yZVVuZGVmaW5lZCwgcGF0aCkge1xuXHQgIHN0YXJ0aW5nSW5kZXggPSBzdGFydGluZ0luZGV4IHx8IDA7XG5cdCAgcGF0aCA9IHBhdGggfHwgW107IC8vIFB1c2ggdGhlIG9iamVjdCB0byB0aGUgcGF0aFxuXG5cdCAgcGF0aC5wdXNoKG9iamVjdCk7IC8vIFN0YXJ0IHBsYWNlIHRvIHNlcmlhbGl6ZSBpbnRvXG5cblx0ICB2YXIgaW5kZXggPSBzdGFydGluZ0luZGV4ICsgNDsgLy8gU3BlY2lhbCBjYXNlIGlzQXJyYXlcblxuXHQgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcblx0ICAgIC8vIEdldCBvYmplY3Qga2V5c1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3QubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgdmFyIGtleSA9ICcnICsgaTtcblx0ICAgICAgdmFyIHZhbHVlID0gb2JqZWN0W2ldOyAvLyBJcyB0aGVyZSBhbiBvdmVycmlkZSB2YWx1ZVxuXG5cdCAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50b0JTT04pIHtcblx0ICAgICAgICBpZiAodHlwZW9mIHZhbHVlLnRvQlNPTiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcigndG9CU09OIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG5cdCAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0JTT04oKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIHZhciB0eXBlID0gX3R5cGVvZiQzKHZhbHVlKTtcblxuXHQgICAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZVN0cmluZyhidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCB0cnVlKTtcblx0ICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplTnVtYmVyKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIHRydWUpO1xuXHQgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplQm9vbGVhbihidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCB0cnVlKTtcblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHwgaXNEYXRlJDEodmFsdWUpKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVEYXRlKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIHRydWUpO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZU51bGwoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgdHJ1ZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZU51bGwoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgdHJ1ZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWVbJ19ic29udHlwZSddID09PSAnT2JqZWN0SWQnIHx8IHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ09iamVjdElEJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplT2JqZWN0SWQoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgdHJ1ZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAoQnVmZmVyJDUuaXNCdWZmZXIodmFsdWUpKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVCdWZmZXIoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgdHJ1ZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgfHwgaXNSZWdFeHAkMSh2YWx1ZSkpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZVJlZ0V4cChidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCB0cnVlKTtcblx0ICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0JyAmJiB2YWx1ZVsnX2Jzb250eXBlJ10gPT0gbnVsbCkge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplT2JqZWN0KGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGNoZWNrS2V5cywgZGVwdGgsIHNlcmlhbGl6ZUZ1bmN0aW9ucywgaWdub3JlVW5kZWZpbmVkLCB0cnVlLCBwYXRoKTtcblx0ICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0JyAmJiB2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdEZWNpbWFsMTI4Jykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplRGVjaW1hbDEyOChidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCB0cnVlKTtcblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdMb25nJyB8fCB2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdUaW1lc3RhbXAnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVMb25nKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIHRydWUpO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ0RvdWJsZScpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZURvdWJsZShidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCB0cnVlKTtcblx0ICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiYgc2VyaWFsaXplRnVuY3Rpb25zKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVGdW5jdGlvbihidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCBjaGVja0tleXMsIGRlcHRoLCBzZXJpYWxpemVGdW5jdGlvbnMsIHRydWUpO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ0NvZGUnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVDb2RlKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGNoZWNrS2V5cywgZGVwdGgsIHNlcmlhbGl6ZUZ1bmN0aW9ucywgaWdub3JlVW5kZWZpbmVkLCB0cnVlKTtcblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdCaW5hcnknKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVCaW5hcnkoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgdHJ1ZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWVbJ19ic29udHlwZSddID09PSAnU3ltYm9sJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplU3ltYm9sKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIHRydWUpO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ0RCUmVmJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplREJSZWYoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgZGVwdGgsIHNlcmlhbGl6ZUZ1bmN0aW9ucywgdHJ1ZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWVbJ19ic29udHlwZSddID09PSAnQlNPTlJlZ0V4cCcpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZUJTT05SZWdFeHAoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgdHJ1ZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWVbJ19ic29udHlwZSddID09PSAnSW50MzInKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVJbnQzMihidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCB0cnVlKTtcblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdNaW5LZXknIHx8IHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ01heEtleScpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZU1pbk1heChidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCB0cnVlKTtcblx0ICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWVbJ19ic29udHlwZSddICE9PSAndW5kZWZpbmVkJykge1xuXHQgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1VucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJyArIHZhbHVlWydfYnNvbnR5cGUnXSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIG1hcCkge1xuXHQgICAgdmFyIGl0ZXJhdG9yID0gb2JqZWN0LmVudHJpZXMoKTtcblx0ICAgIHZhciBkb25lID0gZmFsc2U7XG5cblx0ICAgIHdoaWxlICghZG9uZSkge1xuXHQgICAgICAvLyBVbnBhY2sgdGhlIG5leHQgZW50cnlcblx0ICAgICAgdmFyIGVudHJ5ID0gaXRlcmF0b3IubmV4dCgpO1xuXHQgICAgICBkb25lID0gZW50cnkuZG9uZTsgLy8gQXJlIHdlIGRvbmUsIHRoZW4gc2tpcCBhbmQgdGVybWluYXRlXG5cblx0ICAgICAgaWYgKGRvbmUpIGNvbnRpbnVlOyAvLyBHZXQgdGhlIGVudHJ5IHZhbHVlc1xuXG5cdCAgICAgIHZhciBfa2V5ID0gZW50cnkudmFsdWVbMF07XG5cdCAgICAgIHZhciBfdmFsdWUgPSBlbnRyeS52YWx1ZVsxXTsgLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHZhbHVlXG5cblx0ICAgICAgdmFyIF90eXBlID0gX3R5cGVvZiQzKF92YWx1ZSk7IC8vIENoZWNrIHRoZSBrZXkgYW5kIHRocm93IGVycm9yIGlmIGl0J3MgaWxsZWdhbFxuXG5cblx0ICAgICAgaWYgKHR5cGVvZiBfa2V5ID09PSAnc3RyaW5nJyAmJiAhaWdub3JlS2V5cy5oYXMoX2tleSkpIHtcblx0ICAgICAgICBpZiAoX2tleS5tYXRjaChyZWdleHAkMSkgIT0gbnVsbCkge1xuXHQgICAgICAgICAgLy8gVGhlIEJTT04gc3BlYyBkb2Vzbid0IGFsbG93IGtleXMgd2l0aCBudWxsIGJ5dGVzIGJlY2F1c2Uga2V5cyBhcmVcblx0ICAgICAgICAgIC8vIG51bGwtdGVybWluYXRlZC5cblx0ICAgICAgICAgIHRocm93IEVycm9yKCdrZXkgJyArIF9rZXkgKyAnIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcycpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGlmIChjaGVja0tleXMpIHtcblx0ICAgICAgICAgIGlmICgnJCcgPT09IF9rZXlbMF0pIHtcblx0ICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2tleSAnICsgX2tleSArIFwiIG11c3Qgbm90IHN0YXJ0IHdpdGggJyQnXCIpO1xuXHQgICAgICAgICAgfSBlbHNlIGlmICh+X2tleS5pbmRleE9mKCcuJykpIHtcblx0ICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2tleSAnICsgX2tleSArIFwiIG11c3Qgbm90IGNvbnRhaW4gJy4nXCIpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXG5cdCAgICAgIGlmIChfdHlwZSA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZVN0cmluZyhidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF90eXBlID09PSAnbnVtYmVyJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplTnVtYmVyKGJ1ZmZlciQkMSwgX2tleSwgX3ZhbHVlLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3R5cGUgPT09ICdib29sZWFuJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplQm9vbGVhbihidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHwgaXNEYXRlJDEoX3ZhbHVlKSkge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplRGF0ZShidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZSA9PT0gbnVsbCB8fCBfdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBpZ25vcmVVbmRlZmluZWQgPT09IGZhbHNlKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVOdWxsKGJ1ZmZlciQkMSwgX2tleSwgX3ZhbHVlLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ09iamVjdElkJyB8fCBfdmFsdWVbJ19ic29udHlwZSddID09PSAnT2JqZWN0SUQnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVPYmplY3RJZChidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKEJ1ZmZlciQ1LmlzQnVmZmVyKF92YWx1ZSkpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZUJ1ZmZlcihidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCB8fCBpc1JlZ0V4cCQxKF92YWx1ZSkpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZVJlZ0V4cChidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF90eXBlID09PSAnb2JqZWN0JyAmJiBfdmFsdWVbJ19ic29udHlwZSddID09IG51bGwpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZU9iamVjdChidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgsIGNoZWNrS2V5cywgZGVwdGgsIHNlcmlhbGl6ZUZ1bmN0aW9ucywgaWdub3JlVW5kZWZpbmVkLCBmYWxzZSwgcGF0aCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3R5cGUgPT09ICdvYmplY3QnICYmIF92YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdEZWNpbWFsMTI4Jykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplRGVjaW1hbDEyOChidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdMb25nJyB8fCBfdmFsdWVbJ19ic29udHlwZSddID09PSAnVGltZXN0YW1wJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplTG9uZyhidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdEb3VibGUnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVEb3VibGUoYnVmZmVyJCQxLCBfa2V5LCBfdmFsdWUsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWVbJ19ic29udHlwZSddID09PSAnQ29kZScpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZUNvZGUoYnVmZmVyJCQxLCBfa2V5LCBfdmFsdWUsIGluZGV4LCBjaGVja0tleXMsIGRlcHRoLCBzZXJpYWxpemVGdW5jdGlvbnMsIGlnbm9yZVVuZGVmaW5lZCk7XG5cdCAgICAgIH0gZWxzZSBpZiAodHlwZW9mIF92YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBzZXJpYWxpemVGdW5jdGlvbnMpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZUZ1bmN0aW9uKGJ1ZmZlciQkMSwgX2tleSwgX3ZhbHVlLCBpbmRleCwgY2hlY2tLZXlzLCBkZXB0aCwgc2VyaWFsaXplRnVuY3Rpb25zKTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWVbJ19ic29udHlwZSddID09PSAnQmluYXJ5Jykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplQmluYXJ5KGJ1ZmZlciQkMSwgX2tleSwgX3ZhbHVlLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ1N5bWJvbCcpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZVN5bWJvbChidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdEQlJlZicpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZURCUmVmKGJ1ZmZlciQkMSwgX2tleSwgX3ZhbHVlLCBpbmRleCwgZGVwdGgsIHNlcmlhbGl6ZUZ1bmN0aW9ucyk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ0JTT05SZWdFeHAnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVCU09OUmVnRXhwKGJ1ZmZlciQkMSwgX2tleSwgX3ZhbHVlLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ0ludDMyJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplSW50MzIoYnVmZmVyJCQxLCBfa2V5LCBfdmFsdWUsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWVbJ19ic29udHlwZSddID09PSAnTWluS2V5JyB8fCBfdmFsdWVbJ19ic29udHlwZSddID09PSAnTWF4S2V5Jykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplTWluTWF4KGJ1ZmZlciQkMSwgX2tleSwgX3ZhbHVlLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAodHlwZW9mIF92YWx1ZVsnX2Jzb250eXBlJ10gIT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5yZWNvZ25pemVkIG9yIGludmFsaWQgX2Jzb250eXBlOiAnICsgX3ZhbHVlWydfYnNvbnR5cGUnXSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgLy8gRGlkIHdlIHByb3ZpZGUgYSBjdXN0b20gc2VyaWFsaXphdGlvbiBtZXRob2Rcblx0ICAgIGlmIChvYmplY3QudG9CU09OKSB7XG5cdCAgICAgIGlmICh0eXBlb2Ygb2JqZWN0LnRvQlNPTiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcigndG9CU09OIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG5cdCAgICAgIG9iamVjdCA9IG9iamVjdC50b0JTT04oKTtcblx0ICAgICAgaWYgKG9iamVjdCAhPSBudWxsICYmIF90eXBlb2YkMyhvYmplY3QpICE9PSAnb2JqZWN0JykgdGhyb3cgbmV3IFR5cGVFcnJvcigndG9CU09OIGZ1bmN0aW9uIGRpZCBub3QgcmV0dXJuIGFuIG9iamVjdCcpO1xuXHQgICAgfSAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBrZXlzXG5cblxuXHQgICAgZm9yICh2YXIgX2tleTIgaW4gb2JqZWN0KSB7XG5cdCAgICAgIHZhciBfdmFsdWUyID0gb2JqZWN0W19rZXkyXTsgLy8gSXMgdGhlcmUgYW4gb3ZlcnJpZGUgdmFsdWVcblxuXHQgICAgICBpZiAoX3ZhbHVlMiAmJiBfdmFsdWUyLnRvQlNPTikge1xuXHQgICAgICAgIGlmICh0eXBlb2YgX3ZhbHVlMi50b0JTT04gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RvQlNPTiBpcyBub3QgYSBmdW5jdGlvbicpO1xuXHQgICAgICAgIF92YWx1ZTIgPSBfdmFsdWUyLnRvQlNPTigpO1xuXHQgICAgICB9IC8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZVxuXG5cblx0ICAgICAgdmFyIF90eXBlMiA9IF90eXBlb2YkMyhfdmFsdWUyKTsgLy8gQ2hlY2sgdGhlIGtleSBhbmQgdGhyb3cgZXJyb3IgaWYgaXQncyBpbGxlZ2FsXG5cblxuXHQgICAgICBpZiAodHlwZW9mIF9rZXkyID09PSAnc3RyaW5nJyAmJiAhaWdub3JlS2V5cy5oYXMoX2tleTIpKSB7XG5cdCAgICAgICAgaWYgKF9rZXkyLm1hdGNoKHJlZ2V4cCQxKSAhPSBudWxsKSB7XG5cdCAgICAgICAgICAvLyBUaGUgQlNPTiBzcGVjIGRvZXNuJ3QgYWxsb3cga2V5cyB3aXRoIG51bGwgYnl0ZXMgYmVjYXVzZSBrZXlzIGFyZVxuXHQgICAgICAgICAgLy8gbnVsbC10ZXJtaW5hdGVkLlxuXHQgICAgICAgICAgdGhyb3cgRXJyb3IoJ2tleSAnICsgX2tleTIgKyAnIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcycpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGlmIChjaGVja0tleXMpIHtcblx0ICAgICAgICAgIGlmICgnJCcgPT09IF9rZXkyWzBdKSB7XG5cdCAgICAgICAgICAgIHRocm93IEVycm9yKCdrZXkgJyArIF9rZXkyICsgXCIgbXVzdCBub3Qgc3RhcnQgd2l0aCAnJCdcIik7XG5cdCAgICAgICAgICB9IGVsc2UgaWYgKH5fa2V5Mi5pbmRleE9mKCcuJykpIHtcblx0ICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2tleSAnICsgX2tleTIgKyBcIiBtdXN0IG5vdCBjb250YWluICcuJ1wiKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH1cblxuXHQgICAgICBpZiAoX3R5cGUyID09PSAnc3RyaW5nJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplU3RyaW5nKGJ1ZmZlciQkMSwgX2tleTIsIF92YWx1ZTIsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdHlwZTIgPT09ICdudW1iZXInKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVOdW1iZXIoYnVmZmVyJCQxLCBfa2V5MiwgX3ZhbHVlMiwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF90eXBlMiA9PT0gJ2Jvb2xlYW4nKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVCb29sZWFuKGJ1ZmZlciQkMSwgX2tleTIsIF92YWx1ZTIsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWUyIGluc3RhbmNlb2YgRGF0ZSB8fCBpc0RhdGUkMShfdmFsdWUyKSkge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplRGF0ZShidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlMiA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgaWYgKGlnbm9yZVVuZGVmaW5lZCA9PT0gZmFsc2UpIGluZGV4ID0gc2VyaWFsaXplTnVsbChidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlMiA9PT0gbnVsbCkge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplTnVsbChidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlMlsnX2Jzb250eXBlJ10gPT09ICdPYmplY3RJZCcgfHwgX3ZhbHVlMlsnX2Jzb250eXBlJ10gPT09ICdPYmplY3RJRCcpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZU9iamVjdElkKGJ1ZmZlciQkMSwgX2tleTIsIF92YWx1ZTIsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChCdWZmZXIkNS5pc0J1ZmZlcihfdmFsdWUyKSkge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplQnVmZmVyKGJ1ZmZlciQkMSwgX2tleTIsIF92YWx1ZTIsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWUyIGluc3RhbmNlb2YgUmVnRXhwIHx8IGlzUmVnRXhwJDEoX3ZhbHVlMikpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZVJlZ0V4cChidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3R5cGUyID09PSAnb2JqZWN0JyAmJiBfdmFsdWUyWydfYnNvbnR5cGUnXSA9PSBudWxsKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVPYmplY3QoYnVmZmVyJCQxLCBfa2V5MiwgX3ZhbHVlMiwgaW5kZXgsIGNoZWNrS2V5cywgZGVwdGgsIHNlcmlhbGl6ZUZ1bmN0aW9ucywgaWdub3JlVW5kZWZpbmVkLCBmYWxzZSwgcGF0aCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3R5cGUyID09PSAnb2JqZWN0JyAmJiBfdmFsdWUyWydfYnNvbnR5cGUnXSA9PT0gJ0RlY2ltYWwxMjgnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVEZWNpbWFsMTI4KGJ1ZmZlciQkMSwgX2tleTIsIF92YWx1ZTIsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWUyWydfYnNvbnR5cGUnXSA9PT0gJ0xvbmcnIHx8IF92YWx1ZTJbJ19ic29udHlwZSddID09PSAnVGltZXN0YW1wJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplTG9uZyhidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlMlsnX2Jzb250eXBlJ10gPT09ICdEb3VibGUnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVEb3VibGUoYnVmZmVyJCQxLCBfa2V5MiwgX3ZhbHVlMiwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZTJbJ19ic29udHlwZSddID09PSAnQ29kZScpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZUNvZGUoYnVmZmVyJCQxLCBfa2V5MiwgX3ZhbHVlMiwgaW5kZXgsIGNoZWNrS2V5cywgZGVwdGgsIHNlcmlhbGl6ZUZ1bmN0aW9ucywgaWdub3JlVW5kZWZpbmVkKTtcblx0ICAgICAgfSBlbHNlIGlmICh0eXBlb2YgX3ZhbHVlMiA9PT0gJ2Z1bmN0aW9uJyAmJiBzZXJpYWxpemVGdW5jdGlvbnMpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZUZ1bmN0aW9uKGJ1ZmZlciQkMSwgX2tleTIsIF92YWx1ZTIsIGluZGV4LCBjaGVja0tleXMsIGRlcHRoLCBzZXJpYWxpemVGdW5jdGlvbnMpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZTJbJ19ic29udHlwZSddID09PSAnQmluYXJ5Jykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplQmluYXJ5KGJ1ZmZlciQkMSwgX2tleTIsIF92YWx1ZTIsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWUyWydfYnNvbnR5cGUnXSA9PT0gJ1N5bWJvbCcpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZVN5bWJvbChidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlMlsnX2Jzb250eXBlJ10gPT09ICdEQlJlZicpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZURCUmVmKGJ1ZmZlciQkMSwgX2tleTIsIF92YWx1ZTIsIGluZGV4LCBkZXB0aCwgc2VyaWFsaXplRnVuY3Rpb25zKTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWUyWydfYnNvbnR5cGUnXSA9PT0gJ0JTT05SZWdFeHAnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVCU09OUmVnRXhwKGJ1ZmZlciQkMSwgX2tleTIsIF92YWx1ZTIsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWUyWydfYnNvbnR5cGUnXSA9PT0gJ0ludDMyJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplSW50MzIoYnVmZmVyJCQxLCBfa2V5MiwgX3ZhbHVlMiwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZTJbJ19ic29udHlwZSddID09PSAnTWluS2V5JyB8fCBfdmFsdWUyWydfYnNvbnR5cGUnXSA9PT0gJ01heEtleScpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZU1pbk1heChidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAodHlwZW9mIF92YWx1ZTJbJ19ic29udHlwZSddICE9PSAndW5kZWZpbmVkJykge1xuXHQgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1VucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJyArIF92YWx1ZTJbJ19ic29udHlwZSddKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0gLy8gUmVtb3ZlIHRoZSBwYXRoXG5cblxuXHQgIHBhdGgucG9wKCk7IC8vIEZpbmFsIHBhZGRpbmcgYnl0ZSBmb3Igb2JqZWN0XG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAweDAwOyAvLyBGaW5hbCBzaXplXG5cblx0ICB2YXIgc2l6ZSA9IGluZGV4IC0gc3RhcnRpbmdJbmRleDsgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG9iamVjdFxuXG5cdCAgYnVmZmVyJCQxW3N0YXJ0aW5nSW5kZXgrK10gPSBzaXplICYgMHhmZjtcblx0ICBidWZmZXIkJDFbc3RhcnRpbmdJbmRleCsrXSA9IHNpemUgPj4gOCAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW3N0YXJ0aW5nSW5kZXgrK10gPSBzaXplID4+IDE2ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbc3RhcnRpbmdJbmRleCsrXSA9IHNpemUgPj4gMjQgJiAweGZmO1xuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdHZhciBzZXJpYWxpemVyID0gc2VyaWFsaXplSW50bztcblxuXHRmdW5jdGlvbiBfdHlwZW9mJDQob2JqKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mJDQgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiQ0ID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2YkNChvYmopOyB9XG5cblx0dmFyIEJ1ZmZlciQ2ID0gYnVmZmVyLkJ1ZmZlcjtcblx0dmFyIG5vcm1hbGl6ZWRGdW5jdGlvblN0cmluZyQyID0gdXRpbHMubm9ybWFsaXplZEZ1bmN0aW9uU3RyaW5nOyAvLyBUbyBlbnN1cmUgdGhhdCAwLjQgb2Ygbm9kZSB3b3JrcyBjb3JyZWN0bHlcblxuXHRmdW5jdGlvbiBpc0RhdGUkMihkKSB7XG5cdCAgcmV0dXJuIF90eXBlb2YkNChkKSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG5cdH1cblxuXHRmdW5jdGlvbiBjYWxjdWxhdGVPYmplY3RTaXplKG9iamVjdCwgc2VyaWFsaXplRnVuY3Rpb25zLCBpZ25vcmVVbmRlZmluZWQpIHtcblx0ICB2YXIgdG90YWxMZW5ndGggPSA0ICsgMTtcblxuXHQgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcblx0ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0Lmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIHRvdGFsTGVuZ3RoICs9IGNhbGN1bGF0ZUVsZW1lbnQoaS50b1N0cmluZygpLCBvYmplY3RbaV0sIHNlcmlhbGl6ZUZ1bmN0aW9ucywgdHJ1ZSwgaWdub3JlVW5kZWZpbmVkKTtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgLy8gSWYgd2UgaGF2ZSB0b0JTT04gZGVmaW5lZCwgb3ZlcnJpZGUgdGhlIGN1cnJlbnQgb2JqZWN0XG5cdCAgICBpZiAob2JqZWN0LnRvQlNPTikge1xuXHQgICAgICBvYmplY3QgPSBvYmplY3QudG9CU09OKCk7XG5cdCAgICB9IC8vIENhbGN1bGF0ZSBzaXplXG5cblxuXHQgICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuXHQgICAgICB0b3RhbExlbmd0aCArPSBjYWxjdWxhdGVFbGVtZW50KGtleSwgb2JqZWN0W2tleV0sIHNlcmlhbGl6ZUZ1bmN0aW9ucywgZmFsc2UsIGlnbm9yZVVuZGVmaW5lZCk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHRvdGFsTGVuZ3RoO1xuXHR9XG5cdC8qKlxuXHQgKiBAaWdub3JlXG5cdCAqIEBhcGkgcHJpdmF0ZVxuXHQgKi9cblxuXG5cdGZ1bmN0aW9uIGNhbGN1bGF0ZUVsZW1lbnQobmFtZSwgdmFsdWUsIHNlcmlhbGl6ZUZ1bmN0aW9ucywgaXNBcnJheSwgaWdub3JlVW5kZWZpbmVkKSB7XG5cdCAgLy8gSWYgd2UgaGF2ZSB0b0JTT04gZGVmaW5lZCwgb3ZlcnJpZGUgdGhlIGN1cnJlbnQgb2JqZWN0XG5cdCAgaWYgKHZhbHVlICYmIHZhbHVlLnRvQlNPTikge1xuXHQgICAgdmFsdWUgPSB2YWx1ZS50b0JTT04oKTtcblx0ICB9XG5cblx0ICBzd2l0Y2ggKF90eXBlb2YkNCh2YWx1ZSkpIHtcblx0ICAgIGNhc2UgJ3N0cmluZyc6XG5cdCAgICAgIHJldHVybiAxICsgQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSArIDQgKyBCdWZmZXIkNi5ieXRlTGVuZ3RoKHZhbHVlLCAndXRmOCcpICsgMTtcblxuXHQgICAgY2FzZSAnbnVtYmVyJzpcblx0ICAgICAgaWYgKE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZSAmJiB2YWx1ZSA+PSBjb25zdGFudHMuSlNfSU5UX01JTiAmJiB2YWx1ZSA8PSBjb25zdGFudHMuSlNfSU5UX01BWCkge1xuXHQgICAgICAgIGlmICh2YWx1ZSA+PSBjb25zdGFudHMuQlNPTl9JTlQzMl9NSU4gJiYgdmFsdWUgPD0gY29uc3RhbnRzLkJTT05fSU5UMzJfTUFYKSB7XG5cdCAgICAgICAgICAvLyAzMiBiaXRcblx0ICAgICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgKDQgKyAxKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgcmV0dXJuIChuYW1lICE9IG51bGwgPyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5hbWUsICd1dGY4JykgKyAxIDogMCkgKyAoOCArIDEpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAvLyA2NCBiaXRcblx0ICAgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArICg4ICsgMSk7XG5cdCAgICAgIH1cblxuXHQgICAgY2FzZSAndW5kZWZpbmVkJzpcblx0ICAgICAgaWYgKGlzQXJyYXkgfHwgIWlnbm9yZVVuZGVmaW5lZCkgcmV0dXJuIChuYW1lICE9IG51bGwgPyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5hbWUsICd1dGY4JykgKyAxIDogMCkgKyAxO1xuXHQgICAgICByZXR1cm4gMDtcblxuXHQgICAgY2FzZSAnYm9vbGVhbic6XG5cdCAgICAgIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgKDEgKyAxKTtcblxuXHQgICAgY2FzZSAnb2JqZWN0Jzpcblx0ICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWVbJ19ic29udHlwZSddID09PSAnTWluS2V5JyB8fCB2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdNYXhLZXknKSB7XG5cdCAgICAgICAgcmV0dXJuIChuYW1lICE9IG51bGwgPyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5hbWUsICd1dGY4JykgKyAxIDogMCkgKyAxO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ09iamVjdElkJyB8fCB2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdPYmplY3RJRCcpIHtcblx0ICAgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArICgxMiArIDEpO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fCBpc0RhdGUkMih2YWx1ZSkpIHtcblx0ICAgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArICg4ICsgMSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEJ1ZmZlciQ2ICE9PSAndW5kZWZpbmVkJyAmJiBCdWZmZXIkNi5pc0J1ZmZlcih2YWx1ZSkpIHtcblx0ICAgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArICgxICsgNCArIDEpICsgdmFsdWUubGVuZ3RoO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ0xvbmcnIHx8IHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ0RvdWJsZScgfHwgdmFsdWVbJ19ic29udHlwZSddID09PSAnVGltZXN0YW1wJykge1xuXHQgICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgKDggKyAxKTtcblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdEZWNpbWFsMTI4Jykge1xuXHQgICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgKDE2ICsgMSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWVbJ19ic29udHlwZSddID09PSAnQ29kZScpIHtcblx0ICAgICAgICAvLyBDYWxjdWxhdGUgc2l6ZSBkZXBlbmRpbmcgb24gdGhlIGF2YWlsYWJpbGl0eSBvZiBhIHNjb3BlXG5cdCAgICAgICAgaWYgKHZhbHVlLnNjb3BlICE9IG51bGwgJiYgT2JqZWN0LmtleXModmFsdWUuc2NvcGUpLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgMSArIDQgKyA0ICsgQnVmZmVyJDYuYnl0ZUxlbmd0aCh2YWx1ZS5jb2RlLnRvU3RyaW5nKCksICd1dGY4JykgKyAxICsgY2FsY3VsYXRlT2JqZWN0U2l6ZSh2YWx1ZS5zY29wZSwgc2VyaWFsaXplRnVuY3Rpb25zLCBpZ25vcmVVbmRlZmluZWQpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArIDEgKyA0ICsgQnVmZmVyJDYuYnl0ZUxlbmd0aCh2YWx1ZS5jb2RlLnRvU3RyaW5nKCksICd1dGY4JykgKyAxO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdCaW5hcnknKSB7XG5cdCAgICAgICAgLy8gQ2hlY2sgd2hhdCBraW5kIG9mIHN1YnR5cGUgd2UgaGF2ZVxuXHQgICAgICAgIGlmICh2YWx1ZS5zdWJfdHlwZSA9PT0gYmluYXJ5LlNVQlRZUEVfQllURV9BUlJBWSkge1xuXHQgICAgICAgICAgcmV0dXJuIChuYW1lICE9IG51bGwgPyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5hbWUsICd1dGY4JykgKyAxIDogMCkgKyAodmFsdWUucG9zaXRpb24gKyAxICsgNCArIDEgKyA0KTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgcmV0dXJuIChuYW1lICE9IG51bGwgPyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5hbWUsICd1dGY4JykgKyAxIDogMCkgKyAodmFsdWUucG9zaXRpb24gKyAxICsgNCArIDEpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdTeW1ib2wnKSB7XG5cdCAgICAgICAgcmV0dXJuIChuYW1lICE9IG51bGwgPyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5hbWUsICd1dGY4JykgKyAxIDogMCkgKyBCdWZmZXIkNi5ieXRlTGVuZ3RoKHZhbHVlLnZhbHVlLCAndXRmOCcpICsgNCArIDEgKyAxO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ0RCUmVmJykge1xuXHQgICAgICAgIC8vIFNldCB1cCBjb3JyZWN0IG9iamVjdCBmb3Igc2VyaWFsaXphdGlvblxuXHQgICAgICAgIHZhciBvcmRlcmVkX3ZhbHVlcyA9IE9iamVjdC5hc3NpZ24oe1xuXHQgICAgICAgICAgJHJlZjogdmFsdWUuY29sbGVjdGlvbixcblx0ICAgICAgICAgICRpZDogdmFsdWUub2lkXG5cdCAgICAgICAgfSwgdmFsdWUuZmllbGRzKTsgLy8gQWRkIGRiIHJlZmVyZW5jZSBpZiBpdCBleGlzdHNcblxuXHQgICAgICAgIGlmICh2YWx1ZS5kYiAhPSBudWxsKSB7XG5cdCAgICAgICAgICBvcmRlcmVkX3ZhbHVlc1snJGRiJ10gPSB2YWx1ZS5kYjtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArIDEgKyBjYWxjdWxhdGVPYmplY3RTaXplKG9yZGVyZWRfdmFsdWVzLCBzZXJpYWxpemVGdW5jdGlvbnMsIGlnbm9yZVVuZGVmaW5lZCk7XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcblx0ICAgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArIDEgKyBCdWZmZXIkNi5ieXRlTGVuZ3RoKHZhbHVlLnNvdXJjZSwgJ3V0ZjgnKSArIDEgKyAodmFsdWUuZ2xvYmFsID8gMSA6IDApICsgKHZhbHVlLmlnbm9yZUNhc2UgPyAxIDogMCkgKyAodmFsdWUubXVsdGlsaW5lID8gMSA6IDApICsgMTtcblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdCU09OUmVnRXhwJykge1xuXHQgICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgMSArIEJ1ZmZlciQ2LmJ5dGVMZW5ndGgodmFsdWUucGF0dGVybiwgJ3V0ZjgnKSArIDEgKyBCdWZmZXIkNi5ieXRlTGVuZ3RoKHZhbHVlLm9wdGlvbnMsICd1dGY4JykgKyAxO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgY2FsY3VsYXRlT2JqZWN0U2l6ZSh2YWx1ZSwgc2VyaWFsaXplRnVuY3Rpb25zLCBpZ25vcmVVbmRlZmluZWQpICsgMTtcblx0ICAgICAgfVxuXG5cdCAgICBjYXNlICdmdW5jdGlvbic6XG5cdCAgICAgIC8vIFdURiBmb3IgMC40Llggd2hlcmUgdHlwZW9mIC9zb21lcmVnZXhwLyA9PT0gJ2Z1bmN0aW9uJ1xuXHQgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXScgfHwgU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBSZWdFeHBdJykge1xuXHQgICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgMSArIEJ1ZmZlciQ2LmJ5dGVMZW5ndGgodmFsdWUuc291cmNlLCAndXRmOCcpICsgMSArICh2YWx1ZS5nbG9iYWwgPyAxIDogMCkgKyAodmFsdWUuaWdub3JlQ2FzZSA/IDEgOiAwKSArICh2YWx1ZS5tdWx0aWxpbmUgPyAxIDogMCkgKyAxO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGlmIChzZXJpYWxpemVGdW5jdGlvbnMgJiYgdmFsdWUuc2NvcGUgIT0gbnVsbCAmJiBPYmplY3Qua2V5cyh2YWx1ZS5zY29wZSkubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgcmV0dXJuIChuYW1lICE9IG51bGwgPyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5hbWUsICd1dGY4JykgKyAxIDogMCkgKyAxICsgNCArIDQgKyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5vcm1hbGl6ZWRGdW5jdGlvblN0cmluZyQyKHZhbHVlKSwgJ3V0ZjgnKSArIDEgKyBjYWxjdWxhdGVPYmplY3RTaXplKHZhbHVlLnNjb3BlLCBzZXJpYWxpemVGdW5jdGlvbnMsIGlnbm9yZVVuZGVmaW5lZCk7XG5cdCAgICAgICAgfSBlbHNlIGlmIChzZXJpYWxpemVGdW5jdGlvbnMpIHtcblx0ICAgICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgMSArIDQgKyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5vcm1hbGl6ZWRGdW5jdGlvblN0cmluZyQyKHZhbHVlKSwgJ3V0ZjgnKSArIDE7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cblx0ICB9XG5cblx0ICByZXR1cm4gMDtcblx0fVxuXG5cdHZhciBjYWxjdWxhdGVfc2l6ZSA9IGNhbGN1bGF0ZU9iamVjdFNpemU7XG5cblx0dmFyIEJ1ZmZlciQ3ID0gYnVmZmVyLkJ1ZmZlcjtcblx0LyoqXG5cdCAqIE1ha2VzIHN1cmUgdGhhdCwgaWYgYSBVaW50OEFycmF5IGlzIHBhc3NlZCBpbiwgaXQgaXMgd3JhcHBlZCBpbiBhIEJ1ZmZlci5cblx0ICpcblx0ICogQHBhcmFtIHtCdWZmZXJ8VWludDhBcnJheX0gcG90ZW50aWFsQnVmZmVyIFRoZSBwb3RlbnRpYWwgYnVmZmVyXG5cdCAqIEByZXR1cm5zIHtCdWZmZXJ9IHRoZSBpbnB1dCBpZiBwb3RlbnRpYWxCdWZmZXIgaXMgYSBidWZmZXIsIG9yIGEgYnVmZmVyIHRoYXRcblx0ICogd3JhcHMgYSBwYXNzZWQgaW4gVWludDhBcnJheVxuXHQgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIGFueXRoaW5nIG90aGVyIHRoYW4gYSBCdWZmZXIgb3IgVWludDhBcnJheSBpcyBwYXNzZWQgaW5cblx0ICovXG5cblx0dmFyIGVuc3VyZV9idWZmZXIgPSBmdW5jdGlvbiBlbnN1cmVCdWZmZXIocG90ZW50aWFsQnVmZmVyKSB7XG5cdCAgaWYgKHBvdGVudGlhbEJ1ZmZlciBpbnN0YW5jZW9mIEJ1ZmZlciQ3KSB7XG5cdCAgICByZXR1cm4gcG90ZW50aWFsQnVmZmVyO1xuXHQgIH1cblxuXHQgIGlmIChwb3RlbnRpYWxCdWZmZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG5cdCAgICByZXR1cm4gQnVmZmVyJDcuZnJvbShwb3RlbnRpYWxCdWZmZXIuYnVmZmVyKTtcblx0ICB9XG5cblx0ICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHVzZSBlaXRoZXIgQnVmZmVyIG9yIFVpbnQ4QXJyYXknKTtcblx0fTtcblxuXHR2YXIgQnVmZmVyJDggPSBidWZmZXIuQnVmZmVyOyAvLyBQYXJ0cyBvZiB0aGUgcGFyc2VyXG5cblx0LyoqXG5cdCAqIEBpZ25vcmVcblx0ICovXG5cdC8vIERlZmF1bHQgTWF4IFNpemVcblxuXHR2YXIgTUFYU0laRSA9IDEwMjQgKiAxMDI0ICogMTc7IC8vIEN1cnJlbnQgSW50ZXJuYWwgVGVtcG9yYXJ5IFNlcmlhbGl6YXRpb24gQnVmZmVyXG5cblx0dmFyIGJ1ZmZlciQxID0gQnVmZmVyJDguYWxsb2MoTUFYU0laRSk7XG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBzZXJpYWxpemF0aW9uIGJ1ZmZlci5cblx0ICpcblx0ICogQG1ldGhvZFxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBUaGUgZGVzaXJlZCBzaXplIGZvciB0aGUgaW50ZXJuYWwgc2VyaWFsaXphdGlvbiBidWZmZXJcblx0ICovXG5cblx0ZnVuY3Rpb24gc2V0SW50ZXJuYWxCdWZmZXJTaXplKHNpemUpIHtcblx0ICAvLyBSZXNpemUgdGhlIGludGVybmFsIHNlcmlhbGl6YXRpb24gYnVmZmVyIGlmIG5lZWRlZFxuXHQgIGlmIChidWZmZXIkMS5sZW5ndGggPCBzaXplKSB7XG5cdCAgICBidWZmZXIkMSA9IEJ1ZmZlciQ4LmFsbG9jKHNpemUpO1xuXHQgIH1cblx0fVxuXHQvKipcblx0ICogU2VyaWFsaXplIGEgSmF2YXNjcmlwdCBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgdGhlIEphdmFzY3JpcHQgb2JqZWN0IHRvIHNlcmlhbGl6ZS5cblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jaGVja0tleXNdIHRoZSBzZXJpYWxpemVyIHdpbGwgY2hlY2sgaWYga2V5cyBhcmUgdmFsaWQuXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2VyaWFsaXplRnVuY3Rpb25zPWZhbHNlXSBzZXJpYWxpemUgdGhlIGphdmFzY3JpcHQgZnVuY3Rpb25zICoqKGRlZmF1bHQ6ZmFsc2UpKiouXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaWdub3JlVW5kZWZpbmVkPXRydWVdIGlnbm9yZSB1bmRlZmluZWQgZmllbGRzICoqKGRlZmF1bHQ6dHJ1ZSkqKi5cblx0ICogQHJldHVybiB7QnVmZmVyfSByZXR1cm5zIHRoZSBCdWZmZXIgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHNlcmlhbGl6ZWQgb2JqZWN0LlxuXHQgKi9cblxuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZSQxKG9iamVjdCwgb3B0aW9ucykge1xuXHQgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OyAvLyBVbnBhY2sgdGhlIG9wdGlvbnNcblxuXHQgIHZhciBjaGVja0tleXMgPSB0eXBlb2Ygb3B0aW9ucy5jaGVja0tleXMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuY2hlY2tLZXlzIDogZmFsc2U7XG5cdCAgdmFyIHNlcmlhbGl6ZUZ1bmN0aW9ucyA9IHR5cGVvZiBvcHRpb25zLnNlcmlhbGl6ZUZ1bmN0aW9ucyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5zZXJpYWxpemVGdW5jdGlvbnMgOiBmYWxzZTtcblx0ICB2YXIgaWdub3JlVW5kZWZpbmVkID0gdHlwZW9mIG9wdGlvbnMuaWdub3JlVW5kZWZpbmVkID09PSAnYm9vbGVhbicgPyBvcHRpb25zLmlnbm9yZVVuZGVmaW5lZCA6IHRydWU7XG5cdCAgdmFyIG1pbkludGVybmFsQnVmZmVyU2l6ZSA9IHR5cGVvZiBvcHRpb25zLm1pbkludGVybmFsQnVmZmVyU2l6ZSA9PT0gJ251bWJlcicgPyBvcHRpb25zLm1pbkludGVybmFsQnVmZmVyU2l6ZSA6IE1BWFNJWkU7IC8vIFJlc2l6ZSB0aGUgaW50ZXJuYWwgc2VyaWFsaXphdGlvbiBidWZmZXIgaWYgbmVlZGVkXG5cblx0ICBpZiAoYnVmZmVyJDEubGVuZ3RoIDwgbWluSW50ZXJuYWxCdWZmZXJTaXplKSB7XG5cdCAgICBidWZmZXIkMSA9IEJ1ZmZlciQ4LmFsbG9jKG1pbkludGVybmFsQnVmZmVyU2l6ZSk7XG5cdCAgfSAvLyBBdHRlbXB0IHRvIHNlcmlhbGl6ZVxuXG5cblx0ICB2YXIgc2VyaWFsaXphdGlvbkluZGV4ID0gc2VyaWFsaXplcihidWZmZXIkMSwgb2JqZWN0LCBjaGVja0tleXMsIDAsIDAsIHNlcmlhbGl6ZUZ1bmN0aW9ucywgaWdub3JlVW5kZWZpbmVkLCBbXSk7IC8vIENyZWF0ZSB0aGUgZmluYWwgYnVmZmVyXG5cblx0ICB2YXIgZmluaXNoZWRCdWZmZXIgPSBCdWZmZXIkOC5hbGxvYyhzZXJpYWxpemF0aW9uSW5kZXgpOyAvLyBDb3B5IGludG8gdGhlIGZpbmlzaGVkIGJ1ZmZlclxuXG5cdCAgYnVmZmVyJDEuY29weShmaW5pc2hlZEJ1ZmZlciwgMCwgMCwgZmluaXNoZWRCdWZmZXIubGVuZ3RoKTsgLy8gUmV0dXJuIHRoZSBidWZmZXJcblxuXHQgIHJldHVybiBmaW5pc2hlZEJ1ZmZlcjtcblx0fVxuXHQvKipcblx0ICogU2VyaWFsaXplIGEgSmF2YXNjcmlwdCBvYmplY3QgdXNpbmcgYSBwcmVkZWZpbmVkIEJ1ZmZlciBhbmQgaW5kZXggaW50byB0aGUgYnVmZmVyLCB1c2VmdWwgd2hlbiBwcmUtYWxsb2NhdGluZyB0aGUgc3BhY2UgZm9yIHNlcmlhbGl6YXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgdGhlIEphdmFzY3JpcHQgb2JqZWN0IHRvIHNlcmlhbGl6ZS5cblx0ICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciB0aGUgQnVmZmVyIHlvdSBwcmUtYWxsb2NhdGVkIHRvIHN0b3JlIHRoZSBzZXJpYWxpemVkIEJTT04gb2JqZWN0LlxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmNoZWNrS2V5c10gdGhlIHNlcmlhbGl6ZXIgd2lsbCBjaGVjayBpZiBrZXlzIGFyZSB2YWxpZC5cblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zZXJpYWxpemVGdW5jdGlvbnM9ZmFsc2VdIHNlcmlhbGl6ZSB0aGUgamF2YXNjcmlwdCBmdW5jdGlvbnMgKiooZGVmYXVsdDpmYWxzZSkqKi5cblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pZ25vcmVVbmRlZmluZWQ9dHJ1ZV0gaWdub3JlIHVuZGVmaW5lZCBmaWVsZHMgKiooZGVmYXVsdDp0cnVlKSoqLlxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaW5kZXhdIHRoZSBpbmRleCBpbiB0aGUgYnVmZmVyIHdoZXJlIHdlIHdpc2ggdG8gc3RhcnQgc2VyaWFsaXppbmcgaW50by5cblx0ICogQHJldHVybiB7TnVtYmVyfSByZXR1cm5zIHRoZSBpbmRleCBwb2ludGluZyB0byB0aGUgbGFzdCB3cml0dGVuIGJ5dGUgaW4gdGhlIGJ1ZmZlci5cblx0ICovXG5cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVXaXRoQnVmZmVyQW5kSW5kZXgob2JqZWN0LCBmaW5hbEJ1ZmZlciwgb3B0aW9ucykge1xuXHQgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OyAvLyBVbnBhY2sgdGhlIG9wdGlvbnNcblxuXHQgIHZhciBjaGVja0tleXMgPSB0eXBlb2Ygb3B0aW9ucy5jaGVja0tleXMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuY2hlY2tLZXlzIDogZmFsc2U7XG5cdCAgdmFyIHNlcmlhbGl6ZUZ1bmN0aW9ucyA9IHR5cGVvZiBvcHRpb25zLnNlcmlhbGl6ZUZ1bmN0aW9ucyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5zZXJpYWxpemVGdW5jdGlvbnMgOiBmYWxzZTtcblx0ICB2YXIgaWdub3JlVW5kZWZpbmVkID0gdHlwZW9mIG9wdGlvbnMuaWdub3JlVW5kZWZpbmVkID09PSAnYm9vbGVhbicgPyBvcHRpb25zLmlnbm9yZVVuZGVmaW5lZCA6IHRydWU7XG5cdCAgdmFyIHN0YXJ0SW5kZXggPSB0eXBlb2Ygb3B0aW9ucy5pbmRleCA9PT0gJ251bWJlcicgPyBvcHRpb25zLmluZGV4IDogMDsgLy8gQXR0ZW1wdCB0byBzZXJpYWxpemVcblxuXHQgIHZhciBzZXJpYWxpemF0aW9uSW5kZXggPSBzZXJpYWxpemVyKGJ1ZmZlciQxLCBvYmplY3QsIGNoZWNrS2V5cywgMCwgMCwgc2VyaWFsaXplRnVuY3Rpb25zLCBpZ25vcmVVbmRlZmluZWQpO1xuXHQgIGJ1ZmZlciQxLmNvcHkoZmluYWxCdWZmZXIsIHN0YXJ0SW5kZXgsIDAsIHNlcmlhbGl6YXRpb25JbmRleCk7IC8vIFJldHVybiB0aGUgaW5kZXhcblxuXHQgIHJldHVybiBzdGFydEluZGV4ICsgc2VyaWFsaXphdGlvbkluZGV4IC0gMTtcblx0fVxuXHQvKipcblx0ICogRGVzZXJpYWxpemUgZGF0YSBhcyBCU09OLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZCBzZXQgb2YgQlNPTiBkb2N1bWVudHMuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5ldmFsRnVuY3Rpb25zPWZhbHNlXSBldmFsdWF0ZSBmdW5jdGlvbnMgaW4gdGhlIEJTT04gZG9jdW1lbnQgc2NvcGVkIHRvIHRoZSBvYmplY3QgZGVzZXJpYWxpemVkLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuY2FjaGVGdW5jdGlvbnM9ZmFsc2VdIGNhY2hlIGV2YWx1YXRlZCBmdW5jdGlvbnMgZm9yIHJldXNlLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuY2FjaGVGdW5jdGlvbnNDcmMzMj1mYWxzZV0gdXNlIGEgY3JjMzIgY29kZSBmb3IgY2FjaGluZywgb3RoZXJ3aXNlIHVzZSB0aGUgc3RyaW5nIG9mIHRoZSBmdW5jdGlvbi5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnByb21vdGVMb25ncz10cnVlXSB3aGVuIGRlc2VyaWFsaXppbmcgYSBMb25nIHdpbGwgZml0IGl0IGludG8gYSBOdW1iZXIgaWYgaXQncyBzbWFsbGVyIHRoYW4gNTMgYml0c1xuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucHJvbW90ZUJ1ZmZlcnM9ZmFsc2VdIHdoZW4gZGVzZXJpYWxpemluZyBhIEJpbmFyeSB3aWxsIHJldHVybiBpdCBhcyBhIG5vZGUuanMgQnVmZmVyIGluc3RhbmNlLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucHJvbW90ZVZhbHVlcz1mYWxzZV0gd2hlbiBkZXNlcmlhbGl6aW5nIHdpbGwgcHJvbW90ZSBCU09OIHZhbHVlcyB0byB0aGVpciBOb2RlLmpzIGNsb3Nlc3QgZXF1aXZhbGVudCB0eXBlcy5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmZpZWxkc0FzUmF3PW51bGxdIGFsbG93IHRvIHNwZWNpZnkgaWYgdGhlcmUgd2hhdCBmaWVsZHMgd2Ugd2lzaCB0byByZXR1cm4gYXMgdW5zZXJpYWxpemVkIHJhdyBidWZmZXIuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5ic29uUmVnRXhwPWZhbHNlXSByZXR1cm4gQlNPTiByZWd1bGFyIGV4cHJlc3Npb25zIGFzIEJTT05SZWdFeHAgaW5zdGFuY2VzLlxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmFsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplPWZhbHNlXSBhbGxvd3MgdGhlIGJ1ZmZlciB0byBiZSBsYXJnZXIgdGhhbiB0aGUgcGFyc2VkIEJTT04gb2JqZWN0XG5cdCAqIEByZXR1cm4ge09iamVjdH0gcmV0dXJucyB0aGUgZGVzZXJpYWxpemVkIEphdmFzY3JpcHQgT2JqZWN0LlxuXHQgKi9cblxuXG5cdGZ1bmN0aW9uIGRlc2VyaWFsaXplJDIoYnVmZmVyJCQxLCBvcHRpb25zKSB7XG5cdCAgYnVmZmVyJCQxID0gZW5zdXJlX2J1ZmZlcihidWZmZXIkJDEpO1xuXHQgIHJldHVybiBkZXNlcmlhbGl6ZXIoYnVmZmVyJCQxLCBvcHRpb25zKTtcblx0fVxuXHQvKipcblx0ICogQ2FsY3VsYXRlIHRoZSBic29uIHNpemUgZm9yIGEgcGFzc2VkIGluIEphdmFzY3JpcHQgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IHRoZSBKYXZhc2NyaXB0IG9iamVjdCB0byBjYWxjdWxhdGUgdGhlIEJTT04gYnl0ZSBzaXplIGZvci5cblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zZXJpYWxpemVGdW5jdGlvbnM9ZmFsc2VdIHNlcmlhbGl6ZSB0aGUgamF2YXNjcmlwdCBmdW5jdGlvbnMgKiooZGVmYXVsdDpmYWxzZSkqKi5cblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pZ25vcmVVbmRlZmluZWQ9dHJ1ZV0gaWdub3JlIHVuZGVmaW5lZCBmaWVsZHMgKiooZGVmYXVsdDp0cnVlKSoqLlxuXHQgKiBAcmV0dXJuIHtOdW1iZXJ9IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0aGUgQlNPTiBvYmplY3Qgd2lsbCB0YWtlIHVwLlxuXHQgKi9cblxuXG5cdGZ1bmN0aW9uIGNhbGN1bGF0ZU9iamVjdFNpemUkMShvYmplY3QsIG9wdGlvbnMpIHtcblx0ICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0ICB2YXIgc2VyaWFsaXplRnVuY3Rpb25zID0gdHlwZW9mIG9wdGlvbnMuc2VyaWFsaXplRnVuY3Rpb25zID09PSAnYm9vbGVhbicgPyBvcHRpb25zLnNlcmlhbGl6ZUZ1bmN0aW9ucyA6IGZhbHNlO1xuXHQgIHZhciBpZ25vcmVVbmRlZmluZWQgPSB0eXBlb2Ygb3B0aW9ucy5pZ25vcmVVbmRlZmluZWQgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuaWdub3JlVW5kZWZpbmVkIDogdHJ1ZTtcblx0ICByZXR1cm4gY2FsY3VsYXRlX3NpemUob2JqZWN0LCBzZXJpYWxpemVGdW5jdGlvbnMsIGlnbm9yZVVuZGVmaW5lZCk7XG5cdH1cblx0LyoqXG5cdCAqIERlc2VyaWFsaXplIHN0cmVhbSBkYXRhIGFzIEJTT04gZG9jdW1lbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNlcmlhbGl6ZWQgc2V0IG9mIEJTT04gZG9jdW1lbnRzLlxuXHQgKiBAcGFyYW0ge051bWJlcn0gc3RhcnRJbmRleCB0aGUgc3RhcnQgaW5kZXggaW4gdGhlIGRhdGEgQnVmZmVyIHdoZXJlIHRoZSBkZXNlcmlhbGl6YXRpb24gaXMgdG8gc3RhcnQuXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBudW1iZXJPZkRvY3VtZW50cyBudW1iZXIgb2YgZG9jdW1lbnRzIHRvIGRlc2VyaWFsaXplLlxuXHQgKiBAcGFyYW0ge0FycmF5fSBkb2N1bWVudHMgYW4gYXJyYXkgd2hlcmUgdG8gc3RvcmUgdGhlIGRlc2VyaWFsaXplZCBkb2N1bWVudHMuXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkb2NTdGFydEluZGV4IHRoZSBpbmRleCBpbiB0aGUgZG9jdW1lbnRzIGFycmF5IGZyb20gd2hlcmUgdG8gc3RhcnQgaW5zZXJ0aW5nIGRvY3VtZW50cy5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBhZGRpdGlvbmFsIG9wdGlvbnMgdXNlZCBmb3IgdGhlIGRlc2VyaWFsaXphdGlvbi5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmV2YWxGdW5jdGlvbnM9ZmFsc2VdIGV2YWx1YXRlIGZ1bmN0aW9ucyBpbiB0aGUgQlNPTiBkb2N1bWVudCBzY29wZWQgdG8gdGhlIG9iamVjdCBkZXNlcmlhbGl6ZWQuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5jYWNoZUZ1bmN0aW9ucz1mYWxzZV0gY2FjaGUgZXZhbHVhdGVkIGZ1bmN0aW9ucyBmb3IgcmV1c2UuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5jYWNoZUZ1bmN0aW9uc0NyYzMyPWZhbHNlXSB1c2UgYSBjcmMzMiBjb2RlIGZvciBjYWNoaW5nLCBvdGhlcndpc2UgdXNlIHRoZSBzdHJpbmcgb2YgdGhlIGZ1bmN0aW9uLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucHJvbW90ZUxvbmdzPXRydWVdIHdoZW4gZGVzZXJpYWxpemluZyBhIExvbmcgd2lsbCBmaXQgaXQgaW50byBhIE51bWJlciBpZiBpdCdzIHNtYWxsZXIgdGhhbiA1MyBiaXRzXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5wcm9tb3RlQnVmZmVycz1mYWxzZV0gd2hlbiBkZXNlcmlhbGl6aW5nIGEgQmluYXJ5IHdpbGwgcmV0dXJuIGl0IGFzIGEgbm9kZS5qcyBCdWZmZXIgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5wcm9tb3RlVmFsdWVzPWZhbHNlXSB3aGVuIGRlc2VyaWFsaXppbmcgd2lsbCBwcm9tb3RlIEJTT04gdmFsdWVzIHRvIHRoZWlyIE5vZGUuanMgY2xvc2VzdCBlcXVpdmFsZW50IHR5cGVzLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZmllbGRzQXNSYXc9bnVsbF0gYWxsb3cgdG8gc3BlY2lmeSBpZiB0aGVyZSB3aGF0IGZpZWxkcyB3ZSB3aXNoIHRvIHJldHVybiBhcyB1bnNlcmlhbGl6ZWQgcmF3IGJ1ZmZlci5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmJzb25SZWdFeHA9ZmFsc2VdIHJldHVybiBCU09OIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXMgQlNPTlJlZ0V4cCBpbnN0YW5jZXMuXG5cdCAqIEByZXR1cm4ge051bWJlcn0gcmV0dXJucyB0aGUgbmV4dCBpbmRleCBpbiB0aGUgYnVmZmVyIGFmdGVyIGRlc2VyaWFsaXphdGlvbiAqKngqKiBudW1iZXJzIG9mIGRvY3VtZW50cy5cblx0ICovXG5cblxuXHRmdW5jdGlvbiBkZXNlcmlhbGl6ZVN0cmVhbShkYXRhLCBzdGFydEluZGV4LCBudW1iZXJPZkRvY3VtZW50cywgZG9jdW1lbnRzLCBkb2NTdGFydEluZGV4LCBvcHRpb25zKSB7XG5cdCAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xuXHQgICAgYWxsb3dPYmplY3RTbWFsbGVyVGhhbkJ1ZmZlclNpemU6IHRydWVcblx0ICB9LCBvcHRpb25zKTtcblx0ICBkYXRhID0gZW5zdXJlX2J1ZmZlcihkYXRhKTtcblx0ICB2YXIgaW5kZXggPSBzdGFydEluZGV4OyAvLyBMb29wIG92ZXIgYWxsIGRvY3VtZW50c1xuXG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1iZXJPZkRvY3VtZW50czsgaSsrKSB7XG5cdCAgICAvLyBGaW5kIHNpemUgb2YgdGhlIGRvY3VtZW50XG5cdCAgICB2YXIgc2l6ZSA9IGRhdGFbaW5kZXhdIHwgZGF0YVtpbmRleCArIDFdIDw8IDggfCBkYXRhW2luZGV4ICsgMl0gPDwgMTYgfCBkYXRhW2luZGV4ICsgM10gPDwgMjQ7IC8vIFVwZGF0ZSBvcHRpb25zIHdpdGggaW5kZXhcblxuXHQgICAgb3B0aW9ucy5pbmRleCA9IGluZGV4OyAvLyBQYXJzZSB0aGUgZG9jdW1lbnQgYXQgdGhpcyBwb2ludFxuXG5cdCAgICBkb2N1bWVudHNbZG9jU3RhcnRJbmRleCArIGldID0gZGVzZXJpYWxpemVyKGRhdGEsIG9wdGlvbnMpOyAvLyBBZGp1c3QgaW5kZXggYnkgdGhlIGRvY3VtZW50IHNpemVcblxuXHQgICAgaW5kZXggPSBpbmRleCArIHNpemU7XG5cdCAgfSAvLyBSZXR1cm4gb2JqZWN0IGNvbnRhaW5pbmcgZW5kIGluZGV4IG9mIHBhcnNpbmcgYW5kIGxpc3Qgb2YgZG9jdW1lbnRzXG5cblxuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdHZhciBic29uID0ge1xuXHQgIC8vIGNvbnN0YW50c1xuXHQgIC8vIE5PVEU6IHRoaXMgaXMgZG9uZSB0aGlzIHdheSBiZWNhdXNlIHJvbGx1cCBjYW4ndCByZXNvbHZlIGFuIGBPYmplY3QuYXNzaWduYGVkIGV4cG9ydFxuXHQgIEJTT05fSU5UMzJfTUFYOiBjb25zdGFudHMuQlNPTl9JTlQzMl9NQVgsXG5cdCAgQlNPTl9JTlQzMl9NSU46IGNvbnN0YW50cy5CU09OX0lOVDMyX01JTixcblx0ICBCU09OX0lOVDY0X01BWDogY29uc3RhbnRzLkJTT05fSU5UNjRfTUFYLFxuXHQgIEJTT05fSU5UNjRfTUlOOiBjb25zdGFudHMuQlNPTl9JTlQ2NF9NSU4sXG5cdCAgSlNfSU5UX01BWDogY29uc3RhbnRzLkpTX0lOVF9NQVgsXG5cdCAgSlNfSU5UX01JTjogY29uc3RhbnRzLkpTX0lOVF9NSU4sXG5cdCAgQlNPTl9EQVRBX05VTUJFUjogY29uc3RhbnRzLkJTT05fREFUQV9OVU1CRVIsXG5cdCAgQlNPTl9EQVRBX1NUUklORzogY29uc3RhbnRzLkJTT05fREFUQV9TVFJJTkcsXG5cdCAgQlNPTl9EQVRBX09CSkVDVDogY29uc3RhbnRzLkJTT05fREFUQV9PQkpFQ1QsXG5cdCAgQlNPTl9EQVRBX0FSUkFZOiBjb25zdGFudHMuQlNPTl9EQVRBX0FSUkFZLFxuXHQgIEJTT05fREFUQV9CSU5BUlk6IGNvbnN0YW50cy5CU09OX0RBVEFfQklOQVJZLFxuXHQgIEJTT05fREFUQV9VTkRFRklORUQ6IGNvbnN0YW50cy5CU09OX0RBVEFfVU5ERUZJTkVELFxuXHQgIEJTT05fREFUQV9PSUQ6IGNvbnN0YW50cy5CU09OX0RBVEFfT0lELFxuXHQgIEJTT05fREFUQV9CT09MRUFOOiBjb25zdGFudHMuQlNPTl9EQVRBX0JPT0xFQU4sXG5cdCAgQlNPTl9EQVRBX0RBVEU6IGNvbnN0YW50cy5CU09OX0RBVEFfREFURSxcblx0ICBCU09OX0RBVEFfTlVMTDogY29uc3RhbnRzLkJTT05fREFUQV9OVUxMLFxuXHQgIEJTT05fREFUQV9SRUdFWFA6IGNvbnN0YW50cy5CU09OX0RBVEFfUkVHRVhQLFxuXHQgIEJTT05fREFUQV9EQlBPSU5URVI6IGNvbnN0YW50cy5CU09OX0RBVEFfREJQT0lOVEVSLFxuXHQgIEJTT05fREFUQV9DT0RFOiBjb25zdGFudHMuQlNPTl9EQVRBX0NPREUsXG5cdCAgQlNPTl9EQVRBX1NZTUJPTDogY29uc3RhbnRzLkJTT05fREFUQV9TWU1CT0wsXG5cdCAgQlNPTl9EQVRBX0NPREVfV19TQ09QRTogY29uc3RhbnRzLkJTT05fREFUQV9DT0RFX1dfU0NPUEUsXG5cdCAgQlNPTl9EQVRBX0lOVDogY29uc3RhbnRzLkJTT05fREFUQV9JTlQsXG5cdCAgQlNPTl9EQVRBX1RJTUVTVEFNUDogY29uc3RhbnRzLkJTT05fREFUQV9USU1FU1RBTVAsXG5cdCAgQlNPTl9EQVRBX0xPTkc6IGNvbnN0YW50cy5CU09OX0RBVEFfTE9ORyxcblx0ICBCU09OX0RBVEFfREVDSU1BTDEyODogY29uc3RhbnRzLkJTT05fREFUQV9ERUNJTUFMMTI4LFxuXHQgIEJTT05fREFUQV9NSU5fS0VZOiBjb25zdGFudHMuQlNPTl9EQVRBX01JTl9LRVksXG5cdCAgQlNPTl9EQVRBX01BWF9LRVk6IGNvbnN0YW50cy5CU09OX0RBVEFfTUFYX0tFWSxcblx0ICBCU09OX0JJTkFSWV9TVUJUWVBFX0RFRkFVTFQ6IGNvbnN0YW50cy5CU09OX0JJTkFSWV9TVUJUWVBFX0RFRkFVTFQsXG5cdCAgQlNPTl9CSU5BUllfU1VCVFlQRV9GVU5DVElPTjogY29uc3RhbnRzLkJTT05fQklOQVJZX1NVQlRZUEVfRlVOQ1RJT04sXG5cdCAgQlNPTl9CSU5BUllfU1VCVFlQRV9CWVRFX0FSUkFZOiBjb25zdGFudHMuQlNPTl9CSU5BUllfU1VCVFlQRV9CWVRFX0FSUkFZLFxuXHQgIEJTT05fQklOQVJZX1NVQlRZUEVfVVVJRDogY29uc3RhbnRzLkJTT05fQklOQVJZX1NVQlRZUEVfVVVJRCxcblx0ICBCU09OX0JJTkFSWV9TVUJUWVBFX01ENTogY29uc3RhbnRzLkJTT05fQklOQVJZX1NVQlRZUEVfTUQ1LFxuXHQgIEJTT05fQklOQVJZX1NVQlRZUEVfVVNFUl9ERUZJTkVEOiBjb25zdGFudHMuQlNPTl9CSU5BUllfU1VCVFlQRV9VU0VSX0RFRklORUQsXG5cdCAgLy8gd3JhcHBlZCB0eXBlc1xuXHQgIENvZGU6IGNvZGUsXG5cdCAgTWFwOiBtYXAsXG5cdCAgQlNPTlN5bWJvbDogc3ltYm9sLFxuXHQgIERCUmVmOiBkYl9yZWYsXG5cdCAgQmluYXJ5OiBiaW5hcnksXG5cdCAgT2JqZWN0SWQ6IG9iamVjdGlkLFxuXHQgIExvbmc6IGxvbmdfMSxcblx0ICBUaW1lc3RhbXA6IHRpbWVzdGFtcCxcblx0ICBEb3VibGU6IGRvdWJsZV8xLFxuXHQgIEludDMyOiBpbnRfMzIsXG5cdCAgTWluS2V5OiBtaW5fa2V5LFxuXHQgIE1heEtleTogbWF4X2tleSxcblx0ICBCU09OUmVnRXhwOiByZWdleHAsXG5cdCAgRGVjaW1hbDEyODogZGVjaW1hbDEyOCxcblx0ICAvLyBtZXRob2RzXG5cdCAgc2VyaWFsaXplOiBzZXJpYWxpemUkMSxcblx0ICBzZXJpYWxpemVXaXRoQnVmZmVyQW5kSW5kZXg6IHNlcmlhbGl6ZVdpdGhCdWZmZXJBbmRJbmRleCxcblx0ICBkZXNlcmlhbGl6ZTogZGVzZXJpYWxpemUkMixcblx0ICBjYWxjdWxhdGVPYmplY3RTaXplOiBjYWxjdWxhdGVPYmplY3RTaXplJDEsXG5cdCAgZGVzZXJpYWxpemVTdHJlYW06IGRlc2VyaWFsaXplU3RyZWFtLFxuXHQgIHNldEludGVybmFsQnVmZmVyU2l6ZTogc2V0SW50ZXJuYWxCdWZmZXJTaXplLFxuXHQgIC8vIGxlZ2FjeSBzdXBwb3J0XG5cdCAgT2JqZWN0SUQ6IG9iamVjdGlkLFxuXHQgIC8vIEV4dGVuZGVkIEpTT05cblx0ICBFSlNPTjogZXh0ZW5kZWRfanNvblxuXHR9O1xuXHR2YXIgYnNvbl8xID0gYnNvbi5CU09OX0lOVDMyX01BWDtcblx0dmFyIGJzb25fMiA9IGJzb24uQlNPTl9JTlQzMl9NSU47XG5cdHZhciBic29uXzMgPSBic29uLkJTT05fSU5UNjRfTUFYO1xuXHR2YXIgYnNvbl80ID0gYnNvbi5CU09OX0lOVDY0X01JTjtcblx0dmFyIGJzb25fNSA9IGJzb24uSlNfSU5UX01BWDtcblx0dmFyIGJzb25fNiA9IGJzb24uSlNfSU5UX01JTjtcblx0dmFyIGJzb25fNyA9IGJzb24uQlNPTl9EQVRBX05VTUJFUjtcblx0dmFyIGJzb25fOCA9IGJzb24uQlNPTl9EQVRBX1NUUklORztcblx0dmFyIGJzb25fOSA9IGJzb24uQlNPTl9EQVRBX09CSkVDVDtcblx0dmFyIGJzb25fMTAgPSBic29uLkJTT05fREFUQV9BUlJBWTtcblx0dmFyIGJzb25fMTEgPSBic29uLkJTT05fREFUQV9CSU5BUlk7XG5cdHZhciBic29uXzEyID0gYnNvbi5CU09OX0RBVEFfVU5ERUZJTkVEO1xuXHR2YXIgYnNvbl8xMyA9IGJzb24uQlNPTl9EQVRBX09JRDtcblx0dmFyIGJzb25fMTQgPSBic29uLkJTT05fREFUQV9CT09MRUFOO1xuXHR2YXIgYnNvbl8xNSA9IGJzb24uQlNPTl9EQVRBX0RBVEU7XG5cdHZhciBic29uXzE2ID0gYnNvbi5CU09OX0RBVEFfTlVMTDtcblx0dmFyIGJzb25fMTcgPSBic29uLkJTT05fREFUQV9SRUdFWFA7XG5cdHZhciBic29uXzE4ID0gYnNvbi5CU09OX0RBVEFfREJQT0lOVEVSO1xuXHR2YXIgYnNvbl8xOSA9IGJzb24uQlNPTl9EQVRBX0NPREU7XG5cdHZhciBic29uXzIwID0gYnNvbi5CU09OX0RBVEFfU1lNQk9MO1xuXHR2YXIgYnNvbl8yMSA9IGJzb24uQlNPTl9EQVRBX0NPREVfV19TQ09QRTtcblx0dmFyIGJzb25fMjIgPSBic29uLkJTT05fREFUQV9JTlQ7XG5cdHZhciBic29uXzIzID0gYnNvbi5CU09OX0RBVEFfVElNRVNUQU1QO1xuXHR2YXIgYnNvbl8yNCA9IGJzb24uQlNPTl9EQVRBX0xPTkc7XG5cdHZhciBic29uXzI1ID0gYnNvbi5CU09OX0RBVEFfREVDSU1BTDEyODtcblx0dmFyIGJzb25fMjYgPSBic29uLkJTT05fREFUQV9NSU5fS0VZO1xuXHR2YXIgYnNvbl8yNyA9IGJzb24uQlNPTl9EQVRBX01BWF9LRVk7XG5cdHZhciBic29uXzI4ID0gYnNvbi5CU09OX0JJTkFSWV9TVUJUWVBFX0RFRkFVTFQ7XG5cdHZhciBic29uXzI5ID0gYnNvbi5CU09OX0JJTkFSWV9TVUJUWVBFX0ZVTkNUSU9OO1xuXHR2YXIgYnNvbl8zMCA9IGJzb24uQlNPTl9CSU5BUllfU1VCVFlQRV9CWVRFX0FSUkFZO1xuXHR2YXIgYnNvbl8zMSA9IGJzb24uQlNPTl9CSU5BUllfU1VCVFlQRV9VVUlEO1xuXHR2YXIgYnNvbl8zMiA9IGJzb24uQlNPTl9CSU5BUllfU1VCVFlQRV9NRDU7XG5cdHZhciBic29uXzMzID0gYnNvbi5CU09OX0JJTkFSWV9TVUJUWVBFX1VTRVJfREVGSU5FRDtcblx0dmFyIGJzb25fMzQgPSBic29uLkNvZGU7XG5cdHZhciBic29uXzM1ID0gYnNvbi5CU09OU3ltYm9sO1xuXHR2YXIgYnNvbl8zNiA9IGJzb24uREJSZWY7XG5cdHZhciBic29uXzM3ID0gYnNvbi5CaW5hcnk7XG5cdHZhciBic29uXzM4ID0gYnNvbi5PYmplY3RJZDtcblx0dmFyIGJzb25fMzkgPSBic29uLkxvbmc7XG5cdHZhciBic29uXzQwID0gYnNvbi5UaW1lc3RhbXA7XG5cdHZhciBic29uXzQxID0gYnNvbi5Eb3VibGU7XG5cdHZhciBic29uXzQyID0gYnNvbi5JbnQzMjtcblx0dmFyIGJzb25fNDMgPSBic29uLk1pbktleTtcblx0dmFyIGJzb25fNDQgPSBic29uLk1heEtleTtcblx0dmFyIGJzb25fNDUgPSBic29uLkJTT05SZWdFeHA7XG5cdHZhciBic29uXzQ2ID0gYnNvbi5EZWNpbWFsMTI4O1xuXHR2YXIgYnNvbl80NyA9IGJzb24uc2VyaWFsaXplO1xuXHR2YXIgYnNvbl80OCA9IGJzb24uc2VyaWFsaXplV2l0aEJ1ZmZlckFuZEluZGV4O1xuXHR2YXIgYnNvbl80OSA9IGJzb24uZGVzZXJpYWxpemU7XG5cdHZhciBic29uXzUwID0gYnNvbi5jYWxjdWxhdGVPYmplY3RTaXplO1xuXHR2YXIgYnNvbl81MSA9IGJzb24uZGVzZXJpYWxpemVTdHJlYW07XG5cdHZhciBic29uXzUyID0gYnNvbi5zZXRJbnRlcm5hbEJ1ZmZlclNpemU7XG5cdHZhciBic29uXzUzID0gYnNvbi5PYmplY3RJRDtcblx0dmFyIGJzb25fNTQgPSBic29uLkVKU09OO1xuXG5cdGV4cG9ydHMuZGVmYXVsdCA9IGJzb247XG5cdGV4cG9ydHMuQlNPTl9JTlQzMl9NQVggPSBic29uXzE7XG5cdGV4cG9ydHMuQlNPTl9JTlQzMl9NSU4gPSBic29uXzI7XG5cdGV4cG9ydHMuQlNPTl9JTlQ2NF9NQVggPSBic29uXzM7XG5cdGV4cG9ydHMuQlNPTl9JTlQ2NF9NSU4gPSBic29uXzQ7XG5cdGV4cG9ydHMuSlNfSU5UX01BWCA9IGJzb25fNTtcblx0ZXhwb3J0cy5KU19JTlRfTUlOID0gYnNvbl82O1xuXHRleHBvcnRzLkJTT05fREFUQV9OVU1CRVIgPSBic29uXzc7XG5cdGV4cG9ydHMuQlNPTl9EQVRBX1NUUklORyA9IGJzb25fODtcblx0ZXhwb3J0cy5CU09OX0RBVEFfT0JKRUNUID0gYnNvbl85O1xuXHRleHBvcnRzLkJTT05fREFUQV9BUlJBWSA9IGJzb25fMTA7XG5cdGV4cG9ydHMuQlNPTl9EQVRBX0JJTkFSWSA9IGJzb25fMTE7XG5cdGV4cG9ydHMuQlNPTl9EQVRBX1VOREVGSU5FRCA9IGJzb25fMTI7XG5cdGV4cG9ydHMuQlNPTl9EQVRBX09JRCA9IGJzb25fMTM7XG5cdGV4cG9ydHMuQlNPTl9EQVRBX0JPT0xFQU4gPSBic29uXzE0O1xuXHRleHBvcnRzLkJTT05fREFUQV9EQVRFID0gYnNvbl8xNTtcblx0ZXhwb3J0cy5CU09OX0RBVEFfTlVMTCA9IGJzb25fMTY7XG5cdGV4cG9ydHMuQlNPTl9EQVRBX1JFR0VYUCA9IGJzb25fMTc7XG5cdGV4cG9ydHMuQlNPTl9EQVRBX0RCUE9JTlRFUiA9IGJzb25fMTg7XG5cdGV4cG9ydHMuQlNPTl9EQVRBX0NPREUgPSBic29uXzE5O1xuXHRleHBvcnRzLkJTT05fREFUQV9TWU1CT0wgPSBic29uXzIwO1xuXHRleHBvcnRzLkJTT05fREFUQV9DT0RFX1dfU0NPUEUgPSBic29uXzIxO1xuXHRleHBvcnRzLkJTT05fREFUQV9JTlQgPSBic29uXzIyO1xuXHRleHBvcnRzLkJTT05fREFUQV9USU1FU1RBTVAgPSBic29uXzIzO1xuXHRleHBvcnRzLkJTT05fREFUQV9MT05HID0gYnNvbl8yNDtcblx0ZXhwb3J0cy5CU09OX0RBVEFfREVDSU1BTDEyOCA9IGJzb25fMjU7XG5cdGV4cG9ydHMuQlNPTl9EQVRBX01JTl9LRVkgPSBic29uXzI2O1xuXHRleHBvcnRzLkJTT05fREFUQV9NQVhfS0VZID0gYnNvbl8yNztcblx0ZXhwb3J0cy5CU09OX0JJTkFSWV9TVUJUWVBFX0RFRkFVTFQgPSBic29uXzI4O1xuXHRleHBvcnRzLkJTT05fQklOQVJZX1NVQlRZUEVfRlVOQ1RJT04gPSBic29uXzI5O1xuXHRleHBvcnRzLkJTT05fQklOQVJZX1NVQlRZUEVfQllURV9BUlJBWSA9IGJzb25fMzA7XG5cdGV4cG9ydHMuQlNPTl9CSU5BUllfU1VCVFlQRV9VVUlEID0gYnNvbl8zMTtcblx0ZXhwb3J0cy5CU09OX0JJTkFSWV9TVUJUWVBFX01ENSA9IGJzb25fMzI7XG5cdGV4cG9ydHMuQlNPTl9CSU5BUllfU1VCVFlQRV9VU0VSX0RFRklORUQgPSBic29uXzMzO1xuXHRleHBvcnRzLkNvZGUgPSBic29uXzM0O1xuXHRleHBvcnRzLkJTT05TeW1ib2wgPSBic29uXzM1O1xuXHRleHBvcnRzLkRCUmVmID0gYnNvbl8zNjtcblx0ZXhwb3J0cy5CaW5hcnkgPSBic29uXzM3O1xuXHRleHBvcnRzLk9iamVjdElkID0gYnNvbl8zODtcblx0ZXhwb3J0cy5Mb25nID0gYnNvbl8zOTtcblx0ZXhwb3J0cy5UaW1lc3RhbXAgPSBic29uXzQwO1xuXHRleHBvcnRzLkRvdWJsZSA9IGJzb25fNDE7XG5cdGV4cG9ydHMuSW50MzIgPSBic29uXzQyO1xuXHRleHBvcnRzLk1pbktleSA9IGJzb25fNDM7XG5cdGV4cG9ydHMuTWF4S2V5ID0gYnNvbl80NDtcblx0ZXhwb3J0cy5CU09OUmVnRXhwID0gYnNvbl80NTtcblx0ZXhwb3J0cy5EZWNpbWFsMTI4ID0gYnNvbl80Njtcblx0ZXhwb3J0cy5zZXJpYWxpemUgPSBic29uXzQ3O1xuXHRleHBvcnRzLnNlcmlhbGl6ZVdpdGhCdWZmZXJBbmRJbmRleCA9IGJzb25fNDg7XG5cdGV4cG9ydHMuZGVzZXJpYWxpemUgPSBic29uXzQ5O1xuXHRleHBvcnRzLmNhbGN1bGF0ZU9iamVjdFNpemUgPSBic29uXzUwO1xuXHRleHBvcnRzLmRlc2VyaWFsaXplU3RyZWFtID0gYnNvbl81MTtcblx0ZXhwb3J0cy5zZXRJbnRlcm5hbEJ1ZmZlclNpemUgPSBic29uXzUyO1xuXHRleHBvcnRzLk9iamVjdElEID0gYnNvbl81Mztcblx0ZXhwb3J0cy5FSlNPTiA9IGJzb25fNTQ7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpKTtcblxuLyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oMCksIF9fd2VicGFja19yZXF1aXJlX18oMSkuQnVmZmVyKSlcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxuLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxuLy8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQjVVJMX2FwcGxpY2F0aW9uc1xucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gZ2V0TGVucyAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcy9pc3N1ZXMvNDJcbiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKVxuICBpZiAodmFsaWRMZW4gPT09IC0xKSB2YWxpZExlbiA9IGxlblxuXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuXG4gICAgPyAwXG4gICAgOiA0IC0gKHZhbGlkTGVuICUgNClcblxuICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dXG59XG5cbi8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIF9ieXRlTGVuZ3RoIChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG5cbiAgdmFyIGFyciA9IG5ldyBBcnIoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSlcblxuICB2YXIgY3VyQnl0ZSA9IDBcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwXG4gICAgPyB2YWxpZExlbiAtIDRcbiAgICA6IHZhbGlkTGVuXG5cbiAgdmFyIGlcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8XG4gICAgICByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMikge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDEpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPVxuICAgICAgKCh1aW50OFtpXSA8PCAxNikgJiAweEZGMDAwMCkgK1xuICAgICAgKCh1aW50OFtpICsgMV0gPDwgOCkgJiAweEZGMDApICtcbiAgICAgICh1aW50OFtpICsgMl0gJiAweEZGKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKFxuICAgICAgdWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKVxuICAgICkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAyXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdICtcbiAgICAgICc9PSdcbiAgICApXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArIHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMTBdICtcbiAgICAgIGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXSArXG4gICAgICAnPSdcbiAgICApXG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cblxuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSAoZSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSAobSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICgodmFsdWUgKiBjKSAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuXG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSBMb25nO1xyXG5cclxuLyoqXHJcbiAqIHdhc20gb3B0aW1pemF0aW9ucywgdG8gZG8gbmF0aXZlIGk2NCBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aWRlXHJcbiAqL1xyXG52YXIgd2FzbSA9IG51bGw7XHJcblxyXG50cnkge1xyXG4gIHdhc20gPSBuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UobmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShuZXcgVWludDhBcnJheShbXHJcbiAgICAwLCA5NywgMTE1LCAxMDksIDEsIDAsIDAsIDAsIDEsIDEzLCAyLCA5NiwgMCwgMSwgMTI3LCA5NiwgNCwgMTI3LCAxMjcsIDEyNywgMTI3LCAxLCAxMjcsIDMsIDcsIDYsIDAsIDEsIDEsIDEsIDEsIDEsIDYsIDYsIDEsIDEyNywgMSwgNjUsIDAsIDExLCA3LCA1MCwgNiwgMywgMTA5LCAxMTcsIDEwOCwgMCwgMSwgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNSwgMCwgMiwgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNywgMCwgMywgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNSwgMCwgNCwgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNywgMCwgNSwgOCwgMTAzLCAxMDEsIDExNiwgOTUsIDEwNCwgMTA1LCAxMDMsIDEwNCwgMCwgMCwgMTAsIDE5MSwgMSwgNiwgNCwgMCwgMzUsIDAsIDExLCAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjYsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsIDE2NywgMTEsIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyNywgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCwgMTY3LCAxMSwgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MywgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTI4LCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsIDMyLCA0LCAxNjcsIDExLCAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjksIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsIDE2NywgMTEsIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEzMCwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCwgMTY3LCAxMVxyXG4gIF0pKSwge30pLmV4cG9ydHM7XHJcbn0gY2F0Y2ggKGUpIHtcclxuICAvLyBubyB3YXNtIHN1cHBvcnQgOihcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnN0cnVjdHMgYSA2NCBiaXQgdHdvJ3MtY29tcGxlbWVudCBpbnRlZ2VyLCBnaXZlbiBpdHMgbG93IGFuZCBoaWdoIDMyIGJpdCB2YWx1ZXMgYXMgKnNpZ25lZCogaW50ZWdlcnMuXHJcbiAqICBTZWUgdGhlIGZyb20qIGZ1bmN0aW9ucyBiZWxvdyBmb3IgbW9yZSBjb252ZW5pZW50IHdheXMgb2YgY29uc3RydWN0aW5nIExvbmdzLlxyXG4gKiBAZXhwb3J0cyBMb25nXHJcbiAqIEBjbGFzcyBBIExvbmcgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIDY0IGJpdCB0d28ncy1jb21wbGVtZW50IGludGVnZXIgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgVGhlIGxvdyAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBsb25nXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIFRoZSBoaWdoIChzaWduZWQpIDMyIGJpdHMgb2YgdGhlIGxvbmdcclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAY29uc3RydWN0b3JcclxuICovXHJcbmZ1bmN0aW9uIExvbmcobG93LCBoaWdoLCB1bnNpZ25lZCkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxvdyAzMiBiaXRzIGFzIGEgc2lnbmVkIHZhbHVlLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgdGhpcy5sb3cgPSBsb3cgfCAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhpZ2ggMzIgYml0cyBhcyBhIHNpZ25lZCB2YWx1ZS5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIHRoaXMuaGlnaCA9IGhpZ2ggfCAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB1bnNpZ25lZCBvciBub3QuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgdGhpcy51bnNpZ25lZCA9ICEhdW5zaWduZWQ7XHJcbn1cclxuXHJcbi8vIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIGxvbmcgaXMgdGhlIHR3byBnaXZlbiBzaWduZWQsIDMyLWJpdCB2YWx1ZXMuXHJcbi8vIFdlIHVzZSAzMi1iaXQgcGllY2VzIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBzaXplIG9mIGludGVnZXJzIG9uIHdoaWNoXHJcbi8vIEphdmFzY3JpcHQgcGVyZm9ybXMgYml0LW9wZXJhdGlvbnMuICBGb3Igb3BlcmF0aW9ucyBsaWtlIGFkZGl0aW9uIGFuZFxyXG4vLyBtdWx0aXBsaWNhdGlvbiwgd2Ugc3BsaXQgZWFjaCBudW1iZXIgaW50byAxNiBiaXQgcGllY2VzLCB3aGljaCBjYW4gZWFzaWx5IGJlXHJcbi8vIG11bHRpcGxpZWQgd2l0aGluIEphdmFzY3JpcHQncyBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbiB3aXRob3V0IG92ZXJmbG93XHJcbi8vIG9yIGNoYW5nZSBpbiBzaWduLlxyXG4vL1xyXG4vLyBJbiB0aGUgYWxnb3JpdGhtcyBiZWxvdywgd2UgZnJlcXVlbnRseSByZWR1Y2UgdGhlIG5lZ2F0aXZlIGNhc2UgdG8gdGhlXHJcbi8vIHBvc2l0aXZlIGNhc2UgYnkgbmVnYXRpbmcgdGhlIGlucHV0KHMpIGFuZCB0aGVuIHBvc3QtcHJvY2Vzc2luZyB0aGUgcmVzdWx0LlxyXG4vLyBOb3RlIHRoYXQgd2UgbXVzdCBBTFdBWVMgY2hlY2sgc3BlY2lhbGx5IHdoZXRoZXIgdGhvc2UgdmFsdWVzIGFyZSBNSU5fVkFMVUVcclxuLy8gKC0yXjYzKSBiZWNhdXNlIC1NSU5fVkFMVUUgPT0gTUlOX1ZBTFVFIChzaW5jZSAyXjYzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhc1xyXG4vLyBhIHBvc2l0aXZlIG51bWJlciwgaXQgb3ZlcmZsb3dzIGJhY2sgaW50byBhIG5lZ2F0aXZlKS4gIE5vdCBoYW5kbGluZyB0aGlzXHJcbi8vIGNhc2Ugd291bGQgb2Z0ZW4gcmVzdWx0IGluIGluZmluaXRlIHJlY3Vyc2lvbi5cclxuLy9cclxuLy8gQ29tbW9uIGNvbnN0YW50IHZhbHVlcyBaRVJPLCBPTkUsIE5FR19PTkUsIGV0Yy4gYXJlIGRlZmluZWQgYmVsb3cgdGhlIGZyb20qXHJcbi8vIG1ldGhvZHMgb24gd2hpY2ggdGhleSBkZXBlbmQuXHJcblxyXG4vKipcclxuICogQW4gaW5kaWNhdG9yIHVzZWQgdG8gcmVsaWFibHkgZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIExvbmcgb3Igbm90LlxyXG4gKiBAdHlwZSB7Ym9vbGVhbn1cclxuICogQGNvbnN0XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5Mb25nLnByb3RvdHlwZS5fX2lzTG9uZ19fO1xyXG5cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KExvbmcucHJvdG90eXBlLCBcIl9faXNMb25nX19cIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuXHJcbi8qKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKiBAaW5uZXJcclxuICovXHJcbmZ1bmN0aW9uIGlzTG9uZyhvYmopIHtcclxuICAgIHJldHVybiAob2JqICYmIG9ialtcIl9faXNMb25nX19cIl0pID09PSB0cnVlO1xyXG59XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYSBMb25nLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZy5pc0xvbmcgPSBpc0xvbmc7XHJcblxyXG4vKipcclxuICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgaW50ZWdlciB2YWx1ZXMuXHJcbiAqIEB0eXBlIHshT2JqZWN0fVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBJTlRfQ0FDSEUgPSB7fTtcclxuXHJcbi8qKlxyXG4gKiBBIGNhY2hlIG9mIHRoZSBMb25nIHJlcHJlc2VudGF0aW9ucyBvZiBzbWFsbCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy5cclxuICogQHR5cGUgeyFPYmplY3R9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFVJTlRfQ0FDSEUgPSB7fTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbmZ1bmN0aW9uIGZyb21JbnQodmFsdWUsIHVuc2lnbmVkKSB7XHJcbiAgICB2YXIgb2JqLCBjYWNoZWRPYmosIGNhY2hlO1xyXG4gICAgaWYgKHVuc2lnbmVkKSB7XHJcbiAgICAgICAgdmFsdWUgPj4+PSAwO1xyXG4gICAgICAgIGlmIChjYWNoZSA9ICgwIDw9IHZhbHVlICYmIHZhbHVlIDwgMjU2KSkge1xyXG4gICAgICAgICAgICBjYWNoZWRPYmogPSBVSU5UX0NBQ0hFW3ZhbHVlXTtcclxuICAgICAgICAgICAgaWYgKGNhY2hlZE9iailcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRPYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCAodmFsdWUgfCAwKSA8IDAgPyAtMSA6IDAsIHRydWUpO1xyXG4gICAgICAgIGlmIChjYWNoZSlcclxuICAgICAgICAgICAgVUlOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFsdWUgfD0gMDtcclxuICAgICAgICBpZiAoY2FjaGUgPSAoLTEyOCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDEyOCkpIHtcclxuICAgICAgICAgICAgY2FjaGVkT2JqID0gSU5UX0NBQ0hFW3ZhbHVlXTtcclxuICAgICAgICAgICAgaWYgKGNhY2hlZE9iailcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRPYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCB2YWx1ZSA8IDAgPyAtMSA6IDAsIGZhbHNlKTtcclxuICAgICAgICBpZiAoY2FjaGUpXHJcbiAgICAgICAgICAgIElOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gMzIgYml0IGludGVnZXIgdmFsdWUuXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIDMyIGJpdCBpbnRlZ2VyIGluIHF1ZXN0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21JbnQgPSBmcm9tSW50O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxuZnVuY3Rpb24gZnJvbU51bWJlcih2YWx1ZSwgdW5zaWduZWQpIHtcclxuICAgIGlmIChpc05hTih2YWx1ZSkpXHJcbiAgICAgICAgcmV0dXJuIHVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xyXG4gICAgaWYgKHVuc2lnbmVkKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlIDwgMClcclxuICAgICAgICAgICAgcmV0dXJuIFVaRVJPO1xyXG4gICAgICAgIGlmICh2YWx1ZSA+PSBUV09fUFdSXzY0X0RCTClcclxuICAgICAgICAgICAgcmV0dXJuIE1BWF9VTlNJR05FRF9WQUxVRTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHZhbHVlIDw9IC1UV09fUFdSXzYzX0RCTClcclxuICAgICAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTtcclxuICAgICAgICBpZiAodmFsdWUgKyAxID49IFRXT19QV1JfNjNfREJMKVxyXG4gICAgICAgICAgICByZXR1cm4gTUFYX1ZBTFVFO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlIDwgMClcclxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcigtdmFsdWUsIHVuc2lnbmVkKS5uZWcoKTtcclxuICAgIHJldHVybiBmcm9tQml0cygodmFsdWUgJSBUV09fUFdSXzMyX0RCTCkgfCAwLCAodmFsdWUgLyBUV09fUFdSXzMyX0RCTCkgfCAwLCB1bnNpZ25lZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZhbHVlLCBwcm92aWRlZCB0aGF0IGl0IGlzIGEgZmluaXRlIG51bWJlci4gT3RoZXJ3aXNlLCB6ZXJvIGlzIHJldHVybmVkLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBudW1iZXIgaW4gcXVlc3Rpb25cclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcclxuICovXHJcbkxvbmcuZnJvbU51bWJlciA9IGZyb21OdW1iZXI7XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHNcclxuICogQHBhcmFtIHtudW1iZXJ9IGhpZ2hCaXRzXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBmcm9tQml0cyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpIHtcclxuICAgIHJldHVybiBuZXcgTG9uZyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSA2NCBiaXQgaW50ZWdlciB0aGF0IGNvbWVzIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIGdpdmVuIGxvdyBhbmQgaGlnaCBiaXRzLiBFYWNoIGlzXHJcbiAqICBhc3N1bWVkIHRvIHVzZSAzMiBiaXRzLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHMgVGhlIGxvdyAzMiBiaXRzXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoQml0cyBUaGUgaGlnaCAzMiBiaXRzXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21CaXRzID0gZnJvbUJpdHM7XHJcblxyXG4vKipcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHBvbmVudFxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBwb3dfZGJsID0gTWF0aC5wb3c7IC8vIFVzZWQgNCB0aW1lcyAoNCo4IHRvIDE1KzQpXHJcblxyXG4vKipcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxyXG4gKiBAcGFyYW0geyhib29sZWFufG51bWJlcik9fSB1bnNpZ25lZFxyXG4gKiBAcGFyYW0ge251bWJlcj19IHJhZGl4XHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0ciwgdW5zaWduZWQsIHJhZGl4KSB7XHJcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMClcclxuICAgICAgICB0aHJvdyBFcnJvcignZW1wdHkgc3RyaW5nJyk7XHJcbiAgICBpZiAoc3RyID09PSBcIk5hTlwiIHx8IHN0ciA9PT0gXCJJbmZpbml0eVwiIHx8IHN0ciA9PT0gXCIrSW5maW5pdHlcIiB8fCBzdHIgPT09IFwiLUluZmluaXR5XCIpXHJcbiAgICAgICAgcmV0dXJuIFpFUk87XHJcbiAgICBpZiAodHlwZW9mIHVuc2lnbmVkID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIC8vIEZvciBnb29nLm1hdGgubG9uZyBjb21wYXRpYmlsaXR5XHJcbiAgICAgICAgcmFkaXggPSB1bnNpZ25lZCxcclxuICAgICAgICB1bnNpZ25lZCA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB1bnNpZ25lZCA9ICEhIHVuc2lnbmVkO1xyXG4gICAgfVxyXG4gICAgcmFkaXggPSByYWRpeCB8fCAxMDtcclxuICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeClcclxuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKCdyYWRpeCcpO1xyXG5cclxuICAgIHZhciBwO1xyXG4gICAgaWYgKChwID0gc3RyLmluZGV4T2YoJy0nKSkgPiAwKVxyXG4gICAgICAgIHRocm93IEVycm9yKCdpbnRlcmlvciBoeXBoZW4nKTtcclxuICAgIGVsc2UgaWYgKHAgPT09IDApIHtcclxuICAgICAgICByZXR1cm4gZnJvbVN0cmluZyhzdHIuc3Vic3RyaW5nKDEpLCB1bnNpZ25lZCwgcmFkaXgpLm5lZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERvIHNldmVyYWwgKDgpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cclxuICAgIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxyXG4gICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgOCkpO1xyXG5cclxuICAgIHZhciByZXN1bHQgPSBaRVJPO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDgpIHtcclxuICAgICAgICB2YXIgc2l6ZSA9IE1hdGgubWluKDgsIHN0ci5sZW5ndGggLSBpKSxcclxuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludChzdHIuc3Vic3RyaW5nKGksIGkgKyBzaXplKSwgcmFkaXgpO1xyXG4gICAgICAgIGlmIChzaXplIDwgOCkge1xyXG4gICAgICAgICAgICB2YXIgcG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIHNpemUpKTtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChwb3dlcikuYWRkKGZyb21OdW1iZXIodmFsdWUpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQubXVsKHJhZGl4VG9Qb3dlcik7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGQoZnJvbU51bWJlcih2YWx1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJlc3VsdC51bnNpZ25lZCA9IHVuc2lnbmVkO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzdHJpbmcsIHdyaXR0ZW4gdXNpbmcgdGhlIHNwZWNpZmllZCByYWRpeC5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIExvbmdcclxuICogQHBhcmFtIHsoYm9vbGVhbnxudW1iZXIpPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcGFyYW0ge251bWJlcj19IHJhZGl4IFRoZSByYWRpeCBpbiB3aGljaCB0aGUgdGV4dCBpcyB3cml0dGVuICgyLTM2KSwgZGVmYXVsdHMgdG8gMTBcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21TdHJpbmcgPSBmcm9tU3RyaW5nO1xyXG5cclxuLyoqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd8IXtsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyLCB1bnNpZ25lZDogYm9vbGVhbn19IHZhbFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxuZnVuY3Rpb24gZnJvbVZhbHVlKHZhbCwgdW5zaWduZWQpIHtcclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJylcclxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcih2YWwsIHVuc2lnbmVkKTtcclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJylcclxuICAgICAgICByZXR1cm4gZnJvbVN0cmluZyh2YWwsIHVuc2lnbmVkKTtcclxuICAgIC8vIFRocm93cyBmb3Igbm9uLW9iamVjdHMsIGNvbnZlcnRzIG5vbi1pbnN0YW5jZW9mIExvbmc6XHJcbiAgICByZXR1cm4gZnJvbUJpdHModmFsLmxvdywgdmFsLmhpZ2gsIHR5cGVvZiB1bnNpZ25lZCA9PT0gJ2Jvb2xlYW4nID8gdW5zaWduZWQgOiB2YWwudW5zaWduZWQpO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBhIExvbmcgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGZyb20qIGZ1bmN0aW9uIGZvciBpdHMgdHlwZS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ3whe2xvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIsIHVuc2lnbmVkOiBib29sZWFufX0gdmFsIFZhbHVlXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5mcm9tVmFsdWUgPSBmcm9tVmFsdWU7XHJcblxyXG4vLyBOT1RFOiB0aGUgY29tcGlsZXIgc2hvdWxkIGlubGluZSB0aGVzZSBjb25zdGFudCB2YWx1ZXMgYmVsb3cgYW5kIHRoZW4gcmVtb3ZlIHRoZXNlIHZhcmlhYmxlcywgc28gdGhlcmUgc2hvdWxkIGJlXHJcbi8vIG5vIHJ1bnRpbWUgcGVuYWx0eSBmb3IgdGhlc2UuXHJcblxyXG4vKipcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFRXT19QV1JfMTZfREJMID0gMSA8PCAxNjtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl8yNF9EQkwgPSAxIDw8IDI0O1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdFxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBUV09fUFdSXzMyX0RCTCA9IFRXT19QV1JfMTZfREJMICogVFdPX1BXUl8xNl9EQkw7XHJcblxyXG4vKipcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFRXT19QV1JfNjRfREJMID0gVFdPX1BXUl8zMl9EQkwgKiBUV09fUFdSXzMyX0RCTDtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl82M19EQkwgPSBUV09fUFdSXzY0X0RCTCAvIDI7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl8yNCA9IGZyb21JbnQoVFdPX1BXUl8yNF9EQkwpO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgWkVSTyA9IGZyb21JbnQoMCk7XHJcblxyXG4vKipcclxuICogU2lnbmVkIHplcm8uXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICovXHJcbkxvbmcuWkVSTyA9IFpFUk87XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBVWkVSTyA9IGZyb21JbnQoMCwgdHJ1ZSk7XHJcblxyXG4vKipcclxuICogVW5zaWduZWQgemVyby5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5VWkVSTyA9IFVaRVJPO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgT05FID0gZnJvbUludCgxKTtcclxuXHJcbi8qKlxyXG4gKiBTaWduZWQgb25lLlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nLk9ORSA9IE9ORTtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFVPTkUgPSBmcm9tSW50KDEsIHRydWUpO1xyXG5cclxuLyoqXHJcbiAqIFVuc2lnbmVkIG9uZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5VT05FID0gVU9ORTtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIE5FR19PTkUgPSBmcm9tSW50KC0xKTtcclxuXHJcbi8qKlxyXG4gKiBTaWduZWQgbmVnYXRpdmUgb25lLlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nLk5FR19PTkUgPSBORUdfT05FO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgTUFYX1ZBTFVFID0gZnJvbUJpdHMoMHhGRkZGRkZGRnwwLCAweDdGRkZGRkZGfDAsIGZhbHNlKTtcclxuXHJcbi8qKlxyXG4gKiBNYXhpbXVtIHNpZ25lZCB2YWx1ZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5NQVhfVkFMVUUgPSBNQVhfVkFMVUU7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBNQVhfVU5TSUdORURfVkFMVUUgPSBmcm9tQml0cygweEZGRkZGRkZGfDAsIDB4RkZGRkZGRkZ8MCwgdHJ1ZSk7XHJcblxyXG4vKipcclxuICogTWF4aW11bSB1bnNpZ25lZCB2YWx1ZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5NQVhfVU5TSUdORURfVkFMVUUgPSBNQVhfVU5TSUdORURfVkFMVUU7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBNSU5fVkFMVUUgPSBmcm9tQml0cygwLCAweDgwMDAwMDAwfDAsIGZhbHNlKTtcclxuXHJcbi8qKlxyXG4gKiBNaW5pbXVtIHNpZ25lZCB2YWx1ZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5NSU5fVkFMVUUgPSBNSU5fVkFMVUU7XHJcblxyXG4vKipcclxuICogQGFsaWFzIExvbmcucHJvdG90eXBlXHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIExvbmdQcm90b3R5cGUgPSBMb25nLnByb3RvdHlwZTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIDMyIGJpdCBpbnRlZ2VyLCBhc3N1bWluZyBpdCBpcyBhIDMyIGJpdCBpbnRlZ2VyLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b0ludCA9IGZ1bmN0aW9uIHRvSW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyB0aGlzLmxvdyA+Pj4gMCA6IHRoaXMubG93O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgdGhlIG5lYXJlc3QgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZSAoZG91YmxlLCA1MyBiaXQgbWFudGlzc2EpLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyKCkge1xyXG4gICAgaWYgKHRoaXMudW5zaWduZWQpXHJcbiAgICAgICAgcmV0dXJuICgodGhpcy5oaWdoID4+PiAwKSAqIFRXT19QV1JfMzJfREJMKSArICh0aGlzLmxvdyA+Pj4gMCk7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdoICogVFdPX1BXUl8zMl9EQkwgKyAodGhpcy5sb3cgPj4+IDApO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgc3RyaW5nIHdyaXR0ZW4gaW4gdGhlIHNwZWNpZmllZCByYWRpeC5cclxuICogQHBhcmFtIHtudW1iZXI9fSByYWRpeCBSYWRpeCAoMi0zNiksIGRlZmF1bHRzIHRvIDEwXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAqIEBvdmVycmlkZVxyXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBJZiBgcmFkaXhgIGlzIG91dCBvZiByYW5nZVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKHJhZGl4KSB7XHJcbiAgICByYWRpeCA9IHJhZGl4IHx8IDEwO1xyXG4gICAgaWYgKHJhZGl4IDwgMiB8fCAzNiA8IHJhZGl4KVxyXG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoJ3JhZGl4Jyk7XHJcbiAgICBpZiAodGhpcy5pc1plcm8oKSlcclxuICAgICAgICByZXR1cm4gJzAnO1xyXG4gICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7IC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxyXG4gICAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcclxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjaGFuZ2UgdGhlIExvbmcgdmFsdWUgYmVmb3JlIGl0IGNhbiBiZSBuZWdhdGVkLCBzbyB3ZSByZW1vdmVcclxuICAgICAgICAgICAgLy8gdGhlIGJvdHRvbS1tb3N0IGRpZ2l0IGluIHRoaXMgYmFzZSBhbmQgdGhlbiByZWN1cnNlIHRvIGRvIHRoZSByZXN0LlxyXG4gICAgICAgICAgICB2YXIgcmFkaXhMb25nID0gZnJvbU51bWJlcihyYWRpeCksXHJcbiAgICAgICAgICAgICAgICBkaXYgPSB0aGlzLmRpdihyYWRpeExvbmcpLFxyXG4gICAgICAgICAgICAgICAgcmVtMSA9IGRpdi5tdWwocmFkaXhMb25nKS5zdWIodGhpcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBkaXYudG9TdHJpbmcocmFkaXgpICsgcmVtMS50b0ludCgpLnRvU3RyaW5nKHJhZGl4KTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuICctJyArIHRoaXMubmVnKCkudG9TdHJpbmcocmFkaXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERvIHNldmVyYWwgKDYpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cclxuICAgIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxyXG4gICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgNiksIHRoaXMudW5zaWduZWQpLFxyXG4gICAgICAgIHJlbSA9IHRoaXM7XHJcbiAgICB2YXIgcmVzdWx0ID0gJyc7XHJcbiAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgIHZhciByZW1EaXYgPSByZW0uZGl2KHJhZGl4VG9Qb3dlciksXHJcbiAgICAgICAgICAgIGludHZhbCA9IHJlbS5zdWIocmVtRGl2Lm11bChyYWRpeFRvUG93ZXIpKS50b0ludCgpID4+PiAwLFxyXG4gICAgICAgICAgICBkaWdpdHMgPSBpbnR2YWwudG9TdHJpbmcocmFkaXgpO1xyXG4gICAgICAgIHJlbSA9IHJlbURpdjtcclxuICAgICAgICBpZiAocmVtLmlzWmVybygpKVxyXG4gICAgICAgICAgICByZXR1cm4gZGlnaXRzICsgcmVzdWx0O1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB3aGlsZSAoZGlnaXRzLmxlbmd0aCA8IDYpXHJcbiAgICAgICAgICAgICAgICBkaWdpdHMgPSAnMCcgKyBkaWdpdHM7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9ICcnICsgZGlnaXRzICsgcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gU2lnbmVkIGhpZ2ggYml0c1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5nZXRIaWdoQml0cyA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgaGlnaCBiaXRzXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmdldEhpZ2hCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRIaWdoQml0c1Vuc2lnbmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaCA+Pj4gMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBsb3cgMzIgYml0cyBhcyBhIHNpZ25lZCBpbnRlZ2VyLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBTaWduZWQgbG93IGJpdHNcclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0cyA9IGZ1bmN0aW9uIGdldExvd0JpdHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sb3c7XHJcbn07XHJcblxyXG4vKipcclxuICogR2V0cyB0aGUgbG93IDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgbG93IGJpdHNcclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0c1Vuc2lnbmVkID0gZnVuY3Rpb24gZ2V0TG93Qml0c1Vuc2lnbmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubG93ID4+PiAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgTG9uZy5cclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0TnVtQml0c0FicyA9IGZ1bmN0aW9uIGdldE51bUJpdHNBYnMoKSB7XHJcbiAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxyXG4gICAgICAgIHJldHVybiB0aGlzLmVxKE1JTl9WQUxVRSkgPyA2NCA6IHRoaXMubmVnKCkuZ2V0TnVtQml0c0FicygpO1xyXG4gICAgdmFyIHZhbCA9IHRoaXMuaGlnaCAhPSAwID8gdGhpcy5oaWdoIDogdGhpcy5sb3c7XHJcbiAgICBmb3IgKHZhciBiaXQgPSAzMTsgYml0ID4gMDsgYml0LS0pXHJcbiAgICAgICAgaWYgKCh2YWwgJiAoMSA8PCBiaXQpKSAhPSAwKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgIHJldHVybiB0aGlzLmhpZ2ggIT0gMCA/IGJpdCArIDMzIDogYml0ICsgMTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgemVyby5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybygpIHtcclxuICAgIHJldHVybiB0aGlzLmhpZ2ggPT09IDAgJiYgdGhpcy5sb3cgPT09IDA7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHplcm8uIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjaXNaZXJvfS5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmVxeiA9IExvbmdQcm90b3R5cGUuaXNaZXJvO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG5lZ2F0aXZlLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuaXNOZWdhdGl2ZSA9IGZ1bmN0aW9uIGlzTmVnYXRpdmUoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMudW5zaWduZWQgJiYgdGhpcy5oaWdoIDwgMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBwb3NpdGl2ZS5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmlzUG9zaXRpdmUgPSBmdW5jdGlvbiBpc1Bvc2l0aXZlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudW5zaWduZWQgfHwgdGhpcy5oaWdoID49IDA7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgb2RkLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuaXNPZGQgPSBmdW5jdGlvbiBpc09kZCgpIHtcclxuICAgIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBldmVuLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuaXNFdmVuID0gZnVuY3Rpb24gaXNFdmVuKCkge1xyXG4gICAgcmV0dXJuICh0aGlzLmxvdyAmIDEpID09PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkJ3MuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xyXG4gICAgaWYgKCFpc0xvbmcob3RoZXIpKVxyXG4gICAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcclxuICAgIGlmICh0aGlzLnVuc2lnbmVkICE9PSBvdGhlci51bnNpZ25lZCAmJiAodGhpcy5oaWdoID4+PiAzMSkgPT09IDEgJiYgKG90aGVyLmhpZ2ggPj4+IDMxKSA9PT0gMSlcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdoID09PSBvdGhlci5oaWdoICYmIHRoaXMubG93ID09PSBvdGhlci5sb3c7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNlcXVhbHN9LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZXEgPSBMb25nUHJvdG90eXBlLmVxdWFscztcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHMgPSBmdW5jdGlvbiBub3RFcXVhbHMob3RoZXIpIHtcclxuICAgIHJldHVybiAhdGhpcy5lcSgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lcSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lID0gTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHM7XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQncy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUubGVzc1RoYW4gPSBmdW5jdGlvbiBsZXNzVGhhbihvdGhlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpIDwgMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFufS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmx0ID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbjtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBsZXNzVGhhbk9yRXF1YWwob3RoZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmx0ZSA9IExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmxlID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWw7XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQncy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW4gPSBmdW5jdGlvbiBncmVhdGVyVGhhbihvdGhlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpID4gMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFufS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmd0ID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbjtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBncmVhdGVyVGhhbk9yRXF1YWwob3RoZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA+PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmd0ZSA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW5PckVxdWFsfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmdlID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw7XHJcblxyXG4vKipcclxuICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge251bWJlcn0gMCBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgMSBpZiB0aGUgdGhpcyBpcyBncmVhdGVyIGFuZCAtMVxyXG4gKiAgaWYgdGhlIGdpdmVuIG9uZSBpcyBncmVhdGVyXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlKG90aGVyKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhvdGhlcikpXHJcbiAgICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xyXG4gICAgaWYgKHRoaXMuZXEob3RoZXIpKVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgdmFyIHRoaXNOZWcgPSB0aGlzLmlzTmVnYXRpdmUoKSxcclxuICAgICAgICBvdGhlck5lZyA9IG90aGVyLmlzTmVnYXRpdmUoKTtcclxuICAgIGlmICh0aGlzTmVnICYmICFvdGhlck5lZylcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICBpZiAoIXRoaXNOZWcgJiYgb3RoZXJOZWcpXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBzaWduIGJpdHMgYXJlIHRoZSBzYW1lXHJcbiAgICBpZiAoIXRoaXMudW5zaWduZWQpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ViKG90aGVyKS5pc05lZ2F0aXZlKCkgPyAtMSA6IDE7XHJcbiAgICAvLyBCb3RoIGFyZSBwb3NpdGl2ZSBpZiBhdCBsZWFzdCBvbmUgaXMgdW5zaWduZWRcclxuICAgIHJldHVybiAob3RoZXIuaGlnaCA+Pj4gMCkgPiAodGhpcy5oaWdoID4+PiAwKSB8fCAob3RoZXIuaGlnaCA9PT0gdGhpcy5oaWdoICYmIChvdGhlci5sb3cgPj4+IDApID4gKHRoaXMubG93ID4+PiAwKSkgPyAtMSA6IDE7XHJcbn07XHJcblxyXG4vKipcclxuICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY29tcGFyZX0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IDAgaWYgdGhleSBhcmUgdGhlIHNhbWUsIDEgaWYgdGhlIHRoaXMgaXMgZ3JlYXRlciBhbmQgLTFcclxuICogIGlmIHRoZSBnaXZlbiBvbmUgaXMgZ3JlYXRlclxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5jb21wID0gTG9uZ1Byb3RvdHlwZS5jb21wYXJlO1xyXG5cclxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhpcyBMb25nJ3MgdmFsdWUuXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lZ2F0ZSA9IGZ1bmN0aW9uIG5lZ2F0ZSgpIHtcclxuICAgIGlmICghdGhpcy51bnNpZ25lZCAmJiB0aGlzLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTtcclxuICAgIHJldHVybiB0aGlzLm5vdCgpLmFkZChPTkUpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhpcyBMb25nJ3MgdmFsdWUuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbmVnYXRlfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm5lZyA9IExvbmdQcm90b3R5cGUubmVnYXRlO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHN1bSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gYWRkZW5kIEFkZGVuZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFN1bVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQoYWRkZW5kKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhhZGRlbmQpKVxyXG4gICAgICAgIGFkZGVuZCA9IGZyb21WYWx1ZShhZGRlbmQpO1xyXG5cclxuICAgIC8vIERpdmlkZSBlYWNoIG51bWJlciBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIHN1bSB0aGUgY2h1bmtzLlxyXG5cclxuICAgIHZhciBhNDggPSB0aGlzLmhpZ2ggPj4+IDE2O1xyXG4gICAgdmFyIGEzMiA9IHRoaXMuaGlnaCAmIDB4RkZGRjtcclxuICAgIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7XHJcbiAgICB2YXIgYTAwID0gdGhpcy5sb3cgJiAweEZGRkY7XHJcblxyXG4gICAgdmFyIGI0OCA9IGFkZGVuZC5oaWdoID4+PiAxNjtcclxuICAgIHZhciBiMzIgPSBhZGRlbmQuaGlnaCAmIDB4RkZGRjtcclxuICAgIHZhciBiMTYgPSBhZGRlbmQubG93ID4+PiAxNjtcclxuICAgIHZhciBiMDAgPSBhZGRlbmQubG93ICYgMHhGRkZGO1xyXG5cclxuICAgIHZhciBjNDggPSAwLCBjMzIgPSAwLCBjMTYgPSAwLCBjMDAgPSAwO1xyXG4gICAgYzAwICs9IGEwMCArIGIwMDtcclxuICAgIGMxNiArPSBjMDAgPj4+IDE2O1xyXG4gICAgYzAwICY9IDB4RkZGRjtcclxuICAgIGMxNiArPSBhMTYgKyBiMTY7XHJcbiAgICBjMzIgKz0gYzE2ID4+PiAxNjtcclxuICAgIGMxNiAmPSAweEZGRkY7XHJcbiAgICBjMzIgKz0gYTMyICsgYjMyO1xyXG4gICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XHJcbiAgICBjMzIgJj0gMHhGRkZGO1xyXG4gICAgYzQ4ICs9IGE0OCArIGI0ODtcclxuICAgIGM0OCAmPSAweEZGRkY7XHJcbiAgICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBzdWJ0cmFoZW5kIFN1YnRyYWhlbmRcclxuICogQHJldHVybnMgeyFMb25nfSBEaWZmZXJlbmNlXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnN1YnRyYWN0ID0gZnVuY3Rpb24gc3VidHJhY3Qoc3VidHJhaGVuZCkge1xyXG4gICAgaWYgKCFpc0xvbmcoc3VidHJhaGVuZCkpXHJcbiAgICAgICAgc3VidHJhaGVuZCA9IGZyb21WYWx1ZShzdWJ0cmFoZW5kKTtcclxuICAgIHJldHVybiB0aGlzLmFkZChzdWJ0cmFoZW5kLm5lZygpKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzdWJ0cmFjdH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IHN1YnRyYWhlbmQgU3VidHJhaGVuZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IERpZmZlcmVuY2VcclxuICovXHJcbkxvbmdQcm90b3R5cGUuc3ViID0gTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdDtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBtdWx0aXBsaWVyIE11bHRpcGxpZXJcclxuICogQHJldHVybnMgeyFMb25nfSBQcm9kdWN0XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gbXVsdGlwbHkobXVsdGlwbGllcikge1xyXG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpXHJcbiAgICAgICAgcmV0dXJuIFpFUk87XHJcbiAgICBpZiAoIWlzTG9uZyhtdWx0aXBsaWVyKSlcclxuICAgICAgICBtdWx0aXBsaWVyID0gZnJvbVZhbHVlKG11bHRpcGxpZXIpO1xyXG5cclxuICAgIC8vIHVzZSB3YXNtIHN1cHBvcnQgaWYgcHJlc2VudFxyXG4gICAgaWYgKHdhc20pIHtcclxuICAgICAgICB2YXIgbG93ID0gd2FzbS5tdWwodGhpcy5sb3csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGllci5sb3csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxpZXIuaGlnaCk7XHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbS5nZXRfaGlnaCgpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobXVsdGlwbGllci5pc1plcm8oKSlcclxuICAgICAgICByZXR1cm4gWkVSTztcclxuICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgcmV0dXJuIG11bHRpcGxpZXIuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XHJcbiAgICBpZiAobXVsdGlwbGllci5lcShNSU5fVkFMVUUpKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmlzT2RkKCkgPyBNSU5fVkFMVUUgOiBaRVJPO1xyXG5cclxuICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xyXG4gICAgICAgIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIubmVnKCkpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIpLm5lZygpO1xyXG4gICAgfSBlbHNlIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSlcclxuICAgICAgICByZXR1cm4gdGhpcy5tdWwobXVsdGlwbGllci5uZWcoKSkubmVnKCk7XHJcblxyXG4gICAgLy8gSWYgYm90aCBsb25ncyBhcmUgc21hbGwsIHVzZSBmbG9hdCBtdWx0aXBsaWNhdGlvblxyXG4gICAgaWYgKHRoaXMubHQoVFdPX1BXUl8yNCkgJiYgbXVsdGlwbGllci5sdChUV09fUFdSXzI0KSlcclxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcih0aGlzLnRvTnVtYmVyKCkgKiBtdWx0aXBsaWVyLnRvTnVtYmVyKCksIHRoaXMudW5zaWduZWQpO1xyXG5cclxuICAgIC8vIERpdmlkZSBlYWNoIGxvbmcgaW50byA0IGNodW5rcyBvZiAxNiBiaXRzLCBhbmQgdGhlbiBhZGQgdXAgNHg0IHByb2R1Y3RzLlxyXG4gICAgLy8gV2UgY2FuIHNraXAgcHJvZHVjdHMgdGhhdCB3b3VsZCBvdmVyZmxvdy5cclxuXHJcbiAgICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcclxuICAgIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiAweEZGRkY7XHJcbiAgICB2YXIgYTE2ID0gdGhpcy5sb3cgPj4+IDE2O1xyXG4gICAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhGRkZGO1xyXG5cclxuICAgIHZhciBiNDggPSBtdWx0aXBsaWVyLmhpZ2ggPj4+IDE2O1xyXG4gICAgdmFyIGIzMiA9IG11bHRpcGxpZXIuaGlnaCAmIDB4RkZGRjtcclxuICAgIHZhciBiMTYgPSBtdWx0aXBsaWVyLmxvdyA+Pj4gMTY7XHJcbiAgICB2YXIgYjAwID0gbXVsdGlwbGllci5sb3cgJiAweEZGRkY7XHJcblxyXG4gICAgdmFyIGM0OCA9IDAsIGMzMiA9IDAsIGMxNiA9IDAsIGMwMCA9IDA7XHJcbiAgICBjMDAgKz0gYTAwICogYjAwO1xyXG4gICAgYzE2ICs9IGMwMCA+Pj4gMTY7XHJcbiAgICBjMDAgJj0gMHhGRkZGO1xyXG4gICAgYzE2ICs9IGExNiAqIGIwMDtcclxuICAgIGMzMiArPSBjMTYgPj4+IDE2O1xyXG4gICAgYzE2ICY9IDB4RkZGRjtcclxuICAgIGMxNiArPSBhMDAgKiBiMTY7XHJcbiAgICBjMzIgKz0gYzE2ID4+PiAxNjtcclxuICAgIGMxNiAmPSAweEZGRkY7XHJcbiAgICBjMzIgKz0gYTMyICogYjAwO1xyXG4gICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XHJcbiAgICBjMzIgJj0gMHhGRkZGO1xyXG4gICAgYzMyICs9IGExNiAqIGIxNjtcclxuICAgIGM0OCArPSBjMzIgPj4+IDE2O1xyXG4gICAgYzMyICY9IDB4RkZGRjtcclxuICAgIGMzMiArPSBhMDAgKiBiMzI7XHJcbiAgICBjNDggKz0gYzMyID4+PiAxNjtcclxuICAgIGMzMiAmPSAweEZGRkY7XHJcbiAgICBjNDggKz0gYTQ4ICogYjAwICsgYTMyICogYjE2ICsgYTE2ICogYjMyICsgYTAwICogYjQ4O1xyXG4gICAgYzQ4ICY9IDB4RkZGRjtcclxuICAgIHJldHVybiBmcm9tQml0cygoYzE2IDw8IDE2KSB8IGMwMCwgKGM0OCA8PCAxNikgfCBjMzIsIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI211bHRpcGx5fS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gbXVsdGlwbGllciBNdWx0aXBsaWVyXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5tdWwgPSBMb25nUHJvdG90eXBlLm11bHRpcGx5O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhlIHJlc3VsdCBpcyBzaWduZWQgaWYgdGhpcyBMb25nIGlzIHNpZ25lZCBvclxyXG4gKiAgdW5zaWduZWQgaWYgdGhpcyBMb25nIGlzIHVuc2lnbmVkLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFF1b3RpZW50XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmRpdmlkZSA9IGZ1bmN0aW9uIGRpdmlkZShkaXZpc29yKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhkaXZpc29yKSlcclxuICAgICAgICBkaXZpc29yID0gZnJvbVZhbHVlKGRpdmlzb3IpO1xyXG4gICAgaWYgKGRpdmlzb3IuaXNaZXJvKCkpXHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ2RpdmlzaW9uIGJ5IHplcm8nKTtcclxuXHJcbiAgICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcclxuICAgIGlmICh3YXNtKSB7XHJcbiAgICAgICAgLy8gZ3VhcmQgYWdhaW5zdCBzaWduZWQgZGl2aXNpb24gb3ZlcmZsb3c6IHRoZSBsYXJnZXN0XHJcbiAgICAgICAgLy8gbmVnYXRpdmUgbnVtYmVyIC8gLTEgd291bGQgYmUgMSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdFxyXG4gICAgICAgIC8vIHBvc2l0aXZlIG51bWJlciwgZHVlIHRvIHR3bydzIGNvbXBsZW1lbnQuXHJcbiAgICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkICYmXHJcbiAgICAgICAgICAgIHRoaXMuaGlnaCA9PT0gLTB4ODAwMDAwMDAgJiZcclxuICAgICAgICAgICAgZGl2aXNvci5sb3cgPT09IC0xICYmIGRpdmlzb3IuaGlnaCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgLy8gYmUgY29uc2lzdGVudCB3aXRoIG5vbi13YXNtIGNvZGUgcGF0aFxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGxvdyA9ICh0aGlzLnVuc2lnbmVkID8gd2FzbS5kaXZfdSA6IHdhc20uZGl2X3MpKFxyXG4gICAgICAgICAgICB0aGlzLmxvdyxcclxuICAgICAgICAgICAgdGhpcy5oaWdoLFxyXG4gICAgICAgICAgICBkaXZpc29yLmxvdyxcclxuICAgICAgICAgICAgZGl2aXNvci5oaWdoXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHMobG93LCB3YXNtLmdldF9oaWdoKCksIHRoaXMudW5zaWduZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzWmVybygpKVxyXG4gICAgICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xyXG4gICAgdmFyIGFwcHJveCwgcmVtLCByZXM7XHJcbiAgICBpZiAoIXRoaXMudW5zaWduZWQpIHtcclxuICAgICAgICAvLyBUaGlzIHNlY3Rpb24gaXMgb25seSByZWxldmFudCBmb3Igc2lnbmVkIGxvbmdzIGFuZCBpcyBkZXJpdmVkIGZyb20gdGhlXHJcbiAgICAgICAgLy8gY2xvc3VyZSBsaWJyYXJ5IGFzIGEgd2hvbGUuXHJcbiAgICAgICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSkge1xyXG4gICAgICAgICAgICBpZiAoZGl2aXNvci5lcShPTkUpIHx8IGRpdmlzb3IuZXEoTkVHX09ORSkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTUlOX1ZBTFVFOyAgLy8gcmVjYWxsIHRoYXQgLU1JTl9WQUxVRSA9PSBNSU5fVkFMVUVcclxuICAgICAgICAgICAgZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9ORTtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHxvdGhlcnwgPj0gMiwgc28gfHRoaXMvb3RoZXJ8IDwgfE1JTl9WQUxVRXwuXHJcbiAgICAgICAgICAgICAgICB2YXIgaGFsZlRoaXMgPSB0aGlzLnNocigxKTtcclxuICAgICAgICAgICAgICAgIGFwcHJveCA9IGhhbGZUaGlzLmRpdihkaXZpc29yKS5zaGwoMSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXBwcm94LmVxKFpFUk8pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpdmlzb3IuaXNOZWdhdGl2ZSgpID8gT05FIDogTkVHX09ORTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtID0gdGhpcy5zdWIoZGl2aXNvci5tdWwoYXBwcm94KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gYXBwcm94LmFkZChyZW0uZGl2KGRpdmlzb3IpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChkaXZpc29yLmVxKE1JTl9WQUxVRSkpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xyXG4gICAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xyXG4gICAgICAgICAgICBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZWcoKS5kaXYoZGl2aXNvci5uZWcoKSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yKS5uZWcoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSgpKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaXYoZGl2aXNvci5uZWcoKSkubmVnKCk7XHJcbiAgICAgICAgcmVzID0gWkVSTztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gVGhlIGFsZ29yaXRobSBiZWxvdyBoYXMgbm90IGJlZW4gbWFkZSBmb3IgdW5zaWduZWQgbG9uZ3MuIEl0J3MgdGhlcmVmb3JlXHJcbiAgICAgICAgLy8gcmVxdWlyZWQgdG8gdGFrZSBzcGVjaWFsIGNhcmUgb2YgdGhlIE1TQiBwcmlvciB0byBydW5uaW5nIGl0LlxyXG4gICAgICAgIGlmICghZGl2aXNvci51bnNpZ25lZClcclxuICAgICAgICAgICAgZGl2aXNvciA9IGRpdmlzb3IudG9VbnNpZ25lZCgpO1xyXG4gICAgICAgIGlmIChkaXZpc29yLmd0KHRoaXMpKVxyXG4gICAgICAgICAgICByZXR1cm4gVVpFUk87XHJcbiAgICAgICAgaWYgKGRpdmlzb3IuZ3QodGhpcy5zaHJ1KDEpKSkgLy8gMTUgPj4+IDEgPSA3IDsgd2l0aCBkaXZpc29yID0gOCA7IHRydWVcclxuICAgICAgICAgICAgcmV0dXJuIFVPTkU7XHJcbiAgICAgICAgcmVzID0gVVpFUk87XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVwZWF0IHRoZSBmb2xsb3dpbmcgdW50aWwgdGhlIHJlbWFpbmRlciBpcyBsZXNzIHRoYW4gb3RoZXI6ICBmaW5kIGFcclxuICAgIC8vIGZsb2F0aW5nLXBvaW50IHRoYXQgYXBwcm94aW1hdGVzIHJlbWFpbmRlciAvIG90aGVyICpmcm9tIGJlbG93KiwgYWRkIHRoaXNcclxuICAgIC8vIGludG8gdGhlIHJlc3VsdCwgYW5kIHN1YnRyYWN0IGl0IGZyb20gdGhlIHJlbWFpbmRlci4gIEl0IGlzIGNyaXRpY2FsIHRoYXRcclxuICAgIC8vIHRoZSBhcHByb3hpbWF0ZSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJlYWwgdmFsdWUgc28gdGhhdCB0aGVcclxuICAgIC8vIHJlbWFpbmRlciBuZXZlciBiZWNvbWVzIG5lZ2F0aXZlLlxyXG4gICAgcmVtID0gdGhpcztcclxuICAgIHdoaWxlIChyZW0uZ3RlKGRpdmlzb3IpKSB7XHJcbiAgICAgICAgLy8gQXBwcm94aW1hdGUgdGhlIHJlc3VsdCBvZiBkaXZpc2lvbi4gVGhpcyBtYXkgYmUgYSBsaXR0bGUgZ3JlYXRlciBvclxyXG4gICAgICAgIC8vIHNtYWxsZXIgdGhhbiB0aGUgYWN0dWFsIHZhbHVlLlxyXG4gICAgICAgIGFwcHJveCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocmVtLnRvTnVtYmVyKCkgLyBkaXZpc29yLnRvTnVtYmVyKCkpKTtcclxuXHJcbiAgICAgICAgLy8gV2Ugd2lsbCB0d2VhayB0aGUgYXBwcm94aW1hdGUgcmVzdWx0IGJ5IGNoYW5naW5nIGl0IGluIHRoZSA0OC10aCBkaWdpdCBvclxyXG4gICAgICAgIC8vIHRoZSBzbWFsbGVzdCBub24tZnJhY3Rpb25hbCBkaWdpdCwgd2hpY2hldmVyIGlzIGxhcmdlci5cclxuICAgICAgICB2YXIgbG9nMiA9IE1hdGguY2VpbChNYXRoLmxvZyhhcHByb3gpIC8gTWF0aC5MTjIpLFxyXG4gICAgICAgICAgICBkZWx0YSA9IChsb2cyIDw9IDQ4KSA/IDEgOiBwb3dfZGJsKDIsIGxvZzIgLSA0OCksXHJcblxyXG4gICAgICAgIC8vIERlY3JlYXNlIHRoZSBhcHByb3hpbWF0aW9uIHVudGlsIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVtYWluZGVyLiAgTm90ZVxyXG4gICAgICAgIC8vIHRoYXQgaWYgaXQgaXMgdG9vIGxhcmdlLCB0aGUgcHJvZHVjdCBvdmVyZmxvd3MgYW5kIGlzIG5lZ2F0aXZlLlxyXG4gICAgICAgICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCksXHJcbiAgICAgICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7XHJcbiAgICAgICAgd2hpbGUgKGFwcHJveFJlbS5pc05lZ2F0aXZlKCkgfHwgYXBwcm94UmVtLmd0KHJlbSkpIHtcclxuICAgICAgICAgICAgYXBwcm94IC09IGRlbHRhO1xyXG4gICAgICAgICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCwgdGhpcy51bnNpZ25lZCk7XHJcbiAgICAgICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBXZSBrbm93IHRoZSBhbnN3ZXIgY2FuJ3QgYmUgemVyby4uLiBhbmQgYWN0dWFsbHksIHplcm8gd291bGQgY2F1c2VcclxuICAgICAgICAvLyBpbmZpbml0ZSByZWN1cnNpb24gc2luY2Ugd2Ugd291bGQgbWFrZSBubyBwcm9ncmVzcy5cclxuICAgICAgICBpZiAoYXBwcm94UmVzLmlzWmVybygpKVxyXG4gICAgICAgICAgICBhcHByb3hSZXMgPSBPTkU7XHJcblxyXG4gICAgICAgIHJlcyA9IHJlcy5hZGQoYXBwcm94UmVzKTtcclxuICAgICAgICByZW0gPSByZW0uc3ViKGFwcHJveFJlbSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNkaXZpZGV9LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBRdW90aWVudFxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5kaXYgPSBMb25nUHJvdG90eXBlLmRpdmlkZTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcclxuICovXHJcbkxvbmdQcm90b3R5cGUubW9kdWxvID0gZnVuY3Rpb24gbW9kdWxvKGRpdmlzb3IpIHtcclxuICAgIGlmICghaXNMb25nKGRpdmlzb3IpKVxyXG4gICAgICAgIGRpdmlzb3IgPSBmcm9tVmFsdWUoZGl2aXNvcik7XHJcblxyXG4gICAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XHJcbiAgICBpZiAod2FzbSkge1xyXG4gICAgICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc20ucmVtX3UgOiB3YXNtLnJlbV9zKShcclxuICAgICAgICAgICAgdGhpcy5sb3csXHJcbiAgICAgICAgICAgIHRoaXMuaGlnaCxcclxuICAgICAgICAgICAgZGl2aXNvci5sb3csXHJcbiAgICAgICAgICAgIGRpdmlzb3IuaGlnaFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbS5nZXRfaGlnaCgpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zdWIodGhpcy5kaXYoZGl2aXNvcikubXVsKGRpdmlzb3IpKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtb2R1bG99LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcclxuICovXHJcbkxvbmdQcm90b3R5cGUubW9kID0gTG9uZ1Byb3RvdHlwZS5tb2R1bG87XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgbW9kdWxvIHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbW9kdWxvfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gZGl2aXNvciBEaXZpc29yXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnJlbSA9IExvbmdQcm90b3R5cGUubW9kdWxvO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgTk9UIG9mIHRoaXMgTG9uZy5cclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ub3QgPSBmdW5jdGlvbiBub3QoKSB7XHJcbiAgICByZXR1cm4gZnJvbUJpdHMofnRoaXMubG93LCB+dGhpcy5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBiaXR3aXNlIEFORCBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uIGFuZChvdGhlcikge1xyXG4gICAgaWYgKCFpc0xvbmcob3RoZXIpKVxyXG4gICAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcclxuICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyAmIG90aGVyLmxvdywgdGhpcy5oaWdoICYgb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgYml0d2lzZSBPUiBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm9yID0gZnVuY3Rpb24gb3Iob3RoZXIpIHtcclxuICAgIGlmICghaXNMb25nKG90aGVyKSlcclxuICAgICAgICBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XHJcbiAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3cgfCBvdGhlci5sb3csIHRoaXMuaGlnaCB8IG90aGVyLmhpZ2gsIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgWE9SIG9mIHRoaXMgTG9uZyBhbmQgdGhlIGdpdmVuIG9uZS5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciBMb25nXHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICovXHJcbkxvbmdQcm90b3R5cGUueG9yID0gZnVuY3Rpb24geG9yKG90aGVyKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhvdGhlcikpXHJcbiAgICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93IF4gb3RoZXIubG93LCB0aGlzLmhpZ2ggXiBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgc2hpZnRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGlmdExlZnQgPSBmdW5jdGlvbiBzaGlmdExlZnQobnVtQml0cykge1xyXG4gICAgaWYgKGlzTG9uZyhudW1CaXRzKSlcclxuICAgICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xyXG4gICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMClcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIGVsc2UgaWYgKG51bUJpdHMgPCAzMilcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3cgPDwgbnVtQml0cywgKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gKDMyIC0gbnVtQml0cykpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIGVsc2VcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHMoMCwgdGhpcy5sb3cgPDwgKG51bUJpdHMgLSAzMiksIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRMZWZ0fS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnNobCA9IExvbmdQcm90b3R5cGUuc2hpZnRMZWZ0O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBhcml0aG1ldGljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0ID0gZnVuY3Rpb24gc2hpZnRSaWdodChudW1CaXRzKSB7XHJcbiAgICBpZiAoaXNMb25nKG51bUJpdHMpKVxyXG4gICAgICAgIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XHJcbiAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgZWxzZSBpZiAobnVtQml0cyA8IDMyKVxyXG4gICAgICAgIHJldHVybiBmcm9tQml0cygodGhpcy5sb3cgPj4+IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA8PCAoMzIgLSBudW1CaXRzKSksIHRoaXMuaGlnaCA+PiBudW1CaXRzLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIGVsc2VcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoID4+IChudW1CaXRzIC0gMzIpLCB0aGlzLmhpZ2ggPj0gMCA/IDAgOiAtMSwgdGhpcy51bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGFyaXRobWV0aWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaHIgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHQ7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGxvZ2ljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQgPSBmdW5jdGlvbiBzaGlmdFJpZ2h0VW5zaWduZWQobnVtQml0cykge1xyXG4gICAgaWYgKGlzTG9uZyhudW1CaXRzKSlcclxuICAgICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xyXG4gICAgbnVtQml0cyAmPSA2MztcclxuICAgIGlmIChudW1CaXRzID09PSAwKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdmFyIGhpZ2ggPSB0aGlzLmhpZ2g7XHJcbiAgICAgICAgaWYgKG51bUJpdHMgPCAzMikge1xyXG4gICAgICAgICAgICB2YXIgbG93ID0gdGhpcy5sb3c7XHJcbiAgICAgICAgICAgIHJldHVybiBmcm9tQml0cygobG93ID4+PiBudW1CaXRzKSB8IChoaWdoIDw8ICgzMiAtIG51bUJpdHMpKSwgaGlnaCA+Pj4gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChudW1CaXRzID09PSAzMilcclxuICAgICAgICAgICAgcmV0dXJuIGZyb21CaXRzKGhpZ2gsIDAsIHRoaXMudW5zaWduZWQpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIGZyb21CaXRzKGhpZ2ggPj4+IChudW1CaXRzIC0gMzIpLCAwLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnNocnUgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZDtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnNocl91ID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQ7XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIHNpZ25lZC5cclxuICogQHJldHVybnMgeyFMb25nfSBTaWduZWQgbG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b1NpZ25lZCA9IGZ1bmN0aW9uIHRvU2lnbmVkKCkge1xyXG4gICAgaWYgKCF0aGlzLnVuc2lnbmVkKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIGZhbHNlKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gdW5zaWduZWQuXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gVW5zaWduZWQgbG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b1Vuc2lnbmVkID0gZnVuY3Rpb24gdG9VbnNpZ25lZCgpIHtcclxuICAgIGlmICh0aGlzLnVuc2lnbmVkKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIHRydWUpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBpdHMgYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHBhcmFtIHtib29sZWFuPX0gbGUgV2hldGhlciBsaXR0bGUgb3IgYmlnIGVuZGlhbiwgZGVmYXVsdHMgdG8gYmlnIGVuZGlhblxyXG4gKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCeXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXMgPSBmdW5jdGlvbiB0b0J5dGVzKGxlKSB7XHJcbiAgICByZXR1cm4gbGUgPyB0aGlzLnRvQnl0ZXNMRSgpIDogdGhpcy50b0J5dGVzQkUoKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGxpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXNMRSA9IGZ1bmN0aW9uIHRvQnl0ZXNMRSgpIHtcclxuICAgIHZhciBoaSA9IHRoaXMuaGlnaCxcclxuICAgICAgICBsbyA9IHRoaXMubG93O1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICBsbyAgICAgICAgJiAweGZmLFxyXG4gICAgICAgIGxvID4+PiAgOCAmIDB4ZmYsXHJcbiAgICAgICAgbG8gPj4+IDE2ICYgMHhmZixcclxuICAgICAgICBsbyA+Pj4gMjQgICAgICAgLFxyXG4gICAgICAgIGhpICAgICAgICAmIDB4ZmYsXHJcbiAgICAgICAgaGkgPj4+ICA4ICYgMHhmZixcclxuICAgICAgICBoaSA+Pj4gMTYgJiAweGZmLFxyXG4gICAgICAgIGhpID4+PiAyNFxyXG4gICAgXTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gQmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXNCRSA9IGZ1bmN0aW9uIHRvQnl0ZXNCRSgpIHtcclxuICAgIHZhciBoaSA9IHRoaXMuaGlnaCxcclxuICAgICAgICBsbyA9IHRoaXMubG93O1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICBoaSA+Pj4gMjQgICAgICAgLFxyXG4gICAgICAgIGhpID4+PiAxNiAmIDB4ZmYsXHJcbiAgICAgICAgaGkgPj4+ICA4ICYgMHhmZixcclxuICAgICAgICBoaSAgICAgICAgJiAweGZmLFxyXG4gICAgICAgIGxvID4+PiAyNCAgICAgICAsXHJcbiAgICAgICAgbG8gPj4+IDE2ICYgMHhmZixcclxuICAgICAgICBsbyA+Pj4gIDggJiAweGZmLFxyXG4gICAgICAgIGxvICAgICAgICAmIDB4ZmZcclxuICAgIF07XHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIEJ5dGUgcmVwcmVzZW50YXRpb25cclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsZSBXaGV0aGVyIGxpdHRsZSBvciBiaWcgZW5kaWFuLCBkZWZhdWx0cyB0byBiaWcgZW5kaWFuXHJcbiAqIEByZXR1cm5zIHtMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21CeXRlcyA9IGZ1bmN0aW9uIGZyb21CeXRlcyhieXRlcywgdW5zaWduZWQsIGxlKSB7XHJcbiAgICByZXR1cm4gbGUgPyBMb25nLmZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZCkgOiBMb25nLmZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgbGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxyXG4gKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcclxuICovXHJcbkxvbmcuZnJvbUJ5dGVzTEUgPSBmdW5jdGlvbiBmcm9tQnl0ZXNMRShieXRlcywgdW5zaWduZWQpIHtcclxuICAgIHJldHVybiBuZXcgTG9uZyhcclxuICAgICAgICBieXRlc1swXSAgICAgICB8XHJcbiAgICAgICAgYnl0ZXNbMV0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzJdIDw8IDE2IHxcclxuICAgICAgICBieXRlc1szXSA8PCAyNCxcclxuICAgICAgICBieXRlc1s0XSAgICAgICB8XHJcbiAgICAgICAgYnl0ZXNbNV0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzZdIDw8IDE2IHxcclxuICAgICAgICBieXRlc1s3XSA8PCAyNCxcclxuICAgICAgICB1bnNpZ25lZFxyXG4gICAgKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXHJcbiAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBieXRlcyBCaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxyXG4gKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxyXG4gKi9cclxuTG9uZy5mcm9tQnl0ZXNCRSA9IGZ1bmN0aW9uIGZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCkge1xyXG4gICAgcmV0dXJuIG5ldyBMb25nKFxyXG4gICAgICAgIGJ5dGVzWzRdIDw8IDI0IHxcclxuICAgICAgICBieXRlc1s1XSA8PCAxNiB8XHJcbiAgICAgICAgYnl0ZXNbNl0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzddLFxyXG4gICAgICAgIGJ5dGVzWzBdIDw8IDI0IHxcclxuICAgICAgICBieXRlc1sxXSA8PCAxNiB8XHJcbiAgICAgICAgYnl0ZXNbMl0gPDwgIDggfFxyXG4gICAgICAgIGJ5dGVzWzNdLFxyXG4gICAgICAgIHVuc2lnbmVkXHJcbiAgICApO1xyXG59O1xyXG5cblxuLyoqKi8gfSlcbi8qKioqKiovIF0pOyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgQlNPTiBmcm9tICcuLy4uLy4uLy4uLy4uL3RoaXJkX3BhcnR5L2Jzb24uY29tbW9uLmpzJztcblxuY29uc3QgYnNvbiA9IEJTT04uYnNvbjtcblxuY2xhc3MgQnNvbiB7XG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplIGEgSmF2YXNjcmlwdCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBKYXZhc2NyaXB0IG9iamVjdCB0byBzZXJpYWxpemUuXG4gICAgICogQHJldHVybiBUaGUgQnVmZmVyIG9iamVjdCBjb250YWluaW5nIHRoZSBzZXJpYWxpemVkIG9iamVjdC5cbiAgICAgKi9cbiAgICBzdGF0aWMgc2VyaWFsaXplIChvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJzb24uc2VyaWFsaXplKG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemUgZGF0YSBhcyBCU09OLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJ1ZmZlciBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNlcmlhbGl6ZWQgc2V0IG9mIEJTT04gZG9jdW1lbnRzLlxuICAgICAqIEByZXR1cm5zIFRoZSBkZXNlcmlhbGl6ZWQgSmF2YXNjcmlwdCBPYmplY3QuXG4gICAgICovXG4gICAgc3RhdGljIGRlc2VyaWFsaXplIChvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJzb24uZGVzZXJpYWxpemUob2JqZWN0KTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IEJzb24gfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnJhbWVUeXBlIH0gZnJvbSAnLi9lbnVtcy9GcmFtZVR5cGUuanMnO1xuaW1wb3J0ICB7IEJzb24gfSBmcm9tICcuLy4uL3V0aWwvQnNvbi5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2RsUGFja2V0XG4gKiBAcHJvcGVydHkge251bWJlcn0gX0VYVFJBX1BBUkNFTF9EQVRBX0xFTkdUSFxuICogQHByb3BlcnR5IEBwcml2YXRlIHtudW1iZXJ9IF9IRUFERVJfU0laRVxuICogQHByb3BlcnR5IEBwcml2YXRlIHtudW1iZXJ9IF9IRUFERVJfU0laRV9WMVxuICogQHByb3BlcnR5IEBwcml2YXRlIHtudW1iZXJ9IF9FTkNSWVBUSU9OX01BU0tcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBTRVJWSUNFX1RZUEVfQ09OVFJPTFxuICogQHByb3BlcnR5IHtudW1iZXJ9IFNFUlZJQ0VfVFlQRV9SUENcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBTRVJWSUNFX1RZUEVfUENNXG4gKiBAcHJvcGVydHkge251bWJlcn0gU0VSVklDRV9UWVBFX1ZJREVPXG4gKiBAcHJvcGVydHkge251bWJlcn0gU0VSVklDRV9UWVBFX0JVTEtfREFUQVxuICogQHByb3BlcnR5IHtudW1iZXJ9IEZSQU1FX0lORk9fSEVBUlRfQkVBVFxuICogQHByb3BlcnR5IHtudW1iZXJ9IEZSQU1FX0lORk9fU1RBUlRfU0VSVklDRVxuICogQHByb3BlcnR5IHtudW1iZXJ9IEZSQU1FX0lORk9fU1RBUlRfU0VSVklDRV9BQ0tcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGUkFNRV9JTkZPX1NUQVJUX1NFUlZJQ0VfTkFLXG4gKiBAcHJvcGVydHkge251bWJlcn0gRlJBTUVfSU5GT19FTkRfU0VSVklDRVxuICogQHByb3BlcnR5IHtudW1iZXJ9IEZSQU1FX0lORk9fRU5EX1NFUlZJQ0VfQUNLXG4gKiBAcHJvcGVydHkge251bWJlcn0gRlJBTUVfSU5GT19FTkRfU0VSVklDRV9OQUtcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGUkFNRV9JTkZPX1JFR0lTVEVSX1NFQ09OREFSWV9UUkFOU1BPUlRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGUkFNRV9JTkZPX1JFR0lTVEVSX1NFQ09OREFSWV9UUkFOU1BPUlRfQUNLXG4gKiBAcHJvcGVydHkge251bWJlcn0gRlJBTUVfSU5GT19SRUdJU1RFUl9TRUNPTkRBUllfVFJBTlNQT1JUX05BS1xuICogQHByb3BlcnR5IHtudW1iZXJ9IEZSQU1FX0lORk9fVFJBTlNQT1JUX0VWRU5UX1VQREFURVxuICogQHByb3BlcnR5IHtudW1iZXJ9IEZSQU1FX0lORk9fU0VSVklDRV9EQVRBX0FDS1xuICogQHByb3BlcnR5IHtudW1iZXJ9IEZSQU1FX0lORk9fSEVBUlRfQkVBVF9BQ0tcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGUkFNRV9JTkZPX0ZJTkFMX0NPTk5FU0NVVElWRV9GUkFNRVxuICogQHByb3BlcnR5IHtudW1iZXJ9IEZSQU1FX0lORk9fUkVTRVJWRURcblxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZ2V0VmVyc2lvblxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZ2V0RW5jcnlwdGlvblxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZ2V0U2VydmljZVR5cGVcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGdldEZyYW1lSW5mb1xuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZ2V0U2Vzc2lvbklEXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBnZXRNZXNzYWdlSURcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGdldERhdGFTaXplXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBzZXRQYXlsb2FkXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBnZXRQYXlsb2FkXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBnZXRFbmNyeXB0aW9uQml0XG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBnZXRGcmFtZVR5cGVcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHRvVWludDhBcnJheVxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gdG9TdHJpbmdcbiAqIEBwcm9wZXJ0eSBAcHJpdmF0ZSB7ZnVuY3Rpb259IF9jb25zdHJ1Y3RQYWNrZXRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHB1dFRhZ1xuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZ2V0VGFnXG4gKi9cblxuY2xhc3MgU2RsUGFja2V0IHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICogQHBhcmFtIHtOdW1iZXJ9IHZlcnNpb24gLSBQcm90b2NvbCB2ZXJzaW9uIHRvIHVzZVxuICAgICogQHBhcmFtIHtCb29sZWFufSBlbmNyeXB0aW9uIC0gV2hldGhlciBvciBub3QgdGhlIHBheWxvYWQgaW4gdGhpcyBwYWNrZXQgaXMgZW5jcnlwdGVkXG4gICAgKiBAcGFyYW0ge0ZyYW1lVHlwZX0gZnJhbWVUeXBlIC0gQSBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBwYWNrZXQgZnJhbWUgdHlwZVxuICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGUgLSBUaGUgc2VydmljZSB0aGF0IHRoaXMgcGFja2V0IGlzIGFzc29jaWF0ZWQgd2l0aFxuICAgICogQHBhcmFtIHtOdW1iZXJ9IGZyYW1lSW5mbyAtIFNwZWNpZmljIGZyYW1lIGluZm8gcmVsYXRlZCB0byB0aGlzIHBhY2tldFxuICAgICogQHBhcmFtIHtOdW1iZXJ9IHNlc3Npb25JRCAtIElEIHRoaXMgcGFja2V0IGlzIGFzc29jaWF0ZWQgd2l0aFxuICAgICogQHBhcmFtIHtOdW1iZXJ9IGRhdGFTaXplIC0gU2l6ZSBvZiB0aGUgcGF5bG9hZCB0aGF0IHdpbGwgYmUgYWRkZWRcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBtZXNzYWdlSUQgLSBJRCBvZiB0aGlzIHNwZWNpZmljIHBhY2tldFxuICAgICogQHBhcmFtIHtVaW50OEFycmF5fSBwYXlsb2FkIC0gUmF3IGRhdGEgdGhhdCB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBwYWNrZXQgKFJQQyBtZXNzYWdlLCByYXcgYnl0ZXMsIGV0YylcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXRcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBieXRlc1RvV3JpdGVcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yICh2ZXJzaW9uID0gMSwgZW5jcnlwdGlvbiA9IGZhbHNlLCBmcmFtZVR5cGUgPSAtMSwgc2VydmljZVR5cGUgPSAtMSwgZnJhbWVJbmZvID0gLTEsIHNlc3Npb25JRCA9IDAsIGRhdGFTaXplID0gMCwgbWVzc2FnZUlEID0gMCwgcGF5bG9hZCA9IG51bGwsIG9mZnNldCA9IDAsIGJ5dGVzVG9Xcml0ZSA9IDApIHtcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMuX2VuY3J5cHRpb24gPSBlbmNyeXB0aW9uO1xuICAgICAgICB0aGlzLl9mcmFtZVR5cGUgPSBmcmFtZVR5cGU7XG4gICAgICAgIHRoaXMuX3NlcnZpY2VUeXBlID0gc2VydmljZVR5cGU7XG4gICAgICAgIHRoaXMuX2ZyYW1lSW5mbyA9IGZyYW1lSW5mbztcbiAgICAgICAgdGhpcy5fc2Vzc2lvbklEID0gc2Vzc2lvbklEO1xuICAgICAgICB0aGlzLl9kYXRhU2l6ZSA9IGRhdGFTaXplO1xuICAgICAgICB0aGlzLl9tZXNzYWdlSUQgPSBtZXNzYWdlSUQ7XG4gICAgICAgIHRoaXMuX3BheWxvYWQgPSBwYXlsb2FkO1xuICAgICAgICB0aGlzLl9vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMuX2J5dGVzVG9Xcml0ZSA9IGJ5dGVzVG9Xcml0ZTtcblxuICAgICAgICB0aGlzLl9ic29uUGF5bG9hZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAocGF5bG9hZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fcGF5bG9hZCA9IG5ldyBVaW50OEFycmF5KHBheWxvYWQuc2xpY2Uob2Zmc2V0LCBieXRlc1RvV3JpdGUgKyBvZmZzZXQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfSAtIFByb3RvY29sIHZlcnNpb24gdXNlZCBieSB0aGlzIHBhY2tldFxuICAgICovXG4gICAgZ2V0VmVyc2lvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7Qm9vbGVhbn0gLSBXaGV0aGVyIG9yIG5vdCB0aGUgcGF5bG9hZCBpbiB0aGlzIHBhY2tldCBpcyBlbmNyeXB0ZWRcbiAgICAqL1xuICAgIGdldEVuY3J5cHRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jcnlwdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1NlcnZpY2VUeXBlfSAtIFRoZSBzZXJ2aWNlIHRoYXQgdGhpcyBwYWNrZXQgaXMgYXNzb2NpYXRlZCB3aXRoXG4gICAgKi9cbiAgICBnZXRTZXJ2aWNlVHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlVHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn0gLSBTcGVjaWZpYyBmcmFtZSBpbmZvIHJlbGF0ZWQgdG8gdGhpcyBwYWNrZXRcbiAgICAqL1xuICAgIGdldEZyYW1lSW5mbyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mcmFtZUluZm87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9IC0gSUQgdGhpcyBwYWNrZXQgaXMgYXNzb2NpYXRlZCB3aXRoXG4gICAgKi9cbiAgICBnZXRTZXNzaW9uSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbklEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfSAtIElEIG9mIHRoaXMgc3BlY2lmaWMgcGFja2V0XG4gICAgKi9cbiAgICBnZXRNZXNzYWdlSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUlEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfSAtIFNpemUgb2YgdGhlIHBheWxvYWQgdGhhdCB3aWxsIGJlIGFkZGVkXG4gICAgKi9cbiAgICBnZXREYXRhU2l6ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhU2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gcGF5bG9hZFxuICAgICogQHJldHVybiB7U2RsUGFja2V0fVxuICAgICovXG4gICAgc2V0UGF5bG9hZCAocGF5bG9hZCkge1xuICAgICAgICB0aGlzLl9wYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtVaW50OEFycmF5fSAtIFJhdyBkYXRhIHRoYXQgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgcGFja2V0IChSUEMgbWVzc2FnZSwgcmF3IGJ5dGVzLCBldGMpXG4gICAgKi9cbiAgICBnZXRQYXlsb2FkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BheWxvYWQ7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5jcnlwdGlvblxuICAgICAqIEByZXR1cm4ge051bWJlcn0gLSBSZXR1cm5zIGEgbnVtYmVyIHJlcHJlc2VudGluZyBhIGJ5dGUgbWFzayBkZXBlbmRpbmcgb24gdGhlIGJvb2xlYW4gdmFsdWVcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0RW5jcnlwdGlvbkJpdCAoZW5jcnlwdGlvbikge1xuICAgICAgICByZXR1cm4gZW5jcnlwdGlvbiA/IFNkbFBhY2tldC5fRU5DUllQVElPTl9NQVNLIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0ZyYW1lVHlwZX0gLSBBIG51bWJlciByZXByZXNlbnRpbmcgdGhlIHBhY2tldCBmcmFtZSB0eXBlXG4gICAgKi9cbiAgICBnZXRGcmFtZVR5cGUgKCkge1xuICAgICAgICBpZiAoRnJhbWVUeXBlLmtleUZvclZhbHVlKHRoaXMuX2ZyYW1lVHlwZSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcmFtZVR5cGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gRnJhbWVUeXBlLlNJTkdMRTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfSAtIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFja2V0XG4gICAgKi9cbiAgICB0b1N0cmluZyAoKSB7XG4gICAgICAgIGxldCBvdXRwdXQgPSAnKioqKiogU2RsIFBhY2tldCAqKioqKic7XG4gICAgICAgIG91dHB1dCArPSBgXFxuVmVyc2lvbjogJHt0aGlzLl92ZXJzaW9ufWA7XG4gICAgICAgIG91dHB1dCArPSBgXFxuRW5jcnlwdGlvbjogJHt0aGlzLl9lbmNyeXB0aW9ufWA7XG4gICAgICAgIG91dHB1dCArPSBgXFxuRnJhbWVUeXBlOiAke3RoaXMuX2ZyYW1lVHlwZX1gO1xuICAgICAgICBvdXRwdXQgKz0gYFxcblNlcnZpY2VUeXBlOiAke3RoaXMuX3NlcnZpY2VUeXBlfWA7XG4gICAgICAgIG91dHB1dCArPSBgXFxuRnJhbWVJbmZvOiAke3RoaXMuX2ZyYW1lSW5mb31gO1xuICAgICAgICBvdXRwdXQgKz0gYFxcblNlc3Npb25JRDogJHt0aGlzLl9zZXNzaW9uSUR9YDtcbiAgICAgICAgb3V0cHV0ICs9IGBcXG5EYXRhU2l6ZTogJHt0aGlzLl9kYXRhU2l6ZX1gO1xuXG4gICAgICAgIGlmICh0aGlzLl92ZXJzaW9uID4gMSkge1xuICAgICAgICAgICAgb3V0cHV0ICs9IGBcXG5NZXNzYWdlSUQ6ICR7dGhpcy5fbWVzc2FnZUlEfWA7XG4gICAgICAgIH1cblxuICAgICAgICBvdXRwdXQgKz0gJ1xcbioqKioqIFNkbCBQYWNrZXQgRW5kICoqKioqJztcblxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cblxuICAgIC8qKlxuXHQgKiBUaGlzIG1ldGhvZCB0YWtlcyBpbiB0aGUgdmFyaW91cyBjb21wb25lbnRzIHRvIHRoZSBTREwgcGFja2V0IHN0cnVjdHVyZSBhbmQgY3JlYXRlcyBhIG5ldyBieXRlIGFycmF5IHRoYXQgY2FuIGJlIHNlbnQgdmlhIHRoZSB0cmFuc3BvcnRcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdmVyc2lvbiAtIFByb3RvY29sIHZlcnNpb24gdG8gdXNlXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmNyeXB0aW9uIC0gV2hldGhlciBvciBub3QgdGhlIHBheWxvYWQgaW4gdGhpcyBwYWNrZXQgaXMgZW5jcnlwdGVkXG4gICAgICogQHBhcmFtIHtGcmFtZVR5cGV9IGZyYW1lVHlwZSAtIEEgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgcGFja2V0IGZyYW1lIHR5cGVcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZSAtIFRoZSBzZXJ2aWNlIHRoYXQgdGhpcyBwYWNrZXQgaXMgYXNzb2NpYXRlZCB3aXRoXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGNvbnRyb2xGcmFtZUluZm8gLSBTcGVjaWZpYyBmcmFtZSBpbmZvIHJlbGF0ZWQgdG8gdGhpcyBwYWNrZXRcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc2Vzc2lvbklEIC0gSUQgdGhpcyBwYWNrZXQgaXMgYXNzb2NpYXRlZCB3aXRoXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGRhdGFTaXplIC0gU2l6ZSBvZiB0aGUgcGF5bG9hZCB0aGF0IHdpbGwgYmUgYWRkZWRcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbWVzc2FnZUlEIC0gSUQgb2YgdGhpcyBzcGVjaWZpYyBwYWNrZXRcbiAgICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IHBheWxvYWQgLSBSYXcgZGF0YSB0aGF0IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIHBhY2tldCAoUlBDIG1lc3NhZ2UsIHJhdyBieXRlcywgZXRjKVxuXHQgKiBAcmV0dXJuIHtVaW50OEFycmF5fSAtIEEgYnl0ZVtdIHJlcHJlc2VudGF0aW9uIG9mIGFuIFNkbFBhY2tldCBidWlsdCB1c2luZyB0aGUgc3VwcGxpZWQgcGFyYW1zXG5cdCAqL1xuICAgIHN0YXRpYyBfY29uc3RydWN0UGFja2V0ICh2ZXJzaW9uLCBlbmNyeXB0aW9uLCBmcmFtZVR5cGUsIHNlcnZpY2VUeXBlLCBjb250cm9sRnJhbWVJbmZvLCBzZXNzaW9uSUQsIGRhdGFTaXplLCBtZXNzYWdlSUQsIHBheWxvYWQpIHtcbiAgICAgICAgbGV0IGRhdGFWaWV3ID0gbnVsbDtcbiAgICAgICAgbGV0IGRhdGFWaWV3SW5kZXggPSAwO1xuXG4gICAgICAgIGlmICh2ZXJzaW9uID4gMSkge1xuICAgICAgICAgICAgZGF0YVZpZXcgPSBuZXcgVWludDhBcnJheShTZGxQYWNrZXQuX0hFQURFUl9TSVpFICsgZGF0YVNpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YVZpZXcgPSBuZXcgVWludDhBcnJheShTZGxQYWNrZXQuX0hFQURFUl9TSVpFX1YxICsgZGF0YVNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVZpZXdbZGF0YVZpZXdJbmRleCsrXSA9ICh2ZXJzaW9uIDw8IDQpICsgU2RsUGFja2V0LmdldEVuY3J5cHRpb25CaXQoZW5jcnlwdGlvbikgKyBmcmFtZVR5cGU7XG4gICAgICAgIGRhdGFWaWV3W2RhdGFWaWV3SW5kZXgrK10gPSBzZXJ2aWNlVHlwZTtcbiAgICAgICAgZGF0YVZpZXdbZGF0YVZpZXdJbmRleCsrXSA9IGNvbnRyb2xGcmFtZUluZm87XG4gICAgICAgIGRhdGFWaWV3W2RhdGFWaWV3SW5kZXgrK10gPSBzZXNzaW9uSUQ7XG4gICAgICAgIGRhdGFWaWV3W2RhdGFWaWV3SW5kZXgrK10gPSAoZGF0YVNpemUgJiAweEZGMDAwMDAwKSA+PiAyNDtcbiAgICAgICAgZGF0YVZpZXdbZGF0YVZpZXdJbmRleCsrXSA9IChkYXRhU2l6ZSAmIDB4MDBGRjAwMDApID4+IDE2O1xuICAgICAgICBkYXRhVmlld1tkYXRhVmlld0luZGV4KytdID0gKGRhdGFTaXplICYgMHgwMDAwRkYwMCkgPj4gODtcbiAgICAgICAgZGF0YVZpZXdbZGF0YVZpZXdJbmRleCsrXSA9IGRhdGFTaXplICYgMHgwMDAwMDBGRjtcblxuICAgICAgICBpZiAodmVyc2lvbiA+IDEpIHtcbiAgICAgICAgICAgIGRhdGFWaWV3W2RhdGFWaWV3SW5kZXgrK10gPSAobWVzc2FnZUlEICYgMHhGRjAwMDAwMCkgPj4gMjQ7XG4gICAgICAgICAgICBkYXRhVmlld1tkYXRhVmlld0luZGV4KytdID0gKG1lc3NhZ2VJRCAmIDB4MDBGRjAwMDApID4+IDE2O1xuICAgICAgICAgICAgZGF0YVZpZXdbZGF0YVZpZXdJbmRleCsrXSA9IChtZXNzYWdlSUQgJiAweDAwMDBGRjAwKSA+PiA4O1xuICAgICAgICAgICAgZGF0YVZpZXdbZGF0YVZpZXdJbmRleCsrXSA9IG1lc3NhZ2VJRCAmIDB4MDAwMDAwRkY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF5bG9hZCAhPT0gbnVsbCAmJiBwYXlsb2FkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRhdGFWaWV3LnNldChwYXlsb2FkLCBkYXRhVmlld0luZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhVmlldztcbiAgICB9XG5cbiAgICAvKipcblx0ICogVGhpcyBtZXRob2QgY29udmVydHMgYW4gU2RsUGFja2V0IGluc3RhbmNlIHRvIGEgbmV3IGJ5dGUgYXJyYXkgdGhhdCBjYW4gYmUgc2VudCB2aWEgdGhlIHRyYW5zcG9ydFxuXHQgKiBAcmV0dXJuIHtVaW50OEFycmF5fSAtIEEgYnl0ZVtdIHJlcHJlc2VudGF0aW9uIG9mIGFuIFNkbFBhY2tldCBidWlsdCB1c2luZyB0aGUgc3VwcGxpZWQgcGFyYW1zXG5cdCAqL1xuICAgIHRvUGFja2V0ICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Jzb25QYXlsb2FkKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXlsb2FkID0gQnNvbi5zZXJpYWxpemUodGhpcy5fYnNvblBheWxvYWQpO1xuICAgICAgICAgICAgdGhpcy5fZGF0YVNpemUgPSB0aGlzLl9wYXlsb2FkLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBTZGxQYWNrZXQuX2NvbnN0cnVjdFBhY2tldCh0aGlzLl92ZXJzaW9uLCB0aGlzLl9lbmNyeXB0aW9uLCB0aGlzLl9mcmFtZVR5cGUsIHRoaXMuX3NlcnZpY2VUeXBlLCB0aGlzLl9mcmFtZUluZm8sIHRoaXMuX3Nlc3Npb25JRCwgdGhpcy5fZGF0YVNpemUsIHRoaXMuX21lc3NhZ2VJRCwgdGhpcy5fcGF5bG9hZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRhZyAtIFN0cmluZyBrZXkgdG8gYWRkIGFzIGEgcHJvcGVydHkgdG8gdGhlIEJTT04gbWFwXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBPYmplY3QgdG8gYWRkIGFzIGEgdmFsdWUgdG8gdGhlIEJTT04gbWFwXG4gICAgICovXG4gICAgcHV0VGFnICh0YWcsIGRhdGEpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9ic29uUGF5bG9hZCkge1xuICAgICAgICAgICAgdGhpcy5fYnNvblBheWxvYWQgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9ic29uUGF5bG9hZFt0YWddID0gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGFnIC0gU3RyaW5nIGtleSB0byBhZGQgYXMgYSBwcm9wZXJ0eSB0byB0aGUgQlNPTiBtYXBcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IGRhdGEgLSBPYmplY3QgYXMgYSB2YWx1ZSBmb3VuZCBmcm9tIHRoZSB0aGUgQlNPTiBtYXBcbiAgICAgKi9cblxuICAgIGdldFRhZyAodGFnKSB7XG4gICAgICAgIGlmICghdGhpcy5fYnNvblBheWxvYWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fcGF5bG9hZCB8fCB0aGlzLl9wYXlsb2FkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYnNvblBheWxvYWQgPSBCc29uLmRlc2VyaWFsaXplKHRoaXMuX3BheWxvYWQpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Jzb25QYXlsb2FkW3RhZ107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYnNvblBheWxvYWRbdGFnXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuU2RsUGFja2V0Ll9FWFRSQV9QQVJDRUxfREFUQV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgPSAyNDtcblNkbFBhY2tldC5fSEVBREVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI7XG5TZGxQYWNrZXQuX0hFQURFUl9TSVpFX1YxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg7XG5cblNkbFBhY2tldC5fRU5DUllQVElPTl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODtcblxuLyoqXG4gKiBTZXJ2aWNlIFR5cGVcbiAqL1xuU2RsUGFja2V0LlNFUlZJQ0VfVFlQRV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDA7XG4vLyBSRVNFUlZFRCAweDAxIC0gMHgwNlxuU2RsUGFja2V0LlNFUlZJQ0VfVFlQRV9SUEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDc7XG4vLyBSRVNFUlZFRCAweDA4IC0gMHgwOVxuU2RsUGFja2V0LlNFUlZJQ0VfVFlQRV9QQ00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEE7XG5TZGxQYWNrZXQuU0VSVklDRV9UWVBFX1ZJREVPICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjtcbi8vIFJFU0VSVkVEIDB4MEMgLSAweDBFXG5TZGxQYWNrZXQuU0VSVklDRV9UWVBFX0JVTEtfREFUQSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRjtcbi8vIFJFU0VSVkVEIDB4MTAgLSAweEZGXG5cbi8qKlxuICogRnJhbWUgSW5mb1xuICovXG5TZGxQYWNrZXQuRlJBTUVfSU5GT19IRUFSVF9CRUFUICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDtcblNkbFBhY2tldC5GUkFNRV9JTkZPX1NUQVJUX1NFUlZJQ0UgICAgICAgICAgICAgICAgICAgICAgPSAweDAxO1xuU2RsUGFja2V0LkZSQU1FX0lORk9fU1RBUlRfU0VSVklDRV9BQ0sgICAgICAgICAgICAgICAgICA9IDB4MDI7XG5TZGxQYWNrZXQuRlJBTUVfSU5GT19TVEFSVF9TRVJWSUNFX05BSyAgICAgICAgICAgICAgICAgID0gMHgwMztcblNkbFBhY2tldC5GUkFNRV9JTkZPX0VORF9TRVJWSUNFICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA0O1xuU2RsUGFja2V0LkZSQU1FX0lORk9fRU5EX1NFUlZJQ0VfQUNLICAgICAgICAgICAgICAgICAgICA9IDB4MDU7XG5TZGxQYWNrZXQuRlJBTUVfSU5GT19FTkRfU0VSVklDRV9OQUsgICAgICAgICAgICAgICAgICAgID0gMHgwNjtcblNkbFBhY2tldC5GUkFNRV9JTkZPX1JFR0lTVEVSX1NFQ09OREFSWV9UUkFOU1BPUlQgICAgICAgPSAweDA3O1xuU2RsUGFja2V0LkZSQU1FX0lORk9fUkVHSVNURVJfU0VDT05EQVJZX1RSQU5TUE9SVF9BQ0sgICA9IDB4MDg7XG5TZGxQYWNrZXQuRlJBTUVfSU5GT19SRUdJU1RFUl9TRUNPTkRBUllfVFJBTlNQT1JUX05BSyAgID0gMHgwOTtcbi8vIDB4MEEtMHhGQyBhcmUgcmVzZXJ2ZWRcblNkbFBhY2tldC5GUkFNRV9JTkZPX1RSQU5TUE9SVF9FVkVOVF9VUERBVEUgICAgICAgICAgICAgPSAweEZEO1xuU2RsUGFja2V0LkZSQU1FX0lORk9fU0VSVklDRV9EQVRBX0FDSyAgICAgICAgICAgICAgICAgICA9IDB4RkU7XG5TZGxQYWNrZXQuRlJBTUVfSU5GT19IRUFSVF9CRUFUX0FDSyAgICAgICAgICAgICAgICAgICAgID0gMHhGRjtcblNkbFBhY2tldC5GUkFNRV9JTkZPX0ZJTkFMX0NPTk5FU0NVVElWRV9GUkFNRSAgICAgICAgICAgPSAweDAwO1xuU2RsUGFja2V0LkZSQU1FX0lORk9fUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDA7XG5cbmV4cG9ydCB7IFNkbFBhY2tldCB9O1xuIiwiZXhwb3J0IGRlZmF1bHQgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOlxuICAgICAgICAgICAgdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDpcbiAgICAgICAgICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSk7XG4iLCJcbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG52YXIgaW5pdGVkID0gZmFsc2U7XG5mdW5jdGlvbiBpbml0ICgpIHtcbiAgaW5pdGVkID0gdHJ1ZTtcbiAgdmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gICAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG4gIH1cblxuICByZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbiAgcmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIGlmICghaW5pdGVkKSB7XG4gICAgaW5pdCgpO1xuICB9XG4gIHZhciBpLCBqLCBsLCB0bXAsIHBsYWNlSG9sZGVycywgYXJyXG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIHRoZSBudW1iZXIgb2YgZXF1YWwgc2lnbnMgKHBsYWNlIGhvbGRlcnMpXG4gIC8vIGlmIHRoZXJlIGFyZSB0d28gcGxhY2Vob2xkZXJzLCB0aGFuIHRoZSB0d28gY2hhcmFjdGVycyBiZWZvcmUgaXRcbiAgLy8gcmVwcmVzZW50IG9uZSBieXRlXG4gIC8vIGlmIHRoZXJlIGlzIG9ubHkgb25lLCB0aGVuIHRoZSB0aHJlZSBjaGFyYWN0ZXJzIGJlZm9yZSBpdCByZXByZXNlbnQgMiBieXRlc1xuICAvLyB0aGlzIGlzIGp1c3QgYSBjaGVhcCBoYWNrIHRvIG5vdCBkbyBpbmRleE9mIHR3aWNlXG4gIHBsYWNlSG9sZGVycyA9IGI2NFtsZW4gLSAyXSA9PT0gJz0nID8gMiA6IGI2NFtsZW4gLSAxXSA9PT0gJz0nID8gMSA6IDBcblxuICAvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbiAgYXJyID0gbmV3IEFycihsZW4gKiAzIC8gNCAtIHBsYWNlSG9sZGVycylcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIGwgPSBwbGFjZUhvbGRlcnMgPiAwID8gbGVuIC0gNCA6IGxlblxuXG4gIHZhciBMID0gMFxuXG4gIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbDsgaSArPSA0LCBqICs9IDMpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltMKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9IGVsc2UgaWYgKHBsYWNlSG9sZGVycyA9PT0gMSkge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltMKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICsgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9ICh1aW50OFtpXSA8PCAxNikgKyAodWludDhbaSArIDFdIDw8IDgpICsgKHVpbnQ4W2kgKyAyXSlcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICBpZiAoIWluaXRlZCkge1xuICAgIGluaXQoKTtcbiAgfVxuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBvdXRwdXQgPSAnJ1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPT0nXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArICh1aW50OFtsZW4gLSAxXSlcbiAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAxMF1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9ICc9J1xuICB9XG5cbiAgcGFydHMucHVzaChvdXRwdXQpXG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iLCJcbmV4cG9ydCBmdW5jdGlvbiByZWFkIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbmV4cG9ydCBkZWZhdWx0IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuXG5pbXBvcnQgKiBhcyBiYXNlNjQgZnJvbSAnLi9iYXNlNjQnXG5pbXBvcnQgKiBhcyBpZWVlNzU0IGZyb20gJy4vaWVlZTc1NCdcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheSdcblxuZXhwb3J0IHZhciBJTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHJ1ZVxuXG4vKlxuICogRXhwb3J0IGtNYXhMZW5ndGggYWZ0ZXIgdHlwZWQgYXJyYXkgc3VwcG9ydCBpcyBkZXRlcm1pbmVkLlxuICovXG52YXIgX2tNYXhMZW5ndGggPSBrTWF4TGVuZ3RoKClcbmV4cG9ydCB7X2tNYXhMZW5ndGggYXMga01heExlbmd0aH07XG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHJldHVybiB0cnVlO1xuICAvLyByb2xsdXAgaXNzdWVzXG4gIC8vIHRyeSB7XG4gIC8vICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gIC8vICAgYXJyLl9fcHJvdG9fXyA9IHtcbiAgLy8gICAgIF9fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsXG4gIC8vICAgICBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH1cbiAgLy8gICB9XG4gIC8vICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgLy8gICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgLy8gICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgLy8gfSBjYXRjaCAoZSkge1xuICAvLyAgIHJldHVybiBmYWxzZVxuICAvLyB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiAhKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20odGhpcywgYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBmcm9tICh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhhdCwgdmFsdWUpXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgICAvLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuICAgIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgLy8gICB2YWx1ZTogbnVsbCxcbiAgICAvLyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIC8vIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jICh0aGF0LCBzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhudWxsLCBzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHRoYXQsIHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIHRoYXQgPSB0aGF0LnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgYXJyYXkuYnl0ZUxlbmd0aCAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ29mZnNldFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnbGVuZ3RoXFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBhcnJheVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbUFycmF5TGlrZSh0aGF0LCBhcnJheSlcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmopIHtcbiAgaWYgKGludGVybmFsSXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuKVxuXG4gICAgaWYgKHRoYXQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhhdFxuICAgIH1cblxuICAgIG9iai5jb3B5KHRoYXQsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gdGhhdFxuICB9XG5cbiAgaWYgKG9iaikge1xuICAgIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBpc25hbihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpXG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoKClgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5leHBvcnQgZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5CdWZmZXIuaXNCdWZmZXIgPSBpc0J1ZmZlcjtcbmZ1bmN0aW9uIGludGVybmFsSXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcihhKSB8fCAhaW50ZXJuYWxJc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChpbnRlcm5hbElzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIWludGVybmFsSXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IElOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIWludGVybmFsSXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChpbnRlcm5hbElzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmXG4gICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgKytpKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IGludGVybmFsSXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG5cblxuLy8gdGhlIGZvbGxvd2luZyBpcyBmcm9tIGlzLWJ1ZmZlciwgYWxzbyBieSBGZXJvc3MgQWJvdWtoYWRpamVoIGFuZCB3aXRoIHNhbWUgbGlzZW5jZVxuLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZ1xuLy8gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseVxuZXhwb3J0IGZ1bmN0aW9uIGlzQnVmZmVyKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgKCEhb2JqLl9pc0J1ZmZlciB8fCBpc0Zhc3RCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSlcbn1cblxuZnVuY3Rpb24gaXNGYXN0QnVmZmVyIChvYmopIHtcbiAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNGYXN0QnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbn1cbiIsImNsYXNzIFRleHRFbmNvZGVyIHtcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVGV4dEVuY29kZXIjUG9seWZpbGxcbiAgICBzdGF0aWMgZW5jb2RlIChzdHIpIHtcbiAgICAgICAgY29uc3QgTGVuID0gc3RyLmxlbmd0aDtcbiAgICAgICAgbGV0IHJlc1BvcyA9IC0xO1xuICAgICAgICAvLyBUaGUgVWludDhBcnJheSdzIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0IDN4IHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBiZWNhdXNlIGFuIGludmFsaWQgVVRGLTE2XG4gICAgICAgIC8vICB0YWtlcyB1cCB0aGUgZXF1aXZlbGVudCBzcGFjZSBvZiAzIFVURi04IGNoYXJhY3RlcnMgdG8gZW5jb2RlIGl0IHByb3Blcmx5LiBIb3dldmVyLCBBcnJheSdzXG4gICAgICAgIC8vICBoYXZlIGFuIGF1dG8gZXhwYW5kaW5nIGxlbmd0aCBhbmQgMS41eCBzaG91bGQgYmUganVzdCB0aGUgcmlnaHQgYmFsYW5jZSBmb3IgbW9zdCB1c2VzLlxuICAgICAgICBjb25zdCByZXNBcnIgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcG9pbnQgPSAwLCBuZXh0Y29kZSA9IDAsIGlkeCA9IDA7IGlkeCAhPT0gTGVuOykge1xuICAgICAgICAgICAgcG9pbnQgPSBzdHIuY2hhckNvZGVBdChpZHgpLCBpZHggKz0gMTtcbiAgICAgICAgICAgIGlmIChwb2ludCA+PSAweEQ4MDAgJiYgcG9pbnQgPD0gMHhEQkZGKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gTGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc0FycltyZXNQb3MgKz0gMV0gPSAweGVmO1xuICAgICAgICAgICAgICAgICAgICByZXNBcnJbcmVzUG9zICs9IDFdID0gMHhiZjtcbiAgICAgICAgICAgICAgICAgICAgcmVzQXJyW3Jlc1BvcyArPSAxXSA9IDB4YmQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZyNzdXJyb2dhdGUtZm9ybXVsYWVcbiAgICAgICAgICAgICAgICBuZXh0Y29kZSA9IHN0ci5jaGFyQ29kZUF0KGlkeCk7XG4gICAgICAgICAgICAgICAgaWYgKG5leHRjb2RlID49IDB4REMwMCAmJiBuZXh0Y29kZSA8PSAweERGRkYpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQgPSAoKHBvaW50IC0gMHhEODAwKSAqIDB4NDAwKSArIG5leHRjb2RlIC0gMHhEQzAwICsgMHgxMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb2ludCA+IDB4ZmZmZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzQXJyW3Jlc1BvcyArPSAxXSA9ICgweDFlIDw8IDMpIHwgKHBvaW50ID4+PiAxOCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNBcnJbcmVzUG9zICs9IDFdID0gKDB4MiA8PCA2KSB8ICgocG9pbnQgPj4+IDEyKSAmIDB4M2YpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzQXJyW3Jlc1BvcyArPSAxXSA9ICgweDIgPDwgNikgfCAoKHBvaW50ID4+PiA2KSAmIDB4M2YpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzQXJyW3Jlc1BvcyArPSAxXSA9ICgweDIgPDwgNikgfCAocG9pbnQgJiAweDNmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzQXJyW3Jlc1BvcyArPSAxXSA9IDB4ZWY7IHJlc0FycltyZXNQb3MgKz0gMV0gPSAweGJmO1xuICAgICAgICAgICAgICAgICAgICByZXNBcnJbcmVzUG9zICs9IDFdID0gMHhiZDsgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvaW50IDw9IDB4MDA3Zikge1xuICAgICAgICAgICAgICAgIHJlc0FycltyZXNQb3MgKz0gMV0gPSAoMHgwIDw8IDcpIHwgcG9pbnQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBvaW50IDw9IDB4MDdmZikge1xuICAgICAgICAgICAgICAgIHJlc0FycltyZXNQb3MgKz0gMV0gPSAoMHg2IDw8IDUpIHwgKHBvaW50ID4+PiA2KTtcbiAgICAgICAgICAgICAgICByZXNBcnJbcmVzUG9zICs9IDFdID0gKDB4MiA8PCA2KSB8IChwb2ludCAmIDB4M2YpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNBcnJbcmVzUG9zICs9IDFdID0gKDB4ZSA8PCA0KSB8IChwb2ludCA+Pj4gMTIpO1xuICAgICAgICAgICAgICAgIHJlc0FycltyZXNQb3MgKz0gMV0gPSAoMHgyIDw8IDYpIHwgKChwb2ludCA+Pj4gNikgJiAweDNmKTtcbiAgICAgICAgICAgICAgICByZXNBcnJbcmVzUG9zICs9IDFdID0gKDB4MiA8PCA2KSB8IChwb2ludCAmIDB4M2YpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGVsc2UgLy8gSUUgNi05XG4gICAgICAgIHJlc0Fyci5sZW5ndGggPSByZXNQb3MgKyAxOyAvLyB0cmltIG9mZiBleHRyYSB3ZWlnaHRcbiAgICAgICAgcmV0dXJuIHJlc0FycjtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFRleHRFbmNvZGVyIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFRleHRFbmNvZGVyIH0gZnJvbSAnLi9UZXh0RW5jb2Rlci5qcyc7XG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ycGMvUnBjU3RydWN0LmpzJztcblxuY2xhc3MgSnNvblJwY01hcnNoYWxsZXIge1xuICAgIC8qKlxuICAgICAqIFRha2VzIGFuIFJQQyBtZXNzYWdlIGFuZCBjb252ZXJ0cyBpdFxuICAgICAqIGludG8gYSBieXRlIGFycmF5IHRoYXQgY2FuIGJlIGFkZGVkXG4gICAgICogYXMgcGFydCBvZiB0aGUgU2RsUGFja2V0LlxuICAgICAqIEBwYXJhbSB7UnBjU3RydWN0fSBycGNTdHJ1Y3QgLSBUaGlzIHBhcmFtIGNvbnRhaW5zIHRoZSBqc29uIG9iamVjdCB0byB0cmFuc2Zvcm1cbiAgICAgKiBiYXNlZCBvbiB0aGUgZ2V0UGFyYW1ldGVycyBtZXRob2QuIFRoaXMgY2FuIGJlIGFuIFJwY1N0cnVjdCBvciBzb21ldGhpbmcgbGlrZSBScGNNZXNzYWdlXG4gICAgICogd2hpY2ggZXh0ZW5kcyBScGNTdHJ1Y3QuXG4gICAgICogQHJldHVybnMge251bGx8VWludDhBcnJheX0gLSBFaXRoZXIgdGhlIGJ5dGUgYXJyYXkgb3IgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBzdGF0aWMgbWFyc2hhbGwgKHJwY1N0cnVjdCkge1xuICAgICAgICBsZXQganNvbkJ5dGVzID0gbnVsbDtcbiAgICAgICAgZnVuY3Rpb24gcGFyYW1pZnkgKHJwY1N0cnVjdCkge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gcnBjU3RydWN0LmdldFBhcmFtZXRlcnMoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHBhcmFtcykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbXNba2V5XSBpbnN0YW5jZW9mIFJwY1N0cnVjdCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXNba2V5XSA9IHBhcmFtaWZ5KHBhcmFtc1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGpzb25PYmplY3QgPSBwYXJhbWlmeShycGNTdHJ1Y3QpO1xuICAgICAgICAgICAgY29uc3Qgc3RyaW5nVmVyc2lvbiA9IEpTT04uc3RyaW5naWZ5KGpzb25PYmplY3QpO1xuICAgICAgICAgICAganNvbkJ5dGVzID0gdGhpcy5fZW5jb2RlKHN0cmluZ1ZlcnNpb24pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGVuY29kZSBtZXNzYWdlcyB0byBKU09OLicsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ganNvbkJ5dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRha2VzIGEgYnl0ZSBhcnJheSBhbmQgdHJhbnNmb3JtcyBpdCBpbnRvIGEganNvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlcyAtIEJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUganNvbiBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVsbHxPYmplY3R9IC0gRWl0aGVyIGEganNvbiBvYmplY3Qgb3IgbnVsbCBvbiBlcnJvciBpbiBwYXJzaW5nLlxuICAgICAqL1xuICAgIHN0YXRpYyB1bm1hcnNoYWxsIChieXRlcykge1xuICAgICAgICBsZXQgcmV0ID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSB0aGlzLl9kZWNvZGUoYnl0ZXMpO1xuICAgICAgICAgICAgcmV0ID0gSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBKU09OJywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIGEgc3RyaW5nIGludG8gYSBieXRlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgLSBTdHJpbmcgdG8gdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc3RhdGljIF9lbmNvZGUgKHN0cikge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoVGV4dEVuY29kZXIuZW5jb2RlKHN0cikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSBhIGJ5dGUgYXJyYXkgaW50byBhIHN0cmluZy5cbiAgICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzIC0gQnl0ZSBhcnJheSB0byB0cmFuc2Zvcm0uXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN0YXRpYyBfZGVjb2RlIChieXRlcykge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYnl0ZXMpLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBKc29uUnBjTWFyc2hhbGxlciB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG4vKipcbiAqIENvbnRhaW5zIHRoZSByYXcganNvbiBkYXRhIGFuZCBidWxrIGRhdGEgZm9yIGFuIFJQQyByZXF1ZXN0L3Jlc3BvbnNlIGFsb25nIHdpdGggdGhlIGJhc2ljIGhlYWRlciBpbmZvXG4gKiBycGMgdHlwZSwgZnVuY3Rpb24gaWQsIGFuZCBjb3JyZWxhdGlvbiBpZC5cbiAqXG4gKiBUaGlzIGNsYXNzIGNhbiBwYXJzZSBpbmNvbWluZyBkYXRhIGZyb20gc2RsIGNvcmUgYW5kIGFzc2VtYmxlIGEgYmluYXJ5IGhlYWRlciB0byBzZW5kIHRvIHNkbCBjb3JlLlxuICpcbiAqXG4gKiAgQHByaXZhdGUge251bWJlcn0gX3JwY1R5cGUgLSBSZXF1ZXN0ID0gMCwgUmVzcG9uc2UgPSAxLCBOb3RpZmljYXRpb24gPSAyLlxuICogIEBwcml2YXRlIHtudW1iZXJ9IF9mdW5jdGlvbklkIC0gTWF0Y2hlcyBhIGZ1bmN0aW9uIElkIGluIHRoZSBtb2JpbGUgYXBpIHNwZWMgaHR0cHM6Ly9naXRodWIuY29tL3NtYXJ0ZGV2aWNlbGluay9ycGNfc3BlYy9ibG9iL21hc3Rlci9NT0JJTEVfQVBJLnhtbFxuICogIEBwcml2YXRlIHtudW1iZXJ9IF9jb3JyZWxhdGlvbklkIC0gRm9yIGEgcmVxdWVzdCB0aGlzIGlkIGlzIHByb3ZpZGVkIGFuZCB0aGUgbWF0Y2hpbmcgcmVzcG9uc2Ugd2lsbCBoYXZlIHRoaXMgc2FtZSBpZC5cbiAqICBAcHJpdmF0ZSB7bnVtYmVyfSBfanNvblNpemUgLSBTaXplIG9mIGpzb24uXG4gKiAgQHByaXZhdGUge1VpbnQ4QXJyYXl9IF9qc29uRGF0YSAtIFJhdyBqc29uIGRhdGEuIFRoaXMgY2FuIGJlIHBhcnNlZCB1c2luZyB0aGUgSnNvblJwY01hcnNoYWxsZXIuXG4gKiAgQHByaXZhdGUge1VpbnQ4QXJyYXl9IF9idWxrRGF0YSAtIEJ1bGsgZGF0YSAob3B0aW9uYWwpLiBJZiBzb21ldGhpbmcgY2Fubm90IGJlIGV4cHJlc3NlZCBhcyBhIGpzb24gb2JqZWN0IGl0IHdpbGwgYmUgaW4gdGhlIGJ1bGsgZGF0YSAoZWcgUHV0RmlsZS9HZXRGaWxlIGhhcyB0aGUgZnVsbCBmaWxlIGluIGJ1bGsgZGF0YS4pXG4gKi9cbmNsYXNzIEJpbmFyeUZyYW1lSGVhZGVyIHtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBycGNUeXBlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29ycmVsYXRpb25JZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBqc29uU2l6ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChycGNUeXBlLCBmdW5jdGlvbklkLCBjb3JyZWxhdGlvbklkLCBqc29uU2l6ZSkge1xuICAgICAgICB0aGlzLl9ycGNUeXBlID0gcnBjVHlwZTtcbiAgICAgICAgdGhpcy5fZnVuY3Rpb25JZCA9IGZ1bmN0aW9uSWQ7XG4gICAgICAgIHRoaXMuX2NvcnJlbGF0aW9uSWQgPSBjb3JyZWxhdGlvbklkO1xuICAgICAgICB0aGlzLl9qc29uU2l6ZSA9IGpzb25TaXplO1xuICAgICAgICB0aGlzLl9idWxrRGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2pzb25EYXRhID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGJ5dGUgYXJyYXkgd2l0aCB1aW50OCB2YWx1ZXMsIGEgQmluYXJ5RnJhbWVIZWFkZXIgaW5zdGFuY2UgaXMgY3JlYXRlZC5cbiAgICAgKiBAcGFyYW0ge2FycmF5fSBiaW5hcnlGcmFtZUhlYWRlckRhdGEgLSBCeXRlIGFycmF5IGNvbnRhaW5pbmcgYmFzaWMgaW5mb3JtYXRpb24gb24gdGhlIGZyYW1lcyB0eXBlLCBsZW5ndGgsIGFuZCByZWxhdGVkIGlkcy5cbiAgICAgKiBAcmV0dXJucyB7QmluYXJ5RnJhbWVIZWFkZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGZyb21CaW5hcnlIZWFkZXIgKGJpbmFyeUZyYW1lSGVhZGVyRGF0YSkge1xuICAgICAgICBjb25zdCBycGNUeXBlID0gYmluYXJ5RnJhbWVIZWFkZXJEYXRhWzBdID4+IDQ7XG5cbiAgICAgICAgbGV0IGZ1bmN0aW9uSWQgPSAoYmluYXJ5RnJhbWVIZWFkZXJEYXRhWzBdICYgMHgwRikgPDwgMjQ7XG4gICAgICAgIGZ1bmN0aW9uSWQgKz0gKGJpbmFyeUZyYW1lSGVhZGVyRGF0YVsxXSAmIDB4RkYpIDw8IDE2O1xuICAgICAgICBmdW5jdGlvbklkICs9IChiaW5hcnlGcmFtZUhlYWRlckRhdGFbMl0gJiAweEZGKSA8PCA4O1xuICAgICAgICBmdW5jdGlvbklkICs9IGJpbmFyeUZyYW1lSGVhZGVyRGF0YVszXSAmIDB4RkY7XG5cbiAgICAgICAgbGV0IGNvcnJlbGF0aW9uSWQgPSAoYmluYXJ5RnJhbWVIZWFkZXJEYXRhWzRdICYgMHhGRikgPDwgMjQ7XG4gICAgICAgIGNvcnJlbGF0aW9uSWQgKz0gKGJpbmFyeUZyYW1lSGVhZGVyRGF0YVs1XSAmIDB4RkYpIDw8IDE2O1xuICAgICAgICBjb3JyZWxhdGlvbklkICs9IChiaW5hcnlGcmFtZUhlYWRlckRhdGFbNl0gJiAweEZGKSA8PCA4O1xuICAgICAgICBjb3JyZWxhdGlvbklkICs9IGJpbmFyeUZyYW1lSGVhZGVyRGF0YVs3XSAmIDB4RkY7XG5cbiAgICAgICAgbGV0IGpzb25TaXplID0gKGJpbmFyeUZyYW1lSGVhZGVyRGF0YVs4XSAmIDB4RkYpIDw8IDI0O1xuICAgICAgICBqc29uU2l6ZSArPSAoYmluYXJ5RnJhbWVIZWFkZXJEYXRhWzldICYgMHhGRikgPDwgMTY7XG4gICAgICAgIGpzb25TaXplICs9IChiaW5hcnlGcmFtZUhlYWRlckRhdGFbMTBdICYgMHhGRikgPDwgODtcbiAgICAgICAganNvblNpemUgKz0gYmluYXJ5RnJhbWVIZWFkZXJEYXRhWzExXSAmIDB4RkY7XG5cbiAgICAgICAgY29uc3QgYmluYXJ5RnJhbWVIZWFkZXIgPSBuZXcgQmluYXJ5RnJhbWVIZWFkZXIocnBjVHlwZSwgZnVuY3Rpb25JZCwgY29ycmVsYXRpb25JZCwganNvblNpemUpO1xuXG4gICAgICAgIGNvbnN0IGpzb25EYXRhU3RhcnQgPSBCaW5hcnlGcmFtZUhlYWRlci5IRUFERVJfU0laRTtcbiAgICAgICAgY29uc3QganNvbkRhdGFFbmQgPSBCaW5hcnlGcmFtZUhlYWRlci5IRUFERVJfU0laRSArIGpzb25TaXplO1xuXG4gICAgICAgIGJpbmFyeUZyYW1lSGVhZGVyLnNldEpzb25EYXRhKGJpbmFyeUZyYW1lSGVhZGVyRGF0YS5zbGljZShqc29uRGF0YVN0YXJ0LCBqc29uRGF0YUVuZCkpO1xuXG4gICAgICAgIC8vIGFueSBkYXRhIGFmdGVyIHRoZSBKU09OIGRhdGEgaXMgdGhlIGJ1bGsgZGF0YSAoZWcgUHV0RmlsZSBjb250YWlucyB0aGUgZmlsZSBhZnRlciB0aGUgbWFpbiBqc29uKVxuICAgICAgICBpZiAoYmluYXJ5RnJhbWVIZWFkZXJEYXRhLmxlbmd0aCA+IGpzb25EYXRhRW5kKSB7XG4gICAgICAgICAgICBjb25zdCBidWxrRGF0YSA9IGJpbmFyeUZyYW1lSGVhZGVyRGF0YS5zbGljZShqc29uRGF0YUVuZCk7XG4gICAgICAgICAgICBiaW5hcnlGcmFtZUhlYWRlci5zZXRCdWxrRGF0YShidWxrRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJpbmFyeUZyYW1lSGVhZGVyO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQXNzZW1ibGVzIGJpbmFyeSBoZWFkZXIgZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7YXJyYXl9XG4gICAgICovXG4gICAgYXNzZW1ibGVIZWFkZXJCeXRlcyAoKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IFtdO1xuICAgICAgICBjb25zdCBmdW5jdGlvbklkID0gdGhpcy5fZnVuY3Rpb25JZDtcbiAgICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHRoaXMuX2NvcnJlbGF0aW9uSWQ7XG4gICAgICAgIGNvbnN0IHJwY1R5cGUgPSB0aGlzLl9ycGNUeXBlO1xuXG4gICAgICAgIGJ1ZmZlci5wdXNoKChmdW5jdGlvbklkICYgMHgwRjAwMDAwMCkgPj4gMjQpICsgKHJwY1R5cGUgPDwgNCk7XG4gICAgICAgIGJ1ZmZlci5wdXNoKChmdW5jdGlvbklkICYgMHgwMEZGMDAwMCkgPj4gMTYpO1xuICAgICAgICBidWZmZXIucHVzaCgoZnVuY3Rpb25JZCAmIDB4MDAwMEZGMDApID4+IDgpO1xuICAgICAgICBidWZmZXIucHVzaChmdW5jdGlvbklkICYgMHgwMDAwMDBGRik7XG5cbiAgICAgICAgYnVmZmVyLnB1c2goKGNvcnJlbGF0aW9uSWQgJiAweEZGMDAwMDAwKSA+PiAyNCk7XG4gICAgICAgIGJ1ZmZlci5wdXNoKChjb3JyZWxhdGlvbklkICYgMHgwMEZGMDAwMCkgPj4gMTYpO1xuICAgICAgICBidWZmZXIucHVzaCgoY29ycmVsYXRpb25JZCAmIDB4MDAwMEZGMDApID4+IDgpO1xuICAgICAgICBidWZmZXIucHVzaChjb3JyZWxhdGlvbklkICYgMHgwMDAwMDBGRik7XG5cbiAgICAgICAgY29uc3QganNvblNpemUgPSB0aGlzLl9qc29uU2l6ZTtcbiAgICAgICAgYnVmZmVyLnB1c2goKGpzb25TaXplICYgMHhGRjAwMDAwMCkgPj4gMjQpO1xuICAgICAgICBidWZmZXIucHVzaCgoanNvblNpemUgJiAweDAwRkYwMDAwKSA+PiAxNik7XG4gICAgICAgIGJ1ZmZlci5wdXNoKChqc29uU2l6ZSAmIDB4MDAwMEZGMDApID4+IDgpO1xuICAgICAgICBidWZmZXIucHVzaChqc29uU2l6ZSAmIDB4MDAwMDAwRkYpO1xuXG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcnBjIHR5cGUgb2YgdGhlIGJpbmFyeSBoZWFkZXIuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHR5cGVcbiAgICAgKiBAcmV0dXJucyB7QmluYXJ5RnJhbWVIZWFkZXJ9XG4gICAgICovXG4gICAgc2V0UnBjVHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLl9ycGNUeXBlID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcnBjIHR5cGUgb2YgdGhlIGJpbmFyeSBoZWFkZXJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldFJwY1R5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnBjVHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBmdW5jdGlvbiBpZCBvZiB0aGUgYmluYXJ5IGhlYWRlci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaWRcbiAgICAgKiBAcmV0dXJucyB7QmluYXJ5RnJhbWVIZWFkZXJ9XG4gICAgICovXG4gICAgc2V0RnVuY3Rpb25JZCAoaWQpIHtcbiAgICAgICAgdGhpcy5fZnVuY3Rpb25JZCA9IGlkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmdW5jdGlvbiBJZCBvZiB0aGUgYmluYXJ5IGhlYWRlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldEZ1bmN0aW9uSWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnVuY3Rpb25JZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjb3JyZWxhdGlvbiBJZCBvZiB0aGUgYmluYXJ5IGhlYWRlci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaWRcbiAgICAgKiBAcmV0dXJucyB7QmluYXJ5RnJhbWVIZWFkZXJ9XG4gICAgICovXG4gICAgc2V0Q29ycmVsYXRpb25JZCAoaWQpIHtcbiAgICAgICAgdGhpcy5fY29ycmVsYXRpb25JZCA9IGlkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb3JyZWxhdGlvbiBJZCBvZiB0aGUgYmluYXJ5IGhlYWRlci5cbiAgICAgKi9cbiAgICBnZXRDb3JyZWxhdGlvbklkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvcnJlbGF0aW9uSWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUganNvbiBzaXplIG9mIHRoZSBiaW5hcnkgaGVhZGVyLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gICAgICogQHJldHVybnMge0JpbmFyeUZyYW1lSGVhZGVyfVxuICAgICAqL1xuICAgIHNldEpzb25TaXplIChzaXplKSB7XG4gICAgICAgIHRoaXMuX2pzb25TaXplID0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VzdCB0aGUganNvbiBzaXplIG9mIHRoZSBiaW5hcnkgaGVhZGVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0SnNvblNpemUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fanNvblNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUganNvbiBkYXRhIGFzIGEgYnl0ZSBhcnJheS5cbiAgICAgKiBAcmV0dXJucyB7YXJyYXl9IC0gQnl0ZSBhcnJheSBvZiBqc29uIGRhdGEuXG4gICAgICovXG4gICAgZ2V0SnNvbkRhdGEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fanNvbkRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUganNvbiBkYXRhIG9mIHRoZSBiaW5hcnkgaGVhZGVyLlxuICAgICAqIEBwYXJhbSB7YXJyYXl9IGRhdGEgLSBCeXRlIGFycmF5IG9mIGpzb24gZGF0YVxuICAgICAqIEByZXR1cm5zIHtCaW5hcnlGcmFtZUhlYWRlcn1cbiAgICAgKi9cbiAgICBzZXRKc29uRGF0YSAoZGF0YSkge1xuICAgICAgICB0aGlzLl9qc29uRGF0YSA9IGRhdGE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGJ1bGsgZGF0YSBvZiB0aGUgYmluYXJ5IGhlYWRlci5cbiAgICAgKiBTdXBwb3J0ZWQgYnkgcHJvdGNvbCAyIGFuZCB1cC5cbiAgICAgKiBAcGFyYW0ge2FycmF5fSBkYXRhIC0gQnl0ZSBhcnJheSBvZiBidWxrIGRhdGFcbiAgICAgKi9cbiAgICBzZXRCdWxrRGF0YSAoZGF0YSkge1xuICAgICAgICB0aGlzLl9idWxrRGF0YSA9IGRhdGE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGJ1bGsgZGF0YSBvZiB0aGUgYmluYXJ5IGhlYWRlci5cbiAgICAgKiBTdXBwb3J0ZWQgYnkgcHJvdGNvbCAyIGFuZCB1cC5cbiAgICAgKiBAcmV0dXJucyB7YXJyYXl9IC0gQnl0ZSBhcnJheSBvZiBidWxrIGRhdGFcbiAgICAgKi9cbiAgICBnZXRCdWxrRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWxrRGF0YTtcbiAgICB9XG59XG5cbkJpbmFyeUZyYW1lSGVhZGVyLkhFQURFUl9TSVpFID0gMTI7XG5cbmV4cG9ydCB7IEJpbmFyeUZyYW1lSGVhZGVyIH07XG5cblxuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5pbXBvcnQgeyBGcmFtZVR5cGUgfSBmcm9tICcuL2VudW1zL0ZyYW1lVHlwZS5qcyc7XG5pbXBvcnQgeyBTZGxQYWNrZXQgfSBmcm9tICcuL1NkbFBhY2tldC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi8uLi9ycGMvZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBKc29uUnBjTWFyc2hhbGxlciB9IGZyb20gJy4vLi4vdXRpbC9Kc29uUnBjTWFyc2hhbGxlci5qcyc7XG5pbXBvcnQgeyBCaW5hcnlGcmFtZUhlYWRlciB9IGZyb20gJy4vQmluYXJ5RnJhbWVIZWFkZXIuanMnO1xuXG5cbi8qKlxuICogVGFrZXMgYW4gcnBjIG1lc3NhZ2UgYW5kIGNvbnZlcnRzIGl0IGludG8gcGFja2V0cyByZWFkeSB0byBzZW5kLlxuICovXG5jbGFzcyBNZXNzYWdlRnJhbWVEaXNhc3NlbWJsZXIge1xuICAgIC8qKlxuICAgICAgKlxuICAgICAgKiBAcGFyYW0ge1JwY1JlcXVlc3R9IHJwY1JlcXVlc3QgLSBSUEMgbWVzc2FnZSB0aGF0IHdpbGwgc3BsaXQgaW50byBzbWFsbGVyIHNkbCBwYWNrZXRzLlxuICAgICAgKiBAcGFyYW0ge051bWJlcn0gc2Vzc2lvbklkIC0gc2Vzc2lvbklkIGZvciBwYWNrZXRzXG4gICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtZXNzYWdlSWQgLSBtZXNzYWdlSWQgZm9yIHBhY2tldHMuXG4gICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtdHUgLSBtYXggdHJhbnNwb3J0IHVuaXQsIHVzZWQgdG8gZGV0ZXJtaW5lIHBhY2tldCBzaXplIHRvIHNlbmQuXG4gICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2ZXJzaW9uIC0gbWFqb3IgdmVyc2lvblxuICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRW5jcnlwdGVkIC0gcGFja2V0IGlzIGVuY3J5cHRlZFxuICAgICAgKiBAcGFyYW0ge2NifSBwYWNrZXRDYWxsYmFjayAtIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHBhY2tldCBpcyByZWFkeSB0byBzZW5kLlxuICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICovXG4gICAgY29uc3RydWN0b3IgKHJwY1JlcXVlc3QsIHNlc3Npb25JZCwgbWVzc2FnZUlkLCBtdHUsIHZlcnNpb24sIGlzRW5jcnlwdGVkLCBwYWNrZXRDYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9ycGNSZXF1ZXN0ID0gcnBjUmVxdWVzdDtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbklkID0gc2Vzc2lvbklkO1xuICAgICAgICB0aGlzLl9tZXNzYWdlSWQgPSBtZXNzYWdlSWQ7XG4gICAgICAgIHRoaXMuX2lzRW5jcnlwdGVkID0gaXNFbmNyeXB0ZWQ7XG5cbiAgICAgICAgaWYgKCFtdHUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTVRVIG11c3QgYmUgc3BlY2lmaWVkLicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX210dSA9IG10dTtcblxuICAgICAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmVyc2lvbiBtdXN0IGJlIHNwZWNpZmllZC4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fcGFja2V0Q2FsbGJhY2sgPSBwYWNrZXRDYWxsYmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgICogSW1tZWRpYXRlbHkgYnVpbGQgcnBjIGFuZCByZXNwb25kIHRvIHBhY2tldGNhbGxiYWNrIHdpdGggcGFja2V0cyB0byBzZW5kLlxuICAgICAgKiBAcGFyYW0ge1JwY1JlcXVlc3R9IHJwY01lc3NhZ2UgLSBSUEMgbWVzc2FnZSB0aGF0IHdpbGwgc3BsaXQgaW50byBzbWFsbGVyIHNkbCBwYWNrZXRzLlxuICAgICAgKiBAcGFyYW0ge051bWJlcn0gc2Vzc2lvbklkIC0gc2Vzc2lvbklkIGZvciBwYWNrZXRzXG4gICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtZXNzYWdlSWQgLSBtZXNzYWdlSWQgZm9yIHBhY2tldHMuXG4gICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtdHUgLSBtYXggdHJhbnNwb3J0IHVuaXQsIHVzZWQgdG8gZGV0ZXJtaW5lIHBhY2tldCBzaXplIHRvIHNlbmQuXG4gICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2ZXJzaW9uIC0gbWFqb3IgdmVyc2lvblxuICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRW5jcnlwdGVkIC0gcGFja2V0IGlzIGVuY3J5cHRlZFxuICAgICAgKiBAcGFyYW0ge2NifSBwYWNrZXRDYWxsYmFjayAtIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHBhY2tldCBpcyByZWFkeSB0byBzZW5kLlxuICAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGRSUEMgKHJwY1JlcXVlc3QsIHNlc3Npb25JZCwgbWVzc2FnZUlkLCBtdHUsIHZlcnNpb24sIGlzRW5jcnlwdGVkLCBjYikge1xuICAgICAgICBjb25zdCBvYmogPSBuZXcgTWVzc2FnZUZyYW1lRGlzYXNzZW1ibGVyKHJwY1JlcXVlc3QsIHNlc3Npb25JZCwgbWVzc2FnZUlkLCBtdHUsIHZlcnNpb24sIGlzRW5jcnlwdGVkLCBjYik7XG4gICAgICAgIG9iai5fZG9SZXF1ZXN0KCk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIHRoZSBtYWluIEJpbmFyeUZyYW1lSGVhZGVyIGJ1ZmZlci5cbiAgICAgKiBAcmV0dXJucyB7VW5pdDhBcnJheX1cbiAgICAgKi9cbiAgICBfYnVpbGRSUENNYWluQnVmZmVyICgpIHtcbiAgICAgICAgY29uc3QgcnBjQnVsa0RhdGEgPSB0aGlzLl9ycGNSZXF1ZXN0LmdldEJ1bGtEYXRhKCk7XG4gICAgICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSB0aGlzLl9ycGNSZXF1ZXN0LmdldENvcnJlbGF0aW9uSWQoKTtcbiAgICAgICAgY29uc3QgcnBjVHlwZSA9ICB0aGlzLl9ycGNSZXF1ZXN0LmdldFJQQ1R5cGUoKTtcblxuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSB0aGlzLl9ycGNSZXF1ZXN0LmdldEZ1bmN0aW9uTmFtZSgpO1xuICAgICAgICBjb25zdCBmdW5jdGlvbklkID0gRnVuY3Rpb25JRC52YWx1ZUZvcktleShmdW5jdGlvbk5hbWUpO1xuICAgICAgICBpZiAoIWZ1bmN0aW9uSWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgZnVuY3Rpb24gJHtmdW5jdGlvbk5hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBqc29uQnVmZmVyID0gSnNvblJwY01hcnNoYWxsZXIubWFyc2hhbGwodGhpcy5fcnBjUmVxdWVzdCk7XG4gICAgICAgIGNvbnN0IGpzb25TaXplID0ganNvbkJ1ZmZlci5sZW5ndGg7XG5cbiAgICAgICAgY29uc3QgYmZoID0gbmV3IEJpbmFyeUZyYW1lSGVhZGVyKHJwY1R5cGUsIGZ1bmN0aW9uSWQsIGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBiZmguc2V0SnNvbkRhdGEoanNvbkJ1ZmZlcik7XG4gICAgICAgIGJmaC5zZXRKc29uU2l6ZShqc29uU2l6ZSk7XG4gICAgICAgIGJmaC5zZXRCdWxrRGF0YShycGNCdWxrRGF0YSk7XG4gICAgICAgIGNvbnN0IGhlYWRlclNpemUgPSAxMjtcbiAgICAgICAgY29uc3QgYnVsa0RhdGEgPSBiZmguZ2V0QnVsa0RhdGEoKTtcbiAgICAgICAgbGV0IGJ1bGtEYXRhU2l6ZSA9IDA7XG4gICAgICAgIGlmIChidWxrRGF0YSkge1xuICAgICAgICAgICAgYnVsa0RhdGFTaXplID0gYnVsa0RhdGEubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsTWVzc2FnZVNpemUgPSBoZWFkZXJTaXplICsganNvblNpemUgKyBidWxrRGF0YVNpemU7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh0b3RhbE1lc3NhZ2VTaXplKTtcbiAgICAgICAgZGF0YS5zZXQoYmZoLmFzc2VtYmxlSGVhZGVyQnl0ZXMoKSwgMCk7XG4gICAgICAgIGRhdGEuc2V0KGpzb25CdWZmZXIsIGhlYWRlclNpemUpO1xuICAgICAgICBpZiAoYnVsa0RhdGEpIHtcbiAgICAgICAgICAgIGRhdGEuc2V0KGJ1bGtEYXRhLCBoZWFkZXJTaXplICsganNvblNpemUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgdGhlIFJQQyByZXF1ZXN0IGFuZCB1c2UgY2FsbGJhY2sgdG8gc2VuZFxuICAgICAqIHNkbCBwYWNrZXRzIG9mIHRoZSBhcHByb3ByaWF0ZSBzaXplLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2RvUmVxdWVzdCAoKSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xuICAgICAgICBjb25zdCBmcmFtZUluZm8gPSAwO1xuICAgICAgICBjb25zdCBmcmFtZVR5cGUgPSBGcmFtZVR5cGUuU0lOR0xFO1xuXG4gICAgICAgIGNvbnN0IHNlcnZpY2VUeXBlID0gU2RsUGFja2V0LlNFUlZJQ0VfVFlQRV9SUEM7XG4gICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHRoaXMuX3Nlc3Npb25JZDtcbiAgICAgICAgY29uc3QgbWVzc2FnZUlkID0gdGhpcy5fbWVzc2FnZUlkO1xuXG4gICAgICAgIGNvbnN0IGlzRW5jcnlwdGVkID0gdGhpcy5faXNFbmNyeXB0ZWQ7XG4gICAgICAgIGNvbnN0IG1haW5CdWZmZXIgPSB0aGlzLl9idWlsZFJQQ01haW5CdWZmZXIoKTtcbiAgICAgICAgY29uc3QgbXR1ID0gdGhpcy5fbXR1O1xuXG4gICAgICAgIGNvbnN0IGZyYW1lQ291bnQgPSBNYXRoLmNlaWwobWFpbkJ1ZmZlci5sZW5ndGggLyBtdHUpO1xuXG4gICAgICAgIGlmIChmcmFtZUNvdW50IDw9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYWNrZXQgPSB0aGlzLl9jb25zdHJ1Y3RQYWNrZXQoXG4gICAgICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgICAgICBzZXJ2aWNlVHlwZSxcbiAgICAgICAgICAgICAgICBmcmFtZUluZm8sXG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICBmcmFtZVR5cGUsXG4gICAgICAgICAgICAgICAgbWFpbkJ1ZmZlcixcbiAgICAgICAgICAgICAgICBpc0VuY3J5cHRlZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuX3BhY2tldENhbGxiYWNrKGZ1bGxQYWNrZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgpOyAvLyBJbnQzMiBoYXMgOCBieXRlc1xuICAgICAgICAgICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIpO1xuICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoMCwgbWFpbkJ1ZmZlci5sZW5ndGgsIGZhbHNlKTtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKDQsIGZyYW1lQ291bnQsIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuXG4gICAgICAgICAgICBjb25zdCBmaXJzdEhlYWRlciA9IHRoaXMuX2NvbnN0cnVjdFBhY2tldCh2ZXJzaW9uLCBzZXJ2aWNlVHlwZSwgZnJhbWVJbmZvLCBzZXNzaW9uSWQsIG1lc3NhZ2VJZCwgRnJhbWVUeXBlLkZJUlNULCBwYXlsb2FkLCBpc0VuY3J5cHRlZCk7XG4gICAgICAgICAgICB0aGlzLl9wYWNrZXRDYWxsYmFjayhmaXJzdEhlYWRlcik7XG5cbiAgICAgICAgICAgIHRoaXMuX2J1aWxkQ29uc2VjdXRpdmVGcmFtZXMoXG4gICAgICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgICAgICBzZXJ2aWNlVHlwZSxcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgIG1haW5CdWZmZXIsXG4gICAgICAgICAgICAgICAgbXR1LFxuICAgICAgICAgICAgICAgIGlzRW5jcnlwdGVkXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIHNkbCBwYWNrZXQuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHZlcnNpb25cbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBmcmFtZUluZm9cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc2Vzc2lvbklkXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1lc3NhZ2VJZFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBmcmFtZVR5cGVcbiAgICAgKiBAcGFyYW0ge1VuaXQ4QXJyYXl9IHBheWxvYWRcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRW5jcnlwdGVkXG4gICAgICogQHJldHVybnMge1NkbFBhY2tldH1cbiAgICAgKi9cbiAgICBfY29uc3RydWN0UGFja2V0ICh2ZXJzaW9uLCBzZXJ2aWNlVHlwZSwgZnJhbWVJbmZvLCBzZXNzaW9uSWQsIG1lc3NhZ2VJZCwgZnJhbWVUeXBlLCBwYXlsb2FkLCBpc0VuY3J5cHRlZCkge1xuICAgICAgICBjb25zdCBkYXRhU2l6ZSA9IHBheWxvYWQubGVuZ3RoO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSAwO1xuICAgICAgICBjb25zdCBieXRlc1RvV3JpdGUgPSBkYXRhU2l6ZTtcbiAgICAgICAgY29uc3Qgc2RsUGFja2V0ID0gbmV3IFNkbFBhY2tldCh2ZXJzaW9uLCBpc0VuY3J5cHRlZCwgZnJhbWVUeXBlLCBzZXJ2aWNlVHlwZSwgZnJhbWVJbmZvLCBzZXNzaW9uSWQsIGRhdGFTaXplLCBtZXNzYWdlSWQsIHBheWxvYWQsIG9mZnNldCwgYnl0ZXNUb1dyaXRlKTtcbiAgICAgICAgcmV0dXJuIHNkbFBhY2tldDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBjb25zZWN1dGl2ZSBmcmFtZXMgYWZ0ZXIgdGhlIGluaXRhbCBmcmFtZSBpcyBzZW50IGZvciBhIG11bHRpLWZyYW1lIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHZlcnNpb25cbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSWRcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbWVzc2FnZUlkXG4gICAgICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZW5ndGhcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRW5jcnlwdGVkXG4gICAgICovXG4gICAgX2J1aWxkQ29uc2VjdXRpdmVGcmFtZXMgKHZlcnNpb24sIHNlcnZpY2VUeXBlLCBzZXNzaW9uSWQsIG1lc3NhZ2VJZCwgYnVmZmVyLCBsZW5ndGgsIGlzRW5jcnlwdGVkKSB7XG4gICAgICAgIGxldCBmcmFtZVNlcXVlbmNlTnVtYmVyO1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcblxuICAgICAgICB3aGlsZSAoZnJhbWVTZXF1ZW5jZU51bWJlciAhPT0gMCkge1xuICAgICAgICAgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZnJhbWVTZXF1ZW5jZU51bWJlciA9IDA7IC8vIGxhc3QgZnJhbWVcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJhbWVTZXF1ZW5jZU51bWJlciA9IChjb3VudCAlIDI1NSkgKyAxOyAvLyAxLDIsMywuLi4sMjU1LDFcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5fY29uc3RydWN0UGFja2V0KFxuICAgICAgICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgICAgICAgc2VydmljZVR5cGUsXG4gICAgICAgICAgICAgICAgZnJhbWVTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgIEZyYW1lVHlwZS5DT05TRUNVVElWRSxcbiAgICAgICAgICAgICAgICBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpLFxuICAgICAgICAgICAgICAgIGlzRW5jcnlwdGVkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5fcGFja2V0Q2FsbGJhY2soaGVhZGVyKTtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICBvZmZzZXQgKz0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuZXhwb3J0IHsgTWVzc2FnZUZyYW1lRGlzYXNzZW1ibGVyIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmNsYXNzIFRyYW5zcG9ydExpc3RlbmVyIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuX29uVHJhbnNwb3J0Q29ubmVjdGVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25UcmFuc3BvcnREaXNjb25uZWN0ZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbkVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25QYWNrZXRSZWNlaXZlZCA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY1xuICAgICAqIEByZXR1cm4ge1RyYW5zcG9ydExpc3RlbmVyfVxuICAgICAqL1xuICAgIHNldE9uVHJhbnNwb3J0Q29ubmVjdGVkIChmdW5jKSB7XG4gICAgICAgIHRoaXMuX29uVHJhbnNwb3J0Q29ubmVjdGVkID0gZnVuYztcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAgICogQHJldHVybiB7VHJhbnNwb3J0TGlzdGVuZXJ9XG4gICAgICovXG4gICAgc2V0T25UcmFuc3BvcnREaXNjb25uZWN0ZWQgKGZ1bmMpIHtcbiAgICAgICAgdGhpcy5fb25UcmFuc3BvcnREaXNjb25uZWN0ZWQgPSBmdW5jO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICAgKiBAcmV0dXJuIHtUcmFuc3BvcnRMaXN0ZW5lcn1cbiAgICAgKi9cbiAgICBzZXRPbkVycm9yIChmdW5jKSB7XG4gICAgICAgIHRoaXMuX29uRXJyb3IgPSBmdW5jO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICAgKiBAcmV0dXJuIHtUcmFuc3BvcnRMaXN0ZW5lcn1cbiAgICAgKi9cbiAgICBzZXRPblBhY2tldFJlY2VpdmVkIChmdW5jKSB7XG4gICAgICAgIHRoaXMuX29uUGFja2V0UmVjZWl2ZWQgPSBmdW5jO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuXG4gICAgb25UcmFuc3BvcnRDb25uZWN0ZWQgKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uVHJhbnNwb3J0Q29ubmVjdGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vblRyYW5zcG9ydENvbm5lY3RlZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25UcmFuc3BvcnREaXNjb25uZWN0ZWQgKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uVHJhbnNwb3J0RGlzY29ubmVjdGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vblRyYW5zcG9ydERpc2Nvbm5lY3RlZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25FcnJvciAoZXJyb3IgPSBudWxsKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblBhY2tldFJlY2VpdmVkIChzZGxQYWNrZXQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vblBhY2tldFJlY2VpdmVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vblBhY2tldFJlY2VpdmVkKHNkbFBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7IFRyYW5zcG9ydExpc3RlbmVyIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuY2xhc3MgVmVyc2lvbiB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChtYWpvciwgbWlub3IsIHBhdGNoKSB7XG4gICAgICAgIHRoaXMuc2V0TWFqb3IobWFqb3IpO1xuICAgICAgICB0aGlzLnNldE1pbm9yKG1pbm9yKTtcbiAgICAgICAgdGhpcy5zZXRQYXRjaChwYXRjaCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gbWFqb3JcbiAgICAqIEByZXR1cm4ge1ZlcnNpb259XG4gICAgKi9cbiAgICBzZXRNYWpvciAobWFqb3IpIHtcbiAgICAgICAgdGhpcy5fbWFqb3IgPSBwYXJzZUludChtYWpvcikgfHwgMDtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIGdldE1ham9yICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ham9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtOdW1iZXJ9IG1pbm9yXG4gICAgKiBAcmV0dXJuIHtWZXJzaW9ufVxuICAgICovXG4gICAgc2V0TWlub3IgKG1pbm9yKSB7XG4gICAgICAgIHRoaXMuX21pbm9yID0gcGFyc2VJbnQobWlub3IpIHx8IDA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBnZXRNaW5vciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW5vcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBwYXRjaFxuICAgICogQHJldHVybiB7VmVyc2lvbn1cbiAgICAqL1xuICAgIHNldFBhdGNoIChwYXRjaCkge1xuICAgICAgICB0aGlzLl9wYXRjaCA9IHBhcnNlSW50KHBhdGNoKSB8fCAwO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgZ2V0UGF0Y2ggKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGF0Y2g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gdmVyc2lvbiAtIFBhcnNlIHRoaXMgc3RyaW5nIHRvIGEgVmVyc2lvbiBvYmplY3RcbiAgICAqIEByZXR1cm4ge1ZlcnNpb259XG4gICAgKi9cbiAgICBmcm9tU3RyaW5nICh2ZXJzaW9uKSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb25zID0gdmVyc2lvbi5zcGxpdCgnLicpO1xuICAgICAgICBpZiAodmVyc2lvbnMubGVuZ3RoICE9PSAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29ycmVjdCB2ZXJzaW9uIHN0cmluZyBmb3JtYXQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldE1ham9yKHZlcnNpb25zWzBdKTtcbiAgICAgICAgdGhpcy5zZXRNaW5vcih2ZXJzaW9uc1sxXSk7XG4gICAgICAgIHRoaXMuc2V0UGF0Y2godmVyc2lvbnNbMl0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgdG9TdHJpbmcgKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5nZXRNYWpvcigpfS4ke3RoaXMuZ2V0TWlub3IoKX0uJHt0aGlzLmdldFBhdGNoKCl9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIE1ldGhvZCB0byB0ZXN0IGlmIHRoaXMgaW5zdGFuY2Ugb2YgVmVyc2lvbiBpcyBuZXdlciB0aGFuIHRoZSBzdXBwbGllZCBvbmUuXG4gICAgKiBAcGFyYW0gdmVyc2lvbiAtIHRoZSB2ZXJzaW9uIHRvIGNoZWNrIGFnYWluc3RcbiAgICAqIEByZXR1cm4ge051bWJlcn0gLSAxIGlmIHRoaXMgaW5zdGFuY2UgaXMgbmV3ZXIsIC0xIGlmIHN1cHBsaWVkIHZlcnNpb24gaXMgbmV3ZXIsIGFuZCAwIGlmIHRoZXkgYXJlIGVxdWFsXG4gICAgKi9cbiAgICBpc05ld2VyVGhhbiAodmVyc2lvbikge1xuICAgICAgICBpZiAodGhpcy5nZXRNYWpvcigpID4gdmVyc2lvbi5nZXRNYWpvcigpKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldE1ham9yKCkgPT09IHZlcnNpb24uZ2V0TWFqb3IoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0TWlub3IoKSA+IHZlcnNpb24uZ2V0TWlub3IoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldE1pbm9yKCkgPT09IHZlcnNpb24uZ2V0TWlub3IoKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFBhdGNoKCkgPiB2ZXJzaW9uLmdldFBhdGNoKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldFBhdGNoKCkgPT09IHZlcnNpb24uZ2V0UGF0Y2goKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgVmVyc2lvbiB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gU2VydmljZVR5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFNlcnZpY2VUeXBlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ09OVFJPTCAoKSB7XG4gICAgICAgIHJldHVybiBTZXJ2aWNlVHlwZS5fTUFQLkNPTlRST0w7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJQQyAoKSB7XG4gICAgICAgIHJldHVybiBTZXJ2aWNlVHlwZS5fTUFQLlJQQztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgQVVESU8gKCkge1xuICAgICAgICByZXR1cm4gU2VydmljZVR5cGUuX01BUC5BVURJTztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgVklERU8gKCkge1xuICAgICAgICByZXR1cm4gU2VydmljZVR5cGUuX01BUC5WSURFTztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgSFlCUklEICgpIHtcbiAgICAgICAgcmV0dXJuIFNlcnZpY2VUeXBlLl9NQVAuSFlCUklEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBTZXJ2aWNlVHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBTZXJ2aWNlVHlwZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gU2VydmljZVR5cGUuX2tleUZvclZhbHVlKHZhbHVlLCBTZXJ2aWNlVHlwZS5fTUFQKTtcbiAgICB9XG59XG5cblNlcnZpY2VUeXBlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnQ09OVFJPTCc6IDB4MDAsXG4gICAgJ1JQQyc6IDB4MDcsXG4gICAgJ0FVRElPJzogMHgwQSxcbiAgICAnVklERU8nOiAweDBCLFxuICAgICdIWUJSSUQnOjB4MEYsXG59KTtcblxuZXhwb3J0IHsgU2VydmljZVR5cGUgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGcmFtZVR5cGUgfSBmcm9tICcuL2VudW1zL0ZyYW1lVHlwZS5qcyc7XG5pbXBvcnQgeyBTZGxQYWNrZXQgfSBmcm9tICcuL1NkbFBhY2tldC5qcyc7XG5cbi8qKlxuICogQ2FsbGJhY2sgZm9yIGZpbmlzaGVkIHBhY2tldC5cbiAqIEBjYWxsYmFjayBjYlxuICogQHBhcmFtIHtzdHJpbmd9IGVycm9yIC0gSWYgdGhlcmUgaXMgYW4gZXJyb3IgdGhhdCBjYW5ub3QgYmUgcmVjb3ZlcmVkIGZyb20gaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSB7U2RsUGFja2V0fSBzZGxQYWNrZXQgLSBGaW5pc2hlZCBzZGwgcGFja2V0LlxuICovXG5cbi8qKlxuICogQXNzZW1ibGVzIHNkbCBwYWNrZXRzIHdoaWNoIG1heSBjb21lIGluIHNlcGVyYXRlIGNodW5rcyBpZiB0aGUgZGF0YSBleGNlZWRzIHRoZVxuICogbWF4IHRyYW5zcG9ydCB1bml0IGFsbG93ZWQgYnkgc2RsIGNvcmUuXG4gKlxuICogQHByaXZhdGUge2NifSBfY2FsbGJhY2sgLSBDYWxsYmFjayBmb3IgY29tYmluZWQgcGFja2V0LlxuICogQHByaXZhdGUge251bWJlcn0gX3RvdGFsQ29uc2VjdXRpdmVGcmFtZXMgLSBUb3RhbCBjb25zZWN1dGl2ZSBmcmFtZXMgZXhwZWN0ZWQgZm9yIGEgbXVsdGlmcmFtZSBwYWNrZXQuXG4gKiBAcHJpdmF0ZSB7bnVtYmVyfSBfY29uc2VjdXRpdmVGcmFtZXNEYXRhTGVuZ3RoIC0gRXhwZWN0ZWQgZGF0YSBsZW5ndGggb2YgZmluaXNoZWQgbXVsdGlmcmFtZSBwYWNrZXQuXG4gKiBAcHJpdmF0ZSB7bnVtYmVyfSBfY29uc2VjdXRpdmVGcmFtZXNIYW5kbGVkQ291bnQgLSBSdW5uaW5nIHRvdGFsIG9mIGNvbnNlY3V0aXZlIGZyYW1lcyByZWNlaXZlZCBhbmQgaGFuZGxlZC5cbiAqIEBwcml2YXRlIHthcnJheX0gX2FjY3VtdWxhdG9yIENvbWJpbmVzIGluY29taW5nIGJ5dGVzIGZyb20gY29uc2VjdXRpdmUgZnJhbWVzLlxuICovXG5jbGFzcyBNZXNzYWdlRnJhbWVBc3NlbWJsZXIge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKiBAcGFyYW0ge2NifSBjYWxsYmFja1xuICAgICovXG4gICAgY29uc3RydWN0b3IgKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FsbGJhY2sgbm90IG9mIGV4cGVjdGVkIHR5cGUgKGZ1bmN0aW9uKSBmb3IgTWVzc2FnZUZyYW1lQXNzZW1ibGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICAgIHRoaXMuX2FjY3VtdWxhdG9yID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsQ29uc2VjdXRpdmVGcmFtZXMgPSAwO1xuICAgICAgICB0aGlzLl9jb25zZWN1dGl2ZUZyYW1lc0hhbmRsZWRDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuX2NvbnNlY3V0aXZlRnJhbWVzRGF0YUxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWNjZXB0cyBhIHNpbmdsZSBmcmFtZSBvciBtdWx0aWZyYW1lIHBhY2tldC4gVGhlIGNhbGxiYWNrIGlzIHVzZWQgd2hlbiB0aGUgcGFja2V0XG4gICAgICogaXMgY29tcGxldGVseSByZWFkLiBGb3IgYSBzaW5nbGUgZnJhbWUgdGhpcyBpcyBpbW1lZGlhdGVseS4gRm9yIGEgbXVsdGkgZnJhbWUgcGFja2V0XG4gICAgICogQHBhcmFtIHtTZGxQYWNrZXR9IHNkbFBhY2tldCAtIEluY29taW5nIHNkbCBwYWNrZXQgdG8gYmUgcmVhZC5cbiAgICAqL1xuICAgIGhhbmRsZUZyYW1lIChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc3QgZnJhbWVUeXBlID0gc2RsUGFja2V0LmdldEZyYW1lVHlwZSgpO1xuICAgICAgICAvLyBJZiB0aGUgc2RsIHBhY2tldCBpcyBhIHNpbmdsZSBmcmFtZSBub3RoaW5nIG5lZWRzIHRvIGJlIGFzc2VtYmxlZCBhbmQgdGhpcyBjYW4gYmUgcmV0dXJuZWQgaW1tZWRpYXRlbHkuXG4gICAgICAgIGlmIChmcmFtZVR5cGUgIT09IEZyYW1lVHlwZS5GSVJTVCAmJiBmcmFtZVR5cGUgIT09IEZyYW1lVHlwZS5DT05TRUNVVElWRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxiYWNrKG51bGwsIHNkbFBhY2tldCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZU11bHRpRnJhbWVNZXNzYWdlKHNkbFBhY2tldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB0aGUgZmlyc3QgZGF0YSBmcmFtZS4gU2V0cyB0aGUgZXhwZWN0ZWQgZnJhbWUgY291bnQgYW5kIGRhdGEgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7U2RsUGFja2V0fSBzZGxQYWNrZXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9oYW5kbGVGaXJzdERhdGFGcmFtZSAoc2RsUGFja2V0KSB7XG4gICAgICAgIC8qKiBAdHlwZSB7YXJyYXl9IEFycmF5IG9mIHVpbnQ4ICovXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBzZGxQYWNrZXQuZ2V0UGF5bG9hZCgpO1xuXG4gICAgICAgIGlmIChwYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSAhPT0gdHJ1ZSB8fCBwYXlsb2FkLmxlbmd0aCAhPT0gOCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciBoYW5kbGluZyBmaXJzdCBmcmFtZS4gUGF5bG9hZCBpcyBhbiBpbnZhbGlkIGxlbmd0aCBzaG91bGQgYmUgbGVuZ3RoIDguJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBieXRlIGluIHBheWxvYWQpIHtcbiAgICAgICAgICAgIGlmIChieXRlIDwgMHgwMCB8fCBieXRlID4gMHhGRikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXlsb2FkLiBNdXN0IGJlIGFuIGFycmF5IG9mIHVpbnQ4IGJ5dGVzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlyc3QgNCA4LWJpdCBpbnRlZ2VycyBjb250YWluIHRoZSBkYXRhIGxlbmd0aC5cbiAgICAgICAgbGV0IGRhdGFMZW5ndGggPSAocGF5bG9hZFswXSAmIDB4MEYpIDw8IDI0OyAvLyA4LWJpdCB4IDNcbiAgICAgICAgZGF0YUxlbmd0aCArPSAocGF5bG9hZFsxXSAmIDB4RkYpIDw8IDE2OyAvLyA4IHggMlxuICAgICAgICBkYXRhTGVuZ3RoICs9IChwYXlsb2FkWzJdICYgMHhGRikgPDwgODsgLy8gOCB4IDFcbiAgICAgICAgZGF0YUxlbmd0aCArPSBwYXlsb2FkWzNdICYgMHhGRjsgLy8gOCB4IDBcblxuICAgICAgICBsZXQgZnJhbWVDb3VudCA9IChwYXlsb2FkWzRdICYgMHhGRikgPDwgMjQ7XG4gICAgICAgIGZyYW1lQ291bnQgKz0gKHBheWxvYWRbNV0gJiAweEZGKSA8PCAxNjtcbiAgICAgICAgZnJhbWVDb3VudCArPSAocGF5bG9hZFs2XSAmIDB4RkYpIDw8IDg7XG4gICAgICAgIGZyYW1lQ291bnQgKz0gcGF5bG9hZFs3XSAmIDB4RkY7XG5cbiAgICAgICAgdGhpcy5fdG90YWxDb25zZWN1dGl2ZUZyYW1lcyA9IGZyYW1lQ291bnQ7XG4gICAgICAgIHRoaXMuX2NvbnNlY3V0aXZlRnJhbWVzRGF0YUxlbmd0aCA9IGRhdGFMZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlyc3QgZnJhbWUgc2hvdWxkIGJlIHJlYWQgaW4gYmVmb3JlIHRoaXMgaXMgY2FsbGVkLiBPbmNlIHRoZSBsYXN0XG4gICAgICogZnJhbWUgaXMgcmVhZCwgY2FsbGJhY2sgaXMgdXNlZC5cbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgX2hhbmRsZUNvbnNlY3V0aXZlRnJhbWUgKHNkbFBhY2tldCkge1xuICAgICAgICB0aGlzLl9jb25zZWN1dGl2ZUZyYW1lc0hhbmRsZWRDb3VudCsrO1xuXG4gICAgICAgIGNvbnN0IGZyYW1lVHlwZSA9IHNkbFBhY2tldC5nZXRGcmFtZVR5cGUoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGZyYW1lU2VxdWVuY2UgbnRoIGZyYW1lLCBvciAwIGZvciBsYXN0IGZyYW1lLFxuICAgICAgICAgKiA4IGJpdHMgYXJlIHVzZWQgdG8gc3RvcmUgdGhpcyBpbmZvIHNvIHRoZSBjb3VudCByZXZlcnRzIHRvIDEgYWZ0ZXIgMjU1XG4gICAgICAgICAqIFRoaXMgZG9lc24ndCBhZmZlY3QgcmVhZGluZyB0aGUgcGFja2V0IGJ1dCBpdCBpcyBub3RhYmxlIGlmIGZyYW1lIHNlcXVlbmNlIGlzIHJlbGllZCBvbi5cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGZyYW1lU2VxdWVuY2UgPSBzZGxQYWNrZXQuZ2V0RnJhbWVJbmZvKCk7XG5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHNkbFBhY2tldC5nZXRQYXlsb2FkKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBieXRlIG9mIHBheWxvYWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjY3VtdWxhdG9yLnB1c2goYnl0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IGZyYW1lLCBmaW5pc2ggdGhpbmdzIHVwIGFuZCB1c2UgY2FsbGJhY2suXG4gICAgICAgIGlmIChmcmFtZVNlcXVlbmNlID09PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY29uc2VjdXRpdmVGcmFtZXNIYW5kbGVkQ291bnQgIT09IHRoaXMuX3RvdGFsQ29uc2VjdXRpdmVGcmFtZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFRvdGFsIGZyYW1lcyBleHBlY3RlZCAke3RoaXMuX3RvdGFsQ29uc2VjdXRpdmVGcmFtZXN9IGRvZXMgbm90IG1hdGNoIHRvdGFsIGZyYW1lcyByZWNlaXZlZCAke3RoaXMuX2NvbnNlY3V0aXZlRnJhbWVzSGFuZGxlZENvdW50fWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fY29uc2VjdXRpdmVGcmFtZXNEYXRhTGVuZ3RoICE9PSB0aGlzLl9hY2N1bXVsYXRvci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFRvdGFsIGRhdGEgZXhwZWN0ZWQgJHt0aGlzLl9jb25zZWN1dGl2ZUZyYW1lc0RhdGFMZW5ndGh9IGRvZXMgbm90IG1hdGNoIHRvdGFsIGRhdGEgcmVjZWl2ZWQgJHt0aGlzLl9hY2N1bXVsYXRvci5sZW5ndGh9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbmlzaGVkU2RsUGFja2V0ID0gbmV3IFNkbFBhY2tldChcbiAgICAgICAgICAgICAgICBzZGxQYWNrZXQuZ2V0VmVyc2lvbigpLFxuICAgICAgICAgICAgICAgIHNkbFBhY2tldC5nZXRFbmNyeXB0aW9uKCksXG4gICAgICAgICAgICAgICAgZnJhbWVUeXBlLFxuICAgICAgICAgICAgICAgIHNkbFBhY2tldC5nZXRTZXJ2aWNlVHlwZSgpLFxuICAgICAgICAgICAgICAgIGZyYW1lU2VxdWVuY2UsXG4gICAgICAgICAgICAgICAgc2RsUGFja2V0LmdldFNlc3Npb25JRCgpLFxuICAgICAgICAgICAgICAgIHRoaXMuX2FjY3VtdWxhdG9yLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBzZGxQYWNrZXQuZ2V0TWVzc2FnZUlEKCksXG4gICAgICAgICAgICAgICAgdGhpcy5fYWNjdW11bGF0b3IsXG4gICAgICAgICAgICAgICAgMCwgLy8gbm8gb2Zmc2V0XG4gICAgICAgICAgICAgICAgdGhpcy5fYWNjdW11bGF0b3IubGVuZ3RoIC8vIHJlYWQgdGhlIGVudGlyZSBidWZmZXJcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrKG51bGwsIGZpbmlzaGVkU2RsUGFja2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0aGUgc2RsIHBhY2tldCBiYXNlZCBvbiBpdHMgZnJhbWUgdHlwZSwgRklSU1Qgb3IgQ09OU0VDVVRJVkUuXG4gICAgICogQ2FsbGJhY2sgaXMgdXNlZCB3aGVuIGZpbmFsIHBhY2tldCBpcyByZWFkLlxuICAgICAqIEBwYXJhbSB7U2RsUGFja2V0fSBzZGxQYWNrZXQgLSBTZGwgcGFja2V0IHRvIGJlIHJlYWQuXG4gICAgICovXG4gICAgX2hhbmRsZU11bHRpRnJhbWVNZXNzYWdlIChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc3QgZnJhbWVUeXBlID0gc2RsUGFja2V0LmdldEZyYW1lVHlwZSgpO1xuICAgICAgICBpZiAoZnJhbWVUeXBlID09PSBGcmFtZVR5cGUuRklSU1QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaXJzdERhdGFGcmFtZShzZGxQYWNrZXQpO1xuICAgICAgICB9IGVsc2UgeyAvLyBGcmFtZVR5cGUuQ29uc2VjdXRpdmVcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVDb25zZWN1dGl2ZUZyYW1lKHNkbFBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG5leHBvcnQgeyBNZXNzYWdlRnJhbWVBc3NlbWJsZXIgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuY2xhc3MgQ29udHJvbEZyYW1lVGFncyB7XG59XG5cbi8vIGhpZGRlbiBpbm5lciBvYmplY3RzXG5cbmNvbnN0IFN0YXJ0U2VydmljZUFDS0Jhc2UgPSB7XG4gICAgTVRVOiAnbXR1Jyxcbn07XG5cbmNvbnN0IE5BS0Jhc2UgPSB7XG4gICAgUkVKRUNURURfUEFSQU1TOiAncmVqZWN0ZWRQYXJhbXMnLFxufTtcblxuY29uc3QgU3RhcnRTZXJ2aWNlUHJvdG9jb2xWZXJzaW9uID0ge1xuICAgIC8qKiBUaGUgbmVnb3RpYXRlZCB2ZXJzaW9uIG9mIHRoZSBwcm90b2NvbC4gTXVzdCBiZSBpbiB0aGUgZm9ybWF0IFwiTWFqb3IuTWlub3IuUGF0Y2hcIiovXG4gICAgUFJPVE9DT0xfVkVSU0lPTjogJ3Byb3RvY29sVmVyc2lvbicsXG59O1xuXG5jb25zdCBTdGFydFNlcnZpY2VIYXNoSWQgPSB7XG4gICAgLyoqIEhhc2ggSUQgdG8gaWRlbnRpZnkgdGhpcyBzZXJ2aWNlIGFuZCB1c2VkIHdoZW4gc2VuZGluZyBhbiBFbmRTZXJ2aWNlIGNvbnRyb2wgZnJhbWUqL1xuICAgIEhBU0hfSUQ6ICdoYXNoSWQnLFxufTtcblxuY29uc3QgU3RhcnRTZXJ2aWNlRGltZW5zaW9ucyA9IHtcbiAgICBIRUlHSFQ6ICdoZWlnaHQnLFxuICAgIFdJRFRIOiAnd2lkdGgnLFxufTtcblxuLy8gc3RhdGljIG1lbWJlcnNcblxuQ29udHJvbEZyYW1lVGFncy5SUEMgPSBPYmplY3QuZnJlZXplKHtcbiAgICBTdGFydFNlcnZpY2U6IFN0YXJ0U2VydmljZVByb3RvY29sVmVyc2lvbixcblxuICAgIFN0YXJ0U2VydmljZUFDSzogT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIC8qKiBIVSBhbGxvd2VkIHRyYW5zcG9ydCBmb3Igc2Vjb25kYXJ5IGNvbm5lY3Rpb24gKi9cbiAgICAgICAgU0VDT05EQVJZX1RSQU5TUE9SVFM6ICdzZWNvbmRhcnlUcmFuc3BvcnRzJyxcbiAgICAgICAgLyoqIEhVIGFsbG93ZWQgdHJhbnNwb3J0cyBmb3IgYXVkaW8gYW5kIHZpZGVvIHNlcnZpY2VzICgxID09IFByaW1hcnksIDIgPT0gU2Vjb25kYXJ5KSAqL1xuICAgICAgICBBVURJT19TRVJWSUNFX1RSQU5TUE9SVFM6ICdhdWRpb1NlcnZpY2VUcmFuc3BvcnRzJyxcbiAgICAgICAgVklERU9fU0VSVklDRV9UUkFOU1BPUlRTOiAndmlkZW9TZXJ2aWNlVHJhbnNwb3J0cycsXG4gICAgICAgIC8qKiBBdXRoIHRva2VuIHRvIGJlIHVzZWQgZm9yIGxvZyBpbiBpbnRvIHNlcnZpY2VzICoqL1xuICAgICAgICBBVVRIX1RPS0VOOiAnYXV0aFRva2VuJyxcbiAgICB9LCBTdGFydFNlcnZpY2VBQ0tCYXNlLCBTdGFydFNlcnZpY2VQcm90b2NvbFZlcnNpb24sIFN0YXJ0U2VydmljZUhhc2hJZCksXG5cbiAgICBTdGFydFNlcnZpY2VOQUs6IE5BS0Jhc2UsXG5cbiAgICBFbmRTZXJ2aWNlOiBTdGFydFNlcnZpY2VIYXNoSWQsXG5cbiAgICBFbmRTZXJ2aWNlQUNLOiB7fSxcblxuICAgIEVuZFNlcnZpY2VOQUs6IE5BS0Jhc2UsXG5cbiAgICBUcmFuc3BvcnRFdmVudFVwZGF0ZToge1xuICAgICAgICBUQ1BfSVBfQUREUkVTUzogJ3RjcElwQWRkcmVzcycsXG4gICAgICAgIFRDUF9QT1JUOiAndGNwUG9ydCcsXG4gICAgfSxcblxuICAgIFJlZ2lzdGVyU2Vjb25kYXJ5VHJhbnNwb3J0OiB7fSxcblxuICAgIFJlZ2lzdGVyU2Vjb25kYXJ5VHJhbnNwb3J0QUNLOiB7fSxcblxuICAgIFJlZ2lzdGVyU2Vjb25kYXJ5VHJhbnNwb3J0TkFLOiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgUkVBU09OOiAncmVhc29uJyxcbiAgICB9LCBOQUtCYXNlKSxcbn0pO1xuXG5Db250cm9sRnJhbWVUYWdzLkF1ZGlvID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgU3RhcnRTZXJ2aWNlOiB7fSxcblxuICAgIFN0YXJ0U2VydmljZUFDSzogU3RhcnRTZXJ2aWNlQUNLQmFzZSxcblxuICAgIFN0YXJ0U2VydmljZU5BSzogTkFLQmFzZSxcblxuICAgIEVuZFNlcnZpY2U6IHt9LFxuXG4gICAgRW5kU2VydmljZUFDSzoge30sXG5cbiAgICBFbmRTZXJ2aWNlTkFLOiBOQUtCYXNlLFxufSk7XG5cbkNvbnRyb2xGcmFtZVRhZ3MuVmlkZW8gPSBPYmplY3QuZnJlZXplKHtcbiAgICBTdGFydFNlcnZpY2U6IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBWSURFT19QUk9UT0NPTDogJ3ZpZGVvUHJvdG9jb2wnLFxuICAgICAgICBWSURFT19DT0RFQzogJ3ZpZGVvQ29kZWMnLFxuICAgIH0sIFN0YXJ0U2VydmljZURpbWVuc2lvbnMpLFxuXG4gICAgU3RhcnRTZXJ2aWNlQUNLOiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgVklERU9fUFJPVE9DT0w6ICd2aWRlb1Byb3RvY29sJyxcbiAgICAgICAgVklERU9fQ09ERUM6ICd2aWRlb0NvZGVjJyxcbiAgICB9LCBTdGFydFNlcnZpY2VBQ0tCYXNlLCBTdGFydFNlcnZpY2VEaW1lbnNpb25zKSxcblxuICAgIFN0YXJ0U2VydmljZU5BSzogTkFLQmFzZSxcblxuICAgIEVuZFNlcnZpY2U6IHt9LFxuXG4gICAgRW5kU2VydmljZUFDSzoge30sXG5cbiAgICBFbmRTZXJ2aWNlTkFLOiBOQUtCYXNlLFxufSk7XG5cbmV4cG9ydCB7IENvbnRyb2xGcmFtZVRhZ3MgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuY2xhc3MgQml0Q29udmVydGVyIHtcbiAgICAvKipcblx0ICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYnVmZmVyIC0gYnVmZmVyIHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gaW50XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCAtIGludCBvcHRpb25hbCwgdGhlIG9mZnNldCBzaGlmdFxuXHQgKiBAcmV0dXJuIHtOdW1iZXJ9IGludCBjb252ZXJ0ZWQgZnJvbSBidWZmZXIgb3IgLTEgaWYgYnVmZmVyIGlzIG51bGxcblx0ICovXG4gICAgc3RhdGljIGFycmF5QnVmZmVyVG9JbnQzMiAoYnVmZmVyLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGlmICghYnVmZmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIpO1xuICAgICAgICByZXR1cm4gdmlldy5nZXRVaW50MzIob2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvKipcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlIC0gdGhlIGludGVnZXIgdG8gYmUgY29udmVydGVkXG5cdCAqIEByZXR1cm4ge0FycmF5QnVmZmVyfSBidWZmZXIgY29udmVydGVkIGZyb20gaW5wdXQgdmFsdWVcblx0ICovXG4gICAgc3RhdGljIGludDMyVG9BcnJheUJ1ZmZlciAodmFsdWUpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDQpOyAvLyBJbnQzMiBoYXMgNCBieXRlc1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XG4gICAgICAgIHZpZXcuc2V0VWludDMyKDAsIHZhbHVlLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfVxufVxuXG5leHBvcnQgeyBCaXRDb252ZXJ0ZXIgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgU2RsUGFja2V0IH0gZnJvbSAnLi9TZGxQYWNrZXQuanMnO1xuaW1wb3J0IHsgQ29udHJvbEZyYW1lVGFncyB9IGZyb20gJy4vZW51bXMvQ29udHJvbEZyYW1lVGFncy5qcyc7XG5pbXBvcnQgeyBCaXRDb252ZXJ0ZXIgfSBmcm9tICcuLy4uL3V0aWwvQml0Q29udmVydGVyLmpzJztcbmltcG9ydCB7IEZyYW1lVHlwZSB9IGZyb20gJy4vZW51bXMvRnJhbWVUeXBlLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGNvbnRyb2wgcGFja2V0cy5cbiAqIEZvciByZWd1bGFyIFJQQyBSUENNZXNzYWdlIHNob3VsZCBiZSB1c2VkLlxuICovXG5jbGFzcyBTZGxQYWNrZXRGYWN0b3J5IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgaGVhcnRiZWF0IGFja25vd2xlZ2VtZW50IHBhY2tldC5cbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSURcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdmVyc2lvblxuICAgICAqIEByZXR1cm5zIHtTZGxQYWNrZXR9XG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZUhlYXJ0YmVhdEFDSyAoc2VydmljZVR5cGUsIHNlc3Npb25JRCwgdmVyc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNkbFBhY2tldCh2ZXJzaW9uLCBmYWxzZSwgRnJhbWVUeXBlLkNPTlRST0wsXG4gICAgICAgICAgICBzZXJ2aWNlVHlwZSwgU2RsUGFja2V0LkZSQU1FX0lORk9fSEVBUlRfQkVBVF9BQ0ssIHNlc3Npb25JRCxcbiAgICAgICAgICAgIDAsIDAsIG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gZW5kIHNlc3Npb24gcGFja2V0LlxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNlc3Npb25JRFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtZXNzYWdlSURcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdmVyc2lvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoYXNoSURcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlRW5kU2Vzc2lvbiAoc2VydmljZVR5cGUsIHNlc3Npb25JRCwgbWVzc2FnZUlELCB2ZXJzaW9uLCBoYXNoSUQpIHtcbiAgICAgICAgaWYgKHZlcnNpb24gPCA1KSB7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gbmV3IFVpbnQ4QXJyYXkoQml0Q29udmVydGVyLmludDMyVG9BcnJheUJ1ZmZlcihoYXNoSUQpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2RsUGFja2V0KHZlcnNpb24sIGZhbHNlLCBGcmFtZVR5cGUuQ09OVFJPTCxcbiAgICAgICAgICAgICAgICBzZXJ2aWNlVHlwZSwgU2RsUGFja2V0LkZSQU1FX0lORk9fRU5EX1NFUlZJQ0UsIHNlc3Npb25JRCxcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmxlbmd0aCwgbWVzc2FnZUlELCBwYXlsb2FkLCAwLCBwYXlsb2FkLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbmRTZXNzaW9uID0gbmV3IFNkbFBhY2tldCh2ZXJzaW9uLCBmYWxzZSwgRnJhbWVUeXBlLkNPTlRST0wsXG4gICAgICAgICAgICAgICAgc2VydmljZVR5cGUsIFNkbFBhY2tldC5GUkFNRV9JTkZPX0VORF9TRVJWSUNFLCBzZXNzaW9uSUQsXG4gICAgICAgICAgICAgICAgMCwgbWVzc2FnZUlELCBudWxsKTtcbiAgICAgICAgICAgIGVuZFNlc3Npb24ucHV0VGFnKENvbnRyb2xGcmFtZVRhZ3MuUlBDLkVuZFNlcnZpY2UuSEFTSF9JRCwgaGFzaElEKTtcbiAgICAgICAgICAgIHJldHVybiBlbmRTZXNzaW9uO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBTZGxQYWNrZXRGYWN0b3J5IH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBJbWFnZVR5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIEltYWdlVHlwZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU1RBVElDICgpIHtcbiAgICAgICAgcmV0dXJuIEltYWdlVHlwZS5fTUFQLlNUQVRJQztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBEWU5BTUlDICgpIHtcbiAgICAgICAgcmV0dXJuIEltYWdlVHlwZS5fTUFQLkRZTkFNSUM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEltYWdlVHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBJbWFnZVR5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEltYWdlVHlwZS5fa2V5Rm9yVmFsdWUodmFsdWUsIEltYWdlVHlwZS5fTUFQKTtcbiAgICB9XG59XG5cbkltYWdlVHlwZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ1NUQVRJQyc6ICdTVEFUSUMnLFxuICAgICdEWU5BTUlDJzogJ0RZTkFNSUMnLFxufSk7XG5cbmV4cG9ydCB7IEltYWdlVHlwZSB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgSW1hZ2VUeXBlIH0gZnJvbSAnLi4vZW51bXMvSW1hZ2VUeXBlLmpzJztcblxuY2xhc3MgSW1hZ2UgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICAgICogQHJldHVybiB7SW1hZ2V9XG4gICAgKi9cbiAgICBzZXRWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSW1hZ2UuS0VZX1ZBTFVFLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0VmFsdWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoSW1hZ2UuS0VZX1ZBTFVFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7SW1hZ2VUeXBlfSB0eXBlXG4gICAgKiBAcmV0dXJuIHtJbWFnZX1cbiAgICAqL1xuICAgIHNldEltYWdlVHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShJbWFnZVR5cGUsIHR5cGUpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEltYWdlLktFWV9JTUFHRV9UWVBFLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtJbWFnZVR5cGV9XG4gICAgKi9cbiAgICBnZXRJbWFnZVR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSW1hZ2VUeXBlLCBJbWFnZS5LRVlfSU1BR0VfVFlQRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzVGVtcGxhdGVcbiAgICAqIEByZXR1cm4ge0ltYWdlfVxuICAgICovXG4gICAgc2V0SXNUZW1wbGF0ZSAoaXNUZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihJbWFnZS5LRVlfSVNfVEVNUExBVEUsIGlzVGVtcGxhdGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgKi9cbiAgICBnZXRJc1RlbXBsYXRlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEltYWdlLktFWV9JU19URU1QTEFURSk7XG4gICAgfVxufVxuXG5JbWFnZS5LRVlfVkFMVUUgPSAndmFsdWUnO1xuSW1hZ2UuS0VZX0lNQUdFX1RZUEUgPSAnaW1hZ2VUeXBlJztcbkltYWdlLktFWV9JU19URU1QTEFURSA9ICdpc1RlbXBsYXRlJztcblxuZXhwb3J0IHsgSW1hZ2UgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG5jbGFzcyBNZW51UGFyYW1zIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gaWRcbiAgICAqIEByZXR1cm4ge01lbnVQYXJhbXN9XG4gICAgKi9cbiAgICBzZXRQYXJlbnRJRCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTWVudVBhcmFtcy5LRVlfUEFSRU5UX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgZ2V0UGFyZW50SUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoTWVudVBhcmFtcy5LRVlfUEFSRU5UX0lEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBwb3NpdGlvblxuICAgICogQHJldHVybiB7TWVudVBhcmFtc31cbiAgICAqL1xuICAgIHNldFBvc2l0aW9uIChwb3NpdGlvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihNZW51UGFyYW1zLktFWV9QT1NJVElPTiwgcG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIGdldFBvc2l0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE1lbnVQYXJhbXMuS0VZX1BPU0lUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZW51TmFtZVxuICAgICogQHJldHVybiB7TWVudVBhcmFtc31cbiAgICAqL1xuICAgIHNldE1lbnVOYW1lIChtZW51TmFtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihNZW51UGFyYW1zLktFWV9NRU5VX05BTUUsIG1lbnVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1N0cmluZ31cbiAgICAqL1xuICAgIGdldE1lbnVOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE1lbnVQYXJhbXMuS0VZX01FTlVfTkFNRSk7XG4gICAgfVxufVxuXG5NZW51UGFyYW1zLktFWV9QQVJFTlRfSUQgPSAncGFyZW50SUQnO1xuTWVudVBhcmFtcy5LRVlfUE9TSVRJT04gID0gJ3Bvc2l0aW9uJztcbk1lbnVQYXJhbXMuS0VZX01FTlVfTkFNRSA9ICdtZW51TmFtZSc7XG5cbmV4cG9ydCB7IE1lbnVQYXJhbXMgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJy4uL3N0cnVjdHMvSW1hZ2UuanMnO1xuaW1wb3J0IHsgTWVudVBhcmFtcyB9IGZyb20gJy4uL3N0cnVjdHMvTWVudVBhcmFtcy5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbmNsYXNzIEFkZENvbW1hbmQgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5BZGRDb21tYW5kKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtOdW1iZXJ9IGlkXG4gICAgKiBAcmV0dXJuIHtBZGRDb21tYW5kfVxuICAgICovXG4gICAgc2V0Q21kSUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFkZENvbW1hbmQuS0VZX0NNRF9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIGdldENtZElEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEFkZENvbW1hbmQuS0VZX0NNRF9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge01lbnVQYXJhbXN9IG1lbnVQYXJhbXNcbiAgICAqIEByZXR1cm4ge0FkZENvbW1hbmR9XG4gICAgKi9cbiAgICBzZXRNZW51UGFyYW1zIChtZW51UGFyYW1zKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKE1lbnVQYXJhbXMsIG1lbnVQYXJhbXMpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFkZENvbW1hbmQuS0VZX01FTlVfUEFSQU1TLCBtZW51UGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtNZW51UGFyYW1zfVxuICAgICovXG4gICAgZ2V0TWVudVBhcmFtcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNZW51UGFyYW1zLCBBZGRDb21tYW5kLktFWV9NRU5VX1BBUkFNUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0FycmF5PFN0cmluZz59IHZyQ29tbWFuZHNcbiAgICAqIEByZXR1cm4ge0FkZENvbW1hbmR9XG4gICAgKi9cbiAgICBzZXRWckNvbW1hbmRzICh2ckNvbW1hbmRzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFkZENvbW1hbmQuS0VZX1ZSX0NPTU1BTkRTLCB2ckNvbW1hbmRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtBcnJheTxTdHJpbmc+fVxuICAgICovXG4gICAgZ2V0VnJDb21tYW5kcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihBZGRDb21tYW5kLktFWV9WUl9DT01NQU5EUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0ltYWdlfSBpY29uXG4gICAgKiBAcmV0dXJuIHtBZGRDb21tYW5kfVxuICAgICovXG4gICAgc2V0Q21kSWNvbiAoaWNvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShJbWFnZSwgaWNvbik7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQWRkQ29tbWFuZC5LRVlfQ01EX0lDT04sIGljb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0ltYWdlfVxuICAgICovXG4gICAgZ2V0Q21kSWNvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChJbWFnZSwgQWRkQ29tbWFuZC5LRVlfQ01EX0lDT04pO1xuICAgIH1cbn1cblxuQWRkQ29tbWFuZC5LRVlfQ01EX0lDT04gPSAnY21kSWNvbic7XG5BZGRDb21tYW5kLktFWV9NRU5VX1BBUkFNUyA9ICdtZW51UGFyYW1zJztcbkFkZENvbW1hbmQuS0VZX0NNRF9JRCA9ICdjbWRJRCc7XG5BZGRDb21tYW5kLktFWV9WUl9DT01NQU5EUyA9ICd2ckNvbW1hbmRzJztcblxuZXhwb3J0IHsgQWRkQ29tbWFuZCB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG5jbGFzcyBBZGRDb21tYW5kUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuQWRkQ29tbWFuZCk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBBZGRDb21tYW5kUmVzcG9uc2UgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNNZXNzYWdlIH0gZnJvbSAnLi9ScGNNZXNzYWdlLmpzJztcbmltcG9ydCB7IFJwY1R5cGUgfSBmcm9tICcuL2VudW1zL1JwY1R5cGUuanMnO1xuXG5jbGFzcyBScGNOb3RpZmljYXRpb24gZXh0ZW5kcyBScGNNZXNzYWdlIHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRSUENUeXBlKFJwY1R5cGUuTk9USUZJQ0FUSU9OKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFJwY05vdGlmaWNhdGlvbiB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gSE1JTGV2ZWxcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIEhNSUxldmVsIGV4dGVuZHMgRW51bSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEhNSV9GVUxMICgpIHtcbiAgICAgICAgcmV0dXJuIEhNSUxldmVsLl9NQVAuSE1JX0ZVTEw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgSE1JX0xJTUlURUQgKCkge1xuICAgICAgICByZXR1cm4gSE1JTGV2ZWwuX01BUC5ITUlfTElNSVRFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBITUlfQkFDS0dST1VORCAoKSB7XG4gICAgICAgIHJldHVybiBITUlMZXZlbC5fTUFQLkhNSV9CQUNLR1JPVU5EO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEhNSV9OT05FICgpIHtcbiAgICAgICAgcmV0dXJuIEhNSUxldmVsLl9NQVAuSE1JX05PTkU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEhNSUxldmVsLl92YWx1ZUZvcktleShrZXksIEhNSUxldmVsLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBITUlMZXZlbC5fa2V5Rm9yVmFsdWUodmFsdWUsIEhNSUxldmVsLl9NQVApO1xuICAgIH1cbn1cblxuSE1JTGV2ZWwuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdITUlfRlVMTCc6ICdGVUxMJyxcbiAgICAnSE1JX0xJTUlURUQnOiAnTElNSVRFRCcsXG4gICAgJ0hNSV9CQUNLR1JPVU5EJzogJ0JBQ0tHUk9VTkQnLFxuICAgICdITUlfTk9ORSc6ICdOT05FJyxcblxufSk7XG5cbmV4cG9ydCB7IEhNSUxldmVsIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBBdWRpb1N0cmVhbWluZ1N0YXRlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBBdWRpb1N0cmVhbWluZ1N0YXRlIGV4dGVuZHMgRW51bSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEFVRElCTEUgKCkge1xuICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1pbmdTdGF0ZS5fTUFQLkFVRElCTEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQVRURU5VQVRFRCAoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb1N0cmVhbWluZ1N0YXRlLl9NQVAuQVRURU5VQVRFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOT1RfQVVESUJMRSAoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb1N0cmVhbWluZ1N0YXRlLl9NQVAuTk9UX0FVRElCTEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtaW5nU3RhdGUuX3ZhbHVlRm9yS2V5KGtleSwgQXVkaW9TdHJlYW1pbmdTdGF0ZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1pbmdTdGF0ZS5fa2V5Rm9yVmFsdWUodmFsdWUsIEF1ZGlvU3RyZWFtaW5nU3RhdGUuX01BUCk7XG4gICAgfVxufVxuXG5BdWRpb1N0cmVhbWluZ1N0YXRlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnQVVESUJMRSc6ICdBVURJQkxFJyxcbiAgICAnQVRURU5VQVRFRCc6ICdBVFRFTlVBVEVEJyxcbiAgICAnTk9UX0FVRElCTEUnOiAnTk9UX0FVRElCTEUnLFxuXG59KTtcblxuZXhwb3J0IHsgQXVkaW9TdHJlYW1pbmdTdGF0ZSB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gVmlkZW9TdHJlYW1pbmdTdGF0ZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgVmlkZW9TdHJlYW1pbmdTdGF0ZSBleHRlbmRzIEVudW0ge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTVFJFQU1BQkxFICgpIHtcbiAgICAgICAgcmV0dXJuIFZpZGVvU3RyZWFtaW5nU3RhdGUuX01BUC5TVFJFQU1BQkxFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5PVF9TVFJFQU1BQkxFICgpIHtcbiAgICAgICAgcmV0dXJuIFZpZGVvU3RyZWFtaW5nU3RhdGUuX01BUC5OT1RfU1RSRUFNQUJMRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gVmlkZW9TdHJlYW1pbmdTdGF0ZS5fdmFsdWVGb3JLZXkoa2V5LCBWaWRlb1N0cmVhbWluZ1N0YXRlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBWaWRlb1N0cmVhbWluZ1N0YXRlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgVmlkZW9TdHJlYW1pbmdTdGF0ZS5fTUFQKTtcbiAgICB9XG59XG5cblZpZGVvU3RyZWFtaW5nU3RhdGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdTVFJFQU1BQkxFJzogJ1NUUkVBTUFCTEUnLFxuICAgICdOT1RfU1RSRUFNQUJMRSc6ICdOT1RfU1RSRUFNQUJMRScsXG5cbn0pO1xuXG5leHBvcnQgeyBWaWRlb1N0cmVhbWluZ1N0YXRlIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBTeXN0ZW1Db250ZXh0XG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBTeXN0ZW1Db250ZXh0IGV4dGVuZHMgRW51bSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNZU0NUWFRfTUFJTiAoKSB7XG4gICAgICAgIHJldHVybiBTeXN0ZW1Db250ZXh0Ll9NQVAuU1lTQ1RYVF9NQUlOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNZU0NUWFRfVlJTRVNTSU9OICgpIHtcbiAgICAgICAgcmV0dXJuIFN5c3RlbUNvbnRleHQuX01BUC5TWVNDVFhUX1ZSU0VTU0lPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTWVNDVFhUX01FTlUgKCkge1xuICAgICAgICByZXR1cm4gU3lzdGVtQ29udGV4dC5fTUFQLlNZU0NUWFRfTUVOVTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTWVNDVFhUX0hNSV9PQlNDVVJFRCAoKSB7XG4gICAgICAgIHJldHVybiBTeXN0ZW1Db250ZXh0Ll9NQVAuU1lTQ1RYVF9ITUlfT0JTQ1VSRUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU1lTQ1RYVF9BTEVSVCAoKSB7XG4gICAgICAgIHJldHVybiBTeXN0ZW1Db250ZXh0Ll9NQVAuU1lTQ1RYVF9BTEVSVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gU3lzdGVtQ29udGV4dC5fdmFsdWVGb3JLZXkoa2V5LCBTeXN0ZW1Db250ZXh0Ll9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBTeXN0ZW1Db250ZXh0Ll9rZXlGb3JWYWx1ZSh2YWx1ZSwgU3lzdGVtQ29udGV4dC5fTUFQKTtcbiAgICB9XG59XG5cblN5c3RlbUNvbnRleHQuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdTWVNDVFhUX01BSU4nOiAnTUFJTicsXG4gICAgJ1NZU0NUWFRfVlJTRVNTSU9OJzogJ1ZSU0VTU0lPTicsXG4gICAgJ1NZU0NUWFRfTUVOVSc6ICdNRU5VJyxcbiAgICAnU1lTQ1RYVF9ITUlfT0JTQ1VSRUQnOiAnSE1JX09CU0NVUkVEJyxcbiAgICAnU1lTQ1RYVF9BTEVSVCc6ICdBTEVSVCcsXG5cbn0pO1xuXG5leHBvcnQgeyBTeXN0ZW1Db250ZXh0IH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY05vdGlmaWNhdGlvbiB9IGZyb20gJy4uL1JwY05vdGlmaWNhdGlvbi5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBITUlMZXZlbCB9IGZyb20gJy4uL2VudW1zL0hNSUxldmVsLmpzJztcbmltcG9ydCB7IEF1ZGlvU3RyZWFtaW5nU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9BdWRpb1N0cmVhbWluZ1N0YXRlLmpzJztcbmltcG9ydCB7IFZpZGVvU3RyZWFtaW5nU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9WaWRlb1N0cmVhbWluZ1N0YXRlLmpzJztcbmltcG9ydCB7IFN5c3RlbUNvbnRleHQgfSBmcm9tICcuLi9lbnVtcy9TeXN0ZW1Db250ZXh0LmpzJztcblxuY2xhc3MgT25IbWlTdGF0dXMgZXh0ZW5kcyBScGNOb3RpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELk9uSE1JU3RhdHVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7SE1JTGV2ZWx9IGhtaUxldmVsXG4gICAgKiBAcmV0dXJuIHtPbkhtaVN0YXR1c31cbiAgICAqL1xuICAgIHNldEhNSUxldmVsIChobWlMZXZlbCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShITUlMZXZlbCwgaG1pTGV2ZWwpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uSG1pU3RhdHVzLktFWV9ITUlfTEVWRUwsIGhtaUxldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtITUlMZXZlbH1cbiAgICAqL1xuICAgIGdldEhNSUxldmVsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEhNSUxldmVsLCBPbkhtaVN0YXR1cy5LRVlfSE1JX0xFVkVMKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7QXVkaW9TdHJlYW1pbmdTdGF0ZX0gYXVkaW9TdHJlYW1pbmdTdGF0ZVxuICAgICogQHJldHVybiB7T25IbWlTdGF0dXN9XG4gICAgKi9cbiAgICBzZXRBdWRpb1N0cmVhbWluZ1N0YXRlIChhdWRpb1N0cmVhbWluZ1N0YXRlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEF1ZGlvU3RyZWFtaW5nU3RhdGUsIGF1ZGlvU3RyZWFtaW5nU3RhdGUpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uSG1pU3RhdHVzLktFWV9BVURJT19TVFJFQU1JTkdfU1RBVEUsIGF1ZGlvU3RyZWFtaW5nU3RhdGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0F1ZGlvU3RyZWFtaW5nU3RhdGV9XG4gICAgKi9cbiAgICBnZXRBdWRpb1N0cmVhbWluZ1N0YXRlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEF1ZGlvU3RyZWFtaW5nU3RhdGUsIE9uSG1pU3RhdHVzLktFWV9BVURJT19TVFJFQU1JTkdfU1RBVEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTeXN0ZW1Db250ZXh0fSBzeXN0ZW1Db250ZXh0XG4gICAgKiBAcmV0dXJuIHtPbkhtaVN0YXR1c31cbiAgICAqL1xuICAgIHNldFN5c3RlbUNvbnRleHQgKHN5c3RlbUNvbnRleHQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU3lzdGVtQ29udGV4dCwgc3lzdGVtQ29udGV4dCk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25IbWlTdGF0dXMuS0VZX1NZU1RFTV9DT05URVhULCBzeXN0ZW1Db250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTeXN0ZW1Db250ZXh0fVxuICAgICovXG4gICAgZ2V0U3lzdGVtQ29udGV4dCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTeXN0ZW1Db250ZXh0LCBPbkhtaVN0YXR1cy5LRVlfU1lTVEVNX0NPTlRFWFQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtWaWRlb1N0cmVhbWluZ1N0YXRlfSB2aWRlb1N0cmVhbWluZ1N0YXRlXG4gICAgKiBAcmV0dXJuIHtPbkhtaVN0YXR1c31cbiAgICAqL1xuICAgIHNldFZpZGVvU3RyZWFtaW5nU3RhdGUgKHZpZGVvU3RyZWFtaW5nU3RhdGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmlkZW9TdHJlYW1pbmdTdGF0ZSwgdmlkZW9TdHJlYW1pbmdTdGF0ZSk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25IbWlTdGF0dXMuS0VZX1ZJREVPX1NUUkVBTUlOR19TVEFURSwgdmlkZW9TdHJlYW1pbmdTdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7VmlkZW9TdHJlYW1pbmdTdGF0ZX1cbiAgICAqL1xuICAgIGdldFZpZGVvU3RyZWFtaW5nU3RhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmlkZW9TdHJlYW1pbmdTdGF0ZSwgT25IbWlTdGF0dXMuS0VZX1ZJREVPX1NUUkVBTUlOR19TVEFURSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gd2luZG93SURcbiAgICAqIEByZXR1cm4ge1Nob3d9XG4gICAgKi9cbiAgICBzZXRXaW5kb3dJRCAod2luZG93SUQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25IbWlTdGF0dXMuS0VZX1dJTkRPV19JRCwgd2luZG93SUQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIGdldFdpbmRvd0lEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE9uSG1pU3RhdHVzLktFWV9XSU5ET1dfSUQpO1xuICAgIH1cbn1cblxuT25IbWlTdGF0dXMuS0VZX0hNSV9MRVZFTCA9ICdobWlMZXZlbCc7XG5PbkhtaVN0YXR1cy5LRVlfQVVESU9fU1RSRUFNSU5HX1NUQVRFID0gJ2F1ZGlvU3RyZWFtaW5nU3RhdGUnO1xuT25IbWlTdGF0dXMuS0VZX1NZU1RFTV9DT05URVhUID0gJ3N5c3RlbUNvbnRleHQnO1xuT25IbWlTdGF0dXMuS0VZX1ZJREVPX1NUUkVBTUlOR19TVEFURSA9ICd2aWRlb1N0cmVhbWluZ1N0YXRlJztcbk9uSG1pU3RhdHVzLktFWV9XSU5ET1dfSUQgPSAnd2luZG93SUQnO1xuXG5leHBvcnQgeyBPbkhtaVN0YXR1cyB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY05vdGlmaWNhdGlvbiB9IGZyb20gJy4uL1JwY05vdGlmaWNhdGlvbi5qcyc7XG5pbXBvcnQgeyBMYW5ndWFnZSB9IGZyb20gJy4uL2VudW1zL0xhbmd1YWdlLmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuY2xhc3MgT25MYW5ndWFnZUNoYW5nZSBleHRlbmRzIFJwY05vdGlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuT25MYW5ndWFnZUNoYW5nZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0xhbmd1YWdlfSBsYW5ndWFnZVxuICAgICogQHJldHVybiB7T25MYW5ndWFnZUNoYW5nZX1cbiAgICAqL1xuICAgIHNldExhbmd1YWdlIChsYW5ndWFnZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShMYW5ndWFnZSwgbGFuZ3VhZ2UpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uTGFuZ3VhZ2VDaGFuZ2UuS0VZX0xBTkdVQUdFLCBsYW5ndWFnZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TGFuZ3VhZ2V9XG4gICAgKi9cbiAgICBnZXRMYW5ndWFnZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChMYW5ndWFnZSwgT25MYW5ndWFnZUNoYW5nZS5LRVlfTEFOR1VBR0UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtMYW5ndWFnZX0gbGFuZ3VhZ2VcbiAgICAqIEByZXR1cm4ge09uTGFuZ3VhZ2VDaGFuZ2V9XG4gICAgKi9cbiAgICBzZXRITUlEaXNwbGF5TGFuZ3VhZ2UgKGxhbmd1YWdlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKExhbmd1YWdlLCBsYW5ndWFnZSk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25MYW5ndWFnZUNoYW5nZS5LRVlfSE1JX0RJU1BMQVlfTEFOR1VBR0UsIGxhbmd1YWdlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtMYW5ndWFnZX1cbiAgICAqL1xuICAgIGdldEhNSURpc3BsYXlMYW5ndWFnZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChMYW5ndWFnZSwgT25MYW5ndWFnZUNoYW5nZS5LRVlfSE1JX0RJU1BMQVlfTEFOR1VBR0UpO1xuICAgIH1cbn1cblxuT25MYW5ndWFnZUNoYW5nZS5LRVlfTEFOR1VBR0UgPSAnbGFuZ3VhZ2UnO1xuT25MYW5ndWFnZUNoYW5nZS5LRVlfSE1JX0RJU1BMQVlfTEFOR1VBR0UgPSAnaG1pRGlzcGxheUxhbmd1YWdlJztcblxuZXhwb3J0IHsgT25MYW5ndWFnZUNoYW5nZSB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBGaWxlVHlwZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgRmlsZVR5cGUgZXh0ZW5kcyBFbnVtIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgR1JBUEhJQ19CTVAgKCkge1xuICAgICAgICByZXR1cm4gRmlsZVR5cGUuX01BUC5HUkFQSElDX0JNUDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBHUkFQSElDX0pQRUcgKCkge1xuICAgICAgICByZXR1cm4gRmlsZVR5cGUuX01BUC5HUkFQSElDX0pQRUc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgR1JBUEhJQ19QTkcgKCkge1xuICAgICAgICByZXR1cm4gRmlsZVR5cGUuX01BUC5HUkFQSElDX1BORztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBVURJT19XQVZFICgpIHtcbiAgICAgICAgcmV0dXJuIEZpbGVUeXBlLl9NQVAuQVVESU9fV0FWRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBVURJT19BQUMgKCkge1xuICAgICAgICByZXR1cm4gRmlsZVR5cGUuX01BUC5BVURJT19BQUM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQklOQVJZICgpIHtcbiAgICAgICAgcmV0dXJuIEZpbGVUeXBlLl9NQVAuQklOQVJZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEpTT04gKCkge1xuICAgICAgICByZXR1cm4gRmlsZVR5cGUuX01BUC5KU09OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBGaWxlVHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBGaWxlVHlwZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gRmlsZVR5cGUuX2tleUZvclZhbHVlKHZhbHVlLCBGaWxlVHlwZS5fTUFQKTtcbiAgICB9XG59XG5cbkZpbGVUeXBlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnR1JBUEhJQ19CTVAnOiAnR1JBUEhJQ19CTVAnLFxuICAgICdHUkFQSElDX0pQRUcnOiAnR1JBUEhJQ19KUEVHJyxcbiAgICAnR1JBUEhJQ19QTkcnOiAnR1JBUEhJQ19QTkcnLFxuICAgICdBVURJT19XQVZFJzogJ0FVRElPX1dBVkUnLFxuICAgICdBVURJT19NUDMnOiAnQVVESU9fTVAzJyxcbiAgICAnQVVESU9fQUFDJzogJ0FVRElPX0FBQycsXG4gICAgJ0JJTkFSWSc6ICdCSU5BUlknLFxuICAgICdKU09OJzogJ0pTT04nLFxuXG59KTtcblxuZXhwb3J0IHsgRmlsZVR5cGUgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgRmlsZVR5cGUgfSBmcm9tICcuLi9lbnVtcy9GaWxlVHlwZS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbmNsYXNzIFB1dEZpbGUgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5QdXRGaWxlKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0gTm90IHBhcnQgb2YgdGhlIFJQQyBzcGVjIGl0c2VsZiAtLS0tLVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGZpbGVEYXRhXG4gICAgKiBAcmV0dXJuIHtQdXRGaWxlfVxuICAgICovXG4gICAgc2V0RmlsZURhdGEgKGZpbGVEYXRhKSB7XG4gICAgICAgIHRoaXMuc2V0QnVsa0RhdGEoZmlsZURhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtVaW50OEFycmF5fVxuICAgICovXG4gICAgZ2V0RmlsZURhdGEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWxrRGF0YSgpO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tIEVORCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlTmFtZVxuICAgICogQHJldHVybiB7UHV0RmlsZX1cbiAgICAqL1xuICAgIHNldEZpbGVOYW1lIChmaWxlTmFtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQdXRGaWxlLktFWV9GSUxFX05BTUUsIGZpbGVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBnZXRGaWxlTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihQdXRGaWxlLktFWV9GSUxFX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtGaWxlVHlwZX0gZmlsZVR5cGVcbiAgICAqIEByZXR1cm4ge1B1dEZpbGV9XG4gICAgKi9cbiAgICBzZXRGaWxlVHlwZSAoZmlsZVR5cGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoRmlsZVR5cGUsIGZpbGVUeXBlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUHV0RmlsZS5LRVlfRklMRV9UWVBFLCBmaWxlVHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7RmlsZVR5cGV9XG4gICAgKi9cbiAgICBnZXRGaWxlVHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChGaWxlVHlwZSwgUHV0RmlsZS5LRVlfTUVOVV9QQVJBTVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtCb29sZWFufSBwZXJzaXN0ZW50RmlsZVxuICAgICogQHJldHVybiB7UHV0RmlsZX1cbiAgICAqL1xuICAgIHNldFBlcnNpc3RlbnRGaWxlIChwZXJzaXN0ZW50RmlsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQdXRGaWxlLktFWV9QRVJTSVNURU5UX0ZJTEUsIHBlcnNpc3RlbnRGaWxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0UGVyc2lzdGVudEZpbGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUHV0RmlsZS5LRVlfUEVSU0lTVEVOVF9GSUxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3lzdGVtRmlsZVxuICAgICogQHJldHVybiB7UHV0RmlsZX1cbiAgICAqL1xuICAgIHNldFN5c3RlbUZpbGUgKHN5c3RlbUZpbGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUHV0RmlsZS5LRVlfU1lTVEVNX0ZJTEUsIHN5c3RlbUZpbGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgKi9cbiAgICBnZXRTeXN0ZW1GaWxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFB1dEZpbGUuS0VZX1NZU1RFTV9GSUxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXRcbiAgICAqIEByZXR1cm4ge1B1dEZpbGV9XG4gICAgKi9cbiAgICBzZXRPZmZzZXQgKG9mZnNldCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQdXRGaWxlLktFWV9PRkZTRVQsIG9mZnNldCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgZ2V0T2Zmc2V0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFB1dEZpbGUuS0VZX09GRlNFVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoXG4gICAgKiBAcmV0dXJuIHtQdXRGaWxlfVxuICAgICovXG4gICAgc2V0TGVuZ3RoIChsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUHV0RmlsZS5LRVlfTEVOR1RILCBsZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIGdldExlbmd0aCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihQdXRGaWxlLktFWV9MRU5HVEgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtOdW1iZXJ9IGNyY1xuICAgICogQHJldHVybiB7UHV0RmlsZX1cbiAgICAqL1xuICAgIHNldENSQyAoY3JjKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFB1dEZpbGUuS0VZX0NSQywgY3JjKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBnZXRDUkMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUHV0RmlsZS5LRVlfQ1JDKTtcbiAgICB9XG59XG5cblB1dEZpbGUuS0VZX0ZJTEVfTkFNRSA9ICdzeW5jRmlsZU5hbWUnO1xuUHV0RmlsZS5LRVlfRklMRV9UWVBFID0gJ2ZpbGVUeXBlJztcblB1dEZpbGUuS0VZX1BFUlNJU1RFTlRfRklMRSA9ICdwZXJzaXN0ZW50RmlsZSc7XG5QdXRGaWxlLktFWV9TWVNURU1fRklMRSA9ICdzeXN0ZW1GaWxlJztcblB1dEZpbGUuS0VZX09GRlNFVCA9ICdvZmZzZXQnO1xuUHV0RmlsZS5LRVlfTEVOR1RIID0gJ2xlbmd0aCc7XG5QdXRGaWxlLktFWV9DUkMgPSAnY3JjJztcblxuZXhwb3J0IHsgUHV0RmlsZSB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG5jbGFzcyBQdXRGaWxlUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuUHV0RmlsZSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBzcGFjZUF2YWlsYWJsZVxuICAgICogQHJldHVybiB7UHV0RmlsZVJlc3BvbnNlfVxuICAgICovXG4gICAgc2V0U3BhY2VBdmFpbGFibGUgKHNwYWNlQXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFB1dEZpbGVSZXNwb25zZS5LRVlfU1BBQ0VfQVZBSUxBQkxFLCBzcGFjZUF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgZ2V0U3BhY2VBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUHV0RmlsZVJlc3BvbnNlLktFWV9TUEFDRV9BVkFJTEFCTEUpO1xuICAgIH1cbn1cblxuUHV0RmlsZVJlc3BvbnNlLktFWV9TUEFDRV9BVkFJTEFCTEUgPSAnc3BhY2VBdmFpbGFibGUnO1xuXG5leHBvcnQgeyBQdXRGaWxlUmVzcG9uc2UgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gVGV4dEZpZWxkTmFtZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgVGV4dEZpZWxkTmFtZSBleHRlbmRzIEVudW0ge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgbWFpbkZpZWxkMSAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAubWFpbkZpZWxkMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgbWFpbkZpZWxkMiAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAubWFpbkZpZWxkMjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgbWFpbkZpZWxkMyAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAubWFpbkZpZWxkMztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgbWFpbkZpZWxkNCAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAubWFpbkZpZWxkNDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgc3RhdHVzQmFyICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC5zdGF0dXNCYXI7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgbWVkaWFDbG9jayAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAubWVkaWFDbG9jaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgbWVkaWFUcmFjayAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAubWVkaWFUcmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgdGVtcGxhdGVUaXRsZSAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAudGVtcGxhdGVUaXRsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgYWxlcnRUZXh0MSAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAuYWxlcnRUZXh0MTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgYWxlcnRUZXh0MiAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAuYWxlcnRUZXh0MjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgYWxlcnRUZXh0MyAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAuYWxlcnRUZXh0MztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgc2Nyb2xsYWJsZU1lc3NhZ2VCb2R5ICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC5zY3JvbGxhYmxlTWVzc2FnZUJvZHk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgaW5pdGlhbEludGVyYWN0aW9uVGV4dCAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAuaW5pdGlhbEludGVyYWN0aW9uVGV4dDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBuYXZpZ2F0aW9uVGV4dDEgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLm5hdmlnYXRpb25UZXh0MTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBuYXZpZ2F0aW9uVGV4dDIgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLm5hdmlnYXRpb25UZXh0MjtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBFVEEgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLkVUQTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCB0b3RhbERpc3RhbmNlICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC50b3RhbERpc3RhbmNlO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IGF1ZGlvUGFzc1RocnVEaXNwbGF5VGV4dDEgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLmF1ZGlvUGFzc1RocnVEaXNwbGF5VGV4dDE7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgYXVkaW9QYXNzVGhydURpc3BsYXlUZXh0MiAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAuYXVkaW9QYXNzVGhydURpc3BsYXlUZXh0MjtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBzbGlkZXJIZWFkZXIgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLnNsaWRlckhlYWRlcjtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBzbGlkZXJGb290ZXIgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLnNsaWRlckZvb3RlcjtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBtZW51TmFtZSAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAubWVudU5hbWU7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgc2Vjb25kYXJ5VGV4dCAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAuc2Vjb25kYXJ5VGV4dDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCB0ZXJ0aWFyeVRleHQgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLnRlcnRpYXJ5VGV4dDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBtZW51VGl0bGUgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLm1lbnVUaXRsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgbG9jYXRpb25OYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC5sb2NhdGlvbk5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IGxvY2F0aW9uRGVzY3JpcHRpb24gKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLmxvY2F0aW9uRGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IGFkZHJlc3NMaW5lcyAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAuYWRkcmVzc0xpbmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBwaG9uZU51bWJlciAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAucGhvbmVOdW1iZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX3ZhbHVlRm9yS2V5KGtleSwgVGV4dEZpZWxkTmFtZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fa2V5Rm9yVmFsdWUodmFsdWUsIFRleHRGaWVsZE5hbWUuX01BUCk7XG4gICAgfVxufVxuXG5UZXh0RmllbGROYW1lLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnbWFpbkZpZWxkMSc6ICdtYWluRmllbGQxJyxcbiAgICAnbWFpbkZpZWxkMic6ICdtYWluRmllbGQyJyxcbiAgICAnbWFpbkZpZWxkMyc6ICdtYWluRmllbGQzJyxcbiAgICAnbWFpbkZpZWxkNCc6ICdtYWluRmllbGQ0JyxcbiAgICAnc3RhdHVzQmFyJzogJ3N0YXR1c0JhcicsXG4gICAgJ21lZGlhQ2xvY2snOiAnbWVkaWFDbG9jaycsXG4gICAgJ21lZGlhVHJhY2snOiAnbWVkaWFUcmFjaycsXG4gICAgJ3RlbXBsYXRlVGl0bGUnOiAndGVtcGxhdGVUaXRsZScsXG4gICAgJ2FsZXJ0VGV4dDEnOiAnYWxlcnRUZXh0MScsXG4gICAgJ2FsZXJ0VGV4dDInOiAnYWxlcnRUZXh0MicsXG4gICAgJ2FsZXJ0VGV4dDMnOiAnYWxlcnRUZXh0MycsXG4gICAgJ3Njcm9sbGFibGVNZXNzYWdlQm9keSc6ICdzY3JvbGxhYmxlTWVzc2FnZUJvZHknLFxuICAgICdpbml0aWFsSW50ZXJhY3Rpb25UZXh0JzogJ2luaXRpYWxJbnRlcmFjdGlvblRleHQnLFxuICAgICduYXZpZ2F0aW9uVGV4dDEnOiAnbmF2aWdhdGlvblRleHQxJyxcbiAgICAnbmF2aWdhdGlvblRleHQyJzogJ25hdmlnYXRpb25UZXh0MicsXG4gICAgJ0VUQSc6ICdFVEEnLFxuICAgICd0b3RhbERpc3RhbmNlJzogJ3RvdGFsRGlzdGFuY2UnLFxuICAgICdhdWRpb1Bhc3NUaHJ1RGlzcGxheVRleHQxJzogJ2F1ZGlvUGFzc1RocnVEaXNwbGF5VGV4dDEnLFxuICAgICdhdWRpb1Bhc3NUaHJ1RGlzcGxheVRleHQyJzogJ2F1ZGlvUGFzc1RocnVEaXNwbGF5VGV4dDInLFxuICAgICdzbGlkZXJIZWFkZXInOiAnc2xpZGVySGVhZGVyJyxcbiAgICAnc2xpZGVyRm9vdGVyJzogJ3NsaWRlckZvb3RlcicsXG4gICAgJ21lbnVOYW1lJzogJ21lbnVOYW1lJyxcbiAgICAnc2Vjb25kYXJ5VGV4dCc6ICdzZWNvbmRhcnlUZXh0JyxcbiAgICAndGVydGlhcnlUZXh0JzogJ3RlcnRpYXJ5VGV4dCcsXG4gICAgJ21lbnVUaXRsZSc6ICdtZW51VGl0bGUnLFxuICAgICdsb2NhdGlvbk5hbWUnOiAnbG9jYXRpb25OYW1lJyxcbiAgICAnbG9jYXRpb25EZXNjcmlwdGlvbic6ICdsb2NhdGlvbkRlc2NyaXB0aW9uJyxcbiAgICAnYWRkcmVzc0xpbmVzJzogJ2FkZHJlc3NMaW5lcycsXG4gICAgJ3Bob25lTnVtYmVyJzogJ3Bob25lTnVtYmVyJyxcblxufSk7XG5cbmV4cG9ydCB7IFRleHRGaWVsZE5hbWUgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IENoYXJhY3RlclNldFxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgQ2hhcmFjdGVyU2V0IGV4dGVuZHMgRW51bSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBUWVBFMlNFVCAoKSB7XG4gICAgICAgIHJldHVybiBDaGFyYWN0ZXJTZXQuX01BUC5UWVBFMlNFVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgVFlQRTVTRVQgKCkge1xuICAgICAgICByZXR1cm4gQ2hhcmFjdGVyU2V0Ll9NQVAuVFlQRTVTRVQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IENJRDFTRVQgKCkge1xuICAgICAgICByZXR1cm4gQ2hhcmFjdGVyU2V0Ll9NQVAuQ0lEMVNFVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ0lEMlNFVCAoKSB7XG4gICAgICAgIHJldHVybiBDaGFyYWN0ZXJTZXQuX01BUC5DSUQyU0VUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBDaGFyYWN0ZXJTZXQuX3ZhbHVlRm9yS2V5KGtleSwgQ2hhcmFjdGVyU2V0Ll9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBDaGFyYWN0ZXJTZXQuX2tleUZvclZhbHVlKHZhbHVlLCBDaGFyYWN0ZXJTZXQuX01BUCk7XG4gICAgfVxufVxuXG5DaGFyYWN0ZXJTZXQuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdUWVBFMlNFVCc6ICdUWVBFMlNFVCcsXG4gICAgJ1RZUEU1U0VUJzogJ1RZUEU1U0VUJyxcbiAgICAnQ0lEMVNFVCc6ICdDSUQxU0VUJyxcbiAgICAnQ0lEMlNFVCc6ICdDSUQyU0VUJyxcblxufSk7XG5cbmV4cG9ydCB7IENoYXJhY3RlclNldCB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgVGV4dEZpZWxkTmFtZSB9IGZyb20gJy4uL2VudW1zL1RleHRGaWVsZE5hbWUuanMnO1xuaW1wb3J0IHsgQ2hhcmFjdGVyU2V0IH0gZnJvbSAnLi4vZW51bXMvQ2hhcmFjdGVyU2V0LmpzJztcblxuY2xhc3MgVGV4dEZpZWxkIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7VGV4dEZpZWxkTmFtZX0gdGV4dEZpZWxkTmFtZVxuICAgICogQHJldHVybiB7VGV4dEZpZWxkfVxuICAgICovXG4gICAgc2V0VGV4dEZpZWxkTmFtZSAodGV4dEZpZWxkTmFtZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShUZXh0RmllbGROYW1lLCB0ZXh0RmllbGROYW1lKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihUZXh0RmllbGQuS0VZX05BTUUsIHRleHRGaWVsZE5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1RleHRGaWVsZE5hbWV9XG4gICAgKi9cbiAgICBnZXRUZXh0RmllbGROYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRleHRGaWVsZE5hbWUsIFRleHRGaWVsZC5LRVlfTkFNRSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7Q2hhcmFjdGVyU2V0fSB0ZXh0RmllbGROYW1lXG4gICAgKiBAcmV0dXJuIHtUZXh0RmllbGR9XG4gICAgKi9cbiAgICBzZXRDaGFyYWN0ZXJTZXQgKGNoYXJhY3RlclNldCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShDaGFyYWN0ZXJTZXQsIGNoYXJhY3RlclNldCk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVGV4dEZpZWxkLktFWV9DSEFSQUNURVJfU0VULCBjaGFyYWN0ZXJTZXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0NoYXJhY3RlclNldH1cbiAgICAqL1xuICAgIGdldENoYXJhY3RlclNldCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChDaGFyYWN0ZXJTZXQsIFRleHRGaWVsZC5LRVlfQ0hBUkFDVEVSX1NFVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAgICAqIEByZXR1cm4ge1RleHRGaWVsZH1cbiAgICAqL1xuICAgIHNldFdpZHRoICh3aWR0aCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihUZXh0RmllbGQuS0VZX1dJRFRILCB3aWR0aCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgZ2V0V2lkdGggKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVGV4dEZpZWxkLktFWV9XSURUSCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gcm93c1xuICAgICogQHJldHVybiB7VGV4dEZpZWxkfVxuICAgICovXG4gICAgc2V0Um93cyAocm93cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihUZXh0RmllbGQuS0VZX1JPV1MsIHJvd3MpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIGdldFJvd3MgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVGV4dEZpZWxkLktFWV9ST1dTKTtcbiAgICB9XG59XG5cblRleHRGaWVsZC5LRVlfTkFNRSA9ICduYW1lJztcblRleHRGaWVsZC5LRVlfQ0hBUkFDVEVSX1NFVCA9ICdjaGFyYWN0ZXJTZXQnO1xuVGV4dEZpZWxkLktFWV9XSURUSCA9ICd3aWR0aCc7XG5UZXh0RmllbGQuS0VZX1JPV1MgPSAncm93cyc7XG5cbmV4cG9ydCB7IFRleHRGaWVsZCB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbmNsYXNzIEltYWdlUmVzb2x1dGlvbiBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gcmVzb2x1dGlvbldpZHRoXG4gICAgKiBAcmV0dXJuIHtJbWFnZVJlc29sdXRpb259XG4gICAgKi9cbiAgICBzZXRSZXNvbHV0aW9uV2lkdGggKHJlc29sdXRpb25XaWR0aCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihJbWFnZVJlc29sdXRpb24uS0VZX1JFU09MVVRJT05fV0lEVEgsIHJlc29sdXRpb25XaWR0aCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgZ2V0UmVzb2x1dGlvbldpZHRoICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEltYWdlUmVzb2x1dGlvbi5LRVlfUkVTT0xVVElPTl9XSURUSCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gcmVzb2x1dGlvbkhlaWdodFxuICAgICogQHJldHVybiB7SW1hZ2VSZXNvbHV0aW9ufVxuICAgICovXG4gICAgc2V0UmVzb2x1dGlvbkhlaWdodCAocmVzb2x1dGlvbkhlaWdodCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihJbWFnZVJlc29sdXRpb24uS0VZX1JFU09MVVRJT05fSEVJR0hULCByZXNvbHV0aW9uSGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBnZXRSZXNvbHV0aW9uSGVpZ2h0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEltYWdlUmVzb2x1dGlvbi5LRVlfUkVTT0xVVElPTl9IRUlHSFQpO1xuICAgIH1cbn1cblxuSW1hZ2VSZXNvbHV0aW9uLktFWV9SRVNPTFVUSU9OX1dJRFRIID0gJ3Jlc29sdXRpb25XaWR0aCc7XG5JbWFnZVJlc29sdXRpb24uS0VZX1JFU09MVVRJT05fSEVJR0hUID0gJ3Jlc29sdXRpb25IZWlnaHQnO1xuXG5leHBvcnQgeyBJbWFnZVJlc29sdXRpb24gfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gSW1hZ2VGaWVsZE5hbWVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIEltYWdlRmllbGROYW1lIGV4dGVuZHMgRW51bSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBzb2Z0QnV0dG9uSW1hZ2UgKCkge1xuICAgICAgICByZXR1cm4gSW1hZ2VGaWVsZE5hbWUuX01BUC5zb2Z0QnV0dG9uSW1hZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IGNob2ljZUltYWdlICgpIHtcbiAgICAgICAgcmV0dXJuIEltYWdlRmllbGROYW1lLl9NQVAuY2hvaWNlSW1hZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IGNob2ljZVNlY29uZGFyeUltYWdlICgpIHtcbiAgICAgICAgcmV0dXJuIEltYWdlRmllbGROYW1lLl9NQVAuY2hvaWNlU2Vjb25kYXJ5SW1hZ2U7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgdnJIZWxwSXRlbSAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZUZpZWxkTmFtZS5fTUFQLnZySGVscEl0ZW07XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgdHVybkljb24gKCkge1xuICAgICAgICByZXR1cm4gSW1hZ2VGaWVsZE5hbWUuX01BUC50dXJuSWNvbjtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBtZW51SWNvbiAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZUZpZWxkTmFtZS5fTUFQLm1lbnVJY29uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBjbWRJY29uICgpIHtcbiAgICAgICAgcmV0dXJuIEltYWdlRmllbGROYW1lLl9NQVAuY21kSWNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgYXBwSWNvbiAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZUZpZWxkTmFtZS5fTUFQLmFwcEljb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IGdyYXBoaWMgKCkge1xuICAgICAgICByZXR1cm4gSW1hZ2VGaWVsZE5hbWUuX01BUC5ncmFwaGljO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBzZWNvbmRhcnlHcmFwaGljICgpIHtcbiAgICAgICAgcmV0dXJuIEltYWdlRmllbGROYW1lLl9NQVAuc2Vjb25kYXJ5R3JhcGhpYztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgc2hvd0NvbnN0YW50VEJUSWNvbiAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZUZpZWxkTmFtZS5fTUFQLnNob3dDb25zdGFudFRCVEljb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IHNob3dDb25zdGFudFRCVE5leHRUdXJuSWNvbiAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZUZpZWxkTmFtZS5fTUFQLnNob3dDb25zdGFudFRCVE5leHRUdXJuSWNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgbG9jYXRpb25JbWFnZSAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZUZpZWxkTmFtZS5fTUFQLmxvY2F0aW9uSW1hZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IGFsZXJ0SWNvbiAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZUZpZWxkTmFtZS5fTUFQLmFsZXJ0SWNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gSW1hZ2VGaWVsZE5hbWUuX3ZhbHVlRm9yS2V5KGtleSwgSW1hZ2VGaWVsZE5hbWUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEltYWdlRmllbGROYW1lLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgSW1hZ2VGaWVsZE5hbWUuX01BUCk7XG4gICAgfVxufVxuXG5JbWFnZUZpZWxkTmFtZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ3NvZnRCdXR0b25JbWFnZSc6ICdzb2Z0QnV0dG9uSW1hZ2UnLFxuICAgICdjaG9pY2VJbWFnZSc6ICdjaG9pY2VJbWFnZScsXG4gICAgJ2Nob2ljZVNlY29uZGFyeUltYWdlJzogJ2Nob2ljZVNlY29uZGFyeUltYWdlJyxcbiAgICAndnJIZWxwSXRlbSc6ICd2ckhlbHBJdGVtJyxcbiAgICAndHVybkljb24nOiAndHVybkljb24nLFxuICAgICdtZW51SWNvbic6ICdtZW51SWNvbicsXG4gICAgJ2NtZEljb24nOiAnY21kSWNvbicsXG4gICAgJ2FwcEljb24nOiAnYXBwSWNvbicsXG4gICAgJ2dyYXBoaWMnOiAnZ3JhcGhpYycsXG4gICAgJ3NlY29uZGFyeUdyYXBoaWMnOiAnc2Vjb25kYXJ5R3JhcGhpYycsXG4gICAgJ3Nob3dDb25zdGFudFRCVEljb24nOiAnc2hvd0NvbnN0YW50VEJUSWNvbicsXG4gICAgJ3Nob3dDb25zdGFudFRCVE5leHRUdXJuSWNvbic6ICdzaG93Q29uc3RhbnRUQlROZXh0VHVybkljb24nLFxuICAgICdsb2NhdGlvbkltYWdlJzogJ2xvY2F0aW9uSW1hZ2UnLFxuICAgICdhbGVydEljb24nOiAnYWxlcnRJY29uJyxcblxufSk7XG5cbmV4cG9ydCB7IEltYWdlRmllbGROYW1lIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBJbWFnZVJlc29sdXRpb24gfSBmcm9tICcuL0ltYWdlUmVzb2x1dGlvbi5qcyc7XG5pbXBvcnQgeyBGaWxlVHlwZSB9IGZyb20gJy4uL2VudW1zL0ZpbGVUeXBlLmpzJztcbmltcG9ydCB7IEltYWdlRmllbGROYW1lIH0gZnJvbSAnLi4vZW51bXMvSW1hZ2VGaWVsZE5hbWUuanMnO1xuXG5jbGFzcyBJbWFnZUZpZWxkIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7SW1hZ2VGaWVsZE5hbWV9IGltYWdlRmllbGROYW1lXG4gICAgKiBAcmV0dXJuIHtJbWFnZUZpZWxkfVxuICAgICovXG4gICAgc2V0SW1hZ2VGaWVsZE5hbWUgKGltYWdlRmllbGROYW1lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEltYWdlRmllbGROYW1lLCBpbWFnZUZpZWxkTmFtZSk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSW1hZ2VGaWVsZC5LRVlfTkFNRSwgaW1hZ2VGaWVsZE5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0ltYWdlRmllbGROYW1lfVxuICAgICovXG4gICAgZ2V0SW1hZ2VGaWVsZE5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSW1hZ2VGaWVsZE5hbWUsIEltYWdlRmllbGQuS0VZX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtGaWxlVHlwZVtdfSBpbWFnZVR5cGVTdXBwb3J0ZWRcbiAgICAqIEByZXR1cm4ge0ltYWdlRmllbGR9XG4gICAgKi9cbiAgICBzZXRJbWFnZVR5cGVTdXBwb3J0ZWQgKGltYWdlVHlwZVN1cHBvcnRlZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShGaWxlVHlwZSwgaW1hZ2VUeXBlU3VwcG9ydGVkLCB0cnVlKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihJbWFnZUZpZWxkLktFWV9JTUFHRV9UWVBFX1NVUFBPUlRFRCwgaW1hZ2VUeXBlU3VwcG9ydGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtGaWxlVHlwZX1cbiAgICAqL1xuICAgIGdldEltYWdlVHlwZVN1cHBvcnRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChGaWxlVHlwZSwgSW1hZ2VGaWVsZC5LRVlfSU1BR0VfVFlQRV9TVVBQT1JURUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtJbWFnZVJlc29sdXRpb259IGltYWdlUmVzb2x1dGlvblxuICAgICogQHJldHVybiB7SW1hZ2VGaWVsZH1cbiAgICAqL1xuICAgIHNldEltYWdlUmVzb2x1dGlvbiAoaW1hZ2VSZXNvbHV0aW9uKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEltYWdlUmVzb2x1dGlvbiwgaW1hZ2VSZXNvbHV0aW9uKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihJbWFnZUZpZWxkLktFWV9JTUFHRV9SRVNPTFVUSU9OLCBpbWFnZVJlc29sdXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0ltYWdlUmVzb2x1dGlvbn1cbiAgICAqL1xuICAgIGdldEltYWdlUmVzb2x1dGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChJbWFnZVJlc29sdXRpb24sIEltYWdlRmllbGQuS0VZX0lNQUdFX1JFU09MVVRJT04pO1xuICAgIH1cbn1cblxuSW1hZ2VGaWVsZC5LRVlfTkFNRSA9ICduYW1lJztcbkltYWdlRmllbGQuS0VZX0lNQUdFX1RZUEVfU1VQUE9SVEVEID0gJ2ltYWdlVHlwZVN1cHBvcnRlZCc7XG5JbWFnZUZpZWxkLktFWV9JTUFHRV9SRVNPTFVUSU9OID0gJ2ltYWdlUmVzb2x1dGlvbic7XG5cbmV4cG9ydCB7IEltYWdlRmllbGQgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG5jbGFzcyBUb3VjaEV2ZW50Q2FwYWJpbGl0aWVzIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtCb29sZWFufSBwcmVzc0F2YWlsYWJsZVxuICAgICogQHJldHVybiB7VG91Y2hFdmVudENhcGFiaWxpdGllc31cbiAgICAqL1xuICAgIHNldFByZXNzQXZhaWxhYmxlIChwcmVzc0F2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihUb3VjaEV2ZW50Q2FwYWJpbGl0aWVzLktFWV9QUkVTU19BVkFJTEFCTEUsIHByZXNzQXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0UHJlc3NBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVG91Y2hFdmVudENhcGFiaWxpdGllcy5LRVlfUFJFU1NfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbXVsdGlUb3VjaEF2YWlsYWJsZVxuICAgICogQHJldHVybiB7VG91Y2hFdmVudENhcGFiaWxpdGllc31cbiAgICAqL1xuICAgIHNldE11bHRpVG91Y2hBdmFpbGFibGUgKG11bHRpVG91Y2hBdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVG91Y2hFdmVudENhcGFiaWxpdGllcy5LRVlfTVVMVElfVE9VQ0hfQVZBSUxBQkxFLCBtdWx0aVRvdWNoQXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0TXVsdGlUb3VjaEF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihUb3VjaEV2ZW50Q2FwYWJpbGl0aWVzLktFWV9NVUxUSV9UT1VDSF9BVkFJTEFCTEUpO1xuICAgIH1cblxuXG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZG91YmxlUHJlc3NBdmFpbGFibGVcbiAgICAqIEByZXR1cm4ge1RvdWNoRXZlbnRDYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBzZXREb3VibGVQcmVzc0F2YWlsYWJsZSAoZG91YmxlUHJlc3NBdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVG91Y2hFdmVudENhcGFiaWxpdGllcy5LRVlfRE9VQkxFX1BSRVNTX0FWQUlMQUJMRSwgZG91YmxlUHJlc3NBdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgKi9cbiAgICBnZXREb3VibGVQcmVzc0F2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihUb3VjaEV2ZW50Q2FwYWJpbGl0aWVzLktFWV9ET1VCTEVfUFJFU1NfQVZBSUxBQkxFKTtcbiAgICB9XG59XG5cblRvdWNoRXZlbnRDYXBhYmlsaXRpZXMuS0VZX1BSRVNTX0FWQUlMQUJMRSA9ICdwcmVzc0F2YWlsYWJsZSc7XG5Ub3VjaEV2ZW50Q2FwYWJpbGl0aWVzLktFWV9NVUxUSV9UT1VDSF9BVkFJTEFCTEUgPSAnbXVsdGlUb3VjaEF2YWlsYWJsZSc7XG5Ub3VjaEV2ZW50Q2FwYWJpbGl0aWVzLktFWV9ET1VCTEVfUFJFU1NfQVZBSUxBQkxFID0gJ2RvdWJsZVByZXNzQXZhaWxhYmxlJztcblxuZXhwb3J0IHsgVG91Y2hFdmVudENhcGFiaWxpdGllcyB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBJbWFnZVJlc29sdXRpb24gfSBmcm9tICcuL0ltYWdlUmVzb2x1dGlvbi5qcyc7XG5pbXBvcnQgeyBUb3VjaEV2ZW50Q2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9Ub3VjaEV2ZW50Q2FwYWJpbGl0aWVzLmpzJztcblxuY2xhc3MgU2NyZWVuUGFyYW1zIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtJbWFnZVJlc29sdXRpb259IHJlc29sdXRpb25cbiAgICAqIEByZXR1cm4ge1NjcmVlblBhcmFtc31cbiAgICAqL1xuICAgIHNldFJlc29sdXRpb24gKHJlc29sdXRpb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSW1hZ2VSZXNvbHV0aW9uLCByZXNvbHV0aW9uKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTY3JlZW5QYXJhbXMuS0VZX1JFU09MVVRJT04sIHJlc29sdXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0ltYWdlUmVzb2x1dGlvbn1cbiAgICAqL1xuICAgIGdldFJlc29sdXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSW1hZ2VSZXNvbHV0aW9uLCBTY3JlZW5QYXJhbXMuS0VZX1JFU09MVVRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtUb3VjaEV2ZW50Q2FwYWJpbGl0aWVzfSB0b3VjaEV2ZW50Q2FwYWJpbGl0aWVzXG4gICAgKiBAcmV0dXJuIHtTY3JlZW5QYXJhbXN9XG4gICAgKi9cbiAgICBzZXRUb3VjaEV2ZW50QXZhaWxhYmxlICh0b3VjaEV2ZW50Q2FwYWJpbGl0aWVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRvdWNoRXZlbnRDYXBhYmlsaXRpZXMsIHRvdWNoRXZlbnRDYXBhYmlsaXRpZXMpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNjcmVlblBhcmFtcy5LRVlfVE9VQ0hfRVZFTlRfQVZBSUxBQkxFLCB0b3VjaEV2ZW50Q2FwYWJpbGl0aWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtUb3VjaEV2ZW50Q2FwYWJpbGl0aWVzfVxuICAgICovXG4gICAgZ2V0VG91Y2hFdmVudEF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUb3VjaEV2ZW50Q2FwYWJpbGl0aWVzLCBTY3JlZW5QYXJhbXMuS0VZX1RPVUNIX0VWRU5UX0FWQUlMQUJMRSk7XG4gICAgfVxufVxuXG5TY3JlZW5QYXJhbXMuS0VZX1JFU09MVVRJT04gPSAncmVzb2x1dGlvbic7XG5TY3JlZW5QYXJhbXMuS0VZX1RPVUNIX0VWRU5UX0FWQUlMQUJMRSA9ICd0b3VjaEV2ZW50QXZhaWxhYmxlJztcblxuZXhwb3J0IHsgU2NyZWVuUGFyYW1zIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IERpc3BsYXlUeXBlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBEaXNwbGF5VHlwZSBleHRlbmRzIEVudW0ge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDSUQgKCkge1xuICAgICAgICByZXR1cm4gRGlzcGxheVR5cGUuX01BUC5DSUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVFlQRTIgKCkge1xuICAgICAgICByZXR1cm4gRGlzcGxheVR5cGUuX01BUC5UWVBFMjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBUWVBFNSAoKSB7XG4gICAgICAgIHJldHVybiBEaXNwbGF5VHlwZS5fTUFQLlRZUEU1O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5HTiAoKSB7XG4gICAgICAgIHJldHVybiBEaXNwbGF5VHlwZS5fTUFQLk5HTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBHRU4yXzhfRE1BICgpIHtcbiAgICAgICAgcmV0dXJuIERpc3BsYXlUeXBlLl9NQVAuR0VOMl84X0RNQTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBHRU4yXzZfRE1BICgpIHtcbiAgICAgICAgcmV0dXJuIERpc3BsYXlUeXBlLl9NQVAuR0VOMl82X0RNQTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBNRkQzICgpIHtcbiAgICAgICAgcmV0dXJuIERpc3BsYXlUeXBlLl9NQVAuTUZEMztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBNRkQ0ICgpIHtcbiAgICAgICAgcmV0dXJuIERpc3BsYXlUeXBlLl9NQVAuTUZENDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBNRkQ1ICgpIHtcbiAgICAgICAgcmV0dXJuIERpc3BsYXlUeXBlLl9NQVAuTUZENTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBHRU4zXzhfSU5DSCAoKSB7XG4gICAgICAgIHJldHVybiBEaXNwbGF5VHlwZS5fTUFQLkdFTjNfOF9JTkNIO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNETF9HRU5FUklDICgpIHtcbiAgICAgICAgcmV0dXJuIERpc3BsYXlUeXBlLl9NQVAuU0RMX0dFTkVSSUM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIERpc3BsYXlUeXBlLl92YWx1ZUZvcktleShrZXksIERpc3BsYXlUeXBlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBEaXNwbGF5VHlwZS5fa2V5Rm9yVmFsdWUodmFsdWUsIERpc3BsYXlUeXBlLl9NQVApO1xuICAgIH1cbn1cblxuRGlzcGxheVR5cGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdDSUQnOiAnQ0lEJyxcbiAgICAnVFlQRTInOiAnVFlQRTInLFxuICAgICdUWVBFNSc6ICdUWVBFNScsXG4gICAgJ05HTic6ICdOR04nLFxuICAgICdHRU4yXzhfRE1BJzogJ0dFTjJfOF9ETUEnLFxuICAgICdHRU4yXzZfRE1BJzogJ0dFTjJfNl9ETUEnLFxuICAgICdNRkQzJzogJ01GRDMnLFxuICAgICdNRkQ0JzogJ01GRDQnLFxuICAgICdURVNUSU5HJzogJ1RFU1RJTkcnLFxuICAgICdNRkQ1JzogJ01GRDUnLFxuICAgICdHRU4zXzhfSU5DSCc6ICdHRU4zXzgtSU5DSCcsXG4gICAgJ1NETF9HRU5FUklDJzogJ1NETF9HRU5FUklDJyxcbn0pO1xuXG5leHBvcnQgeyBEaXNwbGF5VHlwZSB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gTWVkaWFDbG9ja0Zvcm1hdFxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgTWVkaWFDbG9ja0Zvcm1hdCBleHRlbmRzIEVudW0ge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDTE9DSzEgKCkge1xuICAgICAgICByZXR1cm4gTWVkaWFDbG9ja0Zvcm1hdC5fTUFQLkNMT0NLMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDTE9DSzIgKCkge1xuICAgICAgICByZXR1cm4gTWVkaWFDbG9ja0Zvcm1hdC5fTUFQLkNMT0NLMjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDTE9DSzMgKCkge1xuICAgICAgICByZXR1cm4gTWVkaWFDbG9ja0Zvcm1hdC5fTUFQLkNMT0NLMztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDTE9DS1RFWFQxICgpIHtcbiAgICAgICAgcmV0dXJuIE1lZGlhQ2xvY2tGb3JtYXQuX01BUC5DTE9DS1RFWFQxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENMT0NLVEVYVDIgKCkge1xuICAgICAgICByZXR1cm4gTWVkaWFDbG9ja0Zvcm1hdC5fTUFQLkNMT0NLVEVYVDI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ0xPQ0tURVhUMyAoKSB7XG4gICAgICAgIHJldHVybiBNZWRpYUNsb2NrRm9ybWF0Ll9NQVAuQ0xPQ0tURVhUMztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDTE9DS1RFWFQ0ICgpIHtcbiAgICAgICAgcmV0dXJuIE1lZGlhQ2xvY2tGb3JtYXQuX01BUC5DTE9DS1RFWFQ0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBNZWRpYUNsb2NrRm9ybWF0Ll92YWx1ZUZvcktleShrZXksIE1lZGlhQ2xvY2tGb3JtYXQuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIE1lZGlhQ2xvY2tGb3JtYXQuX2tleUZvclZhbHVlKHZhbHVlLCBNZWRpYUNsb2NrRm9ybWF0Ll9NQVApO1xuICAgIH1cbn1cblxuTWVkaWFDbG9ja0Zvcm1hdC5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0NMT0NLMSc6ICdDTE9DSzEnLFxuICAgICdDTE9DSzInOiAnQ0xPQ0syJyxcbiAgICAnQ0xPQ0szJzogJ0NMT0NLMycsXG4gICAgJ0NMT0NLVEVYVDEnOiAnQ0xPQ0tURVhUMScsXG4gICAgJ0NMT0NLVEVYVDInOiAnQ0xPQ0tURVhUMicsXG4gICAgJ0NMT0NLVEVYVDMnOiAnQ0xPQ0tURVhUMycsXG4gICAgJ0NMT0NLVEVYVDQnOiAnQ0xPQ0tURVhUNCcsXG59KTtcblxuZXhwb3J0IHsgTWVkaWFDbG9ja0Zvcm1hdCB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgVGV4dEZpZWxkIH0gZnJvbSAnLi9UZXh0RmllbGQuanMnO1xuaW1wb3J0IHsgSW1hZ2VGaWVsZCB9IGZyb20gJy4vSW1hZ2VGaWVsZC5qcyc7XG5pbXBvcnQgeyBTY3JlZW5QYXJhbXMgfSBmcm9tICcuL1NjcmVlblBhcmFtcy5qcyc7XG5pbXBvcnQgeyBEaXNwbGF5VHlwZSB9IGZyb20gJy4uL2VudW1zL0Rpc3BsYXlUeXBlLmpzJztcbmltcG9ydCB7IE1lZGlhQ2xvY2tGb3JtYXQgfSBmcm9tICcuLi9lbnVtcy9NZWRpYUNsb2NrRm9ybWF0LmpzJztcblxuY2xhc3MgRGlzcGxheUNhcGFiaWxpdGllcyBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Rpc3BsYXlUeXBlfSBkaXNwbGF5VHlwZVxuICAgICogQHJldHVybiB7RGlzcGxheUNhcGFiaWxpdGllc31cbiAgICAqL1xuICAgIHNldERpc3BsYXlUeXBlIChkaXNwbGF5VHlwZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShEaXNwbGF5VHlwZSwgZGlzcGxheVR5cGUpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX0RJU1BMQVlfVFlQRSwgZGlzcGxheVR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0Rpc3BsYXlUeXBlfVxuICAgICovXG4gICAgZ2V0RGlzcGxheVR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoRGlzcGxheVR5cGUsIERpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX0RJU1BMQVlfVFlQRSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBkaXNwbGF5TmFtZVxuICAgICogQHJldHVybiB7RGlzcGxheUNhcGFiaWxpdGllc31cbiAgICAqL1xuICAgIHNldERpc3BsYXlOYW1lIChkaXNwbGF5TmFtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEaXNwbGF5Q2FwYWJpbGl0aWVzLktFWV9ESVNQTEFZX05BTUUsIGRpc3BsYXlOYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBnZXREaXNwbGF5TmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEaXNwbGF5Q2FwYWJpbGl0aWVzLktFWV9ESVNQTEFZX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtBcnJheTxUZXh0RmllbGQ+fSB0ZXh0RmllbGRzXG4gICAgKiBAcmV0dXJuIHtEaXNwbGF5Q2FwYWJpbGl0aWVzfVxuICAgICovXG4gICAgc2V0VGV4dEZpZWxkcyAodGV4dEZpZWxkcykge1xuICAgICAgICAvLyBUT0RPIG1ha2Ugd29yayB3aXRoIGFycmF5c1xuICAgICAgICAvLyB0aGlzLnZhbGlkYXRlVHlwZShUZXh0RmllbGQsIHRleHRGaWVsZHMpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX1RFWFRfRklFTERTLCB0ZXh0RmllbGRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtBcnJheTxUZXh0RmllbGQ+fVxuICAgICovXG4gICAgZ2V0VGV4dEZpZWxkcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUZXh0RmllbGQsIERpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX1RFWFRfRklFTERTKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtBcnJheTxJbWFnZUZpZWxkPn0gaW1hZ2VGaWVsZHNcbiAgICAqIEByZXR1cm4ge0Rpc3BsYXlDYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBzZXRJbWFnZUZpZWxkcyAoaW1hZ2VGaWVsZHMpIHtcbiAgICAgICAgLy8gVE9ETyBtYWtlIHdvcmsgd2l0aCBhcnJheXNcbiAgICAgICAgLy8gdGhpcy52YWxpZGF0ZVR5cGUoSW1hZ2VGaWVsZCwgaW1hZ2VGaWVsZHMpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX0lNQUdFX0ZJRUxEUywgaW1hZ2VGaWVsZHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0FycmF5PEltYWdlRmllbGQ+fVxuICAgICovXG4gICAgZ2V0SW1hZ2VGaWVsZHMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSW1hZ2VGaWVsZCwgRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfSU1BR0VfRklFTERTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7QXJyYXk8TWVkaWFDbG9ja0Zvcm1hdD59IG1lZGlhQ2xvY2tGb3JtYXRzXG4gICAgKiBAcmV0dXJuIHtEaXNwbGF5Q2FwYWJpbGl0aWVzfVxuICAgICovXG4gICAgc2V0TWVkaWFDbG9ja0Zvcm1hdHMgKG1lZGlhQ2xvY2tGb3JtYXRzKSB7XG4gICAgICAgIC8vIFRPRE8gbWFrZSB3b3JrIHdpdGggYXJyYXlzXG4gICAgICAgIC8vIHRoaXMudmFsaWRhdGVUeXBlKEltYWdlRmllbGQsIG1lZGlhQ2xvY2tGb3JtYXRzKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEaXNwbGF5Q2FwYWJpbGl0aWVzLktFWV9NRURJQV9DTE9DS19GT1JNQVRTLCBtZWRpYUNsb2NrRm9ybWF0cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7QXJyYXk8TWVkaWFDbG9ja0Zvcm1hdD59XG4gICAgKi9cbiAgICBnZXRNZWRpYUNsb2NrRm9ybWF0cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNZWRpYUNsb2NrRm9ybWF0LCBEaXNwbGF5Q2FwYWJpbGl0aWVzLktFWV9NRURJQV9DTE9DS19GT1JNQVRTKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtCb29sZWFufSBncmFwaGljU3VwcG9ydGVkXG4gICAgKiBAcmV0dXJuIHtEaXNwbGF5Q2FwYWJpbGl0aWVzfVxuICAgICovXG4gICAgc2V0R3JhcGhpY3NTdXBwb3J0ZWQgKGdyYXBoaWNTdXBwb3J0ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfR1JBUEhJQ1NfU1VQUE9SVEVELCBncmFwaGljU3VwcG9ydGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0R3JhcGhpY3NTdXBwb3J0ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfR1JBUEhJQ1NfU1VQUE9SVEVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gdGVtcGxhdGVzQXZhaWxhYmxlXG4gICAgKiBAcmV0dXJuIHtEaXNwbGF5Q2FwYWJpbGl0aWVzfVxuICAgICovXG4gICAgc2V0VGVtcGxhdGVzQXZhaWxhYmxlICh0ZW1wbGF0ZXNBdmFpbGFibGUpIHtcbiAgICAgICAgLy8gVE9ETyBtYWtlIHdvcmsgd2l0aCBhcnJheXNcbiAgICAgICAgLy8gdGhpcy52YWxpZGF0ZVR5cGUoU3RyaW5nLCB0ZW1wbGF0ZXNBdmFpbGFibGUpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX1RFTVBMQVRFU19BVkFJTEFCTEUsIHRlbXBsYXRlc0F2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn1cbiAgICAqL1xuICAgIGdldFRlbXBsYXRlc0F2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEaXNwbGF5Q2FwYWJpbGl0aWVzLktFWV9URU1QTEFURVNfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U2NyZWVuUGFyYW1zfSBzY3JlZW5QYXJhbXNcbiAgICAqIEByZXR1cm4ge0Rpc3BsYXlDYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBzZXRTY3JlZW5QYXJhbXMgKHNjcmVlblBhcmFtcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTY3JlZW5QYXJhbXMsIHNjcmVlblBhcmFtcyk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfU0NSRUVOX1BBUkFNUywgc2NyZWVuUGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTY3JlZW5QYXJhbXN9XG4gICAgKi9cbiAgICBnZXRTY3JlZW5QYXJhbXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoU2NyZWVuUGFyYW1zLCBEaXNwbGF5Q2FwYWJpbGl0aWVzLktFWV9TQ1JFRU5fUEFSQU1TKTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0FycmF5PE51bWJlcj59IG51bUN1c3RvbVByZXNldHNBdmFpbGFibGVcbiAgICAqIEByZXR1cm4ge0Rpc3BsYXlDYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBzZXROdW1DdXN0b21QcmVzZXRzQXZhaWxhYmxlIChudW1DdXN0b21QcmVzZXRzQXZhaWxhYmxlKSB7XG4gICAgICAgIC8vIFRPRE8gbWFrZSB3b3JrIHdpdGggYXJyYXlzXG4gICAgICAgIC8vIHRoaXMudmFsaWRhdGVUeXBlKE51bWJlciwgbnVtQ3VzdG9tUHJlc2V0c0F2YWlsYWJsZSk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfTlVNX0NVU1RPTV9QUkVTRVRTX0FWQUlMQUJMRSwgbnVtQ3VzdG9tUHJlc2V0c0F2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7QXJyYXk8TnVtYmVyPn1cbiAgICAqL1xuICAgIGdldE51bUN1c3RvbVByZXNldHNBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfTlVNX0NVU1RPTV9QUkVTRVRTX0FWQUlMQUJMRSk7XG4gICAgfVxufVxuXG5EaXNwbGF5Q2FwYWJpbGl0aWVzLktFWV9ESVNQTEFZX1RZUEUgPSAnZGlzcGxheVR5cGUnO1xuRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfRElTUExBWV9OQU1FID0gJ2Rpc3BsYXlOYW1lJztcbkRpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX1RFWFRfRklFTERTID0gJ3RleHRGaWVsZHMnO1xuRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfSU1BR0VfRklFTERTID0gJ2ltYWdlRmllbGRzJztcbkRpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX01FRElBX0NMT0NLX0ZPUk1BVFMgPSAnbWVkaWFDbG9ja0Zvcm1hdHMnO1xuRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfR1JBUEhJQ1NfU1VQUE9SVEVEID0gJ2dyYXBoaWNTdXBwb3J0ZWQnO1xuRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfVEVNUExBVEVTX0FWQUlMQUJMRSA9ICd0ZW1wbGF0ZXNBdmFpbGFibGUnO1xuRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfU0NSRUVOX1BBUkFNUyA9ICdzY3JlZW5QYXJhbXMnO1xuRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfTlVNX0NVU1RPTV9QUkVTRVRTX0FWQUlMQUJMRSA9ICdudW1DdXN0b21QcmVzZXRzQXZhaWxhYmxlJztcblxuZXhwb3J0IHsgRGlzcGxheUNhcGFiaWxpdGllcyB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbmNsYXNzIEdyaWQgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtOdW1iZXJ9IGNvbHVtblxuICAgICogQHJldHVybiB7R3JpZH1cbiAgICAqL1xuICAgIHNldENvbHVtbiAoY29sdW1uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdyaWQuS0VZX0NPTFVNTiwgY29sdW1uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBnZXRDb2x1bW4gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR3JpZC5LRVlfQ09MVU1OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSByb3dcbiAgICAqIEByZXR1cm4ge0dyaWR9XG4gICAgKi9cbiAgICBzZXRSb3cgKHJvdykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHcmlkLktFWV9ST1csIHJvdyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgZ2V0Um93ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdyaWQuS0VZX1JPVyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gbGV2ZWxcbiAgICAqIEByZXR1cm4ge0dyaWR9XG4gICAgKi9cbiAgICBzZXRMZXZlbCAobGV2ZWwpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR3JpZC5LRVlfTEVWRUwsIGxldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBnZXRMZXZlbCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHcmlkLktFWV9MRVZFTCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gY29sdW1uU3BhblxuICAgICogQHJldHVybiB7R3JpZH1cbiAgICAqL1xuICAgIHNldENvbHVtblNwYW4gKGNvbHVtblNwYW4pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR3JpZC5LRVlfQ09MVU1OX1NQQU4sIGNvbHVtblNwYW4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIGdldENvbHVtblNwYW4gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR3JpZC5LRVlfQ09MVU1OX1NQQU4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtOdW1iZXJ9IHJvd1NwYW5cbiAgICAqIEByZXR1cm4ge0dyaWR9XG4gICAgKi9cbiAgICBzZXRSb3dTcGFuIChyb3dTcGFuKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdyaWQuS0VZX1JPV19TUEFOLCByb3dTcGFuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBnZXRSb3dTcGFuICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdyaWQuS0VZX1JPV19TUEFOKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFNwYW5cbiAgICAqIEByZXR1cm4ge0dyaWR9XG4gICAgKi9cbiAgICBzZXRMZXZlbFNwYW4gKGxldmVsU3Bhbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHcmlkLktFWV9MRVZFTF9TUEFOLCBsZXZlbFNwYW4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIGdldExldmVsU3BhbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHcmlkLktFWV9MRVZFTF9TUEFOKTtcbiAgICB9XG59XG5cbkdyaWQuS0VZX0NPTFVNTiA9ICdjb2wnO1xuR3JpZC5LRVlfUk9XID0gJ3Jvdyc7XG5HcmlkLktFWV9MRVZFTCA9ICdsZXZlbCc7XG5HcmlkLktFWV9DT0xVTU5fU1BBTiA9ICdjb2xzcGFuJztcbkdyaWQuS0VZX1JPV19TUEFOID0gJ3Jvd3NwYW4nO1xuR3JpZC5LRVlfTEVWRUxfU1BBTiA9ICdsZXZlbHNwYW4nO1xuXG5leHBvcnQgeyBHcmlkIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IEdyaWQgfSBmcm9tICcuL0dyaWQuanMnO1xuXG5jbGFzcyBNb2R1bGVJbmZvIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBtb2R1bGVJZFxuICAgICogQHJldHVybiB7TW9kdWxlSW5mb31cbiAgICAqL1xuICAgIHNldE1vZHVsZUlkIChtb2R1bGVJZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihNb2R1bGVJbmZvLktFWV9NT0RVTEVfSUQsIG1vZHVsZUlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBnZXRNb2R1bGVJZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihNb2R1bGVJbmZvLktFWV9NT0RVTEVfSUQpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0dyaWR9IGxvY2F0aW9uXG4gICAgKiBAcmV0dXJuIHtNb2R1bGVJbmZvfVxuICAgICovXG4gICAgc2V0TG9jYXRpb24gKGxvY2F0aW9uKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEdyaWQsIGxvY2F0aW9uKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihNb2R1bGVJbmZvLktFWV9MT0NBVElPTiwgbG9jYXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0dyaWR9XG4gICAgKi9cbiAgICBnZXRMb2NhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChHcmlkLCBNb2R1bGVJbmZvLktFWV9MT0NBVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0dyaWR9IHNlcnZpY2VBcmVhXG4gICAgKiBAcmV0dXJuIHtNb2R1bGVJbmZvfVxuICAgICovXG4gICAgc2V0U2VydmljZUFyZWEgKHNlcnZpY2VBcmVhKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEdyaWQsIHNlcnZpY2VBcmVhKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihNb2R1bGVJbmZvLktFWV9TRVJWSUNFX0FSRUEsIHNlcnZpY2VBcmVhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtHcmlkfVxuICAgICovXG4gICAgZ2V0U2VydmljZUFyZWEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoR3JpZCwgTW9kdWxlSW5mby5LRVlfU0VSVklDRV9BUkVBKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxsb3dNdWx0aXBsZUFjY2Vzc1xuICAgICogQHJldHVybiB7TW9kdWxlSW5mb31cbiAgICAqL1xuICAgIHNldEFsbG93TXVsdGlwbGVBY2Nlc3MgKGFsbG93TXVsdGlwbGVBY2Nlc3MpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTW9kdWxlSW5mby5LRVlfQUxMT1dfTVVMVElQTEVfQUNDRVNTLCBhbGxvd011bHRpcGxlQWNjZXNzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0QWxsb3dNdWx0aXBsZUFjY2VzcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihNb2R1bGVJbmZvLktFWV9BTExPV19NVUxUSVBMRV9BQ0NFU1MpO1xuICAgIH1cbn1cblxuTW9kdWxlSW5mby5LRVlfTU9EVUxFX0lEID0gJ21vZHVsZUlkJztcbk1vZHVsZUluZm8uS0VZX0xPQ0FUSU9OID0gJ2xvY2F0aW9uJztcbk1vZHVsZUluZm8uS0VZX1NFUlZJQ0VfQVJFQSA9ICdzZXJ2aWNlQXJlYSc7XG5Nb2R1bGVJbmZvLktFWV9BTExPV19NVUxUSVBMRV9BQ0NFU1MgPSAnYWxsb3dNdWx0aXBsZUFjY2Vzcyc7XG5cbmV4cG9ydCB7IE1vZHVsZUluZm8gfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gQnV0dG9uTmFtZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgQnV0dG9uTmFtZSBleHRlbmRzIEVudW0ge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBPSyAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuT0s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUExBWV9QQVVTRSAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuUExBWV9QQVVTRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTRUVLTEVGVCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuU0VFS0xFRlQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU0VFS1JJR0hUICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5TRUVLUklHSFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVFVORVVQICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5UVU5FVVA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVFVORURPV04gKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlRVTkVET1dOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBSRVNFVF8wICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5QUkVTRVRfMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQUkVTRVRfMSAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuUFJFU0VUXzE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUFJFU0VUXzIgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlBSRVNFVF8yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBSRVNFVF8zICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5QUkVTRVRfMztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQUkVTRVRfNCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuUFJFU0VUXzQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUFJFU0VUXzUgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlBSRVNFVF81O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBSRVNFVF82ICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5QUkVTRVRfNjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQUkVTRVRfNyAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuUFJFU0VUXzc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUFJFU0VUXzggKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlBSRVNFVF84O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBSRVNFVF85ICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5QUkVTRVRfOTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDVVNUT01fQlVUVE9OICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5DVVNUT01fQlVUVE9OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNFQVJDSCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuU0VBUkNIO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEFDX01BWCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuQUNfTUFYO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEFDICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5BQztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSRUNJUkNVTEFURSAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuUkVDSVJDVUxBVEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRkFOX1VQICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5GQU5fVVA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRkFOX0RPV04gKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLkZBTl9ET1dOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRFTVBfVVAgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlRFTVBfVVA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVEVNUF9ET1dOICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5URU1QX0RPV047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgREVGUk9TVF9NQVggKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLkRFRlJPU1RfTUFYO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERFRlJPU1QgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLkRFRlJPU1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgREVGUk9TVF9SRUFSICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5ERUZST1NUX1JFQVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVVBQRVJfVkVOVCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuVVBQRVJfVkVOVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBMT1dFUl9WRU5UICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5MT1dFUl9WRU5UO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZPTFVNRV9VUCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuVk9MVU1FX1VQO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZPTFVNRV9ET1dOICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5WT0xVTUVfRE9XTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFSkVDVCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuRUpFQ1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU09VUkNFICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5TT1VSQ0U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU0hVRkZMRSAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuU0hVRkZMRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSRVBFQVQgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlJFUEVBVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOQVZfQ0VOVEVSX0xPQ0FUSU9OICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5OQVZfQ0VOVEVSX0xPQ0FUSU9OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5BVl9aT09NX0lOICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5OQVZfWk9PTV9JTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOQVZfWk9PTV9PVVQgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLk5BVl9aT09NX09VVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOQVZfUEFOX1VQICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5OQVZfUEFOX1VQO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5BVl9QQU5fVVBfUklHSFQgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLk5BVl9QQU5fVVBfUklHSFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkFWX1BBTl9SSUdIVCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuTkFWX1BBTl9SSUdIVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOQVZfUEFOX0RPV05fUklHSFQgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLk5BVl9QQU5fRE9XTl9SSUdIVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOQVZfUEFOX0RPV04gKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLk5BVl9QQU5fRE9XTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOQVZfUEFOX0RPV05fTEVGVCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuTkFWX1BBTl9ET1dOX0xFRlQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkFWX1BBTl9MRUZUICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5OQVZfUEFOX0xFRlQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkFWX1BBTl9VUF9MRUZUICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5OQVZfUEFOX1VQX0xFRlQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkFWX1RJTFRfVE9HR0xFICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5OQVZfVElMVF9UT0dHTEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkFWX1JPVEFURV9DTE9DS1dJU0UgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLk5BVl9ST1RBVEVfQ0xPQ0tXSVNFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5BVl9ST1RBVEVfQ09VTlRFUkNMT0NLV0lTRSAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuTkFWX1JPVEFURV9DT1VOVEVSQ0xPQ0tXSVNFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5BVl9IRUFESU5HX1RPR0dMRSAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuTkFWX0hFQURJTkdfVE9HR0xFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl92YWx1ZUZvcktleShrZXksIEJ1dHRvbk5hbWUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX2tleUZvclZhbHVlKHZhbHVlLCBCdXR0b25OYW1lLl9NQVApO1xuICAgIH1cbn1cblxuQnV0dG9uTmFtZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ09LJzogJ09LJyxcbiAgICAnUExBWV9QQVVTRSc6ICdQTEFZX1BBVVNFJyxcbiAgICAnU0VFS0xFRlQnOiAnU0VFS0xFRlQnLFxuICAgICdTRUVLUklHSFQnOiAnU0VFS1JJR0hUJyxcbiAgICAnVFVORVVQJzogJ1RVTkVVUCcsXG4gICAgJ1RVTkVET1dOJzogJ1RVTkVET1dOJyxcbiAgICAnUFJFU0VUXzAnOiAnUFJFU0VUXzAnLFxuICAgICdQUkVTRVRfMSc6ICdQUkVTRVRfMScsXG4gICAgJ1BSRVNFVF8yJzogJ1BSRVNFVF8yJyxcbiAgICAnUFJFU0VUXzMnOiAnUFJFU0VUXzMnLFxuICAgICdQUkVTRVRfNCc6ICdQUkVTRVRfNCcsXG4gICAgJ1BSRVNFVF81JzogJ1BSRVNFVF81JyxcbiAgICAnUFJFU0VUXzYnOiAnUFJFU0VUXzYnLFxuICAgICdQUkVTRVRfNyc6ICdQUkVTRVRfNycsXG4gICAgJ1BSRVNFVF84JzogJ1BSRVNFVF84JyxcbiAgICAnUFJFU0VUXzknOiAnUFJFU0VUXzknLFxuICAgICdDVVNUT01fQlVUVE9OJzogJ0NVU1RPTV9CVVRUT04nLFxuICAgICdTRUFSQ0gnOiAnU0VBUkNIJyxcbiAgICAnQUNfTUFYJzogJ0FDX01BWCcsXG4gICAgJ0FDJzogJ0FDJyxcbiAgICAnUkVDSVJDVUxBVEUnOiAnUkVDSVJDVUxBVEUnLFxuICAgICdGQU5fVVAnOiAnRkFOX1VQJyxcbiAgICAnRkFOX0RPV04nOiAnRkFOX0RPV04nLFxuICAgICdURU1QX1VQJzogJ1RFTVBfVVAnLFxuICAgICdURU1QX0RPV04nOiAnVEVNUF9ET1dOJyxcbiAgICAnREVGUk9TVF9NQVgnOiAnREVGUk9TVF9NQVgnLFxuICAgICdERUZST1NUJzogJ0RFRlJPU1QnLFxuICAgICdERUZST1NUX1JFQVInOiAnREVGUk9TVF9SRUFSJyxcbiAgICAnVVBQRVJfVkVOVCc6ICdVUFBFUl9WRU5UJyxcbiAgICAnTE9XRVJfVkVOVCc6ICdMT1dFUl9WRU5UJyxcbiAgICAnVk9MVU1FX1VQJzogJ1ZPTFVNRV9VUCcsXG4gICAgJ1ZPTFVNRV9ET1dOJzogJ1ZPTFVNRV9ET1dOJyxcbiAgICAnRUpFQ1QnOiAnRUpFQ1QnLFxuICAgICdTT1VSQ0UnOiAnU09VUkNFJyxcbiAgICAnU0hVRkZMRSc6ICdTSFVGRkxFJyxcbiAgICAnUkVQRUFUJzogJ1JFUEVBVCcsXG4gICAgJ05BVl9DRU5URVJfTE9DQVRJT04nOiAnTkFWX0NFTlRFUl9MT0NBVElPTicsXG4gICAgJ05BVl9aT09NX0lOJzogJ05BVl9aT09NX0lOJyxcbiAgICAnTkFWX1pPT01fT1VUJzogJ05BVl9aT09NX09VVCcsXG4gICAgJ05BVl9QQU5fVVAnOiAnTkFWX1BBTl9VUCcsXG4gICAgJ05BVl9QQU5fVVBfUklHSFQnOiAnTkFWX1BBTl9VUF9SSUdIVCcsXG4gICAgJ05BVl9QQU5fUklHSFQnOiAnTkFWX1BBTl9SSUdIVCcsXG4gICAgJ05BVl9QQU5fRE9XTl9SSUdIVCc6ICdOQVZfUEFOX0RPV05fUklHSFQnLFxuICAgICdOQVZfUEFOX0RPV04nOiAnTkFWX1BBTl9ET1dOJyxcbiAgICAnTkFWX1BBTl9ET1dOX0xFRlQnOiAnTkFWX1BBTl9ET1dOX0xFRlQnLFxuICAgICdOQVZfUEFOX0xFRlQnOiAnTkFWX1BBTl9MRUZUJyxcbiAgICAnTkFWX1BBTl9VUF9MRUZUJzogJ05BVl9QQU5fVVBfTEVGVCcsXG4gICAgJ05BVl9USUxUX1RPR0dMRSc6ICdOQVZfVElMVF9UT0dHTEUnLFxuICAgICdOQVZfUk9UQVRFX0NMT0NLV0lTRSc6ICdOQVZfUk9UQVRFX0NMT0NLV0lTRScsXG4gICAgJ05BVl9ST1RBVEVfQ09VTlRFUkNMT0NLV0lTRSc6ICdOQVZfUk9UQVRFX0NPVU5URVJDTE9DS1dJU0UnLFxuICAgICdOQVZfSEVBRElOR19UT0dHTEUnOiAnTkFWX0hFQURJTkdfVE9HR0xFJyxcblxufSk7XG5cbmV4cG9ydCB7IEJ1dHRvbk5hbWUgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IE1vZHVsZUluZm8gfSBmcm9tICcuL01vZHVsZUluZm8nO1xuaW1wb3J0IHsgQnV0dG9uTmFtZSB9IGZyb20gJy4uL2VudW1zL0J1dHRvbk5hbWUuanMnO1xuXG5jbGFzcyBCdXR0b25DYXBhYmlsaXRpZXMgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtCdXR0b25OYW1lfSBuYW1lXG4gICAgKiBAcmV0dXJuIHtCdXR0b25DYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBzZXROYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEJ1dHRvbk5hbWUsIG5hbWUpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7QnV0dG9uTmFtZX1cbiAgICAqL1xuICAgIGdldE5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQnV0dG9uTmFtZSwgQnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7TW9kdWxlSW5mb30gbW9kdWxlSW5mb1xuICAgICogQHJldHVybiB7QnV0dG9uQ2FwYWJpbGl0aWVzfVxuICAgICovXG4gICAgc2V0TW9kdWxlSW5mbyAobW9kdWxlSW5mbykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNb2R1bGVJbmZvLCBtb2R1bGVJbmZvKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihCdXR0b25DYXBhYmlsaXRpZXMuS0VZX01PRFVMRV9JTkZPLCBtb2R1bGVJbmZvKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtNb2R1bGVJbmZvfVxuICAgICovXG4gICAgZ2V0TW9kdWxlSW5mbyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNb2R1bGVJbmZvLCBCdXR0b25DYXBhYmlsaXRpZXMuS0VZX01PRFVMRV9JTkZPKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gc2hvcnRQcmVzc0F2YWlsYWJsZVxuICAgICogQHJldHVybiB7QnV0dG9uQ2FwYWJpbGl0aWVzfVxuICAgICovXG4gICAgc2V0U2hvcnRQcmVzc0F2YWlsYWJsZSAoc2hvcnRQcmVzc0F2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihCdXR0b25DYXBhYmlsaXRpZXMuS0VZX1NIT1JUX1BSRVNTX0FWQUlMQUJMRSwgc2hvcnRQcmVzc0F2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAqL1xuICAgIGdldFNob3J0UHJlc3NBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9TSE9SVF9QUkVTU19BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtCb29sZWFufSBsb25nUHJlc3NBdmFpbGFibGVcbiAgICAqIEByZXR1cm4ge0J1dHRvbkNhcGFiaWxpdGllc31cbiAgICAqL1xuICAgIHNldExvbmdQcmVzc0F2YWlsYWJsZSAobG9uZ1ByZXNzQXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfTE9OR19QUkVTU19BVkFJTEFCTEUsIGxvbmdQcmVzc0F2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAqL1xuICAgIGdldExvbmdQcmVzc0F2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihCdXR0b25DYXBhYmlsaXRpZXMuS0VZX0xPTkdfUFJFU1NfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gdXBEb3duQXZhaWxhYmxlXG4gICAgKiBAcmV0dXJuIHtCdXR0b25DYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBzZXRVcERvd25BdmFpbGFibGUgKHVwRG93bkF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihCdXR0b25DYXBhYmlsaXRpZXMuS0VZX1VQX0RPV05fQVZBSUxBQkxFLCB1cERvd25BdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgKi9cbiAgICBnZXRVcERvd25BdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9VUF9ET1dOX0FWQUlMQUJMRSk7XG4gICAgfVxufVxuXG5CdXR0b25DYXBhYmlsaXRpZXMuS0VZX05BTUUgPSAnbmFtZSc7XG5CdXR0b25DYXBhYmlsaXRpZXMuS0VZX01PRFVMRV9JTkZPID0gJ21vZHVsZUluZm8nO1xuQnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9TSE9SVF9QUkVTU19BVkFJTEFCTEUgPSAnc2hvcnRQcmVzc0F2YWlsYWJsZSc7XG5CdXR0b25DYXBhYmlsaXRpZXMuS0VZX0xPTkdfUFJFU1NfQVZBSUxBQkxFID0gJ2xvbmdQcmVzc0F2YWlsYWJsZSc7XG5CdXR0b25DYXBhYmlsaXRpZXMuS0VZX1VQX0RPV05fQVZBSUxBQkxFID0gJ3VwRG93bkF2YWlsYWJsZSc7XG5cbmV4cG9ydCB7IEJ1dHRvbkNhcGFiaWxpdGllcyB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbmNsYXNzIFNvZnRCdXR0b25DYXBhYmlsaXRpZXMgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtCb29sZWFufSBzaG9ydFByZXNzQXZhaWxhYmxlXG4gICAgKiBAcmV0dXJuIHtTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzfVxuICAgICovXG4gICAgc2V0U2hvcnRQcmVzc0F2YWlsYWJsZSAoc2hvcnRQcmVzc0F2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9TSE9SVF9QUkVTU19BVkFJTEFCTEUsIHNob3J0UHJlc3NBdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgKi9cbiAgICBnZXRTaG9ydFByZXNzQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNvZnRCdXR0b25DYXBhYmlsaXRpZXMuS0VZX1NIT1JUX1BSRVNTX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IGxvbmdQcmVzc0F2YWlsYWJsZVxuICAgICogQHJldHVybiB7U29mdEJ1dHRvbkNhcGFiaWxpdGllc31cbiAgICAqL1xuICAgIHNldExvbmdQcmVzc0F2YWlsYWJsZSAobG9uZ1ByZXNzQXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNvZnRCdXR0b25DYXBhYmlsaXRpZXMuS0VZX0xPTkdfUFJFU1NfQVZBSUxBQkxFLCBsb25nUHJlc3NBdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgKi9cbiAgICBnZXRMb25nUHJlc3NBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU29mdEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfTE9OR19QUkVTU19BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtCb29sZWFufSB1cERvd25BdmFpbGFibGVcbiAgICAqIEByZXR1cm4ge1NvZnRCdXR0b25DYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBzZXRVcERvd25BdmFpbGFibGUgKHVwRG93bkF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9VUF9ET1dOX0FWQUlMQUJMRSwgdXBEb3duQXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0VXBEb3duQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNvZnRCdXR0b25DYXBhYmlsaXRpZXMuS0VZX1VQX0RPV05fQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaW1hZ2VTdXBwb3J0ZWRcbiAgICAqIEByZXR1cm4ge1NvZnRCdXR0b25DYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBzZXRJbWFnZVN1cHBvcnRlZCAoaW1hZ2VTdXBwb3J0ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU29mdEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfSU1BR0VfU1VQUE9SVEVELCBpbWFnZVN1cHBvcnRlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAqL1xuICAgIGdldEltYWdlU3VwcG9ydGVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNvZnRCdXR0b25DYXBhYmlsaXRpZXMuS0VZX0lNQUdFX1NVUFBPUlRFRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRleHRTdXBwb3J0ZWRcbiAgICAqIEByZXR1cm4ge1NvZnRCdXR0b25DYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBzZXRUZXh0U3VwcG9ydGVkICh0ZXh0U3VwcG9ydGVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNvZnRCdXR0b25DYXBhYmlsaXRpZXMuS0VZX1RFWFRfU1VQUE9SVEVELCB0ZXh0U3VwcG9ydGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0VGV4dFN1cHBvcnRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9URVhUX1NVUFBPUlRFRCk7XG4gICAgfVxufVxuXG5Tb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9TSE9SVF9QUkVTU19BVkFJTEFCTEUgPSAnc2hvcnRQcmVzc0F2YWlsYWJsZSc7XG5Tb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9MT05HX1BSRVNTX0FWQUlMQUJMRSA9ICdsb25nUHJlc3NBdmFpbGFibGUnO1xuU29mdEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfVVBfRE9XTl9BVkFJTEFCTEUgPSAndXBEb3duQXZhaWxhYmxlJztcblNvZnRCdXR0b25DYXBhYmlsaXRpZXMuS0VZX0lNQUdFX1NVUFBPUlRFRCA9ICdpbWFnZVN1cHBvcnRlZCc7XG5Tb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9URVhUX1NVUFBPUlRFRCA9ICd0ZXh0U3VwcG9ydGVkJztcblxuZXhwb3J0IHsgU29mdEJ1dHRvbkNhcGFiaWxpdGllcyB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbmNsYXNzIFByZXNldEJhbmtDYXBhYmlsaXRpZXMgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtCb29sZWFufSBvblNjcmVlblByZXNldHNBdmFpbGFibGVcbiAgICAqIEByZXR1cm4ge1ByZXNldEJhbmtDYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBzZXRPblNjcmVlblByZXNldHNBdmFpbGFibGUgKG9uU2NyZWVuUHJlc2V0c0F2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzLktFWV9PTl9TQ1JFRU5fUFJFU0VUU19BVkFJTEFCTEUsIG9uU2NyZWVuUHJlc2V0c0F2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAqL1xuICAgIGdldE9uU2NyZWVuUHJlc2V0c0F2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzLktFWV9PTl9TQ1JFRU5fUFJFU0VUU19BVkFJTEFCTEUpO1xuICAgIH1cbn1cblxuUHJlc2V0QmFua0NhcGFiaWxpdGllcy5LRVlfT05fU0NSRUVOX1BSRVNFVFNfQVZBSUxBQkxFID0gJ29uU2NyZWVuUHJlc2V0c0F2YWlsYWJsZSc7XG5cbmV4cG9ydCB7IFByZXNldEJhbmtDYXBhYmlsaXRpZXMgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG5jbGFzcyBWZWhpY2xlVHlwZSBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gbWFrZVxuICAgICogQHJldHVybiB7VmVoaWNsZVR5cGV9XG4gICAgKi9cbiAgICBzZXRNYWtlIChtYWtlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFZlaGljbGVUeXBlLktFWV9NQUtFLCBtYWtlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBnZXRNYWtlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFZlaGljbGVUeXBlLktFWV9NQUtFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBtb2RlbFxuICAgICogQHJldHVybiB7VmVoaWNsZVR5cGV9XG4gICAgKi9cbiAgICBzZXRNb2RlbCAobW9kZWwpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVmVoaWNsZVR5cGUuS0VZX01PREVMLCBtb2RlbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0TW9kZWwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVmVoaWNsZVR5cGUuS0VZX01PREVMKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBtb2RlbFllYXJcbiAgICAqIEByZXR1cm4ge1ZlaGljbGVUeXBlfVxuICAgICovXG4gICAgc2V0TW9kZWxZZWFyIChtb2RlbFllYXIpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVmVoaWNsZVR5cGUuS0VZX01PREVMX1lFQVIsIG1vZGVsWWVhcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0TW9kZWxZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFZlaGljbGVUeXBlLktFWV9NT0RFTF9ZRUFSKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHRyaW1cbiAgICAqIEByZXR1cm4ge1ZlaGljbGVUeXBlfVxuICAgICovXG4gICAgc2V0VHJpbSAodHJpbSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihWZWhpY2xlVHlwZS5LRVlfVFJJTSwgdHJpbSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0VHJpbSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihWZWhpY2xlVHlwZS5LRVlfVFJJTSk7XG4gICAgfVxufVxuXG5WZWhpY2xlVHlwZS5LRVlfTUFLRSA9ICdtYWtlJztcblZlaGljbGVUeXBlLktFWV9NT0RFTCA9ICdtb2RlbCc7XG5WZWhpY2xlVHlwZS5LRVlfTU9ERUxfWUVBUiA9ICdtb2RlbFllYXInO1xuVmVoaWNsZVR5cGUuS0VZX1RSSU0gPSAndHJpbSc7XG5cbmV4cG9ydCB7IFZlaGljbGVUeXBlIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IEZpbGVUeXBlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBIbWlab25lQ2FwYWJpbGl0aWVzIGV4dGVuZHMgRW51bSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZST05UICgpIHtcbiAgICAgICAgcmV0dXJuIEhtaVpvbmVDYXBhYmlsaXRpZXMuX01BUC5GUk9OVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBCQUNLICgpIHtcbiAgICAgICAgcmV0dXJuIEhtaVpvbmVDYXBhYmlsaXRpZXMuX01BUC5CQUNLO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBIbWlab25lQ2FwYWJpbGl0aWVzLl92YWx1ZUZvcktleShrZXksIEhtaVpvbmVDYXBhYmlsaXRpZXMuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEhtaVpvbmVDYXBhYmlsaXRpZXMuX2tleUZvclZhbHVlKHZhbHVlLCBIbWlab25lQ2FwYWJpbGl0aWVzLl9NQVApO1xuICAgIH1cbn1cblxuSG1pWm9uZUNhcGFiaWxpdGllcy5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0ZST05UJzogJ0ZST05UJyxcbiAgICAnQkFDSyc6ICdCQUNLJyxcblxufSk7XG5cbmV4cG9ydCB7IEhtaVpvbmVDYXBhYmlsaXRpZXMgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IFByZXJlY29yZGVkU3BlZWNoXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBQcmVyZWNvcmRlZFNwZWVjaCBleHRlbmRzIEVudW0ge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBIRUxQX0pJTkdMRSAoKSB7XG4gICAgICAgIHJldHVybiBQcmVyZWNvcmRlZFNwZWVjaC5fTUFQLkhFTFBfSklOR0xFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IElOSVRJQUxfSklOR0xFICgpIHtcbiAgICAgICAgcmV0dXJuIFByZXJlY29yZGVkU3BlZWNoLl9NQVAuSU5JVElBTF9KSU5HTEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTElTVEVOX0pJTkdMRSAoKSB7XG4gICAgICAgIHJldHVybiBQcmVyZWNvcmRlZFNwZWVjaC5fTUFQLkxJU1RFTl9KSU5HTEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUE9TSVRJVkVfSklOR0xFICgpIHtcbiAgICAgICAgcmV0dXJuIFByZXJlY29yZGVkU3BlZWNoLl9NQVAuUE9TSVRJVkVfSklOR0xFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5FR0FUSVZFX0pJTkdMRSAoKSB7XG4gICAgICAgIHJldHVybiBQcmVyZWNvcmRlZFNwZWVjaC5fTUFQLk5FR0FUSVZFX0pJTkdMRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gUHJlcmVjb3JkZWRTcGVlY2guX3ZhbHVlRm9yS2V5KGtleSwgUHJlcmVjb3JkZWRTcGVlY2guX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFByZXJlY29yZGVkU3BlZWNoLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgUHJlcmVjb3JkZWRTcGVlY2guX01BUCk7XG4gICAgfVxufVxuXG5QcmVyZWNvcmRlZFNwZWVjaC5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0hFTFBfSklOR0xFJzogJ0hFTFBfSklOR0xFJyxcbiAgICAnSU5JVElBTF9KSU5HTEUnOiAnSU5JVElBTF9KSU5HTEUnLFxuICAgICdMSVNURU5fSklOR0xFJzogJ0xJU1RFTl9KSU5HTEUnLFxuICAgICdQT1NJVElWRV9KSU5HTEUnOiAnUE9TSVRJVkVfSklOR0xFJyxcbiAgICAnTkVHQVRJVkVfSklOR0xFJzogJ05FR0FUSVZFX0pJTkdMRScsXG5cbn0pO1xuXG5leHBvcnQgeyBQcmVyZWNvcmRlZFNwZWVjaCB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gU2FtcGxpbmdSYXRlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBTYW1wbGluZ1JhdGUgZXh0ZW5kcyBFbnVtIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU2FtcGxpbmdSYXRlXzhLSFogKCkge1xuICAgICAgICByZXR1cm4gU2FtcGxpbmdSYXRlLl9NQVAuU2FtcGxpbmdSYXRlXzhLSFo7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU2FtcGxpbmdSYXRlXzE2S0haICgpIHtcbiAgICAgICAgcmV0dXJuIFNhbXBsaW5nUmF0ZS5fTUFQLlNhbXBsaW5nUmF0ZV8xNktIWjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTYW1wbGluZ1JhdGVfMjJLSFogKCkge1xuICAgICAgICByZXR1cm4gU2FtcGxpbmdSYXRlLl9NQVAuU2FtcGxpbmdSYXRlXzIyS0haO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNhbXBsaW5nUmF0ZV80NEtIWiAoKSB7XG4gICAgICAgIHJldHVybiBTYW1wbGluZ1JhdGUuX01BUC5TYW1wbGluZ1JhdGVfNDRLSFo7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFNhbXBsaW5nUmF0ZS5fdmFsdWVGb3JLZXkoa2V5LCBTYW1wbGluZ1JhdGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFNhbXBsaW5nUmF0ZS5fa2V5Rm9yVmFsdWUodmFsdWUsIFNhbXBsaW5nUmF0ZS5fTUFQKTtcbiAgICB9XG59XG5cbi8vIFdlIGhhdmUgdG8gdXNlIFNhbXBsaW5nUmF0ZV8gcHJlZml4IGluIHRoZSBuYW1lIGJlY2F1c2UgamF2YXNjcmlwdCB3aWxsIG5vdFxuLy8gYWxsb3cgdGhlIGVudW0gdG8gc3RhcnQgd2l0aCBhIG51bWJlclxuU2FtcGxpbmdSYXRlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnU2FtcGxpbmdSYXRlXzhLSFonOiAnOEtIWicsXG4gICAgJ1NhbXBsaW5nUmF0ZV8xNktIWic6ICcxNktIWicsXG4gICAgJ1NhbXBsaW5nUmF0ZV8yMktIWic6ICcyMktIWicsXG4gICAgJ1NhbXBsaW5nUmF0ZV80NEtIWic6ICc0NEtIWicsXG5cbn0pO1xuXG5leHBvcnQgeyBTYW1wbGluZ1JhdGUgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IEJpdHNQZXJTYW1wbGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIEJpdHNQZXJTYW1wbGUgZXh0ZW5kcyBFbnVtIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQml0c1BlclNhbXBsZV84X0JJVCAoKSB7XG4gICAgICAgIHJldHVybiBCaXRzUGVyU2FtcGxlLl9NQVAuQml0c1BlclNhbXBsZV84X0JJVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBCaXRzUGVyU2FtcGxlXzE2X0JJVCAoKSB7XG4gICAgICAgIHJldHVybiBCaXRzUGVyU2FtcGxlLl9NQVAuQml0c1BlclNhbXBsZV8xNl9CSVQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEJpdHNQZXJTYW1wbGUuX3ZhbHVlRm9yS2V5KGtleSwgQml0c1BlclNhbXBsZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gQml0c1BlclNhbXBsZS5fa2V5Rm9yVmFsdWUodmFsdWUsIEJpdHNQZXJTYW1wbGUuX01BUCk7XG4gICAgfVxufVxuXG5cbi8vIFdlIGhhdmUgdG8gdXNlIEJpdHNQZXJTYW1wbGVfIHByZWZpeCBpbiB0aGUgbmFtZSBiZWNhdXNlIGphdmFzY3JpcHQgd2lsbCBub3Rcbi8vIGFsbG93IHRoZSBlbnVtIHRvIHN0YXJ0IHdpdGggYSBudW1iZXJcbkJpdHNQZXJTYW1wbGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdCaXRzUGVyU2FtcGxlXzhfQklUJzogJzhfQklUJyxcbiAgICAnQml0c1BlclNhbXBsZV8xNl9CSVQnOiAnMTZfQklUJyxcblxufSk7XG5cbmV4cG9ydCB7IEJpdHNQZXJTYW1wbGUgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IEF1ZGlvVHlwZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgQXVkaW9UeXBlIGV4dGVuZHMgRW51bSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBDTSAoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb1R5cGUuX01BUC5QQ007XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvVHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBBdWRpb1R5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvVHlwZS5fa2V5Rm9yVmFsdWUodmFsdWUsIEF1ZGlvVHlwZS5fTUFQKTtcbiAgICB9XG59XG5cbkF1ZGlvVHlwZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ1BDTSc6ICdQQ00nLFxuXG59KTtcblxuZXhwb3J0IHsgQXVkaW9UeXBlIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBTYW1wbGluZ1JhdGUgfSBmcm9tICcuLi9lbnVtcy9TYW1wbGluZ1JhdGUuanMnO1xuaW1wb3J0IHsgQml0c1BlclNhbXBsZSB9IGZyb20gJy4uL2VudW1zL0JpdHNQZXJTYW1wbGUuanMnO1xuaW1wb3J0IHsgQXVkaW9UeXBlIH0gZnJvbSAnLi4vZW51bXMvQXVkaW9UeXBlLmpzJztcblxuY2xhc3MgQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcyBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1NhbXBsaW5nUmF0ZX0gc2FtcGxpbmdSYXRlXG4gICAgKiBAcmV0dXJuIHtBdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzfVxuICAgICovXG4gICAgc2V0U2FtcGxpbmdSYXRlIChzYW1wbGluZ1JhdGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU2FtcGxpbmdSYXRlLCBzYW1wbGluZ1JhdGUpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEF1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXMuS0VZX1NBTVBMSU5HX1JBVEUsIHNhbXBsaW5nUmF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U2FtcGxpbmdSYXRlfVxuICAgICovXG4gICAgZ2V0U2FtcGxpbmdSYXRlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFNhbXBsaW5nUmF0ZSwgQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcy5LRVlfU0FNUExJTkdfUkFURSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0JpdHNQZXJTYW1wbGV9IGJpdHNQZXJTYW1wbGVcbiAgICAqIEByZXR1cm4ge0F1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBzZXRCaXRzUGVyU2FtcGxlIChiaXRzUGVyU2FtcGxlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEJpdHNQZXJTYW1wbGUsIGJpdHNQZXJTYW1wbGUpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEF1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXMuS0VZX0JJVFNfUEVSX1NBTVBMRSwgYml0c1BlclNhbXBsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7Qml0c1BlclNhbXBsZX1cbiAgICAqL1xuICAgIGdldEJpdHNQZXJTYW1wbGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQml0c1BlclNhbXBsZSwgQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcy5LRVlfQklUU19QRVJfU0FNUExFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7QXVkaW9UeXBlfSBiaXRzUGVyU2FtcGxlXG4gICAgKiBAcmV0dXJuIHtBdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzfVxuICAgICovXG4gICAgc2V0QXVkaW9UeXBlIChhdWRpb1R5cGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQXVkaW9UeXBlLCBhdWRpb1R5cGUpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEF1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXMuS0VZX0FVRElPX1RZUEUsIGF1ZGlvVHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7QXVkaW9UeXBlfVxuICAgICovXG4gICAgZ2V0QXVkaW9UeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEF1ZGlvVHlwZSwgQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcy5LRVlfQVVESU9fVFlQRSk7XG4gICAgfVxufVxuXG5BdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzLktFWV9TQU1QTElOR19SQVRFID0gJ3NhbXBsaW5nUmF0ZSc7XG5BdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzLktFWV9CSVRTX1BFUl9TQU1QTEUgPSAnYml0c1BlclNhbXBsZSc7XG5BdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzLktFWV9BVURJT19UWVBFID0gJ2F1ZGlvVHlwZSc7XG5cbmV4cG9ydCB7IEF1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXMgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gVnJDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFZyQ2FwYWJpbGl0aWVzIGV4dGVuZHMgRW51bSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZSX1RFWFQgKCkge1xuICAgICAgICByZXR1cm4gVnJDYXBhYmlsaXRpZXMuX01BUC5WUl9URVhUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBWckNhcGFiaWxpdGllcy5fdmFsdWVGb3JLZXkoa2V5LCBWckNhcGFiaWxpdGllcy5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gVnJDYXBhYmlsaXRpZXMuX2tleUZvclZhbHVlKHZhbHVlLCBWckNhcGFiaWxpdGllcy5fTUFQKTtcbiAgICB9XG59XG5cblZyQ2FwYWJpbGl0aWVzLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnVlJfVEVYVCc6ICdURVhUJyxcbn0pO1xuXG5leHBvcnQgeyBWckNhcGFiaWxpdGllcyB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG5cbmNsYXNzIEhNSUNhcGFiaWxpdGllcyBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IG5hdmlnYXRpb25cbiAgICAqIEByZXR1cm4ge0hNSUNhcGFiaWxpdGllc31cbiAgICAqL1xuICAgIHNldE5hdmlnYXRpb24gKG5hdmlnYXRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSE1JQ2FwYWJpbGl0aWVzLktFWV9OQVZJR0FUSU9OLCBuYXZpZ2F0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0TmF2aWdhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihITUlDYXBhYmlsaXRpZXMuS0VZX05BVklHQVRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtCb29sZWFufSBwaG9uZUNhbGxcbiAgICAqIEByZXR1cm4ge0hNSUNhcGFiaWxpdGllc31cbiAgICAqL1xuICAgIHNldFBob25lQ2FsbCAocGhvbmVDYWxsKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEhNSUNhcGFiaWxpdGllcy5LRVlfUEhPTkVfQ0FMTCwgcGhvbmVDYWxsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0UGhvbmVDYWxsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEhNSUNhcGFiaWxpdGllcy5LRVlfUEhPTkVfQ0FMTCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IHZpZGVvU3RyZWFtaW5nXG4gICAgKiBAcmV0dXJuIHtITUlDYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBzZXRWaWRlb1N0cmVhbWluZyAodmlkZW9TdHJlYW1pbmcpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSE1JQ2FwYWJpbGl0aWVzLktFWV9WSURFT19TVFJFQU1JTkcsIHZpZGVvU3RyZWFtaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0VmlkZW9TdHJlYW1pbmcgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoSE1JQ2FwYWJpbGl0aWVzLktFWV9WSURFT19TVFJFQU1JTkcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtCb29sZWFufSByZW1vdGVDb250cm9sXG4gICAgKiBAcmV0dXJuIHtITUlDYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBzZXRSZW1vdGVDb250cm9sIChyZW1vdGVDb250cm9sKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEhNSUNhcGFiaWxpdGllcy5LRVlfUkVNT1RFX0NPTlRST0wsIHJlbW90ZUNvbnRyb2wpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgKi9cbiAgICBnZXRSZW1vdGVDb250cm9sICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEhNSUNhcGFiaWxpdGllcy5LRVlfUkVNT1RFX0NPTlRST0wpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtCb29sZWFufSBhcHBTZXJ2aWNlc1xuICAgICogQHJldHVybiB7SE1JQ2FwYWJpbGl0aWVzfVxuICAgICovXG4gICAgc2V0QXBwU2VydmljZSAoYXBwU2VydmljZXMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSE1JQ2FwYWJpbGl0aWVzLktFWV9BUFBfU0VSVklDRVMsIGFwcFNlcnZpY2VzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0QXBwU2VydmljZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihITUlDYXBhYmlsaXRpZXMuS0VZX0FQUF9TRVJWSUNFUyk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzcGxheXNcbiAgICAqIEByZXR1cm4ge0hNSUNhcGFiaWxpdGllc31cbiAgICAqL1xuICAgIHNldERpc3BsYXlzIChkaXNwbGF5cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihITUlDYXBhYmlsaXRpZXMuS0VZX0RJU1BMQVlTLCBkaXNwbGF5cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAqL1xuICAgIGdldERpc3BsYXlzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEhNSUNhcGFiaWxpdGllcy5LRVlfRElTUExBWVMpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IHNlYXRMb2NhdGlvblxuICAgICogQHJldHVybiB7SE1JQ2FwYWJpbGl0aWVzfVxuICAgICovXG4gICAgc2V0U2VhdExvY2F0aW9uIChzZWF0TG9jYXRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSE1JQ2FwYWJpbGl0aWVzLktFWV9TRUFUX0xPQ0FUSU9OLCBzZWF0TG9jYXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgKi9cbiAgICBnZXRTZWF0TG9jYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoSE1JQ2FwYWJpbGl0aWVzLktFWV9TRUFUX0xPQ0FUSU9OKTtcbiAgICB9XG59XG5cbkhNSUNhcGFiaWxpdGllcy5LRVlfTkFWSUdBVElPTiA9ICduYXZpZ2F0aW9uJztcbkhNSUNhcGFiaWxpdGllcy5LRVlfUEhPTkVfQ0FMTCA9ICdwaG9uZUNhbGwnO1xuSE1JQ2FwYWJpbGl0aWVzLktFWV9WSURFT19TVFJFQU1JTkcgPSAndmlkZW9TdHJlYW1pbmcnO1xuSE1JQ2FwYWJpbGl0aWVzLktFWV9SRU1PVEVfQ09OVFJPTCA9ICdyZW1vdGVDb250cm9sJztcbkhNSUNhcGFiaWxpdGllcy5LRVlfQVBQX1NFUlZJQ0VTID0gJ2FwcFNlcnZpY2VzJztcbkhNSUNhcGFiaWxpdGllcy5LRVlfRElTUExBWVMgPSAnZGlzcGxheXMnO1xuSE1JQ2FwYWJpbGl0aWVzLktFWV9TRUFUX0xPQ0FUSU9OID0gJ3NlYXRMb2NhdGlvbic7XG5cbmV4cG9ydCB7IEhNSUNhcGFiaWxpdGllcyB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgU2RsTXNnVmVyc2lvbiB9IGZyb20gJy4uL3N0cnVjdHMvU2RsTXNnVmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBEaXNwbGF5Q2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vc3RydWN0cy9EaXNwbGF5Q2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IEJ1dHRvbkNhcGFiaWxpdGllcyB9IGZyb20gJy4uL3N0cnVjdHMvQnV0dG9uQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IFNvZnRCdXR0b25DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9zdHJ1Y3RzL1NvZnRCdXR0b25DYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgUHJlc2V0QmFua0NhcGFiaWxpdGllcyB9IGZyb20gJy4uL3N0cnVjdHMvUHJlc2V0QmFua0NhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBWZWhpY2xlVHlwZSB9IGZyb20gJy4uL3N0cnVjdHMvVmVoaWNsZVR5cGUuanMnO1xuaW1wb3J0IHsgTGFuZ3VhZ2UgfSBmcm9tICcuLi9lbnVtcy9MYW5ndWFnZS5qcyc7XG5pbXBvcnQgeyBIbWlab25lQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vZW51bXMvSG1pWm9uZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBTcGVlY2hDYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9lbnVtcy9TcGVlY2hDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgUHJlcmVjb3JkZWRTcGVlY2ggfSBmcm9tICcuLi9lbnVtcy9QcmVyZWNvcmRlZFNwZWVjaC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBBdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vc3RydWN0cy9BdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IFZyQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vZW51bXMvVnJDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgSE1JQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vc3RydWN0cy9ITUlDYXBhYmlsaXRpZXMuanMnO1xuXG5jbGFzcyBSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuUmVnaXN0ZXJBcHBJbnRlcmZhY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTZGxNc2dWZXJzaW9ufSBUaGUgbWF4IFJQQyBTcGVjIHZlcnNpb24gc3VwcG9ydGVkIGJ5IHRoaXMgbGlicmFyeVxuICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX1cbiAgICAqL1xuICAgIHNldFNkbE1zZ1ZlcnNpb24gKHNkbE1zZ1ZlcnNpb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU2RsTXNnVmVyc2lvbiwgc2RsTXNnVmVyc2lvbik7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfU0RMX01TR19WRVJTSU9OLCBzZGxNc2dWZXJzaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTZGxNc2dWZXJzaW9ufVxuICAgICovXG4gICAgZ2V0U2RsTXNnVmVyc2lvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTZGxNc2dWZXJzaW9uLCBSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TRExfTVNHX1ZFUlNJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtMYW5ndWFnZX0gbGFuZ3VhZ2VcbiAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2V9XG4gICAgKi9cbiAgICBzZXRMYW5ndWFnZSAobGFuZ3VhZ2UpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTGFuZ3VhZ2UsIGxhbmd1YWdlKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9MQU5HVUFHRSwgbGFuZ3VhZ2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0xhbmd1YWdlfVxuICAgICovXG4gICAgZ2V0TGFuZ3VhZ2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTGFuZ3VhZ2UsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0xBTkdVQUdFKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtMYW5ndWFnZX0gaG1pRGlzcGxheUxhbmd1YWdlXG4gICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlfVxuICAgICovXG4gICAgc2V0SG1pRGlzcGxheUxhbmd1YWdlIChobWlEaXNwbGF5TGFuZ3VhZ2UpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTGFuZ3VhZ2UsIGhtaURpc3BsYXlMYW5ndWFnZSk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfSE1JX0RJU1BMQVlfTEFOR1VBR0UsIGhtaURpc3BsYXlMYW5ndWFnZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TGFuZ3VhZ2V9XG4gICAgKi9cbiAgICBnZXRIbWlEaXNwbGF5TGFuZ3VhZ2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTGFuZ3VhZ2UsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0hNSV9ESVNQTEFZX0xBTkdVQUdFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7RGlzcGxheUNhcGFiaWxpdGllc30gZGlzcGxheUNhcGFiaWxpdGllc1xuICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX1cbiAgICAqL1xuICAgIHNldERpc3BsYXlDYXBhYmlsaXRpZXMgKGRpc3BsYXlDYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoRGlzcGxheUNhcGFiaWxpdGllcywgZGlzcGxheUNhcGFiaWxpdGllcyk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfRElTUExBWV9DQVBBQklMSVRJRVMsIGRpc3BsYXlDYXBhYmlsaXRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0Rpc3BsYXlDYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBnZXREaXNwbGF5Q2FwYWJpbGl0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KERpc3BsYXlDYXBhYmlsaXRpZXMsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0RJU1BMQVlfQ0FQQUJJTElUSUVTKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtBcnJheTxCdXR0b25DYXBhYmlsaXRpZXM+fSBidXR0b25DYXBhYmlsaXRpZXNcbiAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2V9XG4gICAgKi9cbiAgICBzZXRCdXR0b25DYXBhYmlsaXRpZXMgKGJ1dHRvbkNhcGFiaWxpdGllcykge1xuICAgICAgICAvLyBUT0RPIG1ha2UgdGhpcyB3b3JrIHdpdGggYXJyYXlzXG4gICAgICAgIC8vIHRoaXMudmFsaWRhdGVUeXBlKExhbmd1YWdlLCBidXR0b25DYXBhYmlsaXRpZXMpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0JVVFRPTl9DQVBBQklMSVRJRVMsIGJ1dHRvbkNhcGFiaWxpdGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7QXJyYXk8QnV0dG9uQ2FwYWJpbGl0aWVzPn1cbiAgICAqL1xuICAgIGdldEJ1dHRvbkNhcGFiaWxpdGllcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChCdXR0b25DYXBhYmlsaXRpZXMsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0JVVFRPTl9DQVBBQklMSVRJRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtBcnJheTxTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzPn0gc29mdEJ1dHRvbkNhcGFiaWxpdGllc1xuICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX1cbiAgICAqL1xuICAgIHNldFNvZnRCdXR0b25DYXBhYmlsaXRpZXMgKHNvZnRCdXR0b25DYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgLy8gVE9ETyBtYWtlIHRoaXMgd29yayB3aXRoIGFycmF5c1xuICAgICAgICAvLyB0aGlzLnZhbGlkYXRlVHlwZShTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLCBzb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TT0ZUX0JVVFRPTl9DQVBBQklMSVRJRVMsIHNvZnRCdXR0b25DYXBhYmlsaXRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0FycmF5PFNvZnRCdXR0b25DYXBhYmlsaXRpZXM+fVxuICAgICovXG4gICAgZ2V0U29mdEJ1dHRvbkNhcGFiaWxpdGllcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLCBSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TT0ZUX0JVVFRPTl9DQVBBQklMSVRJRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzfSBwcmVzZXRCYW5rQ2FwYWJpbGl0aWVzXG4gICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlfVxuICAgICovXG4gICAgc2V0UHJlc2V0QmFua0NhcGFiaWxpdGllcyAocHJlc2V0QmFua0NhcGFiaWxpdGllcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzLCBwcmVzZXRCYW5rQ2FwYWJpbGl0aWVzKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9QUkVTRVRfQkFOS19DQVBBQklMSVRJRVMsIHByZXNldEJhbmtDYXBhYmlsaXRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1ByZXNldEJhbmtDYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBnZXRQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFByZXNldEJhbmtDYXBhYmlsaXRpZXMsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1BSRVNFVF9CQU5LX0NBUEFCSUxJVElFUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0FycmF5PEhtaVpvbmVDYXBhYmlsaXRpZXM+fSBobWlab25lQ2FwYWJpbGl0aWVzXG4gICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlfVxuICAgICovXG4gICAgc2V0SG1pWm9uZUNhcGFiaWxpdGllcyAoaG1pWm9uZUNhcGFiaWxpdGllcykge1xuICAgICAgICAvLyBUT0RPIG1ha2UgdGhpcyB3b3JrIGZvciBhcnJheXNcbiAgICAgICAgLy8gdGhpcy52YWxpZGF0ZVR5cGUoSG1pWm9uZUNhcGFiaWxpdGllcywgaG1pWm9uZUNhcGFiaWxpdGllcyk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfSE1JX1pPTkVfQ0FQQUJJTElUSUVTLCBobWlab25lQ2FwYWJpbGl0aWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtBcnJheTxIbWlab25lQ2FwYWJpbGl0aWVzPn1cbiAgICAqL1xuICAgIGdldEhtaVpvbmVDYXBhYmlsaXRpZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSG1pWm9uZUNhcGFiaWxpdGllcywgUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfSE1JX1pPTkVfQ0FQQUJJTElUSUVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7QXJyYXk8U3BlZWNoQ2FwYWJpbGl0aWVzPn0gc3BlZWNoQ2FwYWJpbGl0aWVzXG4gICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlfVxuICAgICovXG4gICAgc2V0U3BlZWNoQ2FwYWJpbGl0aWVzIChzcGVlY2hDYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgLy8gVE9ETyBtYWtlIHRoaXMgd29yayBmb3IgYXJyYXlzXG4gICAgICAgIC8vIHRoaXMudmFsaWRhdGVUeXBlKFNwZWVjaENhcGFiaWxpdGllcywgc3BlZWNoQ2FwYWJpbGl0aWVzKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TUEVFQ0hfQ0FQQUJJTElUSUVTLCBzcGVlY2hDYXBhYmlsaXRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0FycmF5PFNwZWVjaENhcGFiaWxpdGllcz59XG4gICAgKi9cbiAgICBnZXRTcGVlY2hDYXBhYmlsaXRpZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoU3BlZWNoQ2FwYWJpbGl0aWVzLCBSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TUEVFQ0hfQ0FQQUJJTElUSUVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7QXJyYXk8UHJlcmVjb3JkZWRTcGVlY2g+fSBzcGVlY2hDYXBhYmlsaXRpZXNcbiAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2V9XG4gICAgKi9cbiAgICBzZXRQcmVyZWNvcmRlZFNwZWVjaCAoc3BlZWNoQ2FwYWJpbGl0aWVzKSB7XG4gICAgICAgIC8vIFRPRE8gbWFrZSB0aGlzIHdvcmsgZm9yIGFycmF5c1xuICAgICAgICAvLyB0aGlzLnZhbGlkYXRlVHlwZShQcmVyZWNvcmRlZFNwZWVjaCwgc3BlZWNoQ2FwYWJpbGl0aWVzKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9QUkVSRUNPUkRFRF9TUEVFQ0gsIHNwZWVjaENhcGFiaWxpdGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7QXJyYXk8UHJlcmVjb3JkZWRTcGVlY2g+fVxuICAgICovXG4gICAgZ2V0UHJlcmVjb3JkZWRTcGVlY2ggKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoUHJlcmVjb3JkZWRTcGVlY2gsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1BSRVJFQ09SREVEX1NQRUVDSCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0FycmF5PFZyQ2FwYWJpbGl0aWVzPn0gdnJDYXBhYmlsaXRpZXNcbiAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2V9XG4gICAgKi9cbiAgICBzZXRWckNhcGFiaWxpdGllcyAodnJDYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgLy8gVE9ETyBtYWtlIHRoaXMgd29yayBmb3IgYXJyYXlzXG4gICAgICAgIC8vIHRoaXMudmFsaWRhdGVUeXBlKFZyQ2FwYWJpbGl0aWVzLCB2ckNhcGFiaWxpdGllcyk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfVlJfQ0FQQUJJTElUSUVTLCB2ckNhcGFiaWxpdGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7QXJyYXk8VnJDYXBhYmlsaXRpZXM+fVxuICAgICovXG4gICAgZ2V0VnJDYXBhYmlsaXRpZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVnJDYXBhYmlsaXRpZXMsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1ZSX0NBUEFCSUxJVElFUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0FycmF5PEF1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXM+fSBhdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzXG4gICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlfVxuICAgICovXG4gICAgc2V0QXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcyAoYXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcykge1xuICAgICAgICAvLyBUT0RPIG1ha2UgdGhpcyB3b3JrIGZvciBhcnJheXNcbiAgICAgICAgLy8gdGhpcy52YWxpZGF0ZVR5cGUoQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcywgYXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcyk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfQVVESU9fUEFTU19USFJVX0NBUEFCSUxJVElFUywgYXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7QXJyYXk8QXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcz59XG4gICAgKi9cbiAgICBnZXRBdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEF1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXMsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0FVRElPX1BBU1NfVEhSVV9DQVBBQklMSVRJRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtBdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzfSBwY21TdHJlYW1DYXBhYmlsaXRpZXNcbiAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2V9XG4gICAgKi9cbiAgICBzZXRQY21TdHJlYW1DYXBhYmlsaXRpZXMgKHBjbVN0cmVhbUNhcGFiaWxpdGllcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShBdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzLCBwY21TdHJlYW1DYXBhYmlsaXRpZXMpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1BDTV9TVFJFQU1fQ0FQQUJJTElUSUVTLCBwY21TdHJlYW1DYXBhYmlsaXRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0F1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXN9XG4gICAgKi9cbiAgICBnZXRQY21TdHJlYW1DYXBhYmlsaXRpZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcywgUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfUENNX1NUUkVBTV9DQVBBQklMSVRJRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtWZWhpY2xlVHlwZX0gdmVoaWNsZVR5cGVcbiAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2V9XG4gICAgKi9cbiAgICBzZXRWZWhpY2xlVHlwZSAodmVoaWNsZVR5cGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZVR5cGUsIHZlaGljbGVUeXBlKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9WRUhJQ0xFX1RZUEUsIHZlaGljbGVUeXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtWZWhpY2xlVHlwZX1cbiAgICAqL1xuICAgIGdldFZlaGljbGVUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVUeXBlLCBSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9WRUhJQ0xFX1RZUEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtOdW1iZXJ9IHN1cHBvcnRlZERpYWdNb2Rlc1xuICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX1cbiAgICAqL1xuICAgIHNldFN1cHBvcnRlZERpYWdNb2RlcyAoc3VwcG9ydGVkRGlhZ01vZGVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1NVUFBPUlRFRF9ESUFHX01PREUsIHN1cHBvcnRlZERpYWdNb2Rlcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgZ2V0U3VwcG9ydGVkRGlhZ01vZGVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1NVUFBPUlRFRF9ESUFHX01PREUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtITUlDYXBhYmlsaXRpZXN9IGhtaUNhcGFiaWxpdGllc1xuICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX1cbiAgICAqL1xuICAgIHNldEhNSUNhcGFiaWxpdGllcyAoaG1pQ2FwYWJpbGl0aWVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEhNSUNhcGFiaWxpdGllcywgaG1pQ2FwYWJpbGl0aWVzKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9ITUlfQ0FQQUJJTElUSUVTLCBobWlDYXBhYmlsaXRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0hNSUNhcGFiaWxpdGllc31cbiAgICAqL1xuICAgIGdldEhNSUNhcGFiaWxpdGllcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChITUlDYXBhYmlsaXRpZXMsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0hNSV9DQVBBQklMSVRJRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHNkbFZlcnNpb25cbiAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2V9XG4gICAgKi9cbiAgICBzZXRTZGxWZXJzaW9uIChzZGxWZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1NETF9WRVJTSU9OLCBzZGxWZXJzaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBnZXRTZGxWZXJzaW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1NETF9WRVJTSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBzeXN0ZW1Tb2Z0d2FyZVZlcnNpb25cbiAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2V9XG4gICAgKi9cbiAgICBzZXRTeXN0ZW1Tb2Z0d2FyZVZlcnNpb24gKHN5c3RlbVNvZnR3YXJlVmVyc2lvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TWVNURU1fU09GVFdBUkVfVkVSU0lPTiwgc3lzdGVtU29mdHdhcmVWZXJzaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBnZXRTeXN0ZW1Tb2Z0d2FyZVZlcnNpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfU1lTVEVNX1NPRlRXQVJFX1ZFUlNJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtCb29sZWFufSBpY29uUmVzdW1lZFxuICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX1cbiAgICAqL1xuICAgIHNldEljb25SZXN1bWVkIChpY29uUmVzdW1lZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9JQ09OX1JFU1VNRUQsIGljb25SZXN1bWVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0SWNvblJlc3VtZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfSUNPTl9SRVNVTUVEKTtcbiAgICB9XG59XG5cblJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1NETF9NU0dfVkVSU0lPTiA9ICdzeW5jTXNnVmVyc2lvbic7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9MQU5HVUFHRSA9ICdsYW5ndWFnZSc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9ITUlfRElTUExBWV9MQU5HVUFHRSA9ICdobWlEaXNwbGF5TGFuZ3VhZ2UnO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfRElTUExBWV9DQVBBQklMSVRJRVMgPSAnZGlzcGxheUNhcGFiaWxpdGllcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9CVVRUT05fQ0FQQUJJTElUSUVTID0gJ2J1dHRvbkNhcGFiaWxpdGllcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TT0ZUX0JVVFRPTl9DQVBBQklMSVRJRVMgPSAnc29mdEJ1dHRvbkNhcGFiaWxpdGllcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9QUkVTRVRfQkFOS19DQVBBQklMSVRJRVMgPSAncHJlc2V0QmFua0NhcGFiaWxpdGllcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9ITUlfWk9ORV9DQVBBQklMSVRJRVMgPSAnaG1pWm9uZUNhcGFiaWxpdGllcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TUEVFQ0hfQ0FQQUJJTElUSUVTID0gJ3NwZWVjaENhcGFiaWxpdGllcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9QUkVSRUNPUkRFRF9TUEVFQ0ggPSAncHJlcmVjb3JkZWRTcGVlY2gnO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfVlJfQ0FQQUJJTElUSUVTID0gJ3ZyQ2FwYWJpbGl0aWVzJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0FVRElPX1BBU1NfVEhSVV9DQVBBQklMSVRJRVMgPSAnYXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9QQ01fU1RSRUFNX0NBUEFCSUxJVElFUyA9ICdwY21TdHJlYW1DYXBhYmlsaXRpZXMnO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfVkVISUNMRV9UWVBFID0gJ3ZlaGljbGVUeXBlJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1NVUFBPUlRFRF9ESUFHX01PREUgPSAnc3VwcG9ydGVkRGlhZ01vZGVzJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0hNSV9DQVBBQklMSVRJRVMgPSAnaG1pQ2FwYWJpbGl0aWVzJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1NETF9WRVJTSU9OID0gJ3NkbFZlcnNpb24nO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfU1lTVEVNX1NPRlRXQVJFX1ZFUlNJT04gPSAnc3lzdGVtU29mdHdhcmVWZXJzaW9uJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0lDT05fUkVTVU1FRCA9ICdpY29uUmVzdW1lZCc7XG5cbmV4cG9ydCB7IFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbmNsYXNzIFNldEFwcEljb24gZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5TZXRBcHBJY29uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlTmFtZVxuICAgICogQHJldHVybiB7U2V0QXBwSWNvbn1cbiAgICAqL1xuICAgIHNldEZpbGVOYW1lIChmaWxlTmFtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZXRBcHBJY29uLktFWV9GSUxFX05BTUUsIGZpbGVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBnZXRGaWxlTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZXRBcHBJY29uLktFWV9GSUxFX05BTUUpO1xuICAgIH1cbn1cblxuU2V0QXBwSWNvbi5LRVlfRklMRV9OQU1FID0gJ3N5bmNGaWxlTmFtZSc7XG5cblxuZXhwb3J0IHsgU2V0QXBwSWNvbiB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG5jbGFzcyBTZXRBcHBJY29uUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuU2V0QXBwSWNvbik7XG4gICAgfVxufVxuXG5leHBvcnQgeyBTZXRBcHBJY29uUmVzcG9uc2UgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gU29mdEJ1dHRvblR5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFNvZnRCdXR0b25UeXBlIGV4dGVuZHMgRW51bSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNCVF9URVhUICgpIHtcbiAgICAgICAgcmV0dXJuIFNvZnRCdXR0b25UeXBlLl9NQVAuU0JUX1RFWFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU0JUX0lNQUdFICgpIHtcbiAgICAgICAgcmV0dXJuIFNvZnRCdXR0b25UeXBlLl9NQVAuU0JUX0lNQUdFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNCVF9CT1RIICgpIHtcbiAgICAgICAgcmV0dXJuIFNvZnRCdXR0b25UeXBlLl9NQVAuU0JUX0JPVEg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFNvZnRCdXR0b25UeXBlLl92YWx1ZUZvcktleShrZXksIFNvZnRCdXR0b25UeXBlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBTb2Z0QnV0dG9uVHlwZS5fa2V5Rm9yVmFsdWUodmFsdWUsIFNvZnRCdXR0b25UeXBlLl9NQVApO1xuICAgIH1cbn1cblxuU29mdEJ1dHRvblR5cGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdTQlRfVEVYVCc6ICdURVhUJyxcbiAgICAnU0JUX0lNQUdFJzogJ0lNQUdFJyxcbiAgICAnU0JUX0JPVEgnOiAnQk9USCcsXG5cbn0pO1xuXG5leHBvcnQgeyBTb2Z0QnV0dG9uVHlwZSB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gU3lzdGVtQWN0aW9uXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBTeXN0ZW1BY3Rpb24gZXh0ZW5kcyBFbnVtIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgREVGQVVMVF9BQ1RJT04gKCkge1xuICAgICAgICByZXR1cm4gU3lzdGVtQWN0aW9uLl9NQVAuREVGQVVMVF9BQ1RJT047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU1RFQUxfRk9DVVMgKCkge1xuICAgICAgICByZXR1cm4gU3lzdGVtQWN0aW9uLl9NQVAuU1RFQUxfRk9DVVM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgS0VFUF9DT05URVhUICgpIHtcbiAgICAgICAgcmV0dXJuIFN5c3RlbUFjdGlvbi5fTUFQLktFRVBfQ09OVEVYVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gU3lzdGVtQWN0aW9uLl92YWx1ZUZvcktleShrZXksIFN5c3RlbUFjdGlvbi5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gU3lzdGVtQWN0aW9uLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgU3lzdGVtQWN0aW9uLl9NQVApO1xuICAgIH1cbn1cblxuU3lzdGVtQWN0aW9uLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnREVGQVVMVF9BQ1RJT04nOiAnREVGQVVMVF9BQ1RJT04nLFxuICAgICdTVEVBTF9GT0NVUyc6ICdTVEVBTF9GT0NVUycsXG4gICAgJ0tFRVBfQ09OVEVYVCc6ICdLRUVQX0NPTlRFWFQnLFxuXG59KTtcblxuZXhwb3J0IHsgU3lzdGVtQWN0aW9uIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBTb2Z0QnV0dG9uVHlwZSB9IGZyb20gJy4uL2VudW1zL1NvZnRCdXR0b25UeXBlLmpzJztcbmltcG9ydCB7IFN5c3RlbUFjdGlvbiB9IGZyb20gJy4uL2VudW1zL1N5c3RlbUFjdGlvbi5qcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJy4vSW1hZ2UuanMnO1xuXG5cbmNsYXNzIFNvZnRCdXR0b24gZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTb2Z0QnV0dG9uVHlwZX0gdHlwZVxuICAgICogQHJldHVybiB7U29mdEJ1dHRvbn1cbiAgICAqL1xuICAgIHNldFR5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU29mdEJ1dHRvblR5cGUsIHR5cGUpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNvZnRCdXR0b24uS0VZX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1NvZnRCdXR0b25UeXBlfVxuICAgICovXG4gICAgZ2V0VHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTb2Z0QnV0dG9uVHlwZSwgU29mdEJ1dHRvbi5LRVlfVFlQRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dFxuICAgICogQHJldHVybiB7U29mdEJ1dHRvbn1cbiAgICAqL1xuICAgIHNldFRleHQgKHRleHQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU29mdEJ1dHRvbi5LRVlfVEVYVCwgdGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0VGV4dCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTb2Z0QnV0dG9uLktFWV9URVhUKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7SW1hZ2V9IGltYWdlXG4gICAgKiBAcmV0dXJuIHtTb2Z0QnV0dG9ufVxuICAgICovXG4gICAgc2V0SW1hZ2UgKGltYWdlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEltYWdlLCBpbWFnZSk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU29mdEJ1dHRvbi5LRVlfSU1BR0UsIGltYWdlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtJbWFnZX1cbiAgICAqL1xuICAgIGdldEltYWdlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEltYWdlLCBTb2Z0QnV0dG9uLktFWV9JTUFHRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzSGlnaGxpZ2h0ZWRcbiAgICAqIEByZXR1cm4ge1NvZnRCdXR0b259XG4gICAgKi9cbiAgICBzZXRJc0hpZ2hsaWdodGVkIChpc0hpZ2hsaWdodGVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNvZnRCdXR0b24uS0VZX0lTX0hJR0hMSUdIVEVELCBpc0hpZ2hsaWdodGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0SXNIaWdobGlnaHRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTb2Z0QnV0dG9uLktFWV9JU19ISUdITElHSFRFRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gc29mdEJ1dHRvbklEXG4gICAgKiBAcmV0dXJuIHtTb2Z0QnV0dG9ufVxuICAgICovXG4gICAgc2V0U29mdEJ1dHRvbklEIChzb2Z0QnV0dG9uSUQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU29mdEJ1dHRvbi5LRVlfU09GVF9CVVRUT05fSUQsIHNvZnRCdXR0b25JRCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgZ2V0U29mdEJ1dHRvbklEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNvZnRCdXR0b24uS0VZX1NPRlRfQlVUVE9OX0lEKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTeXN0ZW1BY3Rpb259IHN5c3RlbUFjdGlvblxuICAgICogQHJldHVybiB7U29mdEJ1dHRvbn1cbiAgICAqL1xuICAgIHNldFN5c3RlbUFjdGlvbiAoc3lzdGVtQWN0aW9uKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFN5c3RlbUFjdGlvbiwgc3lzdGVtQWN0aW9uKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTb2Z0QnV0dG9uLktFWV9TWVNURU1fQUNUSU9OLCBzeXN0ZW1BY3Rpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N5c3RlbUFjdGlvbn1cbiAgICAqL1xuICAgIGdldFN5c3RlbUFjdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTeXN0ZW1BY3Rpb24sIFNvZnRCdXR0b24uS0VZX1NZU1RFTV9BQ1RJT04pO1xuICAgIH1cbn1cblxuU29mdEJ1dHRvbi5LRVlfVFlQRSA9ICd0eXBlJztcblNvZnRCdXR0b24uS0VZX1RFWFQgPSAndGV4dCc7XG5Tb2Z0QnV0dG9uLktFWV9JTUFHRSA9ICdpbWFnZSc7XG5Tb2Z0QnV0dG9uLktFWV9JU19ISUdITElHSFRFRCA9ICdpc0hpZ2hsaWdodGVkJztcblNvZnRCdXR0b24uS0VZX1NPRlRfQlVUVE9OX0lEID0gJ3NvZnRCdXR0b25JRCc7XG5Tb2Z0QnV0dG9uLktFWV9TWVNURU1fQUNUSU9OID0gJ3N5c3RlbUFjdGlvbic7XG5cbmV4cG9ydCB7IFNvZnRCdXR0b24gfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gTWV0YWRhdGFUeXBlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBNZXRhZGF0YVR5cGUgZXh0ZW5kcyBFbnVtIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgbWVkaWFUaXRsZSAoKSB7XG4gICAgICAgIHJldHVybiBNZXRhZGF0YVR5cGUuX01BUC5tZWRpYVRpdGxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IG1lZGlhQXJ0aXN0ICgpIHtcbiAgICAgICAgcmV0dXJuIE1ldGFkYXRhVHlwZS5fTUFQLm1lZGlhQXJ0aXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IG1lZGlhQWxidW0gKCkge1xuICAgICAgICByZXR1cm4gTWV0YWRhdGFUeXBlLl9NQVAubWVkaWFBbGJ1bTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBtZWRpYVllYXIgKCkge1xuICAgICAgICByZXR1cm4gTWV0YWRhdGFUeXBlLl9NQVAubWVkaWFZZWFyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IG1lZGlhR2VucmUgKCkge1xuICAgICAgICByZXR1cm4gTWV0YWRhdGFUeXBlLl9NQVAubWVkaWFHZW5yZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBtZWRpYVN0YXRpb24gKCkge1xuICAgICAgICByZXR1cm4gTWV0YWRhdGFUeXBlLl9NQVAubWVkaWFTdGF0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IHJhdGluZyAoKSB7XG4gICAgICAgIHJldHVybiBNZXRhZGF0YVR5cGUuX01BUC5yYXRpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgY3VycmVudFRlbXBlcmF0dXJlICgpIHtcbiAgICAgICAgcmV0dXJuIE1ldGFkYXRhVHlwZS5fTUFQLmN1cnJlbnRUZW1wZXJhdHVyZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBtYXhpbXVtVGVtcGVyYXR1cmUgKCkge1xuICAgICAgICByZXR1cm4gTWV0YWRhdGFUeXBlLl9NQVAubWF4aW11bVRlbXBlcmF0dXJlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IG1pbmltdW1UZW1wZXJhdHVyZSAoKSB7XG4gICAgICAgIHJldHVybiBNZXRhZGF0YVR5cGUuX01BUC5taW5pbXVtVGVtcGVyYXR1cmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgd2VhdGhlclRlcm0gKCkge1xuICAgICAgICByZXR1cm4gTWV0YWRhdGFUeXBlLl9NQVAud2VhdGhlclRlcm07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgaHVtaWRpdHkgKCkge1xuICAgICAgICByZXR1cm4gTWV0YWRhdGFUeXBlLl9NQVAuaHVtaWRpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIE1ldGFkYXRhVHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBNZXRhZGF0YVR5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIE1ldGFkYXRhVHlwZS5fa2V5Rm9yVmFsdWUodmFsdWUsIE1ldGFkYXRhVHlwZS5fTUFQKTtcbiAgICB9XG59XG5cbk1ldGFkYXRhVHlwZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ21lZGlhVGl0bGUnOiAnbWVkaWFUaXRsZScsXG4gICAgJ21lZGlhQXJ0aXN0JzogJ21lZGlhQXJ0aXN0JyxcbiAgICAnbWVkaWFBbGJ1bSc6ICdtZWRpYUFsYnVtJyxcbiAgICAnbWVkaWFZZWFyJzogJ21lZGlhWWVhcicsXG4gICAgJ21lZGlhR2VucmUnOiAnbWVkaWFHZW5yZScsXG4gICAgJ21lZGlhU3RhdGlvbic6ICdtZWRpYVN0YXRpb24nLFxuICAgICdyYXRpbmcnOiAncmF0aW5nJyxcbiAgICAnY3VycmVudFRlbXBlcmF0dXJlJzogJ2N1cnJlbnRUZW1wZXJhdHVyZScsXG4gICAgJ21heGltdW1UZW1wZXJhdHVyZSc6ICdtYXhpbXVtVGVtcGVyYXR1cmUnLFxuICAgICdtaW5pbXVtVGVtcGVyYXR1cmUnOiAnbWluaW11bVRlbXBlcmF0dXJlJyxcbiAgICAnd2VhdGhlclRlcm0nOiAnd2VhdGhlclRlcm0nLFxuICAgICdodW1pZGl0eSc6ICdodW1pZGl0eScsXG5cbn0pO1xuXG5leHBvcnQgeyBNZXRhZGF0YVR5cGUgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFUeXBlIH0gZnJvbSAnLi4vZW51bXMvTWV0YWRhdGFUeXBlLmpzJztcblxuY2xhc3MgTWV0YWRhdGFUYWdzIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0FycmF5PE1ldGFkYXRhVHlwZT59IG1haW5GaWVsZDFcbiAgICAqIEByZXR1cm4ge01ldGFkYXRhVGFnc31cbiAgICAqL1xuICAgIHNldE1haW5GaWVsZDEgKG1haW5GaWVsZDEpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTWV0YWRhdGFUYWdzLktFWV9NQUlOX0ZJRUxEXzEsIG1haW5GaWVsZDEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0FycmF5PE1ldGFkYXRhVHlwZT59XG4gICAgKi9cbiAgICBnZXRNYWluRmllbGQxICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFUYWdzLktFWV9NQUlOX0ZJRUxEXzEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtBcnJheTxNZXRhZGF0YVR5cGU+fSBtYWluRmllbGQyXG4gICAgKiBAcmV0dXJuIHtNZXRhZGF0YVRhZ3N9XG4gICAgKi9cbiAgICBzZXRNYWluRmllbGQyIChtYWluRmllbGQyKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE1ldGFkYXRhVGFncy5LRVlfTUFJTl9GSUVMRF8yLCBtYWluRmllbGQyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtBcnJheTxNZXRhZGF0YVR5cGU+fVxuICAgICovXG4gICAgZ2V0TWFpbkZpZWxkMiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNZXRhZGF0YVR5cGUsIE1ldGFkYXRhVGFncy5LRVlfTUFJTl9GSUVMRF8yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7QXJyYXk8TWV0YWRhdGFUeXBlPn0gbWFpbkZpZWxkM1xuICAgICogQHJldHVybiB7TWV0YWRhdGFUYWdzfVxuICAgICovXG4gICAgc2V0TWFpbkZpZWxkMyAobWFpbkZpZWxkMykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihNZXRhZGF0YVRhZ3MuS0VZX01BSU5fRklFTERfMywgbWFpbkZpZWxkMyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7QXJyYXk8TWV0YWRhdGFUeXBlPn1cbiAgICAqL1xuICAgIGdldE1haW5GaWVsZDMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTWV0YWRhdGFUeXBlLCBNZXRhZGF0YVRhZ3MuS0VZX01BSU5fRklFTERfMyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0FycmF5PE1ldGFkYXRhVHlwZT59IG1haW5GaWVsZDRcbiAgICAqIEByZXR1cm4ge01ldGFkYXRhVGFnc31cbiAgICAqL1xuICAgIHNldE1haW5GaWVsZDQgKG1haW5GaWVsZDQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTWV0YWRhdGFUYWdzLktFWV9NQUlOX0ZJRUxEXzQsIG1haW5GaWVsZDQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0FycmF5PE1ldGFkYXRhVHlwZT59XG4gICAgKi9cbiAgICBnZXRNYWluRmllbGQ0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFUYWdzLktFWV9NQUlOX0ZJRUxEXzQpO1xuICAgIH1cbn1cblxuTWV0YWRhdGFUYWdzLktFWV9NQUlOX0ZJRUxEXzEgPSAnbWFpbkZpZWxkMSc7XG5NZXRhZGF0YVRhZ3MuS0VZX01BSU5fRklFTERfMiA9ICdtYWluRmllbGQyJztcbk1ldGFkYXRhVGFncy5LRVlfTUFJTl9GSUVMRF8zID0gJ21haW5GaWVsZDMnO1xuTWV0YWRhdGFUYWdzLktFWV9NQUlOX0ZJRUxEXzQgPSAnbWFpbkZpZWxkNCc7XG5cbmV4cG9ydCB7IE1ldGFkYXRhVGFncyB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBUZXh0QWxpZ25tZW50XG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBUZXh0QWxpZ25tZW50IGV4dGVuZHMgRW51bSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBMRUZUX0FMSUdORUQgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEFsaWdubWVudC5fTUFQLkxFRlRfQUxJR05FRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgUklHSFRfQUxJR05FRCAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0QWxpZ25tZW50Ll9NQVAuUklHSFRfQUxJR05FRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ0VOVEVSRUQgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEFsaWdubWVudC5fTUFQLkNFTlRFUkVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBUZXh0QWxpZ25tZW50Ll92YWx1ZUZvcktleShrZXksIFRleHRBbGlnbm1lbnQuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFRleHRBbGlnbm1lbnQuX2tleUZvclZhbHVlKHZhbHVlLCBUZXh0QWxpZ25tZW50Ll9NQVApO1xuICAgIH1cbn1cblxuVGV4dEFsaWdubWVudC5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0xFRlRfQUxJR05FRCc6ICdMRUZUX0FMSUdORUQnLFxuICAgICdSSUdIVF9BTElHTkVEJzogJ1JJR0hUX0FMSUdORUQnLFxuICAgICdDRU5URVJFRCc6ICdDRU5URVJFRCcsXG5cblxufSk7XG5cbmV4cG9ydCB7IFRleHRBbGlnbm1lbnQgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgU29mdEJ1dHRvbiB9IGZyb20gJy4uL3N0cnVjdHMvU29mdEJ1dHRvbi5qcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJy4uL3N0cnVjdHMvSW1hZ2UuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFUYWdzIH0gZnJvbSAnLi4vc3RydWN0cy9NZXRhZGF0YVRhZ3MuanMnO1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBUZXh0QWxpZ25tZW50IH0gZnJvbSAnLi4vZW51bXMvVGV4dEFsaWdubWVudC5qcyc7XG5cbmNsYXNzIFNob3cgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5TaG93KTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IG1haW5GaWVsZDFcbiAgICAqIEByZXR1cm4ge1Nob3d9XG4gICAgKi9cbiAgICBzZXRNYWluRmllbGQxIChtYWluRmllbGQxKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX01BSU5fRklFTERfMSwgbWFpbkZpZWxkMSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0TWFpbkZpZWxkMSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTaG93LktFWV9NQUlOX0ZJRUxEXzEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IG1haW5GaWVsZDJcbiAgICAqIEByZXR1cm4ge1Nob3d9XG4gICAgKi9cbiAgICBzZXRNYWluRmllbGQyIChtYWluRmllbGQyKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX01BSU5fRklFTERfMiwgbWFpbkZpZWxkMik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0TWFpbkZpZWxkMiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTaG93LktFWV9NQUlOX0ZJRUxEXzIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IG1haW5GaWVsZDNcbiAgICAqIEByZXR1cm4ge1Nob3d9XG4gICAgKi9cbiAgICBzZXRNYWluRmllbGQzIChtYWluRmllbGQzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX01BSU5fRklFTERfMywgbWFpbkZpZWxkMyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0TWFpbkZpZWxkMyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTaG93LktFWV9NQUlOX0ZJRUxEXzMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IG1haW5GaWVsZDRcbiAgICAqIEByZXR1cm4ge1Nob3d9XG4gICAgKi9cbiAgICBzZXRNYWluRmllbGQ0IChtYWluRmllbGQ0KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX01BSU5fRklFTERfNCwgbWFpbkZpZWxkNCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0TWFpbkZpZWxkNCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTaG93LktFWV9NQUlOX0ZJRUxEXzQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtUZXh0QWxpZ25tZW50fSBtZW51UGFyYW1zXG4gICAgKiBAcmV0dXJuIHtTaG93fVxuICAgICovXG4gICAgc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVGV4dEFsaWdubWVudCwgYWxpZ25tZW50KTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaG93LktFWV9BTElHTk1FTlQsIGFsaWdubWVudCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7VGV4dEFsaWdubWVudH1cbiAgICAqL1xuICAgIGdldEFsaWdubWVudCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUZXh0QWxpZ25tZW50LCBTaG93LktFWV9BTElHTk1FTlQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHN0YXR1c0JhclxuICAgICogQHJldHVybiB7U2hvd31cbiAgICAqL1xuICAgIHNldFN0YXR1c0JhciAoc3RhdHVzQmFyKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX1NUQVRVU19CQVIsIHN0YXR1c0Jhcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0U3RhdHVzQmFyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNob3cuS0VZX1NUQVRVU19CQVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IG1lZGlhQ2xvY2tcbiAgICAqIEByZXR1cm4ge1Nob3d9XG4gICAgKi9cbiAgICBzZXRNZWRpYUNsb2NrIChtZWRpYUNsb2NrKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX01FRElBX0NMT0NLLCBtZWRpYUNsb2NrKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBnZXRNZWRpYUNsb2NrICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNob3cuS0VZX01FRElBX0NMT0NLKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZWRpYVRyYWNrXG4gICAgKiBAcmV0dXJuIHtTaG93fVxuICAgICovXG4gICAgc2V0TWVkaWFUcmFjayAobWVkaWFUcmFjaykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaG93LktFWV9NRURJQV9UUkFDSywgbWVkaWFUcmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0TWVkaWFUcmFjayAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTaG93LktFWV9NRURJQV9UUkFDSyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0ltYWdlfSBncmFwaGljXG4gICAgKiBAcmV0dXJuIHtTaG93fVxuICAgICovXG4gICAgc2V0R3JhcGhpYyAoZ3JhcGhpYykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShJbWFnZSwgZ3JhcGhpYyk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2hvdy5LRVlfR1JBUEhJQywgZ3JhcGhpYyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7SW1hZ2V9XG4gICAgKi9cbiAgICBnZXRHcmFwaGljICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEltYWdlLCBTaG93LktFWV9HUkFQSElDKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7SW1hZ2V9IHNlY29uZGFyeUdyYXBoaWNcbiAgICAqIEByZXR1cm4ge1Nob3d9XG4gICAgKi9cbiAgICBzZXRTZWNvbmRhcnlHcmFwaGljIChzZWNvbmRhcnlHcmFwaGljKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEltYWdlLCBzZWNvbmRhcnlHcmFwaGljKTtcblxuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaG93LktFWV9TRUNPTkRBUllfR1JBUEhJQywgc2Vjb25kYXJ5R3JhcGhpYyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7SW1hZ2V9XG4gICAgKi9cbiAgICBnZXRTZWNvbmRhcnlHcmFwaGljICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEltYWdlLCBTaG93LktFWV9TRUNPTkRBUllfR1JBUEhJQyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0FycmF5PFNvZnRCdXR0b24+fSBzb2Z0QnV0dG9uc1xuICAgICogQHJldHVybiB7U2hvd31cbiAgICAqL1xuICAgIHNldFNvZnRCdXR0b25zIChzb2Z0QnV0dG9ucykge1xuICAgICAgICAvLyBUT0RPIG1ha2UgdGhpcyB3b3JrIGZvciBhcnJheXNcbiAgICAgICAgLy8gdGhpcy52YWxpZGF0ZVR5cGUoU29mdEJ1dHRvbiwgc29mdEJ1dHRvbnMpO1xuXG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX1NPRlRfQlVUVE9OUywgc29mdEJ1dHRvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0FycmF5PFNvZnRCdXR0b24+fVxuICAgICovXG4gICAgZ2V0U29mdEJ1dHRvbnMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoU29mdEJ1dHRvbiwgU2hvdy5LRVlfU09GVF9CVVRUT05TKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gY3VzdG9tUHJlc2V0c1xuICAgICogQHJldHVybiB7U2hvd31cbiAgICAqL1xuICAgIHNldEN1c3RvbVByZXNldHMgKGN1c3RvbVByZXNldHMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2hvdy5LRVlfQ1VTVE9NX1BSRVNFVFMsIGN1c3RvbVByZXNldHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59XG4gICAgKi9cbiAgICBnZXRDdXN0b21QcmVzZXRzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNob3cuS0VZX0NVU1RPTV9QUkVTRVRTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7TWV0YWRhdGFUYWdzfSBtZXRhZGF0YVRhZ3NcbiAgICAqIEByZXR1cm4ge1Nob3d9XG4gICAgKi9cbiAgICBzZXRNZXRhZGF0YVRhZ3MgKG1ldGFkYXRhVGFncykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNZXRhZGF0YVRhZ3MsIG1ldGFkYXRhVGFncyk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2hvdy5LRVlfTUVUQURBVEFfVEFHUywgbWV0YWRhdGFUYWdzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtNZXRhZGF0YVRhZ3N9XG4gICAgKi9cbiAgICBnZXRNZXRhZGF0YVRhZ3MgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTWV0YWRhdGFUYWdzLCBTaG93LktFWV9NRVRBREFUQV9UQUdTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZVRpdGxlXG4gICAgKiBAcmV0dXJuIHtTaG93fVxuICAgICovXG4gICAgc2V0VGVtcGxhdGVUaXRsZSAodGVtcGxhdGVUaXRsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaG93LktFWV9URU1QTEFURV9USVRMRSwgdGVtcGxhdGVUaXRsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0VGVtcGxhdGVUaXRsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTaG93LktFWV9URU1QTEFURV9USVRMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gd2luZG93SURcbiAgICAqIEByZXR1cm4ge1Nob3d9XG4gICAgKi9cbiAgICBzZXRXaW5kb3dJRCAod2luZG93SUQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2hvdy5LRVlfV0lORE9XX0lELCB3aW5kb3dJRCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgZ2V0V2luZG93SUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2hvdy5LRVlfV0lORE9XX0lEKTtcbiAgICB9XG59XG5cblNob3cuS0VZX01BSU5fRklFTERfMSA9ICdtYWluRmllbGQxJztcblNob3cuS0VZX01BSU5fRklFTERfMiA9ICdtYWluRmllbGQyJztcblNob3cuS0VZX01BSU5fRklFTERfMyA9ICdtYWluRmllbGQzJztcblNob3cuS0VZX01BSU5fRklFTERfNCA9ICdtYWluRmllbGQ0JztcblNob3cuS0VZX0FMSUdOTUVOVCA9ICdhbGlnbm1lbnQnO1xuU2hvdy5LRVlfU1RBVFVTX0JBUiA9ICdzdGF0dXNCYXInO1xuU2hvdy5LRVlfTUVESUFfQ0xPQ0sgPSAnbWVkaWFDbG9jayc7XG5TaG93LktFWV9NRURJQV9UUkFDSyA9ICdtZWRpYVRyYWNrJztcblNob3cuS0VZX0dSQVBISUMgPSAnZ3JhcGhpYyc7XG5TaG93LktFWV9TRUNPTkRBUllfR1JBUEhJQyA9ICdzZWNvbmRhcnlHcmFwaGljJztcblNob3cuS0VZX1NPRlRfQlVUVE9OUyA9ICdzb2Z0QnV0dG9ucyc7XG5TaG93LktFWV9DVVNUT01fUFJFU0VUUyA9ICdjdXN0b21QcmVzZXRzJztcblNob3cuS0VZX01FVEFEQVRBX1RBR1MgPSAnbWV0YWRhdGFUYWdzJztcblNob3cuS0VZX1RFTVBMQVRFX1RJVExFID0gJ3RlbXBsYXRlVGl0bGUnO1xuU2hvdy5LRVlfV0lORE9XX0lEID0gJ3dpbmRvd0lEJztcblxuZXhwb3J0IHsgU2hvdyB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG5jbGFzcyBTaG93UmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuU2hvdyk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBTaG93UmVzcG9uc2UgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbmNsYXNzIFVucmVnaXN0ZXJBcHBJbnRlcmZhY2UgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5VbnJlZ2lzdGVyQXBwSW50ZXJmYWNlKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgVW5yZWdpc3RlckFwcEludGVyZmFjZSB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG5jbGFzcyBVbnJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuVW5yZWdpc3RlckFwcEludGVyZmFjZSk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBVbnJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG4vLyBtZXNzYWdlc1xuaW1wb3J0IHsgQWRkQ29tbWFuZCB9IGZyb20gJy4vbWVzc2FnZXMvQWRkQ29tbWFuZC5qcyc7XG5pbXBvcnQgeyBBZGRDb21tYW5kUmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL0FkZENvbW1hbmRSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBPbkhtaVN0YXR1cyB9IGZyb20gJy4vbWVzc2FnZXMvT25IbWlTdGF0dXMuanMnO1xuaW1wb3J0IHsgT25MYW5ndWFnZUNoYW5nZSB9IGZyb20gJy4vbWVzc2FnZXMvT25MYW5ndWFnZUNoYW5nZS5qcyc7XG5pbXBvcnQgeyBQdXRGaWxlIH0gZnJvbSAnLi9tZXNzYWdlcy9QdXRGaWxlLmpzJztcbmltcG9ydCB7IFB1dEZpbGVSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvUHV0RmlsZVJlc3BvbnNlLmpzJztcbmltcG9ydCB7IFJlZ2lzdGVyQXBwSW50ZXJmYWNlIH0gZnJvbSAnLi9tZXNzYWdlcy9SZWdpc3RlckFwcEludGVyZmFjZS5qcyc7XG5pbXBvcnQgeyBSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLmpzJztcbmltcG9ydCB7IFNldEFwcEljb24gfSBmcm9tICcuL21lc3NhZ2VzL1NldEFwcEljb24uanMnO1xuaW1wb3J0IHsgU2V0QXBwSWNvblJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9TZXRBcHBJY29uUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgU2hvdyB9IGZyb20gJy4vbWVzc2FnZXMvU2hvdy5qcyc7XG5pbXBvcnQgeyBTaG93UmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL1Nob3dSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBVbnJlZ2lzdGVyQXBwSW50ZXJmYWNlIH0gZnJvbSAnLi9tZXNzYWdlcy9VbnJlZ2lzdGVyQXBwSW50ZXJmYWNlLmpzJztcbmltcG9ydCB7IFVucmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvVW5yZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLmpzJztcblxuLy8gb3RoZXJcbmltcG9ydCB7IFJwY1R5cGUgfSBmcm9tICcuL2VudW1zL1JwY1R5cGUuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBKc29uUnBjTWFyc2hhbGxlciB9IGZyb20gJy4vLi4vdXRpbC9Kc29uUnBjTWFyc2hhbGxlci5qcyc7XG5pbXBvcnQgeyBCaW5hcnlGcmFtZUhlYWRlciB9IGZyb20gJy4vLi4vcHJvdG9jb2wvQmluYXJ5RnJhbWVIZWFkZXIuanMnO1xuXG5jbGFzcyBScGNDcmVhdG9yIHtcbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbiBTZGxQYWNrZXQgdG8gYW4gUnBjTWVzc2FnZVxuICAgICAqIEBwYXJhbSB7U2RsUGFja2V0fSBzZGxQYWNrZXRcbiAgICAgKiBAcmV0dXJuIHtScGNNZXNzYWdlfVxuICAgICAqL1xuICAgIHN0YXRpYyBjb25zdHJ1Y3QgKHNkbFBhY2tldCkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gc2RsUGFja2V0LmdldFBheWxvYWQoKTtcbiAgICAgICAgY29uc3QgYmluYXJ5RnJhbWVIZWFkZXIgPSBCaW5hcnlGcmFtZUhlYWRlci5mcm9tQmluYXJ5SGVhZGVyKHBheWxvYWQpO1xuXG4gICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICBjb25zdCBycGNUeXBlID0gYmluYXJ5RnJhbWVIZWFkZXIuZ2V0UnBjVHlwZSgpO1xuICAgICAgICBjb25zdCBycGNOYW1lID0gUnBjVHlwZS5rZXlGb3JWYWx1ZShycGNUeXBlKTtcbiAgICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGJpbmFyeUZyYW1lSGVhZGVyLmdldENvcnJlbGF0aW9uSWQoKTtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25JZCA9IGJpbmFyeUZyYW1lSGVhZGVyLmdldEZ1bmN0aW9uSWQoKTtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gRnVuY3Rpb25JRC5rZXlGb3JWYWx1ZShmdW5jdGlvbklkKTtcbiAgICAgICAgY29uc3QgYnVsa0RhdGEgPSBiaW5hcnlGcmFtZUhlYWRlci5nZXRCdWxrRGF0YSgpO1xuICAgICAgICBjb25zdCBqc29uRGF0YSA9IGJpbmFyeUZyYW1lSGVhZGVyLmdldEpzb25EYXRhKCk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IEpzb25ScGNNYXJzaGFsbGVyLnVubWFyc2hhbGwoanNvbkRhdGEpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHN3aXRjaCAoZnVuY3Rpb25JZCkge1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELkFkZENvbW1hbmQ6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IEFkZENvbW1hbmQocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBBZGRDb21tYW5kUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuT25ITUlTdGF0dXM6IC8vIFRPRE86IHNob3VsZCBPbkhNSVN0YXR1cyBiZSBPbkhtaVN0YXR1cywgb3IgdGhlIGNsYXNzIG5hbWUgY2hhbmdlIHRvIE9uSE1JU3RhdHVzPyBvciBpcyB0aGlzIGZpbmUgYXMgaXM/XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuTk9USUZJQ0FUSU9OKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgT25IbWlTdGF0dXMocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuT25MYW5ndWFnZUNoYW5nZTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5OT1RJRklDQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBPbkxhbmd1YWdlQ2hhbmdlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlB1dEZpbGU6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFB1dEZpbGUocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBQdXRGaWxlUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuUmVnaXN0ZXJBcHBJbnRlcmZhY2U6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFJlZ2lzdGVyQXBwSW50ZXJmYWNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5TZXRBcHBJY29uOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTZXRBcHBJY29uKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2V0QXBwSWNvblJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlNob3c6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFNob3cocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTaG93UmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuVW5yZWdpc3RlckFwcEludGVyZmFjZTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgVW5yZWdpc3RlckFwcEludGVyZmFjZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFVucmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB1bmRlZmluZWQpIHsgLy8gaW5mb3JtcyBvZiBtaXNzaW5nIGNsYXNzZXNcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgUnBjQ3JlYXRvciBjb3VsZG4ndCBjb25zdHJ1Y3QgYW4gUlBDIGZvciB0aGUgJHtmdW5jdGlvbk5hbWV9ICR7cnBjTmFtZX1gKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCB8fCBycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICBtZXNzYWdlLnNldENvcnJlbGF0aW9uSWQoY29ycmVsYXRpb25JZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1bGtEYXRhKSB7XG4gICAgICAgICAgICBtZXNzYWdlLnNldEJ1bGtEYXRhKGJ1bGtEYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgUnBjQ3JlYXRvciB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBWaWRlb1N0cmVhbWluZ1Byb3RvY29sXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBWaWRlb1N0cmVhbWluZ1Byb3RvY29sIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUkFXICgpIHtcbiAgICAgICAgcmV0dXJuIFZpZGVvU3RyZWFtaW5nUHJvdG9jb2wuX01BUC5SQVc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUlRQICgpIHtcbiAgICAgICAgcmV0dXJuIFZpZGVvU3RyZWFtaW5nUHJvdG9jb2wuX01BUC5SVFA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUlRTUCAoKSB7XG4gICAgICAgIHJldHVybiBWaWRlb1N0cmVhbWluZ1Byb3RvY29sLl9NQVAuUlRTUDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSVE1QICgpIHtcbiAgICAgICAgcmV0dXJuIFZpZGVvU3RyZWFtaW5nUHJvdG9jb2wuX01BUC5SVE1QO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFdFQk0gKCkge1xuICAgICAgICByZXR1cm4gVmlkZW9TdHJlYW1pbmdQcm90b2NvbC5fTUFQLldFQk07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFZpZGVvU3RyZWFtaW5nUHJvdG9jb2wuX3ZhbHVlRm9yS2V5KGtleSwgVmlkZW9TdHJlYW1pbmdQcm90b2NvbC5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gVmlkZW9TdHJlYW1pbmdQcm90b2NvbC5fa2V5Rm9yVmFsdWUodmFsdWUsIFZpZGVvU3RyZWFtaW5nUHJvdG9jb2wuX01BUCk7XG4gICAgfVxufVxuXG5WaWRlb1N0cmVhbWluZ1Byb3RvY29sLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAvKipcbiAgICAgKiBSYXcgc3RyZWFtIGJ5dGVzIHRoYXQgY29udGFpbnMgbm8gdGltZXN0YW1wIGRhdGEgYW5kIGlzIHRoZSBsb3dlc3Qgc3VwcG9ydGVkIHZpZGVvIHN0cmVhbWluZ1xuICAgICAqL1xuICAgICdSQVcnOiAnUkFXJyxcbiAgICAvKipcbiAgICAgKiBSVFAgZmFjaWxpdGF0ZXMgdGhlIHRyYW5zZmVyIG9mIHJlYWwtdGltZSBkYXRhLiBJbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGlzIHByb3RvY29sIGluY2x1ZGVcbiAgICAgKiB0aW1lc3RhbXBzIChmb3Igc3luY2hyb25pemF0aW9uKSwgc2VxdWVuY2UgbnVtYmVycyAoZm9yIHBhY2tldCBsb3NzIGFuZCByZW9yZGVyaW5nIGRldGVjdGlvbilcbiAgICAgKiBhbmQgdGhlIHBheWxvYWQgZm9ybWF0IHdoaWNoIGluZGljYXRlcyB0aGUgZW5jb2RlZCBmb3JtYXQgb2YgdGhlIGRhdGEuXG4gICAgICovXG4gICAgJ1JUUCc6ICdSVFAnLFxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc21pc3Npb24gb2Ygc3RyZWFtaW5nIGRhdGEgaXRzZWxmIGlzIG5vdCBhIHRhc2sgb2YgUlRTUC4gTW9zdCBSVFNQIHNlcnZlcnMgdXNlIHRoZVxuICAgICAqIFJlYWwtdGltZSBUcmFuc3BvcnQgUHJvdG9jb2wgKFJUUCkgaW4gY29uanVuY3Rpb24gd2l0aCBSZWFsLXRpbWUgQ29udHJvbCBQcm90b2NvbCAoUlRDUCkgZm9yXG4gICAgICogbWVkaWEgc3RyZWFtIGRlbGl2ZXJ5LiBIb3dldmVyLCBzb21lIHZlbmRvcnMgaW1wbGVtZW50IHByb3ByaWV0YXJ5IHRyYW5zcG9ydCBwcm90b2NvbHMuXG4gICAgICovXG4gICAgJ1JUU1AnOiAnUlRTUCcsXG4gICAgLyoqXG4gICAgICogUmVhbC1UaW1lIE1lc3NhZ2luZyBQcm90b2NvbCAoUlRNUCkgd2FzIGluaXRpYWxseSBhIHByb3ByaWV0YXJ5IHByb3RvY29sIGRldmVsb3BlZCBieVxuICAgICAqIE1hY3JvbWVkaWEgZm9yIHN0cmVhbWluZyBhdWRpbywgdmlkZW8gYW5kIGRhdGEgb3ZlciB0aGUgSW50ZXJuZXQsIGJldHdlZW4gYSBGbGFzaCBwbGF5ZXIgYW5kXG4gICAgICogYSBzZXJ2ZXIuIE1hY3JvbWVkaWEgaXMgbm93IG93bmVkIGJ5IEFkb2JlLCB3aGljaCBoYXMgcmVsZWFzZWQgYW4gaW5jb21wbGV0ZSB2ZXJzaW9uIG9mIHRoZVxuICAgICAqIHNwZWNpZmljYXRpb24gb2YgdGhlIHByb3RvY29sIGZvciBwdWJsaWMgdXNlLlxuICAgICAqL1xuICAgICdSVE1QJzogJ1JUTVAnLFxuICAgIC8qKlxuICAgICAqIFRoZSBXZWJNIGNvbnRhaW5lciBpcyBiYXNlZCBvbiBhIHByb2ZpbGUgb2YgTWF0cm9za2EuIFdlYk0gaW5pdGlhbGx5IHN1cHBvcnRlZCBWUDggdmlkZW8gYW5kXG4gICAgICogVm9yYmlzIGF1ZGlvIHN0cmVhbXMuIEluIDIwMTMgaXQgd2FzIHVwZGF0ZWQgdG8gYWNjb21tb2RhdGUgVlA5IHZpZGVvIGFuZCBPcHVzIGF1ZGlvLlxuICAgICAqL1xuICAgICdXRUJNJzogJ1dFQk0nLFxuXG59KTtcblxuZXhwb3J0IHsgVmlkZW9TdHJlYW1pbmdQcm90b2NvbCB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gVmlkZW9TdHJlYW1pbmdDb2RlY1xuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgVmlkZW9TdHJlYW1pbmdDb2RlYyBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEgyNjQgKCkge1xuICAgICAgICByZXR1cm4gVmlkZW9TdHJlYW1pbmdDb2RlYy5fTUFQLkgyNjQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgSDI2NSAoKSB7XG4gICAgICAgIHJldHVybiBWaWRlb1N0cmVhbWluZ0NvZGVjLl9NQVAuSDI2NTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBUaGVvcmEgKCkge1xuICAgICAgICByZXR1cm4gVmlkZW9TdHJlYW1pbmdDb2RlYy5fTUFQLlRoZW9yYTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWUDggKCkge1xuICAgICAgICByZXR1cm4gVmlkZW9TdHJlYW1pbmdDb2RlYy5fTUFQLlZQODtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWUDkgKCkge1xuICAgICAgICByZXR1cm4gVmlkZW9TdHJlYW1pbmdDb2RlYy5fTUFQLlZQOTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gVmlkZW9TdHJlYW1pbmdDb2RlYy5fdmFsdWVGb3JLZXkoa2V5LCBWaWRlb1N0cmVhbWluZ0NvZGVjLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBWaWRlb1N0cmVhbWluZ0NvZGVjLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgVmlkZW9TdHJlYW1pbmdDb2RlYy5fTUFQKTtcbiAgICB9XG59XG5cblZpZGVvU3RyZWFtaW5nQ29kZWMuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgIC8qKlxuICAgICAqIEEgYmxvY2stb3JpZW50ZWQgbW90aW9uLWNvbXBlbnNhdGlvbi1iYXNlZCB2aWRlbyBjb21wcmVzc2lvbiBzdGFuZGFyZC4gQXMgb2YgMjAxNCBpdCBpcyBvbmVcbiAgICAgKiBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIGZvcm1hdHMgZm9yIHRoZSByZWNvcmRpbmcsIGNvbXByZXNzaW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHZpZGVvXG4gICAgICogY29udGVudC5cbiAgICAgKi9cbiAgICAnSDI2NCc6ICdIMjY0JyxcbiAgICAvKipcbiAgICAgKiBIaWdoIEVmZmljaWVuY3kgVmlkZW8gQ29kaW5nIChIRVZDKSwgYWxzbyBrbm93biBhcyBILjI2NSBhbmQgTVBFRy1IIFBhcnQgMiwgaXMgYSB2aWRlb1xuICAgICAqIGNvbXByZXNzaW9uIHN0YW5kYXJkLCBvbmUgb2Ygc2V2ZXJhbCBwb3RlbnRpYWwgc3VjY2Vzc29ycyB0byB0aGUgd2lkZWx5IHVzZWQgQVZDXG4gICAgICogKEguMjY0IG9yIE1QRUctNCBQYXJ0IDEwKS4gSW4gY29tcGFyaXNvbiB0byBBVkMsIEhFVkMgb2ZmZXJzIGFib3V0IGRvdWJsZSB0aGUgZGF0YVxuICAgICAqIGNvbXByZXNzaW9uIHJhdGlvIGF0IHRoZSBzYW1lIGxldmVsIG9mIHZpZGVvIHF1YWxpdHksIG9yIHN1YnN0YW50aWFsbHkgaW1wcm92ZWQgdmlkZW8gcXVhbGl0eVxuICAgICAqIGF0IHRoZSBzYW1lIGJpdCByYXRlLiBJdCBzdXBwb3J0cyByZXNvbHV0aW9ucyB1cCB0byA4MTkyeDQzMjAsIGluY2x1ZGluZyA4SyBVSEQuXG4gICAgICovXG4gICAgJ0gyNjUnOiAnSDI2NScsXG4gICAgLyoqXG4gICAgICogVGhlb3JhIGlzIGRlcml2ZWQgZnJvbSB0aGUgZm9ybWVybHkgcHJvcHJpZXRhcnkgVlAzIGNvZGVjLCByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluIGJ5XG4gICAgICogT24yIFRlY2hub2xvZ2llcy4gSXQgaXMgYnJvYWRseSBjb21wYXJhYmxlIGluIGRlc2lnbiBhbmQgYml0cmF0ZSBlZmZpY2llbmN5IHRvIE1QRUctNCBQYXJ0IDIsXG4gICAgICogZWFybHkgdmVyc2lvbnMgb2YgV2luZG93cyBNZWRpYSBWaWRlbywgYW5kIFJlYWxWaWRlbyB3aGlsZSBsYWNraW5nIHNvbWUgb2YgdGhlIGZlYXR1cmVzXG4gICAgICogcHJlc2VudCBpbiBzb21lIG9mIHRoZXNlIG90aGVyIGNvZGVjcy4gSXQgaXMgY29tcGFyYWJsZSBpbiBvcGVuIHN0YW5kYXJkcyBwaGlsb3NvcGh5IHRvIHRoZVxuICAgICAqIEJCQydzIERpcmFjIGNvZGVjLlxuICAgICAqL1xuICAgICdUaGVvcmEnOiAnVGhlb3JhJyxcbiAgICAvKipcbiAgICAgKiBWUDggY2FuIGJlIG11bHRpcGxleGVkIGludG8gdGhlIE1hdHJvc2thLWJhc2VkIGNvbnRhaW5lciBmb3JtYXQgV2ViTSBhbG9uZyB3aXRoIFZvcmJpcyBhbmRcbiAgICAgKiBPcHVzIGF1ZGlvLiBUaGUgaW1hZ2UgZm9ybWF0IFdlYlAgaXMgYmFzZWQgb24gVlA4J3MgaW50cmEtZnJhbWUgY29kaW5nLiBWUDgncyBkaXJlY3RcbiAgICAgKiBzdWNjZXNzb3IsIFZQOSwgYW5kIHRoZSBlbWVyZ2luZyByb3lhbHR5LWZyZWUgaW50ZXJuZXQgdmlkZW8gZm9ybWF0IEFWMSBmcm9tIHRoZSBBbGxpYW5jZVxuICAgICAqIGZvciBPcGVuIE1lZGlhIChBT01lZGlhKSBhcmUgYmFzZWQgb24gVlA4LlxuICAgICAqL1xuICAgICdWUDgnOiAnVlA4JyxcbiAgICAvKipcbiAgICAgKiBTaW1pbGFyIHRvIFZQOCwgYnV0IFZQOSBpcyBjdXN0b21pemVkIGZvciB2aWRlbyByZXNvbHV0aW9ucyBiZXlvbmQgaGlnaC1kZWZpbml0aW9uIHZpZGVvXG4gICAgICogKFVIRCkgYW5kIGFsc28gZW5hYmxlcyBsb3NzbGVzcyBjb21wcmVzc2lvbi5cbiAgICAgKi9cbiAgICAnVlA5JzogJ1ZQOScsXG59KTtcblxuZXhwb3J0IHsgVmlkZW9TdHJlYW1pbmdDb2RlYyB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgVmlkZW9TdHJlYW1pbmdQcm90b2NvbCB9IGZyb20gJy4uL2VudW1zL1ZpZGVvU3RyZWFtaW5nUHJvdG9jb2wuanMnO1xuaW1wb3J0IHsgVmlkZW9TdHJlYW1pbmdDb2RlYyB9IGZyb20gJy4uL2VudW1zL1ZpZGVvU3RyZWFtaW5nQ29kZWMuanMnO1xuXG5jbGFzcyBWaWRlb1N0cmVhbWluZ0Zvcm1hdCBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1ZpZGVvU3RyZWFtaW5nUHJvdG9jb2x9IHZhbFxuICAgICogQHJldHVybiB7VmlkZW9TdHJlYW1pbmdGb3JtYXR9XG4gICAgKi9cbiAgICBzZXRQcm90b2NvbCAodmFsKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZpZGVvU3RyZWFtaW5nUHJvdG9jb2wsIHZhbCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFZpZGVvU3RyZWFtaW5nRm9ybWF0LktFWV9QUk9UT0NPTCwgdmFsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtWaWRlb1N0cmVhbWluZ1Byb3RvY29sfVxuICAgICovXG4gICAgZ2V0UHJvdG9jb2wgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVmlkZW9TdHJlYW1pbmdGb3JtYXQuS0VZX1BST1RPQ09MKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7VmlkZW9TdHJlYW1pbmdDb2RlY30gdmFsXG4gICAgKiBAcmV0dXJuIHtWaWRlb1N0cmVhbWluZ0Zvcm1hdH1cbiAgICAqL1xuICAgIHNldENvZGVjICh2YWwpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmlkZW9TdHJlYW1pbmdDb2RlYywgdmFsKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVmlkZW9TdHJlYW1pbmdGb3JtYXQuS0VZX0NPREVDLCB2YWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nQ29kZWN9XG4gICAgKi9cbiAgICBnZXRDb2RlYyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihWaWRlb1N0cmVhbWluZ0Zvcm1hdC5LRVlfQ09ERUMpO1xuICAgIH1cbn1cblxuVmlkZW9TdHJlYW1pbmdGb3JtYXQuS0VZX1BST1RPQ09MID0gJ3Byb3RvY29sJztcblZpZGVvU3RyZWFtaW5nRm9ybWF0LktFWV9DT0RFQyA9ICdjb2RlYyc7XG5cbmV4cG9ydCB7IFZpZGVvU3RyZWFtaW5nRm9ybWF0IH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgTWVzc2FnZUZyYW1lRGlzYXNzZW1ibGVyIH0gZnJvbSAnLi9NZXNzYWdlRnJhbWVEaXNhc3NlbWJsZXIuanMnO1xuaW1wb3J0IHsgVHJhbnNwb3J0TGlzdGVuZXIgfSBmcm9tICcuLi90cmFuc3BvcnQvVHJhbnNwb3J0TGlzdGVuZXIuanMnO1xuaW1wb3J0IHsgVmVyc2lvbiB9IGZyb20gJy4uL3V0aWwvVmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlVHlwZSB9IGZyb20gJy4vZW51bXMvU2VydmljZVR5cGUuanMnO1xuaW1wb3J0IHsgRnJhbWVUeXBlIH0gZnJvbSAnLi9lbnVtcy9GcmFtZVR5cGUuanMnO1xuaW1wb3J0IHsgTWVzc2FnZUZyYW1lQXNzZW1ibGVyIH0gZnJvbSAnLi9NZXNzYWdlRnJhbWVBc3NlbWJsZXIuanMnO1xuaW1wb3J0IHsgU2RsUGFja2V0IH0gZnJvbSAnLi9TZGxQYWNrZXQuanMnO1xuaW1wb3J0IHsgQ29udHJvbEZyYW1lVGFncyB9IGZyb20gJy4vZW51bXMvQ29udHJvbEZyYW1lVGFncy5qcyc7XG5pbXBvcnQgeyBCaXRDb252ZXJ0ZXIgfSBmcm9tICcuLy4uL3V0aWwvQml0Q29udmVydGVyLmpzJztcblxuaW1wb3J0IHsgU2RsUGFja2V0RmFjdG9yeSB9IGZyb20gJy4vU2RsUGFja2V0RmFjdG9yeS5qcyc7XG5pbXBvcnQgeyBScGNDcmVhdG9yIH0gZnJvbSAnLi8uLi9ycGMvUnBjQ3JlYXRvci5qcyc7XG5pbXBvcnQgeyBJbWFnZVJlc29sdXRpb24gfSBmcm9tICcuLi9ycGMvc3RydWN0cy9JbWFnZVJlc29sdXRpb24uanMnO1xuaW1wb3J0IHsgVmlkZW9TdHJlYW1pbmdGb3JtYXQgfSBmcm9tICcuLi9ycGMvc3RydWN0cy9WaWRlb1N0cmVhbWluZ0Zvcm1hdC5qcyc7XG5cbi8qKlxuICogQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBzZGwgcHJvdG9jb2wuXG4gKiBTaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgYmFzaWMgY29udHJvbCBmcmFtZXMgYW5kIGJlIGFibGUgdG9cbiAqIHNlbmQgYW5kIHJlY2VpdmUgcGFja2V0cyBmcm9tIHRoZSB0cmFuc3BvcnQgbWFuYWdlci5cbiAqIEFsc28gc2VuZHMga2V5IGV2ZW50cyB0byB0aGUgc2RsUHJvdG9jb2xMaXN0ZW5lci5cbiAqL1xuY2xhc3MgU2RsUHJvdG9jb2xCYXNlIHtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7IFRyYW5zcG9ydENvbmZpZ0Jhc2UgfSBiYXNlVHJhbnNwb3J0Q29uZmlnXG4gICAgICogQHBhcmFtIHsgU2RsUHJvdG9jb2xMaXN0ZW5lciB9IHNkbFByb3RvY29sTGlzdGVuZXJcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoYmFzZVRyYW5zcG9ydENvbmZpZywgc2RsUHJvdG9jb2xMaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9iYXNlVHJhbnNwb3J0Q29uZmlnID0gYmFzZVRyYW5zcG9ydENvbmZpZztcbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0Q29uZmlnID0gYmFzZVRyYW5zcG9ydENvbmZpZztcbiAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2xMaXN0ZW5lciA9IHNkbFByb3RvY29sTGlzdGVuZXI7XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydE1hbmFnZXIgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgICAgIHRoaXMuX2NyZWF0ZVRyYW5zcG9ydExpc3RlbmVyKCk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHNkbCBwcm90b2NvbCB0byBpdHMgZGVmYXVsdCBzdGF0ZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9yZXNldCAoKSB7XG4gICAgICAgIHRoaXMuX3Byb3RvY29sVmVyc2lvbiA9IG5ldyBWZXJzaW9uKDEsIDAsIDApO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRDb25maWcgPSB0aGlzLl9iYXNlVHJhbnNwb3J0Q29uZmlnO1xuICAgICAgICB0aGlzLl9oZWFkZXJTaXplID0gU2RsUHJvdG9jb2xCYXNlLlYxX0hFQURFUl9TSVpFO1xuICAgICAgICB0aGlzLl9zZXJ2aWNlU3RhdHVzID0ge307XG4gICAgICAgIHRoaXMuX3NlcnZpY2VTdGF0dXNbU2VydmljZVR5cGUuQ09OVFJPTF0gPSB0cnVlO1xuICAgICAgICB0aGlzLl9tdHVzID0ge307XG4gICAgICAgIHRoaXMuX210dXNbU2VydmljZVR5cGUuUlBDXSA9IFNkbFByb3RvY29sQmFzZS5WMV9WMl9NVFVfU0laRSAtIHRoaXMuX2hlYWRlclNpemU7XG4gICAgICAgIHRoaXMuX2hhc2hJRCA9IDA7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VGcmFtZUFzc2VtYmxlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUlEID0gMTtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbklEID0gMDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFNldHMgYSB0cmFuc3BvcnQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0geyBUcmFuc3BvcnRNYW5hZ2VyQmFzZSB9IG1hbmFnZXJcbiAgICAgKi9cbiAgICBzZXRUcmFuc3BvcnRNYW5hZ2VyIChtYW5hZ2VyKSB7XG4gICAgICAgIGlmICghdGhpcy5fc2VydmljZVN0YXR1c1tTZXJ2aWNlVHlwZS5SUENdKSB7XG4gICAgICAgICAgICAvLyBSUEMgc2VydmljZSBoYXNuJ3QgYmVlbiBzdGFydGVkLCBsZXRzIHN0YXJ0IGl0XG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2VydmljZShTZXJ2aWNlVHlwZS5SUEMsIDAsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90cmFuc3BvcnRNYW5hZ2VyID0gbWFuYWdlcjtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIHRyYW5zcG9ydCBsaXN0ZW5lci4gVGhpcyB3aWxsIHJlY2lldmUgaW5jb21pbmcgcmVxdWVzdHNcbiAgICAgKiBmcm9tIHRoZSB0cmFuc3BvcnQgbWFuYWdlci5cbiAgICAgKi9cbiAgICBfY3JlYXRlVHJhbnNwb3J0TGlzdGVuZXIgKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0TGlzdGVuZXIgPSBuZXcgVHJhbnNwb3J0TGlzdGVuZXIoKTtcbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0TGlzdGVuZXIuc2V0T25UcmFuc3BvcnRDb25uZWN0ZWQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5faGFuZGxlVHJhbnNwb3J0Q29ubmVjdGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRMaXN0ZW5lci5zZXRPblRyYW5zcG9ydERpc2Nvbm5lY3RlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRMaXN0ZW5lci5zZXRPblBhY2tldFJlY2VpdmVkKGZ1bmN0aW9uIChzZGxQYWNrZXQpIHtcbiAgICAgICAgICAgIHNlbGYuX2hhbmRsZVBhY2tldFJlY2VpdmVkKHNkbFBhY2tldCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRMaXN0ZW5lci5zZXRPbkVycm9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2hhbmRsZVRyYW5zcG9ydENvbm5lY3RlZCAoKSB7XG4gICAgICAgIHRoaXMuX3NkbFByb3RvY29sTGlzdGVuZXIub25UcmFuc3BvcnRDb25uZWN0ZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdGFydHMgdXAgdGhlIFNETCBwcm90b2NvbCBjbGFzcy4gSXQgd2lsbCBraWNrIG9mZiB0aGUgdHJhbnNwb3J0IG1hbmFnZXIgYW5kIHVuZGVybHlpbmcgdHJhbnNwb3J0LlxuICAgICAqL1xuICAgIHN0YXJ0ICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90cmFuc3BvcnRNYW5hZ2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgdHJhbnNwb3J0IG1hbmFnZXIgbXVzdCBiZSBkZWZpbmVkLCB1bmFibGUgdG8gc3RhcnQgU0RMIFByb3RvY29sJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0TWFuYWdlci5zdGFydCgpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgdGhlIHNlcnZpY2UuIFRoaXMgaXMgdGhlIGZpcnN0IHN0ZXAgaW4gY29tbXVuaWNhdGluZyB3aXRoIHNkbCBjb3JlLlxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNlc3Npb25JRFxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNFbmNyeXB0ZWRcbiAgICAgKi9cbiAgICBzdGFydFNlcnZpY2UgKHNlcnZpY2VUeXBlLCBzZXNzaW9uSUQsIGlzRW5jcnlwdGVkKSB7XG4gICAgICAgIGNvbnN0IHByb3RvY29sVmVyc2lvbiA9IHRoaXMuY29uc3RydWN0b3IuTUFYX1BST1RPQ09MX1ZFUlNJT047XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJRCA9IDA7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IG5ldyBTZGxQYWNrZXQocHJvdG9jb2xWZXJzaW9uLmdldE1ham9yKCksIGlzRW5jcnlwdGVkLCBGcmFtZVR5cGUuQ09OVFJPTCxcbiAgICAgICAgICAgIHNlcnZpY2VUeXBlLCBTZGxQYWNrZXQuRlJBTUVfSU5GT19TVEFSVF9TRVJWSUNFLCBzZXNzaW9uSUQsXG4gICAgICAgICAgICAwLCBtZXNzYWdlSUQsIG51bGwpO1xuICAgICAgICBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLkFVRElPKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kUGFja2V0KGhlYWRlcik7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLlJQQykge1xuICAgICAgICAgICAgaGVhZGVyLnB1dFRhZyhDb250cm9sRnJhbWVUYWdzLlJQQy5TdGFydFNlcnZpY2UuUFJPVE9DT0xfVkVSU0lPTiwgcHJvdG9jb2xWZXJzaW9uLnRvU3RyaW5nKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2VUeXBlID09PSBTZXJ2aWNlVHlwZS5WSURFTykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NkbFByb3RvY29sTGlzdGVuZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWRlb1N0cmVhbWluZ1BhcmFtZXRlcnMgPSB0aGlzLl9zZGxQcm90b2NvbExpc3RlbmVyLmdldERlc2lyZWRWaWRlb1BhcmFtcygpO1xuICAgICAgICAgICAgICAgIGlmICh2aWRlb1N0cmVhbWluZ1BhcmFtZXRlcnMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzaXJlZFJlc29sdXRpb24gPSB2aWRlb1N0cmVhbWluZ1BhcmFtZXRlcnMuZ2V0UmVzb2x1dGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNpcmVkRm9ybWF0ID0gdmlkZW9TdHJlYW1pbmdQYXJhbWV0ZXJzLmdldEZvcm1hdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzaXJlZFJlc29sdXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5wdXRUYWcoQ29udHJvbEZyYW1lVGFncy5WaWRlby5TdGFydFNlcnZpY2UuV0lEVEgsIGRlc2lyZWRSZXNvbHV0aW9uLmdldFJlc29sdXRpb25XaWR0aCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5wdXRUYWcoQ29udHJvbEZyYW1lVGFncy5WaWRlby5TdGFydFNlcnZpY2UuSEVJR0hULCBkZXNpcmVkUmVzb2x1dGlvbi5nZXRSZXNvbHV0aW9uSGVpZ2h0KCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNpcmVkRm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIucHV0VGFnKENvbnRyb2xGcmFtZVRhZ3MuVmlkZW8uU3RhcnRTZXJ2aWNlLlZJREVPX0NPREVDLCBkZXNpcmVkRm9ybWF0LmdldENvZGVjKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnB1dFRhZyhDb250cm9sRnJhbWVUYWdzLlZpZGVvLlN0YXJ0U2VydmljZS5WSURFT19QUk9UT0NPTCwgZGVzaXJlZEZvcm1hdC5nZXRQcm90b2NvbCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRQYWNrZXQoaGVhZGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2VydmljZSB0eXBlIG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VuZFBhY2tldChoZWFkZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBHZXQgdGhlIG1heCB0cmFuc3BvcnQgdW5pdCBvZiBhIHNwZWNpZmljIHNlcnZpY2UgdHlwZS5cbiAgICAgKiBAcGFyYW0geyBTZXJ2aWNlVHlwZSB9IHNlcnZpY2VUeXBlXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBtYXggdHJhbnNwb3J0IHVuaXQgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlIHR5cGVcbiAgICAgKi9cbiAgICBnZXRNdHUgKHNlcnZpY2VUeXBlKSB7XG4gICAgICAgIGNvbnN0IHJldFZhbCA9IHRoaXMuX210dXNbc2VydmljZVR5cGVdO1xuICAgICAgICBpZiAocmV0VmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTZGxQcm90b2NvbEJhc2UuVjFfVjJfTVRVX1NJWkU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRyYW5zcG9ydCBtYW5hZ2VyIGlzIGNvbm5lY3RlZC5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBpc0Nvbm5lY3RlZFxuICAgICAqL1xuICAgIGlzQ29ubmVjdGVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydE1hbmFnZXIgJiYgdGhpcy5fdHJhbnNwb3J0TWFuYWdlci5pc0Nvbm5lY3RlZChudWxsLCBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcHJvdG9jb2wgdmVyc2lvbiBpbiB1c2UuXG4gICAgICogQHJldHVybnMge1ZlcnNpb259IHByb3RvY29sIHZlcnNpb25cbiAgICAgKi9cbiAgICBnZXRQcm90b2NvbFZlcnNpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvdG9jb2xWZXJzaW9uO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlIG1ham9yIHByb3RvY29sIHZlcnNpb24gdGhhdCB3ZSBzaG91bGQgdXNlLlxuICAgICAqIEl0IHdpbGwgYWxzbyBzZXQgdGhlIGRlZmF1bHQgTVRVIGJhc2VkIG9uIHZlcnNpb24uXG4gICAgICogQHBhcmFtIHsgbnVtYmVyIH0gdmVyc2lvbiBtYWpvciB2ZXJzaW9uIHRvIHVzZVxuICAgICAqL1xuICAgIF9zZXRWZXJzaW9uICh2ZXJzaW9uKSB7XG4gICAgICAgIGlmICh2ZXJzaW9uID4gNSkge1xuICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2xWZXJzaW9uID0gbmV3IFZlcnNpb24oJzUuMS4wJyk7IC8vIHByb3RlY3QgZm9yIGZ1dHVyZSwgcHJveHkgb25seSBzdXBwb3J0cyB2NSBvciBsb3dlclxuICAgICAgICAgICAgdGhpcy5oZWFkZXJTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5WMl9IRUFERVJfU0laRTtcbiAgICAgICAgICAgIHRoaXMuX210dXNbU2VydmljZVR5cGUuUlBDXSA9IHRoaXMuY29uc3RydWN0b3IuVjNfVjRfTVRVX1NJWkU7XG4gICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PT0gNSkge1xuICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2xWZXJzaW9uID0gbmV3IFZlcnNpb24oJzUuMC4wJyk7XG4gICAgICAgICAgICB0aGlzLmhlYWRlclNpemUgPSB0aGlzLmNvbnN0cnVjdG9yLlYyX0hFQURFUl9TSVpFO1xuICAgICAgICAgICAgdGhpcy5fbXR1c1tTZXJ2aWNlVHlwZS5SUENdID0gdGhpcy5jb25zdHJ1Y3Rvci5WM19WNF9NVFVfU0laRTtcbiAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09PSA0KSB7XG4gICAgICAgICAgICB0aGlzLl9wcm90b2NvbFZlcnNpb24gPSBuZXcgVmVyc2lvbignNC4wLjAnKTtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyU2l6ZSA9IHRoaXMuY29uc3RydWN0b3IuVjJfSEVBREVSX1NJWkU7XG4gICAgICAgICAgICB0aGlzLl9tdHVzW1NlcnZpY2VUeXBlLlJQQ10gPSB0aGlzLmNvbnN0cnVjdG9yLlYzX1Y0X01UVV9TSVpFOyAvLyB2ZXJzaW9ucyA0IHN1cHBvcnRzIDEyOGsgTVRVXG4gICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PT0gMykge1xuICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2xWZXJzaW9uID0gbmV3IFZlcnNpb24oJzMuMC4wJyk7XG4gICAgICAgICAgICB0aGlzLmhlYWRlclNpemUgPSB0aGlzLmNvbnN0cnVjdG9yLlYyX0hFQURFUl9TSVpFO1xuICAgICAgICAgICAgdGhpcy5fbXR1c1tTZXJ2aWNlVHlwZS5SUENdID0gdGhpcy5jb25zdHJ1Y3Rvci5WM19WNF9NVFVfU0laRTsgLy8gdmVyc2lvbnMgMyBzdXBwb3J0cyAxMjhrIE1UVVxuICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT09IDIpIHtcbiAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sVmVyc2lvbiA9IG5ldyBWZXJzaW9uKCcyLjAuMCcpO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5WMl9IRUFERVJfU0laRTtcbiAgICAgICAgICAgIHRoaXMuX210dXNbU2VydmljZVR5cGUuUlBDXSA9IHRoaXMuY29uc3RydWN0b3IuVjFfVjJfTVRVX1NJWkUgLSB0aGlzLmhlYWRlclNpemU7XG4gICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2xWZXJzaW9uID0gbmV3IFZlcnNpb24oJzEuMC4wJyk7XG4gICAgICAgICAgICB0aGlzLmhlYWRlclNpemUgPSB0aGlzLmNvbnN0cnVjdG9yLlYxX0hFQURFUl9TSVpFO1xuICAgICAgICAgICAgdGhpcy5fbXR1c1tTZXJ2aWNlVHlwZS5SUENdID0gdGhpcy5jb25zdHJ1Y3Rvci5WMV9WMl9NVFVfU0laRSAtIHRoaXMuaGVhZGVyU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIHNkbFBhY2tldC5cbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgc2VuZFBhY2tldCAoc2RsUGFja2V0KSB7XG4gICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnRNYW5hZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRNYW5hZ2VyLnNlbmRQYWNrZXQoc2RsUGFja2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNlc3Npb25JZCBpbiB1c2UuXG4gICAgICogQHJldHVybnMge051bWJlcn1cbiAgICAgKi9cbiAgICBfZ2V0U2Vzc2lvbklkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NkbFByb3RvY29sTGlzdGVuZXIuZ2V0U2Vzc2lvbklkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmV4dCBhdmFpbGFibGUgbWVzc2FnZUlEIGZvciBzZW5kaW5nIHJlcXVlc3RzLlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gICAgX2dldE5leHRNZXNzYWdlSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUlEKys7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGFrZXMgYW4gcnBjIG1lc3NhZ2UgYW5kIHNlbmRzIGEgc2luZ2xlIG9yIG11bHRpIGZyYW1lIHBhY2tldHMuXG4gICAgICogQHBhcmFtIHtScGNSZXF1ZXN0fSBycGNNZXNzYWdlXG4gICAgICovXG4gICAgc2VuZFJwYyAocnBjUmVxdWVzdCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5fZ2V0U2Vzc2lvbklkKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJRCA9IHRoaXMuX2dldE5leHRNZXNzYWdlSUQoKTtcbiAgICAgICAgY29uc3QgbXR1ID0gc2VsZi5fbXR1c1tTZXJ2aWNlVHlwZS5SUENdO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gc2VsZi5fcHJvdG9jb2xWZXJzaW9uLmdldE1ham9yKCk7XG4gICAgICAgIGNvbnN0IGlzRW5jcnlwdGVkID0gcnBjUmVxdWVzdC5nZXRJc0VuY3J5cHRlZCgpO1xuXG4gICAgICAgIE1lc3NhZ2VGcmFtZURpc2Fzc2VtYmxlci5idWlsZFJQQyhycGNSZXF1ZXN0LCBzZXNzaW9uSWQsIG1lc3NhZ2VJRCwgbXR1LCB2ZXJzaW9uLCBpc0VuY3J5cHRlZCwgZnVuY3Rpb24gKHNkbFBhY2tldCkge1xuICAgICAgICAgICAgc2VsZi5zZW5kUGFja2V0KHNkbFBhY2tldCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgaW5jb21pbmcgcGFja2V0cy5cbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgX2hhbmRsZVBhY2tldFJlY2VpdmVkIChzZGxQYWNrZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Byb3RvY29sVmVyc2lvbiA9PT0gbnVsbCB8fCB0aGlzLl9wcm90b2NvbFZlcnNpb24uZ2V0TWFqb3IoKSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0VmVyc2lvbihzZGxQYWNrZXQuZ2V0VmVyc2lvbigpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcmFtZVR5cGUgPSBzZGxQYWNrZXQuZ2V0RnJhbWVUeXBlKCk7XG4gICAgICAgIGlmIChmcmFtZVR5cGUgPT09IEZyYW1lVHlwZS5DT05UUk9MKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlQ29udHJvbFBhY2tldChzZGxQYWNrZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZUZyYW1lQXNzZW1ibGVyID0gdGhpcy5fZ2V0TWVzc2FnZUZyYW1lQXNzZW1ibGVyKHNkbFBhY2tldCk7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZUZyYW1lQXNzZW1ibGVyLmhhbmRsZUZyYW1lKHNkbFBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIG5vbi1jb250cm9sIHBhY2tldHMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gYXNzZW1ibGVkLlxuICAgICAqIEBwYXJhbSB7U2RsUGFja2V0fSBzZGxQYWNrZXRcbiAgICAgKi9cbiAgICBfaGFuZGxlT25NZXNzYWdlQXNzZW1ibGVkIChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZVR5cGUgPSBzZGxQYWNrZXQuZ2V0U2VydmljZVR5cGUoKTtcblxuICAgICAgICBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLlJQQyB8fCBzZXJ2aWNlVHlwZSA9PT0gU2VydmljZVR5cGUuSFlCUklEKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlUlBDUGFja2V0KHNkbFBhY2tldCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLkhZQlJJRCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZVJQQ1BhY2tldChzZGxQYWNrZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdVbmhhbmRsZWQgc2VydmljZSB0eXBlICcsIHNkbFBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1lc3NhZ2UgZnJhbWUgYXNzZW1ibGVyIGZvciB0aGUgcGFja2V0LlxuICAgICAqIEBwYXJhbSB7U2RsUGFja2V0fSBzZGxQYWNrZXRcbiAgICAgKi9cbiAgICBfZ2V0TWVzc2FnZUZyYW1lQXNzZW1ibGVyIChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGxldCBtZXNzYWdlRnJhbWVBc3NlbWJsZXIgPSBzZWxmLl9tZXNzYWdlRnJhbWVBc3NlbWJsZXJzW3NkbFBhY2tldC5nZXRNZXNzYWdlSUQoKV07XG4gICAgICAgIGlmICghbWVzc2FnZUZyYW1lQXNzZW1ibGVyKSB7XG4gICAgICAgICAgICBtZXNzYWdlRnJhbWVBc3NlbWJsZXIgPSBuZXcgTWVzc2FnZUZyYW1lQXNzZW1ibGVyKGZ1bmN0aW9uIChlcnIsIHNkbFBhY2tldCkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNlbGYuX21lc3NhZ2VGcmFtZUFzc2VtYmxlcnNbc2RsUGFja2V0LmdldE1lc3NhZ2VJRCgpXSA9IG51bGw7IC8vIFJlbW92ZSB0aGUgbWFwcGluZ1xuICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZU9uTWVzc2FnZUFzc2VtYmxlZChzZGxQYWNrZXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxmLl9tZXNzYWdlRnJhbWVBc3NlbWJsZXJzW3NkbFBhY2tldC5nZXRNZXNzYWdlSUQoKV0gPSBtZXNzYWdlRnJhbWVBc3NlbWJsZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVzc2FnZUZyYW1lQXNzZW1ibGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgaW5jb21pbmcgY29udHJvbCBwYWNrZXRzLlxuICAgICAqIEBwYXJhbSB7IFNkbFBhY2tldCB9IHNkbFBhY2tldFxuICAgICAqL1xuICAgIF9oYW5kbGVDb250cm9sUGFja2V0IChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc3QgZnJhbWVJbmZvID0gc2RsUGFja2V0LmdldEZyYW1lSW5mbygpO1xuXG4gICAgICAgIGlmIChmcmFtZUluZm8gPT09IFNkbFBhY2tldC5GUkFNRV9JTkZPX0hFQVJUX0JFQVQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVQcm90b2NvbEhlYXJ0YmVhdChzZGxQYWNrZXQpO1xuICAgICAgICB9IGVsc2UgaWYgKGZyYW1lSW5mbyA9PT0gU2RsUGFja2V0LkZSQU1FX0lORk9fSEVBUlRfQkVBVF9BQ0spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVQcm90b2NvbEhlYXJ0YmVhdEFDSyhzZGxQYWNrZXQpO1xuICAgICAgICB9IGVsc2UgaWYgKGZyYW1lSW5mbyA9PT0gU2RsUGFja2V0LkZSQU1FX0lORk9fU1RBUlRfU0VSVklDRV9BQ0spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVTdGFydFNlcnZpY2VBQ0soc2RsUGFja2V0KTtcbiAgICAgICAgfSBlbHNlIGlmIChmcmFtZUluZm8gPT09IFNkbFBhY2tldC5GUkFNRV9JTkZPX1NUQVJUX1NFUlZJQ0VfTkFLKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlU3RhcnRTZXJ2aWNlTkFLKHNkbFBhY2tldCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZnJhbWVJbmZvID09PSBTZGxQYWNrZXQuRlJBTUVfSU5GT19FTkRfU0VSVklDRV9BQ0spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVFbmRTZXJ2aWNlQUNLKHNkbFBhY2tldCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZnJhbWVJbmZvID09PSBTZGxQYWNrZXQuRlJBTUVfSU5GT19FTkRfU0VSVklDRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUVuZFNlcnZpY2Uoc2RsUGFja2V0KTtcbiAgICAgICAgfSBlbHNlIGlmIChmcmFtZUluZm8gPT09IFNkbFBhY2tldC5GUkFNRV9JTkZPX0VORF9TRVJWSUNFX05BSykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUVuZFNlcnZpY2VOQUsoc2RsUGFja2V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVW5oYW5kbGVkIGNvbnRyb2wgcGFja2V0JywgeyBmcmFtZUluZm8gfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBoZWFydGJlYXQgKE9ubHkgYXZhaWxhYmxlIGluIHByb3RvY29sIHZlcnNpb24gMylcbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgX2hhbmRsZVByb3RvY29sSGVhcnRiZWF0IChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc3QgaGVhcnRiZWF0ID0gU2RsUGFja2V0RmFjdG9yeS5jcmVhdGVIZWFydGJlYXRBQ0soXG4gICAgICAgICAgICBTZXJ2aWNlVHlwZS5DT05UUk9MLFxuICAgICAgICAgICAgdGhpcy5fZ2V0U2Vzc2lvbklkKCksXG4gICAgICAgICAgICB0aGlzLl9wcm90b2NvbFZlcnNpb24uZ2V0TWFqb3IoKSk7XG4gICAgICAgIHRoaXMuc2VuZFBhY2tldChoZWFydGJlYXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgaGVhcnRiZWF0IEFDSy5cbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgX2hhbmRsZVByb3RvY29sSGVhcnRiZWF0QUNLIChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlY2VpdmVkIEhlYXJ0YmVhdEFDSyAtICR7c2RsUGFja2V0LnRvU3RyaW5nKCl9YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBzdGFydCBzZXJ2aWNlIEFDSy4gU2V0cyB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbiwgTVRVLCBhbmQgb3RoZXJcbiAgICAgKiBzZXJ2aWNlIHJlbGF0ZWQgaW5mby5cbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgX2hhbmRsZVN0YXJ0U2VydmljZUFDSyAoc2RsUGFja2V0KSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSBzZGxQYWNrZXQuZ2V0VmVyc2lvbigpO1xuICAgICAgICBjb25zdCBzZXJ2aWNlVHlwZSA9IHNkbFBhY2tldC5nZXRTZXJ2aWNlVHlwZSgpO1xuICAgICAgICBpZiAodmVyc2lvbiA+PSA1KSB7XG4gICAgICAgICAgICBsZXQgbXR1VGFnID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChzZXJ2aWNlVHlwZSA9PT0gU2VydmljZVR5cGUuUlBDKSB7XG4gICAgICAgICAgICAgICAgbXR1VGFnID0gQ29udHJvbEZyYW1lVGFncy5SUEMuU3RhcnRTZXJ2aWNlQUNLLk1UVTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZVR5cGUgPT09IChTZXJ2aWNlVHlwZS5QQ00pKSB7XG4gICAgICAgICAgICAgICAgbXR1VGFnID0gQ29udHJvbEZyYW1lVGFncy5BdWRpby5TdGFydFNlcnZpY2VBQ0suTVRVO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlVHlwZSA9PT0gKFNlcnZpY2VUeXBlLk5BVikpIHtcbiAgICAgICAgICAgICAgICBtdHVUYWcgPSBDb250cm9sRnJhbWVUYWdzLlZpZGVvLlN0YXJ0U2VydmljZUFDSy5NVFU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtdHUgPSBzZGxQYWNrZXQuZ2V0VGFnKG10dVRhZyk7XG5cbiAgICAgICAgICAgIGlmIChtdHUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tdHVzW3NlcnZpY2VUeXBlXSA9IG10dTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZXJ2aWNlVHlwZSA9PT0gU2VydmljZVR5cGUuUlBDKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbklEID0gc2RsUGFja2V0LmdldFNlc3Npb25JRCgpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gaGFuZGxlIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBwcm90b2NvbCB3aGVyZSB0aGlzIHdhcyBqdXN0IHRoZWlyIHBheWxvYWQsIG5vIEJTT05cbiAgICAgICAgICAgICAgICB0aGlzLl9oYXNoSUQgPSBzZGxQYWNrZXQuZ2V0VGFnKENvbnRyb2xGcmFtZVRhZ3MuUlBDLlN0YXJ0U2VydmljZUFDSy5IQVNIX0lEKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gc2RsUGFja2V0LmdldFRhZyhDb250cm9sRnJhbWVUYWdzLlJQQy5TdGFydFNlcnZpY2VBQ0suUFJPVE9DT0xfVkVSU0lPTik7XG4gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGNvbmZpcm1lZCB0aGUgbmVnb3RpYXRlZCB2ZXJzaW9uIGJldHdlZW4gdGhlIG1vZHVsZSBhbmQgdGhlIHByb3h5XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sVmVyc2lvbiA9IChuZXcgVmVyc2lvbigpKS5mcm9tU3RyaW5nKHZlcnNpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sVmVyc2lvbiA9IG5ldyBWZXJzaW9uKDUsIDAsIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLlZJREVPKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NkbFByb3RvY29sTGlzdGVuZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRSZXNvbHV0aW9uID0gbmV3IEltYWdlUmVzb2x1dGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2NlcHRlZEZvcm1hdCA9IG5ldyBWaWRlb1N0cmVhbWluZ0Zvcm1hdCgpO1xuICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZFJlc29sdXRpb24uc2V0UmVzb2x1dGlvbkhlaWdodChNYXRoLmZsb29yKHNkbFBhY2tldC5nZXRUYWcoQ29udHJvbEZyYW1lVGFncy5WaWRlby5TdGFydFNlcnZpY2VBQ0suSEVJR0hUKSkpO1xuICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZFJlc29sdXRpb24uc2V0UmVzb2x1dGlvbldpZHRoKE1hdGguZmxvb3Ioc2RsUGFja2V0LmdldFRhZyhDb250cm9sRnJhbWVUYWdzLlZpZGVvLlN0YXJ0U2VydmljZUFDSy5XSURUSCkpKTtcblxuICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZEZvcm1hdC5zZXRDb2RlYyhzZGxQYWNrZXQuZ2V0VGFnKENvbnRyb2xGcmFtZVRhZ3MuVmlkZW8uU3RhcnRTZXJ2aWNlQUNLLlZJREVPX0NPREVDKSk7XG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkRm9ybWF0LnNldFByb3RvY29sKHNkbFBhY2tldC5nZXRUYWcoQ29udHJvbEZyYW1lVGFncy5WaWRlby5TdGFydFNlcnZpY2VBQ0suVklERU9fUFJPVE9DT0wpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWdyZWVkVmlkZW9QYXJhbXMgPSB0aGlzLl9zZGxQcm90b2NvbExpc3RlbmVyLmdldERlc2lyZWRWaWRlb1BhcmFtcygpO1xuICAgICAgICAgICAgICAgICAgICBhZ3JlZWRWaWRlb1BhcmFtcy5zZXRSZXNvbHV0aW9uKGFjY2VwdGVkUmVzb2x1dGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGFncmVlZFZpZGVvUGFyYW1zLnNldEZvcm1hdChhY2NlcHRlZEZvcm1hdCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2xMaXN0ZW5lci5zZXRBY2NlcHRlZFZpZGVvUGFyYW1zKGFncmVlZFZpZGVvUGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcHJvdG9jb2xWZXJzaW9uLmdldE1ham9yKCkgPiAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHNkbFBhY2tldC5nZXRQYXlsb2FkKCk7XG4gICAgICAgICAgICAgICAgaWYgKHBheWxvYWQgIT09IG51bGwgJiYgcGF5bG9hZC5sZW5ndGggPT09IDQpIHsgLy8gaGFzaGlkIHdpbGwgYmUgNCBieXRlcyBpbiBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFzaElEID0gQml0Q29udmVydGVyLmFycmF5QnVmZmVyVG9JbnQzMihwYXlsb2FkLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2xMaXN0ZW5lci5vblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQoc2VydmljZVR5cGUsXG4gICAgICAgICAgICBzZGxQYWNrZXQuZ2V0U2Vzc2lvbklEKCksIHRoaXMuX3Byb3RvY29sVmVyc2lvbi5nZXRNYWpvcigpLCAnJywgdGhpcy5faGFzaElELCBzZGxQYWNrZXQuZ2V0RW5jcnlwdGlvbigpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHN0YXJ0IHNlcnZpY2UgcmVqZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7U2RsUGFja2V0fSBzZGxQYWNrZXRcbiAgICAgKi9cbiAgICBfaGFuZGxlU3RhcnRTZXJ2aWNlTkFLIChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBgR290IFN0YXJ0U2Vzc2lvbk5BQ0sgZm9yIHByb3RvY29sIHNlc3Npb25JRCAke3NkbFBhY2tldC5nZXRTZXNzaW9uSUQoKX1gO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBzZXJ2aWNlIGVuZGVkIGJ5IGFwcCBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7U2RsUGFja2V0fSBzZGxQYWNrZXRcbiAgICAgKi9cbiAgICBfaGFuZGxlRW5kU2VydmljZUFDSyAoc2RsUGFja2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVTZXJ2aWNlRW5kZWQoc2RsUGFja2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJ2aWNlIGVuZGVkIGJ5IG5vbiBhcHAgcHJvY2VzcyBvciBmb3Igc29tZSB1bmV4cGVjdGVkIHJlYXNvbi5cbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgX2hhbmRsZUVuZFNlcnZpY2UgKHNkbFBhY2tldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlU2VydmljZUVuZGVkKHNkbFBhY2tldCk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHNlcml2Y2UgZW5kaW5nLlxuICAgICAqIEBwYXJhbSB7Kn0gc2RsUGFja2V0XG4gICAgICovXG4gICAgX2hhbmRsZVNlcnZpY2VFbmRlZCAoc2RsUGFja2V0KSB7XG4gICAgICAgIHRoaXMuX3NkbFByb3RvY29sTGlzdGVuZXIub25Qcm90b2NvbFNlc3Npb25FbmRlZChzZGxQYWNrZXQuZ2V0U2VydmljZVR5cGUoKSwgc2RsUGFja2V0LmdldFNlc3Npb25JRCgpLCAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBzZXJ2aWNlIGVuZCByZWplY3Rpb24uXG4gICAgICogQHBhcmFtIHtTZGxQYWNrZXR9IHNkbFBhY2tldFxuICAgICAqL1xuICAgIF9oYW5kbGVFbmRTZXJ2aWNlTkFLIChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZVR5cGUgPSBzZGxQYWNrZXQuZ2V0U2VydmljZVR5cGUoKTtcbiAgICAgICAgY29uc3QgcHJvdG9jb2xWZXJzaW9uID0gc2RsUGFja2V0LmdldFZlcnNpb24oKTtcbiAgICAgICAgaWYgKHByb3RvY29sVmVyc2lvbiA+PSA1KSB7XG4gICAgICAgICAgICBsZXQgcmVqZWN0ZWRUYWcgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHNlcnZpY2VUeXBlID09PSBTZXJ2aWNlVHlwZS5BVURJTykge1xuICAgICAgICAgICAgICAgIHJlamVjdGVkVGFnID0gQ29udHJvbEZyYW1lVGFncy5BdWRpby5FbmRTZXJ2aWNlTkFLLlJFSkVDVEVEX1BBUkFNUztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLlZJREVPKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0ZWRUYWcgPSBDb250cm9sRnJhbWVUYWdzLlZpZGVvLkVuZFNlcnZpY2VOQUsuUkVKRUNURURfUEFSQU1TO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVqZWN0ZWRQYXJhbXMgPSBzZGxQYWNrZXQuZ2V0VGFnKHJlamVjdGVkVGFnKTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlamVjdGVkUGFyYW1zKSAmJiByZWplY3RlZFBhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignR290IEVuZFNlc3Npb25OQUsgd2l0aCByZWplY3RlZCBwYXJhbXMnLCByZWplY3RlZFBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2xMaXN0ZW5lci5vblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkKHNlcnZpY2VUeXBlLCBzZGxQYWNrZXQuZ2V0U2Vzc2lvbklEKCksICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGluY29taW5nIGFzc2VtYmxlZCBycGMgcGFja2V0LlxuICAgICAqIE5vdGlmaWVzIHNkbFByb3RvY29sTGlzdGVuZXIgb2YgdGhlIGV2ZW50IGFmdGVyIGFzc2VtYmxlaW5nIGFuIFJwY01lc3NhZ2VcbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgX2hhbmRsZVJQQ1BhY2tldCAoc2RsUGFja2V0KSB7XG4gICAgICAgIGNvbnN0IHJwY01lc3NhZ2UgPSBScGNDcmVhdG9yLmNvbnN0cnVjdChzZGxQYWNrZXQpO1xuICAgICAgICBpZiAocnBjTWVzc2FnZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2xMaXN0ZW5lci5vblJwY01lc3NhZ2VSZWNlaXZlZChycGNNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuZHMgdGhlIGRlZmF1bHQgc2Vzc2lvbi5cbiAgICAgKi9cbiAgICBlbmRTZXNzaW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5fZ2V0U2Vzc2lvbklkKCk7XG4gICAgICAgIGNvbnN0IGhhc2hJRCA9IHRoaXMuX2hhc2hJRDtcbiAgICAgICAgY29uc3Qgc2VydmljZVR5cGUgPSBTZXJ2aWNlVHlwZS5SUEM7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJRCA9IHRoaXMuX2dldE5leHRNZXNzYWdlSUQoKTtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuX3Byb3RvY29sVmVyc2lvbi5nZXRNYWpvcigpO1xuICAgICAgICBjb25zdCBzZGxQYWNrZXQgPSBTZGxQYWNrZXRGYWN0b3J5LmNyZWF0ZUVuZFNlc3Npb24oc2VydmljZVR5cGUsIHNlc3Npb25JZCwgbWVzc2FnZUlELCB2ZXJzaW9uLCBoYXNoSUQpO1xuICAgICAgICB0aGlzLnNlbmRQYWNrZXQoc2RsUGFja2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmRzIGEgc3BlY2lmaWMgc2VydmljZVxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlIC0gU2VydmljZSB0eXBlIGJlaW5nIGVuZGVkLiBXaGVuIHRoZSBSUEMgc2VydmljZSBpcyBlbmRlZCB0aGUgZW50aXJlIHNlc3Npb24gZW5kcy5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc2Vzc2lvbklkIC0gcmVwcmVzZW50cyBhIGJ5dGVcbiAgICAgKi9cbiAgICBlbmRTZXJ2aWNlIChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklkKSB7XG4gICAgICAgIGlmIChzZXJ2aWNlVHlwZSA9PT0gU2VydmljZVR5cGUuUlBDKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbmRTZXNzaW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBoYXNoSUQgPSB0aGlzLl9oYXNoSUQ7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlSUQgPSB0aGlzLl9nZXROZXh0TWVzc2FnZUlEKCk7XG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5fcHJvdG9jb2xWZXJzaW9uLmdldE1ham9yKCk7XG4gICAgICAgICAgICBjb25zdCBzZGxQYWNrZXQgPSBTZGxQYWNrZXRGYWN0b3J5LmNyZWF0ZUVuZFNlc3Npb24oc2VydmljZVR5cGUsIHNlc3Npb25JZCwgbWVzc2FnZUlELCB2ZXJzaW9uLCBoYXNoSUQpO1xuICAgICAgICAgICAgdGhpcy5zZW5kUGFja2V0KHNkbFBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogT3JpZ2luYWwgaGVhZGVyIHNpemUgYmFzZWQgb24gdmVyc2lvbiAxLjAuMCBvbmx5XG4gKi9cblNkbFByb3RvY29sQmFzZS5WMV9IRUFERVJfU0laRSA9IDg7XG4vKipcbiAqIExhcmdlciBoZWFkZXIgc2l6ZSB0aGF0IGlzIHVzZWQgYnkgdmVyc2lvbnMgMi4wLjAgYW5kIHVwXG4gKi9cblNkbFByb3RvY29sQmFzZS5WMl9IRUFERVJfU0laRSA9IDEyO1xuXG5TZGxQcm90b2NvbEJhc2UuVjFfVjJfTVRVX1NJWkUgPSAxNTAwO1xuU2RsUHJvdG9jb2xCYXNlLlYzX1Y0X01UVV9TSVpFID0gMTMxMDcyO1xuXG4vKipcbiAqIE1heCBzdXBwb3J0ZWQgcHJvdG9jb2wgdmVyc2lvbiBpbiB0aGlzIHJlbGVhc2Ugb2YgdGhlIGxpYnJhcnlcbiovXG5TZGxQcm90b2NvbEJhc2UuTUFYX1BST1RPQ09MX1ZFUlNJT04gPSBuZXcgVmVyc2lvbig1LCAyLCAwKTtcblxuZXhwb3J0IHsgU2RsUHJvdG9jb2xCYXNlIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IFRyYW5zcG9ydFR5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFRyYW5zcG9ydFR5cGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IFdFQlNPQ0tFVF9DTElFTlQgKCkge1xuICAgICAgICByZXR1cm4gVHJhbnNwb3J0VHlwZS5fTUFQLldFQlNPQ0tFVF9DTElFTlQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgV0VCU09DS0VUX1NFUlZFUiAoKSB7XG4gICAgICAgIHJldHVybiBUcmFuc3BvcnRUeXBlLl9NQVAuV0VCU09DS0VUX1NFUlZFUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBDVVNUT00gKCkge1xuICAgICAgICByZXR1cm4gVHJhbnNwb3J0VHlwZS5fTUFQLkNVU1RPTTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gVHJhbnNwb3J0VHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBUcmFuc3BvcnRUeXBlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBUcmFuc3BvcnRUeXBlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgVHJhbnNwb3J0VHlwZS5fTUFQKTtcbiAgICB9XG59XG5cblRyYW5zcG9ydFR5cGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdXRUJTT0NLRVRfQ0xJRU5UJzogJ1dFQlNPQ0tFVF9DTElFTlQnLFxuICAgICdXRUJTT0NLRVRfU0VSVkVSJzogJ1dFQlNPQ0tFVF9TRVJWRVInLFxuICAgICdDVVNUT00nOiAnQ1VTVE9NJyxcbn0pO1xuXG5leHBvcnQgeyBUcmFuc3BvcnRUeXBlIH07IiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4gKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiAqIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuICogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4gKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbmltcG9ydCB7IEZyYW1lVHlwZSB9IGZyb20gJy4uL3Byb3RvY29sL2VudW1zL0ZyYW1lVHlwZS5qcyc7XG5pbXBvcnQgeyBTZGxQYWNrZXQgfSBmcm9tICcuLi9wcm90b2NvbC9TZGxQYWNrZXQuanMnO1xuaW1wb3J0IHsgU2RsUHJvdG9jb2xCYXNlIH0gZnJvbSAnLi4vcHJvdG9jb2wvU2RsUHJvdG9jb2xCYXNlLmpzJztcblxuLyoqXG4gKiBQYXJzZXMgaW5jb21pbmcgYnl0ZXMgYWNjb3JkaW5nIHRvIHRoZSBwcm90b2NvbCBzcGVjLlxuICovXG5jbGFzcyBTZGxQc20ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYWxsIGludGVybmFsIG1lbWJlcnMgdG8gZGVmYXVsdFxuICAgICAqL1xuICAgIHJlc2V0ICgpIHtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBTZGxQc20uU1RBUlRfU1RBVEU7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSAwO1xuICAgICAgICB0aGlzLl9lbmNyeXB0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2ZyYW1lVHlwZSA9IEZyYW1lVHlwZS5TSU5HTEU7XG4gICAgICAgIHRoaXMuX3NlcnZpY2VUeXBlID0gMDtcbiAgICAgICAgdGhpcy5fY29udHJvbEZyYW1lSW5mbyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3Nlc3Npb25JRCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2R1bXBTaXplID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZGF0YUxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VJRCA9IDA7XG4gICAgICAgIHRoaXMuX3BheWxvYWQgPSBudWxsO1xuICAgIH1cblxuXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IC0gU3RhdGUgcmVwcmVzZW50ZWQgYnkgYSBOdW1iZXJcbiAgICAgKi9cbiAgICBnZXRTdGF0ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTZGxQYWNrZXR9IC0gUmV0dXJucyBudWxsIGlmIG5vdCBjb21wbGV0ZVxuICAgICAqL1xuXG4gICAgZ2V0Rm9ybWVkUGFja2V0ICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBTZGxQc20uRklOSVNIRURfU1RBVEUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2RsUGFja2V0KHRoaXMuX3ZlcnNpb24sIHRoaXMuX2VuY3J5cHRpb24sIHRoaXMuX2ZyYW1lVHlwZSwgdGhpcy5fc2VydmljZVR5cGUsIHRoaXMuX2NvbnRyb2xGcmFtZUluZm8sIHRoaXMuX3Nlc3Npb25JRCwgdGhpcy5fZGF0YUxlbmd0aCwgdGhpcy5fbWVzc2FnZUlELCB0aGlzLl9wYXlsb2FkLCAwLCB0aGlzLl9kYXRhTGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB0aGUgbmV4dCBieXRlIGluIHRoZSBzdHJlYW0gb2YgZGF0YS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZGF0YSAtIFJlcHJlc2VudHMgYSBieXRlXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gLSBUcnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIGhhbmRsZUJ5dGUgKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSB0aGlzLl90cmFuc2l0aW9uT25JbnB1dChkYXRhLCB0aGlzLl9zdGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gU2RsUHNtLkVSUk9SX1NUQVRFKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJhd0J5dGUgLSBSZXByZXNlbnRzIGEgYnl0ZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzdGF0ZVxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdHJhbnNpdGlvbk9uSW5wdXQgKHJhd0J5dGUsIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gU2RsUHNtLlNUQVJUX1NUQVRFKSB7IC8vIGJ5dGUgMVxuICAgICAgICAgICAgdGhpcy5fdmVyc2lvbiA9IChyYXdCeXRlICYgU2RsUHNtLlZFUlNJT05fTUFTSykgPj4gNDtcbiAgICAgICAgICAgIGlmICh0aGlzLl92ZXJzaW9uID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5FUlJPUl9TVEFURTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZW5jcnlwdGlvbiA9ICgxID09PSAoKHJhd0J5dGUgJiBTZGxQc20uRU5DUllQVElPTl9NQVNLKSA+PiAzKSk7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZVR5cGUgPSByYXdCeXRlICYgU2RsUHNtLkZSQU1FX1RZUEVfTUFTSztcblxuICAgICAgICAgICAgaWYgKCh0aGlzLl92ZXJzaW9uIDwgMSB8fCB0aGlzLl92ZXJzaW9uID4gNSkgJiYgdGhpcy5fZnJhbWVUeXBlICE9PSBGcmFtZVR5cGUuQ09OVFJPTCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTZGxQc20uRVJST1JfU1RBVEU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9mcmFtZVR5cGUgPCBGcmFtZVR5cGUuQ09OVFJPTCB8fCB0aGlzLl9mcmFtZVR5cGUgPiBGcmFtZVR5cGUuQ09OU0VDVVRJVkUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkVSUk9SX1NUQVRFO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5TRVJWSUNFX1RZUEVfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNkbFBzbS5TRVJWSUNFX1RZUEVfU1RBVEUpIHsgLy8gYnl0ZSAyXG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlVHlwZSA9IChyYXdCeXRlICYgMHhGRik7XG5cbiAgICAgICAgICAgIHJldHVybiBTZGxQc20uQ09OVFJPTF9GUkFNRV9JTkZPX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBTZGxQc20uQ09OVFJPTF9GUkFNRV9JTkZPX1NUQVRFKSB7IC8vIGJ5dGUgM1xuICAgICAgICAgICAgdGhpcy5fY29udHJvbEZyYW1lSW5mbyA9IHJhd0J5dGUgJiAweEZGO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX2ZyYW1lVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgRnJhbWVUeXBlLkNPTlRST0w6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRnJhbWVUeXBlLlNJTkdMRTogLy8gRmFsbCB0aHJvdWdoIHNpbmNlIHRoZXkgYXJlIGJvdGggdGhlIHNhbWVcbiAgICAgICAgICAgICAgICBjYXNlIEZyYW1lVHlwZS5GSVJTVDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2xGcmFtZUluZm8gIT09IDB4MDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTZGxQc20uRVJST1JfU1RBVEU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBGcmFtZVR5cGUuQ09OU0VDVVRJVkU6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5FUlJPUl9TVEFURTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBTZGxQc20uU0VTU0lPTl9JRF9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU2RsUHNtLlNFU1NJT05fSURfU1RBVEUpIHsgLy8gYnl0ZSA0XG4gICAgICAgICAgICB0aGlzLl9zZXNzaW9uSUQgPSAocmF3Qnl0ZSAmIDB4RkYpO1xuICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5EQVRBX1NJWkVfMV9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU2RsUHNtLkRBVEFfU0laRV8xX1NUQVRFKSB7IC8vIGJ5dGUgNVxuICAgICAgICAgICAgdGhpcy5fZGF0YUxlbmd0aCArPSAocmF3Qnl0ZSAmIDB4RkYpIDw8IDI0O1xuICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5EQVRBX1NJWkVfMl9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU2RsUHNtLkRBVEFfU0laRV8yX1NUQVRFKSB7IC8vIGJ5dGUgNlxuICAgICAgICAgICAgdGhpcy5fZGF0YUxlbmd0aCArPSAocmF3Qnl0ZSAmIDB4RkYpIDw8IDE2OyAvLyAjIDIgYnl0ZXMgeCA4IGJpdHNcbiAgICAgICAgICAgIHJldHVybiBTZGxQc20uREFUQV9TSVpFXzNfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNkbFBzbS5EQVRBX1NJWkVfM19TVEFURSkgeyAvLyBieXRlIDdcbiAgICAgICAgICAgIHRoaXMuX2RhdGFMZW5ndGggKz0gKHJhd0J5dGUgJiAweEZGKSA8PCA4OyAvLyAjICAxIGJ5dGUgeCA4IGJpdHNcbiAgICAgICAgICAgIHJldHVybiBTZGxQc20uREFUQV9TSVpFXzRfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNkbFBzbS5EQVRBX1NJWkVfNF9TVEFURSkgeyAvLyBieXRlIDhcbiAgICAgICAgICAgIHRoaXMuX2RhdGFMZW5ndGggKz0gKHJhd0J5dGUgJiAweEZGKTsgLy8gIyAyIGJ5dGVzIHggOCBiaXRzXG5cbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fZnJhbWVUeXBlKSB7IC8vIElmIGFsbCBpcyBjb3JyZWN0IHdlIHNob3VsZCBicmVhayBvdXQgb2YgdGhpcyBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgICAgICAgICAgY2FzZSBGcmFtZVR5cGUuU0lOR0xFOlxuICAgICAgICAgICAgICAgIGNhc2UgRnJhbWVUeXBlLkNPTlNFQ1VUSVZFOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEZyYW1lVHlwZS5DT05UUk9MOlxuICAgICAgICAgICAgICAgIC8vIE9rLCB3ZWxsIGhlcmUncyBzb21lIGludGVyZXN0aW5nIGJpdCBvZiBrbm93bGVkZ2UuIEJlY2F1c2UgdGhlIHN0YXJ0IHNlc3Npb24gcmVxdWVzdCBpcyBmcm9tIHRoZSBwaG9uZSB3aXRoIG5vIGtub3dsZWRnZSBvZiB2ZXJzaW9uIGl0IHNlbmRzIG91dFxuICAgICAgICAgICAgICAgIC8vIGEgdjEgcGFja2V0LiBUSEVSRUZPUkUgdGhlcmUgaXMgbm8gbWVzc2FnZSBpZCBmaWVsZC4gKioqKiBOb3cgeW91IGtub3cgYW5kIGtub3dpbmcgaXMgaGFsZiB0aGUgYmF0dGxlICoqKipcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZlcnNpb24gPT09IDEgJiYgdGhpcy5fY29udHJvbEZyYW1lSW5mbyA9PT0gU2RsUGFja2V0LkZSQU1FX0lORk9fU1RBUlRfU0VSVklDRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkZJTklTSEVEX1NUQVRFOyAvLyBXZSBhcmUgZG9uZSBpZiB3ZSBkb24ndCBoYXZlIGFueSBwYXlsb2FkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZGF0YUxlbmd0aCA8PSBTZGxQcm90b2NvbEJhc2UuVjFfVjJfTVRVX1NJWkUgLSBTZGxQcm90b2NvbEJhc2UuVjFfSEVBREVSX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXlsb2FkID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fZGF0YUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTZGxQc20uRVJST1JfU1RBVEU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kdW1wU2l6ZSA9IHRoaXMuX2RhdGFMZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkRBVEFfUFVNUF9TVEFURTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgRnJhbWVUeXBlLkZJUlNUOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZGF0YUxlbmd0aCAhPT0gU2RsUHNtLkZJUlNUX0ZSQU1FX0RBVEFfU0laRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5FUlJPUl9TVEFURTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkVSUk9SX1NUQVRFO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fdmVyc2lvbiA9PT0gMSkgeyAvLyBWZXJzaW9uIDEgcGFja2V0cyB3aWxsIG5vdCBoYXZlIG1lc3NhZ2UgaWQnc1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTZGxQc20uRklOSVNIRURfU1RBVEU7IC8vIFdlIGFyZSBkb25lIGlmIHdlIGRvbid0IGhhdmUgYW55IHBheWxvYWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGFMZW5ndGggPD0gU2RsUHJvdG9jb2xCYXNlLlYxX1YyX01UVV9TSVpFIC0gU2RsUHJvdG9jb2xCYXNlLlYxX0hFQURFUl9TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BheWxvYWQgPSBuZXcgVWludDhBcnJheSh0aGlzLl9kYXRhTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkVSUk9SX1NUQVRFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9kdW1wU2l6ZSA9IHRoaXMuX2RhdGFMZW5ndGg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5EQVRBX1BVTVBfU1RBVEU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBTZGxQc20uTUVTU0FHRV8xX1NUQVRFO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBTZGxQc20uTUVTU0FHRV8xX1NUQVRFKSB7IC8vIGJ5dGUgOSwgYnl0ZXMgOS0xMiBhdmFpbGFibGUgaW4gdmVyc2lvbiAyKy5cbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VJRCArPSAocmF3Qnl0ZSAmIDB4RkYpIDw8IDI0O1xuICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5NRVNTQUdFXzJfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNkbFBzbS5NRVNTQUdFXzJfU1RBVEUpIHsgLy8gYnl0ZSAxMFxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUlEICs9IChyYXdCeXRlICYgMHhGRikgPDwgMTY7XG4gICAgICAgICAgICByZXR1cm4gU2RsUHNtLk1FU1NBR0VfM19TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU2RsUHNtLk1FU1NBR0VfM19TVEFURSkgeyAvLyBieXRlIDExXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlSUQgKz0gKHJhd0J5dGUgJiAweEZGKSA8PCA4O1xuICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5NRVNTQUdFXzRfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNkbFBzbS5NRVNTQUdFXzRfU1RBVEUpIHsgLy8gYnl0ZSAxMlxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUlEICs9IChyYXdCeXRlICYgMHhGRik7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGF0YUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTZGxQc20uRklOSVNIRURfU1RBVEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kdW1wU2l6ZSA9IHRoaXMuX2RhdGFMZW5ndGg7XG4gICAgICAgICAgICB0aGlzLl9wYXlsb2FkID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fZGF0YUxlbmd0aCk7XG4gICAgICAgICAgICByZXR1cm4gU2RsUHNtLkRBVEFfUFVNUF9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU2RsUHNtLkRBVEFfUFVNUF9TVEFURSkgeyAvLyBieXRlIDEzXG4gICAgICAgICAgICB0aGlzLl9wYXlsb2FkW3RoaXMuX2RhdGFMZW5ndGggLSB0aGlzLl9kdW1wU2l6ZV0gPSByYXdCeXRlO1xuICAgICAgICAgICAgdGhpcy5fZHVtcFNpemUgLT0gMTtcbiAgICAgICAgICAgIC8vIERvIHdlIGhhdmUgYW55IG1vcmUgYnl0ZXMgdG8gcmVhZCBpbj9cbiAgICAgICAgICAgIGlmICh0aGlzLl9kdW1wU2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkRBVEFfUFVNUF9TVEFURTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZHVtcFNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkZJTklTSEVEX1NUQVRFO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkVSUk9SX1NUQVRFO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5TZGxQc20uU1RBUlRfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDtcblNkbFBzbS5TRVJWSUNFX1RZUEVfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjtcblNkbFBzbS5DT05UUk9MX0ZSQU1FX0lORk9fU1RBVEUgICAgICAgICAgICAgICAgID0gMHgwMztcblNkbFBzbS5TRVNTSU9OX0lEX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDtcblNkbFBzbS5EQVRBX1NJWkVfMV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTtcblNkbFBzbS5EQVRBX1NJWkVfMl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNjtcblNkbFBzbS5EQVRBX1NJWkVfM19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNztcblNkbFBzbS5EQVRBX1NJWkVfNF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODtcblNkbFBzbS5NRVNTQUdFXzFfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwOTtcblNkbFBzbS5NRVNTQUdFXzJfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQTtcblNkbFBzbS5NRVNTQUdFXzNfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjtcblNkbFBzbS5NRVNTQUdFXzRfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQztcblNkbFBzbS5EQVRBX1BVTVBfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDtcblNkbFBzbS5GSU5JU0hFRF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhGRjtcblNkbFBzbS5FUlJPUl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTE7XG5cblNkbFBzbS5GSVJTVF9GUkFNRV9EQVRBX1NJWkUgICAgICAgICAgICAgICAgICAgID0gMHgwODtcblNkbFBzbS5WRVJTSU9OX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhGMDsgLy8gNCBoaWdoZXN0IGJpdHNcblNkbFBzbS5FTkNSWVBUSU9OX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODsgLy8gNHRoIGxvd2VzdCBiaXRcblNkbFBzbS5GUkFNRV9UWVBFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNzsgLy8gMyBsb3dlc3QgYml0c1xuXG5leHBvcnQgeyBTZGxQc20gfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgU2RsUHNtIH0gZnJvbSAnLi9TZGxQc20uanMnO1xuXG5jbGFzcyBUcmFuc3BvcnRCYXNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0Jhc2VUcmFuc3BvcnRDb25maWd9IHRyYW5zcG9ydENvbmZpZ1xuICAgICAqIEBwYXJhbSB7VHJhbnNwb3J0Q2FsbGJhY2t9IHRyYW5zcG9ydENhbGxiYWNrXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHRyYW5zcG9ydENvbmZpZywgdHJhbnNwb3J0Q2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fc2RsUHNtID0gbmV3IFNkbFBzbSgpO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRDb25maWcgPSB0cmFuc3BvcnRDb25maWc7XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrID0gdHJhbnNwb3J0Q2FsbGJhY2s7XG4gICAgfVxuXG4gICAgc3RhcnQgKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YXJ0IG1ldGhvZCBtdXN0IGJlIG92ZXJyaWRkZW4nKTtcbiAgICB9XG5cbiAgICBzdG9wICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdG9wIG1ldGhvZCBtdXN0IGJlIG92ZXJyaWRkZW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgc2VuZFBhY2tldCAoc2RsUGFja2V0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc2VuZFBhY2tldCBtZXRob2QgbXVzdCBiZSBvdmVycmlkZGVuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUcmFuc3BvcnRDYWxsYmFja30gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBzZXRUcmFuc3BvcnRDYWxsYmFjayAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUcmFuc3BvcnRDYWxsYmFjayBtZXRob2QgbXVzdCBiZSBvdmVycmlkZGVuJyk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBUcmFuc3BvcnRCYXNlIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgVHJhbnNwb3J0QmFzZSB9IGZyb20gJy4vVHJhbnNwb3J0QmFzZS5qcyc7XG5pbXBvcnQgeyBTZGxQc20gfSBmcm9tICcuL1NkbFBzbS5qcyc7XG5cbmNsYXNzIFdlYlNvY2tldENsaWVudCBleHRlbmRzIFRyYW5zcG9ydEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjb25maWcsIHRyYW5zcG9ydENhbGxiYWNrKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZywgdHJhbnNwb3J0Q2FsbGJhY2spO1xuICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fd3NVcmwgPSBgJHtjb25maWcuZ2V0SG9zdCgpfToke2NvbmZpZy5nZXRQb3J0KCl9YDtcbiAgICAgICAgdGhpcy5fd3MgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VHJhbnNwb3J0Q2FsbGJhY2t9IGNhbGxiYWNrXG4gICAgICovXG4gICAgc2V0VHJhbnNwb3J0Q2FsbGJhY2sgKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uXG4gICAgICovXG4gICAgc3RhcnQgKCkge1xuICAgICAgICB0aGlzLl9pbml0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhdGVzIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIHVybCBwYXNzZWQgaW4gYW5kIGxpc3RlbnMgZm9yIG1lc3NhZ2VzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaW5pdCAoKSB7XG4gICAgICAgIHRoaXMuX3dzICA9IG5ldyBXZWJTb2NrZXQodGhpcy5fd3NVcmwpO1xuXG4gICAgICAgIHRoaXMuX3dzLm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrLm9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fd3Mub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNvbm5lY3QnLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjay5vbkVycm9yKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fd3Mub25tZXNzYWdlID0gKG1zZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlSW5jb21pbmcobXNnKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl93cy5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2sub25Db25uZWN0aW9uVGVybWluYXRlZCgpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb25cbiAgICAgKi9cbiAgICBzdG9wICgpIHtcbiAgICAgICAgdGhpcy5fd3MuY2xvc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudHMgaW4gdGhlIHBhY2tldCBzaG91bGQgYmUgc2VudCBvdXQgdGhyb3VnaCB0aGUgdHJhbnNwb3J0XG4gICAgICogQHBhcmFtIHtTZGxQYWNrZXR9IHBhY2tldFxuICAgICAqL1xuICAgIHNlbmRQYWNrZXQgKHBhY2tldCkge1xuICAgICAgICBjb25zdCBieXRlcyA9IHBhY2tldC50b1BhY2tldCgpO1xuICAgICAgICB0aGlzLl93cy5zZW5kKGJ5dGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciBhIG5ldyBtZXNzYWdlIGNvbWVzIGluXG4gICAgICogQHBhcmFtIHtNZXNzYWdlRXZlbnR9IG1zZ1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2hhbmRsZUluY29taW5nIChtc2cpIHtcbiAgICAgICAgdGhpcy5fcXVldWUucHVzaChtc2cuZGF0YSk7XG4gICAgICAgIHRoaXMuX211bHRpQnl0ZUhhbmRsZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgcmVjZWl2ZWQgZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBxdWV1ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX211bHRpQnl0ZUhhbmRsZXIgKCkge1xuICAgICAgICBpZiAodGhpcy5faXNSdW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gdHJ1ZTtcblxuICAgICAgICB3aGlsZSAodGhpcy5fcXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbXNnRGF0YSA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBuZXcgUmVzcG9uc2UobXNnRGF0YSkuYXJyYXlCdWZmZXIoKS50aGVuKChhcnJheUJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYnl0ZSBvZiB1aW50OCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVCeXRlKGJ5dGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmVlZHMgYSBieXRlIHRocm91Z2ggdGhlIGludGVybmFsIFBTTVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBieXRlIC0gdW5zaWduZWQgOC1iaXQgaW50ZWdlclxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2hhbmRsZUJ5dGUgKGJ5dGUpIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuX3NkbFBzbS5oYW5kbGVCeXRlKGJ5dGUpO1xuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZhaWxlZCcsIHRoaXMuX3NkbFBzbSk7XG4gICAgICAgICAgICB0aGlzLl9zZGxQc20ucmVzZXQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0ZpbmlzaGVkID0gdGhpcy5fc2RsUHNtLmdldFN0YXRlKCkgPT09IFNkbFBzbS5GSU5JU0hFRF9TVEFURTtcblxuICAgICAgICBpZiAoaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gdGhpcy5fc2RsUHNtLmdldEZvcm1lZFBhY2tldCgpO1xuICAgICAgICAgICAgdGhpcy5fc2RsUHNtLnJlc2V0KCk7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjay5vblBhY2tldFJlY2VpdmVkKHBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuZXhwb3J0IHsgV2ViU29ja2V0Q2xpZW50IH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmNsYXNzIFRyYW5zcG9ydENhbGxiYWNrIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuX29uQ29ubmVjdGlvbkVzdGFibGlzaGVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25FcnJvciA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uQ29ubmVjdGlvblRlcm1pbmF0ZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblBhY2tldFJlY2VpdmVkID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHNldE9uQ29ubmVjdGlvbkVzdGFibGlzaGVkIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25FcnJvciAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25FcnJvciA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25Db25uZWN0aW9uVGVybWluYXRlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25Db25uZWN0aW9uVGVybWluYXRlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25QYWNrZXRSZWNlaXZlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25QYWNrZXRSZWNlaXZlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXIgZm9yIHdoZW4gYSBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxcbiAgICAgKi9cbiAgICBvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCAoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25Db25uZWN0aW9uRXN0YWJsaXNoZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ29ubmVjdGlvbkVzdGFibGlzaGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVyIGZvciB3aGVuIGEgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgb25FcnJvciAoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlciBmb3Igd2hlbiBhIGNvbm5lY3Rpb24gaXMgZHJvcHBlZFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWFzb25cbiAgICAgKi9cbiAgICBvbkNvbm5lY3Rpb25UZXJtaW5hdGVkIChyZWFzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vbkNvbm5lY3Rpb25UZXJtaW5hdGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNvbm5lY3Rpb25UZXJtaW5hdGVkKHJlYXNvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVyIGZvciB3aGVuIGEgcGFja2V0IGlzIHJlY2VpdmVkXG4gICAgICogQHBhcmFtIHtTZGxQYWNrZXR9IHBhY2tldFxuICAgICAqL1xuICAgIG9uUGFja2V0UmVjZWl2ZWQgKHBhY2tldCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uUGFja2V0UmVjZWl2ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uUGFja2V0UmVjZWl2ZWQocGFja2V0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5leHBvcnQgeyBUcmFuc3BvcnRDYWxsYmFjayB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBUcmFuc3BvcnRUeXBlIH0gZnJvbSAnLi9lbnVtcy9UcmFuc3BvcnRUeXBlLmpzJztcbmltcG9ydCB7IFdlYlNvY2tldENsaWVudCB9IGZyb20gJy4vV2ViU29ja2V0Q2xpZW50LmpzJztcbmltcG9ydCB7IFRyYW5zcG9ydENhbGxiYWNrIH0gZnJvbSAnLi9UcmFuc3BvcnRDYWxsYmFjay5qcyc7XG5cbmNsYXNzIFRyYW5zcG9ydE1hbmFnZXJCYXNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0Jhc2VUcmFuc3BvcnRDb25maWd9IGJhc2VUcmFuc3BvcnRDb25maWdcbiAgICAgKiBAcGFyYW0ge1RyYW5zcG9ydExpc3RlbmVyfSB0cmFuc3BvcnRMaXN0ZW5lclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChiYXNlVHJhbnNwb3J0Q29uZmlnLCB0cmFuc3BvcnRMaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRDb25maWcgPSBiYXNlVHJhbnNwb3J0Q29uZmlnO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRMaXN0ZW5lciA9IHRyYW5zcG9ydExpc3RlbmVyO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjayA9IG5ldyBUcmFuc3BvcnRDYWxsYmFjaygpO1xuXG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrLnNldE9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyYW5zcG9ydExpc3RlbmVyLm9uVHJhbnNwb3J0Q29ubmVjdGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjay5zZXRPbkNvbm5lY3Rpb25UZXJtaW5hdGVkKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjay5zZXRPblBhY2tldFJlY2VpdmVkKHRoaXMub25QYWNrZXRSZWNlaXZlZC5iaW5kKHRoaXMpKTtcblxuICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0Q29uZmlnLmdldFRyYW5zcG9ydFR5cGUoKSA9PT0gVHJhbnNwb3J0VHlwZS5XRUJTT0NLRVRfQ0xJRU5UKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBuZXcgV2ViU29ja2V0Q2xpZW50KHRoaXMuX3RyYW5zcG9ydENvbmZpZywgdGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2spO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3RyYW5zcG9ydENvbmZpZy5nZXRUcmFuc3BvcnRUeXBlKCkgPT09IFRyYW5zcG9ydFR5cGUuQ1VTVE9NKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSB0aGlzLl90cmFuc3BvcnRDb25maWcuZ2V0VHJhbnNwb3J0KCk7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQuc2V0VHJhbnNwb3J0Q2FsbGJhY2sodGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25UcmFuc3BvcnRDb25uZWN0ZWQgKCkge1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRMaXN0ZW5lci5vblRyYW5zcG9ydENvbm5lY3RlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICAgKi9cbiAgICBvblRyYW5zcG9ydERpc2Nvbm5lY3RlZCAoZnVuYykge1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRMaXN0ZW5lci5vblRyYW5zcG9ydERpc2Nvbm5lY3RlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICAgKi9cbiAgICBvbkVycm9yIChmdW5jKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydExpc3RlbmVyLm9uRXJyb3IoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgb25QYWNrZXRSZWNlaXZlZCAoc2RsUGFja2V0KSB7XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydExpc3RlbmVyLm9uUGFja2V0UmVjZWl2ZWQoc2RsUGFja2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb25cbiAgICAgKi9cbiAgICBzdGFydCAoKSB7XG4gICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuX3RyYW5zcG9ydC5zdGFydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNwb3J0LnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uXG4gICAgICovXG4gICAgc3RvcCAoKSB7XG4gICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuX3RyYW5zcG9ydC5zdG9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRlbnRzIGluIHRoZSBwYWNrZXQgc2hvdWxkIGJlIHNlbnQgb3V0IHRocm91Z2ggdGhlIHRyYW5zcG9ydFxuICAgICAqIEBwYXJhbSB7U2RsUGFja2V0fSBwYWNrZXRcbiAgICAgKi9cbiAgICBzZW5kUGFja2V0IChwYWNrZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5fdHJhbnNwb3J0LnNlbmRQYWNrZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydC5zZW5kUGFja2V0KHBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RyYW5zcG9ydFR5cGV9IHRyYW5zcG9ydFR5cGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYWRkcmVzc1xuICAgICAqL1xuICAgIGlzQ29ubmVjdGVkICh0cmFuc3BvcnRUeXBlLCBhZGRyZXNzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0Nvbm5lY3RlZDtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFRyYW5zcG9ydE1hbmFnZXJCYXNlIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmNvbnN0IHsgVHJhbnNwb3J0QmFzZSB9ID0gcmVxdWlyZSgnLi9UcmFuc3BvcnRCYXNlLmpzJyk7XG5jb25zdCB7IFNkbFBzbSB9ID0gcmVxdWlyZSgnLi9TZGxQc20uanMnKTtcbmNvbnN0IFdlYlNvY2tldCA9IHJlcXVpcmUoJ3dzJyk7XG5cbmNsYXNzIFdlYlNvY2tldFNlcnZlciBleHRlbmRzIFRyYW5zcG9ydEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yICh0cmFuc3BvcnRDb25maWcsIHRyYW5zcG9ydENhbGxiYWNrID0gbnVsbCkge1xuICAgICAgICBzdXBlcih0cmFuc3BvcnRDb25maWcsIHRyYW5zcG9ydENhbGxiYWNrKTtcbiAgICAgICAgdGhpcy5fY29ubmVjdGlvbkxvc3RJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUcmFuc3BvcnRDYWxsYmFja30gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBzZXRUcmFuc3BvcnRDYWxsYmFjayAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgbGlzdGVuaW5nIGZvciBldmVudHMgZnJvbSB0aGUgY2xpZW50XG4gICAgICogQHJldHVybiB7V2ViU29ja2V0U2VydmVyfVxuICAgICAqL1xuICAgIHN0YXJ0ICgpIHtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5fdHJhbnNwb3J0Q29uZmlnLmdldENsaWVudCgpO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uTG9zdFRpbWVvdXQgPSB0aGlzLl90cmFuc3BvcnRDb25maWcuZ2V0Q29ubmVjdGlvbkxvc3RUaW1lb3V0KCk7XG5cbiAgICAgICAgLy8gRXZlbnQgbGlzdGVuZXIgZm9yIGFuIGluY29taW5nIG1lc3NhZ2VcbiAgICAgICAgY2xpZW50Lm9uKCdtZXNzYWdlJywgKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV2ZW50IGxpc3RlbmVyIGZvciBhIGNsb3NlZCBjb25uZWN0aW9uXG4gICAgICAgIGNsaWVudC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnc2VydmVyIHJlY2VpdmVkIGNsb3NlIGV2ZW50Jyk7XG4gICAgICAgICAgICB0aGlzLl9zdG9wQ29ubmVjdGlvbkxvc3RJbnRlcnZhbCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2sub25Db25uZWN0aW9uVGVybWluYXRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFdmVudCBsaXN0ZW5lciBmb3IgZXJyb3JzXG4gICAgICAgIGNsaWVudC5vbignZXJyb3InLCAoZXJyb3JFdmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlcnZlciByZWNlaXZlZCBlcnJvciBldmVudCcpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2sub25FcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQb25nIGhlYXJ0YmVhdCBsaXN0ZW5lclxuICAgICAgICBjbGllbnQub24oJ3BvbmcnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnc2VydmVyIHJlY2VpdmVkIHBvbmcgZXZlbnQnKTtcbiAgICAgICAgICAgIGNsaWVudC5pc0FsaXZlID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBldmVudCBmb3IgY29ubmVjdGlvbiBlc3RhYmxpc2hlZFxuICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrLm9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlY3QgYnJva2VuIGNvbm5lY3Rpb25zXG4gICAgICAgIGlmIChjb25uZWN0aW9uTG9zdFRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0aW9uTG9zdEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjbGllbnQuaXNBbGl2ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlcnZlciBkZWVtZWQgY2xpZW50IGRlYWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudC50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhlIGNsaWVudCBpcyBkZWFkIGFuZCBhc2sgaXQgaWYgaXQncyBhbGl2ZVxuICAgICAgICAgICAgICAgIGNsaWVudC5pc0FsaXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlcnZlciBzZW5kaW5nIHBpbmcgdG8gY2xpZW50Jyk7XG4gICAgICAgICAgICAgICAgY2xpZW50LnBpbmcoZnVuY3Rpb24gKCkge30pO1xuICAgICAgICAgICAgfSwgY29ubmVjdGlvbkxvc3RUaW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsaWVudC5pc0FsaXZlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9wcyB0aGUgV2ViU29ja2V0IFNlcnZlciBmcm9tIGxpc3RlbmluZyBhbmQgY2xvc2VzIGV4aXN0aW5nIGNvbm5lY3Rpb25zXG4gICAgICogQHJldHVybiB7V2ViU29ja2V0U2VydmVyfVxuICAgICAqL1xuICAgIHN0b3AgKCkge1xuICAgICAgICBjb25zdCBjbGllbnQgPSB0aGlzLl90cmFuc3BvcnRDb25maWcuZ2V0Q2xpZW50KCk7XG5cbiAgICAgICAgY2xpZW50LnRlcm1pbmF0ZSgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgcGFja2V0IHRvIHRoZSBjb25uZWN0ZWQgV2ViU29ja2V0IFNlcnZlciBjbGllbnRcbiAgICAgKiBAcmV0dXJuIHtXZWJTb2NrZXRTZXJ2ZXJ9XG4gICAgICovXG4gICAgc2VuZFBhY2tldCAoc2RsUGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuX3RyYW5zcG9ydENvbmZpZy5nZXRDbGllbnQoKTtcbiAgICAgICAgaWYgKGNsaWVudC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgICAgICAgY2xpZW50LnNlbmQoc2RsUGFja2V0LnRvUGFja2V0KCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcCB0aGUgY29ubmVjdGlvbiBsb3N0IGludGVydmFsIGlmIG9uZSBpcyBkZWZpbmVkXG4gICAgICogQHJldHVybiB7V2ViU29ja2V0U2VydmVyfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3N0b3BDb25uZWN0aW9uTG9zdEludGVydmFsICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3Rpb25Mb3N0SW50ZXJ2YWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5fY29ubmVjdGlvbkxvc3RJbnRlcnZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciBhIG5ldyBtZXNzYWdlIGNvbWVzIGluXG4gICAgICogQHBhcmFtIHtNZXNzYWdlRXZlbnR9IG1lc3NhZ2VcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9oYW5kbGVNZXNzYWdlIChtZXNzYWdlKSB7XG4gICAgICAgIC8vIFJlcXVpcmUgbWVzc2FnZXMgdG8gYmUgYmluYXJ5IG9iamVjdHNcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlICE9PSAnb2JqZWN0JyB8fCBtZXNzYWdlLmNvbnN0cnVjdG9yLm5hbWUgIT09ICdCdWZmZXInKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSB0aGUgbWVzc2FnZVxuICAgICAgICBsZXQgc3RhdGVQcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBtZXNzYWdlSW5kZXggPSAwOyBtZXNzYWdlSW5kZXggPCBtZXNzYWdlLmxlbmd0aDsgbWVzc2FnZUluZGV4KyspIHtcbiAgICAgICAgICAgIHN0YXRlUHJvZ3Jlc3MgPSB0aGlzLl9zZGxQc20uaGFuZGxlQnl0ZShtZXNzYWdlW21lc3NhZ2VJbmRleF0pO1xuXG4gICAgICAgICAgICBpZiAoIXN0YXRlUHJvZ3Jlc3MpIHsgLy8gV2UgYXJlIHRyeWluZyB0byB3ZWVkIHRocm91Z2ggdGhlIGJhZCBwYWNrZXQgaW5mbyB1bnRpbCB3ZSBnZXQgc29tZXRoaW5nXG4gICAgICAgICAgICAgICAgdGhpcy5fc2RsUHNtLnJlc2V0KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3NkbFBzbS5nZXRTdGF0ZSgpID09PSBTZGxQc20uRklOSVNIRURfU1RBVEUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWNrZXQgPSB0aGlzLl9zZGxQc20uZ2V0Rm9ybWVkUGFja2V0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrICE9PSBudWxsICYmIHBhY2tldCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjay5vblBhY2tldFJlY2VpdmVkKHBhY2tldCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fc2RsUHNtLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIFdlYlNvY2tldFNlcnZlcixcbn07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmNvbnN0IHsgVHJhbnNwb3J0TWFuYWdlckJhc2UgfSA9IHJlcXVpcmUoJy4vVHJhbnNwb3J0TWFuYWdlckJhc2UuanMnKTtcbmNvbnN0IHsgVHJhbnNwb3J0VHlwZSB9ID0gcmVxdWlyZSgnLi9lbnVtcy9UcmFuc3BvcnRUeXBlLmpzJyk7XG5jb25zdCB7IFdlYlNvY2tldFNlcnZlciB9ID0gcmVxdWlyZSgnLi9XZWJTb2NrZXRTZXJ2ZXIuanMnKTtcblxuY2xhc3MgVHJhbnNwb3J0TWFuYWdlciBleHRlbmRzIFRyYW5zcG9ydE1hbmFnZXJCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAodHJhbnNwb3J0Q29uZmlnLCB0cmFuc3BvcnRMaXN0ZW5lcikge1xuICAgICAgICBzdXBlcih0cmFuc3BvcnRDb25maWcsIHRyYW5zcG9ydExpc3RlbmVyKTtcblxuICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0Q29uZmlnLmdldFRyYW5zcG9ydFR5cGUoKSA9PT0gVHJhbnNwb3J0VHlwZS5XRUJTT0NLRVRfU0VSVkVSKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBuZXcgV2ViU29ja2V0U2VydmVyKHRoaXMuX3RyYW5zcG9ydENvbmZpZywgdGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2spO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3RyYW5zcG9ydCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB0cmFuc3BvcnQgdHlwZScpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIFRyYW5zcG9ydE1hbmFnZXIsXG59OyIsIlxuaW1wb3J0IHsgU2RsUHJvdG9jb2xCYXNlIH0gZnJvbSAnLi9TZGxQcm90b2NvbEJhc2UuanMnO1xuaW1wb3J0IHsgVHJhbnNwb3J0TWFuYWdlciB9IGZyb20gJy4vLi4vdHJhbnNwb3J0L1RyYW5zcG9ydE1hbmFnZXIuanMnO1xuXG5cbmNsYXNzIFNkbFByb3RvY29sIGV4dGVuZHMgU2RsUHJvdG9jb2xCYXNlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RyYW5zcG9ydENvbmZpZ0Jhc2V9IGJhc2VUcmFuc3BvcnRDb25maWdcbiAgICAgKiBAcGFyYW0ge1NkbFByb3RvY29sTGlzdGVuZXJ9IHNkbFByb3RvY29sTGlzdGVuZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoYmFzZVRyYW5zcG9ydENvbmZpZywgc2RsUHJvdG9jb2xMaXN0ZW5lcikge1xuICAgICAgICBzdXBlcihiYXNlVHJhbnNwb3J0Q29uZmlnLCBzZGxQcm90b2NvbExpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc3BvcnRNYW5hZ2VyKG5ldyBUcmFuc3BvcnRNYW5hZ2VyKHRoaXMuX3RyYW5zcG9ydENvbmZpZywgdGhpcy5fdHJhbnNwb3J0TGlzdGVuZXIpKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFNkbFByb3RvY29sIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFNlcnZpY2VUeXBlIH0gZnJvbSAnLi4vcHJvdG9jb2wvZW51bXMvU2VydmljZVR5cGUuanMnO1xuXG5jbGFzcyBTZXJ2aWNlTGlzdGVuZXJNYXAge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuXG4gICAgICAgIC8vIGluaXRpYWxpemUgYW4gYXJyYXkgb2YgbGlzdGVuZXJzIGZvciBlYWNoIHNlcnZpY2UgdHlwZVxuICAgICAgICB0aGlzLl9saXN0ZW5lcnNbU2VydmljZVR5cGUuQ09OVFJPTF0gPSBbXTtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzW1NlcnZpY2VUeXBlLlJQQ10gPSBbXTtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzW1NlcnZpY2VUeXBlLkFVRElPXSA9IFtdO1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnNbU2VydmljZVR5cGUuVklERU9dID0gW107XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyc1tTZXJ2aWNlVHlwZS5IWUJSSURdID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKiBAcGFyYW0ge1NkbFNlcnZpY2VMaXN0ZW5lcn0gc2VydmljZUxpc3RlbmVyXG4gICAgICovXG4gICAgYWRkTGlzdGVuZXIgKHNlcnZpY2VUeXBlLCBzZXJ2aWNlTGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKCFzZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyc1tzZXJ2aWNlVHlwZV0ucHVzaChzZXJ2aWNlTGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICogQHBhcmFtIHtTZGxTZXJ2aWNlTGlzdGVuZXJ9IHNlcnZpY2VMaXN0ZW5lclxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IC0gd2hldGhlciB0aGUgc2VydmljZSBnb3QgcmVtb3ZlZFxuICAgICAqL1xuICAgIHJlbW92ZUxpc3RlbmVyIChzZXJ2aWNlVHlwZSwgc2VydmljZUxpc3RlbmVyKSB7XG4gICAgICAgIGlmICghc2VydmljZVR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsaXN0ZW5lckFycmF5ID0gdGhpcy5fbGlzdGVuZXJzW3NlcnZpY2VUeXBlXTtcbiAgICAgICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gcmVtb3ZlIG1hdGNoaW5nIHJlZmVyZW5jZXMgdG8gdGhlIHBhc3NlZCBpbiBzZXJ2aWNlIGxpc3RlbmVyXG4gICAgICAgIHRoaXMuX2xpc3RlbmVyc1tzZXJ2aWNlVHlwZV0gPSBsaXN0ZW5lckFycmF5LmZpbHRlcihsaXN0ZW5lciA9PiB7XG4gICAgICAgICAgICByZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lciAhPT0gc2VydmljZUxpc3RlbmVyO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlbW92ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgdGhpcyBldmVudCB0byBhbGwgbGlzdGVuZXJzIGJlbG9uZ2luZyB0byBhIHNwZWNpZmljIHNlcnZpY2UgdHlwZVxuICAgICAqIEBwYXJhbSB7U2RsU2Vzc2lvbn0gc2Vzc2lvblxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBpc0VuY3J5cHRlZFxuICAgICAqL1xuICAgIHNlbmRFdmVudFNlcnZpY2VTdGFydGVkIChzZXNzaW9uLCBzZXJ2aWNlVHlwZSwgaXNFbmNyeXB0ZWQpIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJBcnJheSA9IHRoaXMuX2xpc3RlbmVyc1tzZXJ2aWNlVHlwZV07XG4gICAgICAgIGZvciAoY29uc3QgaW5kZXggaW4gbGlzdGVuZXJBcnJheSkge1xuICAgICAgICAgICAgbGlzdGVuZXJBcnJheVtpbmRleF0ub25TZXJ2aWNlU3RhcnRlZChzZXNzaW9uLCBzZXJ2aWNlVHlwZSwgaXNFbmNyeXB0ZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgdGhpcyBldmVudCB0byBhbGwgbGlzdGVuZXJzIGJlbG9uZ2luZyB0byBhIHNwZWNpZmljIHNlcnZpY2UgdHlwZVxuICAgICAqIEBwYXJhbSB7U2RsU2Vzc2lvbn0gc2Vzc2lvblxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICovXG4gICAgc2VuZEV2ZW50U2VydmljZUVuZGVkIChzZXNzaW9uLCBzZXJ2aWNlVHlwZSkge1xuICAgICAgICBjb25zdCBsaXN0ZW5lckFycmF5ID0gdGhpcy5fbGlzdGVuZXJzW3NlcnZpY2VUeXBlXTtcbiAgICAgICAgZm9yIChjb25zdCBpbmRleCBpbiBsaXN0ZW5lckFycmF5KSB7XG4gICAgICAgICAgICBsaXN0ZW5lckFycmF5W2luZGV4XS5vblNlcnZpY2VFbmRlZChzZXNzaW9uLCBzZXJ2aWNlVHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kcyB0aGlzIGV2ZW50IHRvIGFsbCBsaXN0ZW5lcnMgYmVsb25naW5nIHRvIGEgc3BlY2lmaWMgc2VydmljZSB0eXBlXG4gICAgICogQHBhcmFtIHtTZGxTZXNzaW9ufSBzZXNzaW9uXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVhc29uXG4gICAgICovXG4gICAgc2VuZEV2ZW50U2VydmljZUVycm9yIChzZXNzaW9uLCBzZXJ2aWNlVHlwZSwgcmVhc29uKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyQXJyYXkgPSB0aGlzLl9saXN0ZW5lcnNbc2VydmljZVR5cGVdO1xuICAgICAgICBmb3IgKGNvbnN0IGluZGV4IGluIGxpc3RlbmVyQXJyYXkpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyQXJyYXlbaW5kZXhdLm9uU2VydmljZUVycm9yKHNlc3Npb24sIHNlcnZpY2VUeXBlLCByZWFzb24pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBTZXJ2aWNlTGlzdGVuZXJNYXAgfTtcbiIsImltcG9ydCB7IFZpZGVvU3RyZWFtaW5nRm9ybWF0IH0gZnJvbSAnLi4vLi4vcnBjL3N0cnVjdHMvVmlkZW9TdHJlYW1pbmdGb3JtYXQnO1xuaW1wb3J0IHsgVmlkZW9TdHJlYW1pbmdDb2RlYyB9IGZyb20gJy4uLy4uL3JwYy9lbnVtcy9WaWRlb1N0cmVhbWluZ0NvZGVjJztcbmltcG9ydCB7IFZpZGVvU3RyZWFtaW5nUHJvdG9jb2wgfSBmcm9tICcuLi8uLi9ycGMvZW51bXMvVmlkZW9TdHJlYW1pbmdQcm90b2NvbCc7XG5pbXBvcnQgeyBJbWFnZVJlc29sdXRpb24gfSBmcm9tICcuLi8uLi9ycGMvc3RydWN0cy9JbWFnZVJlc29sdXRpb24nO1xuXG4vKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IExpdmlvLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuICogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4gKiBkaXN0cmlidXRpb24uXG4gKlxuICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiAqIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuICogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5jb25zdCBERUZBVUxUX1BST1RPQ09MID0gVmlkZW9TdHJlYW1pbmdQcm90b2NvbC5SQVc7XG5jb25zdCBERUZBVUxUX0NPREVDID0gVmlkZW9TdHJlYW1pbmdDb2RlYy5IMjY0O1xuY29uc3QgREVGQVVMVF9XSURUSCA9IDEwMjQ7XG5jb25zdCBERUZBVUxUX0hFSUdIVCA9IDU3NjtcbmNvbnN0IERFRkFVTFRfREVOU0lUWSA9IDI0MDtcbmNvbnN0IERFRkFVTFRfRlJBTUVSQVRFID0gMzA7XG5jb25zdCBERUZBVUxUX0JJVFJBVEUgPSA1MTIwMDA7XG5jb25zdCBERUZBVUxUX0lOVEVSVkFMID0gNTtcbmNvbnN0IERFRkFVTFRfU0NBTEUgPSAxLjA7XG5cbmNsYXNzIFZpZGVvU3RyZWFtaW5nUGFyYW1ldGVycyB7XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGlzcGxheURlbnNpdHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJhbWVSYXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdHJhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW50ZXJ2YWxcbiAgICAgKiBAcGFyYW0ge0ltYWdlUmVzb2x1dGlvbn0gcmVzb2x1dGlvblxuICAgICAqIEBwYXJhbSB7VmlkZW9TdHJlYW1pbmdGb3JtYXR9IGZvcm1hdFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChkaXNwbGF5RGVuc2l0eSA9IG51bGwsIGZyYW1lUmF0ZSA9IG51bGwsIGJpdHJhdGUgPSBudWxsLCBpbnRlcnZhbCA9IG51bGwsIHJlc29sdXRpb24gPSBudWxsLCBmb3JtYXQgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlEZW5zaXR5ID0gZGlzcGxheURlbnNpdHkgfHwgREVGQVVMVF9ERU5TSVRZO1xuICAgICAgICB0aGlzLl9mcmFtZVJhdGUgPSBmcmFtZVJhdGUgfHwgREVGQVVMVF9GUkFNRVJBVEU7XG4gICAgICAgIHRoaXMuX2JpdHJhdGUgPSBiaXRyYXRlIHx8IERFRkFVTFRfQklUUkFURTtcbiAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBpbnRlcnZhbCB8fCBERUZBVUxUX0lOVEVSVkFMO1xuXG4gICAgICAgIGlmICghKHJlc29sdXRpb24gaW5zdGFuY2VvZiBJbWFnZVJlc29sdXRpb24pKSB7XG4gICAgICAgICAgICByZXNvbHV0aW9uID0gbmV3IEltYWdlUmVzb2x1dGlvbigpO1xuICAgICAgICAgICAgcmVzb2x1dGlvbi5zZXRSZXNvbHV0aW9uV2lkdGgoREVGQVVMVF9XSURUSCk7XG4gICAgICAgICAgICByZXNvbHV0aW9uLnNldFJlc29sdXRpb25IZWlnaHQoREVGQVVMVF9IRUlHSFQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Jlc29sdXRpb24gPSByZXNvbHV0aW9uO1xuXG4gICAgICAgIGlmICghKGZvcm1hdCBpbnN0YW5jZW9mIFZpZGVvU3RyZWFtaW5nRm9ybWF0KSkge1xuICAgICAgICAgICAgZm9ybWF0ID0gbmV3IFZpZGVvU3RyZWFtaW5nRm9ybWF0KCk7XG4gICAgICAgICAgICBmb3JtYXQuc2V0UHJvdG9jb2woREVGQVVMVF9QUk9UT0NPTCk7XG4gICAgICAgICAgICBmb3JtYXQuc2V0Q29kZWMoREVGQVVMVF9DT0RFQyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9mb3JtYXQgPSBmb3JtYXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBjYXBhYmlsaXR5IHRoYXQgc2hvdWxkIGhhdmUgYmVlbiByZXR1cm5lZCB0aHJvdWdoIHRoZSBTeXN0ZW1DYXBhYmlsaXR5TWFuYWdlci5cbiAgICAgKiBUaGlzIHVwZGF0ZSB3aWxsIHVzZSB0aGUgbW9zdCBwcmVmZXJyZWQgc3RyZWFtaW5nIGZvcm1hdCBmcm9tIHRoZSBtb2R1bGUuXG4gICAgICogQHBhcmFtIHtWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHl9IGNhcGFiaWxpdHkgdGhlIHZpZGVvIHN0cmVhbWluZyBjYXBhYmlsaXR5IHJldHVybmVkIGZyb20gdGhlIFN5c3RlbUNhcGFiaWxpdHlNYW5hZ2VyXG4gICAgICovXG4gICAgdXBkYXRlIChjYXBhYmlsaXR5KSB7XG4gICAgICAgIGlmIChjYXBhYmlsaXR5LmdldE1heEJpdHJhdGUoKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fYml0cmF0ZSA9IGNhcGFiaWxpdHkuZ2V0TWF4Qml0cmF0ZSgpICogMTAwMDsgLy8gTk9URTogdGhlIHVuaXQgb2YgbWF4Qml0cmF0ZSBpbiBnZXRTeXN0ZW1DYXBhYmlsaXR5IGlzIGticHMuXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNjYWxlID0gREVGQVVMVF9TQ0FMRTtcbiAgICAgICAgaWYgKGNhcGFiaWxpdHkuZ2V0U2NhbGUoKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2NhbGUgPSBjYXBhYmlsaXR5LmdldFNjYWxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IGNhcGFiaWxpdHkuZ2V0UHJlZmVycmVkUmVzb2x1dGlvbigpO1xuICAgICAgICBpZiAocmVzb2x1dGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHJlc29sdXRpb24uZ2V0UmVzb2x1dGlvbkhlaWdodCgpICE9PSBudWxsICYmIHJlc29sdXRpb24uZ2V0UmVzb2x1dGlvbkhlaWdodCgpID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc29sdXRpb24uc2V0UmVzb2x1dGlvbkhlaWdodChNYXRoLmZsb29yKChyZXNvbHV0aW9uLmdldFJlc29sdXRpb25IZWlnaHQoKSAvIHNjYWxlKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc29sdXRpb24uZ2V0UmVzb2x1dGlvbldpZHRoKCkgIT09IG51bGwgJiYgcmVzb2x1dGlvbi5nZXRSZXNvbHV0aW9uV2lkdGgoKSA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNvbHV0aW9uLnNldFJlc29sdXRpb25XaWR0aChNYXRoLmZsb29yKChyZXNvbHV0aW9uLmdldFJlc29sdXRpb25XaWR0aCgpIC8gc2NhbGUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9ybWF0cyA9IGNhcGFiaWxpdHkuZ2V0U3VwcG9ydGVkRm9ybWF0cygpO1xuICAgICAgICBpZiAoZm9ybWF0cyAhPT0gbnVsbCAmJiBmb3JtYXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1hdCA9IGZvcm1hdHNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXNwbGF5RGVuc2l0eVxuICAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVyc31cbiAgICAgKi9cbiAgICBzZXREaXNwbGF5RGVuc2l0eSAoZGlzcGxheURlbnNpdHkpIHtcbiAgICAgICAgdGhpcy5fZGlzcGxheURlbnNpdHkgPSBkaXNwbGF5RGVuc2l0eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldERpc3BsYXlEZW5zaXR5ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlEZW5zaXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmcmFtZVJhdGVcbiAgICAgKiBAcmV0dXJuIHtWaWRlb1N0cmVhbWluZ1BhcmFtZXRlcnN9XG4gICAgICovXG4gICAgc2V0RnJhbWVSYXRlIChmcmFtZVJhdGUpIHtcbiAgICAgICAgdGhpcy5fZnJhbWVSYXRlID0gZnJhbWVSYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXRGcmFtZVJhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnJhbWVSYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRyYXRlXG4gICAgICogQHJldHVybiB7VmlkZW9TdHJlYW1pbmdQYXJhbWV0ZXJzfVxuICAgICAqL1xuICAgIHNldEJpdHJhdGUgKGJpdHJhdGUpIHtcbiAgICAgICAgdGhpcy5fYml0cmF0ZSA9IGJpdHJhdGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0Qml0cmF0ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaXRyYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnZhbFxuICAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVyc31cbiAgICAgKi9cbiAgICBzZXRJbnRlcnZhbCAoaW50ZXJ2YWwpIHtcbiAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBpbnRlcnZhbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldEludGVydmFsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludGVydmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmlkZW9TdHJlYW1pbmdGb3JtYXR9IGZvcm1hdFxuICAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVyc31cbiAgICAgKi9cbiAgICBzZXRGb3JtYXQgKGZvcm1hdCkge1xuICAgICAgICB0aGlzLl9mb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nRm9ybWF0fVxuICAgICAqL1xuICAgIGdldEZvcm1hdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3JtYXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKiBAcmV0dXJuIHtWaWRlb1N0cmVhbWluZ1BhcmFtZXRlcnN9XG4gICAgICovXG4gICAgc2V0UmVzb2x1dGlvbiAocmVzb2x1dGlvbikge1xuICAgICAgICB0aGlzLl9yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldFJlc29sdXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb2x1dGlvbjtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFZpZGVvU3RyZWFtaW5nUGFyYW1ldGVycyB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBTZGxQcm90b2NvbExpc3RlbmVyIH0gZnJvbSAnLi4vcHJvdG9jb2wvU2RsUHJvdG9jb2xMaXN0ZW5lci5qcyc7XG5pbXBvcnQgeyBTZGxQcm90b2NvbCB9IGZyb20gJy4uL3Byb3RvY29sL1NkbFByb3RvY29sLmpzJztcbmltcG9ydCB7IFNlcnZpY2VUeXBlIH0gZnJvbSAnLi4vcHJvdG9jb2wvZW51bXMvU2VydmljZVR5cGUuanMnO1xuaW1wb3J0IHsgU2VydmljZUxpc3RlbmVyTWFwIH0gZnJvbSAnLi9TZXJ2aWNlTGlzdGVuZXJNYXAuanMnO1xuaW1wb3J0IHsgVmlkZW9TdHJlYW1pbmdQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vc3RyZWFtaW5nL3ZpZGVvL1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVycy5qcyc7XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTZGxTZXNzaW9uXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBzdGFydFxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZ2V0U2Vzc2lvbklkXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBvblByb3RvY29sU2Vzc2lvblN0YXJ0ZWRcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IG9uUHJvdG9jb2xTZXNzaW9uRW5kZWRcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IG9uUHJvdG9jb2xTZXNzaW9uRW5kZWROQUNLZWRcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IG9uUnBjTWVzc2FnZVJlY2VpdmVkXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBzZW5kUnBjXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRNdHVcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGNsb3NlXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBzdGFydFNlcnZpY2VcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGVuZFNlcnZpY2VcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldEN1cnJlbnRUcmFuc3BvcnRUeXBlXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRJc0Nvbm5lY3RlZFxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZ2V0UHJvdG9jb2xWZXJzaW9uXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRUcmFuc3BvcnRDb25maWdcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldFNlc3Npb25IYXNoSWRcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGFkZFNlcnZpY2VMaXN0ZW5lclxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gcmVtb3ZlU2VydmljZUxpc3RlbmVyXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRTZXJ2aWNlTGlzdGVuZXJzXG4gKi9cbmNsYXNzIFNkbFNlc3Npb24ge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VHJhbnNwb3J0Q29uZmlnQmFzZX0gYmFzZVRyYW5zcG9ydENvbmZpZ1xuICAgICAqIEBwYXJhbSB7U2RsU2Vzc2lvbkxpc3RlbmVyfSBzZGxTZXNzaW9uTGlzdGVuZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoYmFzZVRyYW5zcG9ydENvbmZpZywgc2RsU2Vzc2lvbkxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2Jhc2VUcmFuc3BvcnRDb25maWcgPSBiYXNlVHJhbnNwb3J0Q29uZmlnO1xuICAgICAgICB0aGlzLl9zZXNzaW9uSWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9zZXNzaW9uSGFzaElkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2RsU2Vzc2lvbkxpc3RlbmVyID0gc2RsU2Vzc2lvbkxpc3RlbmVyO1xuICAgICAgICB0aGlzLl9iYXNlVHJhbnNwb3J0Q29uZmlnID0gYmFzZVRyYW5zcG9ydENvbmZpZztcblxuICAgICAgICAvLyBhIGhhc2ggd2hlcmUgZWFjaCBrZXkgaXMgYSBzZXJ2aWNlIHR5cGUsIGFuZCBoYXMgYW4gYXJyYXkgb2YgbGlzdGVuZXJzIGF0dGFjaGVkXG4gICAgICAgIHRoaXMuX3NlcnZpY2VMaXN0ZW5lcnMgPSBuZXcgU2VydmljZUxpc3RlbmVyTWFwKCk7XG5cbiAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2xMaXN0ZW5lciA9IHRoaXMuX3NldHVwU2RsUHJvdG9jb2xMaXN0ZW5lcigpO1xuXG4gICAgICAgIHRoaXMuX3NkbFByb3RvY29sID0gbmV3IFNkbFByb3RvY29sKGJhc2VUcmFuc3BvcnRDb25maWcsIHRoaXMuX3NkbFByb3RvY29sTGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NkbFByb3RvY29sTGlzdGVuZXJ9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfc2V0dXBTZGxQcm90b2NvbExpc3RlbmVyICgpIHtcbiAgICAgICAgY29uc3Qgc2RsUHJvdG9jb2xMaXN0ZW5lciA9IG5ldyBTZGxQcm90b2NvbExpc3RlbmVyKCk7XG4gICAgICAgIHNkbFByb3RvY29sTGlzdGVuZXIuc2V0R2V0U2Vzc2lvbklkKHRoaXMuZ2V0U2Vzc2lvbklkLmJpbmQodGhpcykpO1xuICAgICAgICBzZGxQcm90b2NvbExpc3RlbmVyLnNldE9uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZCh0aGlzLm9uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgc2RsUHJvdG9jb2xMaXN0ZW5lci5zZXRPblByb3RvY29sU2Vzc2lvbkVuZGVkKHRoaXMub25Qcm90b2NvbFNlc3Npb25FbmRlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgc2RsUHJvdG9jb2xMaXN0ZW5lci5zZXRPblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkKHRoaXMub25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgc2RsUHJvdG9jb2xMaXN0ZW5lci5zZXRPblJwY01lc3NhZ2VSZWNlaXZlZCh0aGlzLm9uUnBjTWVzc2FnZVJlY2VpdmVkLmJpbmQodGhpcykpO1xuICAgICAgICBzZGxQcm90b2NvbExpc3RlbmVyLnNldE9uVHJhbnNwb3J0Q29ubmVjdGVkKHRoaXMub25UcmFuc3BvcnRDb25uZWN0ZWQuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgc2RsUHJvdG9jb2xMaXN0ZW5lci5zZXRHZXREZXNpcmVkVmlkZW9QYXJhbXModGhpcy5nZXREZXNpcmVkVmlkZW9QYXJhbXMuYmluZCh0aGlzKSk7XG4gICAgICAgIHNkbFByb3RvY29sTGlzdGVuZXIuc2V0U2V0QWNjZXB0ZWRWaWRlb1BhcmFtcyh0aGlzLnNldEFjY2VwdGVkVmlkZW9QYXJhbXMuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgcmV0dXJuIHNkbFByb3RvY29sTGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnRzIHVwIHRoZSBTREwgcHJvdG9jb2wgY2xhc3MuIEl0IHdpbGwga2ljayBvZmYgdGhlIHRyYW5zcG9ydCBtYW5hZ2VyIGFuZCB1bmRlcmx5aW5nIHRyYW5zcG9ydC5cbiAgICAgKi9cbiAgICBzdGFydCAoKSB7XG4gICAgICAgIHRoaXMuX3NkbFByb3RvY29sLnN0YXJ0KCk7XG4gICAgfVxuXG4gICAgLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTjogICAgU2RsUHJvdG9jb2xMaXN0ZW5lciBpbXBsZW1lbnRlZCBtZXRob2RzXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn0gIC0gcmVwcmVzZW50cyBhIGJ5dGVcbiAgICAgKi9cbiAgICBnZXRTZXNzaW9uSWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbklkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGZpcmVkIHdoZW4gdHJhbnNwb3J0IChlZyB0Y3AsIHdzLCBibHVldG9vdGgpIGhhcyBjb25uZWN0ZWQuXG4gICAgICovXG4gICAgb25UcmFuc3BvcnRDb25uZWN0ZWQgKCkge1xuICAgICAgICB0aGlzLl9zZGxTZXNzaW9uTGlzdGVuZXIub25UcmFuc3BvcnRDb25uZWN0ZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSWQgLSByZXByZXNlbnRzIGEgYnl0ZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2ZXJzaW9uIC0gcmVwcmVzZW50cyBhIGJ5dGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29ycmVsYXRpb25JZFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoYXNoSWRcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRW5jcnlwdGVkXG4gICAgICovXG4gICAgb25Qcm90b2NvbFNlc3Npb25TdGFydGVkIChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklkLCB2ZXJzaW9uLCBjb3JyZWxhdGlvbklkLCBoYXNoSWQsIGlzRW5jcnlwdGVkKSB7XG4gICAgICAgIHRoaXMuX3Nlc3Npb25JZCA9IHNlc3Npb25JZDtcblxuICAgICAgICBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLlJQQykge1xuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbkhhc2hJZCA9IGhhc2hJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NkbFNlc3Npb25MaXN0ZW5lci5vblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQoc2VydmljZVR5cGUsIHNlc3Npb25JZCwgdmVyc2lvbiwgY29ycmVsYXRpb25JZCwgaGFzaElkLCBpc0VuY3J5cHRlZCk7XG4gICAgICAgIHRoaXMuX3NlcnZpY2VMaXN0ZW5lcnMuc2VuZEV2ZW50U2VydmljZVN0YXJ0ZWQodGhpcywgc2VydmljZVR5cGUsIGlzRW5jcnlwdGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSWQgLSByZXByZXNlbnRzIGEgYnl0ZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb3JyZWxhdGlvbklkXG4gICAgICovXG4gICAgb25Qcm90b2NvbFNlc3Npb25FbmRlZCAoc2VydmljZVR5cGUsIHNlc3Npb25JZCwgY29ycmVsYXRpb25JZCkge1xuICAgICAgICB0aGlzLl9zZGxTZXNzaW9uTGlzdGVuZXIub25Qcm90b2NvbFNlc3Npb25FbmRlZChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklkLCBjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgdGhpcy5fc2VydmljZUxpc3RlbmVycy5zZW5kRXZlbnRTZXJ2aWNlRW5kZWQodGhpcywgc2VydmljZVR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNlc3Npb25JZCAtIHJlcHJlc2VudHMgYSBieXRlXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvcnJlbGF0aW9uSWRcbiAgICAgKi9cbiAgICBvblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkIChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklkLCBjb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIHRoaXMuX3NkbFNlc3Npb25MaXN0ZW5lci5vblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkKHNlcnZpY2VUeXBlLCBzZXNzaW9uSWQsIGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB0aGlzLl9zZXJ2aWNlTGlzdGVuZXJzLnNlbmRFdmVudFNlcnZpY2VFcnJvcih0aGlzLCBzZXJ2aWNlVHlwZSwgYEVuZCAke3NlcnZpY2VUeXBlLnRvU3RyaW5nKCl9IFNlcnZpY2UgTkFDSydlZGApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7UnBjTWVzc2FnZX0gcnBjTWVzc2FnZVxuICAgICAqL1xuICAgIG9uUnBjTWVzc2FnZVJlY2VpdmVkIChycGNNZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuX3NkbFNlc3Npb25MaXN0ZW5lci5vblJwY01lc3NhZ2VSZWNlaXZlZChycGNNZXNzYWdlKTtcbiAgICB9XG5cblxuICAgIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOiAgICBTZGxQcm90b2NvbExpc3RlbmVyIGltcGxlbWVudGVkIG1ldGhvZHNcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtScGNNZXNzYWdlfSBycGNNZXNzYWdlXG4gICAgICovXG4gICAgc2VuZFJwYyAocnBjTWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9zZGxQcm90b2NvbC5zZW5kUnBjKHJwY01lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIHNkbFBhY2tldC5cbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgc2VuZFBhY2tldCAoc2RsUGFja2V0KSB7XG4gICAgICAgIHRoaXMuX3NkbFByb3RvY29sLnNlbmRQYWNrZXQoc2RsUGFja2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEByZXR1cm4ge051bWJlcn0gbWF4IHRyYW5zcG9ydCB1bml0IGZvciB0aGUgZ2l2ZW4gc2VydmljZSB0eXBlXG4gICAgICovXG4gICAgZ2V0TXR1IChzZXJ2aWNlVHlwZSkge1xuICAgICAgICB0aGlzLl9zZGxQcm90b2NvbC5nZXRNdHUoc2VydmljZVR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuZHMgdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqL1xuICAgIGNsb3NlICgpIHtcbiAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2wuZW5kU2Vzc2lvbih0aGlzLl9zZXNzaW9uSWQsIHRoaXMuX3Nlc3Npb25IYXNoSWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNlc3Npb25JZCAtIHJlcHJlc2VudHMgYSBieXRlXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBpc0VuY3J5cHRlZFxuICAgICAqL1xuICAgIHN0YXJ0U2VydmljZSAoc2VydmljZVR5cGUsIHNlc3Npb25JZCwgaXNFbmNyeXB0ZWQpIHtcbiAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2wuc3RhcnRTZXJ2aWNlKHNlcnZpY2VUeXBlLCBzZXNzaW9uSWQsIGlzRW5jcnlwdGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSWQgLSByZXByZXNlbnRzIGEgYnl0ZVxuICAgICAqL1xuICAgIGVuZFNlcnZpY2UgKHNlcnZpY2VUeXBlLCBzZXNzaW9uSWQpIHtcbiAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2wuZW5kU2VydmljZShzZXJ2aWNlVHlwZSwgc2Vzc2lvbklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUcmFuc3BvcnRUeXBlfVxuICAgICAqL1xuICAgIGdldEN1cnJlbnRUcmFuc3BvcnRUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2VUcmFuc3BvcnRDb25maWcuZ2V0VHJhbnNwb3J0VHlwZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IGlzQ29ubmVjdGVkXG4gICAgICovXG4gICAgZ2V0SXNDb25uZWN0ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2RsUHJvdG9jb2wuaXNDb25uZWN0ZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZXJzaW9ufVxuICAgICAqL1xuICAgIGdldFByb3RvY29sVmVyc2lvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZGxQcm90b2NvbC5nZXRQcm90b2NvbFZlcnNpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUcmFuc3BvcnRDb25maWdCYXNlfVxuICAgICAqL1xuICAgIGdldFRyYW5zcG9ydENvbmZpZyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYXNlVHJhbnNwb3J0Q29uZmlnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRTZXNzaW9uSGFzaElkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25IYXNoSWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKiBAcGFyYW0ge1NkbFNlcnZpY2VMaXN0ZW5lcn0gc2RsU2VydmljZUxpc3RlbmVyXG4gICAgICovXG4gICAgYWRkU2VydmljZUxpc3RlbmVyIChzZXJ2aWNlVHlwZSwgc2RsU2VydmljZUxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX3NlcnZpY2VMaXN0ZW5lcnMuYWRkTGlzdGVuZXIoc2VydmljZVR5cGUsIHNkbFNlcnZpY2VMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKiBAcGFyYW0ge1NkbFNlcnZpY2VMaXN0ZW5lcn0gc2RsU2VydmljZUxpc3RlbmVyXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gLSB3aGV0aGVyIHRoZSByZW1vdmFsIHdhcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgcmVtb3ZlU2VydmljZUxpc3RlbmVyIChzZXJ2aWNlVHlwZSwgc2RsU2VydmljZUxpc3RlbmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlTGlzdGVuZXJzLnJlbW92ZUxpc3RlbmVyKHNlcnZpY2VUeXBlLCBzZGxTZXJ2aWNlTGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NlcnZpY2VMaXN0ZW5lck1hcH1cbiAgICAgKi9cbiAgICBnZXRTZXJ2aWNlTGlzdGVuZXJzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VMaXN0ZW5lcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVyc30gcGFyYW1zXG4gICAgICovXG4gICAgc2V0RGVzaXJlZFZpZGVvUGFyYW1zIChwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5fZGVzaXJlZFZpZGVvUGFyYW1zID0gcGFyYW1zO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2V0IGRlc2lyZWQgdmlkZW8gc3RyZWFtaW5nIHBhcmFtZXRlcnMuIElmIHRoZXJlIGhhdmVuJ3QgYmVlbiBhbnkgc2V0LFxuICAgICAqIHRoZSBkZWZhdWx0IG9wdGlvbnMgd2lsbCBiZSByZXR1cm5lZCBhbmQgc2V0IGZvciB0aGlzIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVyc30gdGhlIGRlc2lyZWQgdmlkZW8gc3RyZWFtaW5nIHBhcmFtZXRlcnNcbiAgICAgKi9cbiAgICBnZXREZXNpcmVkVmlkZW9QYXJhbXMgKCkge1xuICAgICAgICBpZiAoISh0aGlzLl9kZXNpcmVkVmlkZW9QYXJhbXMgaW5zdGFuY2VvZiBWaWRlb1N0cmVhbWluZ1BhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgICB0aGlzLl9kZXNpcmVkVmlkZW9QYXJhbXMgPSBuZXcgVmlkZW9TdHJlYW1pbmdQYXJhbWV0ZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rlc2lyZWRWaWRlb1BhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVyc30gcGFyYW1zXG4gICAgICovXG4gICAgc2V0QWNjZXB0ZWRWaWRlb1BhcmFtcyAocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuX2Rlc2lyZWRWaWRlb1BhcmFtcyA9IHBhcmFtcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgeyBTZGxTZXNzaW9uIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2RsU2Vzc2lvbkxpc3RlbmVyXG4gKi9cbmNsYXNzIFNkbFNlc3Npb25MaXN0ZW5lciB7XG4gICAgLyoqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uRW5kZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25ScGNNZXNzYWdlUmVjZWl2ZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblRyYW5zcG9ydENvbm5lY3RlZCA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBzZXRPblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25Qcm90b2NvbFNlc3Npb25FbmRlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25FbmRlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25ScGNNZXNzYWdlUmVjZWl2ZWQgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX29uUnBjTWVzc2FnZVJlY2VpdmVkID0gbGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBzZXRPblRyYW5zcG9ydENvbm5lY3RlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25UcmFuc3BvcnRDb25uZWN0ZWQgPSBsaXN0ZW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSUQgLSByZXByZXNlbnRzIGEgYnl0ZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2ZXJzaW9uIC0gcmVwcmVzZW50cyBhIGJ5dGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29ycmVsYXRpb25JRFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoYXNoSURcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRW5jcnlwdGVkXG4gICAgICovXG4gICAgb25Qcm90b2NvbFNlc3Npb25TdGFydGVkIChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklELCB2ZXJzaW9uLCBjb3JyZWxhdGlvbklELCBoYXNoSUQsIGlzRW5jcnlwdGVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25TdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQoc2VydmljZVR5cGUsIHNlc3Npb25JRCwgdmVyc2lvbiwgY29ycmVsYXRpb25JRCwgaGFzaElELCBpc0VuY3J5cHRlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSUQgLSByZXByZXNlbnRzIGEgYnl0ZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb3JyZWxhdGlvbklEXG4gICAgICovXG4gICAgb25Qcm90b2NvbFNlc3Npb25FbmRlZCAoc2VydmljZVR5cGUsIHNlc3Npb25JRCwgY29ycmVsYXRpb25JRCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uRW5kZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uRW5kZWQoc2VydmljZVR5cGUsIHNlc3Npb25JRCwgY29ycmVsYXRpb25JRCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSUQgLSByZXByZXNlbnRzIGEgYnl0ZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb3JyZWxhdGlvbklEXG4gICAgICovXG4gICAgb25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZCAoc2VydmljZVR5cGUsIHNlc3Npb25JRCwgY29ycmVsYXRpb25JKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklELCBjb3JyZWxhdGlvbkkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtScGNNZXNzYWdlfSBycGNNZXNzYWdlXG4gICAgICovXG4gICAgb25ScGNNZXNzYWdlUmVjZWl2ZWQgKHJwY01lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vblJwY01lc3NhZ2VSZWNlaXZlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25ScGNNZXNzYWdlUmVjZWl2ZWQocnBjTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGFwcCBhbmQgY29yZSBjb25uZWN0XG4gICAgICovXG4gICAgb25UcmFuc3BvcnRDb25uZWN0ZWQgKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uVHJhbnNwb3J0Q29ubmVjdGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vblRyYW5zcG9ydENvbm5lY3RlZCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBTZGxTZXNzaW9uTGlzdGVuZXIgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBBcnJheVRvb2xzXG4gKi9cbmNsYXNzIEFycmF5VG9vbHMge1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGl0ZW0gZnJvbSB0aGUgYXJyYXkuXG4gICAgICogVGhpcyBkb2VzIG5vdCBtdXRhdGUgdGhlIHBhc3NlZCBpbiBhcnJheS5cbiAgICAgKiBPbmx5IHRoZSByZXR1cm5lZCBhcnJheSBoYXMgdGhlIHZhbHVlIHJlbW92ZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICAgKi9cbiAgICBzdGF0aWMgYXJyYXlSZW1vdmUgKGFycmF5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYXJyYXkuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGUgIT09IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgeyBBcnJheVRvb2xzIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJlZ2lzdGVyQXBwSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vcnBjL21lc3NhZ2VzL1JlZ2lzdGVyQXBwSW50ZXJmYWNlLmpzJztcbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi8uLi9ycGMvUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uLy4uL3JwYy9ScGNSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBScGNMaXN0ZW5lciB9IGZyb20gJy4uLy4uL3JwYy9ScGNMaXN0ZW5lci5qcyc7XG5pbXBvcnQgeyBTZGxTZXNzaW9uIH0gZnJvbSAnLi4vLi4vc2Vzc2lvbi9TZGxTZXNzaW9uLmpzJztcbmltcG9ydCB7IFNkbFNlc3Npb25MaXN0ZW5lciB9IGZyb20gJy4uLy4uL3Nlc3Npb24vU2RsU2Vzc2lvbkxpc3RlbmVyLmpzJztcbmltcG9ydCB7IFZlcnNpb24gfSBmcm9tICcuLi8uLi91dGlsL1ZlcnNpb24uanMnO1xuaW1wb3J0IHsgQXJyYXlUb29scyB9IGZyb20gJy4uLy4uL3V0aWwvQXJyYXlUb29scy5qcyc7XG5pbXBvcnQgeyBTZGxNc2dWZXJzaW9uIH0gZnJvbSAnLi4vLi4vcnBjL3N0cnVjdHMvU2RsTXNnVmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vLi4vcnBjL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgU2VydmljZVR5cGUgfSBmcm9tICcuLi8uLi9wcm90b2NvbC9lbnVtcy9TZXJ2aWNlVHlwZS5qcyc7XG5cbi8qKlxuICogTk9URTogVGhpcyBjb3VsZCBhbGwgY2hhbmdlIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZXN0aW5nLlxuICogVGhpcyBjbGFzcyBzaG91bGQgYWxzbyBiZSBtYXJrZWQgcHJpdmF0ZSBhbmQgYmVoaW5kIHRoZSBTZGxNYW5hZ2VyIEFQSVxuICpcbiAqIHVzYWdlIHNob3VsZCBiZTpcbiAqIHZhciBsY20gPSBuZXcgTGlmZWN5Y2xlTWFuYWdlcihhcHBDb25maWcsIGxpZmVjeWNsZUxpc3RlbmVyKTtcbiAqIGxjbS5zZXRScGNMaXN0ZW5lciggLi4uICk7XG4gKiBsY20uc3RhcnQoKTtcbiAqIC4uLi5cbiAqXG4gKiBsaWZlY3ljbGVMaXN0ZW5lci5PblByb3h5Q29ubmVjdGVkKCl7XG4gKiAgLy9Qb3NzaWJsZSB0byBzdGFydCBzZW5kaW5nIFJQQ3MsIEhNSSBsZXZlbCBzaG91bGQgYmUgTk9ORSB0byBzdGFydFxuICpcbiAqIH1cbiAqXG4gKi9cbmNsYXNzIExpZmVjeWNsZU1hbmFnZXIge1xuICAgIC8qKlxuICAgICogQHBhcmFtIHtBcHBDb25maWd9IHNkbENvbmZpZ1xuICAgICogQHBhcmFtIHtMaWZlY3ljbGVMaXN0ZW5lcn0gbGlmZWN5Y2xlTGlzdGVuZXJcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKGFwcENvbmZpZywgbGlmZWN5Y2xlTGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKGFwcENvbmZpZyA9PT0gbnVsbCB8fCBsaWZlY3ljbGVMaXN0ZW5lciA9PT0gbnVsbFxuICAgICAgICAgICAgfHwgYXBwQ29uZmlnID09PSB1bmRlZmluZWQgfHwgbGlmZWN5Y2xlTGlzdGVuZXIgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1zIG11c3Qgbm90IGJlIG51bGwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FwcENvbmZpZyA9IGFwcENvbmZpZztcbiAgICAgICAgdGhpcy5fbGlmZWN5Y2xlTGlzdGVuZXIgPSBsaWZlY3ljbGVMaXN0ZW5lcjtcbiAgICAgICAgdGhpcy5fc2RsU2Vzc2lvbiA9IG5ldyBTZGxTZXNzaW9uKHRoaXMuX2FwcENvbmZpZy5nZXRUcmFuc3BvcnRDb25maWcoKSwgdGhpcy5fY3JlYXRlU2Vzc2lvbkxpc3RlbmVyKCkpO1xuXG4gICAgICAgIC8vIFRoaXMgaXMgYnkgZGVmYXVsdCB1bnRpbCB3ZSByZWNlaXZlIHRoZSBSQUkgUmVzcG9uc2VcbiAgICAgICAgdGhpcy5fcnBjU3BlY1ZlcnNpb24gPSBuZXcgVmVyc2lvbigxLCAwLCAwKTtcblxuICAgICAgICB0aGlzLl9jdXJyZW50SE1JU3RhdHVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZmlyc3RUaW1lRnVsbCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlTGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9tYXhDb3JyZWxhdGlvbklkID0gMDsgLy8gVE9ETyByZW1vdmUgd2hlbiBjb3JyZWxhdGlvbiBnZW4gaXMgaW1wbGVtZW50ZWRcbiAgICAgICAgdGhpcy5fcnBjTGlzdGVuZXJzID0gbmV3IE1hcCgpOyAvLyA8TnVtYmVyLCBBcnJheTxScGNMaXN0ZW5lcj4+XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U2RsU2Vzc2lvbkxpc3RlbmVyfVxuICAgICAqL1xuICAgIF9jcmVhdGVTZXNzaW9uTGlzdGVuZXIgKCkge1xuICAgICAgICBjb25zdCBzZXNzaW9uTGlzdGVuZXIgPSBuZXcgU2RsU2Vzc2lvbkxpc3RlbmVyKCk7XG4gICAgICAgIHNlc3Npb25MaXN0ZW5lci5zZXRPblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQoKHNlcnZpY2VUeXBlLCBzZXNzaW9uSUQsIHZlcnNpb24sIGNvcnJlbGF0aW9uSUQsIGhhc2hJRCwgaXNFbmNyeXB0ZWQpID0+IHtcbiAgICAgICAgICAgIC8vIFNlc3Npb24gaGFzIGJlZW4gc3RhcnRlZFxuICAgICAgICAgICAgLy8gVE9ETyBjaGVjayBtaW4gcHJvdG9jb2wgc3BlYyB2ZXJzaW9uXG4gICAgICAgICAgICBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLlJQQykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hcHBDb25maWcgIT09IG51bGwgJiYgdGhpcy5fYXBwQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBjYWxsIHByZXBhcmUgb24gY29uZmlnIHRvIG1ha2Ugc3VyZSBpdCBpcyBzYXRpc2ZhY3RvcnlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kUnBjTWVzc2FnZSh0aGlzLl9jcmVhdGVSZWdpc3RlckFwcEludGVyZmFjZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uTGlzdGVuZXIuc2V0T25Qcm90b2NvbFNlc3Npb25FbmRlZCgoc2VydmljZVR5cGUsIHNlc3Npb25JRCwgY29ycmVsYXRpb25JRCkgPT4ge1xuICAgICAgICAgICAgLy8gU2Vzc2lvbiBoYXMgYmVlbiBlbmRlZFxuICAgICAgICB9KTtcbiAgICAgICAgc2Vzc2lvbkxpc3RlbmVyLnNldE9uUHJvdG9jb2xTZXNzaW9uRW5kZWROQUNLZWQoKHNlcnZpY2VUeXBlLCBzZXNzaW9uSUQsIGNvcnJlbGF0aW9uSUQpID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE8gaW0gbm90IHN1cmUgd2h5IHdlIGhhdmUgdGhpc1xuICAgICAgICB9KTtcbiAgICAgICAgc2Vzc2lvbkxpc3RlbmVyLnNldE9uUnBjTWVzc2FnZVJlY2VpdmVkKChycGNNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAvLyBNZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkXG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVScGMocnBjTWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uTGlzdGVuZXIuc2V0T25UcmFuc3BvcnRDb25uZWN0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgLy8gdHJhbnNwb3J0IGhhcyBiZWVuIGNvbm5lY3RlZFxuICAgICAgICAgICAgdGhpcy5fc2RsU2Vzc2lvbi5zdGFydFNlcnZpY2UoU2VydmljZVR5cGUuUlBDLCAwLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZXNzaW9uTGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHsgUnBjTWVzc2FnZSB9IHJwY01lc3NhZ2VcbiAgICAgKi9cbiAgICBfaGFuZGxlUnBjIChycGNNZXNzYWdlKSB7XG4gICAgICAgIGlmIChycGNNZXNzYWdlID09PSBudWxsIHx8IHJwY01lc3NhZ2UgPT09IHVuZGVmaW5lZCB8fCBycGNNZXNzYWdlLmdldEZ1bmN0aW9uTmFtZSgpID09PSBudWxsIHx8IHJwY01lc3NhZ2UuZ2V0RnVuY3Rpb25OYW1lKCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnVuY3Rpb25JRCA9IEZ1bmN0aW9uSUQudmFsdWVGb3JLZXkocnBjTWVzc2FnZS5nZXRGdW5jdGlvbk5hbWUoKSk7IC8vIHRoaXMgaXMgdGhlIG51bWJlciB2YWx1ZVxuICAgICAgICBjb25zdCBsaXN0ZW5lckFycmF5ID0gdGhpcy5fcnBjTGlzdGVuZXJzLmdldChmdW5jdGlvbklEKTtcbiAgICAgICAgaWYgKGxpc3RlbmVyQXJyYXkgIT09IG51bGwgJiYgbGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsaXN0ZW5lckFycmF5LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBpdGVtLm9uUnBjTWVzc2FnZShycGNNZXNzYWdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGluZGl2aWR1YWwgUlBDIGxpc3RlbmVycyBmb3IgcmVxdWVzdC9yZXNwb25zZSBwYWlyc1xuICAgICAgICBpZiAocnBjTWVzc2FnZSBpbnN0YW5jZW9mIFJwY1Jlc3BvbnNlKSB7XG4gICAgICAgICAgICAvLyBudWxsIGNoZWNrIG5vdCBuZWVkZWQuIGl0cyBhbHdheXMgZGVmaW5lZCBpbiB0aGUgY29uc3RydWN0b3JcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXNwb25zZUxpc3RlbmVycy5oYXMocnBjTWVzc2FnZS5nZXRDb3JyZWxhdGlvbklkKCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VMaXN0ZW5lcnMuZ2V0KHJwY01lc3NhZ2UuZ2V0Q29ycmVsYXRpb25JZCgpKS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0xpZmVjeWNsZU1hbmFnZXJ9XG4gICAgKi9cbiAgICBzdGFydCAoKSB7XG4gICAgICAgIHRoaXMuX3NldHVwSW50ZXJuYWxScGNMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5fc2RsU2Vzc2lvbi5zdGFydCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzdG9wICgpIHtcbiAgICAgICAgdGhpcy5fc2RsU2Vzc2lvbi5jbG9zZSgpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uSUR9IGZ1bmN0aW9uSURcbiAgICAgKiBAcGFyYW0ge1JwY0xpc3RlbmVyfSBycGNMaXN0ZW5lclxuICAgICAqL1xuICAgIGFkZFJwY0xpc3RlbmVyIChmdW5jdGlvbklELCBycGNMaXN0ZW5lcikge1xuICAgICAgICBsZXQgbGlzdGVuZXJBcnJheSA9IHRoaXMuX3JwY0xpc3RlbmVycy5nZXQoZnVuY3Rpb25JRCk7XG4gICAgICAgIC8vIElmIG5vIGFycmF5IGV4aXN0cyB5ZXQgZm9yIHRoaXMgZnVuY3Rpb24gaWQsIGNyZWF0ZSBvbmVcbiAgICAgICAgaWYgKGxpc3RlbmVyQXJyYXkgPT09IG51bGwgfHwgbGlzdGVuZXJBcnJheSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9ycGNMaXN0ZW5lcnMuc2V0KGZ1bmN0aW9uSUQsIFtdKTtcbiAgICAgICAgICAgIGxpc3RlbmVyQXJyYXkgPSB0aGlzLl9ycGNMaXN0ZW5lcnMuZ2V0KGZ1bmN0aW9uSUQpO1xuICAgICAgICB9XG4gICAgICAgIGxpc3RlbmVyQXJyYXkucHVzaChycGNMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uSUR9IGZ1bmN0aW9uSURcbiAgICAgKiBAcGFyYW0ge1JwY0xpc3RlbmVyfSBycGNMaXN0ZW5lclxuICAgICAqL1xuICAgIHJlbW92ZVJwY0xpc3RlbmVyIChmdW5jdGlvbklELCBycGNMaXN0ZW5lcikge1xuICAgICAgICBpZiAocnBjTGlzdGVuZXIgIT09IG51bGwgJiYgcnBjTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJBcnJheSA9IHRoaXMuX3JwY0xpc3RlbmVycy5nZXQoZnVuY3Rpb25JRCk7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJBcnJheSAhPT0gbnVsbCAmJiBsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ycGNMaXN0ZW5lcnMuc2V0KGZ1bmN0aW9uSUQsIEFycmF5VG9vbHMuYXJyYXlSZW1vdmUobGlzdGVuZXJBcnJheSwgcnBjTGlzdGVuZXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtScGNNZXNzYWdlfSBycGNNZXNzYWdlXG4gICAgICovXG4gICAgc2VuZFJwY01lc3NhZ2UgKHJwY01lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHJwY01lc3NhZ2UgIT09IG51bGwgJiYgcnBjTWVzc2FnZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX3NkbFNlc3Npb24uZ2V0SXNDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgLy8gVE9ETyB3ZSBzdGlsbCBuZWVkIHRvIG1ha2UgcHJvcGVyIGNoYW5nZXMgdG8gaGFuZGxlIHNwZWNpZmljIGNhc2VzIGZvciBSUENzIGllIFBMQVlfUEFVU0UgLyBPS1xuXG4gICAgICAgICAgICAvLyBUT0RPIGNyZWF0ZSBhIGNvcnJlbGF0aW9uIGlkIGdlbmVyYXRvciBhbmQgaGFuZGxlIHRoaXMgaW4gdGhlIFJQQyBjbGFzc2VzXG4gICAgICAgICAgICBpZiAocnBjTWVzc2FnZSBpbnN0YW5jZW9mIFJwY1JlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAocnBjTWVzc2FnZS5nZXRGdW5jdGlvbk5hbWUgIT09IEZ1bmN0aW9uSUQuUmVnaXN0ZXJBcHBJbnRlcmZhY2UpIHsgLy8gUkFJIGhhcyBhIGEgcHJvdGVjdGVkIGlkXG4gICAgICAgICAgICAgICAgICAgIHJwY01lc3NhZ2Uuc2V0Q29ycmVsYXRpb25JZCgrK3RoaXMuX21heENvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFRPRE86IGNhbid0IHV0aWxpemUgdGhlIGFiaWxpdHkgb2YgcHJvbWlzZXMgbGlrZSB0aGlzXG4gICAgICAgICAgICAgICAgaWYgKHJwY01lc3NhZ2UuZ2V0T25SUENSZXNwb25zZVByb21pc2UoKSAhPT0gbnVsbCAmJiBycGNNZXNzYWdlLmdldE9uUlBDUmVzcG9uc2VQcm9taXNlKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGluZGl2aWR1YWwgcmVzcG9uc2UgbGlzdGVuZXIgZm9yIHRoaXMgUlBDIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VMaXN0ZW5lcnMuc2V0KHJwY01lc3NhZ2UuZ2V0Q29ycmVsYXRpb25JZCgpLCBycGNNZXNzYWdlLmdldE9uUlBDUmVzcG9uc2VQcm9taXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NkbFNlc3Npb24uc2VuZFJwYyhycGNNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlfVxuICAgICAqL1xuICAgIGdldFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZTtcbiAgICB9XG5cblxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAqL1xuICAgIF9jcmVhdGVSZWdpc3RlckFwcEludGVyZmFjZSAoKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyQXBwSW50ZXJmYWNlID0gbmV3IFJlZ2lzdGVyQXBwSW50ZXJmYWNlKCk7XG4gICAgICAgIHJlZ2lzdGVyQXBwSW50ZXJmYWNlLnNldFNkbE1zZ1ZlcnNpb24obmV3IFNkbE1zZ1ZlcnNpb24oKS5zZXRNYWpvclZlcnNpb24oTGlmZWN5Y2xlTWFuYWdlci5NQVhfUlBDX1ZFUlNJT04uZ2V0TWFqb3IoKSkuc2V0TWlub3JWZXJzaW9uKExpZmVjeWNsZU1hbmFnZXIuTUFYX1JQQ19WRVJTSU9OLmdldE1pbm9yKCkpLnNldFBhdGNoVmVyc2lvbihMaWZlY3ljbGVNYW5hZ2VyLk1BWF9SUENfVkVSU0lPTi5nZXRQYXRjaCgpKSlcbiAgICAgICAgICAgIC5zZXRBcHBOYW1lKHRoaXMuX2FwcENvbmZpZy5nZXRBcHBOYW1lKCkpXG4gICAgICAgICAgICAuc2V0RnVsbEFwcElkKHRoaXMuX2FwcENvbmZpZy5nZXRBcHBJZCgpKVxuICAgICAgICAgICAgLnNldE5nbk1lZGlhU2NyZWVuQXBwTmFtZSh0aGlzLl9hcHBDb25maWcuZ2V0U2hvcnRBcHBOYW1lKCkpXG4gICAgICAgICAgICAuc2V0QXBwSG1pVHlwZSh0aGlzLl9hcHBDb25maWcuZ2V0QXBwVHlwZXMoKSlcbiAgICAgICAgICAgIC5zZXRMYW5ndWFnZURlc2lyZWQodGhpcy5fYXBwQ29uZmlnLmdldExhbmd1YWdlRGVzaXJlZCgpKVxuICAgICAgICAgICAgLnNldEhtaURpc3BsYXlMYW5ndWFnZURlc2lyZWQodGhpcy5fYXBwQ29uZmlnLmdldEhtaURpc3BsYXlMYW5ndWFnZURlc2lyZWQoKSlcbiAgICAgICAgICAgIC5zZXRJc01lZGlhQXBwbGljYXRpb24odGhpcy5fYXBwQ29uZmlnLmlzTWVkaWFBcHAoKSlcbiAgICAgICAgICAgIC5zZXREYXlDb2xvclNjaGVtZSh0aGlzLl9hcHBDb25maWcuZ2V0RGF5Q29sb3JTY2hlbWUoKSlcbiAgICAgICAgICAgIC5zZXROaWdodENvbG9yU2NoZW1lKHRoaXMuX2FwcENvbmZpZy5nZXROaWdodENvbG9yU2NoZW1lKCkpXG4gICAgICAgICAgICAuc2V0Q29ycmVsYXRpb25JZChMaWZlY3ljbGVNYW5hZ2VyLlJFR0lTVEVSX0FQUF9JTlRFUkZBQ0VfQ09SUkVMQVRJT05fSUQpO1xuXG4gICAgICAgIC8vIFRPRE8gQWRkIGFsbCBwb3NzaWJsZSBpdGVtc1xuXG4gICAgICAgIHJldHVybiByZWdpc3RlckFwcEludGVyZmFjZTtcbiAgICB9XG5cblxuICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlRFUk5BTCAtIFJQQyBMSVNURU5FUlMgISEgU1RBUlQgISEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIF9zZXR1cEludGVybmFsUnBjTGlzdGVuZXJzICgpIHtcbiAgICAgICAgdGhpcy5fcnBjTGlzdGVuZXIgPSBuZXcgUnBjTGlzdGVuZXIoKS5zZXRPblJwY01lc3NhZ2UocnBjTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmdW5jdGlvbklEID0gRnVuY3Rpb25JRC52YWx1ZUZvcktleShycGNNZXNzYWdlLmdldEZ1bmN0aW9uTmFtZSgpKTsgLy8gdGhpcyBpcyB0aGUgbnVtYmVyIHZhbHVlXG5cblxuICAgICAgICAgICAgc3dpdGNoIChmdW5jdGlvbklEKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlJlZ2lzdGVyQXBwSW50ZXJmYWNlOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzUmFpUmVzcG9uc2UocnBjTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5PbkhNSVN0YXR1czoge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGEgc2luZ2xlIG9uUHJveHlDb25uZWN0ZWQsIHdoZW4gd2UgZ28gZnJvbSBhIG51bGwgSE1JIGxldmVsIHRvIGEgZGVmaW5lZCBITUkgbGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkSW5pdCA9IHJwY01lc3NhZ2UuZ2V0SE1JTGV2ZWwoKSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgcnBjTWVzc2FnZS5nZXRITUlMZXZlbCgpICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2N1cnJlbnRITUlTdGF0dXMgPT09IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudEhNSVN0YXR1cyA9IHJwY01lc3NhZ2UuZ2V0SE1JTGV2ZWwoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGlmZWN5Y2xlTGlzdGVuZXIgIT09IG51bGwgJiYgdGhpcy5fbGlmZWN5Y2xlTGlzdGVuZXIgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRJbml0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9saWZlY3ljbGVMaXN0ZW5lci5vblByb3h5Q29ubmVjdGVkKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIFJQQyBub3QgaGFuZGxlZCB5ZXQgaW4gTENNXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkUnBjTGlzdGVuZXIoRnVuY3Rpb25JRC5SZWdpc3RlckFwcEludGVyZmFjZSwgdGhpcy5fcnBjTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLmFkZFJwY0xpc3RlbmVyKEZ1bmN0aW9uSUQuT25ITUlTdGF0dXMsIHRoaXMuX3JwY0xpc3RlbmVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX0gcmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZVxuICAgICAqL1xuICAgIF9wcm9jZXNzUmFpUmVzcG9uc2UgKHJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UpIHtcbiAgICAgICAgLy8gQ2FjaGUgdGhpcyBSQUkgUmVzcG9uc2UgYXMgaXQgY2FuIGJlIHVzZWQgbGF0ZXJcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZSA9IHJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2U7XG5cbiAgICAgICAgLy8gIFRPRE8gS0VZX1NETF9NU0dfVkVSU0lPTiB2cyBLRVlfU1lOQ19NU0dfVkVSU0lPTiBzZGxWZXJzaW9uOiAne0dJVF9DT01NSVR9JywgSSB0aGluayB0aGUga2V5IG5hbWUgY2hhbmdlXG4gICAgICAgIC8vIGlzIG1lYW50IHRvIG1ha2UgdGhpbmdzIGNsZWFyZXIgYWJvdXQgdGhpcyBiZWluZyBhbiBzZGwgdmVyc2lvbiB3aGljaCBpcyBub3Qgc3BlY2lmaWMgdG8gZm9yZCdzIHN5bmMuXG4gICAgICAgIC8vIFRoZXJlIGlzIGEga2V5IGNhbGxlZCBzZGxWZXJzaW9uIHRoYXQgaXMgcmVzcG9uZGluZyB3aXRoIHtHSVRfQ09NTUlUfSB0aGF0IEknbSB1bnN1cmUgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby5cbiAgICAgICAgY29uc3QgbXNnVmVyc2lvbiA9IHJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuZ2V0U2RsTXNnVmVyc2lvbigpO1xuXG4gICAgICAgIGlmIChtc2dWZXJzaW9uICE9PSBudWxsICYmIG1zZ1ZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fcnBjU3BlY1ZlcnNpb24gPSBuZXcgVmVyc2lvbihtc2dWZXJzaW9uLmdldE1ham9yVmVyc2lvbigpLCBtc2dWZXJzaW9uLmdldE1ham9yVmVyc2lvbigpLCBtc2dWZXJzaW9uLmdldFBhdGNoVmVyc2lvbigpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3JwY1NwZWNWZXJzaW9uID0gTGlmZWN5Y2xlTWFuYWdlci5NQVhfUlBDX1ZFUlNJT047XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIFRPRE8gY2hlY2sgYWdhaW5zdCBtaW4gUlBDIHNwZWMgdmVyc2lvbiBjb25maWdcblxuICAgICAgICAvLyBUT0RPIHBhcnNlIFJBSSBmb3Igc3lzdGVtIGNhcGFiaWxpdGllc1xuICAgIH1cbn1cblxuTGlmZWN5Y2xlTWFuYWdlci5NQVhfUlBDX1ZFUlNJT04gPSBuZXcgVmVyc2lvbig2LCAwLCAwKTtcbkxpZmVjeWNsZU1hbmFnZXIuUkVHSVNURVJfQVBQX0lOVEVSRkFDRV9DT1JSRUxBVElPTl9JRCA9IDY1NTI5O1xuTGlmZWN5Y2xlTWFuYWdlci5VTlJFR0lTVEVSX0FQUF9JTlRFUkZBQ0VfQ09SUkVMQVRJT05fSUQgPSA2NTUzMDtcblxuXG5leHBvcnQgeyBMaWZlY3ljbGVNYW5hZ2VyIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBWaWRlb1N0cmVhbWluZ0Zvcm1hdCB9IGZyb20gJy4vVmlkZW9TdHJlYW1pbmdGb3JtYXQuanMnO1xuaW1wb3J0IHsgSW1hZ2VSZXNvbHV0aW9uIH0gZnJvbSAnLi9JbWFnZVJlc29sdXRpb24uanMnO1xuXG5jbGFzcyBWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0ltYWdlUmVzb2x1dGlvbn0gdmFsXG4gICAgKiBAcmV0dXJuIHtWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHl9XG4gICAgKi9cbiAgICBzZXRQcmVmZXJyZWRSZXNvbHV0aW9uICh2YWwpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSW1hZ2VSZXNvbHV0aW9uLCB2YWwpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuS0VZX1BSRUZFUlJFRF9SRVNPTFVUSU9OLCB2YWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0ltYWdlUmVzb2x1dGlvbn1cbiAgICAqL1xuICAgIGdldFByZWZlcnJlZFJlc29sdXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSW1hZ2VSZXNvbHV0aW9uLCBWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuS0VZX1BSRUZFUlJFRF9SRVNPTFVUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWxcbiAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eX1cbiAgICAqL1xuICAgIHNldE1heEJpdHJhdGUgKHZhbCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuS0VZX01BWF9CSVRSQVRFLCB2YWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAqL1xuICAgIGdldE1heEJpdHJhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9NQVhfQklUUkFURSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7VmlkZW9TdHJlYW1pbmdGb3JtYXRbXX0gdmFsXG4gICAgKiBAcmV0dXJuIHtWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHl9XG4gICAgKi9cbiAgICBzZXRTdXBwb3J0ZWRGb3JtYXRzICh2YWwpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmlkZW9TdHJlYW1pbmdGb3JtYXQsIHZhbCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eS5LRVlfU1VQUE9SVEVEX0ZPUk1BVFMsIHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtWaWRlb1N0cmVhbWluZ0Zvcm1hdFtdfVxuICAgICovXG4gICAgZ2V0U3VwcG9ydGVkRm9ybWF0cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWaWRlb1N0cmVhbWluZ0Zvcm1hdCwgVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9TVVBQT1JURURfRk9STUFUUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IHZhbFxuICAgICogQHJldHVybiB7VmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5fVxuICAgICovXG4gICAgc2V0SGFwdGljU3BhdGlhbERhdGFTdXBwb3J0ZWQgKHZhbCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuS0VZX0hBUFRJQ19TUEFUSUFMX0RBVEFfU1VQUE9SVEVELCB2YWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgKi9cbiAgICBnZXRIYXB0aWNTcGF0aWFsRGF0YVN1cHBvcnRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuS0VZX0hBUFRJQ19TUEFUSUFMX0RBVEFfU1VQUE9SVEVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWxcbiAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eX1cbiAgICAqL1xuICAgIHNldERpYWdvbmFsU2NyZWVuU2l6ZSAodmFsKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eS5LRVlfRElBR09OQUxfU0NSRUVOX1NJWkUsIHZhbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICovXG4gICAgZ2V0RGlhZ29uYWxTY3JlZW5TaXplICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eS5LRVlfRElBR09OQUxfU0NSRUVOX1NJWkUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbFxuICAgICogQHJldHVybiB7VmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5fVxuICAgICovXG4gICAgc2V0UGl4ZWxQZXJJbmNoICh2YWwpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9QSVhFTF9QRVJfSU5DSCwgdmFsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgKi9cbiAgICBnZXRQaXhlbFBlckluY2ggKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9QSVhFTF9QRVJfSU5DSCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge251bWJlcn0gdmFsXG4gICAgKiBAcmV0dXJuIHtWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHl9XG4gICAgKi9cbiAgICBzZXRTY2FsZSAodmFsKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eS5LRVlfU0NBTEUsIHZhbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICovXG4gICAgZ2V0U2NhbGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9TQ0FMRSk7XG4gICAgfVxufVxuXG5WaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuS0VZX1BSRUZFUlJFRF9SRVNPTFVUSU9OID0gJ3ByZWZlcnJlZFJlc29sdXRpb24nO1xuVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9NQVhfQklUUkFURSA9ICdtYXhCaXRyYXRlJztcblZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eS5LRVlfU1VQUE9SVEVEX0ZPUk1BVFMgPSAnc3VwcG9ydGVkRm9ybWF0cyc7XG5WaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuS0VZX0hBUFRJQ19TUEFUSUFMX0RBVEFfU1VQUE9SVEVEID0gJ2hhcHRpY1NwYXRpYWxEYXRhU3VwcG9ydGVkJztcblZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eS5LRVlfRElBR09OQUxfU0NSRUVOX1NJWkUgPSAnZGlhZ29uYWxTY3JlZW5TaXplJztcblZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eS5LRVlfUElYRUxfUEVSX0lOQ0ggPSAncGl4ZWxQZXJJbmNoJztcblZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eS5LRVlfU0NBTEUgPSAnc2NhbGUnO1xuXG5leHBvcnQgeyBWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNkbFNlcnZpY2VMaXN0ZW5lclxuICovXG5jbGFzcyBTZGxTZXJ2aWNlTGlzdGVuZXIge1xuICAgIC8qKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICB0aGlzLl9vblNlcnZpY2VTdGFydGVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25TZXJ2aWNlRW5kZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblNlcnZpY2VFcnJvciA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBzZXRPblNlcnZpY2VTdGFydGVkIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9vblNlcnZpY2VTdGFydGVkID0gbGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBzZXRPblNlcnZpY2VFbmRlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25TZXJ2aWNlRW5kZWQgPSBsaXN0ZW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHNldE9uU2VydmljZUVycm9yIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9vblNlcnZpY2VFcnJvciA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2RsU2Vzc2lvbn0gc2Vzc2lvblxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBpc0VuY3J5cHRlZFxuICAgICAqL1xuICAgIG9uU2VydmljZVN0YXJ0ZWQgKHNlc3Npb24sIHNlcnZpY2VUeXBlLCBpc0VuY3J5cHRlZCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uU2VydmljZVN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uU2VydmljZVN0YXJ0ZWQoc2Vzc2lvbiwgc2VydmljZVR5cGUsIGlzRW5jcnlwdGVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2RsU2Vzc2lvbn0gc2Vzc2lvblxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICovXG4gICAgb25TZXJ2aWNlRW5kZWQgKHNlc3Npb24sIHNlcnZpY2VUeXBlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25TZXJ2aWNlRW5kZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uU2VydmljZUVuZGVkKHNlc3Npb24sIHNlcnZpY2VUeXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2RsU2Vzc2lvbn0gc2Vzc2lvblxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHJlYXNvblxuICAgICAqL1xuICAgIG9uU2VydmljZUVycm9yIChzZXNzaW9uLCBzZXJ2aWNlVHlwZSwgcmVhc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25TZXJ2aWNlRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uU2VydmljZUVycm9yKHNlc3Npb24sIHNlcnZpY2VUeXBlLCByZWFzb24pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBTZGxTZXJ2aWNlTGlzdGVuZXIgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgVHJhbnNwb3J0QmFzZSB9IGZyb20gJy4vVHJhbnNwb3J0QmFzZS5qcyc7XG5pbXBvcnQgeyBTZGxQc20gfSBmcm9tICcuL1NkbFBzbS5qcyc7XG5cbmNsYXNzIEN1c3RvbVRyYW5zcG9ydCBleHRlbmRzIFRyYW5zcG9ydEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yICh0cmFuc3BvcnRDb25maWcsIHRyYW5zcG9ydENhbGxiYWNrID0gbnVsbCkge1xuICAgICAgICBzdXBlcih0cmFuc3BvcnRDb25maWcsIHRyYW5zcG9ydENhbGxiYWNrKTtcbiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUcmFuc3BvcnRDYWxsYmFja30gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBzZXRUcmFuc3BvcnRDYWxsYmFjayAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcnMgdGhlIHRyYW5zcG9ydCBjYWxsYmFjayBmb3IgY29ubmVjdGlvbiBlc3RhYmxpc2hlZFxuICAgICAqL1xuICAgIHN0YXJ0ICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjay5vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcnMgdGhlIHRyYW5zcG9ydCBjYWxsYmFjayBmb3IgY29ubmVjdGlvbiB0ZXJtaW5hdGVkXG4gICAgICovXG4gICAgc3RvcCAoKSB7XG4gICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnRDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2sub25Db25uZWN0aW9uVGVybWluYXRlZCgnVHJhbnNwb3J0IHRvbGQgdG8gc3RvcCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcnMgdGhlIHRyYW5zcG9ydCBjYWxsYmFjayBmb3IgYW4gZXJyb3JcbiAgICAgKi9cbiAgICBvbkVycm9yICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjay5vbkVycm9yKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudHMgaW4gdGhlIHBhY2tldCBzaG91bGQgYmUgc2VudCBvdXQgdGhyb3VnaCB0aGUgdHJhbnNwb3J0XG4gICAgICogQHBhcmFtIHtTZGxQYWNrZXR9IHBhY2tldFxuICAgICAqL1xuICAgIHNlbmRQYWNrZXQgKHBhY2tldCkge1xuICAgICAgICBjb25zdCBieXRlcyA9IHBhY2tldC50b1BhY2tldCgpO1xuICAgICAgICB0aGlzLm9uU2VuZFBhY2tldChieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXBwIGluc3RhbnRpYXRpbmcgdGhpcyBjbGFzcyBuZWVkcyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QhIHNlbmRQYWNrZXQgY2FsbHMgdGhpcyBtZXRob2RcbiAgICAgKiBAcGFyYW0ge1VJbnQ4QXJyYXl9IGJ5dGVzXG4gICAgICovXG4gICAgb25TZW5kUGFja2V0IChieXRlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uU2VuZFBhY2tldCBtZXRob2QgbXVzdCBiZSBvdmVycmlkZGVuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBieXRlIGJ1ZmZlciB3YXMgcGFzc2VkIGhlcmUgZm9yIHByb2Nlc3NpbmdcbiAgICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IG1lc3NhZ2VcbiAgICAgKi9cbiAgICBvbkJ5dGVCdWZmZXJSZWNlaXZlZCAobWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9xdWV1ZS5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLl9tdWx0aUJ5dGVIYW5kbGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIHJlY2VpdmVkIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwgcXVldWVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9tdWx0aUJ5dGVIYW5kbGVyICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzUnVubmluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IHRydWU7XG5cbiAgICAgICAgd2hpbGUgKHRoaXMuX3F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHVpbnQ4ID0gdGhpcy5fcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYnl0ZSBvZiB1aW50OCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUJ5dGUoYnl0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZWVkcyBhIGJ5dGUgdGhyb3VnaCB0aGUgaW50ZXJuYWwgUFNNXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGJ5dGUgLSB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VyXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaGFuZGxlQnl0ZSAoYnl0ZSkge1xuICAgICAgICBjb25zdCBzZGxQc20gPSB0aGlzLl9zZGxQc207XG5cbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHNkbFBzbS5oYW5kbGVCeXRlKGJ5dGUpO1xuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZhaWxlZCcsIHNkbFBzbSk7XG4gICAgICAgICAgICBzZGxQc20ucmVzZXQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0ZpbmlzaGVkID0gc2RsUHNtLmdldFN0YXRlKCkgPT09IFNkbFBzbS5GSU5JU0hFRF9TVEFURTtcblxuICAgICAgICBpZiAoaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gc2RsUHNtLmdldEZvcm1lZFBhY2tldCgpO1xuICAgICAgICAgICAgc2RsUHNtLnJlc2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjay5vblBhY2tldFJlY2VpdmVkKHBhY2tldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuZXhwb3J0IHsgQ3VzdG9tVHJhbnNwb3J0IH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHJhbnNwb3J0Q29uZmlnQmFzZVxuICogQHByb3BlcnR5IHtUcmFuc3BvcnRUeXBlfSBfdHJhbnNwb3J0VHlwZVxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZ2V0VHJhbnNwb3J0VHlwZVxuICovXG5jbGFzcyBUcmFuc3BvcnRDb25maWdCYXNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zcG9ydFR5cGV9IHRyYW5zcG9ydFR5cGUgLSBlbnVtXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHRyYW5zcG9ydFR5cGUpIHtcbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0VHlwZSA9IHRyYW5zcG9ydFR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VHJhbnNwb3J0VHlwZX1cbiAgICAgKi9cbiAgICBnZXRUcmFuc3BvcnRUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydFR5cGU7XG4gICAgfVxufVxuXG5leHBvcnQgeyBUcmFuc3BvcnRDb25maWdCYXNlIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFRyYW5zcG9ydENvbmZpZ0Jhc2UgfSBmcm9tICcuL1RyYW5zcG9ydENvbmZpZ0Jhc2UuanMnO1xuaW1wb3J0IHsgVHJhbnNwb3J0VHlwZSB9IGZyb20gJy4vZW51bXMvVHJhbnNwb3J0VHlwZS5qcyc7XG5cbmNsYXNzIEN1c3RvbVRyYW5zcG9ydENvbmZpZyBleHRlbmRzIFRyYW5zcG9ydENvbmZpZ0Jhc2Uge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKiBAcGFyYW0ge0N1c3RvbVRyYW5zcG9ydH0gY3VzdG9tVHJhbnNwb3J0IC0gQW4gaW5zdGFuY2Ugb2YgYSBjdXN0b20gdHJhbnNwb3J0XG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoY3VzdG9tVHJhbnNwb3J0KSB7XG4gICAgICAgIHN1cGVyKFRyYW5zcG9ydFR5cGUuQ1VTVE9NKTtcbiAgICAgICAgdGhpcy5fY3VzdG9tVHJhbnNwb3J0ID0gY3VzdG9tVHJhbnNwb3J0O1xuICAgIH1cblxuICAgIGdldFRyYW5zcG9ydFR5cGUgKCkge1xuICAgICAgICByZXR1cm4gVHJhbnNwb3J0VHlwZS5DVVNUT007XG4gICAgfVxuXG4gICAgZ2V0VHJhbnNwb3J0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbVRyYW5zcG9ydDtcbiAgICB9XG59XG5cbmV4cG9ydCB7IEN1c3RvbVRyYW5zcG9ydENvbmZpZyB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5jbGFzcyBTc2xDb25maWcge1xuICAgIGNvbnN0cnVjdG9yIChwZW1DZXJ0aWZpY2F0ZSA9IG51bGwsIHByaXZhdGVLZXkgPSBudWxsLCBwYXNzd29yZCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fcGVtQ2VydGlmaWNhdGUgPSBwZW1DZXJ0aWZpY2F0ZTtcbiAgICAgICAgdGhpcy5fcHJpdmF0ZUtleSA9IHByaXZhdGVLZXk7XG4gICAgICAgIHRoaXMuX3Bhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBQRU0gQ2VydGlmaWNhdGVcbiAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAqL1xuICAgIGdldFBlbUNlcnRpZmljYXRlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BlbUNlcnRpZmljYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgUHJpdmF0ZSBLZXlcbiAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAqL1xuICAgIGdldFByaXZhdGVLZXkgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZUtleTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIHBhc3N3b3JkXG4gICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgKi9cbiAgICBnZXRQYXNzd29yZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXNzd29yZDtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFNzbENvbmZpZyB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFRyYW5zcG9ydFR5cGUgfSBmcm9tICcuL2VudW1zL1RyYW5zcG9ydFR5cGUuanMnO1xuaW1wb3J0IHsgVHJhbnNwb3J0Q29uZmlnQmFzZSB9IGZyb20gJy4vVHJhbnNwb3J0Q29uZmlnQmFzZS5qcyc7XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUcmFuc3BvcnRDb25maWdCYXNlXG4gKiBAcHJvcGVydHkge1RyYW5zcG9ydFR5cGV9IF90cmFuc3BvcnRUeXBlXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRUcmFuc3BvcnRUeXBlXG4gKi9cbmNsYXNzIFdlYlNvY2tldENsaWVudENvbmZpZyBleHRlbmRzIFRyYW5zcG9ydENvbmZpZ0Jhc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7VHJhbnNwb3J0VHlwZX0gdHJhbnNwb3J0VHlwZSAtIGVudW1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoaG9zdCwgcG9ydCkge1xuICAgICAgICBzdXBlcihUcmFuc3BvcnRUeXBlLldFQlNPQ0tFVF9DTElFTlQpO1xuXG4gICAgICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgICAgICB0aGlzLl9wb3J0ID0gcG9ydDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFN0cmluZ1xuICAgICAqL1xuICAgIGdldEhvc3QgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faG9zdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIE51bWJlclxuICAgICAqL1xuICAgIGdldFBvcnQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9ydDtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFdlYlNvY2tldENsaWVudENvbmZpZyB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5jbGFzcyBUcmFuc3BvcnRSZWNvcmQge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKiBAcGFyYW0ge1RyYW5zcG9ydFR5cGV9IHRyYW5zcG9ydFR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgdHJhbnNwb3J0XG4gICAgKiBAcGFyYW0ge1N0cmluZ30gYWRkcmVzc1xuICAgICovXG4gICAgY29uc3RydWN0b3IgKHRyYW5zcG9ydFR5cGUsIGFkZHJlc3MpIHtcbiAgICAgICAgdGhpcy5fdHlwZSA9IHRyYW5zcG9ydFR5cGU7XG4gICAgICAgIHRoaXMuX2FkZHJlc3MgPSBhZGRyZXNzO1xuICAgIH1cblxuICAgIGdldFR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZHJlc3M7XG4gICAgfVxuXG4gICAgZXF1YWxzIChvYmopIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG9iaiBpbnN0YW5jZW9mIFRyYW5zcG9ydFJlY29yZFxuICAgICAgICAgICAgJiYgb2JqLmdldFR5cGUgIT09IG51bGxcbiAgICAgICAgICAgICYmIG9iai5nZXRUeXBlKCkgPT09IHRoaXMuZ2V0VHlwZSgpXG4gICAgICAgICAgICAmJiBvYmouZ2V0QWRkcmVzcygpID09PSB0aGlzLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHRvU3RyaW5nICgpIHtcbiAgICAgICAgcmV0dXJuIGBUcmFuc3BvcnQgVHlwZTogJHt0aGlzLl90eXBlLm5hbWUoKX0gXFxuIEFkZHJlc3M6ICR7dGhpcy5fYWRkcmVzc31gO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgVHJhbnNwb3J0UmVjb3JkIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmNvbnN0IHsgVHJhbnNwb3J0Q29uZmlnQmFzZSB9ID0gcmVxdWlyZSgnLi9UcmFuc3BvcnRDb25maWdCYXNlLmpzJyk7XG5jb25zdCB7IFRyYW5zcG9ydFR5cGUgfSA9IHJlcXVpcmUoJy4vZW51bXMvVHJhbnNwb3J0VHlwZS5qcycpO1xuXG5jbGFzcyBXZWJTb2NrZXRTZXJ2ZXJDb25maWcgZXh0ZW5kcyBUcmFuc3BvcnRDb25maWdCYXNlIHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICogQHBhcmFtIHtXZWJTb2NrZXQuY2xpZW50fSBjbGllbnQgLSBBIGNsaWVudCBjb25uZWN0aW9uIHJlZmVyZW5jZSBtYWRlIGZyb20gYSBXZWJTb2NrZXQgc2VydmVyXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoY2xpZW50ID0gbnVsbCwgY29ubmVjdGlvbkxvc3RUaW1lb3V0ID0gNjAwMDApIHtcbiAgICAgICAgc3VwZXIoVHJhbnNwb3J0VHlwZS5XRUJTT0NLRVRfU0VSVkVSKTtcbiAgICAgICAgdGhpcy5fY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB0aGlzLl9jb25uZWN0aW9uTG9zdFRpbWVvdXQgPSBjb25uZWN0aW9uTG9zdFRpbWVvdXQ7XG5cbiAgICAgICAgaWYgKGNsaWVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2NsaWVudCBtdXN0IGJlIGEgV2ViU29ja2V0IGNsaWVudCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSB3ZWJzb2NrZXQgY2xpZW50XG4gICAgKiBAcmV0dXJuIHtXZWJTb2NrZXQuY2xpZW50fVxuICAgICovXG4gICAgZ2V0Q2xpZW50ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIHdlYnNvY2tldCBjb25uZWN0aW9uIGxvc3QgdGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHNcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIGdldENvbm5lY3Rpb25Mb3N0VGltZW91dCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uTG9zdFRpbWVvdXQ7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBXZWJTb2NrZXRTZXJ2ZXJDb25maWcsXG59OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBBcHBDb25maWcgfSBmcm9tICcuL3RtcC9tYW5hZ2VyL0FwcENvbmZpZy5qcyc7XG5pbXBvcnQgeyBMaWZlY3ljbGVMaXN0ZW5lciB9IGZyb20gJy4vdG1wL21hbmFnZXIvbGlmZWN5Y2xlL0xpZmVjeWNsZUxpc3RlbmVyLmpzJztcbmltcG9ydCB7IExpZmVjeWNsZU1hbmFnZXIgfSBmcm9tICcuL3RtcC9tYW5hZ2VyL2xpZmVjeWNsZS9MaWZlY3ljbGVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEJpbmFyeUZyYW1lSGVhZGVyIH0gZnJvbSAnLi90bXAvcHJvdG9jb2wvQmluYXJ5RnJhbWVIZWFkZXIuanMnO1xuaW1wb3J0IHsgTWVzc2FnZUZyYW1lQXNzZW1ibGVyIH0gZnJvbSAnLi90bXAvcHJvdG9jb2wvTWVzc2FnZUZyYW1lQXNzZW1ibGVyLmpzJztcbmltcG9ydCB7IE1lc3NhZ2VGcmFtZURpc2Fzc2VtYmxlciB9IGZyb20gJy4vdG1wL3Byb3RvY29sL01lc3NhZ2VGcmFtZURpc2Fzc2VtYmxlci5qcyc7XG5pbXBvcnQgeyBTZGxQYWNrZXQgfSBmcm9tICcuL3RtcC9wcm90b2NvbC9TZGxQYWNrZXQuanMnO1xuaW1wb3J0IHsgU2RsUGFja2V0RmFjdG9yeSB9IGZyb20gJy4vdG1wL3Byb3RvY29sL1NkbFBhY2tldEZhY3RvcnkuanMnO1xuaW1wb3J0IHsgU2RsUHJvdG9jb2wgfSBmcm9tICcuL3RtcC9wcm90b2NvbC9TZGxQcm90b2NvbC5qcyc7XG5pbXBvcnQgeyBTZGxQcm90b2NvbEJhc2UgfSBmcm9tICcuL3RtcC9wcm90b2NvbC9TZGxQcm90b2NvbEJhc2UuanMnO1xuaW1wb3J0IHsgU2RsUHJvdG9jb2xMaXN0ZW5lciB9IGZyb20gJy4vdG1wL3Byb3RvY29sL1NkbFByb3RvY29sTGlzdGVuZXIuanMnO1xuaW1wb3J0IHsgQ29udHJvbEZyYW1lVGFncyB9IGZyb20gJy4vdG1wL3Byb3RvY29sL2VudW1zL0NvbnRyb2xGcmFtZVRhZ3MuanMnO1xuaW1wb3J0IHsgRnJhbWVUeXBlIH0gZnJvbSAnLi90bXAvcHJvdG9jb2wvZW51bXMvRnJhbWVUeXBlLmpzJztcbmltcG9ydCB7IFNlcnZpY2VUeXBlIH0gZnJvbSAnLi90bXAvcHJvdG9jb2wvZW51bXMvU2VydmljZVR5cGUuanMnO1xuaW1wb3J0IHsgUnBjQ3JlYXRvciB9IGZyb20gJy4vdG1wL3JwYy9ScGNDcmVhdG9yLmpzJztcbmltcG9ydCB7IFJwY0xpc3RlbmVyIH0gZnJvbSAnLi90bXAvcnBjL1JwY0xpc3RlbmVyLmpzJztcbmltcG9ydCB7IFJwY01lc3NhZ2UgfSBmcm9tICcuL3RtcC9ycGMvUnBjTWVzc2FnZS5qcyc7XG5pbXBvcnQgeyBScGNOb3RpZmljYXRpb24gfSBmcm9tICcuL3RtcC9ycGMvUnBjTm90aWZpY2F0aW9uLmpzJztcbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuL3RtcC9ycGMvUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9ScGNSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuL3RtcC9ycGMvUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IEFwcEhNSVR5cGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvQXBwSE1JVHlwZS5qcyc7XG5pbXBvcnQgeyBBdWRpb1N0cmVhbWluZ1N0YXRlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0F1ZGlvU3RyZWFtaW5nU3RhdGUuanMnO1xuaW1wb3J0IHsgQXVkaW9UeXBlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0F1ZGlvVHlwZS5qcyc7XG5pbXBvcnQgeyBCaXRzUGVyU2FtcGxlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0JpdHNQZXJTYW1wbGUuanMnO1xuaW1wb3J0IHsgQnV0dG9uTmFtZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9CdXR0b25OYW1lLmpzJztcbmltcG9ydCB7IENoYXJhY3RlclNldCB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9DaGFyYWN0ZXJTZXQuanMnO1xuaW1wb3J0IHsgRGlzcGxheVR5cGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvRGlzcGxheVR5cGUuanMnO1xuaW1wb3J0IHsgRmlsZVR5cGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvRmlsZVR5cGUuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IEhNSUxldmVsIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0hNSUxldmVsLmpzJztcbmltcG9ydCB7IEhtaVpvbmVDYXBhYmlsaXRpZXMgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvSG1pWm9uZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBJbWFnZUZpZWxkTmFtZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9JbWFnZUZpZWxkTmFtZS5qcyc7XG5pbXBvcnQgeyBJbWFnZVR5cGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvSW1hZ2VUeXBlLmpzJztcbmltcG9ydCB7IExhbmd1YWdlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0xhbmd1YWdlLmpzJztcbmltcG9ydCB7IE1lZGlhQ2xvY2tGb3JtYXQgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvTWVkaWFDbG9ja0Zvcm1hdC5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YVR5cGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvTWV0YWRhdGFUeXBlLmpzJztcbmltcG9ydCB7IFByZXJlY29yZGVkU3BlZWNoIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1ByZXJlY29yZGVkU3BlZWNoLmpzJztcbmltcG9ydCB7IFJlc3VsdCB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9SZXN1bHQuanMnO1xuaW1wb3J0IHsgUnBjVHlwZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9ScGNUeXBlLmpzJztcbmltcG9ydCB7IFNhbXBsaW5nUmF0ZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9TYW1wbGluZ1JhdGUuanMnO1xuaW1wb3J0IHsgU29mdEJ1dHRvblR5cGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvU29mdEJ1dHRvblR5cGUuanMnO1xuaW1wb3J0IHsgU3BlZWNoQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1NwZWVjaENhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBTeXN0ZW1BY3Rpb24gfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvU3lzdGVtQWN0aW9uLmpzJztcbmltcG9ydCB7IFN5c3RlbUNvbnRleHQgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvU3lzdGVtQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBUZXh0QWxpZ25tZW50IH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1RleHRBbGlnbm1lbnQuanMnO1xuaW1wb3J0IHsgVGV4dEZpZWxkTmFtZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9UZXh0RmllbGROYW1lLmpzJztcbmltcG9ydCB7IFZpZGVvU3RyZWFtaW5nQ29kZWMgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvVmlkZW9TdHJlYW1pbmdDb2RlYy5qcyc7XG5pbXBvcnQgeyBWaWRlb1N0cmVhbWluZ1Byb3RvY29sIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1ZpZGVvU3RyZWFtaW5nUHJvdG9jb2wuanMnO1xuaW1wb3J0IHsgVmlkZW9TdHJlYW1pbmdTdGF0ZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9WaWRlb1N0cmVhbWluZ1N0YXRlLmpzJztcbmltcG9ydCB7IFZyQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1ZyQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IEFkZENvbW1hbmQgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvQWRkQ29tbWFuZC5qcyc7XG5pbXBvcnQgeyBBZGRDb21tYW5kUmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvQWRkQ29tbWFuZFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IE9uSG1pU3RhdHVzIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL09uSG1pU3RhdHVzLmpzJztcbmltcG9ydCB7IE9uTGFuZ3VhZ2VDaGFuZ2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvT25MYW5ndWFnZUNoYW5nZS5qcyc7XG5pbXBvcnQgeyBQdXRGaWxlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1B1dEZpbGUuanMnO1xuaW1wb3J0IHsgUHV0RmlsZVJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1B1dEZpbGVSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBSZWdpc3RlckFwcEludGVyZmFjZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9SZWdpc3RlckFwcEludGVyZmFjZS5qcyc7XG5pbXBvcnQgeyBSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgU2V0QXBwSWNvbiB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9TZXRBcHBJY29uLmpzJztcbmltcG9ydCB7IFNldEFwcEljb25SZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9TZXRBcHBJY29uUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgU2hvdyB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9TaG93LmpzJztcbmltcG9ydCB7IFNob3dSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9TaG93UmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgVW5yZWdpc3RlckFwcEludGVyZmFjZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9VbnJlZ2lzdGVyQXBwSW50ZXJmYWNlLmpzJztcbmltcG9ydCB7IFVucmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9VbnJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgQXBwSW5mbyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0FwcEluZm8uanMnO1xuaW1wb3J0IHsgQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0F1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgQnV0dG9uQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvQnV0dG9uQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IERldmljZUluZm8gfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9EZXZpY2VJbmZvLmpzJztcbmltcG9ydCB7IERpc3BsYXlDYXBhYmlsaXRpZXMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9EaXNwbGF5Q2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IEdyaWQgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9HcmlkLmpzJztcbmltcG9ydCB7IEhNSUNhcGFiaWxpdGllcyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0hNSUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0ltYWdlLmpzJztcbmltcG9ydCB7IEltYWdlRmllbGQgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9JbWFnZUZpZWxkLmpzJztcbmltcG9ydCB7IEltYWdlUmVzb2x1dGlvbiB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0ltYWdlUmVzb2x1dGlvbi5qcyc7XG5pbXBvcnQgeyBNZW51UGFyYW1zIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvTWVudVBhcmFtcy5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YVRhZ3MgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9NZXRhZGF0YVRhZ3MuanMnO1xuaW1wb3J0IHsgTW9kdWxlSW5mbyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL01vZHVsZUluZm8uanMnO1xuaW1wb3J0IHsgUHJlc2V0QmFua0NhcGFiaWxpdGllcyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL1ByZXNldEJhbmtDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgUkdCQ29sb3IgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9SR0JDb2xvci5qcyc7XG5pbXBvcnQgeyBTY3JlZW5QYXJhbXMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9TY3JlZW5QYXJhbXMuanMnO1xuaW1wb3J0IHsgU2RsTXNnVmVyc2lvbiB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL1NkbE1zZ1ZlcnNpb24uanMnO1xuaW1wb3J0IHsgU29mdEJ1dHRvbiB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL1NvZnRCdXR0b24uanMnO1xuaW1wb3J0IHsgU29mdEJ1dHRvbkNhcGFiaWxpdGllcyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL1NvZnRCdXR0b25DYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgVFRTQ2h1bmsgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9UVFNDaHVuay5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZUNvbG9yU2NoZW1lIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvVGVtcGxhdGVDb2xvclNjaGVtZS5qcyc7XG5pbXBvcnQgeyBUZXh0RmllbGQgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9UZXh0RmllbGQuanMnO1xuaW1wb3J0IHsgVG91Y2hFdmVudENhcGFiaWxpdGllcyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL1RvdWNoRXZlbnRDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgVmVoaWNsZVR5cGUgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9WZWhpY2xlVHlwZS5qcyc7XG5pbXBvcnQgeyBWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9WaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuanMnO1xuaW1wb3J0IHsgVmlkZW9TdHJlYW1pbmdGb3JtYXQgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9WaWRlb1N0cmVhbWluZ0Zvcm1hdC5qcyc7XG5pbXBvcnQgeyBTZGxTZXJ2aWNlTGlzdGVuZXIgfSBmcm9tICcuL3RtcC9zZXNzaW9uL1NkbFNlcnZpY2VMaXN0ZW5lci5qcyc7XG5pbXBvcnQgeyBTZGxTZXNzaW9uIH0gZnJvbSAnLi90bXAvc2Vzc2lvbi9TZGxTZXNzaW9uLmpzJztcbmltcG9ydCB7IFNkbFNlc3Npb25MaXN0ZW5lciB9IGZyb20gJy4vdG1wL3Nlc3Npb24vU2RsU2Vzc2lvbkxpc3RlbmVyLmpzJztcbmltcG9ydCB7IFNlcnZpY2VMaXN0ZW5lck1hcCB9IGZyb20gJy4vdG1wL3Nlc3Npb24vU2VydmljZUxpc3RlbmVyTWFwLmpzJztcbmltcG9ydCB7IFZpZGVvU3RyZWFtaW5nUGFyYW1ldGVycyB9IGZyb20gJy4vdG1wL3N0cmVhbWluZy92aWRlby9WaWRlb1N0cmVhbWluZ1BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IHsgQ3VzdG9tVHJhbnNwb3J0IH0gZnJvbSAnLi90bXAvdHJhbnNwb3J0L0N1c3RvbVRyYW5zcG9ydC5qcyc7XG5pbXBvcnQgeyBDdXN0b21UcmFuc3BvcnRDb25maWcgfSBmcm9tICcuL3RtcC90cmFuc3BvcnQvQ3VzdG9tVHJhbnNwb3J0Q29uZmlnLmpzJztcbmltcG9ydCB7IFNkbFBzbSB9IGZyb20gJy4vdG1wL3RyYW5zcG9ydC9TZGxQc20uanMnO1xuaW1wb3J0IHsgU3NsQ29uZmlnIH0gZnJvbSAnLi90bXAvdHJhbnNwb3J0L1NzbENvbmZpZy5qcyc7XG5pbXBvcnQgeyBUcmFuc3BvcnRCYXNlIH0gZnJvbSAnLi90bXAvdHJhbnNwb3J0L1RyYW5zcG9ydEJhc2UuanMnO1xuaW1wb3J0IHsgVHJhbnNwb3J0Q2FsbGJhY2sgfSBmcm9tICcuL3RtcC90cmFuc3BvcnQvVHJhbnNwb3J0Q2FsbGJhY2suanMnO1xuaW1wb3J0IHsgVHJhbnNwb3J0Q29uZmlnQmFzZSB9IGZyb20gJy4vdG1wL3RyYW5zcG9ydC9UcmFuc3BvcnRDb25maWdCYXNlLmpzJztcbmltcG9ydCB7IFRyYW5zcG9ydExpc3RlbmVyIH0gZnJvbSAnLi90bXAvdHJhbnNwb3J0L1RyYW5zcG9ydExpc3RlbmVyLmpzJztcbmltcG9ydCB7IFRyYW5zcG9ydE1hbmFnZXIgfSBmcm9tICcuL3RtcC90cmFuc3BvcnQvVHJhbnNwb3J0TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBUcmFuc3BvcnRNYW5hZ2VyQmFzZSB9IGZyb20gJy4vdG1wL3RyYW5zcG9ydC9UcmFuc3BvcnRNYW5hZ2VyQmFzZS5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRDbGllbnQgfSBmcm9tICcuL3RtcC90cmFuc3BvcnQvV2ViU29ja2V0Q2xpZW50LmpzJztcbmltcG9ydCB7IFdlYlNvY2tldENsaWVudENvbmZpZyB9IGZyb20gJy4vdG1wL3RyYW5zcG9ydC9XZWJTb2NrZXRDbGllbnRDb25maWcuanMnO1xuaW1wb3J0IHsgVHJhbnNwb3J0VHlwZSB9IGZyb20gJy4vdG1wL3RyYW5zcG9ydC9lbnVtcy9UcmFuc3BvcnRUeXBlLmpzJztcbmltcG9ydCB7IFRyYW5zcG9ydFJlY29yZCB9IGZyb20gJy4vdG1wL3RyYW5zcG9ydC91dGlsL1RyYW5zcG9ydFJlY29yZC5qcyc7XG5pbXBvcnQgeyBBcnJheVRvb2xzIH0gZnJvbSAnLi90bXAvdXRpbC9BcnJheVRvb2xzLmpzJztcbmltcG9ydCB7IEJpdENvbnZlcnRlciB9IGZyb20gJy4vdG1wL3V0aWwvQml0Q29udmVydGVyLmpzJztcbmltcG9ydCB7IEJzb24gfSBmcm9tICcuL3RtcC91dGlsL0Jzb24uanMnO1xuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4vdG1wL3V0aWwvRW51bS5qcyc7XG5pbXBvcnQgeyBKc29uUnBjTWFyc2hhbGxlciB9IGZyb20gJy4vdG1wL3V0aWwvSnNvblJwY01hcnNoYWxsZXIuanMnO1xuaW1wb3J0IHsgVGV4dEVuY29kZXIgfSBmcm9tICcuL3RtcC91dGlsL1RleHRFbmNvZGVyLmpzJztcbmltcG9ydCB7IFZlcnNpb24gfSBmcm9tICcuL3RtcC91dGlsL1ZlcnNpb24uanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0U2VydmVyIH0gZnJvbSAnLi90bXAvdHJhbnNwb3J0L1dlYlNvY2tldFNlcnZlci5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRTZXJ2ZXJDb25maWcgfSBmcm9tICcuL3RtcC90cmFuc3BvcnQvV2ViU29ja2V0U2VydmVyQ29uZmlnLmpzJztcblxuY29uc3QgU0RMID0ge1xuICAgIG1hbmFnZXI6IHtcbiAgICAgICAgQXBwQ29uZmlnLFxuICAgICAgICBsaWZlY3ljbGU6IHtcbiAgICAgICAgICAgIExpZmVjeWNsZUxpc3RlbmVyLFxuICAgICAgICAgICAgTGlmZWN5Y2xlTWFuYWdlcixcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHByb3RvY29sOiB7XG4gICAgICAgIEJpbmFyeUZyYW1lSGVhZGVyLFxuICAgICAgICBNZXNzYWdlRnJhbWVBc3NlbWJsZXIsXG4gICAgICAgIE1lc3NhZ2VGcmFtZURpc2Fzc2VtYmxlcixcbiAgICAgICAgU2RsUGFja2V0LFxuICAgICAgICBTZGxQYWNrZXRGYWN0b3J5LFxuICAgICAgICBTZGxQcm90b2NvbCxcbiAgICAgICAgU2RsUHJvdG9jb2xCYXNlLFxuICAgICAgICBTZGxQcm90b2NvbExpc3RlbmVyLFxuICAgICAgICBlbnVtczoge1xuICAgICAgICAgICAgQ29udHJvbEZyYW1lVGFncyxcbiAgICAgICAgICAgIEZyYW1lVHlwZSxcbiAgICAgICAgICAgIFNlcnZpY2VUeXBlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcnBjOiB7XG4gICAgICAgIFJwY0NyZWF0b3IsXG4gICAgICAgIFJwY0xpc3RlbmVyLFxuICAgICAgICBScGNNZXNzYWdlLFxuICAgICAgICBScGNOb3RpZmljYXRpb24sXG4gICAgICAgIFJwY1JlcXVlc3QsXG4gICAgICAgIFJwY1Jlc3BvbnNlLFxuICAgICAgICBScGNTdHJ1Y3QsXG4gICAgICAgIGVudW1zOiB7XG4gICAgICAgICAgICBBcHBITUlUeXBlLFxuICAgICAgICAgICAgQXVkaW9TdHJlYW1pbmdTdGF0ZSxcbiAgICAgICAgICAgIEF1ZGlvVHlwZSxcbiAgICAgICAgICAgIEJpdHNQZXJTYW1wbGUsXG4gICAgICAgICAgICBCdXR0b25OYW1lLFxuICAgICAgICAgICAgQ2hhcmFjdGVyU2V0LFxuICAgICAgICAgICAgRGlzcGxheVR5cGUsXG4gICAgICAgICAgICBGaWxlVHlwZSxcbiAgICAgICAgICAgIEZ1bmN0aW9uSUQsXG4gICAgICAgICAgICBITUlMZXZlbCxcbiAgICAgICAgICAgIEhtaVpvbmVDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICBJbWFnZUZpZWxkTmFtZSxcbiAgICAgICAgICAgIEltYWdlVHlwZSxcbiAgICAgICAgICAgIExhbmd1YWdlLFxuICAgICAgICAgICAgTWVkaWFDbG9ja0Zvcm1hdCxcbiAgICAgICAgICAgIE1ldGFkYXRhVHlwZSxcbiAgICAgICAgICAgIFByZXJlY29yZGVkU3BlZWNoLFxuICAgICAgICAgICAgUmVzdWx0LFxuICAgICAgICAgICAgUnBjVHlwZSxcbiAgICAgICAgICAgIFNhbXBsaW5nUmF0ZSxcbiAgICAgICAgICAgIFNvZnRCdXR0b25UeXBlLFxuICAgICAgICAgICAgU3BlZWNoQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgU3lzdGVtQWN0aW9uLFxuICAgICAgICAgICAgU3lzdGVtQ29udGV4dCxcbiAgICAgICAgICAgIFRleHRBbGlnbm1lbnQsXG4gICAgICAgICAgICBUZXh0RmllbGROYW1lLFxuICAgICAgICAgICAgVmlkZW9TdHJlYW1pbmdDb2RlYyxcbiAgICAgICAgICAgIFZpZGVvU3RyZWFtaW5nUHJvdG9jb2wsXG4gICAgICAgICAgICBWaWRlb1N0cmVhbWluZ1N0YXRlLFxuICAgICAgICAgICAgVnJDYXBhYmlsaXRpZXMsXG4gICAgICAgIH0sXG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICBBZGRDb21tYW5kLFxuICAgICAgICAgICAgQWRkQ29tbWFuZFJlc3BvbnNlLFxuICAgICAgICAgICAgT25IbWlTdGF0dXMsXG4gICAgICAgICAgICBPbkxhbmd1YWdlQ2hhbmdlLFxuICAgICAgICAgICAgUHV0RmlsZSxcbiAgICAgICAgICAgIFB1dEZpbGVSZXNwb25zZSxcbiAgICAgICAgICAgIFJlZ2lzdGVyQXBwSW50ZXJmYWNlLFxuICAgICAgICAgICAgUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZSxcbiAgICAgICAgICAgIFNldEFwcEljb24sXG4gICAgICAgICAgICBTZXRBcHBJY29uUmVzcG9uc2UsXG4gICAgICAgICAgICBTaG93LFxuICAgICAgICAgICAgU2hvd1Jlc3BvbnNlLFxuICAgICAgICAgICAgVW5yZWdpc3RlckFwcEludGVyZmFjZSxcbiAgICAgICAgICAgIFVucmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RydWN0czoge1xuICAgICAgICAgICAgQXBwSW5mbyxcbiAgICAgICAgICAgIEF1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICBCdXR0b25DYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICBEZXZpY2VJbmZvLFxuICAgICAgICAgICAgRGlzcGxheUNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIEdyaWQsXG4gICAgICAgICAgICBITUlDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICBJbWFnZSxcbiAgICAgICAgICAgIEltYWdlRmllbGQsXG4gICAgICAgICAgICBJbWFnZVJlc29sdXRpb24sXG4gICAgICAgICAgICBNZW51UGFyYW1zLFxuICAgICAgICAgICAgTWV0YWRhdGFUYWdzLFxuICAgICAgICAgICAgTW9kdWxlSW5mbyxcbiAgICAgICAgICAgIFByZXNldEJhbmtDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICBSR0JDb2xvcixcbiAgICAgICAgICAgIFNjcmVlblBhcmFtcyxcbiAgICAgICAgICAgIFNkbE1zZ1ZlcnNpb24sXG4gICAgICAgICAgICBTb2Z0QnV0dG9uLFxuICAgICAgICAgICAgU29mdEJ1dHRvbkNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIFRUU0NodW5rLFxuICAgICAgICAgICAgVGVtcGxhdGVDb2xvclNjaGVtZSxcbiAgICAgICAgICAgIFRleHRGaWVsZCxcbiAgICAgICAgICAgIFRvdWNoRXZlbnRDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICBWZWhpY2xlVHlwZSxcbiAgICAgICAgICAgIFZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eSxcbiAgICAgICAgICAgIFZpZGVvU3RyZWFtaW5nRm9ybWF0LFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgc2Vzc2lvbjoge1xuICAgICAgICBTZGxTZXJ2aWNlTGlzdGVuZXIsXG4gICAgICAgIFNkbFNlc3Npb24sXG4gICAgICAgIFNkbFNlc3Npb25MaXN0ZW5lcixcbiAgICAgICAgU2VydmljZUxpc3RlbmVyTWFwLFxuICAgIH0sXG4gICAgc3RyZWFtaW5nOiB7XG4gICAgICAgIHZpZGVvOiB7XG4gICAgICAgICAgICBWaWRlb1N0cmVhbWluZ1BhcmFtZXRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB0cmFuc3BvcnQ6IHtcbiAgICAgICAgQ3VzdG9tVHJhbnNwb3J0LFxuICAgICAgICBDdXN0b21UcmFuc3BvcnRDb25maWcsXG4gICAgICAgIFNkbFBzbSxcbiAgICAgICAgU3NsQ29uZmlnLFxuICAgICAgICBUcmFuc3BvcnRCYXNlLFxuICAgICAgICBUcmFuc3BvcnRDYWxsYmFjayxcbiAgICAgICAgVHJhbnNwb3J0Q29uZmlnQmFzZSxcbiAgICAgICAgVHJhbnNwb3J0TGlzdGVuZXIsXG4gICAgICAgIFRyYW5zcG9ydE1hbmFnZXIsXG4gICAgICAgIFRyYW5zcG9ydE1hbmFnZXJCYXNlLFxuICAgICAgICBXZWJTb2NrZXRDbGllbnQsXG4gICAgICAgIFdlYlNvY2tldENsaWVudENvbmZpZyxcbiAgICAgICAgZW51bXM6IHtcbiAgICAgICAgICAgIFRyYW5zcG9ydFR5cGUsXG4gICAgICAgIH0sXG4gICAgICAgIHV0aWw6IHtcbiAgICAgICAgICAgIFRyYW5zcG9ydFJlY29yZCxcbiAgICAgICAgfSxcbiAgICAgICAgV2ViU29ja2V0U2VydmVyLFxuICAgICAgICBXZWJTb2NrZXRTZXJ2ZXJDb25maWcsXG4gICAgfSxcbiAgICB1dGlsOiB7XG4gICAgICAgIEFycmF5VG9vbHMsXG4gICAgICAgIEJpdENvbnZlcnRlcixcbiAgICAgICAgQnNvbixcbiAgICAgICAgRW51bSxcbiAgICAgICAgSnNvblJwY01hcnNoYWxsZXIsXG4gICAgICAgIFRleHRFbmNvZGVyLFxuICAgICAgICBWZXJzaW9uLFxuICAgIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBTREw7Il0sIm5hbWVzIjpbIkFwcENvbmZpZyIsImNvbnN0cnVjdG9yIiwiX3RyYW5zcG9ydENvbmZpZyIsIl9hcHBJZCIsIl9hcHBOYW1lIiwiX2ljb25OYW1lIiwiX2ljb25GaWxlIiwiX3Nob3J0QXBwTmFtZSIsIl90dHNOYW1lIiwiX3ZyU3lub255bXMiLCJfaXNNZWRpYUFwcCIsIl9sYW5ndWFnZURlc2lyZWQiLCJfaG1pRGlzcGxheUxhbmd1YWdlRGVzaXJlZCIsIl9hcHBUeXBlcyIsIl9kYXlDb2xvclNjaGVtZSIsIl9uaWdodENvbG9yU2NoZW1lIiwiX21pbmltdW1SUENWZXJzaW9uIiwiX21pbmltdW1Qcm90b2NvbFZlcnNpb24iLCJzZXRUcmFuc3BvcnRDb25maWciLCJ0cmFuc3BvcnRDb25maWciLCJnZXRUcmFuc3BvcnRDb25maWciLCJzZXRBcHBJZCIsImFwcElkIiwiZ2V0QXBwSWQiLCJzZXRBcHBOYW1lIiwiYXBwTmFtZSIsImdldEFwcE5hbWUiLCJzZXRBcHBJY29uIiwiaWNvbk5hbWUiLCJmaWxlRGF0YSIsImdldEFwcEljb25OYW1lIiwiZ2V0QXBwSWNvbkZpbGVEYXRhIiwic2V0U2hvcnRBcHBOYW1lIiwic2hvcnRBcHBOYW1lIiwiZ2V0U2hvcnRBcHBOYW1lIiwic2V0VHRzTmFtZSIsInR0c05hbWUiLCJnZXRUdHNOYW1lIiwic2V0VnJTeW5vbnltcyIsInZyU3lub255bXMiLCJnZXRWclN5bm9ueW1zIiwic2V0SXNNZWRpYUFwcCIsImlzTWVkaWFBcHAiLCJzZXRMYW5ndWFnZURlc2lyZWQiLCJsYW5ndWFnZURlc2lyZWQiLCJnZXRMYW5ndWFnZURlc2lyZWQiLCJzZXRIbWlEaXNwbGF5TGFuZ3VhZ2VEZXNpcmVkIiwiaG1pRGlzcGxheUxhbmd1YWdlRGVzaXJlZCIsImdldEhtaURpc3BsYXlMYW5ndWFnZURlc2lyZWQiLCJzZXRBcHBUeXBlcyIsImFwcFR5cGVzIiwiZ2V0QXBwVHlwZXMiLCJzZXREYXlDb2xvclNjaGVtZSIsImRheUNvbG9yU2NoZW1lIiwiZ2V0RGF5Q29sb3JTY2hlbWUiLCJzZXROaWdodENvbG9yU2NoZW1lIiwibmlnaHRDb2xvclNjaGVtZSIsImdldE5pZ2h0Q29sb3JTY2hlbWUiLCJzZXRNaW5pbXVtUlBDVmVyc2lvbiIsIm1pbmltdW1SUENWZXJzaW9uIiwiZ2V0TWluaW11bVJQQ1ZlcnNpb24iLCJzZXRNaW5pbXVtUHJvdG9jb2xWZXJzaW9uIiwibWluaW11bVByb3RvY29sVmVyc2lvbiIsImdldE1pbmltdW1Qcm90b2NvbFZlcnNpb24iLCJMaWZlY3ljbGVMaXN0ZW5lciIsIl9vblByb3h5Q29ubmVjdGVkIiwiX29uUHJveHlDbG9zZWQiLCJfb25TZXJ2aWNlU3RhcnRlZCIsIl9vblNlcnZpY2VFbmRlZCIsIl9vbkVycm9yIiwic2V0T25Qcm94eUNvbm5lY3RlZCIsImxpc3RlbmVyIiwic2V0T25Qcm94eUNsb3NlZCIsInNldE9uU2VydmljZVN0YXJ0ZWQiLCJzZXRPblNlcnZpY2VFbmRlZCIsInNldE9uRXJyb3IiLCJvblByb3h5Q29ubmVjdGVkIiwibGlmZWN5Y2xlTWFuYWdlciIsIm9uUHJveHlDbG9zZWQiLCJpbmZvIiwicmVhc29uIiwib25TZXJ2aWNlU3RhcnRlZCIsInNlcnZpY2VUeXBlIiwic2Vzc2lvbklEIiwiY29ycmVsYXRpb25JRCIsIl9vblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkIiwib25TZXJ2aWNlRW5kZWQiLCJvbkVycm9yIiwiRW51bSIsIl9rZXlGb3JWYWx1ZSIsInZhbHVlIiwibWFwIiwia2V5Iiwia2V5Rm9yVmFsdWUiLCJFcnJvciIsIl92YWx1ZUZvcktleSIsInZhbHVlRm9yS2V5IiwiUnBjU3RydWN0IiwicGFyYW1ldGVycyIsIl9pc0Zvcm1hdFJlcXVlc3RlZCIsIl9ycGNTcGVjVmVyc2lvbiIsIl9wYXJhbWV0ZXJzIiwiZ2V0UGFyYW1ldGVycyIsImdldFBhcmFtZXRlciIsInNldFBhcmFtZXRlciIsImdldE9iamVjdCIsInRDbGFzcyIsIl9mb3JtYXRPYmplY3QiLCJvYmoiLCJ1bmRlZmluZWQiLCJTdHJpbmciLCJPYmplY3QiLCJwcm90b3R5cGUiLCJBcnJheSIsImxlbmd0aCIsIm91dEFycmF5IiwiaXRlbSIsInB1c2giLCJ2YWxpZGF0ZVR5cGUiLCJpc0FycmF5IiwibmFtZSIsIkZ1bmN0aW9uSUQiLCJSZWdpc3RlckFwcEludGVyZmFjZSIsIl9NQVAiLCJVbnJlZ2lzdGVyQXBwSW50ZXJmYWNlIiwiU2V0R2xvYmFsUHJvcGVydGllcyIsIlJlc2V0R2xvYmFsUHJvcGVydGllcyIsIkFkZENvbW1hbmQiLCJEZWxldGVDb21tYW5kIiwiQWRkU3ViTWVudSIsIkRlbGV0ZVN1Yk1lbnUiLCJDcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldCIsIlBlcmZvcm1JbnRlcmFjdGlvbiIsIkRlbGV0ZUludGVyYWN0aW9uQ2hvaWNlU2V0IiwiQWxlcnQiLCJTaG93IiwiU3BlYWsiLCJTZXRNZWRpYUNsb2NrVGltZXIiLCJQZXJmb3JtQXVkaW9QYXNzVGhydSIsIkVuZEF1ZGlvUGFzc1RocnUiLCJTdWJzY3JpYmVCdXR0b24iLCJVbnN1YnNjcmliZUJ1dHRvbiIsIlN1YnNjcmliZVZlaGljbGVEYXRhIiwiVW5zdWJzY3JpYmVWZWhpY2xlRGF0YSIsIkdldFZlaGljbGVEYXRhIiwiUmVhZERJRCIsIkdldERUQ3MiLCJTY3JvbGxhYmxlTWVzc2FnZSIsIlNsaWRlciIsIlNob3dDb25zdGFudFRCVCIsIkFsZXJ0TWFuZXV2ZXIiLCJVcGRhdGVUdXJuTGlzdCIsIkNoYW5nZVJlZ2lzdHJhdGlvbiIsIkdlbmVyaWNSZXNwb25zZSIsIlB1dEZpbGUiLCJEZWxldGVGaWxlIiwiTGlzdEZpbGVzIiwiU2V0QXBwSWNvbiIsIlNldERpc3BsYXlMYXlvdXQiLCJEaWFnbm9zdGljTWVzc2FnZSIsIlN5c3RlbVJlcXVlc3QiLCJTZW5kTG9jYXRpb24iLCJEaWFsTnVtYmVyIiwiQnV0dG9uUHJlc3MiLCJHZXRJbnRlcmlvclZlaGljbGVEYXRhIiwiU2V0SW50ZXJpb3JWZWhpY2xlRGF0YSIsIkdldFdheVBvaW50cyIsIlN1YnNjcmliZVdheVBvaW50cyIsIlVuc3Vic2NyaWJlV2F5UG9pbnRzIiwiR2V0U3lzdGVtQ2FwYWJpbGl0eSIsIlNlbmRIYXB0aWNEYXRhIiwiU2V0Q2xvdWRBcHBQcm9wZXJ0aWVzIiwiR2V0Q2xvdWRBcHBQcm9wZXJ0aWVzIiwiUHVibGlzaEFwcFNlcnZpY2UiLCJHZXRBcHBTZXJ2aWNlRGF0YSIsIkdldEZpbGUiLCJQZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9uIiwiVW5wdWJsaXNoQXBwU2VydmljZSIsIkNhbmNlbEludGVyYWN0aW9uIiwiQ2xvc2VBcHBsaWNhdGlvbiIsIlNob3dBcHBNZW51IiwiQ3JlYXRlV2luZG93IiwiRGVsZXRlV2luZG93IiwiR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnQiLCJSZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZSIsIk9uSE1JU3RhdHVzIiwiT25BcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWQiLCJPbkJ1dHRvbkV2ZW50IiwiT25CdXR0b25QcmVzcyIsIk9uVmVoaWNsZURhdGEiLCJPbkNvbW1hbmQiLCJPblRCVENsaWVudFN0YXRlIiwiT25Ecml2ZXJEaXN0cmFjdGlvbiIsIk9uUGVybWlzc2lvbnNDaGFuZ2UiLCJPbkF1ZGlvUGFzc1RocnUiLCJPbkxhbmd1YWdlQ2hhbmdlIiwiT25LZXlib2FyZElucHV0IiwiT25Ub3VjaEV2ZW50IiwiT25TeXN0ZW1SZXF1ZXN0IiwiT25IYXNoQ2hhbmdlIiwiT25JbnRlcmlvclZlaGljbGVEYXRhIiwiT25XYXlQb2ludENoYW5nZSIsIk9uUkNTdGF0dXMiLCJPbkFwcFNlcnZpY2VEYXRhIiwiT25TeXN0ZW1DYXBhYmlsaXR5VXBkYXRlZCIsImZyZWV6ZSIsIlJwY01lc3NhZ2UiLCJzdG9yZSIsIl9pc0VuY3J5cHRlZCIsIl9ycGNUeXBlIiwicnBjVHlwZSIsIl9mdW5jdGlvbk5hbWUiLCJmdW5jdGlvbk5hbWUiLCJfY29ycmVsYXRpb25JRCIsInNldEJ1bGtEYXRhIiwiYnVsa0RhdGEiLCJnZXRSUENUeXBlIiwic2V0UlBDVHlwZSIsInR5cGUiLCJnZXRGdW5jdGlvbk5hbWUiLCJzZXRGdW5jdGlvbk5hbWUiLCJnZXRDb3JyZWxhdGlvbklkIiwic2V0Q29ycmVsYXRpb25JZCIsImlkIiwiZ2V0QnVsa0RhdGEiLCJfYnVsa0RhdGEiLCJkYXRhIiwic2xpY2UiLCJnZXRJc0VuY3J5cHRlZCIsInNldElzRW5jcnlwdGVkIiwiYm9vbCIsIlJwY1R5cGUiLCJOT1RJRklDQVRJT04iLCJSRVNQT05TRSIsIlJFUVVFU1QiLCJScGNSZXF1ZXN0IiwiX3Byb21pc2UiLCJnZXRPblJQQ1Jlc3BvbnNlUHJvbWlzZSIsInNldE9uUlBDUmVzcG9uc2VQcm9taXNlIiwicHJvbWlzZSIsIlByb21pc2UiLCJTZGxNc2dWZXJzaW9uIiwic2V0TWFqb3JWZXJzaW9uIiwiS0VZX01BSk9SX1ZFUlNJT04iLCJnZXRNYWpvclZlcnNpb24iLCJzZXRNaW5vclZlcnNpb24iLCJLRVlfTUlOT1JfVkVSU0lPTiIsImdldE1pbm9yVmVyc2lvbiIsInNldFBhdGNoVmVyc2lvbiIsIktFWV9QQVRDSF9WRVJTSU9OIiwiZ2V0UGF0Y2hWZXJzaW9uIiwiU3BlZWNoQ2FwYWJpbGl0aWVzIiwiU0NfVEVYVCIsIlNBUElfUEhPTkVNRVMiLCJMSFBMVVNfUEhPTkVNRVMiLCJQUkVfUkVDT1JERUQiLCJTSUxFTkNFIiwiRklMRSIsIlRUU0NodW5rIiwic2V0VGV4dCIsInRleHQiLCJLRVlfVEVYVCIsImdldFRleHQiLCJzZXRUeXBlIiwiS0VZX1RZUEUiLCJnZXRUeXBlIiwiRGV2aWNlSW5mbyIsInNldEhhcmR3YXJlIiwiaGFyZHdhcmUiLCJLRVlfSEFSRFdBUkUiLCJnZXRIYXJkd2FyZSIsInNldEZpcm13YXJlUmV2IiwiZmlybXdhcmVSZXYiLCJLRVlfRklSTVdBUkVfUkVWIiwiZ2V0RmlybXdhcmVSZXYiLCJzZXRPcyIsIm9zIiwiS0VZX09TIiwiZ2V0T3MiLCJzZXRPc1ZlcnNpb24iLCJvc1ZlcnNpb24iLCJLRVlfT1NfVkVSU0lPTiIsImdldE9zVmVyc2lvbiIsInNldENhcnJpZXIiLCJjYXJyaWVyIiwiS0VZX0NBUlJJRVIiLCJnZXRDYXJyaWVyIiwic2V0TWF4TnVtYmVyUkZDT01NUG9ydHMiLCJtYXhOdW1iZXJSRkNPTU1Qb3J0cyIsIk51bWJlciIsIktFWV9NQVhfTlVNQkVSX1JGQ09NTV9QT1JUUyIsImdldE1heE51bWJlclJGQ09NTVBvcnRzIiwiQXBwSW5mbyIsInNldEFwcERpc3BsYXlOYW1lIiwiYXBwRGlzcGxheU5hbWUiLCJLRVlfQVBQX0RJU1BMQVlfTkFNRSIsImdldEFwcERpc3BsYXlOYW1lIiwic2V0QXBwQnVuZGxlSUQiLCJhcHBCdW5kbGVJRCIsIktFWV9BUFBfQlVORExFX0lEIiwiZ2V0QXBwQnVuZGxlSUQiLCJzZXRBcHBWZXJzaW9uIiwiYXBwVmVyc2lvbiIsIktFWV9BUFBfVkVSU0lPTiIsImdldEFwcFZlcnNpb24iLCJhcHBJY29uIiwiS0VZX0FQUF9JQ09OIiwiZ2V0QXBwSWNvbiIsIlJHQkNvbG9yIiwic2V0UmVkVmFsdWUiLCJyZWRWYWx1ZSIsIktFWV9SRUQiLCJnZXRSZWRWYWx1ZSIsInNldEdyZWVuVmFsdWUiLCJncmVlblZhbHVlIiwiS0VZX0dSRUVOIiwiZ2V0R3JlZW5WYWx1ZSIsInNldEJsdWVWYWx1ZSIsImJsdWVWYWx1ZSIsIktFWV9CTFVFIiwiZ2V0Qmx1ZVZhbHVlIiwiVGVtcGxhdGVDb2xvclNjaGVtZSIsInNldFByaW1hcnlDb2xvciIsInByaW1hcnlDb2xvciIsIktFWV9QUklNQVJZX0NPTE9SIiwiZ2V0UHJpbWFyeUNvbG9yIiwic2V0U2Vjb25kYXJ5Q29sb3IiLCJzZWNvbmRhcnlDb2xvciIsIktFWV9TRUNPTkRBUllfQ09MT1IiLCJnZXRTZWNvbmRhcnlDb2xvciIsInNldEJhY2tncm91bmRDb2xvciIsImJhY2tncm91bmRDb2xvciIsIktFWV9CQUNLR1JPVU5EX0NPTE9SIiwiZ2V0QmFja2dyb3VuZENvbG9yIiwiTGFuZ3VhZ2UiLCJFTl9TQSIsIkhFX0lMIiwiUk9fUk8iLCJVS19VQSIsIklEX0lEIiwiVklfVk4iLCJNU19NWSIsIkhJX0lOIiwiTkxfQkUiLCJFTF9HUiIsIkhVX0hVIiwiRklfRkkiLCJTS19TSyIsIkVOX1VTIiwiRVNfTVgiLCJGUl9DQSIsIkRFX0RFIiwiRVNfRVMiLCJFTl9HQiIsIlJVX1JVIiwiVFJfVFIiLCJQTF9QTCIsIkZSX0ZSIiwiSVRfSVQiLCJTVl9TRSIsIlBUX1BUIiwiTkxfTkwiLCJFTl9BVSIsIlpIX0NOIiwiWkhfVFciLCJKQV9KUCIsIkFSX1NBIiwiS09fS1IiLCJQVF9CUiIsIkNTX0NaIiwiREFfREsiLCJOT19OTyIsIkVOX0lOIiwiVEhfVEgiLCJBcHBITUlUeXBlIiwiREVGQVVMVCIsIkNPTU1VTklDQVRJT04iLCJNRURJQSIsIk1FU1NBR0lORyIsIk5BVklHQVRJT04iLCJJTkZPUk1BVElPTiIsIlNPQ0lBTCIsIkJBQ0tHUk9VTkRfUFJPQ0VTUyIsIlRFU1RJTkciLCJTWVNURU0iLCJQUk9KRUNUSU9OIiwiUkVNT1RFX0NPTlRST0wiLCJzZXRTZGxNc2dWZXJzaW9uIiwic2RsTXNnVmVyc2lvbiIsIktFWV9TRExfTVNHX1ZFUlNJT04iLCJnZXRTZGxNc2dWZXJzaW9uIiwiS0VZX0FQUF9OQU1FIiwidHRzTmFtZXMiLCJLRVlfVFRTX05BTUUiLCJzZXROZ25NZWRpYVNjcmVlbkFwcE5hbWUiLCJuZ25wcE5hbWUiLCJLRVlfTkdOX01FRElBX1NDUkVFTl9BUFBfTkFNRSIsImdldE5nbk1lZGlhU2NyZWVuQXBwTmFtZSIsIktFWV9WUl9TWU5PTllNUyIsInNldElzTWVkaWFBcHBsaWNhdGlvbiIsImlzTWVkaWFBcHBsaWNhdGlvbiIsIktFWV9JU19NRURJQV9BUFBMSUNBVElPTiIsImdldElzTWVkaWFBcHBsaWNhdGlvbiIsIktFWV9MQU5HVUFHRV9ERVNJUkVEIiwiS0VZX0hNSV9ESVNQTEFZX0xBTkdVQUdFX0RFU0lSRUQiLCJzZXRBcHBIbWlUeXBlIiwiYXBwSE1JVHlwZSIsIktFWV9BUFBfSE1JX1RZUEUiLCJnZXRBcHBIbWlUeXBlIiwic2V0SGFzaElEIiwiaGFzaElEIiwiS0VZX0hBU0hfSUQiLCJnZXRIYXNoSUQiLCJzZXREZXZpY2VJbmZvIiwiZGV2aWNlSW5mbyIsIktFWV9ERVZJQ0VfSU5GTyIsImdldERldmljZUluZm8iLCJfc2V0QXBwSWQiLCJLRVlfQVBQX0lEIiwic2V0RnVsbEFwcElkIiwiZnVsbEFwcElkIiwidG9Mb3dlckNhc2UiLCJLRVlfRlVMTF9BUFBfSUQiLCJBUFBfSURfTUFYX0xFTkdUSCIsInJlcGxhY2UiLCJzdWJzdHJpbmciLCJnZXRGdWxsQXBwSWQiLCJzZXRBcHBJbmZvIiwiYXBwSW5mbyIsIktFWV9BUFBfSU5GTyIsImdldEFwcEluZm8iLCJLRVlfREFZX0NPTE9SX1NDSEVNRSIsIktFWV9OSUdIVF9DT0xPUl9TQ0hFTUUiLCJLRVlfU1lOQ19NU0dfVkVSU0lPTiIsIlJlc3VsdCIsIlNVQ0NFU1MiLCJVTlNVUFBPUlRFRF9SRVFVRVNUIiwiVU5TVVBQT1JURURfUkVTT1VSQ0UiLCJESVNBTExPV0VEIiwiUkVKRUNURUQiLCJBQk9SVEVEIiwiSUdOT1JFRCIsIlJFVFJZIiwiSU5fVVNFIiwiVkVISUNMRV9EQVRBX05PVF9BVkFJTEFCTEUiLCJUSU1FRF9PVVQiLCJJTlZBTElEX0RBVEEiLCJDSEFSX0xJTUlUX0VYQ0VFREVEIiwiSU5WQUxJRF9JRCIsIkRVUExJQ0FURV9OQU1FIiwiQVBQTElDQVRJT05fTk9UX1JFR0lTVEVSRUQiLCJXUk9OR19MQU5HVUFHRSIsIk9VVF9PRl9NRU1PUlkiLCJUT09fTUFOWV9QRU5ESU5HX1JFUVVFU1RTIiwiVE9PX01BTllfQVBQTElDQVRJT05TIiwiQVBQTElDQVRJT05fUkVHSVNURVJFRF9BTFJFQURZIiwiV0FSTklOR1MiLCJHRU5FUklDX0VSUk9SIiwiVVNFUl9ESVNBTExPV0VEIiwiVFJVTkNBVEVEX0RBVEEiLCJVTlNVUFBPUlRFRF9WRVJTSU9OIiwiVkVISUNMRV9EQVRBX05PVF9BTExPV0VEIiwiRklMRV9OT1RfRk9VTkQiLCJDQU5DRUxfUk9VVEUiLCJTQVZFRCIsIklOVkFMSURfQ0VSVCIsIkVYUElSRURfQ0VSVCIsIlJFU1VNRV9GQUlMRUQiLCJEQVRBX05PVF9BVkFJTEFCTEUiLCJSRUFEX09OTFkiLCJDT1JSVVBURURfREFUQSIsIlJwY1Jlc3BvbnNlIiwiZ2V0U3VjY2VzcyIsIktFWV9TVUNDRVNTIiwic2V0U3VjY2VzcyIsInN1Y2Nlc3MiLCJnZXRJbmZvIiwiS0VZX0lORk8iLCJzZXRJbmZvIiwiZ2V0UmVzdWx0Q29kZSIsIktFWV9SRVNVTFRfQ09ERSIsInNldFJlc3VsdENvZGUiLCJyZXN1bHRDb2RlIiwiUnBjTGlzdGVuZXIiLCJfb25ScGNNZXNzYWdlIiwic2V0T25ScGNNZXNzYWdlIiwiZnVuYyIsIm9uUnBjTWVzc2FnZSIsInJwY01lc3NhZ2UiLCJTZGxQcm90b2NvbExpc3RlbmVyIiwiX29uUnBjTWVzc2FnZVJlY2VpdmVkIiwiX29uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZCIsIl9vblByb3RvY29sU2Vzc2lvbkVuZGVkIiwiX2dldFNlc3Npb25JZCIsIl9vblRyYW5zcG9ydENvbm5lY3RlZCIsInNldE9uVHJhbnNwb3J0Q29ubmVjdGVkIiwic2V0T25ScGNNZXNzYWdlUmVjZWl2ZWQiLCJvblJwY01lc3NhZ2VSZWNlaXZlZCIsInNldE9uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZCIsIm9uVHJhbnNwb3J0Q29ubmVjdGVkIiwib25Qcm90b2NvbFNlc3Npb25TdGFydGVkIiwic2Vzc2lvbklkIiwidmVyc2lvbiIsImNvcnJlbGF0aW9uSWQiLCJoYXNoSWQiLCJpc0VuY3J5cHRlZCIsInNldE9uUHJvdG9jb2xTZXNzaW9uRW5kZWQiLCJvblByb3RvY29sU2Vzc2lvbkVuZGVkIiwic2V0T25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZCIsIm9uUHJvdG9jb2xTZXNzaW9uRW5kZWROQUNLZWQiLCJzZXRHZXRTZXNzaW9uSWQiLCJnZXR0ZXIiLCJnZXRTZXNzaW9uSWQiLCJzZXRHZXREZXNpcmVkVmlkZW9QYXJhbXMiLCJfZ2V0RGVzaXJlZFZpZGVvUGFyYW1zIiwiZ2V0RGVzaXJlZFZpZGVvUGFyYW1zIiwic2V0U2V0QWNjZXB0ZWRWaWRlb1BhcmFtcyIsInNldHRlciIsIl9zZXRBY2NlcHRlZFZpZGVvUGFyYW1zIiwic2V0QWNjZXB0ZWRWaWRlb1BhcmFtcyIsInBhcmFtcyIsIkZyYW1lVHlwZSIsIkNPTlRST0wiLCJGSVJTVCIsIkNPTlNFQ1VUSVZFIiwiU0lOR0xFIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwibW9kdWxlIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJkIiwibyIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwiZ2V0RGVmYXVsdCIsImdldE1vZHVsZUV4cG9ydHMiLCJvYmplY3QiLCJwcm9wZXJ0eSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJnIiwiRnVuY3Rpb24iLCJldmFsIiwiZSIsIndpbmRvdyIsImdsb2JhbCIsImJhc2U2NCIsImllZWU3NTQiLCJCdWZmZXIiLCJTbG93QnVmZmVyIiwiSU5TUEVDVF9NQVhfQllURVMiLCJUWVBFRF9BUlJBWV9TVVBQT1JUIiwidHlwZWRBcnJheVN1cHBvcnQiLCJrTWF4TGVuZ3RoIiwiYXJyIiwiVWludDhBcnJheSIsIl9fcHJvdG9fXyIsImZvbyIsInN1YmFycmF5IiwiYnl0ZUxlbmd0aCIsImNyZWF0ZUJ1ZmZlciIsInRoYXQiLCJSYW5nZUVycm9yIiwiYXJnIiwiZW5jb2RpbmdPck9mZnNldCIsImFsbG9jVW5zYWZlIiwiZnJvbSIsInBvb2xTaXplIiwiX2F1Z21lbnQiLCJUeXBlRXJyb3IiLCJBcnJheUJ1ZmZlciIsImZyb21BcnJheUJ1ZmZlciIsImZyb21TdHJpbmciLCJmcm9tT2JqZWN0IiwiU3ltYm9sIiwic3BlY2llcyIsImFzc2VydFNpemUiLCJzaXplIiwiYWxsb2MiLCJmaWxsIiwiZW5jb2RpbmciLCJjaGVja2VkIiwiYWxsb2NVbnNhZmVTbG93Iiwic3RyaW5nIiwiaXNFbmNvZGluZyIsImFjdHVhbCIsIndyaXRlIiwiZnJvbUFycmF5TGlrZSIsImFycmF5IiwiYnl0ZU9mZnNldCIsImlzQnVmZmVyIiwibGVuIiwiY29weSIsImJ1ZmZlciIsImlzbmFuIiwidG9TdHJpbmciLCJiIiwiX2lzQnVmZmVyIiwiY29tcGFyZSIsImEiLCJ4IiwieSIsIk1hdGgiLCJtaW4iLCJjb25jYXQiLCJsaXN0IiwicG9zIiwiYnVmIiwiaXNWaWV3IiwibG93ZXJlZENhc2UiLCJ1dGY4VG9CeXRlcyIsImJhc2U2NFRvQnl0ZXMiLCJzbG93VG9TdHJpbmciLCJzdGFydCIsImVuZCIsImhleFNsaWNlIiwidXRmOFNsaWNlIiwiYXNjaWlTbGljZSIsImxhdGluMVNsaWNlIiwiYmFzZTY0U2xpY2UiLCJ1dGYxNmxlU2xpY2UiLCJzd2FwIiwic3dhcDE2Iiwic3dhcDMyIiwic3dhcDY0IiwiYXJndW1lbnRzIiwiYXBwbHkiLCJlcXVhbHMiLCJpbnNwZWN0Iiwic3RyIiwibWF4IiwibWF0Y2giLCJqb2luIiwidGFyZ2V0IiwidGhpc1N0YXJ0IiwidGhpc0VuZCIsInRoaXNDb3B5IiwidGFyZ2V0Q29weSIsImJpZGlyZWN0aW9uYWxJbmRleE9mIiwidmFsIiwiZGlyIiwiaXNOYU4iLCJhcnJheUluZGV4T2YiLCJpbmRleE9mIiwibGFzdEluZGV4T2YiLCJpbmRleFNpemUiLCJhcnJMZW5ndGgiLCJ2YWxMZW5ndGgiLCJyZWFkIiwicmVhZFVJbnQxNkJFIiwiZm91bmRJbmRleCIsImZvdW5kIiwiaiIsImluY2x1ZGVzIiwiaGV4V3JpdGUiLCJvZmZzZXQiLCJyZW1haW5pbmciLCJzdHJMZW4iLCJwYXJzZWQiLCJwYXJzZUludCIsInN1YnN0ciIsInV0ZjhXcml0ZSIsImJsaXRCdWZmZXIiLCJhc2NpaVdyaXRlIiwiYXNjaWlUb0J5dGVzIiwibGF0aW4xV3JpdGUiLCJiYXNlNjRXcml0ZSIsInVjczJXcml0ZSIsInV0ZjE2bGVUb0J5dGVzIiwiaXNGaW5pdGUiLCJ0b0pTT04iLCJfYXJyIiwiZnJvbUJ5dGVBcnJheSIsInJlcyIsImZpcnN0Qnl0ZSIsImNvZGVQb2ludCIsImJ5dGVzUGVyU2VxdWVuY2UiLCJzZWNvbmRCeXRlIiwidGhpcmRCeXRlIiwiZm91cnRoQnl0ZSIsInRlbXBDb2RlUG9pbnQiLCJkZWNvZGVDb2RlUG9pbnRzQXJyYXkiLCJNQVhfQVJHVU1FTlRTX0xFTkdUSCIsImNvZGVQb2ludHMiLCJmcm9tQ2hhckNvZGUiLCJyZXQiLCJvdXQiLCJ0b0hleCIsImJ5dGVzIiwibmV3QnVmIiwic2xpY2VMZW4iLCJjaGVja09mZnNldCIsImV4dCIsInJlYWRVSW50TEUiLCJub0Fzc2VydCIsIm11bCIsInJlYWRVSW50QkUiLCJyZWFkVUludDgiLCJyZWFkVUludDE2TEUiLCJyZWFkVUludDMyTEUiLCJyZWFkVUludDMyQkUiLCJyZWFkSW50TEUiLCJwb3ciLCJyZWFkSW50QkUiLCJyZWFkSW50OCIsInJlYWRJbnQxNkxFIiwicmVhZEludDE2QkUiLCJyZWFkSW50MzJMRSIsInJlYWRJbnQzMkJFIiwicmVhZEZsb2F0TEUiLCJyZWFkRmxvYXRCRSIsInJlYWREb3VibGVMRSIsInJlYWREb3VibGVCRSIsImNoZWNrSW50Iiwid3JpdGVVSW50TEUiLCJtYXhCeXRlcyIsIndyaXRlVUludEJFIiwid3JpdGVVSW50OCIsImZsb29yIiwib2JqZWN0V3JpdGVVSW50MTYiLCJsaXR0bGVFbmRpYW4iLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVVSW50MTZCRSIsIm9iamVjdFdyaXRlVUludDMyIiwid3JpdGVVSW50MzJMRSIsIndyaXRlVUludDMyQkUiLCJ3cml0ZUludExFIiwibGltaXQiLCJzdWIiLCJ3cml0ZUludEJFIiwid3JpdGVJbnQ4Iiwid3JpdGVJbnQxNkxFIiwid3JpdGVJbnQxNkJFIiwid3JpdGVJbnQzMkxFIiwid3JpdGVJbnQzMkJFIiwiY2hlY2tJRUVFNzU0Iiwid3JpdGVGbG9hdCIsIndyaXRlRmxvYXRMRSIsIndyaXRlRmxvYXRCRSIsIndyaXRlRG91YmxlIiwid3JpdGVEb3VibGVMRSIsIndyaXRlRG91YmxlQkUiLCJ0YXJnZXRTdGFydCIsInNldCIsImNvZGUiLCJjaGFyQ29kZUF0IiwiSU5WQUxJRF9CQVNFNjRfUkUiLCJiYXNlNjRjbGVhbiIsInN0cmluZ3RyaW0iLCJ0cmltIiwidW5pdHMiLCJJbmZpbml0eSIsImxlYWRTdXJyb2dhdGUiLCJieXRlQXJyYXkiLCJoaSIsImxvIiwidG9CeXRlQXJyYXkiLCJzcmMiLCJkc3QiLCJmYWN0b3J5IiwibG9uZyIsImNvbW1vbmpzR2xvYmFsIiwic2VsZiIsImNyZWF0ZUNvbW1vbmpzTW9kdWxlIiwiZm4iLCJnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlIiwiTWFwIiwiX2tleXMiLCJfdmFsdWVzIiwiZW50cnkiLCJ2IiwiY2xlYXIiLCJzcGxpY2UiLCJlbnRyaWVzIiwiaW5kZXgiLCJuZXh0IiwiZG9uZSIsImZvckVhY2giLCJjYWxsYmFjayIsImhhcyIsImtleXMiLCJ2YWx1ZXMiLCJtYXBfMSIsInRvRXh0ZW5kZWRKU09OIiwib3B0aW9ucyIsInJlbGF4ZWQiLCJ0b051bWJlciIsIiRudW1iZXJMb25nIiwiZnJvbUV4dGVuZGVkSlNPTiIsImRvYyIsInJlc3VsdCIsImxvbmdfMSIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJfZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsIndyaXRhYmxlIiwiX2NyZWF0ZUNsYXNzIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiRG91YmxlIiwidmFsdWVPZiIsIiRudW1iZXJEb3VibGUiLCJwYXJzZUZsb2F0IiwiZG91YmxlXzEiLCJfdHlwZW9mIiwiX3R5cGVvZjIiLCJpdGVyYXRvciIsIl9jbGFzc0NhbGxDaGVjayQxIiwiX2RlZmluZVByb3BlcnRpZXMkMSIsIl9jcmVhdGVDbGFzcyQxIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJfYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwiUmVmZXJlbmNlRXJyb3IiLCJfZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsImdldFByb3RvdHlwZU9mIiwiX2luaGVyaXRzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwiX3NldFByb3RvdHlwZU9mIiwiVGltZXN0YW1wIiwiX0xvbmciLCJsb3ciLCJoaWdoIiwiX3RoaXMiLCJpc0xvbmciLCIkdGltZXN0YW1wIiwidCIsImZyb21JbnQiLCJmcm9tTnVtYmVyIiwiZnJvbUJpdHMiLCJsb3dCaXRzIiwiaGlnaEJpdHMiLCJvcHRfcmFkaXgiLCJ0aW1lc3RhbXAiLCJlbXB0eSIsImVtcHR5JDEiLCJyZXF1aXJlJCQwIiwibm9ybWFsaXplZEZ1bmN0aW9uU3RyaW5nIiwiaW5zZWN1cmVSYW5kb21CeXRlcyIsInJhbmRvbSIsInJhbmRvbUJ5dGVzIiwiY3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwidXRpbHMiLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwicGVyZm9ybWFuY2UiLCJwZXJmb3JtYW5jZU5vdyIsIm5vdyIsIm1vek5vdyIsIm1zTm93Iiwib05vdyIsIndlYmtpdE5vdyIsIkRhdGUiLCJnZXRUaW1lIiwiaW5oZXJpdHMiLCJjdG9yIiwic3VwZXJDdG9yIiwic3VwZXJfIiwiVGVtcEN0b3IiLCJpbmhlcml0cyQxIiwiX3R5cGVvZiQxIiwiZm9ybWF0UmVnRXhwIiwiZm9ybWF0IiwiZiIsImlzU3RyaW5nIiwib2JqZWN0cyIsImFyZ3MiLCJKU09OIiwic3RyaW5naWZ5IiwiXyIsImlzTnVsbCIsImlzT2JqZWN0IiwiZGVwcmVjYXRlIiwibXNnIiwiaXNVbmRlZmluZWQiLCJwcm9jZXNzIiwid2FybmVkIiwiZGVwcmVjYXRlZCIsImNvbnNvbGUiLCJlcnJvciIsImRlYnVncyIsImRlYnVnRW52aXJvbiIsImRlYnVnbG9nIiwidG9VcHBlckNhc2UiLCJSZWdFeHAiLCJ0ZXN0IiwicGlkIiwib3B0cyIsImN0eCIsInNlZW4iLCJzdHlsaXplIiwic3R5bGl6ZU5vQ29sb3IiLCJkZXB0aCIsImNvbG9ycyIsImlzQm9vbGVhbiIsInNob3dIaWRkZW4iLCJfZXh0ZW5kIiwiY3VzdG9tSW5zcGVjdCIsInN0eWxpemVXaXRoQ29sb3IiLCJmb3JtYXRWYWx1ZSIsInN0eWxlcyIsInN0eWxlVHlwZSIsInN0eWxlIiwiYXJyYXlUb0hhc2giLCJoYXNoIiwiaWR4IiwicmVjdXJzZVRpbWVzIiwiaXNGdW5jdGlvbiIsInByaW1pdGl2ZSIsImZvcm1hdFByaW1pdGl2ZSIsInZpc2libGVLZXlzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImlzRXJyb3IiLCJmb3JtYXRFcnJvciIsImlzUmVnRXhwIiwiaXNEYXRlIiwiYmFzZSIsImJyYWNlcyIsInRvVVRDU3RyaW5nIiwib3V0cHV0IiwiZm9ybWF0QXJyYXkiLCJmb3JtYXRQcm9wZXJ0eSIsInBvcCIsInJlZHVjZVRvU2luZ2xlU3RyaW5nIiwic2ltcGxlIiwiaXNOdW1iZXIiLCJkZXNjIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwic3BsaXQiLCJsaW5lIiwicmVkdWNlIiwicHJldiIsImN1ciIsImFyIiwiaXNOdWxsT3JVbmRlZmluZWQiLCJpc1N5bWJvbCIsInJlIiwib2JqZWN0VG9TdHJpbmciLCJpc1ByaW1pdGl2ZSIsIm1heWJlQnVmIiwicGFkIiwibW9udGhzIiwidGltZXN0YW1wJDEiLCJ0aW1lIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImdldERhdGUiLCJnZXRNb250aCIsImxvZyIsIm9yaWdpbiIsImFkZCIsInByb3AiLCJ1dGlsIiwidXRpbCQxIiwidXRpbCQyIiwiX2NsYXNzQ2FsbENoZWNrJDIiLCJfZGVmaW5lUHJvcGVydGllcyQyIiwiX2NyZWF0ZUNsYXNzJDIiLCJCdWZmZXIkMSIsInJhbmRvbUJ5dGVzJDEiLCJkZXByZWNhdGUkMSIsIlBST0NFU1NfVU5JUVVFIiwiY2hlY2tGb3JIZXhSZWdFeHAiLCJoYXNCdWZmZXJUeXBlIiwiZXJyIiwiaGV4VGFibGUiLCJfaSIsImRlY29kZUxvb2t1cCIsIl9CdWZmZXIiLCJjb252ZXJ0VG9IZXgiLCJtYWtlT2JqZWN0SWRFcnJvciIsImludmFsaWRTdHJpbmciLCJpbnZhbGlkQ2hhcmFjdGVyIiwiT2JqZWN0SWQiLCJnZW5lcmF0ZSIsImNhY2hlSGV4U3RyaW5nIiwiX19pZCIsInZhbGlkIiwiaXNWYWxpZCIsImNyZWF0ZUZyb21IZXhTdHJpbmciLCJ0b0hleFN0cmluZyIsImhleFN0cmluZyIsIl9pMiIsImhleENoYXIiLCJvdGhlcklkIiwiZ2V0VGltZXN0YW1wIiwic2V0VGltZSIsIiRvaWQiLCJnZXRJbmMiLCJpbmMiLCJidWZmZXIkJDEiLCJjcmVhdGVQayIsImNyZWF0ZUZyb21UaW1lIiwiZ2V0X2luYyIsImN1c3RvbSIsIm9iamVjdGlkIiwiX2NsYXNzQ2FsbENoZWNrJDMiLCJfZGVmaW5lUHJvcGVydGllcyQzIiwiX2NyZWF0ZUNsYXNzJDMiLCJhbHBoYWJldGl6ZSIsInNvcnQiLCJCU09OUmVnRXhwIiwicGF0dGVybiIsIiRyZWd1bGFyRXhwcmVzc2lvbiIsInJlZ2V4cCIsIl9jbGFzc0NhbGxDaGVjayQ0IiwiX2RlZmluZVByb3BlcnRpZXMkNCIsIl9jcmVhdGVDbGFzcyQ0IiwiQlNPTlN5bWJvbCIsIiRzeW1ib2wiLCJzeW1ib2wiLCJfY2xhc3NDYWxsQ2hlY2skNSIsIl9kZWZpbmVQcm9wZXJ0aWVzJDUiLCJfY3JlYXRlQ2xhc3MkNSIsIkludDMyIiwiJG51bWJlckludCIsImludF8zMiIsIl9jbGFzc0NhbGxDaGVjayQ2IiwiX2RlZmluZVByb3BlcnRpZXMkNiIsIl9jcmVhdGVDbGFzcyQ2IiwiQ29kZSIsInNjb3BlIiwiJGNvZGUiLCIkc2NvcGUiLCJCdWZmZXIkMiIsIlBBUlNFX1NUUklOR19SRUdFWFAiLCJQQVJTRV9JTkZfUkVHRVhQIiwiUEFSU0VfTkFOX1JFR0VYUCIsIkVYUE9ORU5UX01BWCIsIkVYUE9ORU5UX01JTiIsIkVYUE9ORU5UX0JJQVMiLCJNQVhfRElHSVRTIiwiTkFOX0JVRkZFUiIsInJldmVyc2UiLCJJTkZfTkVHQVRJVkVfQlVGRkVSIiwiSU5GX1BPU0lUSVZFX0JVRkZFUiIsIkVYUE9ORU5UX1JFR0VYIiwiaXNEaWdpdCIsImRpdmlkZXUxMjgiLCJESVZJU09SIiwiX3JlbSIsInBhcnRzIiwicXVvdGllbnQiLCJyZW0iLCJzaGlmdExlZnQiLCJkaXYiLCJtb2R1bG8iLCJtdWx0aXBseTY0eDIiLCJsZWZ0IiwicmlnaHQiLCJsZWZ0SGlnaCIsInNoaWZ0UmlnaHRVbnNpZ25lZCIsImxlZnRMb3ciLCJnZXRMb3dCaXRzIiwicmlnaHRIaWdoIiwicmlnaHRMb3ciLCJwcm9kdWN0SGlnaCIsIm11bHRpcGx5IiwicHJvZHVjdE1pZCIsInByb2R1Y3RNaWQyIiwicHJvZHVjdExvdyIsImxlc3NUaGFuIiwidWhsZWZ0IiwidWhyaWdodCIsInVsbGVmdCIsInVscmlnaHQiLCJpbnZhbGlkRXJyIiwibWVzc2FnZSIsIkRlY2ltYWwxMjgiLCJpc05lZ2F0aXZlIiwic2F3UmFkaXgiLCJmb3VuZE5vblplcm8iLCJzaWduaWZpY2FudERpZ2l0cyIsIm5EaWdpdHNSZWFkIiwibkRpZ2l0cyIsInJhZGl4UG9zaXRpb24iLCJmaXJzdE5vblplcm8iLCJkaWdpdHMiLCJuRGlnaXRzU3RvcmVkIiwiZGlnaXRzSW5zZXJ0IiwiZmlyc3REaWdpdCIsImxhc3REaWdpdCIsImV4cG9uZW50Iiwic2lnbmlmaWNhbmRIaWdoIiwic2lnbmlmaWNhbmRMb3ciLCJiaWFzZWRFeHBvbmVudCIsInN0cmluZ01hdGNoIiwiaW5mTWF0Y2giLCJuYW5NYXRjaCIsInVuc2lnbmVkTnVtYmVyIiwiZXhwU2lnbiIsImV4cE51bWJlciIsImRpZ2l0c1N0cmluZyIsIl9kaWdpdHNTdHJpbmciLCJlbmRPZlN0cmluZyIsInJvdW5kRGlnaXQiLCJyb3VuZEJpdCIsImRJZHgiLCJfZElkeCIsIl9kSWR4MiIsInNpZ25pZmljYW5kIiwiZGVjIiwiYW5kIiwib3IiLCJDT01CSU5BVElPTl9NQVNLIiwiRVhQT05FTlRfTUFTSyIsIkNPTUJJTkFUSU9OX0lORklOSVRZIiwiQ09NQklOQVRJT05fTkFOIiwibWlkaCIsIm1pZGwiLCJjb21iaW5hdGlvbiIsImJpYXNlZF9leHBvbmVudCIsInNpZ25pZmljYW5kX2RpZ2l0cyIsInNjaWVudGlmaWNfZXhwb25lbnQiLCJpc196ZXJvIiwic2lnbmlmaWNhbmRfbXNiIiwic2lnbmlmaWNhbmQxMjgiLCJrIiwiWkVSTyIsImxlYXN0X2RpZ2l0cyIsInJhZGl4X3Bvc2l0aW9uIiwiX2kzIiwiX2k0IiwiJG51bWJlckRlY2ltYWwiLCJkZWNpbWFsMTI4IiwiX2NsYXNzQ2FsbENoZWNrJDciLCJfZGVmaW5lUHJvcGVydGllcyQ3IiwiX2NyZWF0ZUNsYXNzJDciLCJNaW5LZXkiLCIkbWluS2V5IiwibWluX2tleSIsIl9jbGFzc0NhbGxDaGVjayQ4IiwiX2RlZmluZVByb3BlcnRpZXMkOCIsIl9jcmVhdGVDbGFzcyQ4IiwiTWF4S2V5IiwiJG1heEtleSIsIm1heF9rZXkiLCJfY2xhc3NDYWxsQ2hlY2skOSIsIl9kZWZpbmVQcm9wZXJ0aWVzJDkiLCJfY3JlYXRlQ2xhc3MkOSIsIkRCUmVmIiwiY29sbGVjdGlvbiIsIm9pZCIsImRiIiwiZmllbGRzIiwic2hpZnQiLCJhc3NpZ24iLCIkcmVmIiwiJGlkIiwiJGRiIiwiZGJfcmVmIiwiX2NsYXNzQ2FsbENoZWNrJGEiLCJfZGVmaW5lUHJvcGVydGllcyRhIiwiX2NyZWF0ZUNsYXNzJGEiLCJCdWZmZXIkMyIsIkJpbmFyeSIsInN1YlR5cGUiLCJzdWJfdHlwZSIsIkJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVCIsInBvc2l0aW9uIiwid3JpdGVTdHJpbmdUb0FycmF5IiwiQlVGRkVSX1NJWkUiLCJwdXQiLCJieXRlX3ZhbHVlIiwiZGVjb2RlZF9ieXRlIiwiX2J1ZmZlciIsImlzVWludDhBcnJheSIsImFzUmF3IiwibmV3QnVmZmVyIiwiY29udmVydEFycmF5dG9VdGY4QmluYXJ5U3RyaW5nIiwiYmFzZTY0U3RyaW5nIiwiJGJpbmFyeSIsInN0YXJ0SW5kZXgiLCJlbmRJbmRleCIsIlNVQlRZUEVfREVGQVVMVCIsIlNVQlRZUEVfRlVOQ1RJT04iLCJTVUJUWVBFX0JZVEVfQVJSQVkiLCJTVUJUWVBFX1VVSURfT0xEIiwiU1VCVFlQRV9VVUlEIiwiU1VCVFlQRV9NRDUiLCJTVUJUWVBFX1VTRVJfREVGSU5FRCIsImJpbmFyeSIsImNvbnN0YW50cyIsIkJTT05fSU5UMzJfTUFYIiwiQlNPTl9JTlQzMl9NSU4iLCJCU09OX0lOVDY0X01BWCIsIkJTT05fSU5UNjRfTUlOIiwiSlNfSU5UX01BWCIsIkpTX0lOVF9NSU4iLCJCU09OX0RBVEFfTlVNQkVSIiwiQlNPTl9EQVRBX1NUUklORyIsIkJTT05fREFUQV9PQkpFQ1QiLCJCU09OX0RBVEFfQVJSQVkiLCJCU09OX0RBVEFfQklOQVJZIiwiQlNPTl9EQVRBX1VOREVGSU5FRCIsIkJTT05fREFUQV9PSUQiLCJCU09OX0RBVEFfQk9PTEVBTiIsIkJTT05fREFUQV9EQVRFIiwiQlNPTl9EQVRBX05VTEwiLCJCU09OX0RBVEFfUkVHRVhQIiwiQlNPTl9EQVRBX0RCUE9JTlRFUiIsIkJTT05fREFUQV9DT0RFIiwiQlNPTl9EQVRBX1NZTUJPTCIsIkJTT05fREFUQV9DT0RFX1dfU0NPUEUiLCJCU09OX0RBVEFfSU5UIiwiQlNPTl9EQVRBX1RJTUVTVEFNUCIsIkJTT05fREFUQV9MT05HIiwiQlNPTl9EQVRBX0RFQ0lNQUwxMjgiLCJCU09OX0RBVEFfTUlOX0tFWSIsIkJTT05fREFUQV9NQVhfS0VZIiwiQlNPTl9CSU5BUllfU1VCVFlQRV9GVU5DVElPTiIsIkJTT05fQklOQVJZX1NVQlRZUEVfQllURV9BUlJBWSIsIkJTT05fQklOQVJZX1NVQlRZUEVfVVVJRCIsIkJTT05fQklOQVJZX1NVQlRZUEVfTUQ1IiwiQlNPTl9CSU5BUllfU1VCVFlQRV9VU0VSX0RFRklORUQiLCJfdHlwZW9mJDIiLCJrZXlzVG9Db2RlY3MiLCJkZXNlcmlhbGl6ZVZhbHVlIiwiJHVuZGVmaW5lZCIsImZpbHRlciIsInN0YXJ0c1dpdGgiLCIkZGF0ZSIsImRhdGUiLCJwYXJzZSIsIiRkYlBvaW50ZXIiLCJkb2xsYXJLZXlzIiwic3RyaWN0IiwicmVwbGFjZXIiLCJzcGFjZSIsInNlcmlhbGl6ZUFycmF5Iiwic2VyaWFsaXplRG9jdW1lbnQiLCJzZXJpYWxpemUiLCJic29uIiwiZGVzZXJpYWxpemUiLCJlanNvbiIsInNlcmlhbGl6ZVZhbHVlIiwiZ2V0SVNPU3RyaW5nIiwiaXNvU3RyIiwidG9JU09TdHJpbmciLCJnZXRVVENNaWxsaXNlY29uZHMiLCJkYXRlTnVtIiwiaW5SYW5nZSIsImludDMyUmFuZ2UiLCJpbnQ2NFJhbmdlIiwiZmxhZ3MiLCJyeCIsInNvdXJjZSIsIkJTT05fVFlQRV9NQVBQSU5HUyIsInN1YnR5cGUiLCJuYW1lc3BhY2UiLCJMb25nIiwibG93XyIsImhpZ2hfIiwidW5zaWduZWQiLCJ1bnNpZ25lZF8iLCJPYmplY3RJRCIsImJzb250eXBlIiwiX2Jzb250eXBlIiwiX2RvYyIsIl9kb2MyIiwibWFwcGVyIiwiZXh0ZW5kZWRfanNvbiIsIkZJUlNUX0JJVCIsIkZJUlNUX1RXT19CSVRTIiwiRklSU1RfVEhSRUVfQklUUyIsIkZJUlNUX0ZPVVJfQklUUyIsIkZJUlNUX0ZJVkVfQklUUyIsIlRXT19CSVRfQ0hBUiIsIlRIUkVFX0JJVF9DSEFSIiwiRk9VUl9CSVRfQ0hBUiIsIkNPTlRJTlVJTkdfQ0hBUiIsInZhbGlkYXRlVXRmOCIsImNvbnRpbnVhdGlvbiIsImJ5dGUiLCJ2YWxpZGF0ZVV0ZjhfMSIsInZhbGlkYXRlX3V0ZjgiLCJCdWZmZXIkNCIsInZhbGlkYXRlVXRmOCQxIiwiSlNfSU5UX01BWF9MT05HIiwiSlNfSU5UX01JTl9MT05HIiwiZnVuY3Rpb25DYWNoZSIsImRlc2VyaWFsaXplJDEiLCJhbGxvd09iamVjdFNtYWxsZXJUaGFuQnVmZmVyU2l6ZSIsImRlc2VyaWFsaXplT2JqZWN0IiwiZXZhbEZ1bmN0aW9ucyIsImNhY2hlRnVuY3Rpb25zIiwiY2FjaGVGdW5jdGlvbnNDcmMzMiIsImNyYzMyIiwiZmllbGRzQXNSYXciLCJyYXciLCJic29uUmVnRXhwIiwicHJvbW90ZUJ1ZmZlcnMiLCJwcm9tb3RlTG9uZ3MiLCJwcm9tb3RlVmFsdWVzIiwiYXJyYXlJbmRleCIsImVsZW1lbnRUeXBlIiwic3RyaW5nU2l6ZSIsIl9pbmRleCIsIm9iamVjdFNpemUiLCJfaW5kZXgyIiwiX29iamVjdFNpemUiLCJhcnJheU9wdGlvbnMiLCJzdG9wSW5kZXgiLCJfbG93Qml0cyIsIl9oaWdoQml0cyIsImxvbmckJDEiLCJsZXNzVGhhbk9yRXF1YWwiLCJncmVhdGVyVGhhbk9yRXF1YWwiLCJkZWNpbWFsMTI4JCQxIiwidG9PYmplY3QiLCJiaW5hcnlTaXplIiwidG90YWxCaW5hcnlTaXplIiwicmVnRXhwT3B0aW9ucyIsIm9wdGlvbnNBcnJheSIsIl9zb3VyY2UiLCJfcmVnRXhwT3B0aW9ucyIsIl9zdHJpbmdTaXplIiwiX2xvd0JpdHMyIiwiX2hpZ2hCaXRzMiIsIl9zdHJpbmdTaXplMiIsImZ1bmN0aW9uU3RyaW5nIiwiaXNvbGF0ZUV2YWxXaXRoSGFzaCIsImlzb2xhdGVFdmFsIiwidG90YWxTaXplIiwiX3N0cmluZ1NpemUzIiwiX2Z1bmN0aW9uU3RyaW5nIiwiX2luZGV4MyIsIl9vYmplY3RTaXplMiIsInNjb3BlT2JqZWN0IiwiX2hhc2giLCJfc3RyaW5nU2l6ZTQiLCJvaWRCdWZmZXIiLCJfb2lkIiwiYmluZCIsImRlc2VyaWFsaXplciIsInJlYWRJRUVFNzU0IiwiZW5kaWFuIiwibUxlbiIsIm5CeXRlcyIsImJCRSIsImVMZW4iLCJlTWF4IiwiZUJpYXMiLCJuQml0cyIsIk5hTiIsIndyaXRlSUVFRTc1NCIsInJ0IiwiYWJzIiwiTE4yIiwiZmxvYXRfcGFyc2VyIiwiX3R5cGVvZiQzIiwiQnVmZmVyJDUiLCJ3cml0ZUlFRUU3NTQkMSIsIm5vcm1hbGl6ZWRGdW5jdGlvblN0cmluZyQxIiwicmVnZXhwJDEiLCJpZ25vcmVLZXlzIiwiU2V0IiwiaXNEYXRlJDEiLCJpc1JlZ0V4cCQxIiwic2VyaWFsaXplU3RyaW5nIiwibnVtYmVyT2ZXcml0dGVuQnl0ZXMiLCJzZXJpYWxpemVOdW1iZXIiLCJfbnVtYmVyT2ZXcml0dGVuQnl0ZXMiLCJfbnVtYmVyT2ZXcml0dGVuQnl0ZXMyIiwibG9uZ1ZhbCIsImdldEhpZ2hCaXRzIiwiX251bWJlck9mV3JpdHRlbkJ5dGVzMyIsInNlcmlhbGl6ZU51bGwiLCJzZXJpYWxpemVCb29sZWFuIiwic2VyaWFsaXplRGF0ZSIsImRhdGVJbk1pbGlzIiwic2VyaWFsaXplUmVnRXhwIiwiaWdub3JlQ2FzZSIsIm11bHRpbGluZSIsInNlcmlhbGl6ZUJTT05SZWdFeHAiLCJzZXJpYWxpemVNaW5NYXgiLCJzZXJpYWxpemVPYmplY3RJZCIsInNlcmlhbGl6ZUJ1ZmZlciIsInNlcmlhbGl6ZU9iamVjdCIsImNoZWNrS2V5cyIsInNlcmlhbGl6ZUZ1bmN0aW9ucyIsImlnbm9yZVVuZGVmaW5lZCIsInBhdGgiLCJzZXJpYWxpemVJbnRvIiwic2VyaWFsaXplRGVjaW1hbDEyOCIsInNlcmlhbGl6ZUxvbmciLCJzZXJpYWxpemVJbnQzMiIsInNlcmlhbGl6ZURvdWJsZSIsInNlcmlhbGl6ZUZ1bmN0aW9uIiwic2VyaWFsaXplQ29kZSIsImNvZGVTaXplIiwiX251bWJlck9mV3JpdHRlbkJ5dGVzNCIsInNlcmlhbGl6ZUJpbmFyeSIsInNlcmlhbGl6ZVN5bWJvbCIsInNlcmlhbGl6ZURCUmVmIiwic3RhcnRpbmdJbmRleCIsInRvQlNPTiIsIl9rZXkiLCJfdmFsdWUiLCJfdHlwZSIsIl9rZXkyIiwiX3ZhbHVlMiIsIl90eXBlMiIsInNlcmlhbGl6ZXIiLCJfdHlwZW9mJDQiLCJCdWZmZXIkNiIsIm5vcm1hbGl6ZWRGdW5jdGlvblN0cmluZyQyIiwiaXNEYXRlJDIiLCJjYWxjdWxhdGVPYmplY3RTaXplIiwidG90YWxMZW5ndGgiLCJjYWxjdWxhdGVFbGVtZW50Iiwib3JkZXJlZF92YWx1ZXMiLCJjYWxjdWxhdGVfc2l6ZSIsIkJ1ZmZlciQ3IiwiZW5zdXJlX2J1ZmZlciIsImVuc3VyZUJ1ZmZlciIsInBvdGVudGlhbEJ1ZmZlciIsIkJ1ZmZlciQ4IiwiTUFYU0laRSIsImJ1ZmZlciQxIiwic2V0SW50ZXJuYWxCdWZmZXJTaXplIiwic2VyaWFsaXplJDEiLCJtaW5JbnRlcm5hbEJ1ZmZlclNpemUiLCJzZXJpYWxpemF0aW9uSW5kZXgiLCJmaW5pc2hlZEJ1ZmZlciIsInNlcmlhbGl6ZVdpdGhCdWZmZXJBbmRJbmRleCIsImZpbmFsQnVmZmVyIiwiZGVzZXJpYWxpemUkMiIsImNhbGN1bGF0ZU9iamVjdFNpemUkMSIsImRlc2VyaWFsaXplU3RyZWFtIiwibnVtYmVyT2ZEb2N1bWVudHMiLCJkb2N1bWVudHMiLCJkb2NTdGFydEluZGV4IiwiRUpTT04iLCJic29uXzEiLCJic29uXzIiLCJic29uXzMiLCJic29uXzQiLCJic29uXzUiLCJic29uXzYiLCJic29uXzciLCJic29uXzgiLCJic29uXzkiLCJic29uXzEwIiwiYnNvbl8xMSIsImJzb25fMTIiLCJic29uXzEzIiwiYnNvbl8xNCIsImJzb25fMTUiLCJic29uXzE2IiwiYnNvbl8xNyIsImJzb25fMTgiLCJic29uXzE5IiwiYnNvbl8yMCIsImJzb25fMjEiLCJic29uXzIyIiwiYnNvbl8yMyIsImJzb25fMjQiLCJic29uXzI1IiwiYnNvbl8yNiIsImJzb25fMjciLCJic29uXzI4IiwiYnNvbl8yOSIsImJzb25fMzAiLCJic29uXzMxIiwiYnNvbl8zMiIsImJzb25fMzMiLCJic29uXzM0IiwiYnNvbl8zNSIsImJzb25fMzYiLCJic29uXzM3IiwiYnNvbl8zOCIsImJzb25fMzkiLCJic29uXzQwIiwiYnNvbl80MSIsImJzb25fNDIiLCJic29uXzQzIiwiYnNvbl80NCIsImJzb25fNDUiLCJic29uXzQ2IiwiYnNvbl80NyIsImJzb25fNDgiLCJic29uXzQ5IiwiYnNvbl81MCIsImJzb25fNTEiLCJic29uXzUyIiwiYnNvbl81MyIsImJzb25fNTQiLCJsb29rdXAiLCJyZXZMb29rdXAiLCJBcnIiLCJnZXRMZW5zIiwiYjY0IiwidmFsaWRMZW4iLCJwbGFjZUhvbGRlcnNMZW4iLCJsZW5zIiwiX2J5dGVMZW5ndGgiLCJ0bXAiLCJjdXJCeXRlIiwidHJpcGxldFRvQmFzZTY0IiwibnVtIiwiZW5jb2RlQ2h1bmsiLCJ1aW50OCIsImV4dHJhQnl0ZXMiLCJtYXhDaHVua0xlbmd0aCIsImxlbjIiLCJpc0xFIiwid2FzbSIsIldlYkFzc2VtYmx5IiwiSW5zdGFuY2UiLCJNb2R1bGUiLCJfX2lzTG9uZ19fIiwiSU5UX0NBQ0hFIiwiVUlOVF9DQUNIRSIsImNhY2hlZE9iaiIsImNhY2hlIiwiVVpFUk8iLCJUV09fUFdSXzY0X0RCTCIsIk1BWF9VTlNJR05FRF9WQUxVRSIsIlRXT19QV1JfNjNfREJMIiwiTUlOX1ZBTFVFIiwiTUFYX1ZBTFVFIiwibmVnIiwiVFdPX1BXUl8zMl9EQkwiLCJwb3dfZGJsIiwicmFkaXgiLCJyYWRpeFRvUG93ZXIiLCJwb3dlciIsImZyb21WYWx1ZSIsIlRXT19QV1JfMTZfREJMIiwiVFdPX1BXUl8yNF9EQkwiLCJUV09fUFdSXzI0IiwiT05FIiwiVU9ORSIsIk5FR19PTkUiLCJMb25nUHJvdG90eXBlIiwidG9JbnQiLCJpc1plcm8iLCJlcSIsInJhZGl4TG9uZyIsInJlbTEiLCJyZW1EaXYiLCJpbnR2YWwiLCJnZXRIaWdoQml0c1Vuc2lnbmVkIiwiZ2V0TG93Qml0c1Vuc2lnbmVkIiwiZ2V0TnVtQml0c0FicyIsImJpdCIsImVxeiIsImlzUG9zaXRpdmUiLCJpc09kZCIsImlzRXZlbiIsIm90aGVyIiwibm90RXF1YWxzIiwibmVxIiwibmUiLCJjb21wIiwibHQiLCJsdGUiLCJsZSIsImdyZWF0ZXJUaGFuIiwiZ3QiLCJndGUiLCJnZSIsInRoaXNOZWciLCJvdGhlck5lZyIsIm5lZ2F0ZSIsIm5vdCIsImFkZGVuZCIsImE0OCIsImEzMiIsImExNiIsImEwMCIsImI0OCIsImIzMiIsImIxNiIsImIwMCIsImM0OCIsImMzMiIsImMxNiIsImMwMCIsInN1YnRyYWN0Iiwic3VidHJhaGVuZCIsIm11bHRpcGxpZXIiLCJnZXRfaGlnaCIsImRpdmlkZSIsImRpdmlzb3IiLCJkaXZfdSIsImRpdl9zIiwiYXBwcm94IiwiaGFsZlRoaXMiLCJzaHIiLCJzaGwiLCJ0b1Vuc2lnbmVkIiwic2hydSIsImxvZzIiLCJjZWlsIiwiZGVsdGEiLCJhcHByb3hSZXMiLCJhcHByb3hSZW0iLCJyZW1fdSIsInJlbV9zIiwibW9kIiwieG9yIiwibnVtQml0cyIsInNoaWZ0UmlnaHQiLCJzaHJfdSIsInRvU2lnbmVkIiwidG9CeXRlcyIsInRvQnl0ZXNMRSIsInRvQnl0ZXNCRSIsImZyb21CeXRlcyIsImZyb21CeXRlc0xFIiwiZnJvbUJ5dGVzQkUiLCJCU09OIiwiQnNvbiIsIlNkbFBhY2tldCIsImVuY3J5cHRpb24iLCJmcmFtZVR5cGUiLCJmcmFtZUluZm8iLCJkYXRhU2l6ZSIsIm1lc3NhZ2VJRCIsInBheWxvYWQiLCJieXRlc1RvV3JpdGUiLCJfdmVyc2lvbiIsIl9lbmNyeXB0aW9uIiwiX2ZyYW1lVHlwZSIsIl9zZXJ2aWNlVHlwZSIsIl9mcmFtZUluZm8iLCJfc2Vzc2lvbklEIiwiX2RhdGFTaXplIiwiX21lc3NhZ2VJRCIsIl9wYXlsb2FkIiwiX29mZnNldCIsIl9ieXRlc1RvV3JpdGUiLCJfYnNvblBheWxvYWQiLCJnZXRWZXJzaW9uIiwiZ2V0RW5jcnlwdGlvbiIsImdldFNlcnZpY2VUeXBlIiwiZ2V0RnJhbWVJbmZvIiwiZ2V0U2Vzc2lvbklEIiwiZ2V0TWVzc2FnZUlEIiwiZ2V0RGF0YVNpemUiLCJzZXRQYXlsb2FkIiwiZ2V0UGF5bG9hZCIsImdldEVuY3J5cHRpb25CaXQiLCJfRU5DUllQVElPTl9NQVNLIiwiZ2V0RnJhbWVUeXBlIiwiX2NvbnN0cnVjdFBhY2tldCIsImNvbnRyb2xGcmFtZUluZm8iLCJkYXRhVmlldyIsImRhdGFWaWV3SW5kZXgiLCJfSEVBREVSX1NJWkUiLCJfSEVBREVSX1NJWkVfVjEiLCJ0b1BhY2tldCIsInB1dFRhZyIsInRhZyIsImdldFRhZyIsIl9FWFRSQV9QQVJDRUxfREFUQV9MRU5HVEgiLCJTRVJWSUNFX1RZUEVfQ09OVFJPTCIsIlNFUlZJQ0VfVFlQRV9SUEMiLCJTRVJWSUNFX1RZUEVfUENNIiwiU0VSVklDRV9UWVBFX1ZJREVPIiwiU0VSVklDRV9UWVBFX0JVTEtfREFUQSIsIkZSQU1FX0lORk9fSEVBUlRfQkVBVCIsIkZSQU1FX0lORk9fU1RBUlRfU0VSVklDRSIsIkZSQU1FX0lORk9fU1RBUlRfU0VSVklDRV9BQ0siLCJGUkFNRV9JTkZPX1NUQVJUX1NFUlZJQ0VfTkFLIiwiRlJBTUVfSU5GT19FTkRfU0VSVklDRSIsIkZSQU1FX0lORk9fRU5EX1NFUlZJQ0VfQUNLIiwiRlJBTUVfSU5GT19FTkRfU0VSVklDRV9OQUsiLCJGUkFNRV9JTkZPX1JFR0lTVEVSX1NFQ09OREFSWV9UUkFOU1BPUlQiLCJGUkFNRV9JTkZPX1JFR0lTVEVSX1NFQ09OREFSWV9UUkFOU1BPUlRfQUNLIiwiRlJBTUVfSU5GT19SRUdJU1RFUl9TRUNPTkRBUllfVFJBTlNQT1JUX05BSyIsIkZSQU1FX0lORk9fVFJBTlNQT1JUX0VWRU5UX1VQREFURSIsIkZSQU1FX0lORk9fU0VSVklDRV9EQVRBX0FDSyIsIkZSQU1FX0lORk9fSEVBUlRfQkVBVF9BQ0siLCJGUkFNRV9JTkZPX0ZJTkFMX0NPTk5FU0NVVElWRV9GUkFNRSIsIkZSQU1FX0lORk9fUkVTRVJWRUQiLCJiYXNlNjQuZnJvbUJ5dGVBcnJheSIsImllZWU3NTQucmVhZCIsImllZWU3NTQud3JpdGUiLCJiYXNlNjQudG9CeXRlQXJyYXkiLCJUZXh0RW5jb2RlciIsImVuY29kZSIsIkxlbiIsInJlc1BvcyIsInJlc0FyciIsInBvaW50IiwibmV4dGNvZGUiLCJKc29uUnBjTWFyc2hhbGxlciIsIm1hcnNoYWxsIiwicnBjU3RydWN0IiwianNvbkJ5dGVzIiwicGFyYW1pZnkiLCJqc29uT2JqZWN0Iiwic3RyaW5nVmVyc2lvbiIsIl9lbmNvZGUiLCJ1bm1hcnNoYWxsIiwianNvblN0cmluZyIsIl9kZWNvZGUiLCJCaW5hcnlGcmFtZUhlYWRlciIsImZ1bmN0aW9uSWQiLCJqc29uU2l6ZSIsIl9mdW5jdGlvbklkIiwiX2NvcnJlbGF0aW9uSWQiLCJfanNvblNpemUiLCJfanNvbkRhdGEiLCJmcm9tQmluYXJ5SGVhZGVyIiwiYmluYXJ5RnJhbWVIZWFkZXJEYXRhIiwiYmluYXJ5RnJhbWVIZWFkZXIiLCJqc29uRGF0YVN0YXJ0IiwiSEVBREVSX1NJWkUiLCJqc29uRGF0YUVuZCIsInNldEpzb25EYXRhIiwiYXNzZW1ibGVIZWFkZXJCeXRlcyIsInNldFJwY1R5cGUiLCJnZXRScGNUeXBlIiwic2V0RnVuY3Rpb25JZCIsImdldEZ1bmN0aW9uSWQiLCJzZXRKc29uU2l6ZSIsImdldEpzb25TaXplIiwiZ2V0SnNvbkRhdGEiLCJNZXNzYWdlRnJhbWVEaXNhc3NlbWJsZXIiLCJycGNSZXF1ZXN0IiwibWVzc2FnZUlkIiwibXR1IiwicGFja2V0Q2FsbGJhY2siLCJfcnBjUmVxdWVzdCIsIl9zZXNzaW9uSWQiLCJfbWVzc2FnZUlkIiwiX210dSIsIl9wYWNrZXRDYWxsYmFjayIsImJ1aWxkUlBDIiwiY2IiLCJfZG9SZXF1ZXN0IiwiX2J1aWxkUlBDTWFpbkJ1ZmZlciIsInJwY0J1bGtEYXRhIiwianNvbkJ1ZmZlciIsImJmaCIsImhlYWRlclNpemUiLCJidWxrRGF0YVNpemUiLCJ0b3RhbE1lc3NhZ2VTaXplIiwibWFpbkJ1ZmZlciIsImZyYW1lQ291bnQiLCJmdWxsUGFja2V0IiwidmlldyIsIkRhdGFWaWV3Iiwic2V0VWludDMyIiwiZmlyc3RIZWFkZXIiLCJfYnVpbGRDb25zZWN1dGl2ZUZyYW1lcyIsInNkbFBhY2tldCIsImZyYW1lU2VxdWVuY2VOdW1iZXIiLCJjb3VudCIsImhlYWRlciIsIlRyYW5zcG9ydExpc3RlbmVyIiwiX29uVHJhbnNwb3J0RGlzY29ubmVjdGVkIiwiX29uUGFja2V0UmVjZWl2ZWQiLCJzZXRPblRyYW5zcG9ydERpc2Nvbm5lY3RlZCIsInNldE9uUGFja2V0UmVjZWl2ZWQiLCJvblRyYW5zcG9ydERpc2Nvbm5lY3RlZCIsIm9uUGFja2V0UmVjZWl2ZWQiLCJWZXJzaW9uIiwibWFqb3IiLCJtaW5vciIsInBhdGNoIiwic2V0TWFqb3IiLCJzZXRNaW5vciIsInNldFBhdGNoIiwiX21ham9yIiwiZ2V0TWFqb3IiLCJfbWlub3IiLCJnZXRNaW5vciIsIl9wYXRjaCIsImdldFBhdGNoIiwidmVyc2lvbnMiLCJpc05ld2VyVGhhbiIsIlNlcnZpY2VUeXBlIiwiUlBDIiwiQVVESU8iLCJWSURFTyIsIkhZQlJJRCIsIk1lc3NhZ2VGcmFtZUFzc2VtYmxlciIsIl9jYWxsYmFjayIsIl9hY2N1bXVsYXRvciIsIl90b3RhbENvbnNlY3V0aXZlRnJhbWVzIiwiX2NvbnNlY3V0aXZlRnJhbWVzSGFuZGxlZENvdW50IiwiX2NvbnNlY3V0aXZlRnJhbWVzRGF0YUxlbmd0aCIsImhhbmRsZUZyYW1lIiwiX2hhbmRsZU11bHRpRnJhbWVNZXNzYWdlIiwiX2hhbmRsZUZpcnN0RGF0YUZyYW1lIiwiZGF0YUxlbmd0aCIsIl9oYW5kbGVDb25zZWN1dGl2ZUZyYW1lIiwiZnJhbWVTZXF1ZW5jZSIsIndhcm4iLCJmaW5pc2hlZFNkbFBhY2tldCIsIkNvbnRyb2xGcmFtZVRhZ3MiLCJTdGFydFNlcnZpY2VBQ0tCYXNlIiwiTVRVIiwiTkFLQmFzZSIsIlJFSkVDVEVEX1BBUkFNUyIsIlN0YXJ0U2VydmljZVByb3RvY29sVmVyc2lvbiIsIlBST1RPQ09MX1ZFUlNJT04iLCJTdGFydFNlcnZpY2VIYXNoSWQiLCJIQVNIX0lEIiwiU3RhcnRTZXJ2aWNlRGltZW5zaW9ucyIsIkhFSUdIVCIsIldJRFRIIiwiU3RhcnRTZXJ2aWNlIiwiU3RhcnRTZXJ2aWNlQUNLIiwiU0VDT05EQVJZX1RSQU5TUE9SVFMiLCJBVURJT19TRVJWSUNFX1RSQU5TUE9SVFMiLCJWSURFT19TRVJWSUNFX1RSQU5TUE9SVFMiLCJBVVRIX1RPS0VOIiwiU3RhcnRTZXJ2aWNlTkFLIiwiRW5kU2VydmljZSIsIkVuZFNlcnZpY2VBQ0siLCJFbmRTZXJ2aWNlTkFLIiwiVHJhbnNwb3J0RXZlbnRVcGRhdGUiLCJUQ1BfSVBfQUREUkVTUyIsIlRDUF9QT1JUIiwiUmVnaXN0ZXJTZWNvbmRhcnlUcmFuc3BvcnQiLCJSZWdpc3RlclNlY29uZGFyeVRyYW5zcG9ydEFDSyIsIlJlZ2lzdGVyU2Vjb25kYXJ5VHJhbnNwb3J0TkFLIiwiUkVBU09OIiwiQXVkaW8iLCJWaWRlbyIsIlZJREVPX1BST1RPQ09MIiwiVklERU9fQ09ERUMiLCJCaXRDb252ZXJ0ZXIiLCJhcnJheUJ1ZmZlclRvSW50MzIiLCJnZXRVaW50MzIiLCJpbnQzMlRvQXJyYXlCdWZmZXIiLCJTZGxQYWNrZXRGYWN0b3J5IiwiY3JlYXRlSGVhcnRiZWF0QUNLIiwiY3JlYXRlRW5kU2Vzc2lvbiIsImVuZFNlc3Npb24iLCJJbWFnZVR5cGUiLCJTVEFUSUMiLCJEWU5BTUlDIiwiSW1hZ2UiLCJzZXRWYWx1ZSIsIktFWV9WQUxVRSIsImdldFZhbHVlIiwic2V0SW1hZ2VUeXBlIiwiS0VZX0lNQUdFX1RZUEUiLCJnZXRJbWFnZVR5cGUiLCJzZXRJc1RlbXBsYXRlIiwiaXNUZW1wbGF0ZSIsIktFWV9JU19URU1QTEFURSIsImdldElzVGVtcGxhdGUiLCJNZW51UGFyYW1zIiwic2V0UGFyZW50SUQiLCJLRVlfUEFSRU5UX0lEIiwiZ2V0UGFyZW50SUQiLCJzZXRQb3NpdGlvbiIsIktFWV9QT1NJVElPTiIsImdldFBvc2l0aW9uIiwic2V0TWVudU5hbWUiLCJtZW51TmFtZSIsIktFWV9NRU5VX05BTUUiLCJnZXRNZW51TmFtZSIsInNldENtZElEIiwiS0VZX0NNRF9JRCIsImdldENtZElEIiwic2V0TWVudVBhcmFtcyIsIm1lbnVQYXJhbXMiLCJLRVlfTUVOVV9QQVJBTVMiLCJnZXRNZW51UGFyYW1zIiwic2V0VnJDb21tYW5kcyIsInZyQ29tbWFuZHMiLCJLRVlfVlJfQ09NTUFORFMiLCJnZXRWckNvbW1hbmRzIiwic2V0Q21kSWNvbiIsImljb24iLCJLRVlfQ01EX0lDT04iLCJnZXRDbWRJY29uIiwiQWRkQ29tbWFuZFJlc3BvbnNlIiwiUnBjTm90aWZpY2F0aW9uIiwiSE1JTGV2ZWwiLCJITUlfRlVMTCIsIkhNSV9MSU1JVEVEIiwiSE1JX0JBQ0tHUk9VTkQiLCJITUlfTk9ORSIsIkF1ZGlvU3RyZWFtaW5nU3RhdGUiLCJBVURJQkxFIiwiQVRURU5VQVRFRCIsIk5PVF9BVURJQkxFIiwiVmlkZW9TdHJlYW1pbmdTdGF0ZSIsIlNUUkVBTUFCTEUiLCJOT1RfU1RSRUFNQUJMRSIsIlN5c3RlbUNvbnRleHQiLCJTWVNDVFhUX01BSU4iLCJTWVNDVFhUX1ZSU0VTU0lPTiIsIlNZU0NUWFRfTUVOVSIsIlNZU0NUWFRfSE1JX09CU0NVUkVEIiwiU1lTQ1RYVF9BTEVSVCIsIk9uSG1pU3RhdHVzIiwic2V0SE1JTGV2ZWwiLCJobWlMZXZlbCIsIktFWV9ITUlfTEVWRUwiLCJnZXRITUlMZXZlbCIsInNldEF1ZGlvU3RyZWFtaW5nU3RhdGUiLCJhdWRpb1N0cmVhbWluZ1N0YXRlIiwiS0VZX0FVRElPX1NUUkVBTUlOR19TVEFURSIsImdldEF1ZGlvU3RyZWFtaW5nU3RhdGUiLCJzZXRTeXN0ZW1Db250ZXh0Iiwic3lzdGVtQ29udGV4dCIsIktFWV9TWVNURU1fQ09OVEVYVCIsImdldFN5c3RlbUNvbnRleHQiLCJzZXRWaWRlb1N0cmVhbWluZ1N0YXRlIiwidmlkZW9TdHJlYW1pbmdTdGF0ZSIsIktFWV9WSURFT19TVFJFQU1JTkdfU1RBVEUiLCJnZXRWaWRlb1N0cmVhbWluZ1N0YXRlIiwic2V0V2luZG93SUQiLCJ3aW5kb3dJRCIsIktFWV9XSU5ET1dfSUQiLCJnZXRXaW5kb3dJRCIsInNldExhbmd1YWdlIiwibGFuZ3VhZ2UiLCJLRVlfTEFOR1VBR0UiLCJnZXRMYW5ndWFnZSIsInNldEhNSURpc3BsYXlMYW5ndWFnZSIsIktFWV9ITUlfRElTUExBWV9MQU5HVUFHRSIsImdldEhNSURpc3BsYXlMYW5ndWFnZSIsIkZpbGVUeXBlIiwiR1JBUEhJQ19CTVAiLCJHUkFQSElDX0pQRUciLCJHUkFQSElDX1BORyIsIkFVRElPX1dBVkUiLCJBVURJT19BQUMiLCJCSU5BUlkiLCJzZXRGaWxlRGF0YSIsImdldEZpbGVEYXRhIiwic2V0RmlsZU5hbWUiLCJmaWxlTmFtZSIsIktFWV9GSUxFX05BTUUiLCJnZXRGaWxlTmFtZSIsInNldEZpbGVUeXBlIiwiZmlsZVR5cGUiLCJLRVlfRklMRV9UWVBFIiwiZ2V0RmlsZVR5cGUiLCJzZXRQZXJzaXN0ZW50RmlsZSIsInBlcnNpc3RlbnRGaWxlIiwiS0VZX1BFUlNJU1RFTlRfRklMRSIsImdldFBlcnNpc3RlbnRGaWxlIiwic2V0U3lzdGVtRmlsZSIsInN5c3RlbUZpbGUiLCJLRVlfU1lTVEVNX0ZJTEUiLCJnZXRTeXN0ZW1GaWxlIiwic2V0T2Zmc2V0IiwiS0VZX09GRlNFVCIsImdldE9mZnNldCIsInNldExlbmd0aCIsIktFWV9MRU5HVEgiLCJnZXRMZW5ndGgiLCJzZXRDUkMiLCJjcmMiLCJLRVlfQ1JDIiwiZ2V0Q1JDIiwiUHV0RmlsZVJlc3BvbnNlIiwic2V0U3BhY2VBdmFpbGFibGUiLCJzcGFjZUF2YWlsYWJsZSIsIktFWV9TUEFDRV9BVkFJTEFCTEUiLCJnZXRTcGFjZUF2YWlsYWJsZSIsIlRleHRGaWVsZE5hbWUiLCJtYWluRmllbGQxIiwibWFpbkZpZWxkMiIsIm1haW5GaWVsZDMiLCJtYWluRmllbGQ0Iiwic3RhdHVzQmFyIiwibWVkaWFDbG9jayIsIm1lZGlhVHJhY2siLCJ0ZW1wbGF0ZVRpdGxlIiwiYWxlcnRUZXh0MSIsImFsZXJ0VGV4dDIiLCJhbGVydFRleHQzIiwic2Nyb2xsYWJsZU1lc3NhZ2VCb2R5IiwiaW5pdGlhbEludGVyYWN0aW9uVGV4dCIsIm5hdmlnYXRpb25UZXh0MSIsIm5hdmlnYXRpb25UZXh0MiIsIkVUQSIsInRvdGFsRGlzdGFuY2UiLCJhdWRpb1Bhc3NUaHJ1RGlzcGxheVRleHQxIiwiYXVkaW9QYXNzVGhydURpc3BsYXlUZXh0MiIsInNsaWRlckhlYWRlciIsInNsaWRlckZvb3RlciIsInNlY29uZGFyeVRleHQiLCJ0ZXJ0aWFyeVRleHQiLCJtZW51VGl0bGUiLCJsb2NhdGlvbk5hbWUiLCJsb2NhdGlvbkRlc2NyaXB0aW9uIiwiYWRkcmVzc0xpbmVzIiwicGhvbmVOdW1iZXIiLCJDaGFyYWN0ZXJTZXQiLCJUWVBFMlNFVCIsIlRZUEU1U0VUIiwiQ0lEMVNFVCIsIkNJRDJTRVQiLCJUZXh0RmllbGQiLCJzZXRUZXh0RmllbGROYW1lIiwidGV4dEZpZWxkTmFtZSIsIktFWV9OQU1FIiwiZ2V0VGV4dEZpZWxkTmFtZSIsInNldENoYXJhY3RlclNldCIsImNoYXJhY3RlclNldCIsIktFWV9DSEFSQUNURVJfU0VUIiwiZ2V0Q2hhcmFjdGVyU2V0Iiwic2V0V2lkdGgiLCJ3aWR0aCIsIktFWV9XSURUSCIsImdldFdpZHRoIiwic2V0Um93cyIsInJvd3MiLCJLRVlfUk9XUyIsImdldFJvd3MiLCJJbWFnZVJlc29sdXRpb24iLCJzZXRSZXNvbHV0aW9uV2lkdGgiLCJyZXNvbHV0aW9uV2lkdGgiLCJLRVlfUkVTT0xVVElPTl9XSURUSCIsImdldFJlc29sdXRpb25XaWR0aCIsInNldFJlc29sdXRpb25IZWlnaHQiLCJyZXNvbHV0aW9uSGVpZ2h0IiwiS0VZX1JFU09MVVRJT05fSEVJR0hUIiwiZ2V0UmVzb2x1dGlvbkhlaWdodCIsIkltYWdlRmllbGROYW1lIiwic29mdEJ1dHRvbkltYWdlIiwiY2hvaWNlSW1hZ2UiLCJjaG9pY2VTZWNvbmRhcnlJbWFnZSIsInZySGVscEl0ZW0iLCJ0dXJuSWNvbiIsIm1lbnVJY29uIiwiY21kSWNvbiIsImdyYXBoaWMiLCJzZWNvbmRhcnlHcmFwaGljIiwic2hvd0NvbnN0YW50VEJUSWNvbiIsInNob3dDb25zdGFudFRCVE5leHRUdXJuSWNvbiIsImxvY2F0aW9uSW1hZ2UiLCJhbGVydEljb24iLCJJbWFnZUZpZWxkIiwic2V0SW1hZ2VGaWVsZE5hbWUiLCJpbWFnZUZpZWxkTmFtZSIsImdldEltYWdlRmllbGROYW1lIiwic2V0SW1hZ2VUeXBlU3VwcG9ydGVkIiwiaW1hZ2VUeXBlU3VwcG9ydGVkIiwiS0VZX0lNQUdFX1RZUEVfU1VQUE9SVEVEIiwiZ2V0SW1hZ2VUeXBlU3VwcG9ydGVkIiwic2V0SW1hZ2VSZXNvbHV0aW9uIiwiaW1hZ2VSZXNvbHV0aW9uIiwiS0VZX0lNQUdFX1JFU09MVVRJT04iLCJnZXRJbWFnZVJlc29sdXRpb24iLCJUb3VjaEV2ZW50Q2FwYWJpbGl0aWVzIiwic2V0UHJlc3NBdmFpbGFibGUiLCJwcmVzc0F2YWlsYWJsZSIsIktFWV9QUkVTU19BVkFJTEFCTEUiLCJnZXRQcmVzc0F2YWlsYWJsZSIsInNldE11bHRpVG91Y2hBdmFpbGFibGUiLCJtdWx0aVRvdWNoQXZhaWxhYmxlIiwiS0VZX01VTFRJX1RPVUNIX0FWQUlMQUJMRSIsImdldE11bHRpVG91Y2hBdmFpbGFibGUiLCJzZXREb3VibGVQcmVzc0F2YWlsYWJsZSIsImRvdWJsZVByZXNzQXZhaWxhYmxlIiwiS0VZX0RPVUJMRV9QUkVTU19BVkFJTEFCTEUiLCJnZXREb3VibGVQcmVzc0F2YWlsYWJsZSIsIlNjcmVlblBhcmFtcyIsInNldFJlc29sdXRpb24iLCJyZXNvbHV0aW9uIiwiS0VZX1JFU09MVVRJT04iLCJnZXRSZXNvbHV0aW9uIiwic2V0VG91Y2hFdmVudEF2YWlsYWJsZSIsInRvdWNoRXZlbnRDYXBhYmlsaXRpZXMiLCJLRVlfVE9VQ0hfRVZFTlRfQVZBSUxBQkxFIiwiZ2V0VG91Y2hFdmVudEF2YWlsYWJsZSIsIkRpc3BsYXlUeXBlIiwiQ0lEIiwiVFlQRTIiLCJUWVBFNSIsIk5HTiIsIkdFTjJfOF9ETUEiLCJHRU4yXzZfRE1BIiwiTUZEMyIsIk1GRDQiLCJNRkQ1IiwiR0VOM184X0lOQ0giLCJTRExfR0VORVJJQyIsIk1lZGlhQ2xvY2tGb3JtYXQiLCJDTE9DSzEiLCJDTE9DSzIiLCJDTE9DSzMiLCJDTE9DS1RFWFQxIiwiQ0xPQ0tURVhUMiIsIkNMT0NLVEVYVDMiLCJDTE9DS1RFWFQ0IiwiRGlzcGxheUNhcGFiaWxpdGllcyIsInNldERpc3BsYXlUeXBlIiwiZGlzcGxheVR5cGUiLCJLRVlfRElTUExBWV9UWVBFIiwiZ2V0RGlzcGxheVR5cGUiLCJzZXREaXNwbGF5TmFtZSIsImRpc3BsYXlOYW1lIiwiS0VZX0RJU1BMQVlfTkFNRSIsImdldERpc3BsYXlOYW1lIiwic2V0VGV4dEZpZWxkcyIsInRleHRGaWVsZHMiLCJLRVlfVEVYVF9GSUVMRFMiLCJnZXRUZXh0RmllbGRzIiwic2V0SW1hZ2VGaWVsZHMiLCJpbWFnZUZpZWxkcyIsIktFWV9JTUFHRV9GSUVMRFMiLCJnZXRJbWFnZUZpZWxkcyIsInNldE1lZGlhQ2xvY2tGb3JtYXRzIiwibWVkaWFDbG9ja0Zvcm1hdHMiLCJLRVlfTUVESUFfQ0xPQ0tfRk9STUFUUyIsImdldE1lZGlhQ2xvY2tGb3JtYXRzIiwic2V0R3JhcGhpY3NTdXBwb3J0ZWQiLCJncmFwaGljU3VwcG9ydGVkIiwiS0VZX0dSQVBISUNTX1NVUFBPUlRFRCIsImdldEdyYXBoaWNzU3VwcG9ydGVkIiwic2V0VGVtcGxhdGVzQXZhaWxhYmxlIiwidGVtcGxhdGVzQXZhaWxhYmxlIiwiS0VZX1RFTVBMQVRFU19BVkFJTEFCTEUiLCJnZXRUZW1wbGF0ZXNBdmFpbGFibGUiLCJzZXRTY3JlZW5QYXJhbXMiLCJzY3JlZW5QYXJhbXMiLCJLRVlfU0NSRUVOX1BBUkFNUyIsImdldFNjcmVlblBhcmFtcyIsInNldE51bUN1c3RvbVByZXNldHNBdmFpbGFibGUiLCJudW1DdXN0b21QcmVzZXRzQXZhaWxhYmxlIiwiS0VZX05VTV9DVVNUT01fUFJFU0VUU19BVkFJTEFCTEUiLCJnZXROdW1DdXN0b21QcmVzZXRzQXZhaWxhYmxlIiwiR3JpZCIsInNldENvbHVtbiIsImNvbHVtbiIsIktFWV9DT0xVTU4iLCJnZXRDb2x1bW4iLCJzZXRSb3ciLCJyb3ciLCJLRVlfUk9XIiwiZ2V0Um93Iiwic2V0TGV2ZWwiLCJsZXZlbCIsIktFWV9MRVZFTCIsImdldExldmVsIiwic2V0Q29sdW1uU3BhbiIsImNvbHVtblNwYW4iLCJLRVlfQ09MVU1OX1NQQU4iLCJnZXRDb2x1bW5TcGFuIiwic2V0Um93U3BhbiIsInJvd1NwYW4iLCJLRVlfUk9XX1NQQU4iLCJnZXRSb3dTcGFuIiwic2V0TGV2ZWxTcGFuIiwibGV2ZWxTcGFuIiwiS0VZX0xFVkVMX1NQQU4iLCJnZXRMZXZlbFNwYW4iLCJNb2R1bGVJbmZvIiwic2V0TW9kdWxlSWQiLCJLRVlfTU9EVUxFX0lEIiwiZ2V0TW9kdWxlSWQiLCJzZXRMb2NhdGlvbiIsImxvY2F0aW9uIiwiS0VZX0xPQ0FUSU9OIiwiZ2V0TG9jYXRpb24iLCJzZXRTZXJ2aWNlQXJlYSIsInNlcnZpY2VBcmVhIiwiS0VZX1NFUlZJQ0VfQVJFQSIsImdldFNlcnZpY2VBcmVhIiwic2V0QWxsb3dNdWx0aXBsZUFjY2VzcyIsImFsbG93TXVsdGlwbGVBY2Nlc3MiLCJLRVlfQUxMT1dfTVVMVElQTEVfQUNDRVNTIiwiZ2V0QWxsb3dNdWx0aXBsZUFjY2VzcyIsIkJ1dHRvbk5hbWUiLCJPSyIsIlBMQVlfUEFVU0UiLCJTRUVLTEVGVCIsIlNFRUtSSUdIVCIsIlRVTkVVUCIsIlRVTkVET1dOIiwiUFJFU0VUXzAiLCJQUkVTRVRfMSIsIlBSRVNFVF8yIiwiUFJFU0VUXzMiLCJQUkVTRVRfNCIsIlBSRVNFVF81IiwiUFJFU0VUXzYiLCJQUkVTRVRfNyIsIlBSRVNFVF84IiwiUFJFU0VUXzkiLCJDVVNUT01fQlVUVE9OIiwiU0VBUkNIIiwiQUNfTUFYIiwiQUMiLCJSRUNJUkNVTEFURSIsIkZBTl9VUCIsIkZBTl9ET1dOIiwiVEVNUF9VUCIsIlRFTVBfRE9XTiIsIkRFRlJPU1RfTUFYIiwiREVGUk9TVCIsIkRFRlJPU1RfUkVBUiIsIlVQUEVSX1ZFTlQiLCJMT1dFUl9WRU5UIiwiVk9MVU1FX1VQIiwiVk9MVU1FX0RPV04iLCJFSkVDVCIsIlNPVVJDRSIsIlNIVUZGTEUiLCJSRVBFQVQiLCJOQVZfQ0VOVEVSX0xPQ0FUSU9OIiwiTkFWX1pPT01fSU4iLCJOQVZfWk9PTV9PVVQiLCJOQVZfUEFOX1VQIiwiTkFWX1BBTl9VUF9SSUdIVCIsIk5BVl9QQU5fUklHSFQiLCJOQVZfUEFOX0RPV05fUklHSFQiLCJOQVZfUEFOX0RPV04iLCJOQVZfUEFOX0RPV05fTEVGVCIsIk5BVl9QQU5fTEVGVCIsIk5BVl9QQU5fVVBfTEVGVCIsIk5BVl9USUxUX1RPR0dMRSIsIk5BVl9ST1RBVEVfQ0xPQ0tXSVNFIiwiTkFWX1JPVEFURV9DT1VOVEVSQ0xPQ0tXSVNFIiwiTkFWX0hFQURJTkdfVE9HR0xFIiwiQnV0dG9uQ2FwYWJpbGl0aWVzIiwic2V0TmFtZSIsImdldE5hbWUiLCJzZXRNb2R1bGVJbmZvIiwibW9kdWxlSW5mbyIsIktFWV9NT0RVTEVfSU5GTyIsImdldE1vZHVsZUluZm8iLCJzZXRTaG9ydFByZXNzQXZhaWxhYmxlIiwic2hvcnRQcmVzc0F2YWlsYWJsZSIsIktFWV9TSE9SVF9QUkVTU19BVkFJTEFCTEUiLCJnZXRTaG9ydFByZXNzQXZhaWxhYmxlIiwic2V0TG9uZ1ByZXNzQXZhaWxhYmxlIiwibG9uZ1ByZXNzQXZhaWxhYmxlIiwiS0VZX0xPTkdfUFJFU1NfQVZBSUxBQkxFIiwiZ2V0TG9uZ1ByZXNzQXZhaWxhYmxlIiwic2V0VXBEb3duQXZhaWxhYmxlIiwidXBEb3duQXZhaWxhYmxlIiwiS0VZX1VQX0RPV05fQVZBSUxBQkxFIiwiZ2V0VXBEb3duQXZhaWxhYmxlIiwiU29mdEJ1dHRvbkNhcGFiaWxpdGllcyIsInNldEltYWdlU3VwcG9ydGVkIiwiaW1hZ2VTdXBwb3J0ZWQiLCJLRVlfSU1BR0VfU1VQUE9SVEVEIiwiZ2V0SW1hZ2VTdXBwb3J0ZWQiLCJzZXRUZXh0U3VwcG9ydGVkIiwidGV4dFN1cHBvcnRlZCIsIktFWV9URVhUX1NVUFBPUlRFRCIsImdldFRleHRTdXBwb3J0ZWQiLCJQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzIiwic2V0T25TY3JlZW5QcmVzZXRzQXZhaWxhYmxlIiwib25TY3JlZW5QcmVzZXRzQXZhaWxhYmxlIiwiS0VZX09OX1NDUkVFTl9QUkVTRVRTX0FWQUlMQUJMRSIsImdldE9uU2NyZWVuUHJlc2V0c0F2YWlsYWJsZSIsIlZlaGljbGVUeXBlIiwic2V0TWFrZSIsIm1ha2UiLCJLRVlfTUFLRSIsImdldE1ha2UiLCJzZXRNb2RlbCIsIm1vZGVsIiwiS0VZX01PREVMIiwiZ2V0TW9kZWwiLCJzZXRNb2RlbFllYXIiLCJtb2RlbFllYXIiLCJLRVlfTU9ERUxfWUVBUiIsImdldE1vZGVsWWVhciIsInNldFRyaW0iLCJLRVlfVFJJTSIsImdldFRyaW0iLCJIbWlab25lQ2FwYWJpbGl0aWVzIiwiRlJPTlQiLCJCQUNLIiwiUHJlcmVjb3JkZWRTcGVlY2giLCJIRUxQX0pJTkdMRSIsIklOSVRJQUxfSklOR0xFIiwiTElTVEVOX0pJTkdMRSIsIlBPU0lUSVZFX0pJTkdMRSIsIk5FR0FUSVZFX0pJTkdMRSIsIlNhbXBsaW5nUmF0ZSIsIlNhbXBsaW5nUmF0ZV84S0haIiwiU2FtcGxpbmdSYXRlXzE2S0haIiwiU2FtcGxpbmdSYXRlXzIyS0haIiwiU2FtcGxpbmdSYXRlXzQ0S0haIiwiQml0c1BlclNhbXBsZSIsIkJpdHNQZXJTYW1wbGVfOF9CSVQiLCJCaXRzUGVyU2FtcGxlXzE2X0JJVCIsIkF1ZGlvVHlwZSIsIlBDTSIsIkF1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXMiLCJzZXRTYW1wbGluZ1JhdGUiLCJzYW1wbGluZ1JhdGUiLCJLRVlfU0FNUExJTkdfUkFURSIsImdldFNhbXBsaW5nUmF0ZSIsInNldEJpdHNQZXJTYW1wbGUiLCJiaXRzUGVyU2FtcGxlIiwiS0VZX0JJVFNfUEVSX1NBTVBMRSIsImdldEJpdHNQZXJTYW1wbGUiLCJzZXRBdWRpb1R5cGUiLCJhdWRpb1R5cGUiLCJLRVlfQVVESU9fVFlQRSIsImdldEF1ZGlvVHlwZSIsIlZyQ2FwYWJpbGl0aWVzIiwiVlJfVEVYVCIsIkhNSUNhcGFiaWxpdGllcyIsInNldE5hdmlnYXRpb24iLCJuYXZpZ2F0aW9uIiwiS0VZX05BVklHQVRJT04iLCJnZXROYXZpZ2F0aW9uIiwic2V0UGhvbmVDYWxsIiwicGhvbmVDYWxsIiwiS0VZX1BIT05FX0NBTEwiLCJnZXRQaG9uZUNhbGwiLCJzZXRWaWRlb1N0cmVhbWluZyIsInZpZGVvU3RyZWFtaW5nIiwiS0VZX1ZJREVPX1NUUkVBTUlORyIsImdldFZpZGVvU3RyZWFtaW5nIiwic2V0UmVtb3RlQ29udHJvbCIsInJlbW90ZUNvbnRyb2wiLCJLRVlfUkVNT1RFX0NPTlRST0wiLCJnZXRSZW1vdGVDb250cm9sIiwic2V0QXBwU2VydmljZSIsImFwcFNlcnZpY2VzIiwiS0VZX0FQUF9TRVJWSUNFUyIsImdldEFwcFNlcnZpY2UiLCJzZXREaXNwbGF5cyIsImRpc3BsYXlzIiwiS0VZX0RJU1BMQVlTIiwiZ2V0RGlzcGxheXMiLCJzZXRTZWF0TG9jYXRpb24iLCJzZWF0TG9jYXRpb24iLCJLRVlfU0VBVF9MT0NBVElPTiIsImdldFNlYXRMb2NhdGlvbiIsIlJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UiLCJzZXRIbWlEaXNwbGF5TGFuZ3VhZ2UiLCJobWlEaXNwbGF5TGFuZ3VhZ2UiLCJnZXRIbWlEaXNwbGF5TGFuZ3VhZ2UiLCJzZXREaXNwbGF5Q2FwYWJpbGl0aWVzIiwiZGlzcGxheUNhcGFiaWxpdGllcyIsIktFWV9ESVNQTEFZX0NBUEFCSUxJVElFUyIsImdldERpc3BsYXlDYXBhYmlsaXRpZXMiLCJzZXRCdXR0b25DYXBhYmlsaXRpZXMiLCJidXR0b25DYXBhYmlsaXRpZXMiLCJLRVlfQlVUVE9OX0NBUEFCSUxJVElFUyIsImdldEJ1dHRvbkNhcGFiaWxpdGllcyIsInNldFNvZnRCdXR0b25DYXBhYmlsaXRpZXMiLCJzb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzIiwiS0VZX1NPRlRfQlVUVE9OX0NBUEFCSUxJVElFUyIsImdldFNvZnRCdXR0b25DYXBhYmlsaXRpZXMiLCJzZXRQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzIiwicHJlc2V0QmFua0NhcGFiaWxpdGllcyIsIktFWV9QUkVTRVRfQkFOS19DQVBBQklMSVRJRVMiLCJnZXRQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzIiwic2V0SG1pWm9uZUNhcGFiaWxpdGllcyIsImhtaVpvbmVDYXBhYmlsaXRpZXMiLCJLRVlfSE1JX1pPTkVfQ0FQQUJJTElUSUVTIiwiZ2V0SG1pWm9uZUNhcGFiaWxpdGllcyIsInNldFNwZWVjaENhcGFiaWxpdGllcyIsInNwZWVjaENhcGFiaWxpdGllcyIsIktFWV9TUEVFQ0hfQ0FQQUJJTElUSUVTIiwiZ2V0U3BlZWNoQ2FwYWJpbGl0aWVzIiwic2V0UHJlcmVjb3JkZWRTcGVlY2giLCJLRVlfUFJFUkVDT1JERURfU1BFRUNIIiwiZ2V0UHJlcmVjb3JkZWRTcGVlY2giLCJzZXRWckNhcGFiaWxpdGllcyIsInZyQ2FwYWJpbGl0aWVzIiwiS0VZX1ZSX0NBUEFCSUxJVElFUyIsImdldFZyQ2FwYWJpbGl0aWVzIiwic2V0QXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcyIsImF1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXMiLCJLRVlfQVVESU9fUEFTU19USFJVX0NBUEFCSUxJVElFUyIsImdldEF1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXMiLCJzZXRQY21TdHJlYW1DYXBhYmlsaXRpZXMiLCJwY21TdHJlYW1DYXBhYmlsaXRpZXMiLCJLRVlfUENNX1NUUkVBTV9DQVBBQklMSVRJRVMiLCJnZXRQY21TdHJlYW1DYXBhYmlsaXRpZXMiLCJzZXRWZWhpY2xlVHlwZSIsInZlaGljbGVUeXBlIiwiS0VZX1ZFSElDTEVfVFlQRSIsImdldFZlaGljbGVUeXBlIiwic2V0U3VwcG9ydGVkRGlhZ01vZGVzIiwic3VwcG9ydGVkRGlhZ01vZGVzIiwiS0VZX1NVUFBPUlRFRF9ESUFHX01PREUiLCJnZXRTdXBwb3J0ZWREaWFnTW9kZXMiLCJzZXRITUlDYXBhYmlsaXRpZXMiLCJobWlDYXBhYmlsaXRpZXMiLCJLRVlfSE1JX0NBUEFCSUxJVElFUyIsImdldEhNSUNhcGFiaWxpdGllcyIsInNldFNkbFZlcnNpb24iLCJzZGxWZXJzaW9uIiwiS0VZX1NETF9WRVJTSU9OIiwiZ2V0U2RsVmVyc2lvbiIsInNldFN5c3RlbVNvZnR3YXJlVmVyc2lvbiIsInN5c3RlbVNvZnR3YXJlVmVyc2lvbiIsIktFWV9TWVNURU1fU09GVFdBUkVfVkVSU0lPTiIsImdldFN5c3RlbVNvZnR3YXJlVmVyc2lvbiIsInNldEljb25SZXN1bWVkIiwiaWNvblJlc3VtZWQiLCJLRVlfSUNPTl9SRVNVTUVEIiwiZ2V0SWNvblJlc3VtZWQiLCJTZXRBcHBJY29uUmVzcG9uc2UiLCJTb2Z0QnV0dG9uVHlwZSIsIlNCVF9URVhUIiwiU0JUX0lNQUdFIiwiU0JUX0JPVEgiLCJTeXN0ZW1BY3Rpb24iLCJERUZBVUxUX0FDVElPTiIsIlNURUFMX0ZPQ1VTIiwiS0VFUF9DT05URVhUIiwiU29mdEJ1dHRvbiIsInNldEltYWdlIiwiaW1hZ2UiLCJLRVlfSU1BR0UiLCJnZXRJbWFnZSIsInNldElzSGlnaGxpZ2h0ZWQiLCJpc0hpZ2hsaWdodGVkIiwiS0VZX0lTX0hJR0hMSUdIVEVEIiwiZ2V0SXNIaWdobGlnaHRlZCIsInNldFNvZnRCdXR0b25JRCIsInNvZnRCdXR0b25JRCIsIktFWV9TT0ZUX0JVVFRPTl9JRCIsImdldFNvZnRCdXR0b25JRCIsInNldFN5c3RlbUFjdGlvbiIsInN5c3RlbUFjdGlvbiIsIktFWV9TWVNURU1fQUNUSU9OIiwiZ2V0U3lzdGVtQWN0aW9uIiwiTWV0YWRhdGFUeXBlIiwibWVkaWFUaXRsZSIsIm1lZGlhQXJ0aXN0IiwibWVkaWFBbGJ1bSIsIm1lZGlhWWVhciIsIm1lZGlhR2VucmUiLCJtZWRpYVN0YXRpb24iLCJyYXRpbmciLCJjdXJyZW50VGVtcGVyYXR1cmUiLCJtYXhpbXVtVGVtcGVyYXR1cmUiLCJtaW5pbXVtVGVtcGVyYXR1cmUiLCJ3ZWF0aGVyVGVybSIsImh1bWlkaXR5IiwiTWV0YWRhdGFUYWdzIiwic2V0TWFpbkZpZWxkMSIsIktFWV9NQUlOX0ZJRUxEXzEiLCJnZXRNYWluRmllbGQxIiwic2V0TWFpbkZpZWxkMiIsIktFWV9NQUlOX0ZJRUxEXzIiLCJnZXRNYWluRmllbGQyIiwic2V0TWFpbkZpZWxkMyIsIktFWV9NQUlOX0ZJRUxEXzMiLCJnZXRNYWluRmllbGQzIiwic2V0TWFpbkZpZWxkNCIsIktFWV9NQUlOX0ZJRUxEXzQiLCJnZXRNYWluRmllbGQ0IiwiVGV4dEFsaWdubWVudCIsIkxFRlRfQUxJR05FRCIsIlJJR0hUX0FMSUdORUQiLCJDRU5URVJFRCIsInNldEFsaWdubWVudCIsImFsaWdubWVudCIsIktFWV9BTElHTk1FTlQiLCJnZXRBbGlnbm1lbnQiLCJzZXRTdGF0dXNCYXIiLCJLRVlfU1RBVFVTX0JBUiIsImdldFN0YXR1c0JhciIsInNldE1lZGlhQ2xvY2siLCJLRVlfTUVESUFfQ0xPQ0siLCJnZXRNZWRpYUNsb2NrIiwic2V0TWVkaWFUcmFjayIsIktFWV9NRURJQV9UUkFDSyIsImdldE1lZGlhVHJhY2siLCJzZXRHcmFwaGljIiwiS0VZX0dSQVBISUMiLCJnZXRHcmFwaGljIiwic2V0U2Vjb25kYXJ5R3JhcGhpYyIsIktFWV9TRUNPTkRBUllfR1JBUEhJQyIsImdldFNlY29uZGFyeUdyYXBoaWMiLCJzZXRTb2Z0QnV0dG9ucyIsInNvZnRCdXR0b25zIiwiS0VZX1NPRlRfQlVUVE9OUyIsImdldFNvZnRCdXR0b25zIiwic2V0Q3VzdG9tUHJlc2V0cyIsImN1c3RvbVByZXNldHMiLCJLRVlfQ1VTVE9NX1BSRVNFVFMiLCJnZXRDdXN0b21QcmVzZXRzIiwic2V0TWV0YWRhdGFUYWdzIiwibWV0YWRhdGFUYWdzIiwiS0VZX01FVEFEQVRBX1RBR1MiLCJnZXRNZXRhZGF0YVRhZ3MiLCJzZXRUZW1wbGF0ZVRpdGxlIiwiS0VZX1RFTVBMQVRFX1RJVExFIiwiZ2V0VGVtcGxhdGVUaXRsZSIsIlNob3dSZXNwb25zZSIsIlVucmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZSIsIlJwY0NyZWF0b3IiLCJjb25zdHJ1Y3QiLCJycGNOYW1lIiwianNvbkRhdGEiLCJWaWRlb1N0cmVhbWluZ1Byb3RvY29sIiwiUkFXIiwiUlRQIiwiUlRTUCIsIlJUTVAiLCJXRUJNIiwiVmlkZW9TdHJlYW1pbmdDb2RlYyIsIkgyNjQiLCJIMjY1IiwiVGhlb3JhIiwiVlA4IiwiVlA5IiwiVmlkZW9TdHJlYW1pbmdGb3JtYXQiLCJzZXRQcm90b2NvbCIsIktFWV9QUk9UT0NPTCIsImdldFByb3RvY29sIiwic2V0Q29kZWMiLCJLRVlfQ09ERUMiLCJnZXRDb2RlYyIsIlNkbFByb3RvY29sQmFzZSIsImJhc2VUcmFuc3BvcnRDb25maWciLCJzZGxQcm90b2NvbExpc3RlbmVyIiwiX2Jhc2VUcmFuc3BvcnRDb25maWciLCJfc2RsUHJvdG9jb2xMaXN0ZW5lciIsIl90cmFuc3BvcnRNYW5hZ2VyIiwiX3Jlc2V0IiwiX2NyZWF0ZVRyYW5zcG9ydExpc3RlbmVyIiwiX3Byb3RvY29sVmVyc2lvbiIsIl9oZWFkZXJTaXplIiwiVjFfSEVBREVSX1NJWkUiLCJfc2VydmljZVN0YXR1cyIsIl9tdHVzIiwiVjFfVjJfTVRVX1NJWkUiLCJfaGFzaElEIiwiX21lc3NhZ2VGcmFtZUFzc2VtYmxlcnMiLCJzZXRUcmFuc3BvcnRNYW5hZ2VyIiwibWFuYWdlciIsInN0YXJ0U2VydmljZSIsIl90cmFuc3BvcnRMaXN0ZW5lciIsIl9oYW5kbGVUcmFuc3BvcnRDb25uZWN0ZWQiLCJfaGFuZGxlUGFja2V0UmVjZWl2ZWQiLCJwcm90b2NvbFZlcnNpb24iLCJNQVhfUFJPVE9DT0xfVkVSU0lPTiIsInNlbmRQYWNrZXQiLCJ2aWRlb1N0cmVhbWluZ1BhcmFtZXRlcnMiLCJkZXNpcmVkUmVzb2x1dGlvbiIsImRlc2lyZWRGb3JtYXQiLCJnZXRGb3JtYXQiLCJnZXRNdHUiLCJyZXRWYWwiLCJpc0Nvbm5lY3RlZCIsImdldFByb3RvY29sVmVyc2lvbiIsIl9zZXRWZXJzaW9uIiwiVjJfSEVBREVSX1NJWkUiLCJWM19WNF9NVFVfU0laRSIsIl9nZXROZXh0TWVzc2FnZUlEIiwic2VuZFJwYyIsIl9oYW5kbGVDb250cm9sUGFja2V0IiwibWVzc2FnZUZyYW1lQXNzZW1ibGVyIiwiX2dldE1lc3NhZ2VGcmFtZUFzc2VtYmxlciIsIl9oYW5kbGVPbk1lc3NhZ2VBc3NlbWJsZWQiLCJfaGFuZGxlUlBDUGFja2V0IiwiX2hhbmRsZVByb3RvY29sSGVhcnRiZWF0IiwiX2hhbmRsZVByb3RvY29sSGVhcnRiZWF0QUNLIiwiX2hhbmRsZVN0YXJ0U2VydmljZUFDSyIsIl9oYW5kbGVTdGFydFNlcnZpY2VOQUsiLCJfaGFuZGxlRW5kU2VydmljZUFDSyIsIl9oYW5kbGVFbmRTZXJ2aWNlIiwiX2hhbmRsZUVuZFNlcnZpY2VOQUsiLCJoZWFydGJlYXQiLCJtdHVUYWciLCJOQVYiLCJhY2NlcHRlZFJlc29sdXRpb24iLCJhY2NlcHRlZEZvcm1hdCIsImFncmVlZFZpZGVvUGFyYW1zIiwic2V0Rm9ybWF0IiwiX2hhbmRsZVNlcnZpY2VFbmRlZCIsInJlamVjdGVkVGFnIiwicmVqZWN0ZWRQYXJhbXMiLCJlbmRTZXJ2aWNlIiwiVHJhbnNwb3J0VHlwZSIsIldFQlNPQ0tFVF9DTElFTlQiLCJXRUJTT0NLRVRfU0VSVkVSIiwiQ1VTVE9NIiwiU2RsUHNtIiwicmVzZXQiLCJfc3RhdGUiLCJTVEFSVF9TVEFURSIsIl9jb250cm9sRnJhbWVJbmZvIiwiX2R1bXBTaXplIiwiX2RhdGFMZW5ndGgiLCJnZXRTdGF0ZSIsImdldEZvcm1lZFBhY2tldCIsIkZJTklTSEVEX1NUQVRFIiwiaGFuZGxlQnl0ZSIsIl90cmFuc2l0aW9uT25JbnB1dCIsIkVSUk9SX1NUQVRFIiwicmF3Qnl0ZSIsInN0YXRlIiwiVkVSU0lPTl9NQVNLIiwiRU5DUllQVElPTl9NQVNLIiwiRlJBTUVfVFlQRV9NQVNLIiwiU0VSVklDRV9UWVBFX1NUQVRFIiwiQ09OVFJPTF9GUkFNRV9JTkZPX1NUQVRFIiwiU0VTU0lPTl9JRF9TVEFURSIsIkRBVEFfU0laRV8xX1NUQVRFIiwiREFUQV9TSVpFXzJfU1RBVEUiLCJEQVRBX1NJWkVfM19TVEFURSIsIkRBVEFfU0laRV80X1NUQVRFIiwiREFUQV9QVU1QX1NUQVRFIiwiRklSU1RfRlJBTUVfREFUQV9TSVpFIiwiTUVTU0FHRV8xX1NUQVRFIiwiTUVTU0FHRV8yX1NUQVRFIiwiTUVTU0FHRV8zX1NUQVRFIiwiTUVTU0FHRV80X1NUQVRFIiwiVHJhbnNwb3J0QmFzZSIsInRyYW5zcG9ydENhbGxiYWNrIiwiX3NkbFBzbSIsIl90cmFuc3BvcnRDYWxsYmFjayIsInN0b3AiLCJzZXRUcmFuc3BvcnRDYWxsYmFjayIsIldlYlNvY2tldENsaWVudCIsImNvbmZpZyIsIl9xdWV1ZSIsIl9pc1J1bm5pbmciLCJfd3NVcmwiLCJnZXRIb3N0IiwiZ2V0UG9ydCIsIl93cyIsIl9pbml0IiwiV2ViU29ja2V0Iiwib25vcGVuIiwib25Db25uZWN0aW9uRXN0YWJsaXNoZWQiLCJvbmVycm9yIiwib25tZXNzYWdlIiwiX2hhbmRsZUluY29taW5nIiwib25jbG9zZSIsIm9uQ29ubmVjdGlvblRlcm1pbmF0ZWQiLCJjbG9zZSIsInBhY2tldCIsInNlbmQiLCJfbXVsdGlCeXRlSGFuZGxlciIsIm1zZ0RhdGEiLCJSZXNwb25zZSIsImFycmF5QnVmZmVyIiwidGhlbiIsIl9oYW5kbGVCeXRlIiwiaXNGaW5pc2hlZCIsIlRyYW5zcG9ydENhbGxiYWNrIiwiX29uQ29ubmVjdGlvbkVzdGFibGlzaGVkIiwiX29uQ29ubmVjdGlvblRlcm1pbmF0ZWQiLCJzZXRPbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCIsInNldE9uQ29ubmVjdGlvblRlcm1pbmF0ZWQiLCJUcmFuc3BvcnRNYW5hZ2VyQmFzZSIsInRyYW5zcG9ydExpc3RlbmVyIiwiX3RyYW5zcG9ydCIsIl9pc0Nvbm5lY3RlZCIsImdldFRyYW5zcG9ydFR5cGUiLCJnZXRUcmFuc3BvcnQiLCJ0cmFuc3BvcnRUeXBlIiwiYWRkcmVzcyIsInJlcXVpcmUkJDEiLCJXZWJTb2NrZXRTZXJ2ZXIiLCJfY29ubmVjdGlvbkxvc3RJbnRlcnZhbCIsImNsaWVudCIsImdldENsaWVudCIsImNvbm5lY3Rpb25Mb3N0VGltZW91dCIsImdldENvbm5lY3Rpb25Mb3N0VGltZW91dCIsIm9uIiwiX2hhbmRsZU1lc3NhZ2UiLCJfc3RvcENvbm5lY3Rpb25Mb3N0SW50ZXJ2YWwiLCJlcnJvckV2ZW50IiwiaXNBbGl2ZSIsInNldEludGVydmFsIiwidGVybWluYXRlIiwicGluZyIsInJlYWR5U3RhdGUiLCJPUEVOIiwiY2xlYXJJbnRlcnZhbCIsInN0YXRlUHJvZ3Jlc3MiLCJtZXNzYWdlSW5kZXgiLCJyZXF1aXJlJCQyIiwiVHJhbnNwb3J0TWFuYWdlciIsIlNkbFByb3RvY29sIiwiU2VydmljZUxpc3RlbmVyTWFwIiwiX2xpc3RlbmVycyIsImFkZExpc3RlbmVyIiwic2VydmljZUxpc3RlbmVyIiwicmVtb3ZlTGlzdGVuZXIiLCJsaXN0ZW5lckFycmF5IiwicmVtb3ZlZCIsInNlbmRFdmVudFNlcnZpY2VTdGFydGVkIiwic2Vzc2lvbiIsInNlbmRFdmVudFNlcnZpY2VFbmRlZCIsInNlbmRFdmVudFNlcnZpY2VFcnJvciIsIm9uU2VydmljZUVycm9yIiwiREVGQVVMVF9QUk9UT0NPTCIsIkRFRkFVTFRfQ09ERUMiLCJERUZBVUxUX1dJRFRIIiwiREVGQVVMVF9IRUlHSFQiLCJERUZBVUxUX0RFTlNJVFkiLCJERUZBVUxUX0ZSQU1FUkFURSIsIkRFRkFVTFRfQklUUkFURSIsIkRFRkFVTFRfSU5URVJWQUwiLCJERUZBVUxUX1NDQUxFIiwiVmlkZW9TdHJlYW1pbmdQYXJhbWV0ZXJzIiwiZGlzcGxheURlbnNpdHkiLCJmcmFtZVJhdGUiLCJiaXRyYXRlIiwiaW50ZXJ2YWwiLCJfZGlzcGxheURlbnNpdHkiLCJfZnJhbWVSYXRlIiwiX2JpdHJhdGUiLCJfaW50ZXJ2YWwiLCJfcmVzb2x1dGlvbiIsIl9mb3JtYXQiLCJ1cGRhdGUiLCJjYXBhYmlsaXR5IiwiZ2V0TWF4Qml0cmF0ZSIsInNjYWxlIiwiZ2V0U2NhbGUiLCJnZXRQcmVmZXJyZWRSZXNvbHV0aW9uIiwiZm9ybWF0cyIsImdldFN1cHBvcnRlZEZvcm1hdHMiLCJzZXREaXNwbGF5RGVuc2l0eSIsImdldERpc3BsYXlEZW5zaXR5Iiwic2V0RnJhbWVSYXRlIiwiZ2V0RnJhbWVSYXRlIiwic2V0Qml0cmF0ZSIsImdldEJpdHJhdGUiLCJnZXRJbnRlcnZhbCIsIlNkbFNlc3Npb24iLCJzZGxTZXNzaW9uTGlzdGVuZXIiLCJfc2Vzc2lvbkhhc2hJZCIsIl9zZGxTZXNzaW9uTGlzdGVuZXIiLCJfc2VydmljZUxpc3RlbmVycyIsIl9zZXR1cFNkbFByb3RvY29sTGlzdGVuZXIiLCJfc2RsUHJvdG9jb2wiLCJnZXRDdXJyZW50VHJhbnNwb3J0VHlwZSIsImdldElzQ29ubmVjdGVkIiwiZ2V0U2Vzc2lvbkhhc2hJZCIsImFkZFNlcnZpY2VMaXN0ZW5lciIsInNkbFNlcnZpY2VMaXN0ZW5lciIsInJlbW92ZVNlcnZpY2VMaXN0ZW5lciIsImdldFNlcnZpY2VMaXN0ZW5lcnMiLCJzZXREZXNpcmVkVmlkZW9QYXJhbXMiLCJfZGVzaXJlZFZpZGVvUGFyYW1zIiwiU2RsU2Vzc2lvbkxpc3RlbmVyIiwiY29ycmVsYXRpb25JIiwiQXJyYXlUb29scyIsImFycmF5UmVtb3ZlIiwiZWxlIiwiTGlmZWN5Y2xlTWFuYWdlciIsImFwcENvbmZpZyIsImxpZmVjeWNsZUxpc3RlbmVyIiwiX2FwcENvbmZpZyIsIl9saWZlY3ljbGVMaXN0ZW5lciIsIl9zZGxTZXNzaW9uIiwiX2NyZWF0ZVNlc3Npb25MaXN0ZW5lciIsIl9jdXJyZW50SE1JU3RhdHVzIiwiX2ZpcnN0VGltZUZ1bGwiLCJfcmVzcG9uc2VMaXN0ZW5lcnMiLCJfbWF4Q29ycmVsYXRpb25JZCIsIl9ycGNMaXN0ZW5lcnMiLCJzZXNzaW9uTGlzdGVuZXIiLCJzZW5kUnBjTWVzc2FnZSIsIl9jcmVhdGVSZWdpc3RlckFwcEludGVyZmFjZSIsIl9oYW5kbGVScGMiLCJmdW5jdGlvbklEIiwicmVzb2x2ZSIsIl9zZXR1cEludGVybmFsUnBjTGlzdGVuZXJzIiwiYWRkUnBjTGlzdGVuZXIiLCJycGNMaXN0ZW5lciIsInJlbW92ZVJwY0xpc3RlbmVyIiwiZ2V0UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZSIsIl9yZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlIiwicmVnaXN0ZXJBcHBJbnRlcmZhY2UiLCJNQVhfUlBDX1ZFUlNJT04iLCJSRUdJU1RFUl9BUFBfSU5URVJGQUNFX0NPUlJFTEFUSU9OX0lEIiwiX3JwY0xpc3RlbmVyIiwiX3Byb2Nlc3NSYWlSZXNwb25zZSIsInNob3VsZEluaXQiLCJyZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlIiwibXNnVmVyc2lvbiIsIlVOUkVHSVNURVJfQVBQX0lOVEVSRkFDRV9DT1JSRUxBVElPTl9JRCIsIlZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eSIsInNldFByZWZlcnJlZFJlc29sdXRpb24iLCJLRVlfUFJFRkVSUkVEX1JFU09MVVRJT04iLCJzZXRNYXhCaXRyYXRlIiwiS0VZX01BWF9CSVRSQVRFIiwic2V0U3VwcG9ydGVkRm9ybWF0cyIsIktFWV9TVVBQT1JURURfRk9STUFUUyIsInNldEhhcHRpY1NwYXRpYWxEYXRhU3VwcG9ydGVkIiwiS0VZX0hBUFRJQ19TUEFUSUFMX0RBVEFfU1VQUE9SVEVEIiwiZ2V0SGFwdGljU3BhdGlhbERhdGFTdXBwb3J0ZWQiLCJzZXREaWFnb25hbFNjcmVlblNpemUiLCJLRVlfRElBR09OQUxfU0NSRUVOX1NJWkUiLCJnZXREaWFnb25hbFNjcmVlblNpemUiLCJzZXRQaXhlbFBlckluY2giLCJLRVlfUElYRUxfUEVSX0lOQ0giLCJnZXRQaXhlbFBlckluY2giLCJzZXRTY2FsZSIsIktFWV9TQ0FMRSIsIlNkbFNlcnZpY2VMaXN0ZW5lciIsIl9vblNlcnZpY2VFcnJvciIsInNldE9uU2VydmljZUVycm9yIiwiQ3VzdG9tVHJhbnNwb3J0Iiwib25TZW5kUGFja2V0Iiwib25CeXRlQnVmZmVyUmVjZWl2ZWQiLCJzZGxQc20iLCJUcmFuc3BvcnRDb25maWdCYXNlIiwiX3RyYW5zcG9ydFR5cGUiLCJDdXN0b21UcmFuc3BvcnRDb25maWciLCJjdXN0b21UcmFuc3BvcnQiLCJfY3VzdG9tVHJhbnNwb3J0IiwiU3NsQ29uZmlnIiwicGVtQ2VydGlmaWNhdGUiLCJwcml2YXRlS2V5IiwicGFzc3dvcmQiLCJfcGVtQ2VydGlmaWNhdGUiLCJfcHJpdmF0ZUtleSIsIl9wYXNzd29yZCIsImdldFBlbUNlcnRpZmljYXRlIiwiZ2V0UHJpdmF0ZUtleSIsImdldFBhc3N3b3JkIiwiV2ViU29ja2V0Q2xpZW50Q29uZmlnIiwiaG9zdCIsInBvcnQiLCJfaG9zdCIsIl9wb3J0IiwiVHJhbnNwb3J0UmVjb3JkIiwiX2FkZHJlc3MiLCJnZXRBZGRyZXNzIiwiV2ViU29ja2V0U2VydmVyQ29uZmlnIiwiX2NsaWVudCIsIl9jb25uZWN0aW9uTG9zdFRpbWVvdXQiLCJTREwiLCJsaWZlY3ljbGUiLCJwcm90b2NvbCIsImVudW1zIiwicnBjIiwibWVzc2FnZXMiLCJzdHJ1Y3RzIiwic3RyZWFtaW5nIiwidmlkZW8iLCJ0cmFuc3BvcnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0lBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFnQ0E7SUFDQTtJQUVBLE1BQU1BLFNBQU4sQ0FBZ0I7SUFDWjs7O0lBR0FDLEVBQUFBLFdBQVcsR0FBSTtJQUNYLFNBQUtDLGdCQUFMLEdBQXdCLElBQXhCO0lBQ0EsU0FBS0MsTUFBTCxHQUFjLElBQWQ7SUFDQSxTQUFLQyxRQUFMLEdBQWdCLElBQWhCO0lBQ0EsU0FBS0MsU0FBTCxHQUFpQixJQUFqQjtJQUNBLFNBQUtDLFNBQUwsR0FBaUIsSUFBakI7SUFDQSxTQUFLQyxhQUFMLEdBQXFCLElBQXJCO0lBQ0EsU0FBS0MsUUFBTCxHQUFnQixJQUFoQjtJQUNBLFNBQUtDLFdBQUwsR0FBbUIsSUFBbkI7SUFDQSxTQUFLQyxXQUFMLEdBQW1CLElBQW5CO0lBQ0EsU0FBS0MsZ0JBQUwsR0FBd0IsSUFBeEI7SUFDQSxTQUFLQywwQkFBTCxHQUFrQyxJQUFsQztJQUNBLFNBQUtDLFNBQUwsR0FBaUIsSUFBakI7SUFDQSxTQUFLQyxlQUFMLEdBQXVCLElBQXZCO0lBQ0EsU0FBS0MsaUJBQUwsR0FBeUIsSUFBekI7SUFDQSxTQUFLQyxrQkFBTCxHQUEwQixJQUExQjtJQUNBLFNBQUtDLHVCQUFMLEdBQStCLElBQS9CO0lBQ0g7SUFFRDs7Ozs7O0lBSUFDLEVBQUFBLGtCQUFrQixDQUFFQyxlQUFGLEVB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SSxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUM7SUFDL0IsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUM7SUFDdkMsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUM7SUFDdkMsSUFBSSxNQUFNLElBQUksSUFBRztJQUNqQixHQUFHOztJQUVILEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUM7O0lBRXBCLEVBQUUsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUN2QixDQUFDOztJQzVHTSxTQUFTLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0lBQzFELEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBQztJQUNWLEVBQUUsSUFBSSxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsRUFBQztJQUNsQyxFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFDO0lBQzVCLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUM7SUFDdkIsRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUM7SUFDaEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFDO0lBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUM7SUFDdkIsRUFBRSxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQzs7SUFFNUIsRUFBRSxDQUFDLElBQUksRUFBQzs7SUFFUixFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUM7SUFDL0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUM7SUFDaEIsRUFBRSxLQUFLLElBQUksS0FBSTtJQUNmLEVBQUUsT0FBTyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLEVBQUU7O0lBRTVFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQztJQUMvQixFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBQztJQUNoQixFQUFFLEtBQUssSUFBSSxLQUFJO0lBQ2YsRUFBRSxPQUFPLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRTs7SUFFNUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7SUFDZixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBSztJQUNqQixHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO0lBQ3pCLElBQUksT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUM7SUFDOUMsR0FBRyxNQUFNO0lBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBQztJQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBSztJQUNqQixHQUFHO0lBQ0gsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNqRCxDQUFDOztBQUVELElBQU8sU0FBUyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7SUFDbEUsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBQztJQUNiLEVBQUUsSUFBSSxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsRUFBQztJQUNsQyxFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFDO0lBQzVCLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUM7SUFDdkIsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUM7SUFDbEUsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUM7SUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBQztJQUN2QixFQUFFLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFDOztJQUU3RCxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBQzs7SUFFekIsRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFO0lBQzFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBQztJQUM1QixJQUFJLENBQUMs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QUFNLENBQUM7U0FDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7TUFDM0I7O0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsU0FBUyxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtNQUNyRSxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUM7O01BRWxELE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtTQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO01BQ3JCOztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFNBQVMsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7TUFDckUsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFDO01BQ2xELE9BQU9DLElBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO01BQy9DOztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFNBQVMsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7TUFDckUsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFDO01BQ2xELE9BQU9BLElBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO01BQ2hEOztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFNBQVMsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7TUFDdkUsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFDO01BQ2xELE9BQU9BLElBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO01BQy9DOztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFNBQVMsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7TUFDdkUsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFDO01BQ2xELE9BQU9BLElBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO01BQ2hEOztJQUVELFNBQVMsUUFBUSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO01BQ3BELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLDZDQUE2QyxDQUFDO01BQzlGLElBQUksS0FBSyxHQUFHLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsbUNBQW1DLENBQUM7TUFDekYsSUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQztLQUMxRTs7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxTQUFTLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUU7TUFDeEYsS0FBSyxHQUFHLENBQUMsTUFBSztNQUNkLE1BQU0sR0FBRyxNQUFNLEdBQUcsRUFBQztNQUNuQixVQUFVLEdBQUcsVUFBVSxHQUFHLEVBQUM7TUFDM0IsSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUNiLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFDO1FBQzlDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBQztPQUN2RDs7TUFFRCxJQUFJLEdBQUcsR0FBRyxFQUFDO01BQ1gsSUFBSSxDQUFDLEdBQUcsRUFBQztNQUNULElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLEdBQUcsS0FBSTtNQUMzQixPQUFPLEVBQUUsQ0FBQyxHQUFHLFVBQVUsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDekMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLElBQUksS0FBSTtPQUN4Qzs7TUFFRCxPQUFPLE1BQU0sR0FBRyxVQUFVO01BQzNCOztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFNBQVMsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRTtNQUN4RixLQUFLLEdBQUcsQ0FBQyxNQUFLO01BQ2QsTUFBTSxHQUFHLE1BQU0sR0FBRyxFQUFDO01BQ25CLFVBQVUsR0FBRyxVQUFVLEdBQUcsRUFBQztNQUMzQixJQUFJLENBQUMsUUFBUSxFQUFFO1FBQ2IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUM7UUFDOUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFDO09BQ3ZEOztNQUVELElBQUksQ0FBQyxHQUFHLFVBQVUsR0FBRyxFQUFDO01BQ3RCLElBQUksR0FBRyxHQUFHLEVBQUM7TUFDWCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxLQUFJO01BQy9CLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsSUFBSSxLQUFJO09BQ3hDOztNQUVELE9BQU8sTUFBTSxHQUFHLFVBQVU7TUFDM0I7O0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7TUFDMUUsS0FBSyxHQUFHLENBQUMsTUFBSztNQUNkLE1BQU0sR0FBRyxNQUFNLEdBQUcsRUFBQztNQUNuQixJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBQztNQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBQztNQUMxRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksRUFBQztNQUM3QixPQUFPLE1BQU0sR0FBRyxDQUFDO01BQ2xCOztJQUVELFNBQVMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFO01BQzVELElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxFQUFDO01BQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDaEUsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDbkUsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBQztPQUNqQztLQUNGOztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLFNBQVMsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO01BQ2hGLEtBQUssR0FBRyxDQUFDLE1BQUs7TUFDZCxNQUFNLEdBQUcsTUFBTSxHQUFHLEVBQUM7TUFDbkIsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUM7TUFDMUQsSUFBSSxNQUFNLENBQUMsbUJBQW1CLEVBQUU7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFDO09BQ2pDLE1BQU07UUFDTCxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUM7T0FDN0M7TUFDRCxPQUFPLE1BQU0sR0FBRyxDQUFDO01BQ2xCOztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLFNBQVMsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO01BQ2hGLEtBQUssR0FBRyxDQUFDLE1BQUs7TUFDZCxNQUFNLEdBQUcsTUFBTSxHQUFHLEVBQUM7TUFDbkIsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUM7TUFDMUQsSUFBSSxNQUFNLENBQUMsbUJBQW1CLEVBQUU7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxFQUFDO09BQ2xDLE1BQU07UUFDTCxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUM7T0FDOUM7TUFDRCxPQUFPLE1BQU0sR0FBRyxDQUFDO01BQ2xCOztJQUVELFNBQVMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFO01BQzVELElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsVUFBVSxHQUFHLEtBQUssR0FBRyxFQUFDO01BQzdDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDaEUsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSTtPQUNwRTtLQUNGOztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLFNBQVMsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO01BQ2hGLEtBQUssR0FBRyxDQUFDLE1BQUs7TUFDZCxNQUFNLEdBQUcsTUFBTSxHQUFHLEVBQUM7TUFDbkIsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUM7TUFDOUQsSUFBSSxNQUFNLENBQUMsbUJBQW1CLEVBQUU7UUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUM7T0FDOUIsTUFBTTtRQUNMLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQztPQUM3QztNQUNELE9BQU8sTUFBTSxHQUFHLENBQUM7TUFDbEI7O0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsU0FBUyxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7TUFDaEYsS0FBSyxHQUFHLENBQUMsTUFBSztNQUNkLE1BQU0sR0FBRyxNQUFNLEdBQUcsRUFBQztNQUNuQixJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBQztNQUM5RCxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRTtRQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBQztRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFDO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksRUFBQztPQUNsQyxNQUFNO1FBQ0wsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFDO09BQzlDO01BQ0QsT0FBTyxNQUFNLEdBQUcsQ0FBQztNQUNsQjs7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxTQUFTLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUU7TUFDdEYsS0FBSyxHQUFHLENBQUMsTUFBSztNQUNkLE1BQU0sR0FBRyxNQUFNLEdBQUcsRUFBQztNQUNuQixJQUFJLENBQUMsUUFBUSxFQUFFO1FBQ2IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLEVBQUM7O1FBRTNDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBQztPQUM3RDs7TUFFRCxJQUFJLENBQUMsR0FBRyxFQUFDO01BQ1QsSUFBSSxHQUFHLEdBQUcsRUFBQztNQUNYLElBQUksR0FBRyxHQUFHLEVBQUM7TUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxHQUFHLEtBQUk7TUFDM0IsT0FBTyxFQUFFLENBQUMsR0FBRyxVQUFVLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3pDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtVQUN4RCxHQUFHLEdBQUcsRUFBQztTQUNSO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLEtBQUk7T0FDckQ7O01BRUQsT0FBTyxNQUFNLEdBQUcsVUFBVTtNQUMzQjs7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxTQUFTLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUU7TUFDdEYsS0FBSyxHQUFHLENBQUMsTUFBSztNQUNkLE1BQU0sR0FBRyxNQUFNLEdBQUcsRUFBQztNQUNuQixJQUFJLENBQUMsUUFBUSxFQUFFO1FBQ2IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLEVBQUM7O1FBRTNDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBQztPQUM3RDs7TUFFRCxJQUFJLENBQUMsR0FBRyxVQUFVLEdBQUcsRUFBQztNQUN0QixJQUFJLEdBQUcsR0FBRyxFQUFDO01BQ1gsSUFBSSxHQUFHLEdBQUcsRUFBQztNQUNYLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEtBQUk7TUFDL0IsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2pDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtVQUN4RCxHQUFHLEdBQUcsRUFBQztTQUNSO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLEtBQUk7T0FDckQ7O01BRUQsT0FBTyxNQUFNLEdBQUcsVUFBVTtNQUMzQjs7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxTQUFTLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtNQUN4RSxLQUFLLEdBQUcsQ0FBQyxNQUFLO01BQ2QsTUFBTSxHQUFHLE1BQU0sR0FBRyxFQUFDO01BQ25CLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUM7TUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUM7TUFDMUQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLEVBQUM7TUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUM7TUFDN0IsT0FBTyxNQUFNLEdBQUcsQ0FBQztNQUNsQjs7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxTQUFTLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtNQUM5RSxLQUFLLEdBQUcsQ0FBQyxNQUFLO01BQ2QsTUFBTSxHQUFHLE1BQU0sR0FBRyxFQUFDO01BQ25CLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUM7TUFDaEUsSUFBSSxNQUFNLENBQUMsbUJBQW1CLEVBQUU7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFDO09BQ2pDLE1BQU07UUFDTCxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUM7T0FD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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3RtcC9tYW5hZ2VyL0FwcENvbmZpZy5qcyIsIi4uL3RtcC9tYW5hZ2VyL2xpZmVjeWNsZS9MaWZlY3ljbGVMaXN0ZW5lci5qcyIsIi4uL3RtcC91dGlsL0VudW0uanMiLCIuLi90bXAvcnBjL1JwY1N0cnVjdC5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9BcHBJbmZvLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1JHQkNvbG9yLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1RlbXBsYXRlQ29sb3JTY2hlbWUuanMiLCIuLi90bXAvcnBjL2VudW1zL0Z1bmN0aW9uSUQuanMiLCIuLi90bXAvcnBjL2VudW1zL1NwZWVjaENhcGFiaWxpdGllcy5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9UVFNDaHVuay5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9TZGxNc2dWZXJzaW9uLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9BcHBITUlUeXBlLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9MYW5ndWFnZS5qcyIsIi4uL3RtcC9ycGMvUnBjTWVzc2FnZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvUnBjVHlwZS5qcyIsIi4uL3RtcC9ycGMvUnBjUmVxdWVzdC5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9EZXZpY2VJbmZvLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9SZWdpc3RlckFwcEludGVyZmFjZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvUmVzdWx0LmpzIiwiLi4vdG1wL3JwYy9ScGNSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvUnBjTGlzdGVuZXIuanMiLCIuLi90bXAvcHJvdG9jb2wvU2RsUHJvdG9jb2xMaXN0ZW5lci5qcyIsIi4uL3RtcC9wcm90b2NvbC9lbnVtcy9GcmFtZVR5cGUuanMiLCIuLi8uLi8uLi90aGlyZF9wYXJ0eS9ic29uLmNvbW1vbi5qcyIsIi4uL3RtcC91dGlsL0Jzb24uanMiLCIuLi90bXAvcHJvdG9jb2wvU2RsUGFja2V0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JvbGx1cC1wbHVnaW4tbm9kZS1nbG9iYWxzL3NyYy9nbG9iYWwuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyLWVzNi9iYXNlNjQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyLWVzNi9pZWVlNzU0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2J1ZmZlci1lczYvaXNBcnJheS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXItZXM2L2luZGV4LmpzIiwiLi4vdG1wL3V0aWwvVGV4dEVuY29kZXIuanMiLCIuLi90bXAvdXRpbC9Kc29uUnBjTWFyc2hhbGxlci5qcyIsIi4uL3RtcC9wcm90b2NvbC9CaW5hcnlGcmFtZUhlYWRlci5qcyIsIi4uL3RtcC9wcm90b2NvbC9NZXNzYWdlRnJhbWVEaXNhc3NlbWJsZXIuanMiLCIuLi90bXAvdHJhbnNwb3J0L1RyYW5zcG9ydExpc3RlbmVyLmpzIiwiLi4vdG1wL3V0aWwvVmVyc2lvbi5qcyIsIi4uL3RtcC9wcm90b2NvbC9lbnVtcy9TZXJ2aWNlVHlwZS5qcyIsIi4uL3RtcC9wcm90b2NvbC9NZXNzYWdlRnJhbWVBc3NlbWJsZXIuanMiLCIuLi90bXAvcHJvdG9jb2wvZW51bXMvQ29udHJvbEZyYW1lVGFncy5qcyIsIi4uL3RtcC91dGlsL0JpdENvbnZlcnRlci5qcyIsIi4uL3RtcC9wcm90b2NvbC9TZGxQYWNrZXRGYWN0b3J5LmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1NvZnRCdXR0b25DYXBhYmlsaXRpZXMuanMiLCIuLi90bXAvcnBjL2VudW1zL1ByZXJlY29yZGVkU3BlZWNoLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1ByZXNldEJhbmtDYXBhYmlsaXRpZXMuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvVmVoaWNsZVR5cGUuanMiLCIuLi90bXAvcnBjL2VudW1zL0htaVpvbmVDYXBhYmlsaXRpZXMuanMiLCIuLi90bXAvcnBjL2VudW1zL01lZGlhQ2xvY2tGb3JtYXQuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvSW1hZ2VSZXNvbHV0aW9uLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1RvdWNoRXZlbnRDYXBhYmlsaXRpZXMuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvU2NyZWVuUGFyYW1zLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9JbWFnZUZpZWxkTmFtZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvRmlsZVR5cGUuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvSW1hZ2VGaWVsZC5qcyIsIi4uL3RtcC9ycGMvZW51bXMvRGlzcGxheVR5cGUuanMiLCIuLi90bXAvcnBjL2VudW1zL1RleHRGaWVsZE5hbWUuanMiLCIuLi90bXAvcnBjL2VudW1zL0NoYXJhY3RlclNldC5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9UZXh0RmllbGQuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvRGlzcGxheUNhcGFiaWxpdGllcy5qcyIsIi4uL3RtcC9ycGMvZW51bXMvU2FtcGxpbmdSYXRlLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9CaXRzUGVyU2FtcGxlLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9BdWRpb1R5cGUuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcy5qcyIsIi4uL3RtcC9ycGMvZW51bXMvVnJDYXBhYmlsaXRpZXMuanMiLCIuLi90bXAvcnBjL2VudW1zL0J1dHRvbk5hbWUuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvR3JpZC5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9Nb2R1bGVJbmZvLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0J1dHRvbkNhcGFiaWxpdGllcy5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9ITUlDYXBhYmlsaXRpZXMuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1VucmVnaXN0ZXJBcHBJbnRlcmZhY2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1VucmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvV2luZG93VHlwZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvQ3JlYXRlV2luZG93LmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9DcmVhdGVXaW5kb3dSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvRGVsZXRlV2luZG93LmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9EZWxldGVXaW5kb3dSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvSW1hZ2VUeXBlLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0ltYWdlLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1ZySGVscEl0ZW0uanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvU2VhdExvY2F0aW9uLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9NZW51TGF5b3V0LmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9LZXlib2FyZExheW91dC5qcyIsIi4uL3RtcC9ycGMvZW51bXMvS2V5cHJlc3NNb2RlLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0tleWJvYXJkUHJvcGVydGllcy5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvU2V0R2xvYmFsUHJvcGVydGllcy5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvU2V0R2xvYmFsUHJvcGVydGllc1Jlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9HbG9iYWxQcm9wZXJ0eS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvUmVzZXRHbG9iYWxQcm9wZXJ0aWVzLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9SZXNldEdsb2JhbFByb3BlcnRpZXNSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9NZW51UGFyYW1zLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9BZGRDb21tYW5kLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9BZGRDb21tYW5kUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0RlbGV0ZUNvbW1hbmQuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0RlbGV0ZUNvbW1hbmRSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvQWRkU3ViTWVudS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvQWRkU3ViTWVudVJlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9EZWxldGVTdWJNZW51LmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9EZWxldGVTdWJNZW51UmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1Nob3dBcHBNZW51LmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TaG93QXBwTWVudVJlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0Nob2ljZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvQ3JlYXRlSW50ZXJhY3Rpb25DaG9pY2VTZXQuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0NyZWF0ZUludGVyYWN0aW9uQ2hvaWNlU2V0UmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL2VudW1zL0xheW91dE1vZGUuanMiLCIuLi90bXAvcnBjL2VudW1zL0ludGVyYWN0aW9uTW9kZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvUGVyZm9ybUludGVyYWN0aW9uLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9UcmlnZ2VyU291cmNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9QZXJmb3JtSW50ZXJhY3Rpb25SZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvRGVsZXRlSW50ZXJhY3Rpb25DaG9pY2VTZXQuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0RlbGV0ZUludGVyYWN0aW9uQ2hvaWNlU2V0UmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL2VudW1zL1NvZnRCdXR0b25UeXBlLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9TeXN0ZW1BY3Rpb24uanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvU29mdEJ1dHRvbi5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvQWxlcnQuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0FsZXJ0UmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL2VudW1zL1RleHRBbGlnbm1lbnQuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvVGVtcGxhdGVDb25maWd1cmF0aW9uLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9NZXRhZGF0YVR5cGUuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvTWV0YWRhdGFUYWdzLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TaG93LmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TaG93UmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1NwZWFrLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TcGVha1Jlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1N0YXJ0VGltZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvVXBkYXRlTW9kZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvQXVkaW9TdHJlYW1pbmdJbmRpY2F0b3IuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1NldE1lZGlhQ2xvY2tUaW1lci5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvU2V0TWVkaWFDbG9ja1RpbWVyUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1BlcmZvcm1BdWRpb1Bhc3NUaHJ1LmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9QZXJmb3JtQXVkaW9QYXNzVGhydVJlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9FbmRBdWRpb1Bhc3NUaHJ1LmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9FbmRBdWRpb1Bhc3NUaHJ1UmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1N1YnNjcmliZUJ1dHRvbi5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvU3Vic2NyaWJlQnV0dG9uUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1Vuc3Vic2NyaWJlQnV0dG9uLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9VbnN1YnNjcmliZUJ1dHRvblJlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TdWJzY3JpYmVWZWhpY2xlRGF0YS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvVmVoaWNsZURhdGFSZXN1bHRDb2RlLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9WZWhpY2xlRGF0YVR5cGUuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvVmVoaWNsZURhdGFSZXN1bHQuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1N1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1Vuc3Vic2NyaWJlVmVoaWNsZURhdGEuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1Vuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvR2V0VmVoaWNsZURhdGEuanMiLCIuLi90bXAvcnBjL2VudW1zL1ZlaGljbGVEYXRhRXZlbnRTdGF0dXMuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvQWlyYmFnU3RhdHVzLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9Qb3dlck1vZGVTdGF0dXMuanMiLCIuLi90bXAvcnBjL2VudW1zL0Nhck1vZGVTdGF0dXMuanMiLCIuLi90bXAvcnBjL2VudW1zL1Bvd2VyTW9kZVF1YWxpZmljYXRpb25TdGF0dXMuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvQ2x1c3Rlck1vZGVTdGF0dXMuanMiLCIuLi90bXAvcnBjL2VudW1zL0Z1ZWxDdXRvZmZTdGF0dXMuanMiLCIuLi90bXAvcnBjL2VudW1zL0VtZXJnZW5jeUV2ZW50VHlwZS5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9FbWVyZ2VuY3lFdmVudC5qcyIsIi4uL3RtcC9ycGMvZW51bXMvVHVyblNpZ25hbC5qcyIsIi4uL3RtcC9ycGMvZW51bXMvQW1iaWVudExpZ2h0U3RhdHVzLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0hlYWRMYW1wU3RhdHVzLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9QcmltYXJ5QXVkaW9Tb3VyY2UuanMiLCIuLi90bXAvcnBjL2VudW1zL0RldmljZUxldmVsU3RhdHVzLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0RldmljZVN0YXR1cy5qcyIsIi4uL3RtcC9ycGMvZW51bXMvV2lwZXJTdGF0dXMuanMiLCIuLi90bXAvcnBjL2VudW1zL0VsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMuanMiLCIuLi90bXAvcnBjL2VudW1zL1ZlaGljbGVEYXRhU3RhdHVzLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL015S2V5LmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9Db21wYXNzRGlyZWN0aW9uLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9EaW1lbnNpb24uanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvR1BTRGF0YS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvUFJOREwuanMiLCIuLi90bXAvcnBjL2VudW1zL0Z1ZWxUeXBlLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0Z1ZWxSYW5nZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvVmVoaWNsZURhdGFOb3RpZmljYXRpb25TdGF0dXMuanMiLCIuLi90bXAvcnBjL2VudW1zL0VDYWxsQ29uZmlybWF0aW9uU3RhdHVzLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0VDYWxsSW5mby5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9CZWx0U3RhdHVzLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9Db21wb25lbnRWb2x1bWVTdGF0dXMuanMiLCIuLi90bXAvcnBjL2VudW1zL0lnbml0aW9uU3RhdHVzLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9JZ25pdGlvblN0YWJsZVN0YXR1cy5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9Cb2R5SW5mb3JtYXRpb24uanMiLCIuLi90bXAvcnBjL2VudW1zL1RQTVMuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvU2luZ2xlVGlyZVN0YXR1cy5qcyIsIi4uL3RtcC9ycGMvZW51bXMvV2FybmluZ0xpZ2h0U3RhdHVzLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1RpcmVTdGF0dXMuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0dldFZlaGljbGVEYXRhUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1JlYWRESUQuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvRElEUmVzdWx0LmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9SZWFkRElEUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0dldERUQ3MuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0dldERUQ3NSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvRGlhZ25vc3RpY01lc3NhZ2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0RpYWdub3N0aWNNZXNzYWdlUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1Njcm9sbGFibGVNZXNzYWdlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TY3JvbGxhYmxlTWVzc2FnZVJlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TbGlkZXIuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1NsaWRlclJlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TaG93Q29uc3RhbnRUQlQuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1Nob3dDb25zdGFudFRCVFJlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9BbGVydE1hbmV1dmVyLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9BbGVydE1hbmV1dmVyUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvVHVybi5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvVXBkYXRlVHVybkxpc3QuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1VwZGF0ZVR1cm5MaXN0UmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0NoYW5nZVJlZ2lzdHJhdGlvbi5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvQ2hhbmdlUmVnaXN0cmF0aW9uUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0dlbmVyaWNSZXNwb25zZVJlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9QdXRGaWxlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9QdXRGaWxlUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0dldEZpbGUuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0dldEZpbGVSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvRGVsZXRlRmlsZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvRGVsZXRlRmlsZVJlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9MaXN0RmlsZXMuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0xpc3RGaWxlc1Jlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TZXRBcHBJY29uLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TZXRBcHBJY29uUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1NldERpc3BsYXlMYXlvdXQuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1NldERpc3BsYXlMYXlvdXRSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvUmVxdWVzdFR5cGUuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1N5c3RlbVJlcXVlc3QuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1N5c3RlbVJlcXVlc3RSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvRGVsaXZlcnlNb2RlLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0RhdGVUaW1lLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL09BU0lTQWRkcmVzcy5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvU2VuZExvY2F0aW9uLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TZW5kTG9jYXRpb25SZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvRGlhbE51bWJlci5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvRGlhbE51bWJlclJlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9CdXR0b25QcmVzc01vZGUuanMiLCIuLi90bXAvcnBjL2VudW1zL01vZHVsZVR5cGUuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0J1dHRvblByZXNzLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9CdXR0b25QcmVzc1Jlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9HZXRJbnRlcmlvclZlaGljbGVEYXRhLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9EaXNwbGF5TW9kZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvRGlzdGFuY2VVbml0LmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9UZW1wZXJhdHVyZVVuaXQuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvSE1JU2V0dGluZ3NDb250cm9sRGF0YS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvUmFkaW9CYW5kLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1Jkc0RhdGEuanMiLCIuLi90bXAvcnBjL2VudW1zL1JhZGlvU3RhdGUuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvU3RhdGlvbklETnVtYmVyLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1Npc0RhdGEuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvUmFkaW9Db250cm9sRGF0YS5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9UZW1wZXJhdHVyZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvVmVudGlsYXRpb25Nb2RlLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9EZWZyb3N0Wm9uZS5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9DbGltYXRlQ29udHJvbERhdGEuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvRXF1YWxpemVyU2V0dGluZ3MuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvQXVkaW9Db250cm9sRGF0YS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvTWFzc2FnZUN1c2hpb24uanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvTWFzc2FnZUN1c2hpb25GaXJtbmVzcy5qcyIsIi4uL3RtcC9ycGMvZW51bXMvU3VwcG9ydGVkU2VhdC5qcyIsIi4uL3RtcC9ycGMvZW51bXMvU2VhdE1lbW9yeUFjdGlvblR5cGUuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvU2VhdE1lbW9yeUFjdGlvbi5qcyIsIi4uL3RtcC9ycGMvZW51bXMvTWFzc2FnZVpvbmUuanMiLCIuLi90bXAvcnBjL2VudW1zL01hc3NhZ2VNb2RlLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL01hc3NhZ2VNb2RlRGF0YS5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9TZWF0Q29udHJvbERhdGEuanMiLCIuLi90bXAvcnBjL2VudW1zL0xpZ2h0U3RhdHVzLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9MaWdodE5hbWUuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvTGlnaHRTdGF0ZS5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9MaWdodENvbnRyb2xEYXRhLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL01vZHVsZURhdGEuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0dldEludGVyaW9yVmVoaWNsZURhdGFSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnQuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0dldEludGVyaW9yVmVoaWNsZURhdGFDb25zZW50UmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1JlbGVhc2VJbnRlcmlvclZlaGljbGVEYXRhTW9kdWxlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9SZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZVJlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TZXRJbnRlcmlvclZlaGljbGVEYXRhLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TZXRJbnRlcmlvclZlaGljbGVEYXRhUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1N1YnNjcmliZVdheVBvaW50cy5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvU3Vic2NyaWJlV2F5UG9pbnRzUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL2VudW1zL1dheVBvaW50VHlwZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvR2V0V2F5UG9pbnRzLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0Nvb3JkaW5hdGUuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvTG9jYXRpb25EZXRhaWxzLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9HZXRXYXlQb2ludHNSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvVW5zdWJzY3JpYmVXYXlQb2ludHMuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1Vuc3Vic2NyaWJlV2F5UG9pbnRzUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL2VudW1zL1N5c3RlbUNhcGFiaWxpdHlUeXBlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9HZXRTeXN0ZW1DYXBhYmlsaXR5LmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9WaWRlb1N0cmVhbWluZ0NvZGVjLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9WaWRlb1N0cmVhbWluZ1Byb3RvY29sLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1ZpZGVvU3RyZWFtaW5nRm9ybWF0LmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1ZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eS5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9QaG9uZUNhcGFiaWxpdHkuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvV2luZG93VHlwZUNhcGFiaWxpdGllcy5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9XaW5kb3dDYXBhYmlsaXR5LmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0Rpc3BsYXlDYXBhYmlsaXR5LmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0F1ZGlvQ29udHJvbENhcGFiaWxpdGllcy5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9MaWdodENhcGFiaWxpdGllcy5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9MaWdodENvbnRyb2xDYXBhYmlsaXRpZXMuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0hNSVNldHRpbmdzQ29udHJvbENhcGFiaWxpdGllcy5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9SZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1NlYXRMb2NhdGlvbkNhcGFiaWxpdHkuanMiLCIuLi90bXAvcnBjL2VudW1zL1NlcnZpY2VVcGRhdGVSZWFzb24uanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvTmF2aWdhdGlvblNlcnZpY2VNYW5pZmVzdC5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9XZWF0aGVyU2VydmljZU1hbmlmZXN0LmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL01lZGlhU2VydmljZU1hbmlmZXN0LmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0FwcFNlcnZpY2VNYW5pZmVzdC5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9BcHBTZXJ2aWNlUmVjb3JkLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0FwcFNlcnZpY2VDYXBhYmlsaXR5LmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0FwcFNlcnZpY2VzQ2FwYWJpbGl0aWVzLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL05hdmlnYXRpb25DYXBhYmlsaXR5LmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1N5c3RlbUNhcGFiaWxpdHkuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0dldFN5c3RlbUNhcGFiaWxpdHlSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9SZWN0YW5nbGUuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvSGFwdGljUmVjdC5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvU2VuZEhhcHRpY0RhdGEuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1NlbmRIYXB0aWNEYXRhUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL2VudW1zL0h5YnJpZEFwcFByZWZlcmVuY2UuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvQ2xvdWRBcHBQcm9wZXJ0aWVzLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9TZXRDbG91ZEFwcFByb3BlcnRpZXMuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL1NldENsb3VkQXBwUHJvcGVydGllc1Jlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9HZXRDbG91ZEFwcFByb3BlcnRpZXMuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL0dldENsb3VkQXBwUHJvcGVydGllc1Jlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9QdWJsaXNoQXBwU2VydmljZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvUHVibGlzaEFwcFNlcnZpY2VSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvVW5wdWJsaXNoQXBwU2VydmljZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvVW5wdWJsaXNoQXBwU2VydmljZVJlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9HZXRBcHBTZXJ2aWNlRGF0YS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvTmF2aWdhdGlvbkp1bmN0aW9uLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9EaXJlY3Rpb24uanMiLCIuLi90bXAvcnBjL2VudW1zL05hdmlnYXRpb25BY3Rpb24uanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvTmF2aWdhdGlvbkluc3RydWN0aW9uLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL05hdmlnYXRpb25TZXJ2aWNlRGF0YS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvTWVkaWFUeXBlLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL01lZGlhU2VydmljZURhdGEuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvV2VhdGhlckRhdGEuanMiLCIuLi90bXAvcnBjL3N0cnVjdHMvV2VhdGhlckFsZXJ0LmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1dlYXRoZXJTZXJ2aWNlRGF0YS5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9BcHBTZXJ2aWNlRGF0YS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvR2V0QXBwU2VydmljZURhdGFSZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvbi5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvblJlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9DYW5jZWxJbnRlcmFjdGlvbi5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvQ2FuY2VsSW50ZXJhY3Rpb25SZXNwb25zZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvQ2xvc2VBcHBsaWNhdGlvbi5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvQ2xvc2VBcHBsaWNhdGlvblJlc3BvbnNlLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9TeXN0ZW1Db250ZXh0LmpzIiwiLi4vdG1wL3JwYy9ScGNOb3RpZmljYXRpb24uanMiLCIuLi90bXAvcnBjL2VudW1zL0F1ZGlvU3RyZWFtaW5nU3RhdGUuanMiLCIuLi90bXAvcnBjL2VudW1zL0hNSUxldmVsLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9WaWRlb1N0cmVhbWluZ1N0YXRlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9PbkhNSVN0YXR1cy5qcyIsIi4uL3RtcC9ycGMvZW51bXMvQXBwSW50ZXJmYWNlVW5yZWdpc3RlcmVkUmVhc29uLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9PbkFwcEludGVyZmFjZVVucmVnaXN0ZXJlZC5qcyIsIi4uL3RtcC9ycGMvZW51bXMvQnV0dG9uRXZlbnRNb2RlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9PbkJ1dHRvbkV2ZW50LmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9PbkJ1dHRvblByZXNzLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9PblZlaGljbGVEYXRhLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9PbkNvbW1hbmQuanMiLCIuLi90bXAvcnBjL2VudW1zL1RCVFN0YXRlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9PblRCVENsaWVudFN0YXRlLmpzIiwiLi4vdG1wL3JwYy9lbnVtcy9Ecml2ZXJEaXN0cmFjdGlvblN0YXRlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9PbkRyaXZlckRpc3RyYWN0aW9uLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL0hNSVBlcm1pc3Npb25zLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1BhcmFtZXRlclBlcm1pc3Npb25zLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1Blcm1pc3Npb25JdGVtLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9PblBlcm1pc3Npb25zQ2hhbmdlLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9PbkF1ZGlvUGFzc1RocnUuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL09uTGFuZ3VhZ2VDaGFuZ2UuanMiLCIuLi90bXAvcnBjL2VudW1zL0tleWJvYXJkRXZlbnQuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL09uS2V5Ym9hcmRJbnB1dC5qcyIsIi4uL3RtcC9ycGMvc3RydWN0cy9Ub3VjaENvb3JkLmpzIiwiLi4vdG1wL3JwYy9zdHJ1Y3RzL1RvdWNoRXZlbnQuanMiLCIuLi90bXAvcnBjL2VudW1zL1RvdWNoVHlwZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvT25Ub3VjaEV2ZW50LmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9PblN5c3RlbVJlcXVlc3QuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL09uSGFzaENoYW5nZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvT25XYXlQb2ludENoYW5nZS5qcyIsIi4uL3RtcC9ycGMvbWVzc2FnZXMvT25JbnRlcmlvclZlaGljbGVEYXRhLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9PblJDU3RhdHVzLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9PbkFwcFNlcnZpY2VEYXRhLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9PblN5c3RlbUNhcGFiaWxpdHlVcGRhdGVkLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9FbmNvZGVkU3luY1BEYXRhLmpzIiwiLi4vdG1wL3JwYy9tZXNzYWdlcy9FbmNvZGVkU3luY1BEYXRhUmVzcG9uc2UuanMiLCIuLi90bXAvcnBjL21lc3NhZ2VzL09uRW5jb2RlZFN5bmNQRGF0YS5qcyIsIi4uL3RtcC9ycGMvUnBjQ3JlYXRvci5qcyIsIi4uL3RtcC9wcm90b2NvbC9TZGxQcm90b2NvbEJhc2UuanMiLCIuLi90bXAvdHJhbnNwb3J0L2VudW1zL1RyYW5zcG9ydFR5cGUuanMiLCIuLi90bXAvdHJhbnNwb3J0L1NkbFBzbS5qcyIsIi4uL3RtcC90cmFuc3BvcnQvVHJhbnNwb3J0QmFzZS5qcyIsIi4uL3RtcC90cmFuc3BvcnQvV2ViU29ja2V0Q2xpZW50LmpzIiwiLi4vdG1wL3RyYW5zcG9ydC9UcmFuc3BvcnRDYWxsYmFjay5qcyIsIi4uL3RtcC90cmFuc3BvcnQvVHJhbnNwb3J0TWFuYWdlckJhc2UuanMiLCIuLi90bXAvdHJhbnNwb3J0L1dlYlNvY2tldFNlcnZlci5qcyIsIi4uL3RtcC90cmFuc3BvcnQvVHJhbnNwb3J0TWFuYWdlci5qcyIsIi4uL3RtcC9wcm90b2NvbC9TZGxQcm90b2NvbC5qcyIsIi4uL3RtcC9zZXNzaW9uL1NlcnZpY2VMaXN0ZW5lck1hcC5qcyIsIi4uL3RtcC9zdHJlYW1pbmcvdmlkZW8vVmlkZW9TdHJlYW1pbmdQYXJhbWV0ZXJzLmpzIiwiLi4vdG1wL3Nlc3Npb24vU2RsU2Vzc2lvbi5qcyIsIi4uL3RtcC9zZXNzaW9uL1NkbFNlc3Npb25MaXN0ZW5lci5qcyIsIi4uL3RtcC91dGlsL0FycmF5VG9vbHMuanMiLCIuLi90bXAvbWFuYWdlci9saWZlY3ljbGUvTGlmZWN5Y2xlTWFuYWdlci5qcyIsIi4uL3RtcC9ycGMvZW51bXMvQXBwU2VydmljZVR5cGUuanMiLCIuLi90bXAvcnBjL2VudW1zL01haW50ZW5hbmNlTW9kZVN0YXR1cy5qcyIsIi4uL3RtcC9ycGMvZW51bXMvUGVybWlzc2lvblN0YXR1cy5qcyIsIi4uL3RtcC9ycGMvZW51bXMvUHJlZGVmaW5lZExheW91dC5qcyIsIi4uL3RtcC9ycGMvZW51bXMvUHJlZGVmaW5lZFdpbmRvd3MuanMiLCIuLi90bXAvcnBjL2VudW1zL1RpbWVyTW9kZS5qcyIsIi4uL3RtcC9ycGMvZW51bXMvVmVoaWNsZURhdGFBY3RpdmVTdGF0dXMuanMiLCIuLi90bXAvcnBjL2VudW1zL21lc3NhZ2VUeXBlLmpzIiwiLi4vdG1wL3Nlc3Npb24vU2RsU2VydmljZUxpc3RlbmVyLmpzIiwiLi4vdG1wL3RyYW5zcG9ydC9DdXN0b21UcmFuc3BvcnQuanMiLCIuLi90bXAvdHJhbnNwb3J0L1RyYW5zcG9ydENvbmZpZ0Jhc2UuanMiLCIuLi90bXAvdHJhbnNwb3J0L0N1c3RvbVRyYW5zcG9ydENvbmZpZy5qcyIsIi4uL3RtcC90cmFuc3BvcnQvU3NsQ29uZmlnLmpzIiwiLi4vdG1wL3RyYW5zcG9ydC9XZWJTb2NrZXRDbGllbnRDb25maWcuanMiLCIuLi90bXAvdHJhbnNwb3J0L3V0aWwvVHJhbnNwb3J0UmVjb3JkLmpzIiwiLi4vdG1wL3RyYW5zcG9ydC9XZWJTb2NrZXRTZXJ2ZXJDb25maWcuanMiLCIuLi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuLy8gVE9ETyBUaGlzIGNsYXNzIG1heSBvciBtYXkgbm90IGJlIGluY2x1ZGVkIGluIHRoZSByZWxlYXNlLiBXZSBzaG91bGQgZGV0ZXJtaW5lIGlmXG4vLyB0aGVyZSBpcyBhIGJldHRlciBjb2RpbmcgcGF0dGVybiBmb3IgdGhpcyBmb3IgamF2YXNjcmlwdC5cblxuY2xhc3MgQXBwQ29uZmlnIHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRDb25maWcgPSBudWxsO1xuICAgICAgICB0aGlzLl9hcHBJZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2FwcE5hbWUgPSBudWxsO1xuICAgICAgICB0aGlzLl9pY29uTmFtZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2ljb25GaWxlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2hvcnRBcHBOYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdHRzTmFtZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3ZyU3lub255bXMgPSBudWxsO1xuICAgICAgICB0aGlzLl9pc01lZGlhQXBwID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VEZXNpcmVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5faG1pRGlzcGxheUxhbmd1YWdlRGVzaXJlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2FwcFR5cGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZGF5Q29sb3JTY2hlbWUgPSBudWxsO1xuICAgICAgICB0aGlzLl9uaWdodENvbG9yU2NoZW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbWluaW11bVJQQ1ZlcnNpb24gPSBudWxsO1xuICAgICAgICB0aGlzLl9taW5pbXVtUHJvdG9jb2xWZXJzaW9uID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7VHJhbnNwb3J0Q29uZmlnQmFzZX0gdHJhbnNwb3J0Q29uZmlnXG4gICAgKiBAcmV0dXJuIHtBcHBDb25maWd9XG4gICAgKi9cbiAgICBzZXRUcmFuc3BvcnRDb25maWcgKHRyYW5zcG9ydENvbmZpZykge1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRDb25maWcgPSB0cmFuc3BvcnRDb25maWc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7VHJhbnNwb3J0Q29uZmlnQmFzZX1cbiAgICAqL1xuICAgIGdldFRyYW5zcG9ydENvbmZpZyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnRDb25maWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gYXBwSWRcbiAgICAqIEByZXR1cm4ge0FwcENvbmZpZ31cbiAgICAqL1xuICAgIHNldEFwcElkIChhcHBJZCkge1xuICAgICAgICB0aGlzLl9hcHBJZCA9IGFwcElkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIGdldEFwcElkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcElkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IGFwcE5hbWVcbiAgICAqIEByZXR1cm4ge0FwcENvbmZpZ31cbiAgICAqL1xuICAgIHNldEFwcE5hbWUgKGFwcE5hbWUpIHtcbiAgICAgICAgdGhpcy5fYXBwTmFtZSA9IGFwcE5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0QXBwTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBOYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IGljb25OYW1lXG4gICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGZpbGVEYXRhXG4gICAgKiBAcmV0dXJuIHtBcHBDb25maWd9XG4gICAgKi9cbiAgICBzZXRBcHBJY29uIChpY29uTmFtZSA9ICdpY29uLnBuZycsIGZpbGVEYXRhKSB7XG4gICAgICAgIC8vIFRPRE8gY3JlYXRlIFNkbEFydHdvcmtcbiAgICAgICAgdGhpcy5faWNvbk5hbWUgPSBpY29uTmFtZTtcbiAgICAgICAgdGhpcy5faWNvbkZpbGUgPSBmaWxlRGF0YTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIGdldEFwcEljb25OYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ljb25OYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7VWludDhBcnJheX1cbiAgICAqL1xuICAgIGdldEFwcEljb25GaWxlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pY29uRmlsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBzaG9ydEFwcE5hbWVcbiAgICAqIEByZXR1cm4ge0FwcENvbmZpZ31cbiAgICAqL1xuICAgIHNldFNob3J0QXBwTmFtZSAoc2hvcnRBcHBOYW1lKSB7XG4gICAgICAgIHRoaXMuX3Nob3J0QXBwTmFtZSA9IHNob3J0QXBwTmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgKi9cbiAgICBnZXRTaG9ydEFwcE5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hvcnRBcHBOYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtBcnJheTxUVFNDaHVuaz59IHR0c05hbWVcbiAgICAqIEByZXR1cm4ge0FwcENvbmZpZ31cbiAgICAqL1xuICAgIHNldFR0c05hbWUgKHR0c05hbWUpIHtcbiAgICAgICAgdGhpcy5fdHRzTmFtZSA9IHR0c05hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7QXJyYXk8VFRTQ2h1bms+fVxuICAgICovXG4gICAgZ2V0VHRzTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90dHNOYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtBcnJheTxTdHJpbmc+fSB2clN5bm9ueW1zXG4gICAgKiBAcmV0dXJuIHtBcHBDb25maWd9XG4gICAgKi9cbiAgICBzZXRWclN5bm9ueW1zICh2clN5bm9ueW1zKSB7XG4gICAgICAgIHRoaXMuX3ZyU3lub255bXMgPSB2clN5bm9ueW1zO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59XG4gICAgKi9cbiAgICBnZXRWclN5bm9ueW1zICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZyU3lub255bXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzTWVkaWFBcHBcbiAgICAqIEByZXR1cm4ge0FwcENvbmZpZ31cbiAgICAqL1xuICAgIHNldElzTWVkaWFBcHAgKGlzTWVkaWFBcHApIHtcbiAgICAgICAgdGhpcy5faXNNZWRpYUFwcCA9IGlzTWVkaWFBcHA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAqL1xuICAgIGlzTWVkaWFBcHAgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNNZWRpYUFwcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7TGFuZ3VhZ2V9IGxhbmd1YWdlRGVzaXJlZFxuICAgICogQHJldHVybiB7QXBwQ29uZmlnfVxuICAgICovXG4gICAgc2V0TGFuZ3VhZ2VEZXNpcmVkIChsYW5ndWFnZURlc2lyZWQpIHtcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VEZXNpcmVkID0gbGFuZ3VhZ2VEZXNpcmVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0xhbmd1YWdlfVxuICAgICovXG4gICAgZ2V0TGFuZ3VhZ2VEZXNpcmVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlRGVzaXJlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7TGFuZ3VhZ2V9IGhtaURpc3BsYXlMYW5ndWFnZURlc2lyZWRcbiAgICAqIEByZXR1cm4ge0FwcENvbmZpZ31cbiAgICAqL1xuICAgIHNldEhtaURpc3BsYXlMYW5ndWFnZURlc2lyZWQgKGhtaURpc3BsYXlMYW5ndWFnZURlc2lyZWQpIHtcbiAgICAgICAgdGhpcy5faG1pRGlzcGxheUxhbmd1YWdlRGVzaXJlZCA9IGhtaURpc3BsYXlMYW5ndWFnZURlc2lyZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TGFuZ3VhZ2V9XG4gICAgKi9cbiAgICBnZXRIbWlEaXNwbGF5TGFuZ3VhZ2VEZXNpcmVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2htaURpc3BsYXlMYW5ndWFnZURlc2lyZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0FycmF5PEFwcEhNSVR5cGU+fSBhcHBUeXBlcyBhbiBhcnJheSBvZiBvcmRlcmVkIGFwcCB0eXBlc1xuICAgICogQHJldHVybiB7QXBwQ29uZmlnfVxuICAgICovXG4gICAgc2V0QXBwVHlwZXMgKGFwcFR5cGVzKSB7XG4gICAgICAgIHRoaXMuX2FwcFR5cGVzID0gYXBwVHlwZXM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7QXJyYXk8QXBwSE1JVHlwZT59XG4gICAgKi9cbiAgICBnZXRBcHBUeXBlcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBUeXBlcztcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtUZW1wbGF0ZUNvbG9yU2NoZW1lfSBkYXlDb2xvclNjaGVtZVxuICAgICogQHJldHVybiB7QXBwQ29uZmlnfVxuICAgICovXG4gICAgc2V0RGF5Q29sb3JTY2hlbWUgKGRheUNvbG9yU2NoZW1lKSB7XG4gICAgICAgIHRoaXMuX2RheUNvbG9yU2NoZW1lID0gZGF5Q29sb3JTY2hlbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7VGVtcGxhdGVDb2xvclNjaGVtZX1cbiAgICAqL1xuICAgIGdldERheUNvbG9yU2NoZW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RheUNvbG9yU2NoZW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtUZW1wbGF0ZUNvbG9yU2NoZW1lfSBuaWdodENvbG9yU2NoZW1lXG4gICAgKiBAcmV0dXJuIHtBcHBDb25maWd9XG4gICAgKi9cbiAgICBzZXROaWdodENvbG9yU2NoZW1lIChuaWdodENvbG9yU2NoZW1lKSB7XG4gICAgICAgIHRoaXMuX25pZ2h0Q29sb3JTY2hlbWUgPSBuaWdodENvbG9yU2NoZW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1RlbXBsYXRlQ29sb3JTY2hlbWV9XG4gICAgKi9cbiAgICBnZXROaWdodENvbG9yU2NoZW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25pZ2h0Q29sb3JTY2hlbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBUaGUgbWluaW11bSBSUEMgdmVyc2lvbiB0aGF0IHdpbGwgYmUgcGVybWl0dGVkIHRvIGNvbm5lY3QuXG4gICAgKiBJZiB0aGUgUlBDIHZlcnNpb24gb2YgdGhlIGhlYWQgdW5pdCBjb25uZWN0ZWQgaXMgYmVsb3cgdGhpcyB2ZXJzaW9uLCBhbiBVbnJlZ2lzdGVyQXBwSW50ZXJmYWNlIHdpbGwgYmUgc2VudC5cbiAgICAqXG4gICAgKiBAcGFyYW0ge1ZlcnNpb259IG1pbmltdW1SUENWZXJzaW9uXG4gICAgKiBAcmV0dXJuIHtBcHBDb25maWd9XG4gICAgKi9cbiAgICBzZXRNaW5pbXVtUlBDVmVyc2lvbiAobWluaW11bVJQQ1ZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5fbWluaW11bVJQQ1ZlcnNpb24gPSBtaW5pbXVtUlBDVmVyc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAqIEByZXR1cm4ge1ZlcnNpb259XG4gICAgKi9cbiAgICBnZXRNaW5pbXVtUlBDVmVyc2lvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW5pbXVtUlBDVmVyc2lvbjtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICogU2V0cyB0aGUgbWluaW11bSBwcm90b2NvbCB2ZXJzaW9uIHRoYXQgd2lsbCBiZSBwZXJtaXR0ZWQgdG8gY29ubmVjdC5cbiAgICAqIElmIHRoZSBwcm90b2NvbCB2ZXJzaW9uIG9mIHRoZSBoZWFkIHVuaXQgY29ubmVjdGVkIGlzIGJlbG93IHRoaXMgdmVyc2lvbixcbiAgICAqIHRoZSBhcHAgd2lsbCBkaXNjb25uZWN0IHdpdGggYW4gRW5kU2VydmljZSBwcm90b2NvbCBtZXNzYWdlIGFuZCB3aWxsIG5vdCByZWdpc3Rlci5cbiAgICAqIEBwYXJhbSB7VmVyc2lvbn0gbWluaW11bVByb3RvY29sVmVyc2lvblxuICAgICogQHJldHVybiB7QXBwQ29uZmlnfVxuICAgICovXG4gICAgc2V0TWluaW11bVByb3RvY29sVmVyc2lvbiAobWluaW11bVByb3RvY29sVmVyc2lvbikge1xuICAgICAgICB0aGlzLl9taW5pbXVtUHJvdG9jb2xWZXJzaW9uID0gbWluaW11bVByb3RvY29sVmVyc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtWZXJzaW9ufVxuICAgICovXG4gICAgZ2V0TWluaW11bVByb3RvY29sVmVyc2lvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW5pbXVtUHJvdG9jb2xWZXJzaW9uO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgQXBwQ29uZmlnIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTGlmZWN5Y2xlTGlzdGVuZXJcbiAqL1xuY2xhc3MgTGlmZWN5Y2xlTGlzdGVuZXIge1xuICAgIC8qKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICB0aGlzLl9vblByb3h5Q29ubmVjdGVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25Qcm94eUNsb3NlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uU2VydmljZVN0YXJ0ZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblNlcnZpY2VFbmRlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uRXJyb3IgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25Qcm94eUNvbm5lY3RlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25Qcm94eUNvbm5lY3RlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25Qcm94eUNsb3NlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25Qcm94eUNsb3NlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25TZXJ2aWNlU3RhcnRlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25TZXJ2aWNlU3RhcnRlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25TZXJ2aWNlRW5kZWQgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX29uU2VydmljZUVuZGVkID0gbGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBzZXRPbkVycm9yIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9vbkVycm9yID0gbGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtMaWZlY3ljbGVNYW5hZ2VyfSBsaWZlY3ljbGVNYW5hZ2VyXG5cbiAgICAgKi9cbiAgICBvblByb3h5Q29ubmVjdGVkIChsaWZlY3ljbGVNYW5hZ2VyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25Qcm94eUNvbm5lY3RlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25Qcm94eUNvbm5lY3RlZChsaWZlY3ljbGVNYW5hZ2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TGlmZWN5Y2xlTWFuYWdlcn0gbGlmZWN5Y2xlTWFuYWdlclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbmZvXG4gICAgICogQHBhcmFtIHtTZGxEaXNjb25uZWN0ZWRSZWFzb259IHJlYXNvblxuICAgICAqL1xuICAgIG9uUHJveHlDbG9zZWQgKGxpZmVjeWNsZU1hbmFnZXIsIGluZm8sIHJlYXNvbikge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uUHJveHlDbG9zZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uUHJveHlDbG9zZWQobGlmZWN5Y2xlTWFuYWdlciwgaW5mbywgcmVhc29uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICovXG4gICAgb25TZXJ2aWNlU3RhcnRlZCAoc2VydmljZVR5cGUsIHNlc3Npb25JRCwgY29ycmVsYXRpb25JRCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uRW5kZWROQUNLZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uU2VydmljZVN0YXJ0ZWQoc2VydmljZVR5cGUsIHNlc3Npb25JRCwgY29ycmVsYXRpb25JRCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqL1xuICAgIG9uU2VydmljZUVuZGVkIChzZXJ2aWNlVHlwZSkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uU2VydmljZUVuZGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vblNlcnZpY2VFbmRlZChzZXJ2aWNlVHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0xpZmVjeWNsZU1hbmFnZXJ9IGxpZmVjeWNsZU1hbmFnZXJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW5mb1xuICAgICAqL1xuICAgIG9uRXJyb3IgKGxpZmVjeWNsZU1hbmFnZXIsIGluZm8pIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vbkVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkVycm9yKGxpZmVjeWNsZU1hbmFnZXIsIGluZm8pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBMaWZlY3ljbGVMaXN0ZW5lciB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5jbGFzcyBFbnVtIHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGVtcHR5XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIGEgZ2l2ZW4gdmFsdWUgaWYgdGhlIHZhbHVlIGlzIGZvdW5kIHdpdGhpbiB0aGUga2V5OnZhbHVlIG1hcFxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCBpbiB0aGUgbWFwXG4gICAgKiBAcGFyYW0gbWFwIHtPYmplY3R9IC0gQW4gbWFwIG9mIHN0cmluZyBwcm9wZXJ0aWVzIHRvIHByaW1pdGl2ZSB2YWx1ZXNcbiAgICAqIEByZXR1cm4ge251bGx8U3RyaW5nfSAtIFJldHVybnMgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBfa2V5Rm9yVmFsdWUgKHZhbHVlLCBtYXApIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgICAgICAgICBpZiAobWFwW2tleV0gPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQSBtZXRob2QgZm9yIHN1YmNsYXNzZXMgdG8gaW1wbGVtZW50IHRoYXQgZG9lcyB3aGF0IF9rZXlGb3JWYWx1ZSBkb2VzXG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXRob2QgbXVzdCBiZSBvdmVycmlkZGVuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpZiB0aGUga2V5IGlzIGZvdW5kIHdpdGhpbiB0aGUga2V5OnZhbHVlIG1hcFxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCBpbiB0aGUgbWFwXG4gICAgKiBAcGFyYW0gbWFwIHtPYmplY3R9IC0gQW4gbWFwIG9mIHN0cmluZyBwcm9wZXJ0aWVzIHRvIHByaW1pdGl2ZSB2YWx1ZXNcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIF92YWx1ZUZvcktleSAoa2V5LCBtYXApIHtcbiAgICAgICAgcmV0dXJuIG1hcFtrZXldIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBBIG1ldGhvZCBmb3Igc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgdGhhdCBkb2VzIHdoYXQgX3ZhbHVlRm9yS2V5IGRvZXNcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21ldGhvZCBtdXN0IGJlIG92ZXJyaWRkZW4nKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IEVudW0gfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uL3V0aWwvRW51bS5qcyc7XG5cbmNsYXNzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzID0ge30pIHtcbiAgICAgICAgdGhpcy5faXNGb3JtYXRSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcnBjU3BlY1ZlcnNpb24gPSBudWxsO1xuICAgICAgICB0aGlzLl9wYXJhbWV0ZXJzID0gcGFyYW1ldGVycyB8fCB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAqL1xuICAgIGdldFBhcmFtZXRlcnMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyYW1ldGVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAgICAqIEByZXR1cm4geyp9XG4gICAgKi9cbiAgICBnZXRQYXJhbWV0ZXIgKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyYW1ldGVyc1trZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgICogQHJldHVybiB7UnBjU3RydWN0fVxuICAgICovXG4gICAgc2V0UGFyYW1ldGVyIChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3BhcmFtZXRlcnNba2V5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcmFtZXRlcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0Q2xhc3NcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAqL1xuICAgIGdldE9iamVjdCAodENsYXNzLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdE9iamVjdCh0Q2xhc3MsIHRoaXMuZ2V0UGFyYW1ldGVyKGtleSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdENsYXNzXG4gICAgKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gICAgKiBAcHJpdmF0ZVxuICAgICogQHJldHVybiB7bnVsbHxPYmplY3R9XG4gICAgKi9cbiAgICBfZm9ybWF0T2JqZWN0ICh0Q2xhc3MsIG9iaikge1xuICAgICAgICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChvYmouY29uc3RydWN0b3IgPT09IHRDbGFzcykge1xuICAgICAgICAgICAgLy8gaWYgdENsYXNzIGlzIFN0cmluZyBhbmQgb2JqIGlzIGEgU3RyaW5nLCB0aGlzIHNob3VsZCBleGVjdXRlXG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9IGVsc2UgaWYgKG9iai5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSB7IC8vIHRoaXMgY292ZXJzIHRoZSBFbnVtIGNhc2UgdG9vXG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9IGVsc2UgaWYgKG9iai5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAodENsYXNzLnByb3RvdHlwZSBpbnN0YW5jZW9mIFJwY1N0cnVjdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdENsYXNzKG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChvYmouY29uc3RydWN0b3IgPT09IEFycmF5KSB7XG4gICAgICAgICAgICBpZiAob2JqLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRBcnJheSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBvYmopIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0QXJyYXkucHVzaCh0aGlzLl9mb3JtYXRPYmplY3QodENsYXNzLCBpdGVtKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvdXRBcnJheTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRDbGFzc1xuICAgICogQHBhcmFtIHtPYmplY3R9IG9ialxuICAgICogQHBhcmFtIHtCb29sZWFufSBpc0FycmF5IChmYWxzZSlcbiAgICAqL1xuICAgIHZhbGlkYXRlVHlwZSAodENsYXNzLCBvYmosIGlzQXJyYXkgPSBmYWxzZSkge1xuICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqLm5hbWV9IG11c3QgYmUgYW4gYXJyYXkgY29udGFpbmluZyBpdGVtcyBvZiB0eXBlICR7dENsYXNzLm5hbWV9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBvYmopIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUodENsYXNzLCBpdGVtLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgKHRDbGFzcy5wcm90b3R5cGUgaW5zdGFuY2VvZiBFbnVtICYmIHRDbGFzcy5rZXlGb3JWYWx1ZShvYmopID09PSBudWxsKVxuICAgICAgICAgICAgfHwgKHRDbGFzcy5wcm90b3R5cGUgaW5zdGFuY2VvZiBScGNTdHJ1Y3QgJiYgb2JqICE9PSBudWxsICYmIG9iai5jb25zdHJ1Y3RvciAhPT0gdENsYXNzKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmoubmFtZX0gbXVzdCBiZSBvZiB0eXBlICR7dENsYXNzLm5hbWV9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7IFJwY1N0cnVjdCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbi8qKlxuICogQ29udGFpbnMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZ2lzdGVyZWQgYXBwbGljYXRpb24uXG4gKi9cbmNsYXNzIEFwcEluZm8gZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgZGlzcGxheWVkIGZvciB0aGUgbW9iaWxlIGFwcGxpY2F0aW9uIG9uIHRoZSBtb2JpbGUgZGV2aWNlIChjYW4gZGlmZmVyIGZyb20gdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBhcHAgbmFtZSBzZXQgaW4gdGhlIGluaXRpYWwgUkFJIHJlcXVlc3QpLlxuICAgICAqIEByZXR1cm4ge0FwcEluZm99XG4gICAgICovXG4gICAgc2V0QXBwRGlzcGxheU5hbWUgKG5hbWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXBwSW5mby5LRVlfQVBQX0RJU1BMQVlfTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRBcHBEaXNwbGF5TmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihBcHBJbmZvLktFWV9BUFBfRElTUExBWV9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBUaGUgQXBwQnVuZGxlSUQgb2YgYW4gaU9TIGFwcGxpY2F0aW9uIG9yIHBhY2thZ2UgbmFtZSBvZiB0aGUgQW5kcm9pZCBhcHBsaWNhdGlvbi4gVGhpc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzIEFwcCBMYXVuY2ggc3RyYXRlZ2llcyBmb3IgZWFjaCBwbGF0Zm9ybS5cbiAgICAgKiBAcmV0dXJuIHtBcHBJbmZvfVxuICAgICAqL1xuICAgIHNldEFwcEJ1bmRsZUlEIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBcHBJbmZvLktFWV9BUFBfQlVORExFX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRBcHBCdW5kbGVJRCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihBcHBJbmZvLktFWV9BUFBfQlVORExFX0lEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmVyc2lvbiAtIFJlcHJlc2VudHMgdGhlIGJ1aWxkIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgcGFydGljdWxhciBtb2JpbGUgYXBwLlxuICAgICAqIEByZXR1cm4ge0FwcEluZm99XG4gICAgICovXG4gICAgc2V0QXBwVmVyc2lvbiAodmVyc2lvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBcHBJbmZvLktFWV9BUFBfVkVSU0lPTiwgdmVyc2lvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRBcHBWZXJzaW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEFwcEluZm8uS0VZX0FQUF9WRVJTSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWNvbiAtIEEgZmlsZSByZWZlcmVuY2UgdG8gdGhlIGljb24gdXRpbGl6ZWQgYnkgdGhpcyBhcHAgKHNpbXBsaWZpZXMgdGhlIHByb2Nlc3Mgb2Ygc2V0dGluZyBhblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGljb24gZHVyaW5nIGFwcCByZWdpc3RyYXRpb24pLlxuICAgICAqIEByZXR1cm4ge0FwcEluZm99XG4gICAgICovXG4gICAgc2V0QXBwSWNvbiAoaWNvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBcHBJbmZvLktFWV9BUFBfSUNPTiwgaWNvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRBcHBJY29uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEFwcEluZm8uS0VZX0FQUF9JQ09OKTtcbiAgICB9XG59XG5cbkFwcEluZm8uS0VZX0FQUF9ESVNQTEFZX05BTUUgPSAnYXBwRGlzcGxheU5hbWUnO1xuQXBwSW5mby5LRVlfQVBQX0JVTkRMRV9JRCA9ICdhcHBCdW5kbGVJRCc7XG5BcHBJbmZvLktFWV9BUFBfVkVSU0lPTiA9ICdhcHBWZXJzaW9uJztcbkFwcEluZm8uS0VZX0FQUF9JQ09OID0gJ2FwcEljb24nO1xuXG5leHBvcnQgeyBBcHBJbmZvIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcblxuY2xhc3MgUkdCQ29sb3IgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSByZWRcbiAgICAgKiBAcmV0dXJuIHtSR0JDb2xvcn1cbiAgICAgKi9cbiAgICBzZXRSZWQgKHJlZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSR0JDb2xvci5LRVlfUkVELCByZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0UmVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJHQkNvbG9yLktFWV9SRUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBncmVlblxuICAgICAqIEByZXR1cm4ge1JHQkNvbG9yfVxuICAgICAqL1xuICAgIHNldEdyZWVuIChncmVlbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSR0JDb2xvci5LRVlfR1JFRU4sIGdyZWVuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEdyZWVuICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJHQkNvbG9yLktFWV9HUkVFTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGJsdWVcbiAgICAgKiBAcmV0dXJuIHtSR0JDb2xvcn1cbiAgICAgKi9cbiAgICBzZXRCbHVlIChibHVlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJHQkNvbG9yLktFWV9CTFVFLCBibHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEJsdWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUkdCQ29sb3IuS0VZX0JMVUUpO1xuICAgIH1cbn1cblxuUkdCQ29sb3IuS0VZX1JFRCA9ICdyZWQnO1xuUkdCQ29sb3IuS0VZX0dSRUVOID0gJ2dyZWVuJztcblJHQkNvbG9yLktFWV9CTFVFID0gJ2JsdWUnO1xuXG5leHBvcnQgeyBSR0JDb2xvciB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBSR0JDb2xvciB9IGZyb20gJy4vUkdCQ29sb3IuanMnO1xuXG4vKipcbiAqIEEgY29sb3Igc2NoZW1lIGZvciBhbGwgZGlzcGxheSBsYXlvdXQgdGVtcGxhdGVzLlxuICovXG5jbGFzcyBUZW1wbGF0ZUNvbG9yU2NoZW1lIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1JHQkNvbG9yfSBjb2xvciAtIFRoZSBwcmltYXJ5IFwiYWNjZW50XCIgY29sb3JcbiAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUNvbG9yU2NoZW1lfVxuICAgICAqL1xuICAgIHNldFByaW1hcnlDb2xvciAoY29sb3IpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoUkdCQ29sb3IsIGNvbG9yKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVGVtcGxhdGVDb2xvclNjaGVtZS5LRVlfUFJJTUFSWV9DT0xPUiwgY29sb3IpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtSR0JDb2xvcn1cbiAgICAgKi9cbiAgICBnZXRQcmltYXJ5Q29sb3IgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoUkdCQ29sb3IsIFRlbXBsYXRlQ29sb3JTY2hlbWUuS0VZX1BSSU1BUllfQ09MT1IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7UkdCQ29sb3J9IGNvbG9yIC0gVGhlIHNlY29uZGFyeSBcImFjY2VudFwiIGNvbG9yXG4gICAgICogQHJldHVybiB7VGVtcGxhdGVDb2xvclNjaGVtZX1cbiAgICAgKi9cbiAgICBzZXRTZWNvbmRhcnlDb2xvciAoY29sb3IpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoUkdCQ29sb3IsIGNvbG9yKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVGVtcGxhdGVDb2xvclNjaGVtZS5LRVlfU0VDT05EQVJZX0NPTE9SLCBjb2xvcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1JHQkNvbG9yfVxuICAgICAqL1xuICAgIGdldFNlY29uZGFyeUNvbG9yICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFJHQkNvbG9yLCBUZW1wbGF0ZUNvbG9yU2NoZW1lLktFWV9TRUNPTkRBUllfQ09MT1IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7UkdCQ29sb3J9IGNvbG9yIC0gVGhlIGNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICAgICogQHJldHVybiB7VGVtcGxhdGVDb2xvclNjaGVtZX1cbiAgICAgKi9cbiAgICBzZXRCYWNrZ3JvdW5kQ29sb3IgKGNvbG9yKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFJHQkNvbG9yLCBjb2xvcik7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFRlbXBsYXRlQ29sb3JTY2hlbWUuS0VZX0JBQ0tHUk9VTkRfQ09MT1IsIGNvbG9yKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7UkdCQ29sb3J9XG4gICAgICovXG4gICAgZ2V0QmFja2dyb3VuZENvbG9yICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFJHQkNvbG9yLCBUZW1wbGF0ZUNvbG9yU2NoZW1lLktFWV9CQUNLR1JPVU5EX0NPTE9SKTtcbiAgICB9XG59XG5cblRlbXBsYXRlQ29sb3JTY2hlbWUuS0VZX1BSSU1BUllfQ09MT1IgPSAncHJpbWFyeUNvbG9yJztcblRlbXBsYXRlQ29sb3JTY2hlbWUuS0VZX1NFQ09OREFSWV9DT0xPUiA9ICdzZWNvbmRhcnlDb2xvcic7XG5UZW1wbGF0ZUNvbG9yU2NoZW1lLktFWV9CQUNLR1JPVU5EX0NPTE9SID0gJ2JhY2tncm91bmRDb2xvcic7XG5cbmV4cG9ydCB7IFRlbXBsYXRlQ29sb3JTY2hlbWUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBsaW5raW5nIGZ1bmN0aW9uIG5hbWVzIHdpdGggZnVuY3Rpb24gSURzIGluIFNtYXJ0RGV2aWNlTGluayBwcm90b2NvbC4gQXNzdW1lcyBlbnVtZXJhdGlvbiBzdGFydHMgYXRcbiAqIHZhbHVlIDAuXG4gKiBAdHlwZWRlZiB7RW51bX0gRnVuY3Rpb25JRFxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgRnVuY3Rpb25JRCBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSRVNFUlZFRCAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuUkVTRVJWRUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUmVnaXN0ZXJBcHBJbnRlcmZhY2UgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlJlZ2lzdGVyQXBwSW50ZXJmYWNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVucmVnaXN0ZXJBcHBJbnRlcmZhY2UgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlVucmVnaXN0ZXJBcHBJbnRlcmZhY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU2V0R2xvYmFsUHJvcGVydGllcyAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuU2V0R2xvYmFsUHJvcGVydGllcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSZXNldEdsb2JhbFByb3BlcnRpZXMgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlJlc2V0R2xvYmFsUHJvcGVydGllcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBZGRDb21tYW5kICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5BZGRDb21tYW5kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERlbGV0ZUNvbW1hbmQgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkRlbGV0ZUNvbW1hbmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQWRkU3ViTWVudSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuQWRkU3ViTWVudTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBEZWxldGVTdWJNZW51ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5EZWxldGVTdWJNZW51O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENyZWF0ZUludGVyYWN0aW9uQ2hvaWNlU2V0ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5DcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQZXJmb3JtSW50ZXJhY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlBlcmZvcm1JbnRlcmFjdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBEZWxldGVJbnRlcmFjdGlvbkNob2ljZVNldCAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuRGVsZXRlSW50ZXJhY3Rpb25DaG9pY2VTZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQWxlcnQgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkFsZXJ0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNob3cgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlNob3c7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU3BlYWsgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlNwZWFrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNldE1lZGlhQ2xvY2tUaW1lciAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuU2V0TWVkaWFDbG9ja1RpbWVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBlcmZvcm1BdWRpb1Bhc3NUaHJ1ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5QZXJmb3JtQXVkaW9QYXNzVGhydTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFbmRBdWRpb1Bhc3NUaHJ1ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5FbmRBdWRpb1Bhc3NUaHJ1O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFN1YnNjcmliZUJ1dHRvbiAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuU3Vic2NyaWJlQnV0dG9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVuc3Vic2NyaWJlQnV0dG9uICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5VbnN1YnNjcmliZUJ1dHRvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTdWJzY3JpYmVWZWhpY2xlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuU3Vic2NyaWJlVmVoaWNsZURhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVW5zdWJzY3JpYmVWZWhpY2xlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBHZXRWZWhpY2xlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuR2V0VmVoaWNsZURhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUmVhZERJRCAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuUmVhZERJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBHZXREVENzICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5HZXREVENzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNjcm9sbGFibGVNZXNzYWdlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5TY3JvbGxhYmxlTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTbGlkZXIgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlNsaWRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTaG93Q29uc3RhbnRUQlQgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlNob3dDb25zdGFudFRCVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBbGVydE1hbmV1dmVyICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5BbGVydE1hbmV1dmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVwZGF0ZVR1cm5MaXN0ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5VcGRhdGVUdXJuTGlzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDaGFuZ2VSZWdpc3RyYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkNoYW5nZVJlZ2lzdHJhdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBHZW5lcmljUmVzcG9uc2UgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkdlbmVyaWNSZXNwb25zZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQdXRGaWxlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5QdXRGaWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERlbGV0ZUZpbGUgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkRlbGV0ZUZpbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTGlzdEZpbGVzICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5MaXN0RmlsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU2V0QXBwSWNvbiAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuU2V0QXBwSWNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTZXREaXNwbGF5TGF5b3V0ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5TZXREaXNwbGF5TGF5b3V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERpYWdub3N0aWNNZXNzYWdlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5EaWFnbm9zdGljTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTeXN0ZW1SZXF1ZXN0ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5TeXN0ZW1SZXF1ZXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNlbmRMb2NhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuU2VuZExvY2F0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERpYWxOdW1iZXIgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkRpYWxOdW1iZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQnV0dG9uUHJlc3MgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkJ1dHRvblByZXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEdldEludGVyaW9yVmVoaWNsZURhdGEgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkdldEludGVyaW9yVmVoaWNsZURhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU2V0SW50ZXJpb3JWZWhpY2xlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuU2V0SW50ZXJpb3JWZWhpY2xlRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBHZXRXYXlQb2ludHMgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkdldFdheVBvaW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTdWJzY3JpYmVXYXlQb2ludHMgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlN1YnNjcmliZVdheVBvaW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBVbnN1YnNjcmliZVdheVBvaW50cyAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuVW5zdWJzY3JpYmVXYXlQb2ludHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgR2V0U3lzdGVtQ2FwYWJpbGl0eSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuR2V0U3lzdGVtQ2FwYWJpbGl0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTZW5kSGFwdGljRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuU2VuZEhhcHRpY0RhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU2V0Q2xvdWRBcHBQcm9wZXJ0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5TZXRDbG91ZEFwcFByb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgR2V0Q2xvdWRBcHBQcm9wZXJ0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5HZXRDbG91ZEFwcFByb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUHVibGlzaEFwcFNlcnZpY2UgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlB1Ymxpc2hBcHBTZXJ2aWNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEdldEFwcFNlcnZpY2VEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5HZXRBcHBTZXJ2aWNlRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBHZXRGaWxlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5HZXRGaWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBlcmZvcm1BcHBTZXJ2aWNlSW50ZXJhY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLlBlcmZvcm1BcHBTZXJ2aWNlSW50ZXJhY3Rpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVW5wdWJsaXNoQXBwU2VydmljZSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuVW5wdWJsaXNoQXBwU2VydmljZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDYW5jZWxJbnRlcmFjdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuQ2FuY2VsSW50ZXJhY3Rpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ2xvc2VBcHBsaWNhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuQ2xvc2VBcHBsaWNhdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTaG93QXBwTWVudSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuU2hvd0FwcE1lbnU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ3JlYXRlV2luZG93ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5DcmVhdGVXaW5kb3c7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRGVsZXRlV2luZG93ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5EZWxldGVXaW5kb3c7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnQgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLkdldEludGVyaW9yVmVoaWNsZURhdGFDb25zZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJlbGVhc2VJbnRlcmlvclZlaGljbGVEYXRhTW9kdWxlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5SZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBPbkhNSVN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuT25ITUlTdGF0dXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgT25BcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWQgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLk9uQXBwSW50ZXJmYWNlVW5yZWdpc3RlcmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9uQnV0dG9uRXZlbnQgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLk9uQnV0dG9uRXZlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgT25CdXR0b25QcmVzcyAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuT25CdXR0b25QcmVzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBPblZlaGljbGVEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5PblZlaGljbGVEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9uQ29tbWFuZCAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuT25Db21tYW5kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9uVEJUQ2xpZW50U3RhdGUgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLk9uVEJUQ2xpZW50U3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgT25Ecml2ZXJEaXN0cmFjdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuT25Ecml2ZXJEaXN0cmFjdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBPblBlcm1pc3Npb25zQ2hhbmdlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5PblBlcm1pc3Npb25zQ2hhbmdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9uQXVkaW9QYXNzVGhydSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuT25BdWRpb1Bhc3NUaHJ1O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9uTGFuZ3VhZ2VDaGFuZ2UgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLk9uTGFuZ3VhZ2VDaGFuZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgT25LZXlib2FyZElucHV0ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5PbktleWJvYXJkSW5wdXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgT25Ub3VjaEV2ZW50ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5PblRvdWNoRXZlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgT25TeXN0ZW1SZXF1ZXN0ICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5PblN5c3RlbVJlcXVlc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgT25IYXNoQ2hhbmdlICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5Pbkhhc2hDaGFuZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgT25JbnRlcmlvclZlaGljbGVEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5PbkludGVyaW9yVmVoaWNsZURhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgT25XYXlQb2ludENoYW5nZSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuT25XYXlQb2ludENoYW5nZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBPblJDU3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5PblJDU3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9uQXBwU2VydmljZURhdGEgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLk9uQXBwU2VydmljZURhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgT25TeXN0ZW1DYXBhYmlsaXR5VXBkYXRlZCAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuT25TeXN0ZW1DYXBhYmlsaXR5VXBkYXRlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFbmNvZGVkU3luY1BEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5FbmNvZGVkU3luY1BEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNkbFBEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSUQuX01BUC5TZGxQRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBPbkVuY29kZWRTeW5jUERhdGEgKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fTUFQLk9uRW5jb2RlZFN5bmNQRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBPblN5bmNQRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbklELl9NQVAuT25TeW5jUERhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fdmFsdWVGb3JLZXkoa2V5LCBGdW5jdGlvbklELl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JRC5fa2V5Rm9yVmFsdWUodmFsdWUsIEZ1bmN0aW9uSUQuX01BUCk7XG4gICAgfVxufVxuXG5GdW5jdGlvbklELl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnUkVTRVJWRUQnOiAwLFxuICAgICdSZWdpc3RlckFwcEludGVyZmFjZSc6IDB4MDEsXG4gICAgJ1VucmVnaXN0ZXJBcHBJbnRlcmZhY2UnOiAweDAyLFxuICAgICdTZXRHbG9iYWxQcm9wZXJ0aWVzJzogMHgwMyxcbiAgICAnUmVzZXRHbG9iYWxQcm9wZXJ0aWVzJzogMHgwNCxcbiAgICAnQWRkQ29tbWFuZCc6IDB4MDUsXG4gICAgJ0RlbGV0ZUNvbW1hbmQnOiAweDA2LFxuICAgICdBZGRTdWJNZW51JzogMHgwNyxcbiAgICAnRGVsZXRlU3ViTWVudSc6IDB4MDgsXG4gICAgJ0NyZWF0ZUludGVyYWN0aW9uQ2hvaWNlU2V0JzogMHgwOSxcbiAgICAnUGVyZm9ybUludGVyYWN0aW9uJzogMHgwQSxcbiAgICAnRGVsZXRlSW50ZXJhY3Rpb25DaG9pY2VTZXQnOiAweDBCLFxuICAgICdBbGVydCc6IDB4MEMsXG4gICAgJ1Nob3cnOiAweDBELFxuICAgICdTcGVhayc6IDB4MEUsXG4gICAgJ1NldE1lZGlhQ2xvY2tUaW1lcic6IDB4MEYsXG4gICAgJ1BlcmZvcm1BdWRpb1Bhc3NUaHJ1JzogMHgxMCxcbiAgICAnRW5kQXVkaW9QYXNzVGhydSc6IDB4MTEsXG4gICAgJ1N1YnNjcmliZUJ1dHRvbic6IDB4MTIsXG4gICAgJ1Vuc3Vic2NyaWJlQnV0dG9uJzogMHgxMyxcbiAgICAnU3Vic2NyaWJlVmVoaWNsZURhdGEnOiAweDE0LFxuICAgICdVbnN1YnNjcmliZVZlaGljbGVEYXRhJzogMHgxNSxcbiAgICAnR2V0VmVoaWNsZURhdGEnOiAweDE2LFxuICAgICdSZWFkRElEJzogMHgxNyxcbiAgICAnR2V0RFRDcyc6IDB4MTgsXG4gICAgJ1Njcm9sbGFibGVNZXNzYWdlJzogMHgxOSxcbiAgICAnU2xpZGVyJzogMHgxQSxcbiAgICAnU2hvd0NvbnN0YW50VEJUJzogMHgxQixcbiAgICAnQWxlcnRNYW5ldXZlcic6IDB4MUMsXG4gICAgJ1VwZGF0ZVR1cm5MaXN0JzogMHgxRCxcbiAgICAnQ2hhbmdlUmVnaXN0cmF0aW9uJzogMHgxRSxcbiAgICAnR2VuZXJpY1Jlc3BvbnNlJzogMHgxRixcbiAgICAnUHV0RmlsZSc6IDB4MjAsXG4gICAgJ0RlbGV0ZUZpbGUnOiAweDIxLFxuICAgICdMaXN0RmlsZXMnOiAweDIyLFxuICAgICdTZXRBcHBJY29uJzogMHgyMyxcbiAgICAnU2V0RGlzcGxheUxheW91dCc6IDB4MjQsXG4gICAgJ0RpYWdub3N0aWNNZXNzYWdlJzogMHgyNSxcbiAgICAnU3lzdGVtUmVxdWVzdCc6IDB4MjYsXG4gICAgJ1NlbmRMb2NhdGlvbic6IDB4MjcsXG4gICAgJ0RpYWxOdW1iZXInOiAweDI4LFxuICAgICdCdXR0b25QcmVzcyc6IDB4MjksXG4gICAgJ0dldEludGVyaW9yVmVoaWNsZURhdGEnOiAweDJCLFxuICAgICdTZXRJbnRlcmlvclZlaGljbGVEYXRhJzogMHgyQyxcbiAgICAnR2V0V2F5UG9pbnRzJzogMHgyRCxcbiAgICAnU3Vic2NyaWJlV2F5UG9pbnRzJzogMHgyRSxcbiAgICAnVW5zdWJzY3JpYmVXYXlQb2ludHMnOiAweDJGLFxuICAgICdHZXRTeXN0ZW1DYXBhYmlsaXR5JzogMHgzMCxcbiAgICAnU2VuZEhhcHRpY0RhdGEnOiAweDMxLFxuICAgICdTZXRDbG91ZEFwcFByb3BlcnRpZXMnOiAweDMyLFxuICAgICdHZXRDbG91ZEFwcFByb3BlcnRpZXMnOiAweDMzLFxuICAgICdQdWJsaXNoQXBwU2VydmljZSc6IDB4MzQsXG4gICAgJ0dldEFwcFNlcnZpY2VEYXRhJzogMHgzNSxcbiAgICAnR2V0RmlsZSc6IDB4MzYsXG4gICAgJ1BlcmZvcm1BcHBTZXJ2aWNlSW50ZXJhY3Rpb24nOiAweDM3LFxuICAgICdVbnB1Ymxpc2hBcHBTZXJ2aWNlJzogMHgzOCxcbiAgICAnQ2FuY2VsSW50ZXJhY3Rpb24nOiAweDM5LFxuICAgICdDbG9zZUFwcGxpY2F0aW9uJzogMHgzQSxcbiAgICAnU2hvd0FwcE1lbnUnOiAweDNCLFxuICAgICdDcmVhdGVXaW5kb3cnOiAweDNDLFxuICAgICdEZWxldGVXaW5kb3cnOiAweDNELFxuICAgICdHZXRJbnRlcmlvclZlaGljbGVEYXRhQ29uc2VudCc6IDB4M0UsXG4gICAgJ1JlbGVhc2VJbnRlcmlvclZlaGljbGVEYXRhTW9kdWxlJzogMHgzRixcbiAgICAnT25ITUlTdGF0dXMnOiAweDgwMDAsXG4gICAgJ09uQXBwSW50ZXJmYWNlVW5yZWdpc3RlcmVkJzogMHg4MDAxLFxuICAgICdPbkJ1dHRvbkV2ZW50JzogMHg4MDAyLFxuICAgICdPbkJ1dHRvblByZXNzJzogMHg4MDAzLFxuICAgICdPblZlaGljbGVEYXRhJzogMHg4MDA0LFxuICAgICdPbkNvbW1hbmQnOiAweDgwMDUsXG4gICAgJ09uVEJUQ2xpZW50U3RhdGUnOiAweDgwMDYsXG4gICAgJ09uRHJpdmVyRGlzdHJhY3Rpb24nOiAweDgwMDcsXG4gICAgJ09uUGVybWlzc2lvbnNDaGFuZ2UnOiAweDgwMDgsXG4gICAgJ09uQXVkaW9QYXNzVGhydSc6IDB4ODAwOSxcbiAgICAnT25MYW5ndWFnZUNoYW5nZSc6IDB4ODAwQSxcbiAgICAnT25LZXlib2FyZElucHV0JzogMHg4MDBCLFxuICAgICdPblRvdWNoRXZlbnQnOiAweDgwMEMsXG4gICAgJ09uU3lzdGVtUmVxdWVzdCc6IDB4ODAwRCxcbiAgICAnT25IYXNoQ2hhbmdlJzogMHg4MDBFLFxuICAgICdPbkludGVyaW9yVmVoaWNsZURhdGEnOiAweDgwMEYsXG4gICAgJ09uV2F5UG9pbnRDaGFuZ2UnOiAweDgwMTAsXG4gICAgJ09uUkNTdGF0dXMnOiAweDgwMTEsXG4gICAgJ09uQXBwU2VydmljZURhdGEnOiAweDgwMTIsXG4gICAgJ09uU3lzdGVtQ2FwYWJpbGl0eVVwZGF0ZWQnOiAweDgwMTMsXG4gICAgJ0VuY29kZWRTeW5jUERhdGEnOiAweDEwMDAwLFxuICAgICdTeW5jUERhdGEnOiAweDEwMDAxLFxuICAgICdPbkVuY29kZWRTeW5jUERhdGEnOiAweDE4MDAwLFxuICAgICdPblN5bmNQRGF0YSc6IDB4MTgwMDEsXG59KTtcblxuZXhwb3J0IHsgRnVuY3Rpb25JRCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBUVFMgY2FwYWJpbGl0aWVzLlxuICogQHR5cGVkZWYge0VudW19IFNwZWVjaENhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgU3BlZWNoQ2FwYWJpbGl0aWVzIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNDX1RFWFQgKCkge1xuICAgICAgICByZXR1cm4gU3BlZWNoQ2FwYWJpbGl0aWVzLl9NQVAuU0NfVEVYVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTQVBJX1BIT05FTUVTICgpIHtcbiAgICAgICAgcmV0dXJuIFNwZWVjaENhcGFiaWxpdGllcy5fTUFQLlNBUElfUEhPTkVNRVM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTEhQTFVTX1BIT05FTUVTICgpIHtcbiAgICAgICAgcmV0dXJuIFNwZWVjaENhcGFiaWxpdGllcy5fTUFQLkxIUExVU19QSE9ORU1FUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQUkVfUkVDT1JERUQgKCkge1xuICAgICAgICByZXR1cm4gU3BlZWNoQ2FwYWJpbGl0aWVzLl9NQVAuUFJFX1JFQ09SREVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNJTEVOQ0UgKCkge1xuICAgICAgICByZXR1cm4gU3BlZWNoQ2FwYWJpbGl0aWVzLl9NQVAuU0lMRU5DRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGSUxFICgpIHtcbiAgICAgICAgcmV0dXJuIFNwZWVjaENhcGFiaWxpdGllcy5fTUFQLkZJTEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gU3BlZWNoQ2FwYWJpbGl0aWVzLl92YWx1ZUZvcktleShrZXksIFNwZWVjaENhcGFiaWxpdGllcy5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFNwZWVjaENhcGFiaWxpdGllcy5fa2V5Rm9yVmFsdWUodmFsdWUsIFNwZWVjaENhcGFiaWxpdGllcy5fTUFQKTtcbiAgICB9XG59XG5cblNwZWVjaENhcGFiaWxpdGllcy5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ1NDX1RFWFQnOiAnVEVYVCcsXG4gICAgJ1NBUElfUEhPTkVNRVMnOiAnU0FQSV9QSE9ORU1FUycsXG4gICAgJ0xIUExVU19QSE9ORU1FUyc6ICdMSFBMVVNfUEhPTkVNRVMnLFxuICAgICdQUkVfUkVDT1JERUQnOiAnUFJFX1JFQ09SREVEJyxcbiAgICAnU0lMRU5DRSc6ICdTSUxFTkNFJyxcbiAgICAnRklMRSc6ICdGSUxFJyxcbn0pO1xuXG5leHBvcnQgeyBTcGVlY2hDYXBhYmlsaXRpZXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgU3BlZWNoQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vZW51bXMvU3BlZWNoQ2FwYWJpbGl0aWVzLmpzJztcblxuLyoqXG4gKiBBIFRUUyBjaHVuaywgdGhhdCBjb25zaXN0cyBvZiB0ZXh0L3Bob25lbWVzIHRvIHNwZWFrIG9yIHRoZSBuYW1lIG9mIGEgZmlsZSB0byBwbGF5LCBhbmQgYSBUVFMgdHlwZSAobGlrZSB0ZXh0IG9yXG4gKiBTQVBJKVxuICovXG5jbGFzcyBUVFNDaHVuayBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgLSBUaGUgdGV4dCBvciBwaG9uZW1lcyB0byBzcGVhaywgb3IgdGhlIG5hbWUgb2YgdGhlIGF1ZGlvIGZpbGUgdG8gcGxheS4gTWF5IG5vdCBiZSBlbXB0eS5cbiAgICAgKiBAcmV0dXJuIHtUVFNDaHVua31cbiAgICAgKi9cbiAgICBzZXRUZXh0ICh0ZXh0KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFRUU0NodW5rLktFWV9URVhULCB0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFRleHQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVFRTQ2h1bmsuS0VZX1RFWFQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3BlZWNoQ2FwYWJpbGl0aWVzfSB0eXBlIC0gRGVzY3JpYmVzIHdoZXRoZXIgdGhlIFRUUyBjaHVuayBpcyBwbGFpbiB0ZXh0LCBhIHNwZWNpZmljIHBob25lbWUgc2V0LCBvciBhblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gZmlsZS4gU2VlIFNwZWVjaENhcGFiaWxpdGllc1xuICAgICAqIEByZXR1cm4ge1RUU0NodW5rfVxuICAgICAqL1xuICAgIHNldFR5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU3BlZWNoQ2FwYWJpbGl0aWVzLCB0eXBlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVFRTQ2h1bmsuS0VZX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTcGVlY2hDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgZ2V0VHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTcGVlY2hDYXBhYmlsaXRpZXMsIFRUU0NodW5rLktFWV9UWVBFKTtcbiAgICB9XG59XG5cblRUU0NodW5rLktFWV9URVhUID0gJ3RleHQnO1xuVFRTQ2h1bmsuS0VZX1RZUEUgPSAndHlwZSc7XG5cbmV4cG9ydCB7IFRUU0NodW5rIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBTbWFydERldmljZUxpbmsgcHJvdG9jb2wgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIG1vYmlsZSBhcHBsaWNhdGlvblxuICovXG5jbGFzcyBTZGxNc2dWZXJzaW9uIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdmVyc2lvbiAtIFRoZSBtYWpvciB2ZXJzaW9uIGluZGljYXRlcyB2ZXJzaW9ucyB0aGF0IGlzIG5vdC1jb21wYXRpYmxlIHRvIHByZXZpb3VzIHZlcnNpb25zLlxuICAgICAqIEByZXR1cm4ge1NkbE1zZ1ZlcnNpb259XG4gICAgICovXG4gICAgc2V0TWFqb3JWZXJzaW9uICh2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNkbE1zZ1ZlcnNpb24uS0VZX01BSk9SX1ZFUlNJT04sIHZlcnNpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0TWFqb3JWZXJzaW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNkbE1zZ1ZlcnNpb24uS0VZX01BSk9SX1ZFUlNJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2ZXJzaW9uIC0gVGhlIG1pbm9yIHZlcnNpb24gaW5kaWNhdGVzIGEgY2hhbmdlIHRvIGEgcHJldmlvdXMgdmVyc2lvbiB0aGF0IHNob3VsZCBzdGlsbCBhbGxvdyB0b1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcnVuIG9uIGFuIG9sZGVyIHZlcnNpb24gKHdpdGggbGltaXRlZCBmdW5jdGlvbmFsaXR5KVxuICAgICAqIEByZXR1cm4ge1NkbE1zZ1ZlcnNpb259XG4gICAgICovXG4gICAgc2V0TWlub3JWZXJzaW9uICh2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNkbE1zZ1ZlcnNpb24uS0VZX01JTk9SX1ZFUlNJT04sIHZlcnNpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0TWlub3JWZXJzaW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNkbE1zZ1ZlcnNpb24uS0VZX01JTk9SX1ZFUlNJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2ZXJzaW9uIC0gVGhlIHBhdGNoIHZlcnNpb24gaW5kaWNhdGVzIGEgZml4IHRvIGV4aXN0aW5nIGZ1bmN0aW9uYWxpdHkgaW4gYSBwcmV2aW91cyB2ZXJzaW9uIHRoYXRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBzdGlsbCBiZSBhYmxlIHRvIGJlIHJ1biBvbiBhbiBvbGRlciB2ZXJzaW9uXG4gICAgICogQHJldHVybiB7U2RsTXNnVmVyc2lvbn1cbiAgICAgKi9cbiAgICBzZXRQYXRjaFZlcnNpb24gKHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2RsTXNnVmVyc2lvbi5LRVlfUEFUQ0hfVkVSU0lPTiwgdmVyc2lvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRQYXRjaFZlcnNpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2RsTXNnVmVyc2lvbi5LRVlfUEFUQ0hfVkVSU0lPTik7XG4gICAgfVxufVxuXG5TZGxNc2dWZXJzaW9uLktFWV9NQUpPUl9WRVJTSU9OID0gJ21ham9yVmVyc2lvbic7XG5TZGxNc2dWZXJzaW9uLktFWV9NSU5PUl9WRVJTSU9OID0gJ21pbm9yVmVyc2lvbic7XG5TZGxNc2dWZXJzaW9uLktFWV9QQVRDSF9WRVJTSU9OID0gJ3BhdGNoVmVyc2lvbic7XG5cbmV4cG9ydCB7IFNkbE1zZ1ZlcnNpb24gfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBsaXN0aW5nIHBvc3NpYmxlIGFwcCB0eXBlcy5cbiAqIEB0eXBlZGVmIHtFbnVtfSBBcHBITUlUeXBlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBBcHBITUlUeXBlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERFRkFVTFQgKCkge1xuICAgICAgICByZXR1cm4gQXBwSE1JVHlwZS5fTUFQLkRFRkFVTFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ09NTVVOSUNBVElPTiAoKSB7XG4gICAgICAgIHJldHVybiBBcHBITUlUeXBlLl9NQVAuQ09NTVVOSUNBVElPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBNRURJQSAoKSB7XG4gICAgICAgIHJldHVybiBBcHBITUlUeXBlLl9NQVAuTUVESUE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTUVTU0FHSU5HICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEhNSVR5cGUuX01BUC5NRVNTQUdJTkc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkFWSUdBVElPTiAoKSB7XG4gICAgICAgIHJldHVybiBBcHBITUlUeXBlLl9NQVAuTkFWSUdBVElPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBJTkZPUk1BVElPTiAoKSB7XG4gICAgICAgIHJldHVybiBBcHBITUlUeXBlLl9NQVAuSU5GT1JNQVRJT047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU09DSUFMICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEhNSVR5cGUuX01BUC5TT0NJQUw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQkFDS0dST1VORF9QUk9DRVNTICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEhNSVR5cGUuX01BUC5CQUNLR1JPVU5EX1BST0NFU1M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVEVTVElORyAoKSB7XG4gICAgICAgIHJldHVybiBBcHBITUlUeXBlLl9NQVAuVEVTVElORztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTWVNURU0gKCkge1xuICAgICAgICByZXR1cm4gQXBwSE1JVHlwZS5fTUFQLlNZU1RFTTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQUk9KRUNUSU9OICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEhNSVR5cGUuX01BUC5QUk9KRUNUSU9OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJFTU9URV9DT05UUk9MICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEhNSVR5cGUuX01BUC5SRU1PVEVfQ09OVFJPTDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBBcHBITUlUeXBlLl92YWx1ZUZvcktleShrZXksIEFwcEhNSVR5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBBcHBITUlUeXBlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgQXBwSE1JVHlwZS5fTUFQKTtcbiAgICB9XG59XG5cbkFwcEhNSVR5cGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdERUZBVUxUJzogJ0RFRkFVTFQnLFxuICAgICdDT01NVU5JQ0FUSU9OJzogJ0NPTU1VTklDQVRJT04nLFxuICAgICdNRURJQSc6ICdNRURJQScsXG4gICAgJ01FU1NBR0lORyc6ICdNRVNTQUdJTkcnLFxuICAgICdOQVZJR0FUSU9OJzogJ05BVklHQVRJT04nLFxuICAgICdJTkZPUk1BVElPTic6ICdJTkZPUk1BVElPTicsXG4gICAgJ1NPQ0lBTCc6ICdTT0NJQUwnLFxuICAgICdCQUNLR1JPVU5EX1BST0NFU1MnOiAnQkFDS0dST1VORF9QUk9DRVNTJyxcbiAgICAnVEVTVElORyc6ICdURVNUSU5HJyxcbiAgICAnU1lTVEVNJzogJ1NZU1RFTScsXG4gICAgJ1BST0pFQ1RJT04nOiAnUFJPSkVDVElPTicsXG4gICAgJ1JFTU9URV9DT05UUk9MJzogJ1JFTU9URV9DT05UUk9MJyxcbn0pO1xuXG5leHBvcnQgeyBBcHBITUlUeXBlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IExhbmd1YWdlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBMYW5ndWFnZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmdsaXNoIC0gVVNcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFTl9VUyAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkVOX1VTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNwYW5pc2ggLSBNZXhpY29cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFU19NWCAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkVTX01YO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZyZW5jaCAtIENhbmFkYVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZSX0NBICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuRlJfQ0E7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VybWFuIC0gR2VybWFueVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERFX0RFICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuREVfREU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3BhbmlzaCAtIFNwYWluXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRVNfRVMgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5FU19FUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmdsaXNoIC0gR0JcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFTl9HQiAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkVOX0dCO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1c3NpYW4gLSBSdXNzaWFcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSVV9SVSAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLlJVX1JVO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFR1cmtpc2ggLSBUdXJrZXlcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBUUl9UUiAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLlRSX1RSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBvbGlzaCAtIFBvbGFuZFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBMX1BMICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuUExfUEw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnJlbmNoIC0gRnJhbmNlXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRlJfRlIgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5GUl9GUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGFsaWFuIC0gSXRhbHlcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBJVF9JVCAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLklUX0lUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN3ZWRpc2ggLSBTd2VkZW5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTVl9TRSAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLlNWX1NFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBvcnR1Z3Vlc2UgLSBQb3J0dWdhbFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBUX1BUICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuUFRfUFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHV0Y2ggKFN0YW5kYXJkKSAtIE5ldGhlcmxhbmRzXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkxfTkwgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5OTF9OTDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmdsaXNoIC0gQXVzdHJhbGlhXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRU5fQVUgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5FTl9BVTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5kYXJpbiAtIENoaW5hXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgWkhfQ04gKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5aSF9DTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5kYXJpbiAtIFRhaXdhblxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFpIX1RXICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuWkhfVFc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSmFwYW5lc2UgLSBKYXBhblxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEpBX0pQICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuSkFfSlA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXJhYmljIC0gU2F1ZGkgQXJhYmlhXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQVJfU0EgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5BUl9TQTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBLb3JlYW4gLSBTb3V0aCBLb3JlYVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEtPX0tSICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuS09fS1I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUG9ydHVndWVzZSAtIEJyYXppbFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBUX0JSICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuUFRfQlI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3plY2ggLSBDemVjaCBSZXB1YmxpY1xuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENTX0NaICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuQ1NfQ1o7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGFuaXNoIC0gRGVubWFya1xuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERBX0RLICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuREFfREs7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9yd2VnaWFuIC0gTm9yd2F5XG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTk9fTk8gKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5OT19OTztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEdXRjaCAoRmxlbWlzaCkgLSBCZWxnaXVtXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkxfQkUgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5OTF9CRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHcmVlayAtIEdyZWVjZVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEVMX0dSICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuRUxfR1I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSHVuZ2FyaWFuIC0gSHVuZ2FyeVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEhVX0hVICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuSFVfSFU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlubmlzaCAtIEZpbmxhbmRcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGSV9GSSAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkZJX0ZJO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNsb3ZhayAtIFNsb3Zha2lhXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU0tfU0sgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5TS19TSztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmdsaXNoIC0gSW5kaWFcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFTl9JTiAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkVOX0lOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoYWkgLSBUaGFpbGFuZFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRIX1RIICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuVEhfVEg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5nbGlzaCAtIE1pZGRsZSBFYXN0XG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRU5fU0EgKCkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX01BUC5FTl9TQTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWJyZXcgLSBJc3JhZWxcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBIRV9JTCAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkhFX0lMO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvbWFuaWFuIC0gUm9tYW5pYVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJPX1JPICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuUk9fUk87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVWtyYWluaWFuIC0gVWtyYWluZVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVLX1VBICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuVUtfVUE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kb25lc2lhbiAtIEluZG9uZXNpYVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IElEX0lEICgpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl9NQVAuSURfSUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmlldG5hbWVzZSAtIFZpZXRuYW1cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWSV9WTiAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLlZJX1ZOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbGF5IC0gTWFsYXlzaWFcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBNU19NWSAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLk1TX01ZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhpbmRpIC0gSW5kaWFcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBISV9JTiAoKSB7XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5fTUFQLkhJX0lOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIExhbmd1YWdlLl92YWx1ZUZvcktleShrZXksIExhbmd1YWdlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuX2tleUZvclZhbHVlKHZhbHVlLCBMYW5ndWFnZS5fTUFQKTtcbiAgICB9XG59XG5cbkxhbmd1YWdlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnRU5fVVMnOiAnRU4tVVMnLFxuICAgICdFU19NWCc6ICdFUy1NWCcsXG4gICAgJ0ZSX0NBJzogJ0ZSLUNBJyxcbiAgICAnREVfREUnOiAnREUtREUnLFxuICAgICdFU19FUyc6ICdFUy1FUycsXG4gICAgJ0VOX0dCJzogJ0VOLUdCJyxcbiAgICAnUlVfUlUnOiAnUlUtUlUnLFxuICAgICdUUl9UUic6ICdUUi1UUicsXG4gICAgJ1BMX1BMJzogJ1BMLVBMJyxcbiAgICAnRlJfRlInOiAnRlItRlInLFxuICAgICdJVF9JVCc6ICdJVC1JVCcsXG4gICAgJ1NWX1NFJzogJ1NWLVNFJyxcbiAgICAnUFRfUFQnOiAnUFQtUFQnLFxuICAgICdOTF9OTCc6ICdOTC1OTCcsXG4gICAgJ0VOX0FVJzogJ0VOLUFVJyxcbiAgICAnWkhfQ04nOiAnWkgtQ04nLFxuICAgICdaSF9UVyc6ICdaSC1UVycsXG4gICAgJ0pBX0pQJzogJ0pBLUpQJyxcbiAgICAnQVJfU0EnOiAnQVItU0EnLFxuICAgICdLT19LUic6ICdLTy1LUicsXG4gICAgJ1BUX0JSJzogJ1BULUJSJyxcbiAgICAnQ1NfQ1onOiAnQ1MtQ1onLFxuICAgICdEQV9ESyc6ICdEQS1ESycsXG4gICAgJ05PX05PJzogJ05PLU5PJyxcbiAgICAnTkxfQkUnOiAnTkwtQkUnLFxuICAgICdFTF9HUic6ICdFTC1HUicsXG4gICAgJ0hVX0hVJzogJ0hVLUhVJyxcbiAgICAnRklfRkknOiAnRkktRkknLFxuICAgICdTS19TSyc6ICdTSy1TSycsXG4gICAgJ0VOX0lOJzogJ0VOLUlOJyxcbiAgICAnVEhfVEgnOiAnVEgtVEgnLFxuICAgICdFTl9TQSc6ICdFTi1TQScsXG4gICAgJ0hFX0lMJzogJ0hFLUlMJyxcbiAgICAnUk9fUk8nOiAnUk8tUk8nLFxuICAgICdVS19VQSc6ICdVSy1VQScsXG4gICAgJ0lEX0lEJzogJ0lELUlEJyxcbiAgICAnVklfVk4nOiAnVkktVk4nLFxuICAgICdNU19NWSc6ICdNUy1NWScsXG4gICAgJ0hJX0lOJzogJ0hJLUlOJyxcbn0pO1xuXG5leHBvcnQgeyBMYW5ndWFnZSB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBScGNNZXNzYWdlXG4gKiBAcHJvcGVydHkge1JwY1R5cGV9IHJwY1R5cGVcbiAqL1xuY2xhc3MgUnBjTWVzc2FnZSBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLypcbiAgICB7XG4gICAgICAgIFwicnBjVHlwZVwiOiBcIlJlcXVlc3RcIixcbiAgICAgICAgXCJmdW5jdGlvbk5hbWVcIjogXCJSZWdpc3RlckFwcEludGVyZmFjZVwiLFxuICAgICAgICBcImNvb3JlbGF0aW9uSURcIjogXCIzMjA5NDhcIixcbiAgICAgICAgXCJpc0VuY3J5cHRlZFwiOiBmYWxzZSxcbiAgICAgICAgXCJwYXJhbWV0ZXJzXCI6IHtcbiAgICAgICAgICAgIFwiYXBwTmFtZVwiOiBcIkhlbGxvXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJidWxrRGF0YVwiOiBcIi4uLlwiLFxuICAgIH1cbiAgICAqL1xuXG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHN0b3JlLnBhcmFtZXRlcnMpO1xuICAgICAgICB0aGlzLl9pc0VuY3J5cHRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9ycGNUeXBlID0gc3RvcmUucnBjVHlwZTtcbiAgICAgICAgdGhpcy5fZnVuY3Rpb25OYW1lID0gc3RvcmUuZnVuY3Rpb25OYW1lO1xuICAgICAgICB0aGlzLl9jb3JyZWxhdGlvbklEID0gc3RvcmUuY29ycmVsYXRpb25JRDtcbiAgICAgICAgdGhpcy5zZXRCdWxrRGF0YShzdG9yZS5idWxrRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtScGNUeXBlfVxuICAgICovXG4gICAgZ2V0UlBDVHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ycGNUeXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtScGNUeXBlfSB0eXBlXG4gICAgKiBAcmV0dXJuIHtScGNNZXNzYWdlfVxuICAgICovXG4gICAgc2V0UlBDVHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLl9ycGNUeXBlID0gdHlwZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0Z1bmN0aW9uSUR9IHR5cGVcbiAgICAqL1xuICAgIGdldEZ1bmN0aW9uTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mdW5jdGlvbk5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Z1bmN0aW9uSUR9IG5hbWVcbiAgICAqIEByZXR1cm4ge1JwY01lc3NhZ2V9XG4gICAgKi9cbiAgICBzZXRGdW5jdGlvbk5hbWUgKG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5fZnVuY3Rpb25OYW1lID0gRnVuY3Rpb25JRC5rZXlGb3JWYWx1ZShuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2Z1bmN0aW9uTmFtZSA9IG5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ30gdHlwZVxuICAgICovXG4gICAgZ2V0Q29ycmVsYXRpb25JZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3JyZWxhdGlvbklEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAqIEByZXR1cm4ge1JwY01lc3NhZ2V9XG4gICAgKi9cbiAgICBzZXRDb3JyZWxhdGlvbklkIChpZCkge1xuICAgICAgICB0aGlzLl9jb3JyZWxhdGlvbklEID0gaWQ7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtVaW50OEFycmF5fSBkYXRhXG4gICAgKi9cbiAgICBnZXRCdWxrRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWxrRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7VUludDhBcnJheX0gZGF0YVxuICAgICogQHJldHVybiB7UnBjTWVzc2FnZX1cbiAgICAqL1xuICAgIHNldEJ1bGtEYXRhIChkYXRhID0gbnVsbCkge1xuICAgICAgICBpZiAoZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fYnVsa0RhdGEgPSBkYXRhLnNsaWNlKDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYnVsa0RhdGEgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICovXG4gICAgZ2V0SXNFbmNyeXB0ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNFbmNyeXB0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJvb2xcbiAgICAqIEByZXR1cm4ge1JwY01lc3NhZ2V9XG4gICAgKi9cbiAgICBzZXRJc0VuY3J5cHRlZCAoYm9vbCkge1xuICAgICAgICB0aGlzLl9pc0VuY3J5cHRlZCA9IGJvb2w7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgeyBScGNNZXNzYWdlIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IFJwY1R5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFJwY1R5cGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5PVElGSUNBVElPTiAoKSB7XG4gICAgICAgIHJldHVybiBScGNUeXBlLl9NQVAuTk9USUZJQ0FUSU9OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJFU1BPTlNFICgpIHtcbiAgICAgICAgcmV0dXJuIFJwY1R5cGUuX01BUC5SRVNQT05TRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSRVFVRVNUICgpIHtcbiAgICAgICAgcmV0dXJuIFJwY1R5cGUuX01BUC5SRVFVRVNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBScGNUeXBlLl92YWx1ZUZvcktleShrZXksIFJwY1R5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFJwY1R5cGUuX2tleUZvclZhbHVlKHZhbHVlLCBScGNUeXBlLl9NQVApO1xuICAgIH1cbn1cblxuUnBjVHlwZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ05PVElGSUNBVElPTic6IDB4MixcbiAgICAnUkVTUE9OU0UnOiAweDEsXG4gICAgJ1JFUVVFU1QnOiAweDAsXG59KTtcblxuZXhwb3J0IHsgUnBjVHlwZSB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cblxuaW1wb3J0IHsgUnBjTWVzc2FnZSB9IGZyb20gJy4vUnBjTWVzc2FnZS5qcyc7XG5pbXBvcnQgeyBScGNUeXBlIH0gZnJvbSAnLi9lbnVtcy9ScGNUeXBlLmpzJztcblxuY2xhc3MgUnBjUmVxdWVzdCBleHRlbmRzIFJwY01lc3NhZ2Uge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldFJQQ1R5cGUoUnBjVHlwZS5SRVFVRVNUKTtcbiAgICAgICAgdGhpcy5fcHJvbWlzZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICovXG4gICAgZ2V0T25SUENSZXNwb25zZVByb21pc2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7UHJvbWlzZX0gcHJvbWlzZVxuICAgICogQHJldHVybiB7UnBjTWVzc2FnZX1cbiAgICAqL1xuICAgIHNldE9uUlBDUmVzcG9uc2VQcm9taXNlIChwcm9taXNlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFByb21pc2UsIHByb21pc2UpO1xuXG4gICAgICAgIHRoaXMuX3Byb21pc2UgPSBwcm9taXNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCB7IFJwY1JlcXVlc3QgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG4vKipcbiAqIFZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgY29ubmVjdGluZyBkZXZpY2UuXG4gKi9cbmNsYXNzIERldmljZUluZm8gZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBoYXJkd2FyZSAtIERldmljZSBtb2RlbFxuICAgICAqIEByZXR1cm4ge0RldmljZUluZm99XG4gICAgICovXG4gICAgc2V0SGFyZHdhcmUgKGhhcmR3YXJlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERldmljZUluZm8uS0VZX0hBUkRXQVJFLCBoYXJkd2FyZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRIYXJkd2FyZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEZXZpY2VJbmZvLktFWV9IQVJEV0FSRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHJldiAtIERldmljZSBmaXJtd2FyZSByZXZpc2lvblxuICAgICAqIEByZXR1cm4ge0RldmljZUluZm99XG4gICAgICovXG4gICAgc2V0RmlybXdhcmVSZXYgKHJldikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEZXZpY2VJbmZvLktFWV9GSVJNV0FSRV9SRVYsIHJldik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRGaXJtd2FyZVJldiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEZXZpY2VJbmZvLktFWV9GSVJNV0FSRV9SRVYpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcyAtIERldmljZSBPU1xuICAgICAqIEByZXR1cm4ge0RldmljZUluZm99XG4gICAgICovXG4gICAgc2V0T3MgKG9zKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERldmljZUluZm8uS0VZX09TLCBvcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRPcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEZXZpY2VJbmZvLktFWV9PUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHZlcnNpb24gLSBEZXZpY2UgT1MgdmVyc2lvblxuICAgICAqIEByZXR1cm4ge0RldmljZUluZm99XG4gICAgICovXG4gICAgc2V0T3NWZXJzaW9uICh2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERldmljZUluZm8uS0VZX09TX1ZFUlNJT04sIHZlcnNpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0T3NWZXJzaW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERldmljZUluZm8uS0VZX09TX1ZFUlNJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjYXJyaWVyIC0gRGV2aWNlIG1vYmlsZSBjYXJyaWVyIChpZiBhcHBsaWNhYmxlKVxuICAgICAqIEByZXR1cm4ge0RldmljZUluZm99XG4gICAgICovXG4gICAgc2V0Q2FycmllciAoY2Fycmllcikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEZXZpY2VJbmZvLktFWV9DQVJSSUVSLCBjYXJyaWVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldENhcnJpZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGV2aWNlSW5mby5LRVlfQ0FSUklFUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHBvcnRzIC0gT21pdHRlZCBpZiBjb25uZWN0ZWQgbm90IHZpYSBCVC5cbiAgICAgKiBAcmV0dXJuIHtEZXZpY2VJbmZvfVxuICAgICAqL1xuICAgIHNldE1heE51bWJlclJGQ09NTVBvcnRzIChwb3J0cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEZXZpY2VJbmZvLktFWV9NQVhfTlVNQkVSX1JGQ09NTV9QT1JUUywgcG9ydHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0TWF4TnVtYmVyUkZDT01NUG9ydHMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGV2aWNlSW5mby5LRVlfTUFYX05VTUJFUl9SRkNPTU1fUE9SVFMpO1xuICAgIH1cbn1cblxuRGV2aWNlSW5mby5LRVlfSEFSRFdBUkUgPSAnaGFyZHdhcmUnO1xuRGV2aWNlSW5mby5LRVlfRklSTVdBUkVfUkVWID0gJ2Zpcm13YXJlUmV2JztcbkRldmljZUluZm8uS0VZX09TID0gJ29zJztcbkRldmljZUluZm8uS0VZX09TX1ZFUlNJT04gPSAnb3NWZXJzaW9uJztcbkRldmljZUluZm8uS0VZX0NBUlJJRVIgPSAnY2Fycmllcic7XG5EZXZpY2VJbmZvLktFWV9NQVhfTlVNQkVSX1JGQ09NTV9QT1JUUyA9ICdtYXhOdW1iZXJSRkNPTU1Qb3J0cyc7XG5cbmV4cG9ydCB7IERldmljZUluZm8gfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBBcHBJbmZvIH0gZnJvbSAnLi4vc3RydWN0cy9BcHBJbmZvLmpzJztcbmltcG9ydCB7IFRlbXBsYXRlQ29sb3JTY2hlbWUgfSBmcm9tICcuLi9zdHJ1Y3RzL1RlbXBsYXRlQ29sb3JTY2hlbWUuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgVFRTQ2h1bmsgfSBmcm9tICcuLi9zdHJ1Y3RzL1RUU0NodW5rLmpzJztcbmltcG9ydCB7IFNkbE1zZ1ZlcnNpb24gfSBmcm9tICcuLi9zdHJ1Y3RzL1NkbE1zZ1ZlcnNpb24uanMnO1xuaW1wb3J0IHsgQXBwSE1JVHlwZSB9IGZyb20gJy4uL2VudW1zL0FwcEhNSVR5cGUuanMnO1xuaW1wb3J0IHsgTGFuZ3VhZ2UgfSBmcm9tICcuLi9lbnVtcy9MYW5ndWFnZS5qcyc7XG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBEZXZpY2VJbmZvIH0gZnJvbSAnLi4vc3RydWN0cy9EZXZpY2VJbmZvLmpzJztcblxuLyoqXG4gKiBFc3RhYmxpc2hlcyBhbiBpbnRlcmZhY2Ugd2l0aCBhIG1vYmlsZSBhcHBsaWNhdGlvbi4gQmVmb3JlIHJlZ2lzdGVyQXBwSW50ZXJmYWNlIG5vIG90aGVyIGNvbW1hbmRzIHdpbGwgYmVcbiAqIGFjY2VwdGVkL2V4ZWN1dGVkLlxuICovXG5jbGFzcyBSZWdpc3RlckFwcEludGVyZmFjZSBleHRlbmRzIFJwY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuUmVnaXN0ZXJBcHBJbnRlcmZhY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmdWxsQXBwSWRcbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAgKi9cbiAgICBzZXRGdWxsQXBwSWQgKGZ1bGxBcHBJZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTdHJpbmcsIGZ1bGxBcHBJZCk7XG5cbiAgICAgICAgaWYgKGZ1bGxBcHBJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZnVsbEFwcElkID0gZnVsbEFwcElkLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfRlVMTF9BUFBfSUQsIGZ1bGxBcHBJZCk7XG4gICAgICAgICAgICBsZXQgYXBwSUQ7XG4gICAgICAgICAgICBpZiAoZnVsbEFwcElkLmxlbmd0aCA8PSBSZWdpc3RlckFwcEludGVyZmFjZS5BUFBfSURfTUFYX0xFTkdUSCkge1xuICAgICAgICAgICAgICAgIGFwcElEID0gZnVsbEFwcElkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcHBJRCA9IGZ1bGxBcHBJZC5yZXBsYWNlKCctJywgJycpLnN1YnN0cmluZygwLCBSZWdpc3RlckFwcEludGVyZmFjZS5BUFBfSURfTUFYX0xFTkdUSCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9zZXRBcHBJZChhcHBJRCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfRlVMTF9BUFBfSUQsIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSB0aGUgYXBwIGlkXG4gICAgICovXG4gICAgZ2V0RnVsbEFwcElkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9GVUxMX0FQUF9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGFwcElkIC0gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBhY2Nlc3NlZCBkaXJlY3RseSBieSBkZXZlbG9wZXJzLiBPbmx5IHNldCB0aGUgZnVsbCBJRCBhbmQgdGhpc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtIHdpbGwgYmUgc2V0LlxuICAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlfVxuICAgICAqL1xuICAgIF9zZXRBcHBJZCAoYXBwSWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU3RyaW5nLCBhcHBJZCk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0FQUF9JRCwgYXBwSWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBhcHAgaWRcbiAgICAgKi9cbiAgICBnZXRBcHBJZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfQVBQX0lEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NkbE1zZ1ZlcnNpb259IHZlcnNpb24gLSBTZWUgU3luY01zZ1ZlcnNpb25cbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAgKi9cbiAgICBzZXRTZGxNc2dWZXJzaW9uICh2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFNkbE1zZ1ZlcnNpb24sIHZlcnNpb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfU0RMX01TR19WRVJTSU9OLCB2ZXJzaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U2RsTXNnVmVyc2lvbn1cbiAgICAgKi9cbiAgICBnZXRTZGxNc2dWZXJzaW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFNkbE1zZ1ZlcnNpb24sIFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9TRExfTVNHX1ZFUlNJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIG1vYmlsZSBhcHBsaWNhdGlvbiBuYW1lLCBlLmcuIFwiTXkgU0RMIEFwcFwiLiBOZWVkcyB0byBiZSB1bmlxdWUgb3ZlciBhbGwgYXBwbGljYXRpb25zXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBzYW1lIGRldmljZS4gTWF5IG5vdCBiZSBlbXB0eS4gTWF5IG5vdCBzdGFydCB3aXRoIGEgbmV3IGxpbmUgY2hhcmFjdGVyLiBNYXkgbm90XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZlcmUgd2l0aCBhbnkgbmFtZSBvciBzeW5vbnltIG9mIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBhcHBsaWNhdGlvbnMgZnJvbSB0aGUgc2FtZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIGFuZCBhbnkgcHJlZGVmaW5lZCBibGFja2xpc3Qgb2Ygd29yZHMgKGdsb2JhbCBjb21tYW5kcykgQWRkaXRpb25hbCBhcHBsaWNhdGlvbnNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbmFtZSBmcm9tIHRoZSBzYW1lIGRldmljZSB3aWxsIGJlIHJlamVjdGVkLiBPbmx5IGNoYXJhY3RlcnMgZnJvbSBjaGFyIHNldFxuICAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlfVxuICAgICAqL1xuICAgIHNldEFwcE5hbWUgKG5hbWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0FQUF9OQU1FLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldEFwcE5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0FQUF9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RUU0NodW5rW119IG5hbWUgLSBUVFMgc3RyaW5nIGZvciBWUiByZWNvZ25pdGlvbiBvZiB0aGUgbW9iaWxlIGFwcGxpY2F0aW9uIG5hbWUsIGUuZy4gXCJNeSBTIEQgTCBBcHBcIi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFudCB0byBvdmVyY29tZSBhbnkgZmFpbGluZyBvbiBzcGVlY2ggZW5naW5lIGluIHByb3Blcmx5IHByb25vdW5jaW5nIC8gdW5kZXJzdGFuZGluZ1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBuYW1lLiBOZWVkcyB0byBiZSB1bmlxdWUgb3ZlciBhbGwgYXBwbGljYXRpb25zIGZyb20gdGhlIHNhbWUgZGV2aWNlLiBNYXkgbm90IGJlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkuIE1heSBub3Qgc3RhcnQgd2l0aCBhIG5ldyBsaW5lIGNoYXJhY3Rlci4gT25seSBjaGFyYWN0ZXJzIGZyb20gY2hhciBzZXRcbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAgKi9cbiAgICBzZXRUdHNOYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRUU0NodW5rLCBuYW1lLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX1RUU19OQU1FLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VFRTQ2h1bmtbXX1cbiAgICAgKi9cbiAgICBnZXRUdHNOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRUU0NodW5rLCBSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfVFRTX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gUHJvdmlkZXMgYW4gYWJicmV2aWF0ZWQgdmVyc2lvbiBvZiB0aGUgYXBwIG5hbWUgKGlmIG5lZWRlZCksIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBOR04gbWVkaWEgc2NyZWVuLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBhcHBOYW1lIGlzIHVzZWQgaW5zdGVhZCAoYW5kIHdpbGwgYmUgdHJ1bmNhdGVkIGlmXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICB0b28gbG9uZykgT25seSBjaGFyYWN0ZXJzIGZyb20gY2hhciBzZXRcbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAgKi9cbiAgICBzZXROZ25NZWRpYVNjcmVlbkFwcE5hbWUgKG5hbWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX05HTl9NRURJQV9TQ1JFRU5fQVBQX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0TmduTWVkaWFTY3JlZW5BcHBOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9OR05fTUVESUFfU0NSRUVOX0FQUF9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ1tdfSBzeW5vbnltcyAtIERlZmluZXMgYW4gYWRkaXRpb25hbCB2b2ljZSByZWNvZ25pdGlvbiBjb21tYW5kLiBNYXkgbm90IGludGVyZmVyZSB3aXRoIGFueSBhcHAgbmFtZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgcHJldmlvdXNseSByZWdpc3RlcmVkIGFwcGxpY2F0aW9ucyBmcm9tIHRoZSBzYW1lIGRldmljZSBhbmQgYW55IHByZWRlZmluZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWNrbGlzdCBvZiB3b3JkcyAoZ2xvYmFsIGNvbW1hbmRzKSBPbmx5IGNoYXJhY3RlcnMgZnJvbSBjaGFyIHNldFxuICAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlfVxuICAgICAqL1xuICAgIHNldFZyU3lub255bXMgKHN5bm9ueW1zKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9WUl9TWU5PTllNUywgc3lub255bXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmdbXX1cbiAgICAgKi9cbiAgICBnZXRWclN5bm9ueW1zICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9WUl9TWU5PTllNUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhcHBsaWNhdGlvbiAtIEluZGljYXRlcyBpZiB0aGUgYXBwbGljYXRpb24gaXMgYSBtZWRpYSBvciBhIG5vbi1tZWRpYSBhcHBsaWNhdGlvbi4gT25seSBtZWRpYVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMgd2lsbCBiZSBhYmxlIHRvIHN0cmVhbSBhdWRpbyB0byB0aGUgbW9kdWxlIHRoYXQgaXMgYXVkaWJsZSBvdXRzaWRlIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBCVCBtZWRpYSBzb3VyY2UuXG4gICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2V9XG4gICAgICovXG4gICAgc2V0SXNNZWRpYUFwcGxpY2F0aW9uIChhcHBsaWNhdGlvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfSVNfTUVESUFfQVBQTElDQVRJT04sIGFwcGxpY2F0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRJc01lZGlhQXBwbGljYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0lTX01FRElBX0FQUExJQ0FUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0xhbmd1YWdlfSBkZXNpcmVkIC0gU2VlIExhbmd1YWdlIEN1cnJlbnQgYXBwJ3MgZXhwZWN0ZWQgVlIrVFRTIGxhbmd1YWdlIElmIHRoZXJlIGlzIGEgbWlzbWF0Y2ggd2l0aCB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLCB0aGUgYXBwIHdpbGwgYmUgYWJsZSB0byBjaGFuZ2UgdGhpcyByZWdpc3RyYXRpb24gd2l0aCBjaGFuZ2VSZWdpc3RyYXRpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgdG8gYXBwIGJlaW5nIGJyb3VnaHQgaW50byBmb2N1cy5cbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAgKi9cbiAgICBzZXRMYW5ndWFnZURlc2lyZWQgKGRlc2lyZWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTGFuZ3VhZ2UsIGRlc2lyZWQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfTEFOR1VBR0VfREVTSVJFRCwgZGVzaXJlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0xhbmd1YWdlfVxuICAgICAqL1xuICAgIGdldExhbmd1YWdlRGVzaXJlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChMYW5ndWFnZSwgUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0xBTkdVQUdFX0RFU0lSRUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TGFuZ3VhZ2V9IGRlc2lyZWQgLSBTZWUgTGFuZ3VhZ2UgQ3VycmVudCBhcHAncyBleHBlY3RlZCBkaXNwbGF5IGxhbmd1YWdlIElmIHRoZXJlIGlzIGEgbWlzbWF0Y2ggd2l0aCB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLCB0aGUgYXBwIHdpbGwgYmUgYWJsZSB0byBjaGFuZ2UgdGhpcyByZWdpc3RyYXRpb24gd2l0aCBjaGFuZ2VSZWdpc3RyYXRpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgdG8gYXBwIGJlaW5nIGJyb3VnaHQgaW50byBmb2N1cy5cbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAgKi9cbiAgICBzZXRIbWlEaXNwbGF5TGFuZ3VhZ2VEZXNpcmVkIChkZXNpcmVkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKExhbmd1YWdlLCBkZXNpcmVkKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0hNSV9ESVNQTEFZX0xBTkdVQUdFX0RFU0lSRUQsIGRlc2lyZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtMYW5ndWFnZX1cbiAgICAgKi9cbiAgICBnZXRIbWlEaXNwbGF5TGFuZ3VhZ2VEZXNpcmVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KExhbmd1YWdlLCBSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfSE1JX0RJU1BMQVlfTEFOR1VBR0VfREVTSVJFRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcHBITUlUeXBlW119IHR5cGUgLSBTZWUgQXBwSE1JVHlwZSBMaXN0IG9mIGFsbCBhcHBsaWNhYmxlIGFwcCBITUkgdHlwZXMgc3RhdGluZyB3aGljaCBITUlcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9ucyB0byBiZSBnaXZlbiB0byB0aGUgYXBwLlxuICAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlfVxuICAgICAqL1xuICAgIHNldEFwcEhNSVR5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQXBwSE1JVHlwZSwgdHlwZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9BUFBfSE1JX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtBcHBITUlUeXBlW119XG4gICAgICovXG4gICAgZ2V0QXBwSE1JVHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChBcHBITUlUeXBlLCBSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfQVBQX0hNSV9UWVBFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBJRCB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGN1cnJlbnQgc3RhdGUgb2YgYWxsIGFwcCBkYXRhIHRoYXQgY2FuIHBlcnNpc3QgdGhyb3VnaFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gY3ljbGVzIChlLmcuIGlnbml0aW9uIGN5Y2xlcykuIFRoaXMgcmVnaXN0ZXJlZCBkYXRhIChjb21tYW5kcywgc3VibWVudXMsIGNob2ljZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNldHMsIGV0Yy4pIGNhbiBiZSByZWVzdGFibGlzaGVkIHdpdGhvdXQgbmVlZGluZyB0byBleHBsaWNpdGx5IHJlcmVnaXN0ZXIgZWFjaCBwaWVjZS4gSWZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbWl0dGVkLCB0aGVuIHRoZSBwcmV2aW91cyBzdGF0ZSBvZiBhbiBhcHAncyBjb21tYW5kcywgZXRjLiB3aWxsIG5vdCBiZSByZXN0b3JlZC4gV2hlblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNlbmRpbmcgaGFzaElELCBhbGwgUmVnaXN0ZXJBcHBJbnRlcmZhY2UgcGFyYW1ldGVycyBzaG91bGQgc3RpbGwgYmUgcHJvdmlkZWQgKGUuZy4gdHRzTmFtZSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBldGMuKS5cbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAgKi9cbiAgICBzZXRIYXNoSUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9IQVNIX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRIYXNoSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0hBU0hfSUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RGV2aWNlSW5mb30gaW5mbyAtIFNlZSBEZXZpY2VJbmZvLlxuICAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlfVxuICAgICAqL1xuICAgIHNldERldmljZUluZm8gKGluZm8pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoRGV2aWNlSW5mbywgaW5mbyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9ERVZJQ0VfSU5GTywgaW5mbyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0RldmljZUluZm99XG4gICAgICovXG4gICAgZ2V0RGV2aWNlSW5mbyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChEZXZpY2VJbmZvLCBSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfREVWSUNFX0lORk8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIElEIHVzZWQgdG8gdmFsaWRhdGUgYXBwIHdpdGggcG9saWN5IHRhYmxlIGVudHJpZXNcbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAgKi9cbiAgICBzZXRGdWxsQXBwSUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9GVUxMX0FQUF9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0RnVsbEFwcElEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9GVUxMX0FQUF9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcHBJbmZvfSBpbmZvIC0gU2VlIEFwcEluZm8uXG4gICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2V9XG4gICAgICovXG4gICAgc2V0QXBwSW5mbyAoaW5mbykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShBcHBJbmZvLCBpbmZvKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0FQUF9JTkZPLCBpbmZvKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QXBwSW5mb31cbiAgICAgKi9cbiAgICBnZXRBcHBJbmZvICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEFwcEluZm8sIFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9BUFBfSU5GTyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUZW1wbGF0ZUNvbG9yU2NoZW1lfSBzY2hlbWUgLSBBIGNvbG9yIHNjaGVtZSBmb3IgYWxsIGRpc3BsYXkgbGF5b3V0IHRlbXBsYXRlcy5cbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAgKi9cbiAgICBzZXREYXlDb2xvclNjaGVtZSAoc2NoZW1lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRlbXBsYXRlQ29sb3JTY2hlbWUsIHNjaGVtZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9EQVlfQ09MT1JfU0NIRU1FLCBzY2hlbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUNvbG9yU2NoZW1lfVxuICAgICAqL1xuICAgIGdldERheUNvbG9yU2NoZW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRlbXBsYXRlQ29sb3JTY2hlbWUsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9EQVlfQ09MT1JfU0NIRU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RlbXBsYXRlQ29sb3JTY2hlbWV9IHNjaGVtZSAtIEEgY29sb3Igc2NoZW1lIGZvciBhbGwgZGlzcGxheSBsYXlvdXQgdGVtcGxhdGVzLlxuICAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlfVxuICAgICAqL1xuICAgIHNldE5pZ2h0Q29sb3JTY2hlbWUgKHNjaGVtZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShUZW1wbGF0ZUNvbG9yU2NoZW1lLCBzY2hlbWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZS5LRVlfTklHSFRfQ09MT1JfU0NIRU1FLCBzY2hlbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUNvbG9yU2NoZW1lfVxuICAgICAqL1xuICAgIGdldE5pZ2h0Q29sb3JTY2hlbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVGVtcGxhdGVDb2xvclNjaGVtZSwgUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX05JR0hUX0NPTE9SX1NDSEVNRSk7XG4gICAgfVxufVxuXG5SZWdpc3RlckFwcEludGVyZmFjZS5LRVlfU0RMX01TR19WRVJTSU9OID0gJ3N5bmNNc2dWZXJzaW9uJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9BUFBfTkFNRSA9ICdhcHBOYW1lJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9UVFNfTkFNRSA9ICd0dHNOYW1lJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9OR05fTUVESUFfU0NSRUVOX0FQUF9OQU1FID0gJ25nbk1lZGlhU2NyZWVuQXBwTmFtZSc7XG5SZWdpc3RlckFwcEludGVyZmFjZS5LRVlfVlJfU1lOT05ZTVMgPSAndnJTeW5vbnltcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZS5LRVlfSVNfTUVESUFfQVBQTElDQVRJT04gPSAnaXNNZWRpYUFwcGxpY2F0aW9uJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9MQU5HVUFHRV9ERVNJUkVEID0gJ2xhbmd1YWdlRGVzaXJlZCc7XG5SZWdpc3RlckFwcEludGVyZmFjZS5LRVlfSE1JX0RJU1BMQVlfTEFOR1VBR0VfREVTSVJFRCA9ICdobWlEaXNwbGF5TGFuZ3VhZ2VEZXNpcmVkJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9BUFBfSE1JX1RZUEUgPSAnYXBwSE1JVHlwZSc7XG5SZWdpc3RlckFwcEludGVyZmFjZS5LRVlfSEFTSF9JRCA9ICdoYXNoSUQnO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0RFVklDRV9JTkZPID0gJ2RldmljZUluZm8nO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2UuS0VZX0FQUF9JRCA9ICdhcHBJRCc7XG5SZWdpc3RlckFwcEludGVyZmFjZS5LRVlfRlVMTF9BUFBfSUQgPSAnZnVsbEFwcElEJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9BUFBfSU5GTyA9ICdhcHBJbmZvJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9EQVlfQ09MT1JfU0NIRU1FID0gJ2RheUNvbG9yU2NoZW1lJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlLktFWV9OSUdIVF9DT0xPUl9TQ0hFTUUgPSAnbmlnaHRDb2xvclNjaGVtZSc7XG5SZWdpc3RlckFwcEludGVyZmFjZS5BUFBfSURfTUFYX0xFTkdUSCA9IDEwO1xuXG5leHBvcnQgeyBSZWdpc3RlckFwcEludGVyZmFjZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFJlc3VsdCBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBzdWNjZWVkZWRcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTVUNDRVNTICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLlNVQ0NFU1M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHJlcXVlc3QgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgaGVhZHVuaXRcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBVTlNVUFBPUlRFRF9SRVFVRVNUICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLlVOU1VQUE9SVEVEX1JFUVVFU1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBidXR0b24gdGhhdCB3YXMgcmVxdWVzdGVkIGZvciBzdWJzY3JpcHRpb24gaXMgbm90IHN1cHBvcnRlZCB1bmRlciB0aGUgY3VycmVudCBzeXN0ZW0uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVU5TVVBQT1JURURfUkVTT1VSQ0UgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuVU5TVVBQT1JURURfUkVTT1VSQ0U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUlBDIGlzIG5vdCBhdXRob3JpemVkIGluIGxvY2FsIHBvbGljeSB0YWJsZS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBESVNBTExPV0VEICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLkRJU0FMTE9XRUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHJlcXVlc3RlZCBjb21tYW5kIHdhcyByZWplY3RlZCwgZS5nLiBiZWNhdXNlIG1vYmlsZSBhcHAgaXMgaW4gYmFja2dyb3VuZCBhbmQgY2Fubm90IHBlcmZvcm0gYW55IEhNSVxuICAgICAqIGNvbW1hbmRzLiBPciBhbiBITUkgY29tbWFuZCAoZS5nLiBTcGVhaykgaXMgcmVqZWN0ZWQgYmVjYXVzZSBhIGhpZ2hlciBwcmlvcml0eSBITUkgY29tbWFuZCAoZS5nLiBBbGVydCkgaXNcbiAgICAgKiBwbGF5aW5nLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJFSkVDVEVEICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLlJFSkVDVEVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgY29tbWFuZCB3YXMgYWJvcnRlZCwgZm9yIGV4YW1wbGUgZHVlIHRvIHVzZXIgaW50ZXJhY3Rpb24gKGUuZy4gdXNlciBwcmVzc2VkIGJ1dHRvbikuIE9yIGFuIEhNSSBjb21tYW5kIChlLmcuXG4gICAgICogU3BlYWspIGlzIGFib3J0ZWQgYmVjYXVzZSBhIGhpZ2hlciBwcmlvcml0eSBITUkgY29tbWFuZCAoZS5nLiBBbGVydCkgd2FzIHJlcXVlc3RlZC5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBQk9SVEVEICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLkFCT1JURUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBjb21tYW5kIHdhcyBpZ25vcmVkLCBiZWNhdXNlIHRoZSBpbnRlbmRlZCByZXN1bHQgaXMgYWxyZWFkeSBpbiBlZmZlY3QuIEZvciBleGFtcGxlLCBTZXRNZWRpYUNsb2NrVGltZXIgd2FzXG4gICAgICogdXNlZCB0byBwYXVzZSB0aGUgbWVkaWEgY2xvY2sgYWx0aG91Z2ggdGhlIGNsb2NrIGlzIHBhdXNlZCBhbHJlYWR5LiBOT1RFOiBwb3RlbnRpYWxseSByZXBsYWNlc1xuICAgICAqIFNVQlNDUklCRURfQUxSRUFEWVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IElHTk9SRUQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuSUdOT1JFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBpbnRlcnJ1cHRlZCB0aGUgUlBDIChlLmcuIFBlcmZvcm1BdWRpb1Bhc3NUaHJ1KSBhbmQgaW5kaWNhdGVkIHRvIHN0YXJ0IG92ZXIuIE5vdGUsIHRoZSBhcHAgbXVzdCBpc3N1ZVxuICAgICAqIHRoZSBuZXcgUlBDLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJFVFJZICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLlJFVFJZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIG1heSBub3QgYmUgY2hhbmdlZCwgYmVjYXVzZSBpdCBpcyBjdXJyZW50bHkgaW4gdXNlLiBGb3IgZXhhbXBsZSB3aGVuIHRyeWluZyB0byBkZWxldGUgYSBjb21tYW5kIHNldFxuICAgICAqIHRoYXQgaXMgY3VycmVudGx5IGludm9sdmVkIGluIGFuIGludGVyYWN0aW9uLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IElOX1VTRSAoKSB7XG4gICAgICAgIHJldHVybiBSZXN1bHQuX01BUC5JTl9VU0U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHJlcXVlc3RlZCB2ZWhpY2xlIGRhdGEgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHZlaGljbGUgb3IgaXMgbm90IHB1Ymxpc2hlZC5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFX0RBVEFfTk9UX0FWQUlMQUJMRSAoKSB7XG4gICAgICAgIHJldHVybiBSZXN1bHQuX01BUC5WRUhJQ0xFX0RBVEFfTk9UX0FWQUlMQUJMRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPdmVybGF5IHJlYWNoZWQgdGhlIG1heGltdW0gdGltZW91dCBhbmQgY2xvc2VkLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRJTUVEX09VVCAoKSB7XG4gICAgICAgIHJldHVybiBSZXN1bHQuX01BUC5USU1FRF9PVVQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGRhdGEgc2VudCBpcyBpbnZhbGlkLiBGb3IgZXhhbXBsZTogSW52YWxpZCBKc29uIHN5bnRheCBQYXJhbWV0ZXJzIG91dCBvZiBib3VuZHMgKG51bWJlciBvciBlbnVtIHJhbmdlKVxuICAgICAqIE1hbmRhdG9yeSBwYXJhbWV0ZXJzIG5vdCBwcm92aWRlZCBQYXJhbWV0ZXIgcHJvdmlkZWQgd2l0aCB3cm9uZyB0eXBlIEludmFsaWQgY2hhcmFjdGVycyBFbXB0eSBzdHJpbmdcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBJTlZBTElEX0RBVEEgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuSU5WQUxJRF9EQVRBO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENIQVJfTElNSVRfRVhDRUVERUQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuQ0hBUl9MSU1JVF9FWENFRURFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbmUgb2YgdGhlIHByb3ZpZGVkIElEcyBpcyBub3QgdmFsaWQuIEZvciBleGFtcGxlIFRoaXMgYXBwbGllcyB0byBDb3JyZWxhdGlvbklELCBTdWJzY3JpcHRpb25JRCwgQ29tbWFuZElELFxuICAgICAqIE1lbnVJRCwgZXRjLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IElOVkFMSURfSUQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuSU5WQUxJRF9JRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGVyZSB3YXMgYSBjb25mbGljdCB3aXRoIGFuIHJlZ2lzdGVyZWQgbmFtZSAoYXBwbGljYXRpb24gb3IgbWVudSBpdGVtKSBvciB2ciBjb21tYW5kXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRFVQTElDQVRFX05BTUUgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuRFVQTElDQVRFX05BTUU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gY29tbWFuZCBjYW4gbm90IGJlIGV4ZWN1dGVkIGJlY2F1c2Ugbm8gYXBwbGljYXRpb24gaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIFJlZ2lzdGVyQXBwbGljYXRpb24uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQVBQTElDQVRJT05fTk9UX1JFR0lTVEVSRUQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuQVBQTElDQVRJT05fTk9UX1JFR0lTVEVSRUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHJlcXVlc3RlZCBsYW5ndWFnZSBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4gTWlnaHQgYmUgYmVjYXVzZSBvZiBhIG1pc21hdGNoIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlXG4gICAgICogbGFuZ3VhZ2Ugb24gdGhlIGhlYWR1bml0IGFuZCB0aGUgcmVxdWVzdGVkIGxhbmd1YWdlXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgV1JPTkdfTEFOR1VBR0UgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuV1JPTkdfTEFOR1VBR0U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHN5c3RlbSBjb3VsZCBub3QgcHJvY2VzcyB0aGUgcmVxdWVzdCBiZWNhdXNlIHRoZSBuZWNlc3NhcnkgbWVtb3J5IGNvdWxkbid0IGJlIGFsbG9jYXRlZFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9VVF9PRl9NRU1PUlkgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuT1VUX09GX01FTU9SWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGVyZSBhcmUgdG9vIG1hbnkgcmVxdWVzdHMgcGVuZGluZyAobWVhbnMsIHRoYXQgdGhlIHJlc3BvbnNlIGhhcyBub3QgYmVlbiBkZWxpdmVyZWQsIHlldCkuVGhlcmUgbWF5IGJlIGFcbiAgICAgKiBtYXhpbXVtIG9mIDEwMDAgcGVuZGluZyByZXF1ZXN0cyBhdCBhIHRpbWUuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVE9PX01BTllfUEVORElOR19SRVFVRVNUUyAoKSB7XG4gICAgICAgIHJldHVybiBSZXN1bHQuX01BUC5UT09fTUFOWV9QRU5ESU5HX1JFUVVFU1RTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZXJlIGFyZSBhbHJlYWR5IHRvbyBtYW55IHJlZ2lzdGVyZWQgYXBwbGljYXRpb25zXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVE9PX01BTllfQVBQTElDQVRJT05TICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLlRPT19NQU5ZX0FQUExJQ0FUSU9OUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlckFwcGxpY2F0aW9uIGhhcyBiZWVuIGNhbGxlZCBhZ2FpbiwgYWZ0ZXIgYSBSZWdpc3RlckFwcGxpY2F0aW9uIHdhcyBzdWNjZXNzZnVsIGJlZm9yZS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBUFBMSUNBVElPTl9SRUdJU1RFUkVEX0FMUkVBRFkgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuQVBQTElDQVRJT05fUkVHSVNURVJFRF9BTFJFQURZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBSUEMgKGUuZy4gU3Vic2NyaWJlVmVoaWNsZURhdGEpIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSBidXQgb25lIG9yIG1vcmUgaXRlbXMgaGF2ZSBhIHdhcm5pbmcgb3IgZmFpbHVyZS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBXQVJOSU5HUyAoKSB7XG4gICAgICAgIHJldHVybiBSZXN1bHQuX01BUC5XQVJOSU5HUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlZCBkYXRhIGlzIHZhbGlkIGJ1dCBzb21ldGhpbmcgd2VudCB3cm9uZyBpbiB0aGUgbG93ZXIgbGF5ZXJzLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEdFTkVSSUNfRVJST1IgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuR0VORVJJQ19FUlJPUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSUEMgaXMgaW5jbHVkZWQgaW4gYSBmdW5jdGlvbmFsIGdyb3VwIGV4cGxpY2l0bHkgYmxvY2tlZCBieSB0aGUgdXNlci5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBVU0VSX0RJU0FMTE9XRUQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuVVNFUl9ESVNBTExPV0VEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBSUEMgKGUuZy4gUmVhZERJRCkgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IGJ1dCB0aGUgZGF0YSBleGNlZWRlZCB0aGUgcGxhdGZvcm0gbWF4aW11bSB0aHJlc2hvbGQgYW5kIHRodXMsXG4gICAgICogb25seSBwYXJ0IG9mIHRoZSBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBUUlVOQ0FURURfREFUQSAoKSB7XG4gICAgICAgIHJldHVybiBSZXN1bHQuX01BUC5UUlVOQ0FURURfREFUQTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTeW5jIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcHJvdG9jb2wgdGhhdCBpcyByZXF1ZXN0ZWQgYnkgdGhlIG1vYmlsZSBhcHBsaWNhdGlvblxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVOU1VQUE9SVEVEX1ZFUlNJT04gKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuVU5TVVBQT1JURURfVkVSU0lPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBoYXMgdHVybmVkIG9mZiBhY2Nlc3MgdG8gdmVoaWNsZSBkYXRhLCBhbmQgaXQgaXMgZ2xvYmFsbHkgdW5hdmFpbGFibGUgdG8gbW9iaWxlIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFX0RBVEFfTk9UX0FMTE9XRUQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuVkVISUNMRV9EQVRBX05PVF9BTExPV0VEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lmaWVkIGZpbGUgY291bGQgbm90IGJlIGZvdW5kIG9uIHRoZSBoZWFkdW5pdC5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGSUxFX05PVF9GT1VORCAoKSB7XG4gICAgICAgIHJldHVybiBSZXN1bHQuX01BUC5GSUxFX05PVF9GT1VORDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VyIHNlbGVjdGVkIHRvIENhbmNlbCBSb3V0ZS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDQU5DRUxfUk9VVEUgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuQ0FOQ0VMX1JPVVRFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBSUEMgKGUuZy4gU2xpZGVyKSBleGVjdXRlZCBzdWNjZXNzZnVsbHkgYW5kIHRoZSB1c2VyIGVsZWN0ZWQgdG8gc2F2ZSB0aGUgY3VycmVudCBwb3NpdGlvbiAvIHZhbHVlLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNBVkVEICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLlNBVkVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjZXJ0aWZpY2F0ZSBwcm92aWRlZCBkdXJpbmcgYXV0aGVudGljYXRpb24gaXMgaW52YWxpZC5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBJTlZBTElEX0NFUlQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuSU5WQUxJRF9DRVJUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjZXJ0aWZpY2F0ZSBwcm92aWRlZCBkdXJpbmcgYXV0aGVudGljYXRpb24gaXMgZXhwaXJlZC5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFWFBJUkVEX0NFUlQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuRVhQSVJFRF9DRVJUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBwcm92aWRlZCBoYXNoIElEIGRvZXMgbm90IG1hdGNoIHRoZSBoYXNoIG9mIHRoZSBjdXJyZW50IHNldCBvZiByZWdpc3RlcmVkIGRhdGEgb3IgdGhlIGNvcmUgY291bGQgbm90IHJlc3VtZVxuICAgICAqIHRoZSBwcmV2aW91cyBkYXRhLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJFU1VNRV9GQUlMRUQgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuUkVTVU1FX0ZBSUxFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uIGlzIGN1cnJlbnRseSBub3QgYXZhaWxhYmxlLiBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIFVOU1VQUE9SVEVEX1JFU09VUkNFIGJlY2F1c2UgaXRcbiAgICAgKiBpbXBsaWVzIHRoZSBkYXRhIGlzIGF0IHNvbWUgcG9pbnQgYXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERBVEFfTk9UX0FWQUlMQUJMRSAoKSB7XG4gICAgICAgIHJldHVybiBSZXN1bHQuX01BUC5EQVRBX05PVF9BVkFJTEFCTEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIGJlaW5nIHNldCBpcyByZWFkIG9ubHlcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSRUFEX09OTFkgKCkge1xuICAgICAgICByZXR1cm4gUmVzdWx0Ll9NQVAuUkVBRF9PTkxZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIHNlbnQgZmFpbGVkIHRvIHBhc3MgQ1JDIGNoZWNrIGluIHJlY2VpdmVyIGVuZFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENPUlJVUFRFRF9EQVRBICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLkNPUlJVUFRFRF9EQVRBO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNETCByZWNlaXZlcyBhbiB1bi1lbmNyeXB0ZWQgUlBDIHJlcXVlc3QgdGhhdCBuZWVkcyBwcm90ZWN0aW9uLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEVOQ1JZUFRJT05fTkVFREVEICgpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fTUFQLkVOQ1JZUFRJT05fTkVFREVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdC5fdmFsdWVGb3JLZXkoa2V5LCBSZXN1bHQuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBSZXN1bHQuX2tleUZvclZhbHVlKHZhbHVlLCBSZXN1bHQuX01BUCk7XG4gICAgfVxufVxuXG5SZXN1bHQuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdTVUNDRVNTJzogJ1NVQ0NFU1MnLFxuICAgICdVTlNVUFBPUlRFRF9SRVFVRVNUJzogJ1VOU1VQUE9SVEVEX1JFUVVFU1QnLFxuICAgICdVTlNVUFBPUlRFRF9SRVNPVVJDRSc6ICdVTlNVUFBPUlRFRF9SRVNPVVJDRScsXG4gICAgJ0RJU0FMTE9XRUQnOiAnRElTQUxMT1dFRCcsXG4gICAgJ1JFSkVDVEVEJzogJ1JFSkVDVEVEJyxcbiAgICAnQUJPUlRFRCc6ICdBQk9SVEVEJyxcbiAgICAnSUdOT1JFRCc6ICdJR05PUkVEJyxcbiAgICAnUkVUUlknOiAnUkVUUlknLFxuICAgICdJTl9VU0UnOiAnSU5fVVNFJyxcbiAgICAnVkVISUNMRV9EQVRBX05PVF9BVkFJTEFCTEUnOiAnVkVISUNMRV9EQVRBX05PVF9BVkFJTEFCTEUnLFxuICAgICdUSU1FRF9PVVQnOiAnVElNRURfT1VUJyxcbiAgICAnSU5WQUxJRF9EQVRBJzogJ0lOVkFMSURfREFUQScsXG4gICAgJ0NIQVJfTElNSVRfRVhDRUVERUQnOiAnQ0hBUl9MSU1JVF9FWENFRURFRCcsXG4gICAgJ0lOVkFMSURfSUQnOiAnSU5WQUxJRF9JRCcsXG4gICAgJ0RVUExJQ0FURV9OQU1FJzogJ0RVUExJQ0FURV9OQU1FJyxcbiAgICAnQVBQTElDQVRJT05fTk9UX1JFR0lTVEVSRUQnOiAnQVBQTElDQVRJT05fTk9UX1JFR0lTVEVSRUQnLFxuICAgICdXUk9OR19MQU5HVUFHRSc6ICdXUk9OR19MQU5HVUFHRScsXG4gICAgJ09VVF9PRl9NRU1PUlknOiAnT1VUX09GX01FTU9SWScsXG4gICAgJ1RPT19NQU5ZX1BFTkRJTkdfUkVRVUVTVFMnOiAnVE9PX01BTllfUEVORElOR19SRVFVRVNUUycsXG4gICAgJ1RPT19NQU5ZX0FQUExJQ0FUSU9OUyc6ICdUT09fTUFOWV9BUFBMSUNBVElPTlMnLFxuICAgICdBUFBMSUNBVElPTl9SRUdJU1RFUkVEX0FMUkVBRFknOiAnQVBQTElDQVRJT05fUkVHSVNURVJFRF9BTFJFQURZJyxcbiAgICAnV0FSTklOR1MnOiAnV0FSTklOR1MnLFxuICAgICdHRU5FUklDX0VSUk9SJzogJ0dFTkVSSUNfRVJST1InLFxuICAgICdVU0VSX0RJU0FMTE9XRUQnOiAnVVNFUl9ESVNBTExPV0VEJyxcbiAgICAnVFJVTkNBVEVEX0RBVEEnOiAnVFJVTkNBVEVEX0RBVEEnLFxuICAgICdVTlNVUFBPUlRFRF9WRVJTSU9OJzogJ1VOU1VQUE9SVEVEX1ZFUlNJT04nLFxuICAgICdWRUhJQ0xFX0RBVEFfTk9UX0FMTE9XRUQnOiAnVkVISUNMRV9EQVRBX05PVF9BTExPV0VEJyxcbiAgICAnRklMRV9OT1RfRk9VTkQnOiAnRklMRV9OT1RfRk9VTkQnLFxuICAgICdDQU5DRUxfUk9VVEUnOiAnQ0FOQ0VMX1JPVVRFJyxcbiAgICAnU0FWRUQnOiAnU0FWRUQnLFxuICAgICdJTlZBTElEX0NFUlQnOiAnSU5WQUxJRF9DRVJUJyxcbiAgICAnRVhQSVJFRF9DRVJUJzogJ0VYUElSRURfQ0VSVCcsXG4gICAgJ1JFU1VNRV9GQUlMRUQnOiAnUkVTVU1FX0ZBSUxFRCcsXG4gICAgJ0RBVEFfTk9UX0FWQUlMQUJMRSc6ICdEQVRBX05PVF9BVkFJTEFCTEUnLFxuICAgICdSRUFEX09OTFknOiAnUkVBRF9PTkxZJyxcbiAgICAnQ09SUlVQVEVEX0RBVEEnOiAnQ09SUlVQVEVEX0RBVEEnLFxuICAgICdFTkNSWVBUSU9OX05FRURFRCc6ICdFTkNSWVBUSU9OX05FRURFRCcsXG59KTtcblxuZXhwb3J0IHsgUmVzdWx0IH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY01lc3NhZ2UgfSBmcm9tICcuL1JwY01lc3NhZ2UuanMnO1xuaW1wb3J0IHsgUnBjVHlwZSB9IGZyb20gJy4vZW51bXMvUnBjVHlwZS5qcyc7XG5pbXBvcnQgeyBSZXN1bHQgfSBmcm9tICcuL2VudW1zL1Jlc3VsdC5qcyc7XG5cbmNsYXNzIFJwY1Jlc3BvbnNlIGV4dGVuZHMgUnBjTWVzc2FnZSB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0UlBDVHlwZShScGNUeXBlLlJFU1BPTlNFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgKi9cbiAgICBnZXRTdWNjZXNzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJwY1Jlc3BvbnNlLktFWV9TVUNDRVNTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1JwY1Jlc3BvbnNlfVxuICAgICovXG4gICAgc2V0U3VjY2VzcyAoc3VjY2Vzcykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihScGNSZXNwb25zZS5LRVlfU1VDQ0VTUywgc3VjY2Vzcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICovXG4gICAgZ2V0SW5mbyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihScGNSZXNwb25zZS5LRVlfSU5GTyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtScGNSZXNwb25zZX1cbiAgICAqL1xuICAgIHNldEluZm8gKGluZm8pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUnBjUmVzcG9uc2UuS0VZX0lORk8sIGluZm8pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1Jlc3VsdH1cbiAgICAqL1xuICAgIGdldFJlc3VsdENvZGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoUmVzdWx0LCBScGNSZXNwb25zZS5LRVlfUkVTVUxUX0NPREUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7UnBjUmVzcG9uc2V9XG4gICAgKi9cbiAgICBzZXRSZXN1bHRDb2RlIChyZXN1bHRDb2RlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFJlc3VsdCwgcmVzdWx0Q29kZSk7XG5cbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUnBjUmVzcG9uc2UuS0VZX1JFU1VMVF9DT0RFLCByZXN1bHRDb2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5ScGNSZXNwb25zZS5LRVlfU1VDQ0VTUyAgICAgPSAnc3VjY2Vzcyc7XG5ScGNSZXNwb25zZS5LRVlfSU5GTyAgICAgICAgPSAnaW5mbyc7XG5ScGNSZXNwb25zZS5LRVlfUkVTVUxUX0NPREUgPSAncmVzdWx0Q29kZSc7XG5cbmV4cG9ydCB7IFJwY1Jlc3BvbnNlIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuY2xhc3MgUnBjTGlzdGVuZXIge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5fb25ScGNNZXNzYWdlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAgICogQHJldHVybiB7UnBjTGlzdGVuZXJ9XG4gICAgICovXG4gICAgc2V0T25ScGNNZXNzYWdlIChmdW5jKSB7XG4gICAgICAgIHRoaXMuX29uUnBjTWVzc2FnZSA9IGZ1bmM7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JwY01lc3NhZ2V9IHJwY01lc3NhZ2VcbiAgICAgKi9cbiAgICBvblJwY01lc3NhZ2UgKHJwY01lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vblJwY01lc3NhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uUnBjTWVzc2FnZShycGNNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgUnBjTGlzdGVuZXIgfTtcbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNkbFByb3RvY29sTGlzdGVuZXJcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHNldE9uUnBjTWVzc2FnZVJlY2VpdmVkXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBvblJwY01lc3NhZ2VSZWNlaXZlZFxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gc2V0T25Qcm90b2NvbFNlc3Npb25TdGFydGVkXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBvblByb3RvY29sU2Vzc2lvblN0YXJ0ZWRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHNldE9uUHJvdG9jb2xTZXNzaW9uRW5kZWRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IG9uUHJvdG9jb2xTZXNzaW9uRW5kZWRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHNldE9uUHJvdG9jb2xTZXNzaW9uRW5kZWROQUNLZWRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IG9uUHJvdG9jb2xTZXNzaW9uRW5kZWROQUNLZWRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHNldEdldFNlc3Npb25JZFxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZ2V0U2Vzc2lvbklkXG4gKi9cbmNsYXNzIFNkbFByb3RvY29sTGlzdGVuZXIge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5fb25ScGNNZXNzYWdlUmVjZWl2ZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblByb3RvY29sU2Vzc2lvbkVuZGVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2dldFNlc3Npb25JZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uVHJhbnNwb3J0Q29ubmVjdGVkID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHNldE9uVHJhbnNwb3J0Q29ubmVjdGVkIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9vblRyYW5zcG9ydENvbm5lY3RlZCA9IGxpc3RlbmVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHNldE9uUnBjTWVzc2FnZVJlY2VpdmVkIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9vblJwY01lc3NhZ2VSZWNlaXZlZCA9IGxpc3RlbmVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1JwY01lc3NhZ2V9IHJwY01lc3NhZ2VcbiAgICAgKi9cbiAgICBvblJwY01lc3NhZ2VSZWNlaXZlZCAocnBjTWVzc2FnZSkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uUnBjTWVzc2FnZVJlY2VpdmVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vblJwY01lc3NhZ2VSZWNlaXZlZChycGNNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25Qcm90b2NvbFNlc3Npb25TdGFydGVkIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9vblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQgPSBsaXN0ZW5lcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG5cbiAgICBvblRyYW5zcG9ydENvbm5lY3RlZCAoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25UcmFuc3BvcnRDb25uZWN0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uVHJhbnNwb3J0Q29ubmVjdGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2UgdGhlIG9uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZCBsaXN0ZW5lciB3aXRoIHRoZSBldmVudCBkYXRhXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc2Vzc2lvbklkXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHZlcnNpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29ycmVsYXRpb25JZFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoYXNoSWRcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRW5jcnlwdGVkXG4gICAgICovXG4gICAgb25Qcm90b2NvbFNlc3Npb25TdGFydGVkIChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklkLCB2ZXJzaW9uLCBjb3JyZWxhdGlvbklkLCBoYXNoSWQsIGlzRW5jcnlwdGVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25TdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQoc2VydmljZVR5cGUsIHNlc3Npb25JZCwgdmVyc2lvbiwgY29ycmVsYXRpb25JZCwgaGFzaElkLCBpc0VuY3J5cHRlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHNldE9uUHJvdG9jb2xTZXNzaW9uRW5kZWQgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uRW5kZWQgPSBsaXN0ZW5lcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlIHRoZSBvblByb3RvY29sU2Vzc2lvbkVuZGVkIGxpc3RlbmVyIHdpdGggdGhlIGV2ZW50IGRhdGFcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSWRcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29ycmVsYXRpb25JZFxuICAgICAqL1xuICAgIG9uUHJvdG9jb2xTZXNzaW9uRW5kZWQgKHNlcnZpY2VUeXBlLCBzZXNzaW9uSWQsIGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vblByb3RvY29sU2Vzc2lvbkVuZGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vblByb3RvY29sU2Vzc2lvbkVuZGVkKHNlcnZpY2VUeXBlLCBzZXNzaW9uSWQsIGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBzZXRPblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9vblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkID0gbGlzdGVuZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZSB0aGUgb25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZCBsaXN0ZW5lciB3aXRoIHRoZSBldmVudCBkYXRhXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc2Vzc2lvbklkXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvcnJlbGF0aW9uSWRcbiAgICAgKi9cbiAgICBvblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkIChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklkLCBjb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklkLCBjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGdldHRlclxuICAgICAqL1xuICAgIHNldEdldFNlc3Npb25JZCAoZ2V0dGVyKSB7XG4gICAgICAgIHRoaXMuX2dldFNlc3Npb25JZCA9IGdldHRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlIHRoZSBnZXRTZXNzaW9uSWQgZ2V0dGVyXG4gICAgICogQHJldHVybnMge051bWJlcn0gc2Vzc2lvbklkXG4gICAgICovXG4gICAgZ2V0U2Vzc2lvbklkICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9nZXRTZXNzaW9uSWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTZXNzaW9uSWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZ2V0RGVzaXJlZFZpZGVvUGFyYW1zIGdldHRlclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGdldHRlclxuICAgICAqL1xuICAgIHNldEdldERlc2lyZWRWaWRlb1BhcmFtcyAoZ2V0dGVyKSB7XG4gICAgICAgIHRoaXMuX2dldERlc2lyZWRWaWRlb1BhcmFtcyA9IGdldHRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlIHRoZSBnZXREZXNpcmVkVmlkZW9QYXJhbXMgZ2V0dGVyXG4gICAgICogQHJldHVybnMge1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVyc31cbiAgICAgKi9cbiAgICBnZXREZXNpcmVkVmlkZW9QYXJhbXMgKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2dldERlc2lyZWRWaWRlb1BhcmFtcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldERlc2lyZWRWaWRlb1BhcmFtcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc2V0U2V0QWNjZXB0ZWRWaWRlb1BhcmFtcyBzZXR0ZXJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBzZXR0ZXJcbiAgICAgKi9cbiAgICBzZXRTZXRBY2NlcHRlZFZpZGVvUGFyYW1zIChzZXR0ZXIpIHtcbiAgICAgICAgdGhpcy5fc2V0QWNjZXB0ZWRWaWRlb1BhcmFtcyA9IHNldHRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBJbnZva2UgdGhlIHNldEFjY2VwdGVkVmlkZW9QYXJhbXMgc2V0dGVyXG4gICAgICogQHBhcmFtIHtWaWRlb1N0cmVhbWluZ1BhcmFtZXRlcnN9IHBhcmFtc1xuICAgICAqL1xuICAgIHNldEFjY2VwdGVkVmlkZW9QYXJhbXMgKHBhcmFtcykge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3NldEFjY2VwdGVkVmlkZW9QYXJhbXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldEFjY2VwdGVkVmlkZW9QYXJhbXMocGFyYW1zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCB7IFNkbFByb3RvY29sTGlzdGVuZXIgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IEZyYW1lVHlwZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgRnJhbWVUeXBlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ09OVFJPTCAoKSB7XG4gICAgICAgIHJldHVybiBGcmFtZVR5cGUuX01BUC5DT05UUk9MO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBGSVJTVCAoKSB7XG4gICAgICAgIHJldHVybiBGcmFtZVR5cGUuX01BUC5GSVJTVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ09OU0VDVVRJVkUgKCkge1xuICAgICAgICByZXR1cm4gRnJhbWVUeXBlLl9NQVAuQ09OU0VDVVRJVkU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNJTkdMRSAoKSB7XG4gICAgICAgIHJldHVybiBGcmFtZVR5cGUuX01BUC5TSU5HTEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEZyYW1lVHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBGcmFtZVR5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEZyYW1lVHlwZS5fa2V5Rm9yVmFsdWUodmFsdWUsIEZyYW1lVHlwZS5fTUFQKTtcbiAgICB9XG59XG5cbkZyYW1lVHlwZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0NPTlRST0wnOiAweDAwLFxuICAgICdGSVJTVCc6IDB4MDIsXG4gICAgJ0NPTlNFQ1VUSVZFJzogMHgwMyxcbiAgICAnU0lOR0xFJzogMHgwMSxcbn0pO1xuXG5leHBvcnQgeyBGcmFtZVR5cGUgfTtcbiIsImV4cG9ydHNbXCJic29uXCJdID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAyKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxudmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCkgfHwgKDEsZXZhbCkoXCJ0aGlzXCIpO1xufSBjYXRjaChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpXG5cdFx0ZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuXG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqLyhmdW5jdGlvbihnbG9iYWwpIHsvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuXG5cbnZhciBiYXNlNjQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpXG52YXIgaWVlZTc1NCA9IF9fd2VicGFja19yZXF1aXJlX18oNClcbnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHlwZWRBcnJheVN1cHBvcnQoKVxuXG4vKlxuICogRXhwb3J0IGtNYXhMZW5ndGggYWZ0ZXIgdHlwZWQgYXJyYXkgc3VwcG9ydCBpcyBkZXRlcm1pbmVkLlxuICovXG5leHBvcnRzLmtNYXhMZW5ndGggPSBrTWF4TGVuZ3RoKClcblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5fX3Byb3RvX18gPSB7X19wcm90b19fOiBVaW50OEFycmF5LnByb3RvdHlwZSwgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9fVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChrTWF4TGVuZ3RoKCkgPCBsZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKVxuICB9XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gICAgfVxuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiAhKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20odGhpcywgYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBmcm9tICh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhhdCwgdmFsdWUpXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgICAvLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jICh0aGF0LCBzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhudWxsLCBzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHRoYXQsIHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIHRoYXQgPSB0aGF0LnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgYXJyYXkuYnl0ZUxlbmd0aCAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ29mZnNldFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnbGVuZ3RoXFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBhcnJheVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbUFycmF5TGlrZSh0aGF0LCBhcnJheSlcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pXG5cbiAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGF0XG4gICAgfVxuXG4gICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKVxuICAgIHJldHVybiB0aGF0XG4gIH1cblxuICBpZiAob2JqKSB7XG4gICAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgJ2xlbmd0aCcgaW4gb2JqKSB7XG4gICAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IGlzbmFuKG9iai5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgMClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iailcbiAgICB9XG5cbiAgICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmouZGF0YSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJylcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGgoKWAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgc3RyaW5nIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmdcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhlIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgYW5kIGBpcy1idWZmZXJgIChpbiBTYWZhcmkgNS03KSB0byBkZXRlY3Rcbi8vIEJ1ZmZlciBpbnN0YW5jZXMuXG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgIC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChpc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmXG4gICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgKytpKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZlxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKGNvZGUgPCAyNTYpIHtcbiAgICAgICAgdmFsID0gY29kZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IHV0ZjhUb0J5dGVzKG5ldyBCdWZmZXIodmFsLCBlbmNvZGluZykudG9TdHJpbmcoKSlcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gaXNuYW4gKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSB2YWwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cblxuLyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oMCkpKVxuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKGdsb2JhbCwgQnVmZmVyKSB7KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcblx0IHRydWUgPyBmYWN0b3J5KGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oNiksIF9fd2VicGFja19yZXF1aXJlX18oMSkpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdsb25nJywgJ2J1ZmZlciddLCBmYWN0b3J5KSA6XG5cdChmYWN0b3J5KChnbG9iYWwuQlNPTiA9IHt9KSxnbG9iYWwubG9uZyxnbG9iYWwuQnVmZmVyKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cyxsb25nLGJ1ZmZlcikgeyAndXNlIHN0cmljdCc7XG5cblx0bG9uZyA9IGxvbmcgJiYgbG9uZy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdCcpID8gbG9uZ1snZGVmYXVsdCddIDogbG9uZztcblx0YnVmZmVyID0gYnVmZmVyICYmIGJ1ZmZlci5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdCcpID8gYnVmZmVyWydkZWZhdWx0J10gOiBidWZmZXI7XG5cblx0dmFyIGNvbW1vbmpzR2xvYmFsID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTtcblxuXHRmdW5jdGlvbiBjcmVhdGVDb21tb25qc01vZHVsZShmbiwgbW9kdWxlKSB7XG5cdFx0cmV0dXJuIG1vZHVsZSA9IHsgZXhwb3J0czoge30gfSwgZm4obW9kdWxlLCBtb2R1bGUuZXhwb3J0cyksIG1vZHVsZS5leHBvcnRzO1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZSAobikge1xuXHRcdHJldHVybiBuICYmIG4uZGVmYXVsdCB8fCBuO1xuXHR9XG5cblx0dmFyIG1hcCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcblxuXHQgIGlmICh0eXBlb2YgY29tbW9uanNHbG9iYWwuTWFwICE9PSAndW5kZWZpbmVkJykge1xuXHQgICAgbW9kdWxlLmV4cG9ydHMgPSBjb21tb25qc0dsb2JhbC5NYXA7XG5cdCAgICBtb2R1bGUuZXhwb3J0cy5NYXAgPSBjb21tb25qc0dsb2JhbC5NYXA7XG5cdCAgfSBlbHNlIHtcblx0ICAgIC8vIFdlIHdpbGwgcmV0dXJuIGEgcG9seWZpbGxcblx0ICAgIHZhciBNYXAgPSBmdW5jdGlvbiBNYXAoYXJyYXkpIHtcblx0ICAgICAgdGhpcy5fa2V5cyA9IFtdO1xuXHQgICAgICB0aGlzLl92YWx1ZXMgPSB7fTtcblxuXHQgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgaWYgKGFycmF5W2ldID09IG51bGwpIGNvbnRpbnVlOyAvLyBza2lwIG51bGwgYW5kIHVuZGVmaW5lZFxuXG5cdCAgICAgICAgdmFyIGVudHJ5ID0gYXJyYXlbaV07XG5cdCAgICAgICAgdmFyIGtleSA9IGVudHJ5WzBdO1xuXHQgICAgICAgIHZhciB2YWx1ZSA9IGVudHJ5WzFdOyAvLyBBZGQgdGhlIGtleSB0byB0aGUgbGlzdCBvZiBrZXlzIGluIG9yZGVyXG5cblx0ICAgICAgICB0aGlzLl9rZXlzLnB1c2goa2V5KTsgLy8gQWRkIHRoZSBrZXkgYW5kIHZhbHVlIHRvIHRoZSB2YWx1ZXMgZGljdGlvbmFyeSB3aXRoIGEgcG9pbnRcblx0ICAgICAgICAvLyB0byB0aGUgbG9jYXRpb24gaW4gdGhlIG9yZGVyZWQga2V5cyBsaXN0XG5cblxuXHQgICAgICAgIHRoaXMuX3ZhbHVlc1trZXldID0ge1xuXHQgICAgICAgICAgdjogdmFsdWUsXG5cdCAgICAgICAgICBpOiB0aGlzLl9rZXlzLmxlbmd0aCAtIDFcblx0ICAgICAgICB9O1xuXHQgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICBNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLl9rZXlzID0gW107XG5cdCAgICAgIHRoaXMuX3ZhbHVlcyA9IHt9O1xuXHQgICAgfTtcblxuXHQgICAgTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG5cdCAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX3ZhbHVlc1trZXldO1xuXHQgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyAvLyBEZWxldGUgZW50cnlcblxuXHQgICAgICBkZWxldGUgdGhpcy5fdmFsdWVzW2tleV07IC8vIFJlbW92ZSB0aGUga2V5IGZyb20gdGhlIG9yZGVyZWQga2V5cyBsaXN0XG5cblx0ICAgICAgdGhpcy5fa2V5cy5zcGxpY2UodmFsdWUuaSwgMSk7XG5cblx0ICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICB9O1xuXG5cdCAgICBNYXAucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBzZWxmID0gdGhpcztcblx0ICAgICAgdmFyIGluZGV4ID0gMDtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuXHQgICAgICAgICAgdmFyIGtleSA9IHNlbGYuX2tleXNbaW5kZXgrK107XG5cdCAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICB2YWx1ZToga2V5ICE9PSB1bmRlZmluZWQgPyBba2V5LCBzZWxmLl92YWx1ZXNba2V5XS52XSA6IHVuZGVmaW5lZCxcblx0ICAgICAgICAgICAgZG9uZToga2V5ICE9PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWVcblx0ICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgfTtcblxuXHQgICAgTWFwLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBzZWxmKSB7XG5cdCAgICAgIHNlbGYgPSBzZWxmIHx8IHRoaXM7XG5cblx0ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9rZXlzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgdmFyIGtleSA9IHRoaXMuX2tleXNbaV07IC8vIENhbGwgdGhlIGZvckVhY2ggY2FsbGJhY2tcblxuXHQgICAgICAgIGNhbGxiYWNrLmNhbGwoc2VsZiwgdGhpcy5fdmFsdWVzW2tleV0udiwga2V5LCBzZWxmKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNba2V5XSA/IHRoaXMuX3ZhbHVlc1trZXldLnYgOiB1bmRlZmluZWQ7XG5cdCAgICB9O1xuXG5cdCAgICBNYXAucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc1trZXldICE9IG51bGw7XG5cdCAgICB9O1xuXG5cdCAgICBNYXAucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBzZWxmID0gdGhpcztcblx0ICAgICAgdmFyIGluZGV4ID0gMDtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuXHQgICAgICAgICAgdmFyIGtleSA9IHNlbGYuX2tleXNbaW5kZXgrK107XG5cdCAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICB2YWx1ZToga2V5ICE9PSB1bmRlZmluZWQgPyBrZXkgOiB1bmRlZmluZWQsXG5cdCAgICAgICAgICAgIGRvbmU6IGtleSAhPT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlXG5cdCAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgIH07XG5cblx0ICAgIE1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0ICAgICAgaWYgKHRoaXMuX3ZhbHVlc1trZXldKSB7XG5cdCAgICAgICAgdGhpcy5fdmFsdWVzW2tleV0udiA9IHZhbHVlO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgICB9IC8vIEFkZCB0aGUga2V5IHRvIHRoZSBsaXN0IG9mIGtleXMgaW4gb3JkZXJcblxuXG5cdCAgICAgIHRoaXMuX2tleXMucHVzaChrZXkpOyAvLyBBZGQgdGhlIGtleSBhbmQgdmFsdWUgdG8gdGhlIHZhbHVlcyBkaWN0aW9uYXJ5IHdpdGggYSBwb2ludFxuXHQgICAgICAvLyB0byB0aGUgbG9jYXRpb24gaW4gdGhlIG9yZGVyZWQga2V5cyBsaXN0XG5cblxuXHQgICAgICB0aGlzLl92YWx1ZXNba2V5XSA9IHtcblx0ICAgICAgICB2OiB2YWx1ZSxcblx0ICAgICAgICBpOiB0aGlzLl9rZXlzLmxlbmd0aCAtIDFcblx0ICAgICAgfTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXG5cdCAgICBNYXAucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXHQgICAgICB2YXIgaW5kZXggPSAwO1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG5cdCAgICAgICAgICB2YXIga2V5ID0gc2VsZi5fa2V5c1tpbmRleCsrXTtcblx0ICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHZhbHVlOiBrZXkgIT09IHVuZGVmaW5lZCA/IHNlbGYuX3ZhbHVlc1trZXldLnYgOiB1bmRlZmluZWQsXG5cdCAgICAgICAgICAgIGRvbmU6IGtleSAhPT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0cnVlXG5cdCAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgIH07IC8vIExhc3QgaXNtYXN0ZXJcblxuXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLnByb3RvdHlwZSwgJ3NpemUnLCB7XG5cdCAgICAgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICBtb2R1bGUuZXhwb3J0cyA9IE1hcDtcblx0ICB9XG5cdH0pO1xuXHR2YXIgbWFwXzEgPSBtYXAuTWFwO1xuXG5cdC8qKlxuXHQgKiBAaWdub3JlXG5cdCAqL1xuXG5cblx0bG9uZy5wcm90b3R5cGUudG9FeHRlbmRlZEpTT04gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXHQgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVsYXhlZCkgcmV0dXJuIHRoaXMudG9OdW1iZXIoKTtcblx0ICByZXR1cm4ge1xuXHQgICAgJG51bWJlckxvbmc6IHRoaXMudG9TdHJpbmcoKVxuXHQgIH07XG5cdH07XG5cdC8qKlxuXHQgKiBAaWdub3JlXG5cdCAqL1xuXG5cblx0bG9uZy5mcm9tRXh0ZW5kZWRKU09OID0gZnVuY3Rpb24gKGRvYywgb3B0aW9ucykge1xuXHQgIHZhciByZXN1bHQgPSBsb25nLmZyb21TdHJpbmcoZG9jLiRudW1iZXJMb25nKTtcblx0ICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLnJlbGF4ZWQgPyByZXN1bHQudG9OdW1iZXIoKSA6IHJlc3VsdDtcblx0fTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobG9uZy5wcm90b3R5cGUsICdfYnNvbnR5cGUnLCB7XG5cdCAgdmFsdWU6ICdMb25nJ1xuXHR9KTtcblx0dmFyIGxvbmdfMSA9IGxvbmc7XG5cblx0LyoqXG5cdCAqIEEgY2xhc3MgcmVwcmVzZW50YXRpb24gb2YgdGhlIEJTT04gRG91YmxlIHR5cGUuXG5cdCAqL1xuXG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cblx0ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cblx0dmFyIERvdWJsZSA9XG5cdC8qI19fUFVSRV9fKi9cblx0ZnVuY3Rpb24gKCkge1xuXHQgIC8qKlxuXHQgICAqIENyZWF0ZSBhIERvdWJsZSB0eXBlXG5cdCAgICpcblx0ICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgdGhlIG51bWJlciB3ZSB3YW50IHRvIHJlcHJlc2VudCBhcyBhIGRvdWJsZS5cblx0ICAgKiBAcmV0dXJuIHtEb3VibGV9XG5cdCAgICovXG5cdCAgZnVuY3Rpb24gRG91YmxlKHZhbHVlKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRG91YmxlKTtcblxuXHQgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgIH1cblx0ICAvKipcblx0ICAgKiBBY2Nlc3MgdGhlIG51bWJlciB2YWx1ZS5cblx0ICAgKlxuXHQgICAqIEBtZXRob2Rcblx0ICAgKiBAcmV0dXJuIHtudW1iZXJ9IHJldHVybnMgdGhlIHdyYXBwZWQgZG91YmxlIG51bWJlci5cblx0ICAgKi9cblxuXG5cdCAgX2NyZWF0ZUNsYXNzKERvdWJsZSwgW3tcblx0ICAgIGtleTogXCJ2YWx1ZU9mXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWVPZigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInRvSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInRvRXh0ZW5kZWRKU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9FeHRlbmRlZEpTT04ob3B0aW9ucykge1xuXHQgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlbGF4ZWQgJiYgaXNGaW5pdGUodGhpcy52YWx1ZSkpIHJldHVybiB0aGlzLnZhbHVlO1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgICRudW1iZXJEb3VibGU6IHRoaXMudmFsdWUudG9TdHJpbmcoKVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH1dLCBbe1xuXHQgICAga2V5OiBcImZyb21FeHRlbmRlZEpTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tRXh0ZW5kZWRKU09OKGRvYywgb3B0aW9ucykge1xuXHQgICAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLnJlbGF4ZWQgPyBwYXJzZUZsb2F0KGRvYy4kbnVtYmVyRG91YmxlKSA6IG5ldyBEb3VibGUocGFyc2VGbG9hdChkb2MuJG51bWJlckRvdWJsZSkpO1xuXHQgICAgfVxuXHQgIH1dKTtcblxuXHQgIHJldHVybiBEb3VibGU7XG5cdH0oKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoRG91YmxlLnByb3RvdHlwZSwgJ19ic29udHlwZScsIHtcblx0ICB2YWx1ZTogJ0RvdWJsZSdcblx0fSk7XG5cdHZhciBkb3VibGVfMSA9IERvdWJsZTtcblxuXHRmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQxKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuXHRmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQxKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuXHRmdW5jdGlvbiBfY3JlYXRlQ2xhc3MkMShDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDEoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQxKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5cdGZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuXHRmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuXHRmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cblx0ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuXHRmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXHQvKipcblx0ICogQGNsYXNzXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgIHRoZSBsb3cgKHNpZ25lZCkgMzIgYml0cyBvZiB0aGUgVGltZXN0YW1wLlxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGlnaCB0aGUgaGlnaCAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBUaW1lc3RhbXAuXG5cdCAqIEByZXR1cm4ge1RpbWVzdGFtcH1cblx0ICovXG5cblxuXHR2YXIgVGltZXN0YW1wID1cblx0LyojX19QVVJFX18qL1xuXHRmdW5jdGlvbiAoX0xvbmcpIHtcblx0ICBfaW5oZXJpdHMoVGltZXN0YW1wLCBfTG9uZyk7XG5cblx0ICBmdW5jdGlvbiBUaW1lc3RhbXAobG93LCBoaWdoKSB7XG5cdCAgICB2YXIgX3RoaXM7XG5cblx0ICAgIF9jbGFzc0NhbGxDaGVjayQxKHRoaXMsIFRpbWVzdGFtcCk7XG5cblx0ICAgIGlmIChsb25nXzEuaXNMb25nKGxvdykpIHtcblx0ICAgICAgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfZ2V0UHJvdG90eXBlT2YoVGltZXN0YW1wKS5jYWxsKHRoaXMsIGxvdy5sb3csIGxvdy5oaWdoKSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9nZXRQcm90b3R5cGVPZihUaW1lc3RhbXApLmNhbGwodGhpcywgbG93LCBoaWdoKSk7XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcyk7XG5cdCAgfVxuXHQgIC8qKlxuXHQgICAqIFJldHVybiB0aGUgSlNPTiB2YWx1ZS5cblx0ICAgKlxuXHQgICAqIEBtZXRob2Rcblx0ICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBKU09OIHJlcHJlc2VudGF0aW9uLlxuXHQgICAqL1xuXG5cblx0ICBfY3JlYXRlQ2xhc3MkMShUaW1lc3RhbXAsIFt7XG5cdCAgICBrZXk6IFwidG9KU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgICR0aW1lc3RhbXA6IHRoaXMudG9TdHJpbmcoKVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBSZXR1cm5zIGEgVGltZXN0YW1wIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiAoMzItYml0KSBpbnRlZ2VyIHZhbHVlLlxuXHQgICAgICpcblx0ICAgICAqIEBtZXRob2Rcblx0ICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSB0aGUgMzItYml0IGludGVnZXIgaW4gcXVlc3Rpb24uXG5cdCAgICAgKiBAcmV0dXJuIHtUaW1lc3RhbXB9IHRoZSB0aW1lc3RhbXAuXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJ0b0V4dGVuZGVkSlNPTlwiLFxuXG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvRXh0ZW5kZWRKU09OKCkge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgICR0aW1lc3RhbXA6IHtcblx0ICAgICAgICAgIHQ6IHRoaXMuaGlnaCxcblx0ICAgICAgICAgIGk6IHRoaXMubG93XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH1dLCBbe1xuXHQgICAga2V5OiBcImZyb21JbnRcIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tSW50KHZhbHVlKSB7XG5cdCAgICAgIHJldHVybiBuZXcgVGltZXN0YW1wKGxvbmdfMS5mcm9tSW50KHZhbHVlKSk7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIFJldHVybnMgYSBUaW1lc3RhbXAgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBudW1iZXIgdmFsdWUsIHByb3ZpZGVkIHRoYXQgaXQgaXMgYSBmaW5pdGUgbnVtYmVyLiBPdGhlcndpc2UsIHplcm8gaXMgcmV0dXJuZWQuXG5cdCAgICAgKlxuXHQgICAgICogQG1ldGhvZFxuXHQgICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIHRoZSBudW1iZXIgaW4gcXVlc3Rpb24uXG5cdCAgICAgKiBAcmV0dXJuIHtUaW1lc3RhbXB9IHRoZSB0aW1lc3RhbXAuXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJmcm9tTnVtYmVyXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbU51bWJlcih2YWx1ZSkge1xuXHQgICAgICByZXR1cm4gbmV3IFRpbWVzdGFtcChsb25nXzEuZnJvbU51bWJlcih2YWx1ZSkpO1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBSZXR1cm5zIGEgVGltZXN0YW1wIGZvciB0aGUgZ2l2ZW4gaGlnaCBhbmQgbG93IGJpdHMuIEVhY2ggaXMgYXNzdW1lZCB0byB1c2UgMzIgYml0cy5cblx0ICAgICAqXG5cdCAgICAgKiBAbWV0aG9kXG5cdCAgICAgKiBAcGFyYW0ge251bWJlcn0gbG93Qml0cyB0aGUgbG93IDMyLWJpdHMuXG5cdCAgICAgKiBAcGFyYW0ge251bWJlcn0gaGlnaEJpdHMgdGhlIGhpZ2ggMzItYml0cy5cblx0ICAgICAqIEByZXR1cm4ge1RpbWVzdGFtcH0gdGhlIHRpbWVzdGFtcC5cblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcImZyb21CaXRzXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUJpdHMobG93Qml0cywgaGlnaEJpdHMpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBUaW1lc3RhbXAobG93Qml0cywgaGlnaEJpdHMpO1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBSZXR1cm5zIGEgVGltZXN0YW1wIGZyb20gdGhlIGdpdmVuIHN0cmluZywgb3B0aW9uYWxseSB1c2luZyB0aGUgZ2l2ZW4gcmFkaXguXG5cdCAgICAgKlxuXHQgICAgICogQG1ldGhvZFxuXHQgICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgVGltZXN0YW1wLlxuXHQgICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRfcmFkaXhdIHRoZSByYWRpeCBpbiB3aGljaCB0aGUgdGV4dCBpcyB3cml0dGVuLlxuXHQgICAgICogQHJldHVybiB7VGltZXN0YW1wfSB0aGUgdGltZXN0YW1wLlxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwiZnJvbVN0cmluZ1wiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyLCBvcHRfcmFkaXgpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBUaW1lc3RhbXAobG9uZ18xLmZyb21TdHJpbmcoc3RyLCBvcHRfcmFkaXgpKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwiZnJvbUV4dGVuZGVkSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21FeHRlbmRlZEpTT04oZG9jKSB7XG5cdCAgICAgIHJldHVybiBuZXcgVGltZXN0YW1wKGRvYy4kdGltZXN0YW1wLmksIGRvYy4kdGltZXN0YW1wLnQpO1xuXHQgICAgfVxuXHQgIH1dKTtcblxuXHQgIHJldHVybiBUaW1lc3RhbXA7XG5cdH0obG9uZ18xKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoVGltZXN0YW1wLnByb3RvdHlwZSwgJ19ic29udHlwZScsIHtcblx0ICB2YWx1ZTogJ1RpbWVzdGFtcCdcblx0fSk7XG5cdHZhciB0aW1lc3RhbXAgPSBUaW1lc3RhbXA7XG5cblx0dmFyIGVtcHR5ID0ge307XG5cblx0dmFyIGVtcHR5JDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdFx0ZGVmYXVsdDogZW1wdHlcblx0fSk7XG5cblx0dmFyIHJlcXVpcmUkJDAgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKGVtcHR5JDEpO1xuXG5cdC8qIGdsb2JhbCB3aW5kb3cgKi9cblxuXHQvKipcblx0ICogTm9ybWFsaXplcyBvdXIgZXhwZWN0ZWQgc3RyaW5naWZpZWQgZm9ybSBvZiBhIGZ1bmN0aW9uIGFjcm9zcyB2ZXJzaW9ucyBvZiBub2RlXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBzdHJpbmdpZnlcblx0ICovXG5cblxuXHRmdW5jdGlvbiBub3JtYWxpemVkRnVuY3Rpb25TdHJpbmcoZm4pIHtcblx0ICByZXR1cm4gZm4udG9TdHJpbmcoKS5yZXBsYWNlKCdmdW5jdGlvbignLCAnZnVuY3Rpb24gKCcpO1xuXHR9XG5cblx0ZnVuY3Rpb24gaW5zZWN1cmVSYW5kb21CeXRlcyhzaXplKSB7XG5cdCAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuXG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcblx0ICAgIHJlc3VsdFtpXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nik7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHZhciByYW5kb21CeXRlcyA9IGluc2VjdXJlUmFuZG9tQnl0ZXM7XG5cblx0aWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8gJiYgd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcblx0ICByYW5kb21CeXRlcyA9IGZ1bmN0aW9uIHJhbmRvbUJ5dGVzKHNpemUpIHtcblx0ICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShzaXplKSk7XG5cdCAgfTtcblx0fSBlbHNlIHtcblx0ICB0cnkge1xuXHQgICAgcmFuZG9tQnl0ZXMgPSByZXF1aXJlJCQwLnJhbmRvbUJ5dGVzO1xuXHQgIH0gY2F0Y2ggKGUpIHt9IC8vIGtlZXAgdGhlIGZhbGxiYWNrXG5cdCAgLy8gTk9URTogaW4gdHJhbnNwaWxlZCBjYXNlcyB0aGUgYWJvdmUgcmVxdWlyZSBtaWdodCByZXR1cm4gbnVsbC91bmRlZmluZWRcblxuXG5cdCAgaWYgKHJhbmRvbUJ5dGVzID09IG51bGwpIHtcblx0ICAgIHJhbmRvbUJ5dGVzID0gaW5zZWN1cmVSYW5kb21CeXRlcztcblx0ICB9XG5cdH1cblxuXHR2YXIgdXRpbHMgPSB7XG5cdCAgbm9ybWFsaXplZEZ1bmN0aW9uU3RyaW5nOiBub3JtYWxpemVkRnVuY3Rpb25TdHJpbmcsXG5cdCAgcmFuZG9tQnl0ZXM6IHJhbmRvbUJ5dGVzXG5cdH07XG5cblx0Ly8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cdC8vIGJhc2VkIG9mZiBodHRwczovL2dpdGh1Yi5jb20vZGVmdW5jdHpvbWJpZS9ub2RlLXByb2Nlc3MvYmxvYi9tYXN0ZXIvYnJvd3Nlci5qc1xuXHRmdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuXHQgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xuXHR9XG5cblx0ZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCgpIHtcblx0ICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xuXHR9XG5cblx0dmFyIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuXHR2YXIgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcblxuXHRpZiAodHlwZW9mIGdsb2JhbC5zZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG5cdH1cblxuXHRpZiAodHlwZW9mIGdsb2JhbC5jbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcblx0ICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG5cdH1cblxuXHRmdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuXHQgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG5cdCAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcblx0ICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG5cdCAgfSAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuXG5cblx0ICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcblx0ICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuXHQgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICB9XG5cblx0ICB0cnkge1xuXHQgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuXHQgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICB9IGNhdGNoIChlKSB7XG5cdCAgICB0cnkge1xuXHQgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcblx0ICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuXHQgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuXHQgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG5cdCAgICB9XG5cdCAgfVxuXHR9XG5cblx0ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuXHQgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuXHQgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG5cdCAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgfSAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG5cblxuXHQgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuXHQgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuXHQgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuXHQgIH1cblxuXHQgIHRyeSB7XG5cdCAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG5cdCAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgfSBjYXRjaCAoZSkge1xuXHQgICAgdHJ5IHtcblx0ICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuXHQgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcblx0ICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG5cdCAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcblx0ICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG5cdCAgICB9XG5cdCAgfVxuXHR9XG5cblx0dmFyIHF1ZXVlID0gW107XG5cdHZhciBkcmFpbmluZyA9IGZhbHNlO1xuXHR2YXIgY3VycmVudFF1ZXVlO1xuXHR2YXIgcXVldWVJbmRleCA9IC0xO1xuXG5cdGZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcblx0ICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcblx0ICAgIHJldHVybjtcblx0ICB9XG5cblx0ICBkcmFpbmluZyA9IGZhbHNlO1xuXG5cdCAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcblx0ICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIHF1ZXVlSW5kZXggPSAtMTtcblx0ICB9XG5cblx0ICBpZiAocXVldWUubGVuZ3RoKSB7XG5cdCAgICBkcmFpblF1ZXVlKCk7XG5cdCAgfVxuXHR9XG5cblx0ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcblx0ICBpZiAoZHJhaW5pbmcpIHtcblx0ICAgIHJldHVybjtcblx0ICB9XG5cblx0ICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcblx0ICBkcmFpbmluZyA9IHRydWU7XG5cdCAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcblxuXHQgIHdoaWxlIChsZW4pIHtcblx0ICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuXHQgICAgcXVldWUgPSBbXTtcblxuXHQgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuXHQgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG5cdCAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIHF1ZXVlSW5kZXggPSAtMTtcblx0ICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcblx0ICB9XG5cblx0ICBjdXJyZW50UXVldWUgPSBudWxsO1xuXHQgIGRyYWluaW5nID0gZmFsc2U7XG5cdCAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHR9XG5cblx0ZnVuY3Rpb24gbmV4dFRpY2soZnVuKSB7XG5cdCAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuXG5cdCAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdCAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuXG5cdCAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcblx0ICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG5cdCAgfVxuXHR9IC8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcblxuXHRmdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcblx0ICB0aGlzLmZ1biA9IGZ1bjtcblx0ICB0aGlzLmFycmF5ID0gYXJyYXk7XG5cdH1cblxuXHRJdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG5cdH07XG5cblx0dmFyIHRpdGxlID0gJ2Jyb3dzZXInO1xuXHR2YXIgcGxhdGZvcm0gPSAnYnJvd3Nlcic7XG5cdHZhciBicm93c2VyID0gdHJ1ZTtcblx0dmFyIGVudiA9IHt9O1xuXHR2YXIgYXJndiA9IFtdO1xuXHR2YXIgdmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xuXG5cdHZhciB2ZXJzaW9ucyA9IHt9O1xuXHR2YXIgcmVsZWFzZSA9IHt9O1xuXHR2YXIgY29uZmlnID0ge307XG5cblx0ZnVuY3Rpb24gbm9vcCgpIHt9XG5cblx0dmFyIG9uID0gbm9vcDtcblx0dmFyIGFkZExpc3RlbmVyID0gbm9vcDtcblx0dmFyIG9uY2UgPSBub29wO1xuXHR2YXIgb2ZmID0gbm9vcDtcblx0dmFyIHJlbW92ZUxpc3RlbmVyID0gbm9vcDtcblx0dmFyIHJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5cdHZhciBlbWl0ID0gbm9vcDtcblx0ZnVuY3Rpb24gYmluZGluZyhuYW1lKSB7XG5cdCAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xuXHR9XG5cdGZ1bmN0aW9uIGN3ZCgpIHtcblx0ICByZXR1cm4gJy8nO1xuXHR9XG5cdGZ1bmN0aW9uIGNoZGlyKGRpcikge1xuXHQgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG5cdH1cblx0ZnVuY3Rpb24gdW1hc2soKSB7XG5cdCAgcmV0dXJuIDA7XG5cdH0gLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20va3VtYXZpcy9icm93c2VyLXByb2Nlc3MtaHJ0aW1lL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG5cblx0dmFyIHBlcmZvcm1hbmNlID0gZ2xvYmFsLnBlcmZvcm1hbmNlIHx8IHt9O1xuXG5cdHZhciBwZXJmb3JtYW5jZU5vdyA9IHBlcmZvcm1hbmNlLm5vdyB8fCBwZXJmb3JtYW5jZS5tb3pOb3cgfHwgcGVyZm9ybWFuY2UubXNOb3cgfHwgcGVyZm9ybWFuY2Uub05vdyB8fCBwZXJmb3JtYW5jZS53ZWJraXROb3cgfHwgZnVuY3Rpb24gKCkge1xuXHQgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblx0fTsgLy8gZ2VuZXJhdGUgdGltZXN0YW1wIG9yIGRlbHRhXG5cdC8vIHNlZSBodHRwOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19ocnRpbWVcblxuXG5cdGZ1bmN0aW9uIGhydGltZShwcmV2aW91c1RpbWVzdGFtcCkge1xuXHQgIHZhciBjbG9ja3RpbWUgPSBwZXJmb3JtYW5jZU5vdy5jYWxsKHBlcmZvcm1hbmNlKSAqIDFlLTM7XG5cdCAgdmFyIHNlY29uZHMgPSBNYXRoLmZsb29yKGNsb2NrdGltZSk7XG5cdCAgdmFyIG5hbm9zZWNvbmRzID0gTWF0aC5mbG9vcihjbG9ja3RpbWUgJSAxICogMWU5KTtcblxuXHQgIGlmIChwcmV2aW91c1RpbWVzdGFtcCkge1xuXHQgICAgc2Vjb25kcyA9IHNlY29uZHMgLSBwcmV2aW91c1RpbWVzdGFtcFswXTtcblx0ICAgIG5hbm9zZWNvbmRzID0gbmFub3NlY29uZHMgLSBwcmV2aW91c1RpbWVzdGFtcFsxXTtcblxuXHQgICAgaWYgKG5hbm9zZWNvbmRzIDwgMCkge1xuXHQgICAgICBzZWNvbmRzLS07XG5cdCAgICAgIG5hbm9zZWNvbmRzICs9IDFlOTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICByZXR1cm4gW3NlY29uZHMsIG5hbm9zZWNvbmRzXTtcblx0fVxuXHR2YXIgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcblx0ZnVuY3Rpb24gdXB0aW1lKCkge1xuXHQgIHZhciBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCk7XG5cdCAgdmFyIGRpZiA9IGN1cnJlbnRUaW1lIC0gc3RhcnRUaW1lO1xuXHQgIHJldHVybiBkaWYgLyAxMDAwO1xuXHR9XG5cdHZhciBwcm9jZXNzID0ge1xuXHQgIG5leHRUaWNrOiBuZXh0VGljayxcblx0ICB0aXRsZTogdGl0bGUsXG5cdCAgYnJvd3NlcjogYnJvd3Nlcixcblx0ICBlbnY6IGVudixcblx0ICBhcmd2OiBhcmd2LFxuXHQgIHZlcnNpb246IHZlcnNpb24sXG5cdCAgdmVyc2lvbnM6IHZlcnNpb25zLFxuXHQgIG9uOiBvbixcblx0ICBhZGRMaXN0ZW5lcjogYWRkTGlzdGVuZXIsXG5cdCAgb25jZTogb25jZSxcblx0ICBvZmY6IG9mZixcblx0ICByZW1vdmVMaXN0ZW5lcjogcmVtb3ZlTGlzdGVuZXIsXG5cdCAgcmVtb3ZlQWxsTGlzdGVuZXJzOiByZW1vdmVBbGxMaXN0ZW5lcnMsXG5cdCAgZW1pdDogZW1pdCxcblx0ICBiaW5kaW5nOiBiaW5kaW5nLFxuXHQgIGN3ZDogY3dkLFxuXHQgIGNoZGlyOiBjaGRpcixcblx0ICB1bWFzazogdW1hc2ssXG5cdCAgaHJ0aW1lOiBocnRpbWUsXG5cdCAgcGxhdGZvcm06IHBsYXRmb3JtLFxuXHQgIHJlbGVhc2U6IHJlbGVhc2UsXG5cdCAgY29uZmlnOiBjb25maWcsXG5cdCAgdXB0aW1lOiB1cHRpbWVcblx0fTtcblxuXHR2YXIgaW5oZXJpdHM7XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgaW5oZXJpdHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcblx0ICAgIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG5cdCAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3Rvcjtcblx0ICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG5cdCAgICAgIGNvbnN0cnVjdG9yOiB7XG5cdCAgICAgICAgdmFsdWU6IGN0b3IsXG5cdCAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG5cdCAgICAgICAgd3JpdGFibGU6IHRydWUsXG5cdCAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHQgIH07XG5cdH0gZWxzZSB7XG5cdCAgaW5oZXJpdHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcblx0ICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yO1xuXG5cdCAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiBUZW1wQ3RvcigpIHt9O1xuXG5cdCAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlO1xuXHQgICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKTtcblx0ICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3Rvcjtcblx0ICB9O1xuXHR9XG5cblx0dmFyIGluaGVyaXRzJDEgPSBpbmhlcml0cztcblxuXHRmdW5jdGlvbiBfdHlwZW9mJDEob2JqKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mJDEgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiQxID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2YkMShvYmopOyB9XG5cdHZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuXHRmdW5jdGlvbiBmb3JtYXQoZikge1xuXHQgIGlmICghaXNTdHJpbmcoZikpIHtcblx0ICAgIHZhciBvYmplY3RzID0gW107XG5cblx0ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuXHQgICAgfVxuXG5cdCAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG5cdCAgfVxuXG5cdCAgdmFyIGkgPSAxO1xuXHQgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuXHQgIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcblx0ICB2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbiAoeCkge1xuXHQgICAgaWYgKHggPT09ICclJScpIHJldHVybiAnJSc7XG5cdCAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuXG5cdCAgICBzd2l0Y2ggKHgpIHtcblx0ICAgICAgY2FzZSAnJXMnOlxuXHQgICAgICAgIHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcblxuXHQgICAgICBjYXNlICclZCc6XG5cdCAgICAgICAgcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuXG5cdCAgICAgIGNhc2UgJyVqJzpcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG5cdCAgICAgICAgfSBjYXRjaCAoXykge1xuXHQgICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcblx0ICAgICAgICB9XG5cblx0ICAgICAgZGVmYXVsdDpcblx0ICAgICAgICByZXR1cm4geDtcblx0ICAgIH1cblx0ICB9KTtcblxuXHQgIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG5cdCAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuXHQgICAgICBzdHIgKz0gJyAnICsgeDtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiBzdHI7XG5cdH1cblx0Ly8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cblx0Ly8gSWYgLS1uby1kZXByZWNhdGlvbiBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cblxuXHRmdW5jdGlvbiBkZXByZWNhdGUoZm4sIG1zZykge1xuXHQgIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG5cdCAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuXHQgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgcmV0dXJuIGRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgfTtcblx0ICB9XG5cblx0ICB2YXIgd2FybmVkID0gZmFsc2U7XG5cblx0ICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuXHQgICAgaWYgKCF3YXJuZWQpIHtcblx0ICAgICAge1xuXHQgICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIHdhcm5lZCA9IHRydWU7XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgIH1cblxuXHQgIHJldHVybiBkZXByZWNhdGVkO1xuXHR9XG5cdHZhciBkZWJ1Z3MgPSB7fTtcblx0dmFyIGRlYnVnRW52aXJvbjtcblx0ZnVuY3Rpb24gZGVidWdsb2coc2V0KSB7XG5cdCAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG5cdCAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG5cblx0ICBpZiAoIWRlYnVnc1tzZXRdKSB7XG5cdCAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcblx0ICAgICAgdmFyIHBpZCA9IDA7XG5cblx0ICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG1zZyA9IGZvcm1hdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuXHQgICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuXHQgICAgICB9O1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbiAoKSB7fTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICByZXR1cm4gZGVidWdzW3NldF07XG5cdH1cblx0LyoqXG5cdCAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcblx0ICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG5cdCAqL1xuXG5cdC8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cblxuXHRmdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuXHQgIC8vIGRlZmF1bHQgb3B0aW9uc1xuXHQgIHZhciBjdHggPSB7XG5cdCAgICBzZWVuOiBbXSxcblx0ICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG5cdCAgfTsgLy8gbGVnYWN5Li4uXG5cblx0ICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG5cdCAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcblxuXHQgIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcblx0ICAgIC8vIGxlZ2FjeS4uLlxuXHQgICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuXHQgIH0gZWxzZSBpZiAob3B0cykge1xuXHQgICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuXHQgICAgX2V4dGVuZChjdHgsIG9wdHMpO1xuXHQgIH0gLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuXG5cblx0ICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuXHQgIGlmIChpc1VuZGVmaW5lZChjdHguZGVwdGgpKSBjdHguZGVwdGggPSAyO1xuXHQgIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuXHQgIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcblx0ICBpZiAoY3R4LmNvbG9ycykgY3R4LnN0eWxpemUgPSBzdHlsaXplV2l0aENvbG9yO1xuXHQgIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcblx0fSAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3NcblxuXHRpbnNwZWN0LmNvbG9ycyA9IHtcblx0ICAnYm9sZCc6IFsxLCAyMl0sXG5cdCAgJ2l0YWxpYyc6IFszLCAyM10sXG5cdCAgJ3VuZGVybGluZSc6IFs0LCAyNF0sXG5cdCAgJ2ludmVyc2UnOiBbNywgMjddLFxuXHQgICd3aGl0ZSc6IFszNywgMzldLFxuXHQgICdncmV5JzogWzkwLCAzOV0sXG5cdCAgJ2JsYWNrJzogWzMwLCAzOV0sXG5cdCAgJ2JsdWUnOiBbMzQsIDM5XSxcblx0ICAnY3lhbic6IFszNiwgMzldLFxuXHQgICdncmVlbic6IFszMiwgMzldLFxuXHQgICdtYWdlbnRhJzogWzM1LCAzOV0sXG5cdCAgJ3JlZCc6IFszMSwgMzldLFxuXHQgICd5ZWxsb3cnOiBbMzMsIDM5XVxuXHR9OyAvLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcblxuXHRpbnNwZWN0LnN0eWxlcyA9IHtcblx0ICAnc3BlY2lhbCc6ICdjeWFuJyxcblx0ICAnbnVtYmVyJzogJ3llbGxvdycsXG5cdCAgJ2Jvb2xlYW4nOiAneWVsbG93Jyxcblx0ICAndW5kZWZpbmVkJzogJ2dyZXknLFxuXHQgICdudWxsJzogJ2JvbGQnLFxuXHQgICdzdHJpbmcnOiAnZ3JlZW4nLFxuXHQgICdkYXRlJzogJ21hZ2VudGEnLFxuXHQgIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG5cdCAgJ3JlZ2V4cCc6ICdyZWQnXG5cdH07XG5cblx0ZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuXHQgIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cblx0ICBpZiAoc3R5bGUpIHtcblx0ICAgIHJldHVybiBcIlxceDFCW1wiICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICsgXCJcXHgxQltcIiArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcblx0ICB9IGVsc2Uge1xuXHQgICAgcmV0dXJuIHN0cjtcblx0ICB9XG5cdH1cblxuXHRmdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuXHQgIHJldHVybiBzdHI7XG5cdH1cblxuXHRmdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuXHQgIHZhciBoYXNoID0ge307XG5cdCAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbiAodmFsLCBpZHgpIHtcblx0ICAgIGhhc2hbdmFsXSA9IHRydWU7XG5cdCAgfSk7XG5cdCAgcmV0dXJuIGhhc2g7XG5cdH1cblxuXHRmdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcblx0ICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG5cdCAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG5cdCAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUuaW5zcGVjdCkgJiYgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG5cdCAgdmFsdWUuaW5zcGVjdCAhPT0gaW5zcGVjdCAmJiAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cblx0ICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG5cdCAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG5cblx0ICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuXHQgICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcblx0ICAgIH1cblxuXHQgICAgcmV0dXJuIHJldDtcblx0ICB9IC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG5cblxuXHQgIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG5cblx0ICBpZiAocHJpbWl0aXZlKSB7XG5cdCAgICByZXR1cm4gcHJpbWl0aXZlO1xuXHQgIH0gLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuXG5cblx0ICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcblx0ICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuXHQgIGlmIChjdHguc2hvd0hpZGRlbikge1xuXHQgICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcblx0ICB9IC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcblx0ICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuXG5cblx0ICBpZiAoaXNFcnJvcih2YWx1ZSkgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG5cdCAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuXHQgIH0gLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuXG5cblx0ICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcblx0ICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuXHQgICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuXHQgICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuXHQgICAgfVxuXG5cdCAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG5cdCAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG5cdCAgICB9XG5cblx0ICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG5cdCAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcblx0ICAgIH1cblxuXHQgICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG5cdCAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgdmFyIGJhc2UgPSAnJyxcblx0ICAgICAgYXJyYXkgPSBmYWxzZSxcblx0ICAgICAgYnJhY2VzID0gWyd7JywgJ30nXTsgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuXG5cdCAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG5cdCAgICBhcnJheSA9IHRydWU7XG5cdCAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuXHQgIH0gLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG5cblxuXHQgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuXHQgICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcblx0ICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuXHQgIH0gLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcblxuXG5cdCAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuXHQgICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5cdCAgfSAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcblxuXG5cdCAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcblx0ICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcblx0ICB9IC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcblxuXG5cdCAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG5cdCAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuXHQgIH1cblxuXHQgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuXHQgICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG5cdCAgfVxuXG5cdCAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcblx0ICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcblx0ICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXHQgIHZhciBvdXRwdXQ7XG5cblx0ICBpZiAoYXJyYXkpIHtcblx0ICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuXHQgIH0gZWxzZSB7XG5cdCAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdCAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcblx0ICAgIH0pO1xuXHQgIH1cblxuXHQgIGN0eC5zZWVuLnBvcCgpO1xuXHQgIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG5cdH1cblxuXHRmdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuXHQgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuXG5cdCAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuXHQgICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKS5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcblx0ICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcblx0ICB9XG5cblx0ICBpZiAoaXNOdW1iZXIodmFsdWUpKSByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuXHQgIGlmIChpc0Jvb2xlYW4odmFsdWUpKSByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTsgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuXG5cdCAgaWYgKGlzTnVsbCh2YWx1ZSkpIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG5cdH1cblxuXHRmdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuXHQgIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG5cdH1cblxuXHRmdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG5cdCAgdmFyIG91dHB1dCA9IFtdO1xuXG5cdCAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcblx0ICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuXHQgICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBTdHJpbmcoaSksIHRydWUpKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIG91dHB1dC5wdXNoKCcnKTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuXHQgICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG5cdCAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgdHJ1ZSkpO1xuXHQgICAgfVxuXHQgIH0pO1xuXHQgIHJldHVybiBvdXRwdXQ7XG5cdH1cblxuXHRmdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG5cdCAgdmFyIG5hbWUsIHN0ciwgZGVzYztcblx0ICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7XG5cdCAgICB2YWx1ZTogdmFsdWVba2V5XVxuXHQgIH07XG5cblx0ICBpZiAoZGVzYy5nZXQpIHtcblx0ICAgIGlmIChkZXNjLnNldCkge1xuXHQgICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIGlmIChkZXNjLnNldCkge1xuXHQgICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcblx0ICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG5cdCAgfVxuXG5cdCAgaWYgKCFzdHIpIHtcblx0ICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuXHQgICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcblx0ICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG5cdCAgICAgIH1cblxuXHQgICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcblx0ICAgICAgICBpZiAoYXJyYXkpIHtcblx0ICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uIChsaW5lKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcblx0ICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbiAobGluZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuXHQgICAgICAgICAgfSkuam9pbignXFxuJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG5cdCAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuXHQgICAgICByZXR1cm4gc3RyO1xuXHQgICAgfVxuXG5cdCAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuXG5cdCAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcblx0ICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG5cdCAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKS5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuXHQgICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcblx0fVxuXG5cdGZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG5cdCAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cikge1xuXHQgICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSA7XG5cdCAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG5cdCAgfSwgMCk7XG5cblx0ICBpZiAobGVuZ3RoID4gNjApIHtcblx0ICAgIHJldHVybiBicmFjZXNbMF0gKyAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICsgJyAnICsgb3V0cHV0LmpvaW4oJyxcXG4gICcpICsgJyAnICsgYnJhY2VzWzFdO1xuXHQgIH1cblxuXHQgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG5cdH0gLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG5cdC8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuXG5cblx0ZnVuY3Rpb24gaXNBcnJheShhcikge1xuXHQgIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcblx0fVxuXHRmdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG5cdCAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcblx0fVxuXHRmdW5jdGlvbiBpc051bGwoYXJnKSB7XG5cdCAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcblx0fVxuXHRmdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcblx0ICByZXR1cm4gYXJnID09IG51bGw7XG5cdH1cblx0ZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG5cdCAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xuXHR9XG5cdGZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuXHQgIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcblx0fVxuXHRmdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcblx0ICByZXR1cm4gX3R5cGVvZiQxKGFyZykgPT09ICdzeW1ib2wnO1xuXHR9XG5cdGZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuXHQgIHJldHVybiBhcmcgPT09IHZvaWQgMDtcblx0fVxuXHRmdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuXHQgIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcblx0fVxuXHRmdW5jdGlvbiBpc09iamVjdChhcmcpIHtcblx0ICByZXR1cm4gX3R5cGVvZiQxKGFyZykgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcblx0fVxuXHRmdW5jdGlvbiBpc0RhdGUoZCkge1xuXHQgIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xuXHR9XG5cdGZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuXHQgIHJldHVybiBpc09iamVjdChlKSAmJiAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcblx0fVxuXHRmdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuXHQgIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xuXHR9XG5cdGZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuXHQgIHJldHVybiBhcmcgPT09IG51bGwgfHwgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8IHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8IF90eXBlb2YkMShhcmcpID09PSAnc3ltYm9sJyB8fCAvLyBFUzYgc3ltYm9sXG5cdCAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG5cdH1cblx0ZnVuY3Rpb24gaXNCdWZmZXIobWF5YmVCdWYpIHtcblx0ICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG1heWJlQnVmKTtcblx0fVxuXG5cdGZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcblx0ICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGFkKG4pIHtcblx0ICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcblx0fVxuXG5cdHZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107IC8vIDI2IEZlYiAxNjoxOTozNFxuXG5cdGZ1bmN0aW9uIHRpbWVzdGFtcCQxKCkge1xuXHQgIHZhciBkID0gbmV3IERhdGUoKTtcblx0ICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSwgcGFkKGQuZ2V0TWludXRlcygpKSwgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuXHQgIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG5cdH0gLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuXG5cblx0ZnVuY3Rpb24gbG9nKCkge1xuXHQgIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wJDEoKSwgZm9ybWF0LmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xuXHR9XG5cdGZ1bmN0aW9uIF9leHRlbmQob3JpZ2luLCBhZGQpIHtcblx0ICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG5cdCAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cdCAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuXHQgIHZhciBpID0ga2V5cy5sZW5ndGg7XG5cblx0ICB3aGlsZSAoaS0tKSB7XG5cdCAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG5cdCAgfVxuXG5cdCAgcmV0dXJuIG9yaWdpbjtcblx0fVxuXG5cdGZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuXHQgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcblx0fVxuXG5cdHZhciB1dGlsID0ge1xuXHQgIGluaGVyaXRzOiBpbmhlcml0cyQxLFxuXHQgIF9leHRlbmQ6IF9leHRlbmQsXG5cdCAgbG9nOiBsb2csXG5cdCAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuXHQgIGlzUHJpbWl0aXZlOiBpc1ByaW1pdGl2ZSxcblx0ICBpc0Z1bmN0aW9uOiBpc0Z1bmN0aW9uLFxuXHQgIGlzRXJyb3I6IGlzRXJyb3IsXG5cdCAgaXNEYXRlOiBpc0RhdGUsXG5cdCAgaXNPYmplY3Q6IGlzT2JqZWN0LFxuXHQgIGlzUmVnRXhwOiBpc1JlZ0V4cCxcblx0ICBpc1VuZGVmaW5lZDogaXNVbmRlZmluZWQsXG5cdCAgaXNTeW1ib2w6IGlzU3ltYm9sLFxuXHQgIGlzU3RyaW5nOiBpc1N0cmluZyxcblx0ICBpc051bWJlcjogaXNOdW1iZXIsXG5cdCAgaXNOdWxsT3JVbmRlZmluZWQ6IGlzTnVsbE9yVW5kZWZpbmVkLFxuXHQgIGlzTnVsbDogaXNOdWxsLFxuXHQgIGlzQm9vbGVhbjogaXNCb29sZWFuLFxuXHQgIGlzQXJyYXk6IGlzQXJyYXksXG5cdCAgaW5zcGVjdDogaW5zcGVjdCxcblx0ICBkZXByZWNhdGU6IGRlcHJlY2F0ZSxcblx0ICBmb3JtYXQ6IGZvcm1hdCxcblx0ICBkZWJ1Z2xvZzogZGVidWdsb2dcblx0fTtcblxuXHR2YXIgdXRpbCQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRcdGZvcm1hdDogZm9ybWF0LFxuXHRcdGRlcHJlY2F0ZTogZGVwcmVjYXRlLFxuXHRcdGRlYnVnbG9nOiBkZWJ1Z2xvZyxcblx0XHRpbnNwZWN0OiBpbnNwZWN0LFxuXHRcdGlzQXJyYXk6IGlzQXJyYXksXG5cdFx0aXNCb29sZWFuOiBpc0Jvb2xlYW4sXG5cdFx0aXNOdWxsOiBpc051bGwsXG5cdFx0aXNOdWxsT3JVbmRlZmluZWQ6IGlzTnVsbE9yVW5kZWZpbmVkLFxuXHRcdGlzTnVtYmVyOiBpc051bWJlcixcblx0XHRpc1N0cmluZzogaXNTdHJpbmcsXG5cdFx0aXNTeW1ib2w6IGlzU3ltYm9sLFxuXHRcdGlzVW5kZWZpbmVkOiBpc1VuZGVmaW5lZCxcblx0XHRpc1JlZ0V4cDogaXNSZWdFeHAsXG5cdFx0aXNPYmplY3Q6IGlzT2JqZWN0LFxuXHRcdGlzRGF0ZTogaXNEYXRlLFxuXHRcdGlzRXJyb3I6IGlzRXJyb3IsXG5cdFx0aXNGdW5jdGlvbjogaXNGdW5jdGlvbixcblx0XHRpc1ByaW1pdGl2ZTogaXNQcmltaXRpdmUsXG5cdFx0aXNCdWZmZXI6IGlzQnVmZmVyLFxuXHRcdGxvZzogbG9nLFxuXHRcdGluaGVyaXRzOiBpbmhlcml0cyQxLFxuXHRcdF9leHRlbmQ6IF9leHRlbmQsXG5cdFx0ZGVmYXVsdDogdXRpbFxuXHR9KTtcblxuXHR2YXIgdXRpbCQyID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZSh1dGlsJDEpO1xuXG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQyKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuXHRmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQyKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuXHRmdW5jdGlvbiBfY3JlYXRlQ2xhc3MkMihDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDIoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQyKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5cdHZhciBCdWZmZXIkMSA9IGJ1ZmZlci5CdWZmZXI7XG5cdHZhciByYW5kb21CeXRlcyQxID0gdXRpbHMucmFuZG9tQnl0ZXM7XG5cdHZhciBkZXByZWNhdGUkMSA9IHV0aWwkMi5kZXByZWNhdGU7IC8vIGNvbnN0YW50c1xuXG5cdHZhciBQUk9DRVNTX1VOSVFVRSA9IHJhbmRvbUJ5dGVzJDEoNSk7IC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IGNoZWNrcyBmb3IgaGV4IHZhbHVlXG5cblx0dmFyIGNoZWNrRm9ySGV4UmVnRXhwID0gbmV3IFJlZ0V4cCgnXlswLTlhLWZBLUZdezI0fSQnKTtcblx0dmFyIGhhc0J1ZmZlclR5cGUgPSBmYWxzZTsgLy8gQ2hlY2sgaWYgYnVmZmVyIGV4aXN0c1xuXG5cdHRyeSB7XG5cdCAgaWYgKEJ1ZmZlciQxICYmIEJ1ZmZlciQxLmZyb20pIGhhc0J1ZmZlclR5cGUgPSB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0ICBoYXNCdWZmZXJUeXBlID0gZmFsc2U7XG5cdH0gLy8gUHJlY29tcHV0ZWQgaGV4IHRhYmxlIGVuYWJsZXMgc3BlZWR5IGhleCBzdHJpbmcgY29udmVyc2lvblxuXG5cblx0dmFyIGhleFRhYmxlID0gW107XG5cblx0Zm9yICh2YXIgX2kgPSAwOyBfaSA8IDI1NjsgX2krKykge1xuXHQgIGhleFRhYmxlW19pXSA9IChfaSA8PSAxNSA/ICcwJyA6ICcnKSArIF9pLnRvU3RyaW5nKDE2KTtcblx0fSAvLyBMb29rdXAgdGFibGVzXG5cblxuXHR2YXIgZGVjb2RlTG9va3VwID0gW107XG5cdHZhciBpID0gMDtcblxuXHR3aGlsZSAoaSA8IDEwKSB7XG5cdCAgZGVjb2RlTG9va3VwWzB4MzAgKyBpXSA9IGkrKztcblx0fVxuXG5cdHdoaWxlIChpIDwgMTYpIHtcblx0ICBkZWNvZGVMb29rdXBbMHg0MSAtIDEwICsgaV0gPSBkZWNvZGVMb29rdXBbMHg2MSAtIDEwICsgaV0gPSBpKys7XG5cdH1cblxuXHR2YXIgX0J1ZmZlciA9IEJ1ZmZlciQxO1xuXG5cdGZ1bmN0aW9uIGNvbnZlcnRUb0hleChieXRlcykge1xuXHQgIHJldHVybiBieXRlcy50b1N0cmluZygnaGV4Jyk7XG5cdH1cblxuXHRmdW5jdGlvbiBtYWtlT2JqZWN0SWRFcnJvcihpbnZhbGlkU3RyaW5nLCBpbmRleCkge1xuXHQgIHZhciBpbnZhbGlkQ2hhcmFjdGVyID0gaW52YWxpZFN0cmluZ1tpbmRleF07XG5cdCAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoXCJPYmplY3RJZCBzdHJpbmcgXFxcIlwiLmNvbmNhdChpbnZhbGlkU3RyaW5nLCBcIlxcXCIgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXIgXFxcIlwiKS5jb25jYXQoaW52YWxpZENoYXJhY3RlciwgXCJcXFwiIHdpdGggY2hhcmFjdGVyIGNvZGUgKFwiKS5jb25jYXQoaW52YWxpZFN0cmluZy5jaGFyQ29kZUF0KGluZGV4KSwgXCIpLiBBbGwgY2hhcmFjdGVyIGNvZGVzIGZvciBhIG5vbi1oZXggc3RyaW5nIG11c3QgYmUgbGVzcyB0aGFuIDI1Ni5cIikpO1xuXHR9XG5cdC8qKlxuXHQgKiBBIGNsYXNzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBCU09OIE9iamVjdElkIHR5cGUuXG5cdCAqL1xuXG5cblx0dmFyIE9iamVjdElkID1cblx0LyojX19QVVJFX18qL1xuXHRmdW5jdGlvbiAoKSB7XG5cdCAgLyoqXG5cdCAgICogQ3JlYXRlIGFuIE9iamVjdElkIHR5cGVcblx0ICAgKlxuXHQgICAqIEBwYXJhbSB7KHN0cmluZ3xCdWZmZXJ8bnVtYmVyKX0gaWQgQ2FuIGJlIGEgMjQgYnl0ZSBoZXggc3RyaW5nLCAxMiBieXRlIGJpbmFyeSBCdWZmZXIsIG9yIGEgTnVtYmVyLlxuXHQgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBnZW5lcmF0aW9uVGltZSBUaGUgZ2VuZXJhdGlvbiB0aW1lIG9mIHRoaXMgT2JqZWN0SWQgaW5zdGFuY2Vcblx0ICAgKiBAcmV0dXJuIHtPYmplY3RJZH0gaW5zdGFuY2Ugb2YgT2JqZWN0SWQuXG5cdCAgICovXG5cdCAgZnVuY3Rpb24gT2JqZWN0SWQoaWQpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayQyKHRoaXMsIE9iamVjdElkKTtcblxuXHQgICAgLy8gRHVjay10eXBpbmcgdG8gc3VwcG9ydCBPYmplY3RJZCBmcm9tIGRpZmZlcmVudCBucG0gcGFja2FnZXNcblx0ICAgIGlmIChpZCBpbnN0YW5jZW9mIE9iamVjdElkKSByZXR1cm4gaWQ7IC8vIFRoZSBtb3N0IGNvbW1vbiB1c2VjYXNlIChibGFuayBpZCwgbmV3IG9iamVjdElkIGluc3RhbmNlKVxuXG5cdCAgICBpZiAoaWQgPT0gbnVsbCB8fCB0eXBlb2YgaWQgPT09ICdudW1iZXInKSB7XG5cdCAgICAgIC8vIEdlbmVyYXRlIGEgbmV3IGlkXG5cdCAgICAgIHRoaXMuaWQgPSBPYmplY3RJZC5nZW5lcmF0ZShpZCk7IC8vIElmIHdlIGFyZSBjYWNoaW5nIHRoZSBoZXggc3RyaW5nXG5cblx0ICAgICAgaWYgKE9iamVjdElkLmNhY2hlSGV4U3RyaW5nKSB0aGlzLl9faWQgPSB0aGlzLnRvU3RyaW5nKCdoZXgnKTsgLy8gUmV0dXJuIHRoZSBvYmplY3RcblxuXHQgICAgICByZXR1cm47XG5cdCAgICB9IC8vIENoZWNrIGlmIHRoZSBwYXNzZWQgaW4gaWQgaXMgdmFsaWRcblxuXG5cdCAgICB2YXIgdmFsaWQgPSBPYmplY3RJZC5pc1ZhbGlkKGlkKTsgLy8gVGhyb3cgYW4gZXJyb3IgaWYgaXQncyBub3QgYSB2YWxpZCBzZXR1cFxuXG5cdCAgICBpZiAoIXZhbGlkICYmIGlkICE9IG51bGwpIHtcblx0ICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgcGFzc2VkIGluIG11c3QgYmUgYSBzaW5nbGUgU3RyaW5nIG9mIDEyIGJ5dGVzIG9yIGEgc3RyaW5nIG9mIDI0IGhleCBjaGFyYWN0ZXJzJyk7XG5cdCAgICB9IGVsc2UgaWYgKHZhbGlkICYmIHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID09PSAyNCAmJiBoYXNCdWZmZXJUeXBlKSB7XG5cdCAgICAgIHJldHVybiBuZXcgT2JqZWN0SWQoQnVmZmVyJDEuZnJvbShpZCwgJ2hleCcpKTtcblx0ICAgIH0gZWxzZSBpZiAodmFsaWQgJiYgdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPT09IDI0KSB7XG5cdCAgICAgIHJldHVybiBPYmplY3RJZC5jcmVhdGVGcm9tSGV4U3RyaW5nKGlkKTtcblx0ICAgIH0gZWxzZSBpZiAoaWQgIT0gbnVsbCAmJiBpZC5sZW5ndGggPT09IDEyKSB7XG5cdCAgICAgIC8vIGFzc3VtZSAxMiBieXRlIHN0cmluZ1xuXHQgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICB9IGVsc2UgaWYgKGlkICE9IG51bGwgJiYgaWQudG9IZXhTdHJpbmcpIHtcblx0ICAgICAgLy8gRHVjay10eXBpbmcgdG8gc3VwcG9ydCBPYmplY3RJZCBmcm9tIGRpZmZlcmVudCBucG0gcGFja2FnZXNcblx0ICAgICAgcmV0dXJuIE9iamVjdElkLmNyZWF0ZUZyb21IZXhTdHJpbmcoaWQudG9IZXhTdHJpbmcoKSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBwYXNzZWQgaW4gbXVzdCBiZSBhIHNpbmdsZSBTdHJpbmcgb2YgMTIgYnl0ZXMgb3IgYSBzdHJpbmcgb2YgMjQgaGV4IGNoYXJhY3RlcnMnKTtcblx0ICAgIH1cblxuXHQgICAgaWYgKE9iamVjdElkLmNhY2hlSGV4U3RyaW5nKSB0aGlzLl9faWQgPSB0aGlzLnRvU3RyaW5nKCdoZXgnKTtcblx0ICB9XG5cdCAgLyoqXG5cdCAgICogUmV0dXJuIHRoZSBPYmplY3RJZCBpZCBhcyBhIDI0IGJ5dGUgaGV4IHN0cmluZyByZXByZXNlbnRhdGlvblxuXHQgICAqXG5cdCAgICogQG1ldGhvZFxuXHQgICAqIEByZXR1cm4ge3N0cmluZ30gcmV0dXJuIHRoZSAyNCBieXRlIGhleCBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG5cdCAgICovXG5cblxuXHQgIF9jcmVhdGVDbGFzcyQyKE9iamVjdElkLCBbe1xuXHQgICAga2V5OiBcInRvSGV4U3RyaW5nXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9IZXhTdHJpbmcoKSB7XG5cdCAgICAgIGlmIChPYmplY3RJZC5jYWNoZUhleFN0cmluZyAmJiB0aGlzLl9faWQpIHJldHVybiB0aGlzLl9faWQ7XG5cdCAgICAgIHZhciBoZXhTdHJpbmcgPSAnJztcblxuXHQgICAgICBpZiAoIXRoaXMuaWQgfHwgIXRoaXMuaWQubGVuZ3RoKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBPYmplY3RJZCwgT2JqZWN0SWQuaWQgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYSBCdWZmZXIsIGJ1dCBpcyBbJyArIEpTT04uc3RyaW5naWZ5KHRoaXMuaWQpICsgJ10nKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIGlmICh0aGlzLmlkIGluc3RhbmNlb2YgX0J1ZmZlcikge1xuXHQgICAgICAgIGhleFN0cmluZyA9IGNvbnZlcnRUb0hleCh0aGlzLmlkKTtcblx0ICAgICAgICBpZiAoT2JqZWN0SWQuY2FjaGVIZXhTdHJpbmcpIHRoaXMuX19pZCA9IGhleFN0cmluZztcblx0ICAgICAgICByZXR1cm4gaGV4U3RyaW5nO1xuXHQgICAgICB9XG5cblx0ICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgdGhpcy5pZC5sZW5ndGg7IF9pMisrKSB7XG5cdCAgICAgICAgdmFyIGhleENoYXIgPSBoZXhUYWJsZVt0aGlzLmlkLmNoYXJDb2RlQXQoX2kyKV07XG5cblx0ICAgICAgICBpZiAodHlwZW9mIGhleENoYXIgIT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICB0aHJvdyBtYWtlT2JqZWN0SWRFcnJvcih0aGlzLmlkLCBfaTIpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGhleFN0cmluZyArPSBoZXhDaGFyO1xuXHQgICAgICB9XG5cblx0ICAgICAgaWYgKE9iamVjdElkLmNhY2hlSGV4U3RyaW5nKSB0aGlzLl9faWQgPSBoZXhTdHJpbmc7XG5cdCAgICAgIHJldHVybiBoZXhTdHJpbmc7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIFVwZGF0ZSB0aGUgT2JqZWN0SWQgaW5kZXggdXNlZCBpbiBnZW5lcmF0aW5nIG5ldyBPYmplY3RJZCdzIG9uIHRoZSBkcml2ZXJcblx0ICAgICAqXG5cdCAgICAgKiBAbWV0aG9kXG5cdCAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHJldHVybnMgbmV4dCBpbmRleCB2YWx1ZS5cblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInRvU3RyaW5nXCIsXG5cblx0ICAgIC8qKlxuXHQgICAgICogQ29udmVydHMgdGhlIGlkIGludG8gYSAyNCBieXRlIGhleCBzdHJpbmcgZm9yIHByaW50aW5nXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtTdHJpbmd9IGZvcm1hdCBUaGUgQnVmZmVyIHRvU3RyaW5nIGZvcm1hdCBwYXJhbWV0ZXIuXG5cdCAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybiB0aGUgMjQgYnl0ZSBoZXggc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoZm9ybWF0KSB7XG5cdCAgICAgIC8vIElzIHRoZSBpZCBhIGJ1ZmZlciB0aGVuIHVzZSB0aGUgYnVmZmVyIHRvU3RyaW5nIG1ldGhvZCB0byByZXR1cm4gdGhlIGZvcm1hdFxuXHQgICAgICBpZiAodGhpcy5pZCAmJiB0aGlzLmlkLmNvcHkpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5pZC50b1N0cmluZyh0eXBlb2YgZm9ybWF0ID09PSAnc3RyaW5nJyA/IGZvcm1hdCA6ICdoZXgnKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIHJldHVybiB0aGlzLnRvSGV4U3RyaW5nKCk7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIENvbnZlcnRzIHRvIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJuIHRoZSAyNCBieXRlIGhleCBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJ0b0pTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnRvSGV4U3RyaW5nKCk7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIENvbXBhcmVzIHRoZSBlcXVhbGl0eSBvZiB0aGlzIE9iamVjdElkIHdpdGggYG90aGVySURgLlxuXHQgICAgICpcblx0ICAgICAqIEBtZXRob2Rcblx0ICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvdGhlcklkIE9iamVjdElkIGluc3RhbmNlIHRvIGNvbXBhcmUgYWdhaW5zdC5cblx0ICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRoZSByZXN1bHQgb2YgY29tcGFyaW5nIHR3byBPYmplY3RJZCdzXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJlcXVhbHNcIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBlcXVhbHMob3RoZXJJZCkge1xuXHQgICAgICBpZiAob3RoZXJJZCBpbnN0YW5jZW9mIE9iamVjdElkKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKSA9PT0gb3RoZXJJZC50b1N0cmluZygpO1xuXHQgICAgICB9XG5cblx0ICAgICAgaWYgKHR5cGVvZiBvdGhlcklkID09PSAnc3RyaW5nJyAmJiBPYmplY3RJZC5pc1ZhbGlkKG90aGVySWQpICYmIG90aGVySWQubGVuZ3RoID09PSAxMiAmJiB0aGlzLmlkIGluc3RhbmNlb2YgX0J1ZmZlcikge1xuXHQgICAgICAgIHJldHVybiBvdGhlcklkID09PSB0aGlzLmlkLnRvU3RyaW5nKCdiaW5hcnknKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIGlmICh0eXBlb2Ygb3RoZXJJZCA9PT0gJ3N0cmluZycgJiYgT2JqZWN0SWQuaXNWYWxpZChvdGhlcklkKSAmJiBvdGhlcklkLmxlbmd0aCA9PT0gMjQpIHtcblx0ICAgICAgICByZXR1cm4gb3RoZXJJZC50b0xvd2VyQ2FzZSgpID09PSB0aGlzLnRvSGV4U3RyaW5nKCk7XG5cdCAgICAgIH1cblxuXHQgICAgICBpZiAodHlwZW9mIG90aGVySWQgPT09ICdzdHJpbmcnICYmIE9iamVjdElkLmlzVmFsaWQob3RoZXJJZCkgJiYgb3RoZXJJZC5sZW5ndGggPT09IDEyKSB7XG5cdCAgICAgICAgcmV0dXJuIG90aGVySWQgPT09IHRoaXMuaWQ7XG5cdCAgICAgIH1cblxuXHQgICAgICBpZiAob3RoZXJJZCAhPSBudWxsICYmIChvdGhlcklkIGluc3RhbmNlb2YgT2JqZWN0SWQgfHwgb3RoZXJJZC50b0hleFN0cmluZykpIHtcblx0ICAgICAgICByZXR1cm4gb3RoZXJJZC50b0hleFN0cmluZygpID09PSB0aGlzLnRvSGV4U3RyaW5nKCk7XG5cdCAgICAgIH1cblxuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIFJldHVybnMgdGhlIGdlbmVyYXRpb24gZGF0ZSAoYWNjdXJhdGUgdXAgdG8gdGhlIHNlY29uZCkgdGhhdCB0aGlzIElEIHdhcyBnZW5lcmF0ZWQuXG5cdCAgICAgKlxuXHQgICAgICogQG1ldGhvZFxuXHQgICAgICogQHJldHVybiB7RGF0ZX0gdGhlIGdlbmVyYXRpb24gZGF0ZVxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwiZ2V0VGltZXN0YW1wXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VGltZXN0YW1wKCkge1xuXHQgICAgICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGUoKTtcblx0ICAgICAgdmFyIHRpbWUgPSB0aGlzLmlkLnJlYWRVSW50MzJCRSgwKTtcblx0ICAgICAgdGltZXN0YW1wLnNldFRpbWUoTWF0aC5mbG9vcih0aW1lKSAqIDEwMDApO1xuXHQgICAgICByZXR1cm4gdGltZXN0YW1wO1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJ0b0V4dGVuZGVkSlNPTlwiLFxuXG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvRXh0ZW5kZWRKU09OKCkge1xuXHQgICAgICBpZiAodGhpcy50b0hleFN0cmluZykgcmV0dXJuIHtcblx0ICAgICAgICAkb2lkOiB0aGlzLnRvSGV4U3RyaW5nKClcblx0ICAgICAgfTtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAkb2lkOiB0aGlzLnRvU3RyaW5nKCdoZXgnKVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH1dLCBbe1xuXHQgICAga2V5OiBcImdldEluY1wiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEluYygpIHtcblx0ICAgICAgcmV0dXJuIE9iamVjdElkLmluZGV4ID0gKE9iamVjdElkLmluZGV4ICsgMSkgJSAweGZmZmZmZjtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogR2VuZXJhdGUgYSAxMiBieXRlIGlkIGJ1ZmZlciB1c2VkIGluIE9iamVjdElkJ3Ncblx0ICAgICAqXG5cdCAgICAgKiBAbWV0aG9kXG5cdCAgICAgKiBAcGFyYW0ge251bWJlcn0gW3RpbWVdIG9wdGlvbmFsIHBhcmFtZXRlciBhbGxvd2luZyB0byBwYXNzIGluIGEgc2Vjb25kIGJhc2VkIHRpbWVzdGFtcC5cblx0ICAgICAqIEByZXR1cm4ge0J1ZmZlcn0gcmV0dXJuIHRoZSAxMiBieXRlIGlkIGJ1ZmZlciBzdHJpbmcuXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJnZW5lcmF0ZVwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGdlbmVyYXRlKHRpbWUpIHtcblx0ICAgICAgaWYgKCdudW1iZXInICE9PSB0eXBlb2YgdGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB+fihEYXRlLm5vdygpIC8gMTAwMCk7XG5cdCAgICAgIH1cblxuXHQgICAgICB2YXIgaW5jID0gT2JqZWN0SWQuZ2V0SW5jKCk7XG5cdCAgICAgIHZhciBidWZmZXIkJDEgPSBCdWZmZXIkMS5hbGxvYygxMik7IC8vIDQtYnl0ZSB0aW1lc3RhbXBcblxuXHQgICAgICBidWZmZXIkJDFbM10gPSB0aW1lICYgMHhmZjtcblx0ICAgICAgYnVmZmVyJCQxWzJdID0gdGltZSA+PiA4ICYgMHhmZjtcblx0ICAgICAgYnVmZmVyJCQxWzFdID0gdGltZSA+PiAxNiAmIDB4ZmY7XG5cdCAgICAgIGJ1ZmZlciQkMVswXSA9IHRpbWUgPj4gMjQgJiAweGZmOyAvLyA1LWJ5dGUgcHJvY2VzcyB1bmlxdWVcblxuXHQgICAgICBidWZmZXIkJDFbNF0gPSBQUk9DRVNTX1VOSVFVRVswXTtcblx0ICAgICAgYnVmZmVyJCQxWzVdID0gUFJPQ0VTU19VTklRVUVbMV07XG5cdCAgICAgIGJ1ZmZlciQkMVs2XSA9IFBST0NFU1NfVU5JUVVFWzJdO1xuXHQgICAgICBidWZmZXIkJDFbN10gPSBQUk9DRVNTX1VOSVFVRVszXTtcblx0ICAgICAgYnVmZmVyJCQxWzhdID0gUFJPQ0VTU19VTklRVUVbNF07IC8vIDMtYnl0ZSBjb3VudGVyXG5cblx0ICAgICAgYnVmZmVyJCQxWzExXSA9IGluYyAmIDB4ZmY7XG5cdCAgICAgIGJ1ZmZlciQkMVsxMF0gPSBpbmMgPj4gOCAmIDB4ZmY7XG5cdCAgICAgIGJ1ZmZlciQkMVs5XSA9IGluYyA+PiAxNiAmIDB4ZmY7XG5cdCAgICAgIHJldHVybiBidWZmZXIkJDE7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiBcImNyZWF0ZVBrXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlUGsoKSB7XG5cdCAgICAgIHJldHVybiBuZXcgT2JqZWN0SWQoKTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQ3JlYXRlcyBhbiBPYmplY3RJZCBmcm9tIGEgc2Vjb25kIGJhc2VkIG51bWJlciwgd2l0aCB0aGUgcmVzdCBvZiB0aGUgT2JqZWN0SWQgemVyb2VkIG91dC4gVXNlZCBmb3IgY29tcGFyaXNvbnMgb3Igc29ydGluZyB0aGUgT2JqZWN0SWQuXG5cdCAgICAgKlxuXHQgICAgICogQG1ldGhvZFxuXHQgICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgYW4gaW50ZWdlciBudW1iZXIgcmVwcmVzZW50aW5nIGEgbnVtYmVyIG9mIHNlY29uZHMuXG5cdCAgICAgKiBAcmV0dXJuIHtPYmplY3RJZH0gcmV0dXJuIHRoZSBjcmVhdGVkIE9iamVjdElkXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJjcmVhdGVGcm9tVGltZVwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUZyb21UaW1lKHRpbWUpIHtcblx0ICAgICAgdmFyIGJ1ZmZlciQkMSA9IEJ1ZmZlciQxLmZyb20oWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKTsgLy8gRW5jb2RlIHRpbWUgaW50byBmaXJzdCA0IGJ5dGVzXG5cblx0ICAgICAgYnVmZmVyJCQxWzNdID0gdGltZSAmIDB4ZmY7XG5cdCAgICAgIGJ1ZmZlciQkMVsyXSA9IHRpbWUgPj4gOCAmIDB4ZmY7XG5cdCAgICAgIGJ1ZmZlciQkMVsxXSA9IHRpbWUgPj4gMTYgJiAweGZmO1xuXHQgICAgICBidWZmZXIkJDFbMF0gPSB0aW1lID4+IDI0ICYgMHhmZjsgLy8gUmV0dXJuIHRoZSBuZXcgb2JqZWN0SWRcblxuXHQgICAgICByZXR1cm4gbmV3IE9iamVjdElkKGJ1ZmZlciQkMSk7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIENyZWF0ZXMgYW4gT2JqZWN0SWQgZnJvbSBhIGhleCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gT2JqZWN0SWQuXG5cdCAgICAgKlxuXHQgICAgICogQG1ldGhvZFxuXHQgICAgICogQHBhcmFtIHtzdHJpbmd9IGhleFN0cmluZyBjcmVhdGUgYSBPYmplY3RJZCBmcm9tIGEgcGFzc2VkIGluIDI0IGJ5dGUgaGV4c3RyaW5nLlxuXHQgICAgICogQHJldHVybiB7T2JqZWN0SWR9IHJldHVybiB0aGUgY3JlYXRlZCBPYmplY3RJZFxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwiY3JlYXRlRnJvbUhleFN0cmluZ1wiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUZyb21IZXhTdHJpbmcoc3RyaW5nKSB7XG5cdCAgICAgIC8vIFRocm93IGFuIGVycm9yIGlmIGl0J3Mgbm90IGEgdmFsaWQgc2V0dXBcblx0ICAgICAgaWYgKHR5cGVvZiBzdHJpbmcgPT09ICd1bmRlZmluZWQnIHx8IHN0cmluZyAhPSBudWxsICYmIHN0cmluZy5sZW5ndGggIT09IDI0KSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgcGFzc2VkIGluIG11c3QgYmUgYSBzaW5nbGUgU3RyaW5nIG9mIDEyIGJ5dGVzIG9yIGEgc3RyaW5nIG9mIDI0IGhleCBjaGFyYWN0ZXJzJyk7XG5cdCAgICAgIH0gLy8gVXNlIEJ1ZmZlci5mcm9tIG1ldGhvZCBpZiBhdmFpbGFibGVcblxuXG5cdCAgICAgIGlmIChoYXNCdWZmZXJUeXBlKSByZXR1cm4gbmV3IE9iamVjdElkKEJ1ZmZlciQxLmZyb20oc3RyaW5nLCAnaGV4JykpOyAvLyBDYWxjdWxhdGUgbGVuZ3Roc1xuXG5cdCAgICAgIHZhciBhcnJheSA9IG5ldyBfQnVmZmVyKDEyKTtcblx0ICAgICAgdmFyIG4gPSAwO1xuXHQgICAgICB2YXIgaSA9IDA7XG5cblx0ICAgICAgd2hpbGUgKGkgPCAyNCkge1xuXHQgICAgICAgIGFycmF5W24rK10gPSBkZWNvZGVMb29rdXBbc3RyaW5nLmNoYXJDb2RlQXQoaSsrKV0gPDwgNCB8IGRlY29kZUxvb2t1cFtzdHJpbmcuY2hhckNvZGVBdChpKyspXTtcblx0ICAgICAgfVxuXG5cdCAgICAgIHJldHVybiBuZXcgT2JqZWN0SWQoYXJyYXkpO1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIGJzb24gT2JqZWN0SWRcblx0ICAgICAqXG5cdCAgICAgKiBAbWV0aG9kXG5cdCAgICAgKiBAcmV0dXJuIHtib29sZWFufSByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZCBic29uIE9iamVjdElkLCByZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlLlxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwiaXNWYWxpZFwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGlzVmFsaWQoaWQpIHtcblx0ICAgICAgaWYgKGlkID09IG51bGwpIHJldHVybiBmYWxzZTtcblxuXHQgICAgICBpZiAodHlwZW9mIGlkID09PSAnbnVtYmVyJykge1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9XG5cblx0ICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICByZXR1cm4gaWQubGVuZ3RoID09PSAxMiB8fCBpZC5sZW5ndGggPT09IDI0ICYmIGNoZWNrRm9ySGV4UmVnRXhwLnRlc3QoaWQpO1xuXHQgICAgICB9XG5cblx0ICAgICAgaWYgKGlkIGluc3RhbmNlb2YgT2JqZWN0SWQpIHtcblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgfVxuXG5cdCAgICAgIGlmIChpZCBpbnN0YW5jZW9mIF9CdWZmZXIgJiYgaWQubGVuZ3RoID09PSAxMikge1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9IC8vIER1Y2stVHlwaW5nIGRldGVjdGlvbiBvZiBPYmplY3RJZCBsaWtlIG9iamVjdHNcblxuXG5cdCAgICAgIGlmIChpZC50b0hleFN0cmluZykge1xuXHQgICAgICAgIHJldHVybiBpZC5pZC5sZW5ndGggPT09IDEyIHx8IGlkLmlkLmxlbmd0aCA9PT0gMjQgJiYgY2hlY2tGb3JIZXhSZWdFeHAudGVzdChpZC5pZCk7XG5cdCAgICAgIH1cblxuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiBcImZyb21FeHRlbmRlZEpTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tRXh0ZW5kZWRKU09OKGRvYykge1xuXHQgICAgICByZXR1cm4gbmV3IE9iamVjdElkKGRvYy4kb2lkKTtcblx0ICAgIH1cblx0ICB9XSk7XG5cblx0ICByZXR1cm4gT2JqZWN0SWQ7XG5cdH0oKTsgLy8gRGVwcmVjYXRlZCBtZXRob2RzXG5cblxuXHRPYmplY3RJZC5nZXRfaW5jID0gZGVwcmVjYXRlJDEoZnVuY3Rpb24gKCkge1xuXHQgIHJldHVybiBPYmplY3RJZC5nZXRJbmMoKTtcblx0fSwgJ1BsZWFzZSB1c2UgdGhlIHN0YXRpYyBgT2JqZWN0SWQuZ2V0SW5jKClgIGluc3RlYWQnKTtcblx0T2JqZWN0SWQucHJvdG90eXBlLmdldF9pbmMgPSBkZXByZWNhdGUkMShmdW5jdGlvbiAoKSB7XG5cdCAgcmV0dXJuIE9iamVjdElkLmdldEluYygpO1xuXHR9LCAnUGxlYXNlIHVzZSB0aGUgc3RhdGljIGBPYmplY3RJZC5nZXRJbmMoKWAgaW5zdGVhZCcpO1xuXHRPYmplY3RJZC5wcm90b3R5cGUuZ2V0SW5jID0gZGVwcmVjYXRlJDEoZnVuY3Rpb24gKCkge1xuXHQgIHJldHVybiBPYmplY3RJZC5nZXRJbmMoKTtcblx0fSwgJ1BsZWFzZSB1c2UgdGhlIHN0YXRpYyBgT2JqZWN0SWQuZ2V0SW5jKClgIGluc3RlYWQnKTtcblx0T2JqZWN0SWQucHJvdG90eXBlLmdlbmVyYXRlID0gZGVwcmVjYXRlJDEoZnVuY3Rpb24gKHRpbWUpIHtcblx0ICByZXR1cm4gT2JqZWN0SWQuZ2VuZXJhdGUodGltZSk7XG5cdH0sICdQbGVhc2UgdXNlIHRoZSBzdGF0aWMgYE9iamVjdElkLmdlbmVyYXRlKHRpbWUpYCBpbnN0ZWFkJyk7XG5cdC8qKlxuXHQgKiBAaWdub3JlXG5cdCAqL1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3RJZC5wcm90b3R5cGUsICdnZW5lcmF0aW9uVGltZScsIHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgcmV0dXJuIHRoaXMuaWRbM10gfCB0aGlzLmlkWzJdIDw8IDggfCB0aGlzLmlkWzFdIDw8IDE2IHwgdGhpcy5pZFswXSA8PCAyNDtcblx0ICB9LFxuXHQgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG5cdCAgICAvLyBFbmNvZGUgdGltZSBpbnRvIGZpcnN0IDQgYnl0ZXNcblx0ICAgIHRoaXMuaWRbM10gPSB2YWx1ZSAmIDB4ZmY7XG5cdCAgICB0aGlzLmlkWzJdID0gdmFsdWUgPj4gOCAmIDB4ZmY7XG5cdCAgICB0aGlzLmlkWzFdID0gdmFsdWUgPj4gMTYgJiAweGZmO1xuXHQgICAgdGhpcy5pZFswXSA9IHZhbHVlID4+IDI0ICYgMHhmZjtcblx0ICB9XG5cdH0pO1xuXHQvKipcblx0ICogQ29udmVydHMgdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJZC5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfSByZXR1cm4gdGhlIDI0IGJ5dGUgaGV4IHN0cmluZyByZXByZXNlbnRhdGlvbi5cblx0ICogQGlnbm9yZVxuXHQgKi9cblxuXHRPYmplY3RJZC5wcm90b3R5cGVbdXRpbCQyLmluc3BlY3QuY3VzdG9tIHx8ICdpbnNwZWN0J10gPSBPYmplY3RJZC5wcm90b3R5cGUudG9TdHJpbmc7XG5cdC8qKlxuXHQgKiBAaWdub3JlXG5cdCAqL1xuXG5cdE9iamVjdElkLmluZGV4ID0gfn4oTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmKTsgLy8gSW4gNC4wLjAgYW5kIDQuMC4xLCB0aGlzIHByb3BlcnR5IG5hbWUgd2FzIGNoYW5nZWQgdG8gT2JqZWN0SWQgdG8gbWF0Y2ggdGhlIGNsYXNzIG5hbWUuXG5cdC8vIFRoaXMgY2F1c2VkIGludGVyb3BlcmFiaWxpdHkgcHJvYmxlbXMgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSwgc28gaW5cblx0Ly8gbGF0ZXIgYnVpbGRzIHdlIGNoYW5nZWQgaXQgYmFjayB0byBPYmplY3RJRCAoY2FwaXRhbCBEKSB0byBtYXRjaCBsZWdhY3kgaW1wbGVtZW50YXRpb25zLlxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3RJZC5wcm90b3R5cGUsICdfYnNvbnR5cGUnLCB7XG5cdCAgdmFsdWU6ICdPYmplY3RJRCdcblx0fSk7XG5cdHZhciBvYmplY3RpZCA9IE9iamVjdElkO1xuXG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQzKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuXHRmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuXHRmdW5jdGlvbiBfY3JlYXRlQ2xhc3MkMyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5cdGZ1bmN0aW9uIGFscGhhYmV0aXplKHN0cikge1xuXHQgIHJldHVybiBzdHIuc3BsaXQoJycpLnNvcnQoKS5qb2luKCcnKTtcblx0fVxuXHQvKipcblx0ICogQSBjbGFzcyByZXByZXNlbnRhdGlvbiBvZiB0aGUgQlNPTiBSZWdFeHAgdHlwZS5cblx0ICovXG5cblxuXHR2YXIgQlNPTlJlZ0V4cCA9XG5cdC8qI19fUFVSRV9fKi9cblx0ZnVuY3Rpb24gKCkge1xuXHQgIC8qKlxuXHQgICAqIENyZWF0ZSBhIFJlZ0V4cCB0eXBlXG5cdCAgICpcblx0ICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVybiBUaGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gbWF0Y2hcblx0ICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucyBUaGUgcmVndWxhciBleHByZXNzaW9uIG9wdGlvbnNcblx0ICAgKi9cblx0ICBmdW5jdGlvbiBCU09OUmVnRXhwKHBhdHRlcm4sIG9wdGlvbnMpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayQzKHRoaXMsIEJTT05SZWdFeHApO1xuXG5cdCAgICAvLyBFeGVjdXRlXG5cdCAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuIHx8ICcnO1xuXHQgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyA/IGFscGhhYmV0aXplKG9wdGlvbnMpIDogJyc7IC8vIFZhbGlkYXRlIG9wdGlvbnNcblxuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgaWYgKCEodGhpcy5vcHRpb25zW2ldID09PSAnaScgfHwgdGhpcy5vcHRpb25zW2ldID09PSAnbScgfHwgdGhpcy5vcHRpb25zW2ldID09PSAneCcgfHwgdGhpcy5vcHRpb25zW2ldID09PSAnbCcgfHwgdGhpcy5vcHRpb25zW2ldID09PSAncycgfHwgdGhpcy5vcHRpb25zW2ldID09PSAndScpKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvcHRpb24gW1wiLmNvbmNhdCh0aGlzLm9wdGlvbnNbaV0sIFwiXSBpcyBub3Qgc3VwcG9ydGVkXCIpKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0ICAvKipcblx0ICAgKiBAaWdub3JlXG5cdCAgICovXG5cblxuXHQgIF9jcmVhdGVDbGFzcyQzKEJTT05SZWdFeHAsIFt7XG5cdCAgICBrZXk6IFwidG9FeHRlbmRlZEpTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b0V4dGVuZGVkSlNPTigpIHtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAkcmVndWxhckV4cHJlc3Npb246IHtcblx0ICAgICAgICAgIHBhdHRlcm46IHRoaXMucGF0dGVybixcblx0ICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9uc1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cblx0ICB9XSwgW3tcblx0ICAgIGtleTogXCJmcm9tRXh0ZW5kZWRKU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUV4dGVuZGVkSlNPTihkb2MpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBCU09OUmVnRXhwKGRvYy4kcmVndWxhckV4cHJlc3Npb24ucGF0dGVybiwgZG9jLiRyZWd1bGFyRXhwcmVzc2lvbi5vcHRpb25zLnNwbGl0KCcnKS5zb3J0KCkuam9pbignJykpO1xuXHQgICAgfVxuXHQgIH1dKTtcblxuXHQgIHJldHVybiBCU09OUmVnRXhwO1xuXHR9KCk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KEJTT05SZWdFeHAucHJvdG90eXBlLCAnX2Jzb250eXBlJywge1xuXHQgIHZhbHVlOiAnQlNPTlJlZ0V4cCdcblx0fSk7XG5cdHZhciByZWdleHAgPSBCU09OUmVnRXhwO1xuXG5cdC8qKlxuXHQgKiBBIGNsYXNzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBCU09OIFN5bWJvbCB0eXBlLlxuXHQgKi9cblxuXHRmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2skNChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cblx0ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkNCh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cblx0ZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDQoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ0KENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkNChDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuXHR2YXIgQlNPTlN5bWJvbCA9XG5cdC8qI19fUFVSRV9fKi9cblx0ZnVuY3Rpb24gKCkge1xuXHQgIC8qKlxuXHQgICAqIENyZWF0ZSBhIFN5bWJvbCB0eXBlXG5cdCAgICpcblx0ICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgdGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHN5bWJvbC5cblx0ICAgKi9cblx0ICBmdW5jdGlvbiBCU09OU3ltYm9sKHZhbHVlKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2skNCh0aGlzLCBCU09OU3ltYm9sKTtcblxuXHQgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgIH1cblx0ICAvKipcblx0ICAgKiBBY2Nlc3MgdGhlIHdyYXBwZWQgc3RyaW5nIHZhbHVlLlxuXHQgICAqXG5cdCAgICogQG1ldGhvZFxuXHQgICAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgd3JhcHBlZCBzdHJpbmcuXG5cdCAgICovXG5cblxuXHQgIF9jcmVhdGVDbGFzcyQ0KEJTT05TeW1ib2wsIFt7XG5cdCAgICBrZXk6IFwidmFsdWVPZlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlT2YoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwiaW5zcGVjdFwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJ0b0pTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJ0b0V4dGVuZGVkSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvRXh0ZW5kZWRKU09OKCkge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgICRzeW1ib2w6IHRoaXMudmFsdWVcblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cblx0ICB9XSwgW3tcblx0ICAgIGtleTogXCJmcm9tRXh0ZW5kZWRKU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUV4dGVuZGVkSlNPTihkb2MpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBCU09OU3ltYm9sKGRvYy4kc3ltYm9sKTtcblx0ICAgIH1cblx0ICB9XSk7XG5cblx0ICByZXR1cm4gQlNPTlN5bWJvbDtcblx0fSgpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCU09OU3ltYm9sLnByb3RvdHlwZSwgJ19ic29udHlwZScsIHtcblx0ICB2YWx1ZTogJ1N5bWJvbCdcblx0fSk7XG5cdHZhciBzeW1ib2wgPSBCU09OU3ltYm9sO1xuXG5cdC8qKlxuXHQgKiBBIGNsYXNzIHJlcHJlc2VudGF0aW9uIG9mIGEgQlNPTiBJbnQzMiB0eXBlLlxuXHQgKi9cblxuXHRmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2skNShpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cblx0ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkNSh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cblx0ZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDUoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ1KENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkNShDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuXHR2YXIgSW50MzIgPVxuXHQvKiNfX1BVUkVfXyovXG5cdGZ1bmN0aW9uICgpIHtcblx0ICAvKipcblx0ICAgKiBDcmVhdGUgYW4gSW50MzIgdHlwZVxuXHQgICAqXG5cdCAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIHRoZSBudW1iZXIgd2Ugd2FudCB0byByZXByZXNlbnQgYXMgYW4gaW50MzIuXG5cdCAgICogQHJldHVybiB7SW50MzJ9XG5cdCAgICovXG5cdCAgZnVuY3Rpb24gSW50MzIodmFsdWUpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayQ1KHRoaXMsIEludDMyKTtcblxuXHQgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgIH1cblx0ICAvKipcblx0ICAgKiBBY2Nlc3MgdGhlIG51bWJlciB2YWx1ZS5cblx0ICAgKlxuXHQgICAqIEBtZXRob2Rcblx0ICAgKiBAcmV0dXJuIHtudW1iZXJ9IHJldHVybnMgdGhlIHdyYXBwZWQgaW50MzIgbnVtYmVyLlxuXHQgICAqL1xuXG5cblx0ICBfY3JlYXRlQ2xhc3MkNShJbnQzMiwgW3tcblx0ICAgIGtleTogXCJ2YWx1ZU9mXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWVPZigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInRvSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInRvRXh0ZW5kZWRKU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9FeHRlbmRlZEpTT04ob3B0aW9ucykge1xuXHQgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlbGF4ZWQpIHJldHVybiB0aGlzLnZhbHVlO1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgICRudW1iZXJJbnQ6IHRoaXMudmFsdWUudG9TdHJpbmcoKVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH1dLCBbe1xuXHQgICAga2V5OiBcImZyb21FeHRlbmRlZEpTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tRXh0ZW5kZWRKU09OKGRvYywgb3B0aW9ucykge1xuXHQgICAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLnJlbGF4ZWQgPyBwYXJzZUludChkb2MuJG51bWJlckludCwgMTApIDogbmV3IEludDMyKGRvYy4kbnVtYmVySW50KTtcblx0ICAgIH1cblx0ICB9XSk7XG5cblx0ICByZXR1cm4gSW50MzI7XG5cdH0oKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoSW50MzIucHJvdG90eXBlLCAnX2Jzb250eXBlJywge1xuXHQgIHZhbHVlOiAnSW50MzInXG5cdH0pO1xuXHR2YXIgaW50XzMyID0gSW50MzI7XG5cblx0LyoqXG5cdCAqIEEgY2xhc3MgcmVwcmVzZW50YXRpb24gb2YgdGhlIEJTT04gQ29kZSB0eXBlLlxuXHQgKi9cblxuXHRmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2skNihpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cblx0ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkNih0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cblx0ZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDYoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ2KENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkNihDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuXHR2YXIgQ29kZSA9XG5cdC8qI19fUFVSRV9fKi9cblx0ZnVuY3Rpb24gKCkge1xuXHQgIC8qKlxuXHQgICAqIENyZWF0ZSBhIENvZGUgdHlwZVxuXHQgICAqXG5cdCAgICogQHBhcmFtIHsoc3RyaW5nfGZ1bmN0aW9uKX0gY29kZSBhIHN0cmluZyBvciBmdW5jdGlvbi5cblx0ICAgKiBAcGFyYW0ge09iamVjdH0gW3Njb3BlXSBhbiBvcHRpb25hbCBzY29wZSBmb3IgdGhlIGZ1bmN0aW9uLlxuXHQgICAqIEByZXR1cm4ge0NvZGV9XG5cdCAgICovXG5cdCAgZnVuY3Rpb24gQ29kZShjb2RlLCBzY29wZSkge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrJDYodGhpcywgQ29kZSk7XG5cblx0ICAgIHRoaXMuY29kZSA9IGNvZGU7XG5cdCAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG5cdCAgfVxuXHQgIC8qKlxuXHQgICAqIEBpZ25vcmVcblx0ICAgKi9cblxuXG5cdCAgX2NyZWF0ZUNsYXNzJDYoQ29kZSwgW3tcblx0ICAgIGtleTogXCJ0b0pTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgc2NvcGU6IHRoaXMuc2NvcGUsXG5cdCAgICAgICAgY29kZTogdGhpcy5jb2RlXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInRvRXh0ZW5kZWRKU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9FeHRlbmRlZEpTT04oKSB7XG5cdCAgICAgIGlmICh0aGlzLnNjb3BlKSB7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICRjb2RlOiB0aGlzLmNvZGUsXG5cdCAgICAgICAgICAkc2NvcGU6IHRoaXMuc2NvcGVcblx0ICAgICAgICB9O1xuXHQgICAgICB9XG5cblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAkY29kZTogdGhpcy5jb2RlXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfV0sIFt7XG5cdCAgICBrZXk6IFwiZnJvbUV4dGVuZGVkSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21FeHRlbmRlZEpTT04oZG9jKSB7XG5cdCAgICAgIHJldHVybiBuZXcgQ29kZShkb2MuJGNvZGUsIGRvYy4kc2NvcGUpO1xuXHQgICAgfVxuXHQgIH1dKTtcblxuXHQgIHJldHVybiBDb2RlO1xuXHR9KCk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KENvZGUucHJvdG90eXBlLCAnX2Jzb250eXBlJywge1xuXHQgIHZhbHVlOiAnQ29kZSdcblx0fSk7XG5cdHZhciBjb2RlID0gQ29kZTtcblxuXHR2YXIgQnVmZmVyJDIgPSBidWZmZXIuQnVmZmVyO1xuXHR2YXIgUEFSU0VfU1RSSU5HX1JFR0VYUCA9IC9eKFxcK3wtKT8oXFxkK3woXFxkKlxcLlxcZCopKT8oRXxlKT8oWy0rXSk/KFxcZCspPyQvO1xuXHR2YXIgUEFSU0VfSU5GX1JFR0VYUCA9IC9eKFxcK3wtKT8oSW5maW5pdHl8aW5mKSQvaTtcblx0dmFyIFBBUlNFX05BTl9SRUdFWFAgPSAvXihcXCt8LSk/TmFOJC9pO1xuXHR2YXIgRVhQT05FTlRfTUFYID0gNjExMTtcblx0dmFyIEVYUE9ORU5UX01JTiA9IC02MTc2O1xuXHR2YXIgRVhQT05FTlRfQklBUyA9IDYxNzY7XG5cdHZhciBNQVhfRElHSVRTID0gMzQ7IC8vIE5hbiB2YWx1ZSBiaXRzIGFzIDMyIGJpdCB2YWx1ZXMgKGR1ZSB0byBsYWNrIG9mIGxvbmdzKVxuXG5cdHZhciBOQU5fQlVGRkVSID0gWzB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLnJldmVyc2UoKTsgLy8gSW5maW5pdHkgdmFsdWUgYml0cyAzMiBiaXQgdmFsdWVzIChkdWUgdG8gbGFjayBvZiBsb25ncylcblxuXHR2YXIgSU5GX05FR0FUSVZFX0JVRkZFUiA9IFsweGY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXS5yZXZlcnNlKCk7XG5cdHZhciBJTkZfUE9TSVRJVkVfQlVGRkVSID0gWzB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLnJldmVyc2UoKTtcblx0dmFyIEVYUE9ORU5UX1JFR0VYID0gL14oWy0rXSk/KFxcZCspPyQvOyAvLyBEZXRlY3QgaWYgdGhlIHZhbHVlIGlzIGEgZGlnaXRcblxuXHRmdW5jdGlvbiBpc0RpZ2l0KHZhbHVlKSB7XG5cdCAgcmV0dXJuICFpc05hTihwYXJzZUludCh2YWx1ZSwgMTApKTtcblx0fSAvLyBEaXZpZGUgdHdvIHVpbnQxMjggdmFsdWVzXG5cblxuXHRmdW5jdGlvbiBkaXZpZGV1MTI4KHZhbHVlKSB7XG5cdCAgdmFyIERJVklTT1IgPSBsb25nXzEuZnJvbU51bWJlcigxMDAwICogMTAwMCAqIDEwMDApO1xuXG5cdCAgdmFyIF9yZW0gPSBsb25nXzEuZnJvbU51bWJlcigwKTtcblxuXHQgIGlmICghdmFsdWUucGFydHNbMF0gJiYgIXZhbHVlLnBhcnRzWzFdICYmICF2YWx1ZS5wYXJ0c1syXSAmJiAhdmFsdWUucGFydHNbM10pIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHF1b3RpZW50OiB2YWx1ZSxcblx0ICAgICAgcmVtOiBfcmVtXG5cdCAgICB9O1xuXHQgIH1cblxuXHQgIGZvciAodmFyIGkgPSAwOyBpIDw9IDM7IGkrKykge1xuXHQgICAgLy8gQWRqdXN0IHJlbWFpbmRlciB0byBtYXRjaCB2YWx1ZSBvZiBuZXh0IGRpdmlkZW5kXG5cdCAgICBfcmVtID0gX3JlbS5zaGlmdExlZnQoMzIpOyAvLyBBZGQgdGhlIGRpdmlkZWQgdG8gX3JlbVxuXG5cdCAgICBfcmVtID0gX3JlbS5hZGQobmV3IGxvbmdfMSh2YWx1ZS5wYXJ0c1tpXSwgMCkpO1xuXHQgICAgdmFsdWUucGFydHNbaV0gPSBfcmVtLmRpdihESVZJU09SKS5sb3c7XG5cdCAgICBfcmVtID0gX3JlbS5tb2R1bG8oRElWSVNPUik7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHtcblx0ICAgIHF1b3RpZW50OiB2YWx1ZSxcblx0ICAgIHJlbTogX3JlbVxuXHQgIH07XG5cdH0gLy8gTXVsdGlwbHkgdHdvIExvbmcgdmFsdWVzIGFuZCByZXR1cm4gdGhlIDEyOCBiaXQgdmFsdWVcblxuXG5cdGZ1bmN0aW9uIG11bHRpcGx5NjR4MihsZWZ0LCByaWdodCkge1xuXHQgIGlmICghbGVmdCAmJiAhcmlnaHQpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGhpZ2g6IGxvbmdfMS5mcm9tTnVtYmVyKDApLFxuXHQgICAgICBsb3c6IGxvbmdfMS5mcm9tTnVtYmVyKDApXG5cdCAgICB9O1xuXHQgIH1cblxuXHQgIHZhciBsZWZ0SGlnaCA9IGxlZnQuc2hpZnRSaWdodFVuc2lnbmVkKDMyKTtcblx0ICB2YXIgbGVmdExvdyA9IG5ldyBsb25nXzEobGVmdC5nZXRMb3dCaXRzKCksIDApO1xuXHQgIHZhciByaWdodEhpZ2ggPSByaWdodC5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpO1xuXHQgIHZhciByaWdodExvdyA9IG5ldyBsb25nXzEocmlnaHQuZ2V0TG93Qml0cygpLCAwKTtcblx0ICB2YXIgcHJvZHVjdEhpZ2ggPSBsZWZ0SGlnaC5tdWx0aXBseShyaWdodEhpZ2gpO1xuXHQgIHZhciBwcm9kdWN0TWlkID0gbGVmdEhpZ2gubXVsdGlwbHkocmlnaHRMb3cpO1xuXHQgIHZhciBwcm9kdWN0TWlkMiA9IGxlZnRMb3cubXVsdGlwbHkocmlnaHRIaWdoKTtcblx0ICB2YXIgcHJvZHVjdExvdyA9IGxlZnRMb3cubXVsdGlwbHkocmlnaHRMb3cpO1xuXHQgIHByb2R1Y3RIaWdoID0gcHJvZHVjdEhpZ2guYWRkKHByb2R1Y3RNaWQuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSk7XG5cdCAgcHJvZHVjdE1pZCA9IG5ldyBsb25nXzEocHJvZHVjdE1pZC5nZXRMb3dCaXRzKCksIDApLmFkZChwcm9kdWN0TWlkMikuYWRkKHByb2R1Y3RMb3cuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSk7XG5cdCAgcHJvZHVjdEhpZ2ggPSBwcm9kdWN0SGlnaC5hZGQocHJvZHVjdE1pZC5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpKTtcblx0ICBwcm9kdWN0TG93ID0gcHJvZHVjdE1pZC5zaGlmdExlZnQoMzIpLmFkZChuZXcgbG9uZ18xKHByb2R1Y3RMb3cuZ2V0TG93Qml0cygpLCAwKSk7IC8vIFJldHVybiB0aGUgMTI4IGJpdCByZXN1bHRcblxuXHQgIHJldHVybiB7XG5cdCAgICBoaWdoOiBwcm9kdWN0SGlnaCxcblx0ICAgIGxvdzogcHJvZHVjdExvd1xuXHQgIH07XG5cdH1cblxuXHRmdW5jdGlvbiBsZXNzVGhhbihsZWZ0LCByaWdodCkge1xuXHQgIC8vIE1ha2UgdmFsdWVzIHVuc2lnbmVkXG5cdCAgdmFyIHVobGVmdCA9IGxlZnQuaGlnaCA+Pj4gMDtcblx0ICB2YXIgdWhyaWdodCA9IHJpZ2h0LmhpZ2ggPj4+IDA7IC8vIENvbXBhcmUgaGlnaCBiaXRzIGZpcnN0XG5cblx0ICBpZiAodWhsZWZ0IDwgdWhyaWdodCkge1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfSBlbHNlIGlmICh1aGxlZnQgPT09IHVocmlnaHQpIHtcblx0ICAgIHZhciB1bGxlZnQgPSBsZWZ0LmxvdyA+Pj4gMDtcblx0ICAgIHZhciB1bHJpZ2h0ID0gcmlnaHQubG93ID4+PiAwO1xuXHQgICAgaWYgKHVsbGVmdCA8IHVscmlnaHQpIHJldHVybiB0cnVlO1xuXHQgIH1cblxuXHQgIHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGZ1bmN0aW9uIGludmFsaWRFcnIoc3RyaW5nLCBtZXNzYWdlKSB7XG5cdCAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlxcXCJcIi5jb25jYXQoc3RyaW5nLCBcIlxcXCIgaXMgbm90IGEgdmFsaWQgRGVjaW1hbDEyOCBzdHJpbmcgLSBcIikuY29uY2F0KG1lc3NhZ2UpKTtcblx0fVxuXHQvKipcblx0ICogQSBjbGFzcyByZXByZXNlbnRhdGlvbiBvZiB0aGUgQlNPTiBEZWNpbWFsMTI4IHR5cGUuXG5cdCAqXG5cdCAqIEBjbGFzc1xuXHQgKiBAcGFyYW0ge0J1ZmZlcn0gYnl0ZXMgYSBidWZmZXIgY29udGFpbmluZyB0aGUgcmF3IERlY2ltYWwxMjggYnl0ZXMuXG5cdCAqIEByZXR1cm4ge0RvdWJsZX1cblx0ICovXG5cblxuXHRmdW5jdGlvbiBEZWNpbWFsMTI4KGJ5dGVzKSB7XG5cdCAgdGhpcy5ieXRlcyA9IGJ5dGVzO1xuXHR9XG5cdC8qKlxuXHQgKiBDcmVhdGUgYSBEZWNpbWFsMTI4IGluc3RhbmNlIGZyb20gYSBzdHJpbmcgcmVwcmVzZW50YXRpb25cblx0ICpcblx0ICogQG1ldGhvZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIGEgbnVtZXJpYyBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG5cdCAqIEByZXR1cm4ge0RlY2ltYWwxMjh9IHJldHVybnMgYSBEZWNpbWFsMTI4IGluc3RhbmNlLlxuXHQgKi9cblxuXG5cdERlY2ltYWwxMjguZnJvbVN0cmluZyA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0ICAvLyBQYXJzZSBzdGF0ZSB0cmFja2luZ1xuXHQgIHZhciBpc05lZ2F0aXZlID0gZmFsc2U7XG5cdCAgdmFyIHNhd1JhZGl4ID0gZmFsc2U7XG5cdCAgdmFyIGZvdW5kTm9uWmVybyA9IGZhbHNlOyAvLyBUb3RhbCBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzIChubyBsZWFkaW5nIG9yIHRyYWlsaW5nIHplcm8pXG5cblx0ICB2YXIgc2lnbmlmaWNhbnREaWdpdHMgPSAwOyAvLyBUb3RhbCBudW1iZXIgb2Ygc2lnbmlmaWNhbmQgZGlnaXRzIHJlYWRcblxuXHQgIHZhciBuRGlnaXRzUmVhZCA9IDA7IC8vIFRvdGFsIG51bWJlciBvZiBkaWdpdHMgKG5vIGxlYWRpbmcgemVyb3MpXG5cblx0ICB2YXIgbkRpZ2l0cyA9IDA7IC8vIFRoZSBudW1iZXIgb2YgdGhlIGRpZ2l0cyBhZnRlciByYWRpeFxuXG5cdCAgdmFyIHJhZGl4UG9zaXRpb24gPSAwOyAvLyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG5vbi16ZXJvIGluICpzdHIqXG5cblx0ICB2YXIgZmlyc3ROb25aZXJvID0gMDsgLy8gRGlnaXRzIEFycmF5XG5cblx0ICB2YXIgZGlnaXRzID0gWzBdOyAvLyBUaGUgbnVtYmVyIG9mIGRpZ2l0cyBpbiBkaWdpdHNcblxuXHQgIHZhciBuRGlnaXRzU3RvcmVkID0gMDsgLy8gSW5zZXJ0aW9uIHBvaW50ZXIgZm9yIGRpZ2l0c1xuXG5cdCAgdmFyIGRpZ2l0c0luc2VydCA9IDA7IC8vIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgbm9uLXplcm8gZGlnaXRcblxuXHQgIHZhciBmaXJzdERpZ2l0ID0gMDsgLy8gVGhlIGluZGV4IG9mIHRoZSBsYXN0IGRpZ2l0XG5cblx0ICB2YXIgbGFzdERpZ2l0ID0gMDsgLy8gRXhwb25lbnRcblxuXHQgIHZhciBleHBvbmVudCA9IDA7IC8vIGxvb3AgaW5kZXggb3ZlciBhcnJheVxuXG5cdCAgdmFyIGkgPSAwOyAvLyBUaGUgaGlnaCAxNyBkaWdpdHMgb2YgdGhlIHNpZ25pZmljYW5kXG5cblx0ICB2YXIgc2lnbmlmaWNhbmRIaWdoID0gWzAsIDBdOyAvLyBUaGUgbG93IDE3IGRpZ2l0cyBvZiB0aGUgc2lnbmlmaWNhbmRcblxuXHQgIHZhciBzaWduaWZpY2FuZExvdyA9IFswLCAwXTsgLy8gVGhlIGJpYXNlZCBleHBvbmVudFxuXG5cdCAgdmFyIGJpYXNlZEV4cG9uZW50ID0gMDsgLy8gUmVhZCBpbmRleFxuXG5cdCAgdmFyIGluZGV4ID0gMDsgLy8gTmFpdmVseSBwcmV2ZW50IGFnYWluc3QgUkVET1MgYXR0YWNrcy5cblx0ICAvLyBUT0RPOiBpbXBsZW1lbnRpbmcgYSBjdXN0b20gcGFyc2luZyBmb3IgdGhpcywgb3IgcmVmYWN0b3JpbmcgdGhlIHJlZ2V4IHdvdWxkIHlpZWxkXG5cdCAgLy8gICAgICAgZnVydGhlciBnYWlucy5cblxuXHQgIGlmIChzdHJpbmcubGVuZ3RoID49IDcwMDApIHtcblx0ICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJycgKyBzdHJpbmcgKyAnIG5vdCBhIHZhbGlkIERlY2ltYWwxMjggc3RyaW5nJyk7XG5cdCAgfSAvLyBSZXN1bHRzXG5cblxuXHQgIHZhciBzdHJpbmdNYXRjaCA9IHN0cmluZy5tYXRjaChQQVJTRV9TVFJJTkdfUkVHRVhQKTtcblx0ICB2YXIgaW5mTWF0Y2ggPSBzdHJpbmcubWF0Y2goUEFSU0VfSU5GX1JFR0VYUCk7XG5cdCAgdmFyIG5hbk1hdGNoID0gc3RyaW5nLm1hdGNoKFBBUlNFX05BTl9SRUdFWFApOyAvLyBWYWxpZGF0ZSB0aGUgc3RyaW5nXG5cblx0ICBpZiAoIXN0cmluZ01hdGNoICYmICFpbmZNYXRjaCAmJiAhbmFuTWF0Y2ggfHwgc3RyaW5nLmxlbmd0aCA9PT0gMCkge1xuXHQgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignJyArIHN0cmluZyArICcgbm90IGEgdmFsaWQgRGVjaW1hbDEyOCBzdHJpbmcnKTtcblx0ICB9XG5cblx0ICBpZiAoc3RyaW5nTWF0Y2gpIHtcblx0ICAgIC8vIGZ1bGxfbWF0Y2ggPSBzdHJpbmdNYXRjaFswXVxuXHQgICAgLy8gc2lnbiA9IHN0cmluZ01hdGNoWzFdXG5cdCAgICB2YXIgdW5zaWduZWROdW1iZXIgPSBzdHJpbmdNYXRjaFsyXTsgLy8gc3RyaW5nTWF0Y2hbM10gaXMgdW5kZWZpbmVkIGlmIGEgd2hvbGUgbnVtYmVyIChleCBcIjFcIiwgMTJcIilcblx0ICAgIC8vIGJ1dCBkZWZpbmVkIGlmIGEgbnVtYmVyIHcvIGRlY2ltYWwgaW4gaXQgKGV4IFwiMS4wLCAxMi4yXCIpXG5cblx0ICAgIHZhciBlID0gc3RyaW5nTWF0Y2hbNF07XG5cdCAgICB2YXIgZXhwU2lnbiA9IHN0cmluZ01hdGNoWzVdO1xuXHQgICAgdmFyIGV4cE51bWJlciA9IHN0cmluZ01hdGNoWzZdOyAvLyB0aGV5IHByb3ZpZGVkIGUsIGJ1dCBkaWRuJ3QgZ2l2ZSBhbiBleHBvbmVudCBudW1iZXIuIGZvciBleCBcIjFlXCJcblxuXHQgICAgaWYgKGUgJiYgZXhwTnVtYmVyID09PSB1bmRlZmluZWQpIGludmFsaWRFcnIoc3RyaW5nLCAnbWlzc2luZyBleHBvbmVudCBwb3dlcicpOyAvLyB0aGV5IHByb3ZpZGVkIGUsIGJ1dCBkaWRuJ3QgZ2l2ZSBhIG51bWJlciBiZWZvcmUgaXQuIGZvciBleCBcImUxXCJcblxuXHQgICAgaWYgKGUgJiYgdW5zaWduZWROdW1iZXIgPT09IHVuZGVmaW5lZCkgaW52YWxpZEVycihzdHJpbmcsICdtaXNzaW5nIGV4cG9uZW50IGJhc2UnKTtcblxuXHQgICAgaWYgKGUgPT09IHVuZGVmaW5lZCAmJiAoZXhwU2lnbiB8fCBleHBOdW1iZXIpKSB7XG5cdCAgICAgIGludmFsaWRFcnIoc3RyaW5nLCAnbWlzc2luZyBlIGJlZm9yZSBleHBvbmVudCcpO1xuXHQgICAgfVxuXHQgIH0gLy8gR2V0IHRoZSBuZWdhdGl2ZSBvciBwb3NpdGl2ZSBzaWduXG5cblxuXHQgIGlmIChzdHJpbmdbaW5kZXhdID09PSAnKycgfHwgc3RyaW5nW2luZGV4XSA9PT0gJy0nKSB7XG5cdCAgICBpc05lZ2F0aXZlID0gc3RyaW5nW2luZGV4KytdID09PSAnLSc7XG5cdCAgfSAvLyBDaGVjayBpZiB1c2VyIHBhc3NlZCBJbmZpbml0eSBvciBOYU5cblxuXG5cdCAgaWYgKCFpc0RpZ2l0KHN0cmluZ1tpbmRleF0pICYmIHN0cmluZ1tpbmRleF0gIT09ICcuJykge1xuXHQgICAgaWYgKHN0cmluZ1tpbmRleF0gPT09ICdpJyB8fCBzdHJpbmdbaW5kZXhdID09PSAnSScpIHtcblx0ICAgICAgcmV0dXJuIG5ldyBEZWNpbWFsMTI4KEJ1ZmZlciQyLmZyb20oaXNOZWdhdGl2ZSA/IElORl9ORUdBVElWRV9CVUZGRVIgOiBJTkZfUE9TSVRJVkVfQlVGRkVSKSk7XG5cdCAgICB9IGVsc2UgaWYgKHN0cmluZ1tpbmRleF0gPT09ICdOJykge1xuXHQgICAgICByZXR1cm4gbmV3IERlY2ltYWwxMjgoQnVmZmVyJDIuZnJvbShOQU5fQlVGRkVSKSk7XG5cdCAgICB9XG5cdCAgfSAvLyBSZWFkIGFsbCB0aGUgZGlnaXRzXG5cblxuXHQgIHdoaWxlIChpc0RpZ2l0KHN0cmluZ1tpbmRleF0pIHx8IHN0cmluZ1tpbmRleF0gPT09ICcuJykge1xuXHQgICAgaWYgKHN0cmluZ1tpbmRleF0gPT09ICcuJykge1xuXHQgICAgICBpZiAoc2F3UmFkaXgpIGludmFsaWRFcnIoc3RyaW5nLCAnY29udGFpbnMgbXVsdGlwbGUgcGVyaW9kcycpO1xuXHQgICAgICBzYXdSYWRpeCA9IHRydWU7XG5cdCAgICAgIGluZGV4ID0gaW5kZXggKyAxO1xuXHQgICAgICBjb250aW51ZTtcblx0ICAgIH1cblxuXHQgICAgaWYgKG5EaWdpdHNTdG9yZWQgPCAzNCkge1xuXHQgICAgICBpZiAoc3RyaW5nW2luZGV4XSAhPT0gJzAnIHx8IGZvdW5kTm9uWmVybykge1xuXHQgICAgICAgIGlmICghZm91bmROb25aZXJvKSB7XG5cdCAgICAgICAgICBmaXJzdE5vblplcm8gPSBuRGlnaXRzUmVhZDtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBmb3VuZE5vblplcm8gPSB0cnVlOyAvLyBPbmx5IHN0b3JlIDM0IGRpZ2l0c1xuXG5cdCAgICAgICAgZGlnaXRzW2RpZ2l0c0luc2VydCsrXSA9IHBhcnNlSW50KHN0cmluZ1tpbmRleF0sIDEwKTtcblx0ICAgICAgICBuRGlnaXRzU3RvcmVkID0gbkRpZ2l0c1N0b3JlZCArIDE7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgaWYgKGZvdW5kTm9uWmVybykgbkRpZ2l0cyA9IG5EaWdpdHMgKyAxO1xuXHQgICAgaWYgKHNhd1JhZGl4KSByYWRpeFBvc2l0aW9uID0gcmFkaXhQb3NpdGlvbiArIDE7XG5cdCAgICBuRGlnaXRzUmVhZCA9IG5EaWdpdHNSZWFkICsgMTtcblx0ICAgIGluZGV4ID0gaW5kZXggKyAxO1xuXHQgIH1cblxuXHQgIGlmIChzYXdSYWRpeCAmJiAhbkRpZ2l0c1JlYWQpIHRocm93IG5ldyBUeXBlRXJyb3IoJycgKyBzdHJpbmcgKyAnIG5vdCBhIHZhbGlkIERlY2ltYWwxMjggc3RyaW5nJyk7IC8vIFJlYWQgZXhwb25lbnQgaWYgZXhpc3RzXG5cblx0ICBpZiAoc3RyaW5nW2luZGV4XSA9PT0gJ2UnIHx8IHN0cmluZ1tpbmRleF0gPT09ICdFJykge1xuXHQgICAgLy8gUmVhZCBleHBvbmVudCBkaWdpdHNcblx0ICAgIHZhciBtYXRjaCA9IHN0cmluZy5zdWJzdHIoKytpbmRleCkubWF0Y2goRVhQT05FTlRfUkVHRVgpOyAvLyBObyBkaWdpdHMgcmVhZFxuXG5cdCAgICBpZiAoIW1hdGNoIHx8ICFtYXRjaFsyXSkgcmV0dXJuIG5ldyBEZWNpbWFsMTI4KEJ1ZmZlciQyLmZyb20oTkFOX0JVRkZFUikpOyAvLyBHZXQgZXhwb25lbnRcblxuXHQgICAgZXhwb25lbnQgPSBwYXJzZUludChtYXRjaFswXSwgMTApOyAvLyBBZGp1c3QgdGhlIGluZGV4XG5cblx0ICAgIGluZGV4ID0gaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG5cdCAgfSAvLyBSZXR1cm4gbm90IGEgbnVtYmVyXG5cblxuXHQgIGlmIChzdHJpbmdbaW5kZXhdKSByZXR1cm4gbmV3IERlY2ltYWwxMjgoQnVmZmVyJDIuZnJvbShOQU5fQlVGRkVSKSk7IC8vIERvbmUgcmVhZGluZyBpbnB1dFxuXHQgIC8vIEZpbmQgZmlyc3Qgbm9uLXplcm8gZGlnaXQgaW4gZGlnaXRzXG5cblx0ICBmaXJzdERpZ2l0ID0gMDtcblxuXHQgIGlmICghbkRpZ2l0c1N0b3JlZCkge1xuXHQgICAgZmlyc3REaWdpdCA9IDA7XG5cdCAgICBsYXN0RGlnaXQgPSAwO1xuXHQgICAgZGlnaXRzWzBdID0gMDtcblx0ICAgIG5EaWdpdHMgPSAxO1xuXHQgICAgbkRpZ2l0c1N0b3JlZCA9IDE7XG5cdCAgICBzaWduaWZpY2FudERpZ2l0cyA9IDA7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGxhc3REaWdpdCA9IG5EaWdpdHNTdG9yZWQgLSAxO1xuXHQgICAgc2lnbmlmaWNhbnREaWdpdHMgPSBuRGlnaXRzO1xuXG5cdCAgICBpZiAoc2lnbmlmaWNhbnREaWdpdHMgIT09IDEpIHtcblx0ICAgICAgd2hpbGUgKHN0cmluZ1tmaXJzdE5vblplcm8gKyBzaWduaWZpY2FudERpZ2l0cyAtIDFdID09PSAnMCcpIHtcblx0ICAgICAgICBzaWduaWZpY2FudERpZ2l0cyA9IHNpZ25pZmljYW50RGlnaXRzIC0gMTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0gLy8gTm9ybWFsaXphdGlvbiBvZiBleHBvbmVudFxuXHQgIC8vIENvcnJlY3QgZXhwb25lbnQgYmFzZWQgb24gcmFkaXggcG9zaXRpb24sIGFuZCBzaGlmdCBzaWduaWZpY2FuZCBhcyBuZWVkZWRcblx0ICAvLyB0byByZXByZXNlbnQgdXNlciBpbnB1dFxuXHQgIC8vIE92ZXJmbG93IHByZXZlbnRpb25cblxuXG5cdCAgaWYgKGV4cG9uZW50IDw9IHJhZGl4UG9zaXRpb24gJiYgcmFkaXhQb3NpdGlvbiAtIGV4cG9uZW50ID4gMSA8PCAxNCkge1xuXHQgICAgZXhwb25lbnQgPSBFWFBPTkVOVF9NSU47XG5cdCAgfSBlbHNlIHtcblx0ICAgIGV4cG9uZW50ID0gZXhwb25lbnQgLSByYWRpeFBvc2l0aW9uO1xuXHQgIH0gLy8gQXR0ZW1wdCB0byBub3JtYWxpemUgdGhlIGV4cG9uZW50XG5cblxuXHQgIHdoaWxlIChleHBvbmVudCA+IEVYUE9ORU5UX01BWCkge1xuXHQgICAgLy8gU2hpZnQgZXhwb25lbnQgdG8gc2lnbmlmaWNhbmQgYW5kIGRlY3JlYXNlXG5cdCAgICBsYXN0RGlnaXQgPSBsYXN0RGlnaXQgKyAxO1xuXG5cdCAgICBpZiAobGFzdERpZ2l0IC0gZmlyc3REaWdpdCA+IE1BWF9ESUdJVFMpIHtcblx0ICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHplcm8gdGhlbiBqdXN0IGhhcmQgY2xhbXAsIG90aGVyd2lzZSBmYWlsXG5cdCAgICAgIHZhciBkaWdpdHNTdHJpbmcgPSBkaWdpdHMuam9pbignJyk7XG5cblx0ICAgICAgaWYgKGRpZ2l0c1N0cmluZy5tYXRjaCgvXjArJC8pKSB7XG5cdCAgICAgICAgZXhwb25lbnQgPSBFWFBPTkVOVF9NQVg7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIH1cblxuXHQgICAgICBpbnZhbGlkRXJyKHN0cmluZywgJ292ZXJmbG93Jyk7XG5cdCAgICB9XG5cblx0ICAgIGV4cG9uZW50ID0gZXhwb25lbnQgLSAxO1xuXHQgIH1cblxuXHQgIHdoaWxlIChleHBvbmVudCA8IEVYUE9ORU5UX01JTiB8fCBuRGlnaXRzU3RvcmVkIDwgbkRpZ2l0cykge1xuXHQgICAgLy8gU2hpZnQgbGFzdCBkaWdpdC4gY2FuIG9ubHkgZG8gdGhpcyBpZiA8IHNpZ25pZmljYW50IGRpZ2l0cyB0aGFuICMgc3RvcmVkLlxuXHQgICAgaWYgKGxhc3REaWdpdCA9PT0gMCAmJiBzaWduaWZpY2FudERpZ2l0cyA8IG5EaWdpdHNTdG9yZWQpIHtcblx0ICAgICAgZXhwb25lbnQgPSBFWFBPTkVOVF9NSU47XG5cdCAgICAgIHNpZ25pZmljYW50RGlnaXRzID0gMDtcblx0ICAgICAgYnJlYWs7XG5cdCAgICB9XG5cblx0ICAgIGlmIChuRGlnaXRzU3RvcmVkIDwgbkRpZ2l0cykge1xuXHQgICAgICAvLyBhZGp1c3QgdG8gbWF0Y2ggZGlnaXRzIG5vdCBzdG9yZWRcblx0ICAgICAgbkRpZ2l0cyA9IG5EaWdpdHMgLSAxO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgLy8gYWRqdXN0IHRvIHJvdW5kXG5cdCAgICAgIGxhc3REaWdpdCA9IGxhc3REaWdpdCAtIDE7XG5cdCAgICB9XG5cblx0ICAgIGlmIChleHBvbmVudCA8IEVYUE9ORU5UX01BWCkge1xuXHQgICAgICBleHBvbmVudCA9IGV4cG9uZW50ICsgMTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSB6ZXJvIHRoZW4ganVzdCBoYXJkIGNsYW1wLCBvdGhlcndpc2UgZmFpbFxuXHQgICAgICB2YXIgX2RpZ2l0c1N0cmluZyA9IGRpZ2l0cy5qb2luKCcnKTtcblxuXHQgICAgICBpZiAoX2RpZ2l0c1N0cmluZy5tYXRjaCgvXjArJC8pKSB7XG5cdCAgICAgICAgZXhwb25lbnQgPSBFWFBPTkVOVF9NQVg7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIH1cblxuXHQgICAgICBpbnZhbGlkRXJyKHN0cmluZywgJ292ZXJmbG93Jyk7XG5cdCAgICB9XG5cdCAgfSAvLyBSb3VuZFxuXHQgIC8vIFdlJ3ZlIG5vcm1hbGl6ZWQgdGhlIGV4cG9uZW50LCBidXQgbWlnaHQgc3RpbGwgbmVlZCB0byByb3VuZC5cblxuXG5cdCAgaWYgKGxhc3REaWdpdCAtIGZpcnN0RGlnaXQgKyAxIDwgc2lnbmlmaWNhbnREaWdpdHMpIHtcblx0ICAgIHZhciBlbmRPZlN0cmluZyA9IG5EaWdpdHNSZWFkOyAvLyBJZiB3ZSBoYXZlIHNlZW4gYSByYWRpeCBwb2ludCwgJ3N0cmluZycgaXMgMSBsb25nZXIgdGhhbiB3ZSBoYXZlXG5cdCAgICAvLyBkb2N1bWVudGVkIHdpdGggbmRpZ2l0c19yZWFkLCBzbyBpbmMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBub256ZXJvXG5cdCAgICAvLyBkaWdpdCBhbmQgdGhlIHBvc2l0aW9uIHRoYXQgZGlnaXRzIGFyZSByZWFkIHRvLlxuXG5cdCAgICBpZiAoc2F3UmFkaXgpIHtcblx0ICAgICAgZmlyc3ROb25aZXJvID0gZmlyc3ROb25aZXJvICsgMTtcblx0ICAgICAgZW5kT2ZTdHJpbmcgPSBlbmRPZlN0cmluZyArIDE7XG5cdCAgICB9IC8vIGlmIG5lZ2F0aXZlLCB3ZSBuZWVkIHRvIGluY3JlbWVudCBhZ2FpbiB0byBhY2NvdW50IGZvciAtIHNpZ24gYXQgc3RhcnQuXG5cblxuXHQgICAgaWYgKGlzTmVnYXRpdmUpIHtcblx0ICAgICAgZmlyc3ROb25aZXJvID0gZmlyc3ROb25aZXJvICsgMTtcblx0ICAgICAgZW5kT2ZTdHJpbmcgPSBlbmRPZlN0cmluZyArIDE7XG5cdCAgICB9XG5cblx0ICAgIHZhciByb3VuZERpZ2l0ID0gcGFyc2VJbnQoc3RyaW5nW2ZpcnN0Tm9uWmVybyArIGxhc3REaWdpdCArIDFdLCAxMCk7XG5cdCAgICB2YXIgcm91bmRCaXQgPSAwO1xuXG5cdCAgICBpZiAocm91bmREaWdpdCA+PSA1KSB7XG5cdCAgICAgIHJvdW5kQml0ID0gMTtcblxuXHQgICAgICBpZiAocm91bmREaWdpdCA9PT0gNSkge1xuXHQgICAgICAgIHJvdW5kQml0ID0gZGlnaXRzW2xhc3REaWdpdF0gJSAyID09PSAxO1xuXG5cdCAgICAgICAgZm9yIChpID0gZmlyc3ROb25aZXJvICsgbGFzdERpZ2l0ICsgMjsgaSA8IGVuZE9mU3RyaW5nOyBpKyspIHtcblx0ICAgICAgICAgIGlmIChwYXJzZUludChzdHJpbmdbaV0sIDEwKSkge1xuXHQgICAgICAgICAgICByb3VuZEJpdCA9IDE7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBpZiAocm91bmRCaXQpIHtcblx0ICAgICAgdmFyIGRJZHggPSBsYXN0RGlnaXQ7XG5cblx0ICAgICAgZm9yICg7IGRJZHggPj0gMDsgZElkeC0tKSB7XG5cdCAgICAgICAgaWYgKCsrZGlnaXRzW2RJZHhdID4gOSkge1xuXHQgICAgICAgICAgZGlnaXRzW2RJZHhdID0gMDsgLy8gb3ZlcmZsb3dlZCBtb3N0IHNpZ25pZmljYW50IGRpZ2l0XG5cblx0ICAgICAgICAgIGlmIChkSWR4ID09PSAwKSB7XG5cdCAgICAgICAgICAgIGlmIChleHBvbmVudCA8IEVYUE9ORU5UX01BWCkge1xuXHQgICAgICAgICAgICAgIGV4cG9uZW50ID0gZXhwb25lbnQgKyAxO1xuXHQgICAgICAgICAgICAgIGRpZ2l0c1tkSWR4XSA9IDE7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWNpbWFsMTI4KEJ1ZmZlciQyLmZyb20oaXNOZWdhdGl2ZSA/IElORl9ORUdBVElWRV9CVUZGRVIgOiBJTkZfUE9TSVRJVkVfQlVGRkVSKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9IC8vIEVuY29kZSBzaWduaWZpY2FuZFxuXHQgIC8vIFRoZSBoaWdoIDE3IGRpZ2l0cyBvZiB0aGUgc2lnbmlmaWNhbmRcblxuXG5cdCAgc2lnbmlmaWNhbmRIaWdoID0gbG9uZ18xLmZyb21OdW1iZXIoMCk7IC8vIFRoZSBsb3cgMTcgZGlnaXRzIG9mIHRoZSBzaWduaWZpY2FuZFxuXG5cdCAgc2lnbmlmaWNhbmRMb3cgPSBsb25nXzEuZnJvbU51bWJlcigwKTsgLy8gcmVhZCBhIHplcm9cblxuXHQgIGlmIChzaWduaWZpY2FudERpZ2l0cyA9PT0gMCkge1xuXHQgICAgc2lnbmlmaWNhbmRIaWdoID0gbG9uZ18xLmZyb21OdW1iZXIoMCk7XG5cdCAgICBzaWduaWZpY2FuZExvdyA9IGxvbmdfMS5mcm9tTnVtYmVyKDApO1xuXHQgIH0gZWxzZSBpZiAobGFzdERpZ2l0IC0gZmlyc3REaWdpdCA8IDE3KSB7XG5cdCAgICB2YXIgX2RJZHggPSBmaXJzdERpZ2l0O1xuXHQgICAgc2lnbmlmaWNhbmRMb3cgPSBsb25nXzEuZnJvbU51bWJlcihkaWdpdHNbX2RJZHgrK10pO1xuXHQgICAgc2lnbmlmaWNhbmRIaWdoID0gbmV3IGxvbmdfMSgwLCAwKTtcblxuXHQgICAgZm9yICg7IF9kSWR4IDw9IGxhc3REaWdpdDsgX2RJZHgrKykge1xuXHQgICAgICBzaWduaWZpY2FuZExvdyA9IHNpZ25pZmljYW5kTG93Lm11bHRpcGx5KGxvbmdfMS5mcm9tTnVtYmVyKDEwKSk7XG5cdCAgICAgIHNpZ25pZmljYW5kTG93ID0gc2lnbmlmaWNhbmRMb3cuYWRkKGxvbmdfMS5mcm9tTnVtYmVyKGRpZ2l0c1tfZElkeF0pKTtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgdmFyIF9kSWR4MiA9IGZpcnN0RGlnaXQ7XG5cdCAgICBzaWduaWZpY2FuZEhpZ2ggPSBsb25nXzEuZnJvbU51bWJlcihkaWdpdHNbX2RJZHgyKytdKTtcblxuXHQgICAgZm9yICg7IF9kSWR4MiA8PSBsYXN0RGlnaXQgLSAxNzsgX2RJZHgyKyspIHtcblx0ICAgICAgc2lnbmlmaWNhbmRIaWdoID0gc2lnbmlmaWNhbmRIaWdoLm11bHRpcGx5KGxvbmdfMS5mcm9tTnVtYmVyKDEwKSk7XG5cdCAgICAgIHNpZ25pZmljYW5kSGlnaCA9IHNpZ25pZmljYW5kSGlnaC5hZGQobG9uZ18xLmZyb21OdW1iZXIoZGlnaXRzW19kSWR4Ml0pKTtcblx0ICAgIH1cblxuXHQgICAgc2lnbmlmaWNhbmRMb3cgPSBsb25nXzEuZnJvbU51bWJlcihkaWdpdHNbX2RJZHgyKytdKTtcblxuXHQgICAgZm9yICg7IF9kSWR4MiA8PSBsYXN0RGlnaXQ7IF9kSWR4MisrKSB7XG5cdCAgICAgIHNpZ25pZmljYW5kTG93ID0gc2lnbmlmaWNhbmRMb3cubXVsdGlwbHkobG9uZ18xLmZyb21OdW1iZXIoMTApKTtcblx0ICAgICAgc2lnbmlmaWNhbmRMb3cgPSBzaWduaWZpY2FuZExvdy5hZGQobG9uZ18xLmZyb21OdW1iZXIoZGlnaXRzW19kSWR4Ml0pKTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICB2YXIgc2lnbmlmaWNhbmQgPSBtdWx0aXBseTY0eDIoc2lnbmlmaWNhbmRIaWdoLCBsb25nXzEuZnJvbVN0cmluZygnMTAwMDAwMDAwMDAwMDAwMDAwJykpO1xuXHQgIHNpZ25pZmljYW5kLmxvdyA9IHNpZ25pZmljYW5kLmxvdy5hZGQoc2lnbmlmaWNhbmRMb3cpO1xuXG5cdCAgaWYgKGxlc3NUaGFuKHNpZ25pZmljYW5kLmxvdywgc2lnbmlmaWNhbmRMb3cpKSB7XG5cdCAgICBzaWduaWZpY2FuZC5oaWdoID0gc2lnbmlmaWNhbmQuaGlnaC5hZGQobG9uZ18xLmZyb21OdW1iZXIoMSkpO1xuXHQgIH0gLy8gQmlhc2VkIGV4cG9uZW50XG5cblxuXHQgIGJpYXNlZEV4cG9uZW50ID0gZXhwb25lbnQgKyBFWFBPTkVOVF9CSUFTO1xuXHQgIHZhciBkZWMgPSB7XG5cdCAgICBsb3c6IGxvbmdfMS5mcm9tTnVtYmVyKDApLFxuXHQgICAgaGlnaDogbG9uZ18xLmZyb21OdW1iZXIoMClcblx0ICB9OyAvLyBFbmNvZGUgY29tYmluYXRpb24sIGV4cG9uZW50LCBhbmQgc2lnbmlmaWNhbmQuXG5cblx0ICBpZiAoc2lnbmlmaWNhbmQuaGlnaC5zaGlmdFJpZ2h0VW5zaWduZWQoNDkpLmFuZChsb25nXzEuZnJvbU51bWJlcigxKSkuZXF1YWxzKGxvbmdfMS5mcm9tTnVtYmVyKDEpKSkge1xuXHQgICAgLy8gRW5jb2RlICcxMScgaW50byBiaXRzIDEgdG8gM1xuXHQgICAgZGVjLmhpZ2ggPSBkZWMuaGlnaC5vcihsb25nXzEuZnJvbU51bWJlcigweDMpLnNoaWZ0TGVmdCg2MSkpO1xuXHQgICAgZGVjLmhpZ2ggPSBkZWMuaGlnaC5vcihsb25nXzEuZnJvbU51bWJlcihiaWFzZWRFeHBvbmVudCkuYW5kKGxvbmdfMS5mcm9tTnVtYmVyKDB4M2ZmZikuc2hpZnRMZWZ0KDQ3KSkpO1xuXHQgICAgZGVjLmhpZ2ggPSBkZWMuaGlnaC5vcihzaWduaWZpY2FuZC5oaWdoLmFuZChsb25nXzEuZnJvbU51bWJlcigweDdmZmZmZmZmZmZmZikpKTtcblx0ICB9IGVsc2Uge1xuXHQgICAgZGVjLmhpZ2ggPSBkZWMuaGlnaC5vcihsb25nXzEuZnJvbU51bWJlcihiaWFzZWRFeHBvbmVudCAmIDB4M2ZmZikuc2hpZnRMZWZ0KDQ5KSk7XG5cdCAgICBkZWMuaGlnaCA9IGRlYy5oaWdoLm9yKHNpZ25pZmljYW5kLmhpZ2guYW5kKGxvbmdfMS5mcm9tTnVtYmVyKDB4MWZmZmZmZmZmZmZmZikpKTtcblx0ICB9XG5cblx0ICBkZWMubG93ID0gc2lnbmlmaWNhbmQubG93OyAvLyBFbmNvZGUgc2lnblxuXG5cdCAgaWYgKGlzTmVnYXRpdmUpIHtcblx0ICAgIGRlYy5oaWdoID0gZGVjLmhpZ2gub3IobG9uZ18xLmZyb21TdHJpbmcoJzkyMjMzNzIwMzY4NTQ3NzU4MDgnKSk7XG5cdCAgfSAvLyBFbmNvZGUgaW50byBhIGJ1ZmZlclxuXG5cblx0ICB2YXIgYnVmZmVyJCQxID0gQnVmZmVyJDIuYWxsb2MoMTYpO1xuXHQgIGluZGV4ID0gMDsgLy8gRW5jb2RlIHRoZSBsb3cgNjQgYml0cyBvZiB0aGUgZGVjaW1hbFxuXHQgIC8vIEVuY29kZSBsb3cgYml0c1xuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gZGVjLmxvdy5sb3cgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGRlYy5sb3cubG93ID4+IDggJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGRlYy5sb3cubG93ID4+IDE2ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBkZWMubG93LmxvdyA+PiAyNCAmIDB4ZmY7IC8vIEVuY29kZSBoaWdoIGJpdHNcblxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGRlYy5sb3cuaGlnaCAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gZGVjLmxvdy5oaWdoID4+IDggJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGRlYy5sb3cuaGlnaCA+PiAxNiAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gZGVjLmxvdy5oaWdoID4+IDI0ICYgMHhmZjsgLy8gRW5jb2RlIHRoZSBoaWdoIDY0IGJpdHMgb2YgdGhlIGRlY2ltYWxcblx0ICAvLyBFbmNvZGUgbG93IGJpdHNcblxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGRlYy5oaWdoLmxvdyAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gZGVjLmhpZ2gubG93ID4+IDggJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGRlYy5oaWdoLmxvdyA+PiAxNiAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gZGVjLmhpZ2gubG93ID4+IDI0ICYgMHhmZjsgLy8gRW5jb2RlIGhpZ2ggYml0c1xuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gZGVjLmhpZ2guaGlnaCAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gZGVjLmhpZ2guaGlnaCA+PiA4ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBkZWMuaGlnaC5oaWdoID4+IDE2ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBkZWMuaGlnaC5oaWdoID4+IDI0ICYgMHhmZjsgLy8gUmV0dXJuIHRoZSBuZXcgRGVjaW1hbDEyOFxuXG5cdCAgcmV0dXJuIG5ldyBEZWNpbWFsMTI4KGJ1ZmZlciQkMSk7XG5cdH07IC8vIEV4dHJhY3QgbGVhc3Qgc2lnbmlmaWNhbnQgNSBiaXRzXG5cblxuXHR2YXIgQ09NQklOQVRJT05fTUFTSyA9IDB4MWY7IC8vIEV4dHJhY3QgbGVhc3Qgc2lnbmlmaWNhbnQgMTQgYml0c1xuXG5cdHZhciBFWFBPTkVOVF9NQVNLID0gMHgzZmZmOyAvLyBWYWx1ZSBvZiBjb21iaW5hdGlvbiBmaWVsZCBmb3IgSW5mXG5cblx0dmFyIENPTUJJTkFUSU9OX0lORklOSVRZID0gMzA7IC8vIFZhbHVlIG9mIGNvbWJpbmF0aW9uIGZpZWxkIGZvciBOYU5cblxuXHR2YXIgQ09NQklOQVRJT05fTkFOID0gMzE7XG5cdC8qKlxuXHQgKiBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJhdyBEZWNpbWFsMTI4IHZhbHVlXG5cdCAqXG5cdCAqIEBtZXRob2Rcblx0ICogQHJldHVybiB7c3RyaW5nfSByZXR1cm5zIGEgRGVjaW1hbDEyOCBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG5cdCAqL1xuXG5cdERlY2ltYWwxMjgucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuXHQgIC8vIE5vdGU6IGJpdHMgaW4gdGhpcyByb3V0aW5lIGFyZSByZWZlcnJlZCB0byBzdGFydGluZyBhdCAwLFxuXHQgIC8vIGZyb20gdGhlIHNpZ24gYml0LCB0b3dhcmRzIHRoZSBjb2VmZmljaWVudC5cblx0ICAvLyBiaXRzIDAgLSAzMVxuXHQgIHZhciBoaWdoOyAvLyBiaXRzIDMyIC0gNjNcblxuXHQgIHZhciBtaWRoOyAvLyBiaXRzIDY0IC0gOTVcblxuXHQgIHZhciBtaWRsOyAvLyBiaXRzIDk2IC0gMTI3XG5cblx0ICB2YXIgbG93OyAvLyBiaXRzIDEgLSA1XG5cblx0ICB2YXIgY29tYmluYXRpb247IC8vIGRlY29kZWQgYmlhc2VkIGV4cG9uZW50ICgxNCBiaXRzKVxuXG5cdCAgdmFyIGJpYXNlZF9leHBvbmVudDsgLy8gdGhlIG51bWJlciBvZiBzaWduaWZpY2FuZCBkaWdpdHNcblxuXHQgIHZhciBzaWduaWZpY2FuZF9kaWdpdHMgPSAwOyAvLyB0aGUgYmFzZS0xMCBkaWdpdHMgaW4gdGhlIHNpZ25pZmljYW5kXG5cblx0ICB2YXIgc2lnbmlmaWNhbmQgPSBuZXcgQXJyYXkoMzYpO1xuXG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWduaWZpY2FuZC5sZW5ndGg7IGkrKykge1xuXHQgICAgc2lnbmlmaWNhbmRbaV0gPSAwO1xuXHQgIH0gLy8gcmVhZCBwb2ludGVyIGludG8gc2lnbmlmaWNhbmRcblxuXG5cdCAgdmFyIGluZGV4ID0gMDsgLy8gdW5iaWFzZWQgZXhwb25lbnRcblxuXHQgIHZhciBleHBvbmVudDsgLy8gdGhlIGV4cG9uZW50IGlmIHNjaWVudGlmaWMgbm90YXRpb24gaXMgdXNlZFxuXG5cdCAgdmFyIHNjaWVudGlmaWNfZXhwb25lbnQ7IC8vIHRydWUgaWYgdGhlIG51bWJlciBpcyB6ZXJvXG5cblx0ICB2YXIgaXNfemVybyA9IGZhbHNlOyAvLyB0aGUgbW9zdCBzaWduaWZjYW50IHNpZ25pZmljYW5kIGJpdHMgKDUwLTQ2KVxuXG5cdCAgdmFyIHNpZ25pZmljYW5kX21zYjsgLy8gdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIHNpZ25pZmljYW5kIGRlY29kaW5nXG5cblx0ICB2YXIgc2lnbmlmaWNhbmQxMjggPSB7XG5cdCAgICBwYXJ0czogbmV3IEFycmF5KDQpXG5cdCAgfTsgLy8gaW5kZXhpbmcgdmFyaWFibGVzXG5cblx0ICB2YXIgaiwgazsgLy8gT3V0cHV0IHN0cmluZ1xuXG5cdCAgdmFyIHN0cmluZyA9IFtdOyAvLyBVbnBhY2sgaW5kZXhcblxuXHQgIGluZGV4ID0gMDsgLy8gQnVmZmVyIHJlZmVyZW5jZVxuXG5cdCAgdmFyIGJ1ZmZlciQkMSA9IHRoaXMuYnl0ZXM7IC8vIFVucGFjayB0aGUgbG93IDY0Yml0cyBpbnRvIGEgbG9uZ1xuXG5cdCAgbG93ID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7XG5cdCAgbWlkbCA9IGJ1ZmZlciQkMVtpbmRleCsrXSB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCA4IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDE2IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDI0OyAvLyBVbnBhY2sgdGhlIGhpZ2ggNjRiaXRzIGludG8gYSBsb25nXG5cblx0ICBtaWRoID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7XG5cdCAgaGlnaCA9IGJ1ZmZlciQkMVtpbmRleCsrXSB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCA4IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDE2IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDI0OyAvLyBVbnBhY2sgaW5kZXhcblxuXHQgIGluZGV4ID0gMDsgLy8gQ3JlYXRlIHRoZSBzdGF0ZSBvZiB0aGUgZGVjaW1hbFxuXG5cdCAgdmFyIGRlYyA9IHtcblx0ICAgIGxvdzogbmV3IGxvbmdfMShsb3csIG1pZGwpLFxuXHQgICAgaGlnaDogbmV3IGxvbmdfMShtaWRoLCBoaWdoKVxuXHQgIH07XG5cblx0ICBpZiAoZGVjLmhpZ2gubGVzc1RoYW4obG9uZ18xLlpFUk8pKSB7XG5cdCAgICBzdHJpbmcucHVzaCgnLScpO1xuXHQgIH0gLy8gRGVjb2RlIGNvbWJpbmF0aW9uIGZpZWxkIGFuZCBleHBvbmVudFxuXG5cblx0ICBjb21iaW5hdGlvbiA9IGhpZ2ggPj4gMjYgJiBDT01CSU5BVElPTl9NQVNLO1xuXG5cdCAgaWYgKGNvbWJpbmF0aW9uID4+IDMgPT09IDMpIHtcblx0ICAgIC8vIENoZWNrIGZvciAnc3BlY2lhbCcgdmFsdWVzXG5cdCAgICBpZiAoY29tYmluYXRpb24gPT09IENPTUJJTkFUSU9OX0lORklOSVRZKSB7XG5cdCAgICAgIHJldHVybiBzdHJpbmcuam9pbignJykgKyAnSW5maW5pdHknO1xuXHQgICAgfSBlbHNlIGlmIChjb21iaW5hdGlvbiA9PT0gQ09NQklOQVRJT05fTkFOKSB7XG5cdCAgICAgIHJldHVybiAnTmFOJztcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGJpYXNlZF9leHBvbmVudCA9IGhpZ2ggPj4gMTUgJiBFWFBPTkVOVF9NQVNLO1xuXHQgICAgICBzaWduaWZpY2FuZF9tc2IgPSAweDA4ICsgKGhpZ2ggPj4gMTQgJiAweDAxKTtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgc2lnbmlmaWNhbmRfbXNiID0gaGlnaCA+PiAxNCAmIDB4MDc7XG5cdCAgICBiaWFzZWRfZXhwb25lbnQgPSBoaWdoID4+IDE3ICYgRVhQT05FTlRfTUFTSztcblx0ICB9XG5cblx0ICBleHBvbmVudCA9IGJpYXNlZF9leHBvbmVudCAtIEVYUE9ORU5UX0JJQVM7IC8vIENyZWF0ZSBzdHJpbmcgb2Ygc2lnbmlmaWNhbmQgZGlnaXRzXG5cdCAgLy8gQ29udmVydCB0aGUgMTE0LWJpdCBiaW5hcnkgbnVtYmVyIHJlcHJlc2VudGVkIGJ5XG5cdCAgLy8gKHNpZ25pZmljYW5kX2hpZ2gsIHNpZ25pZmljYW5kX2xvdykgdG8gYXQgbW9zdCAzNCBkZWNpbWFsXG5cdCAgLy8gZGlnaXRzIHRocm91Z2ggbW9kdWxvIGFuZCBkaXZpc2lvbi5cblxuXHQgIHNpZ25pZmljYW5kMTI4LnBhcnRzWzBdID0gKGhpZ2ggJiAweDNmZmYpICsgKChzaWduaWZpY2FuZF9tc2IgJiAweGYpIDw8IDE0KTtcblx0ICBzaWduaWZpY2FuZDEyOC5wYXJ0c1sxXSA9IG1pZGg7XG5cdCAgc2lnbmlmaWNhbmQxMjgucGFydHNbMl0gPSBtaWRsO1xuXHQgIHNpZ25pZmljYW5kMTI4LnBhcnRzWzNdID0gbG93O1xuXG5cdCAgaWYgKHNpZ25pZmljYW5kMTI4LnBhcnRzWzBdID09PSAwICYmIHNpZ25pZmljYW5kMTI4LnBhcnRzWzFdID09PSAwICYmIHNpZ25pZmljYW5kMTI4LnBhcnRzWzJdID09PSAwICYmIHNpZ25pZmljYW5kMTI4LnBhcnRzWzNdID09PSAwKSB7XG5cdCAgICBpc196ZXJvID0gdHJ1ZTtcblx0ICB9IGVsc2Uge1xuXHQgICAgZm9yIChrID0gMzsgayA+PSAwOyBrLS0pIHtcblx0ICAgICAgdmFyIGxlYXN0X2RpZ2l0cyA9IDA7IC8vIFBlZm9ybSB0aGUgZGl2aWRlXG5cblx0ICAgICAgdmFyIHJlc3VsdCA9IGRpdmlkZXUxMjgoc2lnbmlmaWNhbmQxMjgpO1xuXHQgICAgICBzaWduaWZpY2FuZDEyOCA9IHJlc3VsdC5xdW90aWVudDtcblx0ICAgICAgbGVhc3RfZGlnaXRzID0gcmVzdWx0LnJlbS5sb3c7IC8vIFdlIG5vdyBoYXZlIHRoZSA5IGxlYXN0IHNpZ25pZmljYW50IGRpZ2l0cyAoaW4gYmFzZSAyKS5cblx0ICAgICAgLy8gQ29udmVydCBhbmQgb3V0cHV0IHRvIHN0cmluZy5cblxuXHQgICAgICBpZiAoIWxlYXN0X2RpZ2l0cykgY29udGludWU7XG5cblx0ICAgICAgZm9yIChqID0gODsgaiA+PSAwOyBqLS0pIHtcblx0ICAgICAgICAvLyBzaWduaWZpY2FuZFtrICogOSArIGpdID0gTWF0aC5yb3VuZChsZWFzdF9kaWdpdHMgJSAxMCk7XG5cdCAgICAgICAgc2lnbmlmaWNhbmRbayAqIDkgKyBqXSA9IGxlYXN0X2RpZ2l0cyAlIDEwOyAvLyBsZWFzdF9kaWdpdHMgPSBNYXRoLnJvdW5kKGxlYXN0X2RpZ2l0cyAvIDEwKTtcblxuXHQgICAgICAgIGxlYXN0X2RpZ2l0cyA9IE1hdGguZmxvb3IobGVhc3RfZGlnaXRzIC8gMTApO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSAvLyBPdXRwdXQgZm9ybWF0IG9wdGlvbnM6XG5cdCAgLy8gU2NpZW50aWZpYyAtIFstXWQuZGRkRSgrLy0pZGQgb3IgWy1dZEUoKy8tKWRkXG5cdCAgLy8gUmVndWxhciAgICAtIGRkZC5kZGRcblxuXG5cdCAgaWYgKGlzX3plcm8pIHtcblx0ICAgIHNpZ25pZmljYW5kX2RpZ2l0cyA9IDE7XG5cdCAgICBzaWduaWZpY2FuZFtpbmRleF0gPSAwO1xuXHQgIH0gZWxzZSB7XG5cdCAgICBzaWduaWZpY2FuZF9kaWdpdHMgPSAzNjtcblxuXHQgICAgd2hpbGUgKCFzaWduaWZpY2FuZFtpbmRleF0pIHtcblx0ICAgICAgc2lnbmlmaWNhbmRfZGlnaXRzID0gc2lnbmlmaWNhbmRfZGlnaXRzIC0gMTtcblx0ICAgICAgaW5kZXggPSBpbmRleCArIDE7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgc2NpZW50aWZpY19leHBvbmVudCA9IHNpZ25pZmljYW5kX2RpZ2l0cyAtIDEgKyBleHBvbmVudDsgLy8gVGhlIHNjaWVudGlmaWMgZXhwb25lbnQgY2hlY2tzIGFyZSBkaWN0YXRlZCBieSB0aGUgc3RyaW5nIGNvbnZlcnNpb25cblx0ICAvLyBzcGVjaWZpY2F0aW9uIGFuZCBhcmUgc29tZXdoYXQgYXJiaXRyYXJ5IGN1dG9mZnMuXG5cdCAgLy9cblx0ICAvLyBXZSBtdXN0IGNoZWNrIGV4cG9uZW50ID4gMCwgYmVjYXVzZSBpZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGUgbnVtYmVyXG5cdCAgLy8gaGFzIHRyYWlsaW5nIHplcm9zLiAgSG93ZXZlciwgd2UgKmNhbm5vdCogb3V0cHV0IHRoZXNlIHRyYWlsaW5nIHplcm9zLFxuXHQgIC8vIGJlY2F1c2UgZG9pbmcgc28gd291bGQgY2hhbmdlIHRoZSBwcmVjaXNpb24gb2YgdGhlIHZhbHVlLCBhbmQgd291bGRcblx0ICAvLyBjaGFuZ2Ugc3RvcmVkIGRhdGEgaWYgdGhlIHN0cmluZyBjb252ZXJ0ZWQgbnVtYmVyIGlzIHJvdW5kIHRyaXBwZWQuXG5cblx0ICBpZiAoc2NpZW50aWZpY19leHBvbmVudCA+PSAzNCB8fCBzY2llbnRpZmljX2V4cG9uZW50IDw9IC03IHx8IGV4cG9uZW50ID4gMCkge1xuXHQgICAgLy8gU2NpZW50aWZpYyBmb3JtYXRcblx0ICAgIC8vIGlmIHRoZXJlIGFyZSB0b28gbWFueSBzaWduaWZpY2FudCBkaWdpdHMsIHdlIHNob3VsZCBqdXN0IGJlIHRyZWF0aW5nIG51bWJlcnNcblx0ICAgIC8vIGFzICsgb3IgLSAwIGFuZCB1c2luZyB0aGUgbm9uLXNjaWVudGlmaWMgZXhwb25lbnQgKHRoaXMgaXMgZm9yIHRoZSBcImludmFsaWRcblx0ICAgIC8vIHJlcHJlc2VudGF0aW9uIHNob3VsZCBiZSB0cmVhdGVkIGFzIDAvLTBcIiBzcGVjIGNhc2VzIGluIGRlY2ltYWwxMjgtMS5qc29uKVxuXHQgICAgaWYgKHNpZ25pZmljYW5kX2RpZ2l0cyA+IDM0KSB7XG5cdCAgICAgIHN0cmluZy5wdXNoKDApO1xuXHQgICAgICBpZiAoZXhwb25lbnQgPiAwKSBzdHJpbmcucHVzaCgnRSsnICsgZXhwb25lbnQpO2Vsc2UgaWYgKGV4cG9uZW50IDwgMCkgc3RyaW5nLnB1c2goJ0UnICsgZXhwb25lbnQpO1xuXHQgICAgICByZXR1cm4gc3RyaW5nLmpvaW4oJycpO1xuXHQgICAgfVxuXG5cdCAgICBzdHJpbmcucHVzaChzaWduaWZpY2FuZFtpbmRleCsrXSk7XG5cdCAgICBzaWduaWZpY2FuZF9kaWdpdHMgPSBzaWduaWZpY2FuZF9kaWdpdHMgLSAxO1xuXG5cdCAgICBpZiAoc2lnbmlmaWNhbmRfZGlnaXRzKSB7XG5cdCAgICAgIHN0cmluZy5wdXNoKCcuJyk7XG5cdCAgICB9XG5cblx0ICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBzaWduaWZpY2FuZF9kaWdpdHM7IF9pKyspIHtcblx0ICAgICAgc3RyaW5nLnB1c2goc2lnbmlmaWNhbmRbaW5kZXgrK10pO1xuXHQgICAgfSAvLyBFeHBvbmVudFxuXG5cblx0ICAgIHN0cmluZy5wdXNoKCdFJyk7XG5cblx0ICAgIGlmIChzY2llbnRpZmljX2V4cG9uZW50ID4gMCkge1xuXHQgICAgICBzdHJpbmcucHVzaCgnKycgKyBzY2llbnRpZmljX2V4cG9uZW50KTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHN0cmluZy5wdXNoKHNjaWVudGlmaWNfZXhwb25lbnQpO1xuXHQgICAgfVxuXHQgIH0gZWxzZSB7XG5cdCAgICAvLyBSZWd1bGFyIGZvcm1hdCB3aXRoIG5vIGRlY2ltYWwgcGxhY2Vcblx0ICAgIGlmIChleHBvbmVudCA+PSAwKSB7XG5cdCAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHNpZ25pZmljYW5kX2RpZ2l0czsgX2kyKyspIHtcblx0ICAgICAgICBzdHJpbmcucHVzaChzaWduaWZpY2FuZFtpbmRleCsrXSk7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHZhciByYWRpeF9wb3NpdGlvbiA9IHNpZ25pZmljYW5kX2RpZ2l0cyArIGV4cG9uZW50OyAvLyBub24temVybyBkaWdpdHMgYmVmb3JlIHJhZGl4XG5cblx0ICAgICAgaWYgKHJhZGl4X3Bvc2l0aW9uID4gMCkge1xuXHQgICAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IHJhZGl4X3Bvc2l0aW9uOyBfaTMrKykge1xuXHQgICAgICAgICAgc3RyaW5nLnB1c2goc2lnbmlmaWNhbmRbaW5kZXgrK10pO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBzdHJpbmcucHVzaCgnMCcpO1xuXHQgICAgICB9XG5cblx0ICAgICAgc3RyaW5nLnB1c2goJy4nKTsgLy8gYWRkIGxlYWRpbmcgemVyb3MgYWZ0ZXIgcmFkaXhcblxuXHQgICAgICB3aGlsZSAocmFkaXhfcG9zaXRpb24rKyA8IDApIHtcblx0ICAgICAgICBzdHJpbmcucHVzaCgnMCcpO1xuXHQgICAgICB9XG5cblx0ICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgc2lnbmlmaWNhbmRfZGlnaXRzIC0gTWF0aC5tYXgocmFkaXhfcG9zaXRpb24gLSAxLCAwKTsgX2k0KyspIHtcblx0ICAgICAgICBzdHJpbmcucHVzaChzaWduaWZpY2FuZFtpbmRleCsrXSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cblx0ICByZXR1cm4gc3RyaW5nLmpvaW4oJycpO1xuXHR9O1xuXG5cdERlY2ltYWwxMjgucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblx0ICByZXR1cm4ge1xuXHQgICAgJG51bWJlckRlY2ltYWw6IHRoaXMudG9TdHJpbmcoKVxuXHQgIH07XG5cdH07XG5cdC8qKlxuXHQgKiBAaWdub3JlXG5cdCAqL1xuXG5cblx0RGVjaW1hbDEyOC5wcm90b3R5cGUudG9FeHRlbmRlZEpTT04gPSBmdW5jdGlvbiAoKSB7XG5cdCAgcmV0dXJuIHtcblx0ICAgICRudW1iZXJEZWNpbWFsOiB0aGlzLnRvU3RyaW5nKClcblx0ICB9O1xuXHR9O1xuXHQvKipcblx0ICogQGlnbm9yZVxuXHQgKi9cblxuXG5cdERlY2ltYWwxMjguZnJvbUV4dGVuZGVkSlNPTiA9IGZ1bmN0aW9uIChkb2MpIHtcblx0ICByZXR1cm4gRGVjaW1hbDEyOC5mcm9tU3RyaW5nKGRvYy4kbnVtYmVyRGVjaW1hbCk7XG5cdH07XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KERlY2ltYWwxMjgucHJvdG90eXBlLCAnX2Jzb250eXBlJywge1xuXHQgIHZhbHVlOiAnRGVjaW1hbDEyOCdcblx0fSk7XG5cdHZhciBkZWNpbWFsMTI4ID0gRGVjaW1hbDEyODtcblxuXHQvKipcblx0ICogQSBjbGFzcyByZXByZXNlbnRhdGlvbiBvZiB0aGUgQlNPTiBNaW5LZXkgdHlwZS5cblx0ICovXG5cblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrJDcoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDcodGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQ3KENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkNyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDcoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cblx0dmFyIE1pbktleSA9XG5cdC8qI19fUFVSRV9fKi9cblx0ZnVuY3Rpb24gKCkge1xuXHQgIC8qKlxuXHQgICAqIENyZWF0ZSBhIE1pbktleSB0eXBlXG5cdCAgICpcblx0ICAgKiBAcmV0dXJuIHtNaW5LZXl9IEEgTWluS2V5IGluc3RhbmNlXG5cdCAgICovXG5cdCAgZnVuY3Rpb24gTWluS2V5KCkge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrJDcodGhpcywgTWluS2V5KTtcblx0ICB9XG5cdCAgLyoqXG5cdCAgICogQGlnbm9yZVxuXHQgICAqL1xuXG5cblx0ICBfY3JlYXRlQ2xhc3MkNyhNaW5LZXksIFt7XG5cdCAgICBrZXk6IFwidG9FeHRlbmRlZEpTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b0V4dGVuZGVkSlNPTigpIHtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAkbWluS2V5OiAxXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfV0sIFt7XG5cdCAgICBrZXk6IFwiZnJvbUV4dGVuZGVkSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21FeHRlbmRlZEpTT04oKSB7XG5cdCAgICAgIHJldHVybiBuZXcgTWluS2V5KCk7XG5cdCAgICB9XG5cdCAgfV0pO1xuXG5cdCAgcmV0dXJuIE1pbktleTtcblx0fSgpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShNaW5LZXkucHJvdG90eXBlLCAnX2Jzb250eXBlJywge1xuXHQgIHZhbHVlOiAnTWluS2V5J1xuXHR9KTtcblx0dmFyIG1pbl9rZXkgPSBNaW5LZXk7XG5cblx0LyoqXG5cdCAqIEEgY2xhc3MgcmVwcmVzZW50YXRpb24gb2YgdGhlIEJTT04gTWF4S2V5IHR5cGUuXG5cdCAqL1xuXG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQ4KGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuXHRmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQ4KHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuXHRmdW5jdGlvbiBfY3JlYXRlQ2xhc3MkOChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDgoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ4KENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5cdHZhciBNYXhLZXkgPVxuXHQvKiNfX1BVUkVfXyovXG5cdGZ1bmN0aW9uICgpIHtcblx0ICAvKipcblx0ICAgKiBDcmVhdGUgYSBNYXhLZXkgdHlwZVxuXHQgICAqXG5cdCAgICogQHJldHVybiB7TWF4S2V5fSBBIE1heEtleSBpbnN0YW5jZVxuXHQgICAqL1xuXHQgIGZ1bmN0aW9uIE1heEtleSgpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayQ4KHRoaXMsIE1heEtleSk7XG5cdCAgfVxuXHQgIC8qKlxuXHQgICAqIEBpZ25vcmVcblx0ICAgKi9cblxuXG5cdCAgX2NyZWF0ZUNsYXNzJDgoTWF4S2V5LCBbe1xuXHQgICAga2V5OiBcInRvRXh0ZW5kZWRKU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9FeHRlbmRlZEpTT04oKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgJG1heEtleTogMVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH1dLCBbe1xuXHQgICAga2V5OiBcImZyb21FeHRlbmRlZEpTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tRXh0ZW5kZWRKU09OKCkge1xuXHQgICAgICByZXR1cm4gbmV3IE1heEtleSgpO1xuXHQgICAgfVxuXHQgIH1dKTtcblxuXHQgIHJldHVybiBNYXhLZXk7XG5cdH0oKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoTWF4S2V5LnByb3RvdHlwZSwgJ19ic29udHlwZScsIHtcblx0ICB2YWx1ZTogJ01heEtleSdcblx0fSk7XG5cdHZhciBtYXhfa2V5ID0gTWF4S2V5O1xuXG5cdC8qKlxuXHQgKiBBIGNsYXNzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBCU09OIERCUmVmIHR5cGUuXG5cdCAqL1xuXG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQ5KGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuXHRmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQ5KHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuXHRmdW5jdGlvbiBfY3JlYXRlQ2xhc3MkOShDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDkoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ5KENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5cdHZhciBEQlJlZiA9XG5cdC8qI19fUFVSRV9fKi9cblx0ZnVuY3Rpb24gKCkge1xuXHQgIC8qKlxuXHQgICAqIENyZWF0ZSBhIERCUmVmIHR5cGVcblx0ICAgKlxuXHQgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uIHRoZSBjb2xsZWN0aW9uIG5hbWUuXG5cdCAgICogQHBhcmFtIHtPYmplY3RJZH0gb2lkIHRoZSByZWZlcmVuY2UgT2JqZWN0SWQuXG5cdCAgICogQHBhcmFtIHtzdHJpbmd9IFtkYl0gb3B0aW9uYWwgZGIgbmFtZSwgaWYgb21pdHRlZCB0aGUgcmVmZXJlbmNlIGlzIGxvY2FsIHRvIHRoZSBjdXJyZW50IGRiLlxuXHQgICAqIEByZXR1cm4ge0RCUmVmfVxuXHQgICAqL1xuXHQgIGZ1bmN0aW9uIERCUmVmKGNvbGxlY3Rpb24sIG9pZCwgZGIsIGZpZWxkcykge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrJDkodGhpcywgREJSZWYpO1xuXG5cdCAgICAvLyBjaGVjayBpZiBuYW1lc3BhY2UgaGFzIGJlZW4gcHJvdmlkZWRcblx0ICAgIHZhciBwYXJ0cyA9IGNvbGxlY3Rpb24uc3BsaXQoJy4nKTtcblxuXHQgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuXHQgICAgICBkYiA9IHBhcnRzLnNoaWZ0KCk7XG5cdCAgICAgIGNvbGxlY3Rpb24gPSBwYXJ0cy5zaGlmdCgpO1xuXHQgICAgfVxuXG5cdCAgICB0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uO1xuXHQgICAgdGhpcy5vaWQgPSBvaWQ7XG5cdCAgICB0aGlzLmRiID0gZGI7XG5cdCAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcyB8fCB7fTtcblx0ICB9XG5cdCAgLyoqXG5cdCAgICogQGlnbm9yZVxuXHQgICAqIEBhcGkgcHJpdmF0ZVxuXHQgICAqL1xuXG5cblx0ICBfY3JlYXRlQ2xhc3MkOShEQlJlZiwgW3tcblx0ICAgIGtleTogXCJ0b0pTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG5cdCAgICAgIHZhciBvID0gT2JqZWN0LmFzc2lnbih7XG5cdCAgICAgICAgJHJlZjogdGhpcy5jb2xsZWN0aW9uLFxuXHQgICAgICAgICRpZDogdGhpcy5vaWRcblx0ICAgICAgfSwgdGhpcy5maWVsZHMpO1xuXHQgICAgICBpZiAodGhpcy5kYiAhPSBudWxsKSBvLiRkYiA9IHRoaXMuZGI7XG5cdCAgICAgIHJldHVybiBvO1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJ0b0V4dGVuZGVkSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvRXh0ZW5kZWRKU09OKCkge1xuXHQgICAgICB2YXIgbyA9IHtcblx0ICAgICAgICAkcmVmOiB0aGlzLmNvbGxlY3Rpb24sXG5cdCAgICAgICAgJGlkOiB0aGlzLm9pZFxuXHQgICAgICB9O1xuXHQgICAgICBpZiAodGhpcy5kYikgby4kZGIgPSB0aGlzLmRiO1xuXHQgICAgICBvID0gT2JqZWN0LmFzc2lnbihvLCB0aGlzLmZpZWxkcyk7XG5cdCAgICAgIHJldHVybiBvO1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBAaWdub3JlXG5cdCAgICAgKi9cblxuXHQgIH1dLCBbe1xuXHQgICAga2V5OiBcImZyb21FeHRlbmRlZEpTT05cIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tRXh0ZW5kZWRKU09OKGRvYykge1xuXHQgICAgICB2YXIgY29weSA9IE9iamVjdC5hc3NpZ24oe30sIGRvYyk7XG5cdCAgICAgIFsnJHJlZicsICckaWQnLCAnJGRiJ10uZm9yRWFjaChmdW5jdGlvbiAoaykge1xuXHQgICAgICAgIHJldHVybiBkZWxldGUgY29weVtrXTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiBuZXcgREJSZWYoZG9jLiRyZWYsIGRvYy4kaWQsIGRvYy4kZGIsIGNvcHkpO1xuXHQgICAgfVxuXHQgIH1dKTtcblxuXHQgIHJldHVybiBEQlJlZjtcblx0fSgpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEQlJlZi5wcm90b3R5cGUsICdfYnNvbnR5cGUnLCB7XG5cdCAgdmFsdWU6ICdEQlJlZidcblx0fSk7IC8vIHRoZSAxLnggcGFyc2VyIHVzZWQgYSBcIm5hbWVzcGFjZVwiIHByb3BlcnR5LCB3aGlsZSA0LnggdXNlcyBcImNvbGxlY3Rpb25cIi4gVG8gZW5zdXJlIGJhY2t3YXJkc1xuXHQvLyBjb21wYXRpYmlsaXR5LCBsZXQncyBleHBvc2UgXCJuYW1lc3BhY2VcIlxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEQlJlZi5wcm90b3R5cGUsICduYW1lc3BhY2UnLCB7XG5cdCAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uO1xuXHQgIH0sXG5cdCAgc2V0OiBmdW5jdGlvbiBzZXQodmFsKSB7XG5cdCAgICB0aGlzLmNvbGxlY3Rpb24gPSB2YWw7XG5cdCAgfSxcblx0ICBjb25maWd1cmFibGU6IGZhbHNlXG5cdH0pO1xuXHR2YXIgZGJfcmVmID0gREJSZWY7XG5cblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrJGEoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJGEodGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5cdGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyRhKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkYShDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJGEoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cblx0dmFyIEJ1ZmZlciQzID0gYnVmZmVyLkJ1ZmZlcjtcblx0LyoqXG5cdCAqIEEgY2xhc3MgcmVwcmVzZW50YXRpb24gb2YgdGhlIEJTT04gQmluYXJ5IHR5cGUuXG5cdCAqL1xuXG5cdHZhciBCaW5hcnkgPVxuXHQvKiNfX1BVUkVfXyovXG5cdGZ1bmN0aW9uICgpIHtcblx0ICAvKipcblx0ICAgKiBDcmVhdGUgYSBCaW5hcnkgdHlwZVxuXHQgICAqXG5cdCAgICogU3ViIHR5cGVzXG5cdCAgICogIC0gKipCU09OLkJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVCoqLCBkZWZhdWx0IEJTT04gdHlwZS5cblx0ICAgKiAgLSAqKkJTT04uQlNPTl9CSU5BUllfU1VCVFlQRV9GVU5DVElPTioqLCBCU09OIGZ1bmN0aW9uIHR5cGUuXG5cdCAgICogIC0gKipCU09OLkJTT05fQklOQVJZX1NVQlRZUEVfQllURV9BUlJBWSoqLCBCU09OIGJ5dGUgYXJyYXkgdHlwZS5cblx0ICAgKiAgLSAqKkJTT04uQlNPTl9CSU5BUllfU1VCVFlQRV9VVUlEKiosIEJTT04gdXVpZCB0eXBlLlxuXHQgICAqICAtICoqQlNPTi5CU09OX0JJTkFSWV9TVUJUWVBFX01ENSoqLCBCU09OIG1kNSB0eXBlLlxuXHQgICAqICAtICoqQlNPTi5CU09OX0JJTkFSWV9TVUJUWVBFX1VTRVJfREVGSU5FRCoqLCBCU09OIHVzZXIgZGVmaW5lZCB0eXBlLlxuXHQgICAqXG5cdCAgICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciBhIGJ1ZmZlciBvYmplY3QgY29udGFpbmluZyB0aGUgYmluYXJ5IGRhdGEuXG5cdCAgICogQHBhcmFtIHtOdW1iZXJ9IFtzdWJUeXBlXSB0aGUgb3B0aW9uIGJpbmFyeSB0eXBlLlxuXHQgICAqIEByZXR1cm4ge0JpbmFyeX1cblx0ICAgKi9cblx0ICBmdW5jdGlvbiBCaW5hcnkoYnVmZmVyJCQxLCBzdWJUeXBlKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2skYSh0aGlzLCBCaW5hcnkpO1xuXG5cdCAgICBpZiAoYnVmZmVyJCQxICE9IG51bGwgJiYgISh0eXBlb2YgYnVmZmVyJCQxID09PSAnc3RyaW5nJykgJiYgIUJ1ZmZlciQzLmlzQnVmZmVyKGJ1ZmZlciQkMSkgJiYgIShidWZmZXIkJDEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSAmJiAhQXJyYXkuaXNBcnJheShidWZmZXIkJDEpKSB7XG5cdCAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29ubHkgU3RyaW5nLCBCdWZmZXIsIFVpbnQ4QXJyYXkgb3IgQXJyYXkgYWNjZXB0ZWQnKTtcblx0ICAgIH1cblxuXHQgICAgdGhpcy5zdWJfdHlwZSA9IHN1YlR5cGUgPT0gbnVsbCA/IEJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVCA6IHN1YlR5cGU7XG5cdCAgICB0aGlzLnBvc2l0aW9uID0gMDtcblxuXHQgICAgaWYgKGJ1ZmZlciQkMSAhPSBudWxsICYmICEoYnVmZmVyJCQxIGluc3RhbmNlb2YgTnVtYmVyKSkge1xuXHQgICAgICAvLyBPbmx5IGFjY2VwdCBCdWZmZXIsIFVpbnQ4QXJyYXkgb3IgQXJyYXlzXG5cdCAgICAgIGlmICh0eXBlb2YgYnVmZmVyJCQxID09PSAnc3RyaW5nJykge1xuXHQgICAgICAgIC8vIERpZmZlcmVudCB3YXlzIG9mIHdyaXRpbmcgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzXG5cdCAgICAgICAgaWYgKHR5cGVvZiBCdWZmZXIkMyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyJDMuZnJvbShidWZmZXIkJDEpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnIHx8IEFycmF5LmlzQXJyYXkoYnVmZmVyJCQxKSkge1xuXHQgICAgICAgICAgdGhpcy5idWZmZXIgPSB3cml0ZVN0cmluZ1RvQXJyYXkoYnVmZmVyJCQxKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb25seSBTdHJpbmcsIEJ1ZmZlciwgVWludDhBcnJheSBvciBBcnJheSBhY2NlcHRlZCcpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlciQkMTtcblx0ICAgICAgfVxuXG5cdCAgICAgIHRoaXMucG9zaXRpb24gPSBidWZmZXIkJDEubGVuZ3RoO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgaWYgKHR5cGVvZiBCdWZmZXIkMyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlciQzLmFsbG9jKEJpbmFyeS5CVUZGRVJfU0laRSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgVWludDhBcnJheShuZXcgQXJyYXlCdWZmZXIoQmluYXJ5LkJVRkZFUl9TSVpFKSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgQXJyYXkoQmluYXJ5LkJVRkZFUl9TSVpFKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0ICAvKipcblx0ICAgKiBVcGRhdGVzIHRoaXMgYmluYXJ5IHdpdGggYnl0ZV92YWx1ZS5cblx0ICAgKlxuXHQgICAqIEBtZXRob2Rcblx0ICAgKiBAcGFyYW0ge3N0cmluZ30gYnl0ZV92YWx1ZSBhIHNpbmdsZSBieXRlIHdlIHdpc2ggdG8gd3JpdGUuXG5cdCAgICovXG5cblxuXHQgIF9jcmVhdGVDbGFzcyRhKEJpbmFyeSwgW3tcblx0ICAgIGtleTogXCJwdXRcIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBwdXQoYnl0ZV92YWx1ZSkge1xuXHQgICAgICAvLyBJZiBpdCdzIGEgc3RyaW5nIGFuZCBhIGhhcyBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciB0aHJvdyBhbiBlcnJvclxuXHQgICAgICBpZiAoYnl0ZV92YWx1ZVsnbGVuZ3RoJ10gIT0gbnVsbCAmJiB0eXBlb2YgYnl0ZV92YWx1ZSAhPT0gJ251bWJlcicgJiYgYnl0ZV92YWx1ZS5sZW5ndGggIT09IDEpIHRocm93IG5ldyBUeXBlRXJyb3IoJ29ubHkgYWNjZXB0cyBzaW5nbGUgY2hhcmFjdGVyIFN0cmluZywgVWludDhBcnJheSBvciBBcnJheScpO1xuXHQgICAgICBpZiAodHlwZW9mIGJ5dGVfdmFsdWUgIT09ICdudW1iZXInICYmIGJ5dGVfdmFsdWUgPCAwIHx8IGJ5dGVfdmFsdWUgPiAyNTUpIHRocm93IG5ldyBUeXBlRXJyb3IoJ29ubHkgYWNjZXB0cyBudW1iZXIgaW4gYSB2YWxpZCB1bnNpZ25lZCBieXRlIHJhbmdlIDAtMjU1Jyk7IC8vIERlY29kZSB0aGUgYnl0ZSB2YWx1ZSBvbmNlXG5cblx0ICAgICAgdmFyIGRlY29kZWRfYnl0ZSA9IG51bGw7XG5cblx0ICAgICAgaWYgKHR5cGVvZiBieXRlX3ZhbHVlID09PSAnc3RyaW5nJykge1xuXHQgICAgICAgIGRlY29kZWRfYnl0ZSA9IGJ5dGVfdmFsdWUuY2hhckNvZGVBdCgwKTtcblx0ICAgICAgfSBlbHNlIGlmIChieXRlX3ZhbHVlWydsZW5ndGgnXSAhPSBudWxsKSB7XG5cdCAgICAgICAgZGVjb2RlZF9ieXRlID0gYnl0ZV92YWx1ZVswXTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBkZWNvZGVkX2J5dGUgPSBieXRlX3ZhbHVlO1xuXHQgICAgICB9XG5cblx0ICAgICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA+IHRoaXMucG9zaXRpb24pIHtcblx0ICAgICAgICB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uKytdID0gZGVjb2RlZF9ieXRlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGlmICh0eXBlb2YgQnVmZmVyJDMgIT09ICd1bmRlZmluZWQnICYmIEJ1ZmZlciQzLmlzQnVmZmVyKHRoaXMuYnVmZmVyKSkge1xuXHQgICAgICAgICAgLy8gQ3JlYXRlIGFkZGl0aW9uYWwgb3ZlcmZsb3cgYnVmZmVyXG5cdCAgICAgICAgICB2YXIgYnVmZmVyJCQxID0gQnVmZmVyJDMuYWxsb2MoQmluYXJ5LkJVRkZFUl9TSVpFICsgdGhpcy5idWZmZXIubGVuZ3RoKTsgLy8gQ29tYmluZSB0aGUgdHdvIGJ1ZmZlcnMgdG9nZXRoZXJcblxuXHQgICAgICAgICAgdGhpcy5idWZmZXIuY29weShidWZmZXIkJDEsIDAsIDAsIHRoaXMuYnVmZmVyLmxlbmd0aCk7XG5cdCAgICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlciQkMTtcblx0ICAgICAgICAgIHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb24rK10gPSBkZWNvZGVkX2J5dGU7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHZhciBfYnVmZmVyID0gbnVsbDsgLy8gQ3JlYXRlIGEgbmV3IGJ1ZmZlciAodHlwZWQgb3Igbm9ybWFsIGFycmF5KVxuXG5cdCAgICAgICAgICBpZiAoaXNVaW50OEFycmF5KHRoaXMuYnVmZmVyKSkge1xuXHQgICAgICAgICAgICBfYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkobmV3IEFycmF5QnVmZmVyKEJpbmFyeS5CVUZGRVJfU0laRSArIHRoaXMuYnVmZmVyLmxlbmd0aCkpO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgX2J1ZmZlciA9IG5ldyBBcnJheShCaW5hcnkuQlVGRkVSX1NJWkUgKyB0aGlzLmJ1ZmZlci5sZW5ndGgpO1xuXHQgICAgICAgICAgfSAvLyBXZSBuZWVkIHRvIGNvcHkgYWxsIHRoZSBjb250ZW50IHRvIHRoZSBuZXcgYXJyYXlcblxuXG5cdCAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYnVmZmVyLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIF9idWZmZXJbaV0gPSB0aGlzLmJ1ZmZlcltpXTtcblx0ICAgICAgICAgIH0gLy8gUmVhc3NpZ24gdGhlIGJ1ZmZlclxuXG5cblx0ICAgICAgICAgIHRoaXMuYnVmZmVyID0gX2J1ZmZlcjsgLy8gV3JpdGUgdGhlIGJ5dGVcblxuXHQgICAgICAgICAgdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXSA9IGRlY29kZWRfYnl0ZTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogV3JpdGVzIGEgYnVmZmVyIG9yIHN0cmluZyB0byB0aGUgYmluYXJ5LlxuXHQgICAgICpcblx0ICAgICAqIEBtZXRob2Rcblx0ICAgICAqIEBwYXJhbSB7KEJ1ZmZlcnxzdHJpbmcpfSBzdHJpbmcgYSBzdHJpbmcgb3IgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIEJpbmFyeSBCU09OIG9iamVjdC5cblx0ICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgc3BlY2lmeSB0aGUgYmluYXJ5IG9mIHdoZXJlIHRvIHdyaXRlIHRoZSBjb250ZW50LlxuXHQgICAgICogQHJldHVybiB7bnVsbH1cblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcIndyaXRlXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gd3JpdGUoc3RyaW5nLCBvZmZzZXQpIHtcblx0ICAgICAgb2Zmc2V0ID0gdHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicgPyBvZmZzZXQgOiB0aGlzLnBvc2l0aW9uOyAvLyBJZiB0aGUgYnVmZmVyIGlzIHRvIHNtYWxsIGxldCdzIGV4dGVuZCB0aGUgYnVmZmVyXG5cblx0ICAgICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA8IG9mZnNldCArIHN0cmluZy5sZW5ndGgpIHtcblx0ICAgICAgICB2YXIgYnVmZmVyJCQxID0gbnVsbDsgLy8gSWYgd2UgYXJlIGluIG5vZGUuanNcblxuXHQgICAgICAgIGlmICh0eXBlb2YgQnVmZmVyJDMgIT09ICd1bmRlZmluZWQnICYmIEJ1ZmZlciQzLmlzQnVmZmVyKHRoaXMuYnVmZmVyKSkge1xuXHQgICAgICAgICAgYnVmZmVyJCQxID0gQnVmZmVyJDMuYWxsb2ModGhpcy5idWZmZXIubGVuZ3RoICsgc3RyaW5nLmxlbmd0aCk7XG5cdCAgICAgICAgICB0aGlzLmJ1ZmZlci5jb3B5KGJ1ZmZlciQkMSwgMCwgMCwgdGhpcy5idWZmZXIubGVuZ3RoKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGlzVWludDhBcnJheSh0aGlzLmJ1ZmZlcikpIHtcblx0ICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBidWZmZXJcblx0ICAgICAgICAgIGJ1ZmZlciQkMSA9IG5ldyBVaW50OEFycmF5KG5ldyBBcnJheUJ1ZmZlcih0aGlzLmJ1ZmZlci5sZW5ndGggKyBzdHJpbmcubGVuZ3RoKSk7IC8vIENvcHkgdGhlIGNvbnRlbnRcblxuXHQgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBvc2l0aW9uOyBpKyspIHtcblx0ICAgICAgICAgICAgYnVmZmVyJCQxW2ldID0gdGhpcy5idWZmZXJbaV07XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSAvLyBBc3NpZ24gdGhlIG5ldyBidWZmZXJcblxuXG5cdCAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXIkJDE7XG5cdCAgICAgIH1cblxuXHQgICAgICBpZiAodHlwZW9mIEJ1ZmZlciQzICE9PSAndW5kZWZpbmVkJyAmJiBCdWZmZXIkMy5pc0J1ZmZlcihzdHJpbmcpICYmIEJ1ZmZlciQzLmlzQnVmZmVyKHRoaXMuYnVmZmVyKSkge1xuXHQgICAgICAgIHN0cmluZy5jb3B5KHRoaXMuYnVmZmVyLCBvZmZzZXQsIDAsIHN0cmluZy5sZW5ndGgpO1xuXHQgICAgICAgIHRoaXMucG9zaXRpb24gPSBvZmZzZXQgKyBzdHJpbmcubGVuZ3RoID4gdGhpcy5wb3NpdGlvbiA/IG9mZnNldCArIHN0cmluZy5sZW5ndGggOiB0aGlzLnBvc2l0aW9uOyAvLyBvZmZzZXQgPSBzdHJpbmcubGVuZ3RoXG5cdCAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEJ1ZmZlciQzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJyAmJiBCdWZmZXIkMy5pc0J1ZmZlcih0aGlzLmJ1ZmZlcikpIHtcblx0ICAgICAgICB0aGlzLmJ1ZmZlci53cml0ZShzdHJpbmcsIG9mZnNldCwgJ2JpbmFyeScpO1xuXHQgICAgICAgIHRoaXMucG9zaXRpb24gPSBvZmZzZXQgKyBzdHJpbmcubGVuZ3RoID4gdGhpcy5wb3NpdGlvbiA/IG9mZnNldCArIHN0cmluZy5sZW5ndGggOiB0aGlzLnBvc2l0aW9uOyAvLyBvZmZzZXQgPSBzdHJpbmcubGVuZ3RoO1xuXHQgICAgICB9IGVsc2UgaWYgKGlzVWludDhBcnJheShzdHJpbmcpIHx8IEFycmF5LmlzQXJyYXkoc3RyaW5nKSAmJiB0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHQgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBzdHJpbmcubGVuZ3RoOyBfaSsrKSB7XG5cdCAgICAgICAgICB0aGlzLmJ1ZmZlcltvZmZzZXQrK10gPSBzdHJpbmdbX2ldO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHRoaXMucG9zaXRpb24gPSBvZmZzZXQgPiB0aGlzLnBvc2l0aW9uID8gb2Zmc2V0IDogdGhpcy5wb3NpdGlvbjtcblx0ICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykge1xuXHQgICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHN0cmluZy5sZW5ndGg7IF9pMisrKSB7XG5cdCAgICAgICAgICB0aGlzLmJ1ZmZlcltvZmZzZXQrK10gPSBzdHJpbmcuY2hhckNvZGVBdChfaTIpO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHRoaXMucG9zaXRpb24gPSBvZmZzZXQgPiB0aGlzLnBvc2l0aW9uID8gb2Zmc2V0IDogdGhpcy5wb3NpdGlvbjtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBSZWFkcyAqKmxlbmd0aCoqIGJ5dGVzIHN0YXJ0aW5nIGF0ICoqcG9zaXRpb24qKi5cblx0ICAgICAqXG5cdCAgICAgKiBAbWV0aG9kXG5cdCAgICAgKiBAcGFyYW0ge251bWJlcn0gcG9zaXRpb24gcmVhZCBmcm9tIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgQmluYXJ5LlxuXHQgICAgICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuXG5cdCAgICAgKiBAcmV0dXJuIHtCdWZmZXJ9XG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJyZWFkXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcmVhZChwb3NpdGlvbiwgbGVuZ3RoKSB7XG5cdCAgICAgIGxlbmd0aCA9IGxlbmd0aCAmJiBsZW5ndGggPiAwID8gbGVuZ3RoIDogdGhpcy5wb3NpdGlvbjsgLy8gTGV0J3MgcmV0dXJuIHRoZSBkYXRhIGJhc2VkIG9uIHRoZSB0eXBlIHdlIGhhdmVcblxuXHQgICAgICBpZiAodGhpcy5idWZmZXJbJ3NsaWNlJ10pIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIuc2xpY2UocG9zaXRpb24sIHBvc2l0aW9uICsgbGVuZ3RoKTtcblx0ICAgICAgfSAvLyBDcmVhdGUgYSBidWZmZXIgdG8ga2VlcCB0aGUgcmVzdWx0XG5cblxuXHQgICAgICB2YXIgYnVmZmVyJCQxID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gbmV3IFVpbnQ4QXJyYXkobmV3IEFycmF5QnVmZmVyKGxlbmd0aCkpIDogbmV3IEFycmF5KGxlbmd0aCk7XG5cblx0ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuXHQgICAgICAgIGJ1ZmZlciQkMVtpXSA9IHRoaXMuYnVmZmVyW3Bvc2l0aW9uKytdO1xuXHQgICAgICB9IC8vIFJldHVybiB0aGUgYnVmZmVyXG5cblxuXHQgICAgICByZXR1cm4gYnVmZmVyJCQxO1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdCAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGJpbmFyeSBhcyBhIHN0cmluZy5cblx0ICAgICAqXG5cdCAgICAgKiBAbWV0aG9kXG5cdCAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAgICAgKi9cblxuXHQgIH0sIHtcblx0ICAgIGtleTogXCJ2YWx1ZVwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKGFzUmF3KSB7XG5cdCAgICAgIGFzUmF3ID0gYXNSYXcgPT0gbnVsbCA/IGZhbHNlIDogYXNSYXc7IC8vIE9wdGltaXplIHRvIHNlcmlhbGl6ZSBmb3IgdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGUgZGF0YSA9PSBzaXplIG9mIGJ1ZmZlclxuXG5cdCAgICAgIGlmIChhc1JhdyAmJiB0eXBlb2YgQnVmZmVyJDMgIT09ICd1bmRlZmluZWQnICYmIEJ1ZmZlciQzLmlzQnVmZmVyKHRoaXMuYnVmZmVyKSAmJiB0aGlzLmJ1ZmZlci5sZW5ndGggPT09IHRoaXMucG9zaXRpb24pIHJldHVybiB0aGlzLmJ1ZmZlcjsgLy8gSWYgaXQncyBhIG5vZGUuanMgYnVmZmVyIG9iamVjdFxuXG5cdCAgICAgIGlmICh0eXBlb2YgQnVmZmVyJDMgIT09ICd1bmRlZmluZWQnICYmIEJ1ZmZlciQzLmlzQnVmZmVyKHRoaXMuYnVmZmVyKSkge1xuXHQgICAgICAgIHJldHVybiBhc1JhdyA/IHRoaXMuYnVmZmVyLnNsaWNlKDAsIHRoaXMucG9zaXRpb24pIDogdGhpcy5idWZmZXIudG9TdHJpbmcoJ2JpbmFyeScsIDAsIHRoaXMucG9zaXRpb24pO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGlmIChhc1Jhdykge1xuXHQgICAgICAgICAgLy8gd2Ugc3VwcG9ydCB0aGUgc2xpY2UgY29tbWFuZCB1c2UgaXRcblx0ICAgICAgICAgIGlmICh0aGlzLmJ1ZmZlclsnc2xpY2UnXSAhPSBudWxsKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zbGljZSgwLCB0aGlzLnBvc2l0aW9uKTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBidWZmZXIgdG8gY29weSBjb250ZW50IHRvXG5cdCAgICAgICAgICAgIHZhciBuZXdCdWZmZXIgPSBpc1VpbnQ4QXJyYXkodGhpcy5idWZmZXIpID8gbmV3IFVpbnQ4QXJyYXkobmV3IEFycmF5QnVmZmVyKHRoaXMucG9zaXRpb24pKSA6IG5ldyBBcnJheSh0aGlzLnBvc2l0aW9uKTsgLy8gQ29weSBjb250ZW50XG5cblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBvc2l0aW9uOyBpKyspIHtcblx0ICAgICAgICAgICAgICBuZXdCdWZmZXJbaV0gPSB0aGlzLmJ1ZmZlcltpXTtcblx0ICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGJ1ZmZlclxuXG5cblx0ICAgICAgICAgICAgcmV0dXJuIG5ld0J1ZmZlcjtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgcmV0dXJuIGNvbnZlcnRBcnJheXRvVXRmOEJpbmFyeVN0cmluZyh0aGlzLmJ1ZmZlciwgMCwgdGhpcy5wb3NpdGlvbik7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIExlbmd0aC5cblx0ICAgICAqXG5cdCAgICAgKiBAbWV0aG9kXG5cdCAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBsZW5ndGggb2YgdGhlIGJpbmFyeS5cblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcImxlbmd0aFwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGxlbmd0aCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb247XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInRvSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyICE9IG51bGwgPyB0aGlzLmJ1ZmZlci50b1N0cmluZygnYmFzZTY0JykgOiAnJztcblx0ICAgIH1cblx0ICAgIC8qKlxuXHQgICAgICogQGlnbm9yZVxuXHQgICAgICovXG5cblx0ICB9LCB7XG5cdCAgICBrZXk6IFwidG9TdHJpbmdcIixcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZyhmb3JtYXQpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyICE9IG51bGwgPyB0aGlzLmJ1ZmZlci5zbGljZSgwLCB0aGlzLnBvc2l0aW9uKS50b1N0cmluZyhmb3JtYXQpIDogJyc7XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfSwge1xuXHQgICAga2V5OiBcInRvRXh0ZW5kZWRKU09OXCIsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdG9FeHRlbmRlZEpTT04oKSB7XG5cdCAgICAgIHZhciBiYXNlNjRTdHJpbmcgPSBCdWZmZXIkMy5pc0J1ZmZlcih0aGlzLmJ1ZmZlcikgPyB0aGlzLmJ1ZmZlci50b1N0cmluZygnYmFzZTY0JykgOiBCdWZmZXIkMy5mcm9tKHRoaXMuYnVmZmVyKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cdCAgICAgIHZhciBzdWJUeXBlID0gTnVtYmVyKHRoaXMuc3ViX3R5cGUpLnRvU3RyaW5nKDE2KTtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAkYmluYXJ5OiB7XG5cdCAgICAgICAgICBiYXNlNjQ6IGJhc2U2NFN0cmluZyxcblx0ICAgICAgICAgIHN1YlR5cGU6IHN1YlR5cGUubGVuZ3RoID09PSAxID8gJzAnICsgc3ViVHlwZSA6IHN1YlR5cGVcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICAvKipcblx0ICAgICAqIEBpZ25vcmVcblx0ICAgICAqL1xuXG5cdCAgfV0sIFt7XG5cdCAgICBrZXk6IFwiZnJvbUV4dGVuZGVkSlNPTlwiLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21FeHRlbmRlZEpTT04oZG9jKSB7XG5cdCAgICAgIHZhciB0eXBlID0gZG9jLiRiaW5hcnkuc3ViVHlwZSA/IHBhcnNlSW50KGRvYy4kYmluYXJ5LnN1YlR5cGUsIDE2KSA6IDA7XG5cdCAgICAgIHZhciBkYXRhID0gQnVmZmVyJDMuZnJvbShkb2MuJGJpbmFyeS5iYXNlNjQsICdiYXNlNjQnKTtcblx0ICAgICAgcmV0dXJuIG5ldyBCaW5hcnkoZGF0YSwgdHlwZSk7XG5cdCAgICB9XG5cdCAgfV0pO1xuXG5cdCAgcmV0dXJuIEJpbmFyeTtcblx0fSgpO1xuXHQvKipcblx0ICogQmluYXJ5IGRlZmF1bHQgc3VidHlwZVxuXHQgKiBAaWdub3JlXG5cdCAqL1xuXG5cblx0dmFyIEJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVCA9IDA7XG5cblx0ZnVuY3Rpb24gaXNVaW50OEFycmF5KG9iaikge1xuXHQgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgVWludDhBcnJheV0nO1xuXHR9XG5cdC8qKlxuXHQgKiBAaWdub3JlXG5cdCAqL1xuXG5cblx0ZnVuY3Rpb24gd3JpdGVTdHJpbmdUb0FycmF5KGRhdGEpIHtcblx0ICAvLyBDcmVhdGUgYSBidWZmZXJcblx0ICB2YXIgYnVmZmVyJCQxID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gbmV3IFVpbnQ4QXJyYXkobmV3IEFycmF5QnVmZmVyKGRhdGEubGVuZ3RoKSkgOiBuZXcgQXJyYXkoZGF0YS5sZW5ndGgpOyAvLyBXcml0ZSB0aGUgY29udGVudCB0byB0aGUgYnVmZmVyXG5cblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcblx0ICAgIGJ1ZmZlciQkMVtpXSA9IGRhdGEuY2hhckNvZGVBdChpKTtcblx0ICB9IC8vIFdyaXRlIHRoZSBzdHJpbmcgdG8gdGhlIGJ1ZmZlclxuXG5cblx0ICByZXR1cm4gYnVmZmVyJCQxO1xuXHR9XG5cdC8qKlxuXHQgKiBDb252ZXJ0IEFycmF5IG90IFVpbnQ4QXJyYXkgdG8gQmluYXJ5IFN0cmluZ1xuXHQgKlxuXHQgKiBAaWdub3JlXG5cdCAqL1xuXG5cblx0ZnVuY3Rpb24gY29udmVydEFycmF5dG9VdGY4QmluYXJ5U3RyaW5nKGJ5dGVBcnJheSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHtcblx0ICB2YXIgcmVzdWx0ID0gJyc7XG5cblx0ICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyBpKyspIHtcblx0ICAgIHJlc3VsdCA9IHJlc3VsdCArIFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZUFycmF5W2ldKTtcblx0ICB9XG5cblx0ICByZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0QmluYXJ5LkJVRkZFUl9TSVpFID0gMjU2O1xuXHQvKipcblx0ICogRGVmYXVsdCBCU09OIHR5cGVcblx0ICpcblx0ICogQGNsYXNzY29uc3RhbnQgU1VCVFlQRV9ERUZBVUxUXG5cdCAqKi9cblxuXHRCaW5hcnkuU1VCVFlQRV9ERUZBVUxUID0gMDtcblx0LyoqXG5cdCAqIEZ1bmN0aW9uIEJTT04gdHlwZVxuXHQgKlxuXHQgKiBAY2xhc3Njb25zdGFudCBTVUJUWVBFX0RFRkFVTFRcblx0ICoqL1xuXG5cdEJpbmFyeS5TVUJUWVBFX0ZVTkNUSU9OID0gMTtcblx0LyoqXG5cdCAqIEJ5dGUgQXJyYXkgQlNPTiB0eXBlXG5cdCAqXG5cdCAqIEBjbGFzc2NvbnN0YW50IFNVQlRZUEVfREVGQVVMVFxuXHQgKiovXG5cblx0QmluYXJ5LlNVQlRZUEVfQllURV9BUlJBWSA9IDI7XG5cdC8qKlxuXHQgKiBPTEQgVVVJRCBCU09OIHR5cGVcblx0ICpcblx0ICogQGNsYXNzY29uc3RhbnQgU1VCVFlQRV9ERUZBVUxUXG5cdCAqKi9cblxuXHRCaW5hcnkuU1VCVFlQRV9VVUlEX09MRCA9IDM7XG5cdC8qKlxuXHQgKiBVVUlEIEJTT04gdHlwZVxuXHQgKlxuXHQgKiBAY2xhc3Njb25zdGFudCBTVUJUWVBFX0RFRkFVTFRcblx0ICoqL1xuXG5cdEJpbmFyeS5TVUJUWVBFX1VVSUQgPSA0O1xuXHQvKipcblx0ICogTUQ1IEJTT04gdHlwZVxuXHQgKlxuXHQgKiBAY2xhc3Njb25zdGFudCBTVUJUWVBFX0RFRkFVTFRcblx0ICoqL1xuXG5cdEJpbmFyeS5TVUJUWVBFX01ENSA9IDU7XG5cdC8qKlxuXHQgKiBVc2VyIEJTT04gdHlwZVxuXHQgKlxuXHQgKiBAY2xhc3Njb25zdGFudCBTVUJUWVBFX0RFRkFVTFRcblx0ICoqL1xuXG5cdEJpbmFyeS5TVUJUWVBFX1VTRVJfREVGSU5FRCA9IDEyODtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KEJpbmFyeS5wcm90b3R5cGUsICdfYnNvbnR5cGUnLCB7XG5cdCAgdmFsdWU6ICdCaW5hcnknXG5cdH0pO1xuXHR2YXIgYmluYXJ5ID0gQmluYXJ5O1xuXG5cdHZhciBjb25zdGFudHMgPSB7XG5cdCAgLy8gQlNPTiBNQVggVkFMVUVTXG5cdCAgQlNPTl9JTlQzMl9NQVg6IDB4N2ZmZmZmZmYsXG5cdCAgQlNPTl9JTlQzMl9NSU46IC0weDgwMDAwMDAwLFxuXHQgIEJTT05fSU5UNjRfTUFYOiBNYXRoLnBvdygyLCA2MykgLSAxLFxuXHQgIEJTT05fSU5UNjRfTUlOOiAtTWF0aC5wb3coMiwgNjMpLFxuXHQgIC8vIEpTIE1BWCBQUkVDSVNFIFZBTFVFU1xuXHQgIEpTX0lOVF9NQVg6IDB4MjAwMDAwMDAwMDAwMDAsXG5cdCAgLy8gQW55IGludGVnZXIgdXAgdG8gMl41MyBjYW4gYmUgcHJlY2lzZWx5IHJlcHJlc2VudGVkIGJ5IGEgZG91YmxlLlxuXHQgIEpTX0lOVF9NSU46IC0weDIwMDAwMDAwMDAwMDAwLFxuXHQgIC8vIEFueSBpbnRlZ2VyIGRvd24gdG8gLTJeNTMgY2FuIGJlIHByZWNpc2VseSByZXByZXNlbnRlZCBieSBhIGRvdWJsZS5cblxuXHQgIC8qKlxuXHQgICAqIE51bWJlciBCU09OIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fREFUQV9OVU1CRVJcblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX05VTUJFUjogMSxcblxuXHQgIC8qKlxuXHQgICAqIFN0cmluZyBCU09OIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fREFUQV9TVFJJTkdcblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX1NUUklORzogMixcblxuXHQgIC8qKlxuXHQgICAqIE9iamVjdCBCU09OIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fREFUQV9PQkpFQ1Rcblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX09CSkVDVDogMyxcblxuXHQgIC8qKlxuXHQgICAqIEFycmF5IEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX0FSUkFZXG5cdCAgICoqL1xuXHQgIEJTT05fREFUQV9BUlJBWTogNCxcblxuXHQgIC8qKlxuXHQgICAqIEJpbmFyeSBCU09OIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fREFUQV9CSU5BUllcblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX0JJTkFSWTogNSxcblxuXHQgIC8qKlxuXHQgICAqIEJpbmFyeSBCU09OIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fREFUQV9VTkRFRklORURcblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX1VOREVGSU5FRDogNixcblxuXHQgIC8qKlxuXHQgICAqIE9iamVjdElkIEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX09JRFxuXHQgICAqKi9cblx0ICBCU09OX0RBVEFfT0lEOiA3LFxuXG5cdCAgLyoqXG5cdCAgICogQm9vbGVhbiBCU09OIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fREFUQV9CT09MRUFOXG5cdCAgICoqL1xuXHQgIEJTT05fREFUQV9CT09MRUFOOiA4LFxuXG5cdCAgLyoqXG5cdCAgICogRGF0ZSBCU09OIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fREFUQV9EQVRFXG5cdCAgICoqL1xuXHQgIEJTT05fREFUQV9EQVRFOiA5LFxuXG5cdCAgLyoqXG5cdCAgICogbnVsbCBCU09OIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fREFUQV9OVUxMXG5cdCAgICoqL1xuXHQgIEJTT05fREFUQV9OVUxMOiAxMCxcblxuXHQgIC8qKlxuXHQgICAqIFJlZ0V4cCBCU09OIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fREFUQV9SRUdFWFBcblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX1JFR0VYUDogMTEsXG5cblx0ICAvKipcblx0ICAgKiBDb2RlIEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX0RCUE9JTlRFUlxuXHQgICAqKi9cblx0ICBCU09OX0RBVEFfREJQT0lOVEVSOiAxMixcblxuXHQgIC8qKlxuXHQgICAqIENvZGUgQlNPTiBUeXBlXG5cdCAgICpcblx0ICAgKiBAY2xhc3Njb25zdGFudCBCU09OX0RBVEFfQ09ERVxuXHQgICAqKi9cblx0ICBCU09OX0RBVEFfQ09ERTogMTMsXG5cblx0ICAvKipcblx0ICAgKiBTeW1ib2wgQlNPTiBUeXBlXG5cdCAgICpcblx0ICAgKiBAY2xhc3Njb25zdGFudCBCU09OX0RBVEFfU1lNQk9MXG5cdCAgICoqL1xuXHQgIEJTT05fREFUQV9TWU1CT0w6IDE0LFxuXG5cdCAgLyoqXG5cdCAgICogQ29kZSB3aXRoIFNjb3BlIEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX0NPREVfV19TQ09QRVxuXHQgICAqKi9cblx0ICBCU09OX0RBVEFfQ09ERV9XX1NDT1BFOiAxNSxcblxuXHQgIC8qKlxuXHQgICAqIDMyIGJpdCBJbnRlZ2VyIEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX0lOVFxuXHQgICAqKi9cblx0ICBCU09OX0RBVEFfSU5UOiAxNixcblxuXHQgIC8qKlxuXHQgICAqIFRpbWVzdGFtcCBCU09OIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fREFUQV9USU1FU1RBTVBcblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX1RJTUVTVEFNUDogMTcsXG5cblx0ICAvKipcblx0ICAgKiBMb25nIEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX0xPTkdcblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX0xPTkc6IDE4LFxuXG5cdCAgLyoqXG5cdCAgICogTG9uZyBCU09OIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fREFUQV9ERUNJTUFMMTI4XG5cdCAgICoqL1xuXHQgIEJTT05fREFUQV9ERUNJTUFMMTI4OiAxOSxcblxuXHQgIC8qKlxuXHQgICAqIE1pbktleSBCU09OIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fREFUQV9NSU5fS0VZXG5cdCAgICoqL1xuXHQgIEJTT05fREFUQV9NSU5fS0VZOiAweGZmLFxuXG5cdCAgLyoqXG5cdCAgICogTWF4S2V5IEJTT04gVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9EQVRBX01BWF9LRVlcblx0ICAgKiovXG5cdCAgQlNPTl9EQVRBX01BWF9LRVk6IDB4N2YsXG5cblx0ICAvKipcblx0ICAgKiBCaW5hcnkgRGVmYXVsdCBUeXBlXG5cdCAgICpcblx0ICAgKiBAY2xhc3Njb25zdGFudCBCU09OX0JJTkFSWV9TVUJUWVBFX0RFRkFVTFRcblx0ICAgKiovXG5cdCAgQlNPTl9CSU5BUllfU1VCVFlQRV9ERUZBVUxUOiAwLFxuXG5cdCAgLyoqXG5cdCAgICogQmluYXJ5IEZ1bmN0aW9uIFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fQklOQVJZX1NVQlRZUEVfRlVOQ1RJT05cblx0ICAgKiovXG5cdCAgQlNPTl9CSU5BUllfU1VCVFlQRV9GVU5DVElPTjogMSxcblxuXHQgIC8qKlxuXHQgICAqIEJpbmFyeSBCeXRlIEFycmF5IFR5cGVcblx0ICAgKlxuXHQgICAqIEBjbGFzc2NvbnN0YW50IEJTT05fQklOQVJZX1NVQlRZUEVfQllURV9BUlJBWVxuXHQgICAqKi9cblx0ICBCU09OX0JJTkFSWV9TVUJUWVBFX0JZVEVfQVJSQVk6IDIsXG5cblx0ICAvKipcblx0ICAgKiBCaW5hcnkgVVVJRCBUeXBlXG5cdCAgICpcblx0ICAgKiBAY2xhc3Njb25zdGFudCBCU09OX0JJTkFSWV9TVUJUWVBFX1VVSURcblx0ICAgKiovXG5cdCAgQlNPTl9CSU5BUllfU1VCVFlQRV9VVUlEOiAzLFxuXG5cdCAgLyoqXG5cdCAgICogQmluYXJ5IE1ENSBUeXBlXG5cdCAgICpcblx0ICAgKiBAY2xhc3Njb25zdGFudCBCU09OX0JJTkFSWV9TVUJUWVBFX01ENVxuXHQgICAqKi9cblx0ICBCU09OX0JJTkFSWV9TVUJUWVBFX01ENTogNCxcblxuXHQgIC8qKlxuXHQgICAqIEJpbmFyeSBVc2VyIERlZmluZWQgVHlwZVxuXHQgICAqXG5cdCAgICogQGNsYXNzY29uc3RhbnQgQlNPTl9CSU5BUllfU1VCVFlQRV9VU0VSX0RFRklORURcblx0ICAgKiovXG5cdCAgQlNPTl9CSU5BUllfU1VCVFlQRV9VU0VSX0RFRklORUQ6IDEyOFxuXHR9O1xuXG5cdGZ1bmN0aW9uIF90eXBlb2YkMihvYmopIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YkMiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mJDIgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZiQyKG9iaik7IH1cblx0Ly8gY29uc3QgTWFwID0gcmVxdWlyZSgnLi9tYXAnKTtcblxuXHQvKipcblx0ICogQG5hbWVzcGFjZSBFSlNPTlxuXHQgKi9cblx0Ly8gYWxsIHRoZSB0eXBlcyB3aGVyZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueSBzcGVjaWFsIHByb2Nlc3NpbmcgYW5kIGNhbiBqdXN0IHBhc3MgdGhlIEVKU09OXG5cdC8vc3RyYWlnaHQgdG8gdHlwZS5mcm9tRXh0ZW5kZWRKU09OXG5cblxuXHR2YXIga2V5c1RvQ29kZWNzID0ge1xuXHQgICRvaWQ6IG9iamVjdGlkLFxuXHQgICRiaW5hcnk6IGJpbmFyeSxcblx0ICAkc3ltYm9sOiBzeW1ib2wsXG5cdCAgJG51bWJlckludDogaW50XzMyLFxuXHQgICRudW1iZXJEZWNpbWFsOiBkZWNpbWFsMTI4LFxuXHQgICRudW1iZXJEb3VibGU6IGRvdWJsZV8xLFxuXHQgICRudW1iZXJMb25nOiBsb25nXzEsXG5cdCAgJG1pbktleTogbWluX2tleSxcblx0ICAkbWF4S2V5OiBtYXhfa2V5LFxuXHQgICRyZWd1bGFyRXhwcmVzc2lvbjogcmVnZXhwLFxuXHQgICR0aW1lc3RhbXA6IHRpbWVzdGFtcFxuXHR9O1xuXG5cdGZ1bmN0aW9uIGRlc2VyaWFsaXplVmFsdWUoc2VsZiwga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuXHQgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG5cdCAgICBpZiAob3B0aW9ucy5yZWxheGVkKSB7XG5cdCAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgIH0gLy8gaWYgaXQncyBhbiBpbnRlZ2VyLCBzaG91bGQgaW50ZXJwcmV0IGFzIHNtYWxsZXN0IEJTT04gaW50ZWdlclxuXHQgICAgLy8gdGhhdCBjYW4gcmVwcmVzZW50IGl0IGV4YWN0bHkuIChpZiBvdXQgb2YgcmFuZ2UsIGludGVycHJldCBhcyBkb3VibGUuKVxuXG5cblx0ICAgIGlmIChNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWUpIHtcblx0ICAgICAgaWYgKHZhbHVlID49IEJTT05fSU5UMzJfTUlOICYmIHZhbHVlIDw9IEJTT05fSU5UMzJfTUFYKSByZXR1cm4gbmV3IGludF8zMih2YWx1ZSk7XG5cdCAgICAgIGlmICh2YWx1ZSA+PSBCU09OX0lOVDY0X01JTiAmJiB2YWx1ZSA8PSBCU09OX0lOVDY0X01BWCkgcmV0dXJuIG5ldyBsb25nXzEuZnJvbU51bWJlcih2YWx1ZSk7XG5cdCAgICB9IC8vIElmIHRoZSBudW1iZXIgaXMgYSBub24taW50ZWdlciBvciBvdXQgb2YgaW50ZWdlciByYW5nZSwgc2hvdWxkIGludGVycHJldCBhcyBCU09OIERvdWJsZS5cblxuXG5cdCAgICByZXR1cm4gbmV3IGRvdWJsZV8xKHZhbHVlKTtcblx0ICB9IC8vIGZyb20gaGVyZSBvbiBvdXQgd2UncmUgbG9va2luZyBmb3IgYnNvbiB0eXBlcywgc28gYmFpbCBpZiBpdHMgbm90IGFuIG9iamVjdFxuXG5cblx0ICBpZiAodmFsdWUgPT0gbnVsbCB8fCBfdHlwZW9mJDIodmFsdWUpICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlOyAvLyB1cGdyYWRlIGRlcHJlY2F0ZWQgdW5kZWZpbmVkIHRvIG51bGxcblxuXHQgIGlmICh2YWx1ZS4kdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcblx0ICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKS5maWx0ZXIoZnVuY3Rpb24gKGspIHtcblx0ICAgIHJldHVybiBrLnN0YXJ0c1dpdGgoJyQnKSAmJiB2YWx1ZVtrXSAhPSBudWxsO1xuXHQgIH0pO1xuXG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICB2YXIgYyA9IGtleXNUb0NvZGVjc1trZXlzW2ldXTtcblx0ICAgIGlmIChjKSByZXR1cm4gYy5mcm9tRXh0ZW5kZWRKU09OKHZhbHVlLCBvcHRpb25zKTtcblx0ICB9XG5cblx0ICBpZiAodmFsdWUuJGRhdGUgIT0gbnVsbCkge1xuXHQgICAgdmFyIGQgPSB2YWx1ZS4kZGF0ZTtcblx0ICAgIHZhciBkYXRlID0gbmV3IERhdGUoKTtcblx0ICAgIGlmICh0eXBlb2YgZCA9PT0gJ3N0cmluZycpIGRhdGUuc2V0VGltZShEYXRlLnBhcnNlKGQpKTtlbHNlIGlmIChsb25nXzEuaXNMb25nKGQpKSBkYXRlLnNldFRpbWUoZC50b051bWJlcigpKTtlbHNlIGlmICh0eXBlb2YgZCA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5yZWxheGVkKSBkYXRlLnNldFRpbWUoZCk7XG5cdCAgICByZXR1cm4gZGF0ZTtcblx0ICB9XG5cblx0ICBpZiAodmFsdWUuJGNvZGUgIT0gbnVsbCkge1xuXHQgICAgdmFyIGNvcHkgPSBPYmplY3QuYXNzaWduKHt9LCB2YWx1ZSk7XG5cblx0ICAgIGlmICh2YWx1ZS4kc2NvcGUpIHtcblx0ICAgICAgY29weS4kc2NvcGUgPSBkZXNlcmlhbGl6ZVZhbHVlKHNlbGYsIG51bGwsIHZhbHVlLiRzY29wZSk7XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiBjb2RlLmZyb21FeHRlbmRlZEpTT04odmFsdWUpO1xuXHQgIH1cblxuXHQgIGlmICh2YWx1ZS4kcmVmICE9IG51bGwgfHwgdmFsdWUuJGRiUG9pbnRlciAhPSBudWxsKSB7XG5cdCAgICB2YXIgdiA9IHZhbHVlLiRyZWYgPyB2YWx1ZSA6IHZhbHVlLiRkYlBvaW50ZXI7IC8vIHdlIHJ1biBpbnRvIHRoaXMgaW4gYSBcImRlZ2VuZXJhdGUgRUpTT05cIiBjYXNlICh3aXRoICRpZCBhbmQgJHJlZiBvcmRlciBmbGlwcGVkKVxuXHQgICAgLy8gYmVjYXVzZSBvZiB0aGUgb3JkZXIgSlNPTi5wYXJzZSBnb2VzIHRocm91Z2ggdGhlIGRvY3VtZW50XG5cblx0ICAgIGlmICh2IGluc3RhbmNlb2YgZGJfcmVmKSByZXR1cm4gdjtcblx0ICAgIHZhciBkb2xsYXJLZXlzID0gT2JqZWN0LmtleXModikuZmlsdGVyKGZ1bmN0aW9uIChrKSB7XG5cdCAgICAgIHJldHVybiBrLnN0YXJ0c1dpdGgoJyQnKTtcblx0ICAgIH0pO1xuXHQgICAgdmFyIHZhbGlkID0gdHJ1ZTtcblx0ICAgIGRvbGxhcktleXMuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuXHQgICAgICBpZiAoWyckcmVmJywgJyRpZCcsICckZGInXS5pbmRleE9mKGspID09PSAtMSkgdmFsaWQgPSBmYWxzZTtcblx0ICAgIH0pOyAvLyBvbmx5IG1ha2UgREJSZWYgaWYgJCBrZXlzIGFyZSBhbGwgdmFsaWRcblxuXHQgICAgaWYgKHZhbGlkKSByZXR1cm4gZGJfcmVmLmZyb21FeHRlbmRlZEpTT04odik7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHZhbHVlO1xuXHR9XG5cdC8qKlxuXHQgKiBQYXJzZSBhbiBFeHRlbmRlZCBKU09OIHN0cmluZywgY29uc3RydWN0aW5nIHRoZSBKYXZhU2NyaXB0IHZhbHVlIG9yIG9iamVjdCBkZXNjcmliZWQgYnkgdGhhdFxuXHQgKiBzdHJpbmcuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBFSlNPTlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIE9wdGlvbmFsIHNldHRpbmdzXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmVsYXhlZD10cnVlXSBBdHRlbXB0IHRvIHJldHVybiBuYXRpdmUgSlMgdHlwZXMgd2hlcmUgcG9zc2libGUsIHJhdGhlciB0aGFuIEJTT04gdHlwZXMgKGlmIHRydWUpXG5cdCAqIEByZXR1cm4ge29iamVjdH1cblx0ICpcblx0ICogQGV4YW1wbGVcblx0ICogY29uc3QgeyBFSlNPTiB9ID0gcmVxdWlyZSgnYnNvbicpO1xuXHQgKiBjb25zdCB0ZXh0ID0gJ3sgXCJpbnQzMlwiOiB7IFwiJG51bWJlckludFwiOiBcIjEwXCIgfSB9Jztcblx0ICpcblx0ICogLy8gcHJpbnRzIHsgaW50MzI6IHsgW1N0cmluZzogJzEwJ10gX2Jzb250eXBlOiAnSW50MzInLCB2YWx1ZTogJzEwJyB9IH1cblx0ICogY29uc29sZS5sb2coRUpTT04ucGFyc2UodGV4dCwgeyByZWxheGVkOiBmYWxzZSB9KSk7XG5cdCAqXG5cdCAqIC8vIHByaW50cyB7IGludDMyOiAxMCB9XG5cdCAqIGNvbnNvbGUubG9nKEVKU09OLnBhcnNlKHRleHQpKTtcblx0ICovXG5cblxuXHRmdW5jdGlvbiBwYXJzZSh0ZXh0LCBvcHRpb25zKSB7XG5cdCAgdmFyIF90aGlzID0gdGhpcztcblxuXHQgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB7XG5cdCAgICByZWxheGVkOiB0cnVlXG5cdCAgfSwgb3B0aW9ucyk7IC8vIHJlbGF4ZWQgaW1wbGllcyBub3Qgc3RyaWN0XG5cblx0ICBpZiAodHlwZW9mIG9wdGlvbnMucmVsYXhlZCA9PT0gJ2Jvb2xlYW4nKSBvcHRpb25zLnN0cmljdCA9ICFvcHRpb25zLnJlbGF4ZWQ7XG5cdCAgaWYgKHR5cGVvZiBvcHRpb25zLnN0cmljdCA9PT0gJ2Jvb2xlYW4nKSBvcHRpb25zLnJlbGF4ZWQgPSAhb3B0aW9ucy5zdHJpY3Q7XG5cdCAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0ICAgIHJldHVybiBkZXNlcmlhbGl6ZVZhbHVlKF90aGlzLCBrZXksIHZhbHVlLCBvcHRpb25zKTtcblx0ICB9KTtcblx0fSAvL1xuXHQvLyBTZXJpYWxpemVyXG5cdC8vXG5cdC8vIE1BWCBJTlQzMiBib3VuZGFyaWVzXG5cblxuXHR2YXIgQlNPTl9JTlQzMl9NQVggPSAweDdmZmZmZmZmLFxuXHQgICAgQlNPTl9JTlQzMl9NSU4gPSAtMHg4MDAwMDAwMCxcblx0ICAgIEJTT05fSU5UNjRfTUFYID0gMHg3ZmZmZmZmZmZmZmZmZmZmLFxuXHQgICAgQlNPTl9JTlQ2NF9NSU4gPSAtMHg4MDAwMDAwMDAwMDAwMDAwO1xuXHQvKipcblx0ICogQ29udmVydHMgYSBCU09OIGRvY3VtZW50IHRvIGFuIEV4dGVuZGVkIEpTT04gc3RyaW5nLCBvcHRpb25hbGx5IHJlcGxhY2luZyB2YWx1ZXMgaWYgYSByZXBsYWNlclxuXHQgKiBmdW5jdGlvbiBpcyBzcGVjaWZpZWQgb3Igb3B0aW9uYWxseSBpbmNsdWRpbmcgb25seSB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMgaWYgYSByZXBsYWNlciBhcnJheVxuXHQgKiBpcyBzcGVjaWZpZWQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBFSlNPTlxuXHQgKiBAcGFyYW0ge29iamVjdH0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gZXh0ZW5kZWQgSlNPTlxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9ufGFycmF5fSBbcmVwbGFjZXJdIEEgZnVuY3Rpb24gdGhhdCBhbHRlcnMgdGhlIGJlaGF2aW9yIG9mIHRoZSBzdHJpbmdpZmljYXRpb24gcHJvY2Vzcywgb3IgYW4gYXJyYXkgb2YgU3RyaW5nIGFuZCBOdW1iZXIgb2JqZWN0cyB0aGF0IHNlcnZlIGFzIGEgd2hpdGVsaXN0IGZvciBzZWxlY3RpbmcvZmlsdGVyaW5nIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB2YWx1ZSBvYmplY3QgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIEpTT04gc3RyaW5nLiBJZiB0aGlzIHZhbHVlIGlzIG51bGwgb3Igbm90IHByb3ZpZGVkLCBhbGwgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IGFyZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIEpTT04gc3RyaW5nXG5cdCAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW3NwYWNlXSBBIFN0cmluZyBvciBOdW1iZXIgb2JqZWN0IHRoYXQncyB1c2VkIHRvIGluc2VydCB3aGl0ZSBzcGFjZSBpbnRvIHRoZSBvdXRwdXQgSlNPTiBzdHJpbmcgZm9yIHJlYWRhYmlsaXR5IHB1cnBvc2VzLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIE9wdGlvbmFsIHNldHRpbmdzXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmVsYXhlZD10cnVlXSBFbmFibGVkIEV4dGVuZGVkIEpTT04ncyBgcmVsYXhlZGAgbW9kZVxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBjb25zdCB7IEVKU09OIH0gPSByZXF1aXJlKCdic29uJyk7XG5cdCAqIGNvbnN0IEludDMyID0gcmVxdWlyZSgnbW9uZ29kYicpLkludDMyO1xuXHQgKiBjb25zdCBkb2MgPSB7IGludDMyOiBuZXcgSW50MzIoMTApIH07XG5cdCAqXG5cdCAqIC8vIHByaW50cyAne1wiaW50MzJcIjp7XCIkbnVtYmVySW50XCI6XCIxMFwifX0nXG5cdCAqIGNvbnNvbGUubG9nKEVKU09OLnN0cmluZ2lmeShkb2MsIHsgcmVsYXhlZDogZmFsc2UgfSkpO1xuXHQgKlxuXHQgKiAvLyBwcmludHMgJ3tcImludDMyXCI6MTB9J1xuXHQgKiBjb25zb2xlLmxvZyhFSlNPTi5zdHJpbmdpZnkoZG9jKSk7XG5cdCAqL1xuXG5cdGZ1bmN0aW9uIHN0cmluZ2lmeSh2YWx1ZSwgcmVwbGFjZXIsIHNwYWNlLCBvcHRpb25zKSB7XG5cdCAgaWYgKHNwYWNlICE9IG51bGwgJiYgX3R5cGVvZiQyKHNwYWNlKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgIG9wdGlvbnMgPSBzcGFjZTtcblx0ICAgIHNwYWNlID0gMDtcblx0ICB9XG5cblx0ICBpZiAocmVwbGFjZXIgIT0gbnVsbCAmJiBfdHlwZW9mJDIocmVwbGFjZXIpID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyZXBsYWNlcikpIHtcblx0ICAgIG9wdGlvbnMgPSByZXBsYWNlcjtcblx0ICAgIHJlcGxhY2VyID0gbnVsbDtcblx0ICAgIHNwYWNlID0gMDtcblx0ICB9XG5cblx0ICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwge1xuXHQgICAgcmVsYXhlZDogdHJ1ZVxuXHQgIH0sIG9wdGlvbnMpO1xuXHQgIHZhciBkb2MgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHNlcmlhbGl6ZUFycmF5KHZhbHVlLCBvcHRpb25zKSA6IHNlcmlhbGl6ZURvY3VtZW50KHZhbHVlLCBvcHRpb25zKTtcblx0ICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZG9jLCByZXBsYWNlciwgc3BhY2UpO1xuXHR9XG5cdC8qKlxuXHQgKiBTZXJpYWxpemVzIGFuIG9iamVjdCB0byBhbiBFeHRlbmRlZCBKU09OIHN0cmluZywgYW5kIHJlcGFyc2UgaXQgYXMgYSBKYXZhU2NyaXB0IG9iamVjdC5cblx0ICpcblx0ICogQG1lbWJlcm9mIEVKU09OXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBic29uIFRoZSBvYmplY3QgdG8gc2VyaWFsaXplXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gT3B0aW9uYWwgc2V0dGluZ3MgcGFzc2VkIHRvIHRoZSBgc3RyaW5naWZ5YCBmdW5jdGlvblxuXHQgKiBAcmV0dXJuIHtvYmplY3R9XG5cdCAqL1xuXG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplKGJzb24sIG9wdGlvbnMpIHtcblx0ICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0ICByZXR1cm4gSlNPTi5wYXJzZShzdHJpbmdpZnkoYnNvbiwgb3B0aW9ucykpO1xuXHR9XG5cdC8qKlxuXHQgKiBEZXNlcmlhbGl6ZXMgYW4gRXh0ZW5kZWQgSlNPTiBvYmplY3QgaW50byBhIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0IHdpdGggbmF0aXZlL0JTT04gdHlwZXNcblx0ICpcblx0ICogQG1lbWJlcm9mIEVKU09OXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBlanNvbiBUaGUgRXh0ZW5kZWQgSlNPTiBvYmplY3QgdG8gZGVzZXJpYWxpemVcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBPcHRpb25hbCBzZXR0aW5ncyBwYXNzZWQgdG8gdGhlIHBhcnNlIG1ldGhvZFxuXHQgKiBAcmV0dXJuIHtvYmplY3R9XG5cdCAqL1xuXG5cblx0ZnVuY3Rpb24gZGVzZXJpYWxpemUoZWpzb24sIG9wdGlvbnMpIHtcblx0ICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0ICByZXR1cm4gcGFyc2UoSlNPTi5zdHJpbmdpZnkoZWpzb24pLCBvcHRpb25zKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZUFycmF5KGFycmF5LCBvcHRpb25zKSB7XG5cdCAgcmV0dXJuIGFycmF5Lm1hcChmdW5jdGlvbiAodikge1xuXHQgICAgcmV0dXJuIHNlcmlhbGl6ZVZhbHVlKHYsIG9wdGlvbnMpO1xuXHQgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0SVNPU3RyaW5nKGRhdGUpIHtcblx0ICB2YXIgaXNvU3RyID0gZGF0ZS50b0lTT1N0cmluZygpOyAvLyB3ZSBzaG91bGQgb25seSBzaG93IG1pbGxpc2Vjb25kcyBpbiB0aW1lc3RhbXAgaWYgdGhleSdyZSBub24temVyb1xuXG5cdCAgcmV0dXJuIGRhdGUuZ2V0VVRDTWlsbGlzZWNvbmRzKCkgIT09IDAgPyBpc29TdHIgOiBpc29TdHIuc2xpY2UoMCwgLTUpICsgJ1onO1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplVmFsdWUodmFsdWUsIG9wdGlvbnMpIHtcblx0ICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBzZXJpYWxpemVBcnJheSh2YWx1ZSwgb3B0aW9ucyk7XG5cdCAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuXG5cdCAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuXHQgICAgdmFyIGRhdGVOdW0gPSB2YWx1ZS5nZXRUaW1lKCksXG5cdCAgICAgICAgLy8gaXMgaXQgaW4geWVhciByYW5nZSAxOTcwLTk5OTk/XG5cdCAgICBpblJhbmdlID0gZGF0ZU51bSA+IC0xICYmIGRhdGVOdW0gPCAyNTM0MDIzMTg4MDAwMDA7XG5cdCAgICByZXR1cm4gb3B0aW9ucy5yZWxheGVkICYmIGluUmFuZ2UgPyB7XG5cdCAgICAgICRkYXRlOiBnZXRJU09TdHJpbmcodmFsdWUpXG5cdCAgICB9IDoge1xuXHQgICAgICAkZGF0ZToge1xuXHQgICAgICAgICRudW1iZXJMb25nOiB2YWx1ZS5nZXRUaW1lKCkudG9TdHJpbmcoKVxuXHQgICAgICB9XG5cdCAgICB9O1xuXHQgIH1cblxuXHQgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmICFvcHRpb25zLnJlbGF4ZWQpIHtcblx0ICAgIC8vIGl0J3MgYW4gaW50ZWdlclxuXHQgICAgaWYgKE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZSkge1xuXHQgICAgICB2YXIgaW50MzJSYW5nZSA9IHZhbHVlID49IEJTT05fSU5UMzJfTUlOICYmIHZhbHVlIDw9IEJTT05fSU5UMzJfTUFYLFxuXHQgICAgICAgICAgaW50NjRSYW5nZSA9IHZhbHVlID49IEJTT05fSU5UNjRfTUlOICYmIHZhbHVlIDw9IEJTT05fSU5UNjRfTUFYOyAvLyBpbnRlcnByZXQgYXMgYmVpbmcgb2YgdGhlIHNtYWxsZXN0IEJTT04gaW50ZWdlciB0eXBlIHRoYXQgY2FuIHJlcHJlc2VudCB0aGUgbnVtYmVyIGV4YWN0bHlcblxuXHQgICAgICBpZiAoaW50MzJSYW5nZSkgcmV0dXJuIHtcblx0ICAgICAgICAkbnVtYmVySW50OiB2YWx1ZS50b1N0cmluZygpXG5cdCAgICAgIH07XG5cdCAgICAgIGlmIChpbnQ2NFJhbmdlKSByZXR1cm4ge1xuXHQgICAgICAgICRudW1iZXJMb25nOiB2YWx1ZS50b1N0cmluZygpXG5cdCAgICAgIH07XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiB7XG5cdCAgICAgICRudW1iZXJEb3VibGU6IHZhbHVlLnRvU3RyaW5nKClcblx0ICAgIH07XG5cdCAgfVxuXG5cdCAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG5cdCAgICB2YXIgZmxhZ3MgPSB2YWx1ZS5mbGFncztcblxuXHQgICAgaWYgKGZsYWdzID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgZmxhZ3MgPSB2YWx1ZS50b1N0cmluZygpLm1hdGNoKC9bZ2ltdXldKiQvKVswXTtcblx0ICAgIH1cblxuXHQgICAgdmFyIHJ4ID0gbmV3IHJlZ2V4cCh2YWx1ZS5zb3VyY2UsIGZsYWdzKTtcblx0ICAgIHJldHVybiByeC50b0V4dGVuZGVkSlNPTigpO1xuXHQgIH1cblxuXHQgIGlmICh2YWx1ZSAhPSBudWxsICYmIF90eXBlb2YkMih2YWx1ZSkgPT09ICdvYmplY3QnKSByZXR1cm4gc2VyaWFsaXplRG9jdW1lbnQodmFsdWUsIG9wdGlvbnMpO1xuXHQgIHJldHVybiB2YWx1ZTtcblx0fVxuXG5cdHZhciBCU09OX1RZUEVfTUFQUElOR1MgPSB7XG5cdCAgQmluYXJ5OiBmdW5jdGlvbiBCaW5hcnkobykge1xuXHQgICAgcmV0dXJuIG5ldyBiaW5hcnkoby52YWx1ZSgpLCBvLnN1YnR5cGUpO1xuXHQgIH0sXG5cdCAgQ29kZTogZnVuY3Rpb24gQ29kZShvKSB7XG5cdCAgICByZXR1cm4gbmV3IGNvZGUoby5jb2RlLCBvLnNjb3BlKTtcblx0ICB9LFxuXHQgIERCUmVmOiBmdW5jdGlvbiBEQlJlZihvKSB7XG5cdCAgICByZXR1cm4gbmV3IGRiX3JlZihvLmNvbGxlY3Rpb24gfHwgby5uYW1lc3BhY2UsIG8ub2lkLCBvLmRiLCBvLmZpZWxkcyk7XG5cdCAgfSxcblx0ICAvLyBcIm5hbWVzcGFjZVwiIGZvciAxLnggbGlicmFyeSBiYWNrd2FyZHMgY29tcGF0XG5cdCAgRGVjaW1hbDEyODogZnVuY3Rpb24gRGVjaW1hbDEyOChvKSB7XG5cdCAgICByZXR1cm4gbmV3IGRlY2ltYWwxMjgoby5ieXRlcyk7XG5cdCAgfSxcblx0ICBEb3VibGU6IGZ1bmN0aW9uIERvdWJsZShvKSB7XG5cdCAgICByZXR1cm4gbmV3IGRvdWJsZV8xKG8udmFsdWUpO1xuXHQgIH0sXG5cdCAgSW50MzI6IGZ1bmN0aW9uIEludDMyKG8pIHtcblx0ICAgIHJldHVybiBuZXcgaW50XzMyKG8udmFsdWUpO1xuXHQgIH0sXG5cdCAgTG9uZzogZnVuY3Rpb24gTG9uZyhvKSB7XG5cdCAgICByZXR1cm4gbG9uZ18xLmZyb21CaXRzKCAvLyB1bmRlcnNjb3JlIHZhcmlhbnRzIGZvciAxLnggYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0ICAgIG8ubG93ICE9IG51bGwgPyBvLmxvdyA6IG8ubG93Xywgby5sb3cgIT0gbnVsbCA/IG8uaGlnaCA6IG8uaGlnaF8sIG8ubG93ICE9IG51bGwgPyBvLnVuc2lnbmVkIDogby51bnNpZ25lZF8pO1xuXHQgIH0sXG5cdCAgTWF4S2V5OiBmdW5jdGlvbiBNYXhLZXkoKSB7XG5cdCAgICByZXR1cm4gbmV3IG1heF9rZXkoKTtcblx0ICB9LFxuXHQgIE1pbktleTogZnVuY3Rpb24gTWluS2V5KCkge1xuXHQgICAgcmV0dXJuIG5ldyBtaW5fa2V5KCk7XG5cdCAgfSxcblx0ICBPYmplY3RJRDogZnVuY3Rpb24gT2JqZWN0SUQobykge1xuXHQgICAgcmV0dXJuIG5ldyBvYmplY3RpZChvKTtcblx0ICB9LFxuXHQgIE9iamVjdElkOiBmdW5jdGlvbiBPYmplY3RJZChvKSB7XG5cdCAgICByZXR1cm4gbmV3IG9iamVjdGlkKG8pO1xuXHQgIH0sXG5cdCAgLy8gc3VwcG9ydCA0LjAuMC80LjAuMSBiZWZvcmUgX2Jzb250eXBlIHdhcyByZXZlcnRlZCBiYWNrIHRvIE9iamVjdElEXG5cdCAgQlNPTlJlZ0V4cDogZnVuY3Rpb24gQlNPTlJlZ0V4cChvKSB7XG5cdCAgICByZXR1cm4gbmV3IHJlZ2V4cChvLnBhdHRlcm4sIG8ub3B0aW9ucyk7XG5cdCAgfSxcblx0ICBTeW1ib2w6IGZ1bmN0aW9uIFN5bWJvbChvKSB7XG5cdCAgICByZXR1cm4gbmV3IHN5bWJvbChvLnZhbHVlKTtcblx0ICB9LFxuXHQgIFRpbWVzdGFtcDogZnVuY3Rpb24gVGltZXN0YW1wKG8pIHtcblx0ICAgIHJldHVybiB0aW1lc3RhbXAuZnJvbUJpdHMoby5sb3csIG8uaGlnaCk7XG5cdCAgfVxuXHR9O1xuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZURvY3VtZW50KGRvYywgb3B0aW9ucykge1xuXHQgIGlmIChkb2MgPT0gbnVsbCB8fCBfdHlwZW9mJDIoZG9jKSAhPT0gJ29iamVjdCcpIHRocm93IG5ldyBFcnJvcignbm90IGFuIG9iamVjdCBpbnN0YW5jZScpO1xuXHQgIHZhciBic29udHlwZSA9IGRvYy5fYnNvbnR5cGU7XG5cblx0ICBpZiAodHlwZW9mIGJzb250eXBlID09PSAndW5kZWZpbmVkJykge1xuXHQgICAgLy8gSXQncyBhIHJlZ3VsYXIgb2JqZWN0LiBSZWN1cnNpdmVseSBzZXJpYWxpemUgaXRzIHByb3BlcnR5IHZhbHVlcy5cblx0ICAgIHZhciBfZG9jID0ge307XG5cblx0ICAgIGZvciAodmFyIG5hbWUgaW4gZG9jKSB7XG5cdCAgICAgIF9kb2NbbmFtZV0gPSBzZXJpYWxpemVWYWx1ZShkb2NbbmFtZV0sIG9wdGlvbnMpO1xuXHQgICAgfVxuXG5cdCAgICByZXR1cm4gX2RvYztcblx0ICB9IGVsc2UgaWYgKHR5cGVvZiBic29udHlwZSA9PT0gJ3N0cmluZycpIHtcblx0ICAgIC8vIHRoZSBcImRvY3VtZW50XCIgaXMgcmVhbGx5IGp1c3QgYSBCU09OIHR5cGUgb2JqZWN0XG5cdCAgICB2YXIgX2RvYzIgPSBkb2M7XG5cblx0ICAgIGlmICh0eXBlb2YgX2RvYzIudG9FeHRlbmRlZEpTT04gIT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgLy8gVGhlcmUncyBubyBFSlNPTiBzZXJpYWxpemF0aW9uIGZ1bmN0aW9uIG9uIHRoZSBvYmplY3QuIEl0J3MgcHJvYmFibHkgYW5cblx0ICAgICAgLy8gb2JqZWN0IGNyZWF0ZWQgYnkgYSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMgbGlicmFyeSAob3IgYW5vdGhlciBsaWJyYXJ5KVxuXHQgICAgICAvLyB0aGF0J3MgZHVjay10eXBpbmcgb2JqZWN0cyB0byBsb29rIGxpa2UgdGhleSB3ZXJlIGdlbmVyYXRlZCBieSB0aGlzIGxpYnJhcnkpLlxuXHQgICAgICAvLyBDb3B5IHRoZSBvYmplY3QgaW50byB0aGlzIGxpYnJhcnkncyB2ZXJzaW9uIG9mIHRoYXQgdHlwZS5cblx0ICAgICAgdmFyIG1hcHBlciA9IEJTT05fVFlQRV9NQVBQSU5HU1tic29udHlwZV07XG5cblx0ICAgICAgaWYgKCFtYXBwZXIpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbnJlY29nbml6ZWQgb3IgaW52YWxpZCBfYnNvbnR5cGU6ICcgKyBic29udHlwZSk7XG5cdCAgICAgIH1cblxuXHQgICAgICBfZG9jMiA9IG1hcHBlcihfZG9jMik7XG5cdCAgICB9IC8vIFR3byBCU09OIHR5cGVzIG1heSBoYXZlIG5lc3RlZCBvYmplY3RzIHRoYXQgbWF5IG5lZWQgdG8gYmUgc2VyaWFsaXplZCB0b29cblxuXG5cdCAgICBpZiAoYnNvbnR5cGUgPT09ICdDb2RlJyAmJiBfZG9jMi5zY29wZSkge1xuXHQgICAgICBfZG9jMiA9IG5ldyBjb2RlKF9kb2MyLmNvZGUsIHNlcmlhbGl6ZVZhbHVlKF9kb2MyLnNjb3BlLCBvcHRpb25zKSk7XG5cdCAgICB9IGVsc2UgaWYgKGJzb250eXBlID09PSAnREJSZWYnICYmIF9kb2MyLm9pZCkge1xuXHQgICAgICBfZG9jMiA9IG5ldyBkYl9yZWYoX2RvYzIuY29sbGVjdGlvbiwgc2VyaWFsaXplVmFsdWUoX2RvYzIub2lkLCBvcHRpb25zKSwgX2RvYzIuZGIsIF9kb2MyLmZpZWxkcyk7XG5cdCAgICB9XG5cblx0ICAgIHJldHVybiBfZG9jMi50b0V4dGVuZGVkSlNPTihvcHRpb25zKTtcblx0ICB9IGVsc2Uge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdfYnNvbnR5cGUgbXVzdCBiZSBhIHN0cmluZywgYnV0IHdhczogJyArIF90eXBlb2YkMihic29udHlwZSkpO1xuXHQgIH1cblx0fVxuXG5cdHZhciBleHRlbmRlZF9qc29uID0ge1xuXHQgIHBhcnNlOiBwYXJzZSxcblx0ICBkZXNlcmlhbGl6ZTogZGVzZXJpYWxpemUsXG5cdCAgc2VyaWFsaXplOiBzZXJpYWxpemUsXG5cdCAgc3RyaW5naWZ5OiBzdHJpbmdpZnlcblx0fTtcblxuXHR2YXIgRklSU1RfQklUID0gMHg4MDtcblx0dmFyIEZJUlNUX1RXT19CSVRTID0gMHhjMDtcblx0dmFyIEZJUlNUX1RIUkVFX0JJVFMgPSAweGUwO1xuXHR2YXIgRklSU1RfRk9VUl9CSVRTID0gMHhmMDtcblx0dmFyIEZJUlNUX0ZJVkVfQklUUyA9IDB4Zjg7XG5cdHZhciBUV09fQklUX0NIQVIgPSAweGMwO1xuXHR2YXIgVEhSRUVfQklUX0NIQVIgPSAweGUwO1xuXHR2YXIgRk9VUl9CSVRfQ0hBUiA9IDB4ZjA7XG5cdHZhciBDT05USU5VSU5HX0NIQVIgPSAweDgwO1xuXHQvKipcblx0ICogRGV0ZXJtaW5lcyBpZiB0aGUgcGFzc2VkIGluIGJ5dGVzIGFyZSB2YWxpZCB1dGY4XG5cdCAqIEBwYXJhbSB7QnVmZmVyfFVpbnQ4QXJyYXl9IGJ5dGVzIEFuIGFycmF5IG9mIDgtYml0IGJ5dGVzLiBNdXN0IGJlIGluZGV4YWJsZSBhbmQgaGF2ZSBsZW5ndGggcHJvcGVydHlcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0IFRoZSBpbmRleCB0byBzdGFydCB2YWxpZGF0aW5nXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBlbmQgVGhlIGluZGV4IHRvIGVuZCB2YWxpZGF0aW5nXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbGlkIHV0Zjhcblx0ICovXG5cblx0ZnVuY3Rpb24gdmFsaWRhdGVVdGY4KGJ5dGVzLCBzdGFydCwgZW5kKSB7XG5cdCAgdmFyIGNvbnRpbnVhdGlvbiA9IDA7XG5cblx0ICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMSkge1xuXHQgICAgdmFyIGJ5dGUgPSBieXRlc1tpXTtcblxuXHQgICAgaWYgKGNvbnRpbnVhdGlvbikge1xuXHQgICAgICBpZiAoKGJ5dGUgJiBGSVJTVF9UV09fQklUUykgIT09IENPTlRJTlVJTkdfQ0hBUikge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXG5cdCAgICAgIGNvbnRpbnVhdGlvbiAtPSAxO1xuXHQgICAgfSBlbHNlIGlmIChieXRlICYgRklSU1RfQklUKSB7XG5cdCAgICAgIGlmICgoYnl0ZSAmIEZJUlNUX1RIUkVFX0JJVFMpID09PSBUV09fQklUX0NIQVIpIHtcblx0ICAgICAgICBjb250aW51YXRpb24gPSAxO1xuXHQgICAgICB9IGVsc2UgaWYgKChieXRlICYgRklSU1RfRk9VUl9CSVRTKSA9PT0gVEhSRUVfQklUX0NIQVIpIHtcblx0ICAgICAgICBjb250aW51YXRpb24gPSAyO1xuXHQgICAgICB9IGVsc2UgaWYgKChieXRlICYgRklSU1RfRklWRV9CSVRTKSA9PT0gRk9VUl9CSVRfQ0hBUikge1xuXHQgICAgICAgIGNvbnRpbnVhdGlvbiA9IDM7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgcmV0dXJuICFjb250aW51YXRpb247XG5cdH1cblxuXHR2YXIgdmFsaWRhdGVVdGY4XzEgPSB2YWxpZGF0ZVV0Zjg7XG5cdHZhciB2YWxpZGF0ZV91dGY4ID0ge1xuXHQgIHZhbGlkYXRlVXRmODogdmFsaWRhdGVVdGY4XzFcblx0fTtcblxuXHR2YXIgQnVmZmVyJDQgPSBidWZmZXIuQnVmZmVyO1xuXHR2YXIgdmFsaWRhdGVVdGY4JDEgPSB2YWxpZGF0ZV91dGY4LnZhbGlkYXRlVXRmODsgLy8gSW50ZXJuYWwgbG9uZyB2ZXJzaW9uc1xuXG5cdHZhciBKU19JTlRfTUFYX0xPTkcgPSBsb25nXzEuZnJvbU51bWJlcihjb25zdGFudHMuSlNfSU5UX01BWCk7XG5cdHZhciBKU19JTlRfTUlOX0xPTkcgPSBsb25nXzEuZnJvbU51bWJlcihjb25zdGFudHMuSlNfSU5UX01JTik7XG5cdHZhciBmdW5jdGlvbkNhY2hlID0ge307XG5cblx0ZnVuY3Rpb24gZGVzZXJpYWxpemUkMShidWZmZXIkJDEsIG9wdGlvbnMsIGlzQXJyYXkpIHtcblx0ICBvcHRpb25zID0gb3B0aW9ucyA9PSBudWxsID8ge30gOiBvcHRpb25zO1xuXHQgIHZhciBpbmRleCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5pbmRleCA/IG9wdGlvbnMuaW5kZXggOiAwOyAvLyBSZWFkIHRoZSBkb2N1bWVudCBzaXplXG5cblx0ICB2YXIgc2l6ZSA9IGJ1ZmZlciQkMVtpbmRleF0gfCBidWZmZXIkJDFbaW5kZXggKyAxXSA8PCA4IHwgYnVmZmVyJCQxW2luZGV4ICsgMl0gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXggKyAzXSA8PCAyNDtcblxuXHQgIGlmIChzaXplIDwgNSkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKFwiYnNvbiBzaXplIG11c3QgYmUgPj0gNSwgaXMgXCIuY29uY2F0KHNpemUpKTtcblx0ICB9XG5cblx0ICBpZiAob3B0aW9ucy5hbGxvd09iamVjdFNtYWxsZXJUaGFuQnVmZmVyU2l6ZSAmJiBidWZmZXIkJDEubGVuZ3RoIDwgc2l6ZSkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKFwiYnVmZmVyIGxlbmd0aCBcIi5jb25jYXQoYnVmZmVyJCQxLmxlbmd0aCwgXCIgbXVzdCBiZSA+PSBic29uIHNpemUgXCIpLmNvbmNhdChzaXplKSk7XG5cdCAgfVxuXG5cdCAgaWYgKCFvcHRpb25zLmFsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplICYmIGJ1ZmZlciQkMS5sZW5ndGggIT09IHNpemUpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcihcImJ1ZmZlciBsZW5ndGggXCIuY29uY2F0KGJ1ZmZlciQkMS5sZW5ndGgsIFwiIG11c3QgPT09IGJzb24gc2l6ZSBcIikuY29uY2F0KHNpemUpKTtcblx0ICB9XG5cblx0ICBpZiAoc2l6ZSArIGluZGV4ID4gYnVmZmVyJCQxLmxlbmd0aCkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKFwiKGJzb24gc2l6ZSBcIi5jb25jYXQoc2l6ZSwgXCIgKyBvcHRpb25zLmluZGV4IFwiKS5jb25jYXQoaW5kZXgsIFwiIG11c3QgYmUgPD0gYnVmZmVyIGxlbmd0aCBcIikuY29uY2F0KEJ1ZmZlciQ0LmJ5dGVMZW5ndGgoYnVmZmVyJCQxKSwgXCIpXCIpKTtcblx0ICB9IC8vIElsbGVnYWwgZW5kIHZhbHVlXG5cblxuXHQgIGlmIChidWZmZXIkJDFbaW5kZXggKyBzaXplIC0gMV0gIT09IDApIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcihcIk9uZSBvYmplY3QsIHNpemVkIGNvcnJlY3RseSwgd2l0aCBhIHNwb3QgZm9yIGFuIEVPTywgYnV0IHRoZSBFT08gaXNuJ3QgMHgwMFwiKTtcblx0ICB9IC8vIFN0YXJ0IGRlc2VyaWFsaXp0aW9uXG5cblxuXHQgIHJldHVybiBkZXNlcmlhbGl6ZU9iamVjdChidWZmZXIkJDEsIGluZGV4LCBvcHRpb25zLCBpc0FycmF5KTtcblx0fVxuXG5cdGZ1bmN0aW9uIGRlc2VyaWFsaXplT2JqZWN0KGJ1ZmZlciQkMSwgaW5kZXgsIG9wdGlvbnMsIGlzQXJyYXkpIHtcblx0ICB2YXIgZXZhbEZ1bmN0aW9ucyA9IG9wdGlvbnNbJ2V2YWxGdW5jdGlvbnMnXSA9PSBudWxsID8gZmFsc2UgOiBvcHRpb25zWydldmFsRnVuY3Rpb25zJ107XG5cdCAgdmFyIGNhY2hlRnVuY3Rpb25zID0gb3B0aW9uc1snY2FjaGVGdW5jdGlvbnMnXSA9PSBudWxsID8gZmFsc2UgOiBvcHRpb25zWydjYWNoZUZ1bmN0aW9ucyddO1xuXHQgIHZhciBjYWNoZUZ1bmN0aW9uc0NyYzMyID0gb3B0aW9uc1snY2FjaGVGdW5jdGlvbnNDcmMzMiddID09IG51bGwgPyBmYWxzZSA6IG9wdGlvbnNbJ2NhY2hlRnVuY3Rpb25zQ3JjMzInXTtcblx0ICBpZiAoIWNhY2hlRnVuY3Rpb25zQ3JjMzIpIHZhciBjcmMzMiA9IG51bGw7XG5cdCAgdmFyIGZpZWxkc0FzUmF3ID0gb3B0aW9uc1snZmllbGRzQXNSYXcnXSA9PSBudWxsID8gbnVsbCA6IG9wdGlvbnNbJ2ZpZWxkc0FzUmF3J107IC8vIFJldHVybiByYXcgYnNvbiBidWZmZXIgaW5zdGVhZCBvZiBwYXJzaW5nIGl0XG5cblx0ICB2YXIgcmF3ID0gb3B0aW9uc1sncmF3J10gPT0gbnVsbCA/IGZhbHNlIDogb3B0aW9uc1sncmF3J107IC8vIFJldHVybiBCU09OUmVnRXhwIG9iamVjdHMgaW5zdGVhZCBvZiBuYXRpdmUgcmVndWxhciBleHByZXNzaW9uc1xuXG5cdCAgdmFyIGJzb25SZWdFeHAgPSB0eXBlb2Ygb3B0aW9uc1snYnNvblJlZ0V4cCddID09PSAnYm9vbGVhbicgPyBvcHRpb25zWydic29uUmVnRXhwJ10gOiBmYWxzZTsgLy8gQ29udHJvbHMgdGhlIHByb21vdGlvbiBvZiB2YWx1ZXMgdnMgd3JhcHBlciBjbGFzc2VzXG5cblx0ICB2YXIgcHJvbW90ZUJ1ZmZlcnMgPSBvcHRpb25zWydwcm9tb3RlQnVmZmVycyddID09IG51bGwgPyBmYWxzZSA6IG9wdGlvbnNbJ3Byb21vdGVCdWZmZXJzJ107XG5cdCAgdmFyIHByb21vdGVMb25ncyA9IG9wdGlvbnNbJ3Byb21vdGVMb25ncyddID09IG51bGwgPyB0cnVlIDogb3B0aW9uc1sncHJvbW90ZUxvbmdzJ107XG5cdCAgdmFyIHByb21vdGVWYWx1ZXMgPSBvcHRpb25zWydwcm9tb3RlVmFsdWVzJ10gPT0gbnVsbCA/IHRydWUgOiBvcHRpb25zWydwcm9tb3RlVmFsdWVzJ107IC8vIFNldCB0aGUgc3RhcnQgaW5kZXhcblxuXHQgIHZhciBzdGFydEluZGV4ID0gaW5kZXg7IC8vIFZhbGlkYXRlIHRoYXQgd2UgaGF2ZSBhdCBsZWFzdCA0IGJ5dGVzIG9mIGJ1ZmZlclxuXG5cdCAgaWYgKGJ1ZmZlciQkMS5sZW5ndGggPCA1KSB0aHJvdyBuZXcgRXJyb3IoJ2NvcnJ1cHQgYnNvbiBtZXNzYWdlIDwgNSBieXRlcyBsb25nJyk7IC8vIFJlYWQgdGhlIGRvY3VtZW50IHNpemVcblxuXHQgIHZhciBzaXplID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7IC8vIEVuc3VyZSBidWZmZXIgaXMgdmFsaWQgc2l6ZVxuXG5cdCAgaWYgKHNpemUgPCA1IHx8IHNpemUgPiBidWZmZXIkJDEubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2NvcnJ1cHQgYnNvbiBtZXNzYWdlJyk7IC8vIENyZWF0ZSBob2xkaW5nIG9iamVjdFxuXG5cdCAgdmFyIG9iamVjdCA9IGlzQXJyYXkgPyBbXSA6IHt9OyAvLyBVc2VkIGZvciBhcnJheXMgdG8gc2tpcCBoYXZpbmcgdG8gcGVyZm9ybSB1dGY4IGRlY29kaW5nXG5cblx0ICB2YXIgYXJyYXlJbmRleCA9IDA7XG5cdCAgdmFyIGRvbmUgPSBmYWxzZTsgLy8gV2hpbGUgd2UgaGF2ZSBtb3JlIGxlZnQgZGF0YSBsZWZ0IGtlZXAgcGFyc2luZ1xuXG5cdCAgd2hpbGUgKCFkb25lKSB7XG5cdCAgICAvLyBSZWFkIHRoZSB0eXBlXG5cdCAgICB2YXIgZWxlbWVudFR5cGUgPSBidWZmZXIkJDFbaW5kZXgrK107IC8vIElmIHdlIGdldCBhIHplcm8gaXQncyB0aGUgbGFzdCBieXRlLCBleGl0XG5cblx0ICAgIGlmIChlbGVtZW50VHlwZSA9PT0gMCkgYnJlYWs7IC8vIEdldCB0aGUgc3RhcnQgc2VhcmNoIGluZGV4XG5cblx0ICAgIHZhciBpID0gaW5kZXg7IC8vIExvY2F0ZSB0aGUgZW5kIG9mIHRoZSBjIHN0cmluZ1xuXG5cdCAgICB3aGlsZSAoYnVmZmVyJCQxW2ldICE9PSAweDAwICYmIGkgPCBidWZmZXIkJDEubGVuZ3RoKSB7XG5cdCAgICAgIGkrKztcblx0ICAgIH0gLy8gSWYgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgZG9jdW1lbnRcblxuXG5cdCAgICBpZiAoaSA+PSBCdWZmZXIkNC5ieXRlTGVuZ3RoKGJ1ZmZlciQkMSkpIHRocm93IG5ldyBFcnJvcignQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZycpO1xuXHQgICAgdmFyIG5hbWUgPSBpc0FycmF5ID8gYXJyYXlJbmRleCsrIDogYnVmZmVyJCQxLnRvU3RyaW5nKCd1dGY4JywgaW5kZXgsIGkpO1xuXHQgICAgaW5kZXggPSBpICsgMTtcblxuXHQgICAgaWYgKGVsZW1lbnRUeXBlID09PSBjb25zdGFudHMuQlNPTl9EQVRBX1NUUklORykge1xuXHQgICAgICB2YXIgc3RyaW5nU2l6ZSA9IGJ1ZmZlciQkMVtpbmRleCsrXSB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCA4IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDE2IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDI0O1xuXHQgICAgICBpZiAoc3RyaW5nU2l6ZSA8PSAwIHx8IHN0cmluZ1NpemUgPiBidWZmZXIkJDEubGVuZ3RoIC0gaW5kZXggfHwgYnVmZmVyJCQxW2luZGV4ICsgc3RyaW5nU2l6ZSAtIDFdICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24nKTtcblxuXHQgICAgICBpZiAoIXZhbGlkYXRlVXRmOCQxKGJ1ZmZlciQkMSwgaW5kZXgsIGluZGV4ICsgc3RyaW5nU2l6ZSAtIDEpKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFVURi04IHN0cmluZyBpbiBCU09OIGRvY3VtZW50Jyk7XG5cdCAgICAgIH1cblxuXHQgICAgICB2YXIgcyA9IGJ1ZmZlciQkMS50b1N0cmluZygndXRmOCcsIGluZGV4LCBpbmRleCArIHN0cmluZ1NpemUgLSAxKTtcblx0ICAgICAgb2JqZWN0W25hbWVdID0gcztcblx0ICAgICAgaW5kZXggPSBpbmRleCArIHN0cmluZ1NpemU7XG5cdCAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBjb25zdGFudHMuQlNPTl9EQVRBX09JRCkge1xuXHQgICAgICB2YXIgb2lkID0gQnVmZmVyJDQuYWxsb2MoMTIpO1xuXHQgICAgICBidWZmZXIkJDEuY29weShvaWQsIDAsIGluZGV4LCBpbmRleCArIDEyKTtcblx0ICAgICAgb2JqZWN0W25hbWVdID0gbmV3IG9iamVjdGlkKG9pZCk7XG5cdCAgICAgIGluZGV4ID0gaW5kZXggKyAxMjtcblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfSU5UICYmIHByb21vdGVWYWx1ZXMgPT09IGZhbHNlKSB7XG5cdCAgICAgIG9iamVjdFtuYW1lXSA9IG5ldyBpbnRfMzIoYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQpO1xuXHQgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gY29uc3RhbnRzLkJTT05fREFUQV9JTlQpIHtcblx0ICAgICAgb2JqZWN0W25hbWVdID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7XG5cdCAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBjb25zdGFudHMuQlNPTl9EQVRBX05VTUJFUiAmJiBwcm9tb3RlVmFsdWVzID09PSBmYWxzZSkge1xuXHQgICAgICBvYmplY3RbbmFtZV0gPSBuZXcgZG91YmxlXzEoYnVmZmVyJCQxLnJlYWREb3VibGVMRShpbmRleCkpO1xuXHQgICAgICBpbmRleCA9IGluZGV4ICsgODtcblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfTlVNQkVSKSB7XG5cdCAgICAgIG9iamVjdFtuYW1lXSA9IGJ1ZmZlciQkMS5yZWFkRG91YmxlTEUoaW5kZXgpO1xuXHQgICAgICBpbmRleCA9IGluZGV4ICsgODtcblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfREFURSkge1xuXHQgICAgICB2YXIgbG93Qml0cyA9IGJ1ZmZlciQkMVtpbmRleCsrXSB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCA4IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDE2IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDI0O1xuXHQgICAgICB2YXIgaGlnaEJpdHMgPSBidWZmZXIkJDFbaW5kZXgrK10gfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgOCB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAyNDtcblx0ICAgICAgb2JqZWN0W25hbWVdID0gbmV3IERhdGUobmV3IGxvbmdfMShsb3dCaXRzLCBoaWdoQml0cykudG9OdW1iZXIoKSk7XG5cdCAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBjb25zdGFudHMuQlNPTl9EQVRBX0JPT0xFQU4pIHtcblx0ICAgICAgaWYgKGJ1ZmZlciQkMVtpbmRleF0gIT09IDAgJiYgYnVmZmVyJCQxW2luZGV4XSAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKCdpbGxlZ2FsIGJvb2xlYW4gdHlwZSB2YWx1ZScpO1xuXHQgICAgICBvYmplY3RbbmFtZV0gPSBidWZmZXIkJDFbaW5kZXgrK10gPT09IDE7XG5cdCAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBjb25zdGFudHMuQlNPTl9EQVRBX09CSkVDVCkge1xuXHQgICAgICB2YXIgX2luZGV4ID0gaW5kZXg7XG5cdCAgICAgIHZhciBvYmplY3RTaXplID0gYnVmZmVyJCQxW2luZGV4XSB8IGJ1ZmZlciQkMVtpbmRleCArIDFdIDw8IDggfCBidWZmZXIkJDFbaW5kZXggKyAyXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCArIDNdIDw8IDI0O1xuXHQgICAgICBpZiAob2JqZWN0U2l6ZSA8PSAwIHx8IG9iamVjdFNpemUgPiBidWZmZXIkJDEubGVuZ3RoIC0gaW5kZXgpIHRocm93IG5ldyBFcnJvcignYmFkIGVtYmVkZGVkIGRvY3VtZW50IGxlbmd0aCBpbiBic29uJyk7IC8vIFdlIGhhdmUgYSByYXcgdmFsdWVcblxuXHQgICAgICBpZiAocmF3KSB7XG5cdCAgICAgICAgb2JqZWN0W25hbWVdID0gYnVmZmVyJCQxLnNsaWNlKGluZGV4LCBpbmRleCArIG9iamVjdFNpemUpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIG9iamVjdFtuYW1lXSA9IGRlc2VyaWFsaXplT2JqZWN0KGJ1ZmZlciQkMSwgX2luZGV4LCBvcHRpb25zLCBmYWxzZSk7XG5cdCAgICAgIH1cblxuXHQgICAgICBpbmRleCA9IGluZGV4ICsgb2JqZWN0U2l6ZTtcblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfQVJSQVkpIHtcblx0ICAgICAgdmFyIF9pbmRleDIgPSBpbmRleDtcblxuXHQgICAgICB2YXIgX29iamVjdFNpemUgPSBidWZmZXIkJDFbaW5kZXhdIHwgYnVmZmVyJCQxW2luZGV4ICsgMV0gPDwgOCB8IGJ1ZmZlciQkMVtpbmRleCArIDJdIDw8IDE2IHwgYnVmZmVyJCQxW2luZGV4ICsgM10gPDwgMjQ7XG5cblx0ICAgICAgdmFyIGFycmF5T3B0aW9ucyA9IG9wdGlvbnM7IC8vIFN0b3AgaW5kZXhcblxuXHQgICAgICB2YXIgc3RvcEluZGV4ID0gaW5kZXggKyBfb2JqZWN0U2l6ZTsgLy8gQWxsIGVsZW1lbnRzIG9mIGFycmF5IHRvIGJlIHJldHVybmVkIGFzIHJhdyBic29uXG5cblx0ICAgICAgaWYgKGZpZWxkc0FzUmF3ICYmIGZpZWxkc0FzUmF3W25hbWVdKSB7XG5cdCAgICAgICAgYXJyYXlPcHRpb25zID0ge307XG5cblx0ICAgICAgICBmb3IgKHZhciBuIGluIG9wdGlvbnMpIHtcblx0ICAgICAgICAgIGFycmF5T3B0aW9uc1tuXSA9IG9wdGlvbnNbbl07XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgYXJyYXlPcHRpb25zWydyYXcnXSA9IHRydWU7XG5cdCAgICAgIH1cblxuXHQgICAgICBvYmplY3RbbmFtZV0gPSBkZXNlcmlhbGl6ZU9iamVjdChidWZmZXIkJDEsIF9pbmRleDIsIGFycmF5T3B0aW9ucywgdHJ1ZSk7XG5cdCAgICAgIGluZGV4ID0gaW5kZXggKyBfb2JqZWN0U2l6ZTtcblx0ICAgICAgaWYgKGJ1ZmZlciQkMVtpbmRleCAtIDFdICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJyYXkgdGVybWluYXRvciBieXRlJyk7XG5cdCAgICAgIGlmIChpbmRleCAhPT0gc3RvcEluZGV4KSB0aHJvdyBuZXcgRXJyb3IoJ2NvcnJ1cHRlZCBhcnJheSBic29uJyk7XG5cdCAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBjb25zdGFudHMuQlNPTl9EQVRBX1VOREVGSU5FRCkge1xuXHQgICAgICBvYmplY3RbbmFtZV0gPSB1bmRlZmluZWQ7XG5cdCAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBjb25zdGFudHMuQlNPTl9EQVRBX05VTEwpIHtcblx0ICAgICAgb2JqZWN0W25hbWVdID0gbnVsbDtcblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfTE9ORykge1xuXHQgICAgICAvLyBVbnBhY2sgdGhlIGxvdyBhbmQgaGlnaCBiaXRzXG5cdCAgICAgIHZhciBfbG93Qml0cyA9IGJ1ZmZlciQkMVtpbmRleCsrXSB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCA4IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDE2IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDI0O1xuXG5cdCAgICAgIHZhciBfaGlnaEJpdHMgPSBidWZmZXIkJDFbaW5kZXgrK10gfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgOCB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAyNDtcblxuXHQgICAgICB2YXIgbG9uZyQkMSA9IG5ldyBsb25nXzEoX2xvd0JpdHMsIF9oaWdoQml0cyk7IC8vIFByb21vdGUgdGhlIGxvbmcgaWYgcG9zc2libGVcblxuXHQgICAgICBpZiAocHJvbW90ZUxvbmdzICYmIHByb21vdGVWYWx1ZXMgPT09IHRydWUpIHtcblx0ICAgICAgICBvYmplY3RbbmFtZV0gPSBsb25nJCQxLmxlc3NUaGFuT3JFcXVhbChKU19JTlRfTUFYX0xPTkcpICYmIGxvbmckJDEuZ3JlYXRlclRoYW5PckVxdWFsKEpTX0lOVF9NSU5fTE9ORykgPyBsb25nJCQxLnRvTnVtYmVyKCkgOiBsb25nJCQxO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIG9iamVjdFtuYW1lXSA9IGxvbmckJDE7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfREVDSU1BTDEyOCkge1xuXHQgICAgICAvLyBCdWZmZXIgdG8gY29udGFpbiB0aGUgZGVjaW1hbCBieXRlc1xuXHQgICAgICB2YXIgYnl0ZXMgPSBCdWZmZXIkNC5hbGxvYygxNik7IC8vIENvcHkgdGhlIG5leHQgMTYgYnl0ZXMgaW50byB0aGUgYnl0ZXMgYnVmZmVyXG5cblx0ICAgICAgYnVmZmVyJCQxLmNvcHkoYnl0ZXMsIDAsIGluZGV4LCBpbmRleCArIDE2KTsgLy8gVXBkYXRlIGluZGV4XG5cblx0ICAgICAgaW5kZXggPSBpbmRleCArIDE2OyAvLyBBc3NpZ24gdGhlIG5ldyBEZWNpbWFsMTI4IHZhbHVlXG5cblx0ICAgICAgdmFyIGRlY2ltYWwxMjgkJDEgPSBuZXcgZGVjaW1hbDEyOChieXRlcyk7IC8vIElmIHdlIGhhdmUgYW4gYWx0ZXJuYXRpdmUgbWFwcGVyIHVzZSB0aGF0XG5cblx0ICAgICAgb2JqZWN0W25hbWVdID0gZGVjaW1hbDEyOCQkMS50b09iamVjdCA/IGRlY2ltYWwxMjgkJDEudG9PYmplY3QoKSA6IGRlY2ltYWwxMjgkJDE7XG5cdCAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBjb25zdGFudHMuQlNPTl9EQVRBX0JJTkFSWSkge1xuXHQgICAgICB2YXIgYmluYXJ5U2l6ZSA9IGJ1ZmZlciQkMVtpbmRleCsrXSB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCA4IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDE2IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDI0O1xuXHQgICAgICB2YXIgdG90YWxCaW5hcnlTaXplID0gYmluYXJ5U2l6ZTtcblx0ICAgICAgdmFyIHN1YlR5cGUgPSBidWZmZXIkJDFbaW5kZXgrK107IC8vIERpZCB3ZSBoYXZlIGEgbmVnYXRpdmUgYmluYXJ5IHNpemUsIHRocm93XG5cblx0ICAgICAgaWYgKGJpbmFyeVNpemUgPCAwKSB0aHJvdyBuZXcgRXJyb3IoJ05lZ2F0aXZlIGJpbmFyeSB0eXBlIGVsZW1lbnQgc2l6ZSBmb3VuZCcpOyAvLyBJcyB0aGUgbGVuZ3RoIGxvbmdlciB0aGFuIHRoZSBkb2N1bWVudFxuXG5cdCAgICAgIGlmIChiaW5hcnlTaXplID4gQnVmZmVyJDQuYnl0ZUxlbmd0aChidWZmZXIkJDEpKSB0aHJvdyBuZXcgRXJyb3IoJ0JpbmFyeSB0eXBlIHNpemUgbGFyZ2VyIHRoYW4gZG9jdW1lbnQgc2l6ZScpOyAvLyBEZWNvZGUgYXMgcmF3IEJ1ZmZlciBvYmplY3QgaWYgb3B0aW9ucyBzcGVjaWZpZXMgaXRcblxuXHQgICAgICBpZiAoYnVmZmVyJCQxWydzbGljZSddICE9IG51bGwpIHtcblx0ICAgICAgICAvLyBJZiB3ZSBoYXZlIHN1YnR5cGUgMiBza2lwIHRoZSA0IGJ5dGVzIGZvciB0aGUgc2l6ZVxuXHQgICAgICAgIGlmIChzdWJUeXBlID09PSBiaW5hcnkuU1VCVFlQRV9CWVRFX0FSUkFZKSB7XG5cdCAgICAgICAgICBiaW5hcnlTaXplID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7XG5cdCAgICAgICAgICBpZiAoYmluYXJ5U2l6ZSA8IDApIHRocm93IG5ldyBFcnJvcignTmVnYXRpdmUgYmluYXJ5IHR5cGUgZWxlbWVudCBzaXplIGZvdW5kIGZvciBzdWJ0eXBlIDB4MDInKTtcblx0ICAgICAgICAgIGlmIChiaW5hcnlTaXplID4gdG90YWxCaW5hcnlTaXplIC0gNCkgdGhyb3cgbmV3IEVycm9yKCdCaW5hcnkgdHlwZSB3aXRoIHN1YnR5cGUgMHgwMiBjb250YWlucyB0byBsb25nIGJpbmFyeSBzaXplJyk7XG5cdCAgICAgICAgICBpZiAoYmluYXJ5U2l6ZSA8IHRvdGFsQmluYXJ5U2l6ZSAtIDQpIHRocm93IG5ldyBFcnJvcignQmluYXJ5IHR5cGUgd2l0aCBzdWJ0eXBlIDB4MDIgY29udGFpbnMgdG8gc2hvcnQgYmluYXJ5IHNpemUnKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBpZiAocHJvbW90ZUJ1ZmZlcnMgJiYgcHJvbW90ZVZhbHVlcykge1xuXHQgICAgICAgICAgb2JqZWN0W25hbWVdID0gYnVmZmVyJCQxLnNsaWNlKGluZGV4LCBpbmRleCArIGJpbmFyeVNpemUpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBvYmplY3RbbmFtZV0gPSBuZXcgYmluYXJ5KGJ1ZmZlciQkMS5zbGljZShpbmRleCwgaW5kZXggKyBiaW5hcnlTaXplKSwgc3ViVHlwZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHZhciBfYnVmZmVyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gbmV3IFVpbnQ4QXJyYXkobmV3IEFycmF5QnVmZmVyKGJpbmFyeVNpemUpKSA6IG5ldyBBcnJheShiaW5hcnlTaXplKTsgLy8gSWYgd2UgaGF2ZSBzdWJ0eXBlIDIgc2tpcCB0aGUgNCBieXRlcyBmb3IgdGhlIHNpemVcblxuXG5cdCAgICAgICAgaWYgKHN1YlR5cGUgPT09IGJpbmFyeS5TVUJUWVBFX0JZVEVfQVJSQVkpIHtcblx0ICAgICAgICAgIGJpbmFyeVNpemUgPSBidWZmZXIkJDFbaW5kZXgrK10gfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgOCB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAxNiB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCAyNDtcblx0ICAgICAgICAgIGlmIChiaW5hcnlTaXplIDwgMCkgdGhyb3cgbmV3IEVycm9yKCdOZWdhdGl2ZSBiaW5hcnkgdHlwZSBlbGVtZW50IHNpemUgZm91bmQgZm9yIHN1YnR5cGUgMHgwMicpO1xuXHQgICAgICAgICAgaWYgKGJpbmFyeVNpemUgPiB0b3RhbEJpbmFyeVNpemUgLSA0KSB0aHJvdyBuZXcgRXJyb3IoJ0JpbmFyeSB0eXBlIHdpdGggc3VidHlwZSAweDAyIGNvbnRhaW5zIHRvIGxvbmcgYmluYXJ5IHNpemUnKTtcblx0ICAgICAgICAgIGlmIChiaW5hcnlTaXplIDwgdG90YWxCaW5hcnlTaXplIC0gNCkgdGhyb3cgbmV3IEVycm9yKCdCaW5hcnkgdHlwZSB3aXRoIHN1YnR5cGUgMHgwMiBjb250YWlucyB0byBzaG9ydCBiaW5hcnkgc2l6ZScpO1xuXHQgICAgICAgIH0gLy8gQ29weSB0aGUgZGF0YVxuXG5cblx0ICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmluYXJ5U2l6ZTsgaSsrKSB7XG5cdCAgICAgICAgICBfYnVmZmVyW2ldID0gYnVmZmVyJCQxW2luZGV4ICsgaV07XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgaWYgKHByb21vdGVCdWZmZXJzICYmIHByb21vdGVWYWx1ZXMpIHtcblx0ICAgICAgICAgIG9iamVjdFtuYW1lXSA9IF9idWZmZXI7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIG9iamVjdFtuYW1lXSA9IG5ldyBiaW5hcnkoX2J1ZmZlciwgc3ViVHlwZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IC8vIFVwZGF0ZSB0aGUgaW5kZXhcblxuXG5cdCAgICAgIGluZGV4ID0gaW5kZXggKyBiaW5hcnlTaXplO1xuXHQgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gY29uc3RhbnRzLkJTT05fREFUQV9SRUdFWFAgJiYgYnNvblJlZ0V4cCA9PT0gZmFsc2UpIHtcblx0ICAgICAgLy8gR2V0IHRoZSBzdGFydCBzZWFyY2ggaW5kZXhcblx0ICAgICAgaSA9IGluZGV4OyAvLyBMb2NhdGUgdGhlIGVuZCBvZiB0aGUgYyBzdHJpbmdcblxuXHQgICAgICB3aGlsZSAoYnVmZmVyJCQxW2ldICE9PSAweDAwICYmIGkgPCBidWZmZXIkJDEubGVuZ3RoKSB7XG5cdCAgICAgICAgaSsrO1xuXHQgICAgICB9IC8vIElmIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGRvY3VtZW50XG5cblxuXHQgICAgICBpZiAoaSA+PSBidWZmZXIkJDEubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBCU09OIERvY3VtZW50OiBpbGxlZ2FsIENTdHJpbmcnKTsgLy8gUmV0dXJuIHRoZSBDIHN0cmluZ1xuXG5cdCAgICAgIHZhciBzb3VyY2UgPSBidWZmZXIkJDEudG9TdHJpbmcoJ3V0ZjgnLCBpbmRleCwgaSk7IC8vIENyZWF0ZSB0aGUgcmVnZXhwXG5cblx0ICAgICAgaW5kZXggPSBpICsgMTsgLy8gR2V0IHRoZSBzdGFydCBzZWFyY2ggaW5kZXhcblxuXHQgICAgICBpID0gaW5kZXg7IC8vIExvY2F0ZSB0aGUgZW5kIG9mIHRoZSBjIHN0cmluZ1xuXG5cdCAgICAgIHdoaWxlIChidWZmZXIkJDFbaV0gIT09IDB4MDAgJiYgaSA8IGJ1ZmZlciQkMS5sZW5ndGgpIHtcblx0ICAgICAgICBpKys7XG5cdCAgICAgIH0gLy8gSWYgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgZG9jdW1lbnRcblxuXG5cdCAgICAgIGlmIChpID49IGJ1ZmZlciQkMS5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZycpOyAvLyBSZXR1cm4gdGhlIEMgc3RyaW5nXG5cblx0ICAgICAgdmFyIHJlZ0V4cE9wdGlvbnMgPSBidWZmZXIkJDEudG9TdHJpbmcoJ3V0ZjgnLCBpbmRleCwgaSk7XG5cdCAgICAgIGluZGV4ID0gaSArIDE7IC8vIEZvciBlYWNoIG9wdGlvbiBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgb25lIGZvciBqYXZhc2NyaXB0XG5cblx0ICAgICAgdmFyIG9wdGlvbnNBcnJheSA9IG5ldyBBcnJheShyZWdFeHBPcHRpb25zLmxlbmd0aCk7IC8vIFBhcnNlIG9wdGlvbnNcblxuXHQgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVnRXhwT3B0aW9ucy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgIHN3aXRjaCAocmVnRXhwT3B0aW9uc1tpXSkge1xuXHQgICAgICAgICAgY2FzZSAnbSc6XG5cdCAgICAgICAgICAgIG9wdGlvbnNBcnJheVtpXSA9ICdtJztcblx0ICAgICAgICAgICAgYnJlYWs7XG5cblx0ICAgICAgICAgIGNhc2UgJ3MnOlxuXHQgICAgICAgICAgICBvcHRpb25zQXJyYXlbaV0gPSAnZyc7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXG5cdCAgICAgICAgICBjYXNlICdpJzpcblx0ICAgICAgICAgICAgb3B0aW9uc0FycmF5W2ldID0gJ2knO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblxuXHQgICAgICBvYmplY3RbbmFtZV0gPSBuZXcgUmVnRXhwKHNvdXJjZSwgb3B0aW9uc0FycmF5LmpvaW4oJycpKTtcblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfUkVHRVhQICYmIGJzb25SZWdFeHAgPT09IHRydWUpIHtcblx0ICAgICAgLy8gR2V0IHRoZSBzdGFydCBzZWFyY2ggaW5kZXhcblx0ICAgICAgaSA9IGluZGV4OyAvLyBMb2NhdGUgdGhlIGVuZCBvZiB0aGUgYyBzdHJpbmdcblxuXHQgICAgICB3aGlsZSAoYnVmZmVyJCQxW2ldICE9PSAweDAwICYmIGkgPCBidWZmZXIkJDEubGVuZ3RoKSB7XG5cdCAgICAgICAgaSsrO1xuXHQgICAgICB9IC8vIElmIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGRvY3VtZW50XG5cblxuXHQgICAgICBpZiAoaSA+PSBidWZmZXIkJDEubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBCU09OIERvY3VtZW50OiBpbGxlZ2FsIENTdHJpbmcnKTsgLy8gUmV0dXJuIHRoZSBDIHN0cmluZ1xuXG5cdCAgICAgIHZhciBfc291cmNlID0gYnVmZmVyJCQxLnRvU3RyaW5nKCd1dGY4JywgaW5kZXgsIGkpO1xuXG5cdCAgICAgIGluZGV4ID0gaSArIDE7IC8vIEdldCB0aGUgc3RhcnQgc2VhcmNoIGluZGV4XG5cblx0ICAgICAgaSA9IGluZGV4OyAvLyBMb2NhdGUgdGhlIGVuZCBvZiB0aGUgYyBzdHJpbmdcblxuXHQgICAgICB3aGlsZSAoYnVmZmVyJCQxW2ldICE9PSAweDAwICYmIGkgPCBidWZmZXIkJDEubGVuZ3RoKSB7XG5cdCAgICAgICAgaSsrO1xuXHQgICAgICB9IC8vIElmIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGRvY3VtZW50XG5cblxuXHQgICAgICBpZiAoaSA+PSBidWZmZXIkJDEubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBCU09OIERvY3VtZW50OiBpbGxlZ2FsIENTdHJpbmcnKTsgLy8gUmV0dXJuIHRoZSBDIHN0cmluZ1xuXG5cdCAgICAgIHZhciBfcmVnRXhwT3B0aW9ucyA9IGJ1ZmZlciQkMS50b1N0cmluZygndXRmOCcsIGluZGV4LCBpKTtcblxuXHQgICAgICBpbmRleCA9IGkgKyAxOyAvLyBTZXQgdGhlIG9iamVjdFxuXG5cdCAgICAgIG9iamVjdFtuYW1lXSA9IG5ldyByZWdleHAoX3NvdXJjZSwgX3JlZ0V4cE9wdGlvbnMpO1xuXHQgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gY29uc3RhbnRzLkJTT05fREFUQV9TWU1CT0wpIHtcblx0ICAgICAgdmFyIF9zdHJpbmdTaXplID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7XG5cblx0ICAgICAgaWYgKF9zdHJpbmdTaXplIDw9IDAgfHwgX3N0cmluZ1NpemUgPiBidWZmZXIkJDEubGVuZ3RoIC0gaW5kZXggfHwgYnVmZmVyJCQxW2luZGV4ICsgX3N0cmluZ1NpemUgLSAxXSAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdiYWQgc3RyaW5nIGxlbmd0aCBpbiBic29uJyk7IC8vIHN5bWJvbCBpcyBkZXByZWNhdGVkIC0gdXBncmFkZSB0byBzdHJpbmcuXG5cblx0ICAgICAgb2JqZWN0W25hbWVdID0gYnVmZmVyJCQxLnRvU3RyaW5nKCd1dGY4JywgaW5kZXgsIGluZGV4ICsgX3N0cmluZ1NpemUgLSAxKTtcblx0ICAgICAgaW5kZXggPSBpbmRleCArIF9zdHJpbmdTaXplO1xuXHQgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gY29uc3RhbnRzLkJTT05fREFUQV9USU1FU1RBTVApIHtcblx0ICAgICAgdmFyIF9sb3dCaXRzMiA9IGJ1ZmZlciQkMVtpbmRleCsrXSB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCA4IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDE2IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDI0O1xuXG5cdCAgICAgIHZhciBfaGlnaEJpdHMyID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7XG5cblx0ICAgICAgb2JqZWN0W25hbWVdID0gbmV3IHRpbWVzdGFtcChfbG93Qml0czIsIF9oaWdoQml0czIpO1xuXHQgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gY29uc3RhbnRzLkJTT05fREFUQV9NSU5fS0VZKSB7XG5cdCAgICAgIG9iamVjdFtuYW1lXSA9IG5ldyBtaW5fa2V5KCk7XG5cdCAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09PSBjb25zdGFudHMuQlNPTl9EQVRBX01BWF9LRVkpIHtcblx0ICAgICAgb2JqZWN0W25hbWVdID0gbmV3IG1heF9rZXkoKTtcblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfQ09ERSkge1xuXHQgICAgICB2YXIgX3N0cmluZ1NpemUyID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7XG5cblx0ICAgICAgaWYgKF9zdHJpbmdTaXplMiA8PSAwIHx8IF9zdHJpbmdTaXplMiA+IGJ1ZmZlciQkMS5sZW5ndGggLSBpbmRleCB8fCBidWZmZXIkJDFbaW5kZXggKyBfc3RyaW5nU2l6ZTIgLSAxXSAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdiYWQgc3RyaW5nIGxlbmd0aCBpbiBic29uJyk7XG5cdCAgICAgIHZhciBmdW5jdGlvblN0cmluZyA9IGJ1ZmZlciQkMS50b1N0cmluZygndXRmOCcsIGluZGV4LCBpbmRleCArIF9zdHJpbmdTaXplMiAtIDEpOyAvLyBJZiB3ZSBhcmUgZXZhbHVhdGluZyB0aGUgZnVuY3Rpb25zXG5cblx0ICAgICAgaWYgKGV2YWxGdW5jdGlvbnMpIHtcblx0ICAgICAgICAvLyBJZiB3ZSBoYXZlIGNhY2hlIGVuYWJsZWQgbGV0J3MgbG9vayBmb3IgdGhlIG1kNSBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGNhY2hlXG5cdCAgICAgICAgaWYgKGNhY2hlRnVuY3Rpb25zKSB7XG5cdCAgICAgICAgICB2YXIgaGFzaCA9IGNhY2hlRnVuY3Rpb25zQ3JjMzIgPyBjcmMzMihmdW5jdGlvblN0cmluZykgOiBmdW5jdGlvblN0cmluZzsgLy8gR290IHRvIGRvIHRoaXMgdG8gYXZvaWQgVjggZGVvcHRpbWl6aW5nIHRoZSBjYWxsIGR1ZSB0byBmaW5kaW5nIGV2YWxcblxuXHQgICAgICAgICAgb2JqZWN0W25hbWVdID0gaXNvbGF0ZUV2YWxXaXRoSGFzaChmdW5jdGlvbkNhY2hlLCBoYXNoLCBmdW5jdGlvblN0cmluZywgb2JqZWN0KTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgb2JqZWN0W25hbWVdID0gaXNvbGF0ZUV2YWwoZnVuY3Rpb25TdHJpbmcpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBvYmplY3RbbmFtZV0gPSBuZXcgY29kZShmdW5jdGlvblN0cmluZyk7XG5cdCAgICAgIH0gLy8gVXBkYXRlIHBhcnNlIGluZGV4IHBvc2l0aW9uXG5cblxuXHQgICAgICBpbmRleCA9IGluZGV4ICsgX3N0cmluZ1NpemUyO1xuXHQgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PT0gY29uc3RhbnRzLkJTT05fREFUQV9DT0RFX1dfU0NPUEUpIHtcblx0ICAgICAgdmFyIHRvdGFsU2l6ZSA9IGJ1ZmZlciQkMVtpbmRleCsrXSB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCA4IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDE2IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDI0OyAvLyBFbGVtZW50IGNhbm5vdCBiZSBzaG9ydGVyIHRoYW4gdG90YWxTaXplICsgc3RyaW5nU2l6ZSArIGRvY3VtZW50U2l6ZSArIHRlcm1pbmF0b3JcblxuXHQgICAgICBpZiAodG90YWxTaXplIDwgNCArIDQgKyA0ICsgMSkge1xuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcignY29kZV93X3Njb3BlIHRvdGFsIHNpemUgc2hvcnRlciBtaW5pbXVtIGV4cGVjdGVkIGxlbmd0aCcpO1xuXHQgICAgICB9IC8vIEdldCB0aGUgY29kZSBzdHJpbmcgc2l6ZVxuXG5cblx0ICAgICAgdmFyIF9zdHJpbmdTaXplMyA9IGJ1ZmZlciQkMVtpbmRleCsrXSB8IGJ1ZmZlciQkMVtpbmRleCsrXSA8PCA4IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDE2IHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDI0OyAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgdmFsaWQgc3RyaW5nXG5cblxuXHQgICAgICBpZiAoX3N0cmluZ1NpemUzIDw9IDAgfHwgX3N0cmluZ1NpemUzID4gYnVmZmVyJCQxLmxlbmd0aCAtIGluZGV4IHx8IGJ1ZmZlciQkMVtpbmRleCArIF9zdHJpbmdTaXplMyAtIDFdICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24nKTsgLy8gSmF2YXNjcmlwdCBmdW5jdGlvblxuXG5cdCAgICAgIHZhciBfZnVuY3Rpb25TdHJpbmcgPSBidWZmZXIkJDEudG9TdHJpbmcoJ3V0ZjgnLCBpbmRleCwgaW5kZXggKyBfc3RyaW5nU2l6ZTMgLSAxKTsgLy8gVXBkYXRlIHBhcnNlIGluZGV4IHBvc2l0aW9uXG5cblxuXHQgICAgICBpbmRleCA9IGluZGV4ICsgX3N0cmluZ1NpemUzOyAvLyBQYXJzZSB0aGUgZWxlbWVudFxuXG5cdCAgICAgIHZhciBfaW5kZXgzID0gaW5kZXg7IC8vIERlY29kZSB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0IGRvY3VtZW50XG5cblx0ICAgICAgdmFyIF9vYmplY3RTaXplMiA9IGJ1ZmZlciQkMVtpbmRleF0gfCBidWZmZXIkJDFbaW5kZXggKyAxXSA8PCA4IHwgYnVmZmVyJCQxW2luZGV4ICsgMl0gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXggKyAzXSA8PCAyNDsgLy8gRGVjb2RlIHRoZSBzY29wZSBvYmplY3RcblxuXG5cdCAgICAgIHZhciBzY29wZU9iamVjdCA9IGRlc2VyaWFsaXplT2JqZWN0KGJ1ZmZlciQkMSwgX2luZGV4Mywgb3B0aW9ucywgZmFsc2UpOyAvLyBBZGp1c3QgdGhlIGluZGV4XG5cblx0ICAgICAgaW5kZXggPSBpbmRleCArIF9vYmplY3RTaXplMjsgLy8gQ2hlY2sgaWYgZmllbGQgbGVuZ3RoIGlzIHRvIHNob3J0XG5cblx0ICAgICAgaWYgKHRvdGFsU2l6ZSA8IDQgKyA0ICsgX29iamVjdFNpemUyICsgX3N0cmluZ1NpemUzKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBpcyB0byBzaG9ydCwgdHJ1bmNhdGluZyBzY29wZScpO1xuXHQgICAgICB9IC8vIENoZWNrIGlmIHRvdGFsU2l6ZSBmaWVsZCBpcyB0byBsb25nXG5cblxuXHQgICAgICBpZiAodG90YWxTaXplID4gNCArIDQgKyBfb2JqZWN0U2l6ZTIgKyBfc3RyaW5nU2l6ZTMpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvZGVfd19zY29wZSB0b3RhbCBzaXplIGlzIHRvIGxvbmcsIGNsaXBzIG91dGVyIGRvY3VtZW50Jyk7XG5cdCAgICAgIH0gLy8gSWYgd2UgYXJlIGV2YWx1YXRpbmcgdGhlIGZ1bmN0aW9uc1xuXG5cblx0ICAgICAgaWYgKGV2YWxGdW5jdGlvbnMpIHtcblx0ICAgICAgICAvLyBJZiB3ZSBoYXZlIGNhY2hlIGVuYWJsZWQgbGV0J3MgbG9vayBmb3IgdGhlIG1kNSBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGNhY2hlXG5cdCAgICAgICAgaWYgKGNhY2hlRnVuY3Rpb25zKSB7XG5cdCAgICAgICAgICB2YXIgX2hhc2ggPSBjYWNoZUZ1bmN0aW9uc0NyYzMyID8gY3JjMzIoX2Z1bmN0aW9uU3RyaW5nKSA6IF9mdW5jdGlvblN0cmluZzsgLy8gR290IHRvIGRvIHRoaXMgdG8gYXZvaWQgVjggZGVvcHRpbWl6aW5nIHRoZSBjYWxsIGR1ZSB0byBmaW5kaW5nIGV2YWxcblxuXG5cdCAgICAgICAgICBvYmplY3RbbmFtZV0gPSBpc29sYXRlRXZhbFdpdGhIYXNoKGZ1bmN0aW9uQ2FjaGUsIF9oYXNoLCBfZnVuY3Rpb25TdHJpbmcsIG9iamVjdCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIG9iamVjdFtuYW1lXSA9IGlzb2xhdGVFdmFsKF9mdW5jdGlvblN0cmluZyk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgb2JqZWN0W25hbWVdLnNjb3BlID0gc2NvcGVPYmplY3Q7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgb2JqZWN0W25hbWVdID0gbmV3IGNvZGUoX2Z1bmN0aW9uU3RyaW5nLCBzY29wZU9iamVjdCk7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSBpZiAoZWxlbWVudFR5cGUgPT09IGNvbnN0YW50cy5CU09OX0RBVEFfREJQT0lOVEVSKSB7XG5cdCAgICAgIC8vIEdldCB0aGUgY29kZSBzdHJpbmcgc2l6ZVxuXHQgICAgICB2YXIgX3N0cmluZ1NpemU0ID0gYnVmZmVyJCQxW2luZGV4KytdIHwgYnVmZmVyJCQxW2luZGV4KytdIDw8IDggfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMTYgfCBidWZmZXIkJDFbaW5kZXgrK10gPDwgMjQ7IC8vIENoZWNrIGlmIHdlIGhhdmUgYSB2YWxpZCBzdHJpbmdcblxuXG5cdCAgICAgIGlmIChfc3RyaW5nU2l6ZTQgPD0gMCB8fCBfc3RyaW5nU2l6ZTQgPiBidWZmZXIkJDEubGVuZ3RoIC0gaW5kZXggfHwgYnVmZmVyJCQxW2luZGV4ICsgX3N0cmluZ1NpemU0IC0gMV0gIT09IDApIHRocm93IG5ldyBFcnJvcignYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbicpOyAvLyBOYW1lc3BhY2VcblxuXHQgICAgICBpZiAoIXZhbGlkYXRlVXRmOCQxKGJ1ZmZlciQkMSwgaW5kZXgsIGluZGV4ICsgX3N0cmluZ1NpemU0IC0gMSkpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgVVRGLTggc3RyaW5nIGluIEJTT04gZG9jdW1lbnQnKTtcblx0ICAgICAgfVxuXG5cdCAgICAgIHZhciBuYW1lc3BhY2UgPSBidWZmZXIkJDEudG9TdHJpbmcoJ3V0ZjgnLCBpbmRleCwgaW5kZXggKyBfc3RyaW5nU2l6ZTQgLSAxKTsgLy8gVXBkYXRlIHBhcnNlIGluZGV4IHBvc2l0aW9uXG5cblx0ICAgICAgaW5kZXggPSBpbmRleCArIF9zdHJpbmdTaXplNDsgLy8gUmVhZCB0aGUgb2lkXG5cblx0ICAgICAgdmFyIG9pZEJ1ZmZlciA9IEJ1ZmZlciQ0LmFsbG9jKDEyKTtcblx0ICAgICAgYnVmZmVyJCQxLmNvcHkob2lkQnVmZmVyLCAwLCBpbmRleCwgaW5kZXggKyAxMik7XG5cblx0ICAgICAgdmFyIF9vaWQgPSBuZXcgb2JqZWN0aWQob2lkQnVmZmVyKTsgLy8gVXBkYXRlIHRoZSBpbmRleFxuXG5cblx0ICAgICAgaW5kZXggPSBpbmRleCArIDEyOyAvLyBVcGdyYWRlIHRvIERCUmVmIHR5cGVcblxuXHQgICAgICBvYmplY3RbbmFtZV0gPSBuZXcgZGJfcmVmKG5hbWVzcGFjZSwgX29pZCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RldGVjdGVkIHVua25vd24gQlNPTiB0eXBlICcgKyBlbGVtZW50VHlwZS50b1N0cmluZygxNikgKyAnIGZvciBmaWVsZG5hbWUgXCInICsgbmFtZSArICdcIiwgYXJlIHlvdSB1c2luZyB0aGUgbGF0ZXN0IEJTT04gcGFyc2VyPycpO1xuXHQgICAgfVxuXHQgIH0gLy8gQ2hlY2sgaWYgdGhlIGRlc2VyaWFsaXphdGlvbiB3YXMgYWdhaW5zdCBhIHZhbGlkIGFycmF5L29iamVjdFxuXG5cblx0ICBpZiAoc2l6ZSAhPT0gaW5kZXggLSBzdGFydEluZGV4KSB7XG5cdCAgICBpZiAoaXNBcnJheSkgdGhyb3cgbmV3IEVycm9yKCdjb3JydXB0IGFycmF5IGJzb24nKTtcblx0ICAgIHRocm93IG5ldyBFcnJvcignY29ycnVwdCBvYmplY3QgYnNvbicpO1xuXHQgIH0gLy8gY2hlY2sgaWYgb2JqZWN0J3MgJCBrZXlzIGFyZSB0aG9zZSBvZiBhIERCUmVmXG5cblxuXHQgIHZhciBkb2xsYXJLZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KS5maWx0ZXIoZnVuY3Rpb24gKGspIHtcblx0ICAgIHJldHVybiBrLnN0YXJ0c1dpdGgoJyQnKTtcblx0ICB9KTtcblx0ICB2YXIgdmFsaWQgPSB0cnVlO1xuXHQgIGRvbGxhcktleXMuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuXHQgICAgaWYgKFsnJHJlZicsICckaWQnLCAnJGRiJ10uaW5kZXhPZihrKSA9PT0gLTEpIHZhbGlkID0gZmFsc2U7XG5cdCAgfSk7IC8vIGlmIGEgJGtleSBub3QgaW4gXCIkcmVmXCIsIFwiJGlkXCIsIFwiJGRiXCIsIGRvbid0IG1ha2UgYSBEQlJlZlxuXG5cdCAgaWYgKCF2YWxpZCkgcmV0dXJuIG9iamVjdDtcblxuXHQgIGlmIChvYmplY3RbJyRpZCddICE9IG51bGwgJiYgb2JqZWN0WyckcmVmJ10gIT0gbnVsbCkge1xuXHQgICAgdmFyIGNvcHkgPSBPYmplY3QuYXNzaWduKHt9LCBvYmplY3QpO1xuXHQgICAgZGVsZXRlIGNvcHkuJHJlZjtcblx0ICAgIGRlbGV0ZSBjb3B5LiRpZDtcblx0ICAgIGRlbGV0ZSBjb3B5LiRkYjtcblx0ICAgIHJldHVybiBuZXcgZGJfcmVmKG9iamVjdC4kcmVmLCBvYmplY3QuJGlkLCBvYmplY3QuJGRiIHx8IG51bGwsIGNvcHkpO1xuXHQgIH1cblxuXHQgIHJldHVybiBvYmplY3Q7XG5cdH1cblx0LyoqXG5cdCAqIEVuc3VyZSBldmFsIGlzIGlzb2xhdGVkLlxuXHQgKlxuXHQgKiBAaWdub3JlXG5cdCAqIEBhcGkgcHJpdmF0ZVxuXHQgKi9cblxuXG5cdGZ1bmN0aW9uIGlzb2xhdGVFdmFsV2l0aEhhc2goZnVuY3Rpb25DYWNoZSwgaGFzaCwgZnVuY3Rpb25TdHJpbmcsIG9iamVjdCkge1xuXHQgIC8vIENvbnRhaW5zIHRoZSB2YWx1ZSB3ZSBhcmUgZ29pbmcgdG8gc2V0XG5cdCAgdmFyIHZhbHVlID0gbnVsbDsgLy8gQ2hlY2sgZm9yIGNhY2hlIGhpdCwgZXZhbCBpZiBtaXNzaW5nIGFuZCByZXR1cm4gY2FjaGVkIGZ1bmN0aW9uXG5cblx0ICBpZiAoZnVuY3Rpb25DYWNoZVtoYXNoXSA9PSBudWxsKSB7XG5cdCAgICBldmFsKCd2YWx1ZSA9ICcgKyBmdW5jdGlvblN0cmluZyk7XG5cdCAgICBmdW5jdGlvbkNhY2hlW2hhc2hdID0gdmFsdWU7XG5cdCAgfSAvLyBTZXQgdGhlIG9iamVjdFxuXG5cblx0ICByZXR1cm4gZnVuY3Rpb25DYWNoZVtoYXNoXS5iaW5kKG9iamVjdCk7XG5cdH1cblx0LyoqXG5cdCAqIEVuc3VyZSBldmFsIGlzIGlzb2xhdGVkLlxuXHQgKlxuXHQgKiBAaWdub3JlXG5cdCAqIEBhcGkgcHJpdmF0ZVxuXHQgKi9cblxuXG5cdGZ1bmN0aW9uIGlzb2xhdGVFdmFsKGZ1bmN0aW9uU3RyaW5nKSB7XG5cdCAgLy8gQ29udGFpbnMgdGhlIHZhbHVlIHdlIGFyZSBnb2luZyB0byBzZXRcblx0ICB2YXIgdmFsdWUgPSBudWxsOyAvLyBFdmFsIHRoZSBmdW5jdGlvblxuXG5cdCAgZXZhbCgndmFsdWUgPSAnICsgZnVuY3Rpb25TdHJpbmcpO1xuXHQgIHJldHVybiB2YWx1ZTtcblx0fVxuXG5cdHZhciBkZXNlcmlhbGl6ZXIgPSBkZXNlcmlhbGl6ZSQxO1xuXG5cdC8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cdC8vXG5cdC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuXHQvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblx0Ly9cblx0Ly8gICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuXHQvLyAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXHQvL1xuXHQvLyAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG5cdC8vICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cblx0Ly8gICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cdC8vXG5cdC8vICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRmFpciBPYWtzIExhYnMsIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG5cdC8vICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuXHQvLyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cblx0Ly9cblx0Ly8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcblx0Ly8gQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuXHQvLyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuXHQvLyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFXG5cdC8vIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Jcblx0Ly8gQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Zcblx0Ly8gU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG5cdC8vIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG5cdC8vIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG5cdC8vIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG5cdC8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuXHQvL1xuXHQvL1xuXHQvLyBNb2RpZmljYXRpb25zIHRvIHdyaXRlSUVFRTc1NCB0byBzdXBwb3J0IG5lZ2F0aXZlIHplcm9lcyBtYWRlIGJ5IEJyaWFuIFdoaXRlXG5cblx0ZnVuY3Rpb24gcmVhZElFRUU3NTQoYnVmZmVyJCQxLCBvZmZzZXQsIGVuZGlhbiwgbUxlbiwgbkJ5dGVzKSB7XG5cdCAgdmFyIGUsXG5cdCAgICAgIG0sXG5cdCAgICAgIGJCRSA9IGVuZGlhbiA9PT0gJ2JpZycsXG5cdCAgICAgIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDEsXG5cdCAgICAgIGVNYXggPSAoMSA8PCBlTGVuKSAtIDEsXG5cdCAgICAgIGVCaWFzID0gZU1heCA+PiAxLFxuXHQgICAgICBuQml0cyA9IC03LFxuXHQgICAgICBpID0gYkJFID8gMCA6IG5CeXRlcyAtIDEsXG5cdCAgICAgIGQgPSBiQkUgPyAxIDogLTEsXG5cdCAgICAgIHMgPSBidWZmZXIkJDFbb2Zmc2V0ICsgaV07XG5cdCAgaSArPSBkO1xuXHQgIGUgPSBzICYgKDEgPDwgLW5CaXRzKSAtIDE7XG5cdCAgcyA+Pj0gLW5CaXRzO1xuXHQgIG5CaXRzICs9IGVMZW47XG5cblx0ICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlciQkMVtvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7XG5cdCAgfVxuXG5cdCAgbSA9IGUgJiAoMSA8PCAtbkJpdHMpIC0gMTtcblx0ICBlID4+PSAtbkJpdHM7XG5cdCAgbkJpdHMgKz0gbUxlbjtcblxuXHQgIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyJCQxW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHtcblx0ICB9XG5cblx0ICBpZiAoZSA9PT0gMCkge1xuXHQgICAgZSA9IDEgLSBlQmlhcztcblx0ICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcblx0ICAgIHJldHVybiBtID8gTmFOIDogKHMgPyAtMSA6IDEpICogSW5maW5pdHk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbik7XG5cdCAgICBlID0gZSAtIGVCaWFzO1xuXHQgIH1cblxuXHQgIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pO1xuXHR9XG5cblx0ZnVuY3Rpb24gd3JpdGVJRUVFNzU0KGJ1ZmZlciQkMSwgdmFsdWUsIG9mZnNldCwgZW5kaWFuLCBtTGVuLCBuQnl0ZXMpIHtcblx0ICB2YXIgZSxcblx0ICAgICAgbSxcblx0ICAgICAgYyxcblx0ICAgICAgYkJFID0gZW5kaWFuID09PSAnYmlnJyxcblx0ICAgICAgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMSxcblx0ICAgICAgZU1heCA9ICgxIDw8IGVMZW4pIC0gMSxcblx0ICAgICAgZUJpYXMgPSBlTWF4ID4+IDEsXG5cdCAgICAgIHJ0ID0gbUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDAsXG5cdCAgICAgIGkgPSBiQkUgPyBuQnl0ZXMgLSAxIDogMCxcblx0ICAgICAgZCA9IGJCRSA/IC0xIDogMSxcblx0ICAgICAgcyA9IHZhbHVlIDwgMCB8fCB2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwID8gMSA6IDA7XG5cdCAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSk7XG5cblx0ICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuXHQgICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwO1xuXHQgICAgZSA9IGVNYXg7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKTtcblxuXHQgICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuXHQgICAgICBlLS07XG5cdCAgICAgIGMgKj0gMjtcblx0ICAgIH1cblxuXHQgICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG5cdCAgICAgIHZhbHVlICs9IHJ0IC8gYztcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKTtcblx0ICAgIH1cblxuXHQgICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG5cdCAgICAgIGUrKztcblx0ICAgICAgYyAvPSAyO1xuXHQgICAgfVxuXG5cdCAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcblx0ICAgICAgbSA9IDA7XG5cdCAgICAgIGUgPSBlTWF4O1xuXHQgICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuXHQgICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbik7XG5cdCAgICAgIGUgPSBlICsgZUJpYXM7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbik7XG5cdCAgICAgIGUgPSAwO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGlmIChpc05hTih2YWx1ZSkpIG0gPSAwO1xuXG5cdCAgd2hpbGUgKG1MZW4gPj0gOCkge1xuXHQgICAgYnVmZmVyJCQxW29mZnNldCArIGldID0gbSAmIDB4ZmY7XG5cdCAgICBpICs9IGQ7XG5cdCAgICBtIC89IDI1Njtcblx0ICAgIG1MZW4gLT0gODtcblx0ICB9XG5cblx0ICBlID0gZSA8PCBtTGVuIHwgbTtcblx0ICBpZiAoaXNOYU4odmFsdWUpKSBlICs9IDg7XG5cdCAgZUxlbiArPSBtTGVuO1xuXG5cdCAgd2hpbGUgKGVMZW4gPiAwKSB7XG5cdCAgICBidWZmZXIkJDFbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZjtcblx0ICAgIGkgKz0gZDtcblx0ICAgIGUgLz0gMjU2O1xuXHQgICAgZUxlbiAtPSA4O1xuXHQgIH1cblxuXHQgIGJ1ZmZlciQkMVtvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyODtcblx0fVxuXG5cdHZhciBmbG9hdF9wYXJzZXIgPSB7XG5cdCAgcmVhZElFRUU3NTQ6IHJlYWRJRUVFNzU0LFxuXHQgIHdyaXRlSUVFRTc1NDogd3JpdGVJRUVFNzU0XG5cdH07XG5cblx0ZnVuY3Rpb24gX3R5cGVvZiQzKG9iaikgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiQzID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YkMyA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mJDMob2JqKTsgfVxuXG5cdHZhciBCdWZmZXIkNSA9IGJ1ZmZlci5CdWZmZXI7XG5cdHZhciB3cml0ZUlFRUU3NTQkMSA9IGZsb2F0X3BhcnNlci53cml0ZUlFRUU3NTQ7XG5cdHZhciBub3JtYWxpemVkRnVuY3Rpb25TdHJpbmckMSA9IHV0aWxzLm5vcm1hbGl6ZWRGdW5jdGlvblN0cmluZztcblx0dmFyIHJlZ2V4cCQxID0gL1xceDAwLzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG5cblx0dmFyIGlnbm9yZUtleXMgPSBuZXcgU2V0KFsnJGRiJywgJyRyZWYnLCAnJGlkJywgJyRjbHVzdGVyVGltZSddKTsgLy8gVG8gZW5zdXJlIHRoYXQgMC40IG9mIG5vZGUgd29ya3MgY29ycmVjdGx5XG5cblx0dmFyIGlzRGF0ZSQxID0gZnVuY3Rpb24gaXNEYXRlKGQpIHtcblx0ICByZXR1cm4gX3R5cGVvZiQzKGQpID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcblx0fTtcblxuXHR2YXIgaXNSZWdFeHAkMSA9IGZ1bmN0aW9uIGlzUmVnRXhwKGQpIHtcblx0ICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGQpID09PSAnW29iamVjdCBSZWdFeHBdJztcblx0fTtcblxuXHRmdW5jdGlvbiBzZXJpYWxpemVTdHJpbmcoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgaXNBcnJheSkge1xuXHQgIC8vIEVuY29kZSBTdHJpbmcgdHlwZVxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGNvbnN0YW50cy5CU09OX0RBVEFfU1RSSU5HOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICBpbmRleCA9IGluZGV4ICsgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgKyAxO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCAtIDFdID0gMDsgLy8gV3JpdGUgdGhlIHN0cmluZ1xuXG5cdCAgdmFyIHNpemUgPSBidWZmZXIkJDEud3JpdGUodmFsdWUsIGluZGV4ICsgNCwgJ3V0ZjgnKTsgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIHN0cmluZyB0byBidWZmZXJcblxuXHQgIGJ1ZmZlciQkMVtpbmRleCArIDNdID0gc2l6ZSArIDEgPj4gMjQgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCArIDJdID0gc2l6ZSArIDEgPj4gMTYgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCArIDFdID0gc2l6ZSArIDEgPj4gOCAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4XSA9IHNpemUgKyAxICYgMHhmZjsgLy8gVXBkYXRlIGluZGV4XG5cblx0ICBpbmRleCA9IGluZGV4ICsgNCArIHNpemU7IC8vIFdyaXRlIHplcm9cblxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7XG5cdCAgcmV0dXJuIGluZGV4O1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplTnVtYmVyKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGlzQXJyYXkpIHtcblx0ICAvLyBXZSBoYXZlIGFuIGludGVnZXIgdmFsdWVcblx0ICBpZiAoTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlICYmIHZhbHVlID49IGNvbnN0YW50cy5KU19JTlRfTUlOICYmIHZhbHVlIDw9IGNvbnN0YW50cy5KU19JTlRfTUFYKSB7XG5cdCAgICAvLyBJZiB0aGUgdmFsdWUgZml0cyBpbiAzMiBiaXRzIGVuY29kZSBhcyBpbnQsIGlmIGl0IGZpdHMgaW4gYSBkb3VibGVcblx0ICAgIC8vIGVuY29kZSBpdCBhcyBhIGRvdWJsZSwgb3RoZXJ3aXNlIGxvbmdcblx0ICAgIGlmICh2YWx1ZSA+PSBjb25zdGFudHMuQlNPTl9JTlQzMl9NSU4gJiYgdmFsdWUgPD0gY29uc3RhbnRzLkJTT05fSU5UMzJfTUFYKSB7XG5cdCAgICAgIC8vIFNldCBpbnQgdHlwZSAzMiBiaXRzIG9yIGxlc3Ncblx0ICAgICAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9JTlQ7IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblx0ICAgICAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICAgICAgaW5kZXggPSBpbmRleCArIG51bWJlck9mV3JpdHRlbkJ5dGVzO1xuXHQgICAgICBidWZmZXIkJDFbaW5kZXgrK10gPSAwOyAvLyBXcml0ZSB0aGUgaW50IHZhbHVlXG5cblx0ICAgICAgYnVmZmVyJCQxW2luZGV4KytdID0gdmFsdWUgJiAweGZmO1xuXHQgICAgICBidWZmZXIkJDFbaW5kZXgrK10gPSB2YWx1ZSA+PiA4ICYgMHhmZjtcblx0ICAgICAgYnVmZmVyJCQxW2luZGV4KytdID0gdmFsdWUgPj4gMTYgJiAweGZmO1xuXHQgICAgICBidWZmZXIkJDFbaW5kZXgrK10gPSB2YWx1ZSA+PiAyNCAmIDB4ZmY7XG5cdCAgICB9IGVsc2UgaWYgKHZhbHVlID49IGNvbnN0YW50cy5KU19JTlRfTUlOICYmIHZhbHVlIDw9IGNvbnN0YW50cy5KU19JTlRfTUFYKSB7XG5cdCAgICAgIC8vIEVuY29kZSBhcyBkb3VibGVcblx0ICAgICAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9OVU1CRVI7IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblx0ICAgICAgdmFyIF9udW1iZXJPZldyaXR0ZW5CeXRlcyA9ICFpc0FycmF5ID8gYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICd1dGY4JykgOiBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ2FzY2lpJyk7IC8vIEVuY29kZSB0aGUgbmFtZVxuXG5cblx0ICAgICAgaW5kZXggPSBpbmRleCArIF9udW1iZXJPZldyaXR0ZW5CeXRlcztcblx0ICAgICAgYnVmZmVyJCQxW2luZGV4KytdID0gMDsgLy8gV3JpdGUgZmxvYXRcblxuXHQgICAgICB3cml0ZUlFRUU3NTQkMShidWZmZXIkJDEsIHZhbHVlLCBpbmRleCwgJ2xpdHRsZScsIDUyLCA4KTsgLy8gQWp1c3QgaW5kZXhcblxuXHQgICAgICBpbmRleCA9IGluZGV4ICsgODtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIC8vIFNldCBsb25nIHR5cGVcblx0ICAgICAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9MT05HOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgICAgIHZhciBfbnVtYmVyT2ZXcml0dGVuQnl0ZXMyID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblxuXHQgICAgICBpbmRleCA9IGluZGV4ICsgX251bWJlck9mV3JpdHRlbkJ5dGVzMjtcblx0ICAgICAgYnVmZmVyJCQxW2luZGV4KytdID0gMDtcblx0ICAgICAgdmFyIGxvbmdWYWwgPSBsb25nXzEuZnJvbU51bWJlcih2YWx1ZSk7XG5cdCAgICAgIHZhciBsb3dCaXRzID0gbG9uZ1ZhbC5nZXRMb3dCaXRzKCk7XG5cdCAgICAgIHZhciBoaWdoQml0cyA9IGxvbmdWYWwuZ2V0SGlnaEJpdHMoKTsgLy8gRW5jb2RlIGxvdyBiaXRzXG5cblx0ICAgICAgYnVmZmVyJCQxW2luZGV4KytdID0gbG93Qml0cyAmIDB4ZmY7XG5cdCAgICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGxvd0JpdHMgPj4gOCAmIDB4ZmY7XG5cdCAgICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGxvd0JpdHMgPj4gMTYgJiAweGZmO1xuXHQgICAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBsb3dCaXRzID4+IDI0ICYgMHhmZjsgLy8gRW5jb2RlIGhpZ2ggYml0c1xuXG5cdCAgICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGhpZ2hCaXRzICYgMHhmZjtcblx0ICAgICAgYnVmZmVyJCQxW2luZGV4KytdID0gaGlnaEJpdHMgPj4gOCAmIDB4ZmY7XG5cdCAgICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGhpZ2hCaXRzID4+IDE2ICYgMHhmZjtcblx0ICAgICAgYnVmZmVyJCQxW2luZGV4KytdID0gaGlnaEJpdHMgPj4gMjQgJiAweGZmO1xuXHQgICAgfVxuXHQgIH0gZWxzZSB7XG5cdCAgICAvLyBFbmNvZGUgYXMgZG91YmxlXG5cdCAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX05VTUJFUjsgLy8gTnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXNcblxuXHQgICAgdmFyIF9udW1iZXJPZldyaXR0ZW5CeXRlczMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXG5cdCAgICBpbmRleCA9IGluZGV4ICsgX251bWJlck9mV3JpdHRlbkJ5dGVzMztcblx0ICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7IC8vIFdyaXRlIGZsb2F0XG5cblx0ICAgIHdyaXRlSUVFRTc1NCQxKGJ1ZmZlciQkMSwgdmFsdWUsIGluZGV4LCAnbGl0dGxlJywgNTIsIDgpOyAvLyBBanVzdCBpbmRleFxuXG5cdCAgICBpbmRleCA9IGluZGV4ICsgODtcblx0ICB9XG5cblx0ICByZXR1cm4gaW5kZXg7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVOdWxsKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGlzQXJyYXkpIHtcblx0ICAvLyBTZXQgbG9uZyB0eXBlXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9OVUxMOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICBpbmRleCA9IGluZGV4ICsgbnVtYmVyT2ZXcml0dGVuQnl0ZXM7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMDtcblx0ICByZXR1cm4gaW5kZXg7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVCb29sZWFuKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGlzQXJyYXkpIHtcblx0ICAvLyBXcml0ZSB0aGUgdHlwZVxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGNvbnN0YW50cy5CU09OX0RBVEFfQk9PTEVBTjsgLy8gTnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXNcblxuXHQgIHZhciBudW1iZXJPZldyaXR0ZW5CeXRlcyA9ICFpc0FycmF5ID8gYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICd1dGY4JykgOiBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ2FzY2lpJyk7IC8vIEVuY29kZSB0aGUgbmFtZVxuXG5cdCAgaW5kZXggPSBpbmRleCArIG51bWJlck9mV3JpdHRlbkJ5dGVzO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7IC8vIEVuY29kZSB0aGUgYm9vbGVhbiB2YWx1ZVxuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gdmFsdWUgPyAxIDogMDtcblx0ICByZXR1cm4gaW5kZXg7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVEYXRlKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGlzQXJyYXkpIHtcblx0ICAvLyBXcml0ZSB0aGUgdHlwZVxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGNvbnN0YW50cy5CU09OX0RBVEFfREFURTsgLy8gTnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXNcblxuXHQgIHZhciBudW1iZXJPZldyaXR0ZW5CeXRlcyA9ICFpc0FycmF5ID8gYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICd1dGY4JykgOiBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ2FzY2lpJyk7IC8vIEVuY29kZSB0aGUgbmFtZVxuXG5cdCAgaW5kZXggPSBpbmRleCArIG51bWJlck9mV3JpdHRlbkJ5dGVzO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7IC8vIFdyaXRlIHRoZSBkYXRlXG5cblx0ICB2YXIgZGF0ZUluTWlsaXMgPSBsb25nXzEuZnJvbU51bWJlcih2YWx1ZS5nZXRUaW1lKCkpO1xuXHQgIHZhciBsb3dCaXRzID0gZGF0ZUluTWlsaXMuZ2V0TG93Qml0cygpO1xuXHQgIHZhciBoaWdoQml0cyA9IGRhdGVJbk1pbGlzLmdldEhpZ2hCaXRzKCk7IC8vIEVuY29kZSBsb3cgYml0c1xuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gbG93Qml0cyAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gbG93Qml0cyA+PiA4ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBsb3dCaXRzID4+IDE2ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBsb3dCaXRzID4+IDI0ICYgMHhmZjsgLy8gRW5jb2RlIGhpZ2ggYml0c1xuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gaGlnaEJpdHMgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGhpZ2hCaXRzID4+IDggJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGhpZ2hCaXRzID4+IDE2ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBoaWdoQml0cyA+PiAyNCAmIDB4ZmY7XG5cdCAgcmV0dXJuIGluZGV4O1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplUmVnRXhwKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGlzQXJyYXkpIHtcblx0ICAvLyBXcml0ZSB0aGUgdHlwZVxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGNvbnN0YW50cy5CU09OX0RBVEFfUkVHRVhQOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICBpbmRleCA9IGluZGV4ICsgbnVtYmVyT2ZXcml0dGVuQnl0ZXM7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMDtcblxuXHQgIGlmICh2YWx1ZS5zb3VyY2UgJiYgdmFsdWUuc291cmNlLm1hdGNoKHJlZ2V4cCQxKSAhPSBudWxsKSB7XG5cdCAgICB0aHJvdyBFcnJvcigndmFsdWUgJyArIHZhbHVlLnNvdXJjZSArICcgbXVzdCBub3QgY29udGFpbiBudWxsIGJ5dGVzJyk7XG5cdCAgfSAvLyBBZGp1c3QgdGhlIGluZGV4XG5cblxuXHQgIGluZGV4ID0gaW5kZXggKyBidWZmZXIkJDEud3JpdGUodmFsdWUuc291cmNlLCBpbmRleCwgJ3V0ZjgnKTsgLy8gV3JpdGUgemVyb1xuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMHgwMDsgLy8gV3JpdGUgdGhlIHBhcmFtZXRlcnNcblxuXHQgIGlmICh2YWx1ZS5pZ25vcmVDYXNlKSBidWZmZXIkJDFbaW5kZXgrK10gPSAweDY5OyAvLyBpXG5cblx0ICBpZiAodmFsdWUuZ2xvYmFsKSBidWZmZXIkJDFbaW5kZXgrK10gPSAweDczOyAvLyBzXG5cblx0ICBpZiAodmFsdWUubXVsdGlsaW5lKSBidWZmZXIkJDFbaW5kZXgrK10gPSAweDZkOyAvLyBtXG5cdCAgLy8gQWRkIGVuZGluZyB6ZXJvXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAweDAwO1xuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZUJTT05SZWdFeHAoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgaXNBcnJheSkge1xuXHQgIC8vIFdyaXRlIHRoZSB0eXBlXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9SRUdFWFA7IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblx0ICB2YXIgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXHQgIGluZGV4ID0gaW5kZXggKyBudW1iZXJPZldyaXR0ZW5CeXRlcztcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAwOyAvLyBDaGVjayB0aGUgcGF0dGVybiBmb3IgMCBieXRlc1xuXG5cdCAgaWYgKHZhbHVlLnBhdHRlcm4ubWF0Y2gocmVnZXhwJDEpICE9IG51bGwpIHtcblx0ICAgIC8vIFRoZSBCU09OIHNwZWMgZG9lc24ndCBhbGxvdyBrZXlzIHdpdGggbnVsbCBieXRlcyBiZWNhdXNlIGtleXMgYXJlXG5cdCAgICAvLyBudWxsLXRlcm1pbmF0ZWQuXG5cdCAgICB0aHJvdyBFcnJvcigncGF0dGVybiAnICsgdmFsdWUucGF0dGVybiArICcgbXVzdCBub3QgY29udGFpbiBudWxsIGJ5dGVzJyk7XG5cdCAgfSAvLyBBZGp1c3QgdGhlIGluZGV4XG5cblxuXHQgIGluZGV4ID0gaW5kZXggKyBidWZmZXIkJDEud3JpdGUodmFsdWUucGF0dGVybiwgaW5kZXgsICd1dGY4Jyk7IC8vIFdyaXRlIHplcm9cblxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDB4MDA7IC8vIFdyaXRlIHRoZSBvcHRpb25zXG5cblx0ICBpbmRleCA9IGluZGV4ICsgYnVmZmVyJCQxLndyaXRlKHZhbHVlLm9wdGlvbnMuc3BsaXQoJycpLnNvcnQoKS5qb2luKCcnKSwgaW5kZXgsICd1dGY4Jyk7IC8vIEFkZCBlbmRpbmcgemVyb1xuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMHgwMDtcblx0ICByZXR1cm4gaW5kZXg7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVNaW5NYXgoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgaXNBcnJheSkge1xuXHQgIC8vIFdyaXRlIHRoZSB0eXBlIG9mIGVpdGhlciBtaW4gb3IgbWF4IGtleVxuXHQgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuXHQgICAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9OVUxMO1xuXHQgIH0gZWxzZSBpZiAodmFsdWUuX2Jzb250eXBlID09PSAnTWluS2V5Jykge1xuXHQgICAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9NSU5fS0VZO1xuXHQgIH0gZWxzZSB7XG5cdCAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX01BWF9LRVk7XG5cdCAgfSAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cblx0ICB2YXIgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXHQgIGluZGV4ID0gaW5kZXggKyBudW1iZXJPZldyaXR0ZW5CeXRlcztcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAwO1xuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZU9iamVjdElkKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGlzQXJyYXkpIHtcblx0ICAvLyBXcml0ZSB0aGUgdHlwZVxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGNvbnN0YW50cy5CU09OX0RBVEFfT0lEOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICBpbmRleCA9IGluZGV4ICsgbnVtYmVyT2ZXcml0dGVuQnl0ZXM7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMDsgLy8gV3JpdGUgdGhlIG9iamVjdElkIGludG8gdGhlIHNoYXJlZCBidWZmZXJcblxuXHQgIGlmICh0eXBlb2YgdmFsdWUuaWQgPT09ICdzdHJpbmcnKSB7XG5cdCAgICBidWZmZXIkJDEud3JpdGUodmFsdWUuaWQsIGluZGV4LCAnYmluYXJ5Jyk7XG5cdCAgfSBlbHNlIGlmICh2YWx1ZS5pZCAmJiB2YWx1ZS5pZC5jb3B5KSB7XG5cdCAgICB2YWx1ZS5pZC5jb3B5KGJ1ZmZlciQkMSwgaW5kZXgsIDAsIDEyKTtcblx0ICB9IGVsc2Uge1xuXHQgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb2JqZWN0IFsnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpICsgJ10gaXMgbm90IGEgdmFsaWQgT2JqZWN0SWQnKTtcblx0ICB9IC8vIEFqdXN0IGluZGV4XG5cblxuXHQgIHJldHVybiBpbmRleCArIDEyO1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplQnVmZmVyKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGlzQXJyYXkpIHtcblx0ICAvLyBXcml0ZSB0aGUgdHlwZVxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGNvbnN0YW50cy5CU09OX0RBVEFfQklOQVJZOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICBpbmRleCA9IGluZGV4ICsgbnVtYmVyT2ZXcml0dGVuQnl0ZXM7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMDsgLy8gR2V0IHNpemUgb2YgdGhlIGJ1ZmZlciAoY3VycmVudCB3cml0ZSBwb2ludClcblxuXHQgIHZhciBzaXplID0gdmFsdWUubGVuZ3RoOyAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIHRvIGJ1ZmZlclxuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gc2l6ZSAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gc2l6ZSA+PiA4ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBzaXplID4+IDE2ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBzaXplID4+IDI0ICYgMHhmZjsgLy8gV3JpdGUgdGhlIGRlZmF1bHQgc3VidHlwZVxuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVDsgLy8gQ29weSB0aGUgY29udGVudCBmb3JtIHRoZSBiaW5hcnkgZmllbGQgdG8gdGhlIGJ1ZmZlclxuXG5cdCAgdmFsdWUuY29weShidWZmZXIkJDEsIGluZGV4LCAwLCBzaXplKTsgLy8gQWRqdXN0IHRoZSBpbmRleFxuXG5cdCAgaW5kZXggPSBpbmRleCArIHNpemU7XG5cdCAgcmV0dXJuIGluZGV4O1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplT2JqZWN0KGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGNoZWNrS2V5cywgZGVwdGgsIHNlcmlhbGl6ZUZ1bmN0aW9ucywgaWdub3JlVW5kZWZpbmVkLCBpc0FycmF5LCBwYXRoKSB7XG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG5cdCAgICBpZiAocGF0aFtpXSA9PT0gdmFsdWUpIHRocm93IG5ldyBFcnJvcignY3ljbGljIGRlcGVuZGVuY3kgZGV0ZWN0ZWQnKTtcblx0ICB9IC8vIFB1c2ggdmFsdWUgdG8gc3RhY2tcblxuXG5cdCAgcGF0aC5wdXNoKHZhbHVlKTsgLy8gV3JpdGUgdGhlIHR5cGVcblxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gY29uc3RhbnRzLkJTT05fREFUQV9BUlJBWSA6IGNvbnN0YW50cy5CU09OX0RBVEFfT0JKRUNUOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICBpbmRleCA9IGluZGV4ICsgbnVtYmVyT2ZXcml0dGVuQnl0ZXM7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMDtcblx0ICB2YXIgZW5kSW5kZXggPSBzZXJpYWxpemVJbnRvKGJ1ZmZlciQkMSwgdmFsdWUsIGNoZWNrS2V5cywgaW5kZXgsIGRlcHRoICsgMSwgc2VyaWFsaXplRnVuY3Rpb25zLCBpZ25vcmVVbmRlZmluZWQsIHBhdGgpOyAvLyBQb3Agc3RhY2tcblxuXHQgIHBhdGgucG9wKCk7XG5cdCAgcmV0dXJuIGVuZEluZGV4O1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplRGVjaW1hbDEyOChidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCBpc0FycmF5KSB7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9ERUNJTUFMMTI4OyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICBpbmRleCA9IGluZGV4ICsgbnVtYmVyT2ZXcml0dGVuQnl0ZXM7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMDsgLy8gV3JpdGUgdGhlIGRhdGEgZnJvbSB0aGUgdmFsdWVcblxuXHQgIHZhbHVlLmJ5dGVzLmNvcHkoYnVmZmVyJCQxLCBpbmRleCwgMCwgMTYpO1xuXHQgIHJldHVybiBpbmRleCArIDE2O1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplTG9uZyhidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCBpc0FycmF5KSB7XG5cdCAgLy8gV3JpdGUgdGhlIHR5cGVcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSB2YWx1ZS5fYnNvbnR5cGUgPT09ICdMb25nJyA/IGNvbnN0YW50cy5CU09OX0RBVEFfTE9ORyA6IGNvbnN0YW50cy5CU09OX0RBVEFfVElNRVNUQU1QOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICBpbmRleCA9IGluZGV4ICsgbnVtYmVyT2ZXcml0dGVuQnl0ZXM7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMDsgLy8gV3JpdGUgdGhlIGRhdGVcblxuXHQgIHZhciBsb3dCaXRzID0gdmFsdWUuZ2V0TG93Qml0cygpO1xuXHQgIHZhciBoaWdoQml0cyA9IHZhbHVlLmdldEhpZ2hCaXRzKCk7IC8vIEVuY29kZSBsb3cgYml0c1xuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gbG93Qml0cyAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gbG93Qml0cyA+PiA4ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBsb3dCaXRzID4+IDE2ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBsb3dCaXRzID4+IDI0ICYgMHhmZjsgLy8gRW5jb2RlIGhpZ2ggYml0c1xuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gaGlnaEJpdHMgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGhpZ2hCaXRzID4+IDggJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGhpZ2hCaXRzID4+IDE2ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBoaWdoQml0cyA+PiAyNCAmIDB4ZmY7XG5cdCAgcmV0dXJuIGluZGV4O1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplSW50MzIoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgaXNBcnJheSkge1xuXHQgIC8vIFNldCBpbnQgdHlwZSAzMiBiaXRzIG9yIGxlc3Ncblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX0lOVDsgLy8gTnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXNcblxuXHQgIHZhciBudW1iZXJPZldyaXR0ZW5CeXRlcyA9ICFpc0FycmF5ID8gYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICd1dGY4JykgOiBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ2FzY2lpJyk7IC8vIEVuY29kZSB0aGUgbmFtZVxuXG5cdCAgaW5kZXggPSBpbmRleCArIG51bWJlck9mV3JpdHRlbkJ5dGVzO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7IC8vIFdyaXRlIHRoZSBpbnQgdmFsdWVcblxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IHZhbHVlICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSB2YWx1ZSA+PiA4ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSB2YWx1ZSA+PiAxNiAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gdmFsdWUgPj4gMjQgJiAweGZmO1xuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZURvdWJsZShidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCBpc0FycmF5KSB7XG5cdCAgLy8gRW5jb2RlIGFzIGRvdWJsZVxuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGNvbnN0YW50cy5CU09OX0RBVEFfTlVNQkVSOyAvLyBOdW1iZXIgb2Ygd3JpdHRlbiBieXRlc1xuXG5cdCAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICBpbmRleCA9IGluZGV4ICsgbnVtYmVyT2ZXcml0dGVuQnl0ZXM7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMDsgLy8gV3JpdGUgZmxvYXRcblxuXHQgIHdyaXRlSUVFRTc1NCQxKGJ1ZmZlciQkMSwgdmFsdWUudmFsdWUsIGluZGV4LCAnbGl0dGxlJywgNTIsIDgpOyAvLyBBZGp1c3QgaW5kZXhcblxuXHQgIGluZGV4ID0gaW5kZXggKyA4O1xuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZUZ1bmN0aW9uKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGNoZWNrS2V5cywgZGVwdGgsIGlzQXJyYXkpIHtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX0NPREU7IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblx0ICB2YXIgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXHQgIGluZGV4ID0gaW5kZXggKyBudW1iZXJPZldyaXR0ZW5CeXRlcztcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAwOyAvLyBGdW5jdGlvbiBzdHJpbmdcblxuXHQgIHZhciBmdW5jdGlvblN0cmluZyA9IG5vcm1hbGl6ZWRGdW5jdGlvblN0cmluZyQxKHZhbHVlKTsgLy8gV3JpdGUgdGhlIHN0cmluZ1xuXG5cdCAgdmFyIHNpemUgPSBidWZmZXIkJDEud3JpdGUoZnVuY3Rpb25TdHJpbmcsIGluZGV4ICsgNCwgJ3V0ZjgnKSArIDE7IC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgdG8gYnVmZmVyXG5cblx0ICBidWZmZXIkJDFbaW5kZXhdID0gc2l6ZSAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4ICsgMV0gPSBzaXplID4+IDggJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCArIDJdID0gc2l6ZSA+PiAxNiAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4ICsgM10gPSBzaXplID4+IDI0ICYgMHhmZjsgLy8gVXBkYXRlIGluZGV4XG5cblx0ICBpbmRleCA9IGluZGV4ICsgNCArIHNpemUgLSAxOyAvLyBXcml0ZSB6ZXJvXG5cblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAwO1xuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZUNvZGUoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgY2hlY2tLZXlzLCBkZXB0aCwgc2VyaWFsaXplRnVuY3Rpb25zLCBpZ25vcmVVbmRlZmluZWQsIGlzQXJyYXkpIHtcblx0ICBpZiAodmFsdWUuc2NvcGUgJiYgX3R5cGVvZiQzKHZhbHVlLnNjb3BlKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgIC8vIFdyaXRlIHRoZSB0eXBlXG5cdCAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX0NPREVfV19TQ09QRTsgLy8gTnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXNcblxuXHQgICAgdmFyIG51bWJlck9mV3JpdHRlbkJ5dGVzID0gIWlzQXJyYXkgPyBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ3V0ZjgnKSA6IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAnYXNjaWknKTsgLy8gRW5jb2RlIHRoZSBuYW1lXG5cblx0ICAgIGluZGV4ID0gaW5kZXggKyBudW1iZXJPZldyaXR0ZW5CeXRlcztcblx0ICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7IC8vIFN0YXJ0aW5nIGluZGV4XG5cblx0ICAgIHZhciBzdGFydEluZGV4ID0gaW5kZXg7IC8vIFNlcmlhbGl6ZSB0aGUgZnVuY3Rpb25cblx0ICAgIC8vIEdldCB0aGUgZnVuY3Rpb24gc3RyaW5nXG5cblx0ICAgIHZhciBmdW5jdGlvblN0cmluZyA9IHR5cGVvZiB2YWx1ZS5jb2RlID09PSAnc3RyaW5nJyA/IHZhbHVlLmNvZGUgOiB2YWx1ZS5jb2RlLnRvU3RyaW5nKCk7IC8vIEluZGV4IGFkanVzdG1lbnRcblxuXHQgICAgaW5kZXggPSBpbmRleCArIDQ7IC8vIFdyaXRlIHN0cmluZyBpbnRvIGJ1ZmZlclxuXG5cdCAgICB2YXIgY29kZVNpemUgPSBidWZmZXIkJDEud3JpdGUoZnVuY3Rpb25TdHJpbmcsIGluZGV4ICsgNCwgJ3V0ZjgnKSArIDE7IC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgdG8gYnVmZmVyXG5cblx0ICAgIGJ1ZmZlciQkMVtpbmRleF0gPSBjb2RlU2l6ZSAmIDB4ZmY7XG5cdCAgICBidWZmZXIkJDFbaW5kZXggKyAxXSA9IGNvZGVTaXplID4+IDggJiAweGZmO1xuXHQgICAgYnVmZmVyJCQxW2luZGV4ICsgMl0gPSBjb2RlU2l6ZSA+PiAxNiAmIDB4ZmY7XG5cdCAgICBidWZmZXIkJDFbaW5kZXggKyAzXSA9IGNvZGVTaXplID4+IDI0ICYgMHhmZjsgLy8gV3JpdGUgZW5kIDBcblxuXHQgICAgYnVmZmVyJCQxW2luZGV4ICsgNCArIGNvZGVTaXplIC0gMV0gPSAwOyAvLyBXcml0ZSB0aGVcblxuXHQgICAgaW5kZXggPSBpbmRleCArIGNvZGVTaXplICsgNDsgLy9cblx0ICAgIC8vIFNlcmlhbGl6ZSB0aGUgc2NvcGUgdmFsdWVcblxuXHQgICAgdmFyIGVuZEluZGV4ID0gc2VyaWFsaXplSW50byhidWZmZXIkJDEsIHZhbHVlLnNjb3BlLCBjaGVja0tleXMsIGluZGV4LCBkZXB0aCArIDEsIHNlcmlhbGl6ZUZ1bmN0aW9ucywgaWdub3JlVW5kZWZpbmVkKTtcblx0ICAgIGluZGV4ID0gZW5kSW5kZXggLSAxOyAvLyBXcml0IHRoZSB0b3RhbFxuXG5cdCAgICB2YXIgdG90YWxTaXplID0gZW5kSW5kZXggLSBzdGFydEluZGV4OyAvLyBXcml0ZSB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgb2JqZWN0XG5cblx0ICAgIGJ1ZmZlciQkMVtzdGFydEluZGV4KytdID0gdG90YWxTaXplICYgMHhmZjtcblx0ICAgIGJ1ZmZlciQkMVtzdGFydEluZGV4KytdID0gdG90YWxTaXplID4+IDggJiAweGZmO1xuXHQgICAgYnVmZmVyJCQxW3N0YXJ0SW5kZXgrK10gPSB0b3RhbFNpemUgPj4gMTYgJiAweGZmO1xuXHQgICAgYnVmZmVyJCQxW3N0YXJ0SW5kZXgrK10gPSB0b3RhbFNpemUgPj4gMjQgJiAweGZmOyAvLyBXcml0ZSB0cmFpbGluZyB6ZXJvXG5cblx0ICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IGNvbnN0YW50cy5CU09OX0RBVEFfQ09ERTsgLy8gTnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXNcblxuXHQgICAgdmFyIF9udW1iZXJPZldyaXR0ZW5CeXRlczQgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXG5cdCAgICBpbmRleCA9IGluZGV4ICsgX251bWJlck9mV3JpdHRlbkJ5dGVzNDtcblx0ICAgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7IC8vIEZ1bmN0aW9uIHN0cmluZ1xuXG5cdCAgICB2YXIgX2Z1bmN0aW9uU3RyaW5nID0gdmFsdWUuY29kZS50b1N0cmluZygpOyAvLyBXcml0ZSB0aGUgc3RyaW5nXG5cblxuXHQgICAgdmFyIHNpemUgPSBidWZmZXIkJDEud3JpdGUoX2Z1bmN0aW9uU3RyaW5nLCBpbmRleCArIDQsICd1dGY4JykgKyAxOyAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIHRvIGJ1ZmZlclxuXG5cdCAgICBidWZmZXIkJDFbaW5kZXhdID0gc2l6ZSAmIDB4ZmY7XG5cdCAgICBidWZmZXIkJDFbaW5kZXggKyAxXSA9IHNpemUgPj4gOCAmIDB4ZmY7XG5cdCAgICBidWZmZXIkJDFbaW5kZXggKyAyXSA9IHNpemUgPj4gMTYgJiAweGZmO1xuXHQgICAgYnVmZmVyJCQxW2luZGV4ICsgM10gPSBzaXplID4+IDI0ICYgMHhmZjsgLy8gVXBkYXRlIGluZGV4XG5cblx0ICAgIGluZGV4ID0gaW5kZXggKyA0ICsgc2l6ZSAtIDE7IC8vIFdyaXRlIHplcm9cblxuXHQgICAgYnVmZmVyJCQxW2luZGV4KytdID0gMDtcblx0ICB9XG5cblx0ICByZXR1cm4gaW5kZXg7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVCaW5hcnkoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgaXNBcnJheSkge1xuXHQgIC8vIFdyaXRlIHRoZSB0eXBlXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gY29uc3RhbnRzLkJTT05fREFUQV9CSU5BUlk7IC8vIE51bWJlciBvZiB3cml0dGVuIGJ5dGVzXG5cblx0ICB2YXIgbnVtYmVyT2ZXcml0dGVuQnl0ZXMgPSAhaXNBcnJheSA/IGJ1ZmZlciQkMS53cml0ZShrZXksIGluZGV4LCAndXRmOCcpIDogYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICdhc2NpaScpOyAvLyBFbmNvZGUgdGhlIG5hbWVcblxuXHQgIGluZGV4ID0gaW5kZXggKyBudW1iZXJPZldyaXR0ZW5CeXRlcztcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSAwOyAvLyBFeHRyYWN0IHRoZSBidWZmZXJcblxuXHQgIHZhciBkYXRhID0gdmFsdWUudmFsdWUodHJ1ZSk7IC8vIENhbGN1bGF0ZSBzaXplXG5cblx0ICB2YXIgc2l6ZSA9IHZhbHVlLnBvc2l0aW9uOyAvLyBBZGQgdGhlIGRlcHJlY2F0ZWQgMDIgdHlwZSA0IGJ5dGVzIG9mIHNpemUgdG8gdG90YWxcblxuXHQgIGlmICh2YWx1ZS5zdWJfdHlwZSA9PT0gYmluYXJ5LlNVQlRZUEVfQllURV9BUlJBWSkgc2l6ZSA9IHNpemUgKyA0OyAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIHRvIGJ1ZmZlclxuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gc2l6ZSAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gc2l6ZSA+PiA4ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBzaXplID4+IDE2ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBzaXplID4+IDI0ICYgMHhmZjsgLy8gV3JpdGUgdGhlIHN1YnR5cGUgdG8gdGhlIGJ1ZmZlclxuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gdmFsdWUuc3ViX3R5cGU7IC8vIElmIHdlIGhhdmUgYmluYXJ5IHR5cGUgMiB0aGUgNCBmaXJzdCBieXRlcyBhcmUgdGhlIHNpemVcblxuXHQgIGlmICh2YWx1ZS5zdWJfdHlwZSA9PT0gYmluYXJ5LlNVQlRZUEVfQllURV9BUlJBWSkge1xuXHQgICAgc2l6ZSA9IHNpemUgLSA0O1xuXHQgICAgYnVmZmVyJCQxW2luZGV4KytdID0gc2l6ZSAmIDB4ZmY7XG5cdCAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBzaXplID4+IDggJiAweGZmO1xuXHQgICAgYnVmZmVyJCQxW2luZGV4KytdID0gc2l6ZSA+PiAxNiAmIDB4ZmY7XG5cdCAgICBidWZmZXIkJDFbaW5kZXgrK10gPSBzaXplID4+IDI0ICYgMHhmZjtcblx0ICB9IC8vIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBvYmplY3RcblxuXG5cdCAgZGF0YS5jb3B5KGJ1ZmZlciQkMSwgaW5kZXgsIDAsIHZhbHVlLnBvc2l0aW9uKTsgLy8gQWRqdXN0IHRoZSBpbmRleFxuXG5cdCAgaW5kZXggPSBpbmRleCArIHZhbHVlLnBvc2l0aW9uO1xuXHQgIHJldHVybiBpbmRleDtcblx0fVxuXG5cdGZ1bmN0aW9uIHNlcmlhbGl6ZVN5bWJvbChidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCBpc0FycmF5KSB7XG5cdCAgLy8gV3JpdGUgdGhlIHR5cGVcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX1NZTUJPTDsgLy8gTnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXNcblxuXHQgIHZhciBudW1iZXJPZldyaXR0ZW5CeXRlcyA9ICFpc0FycmF5ID8gYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICd1dGY4JykgOiBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ2FzY2lpJyk7IC8vIEVuY29kZSB0aGUgbmFtZVxuXG5cdCAgaW5kZXggPSBpbmRleCArIG51bWJlck9mV3JpdHRlbkJ5dGVzO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7IC8vIFdyaXRlIHRoZSBzdHJpbmdcblxuXHQgIHZhciBzaXplID0gYnVmZmVyJCQxLndyaXRlKHZhbHVlLnZhbHVlLCBpbmRleCArIDQsICd1dGY4JykgKyAxOyAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIHRvIGJ1ZmZlclxuXG5cdCAgYnVmZmVyJCQxW2luZGV4XSA9IHNpemUgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCArIDFdID0gc2l6ZSA+PiA4ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbaW5kZXggKyAyXSA9IHNpemUgPj4gMTYgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCArIDNdID0gc2l6ZSA+PiAyNCAmIDB4ZmY7IC8vIFVwZGF0ZSBpbmRleFxuXG5cdCAgaW5kZXggPSBpbmRleCArIDQgKyBzaXplIC0gMTsgLy8gV3JpdGUgemVyb1xuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMHgwMDtcblx0ICByZXR1cm4gaW5kZXg7XG5cdH1cblxuXHRmdW5jdGlvbiBzZXJpYWxpemVEQlJlZihidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCBkZXB0aCwgc2VyaWFsaXplRnVuY3Rpb25zLCBpc0FycmF5KSB7XG5cdCAgLy8gV3JpdGUgdGhlIHR5cGVcblx0ICBidWZmZXIkJDFbaW5kZXgrK10gPSBjb25zdGFudHMuQlNPTl9EQVRBX09CSkVDVDsgLy8gTnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXNcblxuXHQgIHZhciBudW1iZXJPZldyaXR0ZW5CeXRlcyA9ICFpc0FycmF5ID8gYnVmZmVyJCQxLndyaXRlKGtleSwgaW5kZXgsICd1dGY4JykgOiBidWZmZXIkJDEud3JpdGUoa2V5LCBpbmRleCwgJ2FzY2lpJyk7IC8vIEVuY29kZSB0aGUgbmFtZVxuXG5cdCAgaW5kZXggPSBpbmRleCArIG51bWJlck9mV3JpdHRlbkJ5dGVzO1xuXHQgIGJ1ZmZlciQkMVtpbmRleCsrXSA9IDA7XG5cdCAgdmFyIHN0YXJ0SW5kZXggPSBpbmRleDtcblx0ICB2YXIgZW5kSW5kZXg7XG5cdCAgdmFyIG91dHB1dCA9IHtcblx0ICAgICRyZWY6IHZhbHVlLmNvbGxlY3Rpb24gfHwgdmFsdWUubmFtZXNwYWNlLFxuXHQgICAgLy8gXCJuYW1lc3BhY2VcIiB3YXMgd2hhdCBsaWJyYXJ5IDEueCBjYWxsZWQgXCJjb2xsZWN0aW9uXCJcblx0ICAgICRpZDogdmFsdWUub2lkXG5cdCAgfTtcblx0ICBpZiAodmFsdWUuZGIgIT0gbnVsbCkgb3V0cHV0LiRkYiA9IHZhbHVlLmRiO1xuXHQgIG91dHB1dCA9IE9iamVjdC5hc3NpZ24ob3V0cHV0LCB2YWx1ZS5maWVsZHMpO1xuXHQgIGVuZEluZGV4ID0gc2VyaWFsaXplSW50byhidWZmZXIkJDEsIG91dHB1dCwgZmFsc2UsIGluZGV4LCBkZXB0aCArIDEsIHNlcmlhbGl6ZUZ1bmN0aW9ucyk7IC8vIENhbGN1bGF0ZSBvYmplY3Qgc2l6ZVxuXG5cdCAgdmFyIHNpemUgPSBlbmRJbmRleCAtIHN0YXJ0SW5kZXg7IC8vIFdyaXRlIHRoZSBzaXplXG5cblx0ICBidWZmZXIkJDFbc3RhcnRJbmRleCsrXSA9IHNpemUgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtzdGFydEluZGV4KytdID0gc2l6ZSA+PiA4ICYgMHhmZjtcblx0ICBidWZmZXIkJDFbc3RhcnRJbmRleCsrXSA9IHNpemUgPj4gMTYgJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtzdGFydEluZGV4KytdID0gc2l6ZSA+PiAyNCAmIDB4ZmY7IC8vIFNldCBpbmRleFxuXG5cdCAgcmV0dXJuIGVuZEluZGV4O1xuXHR9XG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplSW50byhidWZmZXIkJDEsIG9iamVjdCwgY2hlY2tLZXlzLCBzdGFydGluZ0luZGV4LCBkZXB0aCwgc2VyaWFsaXplRnVuY3Rpb25zLCBpZ25vcmVVbmRlZmluZWQsIHBhdGgpIHtcblx0ICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCB8fCAwO1xuXHQgIHBhdGggPSBwYXRoIHx8IFtdOyAvLyBQdXNoIHRoZSBvYmplY3QgdG8gdGhlIHBhdGhcblxuXHQgIHBhdGgucHVzaChvYmplY3QpOyAvLyBTdGFydCBwbGFjZSB0byBzZXJpYWxpemUgaW50b1xuXG5cdCAgdmFyIGluZGV4ID0gc3RhcnRpbmdJbmRleCArIDQ7IC8vIFNwZWNpYWwgY2FzZSBpc0FycmF5XG5cblx0ICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG5cdCAgICAvLyBHZXQgb2JqZWN0IGtleXNcblx0ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0Lmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIHZhciBrZXkgPSAnJyArIGk7XG5cdCAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtpXTsgLy8gSXMgdGhlcmUgYW4gb3ZlcnJpZGUgdmFsdWVcblxuXHQgICAgICBpZiAodmFsdWUgJiYgdmFsdWUudG9CU09OKSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS50b0JTT04gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RvQlNPTiBpcyBub3QgYSBmdW5jdGlvbicpO1xuXHQgICAgICAgIHZhbHVlID0gdmFsdWUudG9CU09OKCk7XG5cdCAgICAgIH1cblxuXHQgICAgICB2YXIgdHlwZSA9IF90eXBlb2YkMyh2YWx1ZSk7XG5cblx0ICAgICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVTdHJpbmcoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgdHJ1ZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZU51bWJlcihidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCB0cnVlKTtcblx0ICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYm9vbGVhbicpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZUJvb2xlYW4oYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgdHJ1ZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IGlzRGF0ZSQxKHZhbHVlKSkge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplRGF0ZShidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCB0cnVlKTtcblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVOdWxsKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIHRydWUpO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBudWxsKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVOdWxsKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIHRydWUpO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ09iamVjdElkJyB8fCB2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdPYmplY3RJRCcpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZU9iamVjdElkKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIHRydWUpO1xuXHQgICAgICB9IGVsc2UgaWYgKEJ1ZmZlciQ1LmlzQnVmZmVyKHZhbHVlKSkge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplQnVmZmVyKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIHRydWUpO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8IGlzUmVnRXhwJDEodmFsdWUpKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVSZWdFeHAoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgdHJ1ZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcgJiYgdmFsdWVbJ19ic29udHlwZSddID09IG51bGwpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZU9iamVjdChidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCBjaGVja0tleXMsIGRlcHRoLCBzZXJpYWxpemVGdW5jdGlvbnMsIGlnbm9yZVVuZGVmaW5lZCwgdHJ1ZSwgcGF0aCk7XG5cdCAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcgJiYgdmFsdWVbJ19ic29udHlwZSddID09PSAnRGVjaW1hbDEyOCcpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZURlY2ltYWwxMjgoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgdHJ1ZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWVbJ19ic29udHlwZSddID09PSAnTG9uZycgfHwgdmFsdWVbJ19ic29udHlwZSddID09PSAnVGltZXN0YW1wJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplTG9uZyhidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCB0cnVlKTtcblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdEb3VibGUnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVEb3VibGUoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgdHJ1ZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHNlcmlhbGl6ZUZ1bmN0aW9ucykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplRnVuY3Rpb24oYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgY2hlY2tLZXlzLCBkZXB0aCwgc2VyaWFsaXplRnVuY3Rpb25zLCB0cnVlKTtcblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdDb2RlJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplQ29kZShidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCBjaGVja0tleXMsIGRlcHRoLCBzZXJpYWxpemVGdW5jdGlvbnMsIGlnbm9yZVVuZGVmaW5lZCwgdHJ1ZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWVbJ19ic29udHlwZSddID09PSAnQmluYXJ5Jykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplQmluYXJ5KGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIHRydWUpO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ1N5bWJvbCcpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZVN5bWJvbChidWZmZXIkJDEsIGtleSwgdmFsdWUsIGluZGV4LCB0cnVlKTtcblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdEQlJlZicpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZURCUmVmKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIGRlcHRoLCBzZXJpYWxpemVGdW5jdGlvbnMsIHRydWUpO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ0JTT05SZWdFeHAnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVCU09OUmVnRXhwKGJ1ZmZlciQkMSwga2V5LCB2YWx1ZSwgaW5kZXgsIHRydWUpO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ0ludDMyJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplSW50MzIoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgdHJ1ZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWVbJ19ic29udHlwZSddID09PSAnTWluS2V5JyB8fCB2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdNYXhLZXknKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVNaW5NYXgoYnVmZmVyJCQxLCBrZXksIHZhbHVlLCBpbmRleCwgdHJ1ZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlWydfYnNvbnR5cGUnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbnJlY29nbml6ZWQgb3IgaW52YWxpZCBfYnNvbnR5cGU6ICcgKyB2YWx1ZVsnX2Jzb250eXBlJ10pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBtYXApIHtcblx0ICAgIHZhciBpdGVyYXRvciA9IG9iamVjdC5lbnRyaWVzKCk7XG5cdCAgICB2YXIgZG9uZSA9IGZhbHNlO1xuXG5cdCAgICB3aGlsZSAoIWRvbmUpIHtcblx0ICAgICAgLy8gVW5wYWNrIHRoZSBuZXh0IGVudHJ5XG5cdCAgICAgIHZhciBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTtcblx0ICAgICAgZG9uZSA9IGVudHJ5LmRvbmU7IC8vIEFyZSB3ZSBkb25lLCB0aGVuIHNraXAgYW5kIHRlcm1pbmF0ZVxuXG5cdCAgICAgIGlmIChkb25lKSBjb250aW51ZTsgLy8gR2V0IHRoZSBlbnRyeSB2YWx1ZXNcblxuXHQgICAgICB2YXIgX2tleSA9IGVudHJ5LnZhbHVlWzBdO1xuXHQgICAgICB2YXIgX3ZhbHVlID0gZW50cnkudmFsdWVbMV07IC8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZVxuXG5cdCAgICAgIHZhciBfdHlwZSA9IF90eXBlb2YkMyhfdmFsdWUpOyAvLyBDaGVjayB0aGUga2V5IGFuZCB0aHJvdyBlcnJvciBpZiBpdCdzIGlsbGVnYWxcblxuXG5cdCAgICAgIGlmICh0eXBlb2YgX2tleSA9PT0gJ3N0cmluZycgJiYgIWlnbm9yZUtleXMuaGFzKF9rZXkpKSB7XG5cdCAgICAgICAgaWYgKF9rZXkubWF0Y2gocmVnZXhwJDEpICE9IG51bGwpIHtcblx0ICAgICAgICAgIC8vIFRoZSBCU09OIHNwZWMgZG9lc24ndCBhbGxvdyBrZXlzIHdpdGggbnVsbCBieXRlcyBiZWNhdXNlIGtleXMgYXJlXG5cdCAgICAgICAgICAvLyBudWxsLXRlcm1pbmF0ZWQuXG5cdCAgICAgICAgICB0aHJvdyBFcnJvcigna2V5ICcgKyBfa2V5ICsgJyBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMnKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBpZiAoY2hlY2tLZXlzKSB7XG5cdCAgICAgICAgICBpZiAoJyQnID09PSBfa2V5WzBdKSB7XG5cdCAgICAgICAgICAgIHRocm93IEVycm9yKCdrZXkgJyArIF9rZXkgKyBcIiBtdXN0IG5vdCBzdGFydCB3aXRoICckJ1wiKTtcblx0ICAgICAgICAgIH0gZWxzZSBpZiAofl9rZXkuaW5kZXhPZignLicpKSB7XG5cdCAgICAgICAgICAgIHRocm93IEVycm9yKCdrZXkgJyArIF9rZXkgKyBcIiBtdXN0IG5vdCBjb250YWluICcuJ1wiKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH1cblxuXHQgICAgICBpZiAoX3R5cGUgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVTdHJpbmcoYnVmZmVyJCQxLCBfa2V5LCBfdmFsdWUsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdHlwZSA9PT0gJ251bWJlcicpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZU51bWJlcihidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF90eXBlID09PSAnYm9vbGVhbicpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZUJvb2xlYW4oYnVmZmVyJCQxLCBfa2V5LCBfdmFsdWUsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IGlzRGF0ZSQxKF92YWx1ZSkpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZURhdGUoYnVmZmVyJCQxLCBfa2V5LCBfdmFsdWUsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWUgPT09IG51bGwgfHwgX3ZhbHVlID09PSB1bmRlZmluZWQgJiYgaWdub3JlVW5kZWZpbmVkID09PSBmYWxzZSkge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplTnVsbChidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdPYmplY3RJZCcgfHwgX3ZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ09iamVjdElEJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplT2JqZWN0SWQoYnVmZmVyJCQxLCBfa2V5LCBfdmFsdWUsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChCdWZmZXIkNS5pc0J1ZmZlcihfdmFsdWUpKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVCdWZmZXIoYnVmZmVyJCQxLCBfa2V5LCBfdmFsdWUsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgfHwgaXNSZWdFeHAkMShfdmFsdWUpKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVSZWdFeHAoYnVmZmVyJCQxLCBfa2V5LCBfdmFsdWUsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdHlwZSA9PT0gJ29iamVjdCcgJiYgX3ZhbHVlWydfYnNvbnR5cGUnXSA9PSBudWxsKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVPYmplY3QoYnVmZmVyJCQxLCBfa2V5LCBfdmFsdWUsIGluZGV4LCBjaGVja0tleXMsIGRlcHRoLCBzZXJpYWxpemVGdW5jdGlvbnMsIGlnbm9yZVVuZGVmaW5lZCwgZmFsc2UsIHBhdGgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF90eXBlID09PSAnb2JqZWN0JyAmJiBfdmFsdWVbJ19ic29udHlwZSddID09PSAnRGVjaW1hbDEyOCcpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZURlY2ltYWwxMjgoYnVmZmVyJCQxLCBfa2V5LCBfdmFsdWUsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWVbJ19ic29udHlwZSddID09PSAnTG9uZycgfHwgX3ZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ1RpbWVzdGFtcCcpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZUxvbmcoYnVmZmVyJCQxLCBfa2V5LCBfdmFsdWUsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWVbJ19ic29udHlwZSddID09PSAnRG91YmxlJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplRG91YmxlKGJ1ZmZlciQkMSwgX2tleSwgX3ZhbHVlLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ0NvZGUnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVDb2RlKGJ1ZmZlciQkMSwgX2tleSwgX3ZhbHVlLCBpbmRleCwgY2hlY2tLZXlzLCBkZXB0aCwgc2VyaWFsaXplRnVuY3Rpb25zLCBpZ25vcmVVbmRlZmluZWQpO1xuXHQgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBfdmFsdWUgPT09ICdmdW5jdGlvbicgJiYgc2VyaWFsaXplRnVuY3Rpb25zKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVGdW5jdGlvbihidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgsIGNoZWNrS2V5cywgZGVwdGgsIHNlcmlhbGl6ZUZ1bmN0aW9ucyk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ0JpbmFyeScpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZUJpbmFyeShidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdTeW1ib2wnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVTeW1ib2woYnVmZmVyJCQxLCBfa2V5LCBfdmFsdWUsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWVbJ19ic29udHlwZSddID09PSAnREJSZWYnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVEQlJlZihidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgsIGRlcHRoLCBzZXJpYWxpemVGdW5jdGlvbnMpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdCU09OUmVnRXhwJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplQlNPTlJlZ0V4cChidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdJbnQzMicpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZUludDMyKGJ1ZmZlciQkMSwgX2tleSwgX3ZhbHVlLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ01pbktleScgfHwgX3ZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ01heEtleScpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZU1pbk1heChidWZmZXIkJDEsIF9rZXksIF92YWx1ZSwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBfdmFsdWVbJ19ic29udHlwZSddICE9PSAndW5kZWZpbmVkJykge1xuXHQgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1VucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJyArIF92YWx1ZVsnX2Jzb250eXBlJ10pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIC8vIERpZCB3ZSBwcm92aWRlIGEgY3VzdG9tIHNlcmlhbGl6YXRpb24gbWV0aG9kXG5cdCAgICBpZiAob2JqZWN0LnRvQlNPTikge1xuXHQgICAgICBpZiAodHlwZW9mIG9iamVjdC50b0JTT04gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RvQlNPTiBpcyBub3QgYSBmdW5jdGlvbicpO1xuXHQgICAgICBvYmplY3QgPSBvYmplY3QudG9CU09OKCk7XG5cdCAgICAgIGlmIChvYmplY3QgIT0gbnVsbCAmJiBfdHlwZW9mJDMob2JqZWN0KSAhPT0gJ29iamVjdCcpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RvQlNPTiBmdW5jdGlvbiBkaWQgbm90IHJldHVybiBhbiBvYmplY3QnKTtcblx0ICAgIH0gLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUga2V5c1xuXG5cblx0ICAgIGZvciAodmFyIF9rZXkyIGluIG9iamVjdCkge1xuXHQgICAgICB2YXIgX3ZhbHVlMiA9IG9iamVjdFtfa2V5Ml07IC8vIElzIHRoZXJlIGFuIG92ZXJyaWRlIHZhbHVlXG5cblx0ICAgICAgaWYgKF92YWx1ZTIgJiYgX3ZhbHVlMi50b0JTT04pIHtcblx0ICAgICAgICBpZiAodHlwZW9mIF92YWx1ZTIudG9CU09OICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCd0b0JTT04gaXMgbm90IGEgZnVuY3Rpb24nKTtcblx0ICAgICAgICBfdmFsdWUyID0gX3ZhbHVlMi50b0JTT04oKTtcblx0ICAgICAgfSAvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgdmFsdWVcblxuXG5cdCAgICAgIHZhciBfdHlwZTIgPSBfdHlwZW9mJDMoX3ZhbHVlMik7IC8vIENoZWNrIHRoZSBrZXkgYW5kIHRocm93IGVycm9yIGlmIGl0J3MgaWxsZWdhbFxuXG5cblx0ICAgICAgaWYgKHR5cGVvZiBfa2V5MiA9PT0gJ3N0cmluZycgJiYgIWlnbm9yZUtleXMuaGFzKF9rZXkyKSkge1xuXHQgICAgICAgIGlmIChfa2V5Mi5tYXRjaChyZWdleHAkMSkgIT0gbnVsbCkge1xuXHQgICAgICAgICAgLy8gVGhlIEJTT04gc3BlYyBkb2Vzbid0IGFsbG93IGtleXMgd2l0aCBudWxsIGJ5dGVzIGJlY2F1c2Uga2V5cyBhcmVcblx0ICAgICAgICAgIC8vIG51bGwtdGVybWluYXRlZC5cblx0ICAgICAgICAgIHRocm93IEVycm9yKCdrZXkgJyArIF9rZXkyICsgJyBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMnKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBpZiAoY2hlY2tLZXlzKSB7XG5cdCAgICAgICAgICBpZiAoJyQnID09PSBfa2V5MlswXSkge1xuXHQgICAgICAgICAgICB0aHJvdyBFcnJvcigna2V5ICcgKyBfa2V5MiArIFwiIG11c3Qgbm90IHN0YXJ0IHdpdGggJyQnXCIpO1xuXHQgICAgICAgICAgfSBlbHNlIGlmICh+X2tleTIuaW5kZXhPZignLicpKSB7XG5cdCAgICAgICAgICAgIHRocm93IEVycm9yKCdrZXkgJyArIF9rZXkyICsgXCIgbXVzdCBub3QgY29udGFpbiAnLidcIik7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cblx0ICAgICAgaWYgKF90eXBlMiA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZVN0cmluZyhidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3R5cGUyID09PSAnbnVtYmVyJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplTnVtYmVyKGJ1ZmZlciQkMSwgX2tleTIsIF92YWx1ZTIsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdHlwZTIgPT09ICdib29sZWFuJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplQm9vbGVhbihidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlMiBpbnN0YW5jZW9mIERhdGUgfHwgaXNEYXRlJDEoX3ZhbHVlMikpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZURhdGUoYnVmZmVyJCQxLCBfa2V5MiwgX3ZhbHVlMiwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZTIgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIGlmIChpZ25vcmVVbmRlZmluZWQgPT09IGZhbHNlKSBpbmRleCA9IHNlcmlhbGl6ZU51bGwoYnVmZmVyJCQxLCBfa2V5MiwgX3ZhbHVlMiwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZTIgPT09IG51bGwpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZU51bGwoYnVmZmVyJCQxLCBfa2V5MiwgX3ZhbHVlMiwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZTJbJ19ic29udHlwZSddID09PSAnT2JqZWN0SWQnIHx8IF92YWx1ZTJbJ19ic29udHlwZSddID09PSAnT2JqZWN0SUQnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVPYmplY3RJZChidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoQnVmZmVyJDUuaXNCdWZmZXIoX3ZhbHVlMikpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZUJ1ZmZlcihidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlMiBpbnN0YW5jZW9mIFJlZ0V4cCB8fCBpc1JlZ0V4cCQxKF92YWx1ZTIpKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVSZWdFeHAoYnVmZmVyJCQxLCBfa2V5MiwgX3ZhbHVlMiwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF90eXBlMiA9PT0gJ29iamVjdCcgJiYgX3ZhbHVlMlsnX2Jzb250eXBlJ10gPT0gbnVsbCkge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplT2JqZWN0KGJ1ZmZlciQkMSwgX2tleTIsIF92YWx1ZTIsIGluZGV4LCBjaGVja0tleXMsIGRlcHRoLCBzZXJpYWxpemVGdW5jdGlvbnMsIGlnbm9yZVVuZGVmaW5lZCwgZmFsc2UsIHBhdGgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF90eXBlMiA9PT0gJ29iamVjdCcgJiYgX3ZhbHVlMlsnX2Jzb250eXBlJ10gPT09ICdEZWNpbWFsMTI4Jykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplRGVjaW1hbDEyOChidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlMlsnX2Jzb250eXBlJ10gPT09ICdMb25nJyB8fCBfdmFsdWUyWydfYnNvbnR5cGUnXSA9PT0gJ1RpbWVzdGFtcCcpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZUxvbmcoYnVmZmVyJCQxLCBfa2V5MiwgX3ZhbHVlMiwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZTJbJ19ic29udHlwZSddID09PSAnRG91YmxlJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplRG91YmxlKGJ1ZmZlciQkMSwgX2tleTIsIF92YWx1ZTIsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWUyWydfYnNvbnR5cGUnXSA9PT0gJ0NvZGUnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVDb2RlKGJ1ZmZlciQkMSwgX2tleTIsIF92YWx1ZTIsIGluZGV4LCBjaGVja0tleXMsIGRlcHRoLCBzZXJpYWxpemVGdW5jdGlvbnMsIGlnbm9yZVVuZGVmaW5lZCk7XG5cdCAgICAgIH0gZWxzZSBpZiAodHlwZW9mIF92YWx1ZTIgPT09ICdmdW5jdGlvbicgJiYgc2VyaWFsaXplRnVuY3Rpb25zKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVGdW5jdGlvbihidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCwgY2hlY2tLZXlzLCBkZXB0aCwgc2VyaWFsaXplRnVuY3Rpb25zKTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWUyWydfYnNvbnR5cGUnXSA9PT0gJ0JpbmFyeScpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZUJpbmFyeShidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlMlsnX2Jzb250eXBlJ10gPT09ICdTeW1ib2wnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVTeW1ib2woYnVmZmVyJCQxLCBfa2V5MiwgX3ZhbHVlMiwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKF92YWx1ZTJbJ19ic29udHlwZSddID09PSAnREJSZWYnKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVEQlJlZihidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCwgZGVwdGgsIHNlcmlhbGl6ZUZ1bmN0aW9ucyk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlMlsnX2Jzb250eXBlJ10gPT09ICdCU09OUmVnRXhwJykge1xuXHQgICAgICAgIGluZGV4ID0gc2VyaWFsaXplQlNPTlJlZ0V4cChidWZmZXIkJDEsIF9rZXkyLCBfdmFsdWUyLCBpbmRleCk7XG5cdCAgICAgIH0gZWxzZSBpZiAoX3ZhbHVlMlsnX2Jzb250eXBlJ10gPT09ICdJbnQzMicpIHtcblx0ICAgICAgICBpbmRleCA9IHNlcmlhbGl6ZUludDMyKGJ1ZmZlciQkMSwgX2tleTIsIF92YWx1ZTIsIGluZGV4KTtcblx0ICAgICAgfSBlbHNlIGlmIChfdmFsdWUyWydfYnNvbnR5cGUnXSA9PT0gJ01pbktleScgfHwgX3ZhbHVlMlsnX2Jzb250eXBlJ10gPT09ICdNYXhLZXknKSB7XG5cdCAgICAgICAgaW5kZXggPSBzZXJpYWxpemVNaW5NYXgoYnVmZmVyJCQxLCBfa2V5MiwgX3ZhbHVlMiwgaW5kZXgpO1xuXHQgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBfdmFsdWUyWydfYnNvbnR5cGUnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbnJlY29nbml6ZWQgb3IgaW52YWxpZCBfYnNvbnR5cGU6ICcgKyBfdmFsdWUyWydfYnNvbnR5cGUnXSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9IC8vIFJlbW92ZSB0aGUgcGF0aFxuXG5cblx0ICBwYXRoLnBvcCgpOyAvLyBGaW5hbCBwYWRkaW5nIGJ5dGUgZm9yIG9iamVjdFxuXG5cdCAgYnVmZmVyJCQxW2luZGV4KytdID0gMHgwMDsgLy8gRmluYWwgc2l6ZVxuXG5cdCAgdmFyIHNpemUgPSBpbmRleCAtIHN0YXJ0aW5nSW5kZXg7IC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBvYmplY3RcblxuXHQgIGJ1ZmZlciQkMVtzdGFydGluZ0luZGV4KytdID0gc2l6ZSAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW3N0YXJ0aW5nSW5kZXgrK10gPSBzaXplID4+IDggJiAweGZmO1xuXHQgIGJ1ZmZlciQkMVtzdGFydGluZ0luZGV4KytdID0gc2l6ZSA+PiAxNiAmIDB4ZmY7XG5cdCAgYnVmZmVyJCQxW3N0YXJ0aW5nSW5kZXgrK10gPSBzaXplID4+IDI0ICYgMHhmZjtcblx0ICByZXR1cm4gaW5kZXg7XG5cdH1cblxuXHR2YXIgc2VyaWFsaXplciA9IHNlcmlhbGl6ZUludG87XG5cblx0ZnVuY3Rpb24gX3R5cGVvZiQ0KG9iaikgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiQ0ID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YkNCA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mJDQob2JqKTsgfVxuXG5cdHZhciBCdWZmZXIkNiA9IGJ1ZmZlci5CdWZmZXI7XG5cdHZhciBub3JtYWxpemVkRnVuY3Rpb25TdHJpbmckMiA9IHV0aWxzLm5vcm1hbGl6ZWRGdW5jdGlvblN0cmluZzsgLy8gVG8gZW5zdXJlIHRoYXQgMC40IG9mIG5vZGUgd29ya3MgY29ycmVjdGx5XG5cblx0ZnVuY3Rpb24gaXNEYXRlJDIoZCkge1xuXHQgIHJldHVybiBfdHlwZW9mJDQoZCkgPT09ICdvYmplY3QnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xuXHR9XG5cblx0ZnVuY3Rpb24gY2FsY3VsYXRlT2JqZWN0U2l6ZShvYmplY3QsIHNlcmlhbGl6ZUZ1bmN0aW9ucywgaWdub3JlVW5kZWZpbmVkKSB7XG5cdCAgdmFyIHRvdGFsTGVuZ3RoID0gNCArIDE7XG5cblx0ICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7IGkrKykge1xuXHQgICAgICB0b3RhbExlbmd0aCArPSBjYWxjdWxhdGVFbGVtZW50KGkudG9TdHJpbmcoKSwgb2JqZWN0W2ldLCBzZXJpYWxpemVGdW5jdGlvbnMsIHRydWUsIGlnbm9yZVVuZGVmaW5lZCk7XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIC8vIElmIHdlIGhhdmUgdG9CU09OIGRlZmluZWQsIG92ZXJyaWRlIHRoZSBjdXJyZW50IG9iamVjdFxuXHQgICAgaWYgKG9iamVjdC50b0JTT04pIHtcblx0ICAgICAgb2JqZWN0ID0gb2JqZWN0LnRvQlNPTigpO1xuXHQgICAgfSAvLyBDYWxjdWxhdGUgc2l6ZVxuXG5cblx0ICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcblx0ICAgICAgdG90YWxMZW5ndGggKz0gY2FsY3VsYXRlRWxlbWVudChrZXksIG9iamVjdFtrZXldLCBzZXJpYWxpemVGdW5jdGlvbnMsIGZhbHNlLCBpZ25vcmVVbmRlZmluZWQpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHJldHVybiB0b3RhbExlbmd0aDtcblx0fVxuXHQvKipcblx0ICogQGlnbm9yZVxuXHQgKiBAYXBpIHByaXZhdGVcblx0ICovXG5cblxuXHRmdW5jdGlvbiBjYWxjdWxhdGVFbGVtZW50KG5hbWUsIHZhbHVlLCBzZXJpYWxpemVGdW5jdGlvbnMsIGlzQXJyYXksIGlnbm9yZVVuZGVmaW5lZCkge1xuXHQgIC8vIElmIHdlIGhhdmUgdG9CU09OIGRlZmluZWQsIG92ZXJyaWRlIHRoZSBjdXJyZW50IG9iamVjdFxuXHQgIGlmICh2YWx1ZSAmJiB2YWx1ZS50b0JTT04pIHtcblx0ICAgIHZhbHVlID0gdmFsdWUudG9CU09OKCk7XG5cdCAgfVxuXG5cdCAgc3dpdGNoIChfdHlwZW9mJDQodmFsdWUpKSB7XG5cdCAgICBjYXNlICdzdHJpbmcnOlxuXHQgICAgICByZXR1cm4gMSArIEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgKyA0ICsgQnVmZmVyJDYuYnl0ZUxlbmd0aCh2YWx1ZSwgJ3V0ZjgnKSArIDE7XG5cblx0ICAgIGNhc2UgJ251bWJlcic6XG5cdCAgICAgIGlmIChNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWUgJiYgdmFsdWUgPj0gY29uc3RhbnRzLkpTX0lOVF9NSU4gJiYgdmFsdWUgPD0gY29uc3RhbnRzLkpTX0lOVF9NQVgpIHtcblx0ICAgICAgICBpZiAodmFsdWUgPj0gY29uc3RhbnRzLkJTT05fSU5UMzJfTUlOICYmIHZhbHVlIDw9IGNvbnN0YW50cy5CU09OX0lOVDMyX01BWCkge1xuXHQgICAgICAgICAgLy8gMzIgYml0XG5cdCAgICAgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArICg0ICsgMSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgKDggKyAxKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgLy8gNjQgYml0XG5cdCAgICAgICAgcmV0dXJuIChuYW1lICE9IG51bGwgPyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5hbWUsICd1dGY4JykgKyAxIDogMCkgKyAoOCArIDEpO1xuXHQgICAgICB9XG5cblx0ICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG5cdCAgICAgIGlmIChpc0FycmF5IHx8ICFpZ25vcmVVbmRlZmluZWQpIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgMTtcblx0ICAgICAgcmV0dXJuIDA7XG5cblx0ICAgIGNhc2UgJ2Jvb2xlYW4nOlxuXHQgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArICgxICsgMSk7XG5cblx0ICAgIGNhc2UgJ29iamVjdCc6XG5cdCAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ01pbktleScgfHwgdmFsdWVbJ19ic29udHlwZSddID09PSAnTWF4S2V5Jykge1xuXHQgICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgMTtcblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdPYmplY3RJZCcgfHwgdmFsdWVbJ19ic29udHlwZSddID09PSAnT2JqZWN0SUQnKSB7XG5cdCAgICAgICAgcmV0dXJuIChuYW1lICE9IG51bGwgPyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5hbWUsICd1dGY4JykgKyAxIDogMCkgKyAoMTIgKyAxKTtcblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHwgaXNEYXRlJDIodmFsdWUpKSB7XG5cdCAgICAgICAgcmV0dXJuIChuYW1lICE9IG51bGwgPyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5hbWUsICd1dGY4JykgKyAxIDogMCkgKyAoOCArIDEpO1xuXHQgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBCdWZmZXIkNiAhPT0gJ3VuZGVmaW5lZCcgJiYgQnVmZmVyJDYuaXNCdWZmZXIodmFsdWUpKSB7XG5cdCAgICAgICAgcmV0dXJuIChuYW1lICE9IG51bGwgPyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5hbWUsICd1dGY4JykgKyAxIDogMCkgKyAoMSArIDQgKyAxKSArIHZhbHVlLmxlbmd0aDtcblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdMb25nJyB8fCB2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdEb3VibGUnIHx8IHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ1RpbWVzdGFtcCcpIHtcblx0ICAgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArICg4ICsgMSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWVbJ19ic29udHlwZSddID09PSAnRGVjaW1hbDEyOCcpIHtcblx0ICAgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArICgxNiArIDEpO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlWydfYnNvbnR5cGUnXSA9PT0gJ0NvZGUnKSB7XG5cdCAgICAgICAgLy8gQ2FsY3VsYXRlIHNpemUgZGVwZW5kaW5nIG9uIHRoZSBhdmFpbGFiaWxpdHkgb2YgYSBzY29wZVxuXHQgICAgICAgIGlmICh2YWx1ZS5zY29wZSAhPSBudWxsICYmIE9iamVjdC5rZXlzKHZhbHVlLnNjb3BlKS5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArIDEgKyA0ICsgNCArIEJ1ZmZlciQ2LmJ5dGVMZW5ndGgodmFsdWUuY29kZS50b1N0cmluZygpLCAndXRmOCcpICsgMSArIGNhbGN1bGF0ZU9iamVjdFNpemUodmFsdWUuc2NvcGUsIHNlcmlhbGl6ZUZ1bmN0aW9ucywgaWdub3JlVW5kZWZpbmVkKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgcmV0dXJuIChuYW1lICE9IG51bGwgPyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5hbWUsICd1dGY4JykgKyAxIDogMCkgKyAxICsgNCArIEJ1ZmZlciQ2LmJ5dGVMZW5ndGgodmFsdWUuY29kZS50b1N0cmluZygpLCAndXRmOCcpICsgMTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWVbJ19ic29udHlwZSddID09PSAnQmluYXJ5Jykge1xuXHQgICAgICAgIC8vIENoZWNrIHdoYXQga2luZCBvZiBzdWJ0eXBlIHdlIGhhdmVcblx0ICAgICAgICBpZiAodmFsdWUuc3ViX3R5cGUgPT09IGJpbmFyeS5TVUJUWVBFX0JZVEVfQVJSQVkpIHtcblx0ICAgICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgKHZhbHVlLnBvc2l0aW9uICsgMSArIDQgKyAxICsgNCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgKHZhbHVlLnBvc2l0aW9uICsgMSArIDQgKyAxKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWVbJ19ic29udHlwZSddID09PSAnU3ltYm9sJykge1xuXHQgICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgQnVmZmVyJDYuYnl0ZUxlbmd0aCh2YWx1ZS52YWx1ZSwgJ3V0ZjgnKSArIDQgKyAxICsgMTtcblx0ICAgICAgfSBlbHNlIGlmICh2YWx1ZVsnX2Jzb250eXBlJ10gPT09ICdEQlJlZicpIHtcblx0ICAgICAgICAvLyBTZXQgdXAgY29ycmVjdCBvYmplY3QgZm9yIHNlcmlhbGl6YXRpb25cblx0ICAgICAgICB2YXIgb3JkZXJlZF92YWx1ZXMgPSBPYmplY3QuYXNzaWduKHtcblx0ICAgICAgICAgICRyZWY6IHZhbHVlLmNvbGxlY3Rpb24sXG5cdCAgICAgICAgICAkaWQ6IHZhbHVlLm9pZFxuXHQgICAgICAgIH0sIHZhbHVlLmZpZWxkcyk7IC8vIEFkZCBkYiByZWZlcmVuY2UgaWYgaXQgZXhpc3RzXG5cblx0ICAgICAgICBpZiAodmFsdWUuZGIgIT0gbnVsbCkge1xuXHQgICAgICAgICAgb3JkZXJlZF92YWx1ZXNbJyRkYiddID0gdmFsdWUuZGI7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIChuYW1lICE9IG51bGwgPyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5hbWUsICd1dGY4JykgKyAxIDogMCkgKyAxICsgY2FsY3VsYXRlT2JqZWN0U2l6ZShvcmRlcmVkX3ZhbHVlcywgc2VyaWFsaXplRnVuY3Rpb25zLCBpZ25vcmVVbmRlZmluZWQpO1xuXHQgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7XG5cdCAgICAgICAgcmV0dXJuIChuYW1lICE9IG51bGwgPyBCdWZmZXIkNi5ieXRlTGVuZ3RoKG5hbWUsICd1dGY4JykgKyAxIDogMCkgKyAxICsgQnVmZmVyJDYuYnl0ZUxlbmd0aCh2YWx1ZS5zb3VyY2UsICd1dGY4JykgKyAxICsgKHZhbHVlLmdsb2JhbCA/IDEgOiAwKSArICh2YWx1ZS5pZ25vcmVDYXNlID8gMSA6IDApICsgKHZhbHVlLm11bHRpbGluZSA/IDEgOiAwKSArIDE7XG5cdCAgICAgIH0gZWxzZSBpZiAodmFsdWVbJ19ic29udHlwZSddID09PSAnQlNPTlJlZ0V4cCcpIHtcblx0ICAgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArIDEgKyBCdWZmZXIkNi5ieXRlTGVuZ3RoKHZhbHVlLnBhdHRlcm4sICd1dGY4JykgKyAxICsgQnVmZmVyJDYuYnl0ZUxlbmd0aCh2YWx1ZS5vcHRpb25zLCAndXRmOCcpICsgMTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArIGNhbGN1bGF0ZU9iamVjdFNpemUodmFsdWUsIHNlcmlhbGl6ZUZ1bmN0aW9ucywgaWdub3JlVW5kZWZpbmVkKSArIDE7XG5cdCAgICAgIH1cblxuXHQgICAgY2FzZSAnZnVuY3Rpb24nOlxuXHQgICAgICAvLyBXVEYgZm9yIDAuNC5YIHdoZXJlIHR5cGVvZiAvc29tZXJlZ2V4cC8gPT09ICdmdW5jdGlvbidcblx0ICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nIHx8IFN0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcblx0ICAgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArIDEgKyBCdWZmZXIkNi5ieXRlTGVuZ3RoKHZhbHVlLnNvdXJjZSwgJ3V0ZjgnKSArIDEgKyAodmFsdWUuZ2xvYmFsID8gMSA6IDApICsgKHZhbHVlLmlnbm9yZUNhc2UgPyAxIDogMCkgKyAodmFsdWUubXVsdGlsaW5lID8gMSA6IDApICsgMTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBpZiAoc2VyaWFsaXplRnVuY3Rpb25zICYmIHZhbHVlLnNjb3BlICE9IG51bGwgJiYgT2JqZWN0LmtleXModmFsdWUuc2NvcGUpLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsID8gQnVmZmVyJDYuYnl0ZUxlbmd0aChuYW1lLCAndXRmOCcpICsgMSA6IDApICsgMSArIDQgKyA0ICsgQnVmZmVyJDYuYnl0ZUxlbmd0aChub3JtYWxpemVkRnVuY3Rpb25TdHJpbmckMih2YWx1ZSksICd1dGY4JykgKyAxICsgY2FsY3VsYXRlT2JqZWN0U2l6ZSh2YWx1ZS5zY29wZSwgc2VyaWFsaXplRnVuY3Rpb25zLCBpZ25vcmVVbmRlZmluZWQpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplRnVuY3Rpb25zKSB7XG5cdCAgICAgICAgICByZXR1cm4gKG5hbWUgIT0gbnVsbCA/IEJ1ZmZlciQ2LmJ5dGVMZW5ndGgobmFtZSwgJ3V0ZjgnKSArIDEgOiAwKSArIDEgKyA0ICsgQnVmZmVyJDYuYnl0ZUxlbmd0aChub3JtYWxpemVkRnVuY3Rpb25TdHJpbmckMih2YWx1ZSksICd1dGY4JykgKyAxO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXG5cdCAgfVxuXG5cdCAgcmV0dXJuIDA7XG5cdH1cblxuXHR2YXIgY2FsY3VsYXRlX3NpemUgPSBjYWxjdWxhdGVPYmplY3RTaXplO1xuXG5cdHZhciBCdWZmZXIkNyA9IGJ1ZmZlci5CdWZmZXI7XG5cdC8qKlxuXHQgKiBNYWtlcyBzdXJlIHRoYXQsIGlmIGEgVWludDhBcnJheSBpcyBwYXNzZWQgaW4sIGl0IGlzIHdyYXBwZWQgaW4gYSBCdWZmZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QnVmZmVyfFVpbnQ4QXJyYXl9IHBvdGVudGlhbEJ1ZmZlciBUaGUgcG90ZW50aWFsIGJ1ZmZlclxuXHQgKiBAcmV0dXJucyB7QnVmZmVyfSB0aGUgaW5wdXQgaWYgcG90ZW50aWFsQnVmZmVyIGlzIGEgYnVmZmVyLCBvciBhIGJ1ZmZlciB0aGF0XG5cdCAqIHdyYXBzIGEgcGFzc2VkIGluIFVpbnQ4QXJyYXlcblx0ICogQHRocm93cyB7VHlwZUVycm9yfSBJZiBhbnl0aGluZyBvdGhlciB0aGFuIGEgQnVmZmVyIG9yIFVpbnQ4QXJyYXkgaXMgcGFzc2VkIGluXG5cdCAqL1xuXG5cdHZhciBlbnN1cmVfYnVmZmVyID0gZnVuY3Rpb24gZW5zdXJlQnVmZmVyKHBvdGVudGlhbEJ1ZmZlcikge1xuXHQgIGlmIChwb3RlbnRpYWxCdWZmZXIgaW5zdGFuY2VvZiBCdWZmZXIkNykge1xuXHQgICAgcmV0dXJuIHBvdGVudGlhbEJ1ZmZlcjtcblx0ICB9XG5cblx0ICBpZiAocG90ZW50aWFsQnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuXHQgICAgcmV0dXJuIEJ1ZmZlciQ3LmZyb20ocG90ZW50aWFsQnVmZmVyLmJ1ZmZlcik7XG5cdCAgfVxuXG5cdCAgdGhyb3cgbmV3IFR5cGVFcnJvcignTXVzdCB1c2UgZWl0aGVyIEJ1ZmZlciBvciBVaW50OEFycmF5Jyk7XG5cdH07XG5cblx0dmFyIEJ1ZmZlciQ4ID0gYnVmZmVyLkJ1ZmZlcjsgLy8gUGFydHMgb2YgdGhlIHBhcnNlclxuXG5cdC8qKlxuXHQgKiBAaWdub3JlXG5cdCAqL1xuXHQvLyBEZWZhdWx0IE1heCBTaXplXG5cblx0dmFyIE1BWFNJWkUgPSAxMDI0ICogMTAyNCAqIDE3OyAvLyBDdXJyZW50IEludGVybmFsIFRlbXBvcmFyeSBTZXJpYWxpemF0aW9uIEJ1ZmZlclxuXG5cdHZhciBidWZmZXIkMSA9IEJ1ZmZlciQ4LmFsbG9jKE1BWFNJWkUpO1xuXHQvKipcblx0ICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgc2VyaWFsaXphdGlvbiBidWZmZXIuXG5cdCAqXG5cdCAqIEBtZXRob2Rcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIGRlc2lyZWQgc2l6ZSBmb3IgdGhlIGludGVybmFsIHNlcmlhbGl6YXRpb24gYnVmZmVyXG5cdCAqL1xuXG5cdGZ1bmN0aW9uIHNldEludGVybmFsQnVmZmVyU2l6ZShzaXplKSB7XG5cdCAgLy8gUmVzaXplIHRoZSBpbnRlcm5hbCBzZXJpYWxpemF0aW9uIGJ1ZmZlciBpZiBuZWVkZWRcblx0ICBpZiAoYnVmZmVyJDEubGVuZ3RoIDwgc2l6ZSkge1xuXHQgICAgYnVmZmVyJDEgPSBCdWZmZXIkOC5hbGxvYyhzaXplKTtcblx0ICB9XG5cdH1cblx0LyoqXG5cdCAqIFNlcmlhbGl6ZSBhIEphdmFzY3JpcHQgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IHRoZSBKYXZhc2NyaXB0IG9iamVjdCB0byBzZXJpYWxpemUuXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2hlY2tLZXlzXSB0aGUgc2VyaWFsaXplciB3aWxsIGNoZWNrIGlmIGtleXMgYXJlIHZhbGlkLlxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNlcmlhbGl6ZUZ1bmN0aW9ucz1mYWxzZV0gc2VyaWFsaXplIHRoZSBqYXZhc2NyaXB0IGZ1bmN0aW9ucyAqKihkZWZhdWx0OmZhbHNlKSoqLlxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmlnbm9yZVVuZGVmaW5lZD10cnVlXSBpZ25vcmUgdW5kZWZpbmVkIGZpZWxkcyAqKihkZWZhdWx0OnRydWUpKiouXG5cdCAqIEByZXR1cm4ge0J1ZmZlcn0gcmV0dXJucyB0aGUgQnVmZmVyIG9iamVjdCBjb250YWluaW5nIHRoZSBzZXJpYWxpemVkIG9iamVjdC5cblx0ICovXG5cblxuXHRmdW5jdGlvbiBzZXJpYWxpemUkMShvYmplY3QsIG9wdGlvbnMpIHtcblx0ICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsgLy8gVW5wYWNrIHRoZSBvcHRpb25zXG5cblx0ICB2YXIgY2hlY2tLZXlzID0gdHlwZW9mIG9wdGlvbnMuY2hlY2tLZXlzID09PSAnYm9vbGVhbicgPyBvcHRpb25zLmNoZWNrS2V5cyA6IGZhbHNlO1xuXHQgIHZhciBzZXJpYWxpemVGdW5jdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucy5zZXJpYWxpemVGdW5jdGlvbnMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuc2VyaWFsaXplRnVuY3Rpb25zIDogZmFsc2U7XG5cdCAgdmFyIGlnbm9yZVVuZGVmaW5lZCA9IHR5cGVvZiBvcHRpb25zLmlnbm9yZVVuZGVmaW5lZCA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5pZ25vcmVVbmRlZmluZWQgOiB0cnVlO1xuXHQgIHZhciBtaW5JbnRlcm5hbEJ1ZmZlclNpemUgPSB0eXBlb2Ygb3B0aW9ucy5taW5JbnRlcm5hbEJ1ZmZlclNpemUgPT09ICdudW1iZXInID8gb3B0aW9ucy5taW5JbnRlcm5hbEJ1ZmZlclNpemUgOiBNQVhTSVpFOyAvLyBSZXNpemUgdGhlIGludGVybmFsIHNlcmlhbGl6YXRpb24gYnVmZmVyIGlmIG5lZWRlZFxuXG5cdCAgaWYgKGJ1ZmZlciQxLmxlbmd0aCA8IG1pbkludGVybmFsQnVmZmVyU2l6ZSkge1xuXHQgICAgYnVmZmVyJDEgPSBCdWZmZXIkOC5hbGxvYyhtaW5JbnRlcm5hbEJ1ZmZlclNpemUpO1xuXHQgIH0gLy8gQXR0ZW1wdCB0byBzZXJpYWxpemVcblxuXG5cdCAgdmFyIHNlcmlhbGl6YXRpb25JbmRleCA9IHNlcmlhbGl6ZXIoYnVmZmVyJDEsIG9iamVjdCwgY2hlY2tLZXlzLCAwLCAwLCBzZXJpYWxpemVGdW5jdGlvbnMsIGlnbm9yZVVuZGVmaW5lZCwgW10pOyAvLyBDcmVhdGUgdGhlIGZpbmFsIGJ1ZmZlclxuXG5cdCAgdmFyIGZpbmlzaGVkQnVmZmVyID0gQnVmZmVyJDguYWxsb2Moc2VyaWFsaXphdGlvbkluZGV4KTsgLy8gQ29weSBpbnRvIHRoZSBmaW5pc2hlZCBidWZmZXJcblxuXHQgIGJ1ZmZlciQxLmNvcHkoZmluaXNoZWRCdWZmZXIsIDAsIDAsIGZpbmlzaGVkQnVmZmVyLmxlbmd0aCk7IC8vIFJldHVybiB0aGUgYnVmZmVyXG5cblx0ICByZXR1cm4gZmluaXNoZWRCdWZmZXI7XG5cdH1cblx0LyoqXG5cdCAqIFNlcmlhbGl6ZSBhIEphdmFzY3JpcHQgb2JqZWN0IHVzaW5nIGEgcHJlZGVmaW5lZCBCdWZmZXIgYW5kIGluZGV4IGludG8gdGhlIGJ1ZmZlciwgdXNlZnVsIHdoZW4gcHJlLWFsbG9jYXRpbmcgdGhlIHNwYWNlIGZvciBzZXJpYWxpemF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IHRoZSBKYXZhc2NyaXB0IG9iamVjdCB0byBzZXJpYWxpemUuXG5cdCAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgdGhlIEJ1ZmZlciB5b3UgcHJlLWFsbG9jYXRlZCB0byBzdG9yZSB0aGUgc2VyaWFsaXplZCBCU09OIG9iamVjdC5cblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jaGVja0tleXNdIHRoZSBzZXJpYWxpemVyIHdpbGwgY2hlY2sgaWYga2V5cyBhcmUgdmFsaWQuXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2VyaWFsaXplRnVuY3Rpb25zPWZhbHNlXSBzZXJpYWxpemUgdGhlIGphdmFzY3JpcHQgZnVuY3Rpb25zICoqKGRlZmF1bHQ6ZmFsc2UpKiouXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaWdub3JlVW5kZWZpbmVkPXRydWVdIGlnbm9yZSB1bmRlZmluZWQgZmllbGRzICoqKGRlZmF1bHQ6dHJ1ZSkqKi5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmluZGV4XSB0aGUgaW5kZXggaW4gdGhlIGJ1ZmZlciB3aGVyZSB3ZSB3aXNoIHRvIHN0YXJ0IHNlcmlhbGl6aW5nIGludG8uXG5cdCAqIEByZXR1cm4ge051bWJlcn0gcmV0dXJucyB0aGUgaW5kZXggcG9pbnRpbmcgdG8gdGhlIGxhc3Qgd3JpdHRlbiBieXRlIGluIHRoZSBidWZmZXIuXG5cdCAqL1xuXG5cblx0ZnVuY3Rpb24gc2VyaWFsaXplV2l0aEJ1ZmZlckFuZEluZGV4KG9iamVjdCwgZmluYWxCdWZmZXIsIG9wdGlvbnMpIHtcblx0ICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsgLy8gVW5wYWNrIHRoZSBvcHRpb25zXG5cblx0ICB2YXIgY2hlY2tLZXlzID0gdHlwZW9mIG9wdGlvbnMuY2hlY2tLZXlzID09PSAnYm9vbGVhbicgPyBvcHRpb25zLmNoZWNrS2V5cyA6IGZhbHNlO1xuXHQgIHZhciBzZXJpYWxpemVGdW5jdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucy5zZXJpYWxpemVGdW5jdGlvbnMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuc2VyaWFsaXplRnVuY3Rpb25zIDogZmFsc2U7XG5cdCAgdmFyIGlnbm9yZVVuZGVmaW5lZCA9IHR5cGVvZiBvcHRpb25zLmlnbm9yZVVuZGVmaW5lZCA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5pZ25vcmVVbmRlZmluZWQgOiB0cnVlO1xuXHQgIHZhciBzdGFydEluZGV4ID0gdHlwZW9mIG9wdGlvbnMuaW5kZXggPT09ICdudW1iZXInID8gb3B0aW9ucy5pbmRleCA6IDA7IC8vIEF0dGVtcHQgdG8gc2VyaWFsaXplXG5cblx0ICB2YXIgc2VyaWFsaXphdGlvbkluZGV4ID0gc2VyaWFsaXplcihidWZmZXIkMSwgb2JqZWN0LCBjaGVja0tleXMsIDAsIDAsIHNlcmlhbGl6ZUZ1bmN0aW9ucywgaWdub3JlVW5kZWZpbmVkKTtcblx0ICBidWZmZXIkMS5jb3B5KGZpbmFsQnVmZmVyLCBzdGFydEluZGV4LCAwLCBzZXJpYWxpemF0aW9uSW5kZXgpOyAvLyBSZXR1cm4gdGhlIGluZGV4XG5cblx0ICByZXR1cm4gc3RhcnRJbmRleCArIHNlcmlhbGl6YXRpb25JbmRleCAtIDE7XG5cdH1cblx0LyoqXG5cdCAqIERlc2VyaWFsaXplIGRhdGEgYXMgQlNPTi5cblx0ICpcblx0ICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNlcmlhbGl6ZWQgc2V0IG9mIEJTT04gZG9jdW1lbnRzLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZXZhbEZ1bmN0aW9ucz1mYWxzZV0gZXZhbHVhdGUgZnVuY3Rpb25zIGluIHRoZSBCU09OIGRvY3VtZW50IHNjb3BlZCB0byB0aGUgb2JqZWN0IGRlc2VyaWFsaXplZC5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmNhY2hlRnVuY3Rpb25zPWZhbHNlXSBjYWNoZSBldmFsdWF0ZWQgZnVuY3Rpb25zIGZvciByZXVzZS5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmNhY2hlRnVuY3Rpb25zQ3JjMzI9ZmFsc2VdIHVzZSBhIGNyYzMyIGNvZGUgZm9yIGNhY2hpbmcsIG90aGVyd2lzZSB1c2UgdGhlIHN0cmluZyBvZiB0aGUgZnVuY3Rpb24uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5wcm9tb3RlTG9uZ3M9dHJ1ZV0gd2hlbiBkZXNlcmlhbGl6aW5nIGEgTG9uZyB3aWxsIGZpdCBpdCBpbnRvIGEgTnVtYmVyIGlmIGl0J3Mgc21hbGxlciB0aGFuIDUzIGJpdHNcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnByb21vdGVCdWZmZXJzPWZhbHNlXSB3aGVuIGRlc2VyaWFsaXppbmcgYSBCaW5hcnkgd2lsbCByZXR1cm4gaXQgYXMgYSBub2RlLmpzIEJ1ZmZlciBpbnN0YW5jZS5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnByb21vdGVWYWx1ZXM9ZmFsc2VdIHdoZW4gZGVzZXJpYWxpemluZyB3aWxsIHByb21vdGUgQlNPTiB2YWx1ZXMgdG8gdGhlaXIgTm9kZS5qcyBjbG9zZXN0IGVxdWl2YWxlbnQgdHlwZXMuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5maWVsZHNBc1Jhdz1udWxsXSBhbGxvdyB0byBzcGVjaWZ5IGlmIHRoZXJlIHdoYXQgZmllbGRzIHdlIHdpc2ggdG8gcmV0dXJuIGFzIHVuc2VyaWFsaXplZCByYXcgYnVmZmVyLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYnNvblJlZ0V4cD1mYWxzZV0gcmV0dXJuIEJTT04gcmVndWxhciBleHByZXNzaW9ucyBhcyBCU09OUmVnRXhwIGluc3RhbmNlcy5cblx0ICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hbGxvd09iamVjdFNtYWxsZXJUaGFuQnVmZmVyU2l6ZT1mYWxzZV0gYWxsb3dzIHRoZSBidWZmZXIgdG8gYmUgbGFyZ2VyIHRoYW4gdGhlIHBhcnNlZCBCU09OIG9iamVjdFxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IHJldHVybnMgdGhlIGRlc2VyaWFsaXplZCBKYXZhc2NyaXB0IE9iamVjdC5cblx0ICovXG5cblxuXHRmdW5jdGlvbiBkZXNlcmlhbGl6ZSQyKGJ1ZmZlciQkMSwgb3B0aW9ucykge1xuXHQgIGJ1ZmZlciQkMSA9IGVuc3VyZV9idWZmZXIoYnVmZmVyJCQxKTtcblx0ICByZXR1cm4gZGVzZXJpYWxpemVyKGJ1ZmZlciQkMSwgb3B0aW9ucyk7XG5cdH1cblx0LyoqXG5cdCAqIENhbGN1bGF0ZSB0aGUgYnNvbiBzaXplIGZvciBhIHBhc3NlZCBpbiBKYXZhc2NyaXB0IG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCB0aGUgSmF2YXNjcmlwdCBvYmplY3QgdG8gY2FsY3VsYXRlIHRoZSBCU09OIGJ5dGUgc2l6ZSBmb3IuXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2VyaWFsaXplRnVuY3Rpb25zPWZhbHNlXSBzZXJpYWxpemUgdGhlIGphdmFzY3JpcHQgZnVuY3Rpb25zICoqKGRlZmF1bHQ6ZmFsc2UpKiouXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaWdub3JlVW5kZWZpbmVkPXRydWVdIGlnbm9yZSB1bmRlZmluZWQgZmllbGRzICoqKGRlZmF1bHQ6dHJ1ZSkqKi5cblx0ICogQHJldHVybiB7TnVtYmVyfSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIEJTT04gb2JqZWN0IHdpbGwgdGFrZSB1cC5cblx0ICovXG5cblxuXHRmdW5jdGlvbiBjYWxjdWxhdGVPYmplY3RTaXplJDEob2JqZWN0LCBvcHRpb25zKSB7XG5cdCAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdCAgdmFyIHNlcmlhbGl6ZUZ1bmN0aW9ucyA9IHR5cGVvZiBvcHRpb25zLnNlcmlhbGl6ZUZ1bmN0aW9ucyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5zZXJpYWxpemVGdW5jdGlvbnMgOiBmYWxzZTtcblx0ICB2YXIgaWdub3JlVW5kZWZpbmVkID0gdHlwZW9mIG9wdGlvbnMuaWdub3JlVW5kZWZpbmVkID09PSAnYm9vbGVhbicgPyBvcHRpb25zLmlnbm9yZVVuZGVmaW5lZCA6IHRydWU7XG5cdCAgcmV0dXJuIGNhbGN1bGF0ZV9zaXplKG9iamVjdCwgc2VyaWFsaXplRnVuY3Rpb25zLCBpZ25vcmVVbmRlZmluZWQpO1xuXHR9XG5cdC8qKlxuXHQgKiBEZXNlcmlhbGl6ZSBzdHJlYW0gZGF0YSBhcyBCU09OIGRvY3VtZW50cy5cblx0ICpcblx0ICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBzZXJpYWxpemVkIHNldCBvZiBCU09OIGRvY3VtZW50cy5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0SW5kZXggdGhlIHN0YXJ0IGluZGV4IGluIHRoZSBkYXRhIEJ1ZmZlciB3aGVyZSB0aGUgZGVzZXJpYWxpemF0aW9uIGlzIHRvIHN0YXJ0LlxuXHQgKiBAcGFyYW0ge051bWJlcn0gbnVtYmVyT2ZEb2N1bWVudHMgbnVtYmVyIG9mIGRvY3VtZW50cyB0byBkZXNlcmlhbGl6ZS5cblx0ICogQHBhcmFtIHtBcnJheX0gZG9jdW1lbnRzIGFuIGFycmF5IHdoZXJlIHRvIHN0b3JlIHRoZSBkZXNlcmlhbGl6ZWQgZG9jdW1lbnRzLlxuXHQgKiBAcGFyYW0ge051bWJlcn0gZG9jU3RhcnRJbmRleCB0aGUgaW5kZXggaW4gdGhlIGRvY3VtZW50cyBhcnJheSBmcm9tIHdoZXJlIHRvIHN0YXJ0IGluc2VydGluZyBkb2N1bWVudHMuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gYWRkaXRpb25hbCBvcHRpb25zIHVzZWQgZm9yIHRoZSBkZXNlcmlhbGl6YXRpb24uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5ldmFsRnVuY3Rpb25zPWZhbHNlXSBldmFsdWF0ZSBmdW5jdGlvbnMgaW4gdGhlIEJTT04gZG9jdW1lbnQgc2NvcGVkIHRvIHRoZSBvYmplY3QgZGVzZXJpYWxpemVkLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuY2FjaGVGdW5jdGlvbnM9ZmFsc2VdIGNhY2hlIGV2YWx1YXRlZCBmdW5jdGlvbnMgZm9yIHJldXNlLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuY2FjaGVGdW5jdGlvbnNDcmMzMj1mYWxzZV0gdXNlIGEgY3JjMzIgY29kZSBmb3IgY2FjaGluZywgb3RoZXJ3aXNlIHVzZSB0aGUgc3RyaW5nIG9mIHRoZSBmdW5jdGlvbi5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnByb21vdGVMb25ncz10cnVlXSB3aGVuIGRlc2VyaWFsaXppbmcgYSBMb25nIHdpbGwgZml0IGl0IGludG8gYSBOdW1iZXIgaWYgaXQncyBzbWFsbGVyIHRoYW4gNTMgYml0c1xuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucHJvbW90ZUJ1ZmZlcnM9ZmFsc2VdIHdoZW4gZGVzZXJpYWxpemluZyBhIEJpbmFyeSB3aWxsIHJldHVybiBpdCBhcyBhIG5vZGUuanMgQnVmZmVyIGluc3RhbmNlLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucHJvbW90ZVZhbHVlcz1mYWxzZV0gd2hlbiBkZXNlcmlhbGl6aW5nIHdpbGwgcHJvbW90ZSBCU09OIHZhbHVlcyB0byB0aGVpciBOb2RlLmpzIGNsb3Nlc3QgZXF1aXZhbGVudCB0eXBlcy5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmZpZWxkc0FzUmF3PW51bGxdIGFsbG93IHRvIHNwZWNpZnkgaWYgdGhlcmUgd2hhdCBmaWVsZHMgd2Ugd2lzaCB0byByZXR1cm4gYXMgdW5zZXJpYWxpemVkIHJhdyBidWZmZXIuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5ic29uUmVnRXhwPWZhbHNlXSByZXR1cm4gQlNPTiByZWd1bGFyIGV4cHJlc3Npb25zIGFzIEJTT05SZWdFeHAgaW5zdGFuY2VzLlxuXHQgKiBAcmV0dXJuIHtOdW1iZXJ9IHJldHVybnMgdGhlIG5leHQgaW5kZXggaW4gdGhlIGJ1ZmZlciBhZnRlciBkZXNlcmlhbGl6YXRpb24gKip4KiogbnVtYmVycyBvZiBkb2N1bWVudHMuXG5cdCAqL1xuXG5cblx0ZnVuY3Rpb24gZGVzZXJpYWxpemVTdHJlYW0oZGF0YSwgc3RhcnRJbmRleCwgbnVtYmVyT2ZEb2N1bWVudHMsIGRvY3VtZW50cywgZG9jU3RhcnRJbmRleCwgb3B0aW9ucykge1xuXHQgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHtcblx0ICAgIGFsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplOiB0cnVlXG5cdCAgfSwgb3B0aW9ucyk7XG5cdCAgZGF0YSA9IGVuc3VyZV9idWZmZXIoZGF0YSk7XG5cdCAgdmFyIGluZGV4ID0gc3RhcnRJbmRleDsgLy8gTG9vcCBvdmVyIGFsbCBkb2N1bWVudHNcblxuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtYmVyT2ZEb2N1bWVudHM7IGkrKykge1xuXHQgICAgLy8gRmluZCBzaXplIG9mIHRoZSBkb2N1bWVudFxuXHQgICAgdmFyIHNpemUgPSBkYXRhW2luZGV4XSB8IGRhdGFbaW5kZXggKyAxXSA8PCA4IHwgZGF0YVtpbmRleCArIDJdIDw8IDE2IHwgZGF0YVtpbmRleCArIDNdIDw8IDI0OyAvLyBVcGRhdGUgb3B0aW9ucyB3aXRoIGluZGV4XG5cblx0ICAgIG9wdGlvbnMuaW5kZXggPSBpbmRleDsgLy8gUGFyc2UgdGhlIGRvY3VtZW50IGF0IHRoaXMgcG9pbnRcblxuXHQgICAgZG9jdW1lbnRzW2RvY1N0YXJ0SW5kZXggKyBpXSA9IGRlc2VyaWFsaXplcihkYXRhLCBvcHRpb25zKTsgLy8gQWRqdXN0IGluZGV4IGJ5IHRoZSBkb2N1bWVudCBzaXplXG5cblx0ICAgIGluZGV4ID0gaW5kZXggKyBzaXplO1xuXHQgIH0gLy8gUmV0dXJuIG9iamVjdCBjb250YWluaW5nIGVuZCBpbmRleCBvZiBwYXJzaW5nIGFuZCBsaXN0IG9mIGRvY3VtZW50c1xuXG5cblx0ICByZXR1cm4gaW5kZXg7XG5cdH1cblxuXHR2YXIgYnNvbiA9IHtcblx0ICAvLyBjb25zdGFudHNcblx0ICAvLyBOT1RFOiB0aGlzIGlzIGRvbmUgdGhpcyB3YXkgYmVjYXVzZSByb2xsdXAgY2FuJ3QgcmVzb2x2ZSBhbiBgT2JqZWN0LmFzc2lnbmBlZCBleHBvcnRcblx0ICBCU09OX0lOVDMyX01BWDogY29uc3RhbnRzLkJTT05fSU5UMzJfTUFYLFxuXHQgIEJTT05fSU5UMzJfTUlOOiBjb25zdGFudHMuQlNPTl9JTlQzMl9NSU4sXG5cdCAgQlNPTl9JTlQ2NF9NQVg6IGNvbnN0YW50cy5CU09OX0lOVDY0X01BWCxcblx0ICBCU09OX0lOVDY0X01JTjogY29uc3RhbnRzLkJTT05fSU5UNjRfTUlOLFxuXHQgIEpTX0lOVF9NQVg6IGNvbnN0YW50cy5KU19JTlRfTUFYLFxuXHQgIEpTX0lOVF9NSU46IGNvbnN0YW50cy5KU19JTlRfTUlOLFxuXHQgIEJTT05fREFUQV9OVU1CRVI6IGNvbnN0YW50cy5CU09OX0RBVEFfTlVNQkVSLFxuXHQgIEJTT05fREFUQV9TVFJJTkc6IGNvbnN0YW50cy5CU09OX0RBVEFfU1RSSU5HLFxuXHQgIEJTT05fREFUQV9PQkpFQ1Q6IGNvbnN0YW50cy5CU09OX0RBVEFfT0JKRUNULFxuXHQgIEJTT05fREFUQV9BUlJBWTogY29uc3RhbnRzLkJTT05fREFUQV9BUlJBWSxcblx0ICBCU09OX0RBVEFfQklOQVJZOiBjb25zdGFudHMuQlNPTl9EQVRBX0JJTkFSWSxcblx0ICBCU09OX0RBVEFfVU5ERUZJTkVEOiBjb25zdGFudHMuQlNPTl9EQVRBX1VOREVGSU5FRCxcblx0ICBCU09OX0RBVEFfT0lEOiBjb25zdGFudHMuQlNPTl9EQVRBX09JRCxcblx0ICBCU09OX0RBVEFfQk9PTEVBTjogY29uc3RhbnRzLkJTT05fREFUQV9CT09MRUFOLFxuXHQgIEJTT05fREFUQV9EQVRFOiBjb25zdGFudHMuQlNPTl9EQVRBX0RBVEUsXG5cdCAgQlNPTl9EQVRBX05VTEw6IGNvbnN0YW50cy5CU09OX0RBVEFfTlVMTCxcblx0ICBCU09OX0RBVEFfUkVHRVhQOiBjb25zdGFudHMuQlNPTl9EQVRBX1JFR0VYUCxcblx0ICBCU09OX0RBVEFfREJQT0lOVEVSOiBjb25zdGFudHMuQlNPTl9EQVRBX0RCUE9JTlRFUixcblx0ICBCU09OX0RBVEFfQ09ERTogY29uc3RhbnRzLkJTT05fREFUQV9DT0RFLFxuXHQgIEJTT05fREFUQV9TWU1CT0w6IGNvbnN0YW50cy5CU09OX0RBVEFfU1lNQk9MLFxuXHQgIEJTT05fREFUQV9DT0RFX1dfU0NPUEU6IGNvbnN0YW50cy5CU09OX0RBVEFfQ09ERV9XX1NDT1BFLFxuXHQgIEJTT05fREFUQV9JTlQ6IGNvbnN0YW50cy5CU09OX0RBVEFfSU5ULFxuXHQgIEJTT05fREFUQV9USU1FU1RBTVA6IGNvbnN0YW50cy5CU09OX0RBVEFfVElNRVNUQU1QLFxuXHQgIEJTT05fREFUQV9MT05HOiBjb25zdGFudHMuQlNPTl9EQVRBX0xPTkcsXG5cdCAgQlNPTl9EQVRBX0RFQ0lNQUwxMjg6IGNvbnN0YW50cy5CU09OX0RBVEFfREVDSU1BTDEyOCxcblx0ICBCU09OX0RBVEFfTUlOX0tFWTogY29uc3RhbnRzLkJTT05fREFUQV9NSU5fS0VZLFxuXHQgIEJTT05fREFUQV9NQVhfS0VZOiBjb25zdGFudHMuQlNPTl9EQVRBX01BWF9LRVksXG5cdCAgQlNPTl9CSU5BUllfU1VCVFlQRV9ERUZBVUxUOiBjb25zdGFudHMuQlNPTl9CSU5BUllfU1VCVFlQRV9ERUZBVUxULFxuXHQgIEJTT05fQklOQVJZX1NVQlRZUEVfRlVOQ1RJT046IGNvbnN0YW50cy5CU09OX0JJTkFSWV9TVUJUWVBFX0ZVTkNUSU9OLFxuXHQgIEJTT05fQklOQVJZX1NVQlRZUEVfQllURV9BUlJBWTogY29uc3RhbnRzLkJTT05fQklOQVJZX1NVQlRZUEVfQllURV9BUlJBWSxcblx0ICBCU09OX0JJTkFSWV9TVUJUWVBFX1VVSUQ6IGNvbnN0YW50cy5CU09OX0JJTkFSWV9TVUJUWVBFX1VVSUQsXG5cdCAgQlNPTl9CSU5BUllfU1VCVFlQRV9NRDU6IGNvbnN0YW50cy5CU09OX0JJTkFSWV9TVUJUWVBFX01ENSxcblx0ICBCU09OX0JJTkFSWV9TVUJUWVBFX1VTRVJfREVGSU5FRDogY29uc3RhbnRzLkJTT05fQklOQVJZX1NVQlRZUEVfVVNFUl9ERUZJTkVELFxuXHQgIC8vIHdyYXBwZWQgdHlwZXNcblx0ICBDb2RlOiBjb2RlLFxuXHQgIE1hcDogbWFwLFxuXHQgIEJTT05TeW1ib2w6IHN5bWJvbCxcblx0ICBEQlJlZjogZGJfcmVmLFxuXHQgIEJpbmFyeTogYmluYXJ5LFxuXHQgIE9iamVjdElkOiBvYmplY3RpZCxcblx0ICBMb25nOiBsb25nXzEsXG5cdCAgVGltZXN0YW1wOiB0aW1lc3RhbXAsXG5cdCAgRG91YmxlOiBkb3VibGVfMSxcblx0ICBJbnQzMjogaW50XzMyLFxuXHQgIE1pbktleTogbWluX2tleSxcblx0ICBNYXhLZXk6IG1heF9rZXksXG5cdCAgQlNPTlJlZ0V4cDogcmVnZXhwLFxuXHQgIERlY2ltYWwxMjg6IGRlY2ltYWwxMjgsXG5cdCAgLy8gbWV0aG9kc1xuXHQgIHNlcmlhbGl6ZTogc2VyaWFsaXplJDEsXG5cdCAgc2VyaWFsaXplV2l0aEJ1ZmZlckFuZEluZGV4OiBzZXJpYWxpemVXaXRoQnVmZmVyQW5kSW5kZXgsXG5cdCAgZGVzZXJpYWxpemU6IGRlc2VyaWFsaXplJDIsXG5cdCAgY2FsY3VsYXRlT2JqZWN0U2l6ZTogY2FsY3VsYXRlT2JqZWN0U2l6ZSQxLFxuXHQgIGRlc2VyaWFsaXplU3RyZWFtOiBkZXNlcmlhbGl6ZVN0cmVhbSxcblx0ICBzZXRJbnRlcm5hbEJ1ZmZlclNpemU6IHNldEludGVybmFsQnVmZmVyU2l6ZSxcblx0ICAvLyBsZWdhY3kgc3VwcG9ydFxuXHQgIE9iamVjdElEOiBvYmplY3RpZCxcblx0ICAvLyBFeHRlbmRlZCBKU09OXG5cdCAgRUpTT046IGV4dGVuZGVkX2pzb25cblx0fTtcblx0dmFyIGJzb25fMSA9IGJzb24uQlNPTl9JTlQzMl9NQVg7XG5cdHZhciBic29uXzIgPSBic29uLkJTT05fSU5UMzJfTUlOO1xuXHR2YXIgYnNvbl8zID0gYnNvbi5CU09OX0lOVDY0X01BWDtcblx0dmFyIGJzb25fNCA9IGJzb24uQlNPTl9JTlQ2NF9NSU47XG5cdHZhciBic29uXzUgPSBic29uLkpTX0lOVF9NQVg7XG5cdHZhciBic29uXzYgPSBic29uLkpTX0lOVF9NSU47XG5cdHZhciBic29uXzcgPSBic29uLkJTT05fREFUQV9OVU1CRVI7XG5cdHZhciBic29uXzggPSBic29uLkJTT05fREFUQV9TVFJJTkc7XG5cdHZhciBic29uXzkgPSBic29uLkJTT05fREFUQV9PQkpFQ1Q7XG5cdHZhciBic29uXzEwID0gYnNvbi5CU09OX0RBVEFfQVJSQVk7XG5cdHZhciBic29uXzExID0gYnNvbi5CU09OX0RBVEFfQklOQVJZO1xuXHR2YXIgYnNvbl8xMiA9IGJzb24uQlNPTl9EQVRBX1VOREVGSU5FRDtcblx0dmFyIGJzb25fMTMgPSBic29uLkJTT05fREFUQV9PSUQ7XG5cdHZhciBic29uXzE0ID0gYnNvbi5CU09OX0RBVEFfQk9PTEVBTjtcblx0dmFyIGJzb25fMTUgPSBic29uLkJTT05fREFUQV9EQVRFO1xuXHR2YXIgYnNvbl8xNiA9IGJzb24uQlNPTl9EQVRBX05VTEw7XG5cdHZhciBic29uXzE3ID0gYnNvbi5CU09OX0RBVEFfUkVHRVhQO1xuXHR2YXIgYnNvbl8xOCA9IGJzb24uQlNPTl9EQVRBX0RCUE9JTlRFUjtcblx0dmFyIGJzb25fMTkgPSBic29uLkJTT05fREFUQV9DT0RFO1xuXHR2YXIgYnNvbl8yMCA9IGJzb24uQlNPTl9EQVRBX1NZTUJPTDtcblx0dmFyIGJzb25fMjEgPSBic29uLkJTT05fREFUQV9DT0RFX1dfU0NPUEU7XG5cdHZhciBic29uXzIyID0gYnNvbi5CU09OX0RBVEFfSU5UO1xuXHR2YXIgYnNvbl8yMyA9IGJzb24uQlNPTl9EQVRBX1RJTUVTVEFNUDtcblx0dmFyIGJzb25fMjQgPSBic29uLkJTT05fREFUQV9MT05HO1xuXHR2YXIgYnNvbl8yNSA9IGJzb24uQlNPTl9EQVRBX0RFQ0lNQUwxMjg7XG5cdHZhciBic29uXzI2ID0gYnNvbi5CU09OX0RBVEFfTUlOX0tFWTtcblx0dmFyIGJzb25fMjcgPSBic29uLkJTT05fREFUQV9NQVhfS0VZO1xuXHR2YXIgYnNvbl8yOCA9IGJzb24uQlNPTl9CSU5BUllfU1VCVFlQRV9ERUZBVUxUO1xuXHR2YXIgYnNvbl8yOSA9IGJzb24uQlNPTl9CSU5BUllfU1VCVFlQRV9GVU5DVElPTjtcblx0dmFyIGJzb25fMzAgPSBic29uLkJTT05fQklOQVJZX1NVQlRZUEVfQllURV9BUlJBWTtcblx0dmFyIGJzb25fMzEgPSBic29uLkJTT05fQklOQVJZX1NVQlRZUEVfVVVJRDtcblx0dmFyIGJzb25fMzIgPSBic29uLkJTT05fQklOQVJZX1NVQlRZUEVfTUQ1O1xuXHR2YXIgYnNvbl8zMyA9IGJzb24uQlNPTl9CSU5BUllfU1VCVFlQRV9VU0VSX0RFRklORUQ7XG5cdHZhciBic29uXzM0ID0gYnNvbi5Db2RlO1xuXHR2YXIgYnNvbl8zNSA9IGJzb24uQlNPTlN5bWJvbDtcblx0dmFyIGJzb25fMzYgPSBic29uLkRCUmVmO1xuXHR2YXIgYnNvbl8zNyA9IGJzb24uQmluYXJ5O1xuXHR2YXIgYnNvbl8zOCA9IGJzb24uT2JqZWN0SWQ7XG5cdHZhciBic29uXzM5ID0gYnNvbi5Mb25nO1xuXHR2YXIgYnNvbl80MCA9IGJzb24uVGltZXN0YW1wO1xuXHR2YXIgYnNvbl80MSA9IGJzb24uRG91YmxlO1xuXHR2YXIgYnNvbl80MiA9IGJzb24uSW50MzI7XG5cdHZhciBic29uXzQzID0gYnNvbi5NaW5LZXk7XG5cdHZhciBic29uXzQ0ID0gYnNvbi5NYXhLZXk7XG5cdHZhciBic29uXzQ1ID0gYnNvbi5CU09OUmVnRXhwO1xuXHR2YXIgYnNvbl80NiA9IGJzb24uRGVjaW1hbDEyODtcblx0dmFyIGJzb25fNDcgPSBic29uLnNlcmlhbGl6ZTtcblx0dmFyIGJzb25fNDggPSBic29uLnNlcmlhbGl6ZVdpdGhCdWZmZXJBbmRJbmRleDtcblx0dmFyIGJzb25fNDkgPSBic29uLmRlc2VyaWFsaXplO1xuXHR2YXIgYnNvbl81MCA9IGJzb24uY2FsY3VsYXRlT2JqZWN0U2l6ZTtcblx0dmFyIGJzb25fNTEgPSBic29uLmRlc2VyaWFsaXplU3RyZWFtO1xuXHR2YXIgYnNvbl81MiA9IGJzb24uc2V0SW50ZXJuYWxCdWZmZXJTaXplO1xuXHR2YXIgYnNvbl81MyA9IGJzb24uT2JqZWN0SUQ7XG5cdHZhciBic29uXzU0ID0gYnNvbi5FSlNPTjtcblxuXHRleHBvcnRzLmRlZmF1bHQgPSBic29uO1xuXHRleHBvcnRzLkJTT05fSU5UMzJfTUFYID0gYnNvbl8xO1xuXHRleHBvcnRzLkJTT05fSU5UMzJfTUlOID0gYnNvbl8yO1xuXHRleHBvcnRzLkJTT05fSU5UNjRfTUFYID0gYnNvbl8zO1xuXHRleHBvcnRzLkJTT05fSU5UNjRfTUlOID0gYnNvbl80O1xuXHRleHBvcnRzLkpTX0lOVF9NQVggPSBic29uXzU7XG5cdGV4cG9ydHMuSlNfSU5UX01JTiA9IGJzb25fNjtcblx0ZXhwb3J0cy5CU09OX0RBVEFfTlVNQkVSID0gYnNvbl83O1xuXHRleHBvcnRzLkJTT05fREFUQV9TVFJJTkcgPSBic29uXzg7XG5cdGV4cG9ydHMuQlNPTl9EQVRBX09CSkVDVCA9IGJzb25fOTtcblx0ZXhwb3J0cy5CU09OX0RBVEFfQVJSQVkgPSBic29uXzEwO1xuXHRleHBvcnRzLkJTT05fREFUQV9CSU5BUlkgPSBic29uXzExO1xuXHRleHBvcnRzLkJTT05fREFUQV9VTkRFRklORUQgPSBic29uXzEyO1xuXHRleHBvcnRzLkJTT05fREFUQV9PSUQgPSBic29uXzEzO1xuXHRleHBvcnRzLkJTT05fREFUQV9CT09MRUFOID0gYnNvbl8xNDtcblx0ZXhwb3J0cy5CU09OX0RBVEFfREFURSA9IGJzb25fMTU7XG5cdGV4cG9ydHMuQlNPTl9EQVRBX05VTEwgPSBic29uXzE2O1xuXHRleHBvcnRzLkJTT05fREFUQV9SRUdFWFAgPSBic29uXzE3O1xuXHRleHBvcnRzLkJTT05fREFUQV9EQlBPSU5URVIgPSBic29uXzE4O1xuXHRleHBvcnRzLkJTT05fREFUQV9DT0RFID0gYnNvbl8xOTtcblx0ZXhwb3J0cy5CU09OX0RBVEFfU1lNQk9MID0gYnNvbl8yMDtcblx0ZXhwb3J0cy5CU09OX0RBVEFfQ09ERV9XX1NDT1BFID0gYnNvbl8yMTtcblx0ZXhwb3J0cy5CU09OX0RBVEFfSU5UID0gYnNvbl8yMjtcblx0ZXhwb3J0cy5CU09OX0RBVEFfVElNRVNUQU1QID0gYnNvbl8yMztcblx0ZXhwb3J0cy5CU09OX0RBVEFfTE9ORyA9IGJzb25fMjQ7XG5cdGV4cG9ydHMuQlNPTl9EQVRBX0RFQ0lNQUwxMjggPSBic29uXzI1O1xuXHRleHBvcnRzLkJTT05fREFUQV9NSU5fS0VZID0gYnNvbl8yNjtcblx0ZXhwb3J0cy5CU09OX0RBVEFfTUFYX0tFWSA9IGJzb25fMjc7XG5cdGV4cG9ydHMuQlNPTl9CSU5BUllfU1VCVFlQRV9ERUZBVUxUID0gYnNvbl8yODtcblx0ZXhwb3J0cy5CU09OX0JJTkFSWV9TVUJUWVBFX0ZVTkNUSU9OID0gYnNvbl8yOTtcblx0ZXhwb3J0cy5CU09OX0JJTkFSWV9TVUJUWVBFX0JZVEVfQVJSQVkgPSBic29uXzMwO1xuXHRleHBvcnRzLkJTT05fQklOQVJZX1NVQlRZUEVfVVVJRCA9IGJzb25fMzE7XG5cdGV4cG9ydHMuQlNPTl9CSU5BUllfU1VCVFlQRV9NRDUgPSBic29uXzMyO1xuXHRleHBvcnRzLkJTT05fQklOQVJZX1NVQlRZUEVfVVNFUl9ERUZJTkVEID0gYnNvbl8zMztcblx0ZXhwb3J0cy5Db2RlID0gYnNvbl8zNDtcblx0ZXhwb3J0cy5CU09OU3ltYm9sID0gYnNvbl8zNTtcblx0ZXhwb3J0cy5EQlJlZiA9IGJzb25fMzY7XG5cdGV4cG9ydHMuQmluYXJ5ID0gYnNvbl8zNztcblx0ZXhwb3J0cy5PYmplY3RJZCA9IGJzb25fMzg7XG5cdGV4cG9ydHMuTG9uZyA9IGJzb25fMzk7XG5cdGV4cG9ydHMuVGltZXN0YW1wID0gYnNvbl80MDtcblx0ZXhwb3J0cy5Eb3VibGUgPSBic29uXzQxO1xuXHRleHBvcnRzLkludDMyID0gYnNvbl80Mjtcblx0ZXhwb3J0cy5NaW5LZXkgPSBic29uXzQzO1xuXHRleHBvcnRzLk1heEtleSA9IGJzb25fNDQ7XG5cdGV4cG9ydHMuQlNPTlJlZ0V4cCA9IGJzb25fNDU7XG5cdGV4cG9ydHMuRGVjaW1hbDEyOCA9IGJzb25fNDY7XG5cdGV4cG9ydHMuc2VyaWFsaXplID0gYnNvbl80Nztcblx0ZXhwb3J0cy5zZXJpYWxpemVXaXRoQnVmZmVyQW5kSW5kZXggPSBic29uXzQ4O1xuXHRleHBvcnRzLmRlc2VyaWFsaXplID0gYnNvbl80OTtcblx0ZXhwb3J0cy5jYWxjdWxhdGVPYmplY3RTaXplID0gYnNvbl81MDtcblx0ZXhwb3J0cy5kZXNlcmlhbGl6ZVN0cmVhbSA9IGJzb25fNTE7XG5cdGV4cG9ydHMuc2V0SW50ZXJuYWxCdWZmZXJTaXplID0gYnNvbl81Mjtcblx0ZXhwb3J0cy5PYmplY3RJRCA9IGJzb25fNTM7XG5cdGV4cG9ydHMuRUpTT04gPSBic29uXzU0O1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG5cbi8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDApLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLkJ1ZmZlcikpXG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIHZhciBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayhcbiAgICAgIHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aClcbiAgICApKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXSArXG4gICAgICAnPT0nXG4gICAgKVxuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDEwXSArXG4gICAgICBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl0gK1xuICAgICAgJz0nXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG5cblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cblxuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxudmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cblxuLyoqKi8gfSksXG4vKiA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gTG9uZztcclxuXHJcbi8qKlxyXG4gKiB3YXNtIG9wdGltaXphdGlvbnMsIHRvIGRvIG5hdGl2ZSBpNjQgbXVsdGlwbGljYXRpb24gYW5kIGRpdmlkZVxyXG4gKi9cclxudmFyIHdhc20gPSBudWxsO1xyXG5cclxudHJ5IHtcclxuICB3YXNtID0gbmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKG5ldyBXZWJBc3NlbWJseS5Nb2R1bGUobmV3IFVpbnQ4QXJyYXkoW1xyXG4gICAgMCwgOTcsIDExNSwgMTA5LCAxLCAwLCAwLCAwLCAxLCAxMywgMiwgOTYsIDAsIDEsIDEyNywgOTYsIDQsIDEyNywgMTI3LCAxMjcsIDEyNywgMSwgMTI3LCAzLCA3LCA2LCAwLCAxLCAxLCAxLCAxLCAxLCA2LCA2LCAxLCAxMjcsIDEsIDY1LCAwLCAxMSwgNywgNTAsIDYsIDMsIDEwOSwgMTE3LCAxMDgsIDAsIDEsIDUsIDEwMCwgMTA1LCAxMTgsIDk1LCAxMTUsIDAsIDIsIDUsIDEwMCwgMTA1LCAxMTgsIDk1LCAxMTcsIDAsIDMsIDUsIDExNCwgMTAxLCAxMDksIDk1LCAxMTUsIDAsIDQsIDUsIDExNCwgMTAxLCAxMDksIDk1LCAxMTcsIDAsIDUsIDgsIDEwMywgMTAxLCAxMTYsIDk1LCAxMDQsIDEwNSwgMTAzLCAxMDQsIDAsIDAsIDEwLCAxOTEsIDEsIDYsIDQsIDAsIDM1LCAwLCAxMSwgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MywgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTI2LCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsIDMyLCA0LCAxNjcsIDExLCAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjcsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsIDE2NywgMTEsIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyOCwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCwgMTY3LCAxMSwgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MywgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTI5LCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsIDMyLCA0LCAxNjcsIDExLCAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMzAsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsIDE2NywgMTFcclxuICBdKSksIHt9KS5leHBvcnRzO1xyXG59IGNhdGNoIChlKSB7XHJcbiAgLy8gbm8gd2FzbSBzdXBwb3J0IDooXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb25zdHJ1Y3RzIGEgNjQgYml0IHR3bydzLWNvbXBsZW1lbnQgaW50ZWdlciwgZ2l2ZW4gaXRzIGxvdyBhbmQgaGlnaCAzMiBiaXQgdmFsdWVzIGFzICpzaWduZWQqIGludGVnZXJzLlxyXG4gKiAgU2VlIHRoZSBmcm9tKiBmdW5jdGlvbnMgYmVsb3cgZm9yIG1vcmUgY29udmVuaWVudCB3YXlzIG9mIGNvbnN0cnVjdGluZyBMb25ncy5cclxuICogQGV4cG9ydHMgTG9uZ1xyXG4gKiBAY2xhc3MgQSBMb25nIGNsYXNzIGZvciByZXByZXNlbnRpbmcgYSA2NCBiaXQgdHdvJ3MtY29tcGxlbWVudCBpbnRlZ2VyIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbG93IFRoZSBsb3cgKHNpZ25lZCkgMzIgYml0cyBvZiB0aGUgbG9uZ1xyXG4gKiBAcGFyYW0ge251bWJlcn0gaGlnaCBUaGUgaGlnaCAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBsb25nXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqL1xyXG5mdW5jdGlvbiBMb25nKGxvdywgaGlnaCwgdW5zaWduZWQpIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsb3cgMzIgYml0cyBhcyBhIHNpZ25lZCB2YWx1ZS5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIHRoaXMubG93ID0gbG93IHwgMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgdmFsdWUuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICB0aGlzLmhpZ2ggPSBoaWdoIHwgMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LlxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIHRoaXMudW5zaWduZWQgPSAhIXVuc2lnbmVkO1xyXG59XHJcblxyXG4vLyBUaGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBsb25nIGlzIHRoZSB0d28gZ2l2ZW4gc2lnbmVkLCAzMi1iaXQgdmFsdWVzLlxyXG4vLyBXZSB1c2UgMzItYml0IHBpZWNlcyBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgc2l6ZSBvZiBpbnRlZ2VycyBvbiB3aGljaFxyXG4vLyBKYXZhc2NyaXB0IHBlcmZvcm1zIGJpdC1vcGVyYXRpb25zLiAgRm9yIG9wZXJhdGlvbnMgbGlrZSBhZGRpdGlvbiBhbmRcclxuLy8gbXVsdGlwbGljYXRpb24sIHdlIHNwbGl0IGVhY2ggbnVtYmVyIGludG8gMTYgYml0IHBpZWNlcywgd2hpY2ggY2FuIGVhc2lseSBiZVxyXG4vLyBtdWx0aXBsaWVkIHdpdGhpbiBKYXZhc2NyaXB0J3MgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gd2l0aG91dCBvdmVyZmxvd1xyXG4vLyBvciBjaGFuZ2UgaW4gc2lnbi5cclxuLy9cclxuLy8gSW4gdGhlIGFsZ29yaXRobXMgYmVsb3csIHdlIGZyZXF1ZW50bHkgcmVkdWNlIHRoZSBuZWdhdGl2ZSBjYXNlIHRvIHRoZVxyXG4vLyBwb3NpdGl2ZSBjYXNlIGJ5IG5lZ2F0aW5nIHRoZSBpbnB1dChzKSBhbmQgdGhlbiBwb3N0LXByb2Nlc3NpbmcgdGhlIHJlc3VsdC5cclxuLy8gTm90ZSB0aGF0IHdlIG11c3QgQUxXQVlTIGNoZWNrIHNwZWNpYWxseSB3aGV0aGVyIHRob3NlIHZhbHVlcyBhcmUgTUlOX1ZBTFVFXHJcbi8vICgtMl42MykgYmVjYXVzZSAtTUlOX1ZBTFVFID09IE1JTl9WQUxVRSAoc2luY2UgMl42MyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXNcclxuLy8gYSBwb3NpdGl2ZSBudW1iZXIsIGl0IG92ZXJmbG93cyBiYWNrIGludG8gYSBuZWdhdGl2ZSkuICBOb3QgaGFuZGxpbmcgdGhpc1xyXG4vLyBjYXNlIHdvdWxkIG9mdGVuIHJlc3VsdCBpbiBpbmZpbml0ZSByZWN1cnNpb24uXHJcbi8vXHJcbi8vIENvbW1vbiBjb25zdGFudCB2YWx1ZXMgWkVSTywgT05FLCBORUdfT05FLCBldGMuIGFyZSBkZWZpbmVkIGJlbG93IHRoZSBmcm9tKlxyXG4vLyBtZXRob2RzIG9uIHdoaWNoIHRoZXkgZGVwZW5kLlxyXG5cclxuLyoqXHJcbiAqIEFuIGluZGljYXRvciB1c2VkIHRvIHJlbGlhYmx5IGRldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBMb25nIG9yIG5vdC5cclxuICogQHR5cGUge2Jvb2xlYW59XHJcbiAqIEBjb25zdFxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuTG9uZy5wcm90b3R5cGUuX19pc0xvbmdfXztcclxuXHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShMb25nLnByb3RvdHlwZSwgXCJfX2lzTG9uZ19fXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcblxyXG4vKipcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Kn0gb2JqIE9iamVjdFxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICogQGlubmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0xvbmcob2JqKSB7XHJcbiAgICByZXR1cm4gKG9iaiAmJiBvYmpbXCJfX2lzTG9uZ19fXCJdKSA9PT0gdHJ1ZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgTG9uZy5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Kn0gb2JqIE9iamVjdFxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmcuaXNMb25nID0gaXNMb25nO1xyXG5cclxuLyoqXHJcbiAqIEEgY2FjaGUgb2YgdGhlIExvbmcgcmVwcmVzZW50YXRpb25zIG9mIHNtYWxsIGludGVnZXIgdmFsdWVzLlxyXG4gKiBAdHlwZSB7IU9iamVjdH1cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgSU5UX0NBQ0hFID0ge307XHJcblxyXG4vKipcclxuICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuXHJcbiAqIEB0eXBlIHshT2JqZWN0fVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBVSU5UX0NBQ0hFID0ge307XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBmcm9tSW50KHZhbHVlLCB1bnNpZ25lZCkge1xyXG4gICAgdmFyIG9iaiwgY2FjaGVkT2JqLCBjYWNoZTtcclxuICAgIGlmICh1bnNpZ25lZCkge1xyXG4gICAgICAgIHZhbHVlID4+Pj0gMDtcclxuICAgICAgICBpZiAoY2FjaGUgPSAoMCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDI1NikpIHtcclxuICAgICAgICAgICAgY2FjaGVkT2JqID0gVUlOVF9DQUNIRVt2YWx1ZV07XHJcbiAgICAgICAgICAgIGlmIChjYWNoZWRPYmopXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkT2JqO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvYmogPSBmcm9tQml0cyh2YWx1ZSwgKHZhbHVlIHwgMCkgPCAwID8gLTEgOiAwLCB0cnVlKTtcclxuICAgICAgICBpZiAoY2FjaGUpXHJcbiAgICAgICAgICAgIFVJTlRfQ0FDSEVbdmFsdWVdID0gb2JqO1xyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhbHVlIHw9IDA7XHJcbiAgICAgICAgaWYgKGNhY2hlID0gKC0xMjggPD0gdmFsdWUgJiYgdmFsdWUgPCAxMjgpKSB7XHJcbiAgICAgICAgICAgIGNhY2hlZE9iaiA9IElOVF9DQUNIRVt2YWx1ZV07XHJcbiAgICAgICAgICAgIGlmIChjYWNoZWRPYmopXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkT2JqO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvYmogPSBmcm9tQml0cyh2YWx1ZSwgdmFsdWUgPCAwID8gLTEgOiAwLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKGNhY2hlKVxyXG4gICAgICAgICAgICBJTlRfQ0FDSEVbdmFsdWVdID0gb2JqO1xyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIDMyIGJpdCBpbnRlZ2VyIHZhbHVlLlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSAzMiBiaXQgaW50ZWdlciBpbiBxdWVzdGlvblxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxyXG4gKi9cclxuTG9uZy5mcm9tSW50ID0gZnJvbUludDtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbmZ1bmN0aW9uIGZyb21OdW1iZXIodmFsdWUsIHVuc2lnbmVkKSB7XHJcbiAgICBpZiAoaXNOYU4odmFsdWUpKVxyXG4gICAgICAgIHJldHVybiB1bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcclxuICAgIGlmICh1bnNpZ25lZCkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA8IDApXHJcbiAgICAgICAgICAgIHJldHVybiBVWkVSTztcclxuICAgICAgICBpZiAodmFsdWUgPj0gVFdPX1BXUl82NF9EQkwpXHJcbiAgICAgICAgICAgIHJldHVybiBNQVhfVU5TSUdORURfVkFMVUU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh2YWx1ZSA8PSAtVFdPX1BXUl82M19EQkwpXHJcbiAgICAgICAgICAgIHJldHVybiBNSU5fVkFMVUU7XHJcbiAgICAgICAgaWYgKHZhbHVlICsgMSA+PSBUV09fUFdSXzYzX0RCTClcclxuICAgICAgICAgICAgcmV0dXJuIE1BWF9WQUxVRTtcclxuICAgIH1cclxuICAgIGlmICh2YWx1ZSA8IDApXHJcbiAgICAgICAgcmV0dXJuIGZyb21OdW1iZXIoLXZhbHVlLCB1bnNpZ25lZCkubmVnKCk7XHJcbiAgICByZXR1cm4gZnJvbUJpdHMoKHZhbHVlICUgVFdPX1BXUl8zMl9EQkwpIHwgMCwgKHZhbHVlIC8gVFdPX1BXUl8zMl9EQkwpIHwgMCwgdW5zaWduZWQpO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiB2YWx1ZSwgcHJvdmlkZWQgdGhhdCBpdCBpcyBhIGZpbml0ZSBudW1iZXIuIE90aGVyd2lzZSwgemVybyBpcyByZXR1cm5lZC5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgbnVtYmVyIGluIHF1ZXN0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21OdW1iZXIgPSBmcm9tTnVtYmVyO1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3dCaXRzXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoQml0c1xyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxuZnVuY3Rpb24gZnJvbUJpdHMobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKSB7XHJcbiAgICByZXR1cm4gbmV3IExvbmcobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgNjQgYml0IGludGVnZXIgdGhhdCBjb21lcyBieSBjb25jYXRlbmF0aW5nIHRoZSBnaXZlbiBsb3cgYW5kIGhpZ2ggYml0cy4gRWFjaCBpc1xyXG4gKiAgYXNzdW1lZCB0byB1c2UgMzIgYml0cy5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3dCaXRzIFRoZSBsb3cgMzIgYml0c1xyXG4gKiBAcGFyYW0ge251bWJlcn0gaGlnaEJpdHMgVGhlIGhpZ2ggMzIgYml0c1xyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxyXG4gKi9cclxuTG9uZy5mcm9tQml0cyA9IGZyb21CaXRzO1xyXG5cclxuLyoqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gYmFzZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gZXhwb25lbnRcclxuICogQHJldHVybnMge251bWJlcn1cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgcG93X2RibCA9IE1hdGgucG93OyAvLyBVc2VkIDQgdGltZXMgKDQqOCB0byAxNSs0KVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcclxuICogQHBhcmFtIHsoYm9vbGVhbnxudW1iZXIpPX0gdW5zaWduZWRcclxuICogQHBhcmFtIHtudW1iZXI9fSByYWRpeFxyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxuZnVuY3Rpb24gZnJvbVN0cmluZyhzdHIsIHVuc2lnbmVkLCByYWRpeCkge1xyXG4gICAgaWYgKHN0ci5sZW5ndGggPT09IDApXHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ2VtcHR5IHN0cmluZycpO1xyXG4gICAgaWYgKHN0ciA9PT0gXCJOYU5cIiB8fCBzdHIgPT09IFwiSW5maW5pdHlcIiB8fCBzdHIgPT09IFwiK0luZmluaXR5XCIgfHwgc3RyID09PSBcIi1JbmZpbml0eVwiKVxyXG4gICAgICAgIHJldHVybiBaRVJPO1xyXG4gICAgaWYgKHR5cGVvZiB1bnNpZ25lZCA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAvLyBGb3IgZ29vZy5tYXRoLmxvbmcgY29tcGF0aWJpbGl0eVxyXG4gICAgICAgIHJhZGl4ID0gdW5zaWduZWQsXHJcbiAgICAgICAgdW5zaWduZWQgPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdW5zaWduZWQgPSAhISB1bnNpZ25lZDtcclxuICAgIH1cclxuICAgIHJhZGl4ID0gcmFkaXggfHwgMTA7XHJcbiAgICBpZiAocmFkaXggPCAyIHx8IDM2IDwgcmFkaXgpXHJcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcigncmFkaXgnKTtcclxuXHJcbiAgICB2YXIgcDtcclxuICAgIGlmICgocCA9IHN0ci5pbmRleE9mKCctJykpID4gMClcclxuICAgICAgICB0aHJvdyBFcnJvcignaW50ZXJpb3IgaHlwaGVuJyk7XHJcbiAgICBlbHNlIGlmIChwID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIGZyb21TdHJpbmcoc3RyLnN1YnN0cmluZygxKSwgdW5zaWduZWQsIHJhZGl4KS5uZWcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEbyBzZXZlcmFsICg4KSBkaWdpdHMgZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AsIHNvIGFzIHRvXHJcbiAgICAvLyBtaW5pbWl6ZSB0aGUgY2FsbHMgdG8gdGhlIHZlcnkgZXhwZW5zaXZlIGVtdWxhdGVkIGRpdi5cclxuICAgIHZhciByYWRpeFRvUG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIDgpKTtcclxuXHJcbiAgICB2YXIgcmVzdWx0ID0gWkVSTztcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSArPSA4KSB7XHJcbiAgICAgICAgdmFyIHNpemUgPSBNYXRoLm1pbig4LCBzdHIubGVuZ3RoIC0gaSksXHJcbiAgICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQoc3RyLnN1YnN0cmluZyhpLCBpICsgc2l6ZSksIHJhZGl4KTtcclxuICAgICAgICBpZiAoc2l6ZSA8IDgpIHtcclxuICAgICAgICAgICAgdmFyIHBvd2VyID0gZnJvbU51bWJlcihwb3dfZGJsKHJhZGl4LCBzaXplKSk7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5tdWwocG93ZXIpLmFkZChmcm9tTnVtYmVyKHZhbHVlKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChyYWRpeFRvUG93ZXIpO1xyXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuYWRkKGZyb21OdW1iZXIodmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXN1bHQudW5zaWduZWQgPSB1bnNpZ25lZDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gc3RyaW5nLCB3cml0dGVuIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmFkaXguXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBMb25nXHJcbiAqIEBwYXJhbSB7KGJvb2xlYW58bnVtYmVyKT19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHBhcmFtIHtudW1iZXI9fSByYWRpeCBUaGUgcmFkaXggaW4gd2hpY2ggdGhlIHRleHQgaXMgd3JpdHRlbiAoMi0zNiksIGRlZmF1bHRzIHRvIDEwXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxyXG4gKi9cclxuTG9uZy5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcclxuXHJcbi8qKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfCF7bG93OiBudW1iZXIsIGhpZ2g6IG51bWJlciwgdW5zaWduZWQ6IGJvb2xlYW59fSB2YWxcclxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbmZ1bmN0aW9uIGZyb21WYWx1ZSh2YWwsIHVuc2lnbmVkKSB7XHJcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpXHJcbiAgICAgICAgcmV0dXJuIGZyb21OdW1iZXIodmFsLCB1bnNpZ25lZCk7XHJcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAgcmV0dXJuIGZyb21TdHJpbmcodmFsLCB1bnNpZ25lZCk7XHJcbiAgICAvLyBUaHJvd3MgZm9yIG5vbi1vYmplY3RzLCBjb252ZXJ0cyBub24taW5zdGFuY2VvZiBMb25nOlxyXG4gICAgcmV0dXJuIGZyb21CaXRzKHZhbC5sb3csIHZhbC5oaWdoLCB0eXBlb2YgdW5zaWduZWQgPT09ICdib29sZWFuJyA/IHVuc2lnbmVkIDogdmFsLnVuc2lnbmVkKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gYSBMb25nIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBmcm9tKiBmdW5jdGlvbiBmb3IgaXRzIHR5cGUuXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd8IXtsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyLCB1bnNpZ25lZDogYm9vbGVhbn19IHZhbCBWYWx1ZVxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICovXHJcbkxvbmcuZnJvbVZhbHVlID0gZnJvbVZhbHVlO1xyXG5cclxuLy8gTk9URTogdGhlIGNvbXBpbGVyIHNob3VsZCBpbmxpbmUgdGhlc2UgY29uc3RhbnQgdmFsdWVzIGJlbG93IGFuZCB0aGVuIHJlbW92ZSB0aGVzZSB2YXJpYWJsZXMsIHNvIHRoZXJlIHNob3VsZCBiZVxyXG4vLyBubyBydW50aW1lIHBlbmFsdHkgZm9yIHRoZXNlLlxyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdFxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBUV09fUFdSXzE2X0RCTCA9IDEgPDwgMTY7XHJcblxyXG4vKipcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFRXT19QV1JfMjRfREJMID0gMSA8PCAyNDtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RcclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVFdPX1BXUl8zMl9EQkwgPSBUV09fUFdSXzE2X0RCTCAqIFRXT19QV1JfMTZfREJMO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdFxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBUV09fUFdSXzY0X0RCTCA9IFRXT19QV1JfMzJfREJMICogVFdPX1BXUl8zMl9EQkw7XHJcblxyXG4vKipcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFRXT19QV1JfNjNfREJMID0gVFdPX1BXUl82NF9EQkwgLyAyO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGNvbnN0XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFRXT19QV1JfMjQgPSBmcm9tSW50KFRXT19QV1JfMjRfREJMKTtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIFpFUk8gPSBmcm9tSW50KDApO1xyXG5cclxuLyoqXHJcbiAqIFNpZ25lZCB6ZXJvLlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nLlpFUk8gPSBaRVJPO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgVVpFUk8gPSBmcm9tSW50KDAsIHRydWUpO1xyXG5cclxuLyoqXHJcbiAqIFVuc2lnbmVkIHplcm8uXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICovXHJcbkxvbmcuVVpFUk8gPSBVWkVSTztcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIE9ORSA9IGZyb21JbnQoMSk7XHJcblxyXG4vKipcclxuICogU2lnbmVkIG9uZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5PTkUgPSBPTkU7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBVT05FID0gZnJvbUludCgxLCB0cnVlKTtcclxuXHJcbi8qKlxyXG4gKiBVbnNpZ25lZCBvbmUuXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICovXHJcbkxvbmcuVU9ORSA9IFVPTkU7XHJcblxyXG4vKipcclxuICogQHR5cGUgeyFMb25nfVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBORUdfT05FID0gZnJvbUludCgtMSk7XHJcblxyXG4vKipcclxuICogU2lnbmVkIG5lZ2F0aXZlIG9uZS5cclxuICogQHR5cGUgeyFMb25nfVxyXG4gKi9cclxuTG9uZy5ORUdfT05FID0gTkVHX09ORTtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7IUxvbmd9XHJcbiAqIEBpbm5lclxyXG4gKi9cclxudmFyIE1BWF9WQUxVRSA9IGZyb21CaXRzKDB4RkZGRkZGRkZ8MCwgMHg3RkZGRkZGRnwwLCBmYWxzZSk7XHJcblxyXG4vKipcclxuICogTWF4aW11bSBzaWduZWQgdmFsdWUuXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICovXHJcbkxvbmcuTUFYX1ZBTFVFID0gTUFYX1ZBTFVFO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgTUFYX1VOU0lHTkVEX1ZBTFVFID0gZnJvbUJpdHMoMHhGRkZGRkZGRnwwLCAweEZGRkZGRkZGfDAsIHRydWUpO1xyXG5cclxuLyoqXHJcbiAqIE1heGltdW0gdW5zaWduZWQgdmFsdWUuXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICovXHJcbkxvbmcuTUFYX1VOU0lHTkVEX1ZBTFVFID0gTUFYX1VOU0lHTkVEX1ZBTFVFO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICogQGlubmVyXHJcbiAqL1xyXG52YXIgTUlOX1ZBTFVFID0gZnJvbUJpdHMoMCwgMHg4MDAwMDAwMHwwLCBmYWxzZSk7XHJcblxyXG4vKipcclxuICogTWluaW11bSBzaWduZWQgdmFsdWUuXHJcbiAqIEB0eXBlIHshTG9uZ31cclxuICovXHJcbkxvbmcuTUlOX1ZBTFVFID0gTUlOX1ZBTFVFO1xyXG5cclxuLyoqXHJcbiAqIEBhbGlhcyBMb25nLnByb3RvdHlwZVxyXG4gKiBAaW5uZXJcclxuICovXHJcbnZhciBMb25nUHJvdG90eXBlID0gTG9uZy5wcm90b3R5cGU7XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhlIExvbmcgdG8gYSAzMiBiaXQgaW50ZWdlciwgYXNzdW1pbmcgaXQgaXMgYSAzMiBiaXQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUudG9JbnQgPSBmdW5jdGlvbiB0b0ludCgpIHtcclxuICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gdGhpcy5sb3cgPj4+IDAgOiB0aGlzLmxvdztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIHRoZSBuZWFyZXN0IGZsb2F0aW5nLXBvaW50IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdmFsdWUgKGRvdWJsZSwgNTMgYml0IG1hbnRpc3NhKS5cclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbiB0b051bWJlcigpIHtcclxuICAgIGlmICh0aGlzLnVuc2lnbmVkKVxyXG4gICAgICAgIHJldHVybiAoKHRoaXMuaGlnaCA+Pj4gMCkgKiBUV09fUFdSXzMyX0RCTCkgKyAodGhpcy5sb3cgPj4+IDApO1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaCAqIFRXT19QV1JfMzJfREJMICsgKHRoaXMubG93ID4+PiAwKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIHN0cmluZyB3cml0dGVuIGluIHRoZSBzcGVjaWZpZWQgcmFkaXguXHJcbiAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXggUmFkaXggKDItMzYpLCBkZWZhdWx0cyB0byAxMFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKiBAb3ZlcnJpZGVcclxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gSWYgYHJhZGl4YCBpcyBvdXQgb2YgcmFuZ2VcclxuICovXHJcbkxvbmdQcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhyYWRpeCkge1xyXG4gICAgcmFkaXggPSByYWRpeCB8fCAxMDtcclxuICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeClcclxuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKCdyYWRpeCcpO1xyXG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpXHJcbiAgICAgICAgcmV0dXJuICcwJztcclxuICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkgeyAvLyBVbnNpZ25lZCBMb25ncyBhcmUgbmV2ZXIgbmVnYXRpdmVcclxuICAgICAgICBpZiAodGhpcy5lcShNSU5fVkFMVUUpKSB7XHJcbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2hhbmdlIHRoZSBMb25nIHZhbHVlIGJlZm9yZSBpdCBjYW4gYmUgbmVnYXRlZCwgc28gd2UgcmVtb3ZlXHJcbiAgICAgICAgICAgIC8vIHRoZSBib3R0b20tbW9zdCBkaWdpdCBpbiB0aGlzIGJhc2UgYW5kIHRoZW4gcmVjdXJzZSB0byBkbyB0aGUgcmVzdC5cclxuICAgICAgICAgICAgdmFyIHJhZGl4TG9uZyA9IGZyb21OdW1iZXIocmFkaXgpLFxyXG4gICAgICAgICAgICAgICAgZGl2ID0gdGhpcy5kaXYocmFkaXhMb25nKSxcclxuICAgICAgICAgICAgICAgIHJlbTEgPSBkaXYubXVsKHJhZGl4TG9uZykuc3ViKHRoaXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGl2LnRvU3RyaW5nKHJhZGl4KSArIHJlbTEudG9JbnQoKS50b1N0cmluZyhyYWRpeCk7XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgIHJldHVybiAnLScgKyB0aGlzLm5lZygpLnRvU3RyaW5nKHJhZGl4KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEbyBzZXZlcmFsICg2KSBkaWdpdHMgZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AsIHNvIGFzIHRvXHJcbiAgICAvLyBtaW5pbWl6ZSB0aGUgY2FsbHMgdG8gdGhlIHZlcnkgZXhwZW5zaXZlIGVtdWxhdGVkIGRpdi5cclxuICAgIHZhciByYWRpeFRvUG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIDYpLCB0aGlzLnVuc2lnbmVkKSxcclxuICAgICAgICByZW0gPSB0aGlzO1xyXG4gICAgdmFyIHJlc3VsdCA9ICcnO1xyXG4gICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgICB2YXIgcmVtRGl2ID0gcmVtLmRpdihyYWRpeFRvUG93ZXIpLFxyXG4gICAgICAgICAgICBpbnR2YWwgPSByZW0uc3ViKHJlbURpdi5tdWwocmFkaXhUb1Bvd2VyKSkudG9JbnQoKSA+Pj4gMCxcclxuICAgICAgICAgICAgZGlnaXRzID0gaW50dmFsLnRvU3RyaW5nKHJhZGl4KTtcclxuICAgICAgICByZW0gPSByZW1EaXY7XHJcbiAgICAgICAgaWYgKHJlbS5pc1plcm8oKSlcclxuICAgICAgICAgICAgcmV0dXJuIGRpZ2l0cyArIHJlc3VsdDtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgd2hpbGUgKGRpZ2l0cy5sZW5ndGggPCA2KVxyXG4gICAgICAgICAgICAgICAgZGlnaXRzID0gJzAnICsgZGlnaXRzO1xyXG4gICAgICAgICAgICByZXN1bHQgPSAnJyArIGRpZ2l0cyArIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG4vKipcclxuICogR2V0cyB0aGUgaGlnaCAzMiBiaXRzIGFzIGEgc2lnbmVkIGludGVnZXIuXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFNpZ25lZCBoaWdoIGJpdHNcclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ2V0SGlnaEJpdHMgPSBmdW5jdGlvbiBnZXRIaWdoQml0cygpIHtcclxuICAgIHJldHVybiB0aGlzLmhpZ2g7XHJcbn07XHJcblxyXG4vKipcclxuICogR2V0cyB0aGUgaGlnaCAzMiBiaXRzIGFzIGFuIHVuc2lnbmVkIGludGVnZXIuXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFVuc2lnbmVkIGhpZ2ggYml0c1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5nZXRIaWdoQml0c1Vuc2lnbmVkID0gZnVuY3Rpb24gZ2V0SGlnaEJpdHNVbnNpZ25lZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmhpZ2ggPj4+IDA7XHJcbn07XHJcblxyXG4vKipcclxuICogR2V0cyB0aGUgbG93IDMyIGJpdHMgYXMgYSBzaWduZWQgaW50ZWdlci5cclxuICogQHJldHVybnMge251bWJlcn0gU2lnbmVkIGxvdyBiaXRzXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmdldExvd0JpdHMgPSBmdW5jdGlvbiBnZXRMb3dCaXRzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubG93O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIGxvdyAzMiBiaXRzIGFzIGFuIHVuc2lnbmVkIGludGVnZXIuXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFVuc2lnbmVkIGxvdyBiaXRzXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmdldExvd0JpdHNVbnNpZ25lZCA9IGZ1bmN0aW9uIGdldExvd0JpdHNVbnNpZ25lZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmxvdyA+Pj4gMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGlzIExvbmcuXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmdldE51bUJpdHNBYnMgPSBmdW5jdGlvbiBnZXROdW1CaXRzQWJzKCkge1xyXG4gICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSAvLyBVbnNpZ25lZCBMb25ncyBhcmUgbmV2ZXIgbmVnYXRpdmVcclxuICAgICAgICByZXR1cm4gdGhpcy5lcShNSU5fVkFMVUUpID8gNjQgOiB0aGlzLm5lZygpLmdldE51bUJpdHNBYnMoKTtcclxuICAgIHZhciB2YWwgPSB0aGlzLmhpZ2ggIT0gMCA/IHRoaXMuaGlnaCA6IHRoaXMubG93O1xyXG4gICAgZm9yICh2YXIgYml0ID0gMzE7IGJpdCA+IDA7IGJpdC0tKVxyXG4gICAgICAgIGlmICgodmFsICYgKDEgPDwgYml0KSkgIT0gMClcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdoICE9IDAgPyBiaXQgKyAzMyA6IGJpdCArIDE7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHplcm8uXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5pc1plcm8gPSBmdW5jdGlvbiBpc1plcm8oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdoID09PSAwICYmIHRoaXMubG93ID09PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB6ZXJvLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2lzWmVyb30uXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5lcXogPSBMb25nUHJvdG90eXBlLmlzWmVybztcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBuZWdhdGl2ZS5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmlzTmVnYXRpdmUgPSBmdW5jdGlvbiBpc05lZ2F0aXZlKCkge1xyXG4gICAgcmV0dXJuICF0aGlzLnVuc2lnbmVkICYmIHRoaXMuaGlnaCA8IDA7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgcG9zaXRpdmUuXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5pc1Bvc2l0aXZlID0gZnVuY3Rpb24gaXNQb3NpdGl2ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnVuc2lnbmVkIHx8IHRoaXMuaGlnaCA+PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG9kZC5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmlzT2RkID0gZnVuY3Rpb24gaXNPZGQoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMubG93ICYgMSkgPT09IDE7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZXZlbi5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmlzRXZlbiA9IGZ1bmN0aW9uIGlzRXZlbigpIHtcclxuICAgIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcclxuICAgIGlmICghaXNMb25nKG90aGVyKSlcclxuICAgICAgICBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XHJcbiAgICBpZiAodGhpcy51bnNpZ25lZCAhPT0gb3RoZXIudW5zaWduZWQgJiYgKHRoaXMuaGlnaCA+Pj4gMzEpID09PSAxICYmIChvdGhlci5oaWdoID4+PiAzMSkgPT09IDEpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaCA9PT0gb3RoZXIuaGlnaCAmJiB0aGlzLmxvdyA9PT0gb3RoZXIubG93O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZXF1YWxzfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmVxID0gTG9uZ1Byb3RvdHlwZS5lcXVhbHM7XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzcGVjaWZpZWQncy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUubm90RXF1YWxzID0gZnVuY3Rpb24gbm90RXF1YWxzKG90aGVyKSB7XHJcbiAgICByZXR1cm4gIXRoaXMuZXEoLyogdmFsaWRhdGVzICovIG90aGVyKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI25vdEVxdWFsc30uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5uZXEgPSBMb25nUHJvdG90eXBlLm5vdEVxdWFscztcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI25vdEVxdWFsc30uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5uZSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmxlc3NUaGFuID0gZnVuY3Rpb24gbGVzc1RoYW4ob3RoZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8IDA7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNsZXNzVGhhbn0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5sdCA9IExvbmdQcm90b3R5cGUubGVzc1RoYW47XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsID0gZnVuY3Rpb24gbGVzc1RoYW5PckVxdWFsKG90aGVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPD0gMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFuT3JFcXVhbH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5sdGUgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuT3JFcXVhbDtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFuT3JFcXVhbH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5sZSA9IExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuID0gZnVuY3Rpb24gZ3JlYXRlclRoYW4ob3RoZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA+IDA7XHJcbn07XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNncmVhdGVyVGhhbn0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ndCA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW47XHJcblxyXG4vKipcclxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsID0gZnVuY3Rpb24gZ3JlYXRlclRoYW5PckVxdWFsKG90aGVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPj0gMDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFuT3JFcXVhbH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5ndGUgPSBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbDtcclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFuT3JFcXVhbH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5nZSA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsO1xyXG5cclxuLyoqXHJcbiAqIENvbXBhcmVzIHRoaXMgTG9uZydzIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCdzLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IDAgaWYgdGhleSBhcmUgdGhlIHNhbWUsIDEgaWYgdGhlIHRoaXMgaXMgZ3JlYXRlciBhbmQgLTFcclxuICogIGlmIHRoZSBnaXZlbiBvbmUgaXMgZ3JlYXRlclxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZShvdGhlcikge1xyXG4gICAgaWYgKCFpc0xvbmcob3RoZXIpKVxyXG4gICAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcclxuICAgIGlmICh0aGlzLmVxKG90aGVyKSlcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIHZhciB0aGlzTmVnID0gdGhpcy5pc05lZ2F0aXZlKCksXHJcbiAgICAgICAgb3RoZXJOZWcgPSBvdGhlci5pc05lZ2F0aXZlKCk7XHJcbiAgICBpZiAodGhpc05lZyAmJiAhb3RoZXJOZWcpXHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgaWYgKCF0aGlzTmVnICYmIG90aGVyTmVnKVxyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgc2lnbiBiaXRzIGFyZSB0aGUgc2FtZVxyXG4gICAgaWYgKCF0aGlzLnVuc2lnbmVkKVxyXG4gICAgICAgIHJldHVybiB0aGlzLnN1YihvdGhlcikuaXNOZWdhdGl2ZSgpID8gLTEgOiAxO1xyXG4gICAgLy8gQm90aCBhcmUgcG9zaXRpdmUgaWYgYXQgbGVhc3Qgb25lIGlzIHVuc2lnbmVkXHJcbiAgICByZXR1cm4gKG90aGVyLmhpZ2ggPj4+IDApID4gKHRoaXMuaGlnaCA+Pj4gMCkgfHwgKG90aGVyLmhpZ2ggPT09IHRoaXMuaGlnaCAmJiAob3RoZXIubG93ID4+PiAwKSA+ICh0aGlzLmxvdyA+Pj4gMCkpID8gLTEgOiAxO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbXBhcmVzIHRoaXMgTG9uZydzIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2NvbXBhcmV9LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lLCAxIGlmIHRoZSB0aGlzIGlzIGdyZWF0ZXIgYW5kIC0xXHJcbiAqICBpZiB0aGUgZ2l2ZW4gb25lIGlzIGdyZWF0ZXJcclxuICovXHJcbkxvbmdQcm90b3R5cGUuY29tcCA9IExvbmdQcm90b3R5cGUuY29tcGFyZTtcclxuXHJcbi8qKlxyXG4gKiBOZWdhdGVzIHRoaXMgTG9uZydzIHZhbHVlLlxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IE5lZ2F0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5uZWdhdGUgPSBmdW5jdGlvbiBuZWdhdGUoKSB7XHJcbiAgICBpZiAoIXRoaXMudW5zaWduZWQgJiYgdGhpcy5lcShNSU5fVkFMVUUpKVxyXG4gICAgICAgIHJldHVybiBNSU5fVkFMVUU7XHJcbiAgICByZXR1cm4gdGhpcy5ub3QoKS5hZGQoT05FKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBOZWdhdGVzIHRoaXMgTG9uZydzIHZhbHVlLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI25lZ2F0ZX0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IE5lZ2F0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5uZWcgPSBMb25nUHJvdG90eXBlLm5lZ2F0ZTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IGFkZGVuZCBBZGRlbmRcclxuICogQHJldHVybnMgeyFMb25nfSBTdW1cclxuICovXHJcbkxvbmdQcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKGFkZGVuZCkge1xyXG4gICAgaWYgKCFpc0xvbmcoYWRkZW5kKSlcclxuICAgICAgICBhZGRlbmQgPSBmcm9tVmFsdWUoYWRkZW5kKTtcclxuXHJcbiAgICAvLyBEaXZpZGUgZWFjaCBudW1iZXIgaW50byA0IGNodW5rcyBvZiAxNiBiaXRzLCBhbmQgdGhlbiBzdW0gdGhlIGNodW5rcy5cclxuXHJcbiAgICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcclxuICAgIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiAweEZGRkY7XHJcbiAgICB2YXIgYTE2ID0gdGhpcy5sb3cgPj4+IDE2O1xyXG4gICAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhGRkZGO1xyXG5cclxuICAgIHZhciBiNDggPSBhZGRlbmQuaGlnaCA+Pj4gMTY7XHJcbiAgICB2YXIgYjMyID0gYWRkZW5kLmhpZ2ggJiAweEZGRkY7XHJcbiAgICB2YXIgYjE2ID0gYWRkZW5kLmxvdyA+Pj4gMTY7XHJcbiAgICB2YXIgYjAwID0gYWRkZW5kLmxvdyAmIDB4RkZGRjtcclxuXHJcbiAgICB2YXIgYzQ4ID0gMCwgYzMyID0gMCwgYzE2ID0gMCwgYzAwID0gMDtcclxuICAgIGMwMCArPSBhMDAgKyBiMDA7XHJcbiAgICBjMTYgKz0gYzAwID4+PiAxNjtcclxuICAgIGMwMCAmPSAweEZGRkY7XHJcbiAgICBjMTYgKz0gYTE2ICsgYjE2O1xyXG4gICAgYzMyICs9IGMxNiA+Pj4gMTY7XHJcbiAgICBjMTYgJj0gMHhGRkZGO1xyXG4gICAgYzMyICs9IGEzMiArIGIzMjtcclxuICAgIGM0OCArPSBjMzIgPj4+IDE2O1xyXG4gICAgYzMyICY9IDB4RkZGRjtcclxuICAgIGM0OCArPSBhNDggKyBiNDg7XHJcbiAgICBjNDggJj0gMHhGRkZGO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKChjMTYgPDwgMTYpIHwgYzAwLCAoYzQ4IDw8IDE2KSB8IGMzMiwgdGhpcy51bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gc3VidHJhaGVuZCBTdWJ0cmFoZW5kXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gRGlmZmVyZW5jZVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uIHN1YnRyYWN0KHN1YnRyYWhlbmQpIHtcclxuICAgIGlmICghaXNMb25nKHN1YnRyYWhlbmQpKVxyXG4gICAgICAgIHN1YnRyYWhlbmQgPSBmcm9tVmFsdWUoc3VidHJhaGVuZCk7XHJcbiAgICByZXR1cm4gdGhpcy5hZGQoc3VidHJhaGVuZC5uZWcoKSk7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc3VidHJhY3R9LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBzdWJ0cmFoZW5kIFN1YnRyYWhlbmRcclxuICogQHJldHVybnMgeyFMb25nfSBEaWZmZXJlbmNlXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnN1YiA9IExvbmdQcm90b3R5cGUuc3VidHJhY3Q7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gbXVsdGlwbGllciBNdWx0aXBsaWVyXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5tdWx0aXBseSA9IGZ1bmN0aW9uIG11bHRpcGx5KG11bHRpcGxpZXIpIHtcclxuICAgIGlmICh0aGlzLmlzWmVybygpKVxyXG4gICAgICAgIHJldHVybiBaRVJPO1xyXG4gICAgaWYgKCFpc0xvbmcobXVsdGlwbGllcikpXHJcbiAgICAgICAgbXVsdGlwbGllciA9IGZyb21WYWx1ZShtdWx0aXBsaWVyKTtcclxuXHJcbiAgICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcclxuICAgIGlmICh3YXNtKSB7XHJcbiAgICAgICAgdmFyIGxvdyA9IHdhc20ubXVsKHRoaXMubG93LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2gsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxpZXIubG93LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsaWVyLmhpZ2gpO1xyXG4gICAgICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc20uZ2V0X2hpZ2goKSwgdGhpcy51bnNpZ25lZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG11bHRpcGxpZXIuaXNaZXJvKCkpXHJcbiAgICAgICAgcmV0dXJuIFpFUk87XHJcbiAgICBpZiAodGhpcy5lcShNSU5fVkFMVUUpKVxyXG4gICAgICAgIHJldHVybiBtdWx0aXBsaWVyLmlzT2RkKCkgPyBNSU5fVkFMVUUgOiBaRVJPO1xyXG4gICAgaWYgKG11bHRpcGxpZXIuZXEoTUlOX1ZBTFVFKSlcclxuICAgICAgICByZXR1cm4gdGhpcy5pc09kZCgpID8gTUlOX1ZBTFVFIDogWkVSTztcclxuXHJcbiAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHtcclxuICAgICAgICBpZiAobXVsdGlwbGllci5pc05lZ2F0aXZlKCkpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5lZygpLm11bChtdWx0aXBsaWVyLm5lZygpKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5lZygpLm11bChtdWx0aXBsaWVyKS5uZWcoKTtcclxuICAgIH0gZWxzZSBpZiAobXVsdGlwbGllci5pc05lZ2F0aXZlKCkpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsKG11bHRpcGxpZXIubmVnKCkpLm5lZygpO1xyXG5cclxuICAgIC8vIElmIGJvdGggbG9uZ3MgYXJlIHNtYWxsLCB1c2UgZmxvYXQgbXVsdGlwbGljYXRpb25cclxuICAgIGlmICh0aGlzLmx0KFRXT19QV1JfMjQpICYmIG11bHRpcGxpZXIubHQoVFdPX1BXUl8yNCkpXHJcbiAgICAgICAgcmV0dXJuIGZyb21OdW1iZXIodGhpcy50b051bWJlcigpICogbXVsdGlwbGllci50b051bWJlcigpLCB0aGlzLnVuc2lnbmVkKTtcclxuXHJcbiAgICAvLyBEaXZpZGUgZWFjaCBsb25nIGludG8gNCBjaHVua3Mgb2YgMTYgYml0cywgYW5kIHRoZW4gYWRkIHVwIDR4NCBwcm9kdWN0cy5cclxuICAgIC8vIFdlIGNhbiBza2lwIHByb2R1Y3RzIHRoYXQgd291bGQgb3ZlcmZsb3cuXHJcblxyXG4gICAgdmFyIGE0OCA9IHRoaXMuaGlnaCA+Pj4gMTY7XHJcbiAgICB2YXIgYTMyID0gdGhpcy5oaWdoICYgMHhGRkZGO1xyXG4gICAgdmFyIGExNiA9IHRoaXMubG93ID4+PiAxNjtcclxuICAgIHZhciBhMDAgPSB0aGlzLmxvdyAmIDB4RkZGRjtcclxuXHJcbiAgICB2YXIgYjQ4ID0gbXVsdGlwbGllci5oaWdoID4+PiAxNjtcclxuICAgIHZhciBiMzIgPSBtdWx0aXBsaWVyLmhpZ2ggJiAweEZGRkY7XHJcbiAgICB2YXIgYjE2ID0gbXVsdGlwbGllci5sb3cgPj4+IDE2O1xyXG4gICAgdmFyIGIwMCA9IG11bHRpcGxpZXIubG93ICYgMHhGRkZGO1xyXG5cclxuICAgIHZhciBjNDggPSAwLCBjMzIgPSAwLCBjMTYgPSAwLCBjMDAgPSAwO1xyXG4gICAgYzAwICs9IGEwMCAqIGIwMDtcclxuICAgIGMxNiArPSBjMDAgPj4+IDE2O1xyXG4gICAgYzAwICY9IDB4RkZGRjtcclxuICAgIGMxNiArPSBhMTYgKiBiMDA7XHJcbiAgICBjMzIgKz0gYzE2ID4+PiAxNjtcclxuICAgIGMxNiAmPSAweEZGRkY7XHJcbiAgICBjMTYgKz0gYTAwICogYjE2O1xyXG4gICAgYzMyICs9IGMxNiA+Pj4gMTY7XHJcbiAgICBjMTYgJj0gMHhGRkZGO1xyXG4gICAgYzMyICs9IGEzMiAqIGIwMDtcclxuICAgIGM0OCArPSBjMzIgPj4+IDE2O1xyXG4gICAgYzMyICY9IDB4RkZGRjtcclxuICAgIGMzMiArPSBhMTYgKiBiMTY7XHJcbiAgICBjNDggKz0gYzMyID4+PiAxNjtcclxuICAgIGMzMiAmPSAweEZGRkY7XHJcbiAgICBjMzIgKz0gYTAwICogYjMyO1xyXG4gICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XHJcbiAgICBjMzIgJj0gMHhGRkZGO1xyXG4gICAgYzQ4ICs9IGE0OCAqIGIwMCArIGEzMiAqIGIxNiArIGExNiAqIGIzMiArIGEwMCAqIGI0ODtcclxuICAgIGM0OCAmPSAweEZGRkY7XHJcbiAgICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtdWx0aXBseX0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG11bHRpcGxpZXIgTXVsdGlwbGllclxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFByb2R1Y3RcclxuICovXHJcbkxvbmdQcm90b3R5cGUubXVsID0gTG9uZ1Byb3RvdHlwZS5tdWx0aXBseTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQuIFRoZSByZXN1bHQgaXMgc2lnbmVkIGlmIHRoaXMgTG9uZyBpcyBzaWduZWQgb3JcclxuICogIHVuc2lnbmVkIGlmIHRoaXMgTG9uZyBpcyB1bnNpZ25lZC5cclxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcclxuICogQHJldHVybnMgeyFMb25nfSBRdW90aWVudFxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5kaXZpZGUgPSBmdW5jdGlvbiBkaXZpZGUoZGl2aXNvcikge1xyXG4gICAgaWYgKCFpc0xvbmcoZGl2aXNvcikpXHJcbiAgICAgICAgZGl2aXNvciA9IGZyb21WYWx1ZShkaXZpc29yKTtcclxuICAgIGlmIChkaXZpc29yLmlzWmVybygpKVxyXG4gICAgICAgIHRocm93IEVycm9yKCdkaXZpc2lvbiBieSB6ZXJvJyk7XHJcblxyXG4gICAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XHJcbiAgICBpZiAod2FzbSkge1xyXG4gICAgICAgIC8vIGd1YXJkIGFnYWluc3Qgc2lnbmVkIGRpdmlzaW9uIG92ZXJmbG93OiB0aGUgbGFyZ2VzdFxyXG4gICAgICAgIC8vIG5lZ2F0aXZlIG51bWJlciAvIC0xIHdvdWxkIGJlIDEgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3RcclxuICAgICAgICAvLyBwb3NpdGl2ZSBudW1iZXIsIGR1ZSB0byB0d28ncyBjb21wbGVtZW50LlxyXG4gICAgICAgIGlmICghdGhpcy51bnNpZ25lZCAmJlxyXG4gICAgICAgICAgICB0aGlzLmhpZ2ggPT09IC0weDgwMDAwMDAwICYmXHJcbiAgICAgICAgICAgIGRpdmlzb3IubG93ID09PSAtMSAmJiBkaXZpc29yLmhpZ2ggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIC8vIGJlIGNvbnNpc3RlbnQgd2l0aCBub24td2FzbSBjb2RlIHBhdGhcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc20uZGl2X3UgOiB3YXNtLmRpdl9zKShcclxuICAgICAgICAgICAgdGhpcy5sb3csXHJcbiAgICAgICAgICAgIHRoaXMuaGlnaCxcclxuICAgICAgICAgICAgZGl2aXNvci5sb3csXHJcbiAgICAgICAgICAgIGRpdmlzb3IuaGlnaFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbS5nZXRfaGlnaCgpLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc1plcm8oKSlcclxuICAgICAgICByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcclxuICAgIHZhciBhcHByb3gsIHJlbSwgcmVzO1xyXG4gICAgaWYgKCF0aGlzLnVuc2lnbmVkKSB7XHJcbiAgICAgICAgLy8gVGhpcyBzZWN0aW9uIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHNpZ25lZCBsb25ncyBhbmQgaXMgZGVyaXZlZCBmcm9tIHRoZVxyXG4gICAgICAgIC8vIGNsb3N1cmUgbGlicmFyeSBhcyBhIHdob2xlLlxyXG4gICAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcclxuICAgICAgICAgICAgaWYgKGRpdmlzb3IuZXEoT05FKSB8fCBkaXZpc29yLmVxKE5FR19PTkUpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTsgIC8vIHJlY2FsbCB0aGF0IC1NSU5fVkFMVUUgPT0gTUlOX1ZBTFVFXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGRpdmlzb3IuZXEoTUlOX1ZBTFVFKSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBPTkU7XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSB8b3RoZXJ8ID49IDIsIHNvIHx0aGlzL290aGVyfCA8IHxNSU5fVkFMVUV8LlxyXG4gICAgICAgICAgICAgICAgdmFyIGhhbGZUaGlzID0gdGhpcy5zaHIoMSk7XHJcbiAgICAgICAgICAgICAgICBhcHByb3ggPSBoYWxmVGhpcy5kaXYoZGl2aXNvcikuc2hsKDEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFwcHJveC5lcShaRVJPKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXZpc29yLmlzTmVnYXRpdmUoKSA/IE9ORSA6IE5FR19PTkU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbSA9IHRoaXMuc3ViKGRpdmlzb3IubXVsKGFwcHJveCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IGFwcHJveC5hZGQocmVtLmRpdihkaXZpc29yKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUpKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcclxuICAgICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHtcclxuICAgICAgICAgICAgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSgpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkuZGl2KGRpdmlzb3IubmVnKCkpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uZWcoKS5kaXYoZGl2aXNvcikubmVnKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkaXZpc29yLmlzTmVnYXRpdmUoKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGl2KGRpdmlzb3IubmVnKCkpLm5lZygpO1xyXG4gICAgICAgIHJlcyA9IFpFUk87XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIFRoZSBhbGdvcml0aG0gYmVsb3cgaGFzIG5vdCBiZWVuIG1hZGUgZm9yIHVuc2lnbmVkIGxvbmdzLiBJdCdzIHRoZXJlZm9yZVxyXG4gICAgICAgIC8vIHJlcXVpcmVkIHRvIHRha2Ugc3BlY2lhbCBjYXJlIG9mIHRoZSBNU0IgcHJpb3IgdG8gcnVubmluZyBpdC5cclxuICAgICAgICBpZiAoIWRpdmlzb3IudW5zaWduZWQpXHJcbiAgICAgICAgICAgIGRpdmlzb3IgPSBkaXZpc29yLnRvVW5zaWduZWQoKTtcclxuICAgICAgICBpZiAoZGl2aXNvci5ndCh0aGlzKSlcclxuICAgICAgICAgICAgcmV0dXJuIFVaRVJPO1xyXG4gICAgICAgIGlmIChkaXZpc29yLmd0KHRoaXMuc2hydSgxKSkpIC8vIDE1ID4+PiAxID0gNyA7IHdpdGggZGl2aXNvciA9IDggOyB0cnVlXHJcbiAgICAgICAgICAgIHJldHVybiBVT05FO1xyXG4gICAgICAgIHJlcyA9IFVaRVJPO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlcGVhdCB0aGUgZm9sbG93aW5nIHVudGlsIHRoZSByZW1haW5kZXIgaXMgbGVzcyB0aGFuIG90aGVyOiAgZmluZCBhXHJcbiAgICAvLyBmbG9hdGluZy1wb2ludCB0aGF0IGFwcHJveGltYXRlcyByZW1haW5kZXIgLyBvdGhlciAqZnJvbSBiZWxvdyosIGFkZCB0aGlzXHJcbiAgICAvLyBpbnRvIHRoZSByZXN1bHQsIGFuZCBzdWJ0cmFjdCBpdCBmcm9tIHRoZSByZW1haW5kZXIuICBJdCBpcyBjcml0aWNhbCB0aGF0XHJcbiAgICAvLyB0aGUgYXBwcm94aW1hdGUgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSByZWFsIHZhbHVlIHNvIHRoYXQgdGhlXHJcbiAgICAvLyByZW1haW5kZXIgbmV2ZXIgYmVjb21lcyBuZWdhdGl2ZS5cclxuICAgIHJlbSA9IHRoaXM7XHJcbiAgICB3aGlsZSAocmVtLmd0ZShkaXZpc29yKSkge1xyXG4gICAgICAgIC8vIEFwcHJveGltYXRlIHRoZSByZXN1bHQgb2YgZGl2aXNpb24uIFRoaXMgbWF5IGJlIGEgbGl0dGxlIGdyZWF0ZXIgb3JcclxuICAgICAgICAvLyBzbWFsbGVyIHRoYW4gdGhlIGFjdHVhbCB2YWx1ZS5cclxuICAgICAgICBhcHByb3ggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHJlbS50b051bWJlcigpIC8gZGl2aXNvci50b051bWJlcigpKSk7XHJcblxyXG4gICAgICAgIC8vIFdlIHdpbGwgdHdlYWsgdGhlIGFwcHJveGltYXRlIHJlc3VsdCBieSBjaGFuZ2luZyBpdCBpbiB0aGUgNDgtdGggZGlnaXQgb3JcclxuICAgICAgICAvLyB0aGUgc21hbGxlc3Qgbm9uLWZyYWN0aW9uYWwgZGlnaXQsIHdoaWNoZXZlciBpcyBsYXJnZXIuXHJcbiAgICAgICAgdmFyIGxvZzIgPSBNYXRoLmNlaWwoTWF0aC5sb2coYXBwcm94KSAvIE1hdGguTE4yKSxcclxuICAgICAgICAgICAgZGVsdGEgPSAobG9nMiA8PSA0OCkgPyAxIDogcG93X2RibCgyLCBsb2cyIC0gNDgpLFxyXG5cclxuICAgICAgICAvLyBEZWNyZWFzZSB0aGUgYXBwcm94aW1hdGlvbiB1bnRpbCBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlbWFpbmRlci4gIE5vdGVcclxuICAgICAgICAvLyB0aGF0IGlmIGl0IGlzIHRvbyBsYXJnZSwgdGhlIHByb2R1Y3Qgb3ZlcmZsb3dzIGFuZCBpcyBuZWdhdGl2ZS5cclxuICAgICAgICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gpLFxyXG4gICAgICAgICAgICBhcHByb3hSZW0gPSBhcHByb3hSZXMubXVsKGRpdmlzb3IpO1xyXG4gICAgICAgIHdoaWxlIChhcHByb3hSZW0uaXNOZWdhdGl2ZSgpIHx8IGFwcHJveFJlbS5ndChyZW0pKSB7XHJcbiAgICAgICAgICAgIGFwcHJveCAtPSBkZWx0YTtcclxuICAgICAgICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gsIHRoaXMudW5zaWduZWQpO1xyXG4gICAgICAgICAgICBhcHByb3hSZW0gPSBhcHByb3hSZXMubXVsKGRpdmlzb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gV2Uga25vdyB0aGUgYW5zd2VyIGNhbid0IGJlIHplcm8uLi4gYW5kIGFjdHVhbGx5LCB6ZXJvIHdvdWxkIGNhdXNlXHJcbiAgICAgICAgLy8gaW5maW5pdGUgcmVjdXJzaW9uIHNpbmNlIHdlIHdvdWxkIG1ha2Ugbm8gcHJvZ3Jlc3MuXHJcbiAgICAgICAgaWYgKGFwcHJveFJlcy5pc1plcm8oKSlcclxuICAgICAgICAgICAgYXBwcm94UmVzID0gT05FO1xyXG5cclxuICAgICAgICByZXMgPSByZXMuYWRkKGFwcHJveFJlcyk7XHJcbiAgICAgICAgcmVtID0gcmVtLnN1YihhcHByb3hSZW0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZGl2aWRlfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gZGl2aXNvciBEaXZpc29yXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gUXVvdGllbnRcclxuICovXHJcbkxvbmdQcm90b3R5cGUuZGl2ID0gTG9uZ1Byb3RvdHlwZS5kaXZpZGU7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgbW9kdWxvIHRoZSBzcGVjaWZpZWQuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gZGl2aXNvciBEaXZpc29yXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm1vZHVsbyA9IGZ1bmN0aW9uIG1vZHVsbyhkaXZpc29yKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhkaXZpc29yKSlcclxuICAgICAgICBkaXZpc29yID0gZnJvbVZhbHVlKGRpdmlzb3IpO1xyXG5cclxuICAgIC8vIHVzZSB3YXNtIHN1cHBvcnQgaWYgcHJlc2VudFxyXG4gICAgaWYgKHdhc20pIHtcclxuICAgICAgICB2YXIgbG93ID0gKHRoaXMudW5zaWduZWQgPyB3YXNtLnJlbV91IDogd2FzbS5yZW1fcykoXHJcbiAgICAgICAgICAgIHRoaXMubG93LFxyXG4gICAgICAgICAgICB0aGlzLmhpZ2gsXHJcbiAgICAgICAgICAgIGRpdmlzb3IubG93LFxyXG4gICAgICAgICAgICBkaXZpc29yLmhpZ2hcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc20uZ2V0X2hpZ2goKSwgdGhpcy51bnNpZ25lZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc3ViKHRoaXMuZGl2KGRpdmlzb3IpLm11bChkaXZpc29yKSk7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgbW9kdWxvIHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbW9kdWxvfS5cclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gZGl2aXNvciBEaXZpc29yXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLm1vZCA9IExvbmdQcm90b3R5cGUubW9kdWxvO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIG1vZHVsbyB0aGUgc3BlY2lmaWVkLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI21vZHVsb30uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFJlbWFpbmRlclxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5yZW0gPSBMb25nUHJvdG90eXBlLm1vZHVsbztcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBiaXR3aXNlIE5PVCBvZiB0aGlzIExvbmcuXHJcbiAqIEByZXR1cm5zIHshTG9uZ31cclxuICovXHJcbkxvbmdQcm90b3R5cGUubm90ID0gZnVuY3Rpb24gbm90KCkge1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKH50aGlzLmxvdywgfnRoaXMuaGlnaCwgdGhpcy51bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgYml0d2lzZSBBTkQgb2YgdGhpcyBMb25nIGFuZCB0aGUgc3BlY2lmaWVkLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiBhbmQob3RoZXIpIHtcclxuICAgIGlmICghaXNMb25nKG90aGVyKSlcclxuICAgICAgICBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XHJcbiAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3cgJiBvdGhlci5sb3csIHRoaXMuaGlnaCAmIG90aGVyLmhpZ2gsIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgT1Igb2YgdGhpcyBMb25nIGFuZCB0aGUgc3BlY2lmaWVkLlxyXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcclxuICogQHJldHVybnMgeyFMb25nfVxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5vciA9IGZ1bmN0aW9uIG9yKG90aGVyKSB7XHJcbiAgICBpZiAoIWlzTG9uZyhvdGhlcikpXHJcbiAgICAgICAgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xyXG4gICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93IHwgb3RoZXIubG93LCB0aGlzLmhpZ2ggfCBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBiaXR3aXNlIFhPUiBvZiB0aGlzIExvbmcgYW5kIHRoZSBnaXZlbiBvbmUuXHJcbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9XHJcbiAqL1xyXG5Mb25nUHJvdG90eXBlLnhvciA9IGZ1bmN0aW9uIHhvcihvdGhlcikge1xyXG4gICAgaWYgKCFpc0xvbmcob3RoZXIpKVxyXG4gICAgICAgIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcclxuICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyBeIG90aGVyLmxvdywgdGhpcy5oaWdoIF4gb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYnkgdGhlIGdpdmVuIGFtb3VudC5cclxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcclxuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcclxuICovXHJcbkxvbmdQcm90b3R5cGUuc2hpZnRMZWZ0ID0gZnVuY3Rpb24gc2hpZnRMZWZ0KG51bUJpdHMpIHtcclxuICAgIGlmIChpc0xvbmcobnVtQml0cykpXHJcbiAgICAgICAgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcclxuICAgIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICBlbHNlIGlmIChudW1CaXRzIDwgMzIpXHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93IDw8IG51bUJpdHMsICh0aGlzLmhpZ2ggPDwgbnVtQml0cykgfCAodGhpcy5sb3cgPj4+ICgzMiAtIG51bUJpdHMpKSwgdGhpcy51bnNpZ25lZCk7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKDAsIHRoaXMubG93IDw8IChudW1CaXRzIC0gMzIpLCB0aGlzLnVuc2lnbmVkKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgc2hpZnRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0TGVmdH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaGwgPSBMb25nUHJvdG90eXBlLnNoaWZ0TGVmdDtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgYXJpdGhtZXRpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC5cclxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcclxuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcclxuICovXHJcbkxvbmdQcm90b3R5cGUuc2hpZnRSaWdodCA9IGZ1bmN0aW9uIHNoaWZ0UmlnaHQobnVtQml0cykge1xyXG4gICAgaWYgKGlzTG9uZyhudW1CaXRzKSlcclxuICAgICAgICBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xyXG4gICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMClcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIGVsc2UgaWYgKG51bUJpdHMgPCAzMilcclxuICAgICAgICByZXR1cm4gZnJvbUJpdHMoKHRoaXMubG93ID4+PiBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPDwgKDMyIC0gbnVtQml0cykpLCB0aGlzLmhpZ2ggPj4gbnVtQml0cywgdGhpcy51bnNpZ25lZCk7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKHRoaXMuaGlnaCA+PiAobnVtQml0cyAtIDMyKSwgdGhpcy5oaWdoID49IDAgPyAwIDogLTEsIHRoaXMudW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBhcml0aG1ldGljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0UmlnaHR9LlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcclxuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcclxuICovXHJcbkxvbmdQcm90b3R5cGUuc2hyID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC5cclxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcclxuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcclxuICovXHJcbkxvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkID0gZnVuY3Rpb24gc2hpZnRSaWdodFVuc2lnbmVkKG51bUJpdHMpIHtcclxuICAgIGlmIChpc0xvbmcobnVtQml0cykpXHJcbiAgICAgICAgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcclxuICAgIG51bUJpdHMgJj0gNjM7XHJcbiAgICBpZiAobnVtQml0cyA9PT0gMClcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHZhciBoaWdoID0gdGhpcy5oaWdoO1xyXG4gICAgICAgIGlmIChudW1CaXRzIDwgMzIpIHtcclxuICAgICAgICAgICAgdmFyIGxvdyA9IHRoaXMubG93O1xyXG4gICAgICAgICAgICByZXR1cm4gZnJvbUJpdHMoKGxvdyA+Pj4gbnVtQml0cykgfCAoaGlnaCA8PCAoMzIgLSBudW1CaXRzKSksIGhpZ2ggPj4+IG51bUJpdHMsIHRoaXMudW5zaWduZWQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobnVtQml0cyA9PT0gMzIpXHJcbiAgICAgICAgICAgIHJldHVybiBmcm9tQml0cyhoaWdoLCAwLCB0aGlzLnVuc2lnbmVkKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJldHVybiBmcm9tQml0cyhoaWdoID4+PiAobnVtQml0cyAtIDMyKSwgMCwgdGhpcy51bnNpZ25lZCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGxvZ2ljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0UmlnaHRVbnNpZ25lZH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaHJ1ID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQ7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGxvZ2ljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0UmlnaHRVbnNpZ25lZH0uXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS5zaHJfdSA9IExvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkO1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBzaWduZWQuXHJcbiAqIEByZXR1cm5zIHshTG9uZ30gU2lnbmVkIGxvbmdcclxuICovXHJcbkxvbmdQcm90b3R5cGUudG9TaWduZWQgPSBmdW5jdGlvbiB0b1NpZ25lZCgpIHtcclxuICAgIGlmICghdGhpcy51bnNpZ25lZClcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdywgdGhpcy5oaWdoLCBmYWxzZSk7XHJcbn07XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIHVuc2lnbmVkLlxyXG4gKiBAcmV0dXJucyB7IUxvbmd9IFVuc2lnbmVkIGxvbmdcclxuICovXHJcbkxvbmdQcm90b3R5cGUudG9VbnNpZ25lZCA9IGZ1bmN0aW9uIHRvVW5zaWduZWQoKSB7XHJcbiAgICBpZiAodGhpcy51bnNpZ25lZClcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdywgdGhpcy5oaWdoLCB0cnVlKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGJ5dGUgcmVwcmVzZW50YXRpb24uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxlIFdoZXRoZXIgbGl0dGxlIG9yIGJpZyBlbmRpYW4sIGRlZmF1bHRzIHRvIGJpZyBlbmRpYW5cclxuICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gQnl0ZSByZXByZXNlbnRhdGlvblxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b0J5dGVzID0gZnVuY3Rpb24gdG9CeXRlcyhsZSkge1xyXG4gICAgcmV0dXJuIGxlID8gdGhpcy50b0J5dGVzTEUoKSA6IHRoaXMudG9CeXRlc0JFKCk7XHJcbn07XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIGl0cyBsaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXHJcbiAqIEByZXR1cm5zIHshQXJyYXkuPG51bWJlcj59IExpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvblxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b0J5dGVzTEUgPSBmdW5jdGlvbiB0b0J5dGVzTEUoKSB7XHJcbiAgICB2YXIgaGkgPSB0aGlzLmhpZ2gsXHJcbiAgICAgICAgbG8gPSB0aGlzLmxvdztcclxuICAgIHJldHVybiBbXHJcbiAgICAgICAgbG8gICAgICAgICYgMHhmZixcclxuICAgICAgICBsbyA+Pj4gIDggJiAweGZmLFxyXG4gICAgICAgIGxvID4+PiAxNiAmIDB4ZmYsXHJcbiAgICAgICAgbG8gPj4+IDI0ICAgICAgICxcclxuICAgICAgICBoaSAgICAgICAgJiAweGZmLFxyXG4gICAgICAgIGhpID4+PiAgOCAmIDB4ZmYsXHJcbiAgICAgICAgaGkgPj4+IDE2ICYgMHhmZixcclxuICAgICAgICBoaSA+Pj4gMjRcclxuICAgIF07XHJcbn07XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXHJcbiAqIEByZXR1cm5zIHshQXJyYXkuPG51bWJlcj59IEJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvblxyXG4gKi9cclxuTG9uZ1Byb3RvdHlwZS50b0J5dGVzQkUgPSBmdW5jdGlvbiB0b0J5dGVzQkUoKSB7XHJcbiAgICB2YXIgaGkgPSB0aGlzLmhpZ2gsXHJcbiAgICAgICAgbG8gPSB0aGlzLmxvdztcclxuICAgIHJldHVybiBbXHJcbiAgICAgICAgaGkgPj4+IDI0ICAgICAgICxcclxuICAgICAgICBoaSA+Pj4gMTYgJiAweGZmLFxyXG4gICAgICAgIGhpID4+PiAgOCAmIDB4ZmYsXHJcbiAgICAgICAgaGkgICAgICAgICYgMHhmZixcclxuICAgICAgICBsbyA+Pj4gMjQgICAgICAgLFxyXG4gICAgICAgIGxvID4+PiAxNiAmIDB4ZmYsXHJcbiAgICAgICAgbG8gPj4+ICA4ICYgMHhmZixcclxuICAgICAgICBsbyAgICAgICAgJiAweGZmXHJcbiAgICBdO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBMb25nIGZyb20gaXRzIGJ5dGUgcmVwcmVzZW50YXRpb24uXHJcbiAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBieXRlcyBCeXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHBhcmFtIHtib29sZWFuPX0gbGUgV2hldGhlciBsaXR0bGUgb3IgYmlnIGVuZGlhbiwgZGVmYXVsdHMgdG8gYmlnIGVuZGlhblxyXG4gKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxyXG4gKi9cclxuTG9uZy5mcm9tQnl0ZXMgPSBmdW5jdGlvbiBmcm9tQnl0ZXMoYnl0ZXMsIHVuc2lnbmVkLCBsZSkge1xyXG4gICAgcmV0dXJuIGxlID8gTG9uZy5mcm9tQnl0ZXNMRShieXRlcywgdW5zaWduZWQpIDogTG9uZy5mcm9tQnl0ZXNCRShieXRlcywgdW5zaWduZWQpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBMb25nIGZyb20gaXRzIGxpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cclxuICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIExpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvblxyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXHJcbiAqIEByZXR1cm5zIHtMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXHJcbiAqL1xyXG5Mb25nLmZyb21CeXRlc0xFID0gZnVuY3Rpb24gZnJvbUJ5dGVzTEUoYnl0ZXMsIHVuc2lnbmVkKSB7XHJcbiAgICByZXR1cm4gbmV3IExvbmcoXHJcbiAgICAgICAgYnl0ZXNbMF0gICAgICAgfFxyXG4gICAgICAgIGJ5dGVzWzFdIDw8ICA4IHxcclxuICAgICAgICBieXRlc1syXSA8PCAxNiB8XHJcbiAgICAgICAgYnl0ZXNbM10gPDwgMjQsXHJcbiAgICAgICAgYnl0ZXNbNF0gICAgICAgfFxyXG4gICAgICAgIGJ5dGVzWzVdIDw8ICA4IHxcclxuICAgICAgICBieXRlc1s2XSA8PCAxNiB8XHJcbiAgICAgICAgYnl0ZXNbN10gPDwgMjQsXHJcbiAgICAgICAgdW5zaWduZWRcclxuICAgICk7XHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgYmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxyXG4gKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgQmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcclxuICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcclxuICovXHJcbkxvbmcuZnJvbUJ5dGVzQkUgPSBmdW5jdGlvbiBmcm9tQnl0ZXNCRShieXRlcywgdW5zaWduZWQpIHtcclxuICAgIHJldHVybiBuZXcgTG9uZyhcclxuICAgICAgICBieXRlc1s0XSA8PCAyNCB8XHJcbiAgICAgICAgYnl0ZXNbNV0gPDwgMTYgfFxyXG4gICAgICAgIGJ5dGVzWzZdIDw8ICA4IHxcclxuICAgICAgICBieXRlc1s3XSxcclxuICAgICAgICBieXRlc1swXSA8PCAyNCB8XHJcbiAgICAgICAgYnl0ZXNbMV0gPDwgMTYgfFxyXG4gICAgICAgIGJ5dGVzWzJdIDw8ICA4IHxcclxuICAgICAgICBieXRlc1szXSxcclxuICAgICAgICB1bnNpZ25lZFxyXG4gICAgKTtcclxufTtcclxuXG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IEJTT04gZnJvbSAnLi8uLi8uLi8uLi8uLi90aGlyZF9wYXJ0eS9ic29uLmNvbW1vbi5qcyc7XG5cbmNvbnN0IGJzb24gPSBCU09OLmJzb247XG5cbmNsYXNzIEJzb24ge1xuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSBhIEphdmFzY3JpcHQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9iamVjdCBUaGUgSmF2YXNjcmlwdCBvYmplY3QgdG8gc2VyaWFsaXplLlxuICAgICAqIEByZXR1cm4gVGhlIEJ1ZmZlciBvYmplY3QgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZCBvYmplY3QuXG4gICAgICovXG4gICAgc3RhdGljIHNlcmlhbGl6ZSAob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBic29uLnNlcmlhbGl6ZShvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGRhdGEgYXMgQlNPTi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBidWZmZXIgVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBzZXJpYWxpemVkIHNldCBvZiBCU09OIGRvY3VtZW50cy5cbiAgICAgKiBAcmV0dXJucyBUaGUgZGVzZXJpYWxpemVkIEphdmFzY3JpcHQgT2JqZWN0LlxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZSAob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBic29uLmRlc2VyaWFsaXplKG9iamVjdCk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBCc29uIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZyYW1lVHlwZSB9IGZyb20gJy4vZW51bXMvRnJhbWVUeXBlLmpzJztcbmltcG9ydCAgeyBCc29uIH0gZnJvbSAnLi8uLi91dGlsL0Jzb24uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNkbFBhY2tldFxuICogQHByb3BlcnR5IHtudW1iZXJ9IF9FWFRSQV9QQVJDRUxfREFUQV9MRU5HVEhcbiAqIEBwcm9wZXJ0eSBAcHJpdmF0ZSB7bnVtYmVyfSBfSEVBREVSX1NJWkVcbiAqIEBwcm9wZXJ0eSBAcHJpdmF0ZSB7bnVtYmVyfSBfSEVBREVSX1NJWkVfVjFcbiAqIEBwcm9wZXJ0eSBAcHJpdmF0ZSB7bnVtYmVyfSBfRU5DUllQVElPTl9NQVNLXG4gKiBAcHJvcGVydHkge251bWJlcn0gU0VSVklDRV9UWVBFX0NPTlRST0xcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBTRVJWSUNFX1RZUEVfUlBDXG4gKiBAcHJvcGVydHkge251bWJlcn0gU0VSVklDRV9UWVBFX1BDTVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFNFUlZJQ0VfVFlQRV9WSURFT1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFNFUlZJQ0VfVFlQRV9CVUxLX0RBVEFcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGUkFNRV9JTkZPX0hFQVJUX0JFQVRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGUkFNRV9JTkZPX1NUQVJUX1NFUlZJQ0VcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGUkFNRV9JTkZPX1NUQVJUX1NFUlZJQ0VfQUNLXG4gKiBAcHJvcGVydHkge251bWJlcn0gRlJBTUVfSU5GT19TVEFSVF9TRVJWSUNFX05BS1xuICogQHByb3BlcnR5IHtudW1iZXJ9IEZSQU1FX0lORk9fRU5EX1NFUlZJQ0VcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGUkFNRV9JTkZPX0VORF9TRVJWSUNFX0FDS1xuICogQHByb3BlcnR5IHtudW1iZXJ9IEZSQU1FX0lORk9fRU5EX1NFUlZJQ0VfTkFLXG4gKiBAcHJvcGVydHkge251bWJlcn0gRlJBTUVfSU5GT19SRUdJU1RFUl9TRUNPTkRBUllfVFJBTlNQT1JUXG4gKiBAcHJvcGVydHkge251bWJlcn0gRlJBTUVfSU5GT19SRUdJU1RFUl9TRUNPTkRBUllfVFJBTlNQT1JUX0FDS1xuICogQHByb3BlcnR5IHtudW1iZXJ9IEZSQU1FX0lORk9fUkVHSVNURVJfU0VDT05EQVJZX1RSQU5TUE9SVF9OQUtcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGUkFNRV9JTkZPX1RSQU5TUE9SVF9FVkVOVF9VUERBVEVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGUkFNRV9JTkZPX1NFUlZJQ0VfREFUQV9BQ0tcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGUkFNRV9JTkZPX0hFQVJUX0JFQVRfQUNLXG4gKiBAcHJvcGVydHkge251bWJlcn0gRlJBTUVfSU5GT19GSU5BTF9DT05ORVNDVVRJVkVfRlJBTUVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGUkFNRV9JTkZPX1JFU0VSVkVEXG5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGdldFZlcnNpb25cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGdldEVuY3J5cHRpb25cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGdldFNlcnZpY2VUeXBlXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBnZXRGcmFtZUluZm9cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGdldFNlc3Npb25JRFxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZ2V0TWVzc2FnZUlEXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBnZXREYXRhU2l6ZVxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gc2V0UGF5bG9hZFxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZ2V0UGF5bG9hZFxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZ2V0RW5jcnlwdGlvbkJpdFxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZ2V0RnJhbWVUeXBlXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSB0b1VpbnQ4QXJyYXlcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHRvU3RyaW5nXG4gKiBAcHJvcGVydHkgQHByaXZhdGUge2Z1bmN0aW9ufSBfY29uc3RydWN0UGFja2V0XG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBwdXRUYWdcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGdldFRhZ1xuICovXG5cbmNsYXNzIFNkbFBhY2tldCB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSB2ZXJzaW9uIC0gUHJvdG9jb2wgdmVyc2lvbiB0byB1c2VcbiAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5jcnlwdGlvbiAtIFdoZXRoZXIgb3Igbm90IHRoZSBwYXlsb2FkIGluIHRoaXMgcGFja2V0IGlzIGVuY3J5cHRlZFxuICAgICogQHBhcmFtIHtGcmFtZVR5cGV9IGZyYW1lVHlwZSAtIEEgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgcGFja2V0IGZyYW1lIHR5cGVcbiAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlIC0gVGhlIHNlcnZpY2UgdGhhdCB0aGlzIHBhY2tldCBpcyBhc3NvY2lhdGVkIHdpdGhcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBmcmFtZUluZm8gLSBTcGVjaWZpYyBmcmFtZSBpbmZvIHJlbGF0ZWQgdG8gdGhpcyBwYWNrZXRcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSUQgLSBJRCB0aGlzIHBhY2tldCBpcyBhc3NvY2lhdGVkIHdpdGhcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBkYXRhU2l6ZSAtIFNpemUgb2YgdGhlIHBheWxvYWQgdGhhdCB3aWxsIGJlIGFkZGVkXG4gICAgKiBAcGFyYW0ge051bWJlcn0gbWVzc2FnZUlEIC0gSUQgb2YgdGhpcyBzcGVjaWZpYyBwYWNrZXRcbiAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gcGF5bG9hZCAtIFJhdyBkYXRhIHRoYXQgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgcGFja2V0IChSUEMgbWVzc2FnZSwgcmF3IGJ5dGVzLCBldGMpXG4gICAgKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0XG4gICAgKiBAcGFyYW0ge051bWJlcn0gYnl0ZXNUb1dyaXRlXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAodmVyc2lvbiA9IDEsIGVuY3J5cHRpb24gPSBmYWxzZSwgZnJhbWVUeXBlID0gLTEsIHNlcnZpY2VUeXBlID0gLTEsIGZyYW1lSW5mbyA9IC0xLCBzZXNzaW9uSUQgPSAwLCBkYXRhU2l6ZSA9IDAsIG1lc3NhZ2VJRCA9IDAsIHBheWxvYWQgPSBudWxsLCBvZmZzZXQgPSAwLCBieXRlc1RvV3JpdGUgPSAwKSB7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLl9lbmNyeXB0aW9uID0gZW5jcnlwdGlvbjtcbiAgICAgICAgdGhpcy5fZnJhbWVUeXBlID0gZnJhbWVUeXBlO1xuICAgICAgICB0aGlzLl9zZXJ2aWNlVHlwZSA9IHNlcnZpY2VUeXBlO1xuICAgICAgICB0aGlzLl9mcmFtZUluZm8gPSBmcmFtZUluZm87XG4gICAgICAgIHRoaXMuX3Nlc3Npb25JRCA9IHNlc3Npb25JRDtcbiAgICAgICAgdGhpcy5fZGF0YVNpemUgPSBkYXRhU2l6ZTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUlEID0gbWVzc2FnZUlEO1xuICAgICAgICB0aGlzLl9wYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgICAgdGhpcy5fb2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLl9ieXRlc1RvV3JpdGUgPSBieXRlc1RvV3JpdGU7XG5cbiAgICAgICAgdGhpcy5fYnNvblBheWxvYWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHBheWxvYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3BheWxvYWQgPSBuZXcgVWludDhBcnJheShwYXlsb2FkLnNsaWNlKG9mZnNldCwgYnl0ZXNUb1dyaXRlICsgb2Zmc2V0KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn0gLSBQcm90b2NvbCB2ZXJzaW9uIHVzZWQgYnkgdGhpcyBwYWNrZXRcbiAgICAqL1xuICAgIGdldFZlcnNpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0Jvb2xlYW59IC0gV2hldGhlciBvciBub3QgdGhlIHBheWxvYWQgaW4gdGhpcyBwYWNrZXQgaXMgZW5jcnlwdGVkXG4gICAgKi9cbiAgICBnZXRFbmNyeXB0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuY3J5cHRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtTZXJ2aWNlVHlwZX0gLSBUaGUgc2VydmljZSB0aGF0IHRoaXMgcGFja2V0IGlzIGFzc29jaWF0ZWQgd2l0aFxuICAgICovXG4gICAgZ2V0U2VydmljZVR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VydmljZVR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9IC0gU3BlY2lmaWMgZnJhbWUgaW5mbyByZWxhdGVkIHRvIHRoaXMgcGFja2V0XG4gICAgKi9cbiAgICBnZXRGcmFtZUluZm8gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnJhbWVJbmZvO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfSAtIElEIHRoaXMgcGFja2V0IGlzIGFzc29jaWF0ZWQgd2l0aFxuICAgICovXG4gICAgZ2V0U2Vzc2lvbklEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25JRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn0gLSBJRCBvZiB0aGlzIHNwZWNpZmljIHBhY2tldFxuICAgICovXG4gICAgZ2V0TWVzc2FnZUlEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn0gLSBTaXplIG9mIHRoZSBwYXlsb2FkIHRoYXQgd2lsbCBiZSBhZGRlZFxuICAgICovXG4gICAgZ2V0RGF0YVNpemUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IHBheWxvYWRcbiAgICAqIEByZXR1cm4ge1NkbFBhY2tldH1cbiAgICAqL1xuICAgIHNldFBheWxvYWQgKHBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5fcGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7VWludDhBcnJheX0gLSBSYXcgZGF0YSB0aGF0IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIHBhY2tldCAoUlBDIG1lc3NhZ2UsIHJhdyBieXRlcywgZXRjKVxuICAgICovXG4gICAgZ2V0UGF5bG9hZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXlsb2FkO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuY3J5cHRpb25cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IC0gUmV0dXJucyBhIG51bWJlciByZXByZXNlbnRpbmcgYSBieXRlIG1hc2sgZGVwZW5kaW5nIG9uIHRoZSBib29sZWFuIHZhbHVlXG4gICAgICovXG4gICAgc3RhdGljIGdldEVuY3J5cHRpb25CaXQgKGVuY3J5cHRpb24pIHtcbiAgICAgICAgcmV0dXJuIGVuY3J5cHRpb24gPyBTZGxQYWNrZXQuX0VOQ1JZUFRJT05fTUFTSyA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtGcmFtZVR5cGV9IC0gQSBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBwYWNrZXQgZnJhbWUgdHlwZVxuICAgICovXG4gICAgZ2V0RnJhbWVUeXBlICgpIHtcbiAgICAgICAgaWYgKEZyYW1lVHlwZS5rZXlGb3JWYWx1ZSh0aGlzLl9mcmFtZVR5cGUpICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZnJhbWVUeXBlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEZyYW1lVHlwZS5TSU5HTEU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ30gLSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhY2tldFxuICAgICovXG4gICAgdG9TdHJpbmcgKCkge1xuICAgICAgICBsZXQgb3V0cHV0ID0gJyoqKioqIFNkbCBQYWNrZXQgKioqKionO1xuICAgICAgICBvdXRwdXQgKz0gYFxcblZlcnNpb246ICR7dGhpcy5fdmVyc2lvbn1gO1xuICAgICAgICBvdXRwdXQgKz0gYFxcbkVuY3J5cHRpb246ICR7dGhpcy5fZW5jcnlwdGlvbn1gO1xuICAgICAgICBvdXRwdXQgKz0gYFxcbkZyYW1lVHlwZTogJHt0aGlzLl9mcmFtZVR5cGV9YDtcbiAgICAgICAgb3V0cHV0ICs9IGBcXG5TZXJ2aWNlVHlwZTogJHt0aGlzLl9zZXJ2aWNlVHlwZX1gO1xuICAgICAgICBvdXRwdXQgKz0gYFxcbkZyYW1lSW5mbzogJHt0aGlzLl9mcmFtZUluZm99YDtcbiAgICAgICAgb3V0cHV0ICs9IGBcXG5TZXNzaW9uSUQ6ICR7dGhpcy5fc2Vzc2lvbklEfWA7XG4gICAgICAgIG91dHB1dCArPSBgXFxuRGF0YVNpemU6ICR7dGhpcy5fZGF0YVNpemV9YDtcblxuICAgICAgICBpZiAodGhpcy5fdmVyc2lvbiA+IDEpIHtcbiAgICAgICAgICAgIG91dHB1dCArPSBgXFxuTWVzc2FnZUlEOiAke3RoaXMuX21lc3NhZ2VJRH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0ICs9ICdcXG4qKioqKiBTZGwgUGFja2V0IEVuZCAqKioqKic7XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICAvKipcblx0ICogVGhpcyBtZXRob2QgdGFrZXMgaW4gdGhlIHZhcmlvdXMgY29tcG9uZW50cyB0byB0aGUgU0RMIHBhY2tldCBzdHJ1Y3R1cmUgYW5kIGNyZWF0ZXMgYSBuZXcgYnl0ZSBhcnJheSB0aGF0IGNhbiBiZSBzZW50IHZpYSB0aGUgdHJhbnNwb3J0XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHZlcnNpb24gLSBQcm90b2NvbCB2ZXJzaW9uIHRvIHVzZVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5jcnlwdGlvbiAtIFdoZXRoZXIgb3Igbm90IHRoZSBwYXlsb2FkIGluIHRoaXMgcGFja2V0IGlzIGVuY3J5cHRlZFxuICAgICAqIEBwYXJhbSB7RnJhbWVUeXBlfSBmcmFtZVR5cGUgLSBBIG51bWJlciByZXByZXNlbnRpbmcgdGhlIHBhY2tldCBmcmFtZSB0eXBlXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGUgLSBUaGUgc2VydmljZSB0aGF0IHRoaXMgcGFja2V0IGlzIGFzc29jaWF0ZWQgd2l0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjb250cm9sRnJhbWVJbmZvIC0gU3BlY2lmaWMgZnJhbWUgaW5mbyByZWxhdGVkIHRvIHRoaXMgcGFja2V0XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNlc3Npb25JRCAtIElEIHRoaXMgcGFja2V0IGlzIGFzc29jaWF0ZWQgd2l0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBkYXRhU2l6ZSAtIFNpemUgb2YgdGhlIHBheWxvYWQgdGhhdCB3aWxsIGJlIGFkZGVkXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1lc3NhZ2VJRCAtIElEIG9mIHRoaXMgc3BlY2lmaWMgcGFja2V0XG4gICAgICogQHBhcmFtIHtVaW50OEFycmF5fSBwYXlsb2FkIC0gUmF3IGRhdGEgdGhhdCB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBwYWNrZXQgKFJQQyBtZXNzYWdlLCByYXcgYnl0ZXMsIGV0Yylcblx0ICogQHJldHVybiB7VWludDhBcnJheX0gLSBBIGJ5dGVbXSByZXByZXNlbnRhdGlvbiBvZiBhbiBTZGxQYWNrZXQgYnVpbHQgdXNpbmcgdGhlIHN1cHBsaWVkIHBhcmFtc1xuXHQgKi9cbiAgICBzdGF0aWMgX2NvbnN0cnVjdFBhY2tldCAodmVyc2lvbiwgZW5jcnlwdGlvbiwgZnJhbWVUeXBlLCBzZXJ2aWNlVHlwZSwgY29udHJvbEZyYW1lSW5mbywgc2Vzc2lvbklELCBkYXRhU2l6ZSwgbWVzc2FnZUlELCBwYXlsb2FkKSB7XG4gICAgICAgIGxldCBkYXRhVmlldyA9IG51bGw7XG4gICAgICAgIGxldCBkYXRhVmlld0luZGV4ID0gMDtcblxuICAgICAgICBpZiAodmVyc2lvbiA+IDEpIHtcbiAgICAgICAgICAgIGRhdGFWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoU2RsUGFja2V0Ll9IRUFERVJfU0laRSArIGRhdGFTaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGFWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoU2RsUGFja2V0Ll9IRUFERVJfU0laRV9WMSArIGRhdGFTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFWaWV3W2RhdGFWaWV3SW5kZXgrK10gPSAodmVyc2lvbiA8PCA0KSArIFNkbFBhY2tldC5nZXRFbmNyeXB0aW9uQml0KGVuY3J5cHRpb24pICsgZnJhbWVUeXBlO1xuICAgICAgICBkYXRhVmlld1tkYXRhVmlld0luZGV4KytdID0gc2VydmljZVR5cGU7XG4gICAgICAgIGRhdGFWaWV3W2RhdGFWaWV3SW5kZXgrK10gPSBjb250cm9sRnJhbWVJbmZvO1xuICAgICAgICBkYXRhVmlld1tkYXRhVmlld0luZGV4KytdID0gc2Vzc2lvbklEO1xuICAgICAgICBkYXRhVmlld1tkYXRhVmlld0luZGV4KytdID0gKGRhdGFTaXplICYgMHhGRjAwMDAwMCkgPj4gMjQ7XG4gICAgICAgIGRhdGFWaWV3W2RhdGFWaWV3SW5kZXgrK10gPSAoZGF0YVNpemUgJiAweDAwRkYwMDAwKSA+PiAxNjtcbiAgICAgICAgZGF0YVZpZXdbZGF0YVZpZXdJbmRleCsrXSA9IChkYXRhU2l6ZSAmIDB4MDAwMEZGMDApID4+IDg7XG4gICAgICAgIGRhdGFWaWV3W2RhdGFWaWV3SW5kZXgrK10gPSBkYXRhU2l6ZSAmIDB4MDAwMDAwRkY7XG5cbiAgICAgICAgaWYgKHZlcnNpb24gPiAxKSB7XG4gICAgICAgICAgICBkYXRhVmlld1tkYXRhVmlld0luZGV4KytdID0gKG1lc3NhZ2VJRCAmIDB4RkYwMDAwMDApID4+IDI0O1xuICAgICAgICAgICAgZGF0YVZpZXdbZGF0YVZpZXdJbmRleCsrXSA9IChtZXNzYWdlSUQgJiAweDAwRkYwMDAwKSA+PiAxNjtcbiAgICAgICAgICAgIGRhdGFWaWV3W2RhdGFWaWV3SW5kZXgrK10gPSAobWVzc2FnZUlEICYgMHgwMDAwRkYwMCkgPj4gODtcbiAgICAgICAgICAgIGRhdGFWaWV3W2RhdGFWaWV3SW5kZXgrK10gPSBtZXNzYWdlSUQgJiAweDAwMDAwMEZGO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBheWxvYWQgIT09IG51bGwgJiYgcGF5bG9hZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkYXRhVmlldy5zZXQocGF5bG9hZCwgZGF0YVZpZXdJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YVZpZXc7XG4gICAgfVxuXG4gICAgLyoqXG5cdCAqIFRoaXMgbWV0aG9kIGNvbnZlcnRzIGFuIFNkbFBhY2tldCBpbnN0YW5jZSB0byBhIG5ldyBieXRlIGFycmF5IHRoYXQgY2FuIGJlIHNlbnQgdmlhIHRoZSB0cmFuc3BvcnRcblx0ICogQHJldHVybiB7VWludDhBcnJheX0gLSBBIGJ5dGVbXSByZXByZXNlbnRhdGlvbiBvZiBhbiBTZGxQYWNrZXQgYnVpbHQgdXNpbmcgdGhlIHN1cHBsaWVkIHBhcmFtc1xuXHQgKi9cbiAgICB0b1BhY2tldCAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9ic29uUGF5bG9hZCkge1xuICAgICAgICAgICAgdGhpcy5fcGF5bG9hZCA9IEJzb24uc2VyaWFsaXplKHRoaXMuX2Jzb25QYXlsb2FkKTtcbiAgICAgICAgICAgIHRoaXMuX2RhdGFTaXplID0gdGhpcy5fcGF5bG9hZC5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gU2RsUGFja2V0Ll9jb25zdHJ1Y3RQYWNrZXQodGhpcy5fdmVyc2lvbiwgdGhpcy5fZW5jcnlwdGlvbiwgdGhpcy5fZnJhbWVUeXBlLCB0aGlzLl9zZXJ2aWNlVHlwZSwgdGhpcy5fZnJhbWVJbmZvLCB0aGlzLl9zZXNzaW9uSUQsIHRoaXMuX2RhdGFTaXplLCB0aGlzLl9tZXNzYWdlSUQsIHRoaXMuX3BheWxvYWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0YWcgLSBTdHJpbmcga2V5IHRvIGFkZCBhcyBhIHByb3BlcnR5IHRvIHRoZSBCU09OIG1hcFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gT2JqZWN0IHRvIGFkZCBhcyBhIHZhbHVlIHRvIHRoZSBCU09OIG1hcFxuICAgICAqL1xuICAgIHB1dFRhZyAodGFnLCBkYXRhKSB7XG4gICAgICAgIGlmICghdGhpcy5fYnNvblBheWxvYWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Jzb25QYXlsb2FkID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYnNvblBheWxvYWRbdGFnXSA9IGRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRhZyAtIFN0cmluZyBrZXkgdG8gYWRkIGFzIGEgcHJvcGVydHkgdG8gdGhlIEJTT04gbWFwXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBkYXRhIC0gT2JqZWN0IGFzIGEgdmFsdWUgZm91bmQgZnJvbSB0aGUgdGhlIEJTT04gbWFwXG4gICAgICovXG5cbiAgICBnZXRUYWcgKHRhZykge1xuICAgICAgICBpZiAoIXRoaXMuX2Jzb25QYXlsb2FkKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3BheWxvYWQgfHwgdGhpcy5fcGF5bG9hZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2Jzb25QYXlsb2FkID0gQnNvbi5kZXNlcmlhbGl6ZSh0aGlzLl9wYXlsb2FkKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ic29uUGF5bG9hZFt0YWddO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Jzb25QYXlsb2FkW3RhZ107XG4gICAgICAgIH1cbiAgICB9XG59XG5cblNkbFBhY2tldC5fRVhUUkFfUEFSQ0VMX0RBVEFfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgID0gMjQ7XG5TZGxQYWNrZXQuX0hFQURFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyO1xuU2RsUGFja2V0Ll9IRUFERVJfU0laRV9WMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4O1xuXG5TZGxQYWNrZXQuX0VOQ1JZUFRJT05fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDg7XG5cbi8qKlxuICogU2VydmljZSBUeXBlXG4gKi9cblNkbFBhY2tldC5TRVJWSUNFX1RZUEVfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwO1xuLy8gUkVTRVJWRUQgMHgwMSAtIDB4MDZcblNkbFBhY2tldC5TRVJWSUNFX1RZUEVfUlBDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA3O1xuLy8gUkVTRVJWRUQgMHgwOCAtIDB4MDlcblNkbFBhY2tldC5TRVJWSUNFX1RZUEVfUENNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBBO1xuU2RsUGFja2V0LlNFUlZJQ0VfVFlQRV9WSURFTyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI7XG4vLyBSRVNFUlZFRCAweDBDIC0gMHgwRVxuU2RsUGFja2V0LlNFUlZJQ0VfVFlQRV9CVUxLX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEY7XG4vLyBSRVNFUlZFRCAweDEwIC0gMHhGRlxuXG4vKipcbiAqIEZyYW1lIEluZm9cbiAqL1xuU2RsUGFja2V0LkZSQU1FX0lORk9fSEVBUlRfQkVBVCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDA7XG5TZGxQYWNrZXQuRlJBTUVfSU5GT19TVEFSVF9TRVJWSUNFICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTtcblNkbFBhY2tldC5GUkFNRV9JTkZPX1NUQVJUX1NFUlZJQ0VfQUNLICAgICAgICAgICAgICAgICAgPSAweDAyO1xuU2RsUGFja2V0LkZSQU1FX0lORk9fU1RBUlRfU0VSVklDRV9OQUsgICAgICAgICAgICAgICAgICA9IDB4MDM7XG5TZGxQYWNrZXQuRlJBTUVfSU5GT19FTkRfU0VSVklDRSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDtcblNkbFBhY2tldC5GUkFNRV9JTkZPX0VORF9TRVJWSUNFX0FDSyAgICAgICAgICAgICAgICAgICAgPSAweDA1O1xuU2RsUGFja2V0LkZSQU1FX0lORk9fRU5EX1NFUlZJQ0VfTkFLICAgICAgICAgICAgICAgICAgICA9IDB4MDY7XG5TZGxQYWNrZXQuRlJBTUVfSU5GT19SRUdJU1RFUl9TRUNPTkRBUllfVFJBTlNQT1JUICAgICAgID0gMHgwNztcblNkbFBhY2tldC5GUkFNRV9JTkZPX1JFR0lTVEVSX1NFQ09OREFSWV9UUkFOU1BPUlRfQUNLICAgPSAweDA4O1xuU2RsUGFja2V0LkZSQU1FX0lORk9fUkVHSVNURVJfU0VDT05EQVJZX1RSQU5TUE9SVF9OQUsgICA9IDB4MDk7XG4vLyAweDBBLTB4RkMgYXJlIHJlc2VydmVkXG5TZGxQYWNrZXQuRlJBTUVfSU5GT19UUkFOU1BPUlRfRVZFTlRfVVBEQVRFICAgICAgICAgICAgID0gMHhGRDtcblNkbFBhY2tldC5GUkFNRV9JTkZPX1NFUlZJQ0VfREFUQV9BQ0sgICAgICAgICAgICAgICAgICAgPSAweEZFO1xuU2RsUGFja2V0LkZSQU1FX0lORk9fSEVBUlRfQkVBVF9BQ0sgICAgICAgICAgICAgICAgICAgICA9IDB4RkY7XG5TZGxQYWNrZXQuRlJBTUVfSU5GT19GSU5BTF9DT05ORVNDVVRJVkVfRlJBTUUgICAgICAgICAgID0gMHgwMDtcblNkbFBhY2tldC5GUkFNRV9JTkZPX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwO1xuXG5leHBvcnQgeyBTZGxQYWNrZXQgfTtcbiIsImV4cG9ydCBkZWZhdWx0ICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDpcbiAgICAgICAgICAgIHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6XG4gICAgICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pO1xuIiwiXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxudmFyIGluaXRlZCA9IGZhbHNlO1xuZnVuY3Rpb24gaW5pdCAoKSB7XG4gIGluaXRlZCA9IHRydWU7XG4gIHZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgbG9va3VwW2ldID0gY29kZVtpXVxuICAgIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxuICB9XG5cbiAgcmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG4gIHJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICBpZiAoIWluaXRlZCkge1xuICAgIGluaXQoKTtcbiAgfVxuICB2YXIgaSwgaiwgbCwgdG1wLCBwbGFjZUhvbGRlcnMsIGFyclxuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gIC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICBwbGFjZUhvbGRlcnMgPSBiNjRbbGVuIC0gMl0gPT09ICc9JyA/IDIgOiBiNjRbbGVuIC0gMV0gPT09ICc9JyA/IDEgOiAwXG5cbiAgLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG4gIGFyciA9IG5ldyBBcnIobGVuICogMyAvIDQgLSBwbGFjZUhvbGRlcnMpXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICBsID0gcGxhY2VIb2xkZXJzID4gMCA/IGxlbiAtIDQgOiBsZW5cblxuICB2YXIgTCA9IDBcblxuICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzID09PSAyKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfSBlbHNlIGlmIChwbGFjZUhvbGRlcnMgPT09IDEpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPSAodWludDhbaV0gPDwgMTYpICsgKHVpbnQ4W2kgKyAxXSA8PCA4KSArICh1aW50OFtpICsgMl0pXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgaWYgKCFpbml0ZWQpIHtcbiAgICBpbml0KCk7XG4gIH1cbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgb3V0cHV0ID0gJydcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz09J1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMTBdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPSdcbiAgfVxuXG4gIHBhcnRzLnB1c2gob3V0cHV0KVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiXG5leHBvcnQgZnVuY3Rpb24gcmVhZCAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5leHBvcnQgZGVmYXVsdCBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cblxuaW1wb3J0ICogYXMgYmFzZTY0IGZyb20gJy4vYmFzZTY0J1xuaW1wb3J0ICogYXMgaWVlZTc1NCBmcm9tICcuL2llZWU3NTQnXG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXknXG5cbmV4cG9ydCB2YXIgSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHRydWVcblxuLypcbiAqIEV4cG9ydCBrTWF4TGVuZ3RoIGFmdGVyIHR5cGVkIGFycmF5IHN1cHBvcnQgaXMgZGV0ZXJtaW5lZC5cbiAqL1xudmFyIF9rTWF4TGVuZ3RoID0ga01heExlbmd0aCgpXG5leHBvcnQge19rTWF4TGVuZ3RoIGFzIGtNYXhMZW5ndGh9O1xuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICByZXR1cm4gdHJ1ZTtcbiAgLy8gcm9sbHVwIGlzc3Vlc1xuICAvLyB0cnkge1xuICAvLyAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAvLyAgIGFyci5fX3Byb3RvX18gPSB7XG4gIC8vICAgICBfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLFxuICAvLyAgICAgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9XG4gIC8vICAgfVxuICAvLyAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gIC8vICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gIC8vICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIC8vIH0gY2F0Y2ggKGUpIHtcbiAgLy8gICByZXR1cm4gZmFsc2VcbiAgLy8gfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChrTWF4TGVuZ3RoKCkgPCBsZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKVxuICB9XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gICAgfVxuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0lmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUodGhpcywgYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKHRoaXMsIGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGFyci5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gZnJvbSAodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoYXQsIHZhbHVlKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKG51bGwsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAmJlxuICAgICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gICAgLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbiAgICAvLyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgIC8vICAgdmFsdWU6IG51bGwsXG4gICAgLy8gICBjb25maWd1cmFibGU6IHRydWVcbiAgICAvLyB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAodGhhdCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICB0aGF0W2ldID0gMFxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuXG4gIHZhciBhY3R1YWwgPSB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICB0aGF0ID0gdGhhdC5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGFycmF5LmJ5dGVMZW5ndGggLy8gdGhpcyB0aHJvd3MgaWYgYGFycmF5YCBpcyBub3QgYSB2YWxpZCBBcnJheUJ1ZmZlclxuXG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ2xlbmd0aFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gYXJyYXlcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdCA9IGZyb21BcnJheUxpa2UodGhhdCwgYXJyYXkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAodGhhdCwgb2JqKSB7XG4gIGlmIChpbnRlcm5hbElzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuQnVmZmVyLmlzQnVmZmVyID0gaXNCdWZmZXI7XG5mdW5jdGlvbiBpbnRlcm5hbElzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIWludGVybmFsSXNCdWZmZXIoYSkgfHwgIWludGVybmFsSXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmICghaW50ZXJuYWxJc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoaW50ZXJuYWxJc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgc3RyaW5nIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmdcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhlIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgYW5kIGBpcy1idWZmZXJgIChpbiBTYWZhcmkgNS03KSB0byBkZXRlY3Rcbi8vIEJ1ZmZlciBpbnN0YW5jZXMuXG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBJTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgIC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChpc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoaW50ZXJuYWxJc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJlxuICAgICAgICB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaVxuICBpZiAoZGlyKSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIWludGVybmFsSXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBpbnRlcm5hbElzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IHV0ZjhUb0J5dGVzKG5ldyBCdWZmZXIodmFsLCBlbmNvZGluZykudG9TdHJpbmcoKSlcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuXG5cbi8vIHRoZSBmb2xsb3dpbmcgaXMgZnJvbSBpcy1idWZmZXIsIGFsc28gYnkgRmVyb3NzIEFib3VraGFkaWplaCBhbmQgd2l0aCBzYW1lIGxpc2VuY2Vcbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbmV4cG9ydCBmdW5jdGlvbiBpc0J1ZmZlcihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmICghIW9iai5faXNCdWZmZXIgfHwgaXNGYXN0QnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikpXG59XG5cbmZ1bmN0aW9uIGlzRmFzdEJ1ZmZlciAob2JqKSB7XG4gIHJldHVybiAhIW9iai5jb25zdHJ1Y3RvciAmJiB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopXG59XG5cbi8vIEZvciBOb2RlIHYwLjEwIHN1cHBvcnQuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuXG5mdW5jdGlvbiBpc1Nsb3dCdWZmZXIgKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iai5yZWFkRmxvYXRMRSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLnNsaWNlID09PSAnZnVuY3Rpb24nICYmIGlzRmFzdEJ1ZmZlcihvYmouc2xpY2UoMCwgMCkpXG59XG4iLCJjbGFzcyBUZXh0RW5jb2RlciB7XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RleHRFbmNvZGVyI1BvbHlmaWxsXG4gICAgc3RhdGljIGVuY29kZSAoc3RyKSB7XG4gICAgICAgIGNvbnN0IExlbiA9IHN0ci5sZW5ndGg7XG4gICAgICAgIGxldCByZXNQb3MgPSAtMTtcbiAgICAgICAgLy8gVGhlIFVpbnQ4QXJyYXkncyBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAzeCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgYmVjYXVzZSBhbiBpbnZhbGlkIFVURi0xNlxuICAgICAgICAvLyAgdGFrZXMgdXAgdGhlIGVxdWl2ZWxlbnQgc3BhY2Ugb2YgMyBVVEYtOCBjaGFyYWN0ZXJzIHRvIGVuY29kZSBpdCBwcm9wZXJseS4gSG93ZXZlciwgQXJyYXknc1xuICAgICAgICAvLyAgaGF2ZSBhbiBhdXRvIGV4cGFuZGluZyBsZW5ndGggYW5kIDEuNXggc2hvdWxkIGJlIGp1c3QgdGhlIHJpZ2h0IGJhbGFuY2UgZm9yIG1vc3QgdXNlcy5cbiAgICAgICAgY29uc3QgcmVzQXJyID0gW107XG4gICAgICAgIGZvciAobGV0IHBvaW50ID0gMCwgbmV4dGNvZGUgPSAwLCBpZHggPSAwOyBpZHggIT09IExlbjspIHtcbiAgICAgICAgICAgIHBvaW50ID0gc3RyLmNoYXJDb2RlQXQoaWR4KSwgaWR4ICs9IDE7XG4gICAgICAgICAgICBpZiAocG9pbnQgPj0gMHhEODAwICYmIHBvaW50IDw9IDB4REJGRikge1xuICAgICAgICAgICAgICAgIGlmIChpZHggPT09IExlbikge1xuICAgICAgICAgICAgICAgICAgICByZXNBcnJbcmVzUG9zICs9IDFdID0gMHhlZjtcbiAgICAgICAgICAgICAgICAgICAgcmVzQXJyW3Jlc1BvcyArPSAxXSA9IDB4YmY7XG4gICAgICAgICAgICAgICAgICAgIHJlc0FycltyZXNQb3MgKz0gMV0gPSAweGJkO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmcjc3Vycm9nYXRlLWZvcm11bGFlXG4gICAgICAgICAgICAgICAgbmV4dGNvZGUgPSBzdHIuY2hhckNvZGVBdChpZHgpO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0Y29kZSA+PSAweERDMDAgJiYgbmV4dGNvZGUgPD0gMHhERkZGKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50ID0gKChwb2ludCAtIDB4RDgwMCkgKiAweDQwMCkgKyBuZXh0Y29kZSAtIDB4REMwMCArIDB4MTAwMDA7XG4gICAgICAgICAgICAgICAgICAgIGlkeCArPSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnQgPiAweGZmZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc0FycltyZXNQb3MgKz0gMV0gPSAoMHgxZSA8PCAzKSB8IChwb2ludCA+Pj4gMTgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzQXJyW3Jlc1BvcyArPSAxXSA9ICgweDIgPDwgNikgfCAoKHBvaW50ID4+PiAxMikgJiAweDNmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc0FycltyZXNQb3MgKz0gMV0gPSAoMHgyIDw8IDYpIHwgKChwb2ludCA+Pj4gNikgJiAweDNmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc0FycltyZXNQb3MgKz0gMV0gPSAoMHgyIDw8IDYpIHwgKHBvaW50ICYgMHgzZik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc0FycltyZXNQb3MgKz0gMV0gPSAweGVmOyByZXNBcnJbcmVzUG9zICs9IDFdID0gMHhiZjtcbiAgICAgICAgICAgICAgICAgICAgcmVzQXJyW3Jlc1BvcyArPSAxXSA9IDB4YmQ7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb2ludCA8PSAweDAwN2YpIHtcbiAgICAgICAgICAgICAgICByZXNBcnJbcmVzUG9zICs9IDFdID0gKDB4MCA8PCA3KSB8IHBvaW50O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwb2ludCA8PSAweDA3ZmYpIHtcbiAgICAgICAgICAgICAgICByZXNBcnJbcmVzUG9zICs9IDFdID0gKDB4NiA8PCA1KSB8IChwb2ludCA+Pj4gNik7XG4gICAgICAgICAgICAgICAgcmVzQXJyW3Jlc1BvcyArPSAxXSA9ICgweDIgPDwgNikgfCAocG9pbnQgJiAweDNmKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzQXJyW3Jlc1BvcyArPSAxXSA9ICgweGUgPDwgNCkgfCAocG9pbnQgPj4+IDEyKTtcbiAgICAgICAgICAgICAgICByZXNBcnJbcmVzUG9zICs9IDFdID0gKDB4MiA8PCA2KSB8ICgocG9pbnQgPj4+IDYpICYgMHgzZik7XG4gICAgICAgICAgICAgICAgcmVzQXJyW3Jlc1BvcyArPSAxXSA9ICgweDIgPDwgNikgfCAocG9pbnQgJiAweDNmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBlbHNlIC8vIElFIDYtOVxuICAgICAgICByZXNBcnIubGVuZ3RoID0gcmVzUG9zICsgMTsgLy8gdHJpbSBvZmYgZXh0cmEgd2VpZ2h0XG4gICAgICAgIHJldHVybiByZXNBcnI7XG4gICAgfVxufVxuXG5leHBvcnQgeyBUZXh0RW5jb2RlciB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBUZXh0RW5jb2RlciB9IGZyb20gJy4vVGV4dEVuY29kZXIuanMnO1xuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vcnBjL1JwY1N0cnVjdC5qcyc7XG5cbmNsYXNzIEpzb25ScGNNYXJzaGFsbGVyIHtcbiAgICAvKipcbiAgICAgKiBUYWtlcyBhbiBSUEMgbWVzc2FnZSBhbmQgY29udmVydHMgaXRcbiAgICAgKiBpbnRvIGEgYnl0ZSBhcnJheSB0aGF0IGNhbiBiZSBhZGRlZFxuICAgICAqIGFzIHBhcnQgb2YgdGhlIFNkbFBhY2tldC5cbiAgICAgKiBAcGFyYW0ge1JwY1N0cnVjdH0gcnBjU3RydWN0IC0gVGhpcyBwYXJhbSBjb250YWlucyB0aGUganNvbiBvYmplY3QgdG8gdHJhbnNmb3JtXG4gICAgICogYmFzZWQgb24gdGhlIGdldFBhcmFtZXRlcnMgbWV0aG9kLiBUaGlzIGNhbiBiZSBhbiBScGNTdHJ1Y3Qgb3Igc29tZXRoaW5nIGxpa2UgUnBjTWVzc2FnZVxuICAgICAqIHdoaWNoIGV4dGVuZHMgUnBjU3RydWN0LlxuICAgICAqIEByZXR1cm5zIHtudWxsfFVpbnQ4QXJyYXl9IC0gRWl0aGVyIHRoZSBieXRlIGFycmF5IG9yIG51bGwgb24gZXJyb3IuXG4gICAgICovXG4gICAgc3RhdGljIG1hcnNoYWxsIChycGNTdHJ1Y3QpIHtcbiAgICAgICAgbGV0IGpzb25CeXRlcyA9IG51bGw7XG4gICAgICAgIGZ1bmN0aW9uIHBhcmFtaWZ5IChycGNTdHJ1Y3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHJwY1N0cnVjdC5nZXRQYXJhbWV0ZXJzKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zW2tleV0gaW5zdGFuY2VvZiBScGNTdHJ1Y3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2tleV0gPSBwYXJhbWlmeShwYXJhbXNba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBqc29uT2JqZWN0ID0gcGFyYW1pZnkocnBjU3RydWN0KTtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZ1ZlcnNpb24gPSBKU09OLnN0cmluZ2lmeShqc29uT2JqZWN0KTtcbiAgICAgICAgICAgIGpzb25CeXRlcyA9IHRoaXMuX2VuY29kZShzdHJpbmdWZXJzaW9uKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBlbmNvZGUgbWVzc2FnZXMgdG8gSlNPTi4nLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpzb25CeXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIGJ5dGUgYXJyYXkgYW5kIHRyYW5zZm9ybXMgaXQgaW50byBhIGpzb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gYnl0ZXMgLSBCeXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGpzb24gc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bGx8T2JqZWN0fSAtIEVpdGhlciBhIGpzb24gb2JqZWN0IG9yIG51bGwgb24gZXJyb3IgaW4gcGFyc2luZy5cbiAgICAgKi9cbiAgICBzdGF0aWMgdW5tYXJzaGFsbCAoYnl0ZXMpIHtcbiAgICAgICAgbGV0IHJldCA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBqc29uU3RyaW5nID0gdGhpcy5fZGVjb2RlKGJ5dGVzKTtcbiAgICAgICAgICAgIHJldCA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcGFyc2UgSlNPTicsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSBhIHN0cmluZyBpbnRvIGEgYnl0ZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIC0gU3RyaW5nIHRvIHRyYW5zZm9ybS5cbiAgICAgKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN0YXRpYyBfZW5jb2RlIChzdHIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFRleHRFbmNvZGVyLmVuY29kZShzdHIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gYSBieXRlIGFycmF5IGludG8gYSBzdHJpbmcuXG4gICAgICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlcyAtIEJ5dGUgYXJyYXkgdG8gdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgX2RlY29kZSAoYnl0ZXMpIHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ5dGVzKS50b1N0cmluZygpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgSnNvblJwY01hcnNoYWxsZXIgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuLyoqXG4gKiBDb250YWlucyB0aGUgcmF3IGpzb24gZGF0YSBhbmQgYnVsayBkYXRhIGZvciBhbiBSUEMgcmVxdWVzdC9yZXNwb25zZSBhbG9uZyB3aXRoIHRoZSBiYXNpYyBoZWFkZXIgaW5mb1xuICogcnBjIHR5cGUsIGZ1bmN0aW9uIGlkLCBhbmQgY29ycmVsYXRpb24gaWQuXG4gKlxuICogVGhpcyBjbGFzcyBjYW4gcGFyc2UgaW5jb21pbmcgZGF0YSBmcm9tIHNkbCBjb3JlIGFuZCBhc3NlbWJsZSBhIGJpbmFyeSBoZWFkZXIgdG8gc2VuZCB0byBzZGwgY29yZS5cbiAqXG4gKlxuICogIEBwcml2YXRlIHtudW1iZXJ9IF9ycGNUeXBlIC0gUmVxdWVzdCA9IDAsIFJlc3BvbnNlID0gMSwgTm90aWZpY2F0aW9uID0gMi5cbiAqICBAcHJpdmF0ZSB7bnVtYmVyfSBfZnVuY3Rpb25JZCAtIE1hdGNoZXMgYSBmdW5jdGlvbiBJZCBpbiB0aGUgbW9iaWxlIGFwaSBzcGVjIGh0dHBzOi8vZ2l0aHViLmNvbS9zbWFydGRldmljZWxpbmsvcnBjX3NwZWMvYmxvYi9tYXN0ZXIvTU9CSUxFX0FQSS54bWxcbiAqICBAcHJpdmF0ZSB7bnVtYmVyfSBfY29ycmVsYXRpb25JZCAtIEZvciBhIHJlcXVlc3QgdGhpcyBpZCBpcyBwcm92aWRlZCBhbmQgdGhlIG1hdGNoaW5nIHJlc3BvbnNlIHdpbGwgaGF2ZSB0aGlzIHNhbWUgaWQuXG4gKiAgQHByaXZhdGUge251bWJlcn0gX2pzb25TaXplIC0gU2l6ZSBvZiBqc29uLlxuICogIEBwcml2YXRlIHtVaW50OEFycmF5fSBfanNvbkRhdGEgLSBSYXcganNvbiBkYXRhLiBUaGlzIGNhbiBiZSBwYXJzZWQgdXNpbmcgdGhlIEpzb25ScGNNYXJzaGFsbGVyLlxuICogIEBwcml2YXRlIHtVaW50OEFycmF5fSBfYnVsa0RhdGEgLSBCdWxrIGRhdGEgKG9wdGlvbmFsKS4gSWYgc29tZXRoaW5nIGNhbm5vdCBiZSBleHByZXNzZWQgYXMgYSBqc29uIG9iamVjdCBpdCB3aWxsIGJlIGluIHRoZSBidWxrIGRhdGEgKGVnIFB1dEZpbGUvR2V0RmlsZSBoYXMgdGhlIGZ1bGwgZmlsZSBpbiBidWxrIGRhdGEuKVxuICovXG5jbGFzcyBCaW5hcnlGcmFtZUhlYWRlciB7XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcnBjVHlwZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmdW5jdGlvbklkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvcnJlbGF0aW9uSWRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0ganNvblNpemVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocnBjVHlwZSwgZnVuY3Rpb25JZCwgY29ycmVsYXRpb25JZCwganNvblNpemUpIHtcbiAgICAgICAgdGhpcy5fcnBjVHlwZSA9IHJwY1R5cGU7XG4gICAgICAgIHRoaXMuX2Z1bmN0aW9uSWQgPSBmdW5jdGlvbklkO1xuICAgICAgICB0aGlzLl9jb3JyZWxhdGlvbklkID0gY29ycmVsYXRpb25JZDtcbiAgICAgICAgdGhpcy5fanNvblNpemUgPSBqc29uU2l6ZTtcbiAgICAgICAgdGhpcy5fYnVsa0RhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLl9qc29uRGF0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBieXRlIGFycmF5IHdpdGggdWludDggdmFsdWVzLCBhIEJpbmFyeUZyYW1lSGVhZGVyIGluc3RhbmNlIGlzIGNyZWF0ZWQuXG4gICAgICogQHBhcmFtIHthcnJheX0gYmluYXJ5RnJhbWVIZWFkZXJEYXRhIC0gQnl0ZSBhcnJheSBjb250YWluaW5nIGJhc2ljIGluZm9ybWF0aW9uIG9uIHRoZSBmcmFtZXMgdHlwZSwgbGVuZ3RoLCBhbmQgcmVsYXRlZCBpZHMuXG4gICAgICogQHJldHVybnMge0JpbmFyeUZyYW1lSGVhZGVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tQmluYXJ5SGVhZGVyIChiaW5hcnlGcmFtZUhlYWRlckRhdGEpIHtcbiAgICAgICAgY29uc3QgcnBjVHlwZSA9IGJpbmFyeUZyYW1lSGVhZGVyRGF0YVswXSA+PiA0O1xuXG4gICAgICAgIGxldCBmdW5jdGlvbklkID0gKGJpbmFyeUZyYW1lSGVhZGVyRGF0YVswXSAmIDB4MEYpIDw8IDI0O1xuICAgICAgICBmdW5jdGlvbklkICs9IChiaW5hcnlGcmFtZUhlYWRlckRhdGFbMV0gJiAweEZGKSA8PCAxNjtcbiAgICAgICAgZnVuY3Rpb25JZCArPSAoYmluYXJ5RnJhbWVIZWFkZXJEYXRhWzJdICYgMHhGRikgPDwgODtcbiAgICAgICAgZnVuY3Rpb25JZCArPSBiaW5hcnlGcmFtZUhlYWRlckRhdGFbM10gJiAweEZGO1xuXG4gICAgICAgIGxldCBjb3JyZWxhdGlvbklkID0gKGJpbmFyeUZyYW1lSGVhZGVyRGF0YVs0XSAmIDB4RkYpIDw8IDI0O1xuICAgICAgICBjb3JyZWxhdGlvbklkICs9IChiaW5hcnlGcmFtZUhlYWRlckRhdGFbNV0gJiAweEZGKSA8PCAxNjtcbiAgICAgICAgY29ycmVsYXRpb25JZCArPSAoYmluYXJ5RnJhbWVIZWFkZXJEYXRhWzZdICYgMHhGRikgPDwgODtcbiAgICAgICAgY29ycmVsYXRpb25JZCArPSBiaW5hcnlGcmFtZUhlYWRlckRhdGFbN10gJiAweEZGO1xuXG4gICAgICAgIGxldCBqc29uU2l6ZSA9IChiaW5hcnlGcmFtZUhlYWRlckRhdGFbOF0gJiAweEZGKSA8PCAyNDtcbiAgICAgICAganNvblNpemUgKz0gKGJpbmFyeUZyYW1lSGVhZGVyRGF0YVs5XSAmIDB4RkYpIDw8IDE2O1xuICAgICAgICBqc29uU2l6ZSArPSAoYmluYXJ5RnJhbWVIZWFkZXJEYXRhWzEwXSAmIDB4RkYpIDw8IDg7XG4gICAgICAgIGpzb25TaXplICs9IGJpbmFyeUZyYW1lSGVhZGVyRGF0YVsxMV0gJiAweEZGO1xuXG4gICAgICAgIGNvbnN0IGJpbmFyeUZyYW1lSGVhZGVyID0gbmV3IEJpbmFyeUZyYW1lSGVhZGVyKHJwY1R5cGUsIGZ1bmN0aW9uSWQsIGNvcnJlbGF0aW9uSWQsIGpzb25TaXplKTtcblxuICAgICAgICBjb25zdCBqc29uRGF0YVN0YXJ0ID0gQmluYXJ5RnJhbWVIZWFkZXIuSEVBREVSX1NJWkU7XG4gICAgICAgIGNvbnN0IGpzb25EYXRhRW5kID0gQmluYXJ5RnJhbWVIZWFkZXIuSEVBREVSX1NJWkUgKyBqc29uU2l6ZTtcblxuICAgICAgICBiaW5hcnlGcmFtZUhlYWRlci5zZXRKc29uRGF0YShiaW5hcnlGcmFtZUhlYWRlckRhdGEuc2xpY2UoanNvbkRhdGFTdGFydCwganNvbkRhdGFFbmQpKTtcblxuICAgICAgICAvLyBhbnkgZGF0YSBhZnRlciB0aGUgSlNPTiBkYXRhIGlzIHRoZSBidWxrIGRhdGEgKGVnIFB1dEZpbGUgY29udGFpbnMgdGhlIGZpbGUgYWZ0ZXIgdGhlIG1haW4ganNvbilcbiAgICAgICAgaWYgKGJpbmFyeUZyYW1lSGVhZGVyRGF0YS5sZW5ndGggPiBqc29uRGF0YUVuZCkge1xuICAgICAgICAgICAgY29uc3QgYnVsa0RhdGEgPSBiaW5hcnlGcmFtZUhlYWRlckRhdGEuc2xpY2UoanNvbkRhdGFFbmQpO1xuICAgICAgICAgICAgYmluYXJ5RnJhbWVIZWFkZXIuc2V0QnVsa0RhdGEoYnVsa0RhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiaW5hcnlGcmFtZUhlYWRlcjtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEFzc2VtYmxlcyBiaW5hcnkgaGVhZGVyIGRhdGEuXG4gICAgICogQHJldHVybnMge2FycmF5fVxuICAgICAqL1xuICAgIGFzc2VtYmxlSGVhZGVyQnl0ZXMgKCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSBbXTtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25JZCA9IHRoaXMuX2Z1bmN0aW9uSWQ7XG4gICAgICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSB0aGlzLl9jb3JyZWxhdGlvbklkO1xuICAgICAgICBjb25zdCBycGNUeXBlID0gdGhpcy5fcnBjVHlwZTtcblxuICAgICAgICBidWZmZXIucHVzaCgoZnVuY3Rpb25JZCAmIDB4MEYwMDAwMDApID4+IDI0KSArIChycGNUeXBlIDw8IDQpO1xuICAgICAgICBidWZmZXIucHVzaCgoZnVuY3Rpb25JZCAmIDB4MDBGRjAwMDApID4+IDE2KTtcbiAgICAgICAgYnVmZmVyLnB1c2goKGZ1bmN0aW9uSWQgJiAweDAwMDBGRjAwKSA+PiA4KTtcbiAgICAgICAgYnVmZmVyLnB1c2goZnVuY3Rpb25JZCAmIDB4MDAwMDAwRkYpO1xuXG4gICAgICAgIGJ1ZmZlci5wdXNoKChjb3JyZWxhdGlvbklkICYgMHhGRjAwMDAwMCkgPj4gMjQpO1xuICAgICAgICBidWZmZXIucHVzaCgoY29ycmVsYXRpb25JZCAmIDB4MDBGRjAwMDApID4+IDE2KTtcbiAgICAgICAgYnVmZmVyLnB1c2goKGNvcnJlbGF0aW9uSWQgJiAweDAwMDBGRjAwKSA+PiA4KTtcbiAgICAgICAgYnVmZmVyLnB1c2goY29ycmVsYXRpb25JZCAmIDB4MDAwMDAwRkYpO1xuXG4gICAgICAgIGNvbnN0IGpzb25TaXplID0gdGhpcy5fanNvblNpemU7XG4gICAgICAgIGJ1ZmZlci5wdXNoKChqc29uU2l6ZSAmIDB4RkYwMDAwMDApID4+IDI0KTtcbiAgICAgICAgYnVmZmVyLnB1c2goKGpzb25TaXplICYgMHgwMEZGMDAwMCkgPj4gMTYpO1xuICAgICAgICBidWZmZXIucHVzaCgoanNvblNpemUgJiAweDAwMDBGRjAwKSA+PiA4KTtcbiAgICAgICAgYnVmZmVyLnB1c2goanNvblNpemUgJiAweDAwMDAwMEZGKTtcblxuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJwYyB0eXBlIG9mIHRoZSBiaW5hcnkgaGVhZGVyLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlXG4gICAgICogQHJldHVybnMge0JpbmFyeUZyYW1lSGVhZGVyfVxuICAgICAqL1xuICAgIHNldFJwY1R5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy5fcnBjVHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJwYyB0eXBlIG9mIHRoZSBiaW5hcnkgaGVhZGVyXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXRScGNUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JwY1R5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZnVuY3Rpb24gaWQgb2YgdGhlIGJpbmFyeSBoZWFkZXIuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGlkXG4gICAgICogQHJldHVybnMge0JpbmFyeUZyYW1lSGVhZGVyfVxuICAgICAqL1xuICAgIHNldEZ1bmN0aW9uSWQgKGlkKSB7XG4gICAgICAgIHRoaXMuX2Z1bmN0aW9uSWQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZnVuY3Rpb24gSWQgb2YgdGhlIGJpbmFyeSBoZWFkZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXRGdW5jdGlvbklkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Z1bmN0aW9uSWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY29ycmVsYXRpb24gSWQgb2YgdGhlIGJpbmFyeSBoZWFkZXIuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGlkXG4gICAgICogQHJldHVybnMge0JpbmFyeUZyYW1lSGVhZGVyfVxuICAgICAqL1xuICAgIHNldENvcnJlbGF0aW9uSWQgKGlkKSB7XG4gICAgICAgIHRoaXMuX2NvcnJlbGF0aW9uSWQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29ycmVsYXRpb24gSWQgb2YgdGhlIGJpbmFyeSBoZWFkZXIuXG4gICAgICovXG4gICAgZ2V0Q29ycmVsYXRpb25JZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3JyZWxhdGlvbklkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGpzb24gc2l6ZSBvZiB0aGUgYmluYXJ5IGhlYWRlci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICAgICAqIEByZXR1cm5zIHtCaW5hcnlGcmFtZUhlYWRlcn1cbiAgICAgKi9cbiAgICBzZXRKc29uU2l6ZSAoc2l6ZSkge1xuICAgICAgICB0aGlzLl9qc29uU2l6ZSA9IHNpemU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlc3QgdGhlIGpzb24gc2l6ZSBvZiB0aGUgYmluYXJ5IGhlYWRlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldEpzb25TaXplICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2pzb25TaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGpzb24gZGF0YSBhcyBhIGJ5dGUgYXJyYXkuXG4gICAgICogQHJldHVybnMge2FycmF5fSAtIEJ5dGUgYXJyYXkgb2YganNvbiBkYXRhLlxuICAgICAqL1xuICAgIGdldEpzb25EYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2pzb25EYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGpzb24gZGF0YSBvZiB0aGUgYmluYXJ5IGhlYWRlci5cbiAgICAgKiBAcGFyYW0ge2FycmF5fSBkYXRhIC0gQnl0ZSBhcnJheSBvZiBqc29uIGRhdGFcbiAgICAgKiBAcmV0dXJucyB7QmluYXJ5RnJhbWVIZWFkZXJ9XG4gICAgICovXG4gICAgc2V0SnNvbkRhdGEgKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fanNvbkRhdGEgPSBkYXRhO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBidWxrIGRhdGEgb2YgdGhlIGJpbmFyeSBoZWFkZXIuXG4gICAgICogU3VwcG9ydGVkIGJ5IHByb3Rjb2wgMiBhbmQgdXAuXG4gICAgICogQHBhcmFtIHthcnJheX0gZGF0YSAtIEJ5dGUgYXJyYXkgb2YgYnVsayBkYXRhXG4gICAgICovXG4gICAgc2V0QnVsa0RhdGEgKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fYnVsa0RhdGEgPSBkYXRhO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBidWxrIGRhdGEgb2YgdGhlIGJpbmFyeSBoZWFkZXIuXG4gICAgICogU3VwcG9ydGVkIGJ5IHByb3Rjb2wgMiBhbmQgdXAuXG4gICAgICogQHJldHVybnMge2FycmF5fSAtIEJ5dGUgYXJyYXkgb2YgYnVsayBkYXRhXG4gICAgICovXG4gICAgZ2V0QnVsa0RhdGEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnVsa0RhdGE7XG4gICAgfVxufVxuXG5CaW5hcnlGcmFtZUhlYWRlci5IRUFERVJfU0laRSA9IDEyO1xuXG5leHBvcnQgeyBCaW5hcnlGcmFtZUhlYWRlciB9O1xuXG5cbiIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuaW1wb3J0IHsgRnJhbWVUeXBlIH0gZnJvbSAnLi9lbnVtcy9GcmFtZVR5cGUuanMnO1xuaW1wb3J0IHsgU2RsUGFja2V0IH0gZnJvbSAnLi9TZGxQYWNrZXQuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4vLi4vcnBjL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgSnNvblJwY01hcnNoYWxsZXIgfSBmcm9tICcuLy4uL3V0aWwvSnNvblJwY01hcnNoYWxsZXIuanMnO1xuaW1wb3J0IHsgQmluYXJ5RnJhbWVIZWFkZXIgfSBmcm9tICcuL0JpbmFyeUZyYW1lSGVhZGVyLmpzJztcblxuXG4vKipcbiAqIFRha2VzIGFuIHJwYyBtZXNzYWdlIGFuZCBjb252ZXJ0cyBpdCBpbnRvIHBhY2tldHMgcmVhZHkgdG8gc2VuZC5cbiAqL1xuY2xhc3MgTWVzc2FnZUZyYW1lRGlzYXNzZW1ibGVyIHtcbiAgICAvKipcbiAgICAgICpcbiAgICAgICogQHBhcmFtIHtScGNSZXF1ZXN0fSBycGNSZXF1ZXN0IC0gUlBDIG1lc3NhZ2UgdGhhdCB3aWxsIHNwbGl0IGludG8gc21hbGxlciBzZGwgcGFja2V0cy5cbiAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNlc3Npb25JZCAtIHNlc3Npb25JZCBmb3IgcGFja2V0c1xuICAgICAgKiBAcGFyYW0ge051bWJlcn0gbWVzc2FnZUlkIC0gbWVzc2FnZUlkIGZvciBwYWNrZXRzLlxuICAgICAgKiBAcGFyYW0ge051bWJlcn0gbXR1IC0gbWF4IHRyYW5zcG9ydCB1bml0LCB1c2VkIHRvIGRldGVybWluZSBwYWNrZXQgc2l6ZSB0byBzZW5kLlxuICAgICAgKiBAcGFyYW0ge051bWJlcn0gdmVyc2lvbiAtIG1ham9yIHZlcnNpb25cbiAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc0VuY3J5cHRlZCAtIHBhY2tldCBpcyBlbmNyeXB0ZWRcbiAgICAgICogQHBhcmFtIHtjYn0gcGFja2V0Q2FsbGJhY2sgLSBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBwYWNrZXQgaXMgcmVhZHkgdG8gc2VuZC5cbiAgICAgICogQGNvbnN0cnVjdG9yXG4gICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChycGNSZXF1ZXN0LCBzZXNzaW9uSWQsIG1lc3NhZ2VJZCwgbXR1LCB2ZXJzaW9uLCBpc0VuY3J5cHRlZCwgcGFja2V0Q2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fcnBjUmVxdWVzdCA9IHJwY1JlcXVlc3Q7XG4gICAgICAgIHRoaXMuX3Nlc3Npb25JZCA9IHNlc3Npb25JZDtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUlkID0gbWVzc2FnZUlkO1xuICAgICAgICB0aGlzLl9pc0VuY3J5cHRlZCA9IGlzRW5jcnlwdGVkO1xuXG4gICAgICAgIGlmICghbXR1KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01UVSBtdXN0IGJlIHNwZWNpZmllZC4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tdHUgPSBtdHU7XG5cbiAgICAgICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZlcnNpb24gbXVzdCBiZSBzcGVjaWZpZWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMuX3BhY2tldENhbGxiYWNrID0gcGFja2V0Q2FsbGJhY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAqIEltbWVkaWF0ZWx5IGJ1aWxkIHJwYyBhbmQgcmVzcG9uZCB0byBwYWNrZXRjYWxsYmFjayB3aXRoIHBhY2tldHMgdG8gc2VuZC5cbiAgICAgICogQHBhcmFtIHtScGNSZXF1ZXN0fSBycGNNZXNzYWdlIC0gUlBDIG1lc3NhZ2UgdGhhdCB3aWxsIHNwbGl0IGludG8gc21hbGxlciBzZGwgcGFja2V0cy5cbiAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHNlc3Npb25JZCAtIHNlc3Npb25JZCBmb3IgcGFja2V0c1xuICAgICAgKiBAcGFyYW0ge051bWJlcn0gbWVzc2FnZUlkIC0gbWVzc2FnZUlkIGZvciBwYWNrZXRzLlxuICAgICAgKiBAcGFyYW0ge051bWJlcn0gbXR1IC0gbWF4IHRyYW5zcG9ydCB1bml0LCB1c2VkIHRvIGRldGVybWluZSBwYWNrZXQgc2l6ZSB0byBzZW5kLlxuICAgICAgKiBAcGFyYW0ge051bWJlcn0gdmVyc2lvbiAtIG1ham9yIHZlcnNpb25cbiAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc0VuY3J5cHRlZCAtIHBhY2tldCBpcyBlbmNyeXB0ZWRcbiAgICAgICogQHBhcmFtIHtjYn0gcGFja2V0Q2FsbGJhY2sgLSBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBwYWNrZXQgaXMgcmVhZHkgdG8gc2VuZC5cbiAgICAgICovXG4gICAgc3RhdGljIGJ1aWxkUlBDIChycGNSZXF1ZXN0LCBzZXNzaW9uSWQsIG1lc3NhZ2VJZCwgbXR1LCB2ZXJzaW9uLCBpc0VuY3J5cHRlZCwgY2IpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gbmV3IE1lc3NhZ2VGcmFtZURpc2Fzc2VtYmxlcihycGNSZXF1ZXN0LCBzZXNzaW9uSWQsIG1lc3NhZ2VJZCwgbXR1LCB2ZXJzaW9uLCBpc0VuY3J5cHRlZCwgY2IpO1xuICAgICAgICBvYmouX2RvUmVxdWVzdCgpO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyB0aGUgbWFpbiBCaW5hcnlGcmFtZUhlYWRlciBidWZmZXIuXG4gICAgICogQHJldHVybnMge1VuaXQ4QXJyYXl9XG4gICAgICovXG4gICAgX2J1aWxkUlBDTWFpbkJ1ZmZlciAoKSB7XG4gICAgICAgIGNvbnN0IHJwY0J1bGtEYXRhID0gdGhpcy5fcnBjUmVxdWVzdC5nZXRCdWxrRGF0YSgpO1xuICAgICAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gdGhpcy5fcnBjUmVxdWVzdC5nZXRDb3JyZWxhdGlvbklkKCk7XG4gICAgICAgIGNvbnN0IHJwY1R5cGUgPSAgdGhpcy5fcnBjUmVxdWVzdC5nZXRSUENUeXBlKCk7XG5cbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gdGhpcy5fcnBjUmVxdWVzdC5nZXRGdW5jdGlvbk5hbWUoKTtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25JZCA9IEZ1bmN0aW9uSUQudmFsdWVGb3JLZXkoZnVuY3Rpb25OYW1lKTtcbiAgICAgICAgaWYgKCFmdW5jdGlvbklkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmaW5kIGZ1bmN0aW9uICR7ZnVuY3Rpb25OYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QganNvbkJ1ZmZlciA9IEpzb25ScGNNYXJzaGFsbGVyLm1hcnNoYWxsKHRoaXMuX3JwY1JlcXVlc3QpO1xuICAgICAgICBjb25zdCBqc29uU2l6ZSA9IGpzb25CdWZmZXIubGVuZ3RoO1xuXG4gICAgICAgIGNvbnN0IGJmaCA9IG5ldyBCaW5hcnlGcmFtZUhlYWRlcihycGNUeXBlLCBmdW5jdGlvbklkLCBjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgYmZoLnNldEpzb25EYXRhKGpzb25CdWZmZXIpO1xuICAgICAgICBiZmguc2V0SnNvblNpemUoanNvblNpemUpO1xuICAgICAgICBiZmguc2V0QnVsa0RhdGEocnBjQnVsa0RhdGEpO1xuICAgICAgICBjb25zdCBoZWFkZXJTaXplID0gMTI7XG4gICAgICAgIGNvbnN0IGJ1bGtEYXRhID0gYmZoLmdldEJ1bGtEYXRhKCk7XG4gICAgICAgIGxldCBidWxrRGF0YVNpemUgPSAwO1xuICAgICAgICBpZiAoYnVsa0RhdGEpIHtcbiAgICAgICAgICAgIGJ1bGtEYXRhU2l6ZSA9IGJ1bGtEYXRhLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbE1lc3NhZ2VTaXplID0gaGVhZGVyU2l6ZSArIGpzb25TaXplICsgYnVsa0RhdGFTaXplO1xuICAgICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkodG90YWxNZXNzYWdlU2l6ZSk7XG4gICAgICAgIGRhdGEuc2V0KGJmaC5hc3NlbWJsZUhlYWRlckJ5dGVzKCksIDApO1xuICAgICAgICBkYXRhLnNldChqc29uQnVmZmVyLCBoZWFkZXJTaXplKTtcbiAgICAgICAgaWYgKGJ1bGtEYXRhKSB7XG4gICAgICAgICAgICBkYXRhLnNldChidWxrRGF0YSwgaGVhZGVyU2l6ZSArIGpzb25TaXplKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFN0YXJ0IHRoZSBSUEMgcmVxdWVzdCBhbmQgdXNlIGNhbGxiYWNrIHRvIHNlbmRcbiAgICAgKiBzZGwgcGFja2V0cyBvZiB0aGUgYXBwcm9wcmlhdGUgc2l6ZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9kb1JlcXVlc3QgKCkge1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5fdmVyc2lvbjtcbiAgICAgICAgY29uc3QgZnJhbWVJbmZvID0gMDtcbiAgICAgICAgY29uc3QgZnJhbWVUeXBlID0gRnJhbWVUeXBlLlNJTkdMRTtcblxuICAgICAgICBjb25zdCBzZXJ2aWNlVHlwZSA9IFNkbFBhY2tldC5TRVJWSUNFX1RZUEVfUlBDO1xuICAgICAgICBjb25zdCBzZXNzaW9uSWQgPSB0aGlzLl9zZXNzaW9uSWQ7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJZCA9IHRoaXMuX21lc3NhZ2VJZDtcblxuICAgICAgICBjb25zdCBpc0VuY3J5cHRlZCA9IHRoaXMuX2lzRW5jcnlwdGVkO1xuICAgICAgICBjb25zdCBtYWluQnVmZmVyID0gdGhpcy5fYnVpbGRSUENNYWluQnVmZmVyKCk7XG4gICAgICAgIGNvbnN0IG10dSA9IHRoaXMuX210dTtcblxuICAgICAgICBjb25zdCBmcmFtZUNvdW50ID0gTWF0aC5jZWlsKG1haW5CdWZmZXIubGVuZ3RoIC8gbXR1KTtcblxuICAgICAgICBpZiAoZnJhbWVDb3VudCA8PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBmdWxsUGFja2V0ID0gdGhpcy5fY29uc3RydWN0UGFja2V0KFxuICAgICAgICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgICAgICAgc2VydmljZVR5cGUsXG4gICAgICAgICAgICAgICAgZnJhbWVJbmZvLFxuICAgICAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgZnJhbWVUeXBlLFxuICAgICAgICAgICAgICAgIG1haW5CdWZmZXIsXG4gICAgICAgICAgICAgICAgaXNFbmNyeXB0ZWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl9wYWNrZXRDYWxsYmFjayhmdWxsUGFja2V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig4KTsgLy8gSW50MzIgaGFzIDggYnl0ZXNcbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKDAsIG1haW5CdWZmZXIubGVuZ3RoLCBmYWxzZSk7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMig0LCBmcmFtZUNvdW50LCBmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcblxuICAgICAgICAgICAgY29uc3QgZmlyc3RIZWFkZXIgPSB0aGlzLl9jb25zdHJ1Y3RQYWNrZXQodmVyc2lvbiwgc2VydmljZVR5cGUsIGZyYW1lSW5mbywgc2Vzc2lvbklkLCBtZXNzYWdlSWQsIEZyYW1lVHlwZS5GSVJTVCwgcGF5bG9hZCwgaXNFbmNyeXB0ZWQpO1xuICAgICAgICAgICAgdGhpcy5fcGFja2V0Q2FsbGJhY2soZmlyc3RIZWFkZXIpO1xuXG4gICAgICAgICAgICB0aGlzLl9idWlsZENvbnNlY3V0aXZlRnJhbWVzKFxuICAgICAgICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgICAgICAgc2VydmljZVR5cGUsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICBtYWluQnVmZmVyLFxuICAgICAgICAgICAgICAgIG10dSxcbiAgICAgICAgICAgICAgICBpc0VuY3J5cHRlZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBzZGwgcGFja2V0LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2ZXJzaW9uXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZnJhbWVJbmZvXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNlc3Npb25JZFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtZXNzYWdlSWRcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZnJhbWVUeXBlXG4gICAgICogQHBhcmFtIHtVbml0OEFycmF5fSBwYXlsb2FkXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBpc0VuY3J5cHRlZFxuICAgICAqIEByZXR1cm5zIHtTZGxQYWNrZXR9XG4gICAgICovXG4gICAgX2NvbnN0cnVjdFBhY2tldCAodmVyc2lvbiwgc2VydmljZVR5cGUsIGZyYW1lSW5mbywgc2Vzc2lvbklkLCBtZXNzYWdlSWQsIGZyYW1lVHlwZSwgcGF5bG9hZCwgaXNFbmNyeXB0ZWQpIHtcbiAgICAgICAgY29uc3QgZGF0YVNpemUgPSBwYXlsb2FkLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gMDtcbiAgICAgICAgY29uc3QgYnl0ZXNUb1dyaXRlID0gZGF0YVNpemU7XG4gICAgICAgIGNvbnN0IHNkbFBhY2tldCA9IG5ldyBTZGxQYWNrZXQodmVyc2lvbiwgaXNFbmNyeXB0ZWQsIGZyYW1lVHlwZSwgc2VydmljZVR5cGUsIGZyYW1lSW5mbywgc2Vzc2lvbklkLCBkYXRhU2l6ZSwgbWVzc2FnZUlkLCBwYXlsb2FkLCBvZmZzZXQsIGJ5dGVzVG9Xcml0ZSk7XG4gICAgICAgIHJldHVybiBzZGxQYWNrZXQ7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgY29uc2VjdXRpdmUgZnJhbWVzIGFmdGVyIHRoZSBpbml0YWwgZnJhbWUgaXMgc2VudCBmb3IgYSBtdWx0aS1mcmFtZSBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2ZXJzaW9uXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc2Vzc2lvbklkXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1lc3NhZ2VJZFxuICAgICAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBpc0VuY3J5cHRlZFxuICAgICAqL1xuICAgIF9idWlsZENvbnNlY3V0aXZlRnJhbWVzICh2ZXJzaW9uLCBzZXJ2aWNlVHlwZSwgc2Vzc2lvbklkLCBtZXNzYWdlSWQsIGJ1ZmZlciwgbGVuZ3RoLCBpc0VuY3J5cHRlZCkge1xuICAgICAgICBsZXQgZnJhbWVTZXF1ZW5jZU51bWJlcjtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGZyYW1lU2VxdWVuY2VOdW1iZXIgIT09IDApIHtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZyYW1lU2VxdWVuY2VOdW1iZXIgPSAwOyAvLyBsYXN0IGZyYW1lXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyYW1lU2VxdWVuY2VOdW1iZXIgPSAoY291bnQgJSAyNTUpICsgMTsgLy8gMSwyLDMsLi4uLDI1NSwxXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuX2NvbnN0cnVjdFBhY2tldChcbiAgICAgICAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIHNlcnZpY2VUeXBlLFxuICAgICAgICAgICAgICAgIGZyYW1lU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICBGcmFtZVR5cGUuQ09OU0VDVVRJVkUsXG4gICAgICAgICAgICAgICAgYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKSxcbiAgICAgICAgICAgICAgICBpc0VuY3J5cHRlZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuX3BhY2tldENhbGxiYWNrKGhlYWRlcik7XG4gICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5cbmV4cG9ydCB7IE1lc3NhZ2VGcmFtZURpc2Fzc2VtYmxlciB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5jbGFzcyBUcmFuc3BvcnRMaXN0ZW5lciB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICB0aGlzLl9vblRyYW5zcG9ydENvbm5lY3RlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uVHJhbnNwb3J0RGlzY29ubmVjdGVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25FcnJvciA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uUGFja2V0UmVjZWl2ZWQgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICAgKiBAcmV0dXJuIHtUcmFuc3BvcnRMaXN0ZW5lcn1cbiAgICAgKi9cbiAgICBzZXRPblRyYW5zcG9ydENvbm5lY3RlZCAoZnVuYykge1xuICAgICAgICB0aGlzLl9vblRyYW5zcG9ydENvbm5lY3RlZCA9IGZ1bmM7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY1xuICAgICAqIEByZXR1cm4ge1RyYW5zcG9ydExpc3RlbmVyfVxuICAgICAqL1xuICAgIHNldE9uVHJhbnNwb3J0RGlzY29ubmVjdGVkIChmdW5jKSB7XG4gICAgICAgIHRoaXMuX29uVHJhbnNwb3J0RGlzY29ubmVjdGVkID0gZnVuYztcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAgICogQHJldHVybiB7VHJhbnNwb3J0TGlzdGVuZXJ9XG4gICAgICovXG4gICAgc2V0T25FcnJvciAoZnVuYykge1xuICAgICAgICB0aGlzLl9vbkVycm9yID0gZnVuYztcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAgICogQHJldHVybiB7VHJhbnNwb3J0TGlzdGVuZXJ9XG4gICAgICovXG4gICAgc2V0T25QYWNrZXRSZWNlaXZlZCAoZnVuYykge1xuICAgICAgICB0aGlzLl9vblBhY2tldFJlY2VpdmVkID0gZnVuYztcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cblxuICAgIG9uVHJhbnNwb3J0Q29ubmVjdGVkICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vblRyYW5zcG9ydENvbm5lY3RlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25UcmFuc3BvcnRDb25uZWN0ZWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uVHJhbnNwb3J0RGlzY29ubmVjdGVkICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vblRyYW5zcG9ydERpc2Nvbm5lY3RlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25UcmFuc3BvcnREaXNjb25uZWN0ZWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRXJyb3IgKGVycm9yID0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25QYWNrZXRSZWNlaXZlZCAoc2RsUGFja2V0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25QYWNrZXRSZWNlaXZlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25QYWNrZXRSZWNlaXZlZChzZGxQYWNrZXQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBUcmFuc3BvcnRMaXN0ZW5lciB9O1xuIiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmNsYXNzIFZlcnNpb24ge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAobWFqb3IsIG1pbm9yLCBwYXRjaCkge1xuICAgICAgICB0aGlzLnNldE1ham9yKG1ham9yKTtcbiAgICAgICAgdGhpcy5zZXRNaW5vcihtaW5vcik7XG4gICAgICAgIHRoaXMuc2V0UGF0Y2gocGF0Y2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtOdW1iZXJ9IG1ham9yXG4gICAgKiBAcmV0dXJuIHtWZXJzaW9ufVxuICAgICovXG4gICAgc2V0TWFqb3IgKG1ham9yKSB7XG4gICAgICAgIHRoaXMuX21ham9yID0gcGFyc2VJbnQobWFqb3IpIHx8IDA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBnZXRNYWpvciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWpvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBtaW5vclxuICAgICogQHJldHVybiB7VmVyc2lvbn1cbiAgICAqL1xuICAgIHNldE1pbm9yIChtaW5vcikge1xuICAgICAgICB0aGlzLl9taW5vciA9IHBhcnNlSW50KG1pbm9yKSB8fCAwO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgZ2V0TWlub3IgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWlub3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gcGF0Y2hcbiAgICAqIEByZXR1cm4ge1ZlcnNpb259XG4gICAgKi9cbiAgICBzZXRQYXRjaCAocGF0Y2gpIHtcbiAgICAgICAgdGhpcy5fcGF0Y2ggPSBwYXJzZUludChwYXRjaCkgfHwgMDtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAqL1xuICAgIGdldFBhdGNoICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhdGNoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHZlcnNpb24gLSBQYXJzZSB0aGlzIHN0cmluZyB0byBhIFZlcnNpb24gb2JqZWN0XG4gICAgKiBAcmV0dXJuIHtWZXJzaW9ufVxuICAgICovXG4gICAgZnJvbVN0cmluZyAodmVyc2lvbikge1xuICAgICAgICBjb25zdCB2ZXJzaW9ucyA9IHZlcnNpb24uc3BsaXQoJy4nKTtcbiAgICAgICAgaWYgKHZlcnNpb25zLmxlbmd0aCAhPT0gMykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3QgdmVyc2lvbiBzdHJpbmcgZm9ybWF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRNYWpvcih2ZXJzaW9uc1swXSk7XG4gICAgICAgIHRoaXMuc2V0TWlub3IodmVyc2lvbnNbMV0pO1xuICAgICAgICB0aGlzLnNldFBhdGNoKHZlcnNpb25zWzJdKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAqL1xuICAgIHRvU3RyaW5nICgpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ2V0TWFqb3IoKX0uJHt0aGlzLmdldE1pbm9yKCl9LiR7dGhpcy5nZXRQYXRjaCgpfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBNZXRob2QgdG8gdGVzdCBpZiB0aGlzIGluc3RhbmNlIG9mIFZlcnNpb24gaXMgbmV3ZXIgdGhhbiB0aGUgc3VwcGxpZWQgb25lLlxuICAgICogQHBhcmFtIHZlcnNpb24gLSB0aGUgdmVyc2lvbiB0byBjaGVjayBhZ2FpbnN0XG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9IC0gMSBpZiB0aGlzIGluc3RhbmNlIGlzIG5ld2VyLCAtMSBpZiBzdXBwbGllZCB2ZXJzaW9uIGlzIG5ld2VyLCBhbmQgMCBpZiB0aGV5IGFyZSBlcXVhbFxuICAgICovXG4gICAgaXNOZXdlclRoYW4gKHZlcnNpb24pIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0TWFqb3IoKSA+IHZlcnNpb24uZ2V0TWFqb3IoKSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRNYWpvcigpID09PSB2ZXJzaW9uLmdldE1ham9yKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmdldE1pbm9yKCkgPiB2ZXJzaW9uLmdldE1pbm9yKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRNaW5vcigpID09PSB2ZXJzaW9uLmdldE1pbm9yKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRQYXRjaCgpID4gdmVyc2lvbi5nZXRQYXRjaCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRQYXRjaCgpID09PSB2ZXJzaW9uLmdldFBhdGNoKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFZlcnNpb24gfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IFNlcnZpY2VUeXBlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBTZXJ2aWNlVHlwZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IENPTlRST0wgKCkge1xuICAgICAgICByZXR1cm4gU2VydmljZVR5cGUuX01BUC5DT05UUk9MO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgc3RhdGljIGdldCBSUEMgKCkge1xuICAgICAgICByZXR1cm4gU2VydmljZVR5cGUuX01BUC5SUEM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IEFVRElPICgpIHtcbiAgICAgICAgcmV0dXJuIFNlcnZpY2VUeXBlLl9NQVAuQVVESU87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZJREVPICgpIHtcbiAgICAgICAgcmV0dXJuIFNlcnZpY2VUeXBlLl9NQVAuVklERU87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IEhZQlJJRCAoKSB7XG4gICAgICAgIHJldHVybiBTZXJ2aWNlVHlwZS5fTUFQLkhZQlJJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gU2VydmljZVR5cGUuX3ZhbHVlRm9yS2V5KGtleSwgU2VydmljZVR5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFNlcnZpY2VUeXBlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgU2VydmljZVR5cGUuX01BUCk7XG4gICAgfVxufVxuXG5TZXJ2aWNlVHlwZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0NPTlRST0wnOiAweDAwLFxuICAgICdSUEMnOiAweDA3LFxuICAgICdBVURJTyc6IDB4MEEsXG4gICAgJ1ZJREVPJzogMHgwQixcbiAgICAnSFlCUklEJzoweDBGLFxufSk7XG5cbmV4cG9ydCB7IFNlcnZpY2VUeXBlIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnJhbWVUeXBlIH0gZnJvbSAnLi9lbnVtcy9GcmFtZVR5cGUuanMnO1xuaW1wb3J0IHsgU2RsUGFja2V0IH0gZnJvbSAnLi9TZGxQYWNrZXQuanMnO1xuXG4vKipcbiAqIENhbGxiYWNrIGZvciBmaW5pc2hlZCBwYWNrZXQuXG4gKiBAY2FsbGJhY2sgY2JcbiAqIEBwYXJhbSB7c3RyaW5nfSBlcnJvciAtIElmIHRoZXJlIGlzIGFuIGVycm9yIHRoYXQgY2Fubm90IGJlIHJlY292ZXJlZCBmcm9tIGl0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0IC0gRmluaXNoZWQgc2RsIHBhY2tldC5cbiAqL1xuXG4vKipcbiAqIEFzc2VtYmxlcyBzZGwgcGFja2V0cyB3aGljaCBtYXkgY29tZSBpbiBzZXBlcmF0ZSBjaHVua3MgaWYgdGhlIGRhdGEgZXhjZWVkcyB0aGVcbiAqIG1heCB0cmFuc3BvcnQgdW5pdCBhbGxvd2VkIGJ5IHNkbCBjb3JlLlxuICpcbiAqIEBwcml2YXRlIHtjYn0gX2NhbGxiYWNrIC0gQ2FsbGJhY2sgZm9yIGNvbWJpbmVkIHBhY2tldC5cbiAqIEBwcml2YXRlIHtudW1iZXJ9IF90b3RhbENvbnNlY3V0aXZlRnJhbWVzIC0gVG90YWwgY29uc2VjdXRpdmUgZnJhbWVzIGV4cGVjdGVkIGZvciBhIG11bHRpZnJhbWUgcGFja2V0LlxuICogQHByaXZhdGUge251bWJlcn0gX2NvbnNlY3V0aXZlRnJhbWVzRGF0YUxlbmd0aCAtIEV4cGVjdGVkIGRhdGEgbGVuZ3RoIG9mIGZpbmlzaGVkIG11bHRpZnJhbWUgcGFja2V0LlxuICogQHByaXZhdGUge251bWJlcn0gX2NvbnNlY3V0aXZlRnJhbWVzSGFuZGxlZENvdW50IC0gUnVubmluZyB0b3RhbCBvZiBjb25zZWN1dGl2ZSBmcmFtZXMgcmVjZWl2ZWQgYW5kIGhhbmRsZWQuXG4gKiBAcHJpdmF0ZSB7YXJyYXl9IF9hY2N1bXVsYXRvciBDb21iaW5lcyBpbmNvbWluZyBieXRlcyBmcm9tIGNvbnNlY3V0aXZlIGZyYW1lcy5cbiAqL1xuY2xhc3MgTWVzc2FnZUZyYW1lQXNzZW1ibGVyIHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICogQHBhcmFtIHtjYn0gY2FsbGJhY2tcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChjYWxsYmFjaykge1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxiYWNrIG5vdCBvZiBleHBlY3RlZCB0eXBlIChmdW5jdGlvbikgZm9yIE1lc3NhZ2VGcmFtZUFzc2VtYmxlcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgICB0aGlzLl9hY2N1bXVsYXRvciA9IFtdO1xuICAgICAgICB0aGlzLl90b3RhbENvbnNlY3V0aXZlRnJhbWVzID0gMDtcbiAgICAgICAgdGhpcy5fY29uc2VjdXRpdmVGcmFtZXNIYW5kbGVkQ291bnQgPSAwO1xuICAgICAgICB0aGlzLl9jb25zZWN1dGl2ZUZyYW1lc0RhdGFMZW5ndGggPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFjY2VwdHMgYSBzaW5nbGUgZnJhbWUgb3IgbXVsdGlmcmFtZSBwYWNrZXQuIFRoZSBjYWxsYmFjayBpcyB1c2VkIHdoZW4gdGhlIHBhY2tldFxuICAgICAqIGlzIGNvbXBsZXRlbHkgcmVhZC4gRm9yIGEgc2luZ2xlIGZyYW1lIHRoaXMgaXMgaW1tZWRpYXRlbHkuIEZvciBhIG11bHRpIGZyYW1lIHBhY2tldFxuICAgICAqIEBwYXJhbSB7U2RsUGFja2V0fSBzZGxQYWNrZXQgLSBJbmNvbWluZyBzZGwgcGFja2V0IHRvIGJlIHJlYWQuXG4gICAgKi9cbiAgICBoYW5kbGVGcmFtZSAoc2RsUGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGZyYW1lVHlwZSA9IHNkbFBhY2tldC5nZXRGcmFtZVR5cGUoKTtcbiAgICAgICAgLy8gSWYgdGhlIHNkbCBwYWNrZXQgaXMgYSBzaW5nbGUgZnJhbWUgbm90aGluZyBuZWVkcyB0byBiZSBhc3NlbWJsZWQgYW5kIHRoaXMgY2FuIGJlIHJldHVybmVkIGltbWVkaWF0ZWx5LlxuICAgICAgICBpZiAoZnJhbWVUeXBlICE9PSBGcmFtZVR5cGUuRklSU1QgJiYgZnJhbWVUeXBlICE9PSBGcmFtZVR5cGUuQ09OU0VDVVRJVkUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxsYmFjayhudWxsLCBzZGxQYWNrZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVNdWx0aUZyYW1lTWVzc2FnZShzZGxQYWNrZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIGZpcnN0IGRhdGEgZnJhbWUuIFNldHMgdGhlIGV4cGVjdGVkIGZyYW1lIGNvdW50IGFuZCBkYXRhIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaGFuZGxlRmlyc3REYXRhRnJhbWUgKHNkbFBhY2tldCkge1xuICAgICAgICAvKiogQHR5cGUge2FycmF5fSBBcnJheSBvZiB1aW50OCAqL1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gc2RsUGFja2V0LmdldFBheWxvYWQoKTtcblxuICAgICAgICBpZiAocGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgIT09IHRydWUgfHwgcGF5bG9hZC5sZW5ndGggIT09IDgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgaGFuZGxpbmcgZmlyc3QgZnJhbWUuIFBheWxvYWQgaXMgYW4gaW52YWxpZCBsZW5ndGggc2hvdWxkIGJlIGxlbmd0aCA4LicpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgYnl0ZSBpbiBwYXlsb2FkKSB7XG4gICAgICAgICAgICBpZiAoYnl0ZSA8IDB4MDAgfHwgYnl0ZSA+IDB4RkYpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGF5bG9hZC4gTXVzdCBiZSBhbiBhcnJheSBvZiB1aW50OCBieXRlcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpcnN0IDQgOC1iaXQgaW50ZWdlcnMgY29udGFpbiB0aGUgZGF0YSBsZW5ndGguXG4gICAgICAgIGxldCBkYXRhTGVuZ3RoID0gKHBheWxvYWRbMF0gJiAweDBGKSA8PCAyNDsgLy8gOC1iaXQgeCAzXG4gICAgICAgIGRhdGFMZW5ndGggKz0gKHBheWxvYWRbMV0gJiAweEZGKSA8PCAxNjsgLy8gOCB4IDJcbiAgICAgICAgZGF0YUxlbmd0aCArPSAocGF5bG9hZFsyXSAmIDB4RkYpIDw8IDg7IC8vIDggeCAxXG4gICAgICAgIGRhdGFMZW5ndGggKz0gcGF5bG9hZFszXSAmIDB4RkY7IC8vIDggeCAwXG5cbiAgICAgICAgbGV0IGZyYW1lQ291bnQgPSAocGF5bG9hZFs0XSAmIDB4RkYpIDw8IDI0O1xuICAgICAgICBmcmFtZUNvdW50ICs9IChwYXlsb2FkWzVdICYgMHhGRikgPDwgMTY7XG4gICAgICAgIGZyYW1lQ291bnQgKz0gKHBheWxvYWRbNl0gJiAweEZGKSA8PCA4O1xuICAgICAgICBmcmFtZUNvdW50ICs9IHBheWxvYWRbN10gJiAweEZGO1xuXG4gICAgICAgIHRoaXMuX3RvdGFsQ29uc2VjdXRpdmVGcmFtZXMgPSBmcmFtZUNvdW50O1xuICAgICAgICB0aGlzLl9jb25zZWN1dGl2ZUZyYW1lc0RhdGFMZW5ndGggPSBkYXRhTGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpcnN0IGZyYW1lIHNob3VsZCBiZSByZWFkIGluIGJlZm9yZSB0aGlzIGlzIGNhbGxlZC4gT25jZSB0aGUgbGFzdFxuICAgICAqIGZyYW1lIGlzIHJlYWQsIGNhbGxiYWNrIGlzIHVzZWQuXG4gICAgICogQHBhcmFtIHtTZGxQYWNrZXR9IHNkbFBhY2tldFxuICAgICAqL1xuICAgIF9oYW5kbGVDb25zZWN1dGl2ZUZyYW1lIChzZGxQYWNrZXQpIHtcbiAgICAgICAgdGhpcy5fY29uc2VjdXRpdmVGcmFtZXNIYW5kbGVkQ291bnQrKztcblxuICAgICAgICBjb25zdCBmcmFtZVR5cGUgPSBzZGxQYWNrZXQuZ2V0RnJhbWVUeXBlKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBmcmFtZVNlcXVlbmNlIG50aCBmcmFtZSwgb3IgMCBmb3IgbGFzdCBmcmFtZSxcbiAgICAgICAgICogOCBiaXRzIGFyZSB1c2VkIHRvIHN0b3JlIHRoaXMgaW5mbyBzbyB0aGUgY291bnQgcmV2ZXJ0cyB0byAxIGFmdGVyIDI1NVxuICAgICAgICAgKiBUaGlzIGRvZXNuJ3QgYWZmZWN0IHJlYWRpbmcgdGhlIHBhY2tldCBidXQgaXQgaXMgbm90YWJsZSBpZiBmcmFtZSBzZXF1ZW5jZSBpcyByZWxpZWQgb24uXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBmcmFtZVNlcXVlbmNlID0gc2RsUGFja2V0LmdldEZyYW1lSW5mbygpO1xuXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBzZGxQYWNrZXQuZ2V0UGF5bG9hZCgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgYnl0ZSBvZiBwYXlsb2FkKSB7XG4gICAgICAgICAgICB0aGlzLl9hY2N1bXVsYXRvci5wdXNoKGJ5dGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgbGFzdCBmcmFtZSwgZmluaXNoIHRoaW5ncyB1cCBhbmQgdXNlIGNhbGxiYWNrLlxuICAgICAgICBpZiAoZnJhbWVTZXF1ZW5jZSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnNlY3V0aXZlRnJhbWVzSGFuZGxlZENvdW50ICE9PSB0aGlzLl90b3RhbENvbnNlY3V0aXZlRnJhbWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBUb3RhbCBmcmFtZXMgZXhwZWN0ZWQgJHt0aGlzLl90b3RhbENvbnNlY3V0aXZlRnJhbWVzfSBkb2VzIG5vdCBtYXRjaCB0b3RhbCBmcmFtZXMgcmVjZWl2ZWQgJHt0aGlzLl9jb25zZWN1dGl2ZUZyYW1lc0hhbmRsZWRDb3VudH1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnNlY3V0aXZlRnJhbWVzRGF0YUxlbmd0aCAhPT0gdGhpcy5fYWNjdW11bGF0b3IubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBUb3RhbCBkYXRhIGV4cGVjdGVkICR7dGhpcy5fY29uc2VjdXRpdmVGcmFtZXNEYXRhTGVuZ3RofSBkb2VzIG5vdCBtYXRjaCB0b3RhbCBkYXRhIHJlY2VpdmVkICR7dGhpcy5fYWNjdW11bGF0b3IubGVuZ3RofWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaW5pc2hlZFNkbFBhY2tldCA9IG5ldyBTZGxQYWNrZXQoXG4gICAgICAgICAgICAgICAgc2RsUGFja2V0LmdldFZlcnNpb24oKSxcbiAgICAgICAgICAgICAgICBzZGxQYWNrZXQuZ2V0RW5jcnlwdGlvbigpLFxuICAgICAgICAgICAgICAgIGZyYW1lVHlwZSxcbiAgICAgICAgICAgICAgICBzZGxQYWNrZXQuZ2V0U2VydmljZVR5cGUoKSxcbiAgICAgICAgICAgICAgICBmcmFtZVNlcXVlbmNlLFxuICAgICAgICAgICAgICAgIHNkbFBhY2tldC5nZXRTZXNzaW9uSUQoKSxcbiAgICAgICAgICAgICAgICB0aGlzLl9hY2N1bXVsYXRvci5sZW5ndGgsXG4gICAgICAgICAgICAgICAgc2RsUGFja2V0LmdldE1lc3NhZ2VJRCgpLFxuICAgICAgICAgICAgICAgIHRoaXMuX2FjY3VtdWxhdG9yLFxuICAgICAgICAgICAgICAgIDAsIC8vIG5vIG9mZnNldFxuICAgICAgICAgICAgICAgIHRoaXMuX2FjY3VtdWxhdG9yLmxlbmd0aCAvLyByZWFkIHRoZSBlbnRpcmUgYnVmZmVyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFjayhudWxsLCBmaW5pc2hlZFNkbFBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGhlIHNkbCBwYWNrZXQgYmFzZWQgb24gaXRzIGZyYW1lIHR5cGUsIEZJUlNUIG9yIENPTlNFQ1VUSVZFLlxuICAgICAqIENhbGxiYWNrIGlzIHVzZWQgd2hlbiBmaW5hbCBwYWNrZXQgaXMgcmVhZC5cbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0IC0gU2RsIHBhY2tldCB0byBiZSByZWFkLlxuICAgICAqL1xuICAgIF9oYW5kbGVNdWx0aUZyYW1lTWVzc2FnZSAoc2RsUGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGZyYW1lVHlwZSA9IHNkbFBhY2tldC5nZXRGcmFtZVR5cGUoKTtcbiAgICAgICAgaWYgKGZyYW1lVHlwZSA9PT0gRnJhbWVUeXBlLkZJUlNUKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmlyc3REYXRhRnJhbWUoc2RsUGFja2V0KTtcbiAgICAgICAgfSBlbHNlIHsgLy8gRnJhbWVUeXBlLkNvbnNlY3V0aXZlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlQ29uc2VjdXRpdmVGcmFtZShzZGxQYWNrZXQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuZXhwb3J0IHsgTWVzc2FnZUZyYW1lQXNzZW1ibGVyIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmNsYXNzIENvbnRyb2xGcmFtZVRhZ3Mge1xufVxuXG4vLyBoaWRkZW4gaW5uZXIgb2JqZWN0c1xuXG5jb25zdCBTdGFydFNlcnZpY2VBQ0tCYXNlID0ge1xuICAgIE1UVTogJ210dScsXG59O1xuXG5jb25zdCBOQUtCYXNlID0ge1xuICAgIFJFSkVDVEVEX1BBUkFNUzogJ3JlamVjdGVkUGFyYW1zJyxcbn07XG5cbmNvbnN0IFN0YXJ0U2VydmljZVByb3RvY29sVmVyc2lvbiA9IHtcbiAgICAvKiogVGhlIG5lZ290aWF0ZWQgdmVyc2lvbiBvZiB0aGUgcHJvdG9jb2wuIE11c3QgYmUgaW4gdGhlIGZvcm1hdCBcIk1ham9yLk1pbm9yLlBhdGNoXCIqL1xuICAgIFBST1RPQ09MX1ZFUlNJT046ICdwcm90b2NvbFZlcnNpb24nLFxufTtcblxuY29uc3QgU3RhcnRTZXJ2aWNlSGFzaElkID0ge1xuICAgIC8qKiBIYXNoIElEIHRvIGlkZW50aWZ5IHRoaXMgc2VydmljZSBhbmQgdXNlZCB3aGVuIHNlbmRpbmcgYW4gRW5kU2VydmljZSBjb250cm9sIGZyYW1lKi9cbiAgICBIQVNIX0lEOiAnaGFzaElkJyxcbn07XG5cbmNvbnN0IFN0YXJ0U2VydmljZURpbWVuc2lvbnMgPSB7XG4gICAgSEVJR0hUOiAnaGVpZ2h0JyxcbiAgICBXSURUSDogJ3dpZHRoJyxcbn07XG5cbi8vIHN0YXRpYyBtZW1iZXJzXG5cbkNvbnRyb2xGcmFtZVRhZ3MuUlBDID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgU3RhcnRTZXJ2aWNlOiBTdGFydFNlcnZpY2VQcm90b2NvbFZlcnNpb24sXG5cbiAgICBTdGFydFNlcnZpY2VBQ0s6IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAvKiogSFUgYWxsb3dlZCB0cmFuc3BvcnQgZm9yIHNlY29uZGFyeSBjb25uZWN0aW9uICovXG4gICAgICAgIFNFQ09OREFSWV9UUkFOU1BPUlRTOiAnc2Vjb25kYXJ5VHJhbnNwb3J0cycsXG4gICAgICAgIC8qKiBIVSBhbGxvd2VkIHRyYW5zcG9ydHMgZm9yIGF1ZGlvIGFuZCB2aWRlbyBzZXJ2aWNlcyAoMSA9PSBQcmltYXJ5LCAyID09IFNlY29uZGFyeSkgKi9cbiAgICAgICAgQVVESU9fU0VSVklDRV9UUkFOU1BPUlRTOiAnYXVkaW9TZXJ2aWNlVHJhbnNwb3J0cycsXG4gICAgICAgIFZJREVPX1NFUlZJQ0VfVFJBTlNQT1JUUzogJ3ZpZGVvU2VydmljZVRyYW5zcG9ydHMnLFxuICAgICAgICAvKiogQXV0aCB0b2tlbiB0byBiZSB1c2VkIGZvciBsb2cgaW4gaW50byBzZXJ2aWNlcyAqKi9cbiAgICAgICAgQVVUSF9UT0tFTjogJ2F1dGhUb2tlbicsXG4gICAgfSwgU3RhcnRTZXJ2aWNlQUNLQmFzZSwgU3RhcnRTZXJ2aWNlUHJvdG9jb2xWZXJzaW9uLCBTdGFydFNlcnZpY2VIYXNoSWQpLFxuXG4gICAgU3RhcnRTZXJ2aWNlTkFLOiBOQUtCYXNlLFxuXG4gICAgRW5kU2VydmljZTogU3RhcnRTZXJ2aWNlSGFzaElkLFxuXG4gICAgRW5kU2VydmljZUFDSzoge30sXG5cbiAgICBFbmRTZXJ2aWNlTkFLOiBOQUtCYXNlLFxuXG4gICAgVHJhbnNwb3J0RXZlbnRVcGRhdGU6IHtcbiAgICAgICAgVENQX0lQX0FERFJFU1M6ICd0Y3BJcEFkZHJlc3MnLFxuICAgICAgICBUQ1BfUE9SVDogJ3RjcFBvcnQnLFxuICAgIH0sXG5cbiAgICBSZWdpc3RlclNlY29uZGFyeVRyYW5zcG9ydDoge30sXG5cbiAgICBSZWdpc3RlclNlY29uZGFyeVRyYW5zcG9ydEFDSzoge30sXG5cbiAgICBSZWdpc3RlclNlY29uZGFyeVRyYW5zcG9ydE5BSzogT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIFJFQVNPTjogJ3JlYXNvbicsXG4gICAgfSwgTkFLQmFzZSksXG59KTtcblxuQ29udHJvbEZyYW1lVGFncy5BdWRpbyA9IE9iamVjdC5mcmVlemUoe1xuICAgIFN0YXJ0U2VydmljZToge30sXG5cbiAgICBTdGFydFNlcnZpY2VBQ0s6IFN0YXJ0U2VydmljZUFDS0Jhc2UsXG5cbiAgICBTdGFydFNlcnZpY2VOQUs6IE5BS0Jhc2UsXG5cbiAgICBFbmRTZXJ2aWNlOiB7fSxcblxuICAgIEVuZFNlcnZpY2VBQ0s6IHt9LFxuXG4gICAgRW5kU2VydmljZU5BSzogTkFLQmFzZSxcbn0pO1xuXG5Db250cm9sRnJhbWVUYWdzLlZpZGVvID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgU3RhcnRTZXJ2aWNlOiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgVklERU9fUFJPVE9DT0w6ICd2aWRlb1Byb3RvY29sJyxcbiAgICAgICAgVklERU9fQ09ERUM6ICd2aWRlb0NvZGVjJyxcbiAgICB9LCBTdGFydFNlcnZpY2VEaW1lbnNpb25zKSxcblxuICAgIFN0YXJ0U2VydmljZUFDSzogT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIFZJREVPX1BST1RPQ09MOiAndmlkZW9Qcm90b2NvbCcsXG4gICAgICAgIFZJREVPX0NPREVDOiAndmlkZW9Db2RlYycsXG4gICAgfSwgU3RhcnRTZXJ2aWNlQUNLQmFzZSwgU3RhcnRTZXJ2aWNlRGltZW5zaW9ucyksXG5cbiAgICBTdGFydFNlcnZpY2VOQUs6IE5BS0Jhc2UsXG5cbiAgICBFbmRTZXJ2aWNlOiB7fSxcblxuICAgIEVuZFNlcnZpY2VBQ0s6IHt9LFxuXG4gICAgRW5kU2VydmljZU5BSzogTkFLQmFzZSxcbn0pO1xuXG5leHBvcnQgeyBDb250cm9sRnJhbWVUYWdzIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmNsYXNzIEJpdENvbnZlcnRlciB7XG4gICAgLyoqXG5cdCAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGJ1ZmZlciAtIGJ1ZmZlciB0aGF0IHdpbGwgYmUgY29udmVydGVkIHRvIGludFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgLSBpbnQgb3B0aW9uYWwsIHRoZSBvZmZzZXQgc2hpZnRcblx0ICogQHJldHVybiB7TnVtYmVyfSBpbnQgY29udmVydGVkIGZyb20gYnVmZmVyIG9yIC0xIGlmIGJ1ZmZlciBpcyBudWxsXG5cdCAqL1xuICAgIHN0YXRpYyBhcnJheUJ1ZmZlclRvSW50MzIgKGJ1ZmZlciwgb2Zmc2V0ID0gMCkge1xuICAgICAgICBpZiAoIWJ1ZmZlcikge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIHZpZXcuZ2V0VWludDMyKG9mZnNldCk7XG4gICAgfVxuXG4gICAgLyoqXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZSAtIHRoZSBpbnRlZ2VyIHRvIGJlIGNvbnZlcnRlZFxuXHQgKiBAcmV0dXJuIHtBcnJheUJ1ZmZlcn0gYnVmZmVyIGNvbnZlcnRlZCBmcm9tIGlucHV0IHZhbHVlXG5cdCAqL1xuICAgIHN0YXRpYyBpbnQzMlRvQXJyYXlCdWZmZXIgKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig0KTsgLy8gSW50MzIgaGFzIDQgYnl0ZXNcbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIpO1xuICAgICAgICB2aWV3LnNldFVpbnQzMigwLCB2YWx1ZSwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgQml0Q29udmVydGVyIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFNkbFBhY2tldCB9IGZyb20gJy4vU2RsUGFja2V0LmpzJztcbmltcG9ydCB7IENvbnRyb2xGcmFtZVRhZ3MgfSBmcm9tICcuL2VudW1zL0NvbnRyb2xGcmFtZVRhZ3MuanMnO1xuaW1wb3J0IHsgQml0Q29udmVydGVyIH0gZnJvbSAnLi8uLi91dGlsL0JpdENvbnZlcnRlci5qcyc7XG5pbXBvcnQgeyBGcmFtZVR5cGUgfSBmcm9tICcuL2VudW1zL0ZyYW1lVHlwZS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBjb250cm9sIHBhY2tldHMuXG4gKiBGb3IgcmVndWxhciBSUEMgUlBDTWVzc2FnZSBzaG91bGQgYmUgdXNlZC5cbiAqL1xuY2xhc3MgU2RsUGFja2V0RmFjdG9yeSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGhlYXJ0YmVhdCBhY2tub3dsZWdlbWVudCBwYWNrZXQuXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc2Vzc2lvbklEXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHZlcnNpb25cbiAgICAgKiBAcmV0dXJucyB7U2RsUGFja2V0fVxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVIZWFydGJlYXRBQ0sgKHNlcnZpY2VUeXBlLCBzZXNzaW9uSUQsIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZGxQYWNrZXQodmVyc2lvbiwgZmFsc2UsIEZyYW1lVHlwZS5DT05UUk9MLFxuICAgICAgICAgICAgc2VydmljZVR5cGUsIFNkbFBhY2tldC5GUkFNRV9JTkZPX0hFQVJUX0JFQVRfQUNLLCBzZXNzaW9uSUQsXG4gICAgICAgICAgICAwLCAwLCBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGVuZCBzZXNzaW9uIHBhY2tldC5cbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSURcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbWVzc2FnZUlEXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHZlcnNpb25cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGFzaElEXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZUVuZFNlc3Npb24gKHNlcnZpY2VUeXBlLCBzZXNzaW9uSUQsIG1lc3NhZ2VJRCwgdmVyc2lvbiwgaGFzaElEKSB7XG4gICAgICAgIGlmICh2ZXJzaW9uIDwgNSkge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IG5ldyBVaW50OEFycmF5KEJpdENvbnZlcnRlci5pbnQzMlRvQXJyYXlCdWZmZXIoaGFzaElEKSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNkbFBhY2tldCh2ZXJzaW9uLCBmYWxzZSwgRnJhbWVUeXBlLkNPTlRST0wsXG4gICAgICAgICAgICAgICAgc2VydmljZVR5cGUsIFNkbFBhY2tldC5GUkFNRV9JTkZPX0VORF9TRVJWSUNFLCBzZXNzaW9uSUQsXG4gICAgICAgICAgICAgICAgcGF5bG9hZC5sZW5ndGgsIG1lc3NhZ2VJRCwgcGF5bG9hZCwgMCwgcGF5bG9hZC5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZW5kU2Vzc2lvbiA9IG5ldyBTZGxQYWNrZXQodmVyc2lvbiwgZmFsc2UsIEZyYW1lVHlwZS5DT05UUk9MLFxuICAgICAgICAgICAgICAgIHNlcnZpY2VUeXBlLCBTZGxQYWNrZXQuRlJBTUVfSU5GT19FTkRfU0VSVklDRSwgc2Vzc2lvbklELFxuICAgICAgICAgICAgICAgIDAsIG1lc3NhZ2VJRCwgbnVsbCk7XG4gICAgICAgICAgICBlbmRTZXNzaW9uLnB1dFRhZyhDb250cm9sRnJhbWVUYWdzLlJQQy5FbmRTZXJ2aWNlLkhBU0hfSUQsIGhhc2hJRCk7XG4gICAgICAgICAgICByZXR1cm4gZW5kU2Vzc2lvbjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgU2RsUGFja2V0RmFjdG9yeSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBTb2Z0QnV0dG9uJ3MgY2FwYWJpbGl0aWVzLlxuICovXG5jbGFzcyBTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIFRoZSBidXR0b24gc3VwcG9ydHMgYSBzaG9ydCBwcmVzcy4gV2hlbmV2ZXIgdGhlIGJ1dHRvbiBpcyBwcmVzc2VkIHNob3J0LFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25CdXR0b25QcmVzc2VkKCBTSE9SVCkgd2lsbCBiZSBpbnZva2VkLlxuICAgICAqIEByZXR1cm4ge1NvZnRCdXR0b25DYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0U2hvcnRQcmVzc0F2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNvZnRCdXR0b25DYXBhYmlsaXRpZXMuS0VZX1NIT1JUX1BSRVNTX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRTaG9ydFByZXNzQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNvZnRCdXR0b25DYXBhYmlsaXRpZXMuS0VZX1NIT1JUX1BSRVNTX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGUgLSBUaGUgYnV0dG9uIHN1cHBvcnRzIGEgTE9ORyBwcmVzcy4gV2hlbmV2ZXIgdGhlIGJ1dHRvbiBpcyBwcmVzc2VkIGxvbmcsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkJ1dHRvblByZXNzZWQoIExPTkcpIHdpbGwgYmUgaW52b2tlZC5cbiAgICAgKiBAcmV0dXJuIHtTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldExvbmdQcmVzc0F2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNvZnRCdXR0b25DYXBhYmlsaXRpZXMuS0VZX0xPTkdfUFJFU1NfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldExvbmdQcmVzc0F2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9MT05HX1BSRVNTX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGUgLSBUaGUgYnV0dG9uIHN1cHBvcnRzIFwiYnV0dG9uIGRvd25cIiBhbmQgXCJidXR0b24gdXBcIi4gV2hlbmV2ZXIgdGhlIGJ1dHRvbiBpcyBwcmVzc2VkLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25CdXR0b25FdmVudCggRE9XTikgd2lsbCBiZSBpbnZva2VkLiBXaGVuZXZlciB0aGUgYnV0dG9uIGlzIHJlbGVhc2VkLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25CdXR0b25FdmVudCggVVApIHdpbGwgYmUgaW52b2tlZC5cbiAgICAgKiBAcmV0dXJuIHtTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldFVwRG93bkF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNvZnRCdXR0b25DYXBhYmlsaXRpZXMuS0VZX1VQX0RPV05fQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFVwRG93bkF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9VUF9ET1dOX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzdXBwb3J0ZWQgLSBUaGUgYnV0dG9uIHN1cHBvcnRzIHJlZmVyZW5jaW5nIGEgc3RhdGljIG9yIGR5bmFtaWMgaW1hZ2UuXG4gICAgICogQHJldHVybiB7U29mdEJ1dHRvbkNhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRJbWFnZVN1cHBvcnRlZCAoc3VwcG9ydGVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNvZnRCdXR0b25DYXBhYmlsaXRpZXMuS0VZX0lNQUdFX1NVUFBPUlRFRCwgc3VwcG9ydGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRJbWFnZVN1cHBvcnRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9JTUFHRV9TVVBQT1JURUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3VwcG9ydGVkIC0gVGhlIGJ1dHRvbiBzdXBwb3J0cyB0aGUgdXNlIG9mIHRleHQuIElmIG5vdCBpbmNsdWRlZCwgdGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zaWRlcmVkIHRydWUgdGhhdCB0aGUgYnV0dG9uIHdpbGwgc3VwcG9ydCB0ZXh0LlxuICAgICAqIEByZXR1cm4ge1NvZnRCdXR0b25DYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0VGV4dFN1cHBvcnRlZCAoc3VwcG9ydGVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNvZnRCdXR0b25DYXBhYmlsaXRpZXMuS0VZX1RFWFRfU1VQUE9SVEVELCBzdXBwb3J0ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFRleHRTdXBwb3J0ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU29mdEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfVEVYVF9TVVBQT1JURUQpO1xuICAgIH1cbn1cblxuU29mdEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfU0hPUlRfUFJFU1NfQVZBSUxBQkxFID0gJ3Nob3J0UHJlc3NBdmFpbGFibGUnO1xuU29mdEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfTE9OR19QUkVTU19BVkFJTEFCTEUgPSAnbG9uZ1ByZXNzQXZhaWxhYmxlJztcblNvZnRCdXR0b25DYXBhYmlsaXRpZXMuS0VZX1VQX0RPV05fQVZBSUxBQkxFID0gJ3VwRG93bkF2YWlsYWJsZSc7XG5Tb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9JTUFHRV9TVVBQT1JURUQgPSAnaW1hZ2VTdXBwb3J0ZWQnO1xuU29mdEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfVEVYVF9TVVBQT1JURUQgPSAndGV4dFN1cHBvcnRlZCc7XG5cbmV4cG9ydCB7IFNvZnRCdXR0b25DYXBhYmlsaXRpZXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBDb250YWlucyBhIGxpc3Qgb2YgcHJlcmVjb3JkZWQgc3BlZWNoIGl0ZW1zIHByZXNlbnQgb24gdGhlIHBsYXRmb3JtLlxuICogQHR5cGVkZWYge0VudW19IFByZXJlY29yZGVkU3BlZWNoXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBQcmVyZWNvcmRlZFNwZWVjaCBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBIRUxQX0pJTkdMRSAoKSB7XG4gICAgICAgIHJldHVybiBQcmVyZWNvcmRlZFNwZWVjaC5fTUFQLkhFTFBfSklOR0xFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IElOSVRJQUxfSklOR0xFICgpIHtcbiAgICAgICAgcmV0dXJuIFByZXJlY29yZGVkU3BlZWNoLl9NQVAuSU5JVElBTF9KSU5HTEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTElTVEVOX0pJTkdMRSAoKSB7XG4gICAgICAgIHJldHVybiBQcmVyZWNvcmRlZFNwZWVjaC5fTUFQLkxJU1RFTl9KSU5HTEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUE9TSVRJVkVfSklOR0xFICgpIHtcbiAgICAgICAgcmV0dXJuIFByZXJlY29yZGVkU3BlZWNoLl9NQVAuUE9TSVRJVkVfSklOR0xFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5FR0FUSVZFX0pJTkdMRSAoKSB7XG4gICAgICAgIHJldHVybiBQcmVyZWNvcmRlZFNwZWVjaC5fTUFQLk5FR0FUSVZFX0pJTkdMRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBQcmVyZWNvcmRlZFNwZWVjaC5fdmFsdWVGb3JLZXkoa2V5LCBQcmVyZWNvcmRlZFNwZWVjaC5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFByZXJlY29yZGVkU3BlZWNoLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgUHJlcmVjb3JkZWRTcGVlY2guX01BUCk7XG4gICAgfVxufVxuXG5QcmVyZWNvcmRlZFNwZWVjaC5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0hFTFBfSklOR0xFJzogJ0hFTFBfSklOR0xFJyxcbiAgICAnSU5JVElBTF9KSU5HTEUnOiAnSU5JVElBTF9KSU5HTEUnLFxuICAgICdMSVNURU5fSklOR0xFJzogJ0xJU1RFTl9KSU5HTEUnLFxuICAgICdQT1NJVElWRV9KSU5HTEUnOiAnUE9TSVRJVkVfSklOR0xFJyxcbiAgICAnTkVHQVRJVkVfSklOR0xFJzogJ05FR0FUSVZFX0pJTkdMRScsXG59KTtcblxuZXhwb3J0IHsgUHJlcmVjb3JkZWRTcGVlY2ggfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG4vKipcbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IG9uLXNjcmVlbiBwcmVzZXQgY2FwYWJpbGl0aWVzLlxuICovXG5jbGFzcyBQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIE9uc2NyZWVuIGN1c3RvbSBwcmVzZXRzIGFyZSBhdmFpbGFibGUuXG4gICAgICogQHJldHVybiB7UHJlc2V0QmFua0NhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRPblNjcmVlblByZXNldHNBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzLktFWV9PTl9TQ1JFRU5fUFJFU0VUU19BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0T25TY3JlZW5QcmVzZXRzQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFByZXNldEJhbmtDYXBhYmlsaXRpZXMuS0VZX09OX1NDUkVFTl9QUkVTRVRTX0FWQUlMQUJMRSk7XG4gICAgfVxufVxuXG5QcmVzZXRCYW5rQ2FwYWJpbGl0aWVzLktFWV9PTl9TQ1JFRU5fUFJFU0VUU19BVkFJTEFCTEUgPSAnb25TY3JlZW5QcmVzZXRzQXZhaWxhYmxlJztcblxuZXhwb3J0IHsgUHJlc2V0QmFua0NhcGFiaWxpdGllcyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbmNsYXNzIFZlaGljbGVUeXBlIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWFrZSAtIE1ha2Ugb2YgdGhlIHZlaGljbGUsIGUuZy4gRm9yZFxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVUeXBlfVxuICAgICAqL1xuICAgIHNldE1ha2UgKG1ha2UpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVmVoaWNsZVR5cGUuS0VZX01BS0UsIG1ha2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0TWFrZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihWZWhpY2xlVHlwZS5LRVlfTUFLRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1vZGVsIC0gTW9kZWwgb2YgdGhlIHZlaGljbGUsIGUuZy4gRmllc3RhXG4gICAgICogQHJldHVybiB7VmVoaWNsZVR5cGV9XG4gICAgICovXG4gICAgc2V0TW9kZWwgKG1vZGVsKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFZlaGljbGVUeXBlLktFWV9NT0RFTCwgbW9kZWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0TW9kZWwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVmVoaWNsZVR5cGUuS0VZX01PREVMKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30geWVhciAtIE1vZGVsIFllYXIgb2YgdGhlIHZlaGljbGUsIGUuZy4gMjAxM1xuICAgICAqIEByZXR1cm4ge1ZlaGljbGVUeXBlfVxuICAgICAqL1xuICAgIHNldE1vZGVsWWVhciAoeWVhcikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihWZWhpY2xlVHlwZS5LRVlfTU9ERUxfWUVBUiwgeWVhcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRNb2RlbFllYXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVmVoaWNsZVR5cGUuS0VZX01PREVMX1lFQVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0cmltIC0gVHJpbSBvZiB0aGUgdmVoaWNsZSwgZS5nLiBTRVxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVUeXBlfVxuICAgICAqL1xuICAgIHNldFRyaW0gKHRyaW0pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVmVoaWNsZVR5cGUuS0VZX1RSSU0sIHRyaW0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0VHJpbSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihWZWhpY2xlVHlwZS5LRVlfVFJJTSk7XG4gICAgfVxufVxuXG5WZWhpY2xlVHlwZS5LRVlfTUFLRSA9ICdtYWtlJztcblZlaGljbGVUeXBlLktFWV9NT0RFTCA9ICdtb2RlbCc7XG5WZWhpY2xlVHlwZS5LRVlfTU9ERUxfWUVBUiA9ICdtb2RlbFllYXInO1xuVmVoaWNsZVR5cGUuS0VZX1RSSU0gPSAndHJpbSc7XG5cbmV4cG9ydCB7IFZlaGljbGVUeXBlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEhNSSB6b25lIGNhcGFiaWxpdGllcy4gRm9yIGZ1dHVyZSB1c2UuXG4gKiBAdHlwZWRlZiB7RW51bX0gSG1pWm9uZUNhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgSG1pWm9uZUNhcGFiaWxpdGllcyBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGUk9OVCAoKSB7XG4gICAgICAgIHJldHVybiBIbWlab25lQ2FwYWJpbGl0aWVzLl9NQVAuRlJPTlQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQkFDSyAoKSB7XG4gICAgICAgIHJldHVybiBIbWlab25lQ2FwYWJpbGl0aWVzLl9NQVAuQkFDSztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBIbWlab25lQ2FwYWJpbGl0aWVzLl92YWx1ZUZvcktleShrZXksIEhtaVpvbmVDYXBhYmlsaXRpZXMuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBIbWlab25lQ2FwYWJpbGl0aWVzLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgSG1pWm9uZUNhcGFiaWxpdGllcy5fTUFQKTtcbiAgICB9XG59XG5cbkhtaVpvbmVDYXBhYmlsaXRpZXMuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdGUk9OVCc6ICdGUk9OVCcsXG4gICAgJ0JBQ0snOiAnQkFDSycsXG59KTtcblxuZXhwb3J0IHsgSG1pWm9uZUNhcGFiaWxpdGllcyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBNZWRpYUNsb2NrRm9ybWF0XG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBNZWRpYUNsb2NrRm9ybWF0IGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIG1pbnV0ZXNGaWVsZFdpZHRoID0gMjttaW51dGVzRmllbGRNYXggPSAxOTtzZWNvbmRzRmllbGRXaWR0aCA9IDI7c2Vjb25kc0ZpZWxkTWF4ID0gOTk7bWF4SG91cnMgPSAxOTttYXhNaW51dGVzXG4gICAgICogPSA1OTttYXhTZWNvbmRzID0gNTk7IHVzZWQgZm9yIFR5cGUgSUkgYW5kIENJRCBoZWFkdW5pdHNcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDTE9DSzEgKCkge1xuICAgICAgICByZXR1cm4gTWVkaWFDbG9ja0Zvcm1hdC5fTUFQLkNMT0NLMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBtaW51dGVzRmllbGRXaWR0aCA9IDM7bWludXRlc0ZpZWxkTWF4ID0gMTk5O3NlY29uZHNGaWVsZFdpZHRoID0gMjtzZWNvbmRzRmllbGRNYXggPSA5OTttYXhIb3VycyA9IDU5O21heE1pbnV0ZXNcbiAgICAgKiA9IDU5O21heFNlY29uZHMgPSA1OTsgdXNlZCBmb3IgVHlwZSBWIGhlYWR1bml0XG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ0xPQ0syICgpIHtcbiAgICAgICAgcmV0dXJuIE1lZGlhQ2xvY2tGb3JtYXQuX01BUC5DTE9DSzI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbWludXRlc0ZpZWxkV2lkdGggPSAyO21pbnV0ZXNGaWVsZE1heCA9IDU5O3NlY29uZHNGaWVsZFdpZHRoID0gMjtzZWNvbmRzRmllbGRNYXggPSA1OTttYXhIb3VycyA9IDk7bWF4TWludXRlcyA9XG4gICAgICogNTk7bWF4U2Vjb25kcyA9IDU5OyB1c2VkIGZvciBHRU4xLjEgTUZEMy80LzUgaGVhZHVuaXRzXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ0xPQ0szICgpIHtcbiAgICAgICAgcmV0dXJuIE1lZGlhQ2xvY2tGb3JtYXQuX01BUC5DTE9DSzM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogNSBjaGFyYWN0ZXJzIHBvc3NpYmxlIEZvcm1hdDogMXxzcCBjIDp8c3AgYyBjIDF8c3AgOiBkaWdpdCBcIjFcIiBvciBzcGFjZSBjIDogY2hhcmFjdGVyIG91dCBvZiBmb2xsb3dpbmdcbiAgICAgKiBjaGFyYWN0ZXIgc2V0OiBzcHwwLTl8W2xldHRlcnMsIHNlZSBUeXBlSUkgY29sdW1uIGluIFhMUy4gU2VlIDp8c3AgOiBjb2xvbiBvciBzcGFjZSB1c2VkIGZvciBUeXBlIElJIGhlYWR1bml0XG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ0xPQ0tURVhUMSAoKSB7XG4gICAgICAgIHJldHVybiBNZWRpYUNsb2NrRm9ybWF0Ll9NQVAuQ0xPQ0tURVhUMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA1IGNoYXJzIHBvc3NpYmxlIEZvcm1hdDogMXxzcCBjIDp8c3AgYyBjIDF8c3AgOiBkaWdpdCBcIjFcIiBvciBzcGFjZSBjIDogY2hhcmFjdGVyIG91dCBvZiBmb2xsb3dpbmcgY2hhcmFjdGVyXG4gICAgICogc2V0OiBzcHwwLTl8W2xldHRlcnMsIHNlZSBDSUQgY29sdW1uIGluIFhMUy4gU2VlIDp8c3AgOiBjb2xvbiBvciBzcGFjZSB1c2VkIGZvciBDSUQgaGVhZHVuaXQgTk9URTogZGlmZmVyZW5jZVxuICAgICAqIGJldHdlZW4gQ0xPQ0tURVhUMSBhbmQgQ0xPQ0tURVhUMiBpcyB0aGUgc3VwcG9ydGVkIGNoYXJhY3RlciBzZXRcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDTE9DS1RFWFQyICgpIHtcbiAgICAgICAgcmV0dXJuIE1lZGlhQ2xvY2tGb3JtYXQuX01BUC5DTE9DS1RFWFQyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDYgY2hhcnMgcG9zc2libGUgRm9ybWF0OiAxfHNwIGMgYyA6fHNwIGMgYyAxfHNwIDogZGlnaXQgXCIxXCIgb3Igc3BhY2UgYyA6IGNoYXJhY3RlciBvdXQgb2YgZm9sbG93aW5nIGNoYXJhY3RlclxuICAgICAqIHNldDogc3B8MC05fFtsZXR0ZXJzLCBzZWUgVHlwZSA1IGNvbHVtbiBpbiBYTFNdLiBTZWUgOnxzcCA6IGNvbG9uIG9yIHNwYWNlIHVzZWQgZm9yIFR5cGUgViBoZWFkdW5pdFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENMT0NLVEVYVDMgKCkge1xuICAgICAgICByZXR1cm4gTWVkaWFDbG9ja0Zvcm1hdC5fTUFQLkNMT0NLVEVYVDM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogNiBjaGFycyBwb3NzaWJsZSBGb3JtYXQ6IGMgOnxzcCBjIGMgOiBjIGMgOnxzcCA6IGNvbG9uIG9yIHNwYWNlIGMgOiBjaGFyYWN0ZXIgb3V0IG9mIGZvbGxvd2luZyBjaGFyYWN0ZXIgc2V0OlxuICAgICAqIHNwfDAtOXxbbGV0dGVyc10uIHVzZWQgZm9yIEdFTjEuMSBNRkQzLzQvNSBoZWFkdW5pdHNcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDTE9DS1RFWFQ0ICgpIHtcbiAgICAgICAgcmV0dXJuIE1lZGlhQ2xvY2tGb3JtYXQuX01BUC5DTE9DS1RFWFQ0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIE1lZGlhQ2xvY2tGb3JtYXQuX3ZhbHVlRm9yS2V5KGtleSwgTWVkaWFDbG9ja0Zvcm1hdC5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIE1lZGlhQ2xvY2tGb3JtYXQuX2tleUZvclZhbHVlKHZhbHVlLCBNZWRpYUNsb2NrRm9ybWF0Ll9NQVApO1xuICAgIH1cbn1cblxuTWVkaWFDbG9ja0Zvcm1hdC5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0NMT0NLMSc6ICdDTE9DSzEnLFxuICAgICdDTE9DSzInOiAnQ0xPQ0syJyxcbiAgICAnQ0xPQ0szJzogJ0NMT0NLMycsXG4gICAgJ0NMT0NLVEVYVDEnOiAnQ0xPQ0tURVhUMScsXG4gICAgJ0NMT0NLVEVYVDInOiAnQ0xPQ0tURVhUMicsXG4gICAgJ0NMT0NLVEVYVDMnOiAnQ0xPQ0tURVhUMycsXG4gICAgJ0NMT0NLVEVYVDQnOiAnQ0xPQ0tURVhUNCcsXG59KTtcblxuZXhwb3J0IHsgTWVkaWFDbG9ja0Zvcm1hdCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbmNsYXNzIEltYWdlUmVzb2x1dGlvbiBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIGltYWdlIHJlc29sdXRpb24gd2lkdGguXG4gICAgICogQHJldHVybiB7SW1hZ2VSZXNvbHV0aW9ufVxuICAgICAqL1xuICAgIHNldFJlc29sdXRpb25XaWR0aCAod2lkdGgpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSW1hZ2VSZXNvbHV0aW9uLktFWV9SRVNPTFVUSU9OX1dJRFRILCB3aWR0aCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRSZXNvbHV0aW9uV2lkdGggKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoSW1hZ2VSZXNvbHV0aW9uLktFWV9SRVNPTFVUSU9OX1dJRFRIKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGltYWdlIHJlc29sdXRpb24gaGVpZ2h0LlxuICAgICAqIEByZXR1cm4ge0ltYWdlUmVzb2x1dGlvbn1cbiAgICAgKi9cbiAgICBzZXRSZXNvbHV0aW9uSGVpZ2h0IChoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSW1hZ2VSZXNvbHV0aW9uLktFWV9SRVNPTFVUSU9OX0hFSUdIVCwgaGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFJlc29sdXRpb25IZWlnaHQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoSW1hZ2VSZXNvbHV0aW9uLktFWV9SRVNPTFVUSU9OX0hFSUdIVCk7XG4gICAgfVxufVxuXG5JbWFnZVJlc29sdXRpb24uS0VZX1JFU09MVVRJT05fV0lEVEggPSAncmVzb2x1dGlvbldpZHRoJztcbkltYWdlUmVzb2x1dGlvbi5LRVlfUkVTT0xVVElPTl9IRUlHSFQgPSAncmVzb2x1dGlvbkhlaWdodCc7XG5cbmV4cG9ydCB7IEltYWdlUmVzb2x1dGlvbiB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbmNsYXNzIFRvdWNoRXZlbnRDYXBhYmlsaXRpZXMgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlXG4gICAgICogQHJldHVybiB7VG91Y2hFdmVudENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRQcmVzc0F2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFRvdWNoRXZlbnRDYXBhYmlsaXRpZXMuS0VZX1BSRVNTX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRQcmVzc0F2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihUb3VjaEV2ZW50Q2FwYWJpbGl0aWVzLktFWV9QUkVTU19BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlXG4gICAgICogQHJldHVybiB7VG91Y2hFdmVudENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRNdWx0aVRvdWNoQXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVG91Y2hFdmVudENhcGFiaWxpdGllcy5LRVlfTVVMVElfVE9VQ0hfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldE11bHRpVG91Y2hBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVG91Y2hFdmVudENhcGFiaWxpdGllcy5LRVlfTVVMVElfVE9VQ0hfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZVxuICAgICAqIEByZXR1cm4ge1RvdWNoRXZlbnRDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0RG91YmxlUHJlc3NBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihUb3VjaEV2ZW50Q2FwYWJpbGl0aWVzLktFWV9ET1VCTEVfUFJFU1NfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldERvdWJsZVByZXNzQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFRvdWNoRXZlbnRDYXBhYmlsaXRpZXMuS0VZX0RPVUJMRV9QUkVTU19BVkFJTEFCTEUpO1xuICAgIH1cbn1cblxuVG91Y2hFdmVudENhcGFiaWxpdGllcy5LRVlfUFJFU1NfQVZBSUxBQkxFID0gJ3ByZXNzQXZhaWxhYmxlJztcblRvdWNoRXZlbnRDYXBhYmlsaXRpZXMuS0VZX01VTFRJX1RPVUNIX0FWQUlMQUJMRSA9ICdtdWx0aVRvdWNoQXZhaWxhYmxlJztcblRvdWNoRXZlbnRDYXBhYmlsaXRpZXMuS0VZX0RPVUJMRV9QUkVTU19BVkFJTEFCTEUgPSAnZG91YmxlUHJlc3NBdmFpbGFibGUnO1xuXG5leHBvcnQgeyBUb3VjaEV2ZW50Q2FwYWJpbGl0aWVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IEltYWdlUmVzb2x1dGlvbiB9IGZyb20gJy4vSW1hZ2VSZXNvbHV0aW9uLmpzJztcbmltcG9ydCB7IFRvdWNoRXZlbnRDYXBhYmlsaXRpZXMgfSBmcm9tICcuL1RvdWNoRXZlbnRDYXBhYmlsaXRpZXMuanMnO1xuXG5jbGFzcyBTY3JlZW5QYXJhbXMgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW1hZ2VSZXNvbHV0aW9ufSByZXNvbHV0aW9uIC0gVGhlIHJlc29sdXRpb24gb2YgdGhlIHByZXNjcmliZWQgc2NyZWVuIGFyZWEuXG4gICAgICogQHJldHVybiB7U2NyZWVuUGFyYW1zfVxuICAgICAqL1xuICAgIHNldFJlc29sdXRpb24gKHJlc29sdXRpb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSW1hZ2VSZXNvbHV0aW9uLCByZXNvbHV0aW9uKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2NyZWVuUGFyYW1zLktFWV9SRVNPTFVUSU9OLCByZXNvbHV0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SW1hZ2VSZXNvbHV0aW9ufVxuICAgICAqL1xuICAgIGdldFJlc29sdXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSW1hZ2VSZXNvbHV0aW9uLCBTY3JlZW5QYXJhbXMuS0VZX1JFU09MVVRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudENhcGFiaWxpdGllc30gYXZhaWxhYmxlIC0gVHlwZXMgb2Ygc2NyZWVuIHRvdWNoIGV2ZW50cyBhdmFpbGFibGUgaW4gc2NyZWVuIGFyZWEuXG4gICAgICogQHJldHVybiB7U2NyZWVuUGFyYW1zfVxuICAgICAqL1xuICAgIHNldFRvdWNoRXZlbnRBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShUb3VjaEV2ZW50Q2FwYWJpbGl0aWVzLCBhdmFpbGFibGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTY3JlZW5QYXJhbXMuS0VZX1RPVUNIX0VWRU5UX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VG91Y2hFdmVudENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBnZXRUb3VjaEV2ZW50QXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRvdWNoRXZlbnRDYXBhYmlsaXRpZXMsIFNjcmVlblBhcmFtcy5LRVlfVE9VQ0hfRVZFTlRfQVZBSUxBQkxFKTtcbiAgICB9XG59XG5cblNjcmVlblBhcmFtcy5LRVlfUkVTT0xVVElPTiA9ICdyZXNvbHV0aW9uJztcblNjcmVlblBhcmFtcy5LRVlfVE9VQ0hfRVZFTlRfQVZBSUxBQkxFID0gJ3RvdWNoRXZlbnRBdmFpbGFibGUnO1xuXG5leHBvcnQgeyBTY3JlZW5QYXJhbXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gSW1hZ2VGaWVsZE5hbWVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIEltYWdlRmllbGROYW1lIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbWFnZSBmaWVsZCBmb3IgU29mdEJ1dHRvblxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IHNvZnRCdXR0b25JbWFnZSAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZUZpZWxkTmFtZS5fTUFQLnNvZnRCdXR0b25JbWFnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmlyc3QgaW1hZ2UgZmllbGQgZm9yIENob2ljZVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IGNob2ljZUltYWdlICgpIHtcbiAgICAgICAgcmV0dXJuIEltYWdlRmllbGROYW1lLl9NQVAuY2hvaWNlSW1hZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNlY29uZGFyeSBpbWFnZSBmaWVsZCBmb3IgQ2hvaWNlXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgY2hvaWNlU2Vjb25kYXJ5SW1hZ2UgKCkge1xuICAgICAgICByZXR1cm4gSW1hZ2VGaWVsZE5hbWUuX01BUC5jaG9pY2VTZWNvbmRhcnlJbWFnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW1hZ2UgZmllbGQgZm9yIHZySGVscEl0ZW1cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCB2ckhlbHBJdGVtICgpIHtcbiAgICAgICAgcmV0dXJuIEltYWdlRmllbGROYW1lLl9NQVAudnJIZWxwSXRlbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW1hZ2UgZmllbGQgZm9yIFR1cm5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCB0dXJuSWNvbiAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZUZpZWxkTmFtZS5fTUFQLnR1cm5JY29uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbWFnZSBmaWVsZCBmb3IgdGhlIG1lbnUgaWNvbiBpbiBTZXRHbG9iYWxQcm9wZXJ0aWVzXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgbWVudUljb24gKCkge1xuICAgICAgICByZXR1cm4gSW1hZ2VGaWVsZE5hbWUuX01BUC5tZW51SWNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW1hZ2UgZmllbGQgZm9yIEFkZENvbW1hbmRcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBjbWRJY29uICgpIHtcbiAgICAgICAgcmV0dXJuIEltYWdlRmllbGROYW1lLl9NQVAuY21kSWNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW1hZ2UgZmllbGQgZm9yIHRoZSBhcHAgaWNvbiAoc2V0IGJ5IHNldEFwcEljb24pXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgYXBwSWNvbiAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZUZpZWxkTmFtZS5fTUFQLmFwcEljb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgaW1hZ2UgZmllbGQgZm9yIFNob3dcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBncmFwaGljICgpIHtcbiAgICAgICAgcmV0dXJuIEltYWdlRmllbGROYW1lLl9NQVAuZ3JhcGhpYztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2Vjb25kYXJ5IGltYWdlIGZpZWxkIGZvciBTaG93XG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgc2Vjb25kYXJ5R3JhcGhpYyAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZUZpZWxkTmFtZS5fTUFQLnNlY29uZGFyeUdyYXBoaWM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgaW1hZ2UgZmllbGQgZm9yIFNob3dDb25zdGFudFRCVFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IHNob3dDb25zdGFudFRCVEljb24gKCkge1xuICAgICAgICByZXR1cm4gSW1hZ2VGaWVsZE5hbWUuX01BUC5zaG93Q29uc3RhbnRUQlRJY29uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzZWNvbmRhcnkgaW1hZ2UgZmllbGQgZm9yIFNob3dDb25zdGFudFRCVFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IHNob3dDb25zdGFudFRCVE5leHRUdXJuSWNvbiAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZUZpZWxkTmFtZS5fTUFQLnNob3dDb25zdGFudFRCVE5leHRUdXJuSWNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3B0aW9uYWwgaW1hZ2Ugb2YgYSBkZXN0aW5hdGlvbiAvIGxvY2F0aW9uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgbG9jYXRpb25JbWFnZSAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZUZpZWxkTmFtZS5fTUFQLmxvY2F0aW9uSW1hZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGltYWdlIGZpZWxkIGZvciBBbGVydFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IGFsZXJ0SWNvbiAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZUZpZWxkTmFtZS5fTUFQLmFsZXJ0SWNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBJbWFnZUZpZWxkTmFtZS5fdmFsdWVGb3JLZXkoa2V5LCBJbWFnZUZpZWxkTmFtZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEltYWdlRmllbGROYW1lLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgSW1hZ2VGaWVsZE5hbWUuX01BUCk7XG4gICAgfVxufVxuXG5JbWFnZUZpZWxkTmFtZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ3NvZnRCdXR0b25JbWFnZSc6ICdzb2Z0QnV0dG9uSW1hZ2UnLFxuICAgICdjaG9pY2VJbWFnZSc6ICdjaG9pY2VJbWFnZScsXG4gICAgJ2Nob2ljZVNlY29uZGFyeUltYWdlJzogJ2Nob2ljZVNlY29uZGFyeUltYWdlJyxcbiAgICAndnJIZWxwSXRlbSc6ICd2ckhlbHBJdGVtJyxcbiAgICAndHVybkljb24nOiAndHVybkljb24nLFxuICAgICdtZW51SWNvbic6ICdtZW51SWNvbicsXG4gICAgJ2NtZEljb24nOiAnY21kSWNvbicsXG4gICAgJ2FwcEljb24nOiAnYXBwSWNvbicsXG4gICAgJ2dyYXBoaWMnOiAnZ3JhcGhpYycsXG4gICAgJ3NlY29uZGFyeUdyYXBoaWMnOiAnc2Vjb25kYXJ5R3JhcGhpYycsXG4gICAgJ3Nob3dDb25zdGFudFRCVEljb24nOiAnc2hvd0NvbnN0YW50VEJUSWNvbicsXG4gICAgJ3Nob3dDb25zdGFudFRCVE5leHRUdXJuSWNvbic6ICdzaG93Q29uc3RhbnRUQlROZXh0VHVybkljb24nLFxuICAgICdsb2NhdGlvbkltYWdlJzogJ2xvY2F0aW9uSW1hZ2UnLFxuICAgICdhbGVydEljb24nOiAnYWxlcnRJY29uJyxcbn0pO1xuXG5leHBvcnQgeyBJbWFnZUZpZWxkTmFtZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIGxpc3RpbmcgcG9zc2libGUgZmlsZSB0eXBlcy5cbiAqIEB0eXBlZGVmIHtFbnVtfSBGaWxlVHlwZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgRmlsZVR5cGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgR1JBUEhJQ19CTVAgKCkge1xuICAgICAgICByZXR1cm4gRmlsZVR5cGUuX01BUC5HUkFQSElDX0JNUDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBHUkFQSElDX0pQRUcgKCkge1xuICAgICAgICByZXR1cm4gRmlsZVR5cGUuX01BUC5HUkFQSElDX0pQRUc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgR1JBUEhJQ19QTkcgKCkge1xuICAgICAgICByZXR1cm4gRmlsZVR5cGUuX01BUC5HUkFQSElDX1BORztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBVURJT19XQVZFICgpIHtcbiAgICAgICAgcmV0dXJuIEZpbGVUeXBlLl9NQVAuQVVESU9fV0FWRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBVURJT19NUDMgKCkge1xuICAgICAgICByZXR1cm4gRmlsZVR5cGUuX01BUC5BVURJT19NUDM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQVVESU9fQUFDICgpIHtcbiAgICAgICAgcmV0dXJuIEZpbGVUeXBlLl9NQVAuQVVESU9fQUFDO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEJJTkFSWSAoKSB7XG4gICAgICAgIHJldHVybiBGaWxlVHlwZS5fTUFQLkJJTkFSWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBKU09OICgpIHtcbiAgICAgICAgcmV0dXJuIEZpbGVUeXBlLl9NQVAuSlNPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBGaWxlVHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBGaWxlVHlwZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEZpbGVUeXBlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgRmlsZVR5cGUuX01BUCk7XG4gICAgfVxufVxuXG5GaWxlVHlwZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0dSQVBISUNfQk1QJzogJ0dSQVBISUNfQk1QJyxcbiAgICAnR1JBUEhJQ19KUEVHJzogJ0dSQVBISUNfSlBFRycsXG4gICAgJ0dSQVBISUNfUE5HJzogJ0dSQVBISUNfUE5HJyxcbiAgICAnQVVESU9fV0FWRSc6ICdBVURJT19XQVZFJyxcbiAgICAnQVVESU9fTVAzJzogJ0FVRElPX01QMycsXG4gICAgJ0FVRElPX0FBQyc6ICdBVURJT19BQUMnLFxuICAgICdCSU5BUlknOiAnQklOQVJZJyxcbiAgICAnSlNPTic6ICdKU09OJyxcbn0pO1xuXG5leHBvcnQgeyBGaWxlVHlwZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBJbWFnZVJlc29sdXRpb24gfSBmcm9tICcuL0ltYWdlUmVzb2x1dGlvbi5qcyc7XG5pbXBvcnQgeyBJbWFnZUZpZWxkTmFtZSB9IGZyb20gJy4uL2VudW1zL0ltYWdlRmllbGROYW1lLmpzJztcbmltcG9ydCB7IEZpbGVUeXBlIH0gZnJvbSAnLi4vZW51bXMvRmlsZVR5cGUuanMnO1xuXG5jbGFzcyBJbWFnZUZpZWxkIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0ltYWdlRmllbGROYW1lfSBuYW1lIC0gVGhlIG5hbWUgdGhhdCBpZGVudGlmaWVzIHRoZSBmaWVsZC4gU2VlIEltYWdlRmllbGROYW1lLlxuICAgICAqIEByZXR1cm4ge0ltYWdlRmllbGR9XG4gICAgICovXG4gICAgc2V0TmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShJbWFnZUZpZWxkTmFtZSwgbmFtZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEltYWdlRmllbGQuS0VZX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtJbWFnZUZpZWxkTmFtZX1cbiAgICAgKi9cbiAgICBnZXROYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEltYWdlRmllbGROYW1lLCBJbWFnZUZpZWxkLktFWV9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0ZpbGVUeXBlW119IHN1cHBvcnRlZCAtIFRoZSBpbWFnZSB0eXBlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgaW4gdGhpcyBmaWVsZC4gU2VlIEZpbGVUeXBlLlxuICAgICAqIEByZXR1cm4ge0ltYWdlRmllbGR9XG4gICAgICovXG4gICAgc2V0SW1hZ2VUeXBlU3VwcG9ydGVkIChzdXBwb3J0ZWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoRmlsZVR5cGUsIHN1cHBvcnRlZCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEltYWdlRmllbGQuS0VZX0lNQUdFX1RZUEVfU1VQUE9SVEVELCBzdXBwb3J0ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtGaWxlVHlwZVtdfVxuICAgICAqL1xuICAgIGdldEltYWdlVHlwZVN1cHBvcnRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChGaWxlVHlwZSwgSW1hZ2VGaWVsZC5LRVlfSU1BR0VfVFlQRV9TVVBQT1JURUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW1hZ2VSZXNvbHV0aW9ufSByZXNvbHV0aW9uIC0gVGhlIGltYWdlIHJlc29sdXRpb24gb2YgdGhpcyBmaWVsZC5cbiAgICAgKiBAcmV0dXJuIHtJbWFnZUZpZWxkfVxuICAgICAqL1xuICAgIHNldEltYWdlUmVzb2x1dGlvbiAocmVzb2x1dGlvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShJbWFnZVJlc29sdXRpb24sIHJlc29sdXRpb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihJbWFnZUZpZWxkLktFWV9JTUFHRV9SRVNPTFVUSU9OLCByZXNvbHV0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SW1hZ2VSZXNvbHV0aW9ufVxuICAgICAqL1xuICAgIGdldEltYWdlUmVzb2x1dGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChJbWFnZVJlc29sdXRpb24sIEltYWdlRmllbGQuS0VZX0lNQUdFX1JFU09MVVRJT04pO1xuICAgIH1cbn1cblxuSW1hZ2VGaWVsZC5LRVlfTkFNRSA9ICduYW1lJztcbkltYWdlRmllbGQuS0VZX0lNQUdFX1RZUEVfU1VQUE9SVEVEID0gJ2ltYWdlVHlwZVN1cHBvcnRlZCc7XG5JbWFnZUZpZWxkLktFWV9JTUFHRV9SRVNPTFVUSU9OID0gJ2ltYWdlUmVzb2x1dGlvbic7XG5cbmV4cG9ydCB7IEltYWdlRmllbGQgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBTZWUgREFFUyBmb3IgZnVydGhlciBpbmZvcyByZWdhcmRpbmcgdGhlIGRpc3BsYXlzXG4gKiBAZGVwcmVjYXRlZFxuICogQHR5cGVkZWYge0VudW19IERpc3BsYXlUeXBlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBEaXNwbGF5VHlwZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ0lEICgpIHtcbiAgICAgICAgcmV0dXJuIERpc3BsYXlUeXBlLl9NQVAuQ0lEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVFlQRTIgKCkge1xuICAgICAgICByZXR1cm4gRGlzcGxheVR5cGUuX01BUC5UWVBFMjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRZUEU1ICgpIHtcbiAgICAgICAgcmV0dXJuIERpc3BsYXlUeXBlLl9NQVAuVFlQRTU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOR04gKCkge1xuICAgICAgICByZXR1cm4gRGlzcGxheVR5cGUuX01BUC5OR047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBHRU4yXzhfRE1BICgpIHtcbiAgICAgICAgcmV0dXJuIERpc3BsYXlUeXBlLl9NQVAuR0VOMl84X0RNQTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEdFTjJfNl9ETUEgKCkge1xuICAgICAgICByZXR1cm4gRGlzcGxheVR5cGUuX01BUC5HRU4yXzZfRE1BO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTUZEMyAoKSB7XG4gICAgICAgIHJldHVybiBEaXNwbGF5VHlwZS5fTUFQLk1GRDM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBNRkQ0ICgpIHtcbiAgICAgICAgcmV0dXJuIERpc3BsYXlUeXBlLl9NQVAuTUZENDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE1GRDUgKCkge1xuICAgICAgICByZXR1cm4gRGlzcGxheVR5cGUuX01BUC5NRkQ1O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgR0VOM184X0lOQ0ggKCkge1xuICAgICAgICByZXR1cm4gRGlzcGxheVR5cGUuX01BUC5HRU4zXzhfSU5DSDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNETF9HRU5FUklDICgpIHtcbiAgICAgICAgcmV0dXJuIERpc3BsYXlUeXBlLl9NQVAuU0RMX0dFTkVSSUM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gRGlzcGxheVR5cGUuX3ZhbHVlRm9yS2V5KGtleSwgRGlzcGxheVR5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBEaXNwbGF5VHlwZS5fa2V5Rm9yVmFsdWUodmFsdWUsIERpc3BsYXlUeXBlLl9NQVApO1xuICAgIH1cbn1cblxuRGlzcGxheVR5cGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdDSUQnOiAnQ0lEJyxcbiAgICAnVFlQRTInOiAnVFlQRTInLFxuICAgICdUWVBFNSc6ICdUWVBFNScsXG4gICAgJ05HTic6ICdOR04nLFxuICAgICdHRU4yXzhfRE1BJzogJ0dFTjJfOF9ETUEnLFxuICAgICdHRU4yXzZfRE1BJzogJ0dFTjJfNl9ETUEnLFxuICAgICdNRkQzJzogJ01GRDMnLFxuICAgICdNRkQ0JzogJ01GRDQnLFxuICAgICdNRkQ1JzogJ01GRDUnLFxuICAgICdHRU4zXzhfSU5DSCc6ICdHRU4zXzgtSU5DSCcsXG4gICAgJ1NETF9HRU5FUklDJzogJ1NETF9HRU5FUklDJyxcbn0pO1xuXG5leHBvcnQgeyBEaXNwbGF5VHlwZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBUZXh0RmllbGROYW1lXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBUZXh0RmllbGROYW1lIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBsaW5lIG9mIGZpcnN0IHNldCBvZiBtYWluIGZpZWxkcyBvZiB0aGUgcGVyc2lzdGVudCBkaXNwbGF5OyBhcHBsaWVzIHRvIFwiU2hvd1wiXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgbWFpbkZpZWxkMSAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAubWFpbkZpZWxkMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2Vjb25kIGxpbmUgb2YgZmlyc3Qgc2V0IG9mIG1haW4gZmllbGRzIG9mIHRoZSBwZXJzaXN0ZW50IGRpc3BsYXk7IGFwcGxpZXMgdG8gXCJTaG93XCJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBtYWluRmllbGQyICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC5tYWluRmllbGQyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBsaW5lIG9mIHNlY29uZCBzZXQgb2YgbWFpbiBmaWVsZHMgb2YgcGVyc2lzdGVudCBkaXNwbGF5OyBhcHBsaWVzIHRvIFwiU2hvd1wiXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgbWFpbkZpZWxkMyAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAubWFpbkZpZWxkMztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2Vjb25kIGxpbmUgb2Ygc2Vjb25kIHNldCBvZiBtYWluIGZpZWxkcyBvZiB0aGUgcGVyc2lzdGVudCBkaXNwbGF5OyBhcHBsaWVzIHRvIFwiU2hvd1wiXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgbWFpbkZpZWxkNCAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAubWFpbkZpZWxkNDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIGJhciBvbiBOR047IGFwcGxpZXMgdG8gXCJTaG93XCJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBzdGF0dXNCYXIgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLnN0YXR1c0JhcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXh0IHZhbHVlIGZvciBNZWRpYUNsb2NrIGZpZWxkOyBhcHBsaWVzIHRvIFwiU2hvd1wiXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgbWVkaWFDbG9jayAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAubWVkaWFDbG9jaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgZmllbGQgb2YgTkdOIGFuZCBHRU4xLjEgTUZEIGRpc3BsYXlzLiBUaGlzIGZpZWxkIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBtZWRpYSBhcHBsaWNhdGlvbnM7IGFwcGxpZXMgdG9cbiAgICAgKiBcIlNob3dcIlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IG1lZGlhVHJhY2sgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLm1lZGlhVHJhY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHRpdGxlIG9mIHRoZSBuZXcgdGVtcGxhdGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZDsgYXBwbGllcyB0byBcIlNob3dcIlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlVGl0bGUgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLnRlbXBsYXRlVGl0bGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGZpcnN0IGxpbmUgb2YgdGhlIGFsZXJ0IHRleHQgZmllbGQ7IGFwcGxpZXMgdG8gXCJBbGVydFwiXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgYWxlcnRUZXh0MSAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAuYWxlcnRUZXh0MTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2Vjb25kIGxpbmUgb2YgdGhlIGFsZXJ0IHRleHQgZmllbGQ7IGFwcGxpZXMgdG8gXCJBbGVydFwiXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgYWxlcnRUZXh0MiAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAuYWxlcnRUZXh0MjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGhpcmQgbGluZSBvZiB0aGUgYWxlcnQgdGV4dCBmaWVsZDsgYXBwbGllcyB0byBcIkFsZXJ0XCJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBhbGVydFRleHQzICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC5hbGVydFRleHQzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvbmcgZm9ybSBib2R5IG9mIHRleHQgdGhhdCBjYW4gaW5jbHVkZSBuZXdsaW5lcyBhbmQgdGFiczsgYXBwbGllcyB0byBcIlNjcm9sbGFibGVNZXNzYWdlXCJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBzY3JvbGxhYmxlTWVzc2FnZUJvZHkgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLnNjcm9sbGFibGVNZXNzYWdlQm9keTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaXJzdCBsaW5lIHN1Z2dlc3Rpb24gZm9yIGEgdXNlciByZXNwb25zZSAoaW4gdGhlIGNhc2Ugb2YgVlIgZW5hYmxlZCBpbnRlcmFjdGlvbilcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBpbml0aWFsSW50ZXJhY3Rpb25UZXh0ICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC5pbml0aWFsSW50ZXJhY3Rpb25UZXh0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpcnN0IGxpbmUgb2YgbmF2aWdhdGlvbiB0ZXh0XG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgbmF2aWdhdGlvblRleHQxICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC5uYXZpZ2F0aW9uVGV4dDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2Vjb25kIGxpbmUgb2YgbmF2aWdhdGlvbiB0ZXh0XG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgbmF2aWdhdGlvblRleHQyICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC5uYXZpZ2F0aW9uVGV4dDI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIFRpbWUgb2YgQXJyaXZhbCB0aW1lIGZvciBuYXZpZ2F0aW9uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRVRBICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC5FVEE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG90YWwgZGlzdGFuY2UgdG8gZGVzdGluYXRpb24gZm9yIG5hdmlnYXRpb25cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCB0b3RhbERpc3RhbmNlICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC50b3RhbERpc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpcnN0IGxpbmUgb2YgdGV4dCBmb3IgYXVkaW8gcGFzcyB0aHJ1XG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgYXVkaW9QYXNzVGhydURpc3BsYXlUZXh0MSAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAuYXVkaW9QYXNzVGhydURpc3BsYXlUZXh0MTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWNvbmQgbGluZSBvZiB0ZXh0IGZvciBhdWRpbyBwYXNzIHRocnVcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBhdWRpb1Bhc3NUaHJ1RGlzcGxheVRleHQyICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC5hdWRpb1Bhc3NUaHJ1RGlzcGxheVRleHQyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlYWRlciB0ZXh0IGZvciBzbGlkZXJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBzbGlkZXJIZWFkZXIgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLnNsaWRlckhlYWRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb290ZXIgdGV4dCBmb3Igc2xpZGVyXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgc2xpZGVyRm9vdGVyICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC5zbGlkZXJGb290ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJpbWFyeSB0ZXh0IGZvciBDaG9pY2VcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBtZW51TmFtZSAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0RmllbGROYW1lLl9NQVAubWVudU5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2Vjb25kYXJ5IHRleHQgZm9yIENob2ljZVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IHNlY29uZGFyeVRleHQgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLnNlY29uZGFyeVRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGVydGlhcnkgdGV4dCBmb3IgQ2hvaWNlXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgdGVydGlhcnlUZXh0ICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC50ZXJ0aWFyeVRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgdGV4dCB0byBsYWJlbCBhbiBhcHAgbWVudSBidXR0b24gKGZvciBjZXJ0YWluIHRvdWNoc2NyZWVuIHBsYXRmb3JtcykuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgbWVudVRpdGxlICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC5tZW51VGl0bGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgbmFtZSAvIHRpdGxlIG9mIGludGVuZGVkIGxvY2F0aW9uIGZvciBTZW5kTG9jYXRpb24uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgbG9jYXRpb25OYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX01BUC5sb2NhdGlvbk5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgaW50ZW5kZWQgbG9jYXRpb24gLyBlc3RhYmxpc2htZW50IChpZiBhcHBsaWNhYmxlKSBmb3IgU2VuZExvY2F0aW9uLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IGxvY2F0aW9uRGVzY3JpcHRpb24gKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLmxvY2F0aW9uRGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgbG9jYXRpb24gYWRkcmVzcyAoaWYgYXBwbGljYWJsZSkgZm9yIFNlbmRMb2NhdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBhZGRyZXNzTGluZXMgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLmFkZHJlc3NMaW5lcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBob25lIG51bWJlciBvZiBpbnRlbmRlZCBsb2NhdGlvbiAvIGVzdGFibGlzaG1lbnQgKGlmIGFwcGxpY2FibGUpIGZvciBTZW5kTG9jYXRpb24uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgcGhvbmVOdW1iZXIgKCkge1xuICAgICAgICByZXR1cm4gVGV4dEZpZWxkTmFtZS5fTUFQLnBob25lTnVtYmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX3ZhbHVlRm9yS2V5KGtleSwgVGV4dEZpZWxkTmFtZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFRleHRGaWVsZE5hbWUuX2tleUZvclZhbHVlKHZhbHVlLCBUZXh0RmllbGROYW1lLl9NQVApO1xuICAgIH1cbn1cblxuVGV4dEZpZWxkTmFtZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ21haW5GaWVsZDEnOiAnbWFpbkZpZWxkMScsXG4gICAgJ21haW5GaWVsZDInOiAnbWFpbkZpZWxkMicsXG4gICAgJ21haW5GaWVsZDMnOiAnbWFpbkZpZWxkMycsXG4gICAgJ21haW5GaWVsZDQnOiAnbWFpbkZpZWxkNCcsXG4gICAgJ3N0YXR1c0Jhcic6ICdzdGF0dXNCYXInLFxuICAgICdtZWRpYUNsb2NrJzogJ21lZGlhQ2xvY2snLFxuICAgICdtZWRpYVRyYWNrJzogJ21lZGlhVHJhY2snLFxuICAgICd0ZW1wbGF0ZVRpdGxlJzogJ3RlbXBsYXRlVGl0bGUnLFxuICAgICdhbGVydFRleHQxJzogJ2FsZXJ0VGV4dDEnLFxuICAgICdhbGVydFRleHQyJzogJ2FsZXJ0VGV4dDInLFxuICAgICdhbGVydFRleHQzJzogJ2FsZXJ0VGV4dDMnLFxuICAgICdzY3JvbGxhYmxlTWVzc2FnZUJvZHknOiAnc2Nyb2xsYWJsZU1lc3NhZ2VCb2R5JyxcbiAgICAnaW5pdGlhbEludGVyYWN0aW9uVGV4dCc6ICdpbml0aWFsSW50ZXJhY3Rpb25UZXh0JyxcbiAgICAnbmF2aWdhdGlvblRleHQxJzogJ25hdmlnYXRpb25UZXh0MScsXG4gICAgJ25hdmlnYXRpb25UZXh0Mic6ICduYXZpZ2F0aW9uVGV4dDInLFxuICAgICdFVEEnOiAnRVRBJyxcbiAgICAndG90YWxEaXN0YW5jZSc6ICd0b3RhbERpc3RhbmNlJyxcbiAgICAnYXVkaW9QYXNzVGhydURpc3BsYXlUZXh0MSc6ICdhdWRpb1Bhc3NUaHJ1RGlzcGxheVRleHQxJyxcbiAgICAnYXVkaW9QYXNzVGhydURpc3BsYXlUZXh0Mic6ICdhdWRpb1Bhc3NUaHJ1RGlzcGxheVRleHQyJyxcbiAgICAnc2xpZGVySGVhZGVyJzogJ3NsaWRlckhlYWRlcicsXG4gICAgJ3NsaWRlckZvb3Rlcic6ICdzbGlkZXJGb290ZXInLFxuICAgICdtZW51TmFtZSc6ICdtZW51TmFtZScsXG4gICAgJ3NlY29uZGFyeVRleHQnOiAnc2Vjb25kYXJ5VGV4dCcsXG4gICAgJ3RlcnRpYXJ5VGV4dCc6ICd0ZXJ0aWFyeVRleHQnLFxuICAgICdtZW51VGl0bGUnOiAnbWVudVRpdGxlJyxcbiAgICAnbG9jYXRpb25OYW1lJzogJ2xvY2F0aW9uTmFtZScsXG4gICAgJ2xvY2F0aW9uRGVzY3JpcHRpb24nOiAnbG9jYXRpb25EZXNjcmlwdGlvbicsXG4gICAgJ2FkZHJlc3NMaW5lcyc6ICdhZGRyZXNzTGluZXMnLFxuICAgICdwaG9uZU51bWJlcic6ICdwaG9uZU51bWJlcicsXG59KTtcblxuZXhwb3J0IHsgVGV4dEZpZWxkTmFtZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIHBvdGVudGlhbCBjaGFyYWN0ZXIgc2V0c1xuICogQHR5cGVkZWYge0VudW19IENoYXJhY3RlclNldFxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgQ2hhcmFjdGVyU2V0IGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlZVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRZUEUyU0VUICgpIHtcbiAgICAgICAgcmV0dXJuIENoYXJhY3RlclNldC5fTUFQLlRZUEUyU0VUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlZVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRZUEU1U0VUICgpIHtcbiAgICAgICAgcmV0dXJuIENoYXJhY3RlclNldC5fTUFQLlRZUEU1U0VUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlZVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENJRDFTRVQgKCkge1xuICAgICAgICByZXR1cm4gQ2hhcmFjdGVyU2V0Ll9NQVAuQ0lEMVNFVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWVcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDSUQyU0VUICgpIHtcbiAgICAgICAgcmV0dXJuIENoYXJhY3RlclNldC5fTUFQLkNJRDJTRVQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gQ2hhcmFjdGVyU2V0Ll92YWx1ZUZvcktleShrZXksIENoYXJhY3RlclNldC5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIENoYXJhY3RlclNldC5fa2V5Rm9yVmFsdWUodmFsdWUsIENoYXJhY3RlclNldC5fTUFQKTtcbiAgICB9XG59XG5cbkNoYXJhY3RlclNldC5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ1RZUEUyU0VUJzogJ1RZUEUyU0VUJyxcbiAgICAnVFlQRTVTRVQnOiAnVFlQRTVTRVQnLFxuICAgICdDSUQxU0VUJzogJ0NJRDFTRVQnLFxuICAgICdDSUQyU0VUJzogJ0NJRDJTRVQnLFxufSk7XG5cbmV4cG9ydCB7IENoYXJhY3RlclNldCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFRleHRGaWVsZE5hbWUgfSBmcm9tICcuLi9lbnVtcy9UZXh0RmllbGROYW1lLmpzJztcbmltcG9ydCB7IENoYXJhY3RlclNldCB9IGZyb20gJy4uL2VudW1zL0NoYXJhY3RlclNldC5qcyc7XG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG5jbGFzcyBUZXh0RmllbGQgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VGV4dEZpZWxkTmFtZX0gbmFtZSAtIFRoZSBuYW1lIHRoYXQgaWRlbnRpZmllcyB0aGUgZmllbGQuIFNlZSBUZXh0RmllbGROYW1lLlxuICAgICAqIEByZXR1cm4ge1RleHRGaWVsZH1cbiAgICAgKi9cbiAgICBzZXROYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRleHRGaWVsZE5hbWUsIG5hbWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihUZXh0RmllbGQuS0VZX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUZXh0RmllbGROYW1lfVxuICAgICAqL1xuICAgIGdldE5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVGV4dEZpZWxkTmFtZSwgVGV4dEZpZWxkLktFWV9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0NoYXJhY3RlclNldH0gc2V0IC0gVGhlIGNoYXJhY3RlciBzZXQgdGhhdCBpcyBzdXBwb3J0ZWQgaW4gdGhpcyBmaWVsZC4gU2VlIENoYXJhY3RlclNldC5cbiAgICAgKiBAcmV0dXJuIHtUZXh0RmllbGR9XG4gICAgICovXG4gICAgc2V0Q2hhcmFjdGVyU2V0IChzZXQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQ2hhcmFjdGVyU2V0LCBzZXQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihUZXh0RmllbGQuS0VZX0NIQVJBQ1RFUl9TRVQsIHNldCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0NoYXJhY3RlclNldH1cbiAgICAgKi9cbiAgICBnZXRDaGFyYWN0ZXJTZXQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQ2hhcmFjdGVyU2V0LCBUZXh0RmllbGQuS0VZX0NIQVJBQ1RFUl9TRVQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBvbmUgcm93IG9mIHRoaXMgZmllbGQuXG4gICAgICogQHJldHVybiB7VGV4dEZpZWxkfVxuICAgICAqL1xuICAgIHNldFdpZHRoICh3aWR0aCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihUZXh0RmllbGQuS0VZX1dJRFRILCB3aWR0aCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRXaWR0aCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihUZXh0RmllbGQuS0VZX1dJRFRIKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gcm93cyAtIFRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGlzIGZpZWxkLlxuICAgICAqIEByZXR1cm4ge1RleHRGaWVsZH1cbiAgICAgKi9cbiAgICBzZXRSb3dzIChyb3dzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFRleHRGaWVsZC5LRVlfUk9XUywgcm93cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRSb3dzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFRleHRGaWVsZC5LRVlfUk9XUyk7XG4gICAgfVxufVxuXG5UZXh0RmllbGQuS0VZX05BTUUgPSAnbmFtZSc7XG5UZXh0RmllbGQuS0VZX0NIQVJBQ1RFUl9TRVQgPSAnY2hhcmFjdGVyU2V0JztcblRleHRGaWVsZC5LRVlfV0lEVEggPSAnd2lkdGgnO1xuVGV4dEZpZWxkLktFWV9ST1dTID0gJ3Jvd3MnO1xuXG5leHBvcnQgeyBUZXh0RmllbGQgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBNZWRpYUNsb2NrRm9ybWF0IH0gZnJvbSAnLi4vZW51bXMvTWVkaWFDbG9ja0Zvcm1hdC5qcyc7XG5pbXBvcnQgeyBTY3JlZW5QYXJhbXMgfSBmcm9tICcuL1NjcmVlblBhcmFtcy5qcyc7XG5pbXBvcnQgeyBJbWFnZUZpZWxkIH0gZnJvbSAnLi9JbWFnZUZpZWxkLmpzJztcbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBEaXNwbGF5VHlwZSB9IGZyb20gJy4uL2VudW1zL0Rpc3BsYXlUeXBlLmpzJztcbmltcG9ydCB7IFRleHRGaWVsZCB9IGZyb20gJy4vVGV4dEZpZWxkLmpzJztcblxuLyoqXG4gKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlzcGxheSBjYXBhYmlsaXRpZXMuIFRoaXMgc3RydWN0IGlzIGRlcHJlY2F0ZWQ7IHBsZWFzZSBzZWUgdGhlIG5ldyBTeXN0ZW1DYXBhYmlsaXR5XG4gKiBESVNQTEFZUyBhbmQgY29ycmVzcG9uZGluZyBzdHJ1Y3QgRGlzcGxheUNhcGFiaWxpdHlcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmNsYXNzIERpc3BsYXlDYXBhYmlsaXRpZXMgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcGFyYW0ge0Rpc3BsYXlUeXBlfSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGRpc3BsYXkuIFNlZSBEaXNwbGF5VHlwZVxuICAgICAqIEByZXR1cm4ge0Rpc3BsYXlDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0RGlzcGxheVR5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoRGlzcGxheVR5cGUsIHR5cGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEaXNwbGF5Q2FwYWJpbGl0aWVzLktFWV9ESVNQTEFZX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEByZXR1cm4ge0Rpc3BsYXlUeXBlfVxuICAgICAqL1xuICAgIGdldERpc3BsYXlUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KERpc3BsYXlUeXBlLCBEaXNwbGF5Q2FwYWJpbGl0aWVzLktFWV9ESVNQTEFZX1RZUEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZGlzcGxheSB0aGUgYXBwIGlzIGNvbm5lY3RlZCB0by5cbiAgICAgKiBAcmV0dXJuIHtEaXNwbGF5Q2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldERpc3BsYXlOYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX0RJU1BMQVlfTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldERpc3BsYXlOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX0RJU1BMQVlfTkFNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcGFyYW0ge1RleHRGaWVsZFtdfSBmaWVsZHMgLSBBIHNldCBvZiBhbGwgZmllbGRzIHRoYXQgc3VwcG9ydCB0ZXh0IGRhdGEuIFNlZSBUZXh0RmllbGRcbiAgICAgKiBAcmV0dXJuIHtEaXNwbGF5Q2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldFRleHRGaWVsZHMgKGZpZWxkcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShUZXh0RmllbGQsIGZpZWxkcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX1RFWFRfRklFTERTLCBmaWVsZHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEByZXR1cm4ge1RleHRGaWVsZFtdfVxuICAgICAqL1xuICAgIGdldFRleHRGaWVsZHMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVGV4dEZpZWxkLCBEaXNwbGF5Q2FwYWJpbGl0aWVzLktFWV9URVhUX0ZJRUxEUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcGFyYW0ge0ltYWdlRmllbGRbXX0gZmllbGRzIC0gQSBzZXQgb2YgYWxsIGZpZWxkcyB0aGF0IHN1cHBvcnQgaW1hZ2VzLiBTZWUgSW1hZ2VGaWVsZFxuICAgICAqIEByZXR1cm4ge0Rpc3BsYXlDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0SW1hZ2VGaWVsZHMgKGZpZWxkcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShJbWFnZUZpZWxkLCBmaWVsZHMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEaXNwbGF5Q2FwYWJpbGl0aWVzLktFWV9JTUFHRV9GSUVMRFMsIGZpZWxkcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQHJldHVybiB7SW1hZ2VGaWVsZFtdfVxuICAgICAqL1xuICAgIGdldEltYWdlRmllbGRzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEltYWdlRmllbGQsIERpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX0lNQUdFX0ZJRUxEUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcGFyYW0ge01lZGlhQ2xvY2tGb3JtYXRbXX0gZm9ybWF0cyAtIEEgc2V0IG9mIGFsbCBzdXBwb3J0ZWQgZm9ybWF0cyBvZiB0aGUgbWVkaWEgY2xvY2suIFNlZSBNZWRpYUNsb2NrRm9ybWF0XG4gICAgICogQHJldHVybiB7RGlzcGxheUNhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRNZWRpYUNsb2NrRm9ybWF0cyAoZm9ybWF0cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNZWRpYUNsb2NrRm9ybWF0LCBmb3JtYXRzLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfTUVESUFfQ0xPQ0tfRk9STUFUUywgZm9ybWF0cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQHJldHVybiB7TWVkaWFDbG9ja0Zvcm1hdFtdfVxuICAgICAqL1xuICAgIGdldE1lZGlhQ2xvY2tGb3JtYXRzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KE1lZGlhQ2xvY2tGb3JtYXQsIERpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX01FRElBX0NMT0NLX0ZPUk1BVFMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzdXBwb3J0ZWQgLSBUaGUgZGlzcGxheSdzIHBlcnNpc3RlbnQgc2NyZWVuIHN1cHBvcnRzIHJlZmVyZW5jaW5nIGEgc3RhdGljIG9yIGR5bmFtaWMgaW1hZ2UuXG4gICAgICogQHJldHVybiB7RGlzcGxheUNhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRHcmFwaGljU3VwcG9ydGVkIChzdXBwb3J0ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfR1JBUEhJQ19TVVBQT1JURUQsIHN1cHBvcnRlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRHcmFwaGljU3VwcG9ydGVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX0dSQVBISUNfU1VQUE9SVEVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEBwYXJhbSB7U3RyaW5nW119IGF2YWlsYWJsZSAtIEEgc2V0IG9mIGFsbCBwcmVkZWZpbmVkIHBlcnNpc3RlbnQgZGlzcGxheSB0ZW1wbGF0ZXMgYXZhaWxhYmxlIG9uIGhlYWR1bml0LiBUbyBiZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWQgaW4gU2V0RGlzcGxheUxheW91dC5cbiAgICAgKiBAcmV0dXJuIHtEaXNwbGF5Q2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldFRlbXBsYXRlc0F2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX1RFTVBMQVRFU19BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQHJldHVybiB7U3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0VGVtcGxhdGVzQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX1RFTVBMQVRFU19BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQHBhcmFtIHtTY3JlZW5QYXJhbXN9IHBhcmFtcyAtIEEgc2V0IG9mIGFsbCBwYXJhbWV0ZXJzIHJlbGF0ZWQgdG8gYSBwcmVzY3JpYmVkIHNjcmVlbiBhcmVhIChlLmcuIGZvciB2aWRlbyAvXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdWNoIGlucHV0KS5cbiAgICAgKiBAcmV0dXJuIHtEaXNwbGF5Q2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldFNjcmVlblBhcmFtcyAocGFyYW1zKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFNjcmVlblBhcmFtcywgcGFyYW1zKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfU0NSRUVOX1BBUkFNUywgcGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcmV0dXJuIHtTY3JlZW5QYXJhbXN9XG4gICAgICovXG4gICAgZ2V0U2NyZWVuUGFyYW1zICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFNjcmVlblBhcmFtcywgRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfU0NSRUVOX1BBUkFNUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYXZhaWxhYmxlIC0gVGhlIG51bWJlciBvZiBvbi1zY3JlZW4gY3VzdG9tIHByZXNldHMgYXZhaWxhYmxlIChpZiBhbnkpOyBvdGhlcndpc2Ugb21pdHRlZC5cbiAgICAgKiBAcmV0dXJuIHtEaXNwbGF5Q2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldE51bUN1c3RvbVByZXNldHNBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEaXNwbGF5Q2FwYWJpbGl0aWVzLktFWV9OVU1fQ1VTVE9NX1BSRVNFVFNfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXROdW1DdXN0b21QcmVzZXRzQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX05VTV9DVVNUT01fUFJFU0VUU19BVkFJTEFCTEUpO1xuICAgIH1cbn1cblxuRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfRElTUExBWV9UWVBFID0gJ2Rpc3BsYXlUeXBlJztcbkRpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX0RJU1BMQVlfTkFNRSA9ICdkaXNwbGF5TmFtZSc7XG5EaXNwbGF5Q2FwYWJpbGl0aWVzLktFWV9URVhUX0ZJRUxEUyA9ICd0ZXh0RmllbGRzJztcbkRpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX0lNQUdFX0ZJRUxEUyA9ICdpbWFnZUZpZWxkcyc7XG5EaXNwbGF5Q2FwYWJpbGl0aWVzLktFWV9NRURJQV9DTE9DS19GT1JNQVRTID0gJ21lZGlhQ2xvY2tGb3JtYXRzJztcbkRpc3BsYXlDYXBhYmlsaXRpZXMuS0VZX0dSQVBISUNfU1VQUE9SVEVEID0gJ2dyYXBoaWNTdXBwb3J0ZWQnO1xuRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfVEVNUExBVEVTX0FWQUlMQUJMRSA9ICd0ZW1wbGF0ZXNBdmFpbGFibGUnO1xuRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfU0NSRUVOX1BBUkFNUyA9ICdzY3JlZW5QYXJhbXMnO1xuRGlzcGxheUNhcGFiaWxpdGllcy5LRVlfTlVNX0NVU1RPTV9QUkVTRVRTX0FWQUlMQUJMRSA9ICdudW1DdXN0b21QcmVzZXRzQXZhaWxhYmxlJztcblxuZXhwb3J0IHsgRGlzcGxheUNhcGFiaWxpdGllcyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIERlc2NyaWJlcyBkaWZmZXJlbnQgc2FtcGxpbmcgb3B0aW9ucyBmb3IgUGVyZm9ybUF1ZGlvUGFzc1RocnUuXG4gKiBAdHlwZWRlZiB7RW51bX0gU2FtcGxpbmdSYXRlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBTYW1wbGluZ1JhdGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2FtcGxpbmcgcmF0ZSBvZiA4MDAwIEh6LlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNhbXBsaW5nUmF0ZV84S0haICgpIHtcbiAgICAgICAgcmV0dXJuIFNhbXBsaW5nUmF0ZS5fTUFQLlNhbXBsaW5nUmF0ZV84S0haO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhbXBsaW5nIHJhdGUgb2YgMTYwMDAgSHouXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU2FtcGxpbmdSYXRlXzE2S0haICgpIHtcbiAgICAgICAgcmV0dXJuIFNhbXBsaW5nUmF0ZS5fTUFQLlNhbXBsaW5nUmF0ZV8xNktIWjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYW1wbGluZyByYXRlIG9mIDIyMDUwIEh6LlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNhbXBsaW5nUmF0ZV8yMktIWiAoKSB7XG4gICAgICAgIHJldHVybiBTYW1wbGluZ1JhdGUuX01BUC5TYW1wbGluZ1JhdGVfMjJLSFo7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2FtcGxpbmcgcmF0ZSBvZiA0NDEwMCBIei5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTYW1wbGluZ1JhdGVfNDRLSFogKCkge1xuICAgICAgICByZXR1cm4gU2FtcGxpbmdSYXRlLl9NQVAuU2FtcGxpbmdSYXRlXzQ0S0haO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFNhbXBsaW5nUmF0ZS5fdmFsdWVGb3JLZXkoa2V5LCBTYW1wbGluZ1JhdGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBTYW1wbGluZ1JhdGUuX2tleUZvclZhbHVlKHZhbHVlLCBTYW1wbGluZ1JhdGUuX01BUCk7XG4gICAgfVxufVxuXG5TYW1wbGluZ1JhdGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdTYW1wbGluZ1JhdGVfOEtIWic6ICc4S0haJyxcbiAgICAnU2FtcGxpbmdSYXRlXzE2S0haJzogJzE2S0haJyxcbiAgICAnU2FtcGxpbmdSYXRlXzIyS0haJzogJzIyS0haJyxcbiAgICAnU2FtcGxpbmdSYXRlXzQ0S0haJzogJzQ0S0haJyxcbn0pO1xuXG5leHBvcnQgeyBTYW1wbGluZ1JhdGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBEZXNjcmliZXMgZGlmZmVyZW50IHF1YWxpdHkgb3B0aW9ucyBmb3IgUGVyZm9ybUF1ZGlvUGFzc1RocnUuXG4gKiBAdHlwZWRlZiB7RW51bX0gQml0c1BlclNhbXBsZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgQml0c1BlclNhbXBsZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdWRpbyBzYW1wbGUgaXMgOCBiaXRzIHdpZGUsIHVuc2lnbmVkLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEJpdHNQZXJTYW1wbGVfOF9CSVQgKCkge1xuICAgICAgICByZXR1cm4gQml0c1BlclNhbXBsZS5fTUFQLkJpdHNQZXJTYW1wbGVfOF9CSVQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXVkaW8gc2FtcGxlIGlzIDE2IGJpdHMgd2lkZSwgc2lnbmVkLCBhbmQgaW4gbGl0dGxlIGVuZGlhbi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBCaXRzUGVyU2FtcGxlXzE2X0JJVCAoKSB7XG4gICAgICAgIHJldHVybiBCaXRzUGVyU2FtcGxlLl9NQVAuQml0c1BlclNhbXBsZV8xNl9CSVQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gQml0c1BlclNhbXBsZS5fdmFsdWVGb3JLZXkoa2V5LCBCaXRzUGVyU2FtcGxlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gQml0c1BlclNhbXBsZS5fa2V5Rm9yVmFsdWUodmFsdWUsIEJpdHNQZXJTYW1wbGUuX01BUCk7XG4gICAgfVxufVxuXG5CaXRzUGVyU2FtcGxlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnQml0c1BlclNhbXBsZV84X0JJVCc6ICc4X0JJVCcsXG4gICAgJ0JpdHNQZXJTYW1wbGVfMTZfQklUJzogJzE2X0JJVCcsXG59KTtcblxuZXhwb3J0IHsgQml0c1BlclNhbXBsZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIERlc2NyaWJlcyBkaWZmZXJlbnQgYXVkaW8gdHlwZSBvcHRpb25zIGZvciBQZXJmb3JtQXVkaW9QYXNzVGhydS5cbiAqIEB0eXBlZGVmIHtFbnVtfSBBdWRpb1R5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIEF1ZGlvVHlwZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW5lYXIgUENNLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBDTSAoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb1R5cGUuX01BUC5QQ007XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gQXVkaW9UeXBlLl92YWx1ZUZvcktleShrZXksIEF1ZGlvVHlwZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvVHlwZS5fa2V5Rm9yVmFsdWUodmFsdWUsIEF1ZGlvVHlwZS5fTUFQKTtcbiAgICB9XG59XG5cbkF1ZGlvVHlwZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ1BDTSc6ICdQQ00nLFxufSk7XG5cbmV4cG9ydCB7IEF1ZGlvVHlwZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBTYW1wbGluZ1JhdGUgfSBmcm9tICcuLi9lbnVtcy9TYW1wbGluZ1JhdGUuanMnO1xuaW1wb3J0IHsgQml0c1BlclNhbXBsZSB9IGZyb20gJy4uL2VudW1zL0JpdHNQZXJTYW1wbGUuanMnO1xuaW1wb3J0IHsgQXVkaW9UeXBlIH0gZnJvbSAnLi4vZW51bXMvQXVkaW9UeXBlLmpzJztcblxuLyoqXG4gKiBEZXNjcmliZXMgZGlmZmVyZW50IGF1ZGlvIHR5cGUgY29uZmlndXJhdGlvbnMgZm9yIFBlcmZvcm1BdWRpb1Bhc3NUaHJ1LiBlLmcuIHs4a0h6LDgtYml0LFBDTX0gVGhlIGF1ZGlvIGlzIHJlY29yZGVkXG4gKiBpbiBtb25hdXJhbC5cbiAqL1xuY2xhc3MgQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcyBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTYW1wbGluZ1JhdGV9IHJhdGUgLSBEZXNjcmliZXMgZGlmZmVyZW50IHNhbXBsaW5nIG9wdGlvbnMgZm9yIFBlcmZvcm1BdWRpb1Bhc3NUaHJ1LlxuICAgICAqIEByZXR1cm4ge0F1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0U2FtcGxpbmdSYXRlIChyYXRlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFNhbXBsaW5nUmF0ZSwgcmF0ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEF1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXMuS0VZX1NBTVBMSU5HX1JBVEUsIHJhdGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTYW1wbGluZ1JhdGV9XG4gICAgICovXG4gICAgZ2V0U2FtcGxpbmdSYXRlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFNhbXBsaW5nUmF0ZSwgQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcy5LRVlfU0FNUExJTkdfUkFURSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCaXRzUGVyU2FtcGxlfSBzYW1wbGUgLSBEZXNjcmliZXMgZGlmZmVyZW50IHF1YWxpdHkgb3B0aW9ucyBmb3IgUGVyZm9ybUF1ZGlvUGFzc1RocnUuXG4gICAgICogQHJldHVybiB7QXVkaW9QYXNzVGhydUNhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRCaXRzUGVyU2FtcGxlIChzYW1wbGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQml0c1BlclNhbXBsZSwgc2FtcGxlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcy5LRVlfQklUU19QRVJfU0FNUExFLCBzYW1wbGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCaXRzUGVyU2FtcGxlfVxuICAgICAqL1xuICAgIGdldEJpdHNQZXJTYW1wbGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQml0c1BlclNhbXBsZSwgQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcy5LRVlfQklUU19QRVJfU0FNUExFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0F1ZGlvVHlwZX0gdHlwZSAtIERlc2NyaWJlcyBkaWZmZXJlbnQgYXVkaW8gdHlwZSBvcHRpb25zIGZvciBQZXJmb3JtQXVkaW9QYXNzVGhydS5cbiAgICAgKiBAcmV0dXJuIHtBdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldEF1ZGlvVHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShBdWRpb1R5cGUsIHR5cGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzLktFWV9BVURJT19UWVBFLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QXVkaW9UeXBlfVxuICAgICAqL1xuICAgIGdldEF1ZGlvVHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChBdWRpb1R5cGUsIEF1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXMuS0VZX0FVRElPX1RZUEUpO1xuICAgIH1cbn1cblxuQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcy5LRVlfU0FNUExJTkdfUkFURSA9ICdzYW1wbGluZ1JhdGUnO1xuQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcy5LRVlfQklUU19QRVJfU0FNUExFID0gJ2JpdHNQZXJTYW1wbGUnO1xuQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcy5LRVlfQVVESU9fVFlQRSA9ICdhdWRpb1R5cGUnO1xuXG5leHBvcnQgeyBBdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFZSIGNhcGFiaWxpdGllcy5cbiAqIEB0eXBlZGVmIHtFbnVtfSBWckNhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgVnJDYXBhYmlsaXRpZXMgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVlJfVEVYVCAoKSB7XG4gICAgICAgIHJldHVybiBWckNhcGFiaWxpdGllcy5fTUFQLlZSX1RFWFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gVnJDYXBhYmlsaXRpZXMuX3ZhbHVlRm9yS2V5KGtleSwgVnJDYXBhYmlsaXRpZXMuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBWckNhcGFiaWxpdGllcy5fa2V5Rm9yVmFsdWUodmFsdWUsIFZyQ2FwYWJpbGl0aWVzLl9NQVApO1xuICAgIH1cbn1cblxuVnJDYXBhYmlsaXRpZXMuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdWUl9URVhUJzogJ1RFWFQnLFxufSk7XG5cbmV4cG9ydCB7IFZyQ2FwYWJpbGl0aWVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgaGFyZCAocGh5c2ljYWwpIGFuZCBzb2Z0ICh0b3VjaHNjcmVlbikgYnV0dG9ucyBhdmFpbGFibGUgZnJvbSB0aGUgbW9kdWxlXG4gKiBAdHlwZWRlZiB7RW51bX0gQnV0dG9uTmFtZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgQnV0dG9uTmFtZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBPSyAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuT0s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJ1dHRvbiBuYW1lIGZvciB0aGUgcGh5c2ljYWwgUGxheS9QYXVzZSB0b2dnbGUgdGhhdCBjYW4gYmUgdXNlZCBieSBtZWRpYSBhcHBzLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBMQVlfUEFVU0UgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlBMQVlfUEFVU0U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU0VFS0xFRlQgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlNFRUtMRUZUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNFRUtSSUdIVCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuU0VFS1JJR0hUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRVTkVVUCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuVFVORVVQO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRVTkVET1dOICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5UVU5FRE9XTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQUkVTRVRfMCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuUFJFU0VUXzA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUFJFU0VUXzEgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlBSRVNFVF8xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBSRVNFVF8yICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5QUkVTRVRfMjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQUkVTRVRfMyAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuUFJFU0VUXzM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUFJFU0VUXzQgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlBSRVNFVF80O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBSRVNFVF81ICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5QUkVTRVRfNTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQUkVTRVRfNiAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuUFJFU0VUXzY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUFJFU0VUXzcgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlBSRVNFVF83O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBSRVNFVF84ICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5QUkVTRVRfODtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQUkVTRVRfOSAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuUFJFU0VUXzk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ1VTVE9NX0JVVFRPTiAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuQ1VTVE9NX0JVVFRPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTRUFSQ0ggKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlNFQVJDSDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBQ19NQVggKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLkFDX01BWDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBQyAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuQUM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUkVDSVJDVUxBVEUgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlJFQ0lSQ1VMQVRFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZBTl9VUCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuRkFOX1VQO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZBTl9ET1dOICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5GQU5fRE9XTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBURU1QX1VQICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5URU1QX1VQO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRFTVBfRE9XTiAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuVEVNUF9ET1dOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERFRlJPU1RfTUFYICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5ERUZST1NUX01BWDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBERUZST1NUICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5ERUZST1NUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERFRlJPU1RfUkVBUiAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuREVGUk9TVF9SRUFSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVQUEVSX1ZFTlQgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlVQUEVSX1ZFTlQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTE9XRVJfVkVOVCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuTE9XRVJfVkVOVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWT0xVTUVfVVAgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlZPTFVNRV9VUDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWT0xVTUVfRE9XTiAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuVk9MVU1FX0RPV047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRUpFQ1QgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLkVKRUNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNPVVJDRSAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuU09VUkNFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNIVUZGTEUgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLlNIVUZGTEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUkVQRUFUICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5SRVBFQVQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkFWX0NFTlRFUl9MT0NBVElPTiAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuTkFWX0NFTlRFUl9MT0NBVElPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOQVZfWk9PTV9JTiAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuTkFWX1pPT01fSU47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkFWX1pPT01fT1VUICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5OQVZfWk9PTV9PVVQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkFWX1BBTl9VUCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuTkFWX1BBTl9VUDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOQVZfUEFOX1VQX1JJR0hUICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5OQVZfUEFOX1VQX1JJR0hUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5BVl9QQU5fUklHSFQgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLk5BVl9QQU5fUklHSFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkFWX1BBTl9ET1dOX1JJR0hUICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5OQVZfUEFOX0RPV05fUklHSFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkFWX1BBTl9ET1dOICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5OQVZfUEFOX0RPV047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkFWX1BBTl9ET1dOX0xFRlQgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLk5BVl9QQU5fRE9XTl9MRUZUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5BVl9QQU5fTEVGVCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuTkFWX1BBTl9MRUZUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5BVl9QQU5fVVBfTEVGVCAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuTkFWX1BBTl9VUF9MRUZUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHN1cHBvcnRlZCwgdGhpcyB0b2dnbGVzIGJldHdlZW4gYSB0b3AtZG93biB2aWV3IGFuZCBhbiBhbmdsZWQvM0Qgdmlldy4gSWYgeW91ciBhcHAgc3VwcG9ydHMgZGlmZmVyZW50LCBidXRcbiAgICAgKiBzdWJzdGFudGlhbGx5IHNpbWlsYXIgb3B0aW9ucywgdGhlbiB5b3UgbWF5IGltcGxlbWVudCB0aG9zZS4gSWYgeW91IGRvbid0IGltcGxlbWVudCB0aGVzZSBvciBzaW1pbGFyIG9wdGlvbnMsXG4gICAgICogZG8gbm90IHN1YnNjcmliZSB0byB0aGlzIGJ1dHRvbi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOQVZfVElMVF9UT0dHTEUgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fTUFQLk5BVl9USUxUX1RPR0dMRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOQVZfUk9UQVRFX0NMT0NLV0lTRSAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25OYW1lLl9NQVAuTkFWX1JPVEFURV9DTE9DS1dJU0U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkFWX1JPVEFURV9DT1VOVEVSQ0xPQ0tXSVNFICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5OQVZfUk9UQVRFX0NPVU5URVJDTE9DS1dJU0U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgc3VwcG9ydGVkLCB0aGlzIHRvZ2dsZXMgYmV0d2VlbiBsb2NraW5nIHRoZSBvcmllbnRhdGlvbiB0byBub3J0aCBvciB0byB0aGUgdmVoaWNsZSdzIGhlYWRpbmcuIElmIHlvdXIgYXBwXG4gICAgICogc3VwcG9ydHMgZGlmZmVyZW50LCBidXQgc3Vic3RhbnRpYWxseSBzaW1pbGFyIG9wdGlvbnMsIHRoZW4geW91IG1heSBpbXBsZW1lbnQgdGhvc2UuIElmIHlvdSBkb24ndCBpbXBsZW1lbnRcbiAgICAgKiB0aGVzZSBvciBzaW1pbGFyIG9wdGlvbnMsIGRvIG5vdCBzdWJzY3JpYmUgdG8gdGhpcyBidXR0b24uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTkFWX0hFQURJTkdfVE9HR0xFICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbk5hbWUuX01BUC5OQVZfSEVBRElOR19UT0dHTEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fdmFsdWVGb3JLZXkoa2V5LCBCdXR0b25OYW1lLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gQnV0dG9uTmFtZS5fa2V5Rm9yVmFsdWUodmFsdWUsIEJ1dHRvbk5hbWUuX01BUCk7XG4gICAgfVxufVxuXG5CdXR0b25OYW1lLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnT0snOiAnT0snLFxuICAgICdQTEFZX1BBVVNFJzogJ1BMQVlfUEFVU0UnLFxuICAgICdTRUVLTEVGVCc6ICdTRUVLTEVGVCcsXG4gICAgJ1NFRUtSSUdIVCc6ICdTRUVLUklHSFQnLFxuICAgICdUVU5FVVAnOiAnVFVORVVQJyxcbiAgICAnVFVORURPV04nOiAnVFVORURPV04nLFxuICAgICdQUkVTRVRfMCc6ICdQUkVTRVRfMCcsXG4gICAgJ1BSRVNFVF8xJzogJ1BSRVNFVF8xJyxcbiAgICAnUFJFU0VUXzInOiAnUFJFU0VUXzInLFxuICAgICdQUkVTRVRfMyc6ICdQUkVTRVRfMycsXG4gICAgJ1BSRVNFVF80JzogJ1BSRVNFVF80JyxcbiAgICAnUFJFU0VUXzUnOiAnUFJFU0VUXzUnLFxuICAgICdQUkVTRVRfNic6ICdQUkVTRVRfNicsXG4gICAgJ1BSRVNFVF83JzogJ1BSRVNFVF83JyxcbiAgICAnUFJFU0VUXzgnOiAnUFJFU0VUXzgnLFxuICAgICdQUkVTRVRfOSc6ICdQUkVTRVRfOScsXG4gICAgJ0NVU1RPTV9CVVRUT04nOiAnQ1VTVE9NX0JVVFRPTicsXG4gICAgJ1NFQVJDSCc6ICdTRUFSQ0gnLFxuICAgICdBQ19NQVgnOiAnQUNfTUFYJyxcbiAgICAnQUMnOiAnQUMnLFxuICAgICdSRUNJUkNVTEFURSc6ICdSRUNJUkNVTEFURScsXG4gICAgJ0ZBTl9VUCc6ICdGQU5fVVAnLFxuICAgICdGQU5fRE9XTic6ICdGQU5fRE9XTicsXG4gICAgJ1RFTVBfVVAnOiAnVEVNUF9VUCcsXG4gICAgJ1RFTVBfRE9XTic6ICdURU1QX0RPV04nLFxuICAgICdERUZST1NUX01BWCc6ICdERUZST1NUX01BWCcsXG4gICAgJ0RFRlJPU1QnOiAnREVGUk9TVCcsXG4gICAgJ0RFRlJPU1RfUkVBUic6ICdERUZST1NUX1JFQVInLFxuICAgICdVUFBFUl9WRU5UJzogJ1VQUEVSX1ZFTlQnLFxuICAgICdMT1dFUl9WRU5UJzogJ0xPV0VSX1ZFTlQnLFxuICAgICdWT0xVTUVfVVAnOiAnVk9MVU1FX1VQJyxcbiAgICAnVk9MVU1FX0RPV04nOiAnVk9MVU1FX0RPV04nLFxuICAgICdFSkVDVCc6ICdFSkVDVCcsXG4gICAgJ1NPVVJDRSc6ICdTT1VSQ0UnLFxuICAgICdTSFVGRkxFJzogJ1NIVUZGTEUnLFxuICAgICdSRVBFQVQnOiAnUkVQRUFUJyxcbiAgICAnTkFWX0NFTlRFUl9MT0NBVElPTic6ICdOQVZfQ0VOVEVSX0xPQ0FUSU9OJyxcbiAgICAnTkFWX1pPT01fSU4nOiAnTkFWX1pPT01fSU4nLFxuICAgICdOQVZfWk9PTV9PVVQnOiAnTkFWX1pPT01fT1VUJyxcbiAgICAnTkFWX1BBTl9VUCc6ICdOQVZfUEFOX1VQJyxcbiAgICAnTkFWX1BBTl9VUF9SSUdIVCc6ICdOQVZfUEFOX1VQX1JJR0hUJyxcbiAgICAnTkFWX1BBTl9SSUdIVCc6ICdOQVZfUEFOX1JJR0hUJyxcbiAgICAnTkFWX1BBTl9ET1dOX1JJR0hUJzogJ05BVl9QQU5fRE9XTl9SSUdIVCcsXG4gICAgJ05BVl9QQU5fRE9XTic6ICdOQVZfUEFOX0RPV04nLFxuICAgICdOQVZfUEFOX0RPV05fTEVGVCc6ICdOQVZfUEFOX0RPV05fTEVGVCcsXG4gICAgJ05BVl9QQU5fTEVGVCc6ICdOQVZfUEFOX0xFRlQnLFxuICAgICdOQVZfUEFOX1VQX0xFRlQnOiAnTkFWX1BBTl9VUF9MRUZUJyxcbiAgICAnTkFWX1RJTFRfVE9HR0xFJzogJ05BVl9USUxUX1RPR0dMRScsXG4gICAgJ05BVl9ST1RBVEVfQ0xPQ0tXSVNFJzogJ05BVl9ST1RBVEVfQ0xPQ0tXSVNFJyxcbiAgICAnTkFWX1JPVEFURV9DT1VOVEVSQ0xPQ0tXSVNFJzogJ05BVl9ST1RBVEVfQ09VTlRFUkNMT0NLV0lTRScsXG4gICAgJ05BVl9IRUFESU5HX1RPR0dMRSc6ICdOQVZfSEVBRElOR19UT0dHTEUnLFxufSk7XG5cbmV4cG9ydCB7IEJ1dHRvbk5hbWUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG4vKipcbiAqIERlc2NyaWJlcyBhIGxvY2F0aW9uIChvcmlnaW4gY29vcmRpbmF0ZXMgYW5kIHNwYW4pIG9mIGEgdmVoaWNsZSBjb21wb25lbnQuXG4gKi9cbmNsYXNzIEdyaWQgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjb2xcbiAgICAgKiBAcmV0dXJuIHtHcmlkfVxuICAgICAqL1xuICAgIHNldENvbHVtbiAoY29sKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdyaWQuS0VZX0NPTFVNTiwgY29sKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldENvbHVtbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHcmlkLktFWV9DT0xVTU4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSByb3dcbiAgICAgKiBAcmV0dXJuIHtHcmlkfVxuICAgICAqL1xuICAgIHNldFJvdyAocm93KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdyaWQuS0VZX1JPVywgcm93KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFJvdyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHcmlkLktFWV9ST1cpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbFxuICAgICAqIEByZXR1cm4ge0dyaWR9XG4gICAgICovXG4gICAgc2V0TGV2ZWwgKGxldmVsKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdyaWQuS0VZX0xFVkVMLCBsZXZlbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRMZXZlbCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHcmlkLktFWV9MRVZFTCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGNvbHNwYW5cbiAgICAgKiBAcmV0dXJuIHtHcmlkfVxuICAgICAqL1xuICAgIHNldENvbHVtblNwYW4gKGNvbHNwYW4pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR3JpZC5LRVlfQ09MVU1OX1NQQU4sIGNvbHNwYW4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0Q29sdW1uU3BhbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHcmlkLktFWV9DT0xVTU5fU1BBTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJvd3NwYW5cbiAgICAgKiBAcmV0dXJuIHtHcmlkfVxuICAgICAqL1xuICAgIHNldFJvd1NwYW4gKHJvd3NwYW4pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR3JpZC5LRVlfUk9XX1NQQU4sIHJvd3NwYW4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0Um93U3BhbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHcmlkLktFWV9ST1dfU1BBTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxldmVsc3BhblxuICAgICAqIEByZXR1cm4ge0dyaWR9XG4gICAgICovXG4gICAgc2V0TGV2ZWxTcGFuIChsZXZlbHNwYW4pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR3JpZC5LRVlfTEVWRUxfU1BBTiwgbGV2ZWxzcGFuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldExldmVsU3BhbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHcmlkLktFWV9MRVZFTF9TUEFOKTtcbiAgICB9XG59XG5cbkdyaWQuS0VZX0NPTFVNTiA9ICdjb2wnO1xuR3JpZC5LRVlfUk9XID0gJ3Jvdyc7XG5HcmlkLktFWV9MRVZFTCA9ICdsZXZlbCc7XG5HcmlkLktFWV9DT0xVTU5fU1BBTiA9ICdjb2xzcGFuJztcbkdyaWQuS0VZX1JPV19TUEFOID0gJ3Jvd3NwYW4nO1xuR3JpZC5LRVlfTEVWRUxfU1BBTiA9ICdsZXZlbHNwYW4nO1xuXG5leHBvcnQgeyBHcmlkIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IEdyaWQgfSBmcm9tICcuL0dyaWQuanMnO1xuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IGEgUkMgbW9kdWxlXG4gKi9cbmNsYXNzIE1vZHVsZUluZm8gZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIHV1aWQgb2YgYSBtb2R1bGUuIFwibW9kdWxlSWQgKyBtb2R1bGVUeXBlXCIgdW5pcXVlbHkgaWRlbnRpZnkgYSBtb2R1bGUuXG4gICAgICogQHJldHVybiB7TW9kdWxlSW5mb31cbiAgICAgKi9cbiAgICBzZXRNb2R1bGVJZCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTW9kdWxlSW5mby5LRVlfTU9EVUxFX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRNb2R1bGVJZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihNb2R1bGVJbmZvLktFWV9NT0RVTEVfSUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7R3JpZH0gbG9jYXRpb24gLSBMb2NhdGlvbiBvZiBhIG1vZHVsZS5cbiAgICAgKiBAcmV0dXJuIHtNb2R1bGVJbmZvfVxuICAgICAqL1xuICAgIHNldExvY2F0aW9uIChsb2NhdGlvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShHcmlkLCBsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE1vZHVsZUluZm8uS0VZX0xPQ0FUSU9OLCBsb2NhdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0dyaWR9XG4gICAgICovXG4gICAgZ2V0TG9jYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoR3JpZCwgTW9kdWxlSW5mby5LRVlfTE9DQVRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7R3JpZH0gYXJlYSAtIFNlcnZpY2UgYXJlYSBvZiBhIG1vZHVsZS5cbiAgICAgKiBAcmV0dXJuIHtNb2R1bGVJbmZvfVxuICAgICAqL1xuICAgIHNldFNlcnZpY2VBcmVhIChhcmVhKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEdyaWQsIGFyZWEpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihNb2R1bGVJbmZvLktFWV9TRVJWSUNFX0FSRUEsIGFyZWEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtHcmlkfVxuICAgICAqL1xuICAgIGdldFNlcnZpY2VBcmVhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEdyaWQsIE1vZHVsZUluZm8uS0VZX1NFUlZJQ0VfQVJFQSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhY2Nlc3MgLSBhbGxvdyBtdWx0aXBsZSB1c2Vycy9hcHBzIHRvIGFjY2VzcyB0aGUgbW9kdWxlIG9yIG5vdFxuICAgICAqIEByZXR1cm4ge01vZHVsZUluZm99XG4gICAgICovXG4gICAgc2V0QWxsb3dNdWx0aXBsZUFjY2VzcyAoYWNjZXNzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE1vZHVsZUluZm8uS0VZX0FMTE9XX01VTFRJUExFX0FDQ0VTUywgYWNjZXNzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRBbGxvd011bHRpcGxlQWNjZXNzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE1vZHVsZUluZm8uS0VZX0FMTE9XX01VTFRJUExFX0FDQ0VTUyk7XG4gICAgfVxufVxuXG5Nb2R1bGVJbmZvLktFWV9NT0RVTEVfSUQgPSAnbW9kdWxlSWQnO1xuTW9kdWxlSW5mby5LRVlfTE9DQVRJT04gPSAnbG9jYXRpb24nO1xuTW9kdWxlSW5mby5LRVlfU0VSVklDRV9BUkVBID0gJ3NlcnZpY2VBcmVhJztcbk1vZHVsZUluZm8uS0VZX0FMTE9XX01VTFRJUExFX0FDQ0VTUyA9ICdhbGxvd011bHRpcGxlQWNjZXNzJztcblxuZXhwb3J0IHsgTW9kdWxlSW5mbyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBCdXR0b25OYW1lIH0gZnJvbSAnLi4vZW51bXMvQnV0dG9uTmFtZS5qcyc7XG5pbXBvcnQgeyBNb2R1bGVJbmZvIH0gZnJvbSAnLi9Nb2R1bGVJbmZvLmpzJztcblxuLyoqXG4gKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGJ1dHRvbidzIGNhcGFiaWxpdGllcy5cbiAqL1xuY2xhc3MgQnV0dG9uQ2FwYWJpbGl0aWVzIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0J1dHRvbk5hbWV9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYnV0dG9uLiBTZWUgQnV0dG9uTmFtZS5cbiAgICAgKiBAcmV0dXJuIHtCdXR0b25DYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0TmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShCdXR0b25OYW1lLCBuYW1lKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9OQU1FLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QnV0dG9uTmFtZX1cbiAgICAgKi9cbiAgICBnZXROYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEJ1dHRvbk5hbWUsIEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfTkFNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNb2R1bGVJbmZvfSBpbmZvIC0gSW5mb3JtYXRpb24gYWJvdXQgYSBSQyBtb2R1bGUsIGluY2x1ZGluZyBpdHMgaWQuXG4gICAgICogQHJldHVybiB7QnV0dG9uQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldE1vZHVsZUluZm8gKGluZm8pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTW9kdWxlSW5mbywgaW5mbyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfTU9EVUxFX0lORk8sIGluZm8pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNb2R1bGVJbmZvfVxuICAgICAqL1xuICAgIGdldE1vZHVsZUluZm8gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTW9kdWxlSW5mbywgQnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9NT0RVTEVfSU5GTyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGUgLSBUaGUgYnV0dG9uIHN1cHBvcnRzIGEgc2hvcnQgcHJlc3MuIFdoZW5ldmVyIHRoZSBidXR0b24gaXMgcHJlc3NlZCBzaG9ydCxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQnV0dG9uUHJlc3NlZCggU0hPUlQpIHdpbGwgYmUgaW52b2tlZC5cbiAgICAgKiBAcmV0dXJuIHtCdXR0b25DYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0U2hvcnRQcmVzc0F2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfU0hPUlRfUFJFU1NfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFNob3J0UHJlc3NBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9TSE9SVF9QUkVTU19BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlIC0gVGhlIGJ1dHRvbiBzdXBwb3J0cyBhIExPTkcgcHJlc3MuIFdoZW5ldmVyIHRoZSBidXR0b24gaXMgcHJlc3NlZCBsb25nLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25CdXR0b25QcmVzc2VkKCBMT05HKSB3aWxsIGJlIGludm9rZWQuXG4gICAgICogQHJldHVybiB7QnV0dG9uQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldExvbmdQcmVzc0F2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfTE9OR19QUkVTU19BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0TG9uZ1ByZXNzQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfTE9OR19QUkVTU19BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlIC0gVGhlIGJ1dHRvbiBzdXBwb3J0cyBcImJ1dHRvbiBkb3duXCIgYW5kIFwiYnV0dG9uIHVwXCIuIFdoZW5ldmVyIHRoZSBidXR0b24gaXMgcHJlc3NlZCxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQnV0dG9uRXZlbnQoIERPV04pIHdpbGwgYmUgaW52b2tlZC4gV2hlbmV2ZXIgdGhlIGJ1dHRvbiBpcyByZWxlYXNlZCxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQnV0dG9uRXZlbnQoIFVQKSB3aWxsIGJlIGludm9rZWQuXG4gICAgICogQHJldHVybiB7QnV0dG9uQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldFVwRG93bkF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfVVBfRE9XTl9BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0VXBEb3duQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfVVBfRE9XTl9BVkFJTEFCTEUpO1xuICAgIH1cbn1cblxuQnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9OQU1FID0gJ25hbWUnO1xuQnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9NT0RVTEVfSU5GTyA9ICdtb2R1bGVJbmZvJztcbkJ1dHRvbkNhcGFiaWxpdGllcy5LRVlfU0hPUlRfUFJFU1NfQVZBSUxBQkxFID0gJ3Nob3J0UHJlc3NBdmFpbGFibGUnO1xuQnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9MT05HX1BSRVNTX0FWQUlMQUJMRSA9ICdsb25nUHJlc3NBdmFpbGFibGUnO1xuQnV0dG9uQ2FwYWJpbGl0aWVzLktFWV9VUF9ET1dOX0FWQUlMQUJMRSA9ICd1cERvd25BdmFpbGFibGUnO1xuXG5leHBvcnQgeyBCdXR0b25DYXBhYmlsaXRpZXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG5jbGFzcyBITUlDYXBhYmlsaXRpZXMgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbmF2aWdhdGlvbiAtIEF2YWlsYWJpbGl0eSBvZiBidWlsZCBpbiBOYXYuIFRydWU6IEF2YWlsYWJsZSwgRmFsc2U6IE5vdCBBdmFpbGFibGVcbiAgICAgKiBAcmV0dXJuIHtITUlDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0TmF2aWdhdGlvbiAobmF2aWdhdGlvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihITUlDYXBhYmlsaXRpZXMuS0VZX05BVklHQVRJT04sIG5hdmlnYXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldE5hdmlnYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoSE1JQ2FwYWJpbGl0aWVzLktFWV9OQVZJR0FUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNhbGwgLSBBdmFpbGFiaWxpdHkgb2YgYnVpbGQgaW4gcGhvbmUuIFRydWU6IEF2YWlsYWJsZSwgRmFsc2U6IE5vdCBBdmFpbGFibGVcbiAgICAgKiBAcmV0dXJuIHtITUlDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0UGhvbmVDYWxsIChjYWxsKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEhNSUNhcGFiaWxpdGllcy5LRVlfUEhPTkVfQ0FMTCwgY2FsbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0UGhvbmVDYWxsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEhNSUNhcGFiaWxpdGllcy5LRVlfUEhPTkVfQ0FMTCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzdHJlYW1pbmcgLSBBdmFpbGFiaWxpdHkgb2YgdmlkZW8gc3RyZWFtaW5nLlxuICAgICAqIEByZXR1cm4ge0hNSUNhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRWaWRlb1N0cmVhbWluZyAoc3RyZWFtaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEhNSUNhcGFiaWxpdGllcy5LRVlfVklERU9fU1RSRUFNSU5HLCBzdHJlYW1pbmcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFZpZGVvU3RyZWFtaW5nICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEhNSUNhcGFiaWxpdGllcy5LRVlfVklERU9fU1RSRUFNSU5HKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvbnRyb2wgLSBBdmFpbGFiaWxpdHkgb2YgcmVtb3RlIGNvbnRyb2wgZmVhdHVyZS4gVHJ1ZTogQXZhaWxhYmxlLCBGYWxzZTogTm90IEF2YWlsYWJsZVxuICAgICAqIEByZXR1cm4ge0hNSUNhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRSZW1vdGVDb250cm9sIChjb250cm9sKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEhNSUNhcGFiaWxpdGllcy5LRVlfUkVNT1RFX0NPTlRST0wsIGNvbnRyb2wpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFJlbW90ZUNvbnRyb2wgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoSE1JQ2FwYWJpbGl0aWVzLktFWV9SRU1PVEVfQ09OVFJPTCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzZXJ2aWNlcyAtIEF2YWlsYWJpbGl0eSBvZiBBcHAgU2VydmljZXMgZnVuY3Rpb25hbGl0eS4gVHJ1ZTogQXZhaWxhYmxlLCBGYWxzZTogTm90IEF2YWlsYWJsZVxuICAgICAqIEByZXR1cm4ge0hNSUNhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRBcHBTZXJ2aWNlcyAoc2VydmljZXMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSE1JQ2FwYWJpbGl0aWVzLktFWV9BUFBfU0VSVklDRVMsIHNlcnZpY2VzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRBcHBTZXJ2aWNlcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihITUlDYXBhYmlsaXRpZXMuS0VZX0FQUF9TRVJWSUNFUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBkaXNwbGF5cyAtIEF2YWlsYWJpbGl0eSBvZiBkaXNwbGF5cyBjYXBhYmlsaXR5LiBUcnVlOiBBdmFpbGFibGUsIEZhbHNlOiBOb3QgQXZhaWxhYmxlXG4gICAgICogQHJldHVybiB7SE1JQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldERpc3BsYXlzIChkaXNwbGF5cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihITUlDYXBhYmlsaXRpZXMuS0VZX0RJU1BMQVlTLCBkaXNwbGF5cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RGlzcGxheXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoSE1JQ2FwYWJpbGl0aWVzLktFWV9ESVNQTEFZUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBsb2NhdGlvbiAtIEF2YWlsYWJpbGl0eSBvZiBzZWF0IGxvY2F0aW9uIGZlYXR1cmUuIFRydWU6IEF2YWlsYWJsZSwgRmFsc2U6IE5vdCBBdmFpbGFibGVcbiAgICAgKiBAcmV0dXJuIHtITUlDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0U2VhdExvY2F0aW9uIChsb2NhdGlvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihITUlDYXBhYmlsaXRpZXMuS0VZX1NFQVRfTE9DQVRJT04sIGxvY2F0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRTZWF0TG9jYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoSE1JQ2FwYWJpbGl0aWVzLktFWV9TRUFUX0xPQ0FUSU9OKTtcbiAgICB9XG59XG5cbkhNSUNhcGFiaWxpdGllcy5LRVlfTkFWSUdBVElPTiA9ICduYXZpZ2F0aW9uJztcbkhNSUNhcGFiaWxpdGllcy5LRVlfUEhPTkVfQ0FMTCA9ICdwaG9uZUNhbGwnO1xuSE1JQ2FwYWJpbGl0aWVzLktFWV9WSURFT19TVFJFQU1JTkcgPSAndmlkZW9TdHJlYW1pbmcnO1xuSE1JQ2FwYWJpbGl0aWVzLktFWV9SRU1PVEVfQ09OVFJPTCA9ICdyZW1vdGVDb250cm9sJztcbkhNSUNhcGFiaWxpdGllcy5LRVlfQVBQX1NFUlZJQ0VTID0gJ2FwcFNlcnZpY2VzJztcbkhNSUNhcGFiaWxpdGllcy5LRVlfRElTUExBWVMgPSAnZGlzcGxheXMnO1xuSE1JQ2FwYWJpbGl0aWVzLktFWV9TRUFUX0xPQ0FUSU9OID0gJ3NlYXRMb2NhdGlvbic7XG5cbmV4cG9ydCB7IEhNSUNhcGFiaWxpdGllcyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFNvZnRCdXR0b25DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9zdHJ1Y3RzL1NvZnRCdXR0b25DYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgUnBjUmVzcG9uc2UgfSBmcm9tICcuLi9ScGNSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBTZGxNc2dWZXJzaW9uIH0gZnJvbSAnLi4vc3RydWN0cy9TZGxNc2dWZXJzaW9uLmpzJztcbmltcG9ydCB7IFByZXJlY29yZGVkU3BlZWNoIH0gZnJvbSAnLi4vZW51bXMvUHJlcmVjb3JkZWRTcGVlY2guanMnO1xuaW1wb3J0IHsgU3BlZWNoQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vZW51bXMvU3BlZWNoQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IFByZXNldEJhbmtDYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9zdHJ1Y3RzL1ByZXNldEJhbmtDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgVmVoaWNsZVR5cGUgfSBmcm9tICcuLi9zdHJ1Y3RzL1ZlaGljbGVUeXBlLmpzJztcbmltcG9ydCB7IEhtaVpvbmVDYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9lbnVtcy9IbWlab25lQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IERpc3BsYXlDYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9zdHJ1Y3RzL0Rpc3BsYXlDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgTGFuZ3VhZ2UgfSBmcm9tICcuLi9lbnVtcy9MYW5ndWFnZS5qcyc7XG5pbXBvcnQgeyBBdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vc3RydWN0cy9BdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IFZyQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vZW51bXMvVnJDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgQnV0dG9uQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vc3RydWN0cy9CdXR0b25DYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgSE1JQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vc3RydWN0cy9ITUlDYXBhYmlsaXRpZXMuanMnO1xuXG4vKipcbiAqIFRoZSByZXNwb25zZSB0byByZWdpc3RlckFwcEludGVyZmFjZVxuICovXG5jbGFzcyBSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuUmVnaXN0ZXJBcHBJbnRlcmZhY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2RsTXNnVmVyc2lvbn0gdmVyc2lvbiAtIFNlZSBTeW5jTXNnVmVyc2lvblxuICAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0U2RsTXNnVmVyc2lvbiAodmVyc2lvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTZGxNc2dWZXJzaW9uLCB2ZXJzaW9uKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfU0RMX01TR19WRVJTSU9OLCB2ZXJzaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U2RsTXNnVmVyc2lvbn1cbiAgICAgKi9cbiAgICBnZXRTZGxNc2dWZXJzaW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFNkbE1zZ1ZlcnNpb24sIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1NETF9NU0dfVkVSU0lPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUaGUgY3VycmVudGx5IGFjdGl2ZSBWUitUVFMgbGFuZ3VhZ2Ugb24gdGhlIG1vZHVsZS4gU2VlIFwiTGFuZ3VhZ2VcIiBmb3Igb3B0aW9ucy5cbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldExhbmd1YWdlIChsYW5ndWFnZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShMYW5ndWFnZSwgbGFuZ3VhZ2UpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9MQU5HVUFHRSwgbGFuZ3VhZ2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtMYW5ndWFnZX1cbiAgICAgKi9cbiAgICBnZXRMYW5ndWFnZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChMYW5ndWFnZSwgUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfTEFOR1VBR0UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGhlIGN1cnJlbnRseSBhY3RpdmUgZGlzcGxheSBsYW5ndWFnZSBvbiB0aGUgbW9kdWxlLiBTZWUgXCJMYW5ndWFnZVwiIGZvciBvcHRpb25zLlxuICAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0SG1pRGlzcGxheUxhbmd1YWdlIChsYW5ndWFnZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShMYW5ndWFnZSwgbGFuZ3VhZ2UpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9ITUlfRElTUExBWV9MQU5HVUFHRSwgbGFuZ3VhZ2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtMYW5ndWFnZX1cbiAgICAgKi9cbiAgICBnZXRIbWlEaXNwbGF5TGFuZ3VhZ2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTGFuZ3VhZ2UsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0hNSV9ESVNQTEFZX0xBTkdVQUdFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Rpc3BsYXlDYXBhYmlsaXRpZXN9IGNhcGFiaWxpdGllcyAtIFNlZSBEaXNwbGF5Q2FwYWJpbGl0aWVzLiBUaGlzIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtQ2FwYWJpbGl0eSB1c2luZyBESVNQTEFZUy5cbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldERpc3BsYXlDYXBhYmlsaXRpZXMgKGNhcGFiaWxpdGllcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShEaXNwbGF5Q2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9ESVNQTEFZX0NBUEFCSUxJVElFUywgY2FwYWJpbGl0aWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7RGlzcGxheUNhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBnZXREaXNwbGF5Q2FwYWJpbGl0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KERpc3BsYXlDYXBhYmlsaXRpZXMsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0RJU1BMQVlfQ0FQQUJJTElUSUVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0J1dHRvbkNhcGFiaWxpdGllc1tdfSBjYXBhYmlsaXRpZXMgLSBTZWUgQnV0dG9uQ2FwYWJpbGl0aWVzLiBUaGlzIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbUNhcGFiaWxpdHkgdXNpbmcgRElTUExBWVMuXG4gICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRCdXR0b25DYXBhYmlsaXRpZXMgKGNhcGFiaWxpdGllcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShCdXR0b25DYXBhYmlsaXRpZXMsIGNhcGFiaWxpdGllcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0JVVFRPTl9DQVBBQklMSVRJRVMsIGNhcGFiaWxpdGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0J1dHRvbkNhcGFiaWxpdGllc1tdfVxuICAgICAqL1xuICAgIGdldEJ1dHRvbkNhcGFiaWxpdGllcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChCdXR0b25DYXBhYmlsaXRpZXMsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0JVVFRPTl9DQVBBQklMSVRJRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U29mdEJ1dHRvbkNhcGFiaWxpdGllc1tdfSBjYXBhYmlsaXRpZXMgLSBJZiByZXR1cm5lZCwgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIG9uLXNjcmVlbiBTb2Z0QnV0dG9uczsgc2VlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvZnRCdXR0b25DYXBhYmlsaXRpZXMuIFRoaXMgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgYW5kXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGJ5IFN5c3RlbUNhcGFiaWxpdHkgdXNpbmcgRElTUExBWVMuXG4gICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzIChjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU29mdEJ1dHRvbkNhcGFiaWxpdGllcywgY2FwYWJpbGl0aWVzLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfU09GVF9CVVRUT05fQ0FQQUJJTElUSUVTLCBjYXBhYmlsaXRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzW119XG4gICAgICovXG4gICAgZ2V0U29mdEJ1dHRvbkNhcGFiaWxpdGllcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLCBSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TT0ZUX0JVVFRPTl9DQVBBQklMSVRJRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7UHJlc2V0QmFua0NhcGFiaWxpdGllc30gY2FwYWJpbGl0aWVzIC0gSWYgcmV0dXJuZWQsIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cyBjdXN0b20gb24tc2NyZWVuIFByZXNldHM7IHNlZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlc2V0QmFua0NhcGFiaWxpdGllcy4gVGhpcyBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBhbmQgcmVwbGFjZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IFN5c3RlbUNhcGFiaWxpdHkgdXNpbmcgRElTUExBWVMuXG4gICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzIChjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoUHJlc2V0QmFua0NhcGFiaWxpdGllcywgY2FwYWJpbGl0aWVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfUFJFU0VUX0JBTktfQ0FQQUJJTElUSUVTLCBjYXBhYmlsaXRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIGdldFByZXNldEJhbmtDYXBhYmlsaXRpZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoUHJlc2V0QmFua0NhcGFiaWxpdGllcywgUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfUFJFU0VUX0JBTktfQ0FQQUJJTElUSUVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0htaVpvbmVDYXBhYmlsaXRpZXNbXX0gY2FwYWJpbGl0aWVzIC0gU2VlIEhtaVpvbmVDYXBhYmlsaXRpZXNcbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEhtaVpvbmVDYXBhYmlsaXRpZXMgKGNhcGFiaWxpdGllcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShIbWlab25lQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9ITUlfWk9ORV9DQVBBQklMSVRJRVMsIGNhcGFiaWxpdGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0htaVpvbmVDYXBhYmlsaXRpZXNbXX1cbiAgICAgKi9cbiAgICBnZXRIbWlab25lQ2FwYWJpbGl0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEhtaVpvbmVDYXBhYmlsaXRpZXMsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0hNSV9aT05FX0NBUEFCSUxJVElFUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTcGVlY2hDYXBhYmlsaXRpZXNbXX0gY2FwYWJpbGl0aWVzIC0gU2VlIFNwZWVjaENhcGFiaWxpdGllc1xuICAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0U3BlZWNoQ2FwYWJpbGl0aWVzIChjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU3BlZWNoQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TUEVFQ0hfQ0FQQUJJTElUSUVTLCBjYXBhYmlsaXRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTcGVlY2hDYXBhYmlsaXRpZXNbXX1cbiAgICAgKi9cbiAgICBnZXRTcGVlY2hDYXBhYmlsaXRpZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoU3BlZWNoQ2FwYWJpbGl0aWVzLCBSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TUEVFQ0hfQ0FQQUJJTElUSUVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ByZXJlY29yZGVkU3BlZWNoW119IHNwZWVjaCAtIFNlZSBQcmVyZWNvcmRlZFNwZWVjaFxuICAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0UHJlcmVjb3JkZWRTcGVlY2ggKHNwZWVjaCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShQcmVyZWNvcmRlZFNwZWVjaCwgc3BlZWNoLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfUFJFUkVDT1JERURfU1BFRUNILCBzcGVlY2gpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtQcmVyZWNvcmRlZFNwZWVjaFtdfVxuICAgICAqL1xuICAgIGdldFByZXJlY29yZGVkU3BlZWNoICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFByZXJlY29yZGVkU3BlZWNoLCBSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9QUkVSRUNPUkRFRF9TUEVFQ0gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VnJDYXBhYmlsaXRpZXNbXX0gY2FwYWJpbGl0aWVzIC0gU2VlIFZyQ2FwYWJpbGl0aWVzXG4gICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRWckNhcGFiaWxpdGllcyAoY2FwYWJpbGl0aWVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZyQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9WUl9DQVBBQklMSVRJRVMsIGNhcGFiaWxpdGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZyQ2FwYWJpbGl0aWVzW119XG4gICAgICovXG4gICAgZ2V0VnJDYXBhYmlsaXRpZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVnJDYXBhYmlsaXRpZXMsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1ZSX0NBUEFCSUxJVElFUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzW119IGNhcGFiaWxpdGllcyAtIFNlZSBBdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0eVxuICAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0QXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcyAoY2FwYWJpbGl0aWVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEF1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXMsIGNhcGFiaWxpdGllcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0FVRElPX1BBU1NfVEhSVV9DQVBBQklMSVRJRVMsIGNhcGFiaWxpdGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0F1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXNbXX1cbiAgICAgKi9cbiAgICBnZXRBdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEF1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXMsIFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0FVRElPX1BBU1NfVEhSVV9DQVBBQklMSVRJRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXVkaW9QYXNzVGhydUNhcGFiaWxpdGllc30gY2FwYWJpbGl0aWVzIC0gU2VlIEF1ZGlvUGFzc1RocnVDYXBhYmlsaXR5XG4gICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRQY21TdHJlYW1DYXBhYmlsaXRpZXMgKGNhcGFiaWxpdGllcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShBdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9QQ01fU1RSRUFNX0NBUEFCSUxJVElFUywgY2FwYWJpbGl0aWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QXVkaW9QYXNzVGhydUNhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBnZXRQY21TdHJlYW1DYXBhYmlsaXRpZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcywgUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfUENNX1NUUkVBTV9DQVBBQklMSVRJRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZVR5cGV9IHR5cGUgLSBTcGVjaWZpZXMgdGhlIHZlaGljbGUncyB0eXBlLiBTZWUgVmVoaWNsZVR5cGUuXG4gICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRWZWhpY2xlVHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlVHlwZSwgdHlwZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1ZFSElDTEVfVFlQRSwgdHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVUeXBlfVxuICAgICAqL1xuICAgIGdldFZlaGljbGVUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVUeXBlLCBSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9WRUhJQ0xFX1RZUEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyW119IG1vZGVzIC0gU3BlY2lmaWVzIHRoZSB3aGl0ZS1saXN0IG9mIHN1cHBvcnRlZCBkaWFnbm9zdGljIG1vZGVzICgweDAwLTB4RkYpIGNhcGFibGUgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljTWVzc2FnZSByZXF1ZXN0cy4gSWYgYSBtb2RlIG91dHNpZGUgdGhpcyBsaXN0IGlzIHJlcXVlc3RlZCwgaXQgd2lsbCBiZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0ZWQuXG4gICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRTdXBwb3J0ZWREaWFnTW9kZXMgKG1vZGVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1NVUFBPUlRFRF9ESUFHX01PREVTLCBtb2Rlcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcltdfVxuICAgICAqL1xuICAgIGdldFN1cHBvcnRlZERpYWdNb2RlcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TVVBQT1JURURfRElBR19NT0RFUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtITUlDYXBhYmlsaXRpZXN9IGNhcGFiaWxpdGllcyAtIFNwZWNpZmllcyB0aGUgSE1JJ3MgY2FwYWJpbGl0aWVzLiBTZWUgSE1JQ2FwYWJpbGl0aWVzLlxuICAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0SG1pQ2FwYWJpbGl0aWVzIChjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSE1JQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9ITUlfQ0FQQUJJTElUSUVTLCBjYXBhYmlsaXRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtITUlDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgZ2V0SG1pQ2FwYWJpbGl0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEhNSUNhcGFiaWxpdGllcywgUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfSE1JX0NBUEFCSUxJVElFUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHZlcnNpb24gLSBUaGUgU21hcnREZXZpY2VMaW5rIHZlcnNpb24uXG4gICAgICogQHJldHVybiB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRTZGxWZXJzaW9uICh2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1NETF9WRVJTSU9OLCB2ZXJzaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFNkbFZlcnNpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfU0RMX1ZFUlNJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2ZXJzaW9uIC0gVGhlIHNvZnR3YXJlIHZlcnNpb24gb2YgdGhlIHN5c3RlbSB0aGF0IGltcGxlbWVudHMgdGhlIFNtYXJ0RGV2aWNlTGluayBjb3JlLlxuICAgICAqIEByZXR1cm4ge1JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0U3lzdGVtU29mdHdhcmVWZXJzaW9uICh2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1NZU1RFTV9TT0ZUV0FSRV9WRVJTSU9OLCB2ZXJzaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFN5c3RlbVNvZnR3YXJlVmVyc2lvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TWVNURU1fU09GVFdBUkVfVkVSU0lPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSByZXN1bWVkIC0gRXhpc3RlbmNlIG9mIGFwcHMgaWNvbiBhdCBzeXN0ZW0uIElmIHRydWUsIGFwcHMgaWNvbiB3YXMgcmVzdW1lZCBhdCBzeXN0ZW0uIElmIGZhbHNlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcHMgaWNvbiBpcyBub3QgcmVzdW1lZCBhdCBzeXN0ZW1cbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEljb25SZXN1bWVkIChyZXN1bWVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0lDT05fUkVTVU1FRCwgcmVzdW1lZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0SWNvblJlc3VtZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfSUNPTl9SRVNVTUVEKTtcbiAgICB9XG59XG5cblJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1NETF9NU0dfVkVSU0lPTiA9ICdzeW5jTXNnVmVyc2lvbic7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9MQU5HVUFHRSA9ICdsYW5ndWFnZSc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9ITUlfRElTUExBWV9MQU5HVUFHRSA9ICdobWlEaXNwbGF5TGFuZ3VhZ2UnO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfRElTUExBWV9DQVBBQklMSVRJRVMgPSAnZGlzcGxheUNhcGFiaWxpdGllcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9CVVRUT05fQ0FQQUJJTElUSUVTID0gJ2J1dHRvbkNhcGFiaWxpdGllcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TT0ZUX0JVVFRPTl9DQVBBQklMSVRJRVMgPSAnc29mdEJ1dHRvbkNhcGFiaWxpdGllcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9QUkVTRVRfQkFOS19DQVBBQklMSVRJRVMgPSAncHJlc2V0QmFua0NhcGFiaWxpdGllcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9ITUlfWk9ORV9DQVBBQklMSVRJRVMgPSAnaG1pWm9uZUNhcGFiaWxpdGllcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TUEVFQ0hfQ0FQQUJJTElUSUVTID0gJ3NwZWVjaENhcGFiaWxpdGllcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9QUkVSRUNPUkRFRF9TUEVFQ0ggPSAncHJlcmVjb3JkZWRTcGVlY2gnO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfVlJfQ0FQQUJJTElUSUVTID0gJ3ZyQ2FwYWJpbGl0aWVzJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX0FVRElPX1BBU1NfVEhSVV9DQVBBQklMSVRJRVMgPSAnYXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9QQ01fU1RSRUFNX0NBUEFCSUxJVElFUyA9ICdwY21TdHJlYW1DYXBhYmlsaXRpZXMnO1xuUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5LRVlfVkVISUNMRV9UWVBFID0gJ3ZlaGljbGVUeXBlJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1NVUFBPUlRFRF9ESUFHX01PREVTID0gJ3N1cHBvcnRlZERpYWdNb2Rlcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9ITUlfQ0FQQUJJTElUSUVTID0gJ2htaUNhcGFiaWxpdGllcyc7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9TRExfVkVSU0lPTiA9ICdzZGxWZXJzaW9uJztcblJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuS0VZX1NZU1RFTV9TT0ZUV0FSRV9WRVJTSU9OID0gJ3N5c3RlbVNvZnR3YXJlVmVyc2lvbic7XG5SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLktFWV9JQ09OX1JFU1VNRUQgPSAnaWNvblJlc3VtZWQnO1xuXG5leHBvcnQgeyBSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG4vKipcbiAqIENsb3NlcyBhbiBpbnRlcmZhY2UgZnJvbSBhIG1vYmlsZSBhcHBsaWNhdGlvbi4gQWZ0ZXIgdW5yZWdpc3RlckFwcEludGVyZmFjZSwgbm8gY29tbWFuZHMgb3RoZXIgdGhhblxuICogcmVnaXN0ZXJBcHBJbnRlcmZhY2Ugd2lsbCBiZSBhY2NlcHRlZC9leGVjdXRlZC4gV2lsbCBmYWlsLCBpZiBubyByZWdpc3RlckFwcEludGVyZmFjZSB3YXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuICogYmVmb3JlLlxuICovXG5jbGFzcyBVbnJlZ2lzdGVyQXBwSW50ZXJmYWNlIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5VbnJlZ2lzdGVyQXBwSW50ZXJmYWNlKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgVW5yZWdpc3RlckFwcEludGVyZmFjZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBVbnJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5VbnJlZ2lzdGVyQXBwSW50ZXJmYWNlKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgVW5yZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IFdpbmRvd1R5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFdpbmRvd1R5cGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyB3aW5kb3cgdHlwZSBkZXNjcmliZXMgdGhlIG1haW4gd2luZG93IG9uIGEgZGlzcGxheS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBNQUlOICgpIHtcbiAgICAgICAgcmV0dXJuIFdpbmRvd1R5cGUuX01BUC5NQUlOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgd2lkZ2V0IGlzIGEgc21hbGwgd2luZG93IHRoYXQgdGhlIGFwcCBjYW4gY3JlYXRlIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYW5kIHNvZnQgYnV0dG9ucyBmb3IgcXVpY2sgYXBwXG4gICAgICogY29udHJvbC5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBXSURHRVQgKCkge1xuICAgICAgICByZXR1cm4gV2luZG93VHlwZS5fTUFQLldJREdFVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBXaW5kb3dUeXBlLl92YWx1ZUZvcktleShrZXksIFdpbmRvd1R5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBXaW5kb3dUeXBlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgV2luZG93VHlwZS5fTUFQKTtcbiAgICB9XG59XG5cbldpbmRvd1R5cGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdNQUlOJzogJ01BSU4nLFxuICAgICdXSURHRVQnOiAnV0lER0VUJyxcbn0pO1xuXG5leHBvcnQgeyBXaW5kb3dUeXBlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgV2luZG93VHlwZSB9IGZyb20gJy4uL2VudW1zL1dpbmRvd1R5cGUuanMnO1xuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyB3aW5kb3cgb24gdGhlIGRpc3BsYXkgd2l0aCB0aGUgc3BlY2lmaWVkIHdpbmRvdyB0eXBlLlxuICovXG5jbGFzcyBDcmVhdGVXaW5kb3cgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkNyZWF0ZVdpbmRvdyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIC0gQSB1bmlxdWUgSUQgdG8gaWRlbnRpZnkgdGhlIHdpbmRvdy4gVGhlIHZhbHVlIG9mICcwJyB3aWxsIGFsd2F5cyBiZSB0aGUgZGVmYXVsdCBtYWluIHdpbmRvd1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBtYWluIGRpc3BsYXkgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGlzIGNvbnRleHQgYXMgaXQgd2lsbCBhbHJlYWR5IGJlIGNyZWF0ZWQgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcC4gU2VlIFByZWRlZmluZWRXaW5kb3dzIGVudW0uIENyZWF0aW5nIGEgd2luZG93IHdpdGggYW4gSUQgdGhhdCBpcyBhbHJlYWR5IGluIHVzZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCBgSU5WQUxJRF9JRGAuXG4gICAgICogQHJldHVybiB7Q3JlYXRlV2luZG93fVxuICAgICAqL1xuICAgIHNldFdpbmRvd0lEIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDcmVhdGVXaW5kb3cuS0VZX1dJTkRPV19JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0V2luZG93SUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ3JlYXRlV2luZG93LktFWV9XSU5ET1dfSUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIHdpbmRvdyBuYW1lIHRvIGJlIHVzZWQgYnkgdGhlIEhNSS4gVGhlIG5hbWUgb2YgdGhlIHByZS1jcmVhdGVkIGRlZmF1bHQgd2luZG93IHdpbGxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHRoZSBhcHAgbmFtZS4gTXVsdGlwbGUgYXBwcyBjYW4gc2hhcmUgdGhlIHNhbWUgd2luZG93IG5hbWUgZXhjZXB0IGZvciB0aGUgZGVmYXVsdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgbWFpbiB3aW5kb3cuIENyZWF0aW5nIGEgd2luZG93IHdpdGggYSBuYW1lIHdoaWNoIGlzIGFscmVhZHkgaW4gdXNlIGJ5IHRoZSBhcHAgd2lsbCByZXN1bHRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGluIGBEVVBMSUNBVEVfTkFNRWAuXG4gICAgICogQHJldHVybiB7Q3JlYXRlV2luZG93fVxuICAgICAqL1xuICAgIHNldFdpbmRvd05hbWUgKG5hbWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ3JlYXRlV2luZG93LktFWV9XSU5ET1dfTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRXaW5kb3dOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKENyZWF0ZVdpbmRvdy5LRVlfV0lORE9XX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7V2luZG93VHlwZX0gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSB3aW5kb3cgdG8gYmUgY3JlYXRlZC4gTWFpbiB3aW5kb3cgb3Igd2lkZ2V0LlxuICAgICAqIEByZXR1cm4ge0NyZWF0ZVdpbmRvd31cbiAgICAgKi9cbiAgICBzZXRUeXBlICh0eXBlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFdpbmRvd1R5cGUsIHR5cGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDcmVhdGVXaW5kb3cuS0VZX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtXaW5kb3dUeXBlfVxuICAgICAqL1xuICAgIGdldFR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoV2luZG93VHlwZSwgQ3JlYXRlV2luZG93LktFWV9UWVBFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIEFsbG93cyBhbiBhcHAgdG8gY3JlYXRlIGEgd2lkZ2V0IHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBzZXJ2aWNlIHR5cGUuIEFzIGFuIGV4YW1wbGUgaWYgYVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgYE1FRElBYCBhcHAgYmVjb21lcyBhY3RpdmUsIHRoaXMgYXBwIGJlY29tZXMgYXVkaWJsZSBhbmQgaXMgYWxsb3dlZCB0byBwbGF5IGF1ZGlvLiBBY3Rpb25zXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBzdWNoIGFzIHNraXAgb3IgcGxheS9wYXVzZSB3aWxsIGJlIGRpcmVjdGVkIHRvIHRoaXMgYWN0aXZlIG1lZGlhIGFwcC4gSW4gY2FzZSBvZiB3aWRnZXRzLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN5c3RlbSBjYW4gcHJvdmlkZSBhIHNpbmdsZSBcIm1lZGlhXCIgd2lkZ2V0IHdoaWNoIHdpbGwgYWN0IGFzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlIG1lZGlhIGFwcC4gSXQgaXMgb25seSBhbGxvd2VkIHRvIGhhdmUgb25lIHdpbmRvdyBwZXIgc2VydmljZSB0eXBlLiBUaGlzIG1lYW5zIHRoYXRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGEgbWVkaWEgYXBwIGNhbiBvbmx5IGhhdmUgYSBzaW5nbGUgTUVESUEgd2lkZ2V0LiBTdGlsbCB0aGUgYXBwIGNhbiBjcmVhdGUgd2lkZ2V0cyBvbWl0dGluZ1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIuIFRob3NlIHdpZGdldHMgd291bGQgYmUgYXZhaWxhYmxlIGFzIGFwcCBzcGVjaWZpYyB3aWRnZXRzIHRoYXQgYXJlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBwZXJtYW5lbnRseSBpbmNsdWRlZCBpbiB0aGUgSE1JLiBUaGlzIHBhcmFtZXRlciBpcyByZWxhdGVkIHRvIHdpZGdldHMgb25seS4gVGhlIGRlZmF1bHRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gd2luZG93LCB3aGljaCBpcyBwcmUtY3JlYXRlZCBkdXJpbmcgYXBwIHJlZ2lzdHJhdGlvbiwgd2lsbCBiZSBjcmVhdGVkIGJhc2VkIG9uIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgSE1JIHR5cGVzIHNwZWNpZmllZCBpbiB0aGUgYXBwIHJlZ2lzdHJhdGlvbiByZXF1ZXN0LlxuICAgICAqIEByZXR1cm4ge0NyZWF0ZVdpbmRvd31cbiAgICAgKi9cbiAgICBzZXRBc3NvY2lhdGVkU2VydmljZVR5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ3JlYXRlV2luZG93LktFWV9BU1NPQ0lBVEVEX1NFUlZJQ0VfVFlQRSwgdHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRBc3NvY2lhdGVkU2VydmljZVR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ3JlYXRlV2luZG93LktFWV9BU1NPQ0lBVEVEX1NFUlZJQ0VfVFlQRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIC0gT3B0aW9uYWwgcGFyYW1ldGVyLiBTcGVjaWZ5IHdoZXRoZXIgdGhlIGNvbnRlbnQgc2VudCB0byBhbiBleGlzdGluZyB3aW5kb3cgc2hvdWxkIGJlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlZCB0byB0aGUgY3JlYXRlZCB3aW5kb3cuIElmIHRoZXJlIGlzbid0IGEgd2luZG93IHdpdGggdGhlIElELCB0aGUgcmVxdWVzdCB3aWxsIGJlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgcmVqZWN0ZWQgd2l0aCBgSU5WQUxJRF9EQVRBYC5cbiAgICAgKiBAcmV0dXJuIHtDcmVhdGVXaW5kb3d9XG4gICAgICovXG4gICAgc2V0RHVwbGljYXRlVXBkYXRlc0Zyb21XaW5kb3dJRCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ3JlYXRlV2luZG93LktFWV9EVVBMSUNBVEVfVVBEQVRFU19GUk9NX1dJTkRPV19JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0RHVwbGljYXRlVXBkYXRlc0Zyb21XaW5kb3dJRCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDcmVhdGVXaW5kb3cuS0VZX0RVUExJQ0FURV9VUERBVEVTX0ZST01fV0lORE9XX0lEKTtcbiAgICB9XG59XG5cbkNyZWF0ZVdpbmRvdy5LRVlfV0lORE9XX0lEID0gJ3dpbmRvd0lEJztcbkNyZWF0ZVdpbmRvdy5LRVlfV0lORE9XX05BTUUgPSAnd2luZG93TmFtZSc7XG5DcmVhdGVXaW5kb3cuS0VZX1RZUEUgPSAndHlwZSc7XG5DcmVhdGVXaW5kb3cuS0VZX0FTU09DSUFURURfU0VSVklDRV9UWVBFID0gJ2Fzc29jaWF0ZWRTZXJ2aWNlVHlwZSc7XG5DcmVhdGVXaW5kb3cuS0VZX0RVUExJQ0FURV9VUERBVEVTX0ZST01fV0lORE9XX0lEID0gJ2R1cGxpY2F0ZVVwZGF0ZXNGcm9tV2luZG93SUQnO1xuXG5leHBvcnQgeyBDcmVhdGVXaW5kb3cgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgQ3JlYXRlV2luZG93UmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5DcmVhdGVXaW5kb3cpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBDcmVhdGVXaW5kb3dSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBEZWxldGVzIHByZXZpb3VzbHkgY3JlYXRlZCB3aW5kb3cgb2YgdGhlIFNETCBhcHBsaWNhdGlvbi5cbiAqL1xuY2xhc3MgRGVsZXRlV2luZG93IGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5EZWxldGVXaW5kb3cpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpZCAtIEEgdW5pcXVlIElEIHRvIGlkZW50aWZ5IHRoZSB3aW5kb3cuIFRoZSB2YWx1ZSBvZiAnMCcgd2lsbCBhbHdheXMgYmUgdGhlIGRlZmF1bHQgbWFpbiB3aW5kb3dcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgbWFpbiBkaXNwbGF5IGFuZCBjYW5ub3QgYmUgZGVsZXRlZC4gU2VlIFByZWRlZmluZWRXaW5kb3dzIGVudW0uXG4gICAgICogQHJldHVybiB7RGVsZXRlV2luZG93fVxuICAgICAqL1xuICAgIHNldFdpbmRvd0lEIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEZWxldGVXaW5kb3cuS0VZX1dJTkRPV19JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0V2luZG93SUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGVsZXRlV2luZG93LktFWV9XSU5ET1dfSUQpO1xuICAgIH1cbn1cblxuRGVsZXRlV2luZG93LktFWV9XSU5ET1dfSUQgPSAnd2luZG93SUQnO1xuXG5leHBvcnQgeyBEZWxldGVXaW5kb3cgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgRGVsZXRlV2luZG93UmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5EZWxldGVXaW5kb3cpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBEZWxldGVXaW5kb3dSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIGltYWdlLlxuICogQHR5cGVkZWYge0VudW19IEltYWdlVHlwZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgSW1hZ2VUeXBlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNUQVRJQyAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZVR5cGUuX01BUC5TVEFUSUM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRFlOQU1JQyAoKSB7XG4gICAgICAgIHJldHVybiBJbWFnZVR5cGUuX01BUC5EWU5BTUlDO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEltYWdlVHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBJbWFnZVR5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJbWFnZVR5cGUuX2tleUZvclZhbHVlKHZhbHVlLCBJbWFnZVR5cGUuX01BUCk7XG4gICAgfVxufVxuXG5JbWFnZVR5cGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdTVEFUSUMnOiAnU1RBVElDJyxcbiAgICAnRFlOQU1JQyc6ICdEWU5BTUlDJyxcbn0pO1xuXG5leHBvcnQgeyBJbWFnZVR5cGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgSW1hZ2VUeXBlIH0gZnJvbSAnLi4vZW51bXMvSW1hZ2VUeXBlLmpzJztcblxuY2xhc3MgSW1hZ2UgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSAtIEVpdGhlciB0aGUgc3RhdGljIGhleCBpY29uIHZhbHVlIG9yIHRoZSBiaW5hcnkgaW1hZ2UgZmlsZSBuYW1lIGlkZW50aWZpZXIgKHNlbnQgYnlcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBQdXRGaWxlKS5cbiAgICAgKiBAcmV0dXJuIHtJbWFnZX1cbiAgICAgKi9cbiAgICBzZXRWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSW1hZ2UuS0VZX1ZBTFVFLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRWYWx1ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihJbWFnZS5LRVlfVkFMVUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW1hZ2VUeXBlfSB0eXBlIC0gRGVzY3JpYmVzLCB3aGV0aGVyIGl0IGlzIGEgc3RhdGljIG9yIGR5bmFtaWMgaW1hZ2UuXG4gICAgICogQHJldHVybiB7SW1hZ2V9XG4gICAgICovXG4gICAgc2V0SW1hZ2VUeXBlICh0eXBlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEltYWdlVHlwZSwgdHlwZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEltYWdlLktFWV9JTUFHRV9UWVBFLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SW1hZ2VUeXBlfVxuICAgICAqL1xuICAgIGdldEltYWdlVHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChJbWFnZVR5cGUsIEltYWdlLktFWV9JTUFHRV9UWVBFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRlbXBsYXRlIC0gSWYgdHJ1ZSwgdGhlIGltYWdlIGlzIGEgdGVtcGxhdGUgaW1hZ2UgYW5kIGNhbiBiZSByZWNvbG9yZWQgYnkgdGhlIEhNSVxuICAgICAqIEByZXR1cm4ge0ltYWdlfVxuICAgICAqL1xuICAgIHNldElzVGVtcGxhdGUgKHRlbXBsYXRlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEltYWdlLktFWV9JU19URU1QTEFURSwgdGVtcGxhdGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldElzVGVtcGxhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoSW1hZ2UuS0VZX0lTX1RFTVBMQVRFKTtcbiAgICB9XG59XG5cbkltYWdlLktFWV9WQUxVRSA9ICd2YWx1ZSc7XG5JbWFnZS5LRVlfSU1BR0VfVFlQRSA9ICdpbWFnZVR5cGUnO1xuSW1hZ2UuS0VZX0lTX1RFTVBMQVRFID0gJ2lzVGVtcGxhdGUnO1xuXG5leHBvcnQgeyBJbWFnZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJy4vSW1hZ2UuanMnO1xuXG5jbGFzcyBWckhlbHBJdGVtIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCAtIFRleHQgdG8gZGlzcGxheSBmb3IgVlIgSGVscCBpdGVtXG4gICAgICogQHJldHVybiB7VnJIZWxwSXRlbX1cbiAgICAgKi9cbiAgICBzZXRUZXh0ICh0ZXh0KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFZySGVscEl0ZW0uS0VZX1RFWFQsIHRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0VGV4dCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihWckhlbHBJdGVtLktFWV9URVhUKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0ltYWdlfSBpbWFnZSAtIEltYWdlIHN0cnVjdCBmb3IgVlIgSGVscCBpdGVtXG4gICAgICogQHJldHVybiB7VnJIZWxwSXRlbX1cbiAgICAgKi9cbiAgICBzZXRJbWFnZSAoaW1hZ2UpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSW1hZ2UsIGltYWdlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVnJIZWxwSXRlbS5LRVlfSU1BR0UsIGltYWdlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SW1hZ2V9XG4gICAgICovXG4gICAgZ2V0SW1hZ2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSW1hZ2UsIFZySGVscEl0ZW0uS0VZX0lNQUdFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb24gLSBQb3NpdGlvbiB0byBkaXNwbGF5IGl0ZW0gaW4gVlIgSGVscCBsaXN0XG4gICAgICogQHJldHVybiB7VnJIZWxwSXRlbX1cbiAgICAgKi9cbiAgICBzZXRQb3NpdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVnJIZWxwSXRlbS5LRVlfUE9TSVRJT04sIHBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFBvc2l0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFZySGVscEl0ZW0uS0VZX1BPU0lUSU9OKTtcbiAgICB9XG59XG5cblZySGVscEl0ZW0uS0VZX1RFWFQgPSAndGV4dCc7XG5WckhlbHBJdGVtLktFWV9JTUFHRSA9ICdpbWFnZSc7XG5WckhlbHBJdGVtLktFWV9QT1NJVElPTiA9ICdwb3NpdGlvbic7XG5cbmV4cG9ydCB7IFZySGVscEl0ZW0gfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgR3JpZCB9IGZyb20gJy4vR3JpZC5qcyc7XG5cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBsb2NhdGlvbiBvZiBhIHNlYXQuXG4gKi9cbmNsYXNzIFNlYXRMb2NhdGlvbiBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtHcmlkfSBncmlkIC0gRGVzY3JpYmVzIGEgbG9jYXRpb24gKG9yaWdpbiBjb29yZGluYXRlcyBhbmQgc3Bhbikgb2YgYSB2ZWhpY2xlIGNvbXBvbmVudC5cbiAgICAgKiBAcmV0dXJuIHtTZWF0TG9jYXRpb259XG4gICAgICovXG4gICAgc2V0R3JpZCAoZ3JpZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShHcmlkLCBncmlkKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VhdExvY2F0aW9uLktFWV9HUklELCBncmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7R3JpZH1cbiAgICAgKi9cbiAgICBnZXRHcmlkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEdyaWQsIFNlYXRMb2NhdGlvbi5LRVlfR1JJRCk7XG4gICAgfVxufVxuXG5TZWF0TG9jYXRpb24uS0VZX0dSSUQgPSAnZ3JpZCc7XG5cbmV4cG9ydCB7IFNlYXRMb2NhdGlvbiB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEhvdyB0aGUgbWFpbiBtZW51IG9yIHN1Ym1lbnUgaXMgbGFpZCBvdXQgb24gc2NyZWVuXG4gKiBAdHlwZWRlZiB7RW51bX0gTWVudUxheW91dFxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgTWVudUxheW91dCBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBMSVNUICgpIHtcbiAgICAgICAgcmV0dXJuIE1lbnVMYXlvdXQuX01BUC5MSVNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRJTEVTICgpIHtcbiAgICAgICAgcmV0dXJuIE1lbnVMYXlvdXQuX01BUC5USUxFUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBNZW51TGF5b3V0Ll92YWx1ZUZvcktleShrZXksIE1lbnVMYXlvdXQuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBNZW51TGF5b3V0Ll9rZXlGb3JWYWx1ZSh2YWx1ZSwgTWVudUxheW91dC5fTUFQKTtcbiAgICB9XG59XG5cbk1lbnVMYXlvdXQuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdMSVNUJzogJ0xJU1QnLFxuICAgICdUSUxFUyc6ICdUSUxFUycsXG59KTtcblxuZXhwb3J0IHsgTWVudUxheW91dCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIGxpc3RpbmcgcG9zc2libGUga2V5Ym9hcmQgbGF5b3V0cy5cbiAqIEB0eXBlZGVmIHtFbnVtfSBLZXlib2FyZExheW91dFxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgS2V5Ym9hcmRMYXlvdXQgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUVdFUlRZICgpIHtcbiAgICAgICAgcmV0dXJuIEtleWJvYXJkTGF5b3V0Ll9NQVAuUVdFUlRZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFFXRVJUWiAoKSB7XG4gICAgICAgIHJldHVybiBLZXlib2FyZExheW91dC5fTUFQLlFXRVJUWjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBWkVSVFkgKCkge1xuICAgICAgICByZXR1cm4gS2V5Ym9hcmRMYXlvdXQuX01BUC5BWkVSVFk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gS2V5Ym9hcmRMYXlvdXQuX3ZhbHVlRm9yS2V5KGtleSwgS2V5Ym9hcmRMYXlvdXQuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBLZXlib2FyZExheW91dC5fa2V5Rm9yVmFsdWUodmFsdWUsIEtleWJvYXJkTGF5b3V0Ll9NQVApO1xuICAgIH1cbn1cblxuS2V5Ym9hcmRMYXlvdXQuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdRV0VSVFknOiAnUVdFUlRZJyxcbiAgICAnUVdFUlRaJzogJ1FXRVJUWicsXG4gICAgJ0FaRVJUWSc6ICdBWkVSVFknLFxufSk7XG5cbmV4cG9ydCB7IEtleWJvYXJkTGF5b3V0IH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogRW51bWVyYXRpb24gbGlzdGluZyBwb3NzaWJsZSBrZXlib2FyZCBldmVudHMuXG4gKiBAdHlwZWRlZiB7RW51bX0gS2V5cHJlc3NNb2RlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBLZXlwcmVzc01vZGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRWFjaCBrZXlwcmVzcyBpcyBpbmRpdmlkdWFsbHkgc2VudCBhcyB0aGUgdXNlciBwcmVzc2VzIHRoZSBrZXlib2FyZCBrZXlzLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNJTkdMRV9LRVlQUkVTUyAoKSB7XG4gICAgICAgIHJldHVybiBLZXlwcmVzc01vZGUuX01BUC5TSU5HTEVfS0VZUFJFU1M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGtleXByZXNzZXMgYXJlIHF1ZXVlZCBhbmQgYSBzdHJpbmcgaXMgZXZlbnR1YWxseSBzZW50IG9uY2UgdGhlIHVzZXIgY2hvb3NlcyB0byBzdWJtaXQgdGhlaXIgZW50cnkuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUVVFVUVfS0VZUFJFU1NFUyAoKSB7XG4gICAgICAgIHJldHVybiBLZXlwcmVzc01vZGUuX01BUC5RVUVVRV9LRVlQUkVTU0VTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXlwcmVzc2VzIGFyZSBxdWV1ZSBhbmQgYSBzdHJpbmcgaXMgc2VudCBlYWNoIHRpbWUgdGhlIHVzZXIgcHJlc3NlcyBhIGtleWJvYXJkIGtleTsgdGhlIHN0cmluZyBjb250YWluc1xuICAgICAqIHRoZSBlbnRpcmUgY3VycmVudCBlbnRyeS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSRVNFTkRfQ1VSUkVOVF9FTlRSWSAoKSB7XG4gICAgICAgIHJldHVybiBLZXlwcmVzc01vZGUuX01BUC5SRVNFTkRfQ1VSUkVOVF9FTlRSWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBLZXlwcmVzc01vZGUuX3ZhbHVlRm9yS2V5KGtleSwgS2V5cHJlc3NNb2RlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gS2V5cHJlc3NNb2RlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgS2V5cHJlc3NNb2RlLl9NQVApO1xuICAgIH1cbn1cblxuS2V5cHJlc3NNb2RlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnU0lOR0xFX0tFWVBSRVNTJzogJ1NJTkdMRV9LRVlQUkVTUycsXG4gICAgJ1FVRVVFX0tFWVBSRVNTRVMnOiAnUVVFVUVfS0VZUFJFU1NFUycsXG4gICAgJ1JFU0VORF9DVVJSRU5UX0VOVFJZJzogJ1JFU0VORF9DVVJSRU5UX0VOVFJZJyxcbn0pO1xuXG5leHBvcnQgeyBLZXlwcmVzc01vZGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgS2V5Ym9hcmRMYXlvdXQgfSBmcm9tICcuLi9lbnVtcy9LZXlib2FyZExheW91dC5qcyc7XG5pbXBvcnQgeyBMYW5ndWFnZSB9IGZyb20gJy4uL2VudW1zL0xhbmd1YWdlLmpzJztcbmltcG9ydCB7IEtleXByZXNzTW9kZSB9IGZyb20gJy4uL2VudW1zL0tleXByZXNzTW9kZS5qcyc7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvZiBvbi1zY3JlZW4ga2V5Ym9hcmQgKGlmIGF2YWlsYWJsZSkuXG4gKi9cbmNsYXNzIEtleWJvYXJkUHJvcGVydGllcyBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUaGUga2V5Ym9hcmQgbGFuZ3VhZ2UuXG4gICAgICogQHJldHVybiB7S2V5Ym9hcmRQcm9wZXJ0aWVzfVxuICAgICAqL1xuICAgIHNldExhbmd1YWdlIChsYW5ndWFnZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShMYW5ndWFnZSwgbGFuZ3VhZ2UpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihLZXlib2FyZFByb3BlcnRpZXMuS0VZX0xBTkdVQUdFLCBsYW5ndWFnZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0xhbmd1YWdlfVxuICAgICAqL1xuICAgIGdldExhbmd1YWdlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KExhbmd1YWdlLCBLZXlib2FyZFByb3BlcnRpZXMuS0VZX0xBTkdVQUdFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0tleWJvYXJkTGF5b3V0fSBsYXlvdXQgLSBEZXNpcmVkIGtleWJvYXJkIGxheW91dC5cbiAgICAgKiBAcmV0dXJuIHtLZXlib2FyZFByb3BlcnRpZXN9XG4gICAgICovXG4gICAgc2V0S2V5Ym9hcmRMYXlvdXQgKGxheW91dCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShLZXlib2FyZExheW91dCwgbGF5b3V0KTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoS2V5Ym9hcmRQcm9wZXJ0aWVzLktFWV9LRVlCT0FSRF9MQVlPVVQsIGxheW91dCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0tleWJvYXJkTGF5b3V0fVxuICAgICAqL1xuICAgIGdldEtleWJvYXJkTGF5b3V0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEtleWJvYXJkTGF5b3V0LCBLZXlib2FyZFByb3BlcnRpZXMuS0VZX0tFWUJPQVJEX0xBWU9VVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtLZXlwcmVzc01vZGV9IG1vZGUgLSBEZXNpcmVkIGtleXByZXNzIG1vZGUuIElmIG9taXR0ZWQsIHRoaXMgdmFsdWUgd2lsbCBiZSBzZXQgdG8gUkVTRU5EX0NVUlJFTlRfRU5UUlkuXG4gICAgICogQHJldHVybiB7S2V5Ym9hcmRQcm9wZXJ0aWVzfVxuICAgICAqL1xuICAgIHNldEtleXByZXNzTW9kZSAobW9kZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShLZXlwcmVzc01vZGUsIG1vZGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihLZXlib2FyZFByb3BlcnRpZXMuS0VZX0tFWVBSRVNTX01PREUsIG1vZGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtLZXlwcmVzc01vZGV9XG4gICAgICovXG4gICAgZ2V0S2V5cHJlc3NNb2RlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEtleXByZXNzTW9kZSwgS2V5Ym9hcmRQcm9wZXJ0aWVzLktFWV9LRVlQUkVTU19NT0RFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ1tdfSBsaXN0IC0gQXJyYXkgb2Yga2V5Ym9hcmQgY2hhcmFjdGVycyB0byBlbmFibGUuIEFsbCBvbWl0dGVkIGNoYXJhY3RlcnMgd2lsbCBiZSBncmV5ZWQgb3V0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIChkaXNhYmxlZCkgb24gdGhlIGtleWJvYXJkLiBJZiBvbWl0dGVkLCB0aGUgZW50aXJlIGtleWJvYXJkIHdpbGwgYmUgZW5hYmxlZC5cbiAgICAgKiBAcmV0dXJuIHtLZXlib2FyZFByb3BlcnRpZXN9XG4gICAgICovXG4gICAgc2V0TGltaXRlZENoYXJhY3Rlckxpc3QgKGxpc3QpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoS2V5Ym9hcmRQcm9wZXJ0aWVzLktFWV9MSU1JVEVEX0NIQVJBQ1RFUl9MSVNULCBsaXN0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0TGltaXRlZENoYXJhY3Rlckxpc3QgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoS2V5Ym9hcmRQcm9wZXJ0aWVzLktFWV9MSU1JVEVEX0NIQVJBQ1RFUl9MSVNUKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCAtIERlcHJlY2F0ZWQsIHVzZSBhdXRvQ29tcGxldGVMaXN0IGluc3RlYWQuXG4gICAgICogQHJldHVybiB7S2V5Ym9hcmRQcm9wZXJ0aWVzfVxuICAgICAqL1xuICAgIHNldEF1dG9Db21wbGV0ZVRleHQgKHRleHQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoS2V5Ym9hcmRQcm9wZXJ0aWVzLktFWV9BVVRPX0NPTVBMRVRFX1RFWFQsIHRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0QXV0b0NvbXBsZXRlVGV4dCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihLZXlib2FyZFByb3BlcnRpZXMuS0VZX0FVVE9fQ09NUExFVEVfVEVYVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmdbXX0gbGlzdCAtIEFsbG93cyBhbiBhcHAgdG8gcHJlcG9wdWxhdGUgdGhlIHRleHQgZmllbGQgd2l0aCBhIGxpc3Qgb2Ygc3VnZ2VzdGVkIG9yIGNvbXBsZXRlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzIGFzIHRoZSB1c2VyIHR5cGVzLiBJZiBlbXB0eSwgdGhlIGF1dG8tY29tcGxldGUgbGlzdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuLlxuICAgICAqIEByZXR1cm4ge0tleWJvYXJkUHJvcGVydGllc31cbiAgICAgKi9cbiAgICBzZXRBdXRvQ29tcGxldGVMaXN0IChsaXN0KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEtleWJvYXJkUHJvcGVydGllcy5LRVlfQVVUT19DT01QTEVURV9MSVNULCBsaXN0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0QXV0b0NvbXBsZXRlTGlzdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihLZXlib2FyZFByb3BlcnRpZXMuS0VZX0FVVE9fQ09NUExFVEVfTElTVCk7XG4gICAgfVxufVxuXG5LZXlib2FyZFByb3BlcnRpZXMuS0VZX0xBTkdVQUdFID0gJ2xhbmd1YWdlJztcbktleWJvYXJkUHJvcGVydGllcy5LRVlfS0VZQk9BUkRfTEFZT1VUID0gJ2tleWJvYXJkTGF5b3V0JztcbktleWJvYXJkUHJvcGVydGllcy5LRVlfS0VZUFJFU1NfTU9ERSA9ICdrZXlwcmVzc01vZGUnO1xuS2V5Ym9hcmRQcm9wZXJ0aWVzLktFWV9MSU1JVEVEX0NIQVJBQ1RFUl9MSVNUID0gJ2xpbWl0ZWRDaGFyYWN0ZXJMaXN0JztcbktleWJvYXJkUHJvcGVydGllcy5LRVlfQVVUT19DT01QTEVURV9URVhUID0gJ2F1dG9Db21wbGV0ZVRleHQnO1xuS2V5Ym9hcmRQcm9wZXJ0aWVzLktFWV9BVVRPX0NPTVBMRVRFX0xJU1QgPSAnYXV0b0NvbXBsZXRlTGlzdCc7XG5cbmV4cG9ydCB7IEtleWJvYXJkUHJvcGVydGllcyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFZySGVscEl0ZW0gfSBmcm9tICcuLi9zdHJ1Y3RzL1ZySGVscEl0ZW0uanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgU2VhdExvY2F0aW9uIH0gZnJvbSAnLi4vc3RydWN0cy9TZWF0TG9jYXRpb24uanMnO1xuaW1wb3J0IHsgVFRTQ2h1bmsgfSBmcm9tICcuLi9zdHJ1Y3RzL1RUU0NodW5rLmpzJztcbmltcG9ydCB7IE1lbnVMYXlvdXQgfSBmcm9tICcuLi9lbnVtcy9NZW51TGF5b3V0LmpzJztcbmltcG9ydCB7IEtleWJvYXJkUHJvcGVydGllcyB9IGZyb20gJy4uL3N0cnVjdHMvS2V5Ym9hcmRQcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnLi4vc3RydWN0cy9JbWFnZS5qcyc7XG5cbi8qKlxuICogQWxsb3dzIHNldHRpbmcgZ2xvYmFsIHByb3BlcnRpZXMuXG4gKi9cbmNsYXNzIFNldEdsb2JhbFByb3BlcnRpZXMgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlNldEdsb2JhbFByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2VhdExvY2F0aW9ufSBsb2NhdGlvbiAtIExvY2F0aW9uIG9mIHRoZSB1c2VyJ3Mgc2VhdC4gRGVmYXVsdCBpcyBkcml2ZXIncyBzZWF0IGxvY2F0aW9uIGlmIGl0IGlzIG5vdCBzZXRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXQuXG4gICAgICogQHJldHVybiB7U2V0R2xvYmFsUHJvcGVydGllc31cbiAgICAgKi9cbiAgICBzZXRVc2VyTG9jYXRpb24gKGxvY2F0aW9uKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFNlYXRMb2NhdGlvbiwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZXRHbG9iYWxQcm9wZXJ0aWVzLktFWV9VU0VSX0xPQ0FUSU9OLCBsb2NhdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NlYXRMb2NhdGlvbn1cbiAgICAgKi9cbiAgICBnZXRVc2VyTG9jYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoU2VhdExvY2F0aW9uLCBTZXRHbG9iYWxQcm9wZXJ0aWVzLktFWV9VU0VSX0xPQ0FUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RUU0NodW5rW119IHByb21wdCAtIFRoZSBoZWxwIHByb21wdC4gQW4gYXJyYXkgb2YgdGV4dCBjaHVua3Mgb2YgdHlwZSBUVFNDaHVuay4gU2VlIFRUU0NodW5rLiBUaGUgYXJyYXlcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgaXRlbS5cbiAgICAgKiBAcmV0dXJuIHtTZXRHbG9iYWxQcm9wZXJ0aWVzfVxuICAgICAqL1xuICAgIHNldEhlbHBQcm9tcHQgKHByb21wdCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShUVFNDaHVuaywgcHJvbXB0LCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2V0R2xvYmFsUHJvcGVydGllcy5LRVlfSEVMUF9QUk9NUFQsIHByb21wdCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RUU0NodW5rW119XG4gICAgICovXG4gICAgZ2V0SGVscFByb21wdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUVFNDaHVuaywgU2V0R2xvYmFsUHJvcGVydGllcy5LRVlfSEVMUF9QUk9NUFQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VFRTQ2h1bmtbXX0gcHJvbXB0IC0gSGVscCB0ZXh0IGZvciBhIHdhaXQgdGltZW91dC4gQW4gYXJyYXkgb2YgdGV4dCBjaHVua3Mgb2YgdHlwZSBUVFNDaHVuay4gU2VlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVFNDaHVuay4gVGhlIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgaXRlbS5cbiAgICAgKiBAcmV0dXJuIHtTZXRHbG9iYWxQcm9wZXJ0aWVzfVxuICAgICAqL1xuICAgIHNldFRpbWVvdXRQcm9tcHQgKHByb21wdCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShUVFNDaHVuaywgcHJvbXB0LCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2V0R2xvYmFsUHJvcGVydGllcy5LRVlfVElNRU9VVF9QUk9NUFQsIHByb21wdCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RUU0NodW5rW119XG4gICAgICovXG4gICAgZ2V0VGltZW91dFByb21wdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUVFNDaHVuaywgU2V0R2xvYmFsUHJvcGVydGllcy5LRVlfVElNRU9VVF9QUk9NUFQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZSAtIFZSIEhlbHAgVGl0bGUgdGV4dC4gSWYgb21pdHRlZCBvbiBzdXBwb3J0ZWQgZGlzcGxheXMsIHRoZSBkZWZhdWx0IG1vZHVsZSBoZWxwIHRpdGxlIHNoYWxsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZC4gSWYgb21pdHRlZCBhbmQgb25lIG9yIG1vcmUgdnJIZWxwIGl0ZW1zIGFyZSBwcm92aWRlZCwgdGhlIHJlcXVlc3Qgd2lsbCBiZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGVkLlxuICAgICAqIEByZXR1cm4ge1NldEdsb2JhbFByb3BlcnRpZXN9XG4gICAgICovXG4gICAgc2V0VnJIZWxwVGl0bGUgKHRpdGxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNldEdsb2JhbFByb3BlcnRpZXMuS0VZX1ZSX0hFTFBfVElUTEUsIHRpdGxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFZySGVscFRpdGxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNldEdsb2JhbFByb3BlcnRpZXMuS0VZX1ZSX0hFTFBfVElUTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VnJIZWxwSXRlbVtdfSBoZWxwIC0gVlIgSGVscCBJdGVtcy4gSWYgb21pdHRlZCBvbiBzdXBwb3J0ZWQgZGlzcGxheXMsIHRoZSBkZWZhdWx0IFNtYXJ0RGV2aWNlTGluayBWUiBoZWxwXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIFdoYXQgQ2FuIEkgU2F5PyBzY3JlZW4gc2hhbGwgYmUgdXNlZC4gSWYgdGhlIGxpc3Qgb2YgVlIgSGVscCBJdGVtcyBjb250YWluc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc2VxdWVudGlhbCBwb3NpdGlvbnMgKGUuZy4gWzEsMiw0XSksIHRoZSBSUEMgc2hhbGwgYmUgcmVqZWN0ZWQuIElmIG9taXR0ZWQgYW5kIGFcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZySGVscFRpdGxlIGlzIHByb3ZpZGVkLCB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgICAqIEByZXR1cm4ge1NldEdsb2JhbFByb3BlcnRpZXN9XG4gICAgICovXG4gICAgc2V0VnJIZWxwIChoZWxwKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZySGVscEl0ZW0sIGhlbHAsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZXRHbG9iYWxQcm9wZXJ0aWVzLktFWV9WUl9IRUxQLCBoZWxwKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VnJIZWxwSXRlbVtdfVxuICAgICAqL1xuICAgIGdldFZySGVscCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWckhlbHBJdGVtLCBTZXRHbG9iYWxQcm9wZXJ0aWVzLktFWV9WUl9IRUxQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGl0bGUgLSBPcHRpb25hbCB0ZXh0IHRvIGxhYmVsIGFuIGFwcCBtZW51IGJ1dHRvbiAoZm9yIGNlcnRhaW4gdG91Y2hzY3JlZW4gcGxhdGZvcm1zKS5cbiAgICAgKiBAcmV0dXJuIHtTZXRHbG9iYWxQcm9wZXJ0aWVzfVxuICAgICAqL1xuICAgIHNldE1lbnVUaXRsZSAodGl0bGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2V0R2xvYmFsUHJvcGVydGllcy5LRVlfTUVOVV9USVRMRSwgdGl0bGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0TWVudVRpdGxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNldEdsb2JhbFByb3BlcnRpZXMuS0VZX01FTlVfVElUTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW1hZ2V9IGljb24gLSBPcHRpb25hbCBpY29uIHRvIGRyYXcgb24gYW4gYXBwIG1lbnUgYnV0dG9uIChmb3IgY2VydGFpbiB0b3VjaHNjcmVlbiBwbGF0Zm9ybXMpLlxuICAgICAqIEByZXR1cm4ge1NldEdsb2JhbFByb3BlcnRpZXN9XG4gICAgICovXG4gICAgc2V0TWVudUljb24gKGljb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSW1hZ2UsIGljb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZXRHbG9iYWxQcm9wZXJ0aWVzLktFWV9NRU5VX0lDT04sIGljb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtJbWFnZX1cbiAgICAgKi9cbiAgICBnZXRNZW51SWNvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChJbWFnZSwgU2V0R2xvYmFsUHJvcGVydGllcy5LRVlfTUVOVV9JQ09OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0tleWJvYXJkUHJvcGVydGllc30gcHJvcGVydGllcyAtIE9uLXNjcmVlbiBrZXlib2FyZCBjb25maWd1cmF0aW9uIChpZiBhdmFpbGFibGUpLlxuICAgICAqIEByZXR1cm4ge1NldEdsb2JhbFByb3BlcnRpZXN9XG4gICAgICovXG4gICAgc2V0S2V5Ym9hcmRQcm9wZXJ0aWVzIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEtleWJvYXJkUHJvcGVydGllcywgcHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNldEdsb2JhbFByb3BlcnRpZXMuS0VZX0tFWUJPQVJEX1BST1BFUlRJRVMsIHByb3BlcnRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtLZXlib2FyZFByb3BlcnRpZXN9XG4gICAgICovXG4gICAgZ2V0S2V5Ym9hcmRQcm9wZXJ0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEtleWJvYXJkUHJvcGVydGllcywgU2V0R2xvYmFsUHJvcGVydGllcy5LRVlfS0VZQk9BUkRfUFJPUEVSVElFUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZW51TGF5b3V0fSBsYXlvdXQgLSBTZXRzIHRoZSBsYXlvdXQgb2YgdGhlIG1haW4gbWVudSBzY3JlZW4uIElmIHRoaXMgaXMgc2VudCB3aGlsZSBhIG1lbnUgaXMgYWxyZWFkeSBvbi1cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbiwgdGhlIGhlYWQgdW5pdCB3aWxsIGNoYW5nZSB0aGUgZGlzcGxheSB0byB0aGUgbmV3IGxheW91dCB0eXBlLlxuICAgICAqIEByZXR1cm4ge1NldEdsb2JhbFByb3BlcnRpZXN9XG4gICAgICovXG4gICAgc2V0TWVudUxheW91dCAobGF5b3V0KSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKE1lbnVMYXlvdXQsIGxheW91dCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNldEdsb2JhbFByb3BlcnRpZXMuS0VZX01FTlVfTEFZT1VULCBsYXlvdXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNZW51TGF5b3V0fVxuICAgICAqL1xuICAgIGdldE1lbnVMYXlvdXQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTWVudUxheW91dCwgU2V0R2xvYmFsUHJvcGVydGllcy5LRVlfTUVOVV9MQVlPVVQpO1xuICAgIH1cbn1cblxuU2V0R2xvYmFsUHJvcGVydGllcy5LRVlfVVNFUl9MT0NBVElPTiA9ICd1c2VyTG9jYXRpb24nO1xuU2V0R2xvYmFsUHJvcGVydGllcy5LRVlfSEVMUF9QUk9NUFQgPSAnaGVscFByb21wdCc7XG5TZXRHbG9iYWxQcm9wZXJ0aWVzLktFWV9USU1FT1VUX1BST01QVCA9ICd0aW1lb3V0UHJvbXB0JztcblNldEdsb2JhbFByb3BlcnRpZXMuS0VZX1ZSX0hFTFBfVElUTEUgPSAndnJIZWxwVGl0bGUnO1xuU2V0R2xvYmFsUHJvcGVydGllcy5LRVlfVlJfSEVMUCA9ICd2ckhlbHAnO1xuU2V0R2xvYmFsUHJvcGVydGllcy5LRVlfTUVOVV9USVRMRSA9ICdtZW51VGl0bGUnO1xuU2V0R2xvYmFsUHJvcGVydGllcy5LRVlfTUVOVV9JQ09OID0gJ21lbnVJY29uJztcblNldEdsb2JhbFByb3BlcnRpZXMuS0VZX0tFWUJPQVJEX1BST1BFUlRJRVMgPSAna2V5Ym9hcmRQcm9wZXJ0aWVzJztcblNldEdsb2JhbFByb3BlcnRpZXMuS0VZX01FTlVfTEFZT1VUID0gJ21lbnVMYXlvdXQnO1xuXG5leHBvcnQgeyBTZXRHbG9iYWxQcm9wZXJ0aWVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgUnBjUmVzcG9uc2UgfSBmcm9tICcuLi9ScGNSZXNwb25zZS5qcyc7XG5cbmNsYXNzIFNldEdsb2JhbFByb3BlcnRpZXNSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlNldEdsb2JhbFByb3BlcnRpZXMpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBTZXRHbG9iYWxQcm9wZXJ0aWVzUmVzcG9uc2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBUaGUgZGlmZmVyZW50IGdsb2JhbCBwcm9wZXJ0aWVzLlxuICogQHR5cGVkZWYge0VudW19IEdsb2JhbFByb3BlcnR5XG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBHbG9iYWxQcm9wZXJ0eSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2NhdGlvbiBvZiB0aGUgdXNlcidzIHNlYXQgb2Ygc2V0R2xvYmFsUHJvcGVydGllc1xuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVTRVJfTE9DQVRJT04gKCkge1xuICAgICAgICByZXR1cm4gR2xvYmFsUHJvcGVydHkuX01BUC5VU0VSX0xPQ0FUSU9OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBwcm9wZXJ0eSBoZWxwUHJvbXB0IG9mIHNldEdsb2JhbFByb3BlcnRpZXNcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBIRUxQUFJPTVBUICgpIHtcbiAgICAgICAgcmV0dXJuIEdsb2JhbFByb3BlcnR5Ll9NQVAuSEVMUFBST01QVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcHJvcGVydHkgdGltZW91dFByb21wdCBvZiBzZXRHbG9iYWxQcm9wZXJ0aWVzXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVElNRU9VVFBST01QVCAoKSB7XG4gICAgICAgIHJldHVybiBHbG9iYWxQcm9wZXJ0eS5fTUFQLlRJTUVPVVRQUk9NUFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHByb3BlcnR5IHZySGVscFRpdGxlIG9mIHNldEdsb2JhbFByb3BlcnRpZXNcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWUkhFTFBUSVRMRSAoKSB7XG4gICAgICAgIHJldHVybiBHbG9iYWxQcm9wZXJ0eS5fTUFQLlZSSEVMUFRJVExFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBwcm9wZXJ0eSBhcnJheSBvZiB2ckhlbHAgb2Ygc2V0R2xvYmFsUHJvcGVydGllc1xuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZSSEVMUElURU1TICgpIHtcbiAgICAgICAgcmV0dXJuIEdsb2JhbFByb3BlcnR5Ll9NQVAuVlJIRUxQSVRFTVM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHByb3BlcnR5IGluLWFwcCBtZW51IG5hbWUgb2Ygc2V0R2xvYmFsUHJvcGVydGllc1xuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE1FTlVOQU1FICgpIHtcbiAgICAgICAgcmV0dXJuIEdsb2JhbFByb3BlcnR5Ll9NQVAuTUVOVU5BTUU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHByb3BlcnR5IGluLWFwcCBtZW51IGljb24gb2Ygc2V0R2xvYmFsUHJvcGVydGllc1xuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE1FTlVJQ09OICgpIHtcbiAgICAgICAgcmV0dXJuIEdsb2JhbFByb3BlcnR5Ll9NQVAuTUVOVUlDT047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9uLXNjcmVlbiBrZXlib2FyZCBjb25maWd1cmF0aW9uIG9mIHNldEdsb2JhbFByb3BlcnRpZXNcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBLRVlCT0FSRFBST1BFUlRJRVMgKCkge1xuICAgICAgICByZXR1cm4gR2xvYmFsUHJvcGVydHkuX01BUC5LRVlCT0FSRFBST1BFUlRJRVM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gR2xvYmFsUHJvcGVydHkuX3ZhbHVlRm9yS2V5KGtleSwgR2xvYmFsUHJvcGVydHkuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBHbG9iYWxQcm9wZXJ0eS5fa2V5Rm9yVmFsdWUodmFsdWUsIEdsb2JhbFByb3BlcnR5Ll9NQVApO1xuICAgIH1cbn1cblxuR2xvYmFsUHJvcGVydHkuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdVU0VSX0xPQ0FUSU9OJzogJ1VTRVJfTE9DQVRJT04nLFxuICAgICdIRUxQUFJPTVBUJzogJ0hFTFBQUk9NUFQnLFxuICAgICdUSU1FT1VUUFJPTVBUJzogJ1RJTUVPVVRQUk9NUFQnLFxuICAgICdWUkhFTFBUSVRMRSc6ICdWUkhFTFBUSVRMRScsXG4gICAgJ1ZSSEVMUElURU1TJzogJ1ZSSEVMUElURU1TJyxcbiAgICAnTUVOVU5BTUUnOiAnTUVOVU5BTUUnLFxuICAgICdNRU5VSUNPTic6ICdNRU5VSUNPTicsXG4gICAgJ0tFWUJPQVJEUFJPUEVSVElFUyc6ICdLRVlCT0FSRFBST1BFUlRJRVMnLFxufSk7XG5cbmV4cG9ydCB7IEdsb2JhbFByb3BlcnR5IH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgR2xvYmFsUHJvcGVydHkgfSBmcm9tICcuLi9lbnVtcy9HbG9iYWxQcm9wZXJ0eS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbi8qKlxuICogQWxsb3dzIHJlc2V0dGluZyBnbG9iYWwgcHJvcGVydGllcy5cbiAqL1xuY2xhc3MgUmVzZXRHbG9iYWxQcm9wZXJ0aWVzIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5SZXNldEdsb2JhbFByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7R2xvYmFsUHJvcGVydHlbXX0gcHJvcGVydGllcyAtIENvbnRhaW5zIHRoZSBuYW1lcyBvZiBhbGwgZ2xvYmFsIHByb3BlcnRpZXMgKGxpa2UgdGltZW91dFByb21wdCkgdGhhdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSB1bnNldC4gUmVzZXR0aW5nIG1lYW5zLCB0aGF0IHRoZXkgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBhdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHVwIChkZWZhdWx0KVxuICAgICAqIEByZXR1cm4ge1Jlc2V0R2xvYmFsUHJvcGVydGllc31cbiAgICAgKi9cbiAgICBzZXRQcm9wZXJ0aWVzIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEdsb2JhbFByb3BlcnR5LCBwcm9wZXJ0aWVzLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVzZXRHbG9iYWxQcm9wZXJ0aWVzLktFWV9QUk9QRVJUSUVTLCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7R2xvYmFsUHJvcGVydHlbXX1cbiAgICAgKi9cbiAgICBnZXRQcm9wZXJ0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEdsb2JhbFByb3BlcnR5LCBSZXNldEdsb2JhbFByb3BlcnRpZXMuS0VZX1BST1BFUlRJRVMpO1xuICAgIH1cbn1cblxuUmVzZXRHbG9iYWxQcm9wZXJ0aWVzLktFWV9QUk9QRVJUSUVTID0gJ3Byb3BlcnRpZXMnO1xuXG5leHBvcnQgeyBSZXNldEdsb2JhbFByb3BlcnRpZXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgUmVzZXRHbG9iYWxQcm9wZXJ0aWVzUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5SZXNldEdsb2JhbFByb3BlcnRpZXMpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBSZXNldEdsb2JhbFByb3BlcnRpZXNSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbmNsYXNzIE1lbnVQYXJhbXMgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpZCAtIHVuaXF1ZSBJRCBvZiB0aGUgc3ViIG1lbnUsIHRoZSBjb21tYW5kIHdpbGwgYmUgYWRkZWQgdG8uIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGluIGFwcGxpY2F0aW9uIG1lbnUuXG4gICAgICogQHJldHVybiB7TWVudVBhcmFtc31cbiAgICAgKi9cbiAgICBzZXRQYXJlbnRJRCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTWVudVBhcmFtcy5LRVlfUEFSRU5UX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRQYXJlbnRJRCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihNZW51UGFyYW1zLktFWV9QQVJFTlRfSUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwb3NpdGlvbiAtIFBvc2l0aW9uIHdpdGhpbiB0aGUgaXRlbXMgdGhhdCBhcmUgYXJlIGF0IHRvcCBsZXZlbCBvZiB0aGUgaW4gYXBwbGljYXRpb24gbWVudS4gMCB3aWxsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0IGF0IHRoZSBmcm9udC4gMSB3aWxsIGluc2VydCBhdCB0aGUgc2Vjb25kIHBvc2l0aW9uLiBpZiBwb3NpdGlvbiBpcyBncmVhdGVyIG9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWwgdGhhbiB0aGUgbnVtYmVyIG9mIGl0ZW1zIG9uIHRvcCBsZXZlbCwgdGhlIHN1YiBtZW51IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGVuZC5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIHBhcmFtIHdhcyBvbWl0dGVkIHRoZSBlbnRyeSB3aWxsIGJlIGFkZGVkIGF0IHRoZSBlbmQuXG4gICAgICogQHJldHVybiB7TWVudVBhcmFtc31cbiAgICAgKi9cbiAgICBzZXRQb3NpdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTWVudVBhcmFtcy5LRVlfUE9TSVRJT04sIHBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFBvc2l0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE1lbnVQYXJhbXMuS0VZX1BPU0lUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFRleHQgdG8gc2hvdyBpbiB0aGUgbWVudSBmb3IgdGhpcyBzdWIgbWVudS5cbiAgICAgKiBAcmV0dXJuIHtNZW51UGFyYW1zfVxuICAgICAqL1xuICAgIHNldE1lbnVOYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE1lbnVQYXJhbXMuS0VZX01FTlVfTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRNZW51TmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihNZW51UGFyYW1zLktFWV9NRU5VX05BTUUpO1xuICAgIH1cbn1cblxuTWVudVBhcmFtcy5LRVlfUEFSRU5UX0lEID0gJ3BhcmVudElEJztcbk1lbnVQYXJhbXMuS0VZX1BPU0lUSU9OID0gJ3Bvc2l0aW9uJztcbk1lbnVQYXJhbXMuS0VZX01FTlVfTkFNRSA9ICdtZW51TmFtZSc7XG5cbmV4cG9ydCB7IE1lbnVQYXJhbXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBNZW51UGFyYW1zIH0gZnJvbSAnLi4vc3RydWN0cy9NZW51UGFyYW1zLmpzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnLi4vc3RydWN0cy9JbWFnZS5qcyc7XG5cbi8qKlxuICogQWRkcyBhIGNvbW1hbmQgdG8gdGhlIGluIGFwcGxpY2F0aW9uIG1lbnUuIEVpdGhlciBtZW51UGFyYW1zIG9yIHZyQ29tbWFuZHMgbXVzdCBiZSBwcm92aWRlZC5cbiAqL1xuY2xhc3MgQWRkQ29tbWFuZCBleHRlbmRzIFJwY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuQWRkQ29tbWFuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIC0gdW5pcXVlIElEIG9mIHRoZSBjb21tYW5kIHRvIGFkZC5cbiAgICAgKiBAcmV0dXJuIHtBZGRDb21tYW5kfVxuICAgICAqL1xuICAgIHNldENtZElEIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBZGRDb21tYW5kLktFWV9DTURfSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldENtZElEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEFkZENvbW1hbmQuS0VZX0NNRF9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZW51UGFyYW1zfSBwYXJhbXMgLSBPcHRpb25hbCBzdWIgdmFsdWUgY29udGFpbmluZyBtZW51IHBhcmFtZXRlcnNcbiAgICAgKiBAcmV0dXJuIHtBZGRDb21tYW5kfVxuICAgICAqL1xuICAgIHNldE1lbnVQYXJhbXMgKHBhcmFtcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNZW51UGFyYW1zLCBwYXJhbXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBZGRDb21tYW5kLktFWV9NRU5VX1BBUkFNUywgcGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TWVudVBhcmFtc31cbiAgICAgKi9cbiAgICBnZXRNZW51UGFyYW1zICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KE1lbnVQYXJhbXMsIEFkZENvbW1hbmQuS0VZX01FTlVfUEFSQU1TKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ1tdfSBjb21tYW5kcyAtIEFuIGFycmF5IG9mIHN0cmluZ3MgdG8gYmUgdXNlZCBhcyBWUiBzeW5vbnltcyBmb3IgdGhpcyBjb21tYW5kLiBJZiB0aGlzIGFycmF5IGlzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCwgaXQgbWF5IG5vdCBiZSBlbXB0eS5cbiAgICAgKiBAcmV0dXJuIHtBZGRDb21tYW5kfVxuICAgICAqL1xuICAgIHNldFZyQ29tbWFuZHMgKGNvbW1hbmRzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFkZENvbW1hbmQuS0VZX1ZSX0NPTU1BTkRTLCBjb21tYW5kcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ1tdfVxuICAgICAqL1xuICAgIGdldFZyQ29tbWFuZHMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQWRkQ29tbWFuZC5LRVlfVlJfQ09NTUFORFMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW1hZ2V9IGljb24gLSBJbWFnZSBzdHJ1Y3QgZGV0ZXJtaW5pbmcgd2hldGhlciBzdGF0aWMgb3IgZHluYW1pYyBpY29uLiBJZiBvbWl0dGVkIG9uIHN1cHBvcnRlZCBkaXNwbGF5cyxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgbm8gKG9yIHRoZSBkZWZhdWx0IGlmIGFwcGxpY2FibGUpIGljb24gc2hhbGwgYmUgZGlzcGxheWVkLlxuICAgICAqIEByZXR1cm4ge0FkZENvbW1hbmR9XG4gICAgICovXG4gICAgc2V0Q21kSWNvbiAoaWNvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShJbWFnZSwgaWNvbik7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFkZENvbW1hbmQuS0VZX0NNRF9JQ09OLCBpY29uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SW1hZ2V9XG4gICAgICovXG4gICAgZ2V0Q21kSWNvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChJbWFnZSwgQWRkQ29tbWFuZC5LRVlfQ01EX0lDT04pO1xuICAgIH1cbn1cblxuQWRkQ29tbWFuZC5LRVlfQ01EX0lEID0gJ2NtZElEJztcbkFkZENvbW1hbmQuS0VZX01FTlVfUEFSQU1TID0gJ21lbnVQYXJhbXMnO1xuQWRkQ29tbWFuZC5LRVlfVlJfQ09NTUFORFMgPSAndnJDb21tYW5kcyc7XG5BZGRDb21tYW5kLktFWV9DTURfSUNPTiA9ICdjbWRJY29uJztcblxuZXhwb3J0IHsgQWRkQ29tbWFuZCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBBZGRDb21tYW5kUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5BZGRDb21tYW5kKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgQWRkQ29tbWFuZFJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG4vKipcbiAqIERlbGV0ZXMgYWxsIGNvbW1hbmRzIGZyb20gdGhlIGluLWFwcGxpY2F0aW9uIG1lbnUgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgaWQuXG4gKi9cbmNsYXNzIERlbGV0ZUNvbW1hbmQgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkRlbGV0ZUNvbW1hbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpZCAtIElEIG9mIHRoZSBjb21tYW5kKHMpIHRvIGRlbGV0ZS5cbiAgICAgKiBAcmV0dXJuIHtEZWxldGVDb21tYW5kfVxuICAgICAqL1xuICAgIHNldENtZElEIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEZWxldGVDb21tYW5kLktFWV9DTURfSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldENtZElEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERlbGV0ZUNvbW1hbmQuS0VZX0NNRF9JRCk7XG4gICAgfVxufVxuXG5EZWxldGVDb21tYW5kLktFWV9DTURfSUQgPSAnY21kSUQnO1xuXG5leHBvcnQgeyBEZWxldGVDb21tYW5kIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgUnBjUmVzcG9uc2UgfSBmcm9tICcuLi9ScGNSZXNwb25zZS5qcyc7XG5cbmNsYXNzIERlbGV0ZUNvbW1hbmRSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkRlbGV0ZUNvbW1hbmQpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBEZWxldGVDb21tYW5kUmVzcG9uc2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBNZW51TGF5b3V0IH0gZnJvbSAnLi4vZW51bXMvTWVudUxheW91dC5qcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJy4uL3N0cnVjdHMvSW1hZ2UuanMnO1xuXG4vKipcbiAqIEFkZHMgYSBzdWIgbWVudSB0byB0aGUgaW4tYXBwbGljYXRpb24gbWVudS5cbiAqL1xuY2xhc3MgQWRkU3ViTWVudSBleHRlbmRzIFJwY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuQWRkU3ViTWVudSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIC0gdW5pcXVlIElEIG9mIHRoZSBzdWIgbWVudSB0byBhZGQuXG4gICAgICogQHJldHVybiB7QWRkU3ViTWVudX1cbiAgICAgKi9cbiAgICBzZXRNZW51SUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFkZFN1Yk1lbnUuS0VZX01FTlVfSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldE1lbnVJRCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihBZGRTdWJNZW51LktFWV9NRU5VX0lEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb24gLSBQb3NpdGlvbiB3aXRoaW4gdGhlIGl0ZW1zIHRoYXQgYXJlIGFyZSBhdCB0b3AgbGV2ZWwgb2YgdGhlIGluIGFwcGxpY2F0aW9uIG1lbnUuIDAgd2lsbFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCBhdCB0aGUgZnJvbnQuIDEgd2lsbCBpbnNlcnQgYXQgdGhlIHNlY29uZCBwb3NpdGlvbi4gSWYgcG9zaXRpb24gaXMgZ3JlYXRlciBvclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFsIHRoYW4gdGhlIG51bWJlciBvZiBpdGVtcyBvbiB0b3AgbGV2ZWwsIHRoZSBzdWIgbWVudSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBlbmQuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zaXRpb24gb2YgYW55IHN1Ym1lbnUgd2lsbCBhbHdheXMgYmUgbG9jYXRlZCBiZWZvcmUgdGhlIHJldHVybiBhbmQgZXhpdCBvcHRpb25zIElmXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBwYXJhbSB3YXMgb21pdHRlZCB0aGUgZW50cnkgd2lsbCBiZSBhZGRlZCBhdCB0aGUgZW5kLlxuICAgICAqIEByZXR1cm4ge0FkZFN1Yk1lbnV9XG4gICAgICovXG4gICAgc2V0UG9zaXRpb24gKHBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFkZFN1Yk1lbnUuS0VZX1BPU0lUSU9OLCBwb3NpdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRQb3NpdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihBZGRTdWJNZW51LktFWV9QT1NJVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBUZXh0IHRvIHNob3cgaW4gdGhlIG1lbnUgZm9yIHRoaXMgc3ViIG1lbnUuXG4gICAgICogQHJldHVybiB7QWRkU3ViTWVudX1cbiAgICAgKi9cbiAgICBzZXRNZW51TmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBZGRTdWJNZW51LktFWV9NRU5VX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0TWVudU5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQWRkU3ViTWVudS5LRVlfTUVOVV9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0ltYWdlfSBpY29uIC0gVGhlIGltYWdlIGZpZWxkIGZvciBBZGRTdWJNZW51XG4gICAgICogQHJldHVybiB7QWRkU3ViTWVudX1cbiAgICAgKi9cbiAgICBzZXRNZW51SWNvbiAoaWNvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShJbWFnZSwgaWNvbik7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFkZFN1Yk1lbnUuS0VZX01FTlVfSUNPTiwgaWNvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0ltYWdlfVxuICAgICAqL1xuICAgIGdldE1lbnVJY29uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEltYWdlLCBBZGRTdWJNZW51LktFWV9NRU5VX0lDT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TWVudUxheW91dH0gbGF5b3V0IC0gU2V0cyB0aGUgbGF5b3V0IG9mIHRoZSBzdWJtZW51IHNjcmVlbi5cbiAgICAgKiBAcmV0dXJuIHtBZGRTdWJNZW51fVxuICAgICAqL1xuICAgIHNldE1lbnVMYXlvdXQgKGxheW91dCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNZW51TGF5b3V0LCBsYXlvdXQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBZGRTdWJNZW51LktFWV9NRU5VX0xBWU9VVCwgbGF5b3V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TWVudUxheW91dH1cbiAgICAgKi9cbiAgICBnZXRNZW51TGF5b3V0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KE1lbnVMYXlvdXQsIEFkZFN1Yk1lbnUuS0VZX01FTlVfTEFZT1VUKTtcbiAgICB9XG59XG5cbkFkZFN1Yk1lbnUuS0VZX01FTlVfSUQgPSAnbWVudUlEJztcbkFkZFN1Yk1lbnUuS0VZX1BPU0lUSU9OID0gJ3Bvc2l0aW9uJztcbkFkZFN1Yk1lbnUuS0VZX01FTlVfTkFNRSA9ICdtZW51TmFtZSc7XG5BZGRTdWJNZW51LktFWV9NRU5VX0lDT04gPSAnbWVudUljb24nO1xuQWRkU3ViTWVudS5LRVlfTUVOVV9MQVlPVVQgPSAnbWVudUxheW91dCc7XG5cbmV4cG9ydCB7IEFkZFN1Yk1lbnUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgQWRkU3ViTWVudVJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuQWRkU3ViTWVudSk7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB7IEFkZFN1Yk1lbnVSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBEZWxldGVzIGEgc3VibWVudSBmcm9tIHRoZSBpbi1hcHBsaWNhdGlvbiBtZW51LlxuICovXG5jbGFzcyBEZWxldGVTdWJNZW51IGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5EZWxldGVTdWJNZW51KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaWQgLSBUaGUgXCJtZW51SURcIiBvZiB0aGUgc3VibWVudSB0byBkZWxldGUuIChTZWUgYWRkU3ViTWVudS5tZW51SUQpXG4gICAgICogQHJldHVybiB7RGVsZXRlU3ViTWVudX1cbiAgICAgKi9cbiAgICBzZXRNZW51SUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERlbGV0ZVN1Yk1lbnUuS0VZX01FTlVfSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldE1lbnVJRCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEZWxldGVTdWJNZW51LktFWV9NRU5VX0lEKTtcbiAgICB9XG59XG5cbkRlbGV0ZVN1Yk1lbnUuS0VZX01FTlVfSUQgPSAnbWVudUlEJztcblxuZXhwb3J0IHsgRGVsZXRlU3ViTWVudSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBEZWxldGVTdWJNZW51UmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5EZWxldGVTdWJNZW51KTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgRGVsZXRlU3ViTWVudVJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG4vKipcbiAqIFNob3dzIHRoZSBidWlsdCBpbiBtZW51IHZpZXdcbiAqL1xuY2xhc3MgU2hvd0FwcE1lbnUgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlNob3dBcHBNZW51KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaWQgLSBJZiBvbWl0dGVkIHRoZSBITUkgb3BlbnMgdGhlIGFwcCdzIG1lbnUuIElmIHNldCB0byBhIHN1Yi1tZW51IElEIHRoZSBITUkgb3BlbnMgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBzdWItbWVudSBwcmV2aW91c2x5IGFkZGVkIHVzaW5nIGBBZGRTdWJNZW51YC5cbiAgICAgKiBAcmV0dXJuIHtTaG93QXBwTWVudX1cbiAgICAgKi9cbiAgICBzZXRNZW51SUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3dBcHBNZW51LktFWV9NRU5VX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRNZW51SUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2hvd0FwcE1lbnUuS0VZX01FTlVfSUQpO1xuICAgIH1cbn1cblxuU2hvd0FwcE1lbnUuS0VZX01FTlVfSUQgPSAnbWVudUlEJztcblxuZXhwb3J0IHsgU2hvd0FwcE1lbnUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgU2hvd0FwcE1lbnVSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlNob3dBcHBNZW51KTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgU2hvd0FwcE1lbnVSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJy4vSW1hZ2UuanMnO1xuXG4vKipcbiAqIEEgY2hvaWNlIGlzIGFuIG9wdGlvbiBnaXZlbiB0byB0aGUgdXNlciwgd2hpY2ggY2FuIGJlIHNlbGVjdGVkIGVpdGhlciBieSBtZW51LCBvciB0aHJvdWdoIHZvaWNlIHJlY29nbml0aW9uIHN5c3RlbS5cbiAqL1xuY2xhc3MgQ2hvaWNlIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaWRcbiAgICAgKiBAcmV0dXJuIHtDaG9pY2V9XG4gICAgICovXG4gICAgc2V0Q2hvaWNlSUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENob2ljZS5LRVlfQ0hPSUNFX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRDaG9pY2VJRCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDaG9pY2UuS0VZX0NIT0lDRV9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJuIHtDaG9pY2V9XG4gICAgICovXG4gICAgc2V0TWVudU5hbWUgKG5hbWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2hvaWNlLktFWV9NRU5VX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0TWVudU5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ2hvaWNlLktFWV9NRU5VX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nW119IGNvbW1hbmRzXG4gICAgICogQHJldHVybiB7Q2hvaWNlfVxuICAgICAqL1xuICAgIHNldFZyQ29tbWFuZHMgKGNvbW1hbmRzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENob2ljZS5LRVlfVlJfQ09NTUFORFMsIGNvbW1hbmRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0VnJDb21tYW5kcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDaG9pY2UuS0VZX1ZSX0NPTU1BTkRTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0ltYWdlfSBpbWFnZVxuICAgICAqIEByZXR1cm4ge0Nob2ljZX1cbiAgICAgKi9cbiAgICBzZXRJbWFnZSAoaW1hZ2UpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSW1hZ2UsIGltYWdlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2hvaWNlLktFWV9JTUFHRSwgaW1hZ2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtJbWFnZX1cbiAgICAgKi9cbiAgICBnZXRJbWFnZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChJbWFnZSwgQ2hvaWNlLktFWV9JTUFHRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgLSBPcHRpb25hbCBzZWNvbmRhcnkgdGV4dCB0byBkaXNwbGF5OyBlLmcuIGFkZHJlc3Mgb2YgUE9JIGluIGEgc2VhcmNoIHJlc3VsdCBlbnRyeVxuICAgICAqIEByZXR1cm4ge0Nob2ljZX1cbiAgICAgKi9cbiAgICBzZXRTZWNvbmRhcnlUZXh0ICh0ZXh0KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENob2ljZS5LRVlfU0VDT05EQVJZX1RFWFQsIHRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0U2Vjb25kYXJ5VGV4dCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDaG9pY2UuS0VZX1NFQ09OREFSWV9URVhUKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCAtIE9wdGlvbmFsIHRlcnRpYXJ5IHRleHQgdG8gZGlzcGxheTsgZS5nLiBkaXN0YW5jZSB0byBQT0kgZm9yIGEgc2VhcmNoIHJlc3VsdCBlbnRyeVxuICAgICAqIEByZXR1cm4ge0Nob2ljZX1cbiAgICAgKi9cbiAgICBzZXRUZXJ0aWFyeVRleHQgKHRleHQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2hvaWNlLktFWV9URVJUSUFSWV9URVhULCB0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFRlcnRpYXJ5VGV4dCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDaG9pY2UuS0VZX1RFUlRJQVJZX1RFWFQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW1hZ2V9IGltYWdlIC0gT3B0aW9uYWwgc2Vjb25kYXJ5IGltYWdlIHN0cnVjdCBmb3IgY2hvaWNlXG4gICAgICogQHJldHVybiB7Q2hvaWNlfVxuICAgICAqL1xuICAgIHNldFNlY29uZGFyeUltYWdlIChpbWFnZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShJbWFnZSwgaW1hZ2UpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDaG9pY2UuS0VZX1NFQ09OREFSWV9JTUFHRSwgaW1hZ2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtJbWFnZX1cbiAgICAgKi9cbiAgICBnZXRTZWNvbmRhcnlJbWFnZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChJbWFnZSwgQ2hvaWNlLktFWV9TRUNPTkRBUllfSU1BR0UpO1xuICAgIH1cbn1cblxuQ2hvaWNlLktFWV9DSE9JQ0VfSUQgPSAnY2hvaWNlSUQnO1xuQ2hvaWNlLktFWV9NRU5VX05BTUUgPSAnbWVudU5hbWUnO1xuQ2hvaWNlLktFWV9WUl9DT01NQU5EUyA9ICd2ckNvbW1hbmRzJztcbkNob2ljZS5LRVlfSU1BR0UgPSAnaW1hZ2UnO1xuQ2hvaWNlLktFWV9TRUNPTkRBUllfVEVYVCA9ICdzZWNvbmRhcnlUZXh0JztcbkNob2ljZS5LRVlfVEVSVElBUllfVEVYVCA9ICd0ZXJ0aWFyeVRleHQnO1xuQ2hvaWNlLktFWV9TRUNPTkRBUllfSU1BR0UgPSAnc2Vjb25kYXJ5SW1hZ2UnO1xuXG5leHBvcnQgeyBDaG9pY2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBDaG9pY2UgfSBmcm9tICcuLi9zdHJ1Y3RzL0Nob2ljZS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbi8qKlxuICogY3JlYXRlcyBpbnRlcmFjdGlvbiBjaG9pY2Ugc2V0IHRvIGJlIHVzZWQgbGF0ZXIgYnkgcGVyZm9ybUludGVyYWN0aW9uXG4gKi9cbmNsYXNzIENyZWF0ZUludGVyYWN0aW9uQ2hvaWNlU2V0IGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5DcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIC0gVW5pcXVlIElEIHVzZWQgZm9yIHRoaXMgaW50ZXJhY3Rpb24gY2hvaWNlIHNldC5cbiAgICAgKiBAcmV0dXJuIHtDcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldH1cbiAgICAgKi9cbiAgICBzZXRJbnRlcmFjdGlvbkNob2ljZVNldElEIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldC5LRVlfSU5URVJBQ1RJT05fQ0hPSUNFX1NFVF9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0SW50ZXJhY3Rpb25DaG9pY2VTZXRJRCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldC5LRVlfSU5URVJBQ1RJT05fQ0hPSUNFX1NFVF9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtDaG9pY2VbXX0gc2V0IC0gQSBjaG9pY2UgaXMgYW4gb3B0aW9uIGdpdmVuIHRvIHRoZSB1c2VyLCB3aGljaCBjYW4gYmUgc2VsZWN0ZWQgZWl0aGVyIGJ5IG1lbnUsIG9yIHRocm91Z2hcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB2b2ljZSByZWNvZ25pdGlvbiBzeXN0ZW0uXG4gICAgICogQHJldHVybiB7Q3JlYXRlSW50ZXJhY3Rpb25DaG9pY2VTZXR9XG4gICAgICovXG4gICAgc2V0Q2hvaWNlU2V0IChzZXQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQ2hvaWNlLCBzZXQsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldC5LRVlfQ0hPSUNFX1NFVCwgc2V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Q2hvaWNlW119XG4gICAgICovXG4gICAgZ2V0Q2hvaWNlU2V0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KENob2ljZSwgQ3JlYXRlSW50ZXJhY3Rpb25DaG9pY2VTZXQuS0VZX0NIT0lDRV9TRVQpO1xuICAgIH1cbn1cblxuQ3JlYXRlSW50ZXJhY3Rpb25DaG9pY2VTZXQuS0VZX0lOVEVSQUNUSU9OX0NIT0lDRV9TRVRfSUQgPSAnaW50ZXJhY3Rpb25DaG9pY2VTZXRJRCc7XG5DcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldC5LRVlfQ0hPSUNFX1NFVCA9ICdjaG9pY2VTZXQnO1xuXG5leHBvcnQgeyBDcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBDcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldFJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuQ3JlYXRlSW50ZXJhY3Rpb25DaG9pY2VTZXQpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBDcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldFJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogRm9yIHRvdWNoc2NyZWVuIGludGVyYWN0aW9ucywgdGhlIG1vZGUgb2YgaG93IHRoZSBjaG9pY2VzIGFyZSBwcmVzZW50ZWQuXG4gKiBAdHlwZWRlZiB7RW51bX0gTGF5b3V0TW9kZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgTGF5b3V0TW9kZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1vZGUgY2F1c2VzIHRoZSBpbnRlcmFjdGlvbiB0byBkaXNwbGF5IHRoZSBwcmV2aW91cyBzZXQgb2YgY2hvaWNlcyBhcyBpY29ucy5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBJQ09OX09OTFkgKCkge1xuICAgICAgICByZXR1cm4gTGF5b3V0TW9kZS5fTUFQLklDT05fT05MWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1vZGUgY2F1c2VzIHRoZSBpbnRlcmFjdGlvbiB0byBkaXNwbGF5IHRoZSBwcmV2aW91cyBzZXQgb2YgY2hvaWNlcyBhcyBpY29ucyBhbG9uZyB3aXRoIGEgc2VhcmNoIGZpZWxkIGluXG4gICAgICogdGhlIEhNSS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBJQ09OX1dJVEhfU0VBUkNIICgpIHtcbiAgICAgICAgcmV0dXJuIExheW91dE1vZGUuX01BUC5JQ09OX1dJVEhfU0VBUkNIO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbW9kZSBjYXVzZXMgdGhlIGludGVyYWN0aW9uIHRvIGRpc3BsYXkgdGhlIHByZXZpb3VzIHNldCBvZiBjaG9pY2VzIGFzIGEgbGlzdC5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBMSVNUX09OTFkgKCkge1xuICAgICAgICByZXR1cm4gTGF5b3V0TW9kZS5fTUFQLkxJU1RfT05MWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1vZGUgY2F1c2VzIHRoZSBpbnRlcmFjdGlvbiB0byBkaXNwbGF5IHRoZSBwcmV2aW91cyBzZXQgb2YgY2hvaWNlcyBhcyBhIGxpc3QgYWxvbmcgd2l0aCBhIHNlYXJjaCBmaWVsZCBpblxuICAgICAqIHRoZSBITUkuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTElTVF9XSVRIX1NFQVJDSCAoKSB7XG4gICAgICAgIHJldHVybiBMYXlvdXRNb2RlLl9NQVAuTElTVF9XSVRIX1NFQVJDSDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1vZGUgY2F1c2VzIHRoZSBpbnRlcmFjdGlvbiB0byBpbW1lZGlhdGVseSBkaXNwbGF5IGEga2V5Ym9hcmQgZW50cnkgdGhyb3VnaCB0aGUgSE1JLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEtFWUJPQVJEICgpIHtcbiAgICAgICAgcmV0dXJuIExheW91dE1vZGUuX01BUC5LRVlCT0FSRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBMYXlvdXRNb2RlLl92YWx1ZUZvcktleShrZXksIExheW91dE1vZGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBMYXlvdXRNb2RlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgTGF5b3V0TW9kZS5fTUFQKTtcbiAgICB9XG59XG5cbkxheW91dE1vZGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdJQ09OX09OTFknOiAnSUNPTl9PTkxZJyxcbiAgICAnSUNPTl9XSVRIX1NFQVJDSCc6ICdJQ09OX1dJVEhfU0VBUkNIJyxcbiAgICAnTElTVF9PTkxZJzogJ0xJU1RfT05MWScsXG4gICAgJ0xJU1RfV0lUSF9TRUFSQ0gnOiAnTElTVF9XSVRIX1NFQVJDSCcsXG4gICAgJ0tFWUJPQVJEJzogJ0tFWUJPQVJEJyxcbn0pO1xuXG5leHBvcnQgeyBMYXlvdXRNb2RlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogRm9yIGFwcGxpY2F0aW9uLXJlcXVlc3RlZCBpbnRlcmFjdGlvbnMsIHRoaXMgbW9kZSBpbmRpY2F0ZXMgdGhlIG1ldGhvZCBpbiB3aGljaCB0aGUgdXNlciBpcyBub3RpZmllZCBhbmQgdXNlcyB0aGVcbiAqIGludGVyYWN0aW9uLlxuICogQHR5cGVkZWYge0VudW19IEludGVyYWN0aW9uTW9kZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgSW50ZXJhY3Rpb25Nb2RlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbW9kZSBjYXVzZXMgdGhlIGludGVyYWN0aW9uIHRvIG9ubHkgb2NjdXIgb24gdGhlIGRpc3BsYXksIG1lYW5pbmcgdGhlIGNob2ljZXMgYXJlIHByb3ZpZGVkIG9ubHkgdmlhIHRoZVxuICAgICAqIGRpc3BsYXkuIE5vIFZvaWNlIEludGVyYWN0aW9uLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE1BTlVBTF9PTkxZICgpIHtcbiAgICAgICAgcmV0dXJuIEludGVyYWN0aW9uTW9kZS5fTUFQLk1BTlVBTF9PTkxZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbW9kZSBjYXVzZXMgdGhlIGludGVyYWN0aW9uIHRvIG9ubHkgb2NjdXIgdXNpbmcgdGhlIGhlYWR1bml0cyBWUiBzeXN0ZW0uIFNlbGVjdGlvbnMgYXJlIG1hZGUgYnkgc2F5aW5nIHRoZVxuICAgICAqIGNvbW1hbmQuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVlJfT05MWSAoKSB7XG4gICAgICAgIHJldHVybiBJbnRlcmFjdGlvbk1vZGUuX01BUC5WUl9PTkxZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbW9kZSBjYXVzZXMgYm90aCBhIFZSIGFuZCBkaXNwbGF5IHNlbGVjdGlvbiBvcHRpb24gZm9yIGFuIGludGVyYWN0aW9uLiBUaGUgdXNlciB3aWxsIGZpcnN0IGJlIGFza2VkIHZpYVxuICAgICAqIFZvaWNlIEludGVyYWN0aW9uIChpZiBhdmFpbGFibGUpLiBJZiB0aGlzIGlzIHVuc3VjY2Vzc2Z1bCwgdGhlIHN5c3RlbSB3aWxsIHN3aXRjaCB0byBtYW51YWwgaW5wdXQuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQk9USCAoKSB7XG4gICAgICAgIHJldHVybiBJbnRlcmFjdGlvbk1vZGUuX01BUC5CT1RIO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEludGVyYWN0aW9uTW9kZS5fdmFsdWVGb3JLZXkoa2V5LCBJbnRlcmFjdGlvbk1vZGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJbnRlcmFjdGlvbk1vZGUuX2tleUZvclZhbHVlKHZhbHVlLCBJbnRlcmFjdGlvbk1vZGUuX01BUCk7XG4gICAgfVxufVxuXG5JbnRlcmFjdGlvbk1vZGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdNQU5VQUxfT05MWSc6ICdNQU5VQUxfT05MWScsXG4gICAgJ1ZSX09OTFknOiAnVlJfT05MWScsXG4gICAgJ0JPVEgnOiAnQk9USCcsXG59KTtcblxuZXhwb3J0IHsgSW50ZXJhY3Rpb25Nb2RlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgVnJIZWxwSXRlbSB9IGZyb20gJy4uL3N0cnVjdHMvVnJIZWxwSXRlbS5qcyc7XG5pbXBvcnQgeyBMYXlvdXRNb2RlIH0gZnJvbSAnLi4vZW51bXMvTGF5b3V0TW9kZS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBUVFNDaHVuayB9IGZyb20gJy4uL3N0cnVjdHMvVFRTQ2h1bmsuanMnO1xuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25Nb2RlIH0gZnJvbSAnLi4vZW51bXMvSW50ZXJhY3Rpb25Nb2RlLmpzJztcblxuLyoqXG4gKiBUcmlnZ2VycyBhbiBpbnRlcmFjdGlvbiAoZS5nLiBcIlBlcm1pdCBHUFM/XCIgLSBZZXMsIG5vLCBBbHdheXMgQWxsb3cpLlxuICovXG5jbGFzcyBQZXJmb3JtSW50ZXJhY3Rpb24gZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlBlcmZvcm1JbnRlcmFjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgLSBUZXh0IHRvIGJlIGRpc3BsYXllZCBmaXJzdC5cbiAgICAgKiBAcmV0dXJuIHtQZXJmb3JtSW50ZXJhY3Rpb259XG4gICAgICovXG4gICAgc2V0SW5pdGlhbFRleHQgKHRleHQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUGVyZm9ybUludGVyYWN0aW9uLktFWV9JTklUSUFMX1RFWFQsIHRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0SW5pdGlhbFRleHQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUGVyZm9ybUludGVyYWN0aW9uLktFWV9JTklUSUFMX1RFWFQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VFRTQ2h1bmtbXX0gcHJvbXB0IC0gVGhpcyBpcyB0aGUgaW5pdGlhbCBwcm9tcHQgc3Bva2VuIHRvIHRoZSB1c2VyIGF0IHRoZSBzdGFydCBvZiBhbiBpbnRlcmFjdGlvbi4gQW5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5IG9mIHRleHQgY2h1bmtzIG9mIHR5cGUgVFRTQ2h1bmsuIFNlZSBUVFNDaHVuay4gVGhlIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIGl0ZW0uXG4gICAgICogQHJldHVybiB7UGVyZm9ybUludGVyYWN0aW9ufVxuICAgICAqL1xuICAgIHNldEluaXRpYWxQcm9tcHQgKHByb21wdCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShUVFNDaHVuaywgcHJvbXB0LCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUGVyZm9ybUludGVyYWN0aW9uLktFWV9JTklUSUFMX1BST01QVCwgcHJvbXB0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VFRTQ2h1bmtbXX1cbiAgICAgKi9cbiAgICBnZXRJbml0aWFsUHJvbXB0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRUU0NodW5rLCBQZXJmb3JtSW50ZXJhY3Rpb24uS0VZX0lOSVRJQUxfUFJPTVBUKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0ludGVyYWN0aW9uTW9kZX0gbW9kZSAtIFNlZSBJbnRlcmFjdGlvbk1vZGUuXG4gICAgICogQHJldHVybiB7UGVyZm9ybUludGVyYWN0aW9ufVxuICAgICAqL1xuICAgIHNldEludGVyYWN0aW9uTW9kZSAobW9kZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShJbnRlcmFjdGlvbk1vZGUsIG1vZGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQZXJmb3JtSW50ZXJhY3Rpb24uS0VZX0lOVEVSQUNUSU9OX01PREUsIG1vZGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtJbnRlcmFjdGlvbk1vZGV9XG4gICAgICovXG4gICAgZ2V0SW50ZXJhY3Rpb25Nb2RlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEludGVyYWN0aW9uTW9kZSwgUGVyZm9ybUludGVyYWN0aW9uLktFWV9JTlRFUkFDVElPTl9NT0RFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcltdfSBsaXN0IC0gTGlzdCBvZiBpbnRlcmFjdGlvbiBjaG9pY2Ugc2V0IElEcyB0byB1c2Ugd2l0aCBhbiBpbnRlcmFjdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtQZXJmb3JtSW50ZXJhY3Rpb259XG4gICAgICovXG4gICAgc2V0SW50ZXJhY3Rpb25DaG9pY2VTZXRJRExpc3QgKGxpc3QpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUGVyZm9ybUludGVyYWN0aW9uLktFWV9JTlRFUkFDVElPTl9DSE9JQ0VfU0VUX0lETElTVCwgbGlzdCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcltdfVxuICAgICAqL1xuICAgIGdldEludGVyYWN0aW9uQ2hvaWNlU2V0SURMaXN0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFBlcmZvcm1JbnRlcmFjdGlvbi5LRVlfSU5URVJBQ1RJT05fQ0hPSUNFX1NFVF9JRExJU1QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VFRTQ2h1bmtbXX0gcHJvbXB0IC0gSGVscCB0ZXh0LiBUaGlzIGlzIHRoZSBzcG9rZW4gc3RyaW5nIHdoZW4gYSB1c2VyIHNwZWFrcyBcImhlbHBcIiB3aGVuIHRoZSBpbnRlcmFjdGlvblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgb2NjdXJyaW5nLiBBbiBhcnJheSBvZiB0ZXh0IGNodW5rcyBvZiB0eXBlIFRUU0NodW5rLiBTZWUgVFRTQ2h1bmsuIFRoZSBhcnJheSBtdXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGF0IGxlYXN0IG9uZSBpdGVtLlxuICAgICAqIEByZXR1cm4ge1BlcmZvcm1JbnRlcmFjdGlvbn1cbiAgICAgKi9cbiAgICBzZXRIZWxwUHJvbXB0IChwcm9tcHQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVFRTQ2h1bmssIHByb21wdCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFBlcmZvcm1JbnRlcmFjdGlvbi5LRVlfSEVMUF9QUk9NUFQsIHByb21wdCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RUU0NodW5rW119XG4gICAgICovXG4gICAgZ2V0SGVscFByb21wdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUVFNDaHVuaywgUGVyZm9ybUludGVyYWN0aW9uLktFWV9IRUxQX1BST01QVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUVFNDaHVua1tdfSBwcm9tcHQgLSBUaW1lb3V0IHRleHQuIFRoaXMgdGV4dCBpcyBzcG9rZW4gd2hlbiBhIFZSIGludGVyYWN0aW9uIHRpbWVzIG91dC4gQW4gYXJyYXkgb2YgdGV4dFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtzIG9mIHR5cGUgVFRTQ2h1bmsuIFNlZSBUVFNDaHVuay4gVGhlIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgaXRlbS5cbiAgICAgKiBAcmV0dXJuIHtQZXJmb3JtSW50ZXJhY3Rpb259XG4gICAgICovXG4gICAgc2V0VGltZW91dFByb21wdCAocHJvbXB0KSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRUU0NodW5rLCBwcm9tcHQsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQZXJmb3JtSW50ZXJhY3Rpb24uS0VZX1RJTUVPVVRfUFJPTVBULCBwcm9tcHQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUVFNDaHVua1tdfVxuICAgICAqL1xuICAgIGdldFRpbWVvdXRQcm9tcHQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVFRTQ2h1bmssIFBlcmZvcm1JbnRlcmFjdGlvbi5LRVlfVElNRU9VVF9QUk9NUFQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0aW1lb3V0IC0gVGltZW91dCBpbiBtaWxsaXNlY29uZHMuIElmIG9taXR0ZWQgYSBzdGFuZGFyZCB2YWx1ZSBvZiAxMDAwMCBtaWxsaXNlY29uZHMgaXMgdXNlZC5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpZXMgb25seSB0byB0aGUgbWVudSBwb3J0aW9uIG9mIHRoZSBpbnRlcmFjdGlvbi4gVGhlIFZSIHRpbWVvdXQgd2lsbCBiZSBoYW5kbGVkIGJ5XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGxhdGZvcm0uXG4gICAgICogQHJldHVybiB7UGVyZm9ybUludGVyYWN0aW9ufVxuICAgICAqL1xuICAgIHNldFRpbWVvdXQgKHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUGVyZm9ybUludGVyYWN0aW9uLktFWV9USU1FT1VULCB0aW1lb3V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFRpbWVvdXQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUGVyZm9ybUludGVyYWN0aW9uLktFWV9USU1FT1VUKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZySGVscEl0ZW1bXX0gaGVscCAtIEFiaWxpdHkgdG8gc2VuZCBzdWdnZXN0ZWQgVlIgSGVscCBJdGVtcyB0byBkaXNwbGF5IG9uLXNjcmVlbiBkdXJpbmcgUGVyZm9ybVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJhY3Rpb24uIElmIG9taXR0ZWQgb24gc3VwcG9ydGVkIGRpc3BsYXlzLCB0aGUgZGVmYXVsdCBnZW5lcmF0ZWQgbGlzdCBvZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkIGNob2ljZXMgc2hhbGwgYmUgZGlzcGxheWVkLlxuICAgICAqIEByZXR1cm4ge1BlcmZvcm1JbnRlcmFjdGlvbn1cbiAgICAgKi9cbiAgICBzZXRWckhlbHAgKGhlbHApIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVnJIZWxwSXRlbSwgaGVscCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFBlcmZvcm1JbnRlcmFjdGlvbi5LRVlfVlJfSEVMUCwgaGVscCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZySGVscEl0ZW1bXX1cbiAgICAgKi9cbiAgICBnZXRWckhlbHAgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVnJIZWxwSXRlbSwgUGVyZm9ybUludGVyYWN0aW9uLktFWV9WUl9IRUxQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0xheW91dE1vZGV9IGxheW91dCAtIFNlZSBMYXlvdXRNb2RlLlxuICAgICAqIEByZXR1cm4ge1BlcmZvcm1JbnRlcmFjdGlvbn1cbiAgICAgKi9cbiAgICBzZXRJbnRlcmFjdGlvbkxheW91dCAobGF5b3V0KSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKExheW91dE1vZGUsIGxheW91dCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFBlcmZvcm1JbnRlcmFjdGlvbi5LRVlfSU5URVJBQ1RJT05fTEFZT1VULCBsYXlvdXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtMYXlvdXRNb2RlfVxuICAgICAqL1xuICAgIGdldEludGVyYWN0aW9uTGF5b3V0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KExheW91dE1vZGUsIFBlcmZvcm1JbnRlcmFjdGlvbi5LRVlfSU5URVJBQ1RJT05fTEFZT1VUKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaWQgLSBBbiBJRCBmb3IgdGhpcyBzcGVjaWZpYyBQZXJmb3JtSW50ZXJhY3Rpb24gdG8gYWxsb3cgY2FuY2VsbGF0aW9uIHRocm91Z2ggdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgYENhbmNlbEludGVyYWN0aW9uYCBSUEMuXG4gICAgICogQHJldHVybiB7UGVyZm9ybUludGVyYWN0aW9ufVxuICAgICAqL1xuICAgIHNldENhbmNlbElEIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQZXJmb3JtSW50ZXJhY3Rpb24uS0VZX0NBTkNFTF9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0Q2FuY2VsSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUGVyZm9ybUludGVyYWN0aW9uLktFWV9DQU5DRUxfSUQpO1xuICAgIH1cbn1cblxuUGVyZm9ybUludGVyYWN0aW9uLktFWV9JTklUSUFMX1RFWFQgPSAnaW5pdGlhbFRleHQnO1xuUGVyZm9ybUludGVyYWN0aW9uLktFWV9JTklUSUFMX1BST01QVCA9ICdpbml0aWFsUHJvbXB0JztcblBlcmZvcm1JbnRlcmFjdGlvbi5LRVlfSU5URVJBQ1RJT05fTU9ERSA9ICdpbnRlcmFjdGlvbk1vZGUnO1xuUGVyZm9ybUludGVyYWN0aW9uLktFWV9JTlRFUkFDVElPTl9DSE9JQ0VfU0VUX0lETElTVCA9ICdpbnRlcmFjdGlvbkNob2ljZVNldElETGlzdCc7XG5QZXJmb3JtSW50ZXJhY3Rpb24uS0VZX0hFTFBfUFJPTVBUID0gJ2hlbHBQcm9tcHQnO1xuUGVyZm9ybUludGVyYWN0aW9uLktFWV9USU1FT1VUX1BST01QVCA9ICd0aW1lb3V0UHJvbXB0JztcblBlcmZvcm1JbnRlcmFjdGlvbi5LRVlfVElNRU9VVCA9ICd0aW1lb3V0JztcblBlcmZvcm1JbnRlcmFjdGlvbi5LRVlfVlJfSEVMUCA9ICd2ckhlbHAnO1xuUGVyZm9ybUludGVyYWN0aW9uLktFWV9JTlRFUkFDVElPTl9MQVlPVVQgPSAnaW50ZXJhY3Rpb25MYXlvdXQnO1xuUGVyZm9ybUludGVyYWN0aW9uLktFWV9DQU5DRUxfSUQgPSAnY2FuY2VsSUQnO1xuXG5leHBvcnQgeyBQZXJmb3JtSW50ZXJhY3Rpb24gfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhlIHNvdXJjZSBmcm9tIHdoZXJlIHRoZSBjb21tYW5kIHdhcyB0cmlnZ2VyZWQuXG4gKiBAdHlwZWRlZiB7RW51bX0gVHJpZ2dlclNvdXJjZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgVHJpZ2dlclNvdXJjZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBUU19NRU5VICgpIHtcbiAgICAgICAgcmV0dXJuIFRyaWdnZXJTb3VyY2UuX01BUC5UU19NRU5VO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRTX1ZSICgpIHtcbiAgICAgICAgcmV0dXJuIFRyaWdnZXJTb3VyY2UuX01BUC5UU19WUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBUU19LRVlCT0FSRCAoKSB7XG4gICAgICAgIHJldHVybiBUcmlnZ2VyU291cmNlLl9NQVAuVFNfS0VZQk9BUkQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gVHJpZ2dlclNvdXJjZS5fdmFsdWVGb3JLZXkoa2V5LCBUcmlnZ2VyU291cmNlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gVHJpZ2dlclNvdXJjZS5fa2V5Rm9yVmFsdWUodmFsdWUsIFRyaWdnZXJTb3VyY2UuX01BUCk7XG4gICAgfVxufVxuXG5UcmlnZ2VyU291cmNlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnVFNfTUVOVSc6ICdNRU5VJyxcbiAgICAnVFNfVlInOiAnVlInLFxuICAgICdUU19LRVlCT0FSRCc6ICdLRVlCT0FSRCcsXG59KTtcblxuZXhwb3J0IHsgVHJpZ2dlclNvdXJjZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFRyaWdnZXJTb3VyY2UgfSBmcm9tICcuLi9lbnVtcy9UcmlnZ2VyU291cmNlLmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBQZXJmb3JtSW50ZXJhY3Rpb25SZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlBlcmZvcm1JbnRlcmFjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIC0gSUQgb2YgdGhlIGNob2ljZSB0aGF0IHdhcyBzZWxlY3RlZCBpbiByZXNwb25zZSB0byBQZXJmb3JtSW50ZXJhY3Rpb24uIE9ubHkgaXMgdmFsaWQgaWZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBnZW5lcmFsIHJlc3VsdCBpcyBcInN1Y2Nlc3M6dHJ1ZVwiLlxuICAgICAqIEByZXR1cm4ge1BlcmZvcm1JbnRlcmFjdGlvblJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldENob2ljZUlEIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQZXJmb3JtSW50ZXJhY3Rpb25SZXNwb25zZS5LRVlfQ0hPSUNFX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRDaG9pY2VJRCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihQZXJmb3JtSW50ZXJhY3Rpb25SZXNwb25zZS5LRVlfQ0hPSUNFX0lEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZW50cnkgLSBNYW51YWxseSBlbnRlcmVkIHRleHQgc2VsZWN0aW9uLCBlLmcuIHRocm91Z2gga2V5Ym9hcmQgQ2FuIGJlIHJldHVybmVkIGluIGxpZXUgb2ZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VJRCwgZGVwZW5kaW5nIG9uIHRyaWdnZXIgc291cmNlXG4gICAgICogQHJldHVybiB7UGVyZm9ybUludGVyYWN0aW9uUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0TWFudWFsVGV4dEVudHJ5IChlbnRyeSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQZXJmb3JtSW50ZXJhY3Rpb25SZXNwb25zZS5LRVlfTUFOVUFMX1RFWFRfRU5UUlksIGVudHJ5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldE1hbnVhbFRleHRFbnRyeSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihQZXJmb3JtSW50ZXJhY3Rpb25SZXNwb25zZS5LRVlfTUFOVUFMX1RFWFRfRU5UUlkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlclNvdXJjZX0gc291cmNlIC0gU2VlIFRyaWdnZXJTb3VyY2UgT25seSBpcyB2YWxpZCBpZiByZXN1bHRDb2RlIGlzIFNVQ0NFU1MuXG4gICAgICogQHJldHVybiB7UGVyZm9ybUludGVyYWN0aW9uUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0VHJpZ2dlclNvdXJjZSAoc291cmNlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRyaWdnZXJTb3VyY2UsIHNvdXJjZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFBlcmZvcm1JbnRlcmFjdGlvblJlc3BvbnNlLktFWV9UUklHR0VSX1NPVVJDRSwgc291cmNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VHJpZ2dlclNvdXJjZX1cbiAgICAgKi9cbiAgICBnZXRUcmlnZ2VyU291cmNlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRyaWdnZXJTb3VyY2UsIFBlcmZvcm1JbnRlcmFjdGlvblJlc3BvbnNlLktFWV9UUklHR0VSX1NPVVJDRSk7XG4gICAgfVxufVxuXG5QZXJmb3JtSW50ZXJhY3Rpb25SZXNwb25zZS5LRVlfQ0hPSUNFX0lEID0gJ2Nob2ljZUlEJztcblBlcmZvcm1JbnRlcmFjdGlvblJlc3BvbnNlLktFWV9NQU5VQUxfVEVYVF9FTlRSWSA9ICdtYW51YWxUZXh0RW50cnknO1xuUGVyZm9ybUludGVyYWN0aW9uUmVzcG9uc2UuS0VZX1RSSUdHRVJfU09VUkNFID0gJ3RyaWdnZXJTb3VyY2UnO1xuXG5leHBvcnQgeyBQZXJmb3JtSW50ZXJhY3Rpb25SZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBEZWxldGVzIGludGVyYWN0aW9uIGNob2ljZSBzZXQgdGhhdCBoYXMgYmVlbiBjcmVhdGVkIHdpdGggXCJDcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldFwiLiBUaGUgaW50ZXJhY3Rpb24gbWF5IG9ubHkgYmVcbiAqIGRlbGV0ZWQgd2hlbiBub3QgY3VycmVudGx5IGluIHVzZSBieSBhIFwicGVyZm9ybUludGVyYWN0aW9uXCIuXG4gKi9cbmNsYXNzIERlbGV0ZUludGVyYWN0aW9uQ2hvaWNlU2V0IGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5EZWxldGVJbnRlcmFjdGlvbkNob2ljZVNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIC0gSUQgb2YgdGhlIGludGVyYWN0aW9uIGNob2ljZSBzZXQgdG8gZGVsZXRlLlxuICAgICAqIEByZXR1cm4ge0RlbGV0ZUludGVyYWN0aW9uQ2hvaWNlU2V0fVxuICAgICAqL1xuICAgIHNldEludGVyYWN0aW9uQ2hvaWNlU2V0SUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERlbGV0ZUludGVyYWN0aW9uQ2hvaWNlU2V0LktFWV9JTlRFUkFDVElPTl9DSE9JQ0VfU0VUX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRJbnRlcmFjdGlvbkNob2ljZVNldElEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERlbGV0ZUludGVyYWN0aW9uQ2hvaWNlU2V0LktFWV9JTlRFUkFDVElPTl9DSE9JQ0VfU0VUX0lEKTtcbiAgICB9XG59XG5cbkRlbGV0ZUludGVyYWN0aW9uQ2hvaWNlU2V0LktFWV9JTlRFUkFDVElPTl9DSE9JQ0VfU0VUX0lEID0gJ2ludGVyYWN0aW9uQ2hvaWNlU2V0SUQnO1xuXG5leHBvcnQgeyBEZWxldGVJbnRlcmFjdGlvbkNob2ljZVNldCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBEZWxldGVJbnRlcmFjdGlvbkNob2ljZVNldFJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuRGVsZXRlSW50ZXJhY3Rpb25DaG9pY2VTZXQpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBEZWxldGVJbnRlcmFjdGlvbkNob2ljZVNldFJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFNvZnRCdXR0b24gY2FwYWJpbGl0aWVzLlxuICogQHR5cGVkZWYge0VudW19IFNvZnRCdXR0b25UeXBlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBTb2Z0QnV0dG9uVHlwZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTQlRfVEVYVCAoKSB7XG4gICAgICAgIHJldHVybiBTb2Z0QnV0dG9uVHlwZS5fTUFQLlNCVF9URVhUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNCVF9JTUFHRSAoKSB7XG4gICAgICAgIHJldHVybiBTb2Z0QnV0dG9uVHlwZS5fTUFQLlNCVF9JTUFHRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTQlRfQk9USCAoKSB7XG4gICAgICAgIHJldHVybiBTb2Z0QnV0dG9uVHlwZS5fTUFQLlNCVF9CT1RIO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFNvZnRCdXR0b25UeXBlLl92YWx1ZUZvcktleShrZXksIFNvZnRCdXR0b25UeXBlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gU29mdEJ1dHRvblR5cGUuX2tleUZvclZhbHVlKHZhbHVlLCBTb2Z0QnV0dG9uVHlwZS5fTUFQKTtcbiAgICB9XG59XG5cblNvZnRCdXR0b25UeXBlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnU0JUX1RFWFQnOiAnVEVYVCcsXG4gICAgJ1NCVF9JTUFHRSc6ICdJTUFHRScsXG4gICAgJ1NCVF9CT1RIJzogJ0JPVEgnLFxufSk7XG5cbmV4cG9ydCB7IFNvZnRCdXR0b25UeXBlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogRW51bWVyYXRpb24gdGhhdCBkZXNjcmliZXMgc3lzdGVtIGFjdGlvbnMgdGhhdCBjYW4gYmUgdHJpZ2dlcmVkLlxuICogQHR5cGVkZWYge0VudW19IFN5c3RlbUFjdGlvblxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgU3lzdGVtQWN0aW9uIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgYWN0aW9uIG9jY3Vycy4gU3RhbmRhcmQgYmVoYXZpb3IgKGUuZy4gU29mdEJ1dHRvbiBjbGVhcnMgb3ZlcmxheSkuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgREVGQVVMVF9BQ1RJT04gKCkge1xuICAgICAgICByZXR1cm4gU3lzdGVtQWN0aW9uLl9NQVAuREVGQVVMVF9BQ1RJT047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwIGlzIGJyb3VnaHQgaW50byBITUlfRlVMTC5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTVEVBTF9GT0NVUyAoKSB7XG4gICAgICAgIHJldHVybiBTeXN0ZW1BY3Rpb24uX01BUC5TVEVBTF9GT0NVUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHN5c3RlbSBjb250ZXh0IGlzIG1haW50YWluZWQuIEFuIG92ZXJsYXkgaXMgcGVyc2lzdGVkIGV2ZW4gdGhvdWdoIGEgU29mdEJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkIGFuZCB0aGVcbiAgICAgKiBub3RpZmljYXRpb24gc2VudC5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBLRUVQX0NPTlRFWFQgKCkge1xuICAgICAgICByZXR1cm4gU3lzdGVtQWN0aW9uLl9NQVAuS0VFUF9DT05URVhUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFN5c3RlbUFjdGlvbi5fdmFsdWVGb3JLZXkoa2V5LCBTeXN0ZW1BY3Rpb24uX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBTeXN0ZW1BY3Rpb24uX2tleUZvclZhbHVlKHZhbHVlLCBTeXN0ZW1BY3Rpb24uX01BUCk7XG4gICAgfVxufVxuXG5TeXN0ZW1BY3Rpb24uX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdERUZBVUxUX0FDVElPTic6ICdERUZBVUxUX0FDVElPTicsXG4gICAgJ1NURUFMX0ZPQ1VTJzogJ1NURUFMX0ZPQ1VTJyxcbiAgICAnS0VFUF9DT05URVhUJzogJ0tFRVBfQ09OVEVYVCcsXG59KTtcblxuZXhwb3J0IHsgU3lzdGVtQWN0aW9uIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IFNvZnRCdXR0b25UeXBlIH0gZnJvbSAnLi4vZW51bXMvU29mdEJ1dHRvblR5cGUuanMnO1xuaW1wb3J0IHsgSW1hZ2UgfSBmcm9tICcuL0ltYWdlLmpzJztcbmltcG9ydCB7IFN5c3RlbUFjdGlvbiB9IGZyb20gJy4uL2VudW1zL1N5c3RlbUFjdGlvbi5qcyc7XG5cbmNsYXNzIFNvZnRCdXR0b24gZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U29mdEJ1dHRvblR5cGV9IHR5cGUgLSBEZXNjcmliZXMsIHdoZXRoZXIgaXQgaXMgdGV4dCwgaGlnaGxpZ2h0ZWQgdGV4dCwgaWNvbiwgb3IgZHluYW1pYyBpbWFnZS4gU2VlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvZnRCdXR0b25UeXBlXG4gICAgICogQHJldHVybiB7U29mdEJ1dHRvbn1cbiAgICAgKi9cbiAgICBzZXRUeXBlICh0eXBlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFNvZnRCdXR0b25UeXBlLCB0eXBlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU29mdEJ1dHRvbi5LRVlfVFlQRSwgdHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NvZnRCdXR0b25UeXBlfVxuICAgICAqL1xuICAgIGdldFR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoU29mdEJ1dHRvblR5cGUsIFNvZnRCdXR0b24uS0VZX1RZUEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IC0gT3B0aW9uYWwgdGV4dCB0byBkaXNwbGF5IChpZiBkZWZpbmVkIGFzIFRFWFQgb3IgQk9USClcbiAgICAgKiBAcmV0dXJuIHtTb2Z0QnV0dG9ufVxuICAgICAqL1xuICAgIHNldFRleHQgKHRleHQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU29mdEJ1dHRvbi5LRVlfVEVYVCwgdGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRUZXh0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNvZnRCdXR0b24uS0VZX1RFWFQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW1hZ2V9IGltYWdlIC0gT3B0aW9uYWwgaW1hZ2Ugc3RydWN0IGZvciBTb2Z0QnV0dG9uIChpZiBkZWZpbmVkIGFzIElNQUdFIG9yIEJPVEgpXG4gICAgICogQHJldHVybiB7U29mdEJ1dHRvbn1cbiAgICAgKi9cbiAgICBzZXRJbWFnZSAoaW1hZ2UpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSW1hZ2UsIGltYWdlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU29mdEJ1dHRvbi5LRVlfSU1BR0UsIGltYWdlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SW1hZ2V9XG4gICAgICovXG4gICAgZ2V0SW1hZ2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSW1hZ2UsIFNvZnRCdXR0b24uS0VZX0lNQUdFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGhpZ2hsaWdodGVkIC0gVHJ1ZSwgaWYgaGlnaGxpZ2h0ZWQgRmFsc2UsIGlmIG5vdCBoaWdobGlnaHRlZFxuICAgICAqIEByZXR1cm4ge1NvZnRCdXR0b259XG4gICAgICovXG4gICAgc2V0SXNIaWdobGlnaHRlZCAoaGlnaGxpZ2h0ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU29mdEJ1dHRvbi5LRVlfSVNfSElHSExJR0hURUQsIGhpZ2hsaWdodGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRJc0hpZ2hsaWdodGVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNvZnRCdXR0b24uS0VZX0lTX0hJR0hMSUdIVEVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaWQgLSBWYWx1ZSB3aGljaCBpcyByZXR1cm5lZCB2aWEgT25CdXR0b25QcmVzcyAvIE9uQnV0dG9uRXZlbnRcbiAgICAgKiBAcmV0dXJuIHtTb2Z0QnV0dG9ufVxuICAgICAqL1xuICAgIHNldFNvZnRCdXR0b25JRCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU29mdEJ1dHRvbi5LRVlfU09GVF9CVVRUT05fSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFNvZnRCdXR0b25JRCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTb2Z0QnV0dG9uLktFWV9TT0ZUX0JVVFRPTl9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTeXN0ZW1BY3Rpb259IGFjdGlvbiAtIFBhcmFtZXRlciBpbmRpY2F0aW5nIHdoZXRoZXIgc2VsZWN0aW5nIGEgU29mdEJ1dHRvbiBzaGFsbCBjYWxsIGEgc3BlY2lmaWMgc3lzdGVtXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi4gVGhpcyBpcyBpbnRlbmRlZCB0byBhbGxvdyBOb3RpZmljYXRpb25zIHRvIGJyaW5nIHRoZSBjYWxsZWUgaW50byBmdWxsIC9cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXM7IG9yIGluIHRoZSBjYXNlIG9mIHBlcnNpc3RlbnQgb3ZlcmxheXMsIHRoZSBvdmVybGF5IGNhbiBwZXJzaXN0IHdoZW4gYVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2Z0QnV0dG9uIGlzIHByZXNzZWQuXG4gICAgICogQHJldHVybiB7U29mdEJ1dHRvbn1cbiAgICAgKi9cbiAgICBzZXRTeXN0ZW1BY3Rpb24gKGFjdGlvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTeXN0ZW1BY3Rpb24sIGFjdGlvbik7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNvZnRCdXR0b24uS0VZX1NZU1RFTV9BQ1RJT04sIGFjdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N5c3RlbUFjdGlvbn1cbiAgICAgKi9cbiAgICBnZXRTeXN0ZW1BY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoU3lzdGVtQWN0aW9uLCBTb2Z0QnV0dG9uLktFWV9TWVNURU1fQUNUSU9OKTtcbiAgICB9XG59XG5cblNvZnRCdXR0b24uS0VZX1RZUEUgPSAndHlwZSc7XG5Tb2Z0QnV0dG9uLktFWV9URVhUID0gJ3RleHQnO1xuU29mdEJ1dHRvbi5LRVlfSU1BR0UgPSAnaW1hZ2UnO1xuU29mdEJ1dHRvbi5LRVlfSVNfSElHSExJR0hURUQgPSAnaXNIaWdobGlnaHRlZCc7XG5Tb2Z0QnV0dG9uLktFWV9TT0ZUX0JVVFRPTl9JRCA9ICdzb2Z0QnV0dG9uSUQnO1xuU29mdEJ1dHRvbi5LRVlfU1lTVEVNX0FDVElPTiA9ICdzeXN0ZW1BY3Rpb24nO1xuXG5leHBvcnQgeyBTb2Z0QnV0dG9uIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgVFRTQ2h1bmsgfSBmcm9tICcuLi9zdHJ1Y3RzL1RUU0NodW5rLmpzJztcbmltcG9ydCB7IFNvZnRCdXR0b24gfSBmcm9tICcuLi9zdHJ1Y3RzL1NvZnRCdXR0b24uanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgSW1hZ2UgfSBmcm9tICcuLi9zdHJ1Y3RzL0ltYWdlLmpzJztcblxuLyoqXG4gKiBTaG93cyBhbiBhbGVydCB3aGljaCB0eXBpY2FsbHkgY29uc2lzdHMgb2YgdGV4dC10by1zcGVlY2ggbWVzc2FnZSBhbmQgdGV4dCBvbiB0aGUgZGlzcGxheS4gQXQgbGVhc3QgZWl0aGVyXG4gKiBhbGVydFRleHQxLCBhbGVydFRleHQyIG9yIFRUU0NodW5rcyBuZWVkIHRvIGJlIHByb3ZpZGVkLlxuICovXG5jbGFzcyBBbGVydCBleHRlbmRzIFJwY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuQWxlcnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0MSAtIFRoZSBmaXJzdCBsaW5lIG9mIHRoZSBhbGVydCB0ZXh0IGZpZWxkXG4gICAgICogQHJldHVybiB7QWxlcnR9XG4gICAgICovXG4gICAgc2V0QWxlcnRUZXh0MSAodGV4dDEpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQWxlcnQuS0VZX0FMRVJUX1RFWFRfMSwgdGV4dDEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0QWxlcnRUZXh0MSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihBbGVydC5LRVlfQUxFUlRfVEVYVF8xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dDIgLSBUaGUgc2Vjb25kIGxpbmUgb2YgdGhlIGFsZXJ0IHRleHQgZmllbGRcbiAgICAgKiBAcmV0dXJuIHtBbGVydH1cbiAgICAgKi9cbiAgICBzZXRBbGVydFRleHQyICh0ZXh0Mikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBbGVydC5LRVlfQUxFUlRfVEVYVF8yLCB0ZXh0Mik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRBbGVydFRleHQyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEFsZXJ0LktFWV9BTEVSVF9URVhUXzIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0MyAtIFRoZSBvcHRpb25hbCB0aGlyZCBsaW5lIG9mIHRoZSBhbGVydCB0ZXh0IGZpZWxkXG4gICAgICogQHJldHVybiB7QWxlcnR9XG4gICAgICovXG4gICAgc2V0QWxlcnRUZXh0MyAodGV4dDMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQWxlcnQuS0VZX0FMRVJUX1RFWFRfMywgdGV4dDMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0QWxlcnRUZXh0MyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihBbGVydC5LRVlfQUxFUlRfVEVYVF8zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RUU0NodW5rW119IGNodW5rcyAtIEFuIGFycmF5IG9mIHRleHQgY2h1bmtzIG9mIHR5cGUgVFRTQ2h1bmsuIFNlZSBUVFNDaHVuay4gVGhlIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIGl0ZW0uXG4gICAgICogQHJldHVybiB7QWxlcnR9XG4gICAgICovXG4gICAgc2V0VHRzQ2h1bmtzIChjaHVua3MpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVFRTQ2h1bmssIGNodW5rcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFsZXJ0LktFWV9UVFNfQ0hVTktTLCBjaHVua3MpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUVFNDaHVua1tdfVxuICAgICAqL1xuICAgIGdldFR0c0NodW5rcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUVFNDaHVuaywgQWxlcnQuS0VZX1RUU19DSFVOS1MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBkdXJhdGlvbiAtIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiBUeXBpY2FsIHRpbWVvdXRzIGFyZSAzLTUgc2Vjb25kcy4gSWYgb21pdHRlZCwgdGltZW91dCBpcyBzZXRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byA1cy5cbiAgICAgKiBAcmV0dXJuIHtBbGVydH1cbiAgICAgKi9cbiAgICBzZXREdXJhdGlvbiAoZHVyYXRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQWxlcnQuS0VZX0RVUkFUSU9OLCBkdXJhdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXREdXJhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihBbGVydC5LRVlfRFVSQVRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gdG9uZSAtIERlZmluZXMgaWYgdG9uZSBzaG91bGQgYmUgcGxheWVkLiBUb25lIGlzIHBsYXllZCBiZWZvcmUgVFRTLiBJZiBvbWl0dGVkLCBubyB0b25lIGlzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVkLlxuICAgICAqIEByZXR1cm4ge0FsZXJ0fVxuICAgICAqL1xuICAgIHNldFBsYXlUb25lICh0b25lKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFsZXJ0LktFWV9QTEFZX1RPTkUsIHRvbmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFBsYXlUb25lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEFsZXJ0LktFWV9QTEFZX1RPTkUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5kaWNhdG9yIC0gSWYgc3VwcG9ydGVkIG9uIHRoZSBnaXZlbiBwbGF0Zm9ybSwgdGhlIGFsZXJ0IEdVSSB3aWxsIGluY2x1ZGUgc29tZSBzb3J0IG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24gaW5kaWNhdGluZyB0aGF0IGxvYWRpbmcgb2YgYSBmZWF0dXJlIGlzIHByb2dyZXNzaW5nLiBlLmcuIGEgc3Bpbm5pbmcgd2hlZWxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGhvdXJnbGFzcywgZXRjLlxuICAgICAqIEByZXR1cm4ge0FsZXJ0fVxuICAgICAqL1xuICAgIHNldFByb2dyZXNzSW5kaWNhdG9yIChpbmRpY2F0b3IpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQWxlcnQuS0VZX1BST0dSRVNTX0lORElDQVRPUiwgaW5kaWNhdG9yKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRQcm9ncmVzc0luZGljYXRvciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihBbGVydC5LRVlfUFJPR1JFU1NfSU5ESUNBVE9SKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NvZnRCdXR0b25bXX0gYnV0dG9ucyAtIEFwcCBkZWZpbmVkIFNvZnRCdXR0b25zLiBJZiBvbWl0dGVkIG9uIHN1cHBvcnRlZCBkaXNwbGF5cywgdGhlIGRpc3BsYXllZCBhbGVydFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhbGwgbm90IGhhdmUgYW55IFNvZnRCdXR0b25zLlxuICAgICAqIEByZXR1cm4ge0FsZXJ0fVxuICAgICAqL1xuICAgIHNldFNvZnRCdXR0b25zIChidXR0b25zKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFNvZnRCdXR0b24sIGJ1dHRvbnMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBbGVydC5LRVlfU09GVF9CVVRUT05TLCBidXR0b25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U29mdEJ1dHRvbltdfVxuICAgICAqL1xuICAgIGdldFNvZnRCdXR0b25zICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFNvZnRCdXR0b24sIEFsZXJ0LktFWV9TT0ZUX0JVVFRPTlMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW1hZ2V9IGljb24gLSBJbWFnZSBzdHJ1Y3QgZGV0ZXJtaW5pbmcgd2hldGhlciBzdGF0aWMgb3IgZHluYW1pYyBpY29uLiBJZiBvbWl0dGVkIG9uIHN1cHBvcnRlZCBkaXNwbGF5cyxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgbm8gKG9yIHRoZSBkZWZhdWx0IGlmIGFwcGxpY2FibGUpIGljb24gc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKiBAcmV0dXJuIHtBbGVydH1cbiAgICAgKi9cbiAgICBzZXRBbGVydEljb24gKGljb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSW1hZ2UsIGljb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBbGVydC5LRVlfQUxFUlRfSUNPTiwgaWNvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0ltYWdlfVxuICAgICAqL1xuICAgIGdldEFsZXJ0SWNvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChJbWFnZSwgQWxlcnQuS0VZX0FMRVJUX0lDT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpZCAtIEFuIElEIGZvciB0aGlzIHNwZWNpZmljIGFsZXJ0IHRvIGFsbG93IGNhbmNlbGxhdGlvbiB0aHJvdWdoIHRoZSBgQ2FuY2VsSW50ZXJhY3Rpb25gIFJQQy5cbiAgICAgKiBAcmV0dXJuIHtBbGVydH1cbiAgICAgKi9cbiAgICBzZXRDYW5jZWxJRCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQWxlcnQuS0VZX0NBTkNFTF9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0Q2FuY2VsSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQWxlcnQuS0VZX0NBTkNFTF9JRCk7XG4gICAgfVxufVxuXG5BbGVydC5LRVlfQUxFUlRfVEVYVF8xID0gJ2FsZXJ0VGV4dDEnO1xuQWxlcnQuS0VZX0FMRVJUX1RFWFRfMiA9ICdhbGVydFRleHQyJztcbkFsZXJ0LktFWV9BTEVSVF9URVhUXzMgPSAnYWxlcnRUZXh0Myc7XG5BbGVydC5LRVlfVFRTX0NIVU5LUyA9ICd0dHNDaHVua3MnO1xuQWxlcnQuS0VZX0RVUkFUSU9OID0gJ2R1cmF0aW9uJztcbkFsZXJ0LktFWV9QTEFZX1RPTkUgPSAncGxheVRvbmUnO1xuQWxlcnQuS0VZX1BST0dSRVNTX0lORElDQVRPUiA9ICdwcm9ncmVzc0luZGljYXRvcic7XG5BbGVydC5LRVlfU09GVF9CVVRUT05TID0gJ3NvZnRCdXR0b25zJztcbkFsZXJ0LktFWV9BTEVSVF9JQ09OID0gJ2FsZXJ0SWNvbic7XG5BbGVydC5LRVlfQ0FOQ0VMX0lEID0gJ2NhbmNlbElEJztcblxuZXhwb3J0IHsgQWxlcnQgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgQWxlcnRSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkFsZXJ0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZSAtIEFtb3VudCBvZiB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGFuIGFwcCBtdXN0IHdhaXQgYmVmb3JlIHJlc2VuZGluZyBhbiBhbGVydC4gSWYgcHJvdmlkZWQsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyIHN5c3RlbSBldmVudCBvciBvdmVybGF5IGN1cnJlbnRseSBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGlzIGFsZXJ0LiBBbiBhcHBcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG11c3Qgbm90IHNlbmQgYW4gYWxlcnQgd2l0aG91dCB3YWl0aW5nIGF0IGxlYXN0IHRoZSBhbW91bnQgb2YgdGltZSBkaWN0YXRlZC5cbiAgICAgKiBAcmV0dXJuIHtBbGVydFJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFRyeUFnYWluVGltZSAodGltZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBbGVydFJlc3BvbnNlLktFWV9UUllfQUdBSU5fVElNRSwgdGltZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRUcnlBZ2FpblRpbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQWxlcnRSZXNwb25zZS5LRVlfVFJZX0FHQUlOX1RJTUUpO1xuICAgIH1cbn1cblxuQWxlcnRSZXNwb25zZS5LRVlfVFJZX0FHQUlOX1RJTUUgPSAndHJ5QWdhaW5UaW1lJztcblxuZXhwb3J0IHsgQWxlcnRSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIHBvc3NpYmxlIGFsaWdubWVudHMsIGxlZnQsIHJpZ2h0LCBvciBjZW50ZXJlZFxuICogQHR5cGVkZWYge0VudW19IFRleHRBbGlnbm1lbnRcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFRleHRBbGlnbm1lbnQgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTEVGVF9BTElHTkVEICgpIHtcbiAgICAgICAgcmV0dXJuIFRleHRBbGlnbm1lbnQuX01BUC5MRUZUX0FMSUdORUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUklHSFRfQUxJR05FRCAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0QWxpZ25tZW50Ll9NQVAuUklHSFRfQUxJR05FRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDRU5URVJFRCAoKSB7XG4gICAgICAgIHJldHVybiBUZXh0QWxpZ25tZW50Ll9NQVAuQ0VOVEVSRUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gVGV4dEFsaWdubWVudC5fdmFsdWVGb3JLZXkoa2V5LCBUZXh0QWxpZ25tZW50Ll9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gVGV4dEFsaWdubWVudC5fa2V5Rm9yVmFsdWUodmFsdWUsIFRleHRBbGlnbm1lbnQuX01BUCk7XG4gICAgfVxufVxuXG5UZXh0QWxpZ25tZW50Ll9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnTEVGVF9BTElHTkVEJzogJ0xFRlRfQUxJR05FRCcsXG4gICAgJ1JJR0hUX0FMSUdORUQnOiAnUklHSFRfQUxJR05FRCcsXG4gICAgJ0NFTlRFUkVEJzogJ0NFTlRFUkVEJyxcbn0pO1xuXG5leHBvcnQgeyBUZXh0QWxpZ25tZW50IH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IFRlbXBsYXRlQ29sb3JTY2hlbWUgfSBmcm9tICcuL1RlbXBsYXRlQ29sb3JTY2hlbWUuanMnO1xuXG5jbGFzcyBUZW1wbGF0ZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZSAtIFByZWRlZmluZWQgb3IgZHluYW1pY2FsbHkgY3JlYXRlZCB3aW5kb3cgdGVtcGxhdGUuIEN1cnJlbnRseSBvbmx5IHByZWRlZmluZWQgd2luZG93XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgbGF5b3V0cyBhcmUgZGVmaW5lZC5cbiAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUNvbmZpZ3VyYXRpb259XG4gICAgICovXG4gICAgc2V0VGVtcGxhdGUgKHRlbXBsYXRlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFRlbXBsYXRlQ29uZmlndXJhdGlvbi5LRVlfVEVNUExBVEUsIHRlbXBsYXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFRlbXBsYXRlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFRlbXBsYXRlQ29uZmlndXJhdGlvbi5LRVlfVEVNUExBVEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VGVtcGxhdGVDb2xvclNjaGVtZX0gc2NoZW1lIC0gQSBjb2xvciBzY2hlbWUgZm9yIGFsbCBkaXNwbGF5IGxheW91dCB0ZW1wbGF0ZXMuXG4gICAgICogQHJldHVybiB7VGVtcGxhdGVDb25maWd1cmF0aW9ufVxuICAgICAqL1xuICAgIHNldERheUNvbG9yU2NoZW1lIChzY2hlbWUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVGVtcGxhdGVDb2xvclNjaGVtZSwgc2NoZW1lKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVGVtcGxhdGVDb25maWd1cmF0aW9uLktFWV9EQVlfQ09MT1JfU0NIRU1FLCBzY2hlbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUNvbG9yU2NoZW1lfVxuICAgICAqL1xuICAgIGdldERheUNvbG9yU2NoZW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRlbXBsYXRlQ29sb3JTY2hlbWUsIFRlbXBsYXRlQ29uZmlndXJhdGlvbi5LRVlfREFZX0NPTE9SX1NDSEVNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUZW1wbGF0ZUNvbG9yU2NoZW1lfSBzY2hlbWUgLSBBIGNvbG9yIHNjaGVtZSBmb3IgYWxsIGRpc3BsYXkgbGF5b3V0IHRlbXBsYXRlcy5cbiAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUNvbmZpZ3VyYXRpb259XG4gICAgICovXG4gICAgc2V0TmlnaHRDb2xvclNjaGVtZSAoc2NoZW1lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRlbXBsYXRlQ29sb3JTY2hlbWUsIHNjaGVtZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFRlbXBsYXRlQ29uZmlndXJhdGlvbi5LRVlfTklHSFRfQ09MT1JfU0NIRU1FLCBzY2hlbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUNvbG9yU2NoZW1lfVxuICAgICAqL1xuICAgIGdldE5pZ2h0Q29sb3JTY2hlbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVGVtcGxhdGVDb2xvclNjaGVtZSwgVGVtcGxhdGVDb25maWd1cmF0aW9uLktFWV9OSUdIVF9DT0xPUl9TQ0hFTUUpO1xuICAgIH1cbn1cblxuVGVtcGxhdGVDb25maWd1cmF0aW9uLktFWV9URU1QTEFURSA9ICd0ZW1wbGF0ZSc7XG5UZW1wbGF0ZUNvbmZpZ3VyYXRpb24uS0VZX0RBWV9DT0xPUl9TQ0hFTUUgPSAnZGF5Q29sb3JTY2hlbWUnO1xuVGVtcGxhdGVDb25maWd1cmF0aW9uLktFWV9OSUdIVF9DT0xPUl9TQ0hFTUUgPSAnbmlnaHRDb2xvclNjaGVtZSc7XG5cbmV4cG9ydCB7IFRlbXBsYXRlQ29uZmlndXJhdGlvbiB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBNZXRhZGF0YVR5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIE1ldGFkYXRhVHlwZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGF0YSBpbiB0aGlzIGZpZWxkIGNvbnRhaW5zIHRoZSB0aXRsZSBvZiB0aGUgY3VycmVudGx5IHBsYXlpbmcgYXVkaW8gdHJhY2suXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgbWVkaWFUaXRsZSAoKSB7XG4gICAgICAgIHJldHVybiBNZXRhZGF0YVR5cGUuX01BUC5tZWRpYVRpdGxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIGluIHRoaXMgZmllbGQgY29udGFpbnMgdGhlIGFydGlzdCBvciBjcmVhdG9yIG9mIHRoZSBjdXJyZW50bHkgcGxheWluZyBhdWRpbyB0cmFjay5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBtZWRpYUFydGlzdCAoKSB7XG4gICAgICAgIHJldHVybiBNZXRhZGF0YVR5cGUuX01BUC5tZWRpYUFydGlzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGF0YSBpbiB0aGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBhbGJ1bSB0aXRsZSBvZiB0aGUgY3VycmVudGx5IHBsYXlpbmcgYXVkaW8gdHJhY2suXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgbWVkaWFBbGJ1bSAoKSB7XG4gICAgICAgIHJldHVybiBNZXRhZGF0YVR5cGUuX01BUC5tZWRpYUFsYnVtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIGluIHRoaXMgZmllbGQgY29udGFpbnMgdGhlIGNyZWF0aW9uIHllYXIgb2YgdGhlIGN1cnJlbnRseSBwbGF5aW5nIGF1ZGlvIHRyYWNrLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IG1lZGlhWWVhciAoKSB7XG4gICAgICAgIHJldHVybiBNZXRhZGF0YVR5cGUuX01BUC5tZWRpYVllYXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGRhdGEgaW4gdGhpcyBmaWVsZCBjb250YWlucyB0aGUgZ2VucmUgb2YgdGhlIGN1cnJlbnRseSBwbGF5aW5nIGF1ZGlvIHRyYWNrLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IG1lZGlhR2VucmUgKCkge1xuICAgICAgICByZXR1cm4gTWV0YWRhdGFUeXBlLl9NQVAubWVkaWFHZW5yZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGF0YSBpbiB0aGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHNvdXJjZSBmb3IgdGhlIG1lZGlhLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IG1lZGlhU3RhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBNZXRhZGF0YVR5cGUuX01BUC5tZWRpYVN0YXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGRhdGEgaW4gdGhpcyBmaWVsZCBpcyBhIHJhdGluZy5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCByYXRpbmcgKCkge1xuICAgICAgICByZXR1cm4gTWV0YWRhdGFUeXBlLl9NQVAucmF0aW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIGluIHRoaXMgZmllbGQgaXMgdGhlIGN1cnJlbnQgdGVtcGVyYXR1cmUuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgY3VycmVudFRlbXBlcmF0dXJlICgpIHtcbiAgICAgICAgcmV0dXJuIE1ldGFkYXRhVHlwZS5fTUFQLmN1cnJlbnRUZW1wZXJhdHVyZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGF0YSBpbiB0aGlzIGZpZWxkIGlzIHRoZSBtYXhpbXVtIHRlbXBlcmF0dXJlIGZvciB0aGUgZGF5LlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IG1heGltdW1UZW1wZXJhdHVyZSAoKSB7XG4gICAgICAgIHJldHVybiBNZXRhZGF0YVR5cGUuX01BUC5tYXhpbXVtVGVtcGVyYXR1cmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGRhdGEgaW4gdGhpcyBmaWVsZCBpcyB0aGUgbWluaW11bSB0ZW1wZXJhdHVyZSBmb3IgdGhlIGRheS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBtaW5pbXVtVGVtcGVyYXR1cmUgKCkge1xuICAgICAgICByZXR1cm4gTWV0YWRhdGFUeXBlLl9NQVAubWluaW11bVRlbXBlcmF0dXJlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIGluIHRoaXMgZmllbGQgZGVzY3JpYmVzIHRoZSBjdXJyZW50IHdlYXRoZXIgKGV4LiBjbG91ZHksIGNsZWFyLCBldGMuKS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCB3ZWF0aGVyVGVybSAoKSB7XG4gICAgICAgIHJldHVybiBNZXRhZGF0YVR5cGUuX01BUC53ZWF0aGVyVGVybTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGF0YSBpbiB0aGlzIGZpZWxkIGRlc2NyaWJlcyB0aGUgY3VycmVudCBodW1pZGl0eSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBodW1pZGl0eSAoKSB7XG4gICAgICAgIHJldHVybiBNZXRhZGF0YVR5cGUuX01BUC5odW1pZGl0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBNZXRhZGF0YVR5cGUuX3ZhbHVlRm9yS2V5KGtleSwgTWV0YWRhdGFUeXBlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gTWV0YWRhdGFUeXBlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgTWV0YWRhdGFUeXBlLl9NQVApO1xuICAgIH1cbn1cblxuTWV0YWRhdGFUeXBlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnbWVkaWFUaXRsZSc6ICdtZWRpYVRpdGxlJyxcbiAgICAnbWVkaWFBcnRpc3QnOiAnbWVkaWFBcnRpc3QnLFxuICAgICdtZWRpYUFsYnVtJzogJ21lZGlhQWxidW0nLFxuICAgICdtZWRpYVllYXInOiAnbWVkaWFZZWFyJyxcbiAgICAnbWVkaWFHZW5yZSc6ICdtZWRpYUdlbnJlJyxcbiAgICAnbWVkaWFTdGF0aW9uJzogJ21lZGlhU3RhdGlvbicsXG4gICAgJ3JhdGluZyc6ICdyYXRpbmcnLFxuICAgICdjdXJyZW50VGVtcGVyYXR1cmUnOiAnY3VycmVudFRlbXBlcmF0dXJlJyxcbiAgICAnbWF4aW11bVRlbXBlcmF0dXJlJzogJ21heGltdW1UZW1wZXJhdHVyZScsXG4gICAgJ21pbmltdW1UZW1wZXJhdHVyZSc6ICdtaW5pbXVtVGVtcGVyYXR1cmUnLFxuICAgICd3ZWF0aGVyVGVybSc6ICd3ZWF0aGVyVGVybScsXG4gICAgJ2h1bWlkaXR5JzogJ2h1bWlkaXR5Jyxcbn0pO1xuXG5leHBvcnQgeyBNZXRhZGF0YVR5cGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFUeXBlIH0gZnJvbSAnLi4vZW51bXMvTWV0YWRhdGFUeXBlLmpzJztcblxuY2xhc3MgTWV0YWRhdGFUYWdzIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01ldGFkYXRhVHlwZVtdfSBmaWVsZDEgLSBUaGUgdHlwZSBvZiBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgXCJtYWluRmllbGQxXCIgdGV4dCBmaWVsZC5cbiAgICAgKiBAcmV0dXJuIHtNZXRhZGF0YVRhZ3N9XG4gICAgICovXG4gICAgc2V0TWFpbkZpZWxkMSAoZmllbGQxKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKE1ldGFkYXRhVHlwZSwgZmllbGQxLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTWV0YWRhdGFUYWdzLktFWV9NQUlOX0ZJRUxEXzEsIGZpZWxkMSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge01ldGFkYXRhVHlwZVtdfVxuICAgICAqL1xuICAgIGdldE1haW5GaWVsZDEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTWV0YWRhdGFUeXBlLCBNZXRhZGF0YVRhZ3MuS0VZX01BSU5fRklFTERfMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZXRhZGF0YVR5cGVbXX0gZmllbGQyIC0gVGhlIHR5cGUgb2YgZGF0YSBjb250YWluZWQgaW4gdGhlIFwibWFpbkZpZWxkMlwiIHRleHQgZmllbGQuXG4gICAgICogQHJldHVybiB7TWV0YWRhdGFUYWdzfVxuICAgICAqL1xuICAgIHNldE1haW5GaWVsZDIgKGZpZWxkMikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNZXRhZGF0YVR5cGUsIGZpZWxkMiwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE1ldGFkYXRhVGFncy5LRVlfTUFJTl9GSUVMRF8yLCBmaWVsZDIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNZXRhZGF0YVR5cGVbXX1cbiAgICAgKi9cbiAgICBnZXRNYWluRmllbGQyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFUYWdzLktFWV9NQUlOX0ZJRUxEXzIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TWV0YWRhdGFUeXBlW119IGZpZWxkMyAtIFRoZSB0eXBlIG9mIGRhdGEgY29udGFpbmVkIGluIHRoZSBcIm1haW5GaWVsZDNcIiB0ZXh0IGZpZWxkLlxuICAgICAqIEByZXR1cm4ge01ldGFkYXRhVGFnc31cbiAgICAgKi9cbiAgICBzZXRNYWluRmllbGQzIChmaWVsZDMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTWV0YWRhdGFUeXBlLCBmaWVsZDMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihNZXRhZGF0YVRhZ3MuS0VZX01BSU5fRklFTERfMywgZmllbGQzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TWV0YWRhdGFUeXBlW119XG4gICAgICovXG4gICAgZ2V0TWFpbkZpZWxkMyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNZXRhZGF0YVR5cGUsIE1ldGFkYXRhVGFncy5LRVlfTUFJTl9GSUVMRF8zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01ldGFkYXRhVHlwZVtdfSBmaWVsZDQgLSBUaGUgdHlwZSBvZiBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgXCJtYWluRmllbGQ0XCIgdGV4dCBmaWVsZC5cbiAgICAgKiBAcmV0dXJuIHtNZXRhZGF0YVRhZ3N9XG4gICAgICovXG4gICAgc2V0TWFpbkZpZWxkNCAoZmllbGQ0KSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKE1ldGFkYXRhVHlwZSwgZmllbGQ0LCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTWV0YWRhdGFUYWdzLktFWV9NQUlOX0ZJRUxEXzQsIGZpZWxkNCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge01ldGFkYXRhVHlwZVtdfVxuICAgICAqL1xuICAgIGdldE1haW5GaWVsZDQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTWV0YWRhdGFUeXBlLCBNZXRhZGF0YVRhZ3MuS0VZX01BSU5fRklFTERfNCk7XG4gICAgfVxufVxuXG5NZXRhZGF0YVRhZ3MuS0VZX01BSU5fRklFTERfMSA9ICdtYWluRmllbGQxJztcbk1ldGFkYXRhVGFncy5LRVlfTUFJTl9GSUVMRF8yID0gJ21haW5GaWVsZDInO1xuTWV0YWRhdGFUYWdzLktFWV9NQUlOX0ZJRUxEXzMgPSAnbWFpbkZpZWxkMyc7XG5NZXRhZGF0YVRhZ3MuS0VZX01BSU5fRklFTERfNCA9ICdtYWluRmllbGQ0JztcblxuZXhwb3J0IHsgTWV0YWRhdGFUYWdzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgVGV4dEFsaWdubWVudCB9IGZyb20gJy4uL2VudW1zL1RleHRBbGlnbm1lbnQuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgU29mdEJ1dHRvbiB9IGZyb20gJy4uL3N0cnVjdHMvU29mdEJ1dHRvbi5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9zdHJ1Y3RzL1RlbXBsYXRlQ29uZmlndXJhdGlvbi5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YVRhZ3MgfSBmcm9tICcuLi9zdHJ1Y3RzL01ldGFkYXRhVGFncy5qcyc7XG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJy4uL3N0cnVjdHMvSW1hZ2UuanMnO1xuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHBlcnNpc3RlbnQgZGlzcGxheS4gU3VwcG9ydGVkIGZpZWxkcyBkZXBlbmQgb24gZGlzcGxheSBjYXBhYmlsaXRpZXMuXG4gKi9cbmNsYXNzIFNob3cgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlNob3cpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZDEgLSBUaGUgdGV4dCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gYSBzaW5nbGUgb3IgdXBwZXIgZGlzcGxheSBsaW5lLiBJZiB0aGlzIHRleHQgaXMgbm90XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwgdGhlIHRleHQgb2YgbWFpbkZpZWxkMSBzdGF5cyB1bmNoYW5nZWQuIElmIHRoaXMgdGV4dCBpcyBlbXB0eSBcIlwiLCB0aGUgZmllbGQgd2lsbCBiZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkLlxuICAgICAqIEByZXR1cm4ge1Nob3d9XG4gICAgICovXG4gICAgc2V0TWFpbkZpZWxkMSAoZmllbGQxKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX01BSU5fRklFTERfMSwgZmllbGQxKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldE1haW5GaWVsZDEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2hvdy5LRVlfTUFJTl9GSUVMRF8xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGQyIC0gVGhlIHRleHQgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIG9uIHRoZSBzZWNvbmQgZGlzcGxheSBsaW5lLiBJZiB0aGlzIHRleHQgaXMgbm90IHNldCxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRleHQgb2YgbWFpbkZpZWxkMiBzdGF5cyB1bmNoYW5nZWQuIElmIHRoaXMgdGV4dCBpcyBlbXB0eSBcIlwiLCB0aGUgZmllbGQgd2lsbCBiZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkLlxuICAgICAqIEByZXR1cm4ge1Nob3d9XG4gICAgICovXG4gICAgc2V0TWFpbkZpZWxkMiAoZmllbGQyKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX01BSU5fRklFTERfMiwgZmllbGQyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldE1haW5GaWVsZDIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2hvdy5LRVlfTUFJTl9GSUVMRF8yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGQzIC0gVGhlIHRleHQgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIG9uIHRoZSBzZWNvbmQgXCJwYWdlXCIgZmlyc3QgZGlzcGxheSBsaW5lLiBJZiB0aGlzIHRleHRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHNldCwgdGhlIHRleHQgb2YgbWFpbkZpZWxkMyBzdGF5cyB1bmNoYW5nZWQuIElmIHRoaXMgdGV4dCBpcyBlbXB0eSBcIlwiLCB0aGUgZmllbGRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBjbGVhcmVkLlxuICAgICAqIEByZXR1cm4ge1Nob3d9XG4gICAgICovXG4gICAgc2V0TWFpbkZpZWxkMyAoZmllbGQzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX01BSU5fRklFTERfMywgZmllbGQzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldE1haW5GaWVsZDMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2hvdy5LRVlfTUFJTl9GSUVMRF8zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmllbGQ0IC0gVGhlIHRleHQgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIG9uIHRoZSBzZWNvbmQgXCJwYWdlXCIgc2Vjb25kIGRpc3BsYXkgbGluZS4gSWYgdGhpcyB0ZXh0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBzZXQsIHRoZSB0ZXh0IG9mIG1haW5GaWVsZDQgc3RheXMgdW5jaGFuZ2VkLiBJZiB0aGlzIHRleHQgaXMgZW1wdHkgXCJcIiwgdGhlIGZpZWxkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgY2xlYXJlZC5cbiAgICAgKiBAcmV0dXJuIHtTaG93fVxuICAgICAqL1xuICAgIHNldE1haW5GaWVsZDQgKGZpZWxkNCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaG93LktFWV9NQUlOX0ZJRUxEXzQsIGZpZWxkNCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRNYWluRmllbGQ0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNob3cuS0VZX01BSU5fRklFTERfNCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUZXh0QWxpZ25tZW50fSBhbGlnbm1lbnQgLSBTcGVjaWZpZXMgaG93IG1haW5GaWVsZDEgYW5kIG1haW5GaWVsZDIgdGV4dHMgc2hvdWxkIGJlIGFsaWduZWQgb24gZGlzcGxheS4gSWZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQsIHRleHRzIHdpbGwgYmUgY2VudGVyZWQuXG4gICAgICogQHJldHVybiB7U2hvd31cbiAgICAgKi9cbiAgICBzZXRBbGlnbm1lbnQgKGFsaWdubWVudCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShUZXh0QWxpZ25tZW50LCBhbGlnbm1lbnQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaG93LktFWV9BTElHTk1FTlQsIGFsaWdubWVudCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RleHRBbGlnbm1lbnR9XG4gICAgICovXG4gICAgZ2V0QWxpZ25tZW50ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRleHRBbGlnbm1lbnQsIFNob3cuS0VZX0FMSUdOTUVOVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGJhciAtIFJlcXVpcmVzIGludmVzdGlnYXRpb24gcmVnYXJkaW5nIHRoZSBuYXYgZGlzcGxheSBjYXBhYmlsaXRpZXMuIFBvdGVudGlhbGx5IGxvd2VyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgIGxvd2VyU3RhdHVzQmFyLCB1cHBlclN0YXR1c0JhciwgdGl0bGVCYXIsIGV0Yy5cbiAgICAgKiBAcmV0dXJuIHtTaG93fVxuICAgICAqL1xuICAgIHNldFN0YXR1c0JhciAoYmFyKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX1NUQVRVU19CQVIsIGJhcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRTdGF0dXNCYXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2hvdy5LRVlfU1RBVFVTX0JBUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNsb2NrIC0gVGV4dCB2YWx1ZSBmb3IgTWVkaWFDbG9jayBmaWVsZC4gSGFzIHRvIGJlIHByb3Blcmx5IGZvcm1hdHRlZCBieSBNb2JpbGUgQXBwIGFjY29yZGluZyB0b1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtb2R1bGUncyBjYXBhYmlsaXRpZXMuIElmIHRoaXMgdGV4dCBpcyBzZXQsIGFueSBhdXRvbWF0aWMgbWVkaWEgY2xvY2sgdXBkYXRlc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgc2V0IHdpdGggU2V0TWVkaWFDbG9ja1RpbWVyIHdpbGwgYmUgc3RvcHBlZC5cbiAgICAgKiBAcmV0dXJuIHtTaG93fVxuICAgICAqL1xuICAgIHNldE1lZGlhQ2xvY2sgKGNsb2NrKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX01FRElBX0NMT0NLLCBjbG9jayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRNZWRpYUNsb2NrICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNob3cuS0VZX01FRElBX0NMT0NLKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHJhY2sgLSBUaGUgdGV4dCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRyYWNrIGZpZWxkLiBJZiB0aGlzIHRleHQgaXMgbm90IHNldCwgdGhlIHRleHRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBvZiBtZWRpYVRyYWNrIHN0YXlzIHVuY2hhbmdlZC4gSWYgdGhpcyB0ZXh0IGlzIGVtcHR5IFwiXCIsIHRoZSBmaWVsZCB3aWxsIGJlIGNsZWFyZWQuXG4gICAgICogQHJldHVybiB7U2hvd31cbiAgICAgKi9cbiAgICBzZXRNZWRpYVRyYWNrICh0cmFjaykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaG93LktFWV9NRURJQV9UUkFDSywgdHJhY2spO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0TWVkaWFUcmFjayAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTaG93LktFWV9NRURJQV9UUkFDSyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtJbWFnZX0gZ3JhcGhpYyAtIEltYWdlIHN0cnVjdCBkZXRlcm1pbmluZyB3aGV0aGVyIHN0YXRpYyBvciBkeW5hbWljIGltYWdlIHRvIGRpc3BsYXkgaW4gYXBwLiBJZiBvbWl0dGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHN1cHBvcnRlZCBkaXNwbGF5cywgdGhlIGRpc3BsYXllZCBncmFwaGljIHNoYWxsIG5vdCBjaGFuZ2UuXG4gICAgICogQHJldHVybiB7U2hvd31cbiAgICAgKi9cbiAgICBzZXRHcmFwaGljIChncmFwaGljKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEltYWdlLCBncmFwaGljKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2hvdy5LRVlfR1JBUEhJQywgZ3JhcGhpYyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0ltYWdlfVxuICAgICAqL1xuICAgIGdldEdyYXBoaWMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSW1hZ2UsIFNob3cuS0VZX0dSQVBISUMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW1hZ2V9IGdyYXBoaWMgLSBJbWFnZSBzdHJ1Y3QgZGV0ZXJtaW5pbmcgd2hldGhlciBzdGF0aWMgb3IgZHluYW1pYyBzZWNvbmRhcnkgaW1hZ2UgdG8gZGlzcGxheSBpbiBhcHAuIElmXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQgb24gc3VwcG9ydGVkIGRpc3BsYXlzLCB0aGUgZGlzcGxheWVkIHNlY29uZGFyeSBncmFwaGljIHNoYWxsIG5vdCBjaGFuZ2UuXG4gICAgICogQHJldHVybiB7U2hvd31cbiAgICAgKi9cbiAgICBzZXRTZWNvbmRhcnlHcmFwaGljIChncmFwaGljKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEltYWdlLCBncmFwaGljKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2hvdy5LRVlfU0VDT05EQVJZX0dSQVBISUMsIGdyYXBoaWMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtJbWFnZX1cbiAgICAgKi9cbiAgICBnZXRTZWNvbmRhcnlHcmFwaGljICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEltYWdlLCBTaG93LktFWV9TRUNPTkRBUllfR1JBUEhJQyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTb2Z0QnV0dG9uW119IGJ1dHRvbnMgLSBBcHAgZGVmaW5lZCBTb2Z0QnV0dG9ucy4gSWYgb21pdHRlZCBvbiBzdXBwb3J0ZWQgZGlzcGxheXMsIHRoZSBjdXJyZW50bHlcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZCBTb2Z0QnV0dG9uIHZhbHVlcyB3aWxsIG5vdCBjaGFuZ2UuXG4gICAgICogQHJldHVybiB7U2hvd31cbiAgICAgKi9cbiAgICBzZXRTb2Z0QnV0dG9ucyAoYnV0dG9ucykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTb2Z0QnV0dG9uLCBidXR0b25zLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2hvdy5LRVlfU09GVF9CVVRUT05TLCBidXR0b25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U29mdEJ1dHRvbltdfVxuICAgICAqL1xuICAgIGdldFNvZnRCdXR0b25zICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFNvZnRCdXR0b24sIFNob3cuS0VZX1NPRlRfQlVUVE9OUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmdbXX0gcHJlc2V0cyAtIEFwcCBsYWJlbGVkIG9uLXNjcmVlbiBwcmVzZXRzIChpLmUuIG9uLXNjcmVlbiBtZWRpYSBwcmVzZXRzIG9yIGR5bmFtaWMgc2VhcmNoXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zKS4gSWYgb21pdHRlZCBvbiBzdXBwb3J0ZWQgZGlzcGxheXMsIHRoZSBwcmVzZXRzIHdpbGwgYmUgc2hvd24gYXMgbm90XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQuXG4gICAgICogQHJldHVybiB7U2hvd31cbiAgICAgKi9cbiAgICBzZXRDdXN0b21QcmVzZXRzIChwcmVzZXRzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX0NVU1RPTV9QUkVTRVRTLCBwcmVzZXRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0Q3VzdG9tUHJlc2V0cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTaG93LktFWV9DVVNUT01fUFJFU0VUUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZXRhZGF0YVRhZ3N9IHRhZ3MgLSBBcHAgZGVmaW5lZCBtZXRhZGF0YSBpbmZvcm1hdGlvbi4gU2VlIE1ldGFkYXRhU3RydWN0LiBVc2VzIG1haW5GaWVsZDEsIG1haW5GaWVsZDIsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluRmllbGQzLCBtYWluRmllbGQ0LiBJZiBvbWl0dGVkIG9uIHN1cHBvcnRlZCBkaXNwbGF5cywgdGhlIGN1cnJlbnRseSBzZXQgbWV0YWRhdGFcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3Mgd2lsbCBub3QgY2hhbmdlLiBJZiBhbnkgdGV4dCBmaWVsZCBjb250YWlucyBubyB0YWdzIG9yIHRoZSBub25lIHRhZywgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0YWcgZm9yIHRoYXQgdGV4dGZpZWxkIHNob3VsZCBiZSByZW1vdmVkLlxuICAgICAqIEByZXR1cm4ge1Nob3d9XG4gICAgICovXG4gICAgc2V0TWV0YWRhdGFUYWdzICh0YWdzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKE1ldGFkYXRhVGFncywgdGFncyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX01FVEFEQVRBX1RBR1MsIHRhZ3MpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNZXRhZGF0YVRhZ3N9XG4gICAgICovXG4gICAgZ2V0TWV0YWRhdGFUYWdzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KE1ldGFkYXRhVGFncywgU2hvdy5LRVlfTUVUQURBVEFfVEFHUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRpdGxlIC0gVGhlIHRpdGxlIG9mIHRoZSBuZXcgdGVtcGxhdGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZC4gSG93IHRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgaXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnQgb24gdGhlIE9FTSBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICAgKiBAcmV0dXJuIHtTaG93fVxuICAgICAqL1xuICAgIHNldFRlbXBsYXRlVGl0bGUgKHRpdGxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX1RFTVBMQVRFX1RJVExFLCB0aXRsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRUZW1wbGF0ZVRpdGxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNob3cuS0VZX1RFTVBMQVRFX1RJVExFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaWQgLSBUaGlzIGlzIHRoZSB1bmlxdWUgSUQgYXNzaWduZWQgdG8gdGhlIHdpbmRvdyB0aGF0IHRoaXMgUlBDIGlzIGludGVuZGVkLiBJZiB0aGlzIHBhcmFtIGlzIG5vdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkLCBpdCB3aWxsIGJlIGFzc3VtZWQgdGhhdCB0aGlzIHJlcXVlc3QgaXMgc3BlY2lmaWNhbGx5IGZvciB0aGUgbWFpbiB3aW5kb3cgb24gdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgbWFpbiBkaXNwbGF5LiBTZWUgUHJlZGVmaW5lZFdpbmRvd3MgZW51bS5cbiAgICAgKiBAcmV0dXJuIHtTaG93fVxuICAgICAqL1xuICAgIHNldFdpbmRvd0lEIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaG93LktFWV9XSU5ET1dfSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFdpbmRvd0lEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNob3cuS0VZX1dJTkRPV19JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUZW1wbGF0ZUNvbmZpZ3VyYXRpb259IGNvbmZpZ3VyYXRpb24gLSBVc2VkIHRvIHNldCBhbiBhbHRlcm5hdGUgdGVtcGxhdGUgbGF5b3V0IHRvIGEgd2luZG93LlxuICAgICAqIEByZXR1cm4ge1Nob3d9XG4gICAgICovXG4gICAgc2V0VGVtcGxhdGVDb25maWd1cmF0aW9uIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRlbXBsYXRlQ29uZmlndXJhdGlvbiwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3cuS0VZX1RFTVBMQVRFX0NPTkZJR1VSQVRJT04sIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUNvbmZpZ3VyYXRpb259XG4gICAgICovXG4gICAgZ2V0VGVtcGxhdGVDb25maWd1cmF0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRlbXBsYXRlQ29uZmlndXJhdGlvbiwgU2hvdy5LRVlfVEVNUExBVEVfQ09ORklHVVJBVElPTik7XG4gICAgfVxufVxuXG5TaG93LktFWV9NQUlOX0ZJRUxEXzEgPSAnbWFpbkZpZWxkMSc7XG5TaG93LktFWV9NQUlOX0ZJRUxEXzIgPSAnbWFpbkZpZWxkMic7XG5TaG93LktFWV9NQUlOX0ZJRUxEXzMgPSAnbWFpbkZpZWxkMyc7XG5TaG93LktFWV9NQUlOX0ZJRUxEXzQgPSAnbWFpbkZpZWxkNCc7XG5TaG93LktFWV9BTElHTk1FTlQgPSAnYWxpZ25tZW50JztcblNob3cuS0VZX1NUQVRVU19CQVIgPSAnc3RhdHVzQmFyJztcblNob3cuS0VZX01FRElBX0NMT0NLID0gJ21lZGlhQ2xvY2snO1xuU2hvdy5LRVlfTUVESUFfVFJBQ0sgPSAnbWVkaWFUcmFjayc7XG5TaG93LktFWV9HUkFQSElDID0gJ2dyYXBoaWMnO1xuU2hvdy5LRVlfU0VDT05EQVJZX0dSQVBISUMgPSAnc2Vjb25kYXJ5R3JhcGhpYyc7XG5TaG93LktFWV9TT0ZUX0JVVFRPTlMgPSAnc29mdEJ1dHRvbnMnO1xuU2hvdy5LRVlfQ1VTVE9NX1BSRVNFVFMgPSAnY3VzdG9tUHJlc2V0cyc7XG5TaG93LktFWV9NRVRBREFUQV9UQUdTID0gJ21ldGFkYXRhVGFncyc7XG5TaG93LktFWV9URU1QTEFURV9USVRMRSA9ICd0ZW1wbGF0ZVRpdGxlJztcblNob3cuS0VZX1dJTkRPV19JRCA9ICd3aW5kb3dJRCc7XG5TaG93LktFWV9URU1QTEFURV9DT05GSUdVUkFUSU9OID0gJ3RlbXBsYXRlQ29uZmlndXJhdGlvbic7XG5cbmV4cG9ydCB7IFNob3cgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgU2hvd1Jlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuU2hvdyk7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB7IFNob3dSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IFRUU0NodW5rIH0gZnJvbSAnLi4vc3RydWN0cy9UVFNDaHVuay5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbi8qKlxuICogU3BlYWtzIGEgdGV4dC5cbiAqL1xuY2xhc3MgU3BlYWsgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlNwZWFrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RUU0NodW5rW119IGNodW5rcyAtIEFuIGFycmF5IG9mIHRleHQgY2h1bmtzIG9mIHR5cGUgVFRTQ2h1bmsuIFNlZSBUVFNDaHVuay4gVGhlIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIGl0ZW0uXG4gICAgICogQHJldHVybiB7U3BlYWt9XG4gICAgICovXG4gICAgc2V0VHRzQ2h1bmtzIChjaHVua3MpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVFRTQ2h1bmssIGNodW5rcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNwZWFrLktFWV9UVFNfQ0hVTktTLCBjaHVua3MpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUVFNDaHVua1tdfVxuICAgICAqL1xuICAgIGdldFR0c0NodW5rcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUVFNDaHVuaywgU3BlYWsuS0VZX1RUU19DSFVOS1MpO1xuICAgIH1cbn1cblxuU3BlYWsuS0VZX1RUU19DSFVOS1MgPSAndHRzQ2h1bmtzJztcblxuZXhwb3J0IHsgU3BlYWsgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgU3BlYWtSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlNwZWFrKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgU3BlYWtSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbmNsYXNzIFN0YXJ0VGltZSBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhvdXJzIC0gVGhlIGhvdXIgb2YgdGhlIG1lZGlhIGNsb2NrLiBTb21lIHJhZGlvcyBvbmx5IHN1cHBvcnQgYSBtYXggb2YgMTkgaG91cnMuIElmIG91dCBvZiByYW5nZSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgICAqIEByZXR1cm4ge1N0YXJ0VGltZX1cbiAgICAgKi9cbiAgICBzZXRIb3VycyAoaG91cnMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3RhcnRUaW1lLktFWV9IT1VSUywgaG91cnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0SG91cnMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU3RhcnRUaW1lLktFWV9IT1VSUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1pbnV0ZXNcbiAgICAgKiBAcmV0dXJuIHtTdGFydFRpbWV9XG4gICAgICovXG4gICAgc2V0TWludXRlcyAobWludXRlcykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTdGFydFRpbWUuS0VZX01JTlVURVMsIG1pbnV0ZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0TWludXRlcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTdGFydFRpbWUuS0VZX01JTlVURVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZWNvbmRzXG4gICAgICogQHJldHVybiB7U3RhcnRUaW1lfVxuICAgICAqL1xuICAgIHNldFNlY29uZHMgKHNlY29uZHMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3RhcnRUaW1lLktFWV9TRUNPTkRTLCBzZWNvbmRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFNlY29uZHMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU3RhcnRUaW1lLktFWV9TRUNPTkRTKTtcbiAgICB9XG59XG5cblN0YXJ0VGltZS5LRVlfSE9VUlMgPSAnaG91cnMnO1xuU3RhcnRUaW1lLktFWV9NSU5VVEVTID0gJ21pbnV0ZXMnO1xuU3RhcnRUaW1lLktFWV9TRUNPTkRTID0gJ3NlY29uZHMnO1xuXG5leHBvcnQgeyBTdGFydFRpbWUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBEZXNjcmliZXMgaG93IHRoZSBtZWRpYSBjbG9jayB0aW1lciBzaG91bGQgYmVoYXZlIG9uIHRoZSBwbGF0Zm9ybVxuICogQHR5cGVkZWYge0VudW19IFVwZGF0ZU1vZGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFVwZGF0ZU1vZGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRoZSBtZWRpYSBjbG9jayB0aW1lciBjb3VudGluZyB1cHdhcmRzLCBhcyBpbiB0aW1lIGVsYXBzZWQuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ09VTlRVUCAoKSB7XG4gICAgICAgIHJldHVybiBVcGRhdGVNb2RlLl9NQVAuQ09VTlRVUDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdGFydHMgdGhlIG1lZGlhIGNsb2NrIHRpbWVyIGNvdW50aW5nIGRvd253YXJkcywgYXMgaW4gdGltZSByZW1haW5pbmcuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ09VTlRET1dOICgpIHtcbiAgICAgICAgcmV0dXJuIFVwZGF0ZU1vZGUuX01BUC5DT1VOVERPV047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF1c2VzIHRoZSBtZWRpYSBjbG9jayB0aW1lclxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBBVVNFICgpIHtcbiAgICAgICAgcmV0dXJuIFVwZGF0ZU1vZGUuX01BUC5QQVVTRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN1bWUgdGhlIG1lZGlhIGNsb2NrIHRpbWVyXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUkVTVU1FICgpIHtcbiAgICAgICAgcmV0dXJuIFVwZGF0ZU1vZGUuX01BUC5SRVNVTUU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBtZWRpYSBjbG9jayB0aW1lciAocHJldmlvdXNseSBkb25lIHRocm91Z2ggU2hvdy0+bWVkaWFDbG9jaylcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDTEVBUiAoKSB7XG4gICAgICAgIHJldHVybiBVcGRhdGVNb2RlLl9NQVAuQ0xFQVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gVXBkYXRlTW9kZS5fdmFsdWVGb3JLZXkoa2V5LCBVcGRhdGVNb2RlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gVXBkYXRlTW9kZS5fa2V5Rm9yVmFsdWUodmFsdWUsIFVwZGF0ZU1vZGUuX01BUCk7XG4gICAgfVxufVxuXG5VcGRhdGVNb2RlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnQ09VTlRVUCc6ICdDT1VOVFVQJyxcbiAgICAnQ09VTlRET1dOJzogJ0NPVU5URE9XTicsXG4gICAgJ1BBVVNFJzogJ1BBVVNFJyxcbiAgICAnUkVTVU1FJzogJ1JFU1VNRScsXG4gICAgJ0NMRUFSJzogJ0NMRUFSJyxcbn0pO1xuXG5leHBvcnQgeyBVcGRhdGVNb2RlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IEF1ZGlvU3RyZWFtaW5nSW5kaWNhdG9yXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBBdWRpb1N0cmVhbWluZ0luZGljYXRvciBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHBsYXliYWNrIGluZGljYXRvci4gQnkgZGVmYXVsdCB0aGUgcGxheWJhY2sgaW5kaWNhdG9yIHNob3VsZCBiZSBQTEFZX1BBVVNFIHdoZW46IC0gdGhlIG1lZGlhIGFwcCBpc1xuICAgICAqIG5ld2x5IHJlZ2lzdGVyZWQgb24gdGhlIGhlYWQgdW5pdCAoYWZ0ZXIgUmVnaXN0ZXJBcHBJbnRlcmZhY2UpIC0gdGhlIG1lZGlhIGFwcCB3YXMgY2xvc2VkIGJ5IHRoZSB1c2VyIChBcHBcbiAgICAgKiBlbnRlcnMgSE1JX05PTkUpIC0gdGhlIGFwcCBzZW5kcyBTZXRNZWRpYUNsb2NrVGltZXIgd2l0aCBhdWRpb1N0cmVhbWluZ0luZGljYXRvciBub3Qgc2V0IHRvIGFueSB2YWx1ZVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBMQVlfUEFVU0UgKCkge1xuICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1pbmdJbmRpY2F0b3IuX01BUC5QTEFZX1BBVVNFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGF0IGEgYnV0dG9uIHByZXNzIG9mIHRoZSBQbGF5L1BhdXNlIGJ1dHRvbiBzdGFydHMgdGhlIGF1ZGlvIHBsYXliYWNrLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBMQVkgKCkge1xuICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1pbmdJbmRpY2F0b3IuX01BUC5QTEFZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGF0IGEgYnV0dG9uIHByZXNzIG9mIHRoZSBQbGF5L1BhdXNlIGJ1dHRvbiBwYXVzZXMgdGhlIGN1cnJlbnQgYXVkaW8gcGxheWJhY2suXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUEFVU0UgKCkge1xuICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1pbmdJbmRpY2F0b3IuX01BUC5QQVVTRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCBhIGJ1dHRvbiBwcmVzcyBvZiB0aGUgUGxheS9QYXVzZSBidXR0b24gc3RvcHMgdGhlIGN1cnJlbnQgYXVkaW8gcGxheWJhY2suXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU1RPUCAoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb1N0cmVhbWluZ0luZGljYXRvci5fTUFQLlNUT1A7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1pbmdJbmRpY2F0b3IuX3ZhbHVlRm9yS2V5KGtleSwgQXVkaW9TdHJlYW1pbmdJbmRpY2F0b3IuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBBdWRpb1N0cmVhbWluZ0luZGljYXRvci5fa2V5Rm9yVmFsdWUodmFsdWUsIEF1ZGlvU3RyZWFtaW5nSW5kaWNhdG9yLl9NQVApO1xuICAgIH1cbn1cblxuQXVkaW9TdHJlYW1pbmdJbmRpY2F0b3IuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdQTEFZX1BBVVNFJzogJ1BMQVlfUEFVU0UnLFxuICAgICdQTEFZJzogJ1BMQVknLFxuICAgICdQQVVTRSc6ICdQQVVTRScsXG4gICAgJ1NUT1AnOiAnU1RPUCcsXG59KTtcblxuZXhwb3J0IHsgQXVkaW9TdHJlYW1pbmdJbmRpY2F0b3IgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBTdGFydFRpbWUgfSBmcm9tICcuLi9zdHJ1Y3RzL1N0YXJ0VGltZS5qcyc7XG5pbXBvcnQgeyBVcGRhdGVNb2RlIH0gZnJvbSAnLi4vZW51bXMvVXBkYXRlTW9kZS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBBdWRpb1N0cmVhbWluZ0luZGljYXRvciB9IGZyb20gJy4uL2VudW1zL0F1ZGlvU3RyZWFtaW5nSW5kaWNhdG9yLmpzJztcbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcblxuLyoqXG4gKiBTZXRzIHRoZSBpbml0aWFsIG1lZGlhIGNsb2NrIHZhbHVlIGFuZCBhdXRvbWF0aWMgdXBkYXRlIG1ldGhvZC5cbiAqL1xuY2xhc3MgU2V0TWVkaWFDbG9ja1RpbWVyIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5TZXRNZWRpYUNsb2NrVGltZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RhcnRUaW1lfSB0aW1lIC0gU2VlIFN0YXJ0VGltZS4gc3RhcnRUaW1lIG11c3QgYmUgcHJvdmlkZWQgZm9yIFwiQ09VTlRVUFwiIGFuZCBcIkNPVU5URE9XTlwiLiBzdGFydFRpbWUgd2lsbFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgaWdub3JlZCBmb3IgXCJSRVNVTUVcIiwgYW5kIFwiQ0xFQVJcIiBzdGFydFRpbWUgY2FuIGJlIHNlbnQgZm9yIFwiUEFVU0VcIiwgaW4gd2hpY2ggY2FzZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgd2lsbCB1cGRhdGUgdGhlIHBhdXNlZCBzdGFydFRpbWVcbiAgICAgKiBAcmV0dXJuIHtTZXRNZWRpYUNsb2NrVGltZXJ9XG4gICAgICovXG4gICAgc2V0U3RhcnRUaW1lICh0aW1lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFN0YXJ0VGltZSwgdGltZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNldE1lZGlhQ2xvY2tUaW1lci5LRVlfU1RBUlRfVElNRSwgdGltZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0YXJ0VGltZX1cbiAgICAgKi9cbiAgICBnZXRTdGFydFRpbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoU3RhcnRUaW1lLCBTZXRNZWRpYUNsb2NrVGltZXIuS0VZX1NUQVJUX1RJTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RhcnRUaW1lfSB0aW1lIC0gU2VlIFN0YXJ0VGltZS4gZW5kVGltZSBjYW4gYmUgcHJvdmlkZWQgZm9yIFwiQ09VTlRVUFwiIGFuZCBcIkNPVU5URE9XTlwiOyB0byBiZSB1c2VkIHRvXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgYW55IHZpc3VhbCBwcm9ncmVzcyBiYXIgKGlmIG5vdCBwcm92aWRlZCwgdGhpcyBmZWF0dXJlIGlzIGlnbm9yZWQpIElmIGVuZFRpbWVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGdyZWF0ZXIgdGhlbiBzdGFydFRpbWUgZm9yIENPVU5URE9XTiBvciBsZXNzIHRoYW4gc3RhcnRUaW1lIGZvciBDT1VOVFVQLCB0aGVuIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCB3aWxsIHJldHVybiBhbiBJTlZBTElEX0RBVEEuIGVuZFRpbWUgd2lsbCBiZSBpZ25vcmVkIGZvciBcIlJFU1VNRVwiLCBhbmQgXCJDTEVBUlwiXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lIGNhbiBiZSBzZW50IGZvciBcIlBBVVNFXCIsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCB1cGRhdGUgdGhlIHBhdXNlZCBlbmRUaW1lXG4gICAgICogQHJldHVybiB7U2V0TWVkaWFDbG9ja1RpbWVyfVxuICAgICAqL1xuICAgIHNldEVuZFRpbWUgKHRpbWUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU3RhcnRUaW1lLCB0aW1lKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2V0TWVkaWFDbG9ja1RpbWVyLktFWV9FTkRfVElNRSwgdGltZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0YXJ0VGltZX1cbiAgICAgKi9cbiAgICBnZXRFbmRUaW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFN0YXJ0VGltZSwgU2V0TWVkaWFDbG9ja1RpbWVyLktFWV9FTkRfVElNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtVcGRhdGVNb2RlfSBtb2RlIC0gRW51bWVyYXRpb24gdG8gY29udHJvbCB0aGUgbWVkaWEgY2xvY2suIEluIGNhc2Ugb2YgcGF1c2UsIHJlc3VtZSwgb3IgY2xlYXIsIHRoZSBzdGFydFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgdmFsdWUgaXMgaWdub3JlZCBhbmQgc2hhbGwgYmUgbGVmdCBvdXQuIEZvciByZXN1bWUsIHRoZSB0aW1lIGNvbnRpbnVlcyB3aXRoIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWUgdmFsdWUgYXMgaXQgd2FzIHdoZW4gcGF1c2VkLlxuICAgICAqIEByZXR1cm4ge1NldE1lZGlhQ2xvY2tUaW1lcn1cbiAgICAgKi9cbiAgICBzZXRVcGRhdGVNb2RlIChtb2RlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFVwZGF0ZU1vZGUsIG1vZGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZXRNZWRpYUNsb2NrVGltZXIuS0VZX1VQREFURV9NT0RFLCBtb2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VXBkYXRlTW9kZX1cbiAgICAgKi9cbiAgICBnZXRVcGRhdGVNb2RlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFVwZGF0ZU1vZGUsIFNldE1lZGlhQ2xvY2tUaW1lci5LRVlfVVBEQVRFX01PREUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXVkaW9TdHJlYW1pbmdJbmRpY2F0b3J9IGluZGljYXRvciAtIEVudW1lcmF0aW9uIGZvciB0aGUgaW5kaWNhdG9yIGljb24gb24gYSBwbGF5L3BhdXNlIGJ1dHRvbi4gc2VlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1pbmdJbmRpY2F0b3IuXG4gICAgICogQHJldHVybiB7U2V0TWVkaWFDbG9ja1RpbWVyfVxuICAgICAqL1xuICAgIHNldEF1ZGlvU3RyZWFtaW5nSW5kaWNhdG9yIChpbmRpY2F0b3IpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQXVkaW9TdHJlYW1pbmdJbmRpY2F0b3IsIGluZGljYXRvcik7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNldE1lZGlhQ2xvY2tUaW1lci5LRVlfQVVESU9fU1RSRUFNSU5HX0lORElDQVRPUiwgaW5kaWNhdG9yKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QXVkaW9TdHJlYW1pbmdJbmRpY2F0b3J9XG4gICAgICovXG4gICAgZ2V0QXVkaW9TdHJlYW1pbmdJbmRpY2F0b3IgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQXVkaW9TdHJlYW1pbmdJbmRpY2F0b3IsIFNldE1lZGlhQ2xvY2tUaW1lci5LRVlfQVVESU9fU1RSRUFNSU5HX0lORElDQVRPUik7XG4gICAgfVxufVxuXG5TZXRNZWRpYUNsb2NrVGltZXIuS0VZX1NUQVJUX1RJTUUgPSAnc3RhcnRUaW1lJztcblNldE1lZGlhQ2xvY2tUaW1lci5LRVlfRU5EX1RJTUUgPSAnZW5kVGltZSc7XG5TZXRNZWRpYUNsb2NrVGltZXIuS0VZX1VQREFURV9NT0RFID0gJ3VwZGF0ZU1vZGUnO1xuU2V0TWVkaWFDbG9ja1RpbWVyLktFWV9BVURJT19TVFJFQU1JTkdfSU5ESUNBVE9SID0gJ2F1ZGlvU3RyZWFtaW5nSW5kaWNhdG9yJztcblxuZXhwb3J0IHsgU2V0TWVkaWFDbG9ja1RpbWVyIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgUnBjUmVzcG9uc2UgfSBmcm9tICcuLi9ScGNSZXNwb25zZS5qcyc7XG5cbmNsYXNzIFNldE1lZGlhQ2xvY2tUaW1lclJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuU2V0TWVkaWFDbG9ja1RpbWVyKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgU2V0TWVkaWFDbG9ja1RpbWVyUmVzcG9uc2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBUVFNDaHVuayB9IGZyb20gJy4uL3N0cnVjdHMvVFRTQ2h1bmsuanMnO1xuaW1wb3J0IHsgQXVkaW9UeXBlIH0gZnJvbSAnLi4vZW51bXMvQXVkaW9UeXBlLmpzJztcbmltcG9ydCB7IEJpdHNQZXJTYW1wbGUgfSBmcm9tICcuLi9lbnVtcy9CaXRzUGVyU2FtcGxlLmpzJztcbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IFNhbXBsaW5nUmF0ZSB9IGZyb20gJy4uL2VudW1zL1NhbXBsaW5nUmF0ZS5qcyc7XG5cbi8qKlxuICogU3RhcnRzIGF1ZGlvIHBhc3MgdGhydSBzZXNzaW9uXG4gKi9cbmNsYXNzIFBlcmZvcm1BdWRpb1Bhc3NUaHJ1IGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5QZXJmb3JtQXVkaW9QYXNzVGhydSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUVFNDaHVua1tdfSBwcm9tcHQgLSBUaGUgbW9kdWxlIHdpbGwgc3BlYWsgdGhpcyBwcm9tcHQgYmVmb3JlIG9wZW5pbmcgdGhlIGF1ZGlvIHBhc3MgdGhydSBzZXNzaW9uLiBBblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgb2YgdGV4dCBjaHVua3Mgb2YgdHlwZSBUVFNDaHVuay4gU2VlIFRUU0NodW5rLiBUaGUgYXJyYXkgbXVzdCBoYXZlIGF0IGxlYXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgaXRlbS4gSWYgb21pdHRlZCwgdGhlbiBubyBpbml0aWFsIHByb21wdCBpcyBzcG9rZW4uXG4gICAgICogQHJldHVybiB7UGVyZm9ybUF1ZGlvUGFzc1RocnV9XG4gICAgICovXG4gICAgc2V0SW5pdGlhbFByb21wdCAocHJvbXB0KSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRUU0NodW5rLCBwcm9tcHQsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQZXJmb3JtQXVkaW9QYXNzVGhydS5LRVlfSU5JVElBTF9QUk9NUFQsIHByb21wdCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RUU0NodW5rW119XG4gICAgICovXG4gICAgZ2V0SW5pdGlhbFByb21wdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUVFNDaHVuaywgUGVyZm9ybUF1ZGlvUGFzc1RocnUuS0VZX0lOSVRJQUxfUFJPTVBUKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dDEgLSBGaXJzdCBsaW5lIG9mIHRleHQgZGlzcGxheWVkIGR1cmluZyBhdWRpbyBjYXB0dXJlLlxuICAgICAqIEByZXR1cm4ge1BlcmZvcm1BdWRpb1Bhc3NUaHJ1fVxuICAgICAqL1xuICAgIHNldEF1ZGlvUGFzc1RocnVEaXNwbGF5VGV4dDEgKHRleHQxKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFBlcmZvcm1BdWRpb1Bhc3NUaHJ1LktFWV9BVURJT19QQVNTX1RIUlVfRElTUExBWV9URVhUXzEsIHRleHQxKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldEF1ZGlvUGFzc1RocnVEaXNwbGF5VGV4dDEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUGVyZm9ybUF1ZGlvUGFzc1RocnUuS0VZX0FVRElPX1BBU1NfVEhSVV9ESVNQTEFZX1RFWFRfMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQyIC0gU2Vjb25kIGxpbmUgb2YgdGV4dCBkaXNwbGF5ZWQgZHVyaW5nIGF1ZGlvIGNhcHR1cmUuXG4gICAgICogQHJldHVybiB7UGVyZm9ybUF1ZGlvUGFzc1RocnV9XG4gICAgICovXG4gICAgc2V0QXVkaW9QYXNzVGhydURpc3BsYXlUZXh0MiAodGV4dDIpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUGVyZm9ybUF1ZGlvUGFzc1RocnUuS0VZX0FVRElPX1BBU1NfVEhSVV9ESVNQTEFZX1RFWFRfMiwgdGV4dDIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0QXVkaW9QYXNzVGhydURpc3BsYXlUZXh0MiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihQZXJmb3JtQXVkaW9QYXNzVGhydS5LRVlfQVVESU9fUEFTU19USFJVX0RJU1BMQVlfVEVYVF8yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NhbXBsaW5nUmF0ZX0gcmF0ZSAtIFRoaXMgdmFsdWUgc2hhbGwgYmUgYWxsb3dlZCBhdCA4IGtIeiBvciAxNiBvciAyMiBvciA0NCBrSHouXG4gICAgICogQHJldHVybiB7UGVyZm9ybUF1ZGlvUGFzc1RocnV9XG4gICAgICovXG4gICAgc2V0U2FtcGxpbmdSYXRlIChyYXRlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFNhbXBsaW5nUmF0ZSwgcmF0ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFBlcmZvcm1BdWRpb1Bhc3NUaHJ1LktFWV9TQU1QTElOR19SQVRFLCByYXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U2FtcGxpbmdSYXRlfVxuICAgICAqL1xuICAgIGdldFNhbXBsaW5nUmF0ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTYW1wbGluZ1JhdGUsIFBlcmZvcm1BdWRpb1Bhc3NUaHJ1LktFWV9TQU1QTElOR19SQVRFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZHVyYXRpb24gLSBUaGUgbWF4aW11bSBkdXJhdGlvbiBvZiBhdWRpbyByZWNvcmRpbmcgaW4gbWlsbGlzZWNvbmRzLlxuICAgICAqIEByZXR1cm4ge1BlcmZvcm1BdWRpb1Bhc3NUaHJ1fVxuICAgICAqL1xuICAgIHNldE1heER1cmF0aW9uIChkdXJhdGlvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQZXJmb3JtQXVkaW9QYXNzVGhydS5LRVlfTUFYX0RVUkFUSU9OLCBkdXJhdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRNYXhEdXJhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihQZXJmb3JtQXVkaW9QYXNzVGhydS5LRVlfTUFYX0RVUkFUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0JpdHNQZXJTYW1wbGV9IHNhbXBsZSAtIFNwZWNpZmllcyB0aGUgcXVhbGl0eSB0aGUgYXVkaW8gaXMgcmVjb3JkZWQuIEN1cnJlbnRseSA4IGJpdCBvciAxNiBiaXQuXG4gICAgICogQHJldHVybiB7UGVyZm9ybUF1ZGlvUGFzc1RocnV9XG4gICAgICovXG4gICAgc2V0Qml0c1BlclNhbXBsZSAoc2FtcGxlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEJpdHNQZXJTYW1wbGUsIHNhbXBsZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFBlcmZvcm1BdWRpb1Bhc3NUaHJ1LktFWV9CSVRTX1BFUl9TQU1QTEUsIHNhbXBsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0JpdHNQZXJTYW1wbGV9XG4gICAgICovXG4gICAgZ2V0Qml0c1BlclNhbXBsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChCaXRzUGVyU2FtcGxlLCBQZXJmb3JtQXVkaW9QYXNzVGhydS5LRVlfQklUU19QRVJfU0FNUExFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0F1ZGlvVHlwZX0gdHlwZSAtIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBhdWRpbyBkYXRhIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAcmV0dXJuIHtQZXJmb3JtQXVkaW9QYXNzVGhydX1cbiAgICAgKi9cbiAgICBzZXRBdWRpb1R5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQXVkaW9UeXBlLCB0eXBlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUGVyZm9ybUF1ZGlvUGFzc1RocnUuS0VZX0FVRElPX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtBdWRpb1R5cGV9XG4gICAgICovXG4gICAgZ2V0QXVkaW9UeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEF1ZGlvVHlwZSwgUGVyZm9ybUF1ZGlvUGFzc1RocnUuS0VZX0FVRElPX1RZUEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXVkaW8gLSBEZWZpbmVzIGlmIHRoZSBjdXJyZW50IGF1ZGlvIHNvdXJjZSBzaG91bGQgYmUgbXV0ZWQgZHVyaW5nIHRoZSBBUFQgc2Vzc2lvbi4gSWYgbm90LCB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gc291cmNlIHdpbGwgcGxheSB3aXRob3V0IGludGVycnVwdGlvbi4gSWYgb21pdHRlZCwgdGhlIHZhbHVlIGlzIHNldCB0byB0cnVlLlxuICAgICAqIEByZXR1cm4ge1BlcmZvcm1BdWRpb1Bhc3NUaHJ1fVxuICAgICAqL1xuICAgIHNldE11dGVBdWRpbyAoYXVkaW8pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUGVyZm9ybUF1ZGlvUGFzc1RocnUuS0VZX01VVEVfQVVESU8sIGF1ZGlvKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRNdXRlQXVkaW8gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUGVyZm9ybUF1ZGlvUGFzc1RocnUuS0VZX01VVEVfQVVESU8pO1xuICAgIH1cbn1cblxuUGVyZm9ybUF1ZGlvUGFzc1RocnUuS0VZX0lOSVRJQUxfUFJPTVBUID0gJ2luaXRpYWxQcm9tcHQnO1xuUGVyZm9ybUF1ZGlvUGFzc1RocnUuS0VZX0FVRElPX1BBU1NfVEhSVV9ESVNQTEFZX1RFWFRfMSA9ICdhdWRpb1Bhc3NUaHJ1RGlzcGxheVRleHQxJztcblBlcmZvcm1BdWRpb1Bhc3NUaHJ1LktFWV9BVURJT19QQVNTX1RIUlVfRElTUExBWV9URVhUXzIgPSAnYXVkaW9QYXNzVGhydURpc3BsYXlUZXh0Mic7XG5QZXJmb3JtQXVkaW9QYXNzVGhydS5LRVlfU0FNUExJTkdfUkFURSA9ICdzYW1wbGluZ1JhdGUnO1xuUGVyZm9ybUF1ZGlvUGFzc1RocnUuS0VZX01BWF9EVVJBVElPTiA9ICdtYXhEdXJhdGlvbic7XG5QZXJmb3JtQXVkaW9QYXNzVGhydS5LRVlfQklUU19QRVJfU0FNUExFID0gJ2JpdHNQZXJTYW1wbGUnO1xuUGVyZm9ybUF1ZGlvUGFzc1RocnUuS0VZX0FVRElPX1RZUEUgPSAnYXVkaW9UeXBlJztcblBlcmZvcm1BdWRpb1Bhc3NUaHJ1LktFWV9NVVRFX0FVRElPID0gJ211dGVBdWRpbyc7XG5cbmV4cG9ydCB7IFBlcmZvcm1BdWRpb1Bhc3NUaHJ1IH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgUnBjUmVzcG9uc2UgfSBmcm9tICcuLi9ScGNSZXNwb25zZS5qcyc7XG5cbmNsYXNzIFBlcmZvcm1BdWRpb1Bhc3NUaHJ1UmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5QZXJmb3JtQXVkaW9QYXNzVGhydSk7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB7IFBlcmZvcm1BdWRpb1Bhc3NUaHJ1UmVzcG9uc2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbi8qKlxuICogV2hlbiB0aGlzIHJlcXVlc3QgaXMgaW52b2tlZCwgdGhlIGF1ZGlvIGNhcHR1cmUgc3RvcHMuXG4gKi9cbmNsYXNzIEVuZEF1ZGlvUGFzc1RocnUgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkVuZEF1ZGlvUGFzc1RocnUpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBFbmRBdWRpb1Bhc3NUaHJ1IH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgUnBjUmVzcG9uc2UgfSBmcm9tICcuLi9ScGNSZXNwb25zZS5qcyc7XG5cbmNsYXNzIEVuZEF1ZGlvUGFzc1RocnVSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkVuZEF1ZGlvUGFzc1RocnUpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBFbmRBdWRpb1Bhc3NUaHJ1UmVzcG9uc2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBCdXR0b25OYW1lIH0gZnJvbSAnLi4vZW51bXMvQnV0dG9uTmFtZS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbi8qKlxuICogU3Vic2NyaWJlcyB0byBidWlsdC1pbiBITUkgYnV0dG9ucy4gVGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgbm90aWZpZWQgYnkgdGhlIE9uQnV0dG9uRXZlbnQgYW5kIE9uQnV0dG9uUHJlc3MuIFRvXG4gKiB1bnN1YnNjcmliZSB0aGUgbm90aWZpY2F0aW9ucywgdXNlIHVuc3Vic2NyaWJlQnV0dG9uLlxuICovXG5jbGFzcyBTdWJzY3JpYmVCdXR0b24gZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlN1YnNjcmliZUJ1dHRvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCdXR0b25OYW1lfSBuYW1lIC0gTmFtZSBvZiB0aGUgYnV0dG9uIHRvIHN1YnNjcmliZS5cbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVCdXR0b259XG4gICAgICovXG4gICAgc2V0QnV0dG9uTmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShCdXR0b25OYW1lLCBuYW1lKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlQnV0dG9uLktFWV9CVVRUT05fTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0J1dHRvbk5hbWV9XG4gICAgICovXG4gICAgZ2V0QnV0dG9uTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChCdXR0b25OYW1lLCBTdWJzY3JpYmVCdXR0b24uS0VZX0JVVFRPTl9OQU1FKTtcbiAgICB9XG59XG5cblN1YnNjcmliZUJ1dHRvbi5LRVlfQlVUVE9OX05BTUUgPSAnYnV0dG9uTmFtZSc7XG5cbmV4cG9ydCB7IFN1YnNjcmliZUJ1dHRvbiB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBTdWJzY3JpYmVCdXR0b25SZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlN1YnNjcmliZUJ1dHRvbik7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB7IFN1YnNjcmliZUJ1dHRvblJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgQnV0dG9uTmFtZSB9IGZyb20gJy4uL2VudW1zL0J1dHRvbk5hbWUuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG4vKipcbiAqIFVuc3Vic2NyaWJlcyBmcm9tIGJ1aWx0LWluIEhNSSBidXR0b25zLlxuICovXG5jbGFzcyBVbnN1YnNjcmliZUJ1dHRvbiBleHRlbmRzIFJwY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuVW5zdWJzY3JpYmVCdXR0b24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QnV0dG9uTmFtZX0gbmFtZSAtIE5hbWUgb2YgdGhlIGJ1dHRvbiB0byB1bnN1YnNjcmliZS5cbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZUJ1dHRvbn1cbiAgICAgKi9cbiAgICBzZXRCdXR0b25OYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEJ1dHRvbk5hbWUsIG5hbWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZUJ1dHRvbi5LRVlfQlVUVE9OX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCdXR0b25OYW1lfVxuICAgICAqL1xuICAgIGdldEJ1dHRvbk5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQnV0dG9uTmFtZSwgVW5zdWJzY3JpYmVCdXR0b24uS0VZX0JVVFRPTl9OQU1FKTtcbiAgICB9XG59XG5cblVuc3Vic2NyaWJlQnV0dG9uLktFWV9CVVRUT05fTkFNRSA9ICdidXR0b25OYW1lJztcblxuZXhwb3J0IHsgVW5zdWJzY3JpYmVCdXR0b24gfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgVW5zdWJzY3JpYmVCdXR0b25SZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlVuc3Vic2NyaWJlQnV0dG9uKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgVW5zdWJzY3JpYmVCdXR0b25SZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBTdWJzY3JpYmVzIGZvciBzcGVjaWZpYyBwdWJsaXNoZWQgZGF0YSBpdGVtcy4gVGhlIGRhdGEgd2lsbCBiZSBvbmx5IHNlbnQgaWYgaXQgaGFzIGNoYW5nZWQuIFRoZSBhcHBsaWNhdGlvbiB3aWxsIGJlXG4gKiBub3RpZmllZCBieSB0aGUgb25WZWhpY2xlRGF0YSBub3RpZmljYXRpb24gd2hlbmV2ZXIgbmV3IGRhdGEgaXMgYXZhaWxhYmxlLiBUbyB1bnN1YnNjcmliZSB0aGUgbm90aWZpY2F0aW9ucywgdXNlXG4gKiB1bnN1YnNjcmliZSB3aXRoIHRoZSBzYW1lIHN1YnNjcmlwdGlvblR5cGUuXG4gKi9cbmNsYXNzIFN1YnNjcmliZVZlaGljbGVEYXRhIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5TdWJzY3JpYmVWZWhpY2xlRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBncHMgLSBTZWUgR1BTRGF0YVxuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEdwcyAoZ3BzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9HUFMsIGdwcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0R3BzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9HUFMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3BlZWQgLSBUaGUgdmVoaWNsZSBzcGVlZCBpbiBraWxvbWV0ZXJzIHBlciBob3VyXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0U3BlZWQgKHNwZWVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9TUEVFRCwgc3BlZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFNwZWVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9TUEVFRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBycG0gLSBUaGUgbnVtYmVyIG9mIHJldm9sdXRpb25zIHBlciBtaW51dGUgb2YgdGhlIGVuZ2luZVxuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldFJwbSAocnBtKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9SUE0sIHJwbSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0UnBtICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9SUE0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbGV2ZWwgLSBUaGUgZnVlbCBsZXZlbCBpbiB0aGUgdGFuayAocGVyY2VudGFnZSlcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRGdWVsTGV2ZWwgKGxldmVsKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9GVUVMX0xFVkVMLCBsZXZlbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RnVlbExldmVsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9GVUVMX0xFVkVMKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGxldmVsX3N0YXRlIC0gVGhlIGZ1ZWwgbGV2ZWwgc3RhdGVcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRGdWVsTGV2ZWxfU3RhdGUgKGxldmVsX3N0YXRlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9GVUVMX0xFVkVMX1NUQVRFLCBsZXZlbF9zdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RnVlbExldmVsX1N0YXRlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9GVUVMX0xFVkVMX1NUQVRFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvbnN1bXB0aW9uIC0gVGhlIGluc3RhbnRhbmVvdXMgZnVlbCBjb25zdW1wdGlvbiBpbiBtaWNyb2xpdHJlc1xuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEluc3RhbnRGdWVsQ29uc3VtcHRpb24gKGNvbnN1bXB0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9JTlNUQU5UX0ZVRUxfQ09OU1VNUFRJT04sIGNvbnN1bXB0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRJbnN0YW50RnVlbENvbnN1bXB0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9JTlNUQU5UX0ZVRUxfQ09OU1VNUFRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcmFuZ2UgLSBUaGUgZXN0aW1hdGUgcmFuZ2UgaW4gS00gdGhlIHZlaGljbGUgY2FuIHRyYXZlbCBiYXNlZCBvbiBmdWVsIGxldmVsIGFuZCBjb25zdW1wdGlvblxuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEZ1ZWxSYW5nZSAocmFuZ2UpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0ZVRUxfUkFOR0UsIHJhbmdlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRGdWVsUmFuZ2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0ZVRUxfUkFOR0UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gdGVtcGVyYXR1cmUgLSBUaGUgZXh0ZXJuYWwgdGVtcGVyYXR1cmUgaW4gZGVncmVlcyBjZWxzaXVzXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0RXh0ZXJuYWxUZW1wZXJhdHVyZSAodGVtcGVyYXR1cmUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0VYVEVSTkFMX1RFTVBFUkFUVVJFLCB0ZW1wZXJhdHVyZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RXh0ZXJuYWxUZW1wZXJhdHVyZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfRVhURVJOQUxfVEVNUEVSQVRVUkUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gc2lnbmFsIC0gU2VlIFR1cm5TaWduYWxcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRUdXJuU2lnbmFsIChzaWduYWwpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX1RVUk5fU0lHTkFMLCBzaWduYWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFR1cm5TaWduYWwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX1RVUk5fU0lHTkFMKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBybmRsIC0gU2VlIFBSTkRMXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0UHJuZGwgKHBybmRsKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9QUk5ETCwgcHJuZGwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFBybmRsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9QUk5ETCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBwcmVzc3VyZSAtIFNlZSBUaXJlU3RhdHVzXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0VGlyZVByZXNzdXJlIChwcmVzc3VyZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfVElSRV9QUkVTU1VSRSwgcHJlc3N1cmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFRpcmVQcmVzc3VyZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfVElSRV9QUkVTU1VSRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBvZG9tZXRlciAtIE9kb21ldGVyIGluIGttXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0T2RvbWV0ZXIgKG9kb21ldGVyKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9PRE9NRVRFUiwgb2RvbWV0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldE9kb21ldGVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9PRE9NRVRFUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzdGF0dXMgLSBUaGUgc3RhdHVzIG9mIHRoZSBzZWF0IGJlbHRzXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0QmVsdFN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9CRUxUX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRCZWx0U3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9CRUxUX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBpbmZvcm1hdGlvbiAtIFRoZSBib2R5IGluZm9ybWF0aW9uIGluY2x1ZGluZyBwb3dlciBtb2Rlc1xuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEJvZHlJbmZvcm1hdGlvbiAoaW5mb3JtYXRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0JPRFlfSU5GT1JNQVRJT04sIGluZm9ybWF0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRCb2R5SW5mb3JtYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0JPRFlfSU5GT1JNQVRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3RhdHVzIC0gVGhlIGRldmljZSBzdGF0dXMgaW5jbHVkaW5nIHNpZ25hbCBhbmQgYmF0dGVyeSBzdHJlbmd0aFxuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldERldmljZVN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9ERVZJQ0VfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldERldmljZVN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfREVWSUNFX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBicmFraW5nIC0gVGhlIHN0YXR1cyBvZiB0aGUgYnJha2UgcGVkYWxcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXREcml2ZXJCcmFraW5nIChicmFraW5nKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9EUklWRVJfQlJBS0lORywgYnJha2luZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RHJpdmVyQnJha2luZyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfRFJJVkVSX0JSQUtJTkcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3RhdHVzIC0gVGhlIHN0YXR1cyBvZiB0aGUgd2lwZXJzXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0V2lwZXJTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfV0lQRVJfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFdpcGVyU3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9XSVBFUl9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3RhdHVzIC0gU3RhdHVzIG9mIHRoZSBoZWFkIGxhbXBzXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0SGVhZExhbXBTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfSEVBRF9MQU1QX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRIZWFkTGFtcFN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfSEVBRF9MQU1QX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSB0b3JxdWUgLSBUb3JxdWUgdmFsdWUgZm9yIGVuZ2luZSAoaW4gTm0pIG9uIG5vbi1kaWVzZWwgdmFyaWFudHNcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRFbmdpbmVUb3JxdWUgKHRvcnF1ZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfRU5HSU5FX1RPUlFVRSwgdG9ycXVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRFbmdpbmVUb3JxdWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0VOR0lORV9UT1JRVUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcG9zaXRpb24gLSBBY2NlbGVyYXRvciBwZWRhbCBwb3NpdGlvbiAocGVyY2VudGFnZSBkZXByZXNzZWQpXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0QWNjUGVkYWxQb3NpdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0FDQ19QRURBTF9QT1NJVElPTiwgcG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEFjY1BlZGFsUG9zaXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0FDQ19QRURBTF9QT1NJVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhbmdsZSAtIEN1cnJlbnQgYW5nbGUgb2YgdGhlIHN0ZWVyaW5nIHdoZWVsIChpbiBkZWcpXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0U3RlZXJpbmdXaGVlbEFuZ2xlIChhbmdsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfU1RFRVJJTkdfV0hFRUxfQU5HTEUsIGFuZ2xlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRTdGVlcmluZ1doZWVsQW5nbGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX1NURUVSSU5HX1dIRUVMX0FOR0xFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGxpZmUgLSBUaGUgZXN0aW1hdGVkIHBlcmNlbnRhZ2Ugb2YgcmVtYWluaW5nIG9pbCBsaWZlIG9mIHRoZSBlbmdpbmUuXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0RW5naW5lT2lsTGlmZSAobGlmZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfRU5HSU5FX09JTF9MSUZFLCBsaWZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRFbmdpbmVPaWxMaWZlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FTkdJTkVfT0lMX0xJRkUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3RhdHVzIC0gVGhlIHN0YXR1cyBvZiB0aGUgcGFyayBicmFrZSBhcyBwcm92aWRlZCBieSBFbGVjdHJpYyBQYXJrIEJyYWtlIChFUEIpIHN5c3RlbS5cbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRFbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0VMRUNUUk9OSUNfUEFSS19CUkFLRV9TVEFUVVMsIHN0YXR1cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfRUxFQ1RST05JQ19QQVJLX0JSQUtFX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBpZCAtIFBhcmFtZXRlciB1c2VkIGJ5IGNsb3VkIGFwcHMgdG8gaWRlbnRpZnkgYSBoZWFkIHVuaXRcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRDbG91ZEFwcFZlaGljbGVJRCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0NMT1VEX0FQUF9WRUhJQ0xFX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0Q2xvdWRBcHBWZWhpY2xlSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0NMT1VEX0FQUF9WRUhJQ0xFX0lEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluZm8gLSBFbWVyZ2VuY3kgQ2FsbCBub3RpZmljYXRpb24gYW5kIGNvbmZpcm1hdGlvbiBkYXRhXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0RUNhbGxJbmZvIChpbmZvKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FX0NBTExfSU5GTywgaW5mbyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RUNhbGxJbmZvICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FX0NBTExfSU5GTyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzdGF0dXMgLSBUaGUgc3RhdHVzIG9mIHRoZSBhaXIgYmFnc1xuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEFpcmJhZ1N0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9BSVJCQUdfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEFpcmJhZ1N0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfQUlSQkFHX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudCAtIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gYW4gZW1lcmdlbmN5IGV2ZW50IChhbmQgaWYgaXQgb2NjdXJyZWQpXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0RW1lcmdlbmN5RXZlbnQgKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FTUVSR0VOQ1lfRVZFTlQsIGV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRFbWVyZ2VuY3lFdmVudCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfRU1FUkdFTkNZX0VWRU5UKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHN0YXR1cyAtIFRoZSBzdGF0dXMgbW9kZXMgb2YgdGhlIGNsdXN0ZXJcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRDbHVzdGVyTW9kZVN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9DTFVTVEVSX01PREVfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldENsdXN0ZXJNb2RlU3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9DTFVTVEVSX01PREVfU1RBVFVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGtleSAtIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIE15S2V5IGZlYXR1cmVcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRNeUtleSAoa2V5KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9NWV9LRVksIGtleSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0TXlLZXkgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX01ZX0tFWSk7XG4gICAgfVxufVxuXG5TdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfR1BTID0gJ2dwcyc7XG5TdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfU1BFRUQgPSAnc3BlZWQnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX1JQTSA9ICdycG0nO1xuU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0ZVRUxfTEVWRUwgPSAnZnVlbExldmVsJztcblN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9GVUVMX0xFVkVMX1NUQVRFID0gJ2Z1ZWxMZXZlbF9TdGF0ZSc7XG5TdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfSU5TVEFOVF9GVUVMX0NPTlNVTVBUSU9OID0gJ2luc3RhbnRGdWVsQ29uc3VtcHRpb24nO1xuU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0ZVRUxfUkFOR0UgPSAnZnVlbFJhbmdlJztcblN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FWFRFUk5BTF9URU1QRVJBVFVSRSA9ICdleHRlcm5hbFRlbXBlcmF0dXJlJztcblN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9UVVJOX1NJR05BTCA9ICd0dXJuU2lnbmFsJztcblN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9QUk5ETCA9ICdwcm5kbCc7XG5TdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfVElSRV9QUkVTU1VSRSA9ICd0aXJlUHJlc3N1cmUnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX09ET01FVEVSID0gJ29kb21ldGVyJztcblN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9CRUxUX1NUQVRVUyA9ICdiZWx0U3RhdHVzJztcblN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9CT0RZX0lORk9STUFUSU9OID0gJ2JvZHlJbmZvcm1hdGlvbic7XG5TdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfREVWSUNFX1NUQVRVUyA9ICdkZXZpY2VTdGF0dXMnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0RSSVZFUl9CUkFLSU5HID0gJ2RyaXZlckJyYWtpbmcnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX1dJUEVSX1NUQVRVUyA9ICd3aXBlclN0YXR1cyc7XG5TdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfSEVBRF9MQU1QX1NUQVRVUyA9ICdoZWFkTGFtcFN0YXR1cyc7XG5TdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfRU5HSU5FX1RPUlFVRSA9ICdlbmdpbmVUb3JxdWUnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0FDQ19QRURBTF9QT1NJVElPTiA9ICdhY2NQZWRhbFBvc2l0aW9uJztcblN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9TVEVFUklOR19XSEVFTF9BTkdMRSA9ICdzdGVlcmluZ1doZWVsQW5nbGUnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0VOR0lORV9PSUxfTElGRSA9ICdlbmdpbmVPaWxMaWZlJztcblN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FTEVDVFJPTklDX1BBUktfQlJBS0VfU1RBVFVTID0gJ2VsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0NMT1VEX0FQUF9WRUhJQ0xFX0lEID0gJ2Nsb3VkQXBwVmVoaWNsZUlEJztcblN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FX0NBTExfSU5GTyA9ICdlQ2FsbEluZm8nO1xuU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0FJUkJBR19TVEFUVVMgPSAnYWlyYmFnU3RhdHVzJztcblN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FTUVSR0VOQ1lfRVZFTlQgPSAnZW1lcmdlbmN5RXZlbnQnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0NMVVNURVJfTU9ERV9TVEFUVVMgPSAnY2x1c3Rlck1vZGVTdGF0dXMnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX01ZX0tFWSA9ICdteUtleSc7XG5cbmV4cG9ydCB7IFN1YnNjcmliZVZlaGljbGVEYXRhIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogRW51bWVyYXRpb24gdGhhdCBkZXNjcmliZXMgcG9zc2libGUgcmVzdWx0IGNvZGVzIG9mIGEgdmVoaWNsZSBkYXRhIGVudHJ5IHJlcXVlc3QuXG4gKiBAdHlwZWRlZiB7RW51bX0gVmVoaWNsZURhdGFSZXN1bHRDb2RlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBWZWhpY2xlRGF0YVJlc3VsdENvZGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaXZpZHVhbCB2ZWhpY2xlIGRhdGEgaXRlbSAvIERUQyAvIERJRCByZXF1ZXN0IG9yIHN1YnNjcmlwdGlvbiBzdWNjZXNzZnVsXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkRSQ19TVUNDRVNTICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhUmVzdWx0Q29kZS5fTUFQLlZEUkNfU1VDQ0VTUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEVEMgLyBESUQgcmVxdWVzdCBzdWNjZXNzZnVsLCBob3dldmVyLCBub3QgYWxsIGFjdGl2ZSBEVENzIG9yIGZ1bGwgY29udGVudHMgb2YgRElEIGxvY2F0aW9uIGF2YWlsYWJsZVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZEUkNfVFJVTkNBVEVEX0RBVEEgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFSZXN1bHRDb2RlLl9NQVAuVkRSQ19UUlVOQ0FURURfREFUQTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIHZlaGljbGUgZGF0YSBpdGVtIGlzIG5vdCBhbGxvd2VkIGZvciB0aGlzIGFwcCBieSB0aGUgT0VNL01hbnVmYWN0b3JlciBvZiB0aGUgY29ubmVjdGVkIG1vZHVsZS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRFJDX0RJU0FMTE9XRUQgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFSZXN1bHRDb2RlLl9NQVAuVkRSQ19ESVNBTExPV0VEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGhhcyBub3QgZ3JhbnRlZCBhY2Nlc3MgdG8gdGhpcyB0eXBlIG9mIHZlaGljbGUgZGF0YSBpdGVtIGF0IHRoaXMgdGltZS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRFJDX1VTRVJfRElTQUxMT1dFRCAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVJlc3VsdENvZGUuX01BUC5WRFJDX1VTRVJfRElTQUxMT1dFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgRUNVIElEIHJlZmVyZW5jZWQgaXMgbm90IGEgdmFsaWQgSUQgb24gdGhlIGJ1cyAvIHN5c3RlbS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRFJDX0lOVkFMSURfSUQgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFSZXN1bHRDb2RlLl9NQVAuVkRSQ19JTlZBTElEX0lEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0ZWQgdmVoaWNsZSBkYXRhIGl0ZW0gLyBEVEMgLyBESUQgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUgb3IgcmVzcG9uZGluZyBvbiB0aGUgYnVzIC8gc3lzdGVtLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZEUkNfREFUQV9OT1RfQVZBSUxBQkxFICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhUmVzdWx0Q29kZS5fTUFQLlZEUkNfREFUQV9OT1RfQVZBSUxBQkxFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB2ZWhpY2xlIGRhdGEgaXRlbSBpcyBhbHJlYWR5IHN1YnNjcmliZWQuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkRSQ19EQVRBX0FMUkVBRFlfU1VCU0NSSUJFRCAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVJlc3VsdENvZGUuX01BUC5WRFJDX0RBVEFfQUxSRUFEWV9TVUJTQ1JJQkVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB2ZWhpY2xlIGRhdGEgaXRlbSBjYW5ub3QgYmUgdW5zdWJzY3JpYmVkIGJlY2F1c2UgaXQgaXMgbm90IGN1cnJlbnRseSBzdWJzY3JpYmVkLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZEUkNfREFUQV9OT1RfU1VCU0NSSUJFRCAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVJlc3VsdENvZGUuX01BUC5WRFJDX0RBVEFfTk9UX1NVQlNDUklCRUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHJlcXVlc3QgZm9yIHRoaXMgaXRlbSBpcyBpZ25vcmVkIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcy5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRFJDX0lHTk9SRUQgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFSZXN1bHRDb2RlLl9NQVAuVkRSQ19JR05PUkVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhUmVzdWx0Q29kZS5fdmFsdWVGb3JLZXkoa2V5LCBWZWhpY2xlRGF0YVJlc3VsdENvZGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVJlc3VsdENvZGUuX2tleUZvclZhbHVlKHZhbHVlLCBWZWhpY2xlRGF0YVJlc3VsdENvZGUuX01BUCk7XG4gICAgfVxufVxuXG5WZWhpY2xlRGF0YVJlc3VsdENvZGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdWRFJDX1NVQ0NFU1MnOiAnU1VDQ0VTUycsXG4gICAgJ1ZEUkNfVFJVTkNBVEVEX0RBVEEnOiAnVFJVTkNBVEVEX0RBVEEnLFxuICAgICdWRFJDX0RJU0FMTE9XRUQnOiAnRElTQUxMT1dFRCcsXG4gICAgJ1ZEUkNfVVNFUl9ESVNBTExPV0VEJzogJ1VTRVJfRElTQUxMT1dFRCcsXG4gICAgJ1ZEUkNfSU5WQUxJRF9JRCc6ICdJTlZBTElEX0lEJyxcbiAgICAnVkRSQ19EQVRBX05PVF9BVkFJTEFCTEUnOiAnVkVISUNMRV9EQVRBX05PVF9BVkFJTEFCTEUnLFxuICAgICdWRFJDX0RBVEFfQUxSRUFEWV9TVUJTQ1JJQkVEJzogJ0RBVEFfQUxSRUFEWV9TVUJTQ1JJQkVEJyxcbiAgICAnVkRSQ19EQVRBX05PVF9TVUJTQ1JJQkVEJzogJ0RBVEFfTk9UX1NVQlNDUklCRUQnLFxuICAgICdWRFJDX0lHTk9SRUQnOiAnSUdOT1JFRCcsXG59KTtcblxuZXhwb3J0IHsgVmVoaWNsZURhdGFSZXN1bHRDb2RlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZGF0YSB0eXBlcyB0aGF0IGNhbiBiZSBwdWJsaXNoZWQgYW5kIHN1YnNjcmliZWQgdG8uXG4gKiBAdHlwZWRlZiB7RW51bX0gVmVoaWNsZURhdGFUeXBlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBWZWhpY2xlRGF0YVR5cGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90aWZpZXMgR1BTRGF0YSBtYXkgYmUgc3Vic2NyaWJlZFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZFSElDTEVEQVRBX0dQUyAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVR5cGUuX01BUC5WRUhJQ0xFREFUQV9HUFM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkVISUNMRURBVEFfU1BFRUQgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFUeXBlLl9NQVAuVkVISUNMRURBVEFfU1BFRUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkVISUNMRURBVEFfUlBNICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhVHlwZS5fTUFQLlZFSElDTEVEQVRBX1JQTTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFREFUQV9GVUVMTEVWRUwgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFUeXBlLl9NQVAuVkVISUNMRURBVEFfRlVFTExFVkVMO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZFSElDTEVEQVRBX0ZVRUxMRVZFTF9TVEFURSAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVR5cGUuX01BUC5WRUhJQ0xFREFUQV9GVUVMTEVWRUxfU1RBVEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkVISUNMRURBVEFfRlVFTENPTlNVTVBUSU9OICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhVHlwZS5fTUFQLlZFSElDTEVEQVRBX0ZVRUxDT05TVU1QVElPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFREFUQV9FWFRFUk5URU1QICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhVHlwZS5fTUFQLlZFSElDTEVEQVRBX0VYVEVSTlRFTVA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkVISUNMRURBVEFfVklOICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhVHlwZS5fTUFQLlZFSElDTEVEQVRBX1ZJTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFREFUQV9QUk5ETCAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVR5cGUuX01BUC5WRUhJQ0xFREFUQV9QUk5ETDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFREFUQV9USVJFUFJFU1NVUkUgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFUeXBlLl9NQVAuVkVISUNMRURBVEFfVElSRVBSRVNTVVJFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZFSElDTEVEQVRBX09ET01FVEVSICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhVHlwZS5fTUFQLlZFSElDTEVEQVRBX09ET01FVEVSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZFSElDTEVEQVRBX0JFTFRTVEFUVVMgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFUeXBlLl9NQVAuVkVISUNMRURBVEFfQkVMVFNUQVRVUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFREFUQV9CT0RZSU5GTyAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVR5cGUuX01BUC5WRUhJQ0xFREFUQV9CT0RZSU5GTztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFREFUQV9ERVZJQ0VTVEFUVVMgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFUeXBlLl9NQVAuVkVISUNMRURBVEFfREVWSUNFU1RBVFVTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZFSElDTEVEQVRBX0VDQUxMSU5GTyAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVR5cGUuX01BUC5WRUhJQ0xFREFUQV9FQ0FMTElORk87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkVISUNMRURBVEFfQUlSQkFHU1RBVFVTICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhVHlwZS5fTUFQLlZFSElDTEVEQVRBX0FJUkJBR1NUQVRVUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFREFUQV9FTUVSR0VOQ1lFVkVOVCAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVR5cGUuX01BUC5WRUhJQ0xFREFUQV9FTUVSR0VOQ1lFVkVOVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFREFUQV9DTFVTVEVSTU9ERVNUQVRVUyAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVR5cGUuX01BUC5WRUhJQ0xFREFUQV9DTFVTVEVSTU9ERVNUQVRVUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFREFUQV9NWUtFWSAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVR5cGUuX01BUC5WRUhJQ0xFREFUQV9NWUtFWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFREFUQV9CUkFLSU5HICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhVHlwZS5fTUFQLlZFSElDTEVEQVRBX0JSQUtJTkc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkVISUNMRURBVEFfV0lQRVJTVEFUVVMgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFUeXBlLl9NQVAuVkVISUNMRURBVEFfV0lQRVJTVEFUVVM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkVISUNMRURBVEFfSEVBRExBTVBTVEFUVVMgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFUeXBlLl9NQVAuVkVISUNMRURBVEFfSEVBRExBTVBTVEFUVVM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkVISUNMRURBVEFfQkFUVFZPTFRBR0UgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFUeXBlLl9NQVAuVkVISUNMRURBVEFfQkFUVFZPTFRBR0U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkVISUNMRURBVEFfRU5HSU5FVE9SUVVFICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhVHlwZS5fTUFQLlZFSElDTEVEQVRBX0VOR0lORVRPUlFVRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFREFUQV9BQ0NQRURBTCAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVR5cGUuX01BUC5WRUhJQ0xFREFUQV9BQ0NQRURBTDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFREFUQV9TVEVFUklOR1dIRUVMICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhVHlwZS5fTUFQLlZFSElDTEVEQVRBX1NURUVSSU5HV0hFRUw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkVISUNMRURBVEFfVFVSTlNJR05BTCAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVR5cGUuX01BUC5WRUhJQ0xFREFUQV9UVVJOU0lHTkFMO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZFSElDTEVEQVRBX0ZVRUxSQU5HRSAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVR5cGUuX01BUC5WRUhJQ0xFREFUQV9GVUVMUkFOR0U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkVISUNMRURBVEFfRU5HSU5FT0lMTElGRSAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVR5cGUuX01BUC5WRUhJQ0xFREFUQV9FTkdJTkVPSUxMSUZFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZFSElDTEVEQVRBX0VMRUNUUk9OSUNQQVJLQlJBS0VTVEFUVVMgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFUeXBlLl9NQVAuVkVISUNMRURBVEFfRUxFQ1RST05JQ1BBUktCUkFLRVNUQVRVUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFREFUQV9DTE9VREFQUFZFSElDTEVJRCAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVR5cGUuX01BUC5WRUhJQ0xFREFUQV9DTE9VREFQUFZFSElDTEVJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRUhJQ0xFREFUQV9PRU1fQ1VTVE9NX0RBVEEgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFUeXBlLl9NQVAuVkVISUNMRURBVEFfT0VNX0NVU1RPTV9EQVRBO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhVHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBWZWhpY2xlRGF0YVR5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVR5cGUuX2tleUZvclZhbHVlKHZhbHVlLCBWZWhpY2xlRGF0YVR5cGUuX01BUCk7XG4gICAgfVxufVxuXG5WZWhpY2xlRGF0YVR5cGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdWRUhJQ0xFREFUQV9HUFMnOiAnVkVISUNMRURBVEFfR1BTJyxcbiAgICAnVkVISUNMRURBVEFfU1BFRUQnOiAnVkVISUNMRURBVEFfU1BFRUQnLFxuICAgICdWRUhJQ0xFREFUQV9SUE0nOiAnVkVISUNMRURBVEFfUlBNJyxcbiAgICAnVkVISUNMRURBVEFfRlVFTExFVkVMJzogJ1ZFSElDTEVEQVRBX0ZVRUxMRVZFTCcsXG4gICAgJ1ZFSElDTEVEQVRBX0ZVRUxMRVZFTF9TVEFURSc6ICdWRUhJQ0xFREFUQV9GVUVMTEVWRUxfU1RBVEUnLFxuICAgICdWRUhJQ0xFREFUQV9GVUVMQ09OU1VNUFRJT04nOiAnVkVISUNMRURBVEFfRlVFTENPTlNVTVBUSU9OJyxcbiAgICAnVkVISUNMRURBVEFfRVhURVJOVEVNUCc6ICdWRUhJQ0xFREFUQV9FWFRFUk5URU1QJyxcbiAgICAnVkVISUNMRURBVEFfVklOJzogJ1ZFSElDTEVEQVRBX1ZJTicsXG4gICAgJ1ZFSElDTEVEQVRBX1BSTkRMJzogJ1ZFSElDTEVEQVRBX1BSTkRMJyxcbiAgICAnVkVISUNMRURBVEFfVElSRVBSRVNTVVJFJzogJ1ZFSElDTEVEQVRBX1RJUkVQUkVTU1VSRScsXG4gICAgJ1ZFSElDTEVEQVRBX09ET01FVEVSJzogJ1ZFSElDTEVEQVRBX09ET01FVEVSJyxcbiAgICAnVkVISUNMRURBVEFfQkVMVFNUQVRVUyc6ICdWRUhJQ0xFREFUQV9CRUxUU1RBVFVTJyxcbiAgICAnVkVISUNMRURBVEFfQk9EWUlORk8nOiAnVkVISUNMRURBVEFfQk9EWUlORk8nLFxuICAgICdWRUhJQ0xFREFUQV9ERVZJQ0VTVEFUVVMnOiAnVkVISUNMRURBVEFfREVWSUNFU1RBVFVTJyxcbiAgICAnVkVISUNMRURBVEFfRUNBTExJTkZPJzogJ1ZFSElDTEVEQVRBX0VDQUxMSU5GTycsXG4gICAgJ1ZFSElDTEVEQVRBX0FJUkJBR1NUQVRVUyc6ICdWRUhJQ0xFREFUQV9BSVJCQUdTVEFUVVMnLFxuICAgICdWRUhJQ0xFREFUQV9FTUVSR0VOQ1lFVkVOVCc6ICdWRUhJQ0xFREFUQV9FTUVSR0VOQ1lFVkVOVCcsXG4gICAgJ1ZFSElDTEVEQVRBX0NMVVNURVJNT0RFU1RBVFVTJzogJ1ZFSElDTEVEQVRBX0NMVVNURVJNT0RFU1RBVFVTJyxcbiAgICAnVkVISUNMRURBVEFfTVlLRVknOiAnVkVISUNMRURBVEFfTVlLRVknLFxuICAgICdWRUhJQ0xFREFUQV9CUkFLSU5HJzogJ1ZFSElDTEVEQVRBX0JSQUtJTkcnLFxuICAgICdWRUhJQ0xFREFUQV9XSVBFUlNUQVRVUyc6ICdWRUhJQ0xFREFUQV9XSVBFUlNUQVRVUycsXG4gICAgJ1ZFSElDTEVEQVRBX0hFQURMQU1QU1RBVFVTJzogJ1ZFSElDTEVEQVRBX0hFQURMQU1QU1RBVFVTJyxcbiAgICAnVkVISUNMRURBVEFfQkFUVFZPTFRBR0UnOiAnVkVISUNMRURBVEFfQkFUVFZPTFRBR0UnLFxuICAgICdWRUhJQ0xFREFUQV9FTkdJTkVUT1JRVUUnOiAnVkVISUNMRURBVEFfRU5HSU5FVE9SUVVFJyxcbiAgICAnVkVISUNMRURBVEFfQUNDUEVEQUwnOiAnVkVISUNMRURBVEFfQUNDUEVEQUwnLFxuICAgICdWRUhJQ0xFREFUQV9TVEVFUklOR1dIRUVMJzogJ1ZFSElDTEVEQVRBX1NURUVSSU5HV0hFRUwnLFxuICAgICdWRUhJQ0xFREFUQV9UVVJOU0lHTkFMJzogJ1ZFSElDTEVEQVRBX1RVUk5TSUdOQUwnLFxuICAgICdWRUhJQ0xFREFUQV9GVUVMUkFOR0UnOiAnVkVISUNMRURBVEFfRlVFTFJBTkdFJyxcbiAgICAnVkVISUNMRURBVEFfRU5HSU5FT0lMTElGRSc6ICdWRUhJQ0xFREFUQV9FTkdJTkVPSUxMSUZFJyxcbiAgICAnVkVISUNMRURBVEFfRUxFQ1RST05JQ1BBUktCUkFLRVNUQVRVUyc6ICdWRUhJQ0xFREFUQV9FTEVDVFJPTklDUEFSS0JSQUtFU1RBVFVTJyxcbiAgICAnVkVISUNMRURBVEFfQ0xPVURBUFBWRUhJQ0xFSUQnOiAnVkVISUNMRURBVEFfQ0xPVURBUFBWRUhJQ0xFSUQnLFxuICAgICdWRUhJQ0xFREFUQV9PRU1fQ1VTVE9NX0RBVEEnOiAnVkVISUNMRURBVEFfT0VNX0NVU1RPTV9EQVRBJyxcbn0pO1xuXG5leHBvcnQgeyBWZWhpY2xlRGF0YVR5cGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgVmVoaWNsZURhdGFSZXN1bHRDb2RlIH0gZnJvbSAnLi4vZW51bXMvVmVoaWNsZURhdGFSZXN1bHRDb2RlLmpzJztcbmltcG9ydCB7IFZlaGljbGVEYXRhVHlwZSB9IGZyb20gJy4uL2VudW1zL1ZlaGljbGVEYXRhVHlwZS5qcyc7XG5cbi8qKlxuICogSW5kaXZpZHVhbCBwdWJsaXNoZWQgZGF0YSByZXF1ZXN0IHJlc3VsdFxuICovXG5jbGFzcyBWZWhpY2xlRGF0YVJlc3VsdCBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVR5cGV9IHR5cGUgLSBEZWZpbmVkIHB1Ymxpc2hlZCBkYXRhIGVsZW1lbnQgdHlwZS5cbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBzZXREYXRhVHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVR5cGUsIHR5cGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihWZWhpY2xlRGF0YVJlc3VsdC5LRVlfREFUQV9UWVBFLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFUeXBlfVxuICAgICAqL1xuICAgIGdldERhdGFUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhVHlwZSwgVmVoaWNsZURhdGFSZXN1bHQuS0VZX0RBVEFfVFlQRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVJlc3VsdENvZGV9IGNvZGUgLSBQdWJsaXNoZWQgZGF0YSByZXN1bHQgY29kZS5cbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBzZXRSZXN1bHRDb2RlIChjb2RlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0Q29kZSwgY29kZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFZlaGljbGVEYXRhUmVzdWx0LktFWV9SRVNVTFRfQ09ERSwgY29kZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0Q29kZX1cbiAgICAgKi9cbiAgICBnZXRSZXN1bHRDb2RlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0Q29kZSwgVmVoaWNsZURhdGFSZXN1bHQuS0VZX1JFU1VMVF9DT0RFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIFR5cGUgb2YgcmVxdWVzdGVkIG9lbSBzcGVjaWZpYyBwYXJhbWV0ZXJcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBzZXRPZW1DdXN0b21EYXRhVHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihWZWhpY2xlRGF0YVJlc3VsdC5LRVlfT0VNX0NVU1RPTV9EQVRBX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0T2VtQ3VzdG9tRGF0YVR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVmVoaWNsZURhdGFSZXN1bHQuS0VZX09FTV9DVVNUT01fREFUQV9UWVBFKTtcbiAgICB9XG59XG5cblZlaGljbGVEYXRhUmVzdWx0LktFWV9EQVRBX1RZUEUgPSAnZGF0YVR5cGUnO1xuVmVoaWNsZURhdGFSZXN1bHQuS0VZX1JFU1VMVF9DT0RFID0gJ3Jlc3VsdENvZGUnO1xuVmVoaWNsZURhdGFSZXN1bHQuS0VZX09FTV9DVVNUT01fREFUQV9UWVBFID0gJ29lbUN1c3RvbURhdGFUeXBlJztcblxuZXhwb3J0IHsgVmVoaWNsZURhdGFSZXN1bHQgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IFZlaGljbGVEYXRhUmVzdWx0IH0gZnJvbSAnLi4vc3RydWN0cy9WZWhpY2xlRGF0YVJlc3VsdC5qcyc7XG5cbmNsYXNzIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5TdWJzY3JpYmVWZWhpY2xlRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVJlc3VsdH0gZ3BzIC0gU2VlIEdQU0RhdGFcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEdwcyAoZ3BzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0LCBncHMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9HUFMsIGdwcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldEdwcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfR1BTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBzcGVlZCAtIFRoZSB2ZWhpY2xlIHNwZWVkIGluIGtpbG9tZXRlcnMgcGVyIGhvdXJcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFNwZWVkIChzcGVlZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgc3BlZWQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9TUEVFRCwgc3BlZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRTcGVlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfU1BFRUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IHJwbSAtIFRoZSBudW1iZXIgb2YgcmV2b2x1dGlvbnMgcGVyIG1pbnV0ZSBvZiB0aGUgZW5naW5lXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRScG0gKHJwbSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgcnBtKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfUlBNLCBycG0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRScG0gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1JQTSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVJlc3VsdH0gbGV2ZWwgLSBUaGUgZnVlbCBsZXZlbCBpbiB0aGUgdGFuayAocGVyY2VudGFnZSlcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEZ1ZWxMZXZlbCAobGV2ZWwpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIGxldmVsKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRlVFTF9MRVZFTCwgbGV2ZWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRGdWVsTGV2ZWwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0ZVRUxfTEVWRUwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IGxldmVsX3N0YXRlIC0gVGhlIGZ1ZWwgbGV2ZWwgc3RhdGVcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEZ1ZWxMZXZlbF9TdGF0ZSAobGV2ZWxfc3RhdGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIGxldmVsX3N0YXRlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRlVFTF9MRVZFTF9TVEFURSwgbGV2ZWxfc3RhdGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRGdWVsTGV2ZWxfU3RhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0ZVRUxfTEVWRUxfU1RBVEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IGNvbnN1bXB0aW9uIC0gVGhlIGluc3RhbnRhbmVvdXMgZnVlbCBjb25zdW1wdGlvbiBpbiBtaWNyb2xpdHJlc1xuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0SW5zdGFudEZ1ZWxDb25zdW1wdGlvbiAoY29uc3VtcHRpb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIGNvbnN1bXB0aW9uKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfSU5TVEFOVF9GVUVMX0NPTlNVTVBUSU9OLCBjb25zdW1wdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldEluc3RhbnRGdWVsQ29uc3VtcHRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0lOU1RBTlRfRlVFTF9DT05TVU1QVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVJlc3VsdH0gcmFuZ2UgLSBUaGUgZXN0aW1hdGUgcmFuZ2UgaW4gS00gdGhlIHZlaGljbGUgY2FuIHRyYXZlbCBiYXNlZCBvbiBmdWVsIGxldmVsIGFuZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtcHRpb25cbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEZ1ZWxSYW5nZSAocmFuZ2UpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIHJhbmdlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRlVFTF9SQU5HRSwgcmFuZ2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRGdWVsUmFuZ2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0ZVRUxfUkFOR0UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IHRlbXBlcmF0dXJlIC0gVGhlIGV4dGVybmFsIHRlbXBlcmF0dXJlIGluIGRlZ3JlZXMgY2Vsc2l1cy5cbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEV4dGVybmFsVGVtcGVyYXR1cmUgKHRlbXBlcmF0dXJlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0LCB0ZW1wZXJhdHVyZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VYVEVSTkFMX1RFTVBFUkFUVVJFLCB0ZW1wZXJhdHVyZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldEV4dGVybmFsVGVtcGVyYXR1cmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VYVEVSTkFMX1RFTVBFUkFUVVJFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBzaWduYWwgLSBTZWUgVHVyblNpZ25hbFxuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0VHVyblNpZ25hbCAoc2lnbmFsKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0LCBzaWduYWwpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9UVVJOX1NJR05BTCwgc2lnbmFsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0VHVyblNpZ25hbCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfVFVSTl9TSUdOQUwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IHBybmRsIC0gU2VlIFBSTkRMXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRQcm5kbCAocHJuZGwpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIHBybmRsKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfUFJOREwsIHBybmRsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0UHJuZGwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1BSTkRMKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBwcmVzc3VyZSAtIFNlZSBUaXJlU3RhdHVzXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRUaXJlUHJlc3N1cmUgKHByZXNzdXJlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0LCBwcmVzc3VyZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1RJUkVfUFJFU1NVUkUsIHByZXNzdXJlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0VGlyZVByZXNzdXJlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9USVJFX1BSRVNTVVJFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBvZG9tZXRlciAtIE9kb21ldGVyIGluIGttXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRPZG9tZXRlciAob2RvbWV0ZXIpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIG9kb21ldGVyKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfT0RPTUVURVIsIG9kb21ldGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0T2RvbWV0ZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX09ET01FVEVSKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBzdGF0dXMgLSBUaGUgc3RhdHVzIG9mIHRoZSBzZWF0IGJlbHRzXG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRCZWx0U3RhdHVzIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0JFTFRfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRCZWx0U3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9CRUxUX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVJlc3VsdH0gaW5mb3JtYXRpb24gLSBUaGUgYm9keSBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgcG93ZXIgbW9kZXNcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEJvZHlJbmZvcm1hdGlvbiAoaW5mb3JtYXRpb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIGluZm9ybWF0aW9uKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQk9EWV9JTkZPUk1BVElPTiwgaW5mb3JtYXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRCb2R5SW5mb3JtYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0JPRFlfSU5GT1JNQVRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IHN0YXR1cyAtIFRoZSBkZXZpY2Ugc3RhdHVzIGluY2x1ZGluZyBzaWduYWwgYW5kIGJhdHRlcnkgc3RyZW5ndGhcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldERldmljZVN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0LCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9ERVZJQ0VfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXREZXZpY2VTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0RFVklDRV9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IGJyYWtpbmcgLSBUaGUgc3RhdHVzIG9mIHRoZSBicmFrZSBwZWRhbFxuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0RHJpdmVyQnJha2luZyAoYnJha2luZykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgYnJha2luZyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0RSSVZFUl9CUkFLSU5HLCBicmFraW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0RHJpdmVyQnJha2luZyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRFJJVkVSX0JSQUtJTkcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IHN0YXR1cyAtIFRoZSBzdGF0dXMgb2YgdGhlIHdpcGVyc1xuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0V2lwZXJTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgc3RhdHVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfV0lQRVJfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRXaXBlclN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfV0lQRVJfU1RBVFVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBzdGF0dXMgLSBTdGF0dXMgb2YgdGhlIGhlYWQgbGFtcHNcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEhlYWRMYW1wU3RhdHVzIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0hFQURfTEFNUF9TVEFUVVMsIHN0YXR1cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldEhlYWRMYW1wU3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9IRUFEX0xBTVBfU1RBVFVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSB0b3JxdWUgLSBUb3JxdWUgdmFsdWUgZm9yIGVuZ2luZSAoaW4gTm0pIG9uIG5vbi1kaWVzZWwgdmFyaWFudHNcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEVuZ2luZVRvcnF1ZSAodG9ycXVlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0LCB0b3JxdWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9FTkdJTkVfVE9SUVVFLCB0b3JxdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRFbmdpbmVUb3JxdWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VOR0lORV9UT1JRVUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IHBvc2l0aW9uIC0gQWNjZWxlcmF0b3IgcGVkYWwgcG9zaXRpb24gKHBlcmNlbnRhZ2UgZGVwcmVzc2VkKVxuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0QWNjUGVkYWxQb3NpdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIHBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQUNDX1BFREFMX1BPU0lUSU9OLCBwb3NpdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldEFjY1BlZGFsUG9zaXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0FDQ19QRURBTF9QT1NJVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVJlc3VsdH0gYW5nbGUgLSBDdXJyZW50IGFuZ2xlIG9mIHRoZSBzdGVlcmluZyB3aGVlbCAoaW4gZGVnKVxuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0U3RlZXJpbmdXaGVlbEFuZ2xlIChhbmdsZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgYW5nbGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9TVEVFUklOR19XSEVFTF9BTkdMRSwgYW5nbGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRTdGVlcmluZ1doZWVsQW5nbGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1NURUVSSU5HX1dIRUVMX0FOR0xFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBsaWZlIC0gVGhlIGVzdGltYXRlZCBwZXJjZW50YWdlIG9mIHJlbWFpbmluZyBvaWwgbGlmZSBvZiB0aGUgZW5naW5lLlxuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0RW5naW5lT2lsTGlmZSAobGlmZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgbGlmZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VOR0lORV9PSUxfTElGRSwgbGlmZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldEVuZ2luZU9pbExpZmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VOR0lORV9PSUxfTElGRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVJlc3VsdH0gc3RhdHVzIC0gVGhlIHN0YXR1cyBvZiB0aGUgcGFyayBicmFrZSBhcyBwcm92aWRlZCBieSBFbGVjdHJpYyBQYXJrIEJyYWtlIChFUEIpIHN5c3RlbS5cbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEVsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgc3RhdHVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRUxFQ1RST05JQ19QQVJLX0JSQUtFX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0RWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRUxFQ1RST05JQ19QQVJLX0JSQUtFX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVJlc3VsdH0gaWQgLSBQYXJhbWV0ZXIgdXNlZCBieSBjbG91ZCBhcHBzIHRvIGlkZW50aWZ5IGEgaGVhZCB1bml0XG4gICAgICogQHJldHVybiB7U3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRDbG91ZEFwcFZlaGljbGVJRCAoaWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIGlkKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQ0xPVURfQVBQX1ZFSElDTEVfSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0Q2xvdWRBcHBWZWhpY2xlSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0NMT1VEX0FQUF9WRUhJQ0xFX0lEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBpbmZvIC0gRW1lcmdlbmN5IENhbGwgbm90aWZpY2F0aW9uIGFuZCBjb25maXJtYXRpb24gZGF0YVxuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0RUNhbGxJbmZvIChpbmZvKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0LCBpbmZvKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRV9DQUxMX0lORk8sIGluZm8pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRFQ2FsbEluZm8gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VfQ0FMTF9JTkZPKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBzdGF0dXMgLSBUaGUgc3RhdHVzIG9mIHRoZSBhaXIgYmFnc1xuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0QWlyYmFnU3RhdHVzIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0FJUkJBR19TVEFUVVMsIHN0YXR1cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldEFpcmJhZ1N0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQUlSQkFHX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVJlc3VsdH0gZXZlbnQgLSBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFuIGVtZXJnZW5jeSBldmVudCAoYW5kIGlmIGl0IG9jY3VycmVkKVxuICAgICAqIEByZXR1cm4ge1N1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0RW1lcmdlbmN5RXZlbnQgKGV2ZW50KSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0LCBldmVudCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VNRVJHRU5DWV9FVkVOVCwgZXZlbnQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRFbWVyZ2VuY3lFdmVudCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRU1FUkdFTkNZX0VWRU5UKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBtb2RlcyAtIFRoZSBzdGF0dXMgbW9kZXMgb2YgdGhlIGNsdXN0ZXJcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldENsdXN0ZXJNb2RlcyAobW9kZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIG1vZGVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQ0xVU1RFUl9NT0RFUywgbW9kZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRDbHVzdGVyTW9kZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0NMVVNURVJfTU9ERVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IGtleSAtIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIE15S2V5IGZlYXR1cmVcbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldE15S2V5IChrZXkpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIGtleSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX01ZX0tFWSwga2V5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0TXlLZXkgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX01ZX0tFWSk7XG4gICAgfVxufVxuXG5TdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9HUFMgPSAnZ3BzJztcblN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1NQRUVEID0gJ3NwZWVkJztcblN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1JQTSA9ICdycG0nO1xuU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRlVFTF9MRVZFTCA9ICdmdWVsTGV2ZWwnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRlVFTF9MRVZFTF9TVEFURSA9ICdmdWVsTGV2ZWxfU3RhdGUnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfSU5TVEFOVF9GVUVMX0NPTlNVTVBUSU9OID0gJ2luc3RhbnRGdWVsQ29uc3VtcHRpb24nO1xuU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRlVFTF9SQU5HRSA9ICdmdWVsUmFuZ2UnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRVhURVJOQUxfVEVNUEVSQVRVUkUgPSAnZXh0ZXJuYWxUZW1wZXJhdHVyZSc7XG5TdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9UVVJOX1NJR05BTCA9ICd0dXJuU2lnbmFsJztcblN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1BSTkRMID0gJ3BybmRsJztcblN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1RJUkVfUFJFU1NVUkUgPSAndGlyZVByZXNzdXJlJztcblN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX09ET01FVEVSID0gJ29kb21ldGVyJztcblN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0JFTFRfU1RBVFVTID0gJ2JlbHRTdGF0dXMnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQk9EWV9JTkZPUk1BVElPTiA9ICdib2R5SW5mb3JtYXRpb24nO1xuU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfREVWSUNFX1NUQVRVUyA9ICdkZXZpY2VTdGF0dXMnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRFJJVkVSX0JSQUtJTkcgPSAnZHJpdmVyQnJha2luZyc7XG5TdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9XSVBFUl9TVEFUVVMgPSAnd2lwZXJTdGF0dXMnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfSEVBRF9MQU1QX1NUQVRVUyA9ICdoZWFkTGFtcFN0YXR1cyc7XG5TdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9FTkdJTkVfVE9SUVVFID0gJ2VuZ2luZVRvcnF1ZSc7XG5TdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9BQ0NfUEVEQUxfUE9TSVRJT04gPSAnYWNjUGVkYWxQb3NpdGlvbic7XG5TdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9TVEVFUklOR19XSEVFTF9BTkdMRSA9ICdzdGVlcmluZ1doZWVsQW5nbGUnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRU5HSU5FX09JTF9MSUZFID0gJ2VuZ2luZU9pbExpZmUnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRUxFQ1RST05JQ19QQVJLX0JSQUtFX1NUQVRVUyA9ICdlbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzJztcblN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0NMT1VEX0FQUF9WRUhJQ0xFX0lEID0gJ2Nsb3VkQXBwVmVoaWNsZUlEJztcblN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VfQ0FMTF9JTkZPID0gJ2VDYWxsSW5mbyc7XG5TdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9BSVJCQUdfU1RBVFVTID0gJ2FpcmJhZ1N0YXR1cyc7XG5TdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9FTUVSR0VOQ1lfRVZFTlQgPSAnZW1lcmdlbmN5RXZlbnQnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQ0xVU1RFUl9NT0RFUyA9ICdjbHVzdGVyTW9kZXMnO1xuU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfTVlfS0VZID0gJ215S2V5JztcblxuZXhwb3J0IHsgU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgc3Vic2NyaWJlVmVoaWNsZURhdGEgZnVuY3Rpb24uXG4gKi9cbmNsYXNzIFVuc3Vic2NyaWJlVmVoaWNsZURhdGEgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlVuc3Vic2NyaWJlVmVoaWNsZURhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZ3BzIC0gU2VlIEdQU0RhdGFcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEdwcyAoZ3BzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0dQUywgZ3BzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRHcHMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfR1BTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHNwZWVkIC0gVGhlIHZlaGljbGUgc3BlZWQgaW4ga2lsb21ldGVycyBwZXIgaG91clxuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0U3BlZWQgKHNwZWVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX1NQRUVELCBzcGVlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0U3BlZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfU1BFRUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcnBtIC0gVGhlIG51bWJlciBvZiByZXZvbHV0aW9ucyBwZXIgbWludXRlIG9mIHRoZSBlbmdpbmVcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldFJwbSAocnBtKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX1JQTSwgcnBtKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRScG0gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfUlBNKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGxldmVsIC0gVGhlIGZ1ZWwgbGV2ZWwgaW4gdGhlIHRhbmsgKHBlcmNlbnRhZ2UpXG4gICAgICogQHJldHVybiB7VW5zdWJzY3JpYmVWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRGdWVsTGV2ZWwgKGxldmVsKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0ZVRUxfTEVWRUwsIGxldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRGdWVsTGV2ZWwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfRlVFTF9MRVZFTCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBsZXZlbF9zdGF0ZSAtIFRoZSBmdWVsIGxldmVsIHN0YXRlXG4gICAgICogQHJldHVybiB7VW5zdWJzY3JpYmVWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRGdWVsTGV2ZWxfU3RhdGUgKGxldmVsX3N0YXRlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0ZVRUxfTEVWRUxfU1RBVEUsIGxldmVsX3N0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRGdWVsTGV2ZWxfU3RhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfRlVFTF9MRVZFTF9TVEFURSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBjb25zdW1wdGlvbiAtIFRoZSBpbnN0YW50YW5lb3VzIGZ1ZWwgY29uc3VtcHRpb24gaW4gbWljcm9saXRyZXNcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEluc3RhbnRGdWVsQ29uc3VtcHRpb24gKGNvbnN1bXB0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0lOU1RBTlRfRlVFTF9DT05TVU1QVElPTiwgY29uc3VtcHRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEluc3RhbnRGdWVsQ29uc3VtcHRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfSU5TVEFOVF9GVUVMX0NPTlNVTVBUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJhbmdlIC0gVGhlIGVzdGltYXRlIHJhbmdlIGluIEtNIHRoZSB2ZWhpY2xlIGNhbiB0cmF2ZWwgYmFzZWQgb24gZnVlbCBsZXZlbCBhbmQgY29uc3VtcHRpb25cbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEZ1ZWxSYW5nZSAocmFuZ2UpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfRlVFTF9SQU5HRSwgcmFuZ2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEZ1ZWxSYW5nZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9GVUVMX1JBTkdFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRlbXBlcmF0dXJlIC0gVGhlIGV4dGVybmFsIHRlbXBlcmF0dXJlIGluIGRlZ3JlZXMgY2Vsc2l1cy5cbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEV4dGVybmFsVGVtcGVyYXR1cmUgKHRlbXBlcmF0dXJlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0VYVEVSTkFMX1RFTVBFUkFUVVJFLCB0ZW1wZXJhdHVyZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RXh0ZXJuYWxUZW1wZXJhdHVyZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FWFRFUk5BTF9URU1QRVJBVFVSRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzaWduYWwgLSBTZWUgVHVyblNpZ25hbFxuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0VHVyblNpZ25hbCAoc2lnbmFsKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX1RVUk5fU0lHTkFMLCBzaWduYWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFR1cm5TaWduYWwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfVFVSTl9TSUdOQUwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcHJuZGwgLSBTZWUgUFJORExcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldFBybmRsIChwcm5kbCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9QUk5ETCwgcHJuZGwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFBybmRsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX1BSTkRMKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHByZXNzdXJlIC0gU2VlIFRpcmVTdGF0dXNcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldFRpcmVQcmVzc3VyZSAocHJlc3N1cmUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfVElSRV9QUkVTU1VSRSwgcHJlc3N1cmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFRpcmVQcmVzc3VyZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9USVJFX1BSRVNTVVJFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG9kb21ldGVyIC0gT2RvbWV0ZXIgaW4ga21cbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldE9kb21ldGVyIChvZG9tZXRlcikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9PRE9NRVRFUiwgb2RvbWV0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldE9kb21ldGVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX09ET01FVEVSKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHN0YXR1cyAtIFRoZSBzdGF0dXMgb2YgdGhlIHNlYXQgYmVsdHNcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEJlbHRTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9CRUxUX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRCZWx0U3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0JFTFRfU1RBVFVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGluZm9ybWF0aW9uIC0gVGhlIGJvZHkgaW5mb3JtYXRpb24gaW5jbHVkaW5nIHBvd2VyIG1vZGVzXG4gICAgICogQHJldHVybiB7VW5zdWJzY3JpYmVWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRCb2R5SW5mb3JtYXRpb24gKGluZm9ybWF0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0JPRFlfSU5GT1JNQVRJT04sIGluZm9ybWF0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRCb2R5SW5mb3JtYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfQk9EWV9JTkZPUk1BVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzdGF0dXMgLSBUaGUgZGV2aWNlIHN0YXR1cyBpbmNsdWRpbmcgc2lnbmFsIGFuZCBiYXR0ZXJ5IHN0cmVuZ3RoXG4gICAgICogQHJldHVybiB7VW5zdWJzY3JpYmVWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXREZXZpY2VTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9ERVZJQ0VfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldERldmljZVN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9ERVZJQ0VfU1RBVFVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJyYWtpbmcgLSBUaGUgc3RhdHVzIG9mIHRoZSBicmFrZSBwZWRhbFxuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0RHJpdmVyQnJha2luZyAoYnJha2luZykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9EUklWRVJfQlJBS0lORywgYnJha2luZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RHJpdmVyQnJha2luZyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9EUklWRVJfQlJBS0lORyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzdGF0dXMgLSBUaGUgc3RhdHVzIG9mIHRoZSB3aXBlcnNcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldFdpcGVyU3RhdHVzIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfV0lQRVJfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFdpcGVyU3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX1dJUEVSX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzdGF0dXMgLSBTdGF0dXMgb2YgdGhlIGhlYWQgbGFtcHNcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEhlYWRMYW1wU3RhdHVzIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfSEVBRF9MQU1QX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRIZWFkTGFtcFN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9IRUFEX0xBTVBfU1RBVFVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRvcnF1ZSAtIFRvcnF1ZSB2YWx1ZSBmb3IgZW5naW5lIChpbiBObSkgb24gbm9uLWRpZXNlbCB2YXJpYW50c1xuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0RW5naW5lVG9ycXVlICh0b3JxdWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfRU5HSU5FX1RPUlFVRSwgdG9ycXVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRFbmdpbmVUb3JxdWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfRU5HSU5FX1RPUlFVRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBwb3NpdGlvbiAtIEFjY2VsZXJhdG9yIHBlZGFsIHBvc2l0aW9uIChwZXJjZW50YWdlIGRlcHJlc3NlZClcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEFjY1BlZGFsUG9zaXRpb24gKHBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0FDQ19QRURBTF9QT1NJVElPTiwgcG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEFjY1BlZGFsUG9zaXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfQUNDX1BFREFMX1BPU0lUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFuZ2xlIC0gQ3VycmVudCBhbmdsZSBvZiB0aGUgc3RlZXJpbmcgd2hlZWwgKGluIGRlZylcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldFN0ZWVyaW5nV2hlZWxBbmdsZSAoYW5nbGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfU1RFRVJJTkdfV0hFRUxfQU5HTEUsIGFuZ2xlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRTdGVlcmluZ1doZWVsQW5nbGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfU1RFRVJJTkdfV0hFRUxfQU5HTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbGlmZSAtIFRoZSBlc3RpbWF0ZWQgcGVyY2VudGFnZSBvZiByZW1haW5pbmcgb2lsIGxpZmUgb2YgdGhlIGVuZ2luZS5cbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEVuZ2luZU9pbExpZmUgKGxpZmUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfRU5HSU5FX09JTF9MSUZFLCBsaWZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRFbmdpbmVPaWxMaWZlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0VOR0lORV9PSUxfTElGRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzdGF0dXMgLSBUaGUgc3RhdHVzIG9mIHRoZSBwYXJrIGJyYWtlIGFzIHByb3ZpZGVkIGJ5IEVsZWN0cmljIFBhcmsgQnJha2UgKEVQQikgc3lzdGVtLlxuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0RWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0VMRUNUUk9OSUNfUEFSS19CUkFLRV9TVEFUVVMsIHN0YXR1cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FTEVDVFJPTklDX1BBUktfQlJBS0VfU1RBVFVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlkIC0gUGFyYW1ldGVyIHVzZWQgYnkgY2xvdWQgYXBwcyB0byBpZGVudGlmeSBhIGhlYWQgdW5pdFxuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0Q2xvdWRBcHBWZWhpY2xlSUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0NMT1VEX0FQUF9WRUhJQ0xFX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0Q2xvdWRBcHBWZWhpY2xlSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfQ0xPVURfQVBQX1ZFSElDTEVfSUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5mbyAtIEVtZXJnZW5jeSBDYWxsIG5vdGlmaWNhdGlvbiBhbmQgY29uZmlybWF0aW9uIGRhdGFcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEVDYWxsSW5mbyAoaW5mbykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FX0NBTExfSU5GTywgaW5mbyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RUNhbGxJbmZvICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0VfQ0FMTF9JTkZPKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHN0YXR1cyAtIFRoZSBzdGF0dXMgb2YgdGhlIGFpciBiYWdzXG4gICAgICogQHJldHVybiB7VW5zdWJzY3JpYmVWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRBaXJiYWdTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9BSVJCQUdfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEFpcmJhZ1N0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9BSVJCQUdfU1RBVFVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50IC0gSW5mb3JtYXRpb24gcmVsYXRlZCB0byBhbiBlbWVyZ2VuY3kgZXZlbnQgKGFuZCBpZiBpdCBvY2N1cnJlZClcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEVtZXJnZW5jeUV2ZW50IChldmVudCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FTUVSR0VOQ1lfRVZFTlQsIGV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRFbWVyZ2VuY3lFdmVudCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FTUVSR0VOQ1lfRVZFTlQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3RhdHVzIC0gVGhlIHN0YXR1cyBtb2RlcyBvZiB0aGUgY2x1c3RlclxuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0Q2x1c3Rlck1vZGVTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9DTFVTVEVSX01PREVfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldENsdXN0ZXJNb2RlU3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0NMVVNURVJfTU9ERV9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0ga2V5IC0gSW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgTXlLZXkgZmVhdHVyZVxuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0TXlLZXkgKGtleSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9NWV9LRVksIGtleSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0TXlLZXkgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfTVlfS0VZKTtcbiAgICB9XG59XG5cblVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0dQUyA9ICdncHMnO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfU1BFRUQgPSAnc3BlZWQnO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfUlBNID0gJ3JwbSc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9GVUVMX0xFVkVMID0gJ2Z1ZWxMZXZlbCc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9GVUVMX0xFVkVMX1NUQVRFID0gJ2Z1ZWxMZXZlbF9TdGF0ZSc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9JTlNUQU5UX0ZVRUxfQ09OU1VNUFRJT04gPSAnaW5zdGFudEZ1ZWxDb25zdW1wdGlvbic7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9GVUVMX1JBTkdFID0gJ2Z1ZWxSYW5nZSc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FWFRFUk5BTF9URU1QRVJBVFVSRSA9ICdleHRlcm5hbFRlbXBlcmF0dXJlJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX1RVUk5fU0lHTkFMID0gJ3R1cm5TaWduYWwnO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfUFJOREwgPSAncHJuZGwnO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfVElSRV9QUkVTU1VSRSA9ICd0aXJlUHJlc3N1cmUnO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfT0RPTUVURVIgPSAnb2RvbWV0ZXInO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfQkVMVF9TVEFUVVMgPSAnYmVsdFN0YXR1cyc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9CT0RZX0lORk9STUFUSU9OID0gJ2JvZHlJbmZvcm1hdGlvbic7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9ERVZJQ0VfU1RBVFVTID0gJ2RldmljZVN0YXR1cyc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9EUklWRVJfQlJBS0lORyA9ICdkcml2ZXJCcmFraW5nJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX1dJUEVSX1NUQVRVUyA9ICd3aXBlclN0YXR1cyc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9IRUFEX0xBTVBfU1RBVFVTID0gJ2hlYWRMYW1wU3RhdHVzJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0VOR0lORV9UT1JRVUUgPSAnZW5naW5lVG9ycXVlJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0FDQ19QRURBTF9QT1NJVElPTiA9ICdhY2NQZWRhbFBvc2l0aW9uJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX1NURUVSSU5HX1dIRUVMX0FOR0xFID0gJ3N0ZWVyaW5nV2hlZWxBbmdsZSc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FTkdJTkVfT0lMX0xJRkUgPSAnZW5naW5lT2lsTGlmZSc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9FTEVDVFJPTklDX1BBUktfQlJBS0VfU1RBVFVTID0gJ2VsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMnO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfQ0xPVURfQVBQX1ZFSElDTEVfSUQgPSAnY2xvdWRBcHBWZWhpY2xlSUQnO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YS5LRVlfRV9DQUxMX0lORk8gPSAnZUNhbGxJbmZvJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0FJUkJBR19TVEFUVVMgPSAnYWlyYmFnU3RhdHVzJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX0VNRVJHRU5DWV9FVkVOVCA9ICdlbWVyZ2VuY3lFdmVudCc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhLktFWV9DTFVTVEVSX01PREVfU1RBVFVTID0gJ2NsdXN0ZXJNb2RlU3RhdHVzJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGEuS0VZX01ZX0tFWSA9ICdteUtleSc7XG5cbmV4cG9ydCB7IFVuc3Vic2NyaWJlVmVoaWNsZURhdGEgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IFZlaGljbGVEYXRhUmVzdWx0IH0gZnJvbSAnLi4vc3RydWN0cy9WZWhpY2xlRGF0YVJlc3VsdC5qcyc7XG5cbmNsYXNzIFVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlVuc3Vic2NyaWJlVmVoaWNsZURhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IGdwcyAtIFNlZSBHUFNEYXRhXG4gICAgICogQHJldHVybiB7VW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEdwcyAoZ3BzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0LCBncHMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0dQUywgZ3BzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0R3BzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0dQUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVJlc3VsdH0gc3BlZWQgLSBUaGUgdmVoaWNsZSBzcGVlZCBpbiBraWxvbWV0ZXJzIHBlciBob3VyXG4gICAgICogQHJldHVybiB7VW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFNwZWVkIChzcGVlZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgc3BlZWQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1NQRUVELCBzcGVlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldFNwZWVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1NQRUVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBycG0gLSBUaGUgbnVtYmVyIG9mIHJldm9sdXRpb25zIHBlciBtaW51dGUgb2YgdGhlIGVuZ2luZVxuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRScG0gKHJwbSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgcnBtKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9SUE0sIHJwbSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldFJwbSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9SUE0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IGxldmVsIC0gVGhlIGZ1ZWwgbGV2ZWwgaW4gdGhlIHRhbmsgKHBlcmNlbnRhZ2UpXG4gICAgICogQHJldHVybiB7VW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEZ1ZWxMZXZlbCAobGV2ZWwpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIGxldmVsKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9GVUVMX0xFVkVMLCBsZXZlbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldEZ1ZWxMZXZlbCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9GVUVMX0xFVkVMKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBsZXZlbF9zdGF0ZSAtIFRoZSBmdWVsIGxldmVsIHN0YXRlXG4gICAgICogQHJldHVybiB7VW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEZ1ZWxMZXZlbF9TdGF0ZSAobGV2ZWxfc3RhdGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIGxldmVsX3N0YXRlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9GVUVMX0xFVkVMX1NUQVRFLCBsZXZlbF9zdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldEZ1ZWxMZXZlbF9TdGF0ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9GVUVMX0xFVkVMX1NUQVRFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBjb25zdW1wdGlvbiAtIFRoZSBpbnN0YW50YW5lb3VzIGZ1ZWwgY29uc3VtcHRpb24gaW4gbWljcm9saXRyZXNcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0SW5zdGFudEZ1ZWxDb25zdW1wdGlvbiAoY29uc3VtcHRpb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIGNvbnN1bXB0aW9uKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9JTlNUQU5UX0ZVRUxfQ09OU1VNUFRJT04sIGNvbnN1bXB0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0SW5zdGFudEZ1ZWxDb25zdW1wdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9JTlNUQU5UX0ZVRUxfQ09OU1VNUFRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IHJhbmdlIC0gVGhlIGVzdGltYXRlIHJhbmdlIGluIEtNIHRoZSB2ZWhpY2xlIGNhbiB0cmF2ZWwgYmFzZWQgb24gZnVlbCBsZXZlbCBhbmRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bXB0aW9uXG4gICAgICogQHJldHVybiB7VW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEZ1ZWxSYW5nZSAocmFuZ2UpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIHJhbmdlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9GVUVMX1JBTkdFLCByYW5nZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldEZ1ZWxSYW5nZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9GVUVMX1JBTkdFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSB0ZW1wZXJhdHVyZSAtIFRoZSBleHRlcm5hbCB0ZW1wZXJhdHVyZSBpbiBkZWdyZWVzIGNlbHNpdXNcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0RXh0ZXJuYWxUZW1wZXJhdHVyZSAodGVtcGVyYXR1cmUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIHRlbXBlcmF0dXJlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9FWFRFUk5BTF9URU1QRVJBVFVSRSwgdGVtcGVyYXR1cmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRFeHRlcm5hbFRlbXBlcmF0dXJlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VYVEVSTkFMX1RFTVBFUkFUVVJFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBzaWduYWwgLSBTZWUgVHVyblNpZ25hbFxuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRUdXJuU2lnbmFsIChzaWduYWwpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIHNpZ25hbCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfVFVSTl9TSUdOQUwsIHNpZ25hbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldFR1cm5TaWduYWwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfVFVSTl9TSUdOQUwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IHBybmRsIC0gU2VlIFBSTkRMXG4gICAgICogQHJldHVybiB7VW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFBybmRsIChwcm5kbCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgcHJuZGwpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1BSTkRMLCBwcm5kbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldFBybmRsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1BSTkRMKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBwcmVzc3VyZSAtIFNlZSBUaXJlU3RhdHVzXG4gICAgICogQHJldHVybiB7VW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFRpcmVQcmVzc3VyZSAocHJlc3N1cmUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIHByZXNzdXJlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9USVJFX1BSRVNTVVJFLCBwcmVzc3VyZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldFRpcmVQcmVzc3VyZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9USVJFX1BSRVNTVVJFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBvZG9tZXRlciAtIE9kb21ldGVyIGluIGttXG4gICAgICogQHJldHVybiB7VW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldE9kb21ldGVyIChvZG9tZXRlcikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgb2RvbWV0ZXIpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX09ET01FVEVSLCBvZG9tZXRlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldE9kb21ldGVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX09ET01FVEVSKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBzdGF0dXMgLSBUaGUgc3RhdHVzIG9mIHRoZSBzZWF0IGJlbHRzXG4gICAgICogQHJldHVybiB7VW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEJlbHRTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgc3RhdHVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9CRUxUX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0QmVsdFN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9CRUxUX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVJlc3VsdH0gaW5mb3JtYXRpb24gLSBUaGUgYm9keSBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgcG93ZXIgbW9kZXNcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0Qm9keUluZm9ybWF0aW9uIChpbmZvcm1hdGlvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgaW5mb3JtYXRpb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0JPRFlfSU5GT1JNQVRJT04sIGluZm9ybWF0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0Qm9keUluZm9ybWF0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0JPRFlfSU5GT1JNQVRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IHN0YXR1cyAtIFRoZSBkZXZpY2Ugc3RhdHVzIGluY2x1ZGluZyBzaWduYWwgYW5kIGJhdHRlcnkgc3RyZW5ndGhcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0RGV2aWNlU3RhdHVzIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfREVWSUNFX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0RGV2aWNlU3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0RFVklDRV9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IGJyYWtpbmcgLSBUaGUgc3RhdHVzIG9mIHRoZSBicmFrZSBwZWRhbFxuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXREcml2ZXJCcmFraW5nIChicmFraW5nKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0LCBicmFraW5nKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9EUklWRVJfQlJBS0lORywgYnJha2luZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldERyaXZlckJyYWtpbmcgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRFJJVkVSX0JSQUtJTkcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IHN0YXR1cyAtIFRoZSBzdGF0dXMgb2YgdGhlIHdpcGVyc1xuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRXaXBlclN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0LCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1dJUEVSX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0V2lwZXJTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfV0lQRVJfU1RBVFVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBzdGF0dXMgLSBTdGF0dXMgb2YgdGhlIGhlYWQgbGFtcHNcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0SGVhZExhbXBTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgc3RhdHVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9IRUFEX0xBTVBfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRIZWFkTGFtcFN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdCwgVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9IRUFEX0xBTVBfU1RBVFVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSB0b3JxdWUgLSBUb3JxdWUgdmFsdWUgZm9yIGVuZ2luZSAoaW4gTm0pIG9uIG5vbi1kaWVzZWwgdmFyaWFudHNcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0RW5naW5lVG9ycXVlICh0b3JxdWUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIHRvcnF1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRU5HSU5FX1RPUlFVRSwgdG9ycXVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0RW5naW5lVG9ycXVlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VOR0lORV9UT1JRVUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IHBvc2l0aW9uIC0gQWNjZWxlcmF0b3IgcGVkYWwgcG9zaXRpb24gKHBlcmNlbnRhZ2UgZGVwcmVzc2VkKVxuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRBY2NQZWRhbFBvc2l0aW9uIChwb3NpdGlvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgcG9zaXRpb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0FDQ19QRURBTF9QT1NJVElPTiwgcG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRBY2NQZWRhbFBvc2l0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0FDQ19QRURBTF9QT1NJVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVJlc3VsdH0gYW5nbGUgLSBDdXJyZW50IGFuZ2xlIG9mIHRoZSBzdGVlcmluZyB3aGVlbCAoaW4gZGVnKVxuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRTdGVlcmluZ1doZWVsQW5nbGUgKGFuZ2xlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0LCBhbmdsZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfU1RFRVJJTkdfV0hFRUxfQU5HTEUsIGFuZ2xlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0U3RlZXJpbmdXaGVlbEFuZ2xlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1NURUVSSU5HX1dIRUVMX0FOR0xFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBsaWZlIC0gVGhlIGVzdGltYXRlZCBwZXJjZW50YWdlIG9mIHJlbWFpbmluZyBvaWwgbGlmZSBvZiB0aGUgZW5naW5lLlxuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRFbmdpbmVPaWxMaWZlIChsaWZlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0LCBsaWZlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9FTkdJTkVfT0lMX0xJRkUsIGxpZmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRFbmdpbmVPaWxMaWZlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VOR0lORV9PSUxfTElGRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVJlc3VsdH0gc3RhdHVzIC0gVGhlIHN0YXR1cyBvZiB0aGUgcGFyayBicmFrZSBhcyBwcm92aWRlZCBieSBFbGVjdHJpYyBQYXJrIEJyYWtlIChFUEIpIHN5c3RlbS5cbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0RWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0LCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VMRUNUUk9OSUNfUEFSS19CUkFLRV9TVEFUVVMsIHN0YXR1cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldEVsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRUxFQ1RST05JQ19QQVJLX0JSQUtFX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVJlc3VsdH0gaWQgLSBQYXJhbWV0ZXIgdXNlZCBieSBjbG91ZCBhcHBzIHRvIGlkZW50aWZ5IGEgaGVhZCB1bml0XG4gICAgICogQHJldHVybiB7VW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldENsb3VkQXBwVmVoaWNsZUlEIChpZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgaWQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0NMT1VEX0FQUF9WRUhJQ0xFX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldENsb3VkQXBwVmVoaWNsZUlEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0NMT1VEX0FQUF9WRUhJQ0xFX0lEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBpbmZvIC0gRW1lcmdlbmN5IENhbGwgbm90aWZpY2F0aW9uIGFuZCBjb25maXJtYXRpb24gZGF0YVxuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRFQ2FsbEluZm8gKGluZm8pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIGluZm8pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VfQ0FMTF9JTkZPLCBpbmZvKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0RUNhbGxJbmZvICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VfQ0FMTF9JTkZPKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBzdGF0dXMgLSBUaGUgc3RhdHVzIG9mIHRoZSBhaXIgYmFnc1xuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRBaXJiYWdTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgc3RhdHVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9BSVJCQUdfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdH1cbiAgICAgKi9cbiAgICBnZXRBaXJiYWdTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQUlSQkFHX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YVJlc3VsdH0gZXZlbnQgLSBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFuIGVtZXJnZW5jeSBldmVudCAoYW5kIGlmIGl0IG9jY3VycmVkKVxuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRFbWVyZ2VuY3lFdmVudCAoZXZlbnQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFSZXN1bHQsIGV2ZW50KTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9FTUVSR0VOQ1lfRVZFTlQsIGV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0RW1lcmdlbmN5RXZlbnQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFSZXN1bHQsIFVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRU1FUkdFTkNZX0VWRU5UKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0fSBtb2RlcyAtIFRoZSBzdGF0dXMgbW9kZXMgb2YgdGhlIGNsdXN0ZXJcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0Q2x1c3Rlck1vZGVzIChtb2Rlcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwgbW9kZXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0NMVVNURVJfTU9ERVMsIG1vZGVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFSZXN1bHR9XG4gICAgICovXG4gICAgZ2V0Q2x1c3Rlck1vZGVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0NMVVNURVJfTU9ERVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFSZXN1bHR9IGtleSAtIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIE15S2V5IGZlYXR1cmVcbiAgICAgKiBAcmV0dXJuIHtVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0TXlLZXkgKGtleSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVJlc3VsdCwga2V5KTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9NWV9LRVksIGtleSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhUmVzdWx0fVxuICAgICAqL1xuICAgIGdldE15S2V5ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhUmVzdWx0LCBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX01ZX0tFWSk7XG4gICAgfVxufVxuXG5VbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0dQUyA9ICdncHMnO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9TUEVFRCA9ICdzcGVlZCc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1JQTSA9ICdycG0nO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9GVUVMX0xFVkVMID0gJ2Z1ZWxMZXZlbCc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0ZVRUxfTEVWRUxfU1RBVEUgPSAnZnVlbExldmVsX1N0YXRlJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfSU5TVEFOVF9GVUVMX0NPTlNVTVBUSU9OID0gJ2luc3RhbnRGdWVsQ29uc3VtcHRpb24nO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9GVUVMX1JBTkdFID0gJ2Z1ZWxSYW5nZSc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VYVEVSTkFMX1RFTVBFUkFUVVJFID0gJ2V4dGVybmFsVGVtcGVyYXR1cmUnO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9UVVJOX1NJR05BTCA9ICd0dXJuU2lnbmFsJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfUFJOREwgPSAncHJuZGwnO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9USVJFX1BSRVNTVVJFID0gJ3RpcmVQcmVzc3VyZSc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX09ET01FVEVSID0gJ29kb21ldGVyJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQkVMVF9TVEFUVVMgPSAnYmVsdFN0YXR1cyc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0JPRFlfSU5GT1JNQVRJT04gPSAnYm9keUluZm9ybWF0aW9uJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfREVWSUNFX1NUQVRVUyA9ICdkZXZpY2VTdGF0dXMnO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9EUklWRVJfQlJBS0lORyA9ICdkcml2ZXJCcmFraW5nJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfV0lQRVJfU1RBVFVTID0gJ3dpcGVyU3RhdHVzJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfSEVBRF9MQU1QX1NUQVRVUyA9ICdoZWFkTGFtcFN0YXR1cyc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VOR0lORV9UT1JRVUUgPSAnZW5naW5lVG9ycXVlJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQUNDX1BFREFMX1BPU0lUSU9OID0gJ2FjY1BlZGFsUG9zaXRpb24nO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9TVEVFUklOR19XSEVFTF9BTkdMRSA9ICdzdGVlcmluZ1doZWVsQW5nbGUnO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9FTkdJTkVfT0lMX0xJRkUgPSAnZW5naW5lT2lsTGlmZSc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VMRUNUUk9OSUNfUEFSS19CUkFLRV9TVEFUVVMgPSAnZWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cyc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0NMT1VEX0FQUF9WRUhJQ0xFX0lEID0gJ2Nsb3VkQXBwVmVoaWNsZUlEJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRV9DQUxMX0lORk8gPSAnZUNhbGxJbmZvJztcblVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQUlSQkFHX1NUQVRVUyA9ICdhaXJiYWdTdGF0dXMnO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9FTUVSR0VOQ1lfRVZFTlQgPSAnZW1lcmdlbmN5RXZlbnQnO1xuVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9DTFVTVEVSX01PREVTID0gJ2NsdXN0ZXJNb2Rlcyc7XG5VbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX01ZX0tFWSA9ICdteUtleSc7XG5cbmV4cG9ydCB7IFVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBOb24gcGVyaW9kaWMgdmVoaWNsZSBkYXRhIHJlYWQgcmVxdWVzdC5cbiAqL1xuY2xhc3MgR2V0VmVoaWNsZURhdGEgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkdldFZlaGljbGVEYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGdwcyAtIFNlZSBHUFNEYXRhXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0R3BzIChncHMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0dQUywgZ3BzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRHcHMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0dQUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzcGVlZCAtIFRoZSB2ZWhpY2xlIHNwZWVkIGluIGtpbG9tZXRlcnMgcGVyIGhvdXJcbiAgICAgKiBAcmV0dXJuIHtHZXRWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRTcGVlZCAoc3BlZWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX1NQRUVELCBzcGVlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0U3BlZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX1NQRUVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJwbSAtIFRoZSBudW1iZXIgb2YgcmV2b2x1dGlvbnMgcGVyIG1pbnV0ZSBvZiB0aGUgZW5naW5lXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0UnBtIChycG0pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX1JQTSwgcnBtKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRScG0gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX1JQTSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBsZXZlbCAtIFRoZSBmdWVsIGxldmVsIGluIHRoZSB0YW5rIChwZXJjZW50YWdlKVxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEZ1ZWxMZXZlbCAobGV2ZWwpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0ZVRUxfTEVWRUwsIGxldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRGdWVsTGV2ZWwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0ZVRUxfTEVWRUwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbGV2ZWxfc3RhdGUgLSBUaGUgZnVlbCBsZXZlbCBzdGF0ZVxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEZ1ZWxMZXZlbF9TdGF0ZSAobGV2ZWxfc3RhdGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0ZVRUxfTEVWRUxfU1RBVEUsIGxldmVsX3N0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRGdWVsTGV2ZWxfU3RhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0ZVRUxfTEVWRUxfU1RBVEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gY29uc3VtcHRpb24gLSBUaGUgaW5zdGFudGFuZW91cyBmdWVsIGNvbnN1bXB0aW9uIGluIG1pY3JvbGl0cmVzXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0SW5zdGFudEZ1ZWxDb25zdW1wdGlvbiAoY29uc3VtcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0lOU1RBTlRfRlVFTF9DT05TVU1QVElPTiwgY29uc3VtcHRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEluc3RhbnRGdWVsQ29uc3VtcHRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0lOU1RBTlRfRlVFTF9DT05TVU1QVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSByYW5nZSAtIFRoZSBlc3RpbWF0ZSByYW5nZSBpbiBLTSB0aGUgdmVoaWNsZSBjYW4gdHJhdmVsIGJhc2VkIG9uIGZ1ZWwgbGV2ZWwgYW5kIGNvbnN1bXB0aW9uXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0RnVlbFJhbmdlIChyYW5nZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfRlVFTF9SQU5HRSwgcmFuZ2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEZ1ZWxSYW5nZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfRlVFTF9SQU5HRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSB0ZW1wZXJhdHVyZSAtIFRoZSBleHRlcm5hbCB0ZW1wZXJhdHVyZSBpbiBkZWdyZWVzIGNlbHNpdXNcbiAgICAgKiBAcmV0dXJuIHtHZXRWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRFeHRlcm5hbFRlbXBlcmF0dXJlICh0ZW1wZXJhdHVyZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfRVhURVJOQUxfVEVNUEVSQVRVUkUsIHRlbXBlcmF0dXJlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRFeHRlcm5hbFRlbXBlcmF0dXJlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9FWFRFUk5BTF9URU1QRVJBVFVSRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzaWduYWwgLSBTZWUgVHVyblNpZ25hbFxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldFR1cm5TaWduYWwgKHNpZ25hbCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfVFVSTl9TSUdOQUwsIHNpZ25hbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0VHVyblNpZ25hbCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfVFVSTl9TSUdOQUwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gdmluIC0gVmVoaWNsZSBpZGVudGlmaWNhdGlvbiBudW1iZXJcbiAgICAgKiBAcmV0dXJuIHtHZXRWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRWaW4gKHZpbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfVklOLCB2aW4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFZpbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfVklOKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBybmRsIC0gU2VlIFBSTkRMXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0UHJuZGwgKHBybmRsKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9QUk5ETCwgcHJuZGwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFBybmRsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9QUk5ETCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBwcmVzc3VyZSAtIFNlZSBUaXJlU3RhdHVzXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0VGlyZVByZXNzdXJlIChwcmVzc3VyZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfVElSRV9QUkVTU1VSRSwgcHJlc3N1cmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFRpcmVQcmVzc3VyZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfVElSRV9QUkVTU1VSRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBvZG9tZXRlciAtIE9kb21ldGVyIGluIGttXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0T2RvbWV0ZXIgKG9kb21ldGVyKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9PRE9NRVRFUiwgb2RvbWV0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldE9kb21ldGVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9PRE9NRVRFUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzdGF0dXMgLSBUaGUgc3RhdHVzIG9mIHRoZSBzZWF0IGJlbHRzXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0QmVsdFN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9CRUxUX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRCZWx0U3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9CRUxUX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBpbmZvcm1hdGlvbiAtIFRoZSBib2R5IGluZm9ybWF0aW9uIGluY2x1ZGluZyBpZ25pdGlvbiBzdGF0dXMgYW5kIGludGVybmFsIHRlbXBcbiAgICAgKiBAcmV0dXJuIHtHZXRWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRCb2R5SW5mb3JtYXRpb24gKGluZm9ybWF0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9CT0RZX0lORk9STUFUSU9OLCBpbmZvcm1hdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0Qm9keUluZm9ybWF0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9CT0RZX0lORk9STUFUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHN0YXR1cyAtIFRoZSBkZXZpY2Ugc3RhdHVzIGluY2x1ZGluZyBzaWduYWwgYW5kIGJhdHRlcnkgc3RyZW5ndGhcbiAgICAgKiBAcmV0dXJuIHtHZXRWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXREZXZpY2VTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfREVWSUNFX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXREZXZpY2VTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0RFVklDRV9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYnJha2luZyAtIFRoZSBzdGF0dXMgb2YgdGhlIGJyYWtlIHBlZGFsXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0RHJpdmVyQnJha2luZyAoYnJha2luZykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfRFJJVkVSX0JSQUtJTkcsIGJyYWtpbmcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldERyaXZlckJyYWtpbmcgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0RSSVZFUl9CUkFLSU5HKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHN0YXR1cyAtIFRoZSBzdGF0dXMgb2YgdGhlIHdpcGVyc1xuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldFdpcGVyU3RhdHVzIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX1dJUEVSX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRXaXBlclN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfV0lQRVJfU1RBVFVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHN0YXR1cyAtIFN0YXR1cyBvZiB0aGUgaGVhZCBsYW1wc1xuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEhlYWRMYW1wU3RhdHVzIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0hFQURfTEFNUF9TVEFUVVMsIHN0YXR1cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0SGVhZExhbXBTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0hFQURfTEFNUF9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gdG9ycXVlIC0gVG9ycXVlIHZhbHVlIGZvciBlbmdpbmUgKGluIE5tKSBvbiBub24tZGllc2VsIHZhcmlhbnRzXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0RW5naW5lVG9ycXVlICh0b3JxdWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0VOR0lORV9UT1JRVUUsIHRvcnF1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RW5naW5lVG9ycXVlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9FTkdJTkVfVE9SUVVFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBvc2l0aW9uIC0gQWNjZWxlcmF0b3IgcGVkYWwgcG9zaXRpb24gKHBlcmNlbnRhZ2UgZGVwcmVzc2VkKVxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEFjY1BlZGFsUG9zaXRpb24gKHBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9BQ0NfUEVEQUxfUE9TSVRJT04sIHBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRBY2NQZWRhbFBvc2l0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9BQ0NfUEVEQUxfUE9TSVRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYW5nbGUgLSBDdXJyZW50IGFuZ2xlIG9mIHRoZSBzdGVlcmluZyB3aGVlbCAoaW4gZGVnKVxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldFN0ZWVyaW5nV2hlZWxBbmdsZSAoYW5nbGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX1NURUVSSU5HX1dIRUVMX0FOR0xFLCBhbmdsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0U3RlZXJpbmdXaGVlbEFuZ2xlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9TVEVFUklOR19XSEVFTF9BTkdMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBsaWZlIC0gVGhlIGVzdGltYXRlZCBwZXJjZW50YWdlIG9mIHJlbWFpbmluZyBvaWwgbGlmZSBvZiB0aGUgZW5naW5lLlxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEVuZ2luZU9pbExpZmUgKGxpZmUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0VOR0lORV9PSUxfTElGRSwgbGlmZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RW5naW5lT2lsTGlmZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfRU5HSU5FX09JTF9MSUZFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHN0YXR1cyAtIFRoZSBzdGF0dXMgb2YgdGhlIHBhcmsgYnJha2UgYXMgcHJvdmlkZWQgYnkgRWxlY3RyaWMgUGFyayBCcmFrZSAoRVBCKSBzeXN0ZW0uXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0RWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9FTEVDVFJPTklDX1BBUktfQlJBS0VfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEVsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0VMRUNUUk9OSUNfUEFSS19CUkFLRV9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaWQgLSBQYXJhbWV0ZXIgdXNlZCBieSBjbG91ZCBhcHBzIHRvIGlkZW50aWZ5IGEgaGVhZCB1bml0XG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0Q2xvdWRBcHBWZWhpY2xlSUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9DTE9VRF9BUFBfVkVISUNMRV9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldENsb3VkQXBwVmVoaWNsZUlEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9DTE9VRF9BUFBfVkVISUNMRV9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBpbmZvIC0gRW1lcmdlbmN5IENhbGwgbm90aWZpY2F0aW9uIGFuZCBjb25maXJtYXRpb24gZGF0YVxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEVDYWxsSW5mbyAoaW5mbykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfRV9DQUxMX0lORk8sIGluZm8pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEVDYWxsSW5mbyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfRV9DQUxMX0lORk8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3RhdHVzIC0gVGhlIHN0YXR1cyBvZiB0aGUgYWlyIGJhZ3NcbiAgICAgKiBAcmV0dXJuIHtHZXRWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRBaXJiYWdTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfQUlSQkFHX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRBaXJiYWdTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0FJUkJBR19TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQgLSBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFuIGVtZXJnZW5jeSBldmVudCAoYW5kIGlmIGl0IG9jY3VycmVkKVxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEVtZXJnZW5jeUV2ZW50IChldmVudCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfRU1FUkdFTkNZX0VWRU5ULCBldmVudCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RW1lcmdlbmN5RXZlbnQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGEuS0VZX0VNRVJHRU5DWV9FVkVOVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzdGF0dXMgLSBUaGUgc3RhdHVzIG1vZGVzIG9mIHRoZSBjbHVzdGVyXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0Q2x1c3Rlck1vZGVTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfQ0xVU1RFUl9NT0RFX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRDbHVzdGVyTW9kZVN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfQ0xVU1RFUl9NT0RFX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBrZXkgLSBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBNeUtleSBmZWF0dXJlXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0TXlLZXkgKGtleSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YS5LRVlfTVlfS0VZLCBrZXkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldE15S2V5ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhLktFWV9NWV9LRVkpO1xuICAgIH1cbn1cblxuR2V0VmVoaWNsZURhdGEuS0VZX0dQUyA9ICdncHMnO1xuR2V0VmVoaWNsZURhdGEuS0VZX1NQRUVEID0gJ3NwZWVkJztcbkdldFZlaGljbGVEYXRhLktFWV9SUE0gPSAncnBtJztcbkdldFZlaGljbGVEYXRhLktFWV9GVUVMX0xFVkVMID0gJ2Z1ZWxMZXZlbCc7XG5HZXRWZWhpY2xlRGF0YS5LRVlfRlVFTF9MRVZFTF9TVEFURSA9ICdmdWVsTGV2ZWxfU3RhdGUnO1xuR2V0VmVoaWNsZURhdGEuS0VZX0lOU1RBTlRfRlVFTF9DT05TVU1QVElPTiA9ICdpbnN0YW50RnVlbENvbnN1bXB0aW9uJztcbkdldFZlaGljbGVEYXRhLktFWV9GVUVMX1JBTkdFID0gJ2Z1ZWxSYW5nZSc7XG5HZXRWZWhpY2xlRGF0YS5LRVlfRVhURVJOQUxfVEVNUEVSQVRVUkUgPSAnZXh0ZXJuYWxUZW1wZXJhdHVyZSc7XG5HZXRWZWhpY2xlRGF0YS5LRVlfVFVSTl9TSUdOQUwgPSAndHVyblNpZ25hbCc7XG5HZXRWZWhpY2xlRGF0YS5LRVlfVklOID0gJ3Zpbic7XG5HZXRWZWhpY2xlRGF0YS5LRVlfUFJOREwgPSAncHJuZGwnO1xuR2V0VmVoaWNsZURhdGEuS0VZX1RJUkVfUFJFU1NVUkUgPSAndGlyZVByZXNzdXJlJztcbkdldFZlaGljbGVEYXRhLktFWV9PRE9NRVRFUiA9ICdvZG9tZXRlcic7XG5HZXRWZWhpY2xlRGF0YS5LRVlfQkVMVF9TVEFUVVMgPSAnYmVsdFN0YXR1cyc7XG5HZXRWZWhpY2xlRGF0YS5LRVlfQk9EWV9JTkZPUk1BVElPTiA9ICdib2R5SW5mb3JtYXRpb24nO1xuR2V0VmVoaWNsZURhdGEuS0VZX0RFVklDRV9TVEFUVVMgPSAnZGV2aWNlU3RhdHVzJztcbkdldFZlaGljbGVEYXRhLktFWV9EUklWRVJfQlJBS0lORyA9ICdkcml2ZXJCcmFraW5nJztcbkdldFZlaGljbGVEYXRhLktFWV9XSVBFUl9TVEFUVVMgPSAnd2lwZXJTdGF0dXMnO1xuR2V0VmVoaWNsZURhdGEuS0VZX0hFQURfTEFNUF9TVEFUVVMgPSAnaGVhZExhbXBTdGF0dXMnO1xuR2V0VmVoaWNsZURhdGEuS0VZX0VOR0lORV9UT1JRVUUgPSAnZW5naW5lVG9ycXVlJztcbkdldFZlaGljbGVEYXRhLktFWV9BQ0NfUEVEQUxfUE9TSVRJT04gPSAnYWNjUGVkYWxQb3NpdGlvbic7XG5HZXRWZWhpY2xlRGF0YS5LRVlfU1RFRVJJTkdfV0hFRUxfQU5HTEUgPSAnc3RlZXJpbmdXaGVlbEFuZ2xlJztcbkdldFZlaGljbGVEYXRhLktFWV9FTkdJTkVfT0lMX0xJRkUgPSAnZW5naW5lT2lsTGlmZSc7XG5HZXRWZWhpY2xlRGF0YS5LRVlfRUxFQ1RST05JQ19QQVJLX0JSQUtFX1NUQVRVUyA9ICdlbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzJztcbkdldFZlaGljbGVEYXRhLktFWV9DTE9VRF9BUFBfVkVISUNMRV9JRCA9ICdjbG91ZEFwcFZlaGljbGVJRCc7XG5HZXRWZWhpY2xlRGF0YS5LRVlfRV9DQUxMX0lORk8gPSAnZUNhbGxJbmZvJztcbkdldFZlaGljbGVEYXRhLktFWV9BSVJCQUdfU1RBVFVTID0gJ2FpcmJhZ1N0YXR1cyc7XG5HZXRWZWhpY2xlRGF0YS5LRVlfRU1FUkdFTkNZX0VWRU5UID0gJ2VtZXJnZW5jeUV2ZW50JztcbkdldFZlaGljbGVEYXRhLktFWV9DTFVTVEVSX01PREVfU1RBVFVTID0gJ2NsdXN0ZXJNb2RlU3RhdHVzJztcbkdldFZlaGljbGVEYXRhLktFWV9NWV9LRVkgPSAnbXlLZXknO1xuXG5leHBvcnQgeyBHZXRWZWhpY2xlRGF0YSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIFJlZmxlY3RzIHRoZSBzdGF0dXMgb2YgYSB2ZWhpY2xlIGRhdGEgZXZlbnQ7IGUuZy4gYSBzZWF0IGJlbHQgZXZlbnQgc3RhdHVzLlxuICogQHR5cGVkZWYge0VudW19IFZlaGljbGVEYXRhRXZlbnRTdGF0dXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFZlaGljbGVEYXRhRXZlbnRTdGF0dXMgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkRFU19OT19FVkVOVCAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLl9NQVAuVkRFU19OT19FVkVOVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWREVTX05PICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhRXZlbnRTdGF0dXMuX01BUC5WREVTX05PO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZERVNfWUVTICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhRXZlbnRTdGF0dXMuX01BUC5WREVTX1lFUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWREVTX05PVF9TVVBQT1JURUQgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFFdmVudFN0YXR1cy5fTUFQLlZERVNfTk9UX1NVUFBPUlRFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWREVTX0ZBVUxUICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhRXZlbnRTdGF0dXMuX01BUC5WREVTX0ZBVUxUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhRXZlbnRTdGF0dXMuX3ZhbHVlRm9yS2V5KGtleSwgVmVoaWNsZURhdGFFdmVudFN0YXR1cy5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhRXZlbnRTdGF0dXMuX2tleUZvclZhbHVlKHZhbHVlLCBWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLl9NQVApO1xuICAgIH1cbn1cblxuVmVoaWNsZURhdGFFdmVudFN0YXR1cy5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ1ZERVNfTk9fRVZFTlQnOiAnTk9fRVZFTlQnLFxuICAgICdWREVTX05PJzogJ05PJyxcbiAgICAnVkRFU19ZRVMnOiAnWUVTJyxcbiAgICAnVkRFU19OT1RfU1VQUE9SVEVEJzogJ05PVF9TVVBQT1JURUQnLFxuICAgICdWREVTX0ZBVUxUJzogJ0ZBVUxUJyxcbn0pO1xuXG5leHBvcnQgeyBWZWhpY2xlRGF0YUV2ZW50U3RhdHVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IFZlaGljbGVEYXRhRXZlbnRTdGF0dXMgfSBmcm9tICcuLi9lbnVtcy9WZWhpY2xlRGF0YUV2ZW50U3RhdHVzLmpzJztcblxuY2xhc3MgQWlyYmFnU3RhdHVzIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9IGRlcGxveWVkIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJWZWRzRHJ2QmFnX0RfTHRjaGRcIi4gU2VlIFZlaGljbGVEYXRhRXZlbnRTdGF0dXMuXG4gICAgICogQHJldHVybiB7QWlyYmFnU3RhdHVzfVxuICAgICAqL1xuICAgIHNldERyaXZlckFpcmJhZ0RlcGxveWVkIChkZXBsb3llZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBkZXBsb3llZCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFpcmJhZ1N0YXR1cy5LRVlfRFJJVkVSX0FJUkJBR19ERVBMT1lFRCwgZGVwbG95ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YUV2ZW50U3RhdHVzfVxuICAgICAqL1xuICAgIGdldERyaXZlckFpcmJhZ0RlcGxveWVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIEFpcmJhZ1N0YXR1cy5LRVlfRFJJVkVSX0FJUkJBR19ERVBMT1lFRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YUV2ZW50U3RhdHVzfSBkZXBsb3llZCAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiVmVkc0RydlNpZGVCYWdfRF9MdGNoZFwiLiBTZWVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVoaWNsZURhdGFFdmVudFN0YXR1cy5cbiAgICAgKiBAcmV0dXJuIHtBaXJiYWdTdGF0dXN9XG4gICAgICovXG4gICAgc2V0RHJpdmVyU2lkZUFpcmJhZ0RlcGxveWVkIChkZXBsb3llZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBkZXBsb3llZCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFpcmJhZ1N0YXR1cy5LRVlfRFJJVkVSX1NJREVfQUlSQkFHX0RFUExPWUVELCBkZXBsb3llZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0RHJpdmVyU2lkZUFpcmJhZ0RlcGxveWVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIEFpcmJhZ1N0YXR1cy5LRVlfRFJJVkVSX1NJREVfQUlSQkFHX0RFUExPWUVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9IGRlcGxveWVkIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJWZWRzRHJ2Q3J0bkJhZ19EX0x0Y2hkXCIuIFNlZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLlxuICAgICAqIEByZXR1cm4ge0FpcmJhZ1N0YXR1c31cbiAgICAgKi9cbiAgICBzZXREcml2ZXJDdXJ0YWluQWlyYmFnRGVwbG95ZWQgKGRlcGxveWVkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIGRlcGxveWVkKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQWlyYmFnU3RhdHVzLktFWV9EUklWRVJfQ1VSVEFJTl9BSVJCQUdfREVQTE9ZRUQsIGRlcGxveWVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFFdmVudFN0YXR1c31cbiAgICAgKi9cbiAgICBnZXREcml2ZXJDdXJ0YWluQWlyYmFnRGVwbG95ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFFdmVudFN0YXR1cywgQWlyYmFnU3RhdHVzLktFWV9EUklWRVJfQ1VSVEFJTl9BSVJCQUdfREVQTE9ZRUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFFdmVudFN0YXR1c30gZGVwbG95ZWQgLSBSZWZlcmVuY2VzIHNpZ25hbCBcIlZlZHNQYXNCYWdfRF9MdGNoZFwiLiBTZWUgVmVoaWNsZURhdGFFdmVudFN0YXR1cy5cbiAgICAgKiBAcmV0dXJuIHtBaXJiYWdTdGF0dXN9XG4gICAgICovXG4gICAgc2V0UGFzc2VuZ2VyQWlyYmFnRGVwbG95ZWQgKGRlcGxveWVkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIGRlcGxveWVkKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQWlyYmFnU3RhdHVzLktFWV9QQVNTRU5HRVJfQUlSQkFHX0RFUExPWUVELCBkZXBsb3llZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0UGFzc2VuZ2VyQWlyYmFnRGVwbG95ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFFdmVudFN0YXR1cywgQWlyYmFnU3RhdHVzLktFWV9QQVNTRU5HRVJfQUlSQkFHX0RFUExPWUVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9IGRlcGxveWVkIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJWZWRzUGFzQ3J0bkJhZ19EX0x0Y2hkXCIuIFNlZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLlxuICAgICAqIEByZXR1cm4ge0FpcmJhZ1N0YXR1c31cbiAgICAgKi9cbiAgICBzZXRQYXNzZW5nZXJDdXJ0YWluQWlyYmFnRGVwbG95ZWQgKGRlcGxveWVkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIGRlcGxveWVkKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQWlyYmFnU3RhdHVzLktFWV9QQVNTRU5HRVJfQ1VSVEFJTl9BSVJCQUdfREVQTE9ZRUQsIGRlcGxveWVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFFdmVudFN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRQYXNzZW5nZXJDdXJ0YWluQWlyYmFnRGVwbG95ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFFdmVudFN0YXR1cywgQWlyYmFnU3RhdHVzLktFWV9QQVNTRU5HRVJfQ1VSVEFJTl9BSVJCQUdfREVQTE9ZRUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFFdmVudFN0YXR1c30gZGVwbG95ZWQgLSBSZWZlcmVuY2VzIHNpZ25hbCBcIlZlZHNLbmVlRHJ2QmFnX0RfTHRjaGRcIi4gU2VlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlaGljbGVEYXRhRXZlbnRTdGF0dXMuXG4gICAgICogQHJldHVybiB7QWlyYmFnU3RhdHVzfVxuICAgICAqL1xuICAgIHNldERyaXZlcktuZWVBaXJiYWdEZXBsb3llZCAoZGVwbG95ZWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFFdmVudFN0YXR1cywgZGVwbG95ZWQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBaXJiYWdTdGF0dXMuS0VZX0RSSVZFUl9LTkVFX0FJUkJBR19ERVBMT1lFRCwgZGVwbG95ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YUV2ZW50U3RhdHVzfVxuICAgICAqL1xuICAgIGdldERyaXZlcktuZWVBaXJiYWdEZXBsb3llZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBBaXJiYWdTdGF0dXMuS0VZX0RSSVZFUl9LTkVFX0FJUkJBR19ERVBMT1lFRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YUV2ZW50U3RhdHVzfSBkZXBsb3llZCAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiVmVkc1Bhc1NpZGVCYWdfRF9MdGNoZFwiLiBTZWVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVoaWNsZURhdGFFdmVudFN0YXR1cy5cbiAgICAgKiBAcmV0dXJuIHtBaXJiYWdTdGF0dXN9XG4gICAgICovXG4gICAgc2V0UGFzc2VuZ2VyU2lkZUFpcmJhZ0RlcGxveWVkIChkZXBsb3llZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBkZXBsb3llZCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFpcmJhZ1N0YXR1cy5LRVlfUEFTU0VOR0VSX1NJREVfQUlSQkFHX0RFUExPWUVELCBkZXBsb3llZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0UGFzc2VuZ2VyU2lkZUFpcmJhZ0RlcGxveWVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIEFpcmJhZ1N0YXR1cy5LRVlfUEFTU0VOR0VSX1NJREVfQUlSQkFHX0RFUExPWUVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9IGRlcGxveWVkIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJWZWRzS25lZVBhc0JhZ19EX0x0Y2hkXCIuIFNlZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLlxuICAgICAqIEByZXR1cm4ge0FpcmJhZ1N0YXR1c31cbiAgICAgKi9cbiAgICBzZXRQYXNzZW5nZXJLbmVlQWlyYmFnRGVwbG95ZWQgKGRlcGxveWVkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIGRlcGxveWVkKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQWlyYmFnU3RhdHVzLktFWV9QQVNTRU5HRVJfS05FRV9BSVJCQUdfREVQTE9ZRUQsIGRlcGxveWVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFFdmVudFN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRQYXNzZW5nZXJLbmVlQWlyYmFnRGVwbG95ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFFdmVudFN0YXR1cywgQWlyYmFnU3RhdHVzLktFWV9QQVNTRU5HRVJfS05FRV9BSVJCQUdfREVQTE9ZRUQpO1xuICAgIH1cbn1cblxuQWlyYmFnU3RhdHVzLktFWV9EUklWRVJfQUlSQkFHX0RFUExPWUVEID0gJ2RyaXZlckFpcmJhZ0RlcGxveWVkJztcbkFpcmJhZ1N0YXR1cy5LRVlfRFJJVkVSX1NJREVfQUlSQkFHX0RFUExPWUVEID0gJ2RyaXZlclNpZGVBaXJiYWdEZXBsb3llZCc7XG5BaXJiYWdTdGF0dXMuS0VZX0RSSVZFUl9DVVJUQUlOX0FJUkJBR19ERVBMT1lFRCA9ICdkcml2ZXJDdXJ0YWluQWlyYmFnRGVwbG95ZWQnO1xuQWlyYmFnU3RhdHVzLktFWV9QQVNTRU5HRVJfQUlSQkFHX0RFUExPWUVEID0gJ3Bhc3NlbmdlckFpcmJhZ0RlcGxveWVkJztcbkFpcmJhZ1N0YXR1cy5LRVlfUEFTU0VOR0VSX0NVUlRBSU5fQUlSQkFHX0RFUExPWUVEID0gJ3Bhc3NlbmdlckN1cnRhaW5BaXJiYWdEZXBsb3llZCc7XG5BaXJiYWdTdGF0dXMuS0VZX0RSSVZFUl9LTkVFX0FJUkJBR19ERVBMT1lFRCA9ICdkcml2ZXJLbmVlQWlyYmFnRGVwbG95ZWQnO1xuQWlyYmFnU3RhdHVzLktFWV9QQVNTRU5HRVJfU0lERV9BSVJCQUdfREVQTE9ZRUQgPSAncGFzc2VuZ2VyU2lkZUFpcmJhZ0RlcGxveWVkJztcbkFpcmJhZ1N0YXR1cy5LRVlfUEFTU0VOR0VSX0tORUVfQUlSQkFHX0RFUExPWUVEID0gJ3Bhc3NlbmdlcktuZWVBaXJiYWdEZXBsb3llZCc7XG5cbmV4cG9ydCB7IEFpcmJhZ1N0YXR1cyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIFJlZmxlY3RzIHRoZSBzdGF0dXMgb2YgdGhlIGN1cnJlbnQgcG93ZXIgbW9kZS5cbiAqIEB0eXBlZGVmIHtFbnVtfSBQb3dlck1vZGVTdGF0dXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFBvd2VyTW9kZVN0YXR1cyBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBLRVlfT1VUICgpIHtcbiAgICAgICAgcmV0dXJuIFBvd2VyTW9kZVN0YXR1cy5fTUFQLktFWV9PVVQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgS0VZX1JFQ0VOVExZX09VVCAoKSB7XG4gICAgICAgIHJldHVybiBQb3dlck1vZGVTdGF0dXMuX01BUC5LRVlfUkVDRU5UTFlfT1VUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEtFWV9BUFBST1ZFRF8wICgpIHtcbiAgICAgICAgcmV0dXJuIFBvd2VyTW9kZVN0YXR1cy5fTUFQLktFWV9BUFBST1ZFRF8wO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBPU1RfQUNDRVNPUllfMCAoKSB7XG4gICAgICAgIHJldHVybiBQb3dlck1vZGVTdGF0dXMuX01BUC5QT1NUX0FDQ0VTT1JZXzA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQUNDRVNPUllfMSAoKSB7XG4gICAgICAgIHJldHVybiBQb3dlck1vZGVTdGF0dXMuX01BUC5BQ0NFU09SWV8xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBPU1RfSUdOSVRJT05fMSAoKSB7XG4gICAgICAgIHJldHVybiBQb3dlck1vZGVTdGF0dXMuX01BUC5QT1NUX0lHTklUSU9OXzE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgSUdOSVRJT05fT05fMiAoKSB7XG4gICAgICAgIHJldHVybiBQb3dlck1vZGVTdGF0dXMuX01BUC5JR05JVElPTl9PTl8yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJVTk5JTkdfMiAoKSB7XG4gICAgICAgIHJldHVybiBQb3dlck1vZGVTdGF0dXMuX01BUC5SVU5OSU5HXzI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ1JBTktfMyAoKSB7XG4gICAgICAgIHJldHVybiBQb3dlck1vZGVTdGF0dXMuX01BUC5DUkFOS18zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFBvd2VyTW9kZVN0YXR1cy5fdmFsdWVGb3JLZXkoa2V5LCBQb3dlck1vZGVTdGF0dXMuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBQb3dlck1vZGVTdGF0dXMuX2tleUZvclZhbHVlKHZhbHVlLCBQb3dlck1vZGVTdGF0dXMuX01BUCk7XG4gICAgfVxufVxuXG5Qb3dlck1vZGVTdGF0dXMuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdLRVlfT1VUJzogJ0tFWV9PVVQnLFxuICAgICdLRVlfUkVDRU5UTFlfT1VUJzogJ0tFWV9SRUNFTlRMWV9PVVQnLFxuICAgICdLRVlfQVBQUk9WRURfMCc6ICdLRVlfQVBQUk9WRURfMCcsXG4gICAgJ1BPU1RfQUNDRVNPUllfMCc6ICdQT1NUX0FDQ0VTT1JZXzAnLFxuICAgICdBQ0NFU09SWV8xJzogJ0FDQ0VTT1JZXzEnLFxuICAgICdQT1NUX0lHTklUSU9OXzEnOiAnUE9TVF9JR05JVElPTl8xJyxcbiAgICAnSUdOSVRJT05fT05fMic6ICdJR05JVElPTl9PTl8yJyxcbiAgICAnUlVOTklOR18yJzogJ1JVTk5JTkdfMicsXG4gICAgJ0NSQU5LXzMnOiAnQ1JBTktfMycsXG59KTtcblxuZXhwb3J0IHsgUG93ZXJNb2RlU3RhdHVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogUmVmbGVjdHMgdGhlIHN0YXR1cyBvZiB0aGUgY3VycmVudCBjYXIgbW9kZS5cbiAqIEB0eXBlZGVmIHtFbnVtfSBDYXJNb2RlU3RhdHVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBDYXJNb2RlU3RhdHVzIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENNU19OT1JNQUwgKCkge1xuICAgICAgICByZXR1cm4gQ2FyTW9kZVN0YXR1cy5fTUFQLkNNU19OT1JNQUw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ01TX0ZBQ1RPUlkgKCkge1xuICAgICAgICByZXR1cm4gQ2FyTW9kZVN0YXR1cy5fTUFQLkNNU19GQUNUT1JZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENNU19UUkFOU1BPUlQgKCkge1xuICAgICAgICByZXR1cm4gQ2FyTW9kZVN0YXR1cy5fTUFQLkNNU19UUkFOU1BPUlQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ01TX0NSQVNIICgpIHtcbiAgICAgICAgcmV0dXJuIENhck1vZGVTdGF0dXMuX01BUC5DTVNfQ1JBU0g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gQ2FyTW9kZVN0YXR1cy5fdmFsdWVGb3JLZXkoa2V5LCBDYXJNb2RlU3RhdHVzLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gQ2FyTW9kZVN0YXR1cy5fa2V5Rm9yVmFsdWUodmFsdWUsIENhck1vZGVTdGF0dXMuX01BUCk7XG4gICAgfVxufVxuXG5DYXJNb2RlU3RhdHVzLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnQ01TX05PUk1BTCc6ICdOT1JNQUwnLFxuICAgICdDTVNfRkFDVE9SWSc6ICdGQUNUT1JZJyxcbiAgICAnQ01TX1RSQU5TUE9SVCc6ICdUUkFOU1BPUlQnLFxuICAgICdDTVNfQ1JBU0gnOiAnQ1JBU0gnLFxufSk7XG5cbmV4cG9ydCB7IENhck1vZGVTdGF0dXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBSZWZsZWN0cyB0aGUgc3RhdHVzIG9mIHRoZSBjdXJyZW50IHBvd2VyIG1vZGUgcXVhbGlmaWNhdGlvbi5cbiAqIEB0eXBlZGVmIHtFbnVtfSBQb3dlck1vZGVRdWFsaWZpY2F0aW9uU3RhdHVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBQb3dlck1vZGVRdWFsaWZpY2F0aW9uU3RhdHVzIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBPV0VSX01PREVfVU5ERUZJTkVEICgpIHtcbiAgICAgICAgcmV0dXJuIFBvd2VyTW9kZVF1YWxpZmljYXRpb25TdGF0dXMuX01BUC5QT1dFUl9NT0RFX1VOREVGSU5FRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQT1dFUl9NT0RFX0VWQUxVQVRJT05fSU5fUFJPR1JFU1MgKCkge1xuICAgICAgICByZXR1cm4gUG93ZXJNb2RlUXVhbGlmaWNhdGlvblN0YXR1cy5fTUFQLlBPV0VSX01PREVfRVZBTFVBVElPTl9JTl9QUk9HUkVTUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOT1RfREVGSU5FRCAoKSB7XG4gICAgICAgIHJldHVybiBQb3dlck1vZGVRdWFsaWZpY2F0aW9uU3RhdHVzLl9NQVAuTk9UX0RFRklORUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUE9XRVJfTU9ERV9PSyAoKSB7XG4gICAgICAgIHJldHVybiBQb3dlck1vZGVRdWFsaWZpY2F0aW9uU3RhdHVzLl9NQVAuUE9XRVJfTU9ERV9PSztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBQb3dlck1vZGVRdWFsaWZpY2F0aW9uU3RhdHVzLl92YWx1ZUZvcktleShrZXksIFBvd2VyTW9kZVF1YWxpZmljYXRpb25TdGF0dXMuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBQb3dlck1vZGVRdWFsaWZpY2F0aW9uU3RhdHVzLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgUG93ZXJNb2RlUXVhbGlmaWNhdGlvblN0YXR1cy5fTUFQKTtcbiAgICB9XG59XG5cblBvd2VyTW9kZVF1YWxpZmljYXRpb25TdGF0dXMuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdQT1dFUl9NT0RFX1VOREVGSU5FRCc6ICdQT1dFUl9NT0RFX1VOREVGSU5FRCcsXG4gICAgJ1BPV0VSX01PREVfRVZBTFVBVElPTl9JTl9QUk9HUkVTUyc6ICdQT1dFUl9NT0RFX0VWQUxVQVRJT05fSU5fUFJPR1JFU1MnLFxuICAgICdOT1RfREVGSU5FRCc6ICdOT1RfREVGSU5FRCcsXG4gICAgJ1BPV0VSX01PREVfT0snOiAnUE9XRVJfTU9ERV9PSycsXG59KTtcblxuZXhwb3J0IHsgUG93ZXJNb2RlUXVhbGlmaWNhdGlvblN0YXR1cyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBQb3dlck1vZGVTdGF0dXMgfSBmcm9tICcuLi9lbnVtcy9Qb3dlck1vZGVTdGF0dXMuanMnO1xuaW1wb3J0IHsgQ2FyTW9kZVN0YXR1cyB9IGZyb20gJy4uL2VudW1zL0Nhck1vZGVTdGF0dXMuanMnO1xuaW1wb3J0IHsgUG93ZXJNb2RlUXVhbGlmaWNhdGlvblN0YXR1cyB9IGZyb20gJy4uL2VudW1zL1Bvd2VyTW9kZVF1YWxpZmljYXRpb25TdGF0dXMuanMnO1xuXG5jbGFzcyBDbHVzdGVyTW9kZVN0YXR1cyBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhY3RpdmUgLSBSZWZlcmVuY2VzIHNpZ25hbCBcIlBvd2VyTW9kZV9VQlwiLlxuICAgICAqIEByZXR1cm4ge0NsdXN0ZXJNb2RlU3RhdHVzfVxuICAgICAqL1xuICAgIHNldFBvd2VyTW9kZUFjdGl2ZSAoYWN0aXZlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsdXN0ZXJNb2RlU3RhdHVzLktFWV9QT1dFUl9NT0RFX0FDVElWRSwgYWN0aXZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRQb3dlck1vZGVBY3RpdmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ2x1c3Rlck1vZGVTdGF0dXMuS0VZX1BPV0VSX01PREVfQUNUSVZFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1Bvd2VyTW9kZVF1YWxpZmljYXRpb25TdGF0dXN9IHN0YXR1cyAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiUG93ZXJNb2RlUUZcIi4gU2VlIFBvd2VyTW9kZVF1YWxpZmljYXRpb25TdGF0dXMuXG4gICAgICogQHJldHVybiB7Q2x1c3Rlck1vZGVTdGF0dXN9XG4gICAgICovXG4gICAgc2V0UG93ZXJNb2RlUXVhbGlmaWNhdGlvblN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFBvd2VyTW9kZVF1YWxpZmljYXRpb25TdGF0dXMsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsdXN0ZXJNb2RlU3RhdHVzLktFWV9QT1dFUl9NT0RFX1FVQUxJRklDQVRJT05fU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtQb3dlck1vZGVRdWFsaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqL1xuICAgIGdldFBvd2VyTW9kZVF1YWxpZmljYXRpb25TdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoUG93ZXJNb2RlUXVhbGlmaWNhdGlvblN0YXR1cywgQ2x1c3Rlck1vZGVTdGF0dXMuS0VZX1BPV0VSX01PREVfUVVBTElGSUNBVElPTl9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q2FyTW9kZVN0YXR1c30gc3RhdHVzIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJDYXJNb2RlXCIuIFNlZSBDYXJNb2RlLlxuICAgICAqIEByZXR1cm4ge0NsdXN0ZXJNb2RlU3RhdHVzfVxuICAgICAqL1xuICAgIHNldENhck1vZGVTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShDYXJNb2RlU3RhdHVzLCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDbHVzdGVyTW9kZVN0YXR1cy5LRVlfQ0FSX01PREVfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtDYXJNb2RlU3RhdHVzfVxuICAgICAqL1xuICAgIGdldENhck1vZGVTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQ2FyTW9kZVN0YXR1cywgQ2x1c3Rlck1vZGVTdGF0dXMuS0VZX0NBUl9NT0RFX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtQb3dlck1vZGVTdGF0dXN9IHN0YXR1cyAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiUG93ZXJNb2RlXCIuIFNlZSBQb3dlck1vZGUuXG4gICAgICogQHJldHVybiB7Q2x1c3Rlck1vZGVTdGF0dXN9XG4gICAgICovXG4gICAgc2V0UG93ZXJNb2RlU3RhdHVzIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoUG93ZXJNb2RlU3RhdHVzLCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDbHVzdGVyTW9kZVN0YXR1cy5LRVlfUE9XRVJfTU9ERV9TVEFUVVMsIHN0YXR1cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1Bvd2VyTW9kZVN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRQb3dlck1vZGVTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoUG93ZXJNb2RlU3RhdHVzLCBDbHVzdGVyTW9kZVN0YXR1cy5LRVlfUE9XRVJfTU9ERV9TVEFUVVMpO1xuICAgIH1cbn1cblxuQ2x1c3Rlck1vZGVTdGF0dXMuS0VZX1BPV0VSX01PREVfQUNUSVZFID0gJ3Bvd2VyTW9kZUFjdGl2ZSc7XG5DbHVzdGVyTW9kZVN0YXR1cy5LRVlfUE9XRVJfTU9ERV9RVUFMSUZJQ0FUSU9OX1NUQVRVUyA9ICdwb3dlck1vZGVRdWFsaWZpY2F0aW9uU3RhdHVzJztcbkNsdXN0ZXJNb2RlU3RhdHVzLktFWV9DQVJfTU9ERV9TVEFUVVMgPSAnY2FyTW9kZVN0YXR1cyc7XG5DbHVzdGVyTW9kZVN0YXR1cy5LRVlfUE9XRVJfTU9ERV9TVEFUVVMgPSAncG93ZXJNb2RlU3RhdHVzJztcblxuZXhwb3J0IHsgQ2x1c3Rlck1vZGVTdGF0dXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBSZWZsZWN0cyB0aGUgc3RhdHVzIG9mIHRoZSBSQ00gZnVlbCBjdXRvZmYuXG4gKiBAdHlwZWRlZiB7RW51bX0gRnVlbEN1dG9mZlN0YXR1c1xuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgRnVlbEN1dG9mZlN0YXR1cyBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGQ1NfVEVSTUlOQVRFX0ZVRUwgKCkge1xuICAgICAgICByZXR1cm4gRnVlbEN1dG9mZlN0YXR1cy5fTUFQLkZDU19URVJNSU5BVEVfRlVFTDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGQ1NfTk9STUFMX09QRVJBVElPTiAoKSB7XG4gICAgICAgIHJldHVybiBGdWVsQ3V0b2ZmU3RhdHVzLl9NQVAuRkNTX05PUk1BTF9PUEVSQVRJT047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRkNTX0ZBVUxUICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1ZWxDdXRvZmZTdGF0dXMuX01BUC5GQ1NfRkFVTFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gRnVlbEN1dG9mZlN0YXR1cy5fdmFsdWVGb3JLZXkoa2V5LCBGdWVsQ3V0b2ZmU3RhdHVzLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gRnVlbEN1dG9mZlN0YXR1cy5fa2V5Rm9yVmFsdWUodmFsdWUsIEZ1ZWxDdXRvZmZTdGF0dXMuX01BUCk7XG4gICAgfVxufVxuXG5GdWVsQ3V0b2ZmU3RhdHVzLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnRkNTX1RFUk1JTkFURV9GVUVMJzogJ1RFUk1JTkFURV9GVUVMJyxcbiAgICAnRkNTX05PUk1BTF9PUEVSQVRJT04nOiAnTk9STUFMX09QRVJBVElPTicsXG4gICAgJ0ZDU19GQVVMVCc6ICdGQVVMVCcsXG59KTtcblxuZXhwb3J0IHsgRnVlbEN1dG9mZlN0YXR1cyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIFJlZmxlY3RzIHRoZSBlbWVyZ2VuY3kgZXZlbnQgc3RhdHVzIG9mIHRoZSB2ZWhpY2xlLlxuICogQHR5cGVkZWYge0VudW19IEVtZXJnZW5jeUV2ZW50VHlwZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgRW1lcmdlbmN5RXZlbnRUeXBlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEVFVF9OT19FVkVOVCAoKSB7XG4gICAgICAgIHJldHVybiBFbWVyZ2VuY3lFdmVudFR5cGUuX01BUC5FRVRfTk9fRVZFTlQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRUVUX0ZST05UQUwgKCkge1xuICAgICAgICByZXR1cm4gRW1lcmdlbmN5RXZlbnRUeXBlLl9NQVAuRUVUX0ZST05UQUw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRUVUX1NJREUgKCkge1xuICAgICAgICByZXR1cm4gRW1lcmdlbmN5RXZlbnRUeXBlLl9NQVAuRUVUX1NJREU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRUVUX1JFQVIgKCkge1xuICAgICAgICByZXR1cm4gRW1lcmdlbmN5RXZlbnRUeXBlLl9NQVAuRUVUX1JFQVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRUVUX1JPTExPVkVSICgpIHtcbiAgICAgICAgcmV0dXJuIEVtZXJnZW5jeUV2ZW50VHlwZS5fTUFQLkVFVF9ST0xMT1ZFUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFRVRfTk9UX1NVUFBPUlRFRCAoKSB7XG4gICAgICAgIHJldHVybiBFbWVyZ2VuY3lFdmVudFR5cGUuX01BUC5FRVRfTk9UX1NVUFBPUlRFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFRVRfRkFVTFQgKCkge1xuICAgICAgICByZXR1cm4gRW1lcmdlbmN5RXZlbnRUeXBlLl9NQVAuRUVUX0ZBVUxUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEVtZXJnZW5jeUV2ZW50VHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBFbWVyZ2VuY3lFdmVudFR5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBFbWVyZ2VuY3lFdmVudFR5cGUuX2tleUZvclZhbHVlKHZhbHVlLCBFbWVyZ2VuY3lFdmVudFR5cGUuX01BUCk7XG4gICAgfVxufVxuXG5FbWVyZ2VuY3lFdmVudFR5cGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdFRVRfTk9fRVZFTlQnOiAnTk9fRVZFTlQnLFxuICAgICdFRVRfRlJPTlRBTCc6ICdGUk9OVEFMJyxcbiAgICAnRUVUX1NJREUnOiAnU0lERScsXG4gICAgJ0VFVF9SRUFSJzogJ1JFQVInLFxuICAgICdFRVRfUk9MTE9WRVInOiAnUk9MTE9WRVInLFxuICAgICdFRVRfTk9UX1NVUFBPUlRFRCc6ICdOT1RfU1VQUE9SVEVEJyxcbiAgICAnRUVUX0ZBVUxUJzogJ0ZBVUxUJyxcbn0pO1xuXG5leHBvcnQgeyBFbWVyZ2VuY3lFdmVudFR5cGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgRnVlbEN1dG9mZlN0YXR1cyB9IGZyb20gJy4uL2VudW1zL0Z1ZWxDdXRvZmZTdGF0dXMuanMnO1xuaW1wb3J0IHsgRW1lcmdlbmN5RXZlbnRUeXBlIH0gZnJvbSAnLi4vZW51bXMvRW1lcmdlbmN5RXZlbnRUeXBlLmpzJztcbmltcG9ydCB7IFZlaGljbGVEYXRhRXZlbnRTdGF0dXMgfSBmcm9tICcuLi9lbnVtcy9WZWhpY2xlRGF0YUV2ZW50U3RhdHVzLmpzJztcblxuY2xhc3MgRW1lcmdlbmN5RXZlbnQgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RW1lcmdlbmN5RXZlbnRUeXBlfSB0eXBlIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJWZWRzRXZudFR5cGVfRF9MdGNoZFwiLiBTZWUgRW1lcmdlbmN5RXZlbnRUeXBlLlxuICAgICAqIEByZXR1cm4ge0VtZXJnZW5jeUV2ZW50fVxuICAgICAqL1xuICAgIHNldEVtZXJnZW5jeUV2ZW50VHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShFbWVyZ2VuY3lFdmVudFR5cGUsIHR5cGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihFbWVyZ2VuY3lFdmVudC5LRVlfRU1FUkdFTkNZX0VWRU5UX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtFbWVyZ2VuY3lFdmVudFR5cGV9XG4gICAgICovXG4gICAgZ2V0RW1lcmdlbmN5RXZlbnRUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEVtZXJnZW5jeUV2ZW50VHlwZSwgRW1lcmdlbmN5RXZlbnQuS0VZX0VNRVJHRU5DWV9FVkVOVF9UWVBFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Z1ZWxDdXRvZmZTdGF0dXN9IHN0YXR1cyAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiUkNNX0Z1ZWxDdXRvZmZcIi4gU2VlIEZ1ZWxDdXRvZmZTdGF0dXMuXG4gICAgICogQHJldHVybiB7RW1lcmdlbmN5RXZlbnR9XG4gICAgICovXG4gICAgc2V0RnVlbEN1dG9mZlN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEZ1ZWxDdXRvZmZTdGF0dXMsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEVtZXJnZW5jeUV2ZW50LktFWV9GVUVMX0NVVE9GRl9TVEFUVVMsIHN0YXR1cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Z1ZWxDdXRvZmZTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0RnVlbEN1dG9mZlN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChGdWVsQ3V0b2ZmU3RhdHVzLCBFbWVyZ2VuY3lFdmVudC5LRVlfRlVFTF9DVVRPRkZfU1RBVFVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9IGV2ZW50IC0gUmVmZXJlbmNlcyBzaWduYWwgXCJWZWRzRXZudFJvbGxfRF9MdGNoZFwiLiBTZWUgVmVoaWNsZURhdGFFdmVudFN0YXR1cy5cbiAgICAgKiBAcmV0dXJuIHtFbWVyZ2VuY3lFdmVudH1cbiAgICAgKi9cbiAgICBzZXRSb2xsb3ZlckV2ZW50IChldmVudCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBldmVudCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEVtZXJnZW5jeUV2ZW50LktFWV9ST0xMT1ZFUl9FVkVOVCwgZXZlbnQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YUV2ZW50U3RhdHVzfVxuICAgICAqL1xuICAgIGdldFJvbGxvdmVyRXZlbnQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFFdmVudFN0YXR1cywgRW1lcmdlbmN5RXZlbnQuS0VZX1JPTExPVkVSX0VWRU5UKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdmVsb2NpdHkgLSBSZWZlcmVuY2VzIHNpZ25hbCBcIlZlZHNNYXhEZWx0YVZfRF9MdGNoZFwiLiBDaGFuZ2UgaW4gdmVsb2NpdHkgaW4gS1BILiBBZGRpdGlvbmFsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgdmFsdWVzOiAweDAwIE5vIGV2ZW50IDB4RkUgTm90IHN1cHBvcnRlZCAweEZGIEZhdWx0XG4gICAgICogQHJldHVybiB7RW1lcmdlbmN5RXZlbnR9XG4gICAgICovXG4gICAgc2V0TWF4aW11bUNoYW5nZVZlbG9jaXR5ICh2ZWxvY2l0eSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihFbWVyZ2VuY3lFdmVudC5LRVlfTUFYSU1VTV9DSEFOR0VfVkVMT0NJVFksIHZlbG9jaXR5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldE1heGltdW1DaGFuZ2VWZWxvY2l0eSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihFbWVyZ2VuY3lFdmVudC5LRVlfTUFYSU1VTV9DSEFOR0VfVkVMT0NJVFkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFFdmVudFN0YXR1c30gZXZlbnRzIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJWZWRzTXVsdGlFdm50X0RfTHRjaGRcIi4gU2VlIFZlaGljbGVEYXRhRXZlbnRTdGF0dXMuXG4gICAgICogQHJldHVybiB7RW1lcmdlbmN5RXZlbnR9XG4gICAgICovXG4gICAgc2V0TXVsdGlwbGVFdmVudHMgKGV2ZW50cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBldmVudHMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihFbWVyZ2VuY3lFdmVudC5LRVlfTVVMVElQTEVfRVZFTlRTLCBldmVudHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YUV2ZW50U3RhdHVzfVxuICAgICAqL1xuICAgIGdldE11bHRpcGxlRXZlbnRzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIEVtZXJnZW5jeUV2ZW50LktFWV9NVUxUSVBMRV9FVkVOVFMpO1xuICAgIH1cbn1cblxuRW1lcmdlbmN5RXZlbnQuS0VZX0VNRVJHRU5DWV9FVkVOVF9UWVBFID0gJ2VtZXJnZW5jeUV2ZW50VHlwZSc7XG5FbWVyZ2VuY3lFdmVudC5LRVlfRlVFTF9DVVRPRkZfU1RBVFVTID0gJ2Z1ZWxDdXRvZmZTdGF0dXMnO1xuRW1lcmdlbmN5RXZlbnQuS0VZX1JPTExPVkVSX0VWRU5UID0gJ3JvbGxvdmVyRXZlbnQnO1xuRW1lcmdlbmN5RXZlbnQuS0VZX01BWElNVU1fQ0hBTkdFX1ZFTE9DSVRZID0gJ21heGltdW1DaGFuZ2VWZWxvY2l0eSc7XG5FbWVyZ2VuY3lFdmVudC5LRVlfTVVMVElQTEVfRVZFTlRTID0gJ211bHRpcGxlRXZlbnRzJztcblxuZXhwb3J0IHsgRW1lcmdlbmN5RXZlbnQgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBFbnVtZXJhdGlvbiB0aGF0IGRlc2NyaWJlcyB0aGUgc3RhdHVzIG9mIHRoZSB0dXJuIGxpZ2h0IGluZGljYXRvci5cbiAqIEB0eXBlZGVmIHtFbnVtfSBUdXJuU2lnbmFsXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBUdXJuU2lnbmFsIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFR1cm4gc2lnbmFsIGlzIE9GRlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9GRiAoKSB7XG4gICAgICAgIHJldHVybiBUdXJuU2lnbmFsLl9NQVAuT0ZGO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExlZnQgdHVybiBzaWduYWwgaXMgb25cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBMRUZUICgpIHtcbiAgICAgICAgcmV0dXJuIFR1cm5TaWduYWwuX01BUC5MRUZUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJpZ2h0IHR1cm4gc2lnbmFsIGlzIG9uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUklHSFQgKCkge1xuICAgICAgICByZXR1cm4gVHVyblNpZ25hbC5fTUFQLlJJR0hUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJvdGggc2lnbmFscyAobGVmdCBhbmQgcmlnaHQpIGFyZSBvbi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBCT1RIICgpIHtcbiAgICAgICAgcmV0dXJuIFR1cm5TaWduYWwuX01BUC5CT1RIO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFR1cm5TaWduYWwuX3ZhbHVlRm9yS2V5KGtleSwgVHVyblNpZ25hbC5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFR1cm5TaWduYWwuX2tleUZvclZhbHVlKHZhbHVlLCBUdXJuU2lnbmFsLl9NQVApO1xuICAgIH1cbn1cblxuVHVyblNpZ25hbC5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ09GRic6ICdPRkYnLFxuICAgICdMRUZUJzogJ0xFRlQnLFxuICAgICdSSUdIVCc6ICdSSUdIVCcsXG4gICAgJ0JPVEgnOiAnQk9USCcsXG59KTtcblxuZXhwb3J0IHsgVHVyblNpZ25hbCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIFJlZmxlY3RzIHRoZSBzdGF0dXMgb2YgdGhlIGFtYmllbnQgbGlnaHQgc2Vuc29yLlxuICogQHR5cGVkZWYge0VudW19IEFtYmllbnRMaWdodFN0YXR1c1xuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgQW1iaWVudExpZ2h0U3RhdHVzIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5JR0hUICgpIHtcbiAgICAgICAgcmV0dXJuIEFtYmllbnRMaWdodFN0YXR1cy5fTUFQLk5JR0hUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRXSUxJR0hUXzEgKCkge1xuICAgICAgICByZXR1cm4gQW1iaWVudExpZ2h0U3RhdHVzLl9NQVAuVFdJTElHSFRfMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBUV0lMSUdIVF8yICgpIHtcbiAgICAgICAgcmV0dXJuIEFtYmllbnRMaWdodFN0YXR1cy5fTUFQLlRXSUxJR0hUXzI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVFdJTElHSFRfMyAoKSB7XG4gICAgICAgIHJldHVybiBBbWJpZW50TGlnaHRTdGF0dXMuX01BUC5UV0lMSUdIVF8zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRXSUxJR0hUXzQgKCkge1xuICAgICAgICByZXR1cm4gQW1iaWVudExpZ2h0U3RhdHVzLl9NQVAuVFdJTElHSFRfNDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBEQVkgKCkge1xuICAgICAgICByZXR1cm4gQW1iaWVudExpZ2h0U3RhdHVzLl9NQVAuREFZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEFMU19VTktOT1dOICgpIHtcbiAgICAgICAgcmV0dXJuIEFtYmllbnRMaWdodFN0YXR1cy5fTUFQLkFMU19VTktOT1dOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IElOVkFMSUQgKCkge1xuICAgICAgICByZXR1cm4gQW1iaWVudExpZ2h0U3RhdHVzLl9NQVAuSU5WQUxJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBBbWJpZW50TGlnaHRTdGF0dXMuX3ZhbHVlRm9yS2V5KGtleSwgQW1iaWVudExpZ2h0U3RhdHVzLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gQW1iaWVudExpZ2h0U3RhdHVzLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgQW1iaWVudExpZ2h0U3RhdHVzLl9NQVApO1xuICAgIH1cbn1cblxuQW1iaWVudExpZ2h0U3RhdHVzLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnTklHSFQnOiAnTklHSFQnLFxuICAgICdUV0lMSUdIVF8xJzogJ1RXSUxJR0hUXzEnLFxuICAgICdUV0lMSUdIVF8yJzogJ1RXSUxJR0hUXzInLFxuICAgICdUV0lMSUdIVF8zJzogJ1RXSUxJR0hUXzMnLFxuICAgICdUV0lMSUdIVF80JzogJ1RXSUxJR0hUXzQnLFxuICAgICdEQVknOiAnREFZJyxcbiAgICAnQUxTX1VOS05PV04nOiAnVU5LTk9XTicsXG4gICAgJ0lOVkFMSUQnOiAnSU5WQUxJRCcsXG59KTtcblxuZXhwb3J0IHsgQW1iaWVudExpZ2h0U3RhdHVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IEFtYmllbnRMaWdodFN0YXR1cyB9IGZyb20gJy4uL2VudW1zL0FtYmllbnRMaWdodFN0YXR1cy5qcyc7XG5cbmNsYXNzIEhlYWRMYW1wU3RhdHVzIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG9uIC0gU3RhdHVzIG9mIHRoZSBsb3cgYmVhbSBsYW1wcy4gUmVmZXJlbmNlcyBzaWduYWwgXCJIZWFkTGFtcExvQWN0dl9CX1N0YXRcIi5cbiAgICAgKiBAcmV0dXJuIHtIZWFkTGFtcFN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRMb3dCZWFtc09uIChvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihIZWFkTGFtcFN0YXR1cy5LRVlfTE9XX0JFQU1TX09OLCBvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0TG93QmVhbXNPbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihIZWFkTGFtcFN0YXR1cy5LRVlfTE9XX0JFQU1TX09OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG9uIC0gU3RhdHVzIG9mIHRoZSBoaWdoIGJlYW0gbGFtcHMuIFJlZmVyZW5jZXMgc2lnbmFsIFwiSGVhZExnaHRIaU9uX0JfU3RhdFwiLlxuICAgICAqIEByZXR1cm4ge0hlYWRMYW1wU3RhdHVzfVxuICAgICAqL1xuICAgIHNldEhpZ2hCZWFtc09uIChvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihIZWFkTGFtcFN0YXR1cy5LRVlfSElHSF9CRUFNU19PTiwgb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEhpZ2hCZWFtc09uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEhlYWRMYW1wU3RhdHVzLktFWV9ISUdIX0JFQU1TX09OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FtYmllbnRMaWdodFN0YXR1c30gc3RhdHVzIC0gU3RhdHVzIG9mIHRoZSBhbWJpZW50IGxpZ2h0IHNlbnNvci5cbiAgICAgKiBAcmV0dXJuIHtIZWFkTGFtcFN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRBbWJpZW50TGlnaHRTZW5zb3JTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShBbWJpZW50TGlnaHRTdGF0dXMsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEhlYWRMYW1wU3RhdHVzLktFWV9BTUJJRU5UX0xJR0hUX1NFTlNPUl9TVEFUVVMsIHN0YXR1cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0FtYmllbnRMaWdodFN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRBbWJpZW50TGlnaHRTZW5zb3JTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQW1iaWVudExpZ2h0U3RhdHVzLCBIZWFkTGFtcFN0YXR1cy5LRVlfQU1CSUVOVF9MSUdIVF9TRU5TT1JfU1RBVFVTKTtcbiAgICB9XG59XG5cbkhlYWRMYW1wU3RhdHVzLktFWV9MT1dfQkVBTVNfT04gPSAnbG93QmVhbXNPbic7XG5IZWFkTGFtcFN0YXR1cy5LRVlfSElHSF9CRUFNU19PTiA9ICdoaWdoQmVhbXNPbic7XG5IZWFkTGFtcFN0YXR1cy5LRVlfQU1CSUVOVF9MSUdIVF9TRU5TT1JfU1RBVFVTID0gJ2FtYmllbnRMaWdodFNlbnNvclN0YXR1cyc7XG5cbmV4cG9ydCB7IEhlYWRMYW1wU3RhdHVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogUmVmbGVjdHMgdGhlIGN1cnJlbnQgcHJpbWFyeSBhdWRpbyBzb3VyY2UgKGlmIHNlbGVjdGVkKS5cbiAqIEB0eXBlZGVmIHtFbnVtfSBQcmltYXJ5QXVkaW9Tb3VyY2VcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFByaW1hcnlBdWRpb1NvdXJjZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOT19TT1VSQ0VfU0VMRUNURUQgKCkge1xuICAgICAgICByZXR1cm4gUHJpbWFyeUF1ZGlvU291cmNlLl9NQVAuTk9fU09VUkNFX1NFTEVDVEVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENEICgpIHtcbiAgICAgICAgcmV0dXJuIFByaW1hcnlBdWRpb1NvdXJjZS5fTUFQLkNEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVTQiAoKSB7XG4gICAgICAgIHJldHVybiBQcmltYXJ5QXVkaW9Tb3VyY2UuX01BUC5VU0I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVVNCMiAoKSB7XG4gICAgICAgIHJldHVybiBQcmltYXJ5QXVkaW9Tb3VyY2UuX01BUC5VU0IyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEJMVUVUT09USF9TVEVSRU9fQlRTVCAoKSB7XG4gICAgICAgIHJldHVybiBQcmltYXJ5QXVkaW9Tb3VyY2UuX01BUC5CTFVFVE9PVEhfU1RFUkVPX0JUU1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTElORV9JTiAoKSB7XG4gICAgICAgIHJldHVybiBQcmltYXJ5QXVkaW9Tb3VyY2UuX01BUC5MSU5FX0lOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IElQT0QgKCkge1xuICAgICAgICByZXR1cm4gUHJpbWFyeUF1ZGlvU291cmNlLl9NQVAuSVBPRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBNT0JJTEVfQVBQICgpIHtcbiAgICAgICAgcmV0dXJuIFByaW1hcnlBdWRpb1NvdXJjZS5fTUFQLk1PQklMRV9BUFA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQU0gKCkge1xuICAgICAgICByZXR1cm4gUHJpbWFyeUF1ZGlvU291cmNlLl9NQVAuQU07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRk0gKCkge1xuICAgICAgICByZXR1cm4gUHJpbWFyeUF1ZGlvU291cmNlLl9NQVAuRk07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgWE0gKCkge1xuICAgICAgICByZXR1cm4gUHJpbWFyeUF1ZGlvU291cmNlLl9NQVAuWE07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgREFCICgpIHtcbiAgICAgICAgcmV0dXJuIFByaW1hcnlBdWRpb1NvdXJjZS5fTUFQLkRBQjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBQcmltYXJ5QXVkaW9Tb3VyY2UuX3ZhbHVlRm9yS2V5KGtleSwgUHJpbWFyeUF1ZGlvU291cmNlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gUHJpbWFyeUF1ZGlvU291cmNlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgUHJpbWFyeUF1ZGlvU291cmNlLl9NQVApO1xuICAgIH1cbn1cblxuUHJpbWFyeUF1ZGlvU291cmNlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnTk9fU09VUkNFX1NFTEVDVEVEJzogJ05PX1NPVVJDRV9TRUxFQ1RFRCcsXG4gICAgJ0NEJzogJ0NEJyxcbiAgICAnVVNCJzogJ1VTQicsXG4gICAgJ1VTQjInOiAnVVNCMicsXG4gICAgJ0JMVUVUT09USF9TVEVSRU9fQlRTVCc6ICdCTFVFVE9PVEhfU1RFUkVPX0JUU1QnLFxuICAgICdMSU5FX0lOJzogJ0xJTkVfSU4nLFxuICAgICdJUE9EJzogJ0lQT0QnLFxuICAgICdNT0JJTEVfQVBQJzogJ01PQklMRV9BUFAnLFxuICAgICdBTSc6ICdBTScsXG4gICAgJ0ZNJzogJ0ZNJyxcbiAgICAnWE0nOiAnWE0nLFxuICAgICdEQUInOiAnREFCJyxcbn0pO1xuXG5leHBvcnQgeyBQcmltYXJ5QXVkaW9Tb3VyY2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBSZWZsZWN0cyB0aGUgcmVwb3J0ZWQgYmF0dGVyeSBzdGF0dXMgb2YgdGhlIGNvbm5lY3RlZCBkZXZpY2UsIGlmIHJlcG9ydGVkLlxuICogQHR5cGVkZWYge0VudW19IERldmljZUxldmVsU3RhdHVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBEZXZpY2VMZXZlbFN0YXR1cyBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBaRVJPX0xFVkVMX0JBUlMgKCkge1xuICAgICAgICByZXR1cm4gRGV2aWNlTGV2ZWxTdGF0dXMuX01BUC5aRVJPX0xFVkVMX0JBUlM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgT05FX0xFVkVMX0JBUlMgKCkge1xuICAgICAgICByZXR1cm4gRGV2aWNlTGV2ZWxTdGF0dXMuX01BUC5PTkVfTEVWRUxfQkFSUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBUV09fTEVWRUxfQkFSUyAoKSB7XG4gICAgICAgIHJldHVybiBEZXZpY2VMZXZlbFN0YXR1cy5fTUFQLlRXT19MRVZFTF9CQVJTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRIUkVFX0xFVkVMX0JBUlMgKCkge1xuICAgICAgICByZXR1cm4gRGV2aWNlTGV2ZWxTdGF0dXMuX01BUC5USFJFRV9MRVZFTF9CQVJTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZPVVJfTEVWRUxfQkFSUyAoKSB7XG4gICAgICAgIHJldHVybiBEZXZpY2VMZXZlbFN0YXR1cy5fTUFQLkZPVVJfTEVWRUxfQkFSUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOT1RfUFJPVklERUQgKCkge1xuICAgICAgICByZXR1cm4gRGV2aWNlTGV2ZWxTdGF0dXMuX01BUC5OT1RfUFJPVklERUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gRGV2aWNlTGV2ZWxTdGF0dXMuX3ZhbHVlRm9yS2V5KGtleSwgRGV2aWNlTGV2ZWxTdGF0dXMuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBEZXZpY2VMZXZlbFN0YXR1cy5fa2V5Rm9yVmFsdWUodmFsdWUsIERldmljZUxldmVsU3RhdHVzLl9NQVApO1xuICAgIH1cbn1cblxuRGV2aWNlTGV2ZWxTdGF0dXMuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdaRVJPX0xFVkVMX0JBUlMnOiAnWkVST19MRVZFTF9CQVJTJyxcbiAgICAnT05FX0xFVkVMX0JBUlMnOiAnT05FX0xFVkVMX0JBUlMnLFxuICAgICdUV09fTEVWRUxfQkFSUyc6ICdUV09fTEVWRUxfQkFSUycsXG4gICAgJ1RIUkVFX0xFVkVMX0JBUlMnOiAnVEhSRUVfTEVWRUxfQkFSUycsXG4gICAgJ0ZPVVJfTEVWRUxfQkFSUyc6ICdGT1VSX0xFVkVMX0JBUlMnLFxuICAgICdOT1RfUFJPVklERUQnOiAnTk9UX1BST1ZJREVEJyxcbn0pO1xuXG5leHBvcnQgeyBEZXZpY2VMZXZlbFN0YXR1cyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBQcmltYXJ5QXVkaW9Tb3VyY2UgfSBmcm9tICcuLi9lbnVtcy9QcmltYXJ5QXVkaW9Tb3VyY2UuanMnO1xuaW1wb3J0IHsgRGV2aWNlTGV2ZWxTdGF0dXMgfSBmcm9tICcuLi9lbnVtcy9EZXZpY2VMZXZlbFN0YXR1cy5qcyc7XG5cbmNsYXNzIERldmljZVN0YXR1cyBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBvbiAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiQ1BNX1ZvaWNlUmVjX1NUQVRcIi5cbiAgICAgKiBAcmV0dXJuIHtEZXZpY2VTdGF0dXN9XG4gICAgICovXG4gICAgc2V0Vm9pY2VSZWNPbiAob24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGV2aWNlU3RhdHVzLktFWV9WT0lDRV9SRUNfT04sIG9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRWb2ljZVJlY09uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERldmljZVN0YXR1cy5LRVlfVk9JQ0VfUkVDX09OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG9uIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJCVF9JQ09OXCIuXG4gICAgICogQHJldHVybiB7RGV2aWNlU3RhdHVzfVxuICAgICAqL1xuICAgIHNldEJ0SWNvbk9uIChvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEZXZpY2VTdGF0dXMuS0VZX0JUX0lDT05fT04sIG9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRCdEljb25PbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEZXZpY2VTdGF0dXMuS0VZX0JUX0lDT05fT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWN0aXZlIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJDUE1fQ2FsbF9BY3RpdmVfU1RBVFwiLlxuICAgICAqIEByZXR1cm4ge0RldmljZVN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRDYWxsQWN0aXZlIChhY3RpdmUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGV2aWNlU3RhdHVzLktFWV9DQUxMX0FDVElWRSwgYWN0aXZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRDYWxsQWN0aXZlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERldmljZVN0YXR1cy5LRVlfQ0FMTF9BQ1RJVkUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcm9hbWluZyAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiQ1BNX1Bob25lX1JvYW1pbmdfU1RBVFwiLlxuICAgICAqIEByZXR1cm4ge0RldmljZVN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRQaG9uZVJvYW1pbmcgKHJvYW1pbmcpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGV2aWNlU3RhdHVzLktFWV9QSE9ORV9ST0FNSU5HLCByb2FtaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRQaG9uZVJvYW1pbmcgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGV2aWNlU3RhdHVzLktFWV9QSE9ORV9ST0FNSU5HKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiQ1BNX1RleHRNc2dfQVZBTFwiLlxuICAgICAqIEByZXR1cm4ge0RldmljZVN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRUZXh0TXNnQXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGV2aWNlU3RhdHVzLktFWV9URVhUX01TR19BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0VGV4dE1zZ0F2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEZXZpY2VTdGF0dXMuS0VZX1RFWFRfTVNHX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtEZXZpY2VMZXZlbFN0YXR1c30gc3RhdHVzIC0gRGV2aWNlIGJhdHRlcnkgbGV2ZWwgc3RhdHVzLiBSZWZlcmVuY2VzIHNpZ25hbCBcIkNQTV9CYXR0X0xldmVsX1NUQVRcIi4gU2VlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlTGV2ZWxTdGF0dXMuXG4gICAgICogQHJldHVybiB7RGV2aWNlU3RhdHVzfVxuICAgICAqL1xuICAgIHNldEJhdHRMZXZlbFN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKERldmljZUxldmVsU3RhdHVzLCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEZXZpY2VTdGF0dXMuS0VZX0JBVFRfTEVWRUxfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtEZXZpY2VMZXZlbFN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRCYXR0TGV2ZWxTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoRGV2aWNlTGV2ZWxTdGF0dXMsIERldmljZVN0YXR1cy5LRVlfQkFUVF9MRVZFTF9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbXV0ZWQgLSBSZWZlcmVuY2VzIHNpZ25hbCBcIkNQTV9TdGVyZW9fQXVkaW9fT3V0cHV0XCIuXG4gICAgICogQHJldHVybiB7RGV2aWNlU3RhdHVzfVxuICAgICAqL1xuICAgIHNldFN0ZXJlb0F1ZGlvT3V0cHV0TXV0ZWQgKG11dGVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERldmljZVN0YXR1cy5LRVlfU1RFUkVPX0FVRElPX09VVFBVVF9NVVRFRCwgbXV0ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFN0ZXJlb0F1ZGlvT3V0cHV0TXV0ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGV2aWNlU3RhdHVzLktFWV9TVEVSRU9fQVVESU9fT1VUUFVUX01VVEVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG11dGVkIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJDUE1fTW9ub19BdWRpb19PdXRwdXRcIi5cbiAgICAgKiBAcmV0dXJuIHtEZXZpY2VTdGF0dXN9XG4gICAgICovXG4gICAgc2V0TW9ub0F1ZGlvT3V0cHV0TXV0ZWQgKG11dGVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERldmljZVN0YXR1cy5LRVlfTU9OT19BVURJT19PVVRQVVRfTVVURUQsIG11dGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRNb25vQXVkaW9PdXRwdXRNdXRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEZXZpY2VTdGF0dXMuS0VZX01PTk9fQVVESU9fT1VUUFVUX01VVEVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0RldmljZUxldmVsU3RhdHVzfSBzdGF0dXMgLSBEZXZpY2Ugc2lnbmFsIGxldmVsIHN0YXR1cy4gUmVmZXJlbmNlcyBzaWduYWwgXCJDUE1fU2lnbmFsX1N0cmVuZ3RoX1NUQVRcIi4gU2VlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlTGV2ZWxTdGF0dXMuXG4gICAgICogQHJldHVybiB7RGV2aWNlU3RhdHVzfVxuICAgICAqL1xuICAgIHNldFNpZ25hbExldmVsU3RhdHVzIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoRGV2aWNlTGV2ZWxTdGF0dXMsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERldmljZVN0YXR1cy5LRVlfU0lHTkFMX0xFVkVMX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7RGV2aWNlTGV2ZWxTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0U2lnbmFsTGV2ZWxTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoRGV2aWNlTGV2ZWxTdGF0dXMsIERldmljZVN0YXR1cy5LRVlfU0lHTkFMX0xFVkVMX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtQcmltYXJ5QXVkaW9Tb3VyY2V9IHNvdXJjZSAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiQ1BNX1N0ZXJlb19QQVNfU291cmNlXCIuIFNlZSBQcmltYXJ5QXVkaW9Tb3VyY2UuXG4gICAgICogQHJldHVybiB7RGV2aWNlU3RhdHVzfVxuICAgICAqL1xuICAgIHNldFByaW1hcnlBdWRpb1NvdXJjZSAoc291cmNlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFByaW1hcnlBdWRpb1NvdXJjZSwgc291cmNlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGV2aWNlU3RhdHVzLktFWV9QUklNQVJZX0FVRElPX1NPVVJDRSwgc291cmNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7UHJpbWFyeUF1ZGlvU291cmNlfVxuICAgICAqL1xuICAgIGdldFByaW1hcnlBdWRpb1NvdXJjZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChQcmltYXJ5QXVkaW9Tb3VyY2UsIERldmljZVN0YXR1cy5LRVlfUFJJTUFSWV9BVURJT19TT1VSQ0UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWN0aXZlIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJlQ2FsbF9FdmVudFwiLlxuICAgICAqIEByZXR1cm4ge0RldmljZVN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRFQ2FsbEV2ZW50QWN0aXZlIChhY3RpdmUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGV2aWNlU3RhdHVzLktFWV9FX0NBTExfRVZFTlRfQUNUSVZFLCBhY3RpdmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEVDYWxsRXZlbnRBY3RpdmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGV2aWNlU3RhdHVzLktFWV9FX0NBTExfRVZFTlRfQUNUSVZFKTtcbiAgICB9XG59XG5cbkRldmljZVN0YXR1cy5LRVlfVk9JQ0VfUkVDX09OID0gJ3ZvaWNlUmVjT24nO1xuRGV2aWNlU3RhdHVzLktFWV9CVF9JQ09OX09OID0gJ2J0SWNvbk9uJztcbkRldmljZVN0YXR1cy5LRVlfQ0FMTF9BQ1RJVkUgPSAnY2FsbEFjdGl2ZSc7XG5EZXZpY2VTdGF0dXMuS0VZX1BIT05FX1JPQU1JTkcgPSAncGhvbmVSb2FtaW5nJztcbkRldmljZVN0YXR1cy5LRVlfVEVYVF9NU0dfQVZBSUxBQkxFID0gJ3RleHRNc2dBdmFpbGFibGUnO1xuRGV2aWNlU3RhdHVzLktFWV9CQVRUX0xFVkVMX1NUQVRVUyA9ICdiYXR0TGV2ZWxTdGF0dXMnO1xuRGV2aWNlU3RhdHVzLktFWV9TVEVSRU9fQVVESU9fT1VUUFVUX01VVEVEID0gJ3N0ZXJlb0F1ZGlvT3V0cHV0TXV0ZWQnO1xuRGV2aWNlU3RhdHVzLktFWV9NT05PX0FVRElPX09VVFBVVF9NVVRFRCA9ICdtb25vQXVkaW9PdXRwdXRNdXRlZCc7XG5EZXZpY2VTdGF0dXMuS0VZX1NJR05BTF9MRVZFTF9TVEFUVVMgPSAnc2lnbmFsTGV2ZWxTdGF0dXMnO1xuRGV2aWNlU3RhdHVzLktFWV9QUklNQVJZX0FVRElPX1NPVVJDRSA9ICdwcmltYXJ5QXVkaW9Tb3VyY2UnO1xuRGV2aWNlU3RhdHVzLktFWV9FX0NBTExfRVZFTlRfQUNUSVZFID0gJ2VDYWxsRXZlbnRBY3RpdmUnO1xuXG5leHBvcnQgeyBEZXZpY2VTdGF0dXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBSZWZsZWN0cyB0aGUgc3RhdHVzIG9mIHRoZSB3aXBlcnMuXG4gKiBAdHlwZWRlZiB7RW51bX0gV2lwZXJTdGF0dXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFdpcGVyU3RhdHVzIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9GRiAoKSB7XG4gICAgICAgIHJldHVybiBXaXBlclN0YXR1cy5fTUFQLk9GRjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBVVRPX09GRiAoKSB7XG4gICAgICAgIHJldHVybiBXaXBlclN0YXR1cy5fTUFQLkFVVE9fT0ZGO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9GRl9NT1ZJTkcgKCkge1xuICAgICAgICByZXR1cm4gV2lwZXJTdGF0dXMuX01BUC5PRkZfTU9WSU5HO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE1BTl9JTlRfT0ZGICgpIHtcbiAgICAgICAgcmV0dXJuIFdpcGVyU3RhdHVzLl9NQVAuTUFOX0lOVF9PRkY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTUFOX0lOVF9PTiAoKSB7XG4gICAgICAgIHJldHVybiBXaXBlclN0YXR1cy5fTUFQLk1BTl9JTlRfT047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTUFOX0xPVyAoKSB7XG4gICAgICAgIHJldHVybiBXaXBlclN0YXR1cy5fTUFQLk1BTl9MT1c7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTUFOX0hJR0ggKCkge1xuICAgICAgICByZXR1cm4gV2lwZXJTdGF0dXMuX01BUC5NQU5fSElHSDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBNQU5fRkxJQ0sgKCkge1xuICAgICAgICByZXR1cm4gV2lwZXJTdGF0dXMuX01BUC5NQU5fRkxJQ0s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgV0FTSCAoKSB7XG4gICAgICAgIHJldHVybiBXaXBlclN0YXR1cy5fTUFQLldBU0g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQVVUT19MT1cgKCkge1xuICAgICAgICByZXR1cm4gV2lwZXJTdGF0dXMuX01BUC5BVVRPX0xPVztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBVVRPX0hJR0ggKCkge1xuICAgICAgICByZXR1cm4gV2lwZXJTdGF0dXMuX01BUC5BVVRPX0hJR0g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ09VUlRFU1lXSVBFICgpIHtcbiAgICAgICAgcmV0dXJuIFdpcGVyU3RhdHVzLl9NQVAuQ09VUlRFU1lXSVBFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEFVVE9fQURKVVNUICgpIHtcbiAgICAgICAgcmV0dXJuIFdpcGVyU3RhdHVzLl9NQVAuQVVUT19BREpVU1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU1RBTExFRCAoKSB7XG4gICAgICAgIHJldHVybiBXaXBlclN0YXR1cy5fTUFQLlNUQUxMRUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTk9fREFUQV9FWElTVFMgKCkge1xuICAgICAgICByZXR1cm4gV2lwZXJTdGF0dXMuX01BUC5OT19EQVRBX0VYSVNUUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBXaXBlclN0YXR1cy5fdmFsdWVGb3JLZXkoa2V5LCBXaXBlclN0YXR1cy5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFdpcGVyU3RhdHVzLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgV2lwZXJTdGF0dXMuX01BUCk7XG4gICAgfVxufVxuXG5XaXBlclN0YXR1cy5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ09GRic6ICdPRkYnLFxuICAgICdBVVRPX09GRic6ICdBVVRPX09GRicsXG4gICAgJ09GRl9NT1ZJTkcnOiAnT0ZGX01PVklORycsXG4gICAgJ01BTl9JTlRfT0ZGJzogJ01BTl9JTlRfT0ZGJyxcbiAgICAnTUFOX0lOVF9PTic6ICdNQU5fSU5UX09OJyxcbiAgICAnTUFOX0xPVyc6ICdNQU5fTE9XJyxcbiAgICAnTUFOX0hJR0gnOiAnTUFOX0hJR0gnLFxuICAgICdNQU5fRkxJQ0snOiAnTUFOX0ZMSUNLJyxcbiAgICAnV0FTSCc6ICdXQVNIJyxcbiAgICAnQVVUT19MT1cnOiAnQVVUT19MT1cnLFxuICAgICdBVVRPX0hJR0gnOiAnQVVUT19ISUdIJyxcbiAgICAnQ09VUlRFU1lXSVBFJzogJ0NPVVJURVNZV0lQRScsXG4gICAgJ0FVVE9fQURKVVNUJzogJ0FVVE9fQURKVVNUJyxcbiAgICAnU1RBTExFRCc6ICdTVEFMTEVEJyxcbiAgICAnTk9fREFUQV9FWElTVFMnOiAnTk9fREFUQV9FWElTVFMnLFxufSk7XG5cbmV4cG9ydCB7IFdpcGVyU3RhdHVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IEVsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIEVsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyayBicmFrZSBhY3R1YXRvcnMgaGF2ZSBiZWVuIGZ1bGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ0xPU0VEICgpIHtcbiAgICAgICAgcmV0dXJuIEVsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMuX01BUC5DTE9TRUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyayBicmFrZSBhY3R1YXRvcnMgYXJlIHRyYW5zaXRpb25pbmcgdG8gZWl0aGVyIEFwcGx5L0Nsb3NlZCBvciBSZWxlYXNlL09wZW4gc3RhdGUuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVFJBTlNJVElPTiAoKSB7XG4gICAgICAgIHJldHVybiBFbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzLl9NQVAuVFJBTlNJVElPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJrIGJyYWtlIGFjdHVhdG9ycyBhcmUgcmVsZWFzZWQuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgT1BFTiAoKSB7XG4gICAgICAgIHJldHVybiBFbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzLl9NQVAuT1BFTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIGRyaXZlciBwdWxscyB0aGUgRWxlY3Ryb25pYyBQYXJrIEJyYWtlIHN3aXRjaCB3aGlsZSBkcml2aW5nIFwiYXQgc3BlZWRcIi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBEUklWRV9BQ1RJVkUgKCkge1xuICAgICAgICByZXR1cm4gRWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cy5fTUFQLkRSSVZFX0FDVElWRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIHN5c3RlbSBoYXMgYSBmYXVsdCBvciBpcyB1bmRlciBtYWludGVuYW5jZS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGQVVMVCAoKSB7XG4gICAgICAgIHJldHVybiBFbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzLl9NQVAuRkFVTFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gRWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cy5fdmFsdWVGb3JLZXkoa2V5LCBFbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gRWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cy5fa2V5Rm9yVmFsdWUodmFsdWUsIEVsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMuX01BUCk7XG4gICAgfVxufVxuXG5FbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnQ0xPU0VEJzogJ0NMT1NFRCcsXG4gICAgJ1RSQU5TSVRJT04nOiAnVFJBTlNJVElPTicsXG4gICAgJ09QRU4nOiAnT1BFTicsXG4gICAgJ0RSSVZFX0FDVElWRSc6ICdEUklWRV9BQ1RJVkUnLFxuICAgICdGQVVMVCc6ICdGQVVMVCcsXG59KTtcblxuZXhwb3J0IHsgRWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIFJlZmxlY3RzIHRoZSBzdGF0dXMgb2YgYSBiaW5hcnkgdmVoaWNsZSBkYXRhIGl0ZW0uXG4gKiBAdHlwZWRlZiB7RW51bX0gVmVoaWNsZURhdGFTdGF0dXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFZlaGljbGVEYXRhU3RhdHVzIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZEU19OT19EQVRBX0VYSVNUUyAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVN0YXR1cy5fTUFQLlZEU19OT19EQVRBX0VYSVNUUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRFNfT0ZGICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhU3RhdHVzLl9NQVAuVkRTX09GRjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRFNfT04gKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFTdGF0dXMuX01BUC5WRFNfT047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFTdGF0dXMuX3ZhbHVlRm9yS2V5KGtleSwgVmVoaWNsZURhdGFTdGF0dXMuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YVN0YXR1cy5fa2V5Rm9yVmFsdWUodmFsdWUsIFZlaGljbGVEYXRhU3RhdHVzLl9NQVApO1xuICAgIH1cbn1cblxuVmVoaWNsZURhdGFTdGF0dXMuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdWRFNfTk9fREFUQV9FWElTVFMnOiAnTk9fREFUQV9FWElTVFMnLFxuICAgICdWRFNfT0ZGJzogJ09GRicsXG4gICAgJ1ZEU19PTic6ICdPTicsXG59KTtcblxuZXhwb3J0IHsgVmVoaWNsZURhdGFTdGF0dXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgVmVoaWNsZURhdGFTdGF0dXMgfSBmcm9tICcuLi9lbnVtcy9WZWhpY2xlRGF0YVN0YXR1cy5qcyc7XG5cbmNsYXNzIE15S2V5IGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhU3RhdHVzfSBlOTExb3ZlcnJpZGUgLSBJbmRpY2F0ZXMgd2hldGhlciBlOTExIG92ZXJyaWRlIGlzIG9uLiBSZWZlcmVuY2VzIHNpZ25hbFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiTXlLZXlfZTkxMU92ZXJyaWRlX1N0XCIuIFNlZSBWZWhpY2xlRGF0YVN0YXR1cy5cbiAgICAgKiBAcmV0dXJuIHtNeUtleX1cbiAgICAgKi9cbiAgICBzZXRFOTExT3ZlcnJpZGUgKGU5MTFvdmVycmlkZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YVN0YXR1cywgZTkxMW92ZXJyaWRlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTXlLZXkuS0VZX0U5MTFPVkVSUklERSwgZTkxMW92ZXJyaWRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0RTkxMU92ZXJyaWRlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhU3RhdHVzLCBNeUtleS5LRVlfRTkxMU9WRVJSSURFKTtcbiAgICB9XG59XG5cbk15S2V5LktFWV9FOTExT1ZFUlJJREUgPSAnZTkxMU92ZXJyaWRlJztcblxuZXhwb3J0IHsgTXlLZXkgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBUaGUgbGlzdCBvZiBwb3RlbnRpYWwgY29tcGFzcyBkaXJlY3Rpb25zXG4gKiBAdHlwZWRlZiB7RW51bX0gQ29tcGFzc0RpcmVjdGlvblxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgQ29tcGFzc0RpcmVjdGlvbiBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOT1JUSCAoKSB7XG4gICAgICAgIHJldHVybiBDb21wYXNzRGlyZWN0aW9uLl9NQVAuTk9SVEg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTk9SVEhXRVNUICgpIHtcbiAgICAgICAgcmV0dXJuIENvbXBhc3NEaXJlY3Rpb24uX01BUC5OT1JUSFdFU1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgV0VTVCAoKSB7XG4gICAgICAgIHJldHVybiBDb21wYXNzRGlyZWN0aW9uLl9NQVAuV0VTVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTT1VUSFdFU1QgKCkge1xuICAgICAgICByZXR1cm4gQ29tcGFzc0RpcmVjdGlvbi5fTUFQLlNPVVRIV0VTVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTT1VUSCAoKSB7XG4gICAgICAgIHJldHVybiBDb21wYXNzRGlyZWN0aW9uLl9NQVAuU09VVEg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU09VVEhFQVNUICgpIHtcbiAgICAgICAgcmV0dXJuIENvbXBhc3NEaXJlY3Rpb24uX01BUC5TT1VUSEVBU1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRUFTVCAoKSB7XG4gICAgICAgIHJldHVybiBDb21wYXNzRGlyZWN0aW9uLl9NQVAuRUFTVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOT1JUSEVBU1QgKCkge1xuICAgICAgICByZXR1cm4gQ29tcGFzc0RpcmVjdGlvbi5fTUFQLk5PUlRIRUFTVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBDb21wYXNzRGlyZWN0aW9uLl92YWx1ZUZvcktleShrZXksIENvbXBhc3NEaXJlY3Rpb24uX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBDb21wYXNzRGlyZWN0aW9uLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgQ29tcGFzc0RpcmVjdGlvbi5fTUFQKTtcbiAgICB9XG59XG5cbkNvbXBhc3NEaXJlY3Rpb24uX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdOT1JUSCc6ICdOT1JUSCcsXG4gICAgJ05PUlRIV0VTVCc6ICdOT1JUSFdFU1QnLFxuICAgICdXRVNUJzogJ1dFU1QnLFxuICAgICdTT1VUSFdFU1QnOiAnU09VVEhXRVNUJyxcbiAgICAnU09VVEgnOiAnU09VVEgnLFxuICAgICdTT1VUSEVBU1QnOiAnU09VVEhFQVNUJyxcbiAgICAnRUFTVCc6ICdFQVNUJyxcbiAgICAnTk9SVEhFQVNUJzogJ05PUlRIRUFTVCcsXG59KTtcblxuZXhwb3J0IHsgQ29tcGFzc0RpcmVjdGlvbiB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIFRoZSBzdXBwb3J0ZWQgZGltZW5zaW9ucyBvZiB0aGUgR1BTXG4gKiBAdHlwZWRlZiB7RW51bX0gRGltZW5zaW9uXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBEaW1lbnNpb24gZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm8gR1BTIGF0IGFsbFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERpbWVuc2lvbl9OT19GSVggKCkge1xuICAgICAgICByZXR1cm4gRGltZW5zaW9uLl9NQVAuRGltZW5zaW9uX05PX0ZJWDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb25naXR1ZGUgYW5kIGxhdGl0dWRlXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRGltZW5zaW9uXzJEICgpIHtcbiAgICAgICAgcmV0dXJuIERpbWVuc2lvbi5fTUFQLkRpbWVuc2lvbl8yRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb25naXR1ZGUgYW5kIGxhdGl0dWRlIGFuZCBhbHRpdHVkZVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERpbWVuc2lvbl8zRCAoKSB7XG4gICAgICAgIHJldHVybiBEaW1lbnNpb24uX01BUC5EaW1lbnNpb25fM0Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gRGltZW5zaW9uLl92YWx1ZUZvcktleShrZXksIERpbWVuc2lvbi5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIERpbWVuc2lvbi5fa2V5Rm9yVmFsdWUodmFsdWUsIERpbWVuc2lvbi5fTUFQKTtcbiAgICB9XG59XG5cbkRpbWVuc2lvbi5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0RpbWVuc2lvbl9OT19GSVgnOiAnTk9fRklYJyxcbiAgICAnRGltZW5zaW9uXzJEJzogJzJEJyxcbiAgICAnRGltZW5zaW9uXzNEJzogJzNEJyxcbn0pO1xuXG5leHBvcnQgeyBEaW1lbnNpb24gfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgQ29tcGFzc0RpcmVjdGlvbiB9IGZyb20gJy4uL2VudW1zL0NvbXBhc3NEaXJlY3Rpb24uanMnO1xuaW1wb3J0IHsgRGltZW5zaW9uIH0gZnJvbSAnLi4vZW51bXMvRGltZW5zaW9uLmpzJztcblxuLyoqXG4gKiBTdHJ1Y3Qgd2l0aCB0aGUgR1BTIGRhdGEuXG4gKi9cbmNsYXNzIEdQU0RhdGEgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBkZWdyZWVzXG4gICAgICogQHJldHVybiB7R1BTRGF0YX1cbiAgICAgKi9cbiAgICBzZXRMb25naXR1ZGVEZWdyZWVzIChkZWdyZWVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdQU0RhdGEuS0VZX0xPTkdJVFVERV9ERUdSRUVTLCBkZWdyZWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldExvbmdpdHVkZURlZ3JlZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfTE9OR0lUVURFX0RFR1JFRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBkZWdyZWVzXG4gICAgICogQHJldHVybiB7R1BTRGF0YX1cbiAgICAgKi9cbiAgICBzZXRMYXRpdHVkZURlZ3JlZXMgKGRlZ3JlZXMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfTEFUSVRVREVfREVHUkVFUywgZGVncmVlcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRMYXRpdHVkZURlZ3JlZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfTEFUSVRVREVfREVHUkVFUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHllYXIgLSBUaGUgY3VycmVudCBVVEMgeWVhci5cbiAgICAgKiBAcmV0dXJuIHtHUFNEYXRhfVxuICAgICAqL1xuICAgIHNldFV0Y1llYXIgKHllYXIpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfVVRDX1lFQVIsIHllYXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0VXRjWWVhciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHUFNEYXRhLktFWV9VVENfWUVBUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1vbnRoIC0gVGhlIGN1cnJlbnQgVVRDIG1vbnRoLlxuICAgICAqIEByZXR1cm4ge0dQU0RhdGF9XG4gICAgICovXG4gICAgc2V0VXRjTW9udGggKG1vbnRoKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdQU0RhdGEuS0VZX1VUQ19NT05USCwgbW9udGgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0VXRjTW9udGggKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfVVRDX01PTlRIKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZGF5IC0gVGhlIGN1cnJlbnQgVVRDIGRheS5cbiAgICAgKiBAcmV0dXJuIHtHUFNEYXRhfVxuICAgICAqL1xuICAgIHNldFV0Y0RheSAoZGF5KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdQU0RhdGEuS0VZX1VUQ19EQVksIGRheSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRVdGNEYXkgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfVVRDX0RBWSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhvdXJzIC0gVGhlIGN1cnJlbnQgVVRDIGhvdXIuXG4gICAgICogQHJldHVybiB7R1BTRGF0YX1cbiAgICAgKi9cbiAgICBzZXRVdGNIb3VycyAoaG91cnMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfVVRDX0hPVVJTLCBob3Vycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRVdGNIb3VycyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHUFNEYXRhLktFWV9VVENfSE9VUlMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtaW51dGVzIC0gVGhlIGN1cnJlbnQgVVRDIG1pbnV0ZS5cbiAgICAgKiBAcmV0dXJuIHtHUFNEYXRhfVxuICAgICAqL1xuICAgIHNldFV0Y01pbnV0ZXMgKG1pbnV0ZXMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfVVRDX01JTlVURVMsIG1pbnV0ZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0VXRjTWludXRlcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHUFNEYXRhLktFWV9VVENfTUlOVVRFUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNlY29uZHMgLSBUaGUgY3VycmVudCBVVEMgc2Vjb25kLlxuICAgICAqIEByZXR1cm4ge0dQU0RhdGF9XG4gICAgICovXG4gICAgc2V0VXRjU2Vjb25kcyAoc2Vjb25kcykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHUFNEYXRhLktFWV9VVENfU0VDT05EUywgc2Vjb25kcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRVdGNTZWNvbmRzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdQU0RhdGEuS0VZX1VUQ19TRUNPTkRTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0NvbXBhc3NEaXJlY3Rpb259IGRpcmVjdGlvbiAtIFNlZSBDb21wYXNzRGlyZWN0aW9uLlxuICAgICAqIEByZXR1cm4ge0dQU0RhdGF9XG4gICAgICovXG4gICAgc2V0Q29tcGFzc0RpcmVjdGlvbiAoZGlyZWN0aW9uKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKENvbXBhc3NEaXJlY3Rpb24sIGRpcmVjdGlvbik7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdQU0RhdGEuS0VZX0NPTVBBU1NfRElSRUNUSU9OLCBkaXJlY3Rpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtDb21wYXNzRGlyZWN0aW9ufVxuICAgICAqL1xuICAgIGdldENvbXBhc3NEaXJlY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQ29tcGFzc0RpcmVjdGlvbiwgR1BTRGF0YS5LRVlfQ09NUEFTU19ESVJFQ1RJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwZG9wIC0gUERPUC4gSWYgdW5kZWZpbmVkIG9yIHVuYXZhaWxhYmxlLCB0aGVuIHZhbHVlIHNoYWxsIGJlIHNldCB0byAwLlxuICAgICAqIEByZXR1cm4ge0dQU0RhdGF9XG4gICAgICovXG4gICAgc2V0UGRvcCAocGRvcCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHUFNEYXRhLktFWV9QRE9QLCBwZG9wKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFBkb3AgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfUERPUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhkb3AgLSBIRE9QLiBJZiB2YWx1ZSBpcyB1bmtub3duLCB2YWx1ZSBzaGFsbCBiZSBzZXQgdG8gMC5cbiAgICAgKiBAcmV0dXJuIHtHUFNEYXRhfVxuICAgICAqL1xuICAgIHNldEhkb3AgKGhkb3ApIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfSERPUCwgaGRvcCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRIZG9wICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdQU0RhdGEuS0VZX0hET1ApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2ZG9wIC0gVkRPUC4gSWYgdmFsdWUgaXMgdW5rbm93biwgdmFsdWUgc2hhbGwgYmUgc2V0IHRvIDAuXG4gICAgICogQHJldHVybiB7R1BTRGF0YX1cbiAgICAgKi9cbiAgICBzZXRWZG9wICh2ZG9wKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdQU0RhdGEuS0VZX1ZET1AsIHZkb3ApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0VmRvcCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHUFNEYXRhLktFWV9WRE9QKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFjdHVhbCAtIFRydWUsIGlmIGFjdHVhbC4gRmFsc2UsIGlmIGluZmVycmVkLlxuICAgICAqIEByZXR1cm4ge0dQU0RhdGF9XG4gICAgICovXG4gICAgc2V0QWN0dWFsIChhY3R1YWwpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfQUNUVUFMLCBhY3R1YWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEFjdHVhbCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHUFNEYXRhLktFWV9BQ1RVQUwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzYXRlbGxpdGVzIC0gTnVtYmVyIG9mIHNhdGVsbGl0ZXMgaW4gdmlld1xuICAgICAqIEByZXR1cm4ge0dQU0RhdGF9XG4gICAgICovXG4gICAgc2V0U2F0ZWxsaXRlcyAoc2F0ZWxsaXRlcykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHUFNEYXRhLktFWV9TQVRFTExJVEVTLCBzYXRlbGxpdGVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFNhdGVsbGl0ZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfU0FURUxMSVRFUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtEaW1lbnNpb259IGRpbWVuc2lvbiAtIFNlZSBEaW1lbnNpb25cbiAgICAgKiBAcmV0dXJuIHtHUFNEYXRhfVxuICAgICAqL1xuICAgIHNldERpbWVuc2lvbiAoZGltZW5zaW9uKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKERpbWVuc2lvbiwgZGltZW5zaW9uKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfRElNRU5TSU9OLCBkaW1lbnNpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtEaW1lbnNpb259XG4gICAgICovXG4gICAgZ2V0RGltZW5zaW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KERpbWVuc2lvbiwgR1BTRGF0YS5LRVlfRElNRU5TSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYWx0aXR1ZGUgLSBBbHRpdHVkZSBpbiBtZXRlcnNcbiAgICAgKiBAcmV0dXJuIHtHUFNEYXRhfVxuICAgICAqL1xuICAgIHNldEFsdGl0dWRlIChhbHRpdHVkZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHUFNEYXRhLktFWV9BTFRJVFVERSwgYWx0aXR1ZGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0QWx0aXR1ZGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfQUxUSVRVREUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWFkaW5nIC0gVGhlIGhlYWRpbmcuIE5vcnRoIGlzIDAuIFJlc29sdXRpb24gaXMgMC4wMVxuICAgICAqIEByZXR1cm4ge0dQU0RhdGF9XG4gICAgICovXG4gICAgc2V0SGVhZGluZyAoaGVhZGluZykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHUFNEYXRhLktFWV9IRUFESU5HLCBoZWFkaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEhlYWRpbmcgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfSEVBRElORyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNwZWVkIC0gVGhlIHNwZWVkIGluIEtQSFxuICAgICAqIEByZXR1cm4ge0dQU0RhdGF9XG4gICAgICovXG4gICAgc2V0U3BlZWQgKHNwZWVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdQU0RhdGEuS0VZX1NQRUVELCBzcGVlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRTcGVlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHUFNEYXRhLktFWV9TUEVFRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzaGlmdGVkIC0gVHJ1ZSwgaWYgR1BTIGxhdC9sb25nLCB0aW1lLCBhbmQgYWx0aXR1ZGUgaGF2ZSBiZWVuIHB1cnBvc2VmdWxseSBzaGlmdGVkIChyZXF1aXJlcyBhXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHJpZXRhcnkgYWxnb3JpdGhtIHRvIHVuc2hpZnQpLiBGYWxzZSwgaWYgdGhlIEdQUyBkYXRhIGlzIHJhdyBhbmQgdW4tc2hpZnRlZC4gSWZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgcHJvdmlkZWQsIHRoZW4gdmFsdWUgaXMgYXNzdW1lZCBGYWxzZS5cbiAgICAgKiBAcmV0dXJuIHtHUFNEYXRhfVxuICAgICAqL1xuICAgIHNldFNoaWZ0ZWQgKHNoaWZ0ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR1BTRGF0YS5LRVlfU0hJRlRFRCwgc2hpZnRlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0U2hpZnRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHUFNEYXRhLktFWV9TSElGVEVEKTtcbiAgICB9XG59XG5cbkdQU0RhdGEuS0VZX0xPTkdJVFVERV9ERUdSRUVTID0gJ2xvbmdpdHVkZURlZ3JlZXMnO1xuR1BTRGF0YS5LRVlfTEFUSVRVREVfREVHUkVFUyA9ICdsYXRpdHVkZURlZ3JlZXMnO1xuR1BTRGF0YS5LRVlfVVRDX1lFQVIgPSAndXRjWWVhcic7XG5HUFNEYXRhLktFWV9VVENfTU9OVEggPSAndXRjTW9udGgnO1xuR1BTRGF0YS5LRVlfVVRDX0RBWSA9ICd1dGNEYXknO1xuR1BTRGF0YS5LRVlfVVRDX0hPVVJTID0gJ3V0Y0hvdXJzJztcbkdQU0RhdGEuS0VZX1VUQ19NSU5VVEVTID0gJ3V0Y01pbnV0ZXMnO1xuR1BTRGF0YS5LRVlfVVRDX1NFQ09ORFMgPSAndXRjU2Vjb25kcyc7XG5HUFNEYXRhLktFWV9DT01QQVNTX0RJUkVDVElPTiA9ICdjb21wYXNzRGlyZWN0aW9uJztcbkdQU0RhdGEuS0VZX1BET1AgPSAncGRvcCc7XG5HUFNEYXRhLktFWV9IRE9QID0gJ2hkb3AnO1xuR1BTRGF0YS5LRVlfVkRPUCA9ICd2ZG9wJztcbkdQU0RhdGEuS0VZX0FDVFVBTCA9ICdhY3R1YWwnO1xuR1BTRGF0YS5LRVlfU0FURUxMSVRFUyA9ICdzYXRlbGxpdGVzJztcbkdQU0RhdGEuS0VZX0RJTUVOU0lPTiA9ICdkaW1lbnNpb24nO1xuR1BTRGF0YS5LRVlfQUxUSVRVREUgPSAnYWx0aXR1ZGUnO1xuR1BTRGF0YS5LRVlfSEVBRElORyA9ICdoZWFkaW5nJztcbkdQU0RhdGEuS0VZX1NQRUVEID0gJ3NwZWVkJztcbkdQU0RhdGEuS0VZX1NISUZURUQgPSAnc2hpZnRlZCc7XG5cbmV4cG9ydCB7IEdQU0RhdGEgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBUaGUgc2VsZWN0ZWQgZ2Vhci5cbiAqIEB0eXBlZGVmIHtFbnVtfSBQUk5ETFxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgUFJOREwgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFya2luZ1xuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBBUksgKCkge1xuICAgICAgICByZXR1cm4gUFJOREwuX01BUC5QQVJLO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2UgZ2VhclxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJFVkVSU0UgKCkge1xuICAgICAgICByZXR1cm4gUFJOREwuX01BUC5SRVZFUlNFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vIGdlYXJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBORVVUUkFMICgpIHtcbiAgICAgICAgcmV0dXJuIFBSTkRMLl9NQVAuTkVVVFJBTDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBEUklWRSAoKSB7XG4gICAgICAgIHJldHVybiBQUk5ETC5fTUFQLkRSSVZFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyaXZlIFNwb3J0IG1vZGVcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTUE9SVCAoKSB7XG4gICAgICAgIHJldHVybiBQUk5ETC5fTUFQLlNQT1JUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDFzdCBnZWFyIGhvbGRcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBMT1dHRUFSICgpIHtcbiAgICAgICAgcmV0dXJuIFBSTkRMLl9NQVAuTE9XR0VBUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGSVJTVCAoKSB7XG4gICAgICAgIHJldHVybiBQUk5ETC5fTUFQLkZJUlNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNFQ09ORCAoKSB7XG4gICAgICAgIHJldHVybiBQUk5ETC5fTUFQLlNFQ09ORDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBUSElSRCAoKSB7XG4gICAgICAgIHJldHVybiBQUk5ETC5fTUFQLlRISVJEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZPVVJUSCAoKSB7XG4gICAgICAgIHJldHVybiBQUk5ETC5fTUFQLkZPVVJUSDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGSUZUSCAoKSB7XG4gICAgICAgIHJldHVybiBQUk5ETC5fTUFQLkZJRlRIO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNJWFRIICgpIHtcbiAgICAgICAgcmV0dXJuIFBSTkRMLl9NQVAuU0lYVEg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU0VWRU5USCAoKSB7XG4gICAgICAgIHJldHVybiBQUk5ETC5fTUFQLlNFVkVOVEg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRUlHSFRIICgpIHtcbiAgICAgICAgcmV0dXJuIFBSTkRMLl9NQVAuRUlHSFRIO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVOS05PV04gKCkge1xuICAgICAgICByZXR1cm4gUFJOREwuX01BUC5VTktOT1dOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZBVUxUICgpIHtcbiAgICAgICAgcmV0dXJuIFBSTkRMLl9NQVAuRkFVTFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gUFJOREwuX3ZhbHVlRm9yS2V5KGtleSwgUFJOREwuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBQUk5ETC5fa2V5Rm9yVmFsdWUodmFsdWUsIFBSTkRMLl9NQVApO1xuICAgIH1cbn1cblxuUFJOREwuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdQQVJLJzogJ1BBUksnLFxuICAgICdSRVZFUlNFJzogJ1JFVkVSU0UnLFxuICAgICdORVVUUkFMJzogJ05FVVRSQUwnLFxuICAgICdEUklWRSc6ICdEUklWRScsXG4gICAgJ1NQT1JUJzogJ1NQT1JUJyxcbiAgICAnTE9XR0VBUic6ICdMT1dHRUFSJyxcbiAgICAnRklSU1QnOiAnRklSU1QnLFxuICAgICdTRUNPTkQnOiAnU0VDT05EJyxcbiAgICAnVEhJUkQnOiAnVEhJUkQnLFxuICAgICdGT1VSVEgnOiAnRk9VUlRIJyxcbiAgICAnRklGVEgnOiAnRklGVEgnLFxuICAgICdTSVhUSCc6ICdTSVhUSCcsXG4gICAgJ1NFVkVOVEgnOiAnU0VWRU5USCcsXG4gICAgJ0VJR0hUSCc6ICdFSUdIVEgnLFxuICAgICdVTktOT1dOJzogJ1VOS05PV04nLFxuICAgICdGQVVMVCc6ICdGQVVMVCcsXG59KTtcblxuZXhwb3J0IHsgUFJOREwgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gRnVlbFR5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIEZ1ZWxUeXBlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEdBU09MSU5FICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1ZWxUeXBlLl9NQVAuR0FTT0xJTkU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRElFU0VMICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1ZWxUeXBlLl9NQVAuRElFU0VMO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciB2ZWhpY2xlcyB1c2luZyBjb21wcmVzc2VkIG5hdHVyYWwgZ2FzLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENORyAoKSB7XG4gICAgICAgIHJldHVybiBGdWVsVHlwZS5fTUFQLkNORztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3IgdmVoaWNsZXMgdXNpbmcgbGlxdWVmaWVkIHBldHJvbGV1bSBnYXMuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTFBHICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1ZWxUeXBlLl9NQVAuTFBHO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBGQ0VWIChmdWVsIGNlbGwgZWxlY3RyaWMgdmVoaWNsZSkuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgSFlEUk9HRU4gKCkge1xuICAgICAgICByZXR1cm4gRnVlbFR5cGUuX01BUC5IWURST0dFTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3IgQkVWIChCYXR0ZXJ5IEVsZWN0cmljIFZlaGljbGUpLCBQSEVWIChQbHVnLWluIEh5YnJpZCBFbGVjdHJpYyBWZWhpY2xlKSwgc29sYXIgdmVoaWNsZXMgYW5kIG90aGVyIHZlaGljbGVzXG4gICAgICogd2hpY2ggcnVuIG9uIGEgYmF0dGVyeS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBCQVRURVJZICgpIHtcbiAgICAgICAgcmV0dXJuIEZ1ZWxUeXBlLl9NQVAuQkFUVEVSWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBGdWVsVHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBGdWVsVHlwZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEZ1ZWxUeXBlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgRnVlbFR5cGUuX01BUCk7XG4gICAgfVxufVxuXG5GdWVsVHlwZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0dBU09MSU5FJzogJ0dBU09MSU5FJyxcbiAgICAnRElFU0VMJzogJ0RJRVNFTCcsXG4gICAgJ0NORyc6ICdDTkcnLFxuICAgICdMUEcnOiAnTFBHJyxcbiAgICAnSFlEUk9HRU4nOiAnSFlEUk9HRU4nLFxuICAgICdCQVRURVJZJzogJ0JBVFRFUlknLFxufSk7XG5cbmV4cG9ydCB7IEZ1ZWxUeXBlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IEZ1ZWxUeXBlIH0gZnJvbSAnLi4vZW51bXMvRnVlbFR5cGUuanMnO1xuXG5jbGFzcyBGdWVsUmFuZ2UgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVlbFR5cGV9IHR5cGVcbiAgICAgKiBAcmV0dXJuIHtGdWVsUmFuZ2V9XG4gICAgICovXG4gICAgc2V0VHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShGdWVsVHlwZSwgdHlwZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEZ1ZWxSYW5nZS5LRVlfVFlQRSwgdHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Z1ZWxUeXBlfVxuICAgICAqL1xuICAgIGdldFR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoRnVlbFR5cGUsIEZ1ZWxSYW5nZS5LRVlfVFlQRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJhbmdlIC0gVGhlIGVzdGltYXRlIHJhbmdlIGluIEtNIHRoZSB2ZWhpY2xlIGNhbiB0cmF2ZWwgYmFzZWQgb24gZnVlbCBsZXZlbCBhbmQgY29uc3VtcHRpb24uXG4gICAgICogQHJldHVybiB7RnVlbFJhbmdlfVxuICAgICAqL1xuICAgIHNldFJhbmdlIChyYW5nZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihGdWVsUmFuZ2UuS0VZX1JBTkdFLCByYW5nZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRSYW5nZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihGdWVsUmFuZ2UuS0VZX1JBTkdFKTtcbiAgICB9XG59XG5cbkZ1ZWxSYW5nZS5LRVlfVFlQRSA9ICd0eXBlJztcbkZ1ZWxSYW5nZS5LRVlfUkFOR0UgPSAncmFuZ2UnO1xuXG5leHBvcnQgeyBGdWVsUmFuZ2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBSZWZsZWN0cyB0aGUgc3RhdHVzIG9mIGEgdmVoaWNsZSBkYXRhIG5vdGlmaWNhdGlvbi5cbiAqIEB0eXBlZGVmIHtFbnVtfSBWZWhpY2xlRGF0YU5vdGlmaWNhdGlvblN0YXR1c1xuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgVmVoaWNsZURhdGFOb3RpZmljYXRpb25TdGF0dXMgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkROU19OT1RfU1VQUE9SVEVEICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhTm90aWZpY2F0aW9uU3RhdHVzLl9NQVAuVkROU19OT1RfU1VQUE9SVEVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZETlNfTk9STUFMICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhTm90aWZpY2F0aW9uU3RhdHVzLl9NQVAuVkROU19OT1JNQUw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkROU19BQ1RJVkUgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFOb3RpZmljYXRpb25TdGF0dXMuX01BUC5WRE5TX0FDVElWRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWRE5TX05PVF9VU0VEICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhTm90aWZpY2F0aW9uU3RhdHVzLl9NQVAuVkROU19OT1RfVVNFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YU5vdGlmaWNhdGlvblN0YXR1cy5fdmFsdWVGb3JLZXkoa2V5LCBWZWhpY2xlRGF0YU5vdGlmaWNhdGlvblN0YXR1cy5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhTm90aWZpY2F0aW9uU3RhdHVzLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgVmVoaWNsZURhdGFOb3RpZmljYXRpb25TdGF0dXMuX01BUCk7XG4gICAgfVxufVxuXG5WZWhpY2xlRGF0YU5vdGlmaWNhdGlvblN0YXR1cy5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ1ZETlNfTk9UX1NVUFBPUlRFRCc6ICdOT1RfU1VQUE9SVEVEJyxcbiAgICAnVkROU19OT1JNQUwnOiAnTk9STUFMJyxcbiAgICAnVkROU19BQ1RJVkUnOiAnQUNUSVZFJyxcbiAgICAnVkROU19OT1RfVVNFRCc6ICdOT1RfVVNFRCcsXG59KTtcblxuZXhwb3J0IHsgVmVoaWNsZURhdGFOb3RpZmljYXRpb25TdGF0dXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBSZWZsZWN0cyB0aGUgc3RhdHVzIG9mIHRoZSBlQ2FsbCBOb3RpZmljYXRpb24uXG4gKiBAdHlwZWRlZiB7RW51bX0gRUNhbGxDb25maXJtYXRpb25TdGF0dXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIEVDYWxsQ29uZmlybWF0aW9uU3RhdHVzIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEVDQ1NfTk9STUFMICgpIHtcbiAgICAgICAgcmV0dXJuIEVDYWxsQ29uZmlybWF0aW9uU3RhdHVzLl9NQVAuRUNDU19OT1JNQUw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRUNDU19DQUxMX0lOX1BST0dSRVNTICgpIHtcbiAgICAgICAgcmV0dXJuIEVDYWxsQ29uZmlybWF0aW9uU3RhdHVzLl9NQVAuRUNDU19DQUxMX0lOX1BST0dSRVNTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEVDQ1NfQ0FMTF9DQU5DRUxMRUQgKCkge1xuICAgICAgICByZXR1cm4gRUNhbGxDb25maXJtYXRpb25TdGF0dXMuX01BUC5FQ0NTX0NBTExfQ0FOQ0VMTEVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENBTExfQ09NUExFVEVEICgpIHtcbiAgICAgICAgcmV0dXJuIEVDYWxsQ29uZmlybWF0aW9uU3RhdHVzLl9NQVAuQ0FMTF9DT01QTEVURUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRUNDU19DQUxMX1VOU1VDQ0VTU0ZVTCAoKSB7XG4gICAgICAgIHJldHVybiBFQ2FsbENvbmZpcm1hdGlvblN0YXR1cy5fTUFQLkVDQ1NfQ0FMTF9VTlNVQ0NFU1NGVUw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRUNDU19FQ0FMTF9DT05GSUdVUkVEX09GRiAoKSB7XG4gICAgICAgIHJldHVybiBFQ2FsbENvbmZpcm1hdGlvblN0YXR1cy5fTUFQLkVDQ1NfRUNBTExfQ09ORklHVVJFRF9PRkY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRUNDU19DQUxMX0NPTVBMRVRFX0RUTUZfVElNRU9VVCAoKSB7XG4gICAgICAgIHJldHVybiBFQ2FsbENvbmZpcm1hdGlvblN0YXR1cy5fTUFQLkVDQ1NfQ0FMTF9DT01QTEVURV9EVE1GX1RJTUVPVVQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gRUNhbGxDb25maXJtYXRpb25TdGF0dXMuX3ZhbHVlRm9yS2V5KGtleSwgRUNhbGxDb25maXJtYXRpb25TdGF0dXMuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBFQ2FsbENvbmZpcm1hdGlvblN0YXR1cy5fa2V5Rm9yVmFsdWUodmFsdWUsIEVDYWxsQ29uZmlybWF0aW9uU3RhdHVzLl9NQVApO1xuICAgIH1cbn1cblxuRUNhbGxDb25maXJtYXRpb25TdGF0dXMuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdFQ0NTX05PUk1BTCc6ICdOT1JNQUwnLFxuICAgICdFQ0NTX0NBTExfSU5fUFJPR1JFU1MnOiAnQ0FMTF9JTl9QUk9HUkVTUycsXG4gICAgJ0VDQ1NfQ0FMTF9DQU5DRUxMRUQnOiAnQ0FMTF9DQU5DRUxMRUQnLFxuICAgICdDQUxMX0NPTVBMRVRFRCc6ICdDQUxMX0NPTVBMRVRFRCcsXG4gICAgJ0VDQ1NfQ0FMTF9VTlNVQ0NFU1NGVUwnOiAnQ0FMTF9VTlNVQ0NFU1NGVUwnLFxuICAgICdFQ0NTX0VDQUxMX0NPTkZJR1VSRURfT0ZGJzogJ0VDQUxMX0NPTkZJR1VSRURfT0ZGJyxcbiAgICAnRUNDU19DQUxMX0NPTVBMRVRFX0RUTUZfVElNRU9VVCc6ICdDQUxMX0NPTVBMRVRFX0RUTUZfVElNRU9VVCcsXG59KTtcblxuZXhwb3J0IHsgRUNhbGxDb25maXJtYXRpb25TdGF0dXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgVmVoaWNsZURhdGFOb3RpZmljYXRpb25TdGF0dXMgfSBmcm9tICcuLi9lbnVtcy9WZWhpY2xlRGF0YU5vdGlmaWNhdGlvblN0YXR1cy5qcyc7XG5pbXBvcnQgeyBFQ2FsbENvbmZpcm1hdGlvblN0YXR1cyB9IGZyb20gJy4uL2VudW1zL0VDYWxsQ29uZmlybWF0aW9uU3RhdHVzLmpzJztcblxuY2xhc3MgRUNhbGxJbmZvIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhTm90aWZpY2F0aW9uU3RhdHVzfSBzdGF0dXMgLSBSZWZlcmVuY2VzIHNpZ25hbCBcImVDYWxsTm90aWZpY2F0aW9uXzRBXCIuIFNlZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlaGljbGVEYXRhTm90aWZpY2F0aW9uU3RhdHVzLlxuICAgICAqIEByZXR1cm4ge0VDYWxsSW5mb31cbiAgICAgKi9cbiAgICBzZXRFQ2FsbE5vdGlmaWNhdGlvblN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhTm90aWZpY2F0aW9uU3RhdHVzLCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihFQ2FsbEluZm8uS0VZX0VfQ0FMTF9OT1RJRklDQVRJT05fU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YU5vdGlmaWNhdGlvblN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRFQ2FsbE5vdGlmaWNhdGlvblN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YU5vdGlmaWNhdGlvblN0YXR1cywgRUNhbGxJbmZvLktFWV9FX0NBTExfTk9USUZJQ0FUSU9OX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YU5vdGlmaWNhdGlvblN0YXR1c30gc3RhdHVzIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJlQ2FsbE5vdGlmaWNhdGlvblwiLiBTZWVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWhpY2xlRGF0YU5vdGlmaWNhdGlvblN0YXR1cy5cbiAgICAgKiBAcmV0dXJuIHtFQ2FsbEluZm99XG4gICAgICovXG4gICAgc2V0QXV4RUNhbGxOb3RpZmljYXRpb25TdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YU5vdGlmaWNhdGlvblN0YXR1cywgc3RhdHVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRUNhbGxJbmZvLktFWV9BVVhfRUNBTExfTk9USUZJQ0FUSU9OX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFOb3RpZmljYXRpb25TdGF0dXN9XG4gICAgICovXG4gICAgZ2V0QXV4RUNhbGxOb3RpZmljYXRpb25TdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFOb3RpZmljYXRpb25TdGF0dXMsIEVDYWxsSW5mby5LRVlfQVVYX0VDQUxMX05PVElGSUNBVElPTl9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RUNhbGxDb25maXJtYXRpb25TdGF0dXN9IHN0YXR1cyAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiZUNhbGxDb25maXJtYXRpb25cIi4gU2VlIEVDYWxsQ29uZmlybWF0aW9uU3RhdHVzLlxuICAgICAqIEByZXR1cm4ge0VDYWxsSW5mb31cbiAgICAgKi9cbiAgICBzZXRFQ2FsbENvbmZpcm1hdGlvblN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEVDYWxsQ29uZmlybWF0aW9uU3RhdHVzLCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihFQ2FsbEluZm8uS0VZX0VfQ0FMTF9DT05GSVJNQVRJT05fU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtFQ2FsbENvbmZpcm1hdGlvblN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRFQ2FsbENvbmZpcm1hdGlvblN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChFQ2FsbENvbmZpcm1hdGlvblN0YXR1cywgRUNhbGxJbmZvLktFWV9FX0NBTExfQ09ORklSTUFUSU9OX1NUQVRVUyk7XG4gICAgfVxufVxuXG5FQ2FsbEluZm8uS0VZX0VfQ0FMTF9OT1RJRklDQVRJT05fU1RBVFVTID0gJ2VDYWxsTm90aWZpY2F0aW9uU3RhdHVzJztcbkVDYWxsSW5mby5LRVlfQVVYX0VDQUxMX05PVElGSUNBVElPTl9TVEFUVVMgPSAnYXV4RUNhbGxOb3RpZmljYXRpb25TdGF0dXMnO1xuRUNhbGxJbmZvLktFWV9FX0NBTExfQ09ORklSTUFUSU9OX1NUQVRVUyA9ICdlQ2FsbENvbmZpcm1hdGlvblN0YXR1cyc7XG5cbmV4cG9ydCB7IEVDYWxsSW5mbyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBWZWhpY2xlRGF0YUV2ZW50U3RhdHVzIH0gZnJvbSAnLi4vZW51bXMvVmVoaWNsZURhdGFFdmVudFN0YXR1cy5qcyc7XG5cbmNsYXNzIEJlbHRTdGF0dXMgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFFdmVudFN0YXR1c30gZGVwbG95ZWQgLSBSZWZlcmVuY2VzIHNpZ25hbCBcIlZlZHNEcnZCZWx0X0RfTHRjaGRcIi4gU2VlIFZlaGljbGVEYXRhRXZlbnRTdGF0dXMuXG4gICAgICogQHJldHVybiB7QmVsdFN0YXR1c31cbiAgICAgKi9cbiAgICBzZXREcml2ZXJCZWx0RGVwbG95ZWQgKGRlcGxveWVkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIGRlcGxveWVkKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQmVsdFN0YXR1cy5LRVlfRFJJVkVSX0JFTFRfREVQTE9ZRUQsIGRlcGxveWVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFFdmVudFN0YXR1c31cbiAgICAgKi9cbiAgICBnZXREcml2ZXJCZWx0RGVwbG95ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFFdmVudFN0YXR1cywgQmVsdFN0YXR1cy5LRVlfRFJJVkVSX0JFTFRfREVQTE9ZRUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFFdmVudFN0YXR1c30gZGVwbG95ZWQgLSBSZWZlcmVuY2VzIHNpZ25hbCBcIlZlZHNQYXNCZWx0X0RfTHRjaGRcIi4gU2VlIFZlaGljbGVEYXRhRXZlbnRTdGF0dXMuXG4gICAgICogQHJldHVybiB7QmVsdFN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRQYXNzZW5nZXJCZWx0RGVwbG95ZWQgKGRlcGxveWVkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIGRlcGxveWVkKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQmVsdFN0YXR1cy5LRVlfUEFTU0VOR0VSX0JFTFRfREVQTE9ZRUQsIGRlcGxveWVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFFdmVudFN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRQYXNzZW5nZXJCZWx0RGVwbG95ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFFdmVudFN0YXR1cywgQmVsdFN0YXR1cy5LRVlfUEFTU0VOR0VSX0JFTFRfREVQTE9ZRUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFFdmVudFN0YXR1c30gYmVsdGVkIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJWZWRzUncxUGFzQmNrbF9EX0x0Y2hkXCIuIFNlZSBWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLlxuICAgICAqIEByZXR1cm4ge0JlbHRTdGF0dXN9XG4gICAgICovXG4gICAgc2V0UGFzc2VuZ2VyQnVja2xlQmVsdGVkIChiZWx0ZWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFFdmVudFN0YXR1cywgYmVsdGVkKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQmVsdFN0YXR1cy5LRVlfUEFTU0VOR0VSX0JVQ0tMRV9CRUxURUQsIGJlbHRlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0UGFzc2VuZ2VyQnVja2xlQmVsdGVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIEJlbHRTdGF0dXMuS0VZX1BBU1NFTkdFUl9CVUNLTEVfQkVMVEVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9IGJlbHRlZCAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiVmVkc1J3MURydkJja2xfRF9MdGNoZFwiLiBTZWUgVmVoaWNsZURhdGFFdmVudFN0YXR1cy5cbiAgICAgKiBAcmV0dXJuIHtCZWx0U3RhdHVzfVxuICAgICAqL1xuICAgIHNldERyaXZlckJ1Y2tsZUJlbHRlZCAoYmVsdGVkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIGJlbHRlZCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEJlbHRTdGF0dXMuS0VZX0RSSVZFUl9CVUNLTEVfQkVMVEVELCBiZWx0ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YUV2ZW50U3RhdHVzfVxuICAgICAqL1xuICAgIGdldERyaXZlckJ1Y2tsZUJlbHRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBCZWx0U3RhdHVzLktFWV9EUklWRVJfQlVDS0xFX0JFTFRFRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZWhpY2xlRGF0YUV2ZW50U3RhdHVzfSBiZWx0ZWQgLSBSZWZlcmVuY2VzIHNpZ25hbCBcIlZlZHNSdzJsQmNrbF9EX0x0Y2hkXCIuIFNlZSBWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLlxuICAgICAqIEByZXR1cm4ge0JlbHRTdGF0dXN9XG4gICAgICovXG4gICAgc2V0TGVmdFJvdzJCdWNrbGVCZWx0ZWQgKGJlbHRlZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBiZWx0ZWQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihCZWx0U3RhdHVzLktFWV9MRUZUX1JPVzJCVUNLTEVfQkVMVEVELCBiZWx0ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YUV2ZW50U3RhdHVzfVxuICAgICAqL1xuICAgIGdldExlZnRSb3cyQnVja2xlQmVsdGVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIEJlbHRTdGF0dXMuS0VZX0xFRlRfUk9XMkJVQ0tMRV9CRUxURUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFFdmVudFN0YXR1c30gZGV0ZWN0ZWQgLSBSZWZlcmVuY2VzIHNpZ25hbCBcIlZlZHNSdzFQYXNDaGxkX0RfTHRjaGRcIi4gU2VlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlaGljbGVEYXRhRXZlbnRTdGF0dXMuXG4gICAgICogQHJldHVybiB7QmVsdFN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRQYXNzZW5nZXJDaGlsZERldGVjdGVkIChkZXRlY3RlZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBkZXRlY3RlZCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEJlbHRTdGF0dXMuS0VZX1BBU1NFTkdFUl9DSElMRF9ERVRFQ1RFRCwgZGV0ZWN0ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YUV2ZW50U3RhdHVzfVxuICAgICAqL1xuICAgIGdldFBhc3NlbmdlckNoaWxkRGV0ZWN0ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFFdmVudFN0YXR1cywgQmVsdFN0YXR1cy5LRVlfUEFTU0VOR0VSX0NISUxEX0RFVEVDVEVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9IGJlbHRlZCAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiVmVkc1J3MnJCY2tsX0RfTHRjaGRcIi4gU2VlIFZlaGljbGVEYXRhRXZlbnRTdGF0dXMuXG4gICAgICogQHJldHVybiB7QmVsdFN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRSaWdodFJvdzJCdWNrbGVCZWx0ZWQgKGJlbHRlZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBiZWx0ZWQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihCZWx0U3RhdHVzLktFWV9SSUdIVF9ST1cyQlVDS0xFX0JFTFRFRCwgYmVsdGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFFdmVudFN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRSaWdodFJvdzJCdWNrbGVCZWx0ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFFdmVudFN0YXR1cywgQmVsdFN0YXR1cy5LRVlfUklHSFRfUk9XMkJVQ0tMRV9CRUxURUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFFdmVudFN0YXR1c30gYmVsdGVkIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJWZWRzUncybUJja2xfRF9MdGNoZFwiLiBTZWUgVmVoaWNsZURhdGFFdmVudFN0YXR1cy5cbiAgICAgKiBAcmV0dXJuIHtCZWx0U3RhdHVzfVxuICAgICAqL1xuICAgIHNldE1pZGRsZVJvdzJCdWNrbGVCZWx0ZWQgKGJlbHRlZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBiZWx0ZWQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihCZWx0U3RhdHVzLktFWV9NSURETEVfUk9XMkJVQ0tMRV9CRUxURUQsIGJlbHRlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0TWlkZGxlUm93MkJ1Y2tsZUJlbHRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBCZWx0U3RhdHVzLktFWV9NSURETEVfUk9XMkJVQ0tMRV9CRUxURUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFFdmVudFN0YXR1c30gYmVsdGVkIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJWZWRzUnczbUJja2xfRF9MdGNoZFwiLiBTZWUgVmVoaWNsZURhdGFFdmVudFN0YXR1cy5cbiAgICAgKiBAcmV0dXJuIHtCZWx0U3RhdHVzfVxuICAgICAqL1xuICAgIHNldE1pZGRsZVJvdzNCdWNrbGVCZWx0ZWQgKGJlbHRlZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBiZWx0ZWQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihCZWx0U3RhdHVzLktFWV9NSURETEVfUk9XM0JVQ0tMRV9CRUxURUQsIGJlbHRlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0TWlkZGxlUm93M0J1Y2tsZUJlbHRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBCZWx0U3RhdHVzLktFWV9NSURETEVfUk9XM0JVQ0tMRV9CRUxURUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFFdmVudFN0YXR1c30gYmVsdGVkIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJWZWRzUnczbEJja2xfRF9MdGNoZFwiLiBTZWUgVmVoaWNsZURhdGFFdmVudFN0YXR1cy5cbiAgICAgKiBAcmV0dXJuIHtCZWx0U3RhdHVzfVxuICAgICAqL1xuICAgIHNldExlZnRSb3czQnVja2xlQmVsdGVkIChiZWx0ZWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFFdmVudFN0YXR1cywgYmVsdGVkKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQmVsdFN0YXR1cy5LRVlfTEVGVF9ST1czQlVDS0xFX0JFTFRFRCwgYmVsdGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFFdmVudFN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRMZWZ0Um93M0J1Y2tsZUJlbHRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBCZWx0U3RhdHVzLktFWV9MRUZUX1JPVzNCVUNLTEVfQkVMVEVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9IGJlbHRlZCAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiVmVkc1J3M3JCY2tsX0RfTHRjaGRcIi4gU2VlIFZlaGljbGVEYXRhRXZlbnRTdGF0dXMuXG4gICAgICogQHJldHVybiB7QmVsdFN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRSaWdodFJvdzNCdWNrbGVCZWx0ZWQgKGJlbHRlZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBiZWx0ZWQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihCZWx0U3RhdHVzLktFWV9SSUdIVF9ST1czQlVDS0xFX0JFTFRFRCwgYmVsdGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmVoaWNsZURhdGFFdmVudFN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRSaWdodFJvdzNCdWNrbGVCZWx0ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVoaWNsZURhdGFFdmVudFN0YXR1cywgQmVsdFN0YXR1cy5LRVlfUklHSFRfUk9XM0JVQ0tMRV9CRUxURUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFFdmVudFN0YXR1c30gYmVsdGVkIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJWZWRzUncybFJpYl9EX0x0Y2hkXCIuIFNlZSBWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLlxuICAgICAqIEByZXR1cm4ge0JlbHRTdGF0dXN9XG4gICAgICovXG4gICAgc2V0TGVmdFJlYXJJbmZsYXRhYmxlQmVsdGVkIChiZWx0ZWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmVoaWNsZURhdGFFdmVudFN0YXR1cywgYmVsdGVkKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQmVsdFN0YXR1cy5LRVlfTEVGVF9SRUFSX0lORkxBVEFCTEVfQkVMVEVELCBiZWx0ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YUV2ZW50U3RhdHVzfVxuICAgICAqL1xuICAgIGdldExlZnRSZWFySW5mbGF0YWJsZUJlbHRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBCZWx0U3RhdHVzLktFWV9MRUZUX1JFQVJfSU5GTEFUQUJMRV9CRUxURUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFFdmVudFN0YXR1c30gYmVsdGVkIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJWZWRzUncyclJpYl9EX0x0Y2hkXCIuIFNlZSBWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLlxuICAgICAqIEByZXR1cm4ge0JlbHRTdGF0dXN9XG4gICAgICovXG4gICAgc2V0UmlnaHRSZWFySW5mbGF0YWJsZUJlbHRlZCAoYmVsdGVkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIGJlbHRlZCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEJlbHRTdGF0dXMuS0VZX1JJR0hUX1JFQVJfSU5GTEFUQUJMRV9CRUxURUQsIGJlbHRlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0UmlnaHRSZWFySW5mbGF0YWJsZUJlbHRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBCZWx0U3RhdHVzLktFWV9SSUdIVF9SRUFSX0lORkxBVEFCTEVfQkVMVEVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9IGRlcGxveWVkIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJWZWRzUncxbUJlbHRfRF9MdGNoZFwiLiBTZWUgVmVoaWNsZURhdGFFdmVudFN0YXR1cy5cbiAgICAgKiBAcmV0dXJuIHtCZWx0U3RhdHVzfVxuICAgICAqL1xuICAgIHNldE1pZGRsZVJvdzFCZWx0RGVwbG95ZWQgKGRlcGxveWVkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIGRlcGxveWVkKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQmVsdFN0YXR1cy5LRVlfTUlERExFX1JPVzFCRUxUX0RFUExPWUVELCBkZXBsb3llZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0TWlkZGxlUm93MUJlbHREZXBsb3llZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBCZWx0U3RhdHVzLktFWV9NSURETEVfUk9XMUJFTFRfREVQTE9ZRUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFFdmVudFN0YXR1c30gYmVsdGVkIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJWZWRzUncxbUJja2xfRF9MdGNoZFwiLiBTZWUgVmVoaWNsZURhdGFFdmVudFN0YXR1cy5cbiAgICAgKiBAcmV0dXJuIHtCZWx0U3RhdHVzfVxuICAgICAqL1xuICAgIHNldE1pZGRsZVJvdzFCdWNrbGVCZWx0ZWQgKGJlbHRlZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBiZWx0ZWQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihCZWx0U3RhdHVzLktFWV9NSURETEVfUk9XMUJVQ0tMRV9CRUxURUQsIGJlbHRlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0TWlkZGxlUm93MUJ1Y2tsZUJlbHRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBCZWx0U3RhdHVzLktFWV9NSURETEVfUk9XMUJVQ0tMRV9CRUxURUQpO1xuICAgIH1cbn1cblxuQmVsdFN0YXR1cy5LRVlfRFJJVkVSX0JFTFRfREVQTE9ZRUQgPSAnZHJpdmVyQmVsdERlcGxveWVkJztcbkJlbHRTdGF0dXMuS0VZX1BBU1NFTkdFUl9CRUxUX0RFUExPWUVEID0gJ3Bhc3NlbmdlckJlbHREZXBsb3llZCc7XG5CZWx0U3RhdHVzLktFWV9QQVNTRU5HRVJfQlVDS0xFX0JFTFRFRCA9ICdwYXNzZW5nZXJCdWNrbGVCZWx0ZWQnO1xuQmVsdFN0YXR1cy5LRVlfRFJJVkVSX0JVQ0tMRV9CRUxURUQgPSAnZHJpdmVyQnVja2xlQmVsdGVkJztcbkJlbHRTdGF0dXMuS0VZX0xFRlRfUk9XMkJVQ0tMRV9CRUxURUQgPSAnbGVmdFJvdzJCdWNrbGVCZWx0ZWQnO1xuQmVsdFN0YXR1cy5LRVlfUEFTU0VOR0VSX0NISUxEX0RFVEVDVEVEID0gJ3Bhc3NlbmdlckNoaWxkRGV0ZWN0ZWQnO1xuQmVsdFN0YXR1cy5LRVlfUklHSFRfUk9XMkJVQ0tMRV9CRUxURUQgPSAncmlnaHRSb3cyQnVja2xlQmVsdGVkJztcbkJlbHRTdGF0dXMuS0VZX01JRERMRV9ST1cyQlVDS0xFX0JFTFRFRCA9ICdtaWRkbGVSb3cyQnVja2xlQmVsdGVkJztcbkJlbHRTdGF0dXMuS0VZX01JRERMRV9ST1czQlVDS0xFX0JFTFRFRCA9ICdtaWRkbGVSb3czQnVja2xlQmVsdGVkJztcbkJlbHRTdGF0dXMuS0VZX0xFRlRfUk9XM0JVQ0tMRV9CRUxURUQgPSAnbGVmdFJvdzNCdWNrbGVCZWx0ZWQnO1xuQmVsdFN0YXR1cy5LRVlfUklHSFRfUk9XM0JVQ0tMRV9CRUxURUQgPSAncmlnaHRSb3czQnVja2xlQmVsdGVkJztcbkJlbHRTdGF0dXMuS0VZX0xFRlRfUkVBUl9JTkZMQVRBQkxFX0JFTFRFRCA9ICdsZWZ0UmVhckluZmxhdGFibGVCZWx0ZWQnO1xuQmVsdFN0YXR1cy5LRVlfUklHSFRfUkVBUl9JTkZMQVRBQkxFX0JFTFRFRCA9ICdyaWdodFJlYXJJbmZsYXRhYmxlQmVsdGVkJztcbkJlbHRTdGF0dXMuS0VZX01JRERMRV9ST1cxQkVMVF9ERVBMT1lFRCA9ICdtaWRkbGVSb3cxQmVsdERlcGxveWVkJztcbkJlbHRTdGF0dXMuS0VZX01JRERMRV9ST1cxQlVDS0xFX0JFTFRFRCA9ICdtaWRkbGVSb3cxQnVja2xlQmVsdGVkJztcblxuZXhwb3J0IHsgQmVsdFN0YXR1cyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIFRoZSB2b2x1bWUgc3RhdHVzIG9mIGEgdmVoaWNsZSBjb21wb25lbnQuXG4gKiBAdHlwZWRlZiB7RW51bX0gQ29tcG9uZW50Vm9sdW1lU3RhdHVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBDb21wb25lbnRWb2x1bWVTdGF0dXMgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ1ZTX1VOS05PV04gKCkge1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50Vm9sdW1lU3RhdHVzLl9NQVAuQ1ZTX1VOS05PV047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ1ZTX05PUk1BTCAoKSB7XG4gICAgICAgIHJldHVybiBDb21wb25lbnRWb2x1bWVTdGF0dXMuX01BUC5DVlNfTk9STUFMO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENWU19MT1cgKCkge1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50Vm9sdW1lU3RhdHVzLl9NQVAuQ1ZTX0xPVztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDVlNfRkFVTFQgKCkge1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50Vm9sdW1lU3RhdHVzLl9NQVAuQ1ZTX0ZBVUxUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENWU19BTEVSVCAoKSB7XG4gICAgICAgIHJldHVybiBDb21wb25lbnRWb2x1bWVTdGF0dXMuX01BUC5DVlNfQUxFUlQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ1ZTX05PVF9TVVBQT1JURUQgKCkge1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50Vm9sdW1lU3RhdHVzLl9NQVAuQ1ZTX05PVF9TVVBQT1JURUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50Vm9sdW1lU3RhdHVzLl92YWx1ZUZvcktleShrZXksIENvbXBvbmVudFZvbHVtZVN0YXR1cy5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudFZvbHVtZVN0YXR1cy5fa2V5Rm9yVmFsdWUodmFsdWUsIENvbXBvbmVudFZvbHVtZVN0YXR1cy5fTUFQKTtcbiAgICB9XG59XG5cbkNvbXBvbmVudFZvbHVtZVN0YXR1cy5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0NWU19VTktOT1dOJzogJ1VOS05PV04nLFxuICAgICdDVlNfTk9STUFMJzogJ05PUk1BTCcsXG4gICAgJ0NWU19MT1cnOiAnTE9XJyxcbiAgICAnQ1ZTX0ZBVUxUJzogJ0ZBVUxUJyxcbiAgICAnQ1ZTX0FMRVJUJzogJ0FMRVJUJyxcbiAgICAnQ1ZTX05PVF9TVVBQT1JURUQnOiAnTk9UX1NVUFBPUlRFRCcsXG59KTtcblxuZXhwb3J0IHsgQ29tcG9uZW50Vm9sdW1lU3RhdHVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogUmVmbGVjdHMgdGhlIHN0YXR1cyBvZiBpZ25pdGlvbi5cbiAqIEB0eXBlZGVmIHtFbnVtfSBJZ25pdGlvblN0YXR1c1xuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgSWduaXRpb25TdGF0dXMgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgSVNfVU5LTk9XTiAoKSB7XG4gICAgICAgIHJldHVybiBJZ25pdGlvblN0YXR1cy5fTUFQLklTX1VOS05PV047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgSVNfT0ZGICgpIHtcbiAgICAgICAgcmV0dXJuIElnbml0aW9uU3RhdHVzLl9NQVAuSVNfT0ZGO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IElTX0FDQ0VTU09SWSAoKSB7XG4gICAgICAgIHJldHVybiBJZ25pdGlvblN0YXR1cy5fTUFQLklTX0FDQ0VTU09SWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBJU19SVU4gKCkge1xuICAgICAgICByZXR1cm4gSWduaXRpb25TdGF0dXMuX01BUC5JU19SVU47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgSVNfU1RBUlQgKCkge1xuICAgICAgICByZXR1cm4gSWduaXRpb25TdGF0dXMuX01BUC5JU19TVEFSVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBJU19JTlZBTElEICgpIHtcbiAgICAgICAgcmV0dXJuIElnbml0aW9uU3RhdHVzLl9NQVAuSVNfSU5WQUxJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBJZ25pdGlvblN0YXR1cy5fdmFsdWVGb3JLZXkoa2V5LCBJZ25pdGlvblN0YXR1cy5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIElnbml0aW9uU3RhdHVzLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgSWduaXRpb25TdGF0dXMuX01BUCk7XG4gICAgfVxufVxuXG5JZ25pdGlvblN0YXR1cy5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0lTX1VOS05PV04nOiAnVU5LTk9XTicsXG4gICAgJ0lTX09GRic6ICdPRkYnLFxuICAgICdJU19BQ0NFU1NPUlknOiAnQUNDRVNTT1JZJyxcbiAgICAnSVNfUlVOJzogJ1JVTicsXG4gICAgJ0lTX1NUQVJUJzogJ1NUQVJUJyxcbiAgICAnSVNfSU5WQUxJRCc6ICdJTlZBTElEJyxcbn0pO1xuXG5leHBvcnQgeyBJZ25pdGlvblN0YXR1cyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIFJlZmxlY3RzIHRoZSBpZ25pdGlvbiBzd2l0Y2ggc3RhYmlsaXR5LlxuICogQHR5cGVkZWYge0VudW19IElnbml0aW9uU3RhYmxlU3RhdHVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBJZ25pdGlvblN0YWJsZVN0YXR1cyBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBJR05JVElPTl9TV0lUQ0hfTk9UX1NUQUJMRSAoKSB7XG4gICAgICAgIHJldHVybiBJZ25pdGlvblN0YWJsZVN0YXR1cy5fTUFQLklHTklUSU9OX1NXSVRDSF9OT1RfU1RBQkxFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IElHTklUSU9OX1NXSVRDSF9TVEFCTEUgKCkge1xuICAgICAgICByZXR1cm4gSWduaXRpb25TdGFibGVTdGF0dXMuX01BUC5JR05JVElPTl9TV0lUQ0hfU1RBQkxFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE1JU1NJTkdfRlJPTV9UUkFOU01JVFRFUiAoKSB7XG4gICAgICAgIHJldHVybiBJZ25pdGlvblN0YWJsZVN0YXR1cy5fTUFQLk1JU1NJTkdfRlJPTV9UUkFOU01JVFRFUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBJZ25pdGlvblN0YWJsZVN0YXR1cy5fdmFsdWVGb3JLZXkoa2V5LCBJZ25pdGlvblN0YWJsZVN0YXR1cy5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIElnbml0aW9uU3RhYmxlU3RhdHVzLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgSWduaXRpb25TdGFibGVTdGF0dXMuX01BUCk7XG4gICAgfVxufVxuXG5JZ25pdGlvblN0YWJsZVN0YXR1cy5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0lHTklUSU9OX1NXSVRDSF9OT1RfU1RBQkxFJzogJ0lHTklUSU9OX1NXSVRDSF9OT1RfU1RBQkxFJyxcbiAgICAnSUdOSVRJT05fU1dJVENIX1NUQUJMRSc6ICdJR05JVElPTl9TV0lUQ0hfU1RBQkxFJyxcbiAgICAnTUlTU0lOR19GUk9NX1RSQU5TTUlUVEVSJzogJ01JU1NJTkdfRlJPTV9UUkFOU01JVFRFUicsXG59KTtcblxuZXhwb3J0IHsgSWduaXRpb25TdGFibGVTdGF0dXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgSWduaXRpb25TdGF0dXMgfSBmcm9tICcuLi9lbnVtcy9JZ25pdGlvblN0YXR1cy5qcyc7XG5pbXBvcnQgeyBJZ25pdGlvblN0YWJsZVN0YXR1cyB9IGZyb20gJy4uL2VudW1zL0lnbml0aW9uU3RhYmxlU3RhdHVzLmpzJztcblxuY2xhc3MgQm9keUluZm9ybWF0aW9uIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFjdGl2ZSAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiUHJrQnJrQWN0dl9CX0FjdGxcIi5cbiAgICAgKiBAcmV0dXJuIHtCb2R5SW5mb3JtYXRpb259XG4gICAgICovXG4gICAgc2V0UGFya0JyYWtlQWN0aXZlIChhY3RpdmUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQm9keUluZm9ybWF0aW9uLktFWV9QQVJLX0JSQUtFX0FDVElWRSwgYWN0aXZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRQYXJrQnJha2VBY3RpdmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQm9keUluZm9ybWF0aW9uLktFWV9QQVJLX0JSQUtFX0FDVElWRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtJZ25pdGlvblN0YWJsZVN0YXR1c30gc3RhdHVzIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJJZ25pdGlvbl9Td2l0Y2hfU3RhYmxlXCIuIFNlZSBJZ25pdGlvblN0YWJsZVN0YXR1cy5cbiAgICAgKiBAcmV0dXJuIHtCb2R5SW5mb3JtYXRpb259XG4gICAgICovXG4gICAgc2V0SWduaXRpb25TdGFibGVTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShJZ25pdGlvblN0YWJsZVN0YXR1cywgc3RhdHVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQm9keUluZm9ybWF0aW9uLktFWV9JR05JVElPTl9TVEFCTEVfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtJZ25pdGlvblN0YWJsZVN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRJZ25pdGlvblN0YWJsZVN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChJZ25pdGlvblN0YWJsZVN0YXR1cywgQm9keUluZm9ybWF0aW9uLktFWV9JR05JVElPTl9TVEFCTEVfU1RBVFVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0lnbml0aW9uU3RhdHVzfSBzdGF0dXMgLSBSZWZlcmVuY2VzIHNpZ25hbCBcIklnbml0aW9uX3N0YXR1c1wiLiBTZWUgSWduaXRpb25TdGF0dXMuXG4gICAgICogQHJldHVybiB7Qm9keUluZm9ybWF0aW9ufVxuICAgICAqL1xuICAgIHNldElnbml0aW9uU3RhdHVzIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSWduaXRpb25TdGF0dXMsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEJvZHlJbmZvcm1hdGlvbi5LRVlfSUdOSVRJT05fU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtJZ25pdGlvblN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRJZ25pdGlvblN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChJZ25pdGlvblN0YXR1cywgQm9keUluZm9ybWF0aW9uLktFWV9JR05JVElPTl9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWphciAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiRHJTdGF0RHJ2X0JfQWN0bFwiLlxuICAgICAqIEByZXR1cm4ge0JvZHlJbmZvcm1hdGlvbn1cbiAgICAgKi9cbiAgICBzZXREcml2ZXJEb29yQWphciAoYWphcikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihCb2R5SW5mb3JtYXRpb24uS0VZX0RSSVZFUl9ET09SX0FKQVIsIGFqYXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldERyaXZlckRvb3JBamFyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEJvZHlJbmZvcm1hdGlvbi5LRVlfRFJJVkVSX0RPT1JfQUpBUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhamFyIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJEclN0YXRQc25ncl9CX0FjdGxcIi5cbiAgICAgKiBAcmV0dXJuIHtCb2R5SW5mb3JtYXRpb259XG4gICAgICovXG4gICAgc2V0UGFzc2VuZ2VyRG9vckFqYXIgKGFqYXIpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQm9keUluZm9ybWF0aW9uLktFWV9QQVNTRU5HRVJfRE9PUl9BSkFSLCBhamFyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRQYXNzZW5nZXJEb29yQWphciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihCb2R5SW5mb3JtYXRpb24uS0VZX1BBU1NFTkdFUl9ET09SX0FKQVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWphciAtIFJlZmVyZW5jZXMgc2lnbmFsIFwiRHJTdGF0UmxfQl9BY3RsXCIuXG4gICAgICogQHJldHVybiB7Qm9keUluZm9ybWF0aW9ufVxuICAgICAqL1xuICAgIHNldFJlYXJMZWZ0RG9vckFqYXIgKGFqYXIpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQm9keUluZm9ybWF0aW9uLktFWV9SRUFSX0xFRlRfRE9PUl9BSkFSLCBhamFyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRSZWFyTGVmdERvb3JBamFyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEJvZHlJbmZvcm1hdGlvbi5LRVlfUkVBUl9MRUZUX0RPT1JfQUpBUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhamFyIC0gUmVmZXJlbmNlcyBzaWduYWwgXCJEclN0YXRScl9CX0FjdGxcIi5cbiAgICAgKiBAcmV0dXJuIHtCb2R5SW5mb3JtYXRpb259XG4gICAgICovXG4gICAgc2V0UmVhclJpZ2h0RG9vckFqYXIgKGFqYXIpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQm9keUluZm9ybWF0aW9uLktFWV9SRUFSX1JJR0hUX0RPT1JfQUpBUiwgYWphcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0UmVhclJpZ2h0RG9vckFqYXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQm9keUluZm9ybWF0aW9uLktFWV9SRUFSX1JJR0hUX0RPT1JfQUpBUik7XG4gICAgfVxufVxuXG5Cb2R5SW5mb3JtYXRpb24uS0VZX1BBUktfQlJBS0VfQUNUSVZFID0gJ3BhcmtCcmFrZUFjdGl2ZSc7XG5Cb2R5SW5mb3JtYXRpb24uS0VZX0lHTklUSU9OX1NUQUJMRV9TVEFUVVMgPSAnaWduaXRpb25TdGFibGVTdGF0dXMnO1xuQm9keUluZm9ybWF0aW9uLktFWV9JR05JVElPTl9TVEFUVVMgPSAnaWduaXRpb25TdGF0dXMnO1xuQm9keUluZm9ybWF0aW9uLktFWV9EUklWRVJfRE9PUl9BSkFSID0gJ2RyaXZlckRvb3JBamFyJztcbkJvZHlJbmZvcm1hdGlvbi5LRVlfUEFTU0VOR0VSX0RPT1JfQUpBUiA9ICdwYXNzZW5nZXJEb29yQWphcic7XG5Cb2R5SW5mb3JtYXRpb24uS0VZX1JFQVJfTEVGVF9ET09SX0FKQVIgPSAncmVhckxlZnREb29yQWphcic7XG5Cb2R5SW5mb3JtYXRpb24uS0VZX1JFQVJfUklHSFRfRE9PUl9BSkFSID0gJ3JlYXJSaWdodERvb3JBamFyJztcblxuZXhwb3J0IHsgQm9keUluZm9ybWF0aW9uIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IFRQTVNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFRQTVMgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgc2V0IHRoZSBzdGF0dXMgb2YgdGhlIHRpcmUgaXMgbm90IGtub3duLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVOS05PV04gKCkge1xuICAgICAgICByZXR1cm4gVFBNUy5fTUFQLlVOS05PV047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVFBNUyBkb2VzIG5vdCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTWVNURU1fRkFVTFQgKCkge1xuICAgICAgICByZXR1cm4gVFBNUy5fTUFQLlNZU1RFTV9GQVVMVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2Vuc29yIG9mIHRoZSB0aXJlIGRvZXMgbm90IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNFTlNPUl9GQVVMVCAoKSB7XG4gICAgICAgIHJldHVybiBUUE1TLl9NQVAuU0VOU09SX0ZBVUxUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRQTVMgaXMgcmVwb3J0aW5nIGEgbG93IHRpcmUgcHJlc3N1cmUgZm9yIHRoZSB0aXJlLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IExPVyAoKSB7XG4gICAgICAgIHJldHVybiBUUE1TLl9NQVAuTE9XO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRQTVMgaXMgYWN0aXZlIGFuZCB0aGUgdGlyZSBwcmVzc3VyZSBpcyBtb25pdG9yZWQuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU1lTVEVNX0FDVElWRSAoKSB7XG4gICAgICAgIHJldHVybiBUUE1TLl9NQVAuU1lTVEVNX0FDVElWRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUUE1TIGlzIHJlcG9ydGluZyB0aGF0IHRoZSB0aXJlIG11c3QgYmUgdHJhaW5lZC5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBUUkFJTiAoKSB7XG4gICAgICAgIHJldHVybiBUUE1TLl9NQVAuVFJBSU47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVFBNUyByZXBvcnRzIHRoZSB0cmFpbmluZyBmb3IgdGhlIHRpcmUgaXMgY29tcGxldGVkLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRSQUlOSU5HX0NPTVBMRVRFICgpIHtcbiAgICAgICAgcmV0dXJuIFRQTVMuX01BUC5UUkFJTklOR19DT01QTEVURTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUUE1TIHJlcG9ydHMgdGhlIHRpcmUgaXMgbm90IHRyYWluZWQuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTk9UX1RSQUlORUQgKCkge1xuICAgICAgICByZXR1cm4gVFBNUy5fTUFQLk5PVF9UUkFJTkVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFRQTVMuX3ZhbHVlRm9yS2V5KGtleSwgVFBNUy5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFRQTVMuX2tleUZvclZhbHVlKHZhbHVlLCBUUE1TLl9NQVApO1xuICAgIH1cbn1cblxuVFBNUy5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ1VOS05PV04nOiAnVU5LTk9XTicsXG4gICAgJ1NZU1RFTV9GQVVMVCc6ICdTWVNURU1fRkFVTFQnLFxuICAgICdTRU5TT1JfRkFVTFQnOiAnU0VOU09SX0ZBVUxUJyxcbiAgICAnTE9XJzogJ0xPVycsXG4gICAgJ1NZU1RFTV9BQ1RJVkUnOiAnU1lTVEVNX0FDVElWRScsXG4gICAgJ1RSQUlOJzogJ1RSQUlOJyxcbiAgICAnVFJBSU5JTkdfQ09NUExFVEUnOiAnVFJBSU5JTkdfQ09NUExFVEUnLFxuICAgICdOT1RfVFJBSU5FRCc6ICdOT1RfVFJBSU5FRCcsXG59KTtcblxuZXhwb3J0IHsgVFBNUyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IENvbXBvbmVudFZvbHVtZVN0YXR1cyB9IGZyb20gJy4uL2VudW1zL0NvbXBvbmVudFZvbHVtZVN0YXR1cy5qcyc7XG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgVFBNUyB9IGZyb20gJy4uL2VudW1zL1RQTVMuanMnO1xuXG5jbGFzcyBTaW5nbGVUaXJlU3RhdHVzIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0NvbXBvbmVudFZvbHVtZVN0YXR1c30gc3RhdHVzIC0gU2VlIENvbXBvbmVudFZvbHVtZVN0YXR1cy5cbiAgICAgKiBAcmV0dXJuIHtTaW5nbGVUaXJlU3RhdHVzfVxuICAgICAqL1xuICAgIHNldFN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKENvbXBvbmVudFZvbHVtZVN0YXR1cywgc3RhdHVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2luZ2xlVGlyZVN0YXR1cy5LRVlfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtDb21wb25lbnRWb2x1bWVTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0U3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KENvbXBvbmVudFZvbHVtZVN0YXR1cywgU2luZ2xlVGlyZVN0YXR1cy5LRVlfU1RBVFVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RQTVN9IHRwbXMgLSBUaGUgc3RhdHVzIG9mIFRQTVMgYWNjb3JkaW5nIHRvIHRoZSBwYXJ0aWN1bGFyIHRpcmUuXG4gICAgICogQHJldHVybiB7U2luZ2xlVGlyZVN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRUcG1zICh0cG1zKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRQTVMsIHRwbXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaW5nbGVUaXJlU3RhdHVzLktFWV9UUE1TLCB0cG1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VFBNU31cbiAgICAgKi9cbiAgICBnZXRUcG1zICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRQTVMsIFNpbmdsZVRpcmVTdGF0dXMuS0VZX1RQTVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwcmVzc3VyZSAtIFRoZSBwcmVzc3VyZSB2YWx1ZSBvZiB0aGUgcGFydGljdWxhciB0aXJlIGluIGtpbG8gcGFzY2FsLlxuICAgICAqIEByZXR1cm4ge1NpbmdsZVRpcmVTdGF0dXN9XG4gICAgICovXG4gICAgc2V0UHJlc3N1cmUgKHByZXNzdXJlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNpbmdsZVRpcmVTdGF0dXMuS0VZX1BSRVNTVVJFLCBwcmVzc3VyZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRQcmVzc3VyZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTaW5nbGVUaXJlU3RhdHVzLktFWV9QUkVTU1VSRSk7XG4gICAgfVxufVxuXG5TaW5nbGVUaXJlU3RhdHVzLktFWV9TVEFUVVMgPSAnc3RhdHVzJztcblNpbmdsZVRpcmVTdGF0dXMuS0VZX1RQTVMgPSAndHBtcyc7XG5TaW5nbGVUaXJlU3RhdHVzLktFWV9QUkVTU1VSRSA9ICdwcmVzc3VyZSc7XG5cbmV4cG9ydCB7IFNpbmdsZVRpcmVTdGF0dXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBSZWZsZWN0cyB0aGUgc3RhdHVzIG9mIGEgY2x1c3RlciBpbnN0cnVtZW50IHdhcm5pbmcgbGlnaHQuXG4gKiBAdHlwZWRlZiB7RW51bX0gV2FybmluZ0xpZ2h0U3RhdHVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBXYXJuaW5nTGlnaHRTdGF0dXMgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgV0xTX09GRiAoKSB7XG4gICAgICAgIHJldHVybiBXYXJuaW5nTGlnaHRTdGF0dXMuX01BUC5XTFNfT0ZGO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFdMU19PTiAoKSB7XG4gICAgICAgIHJldHVybiBXYXJuaW5nTGlnaHRTdGF0dXMuX01BUC5XTFNfT047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgV0xTX0ZMQVNIICgpIHtcbiAgICAgICAgcmV0dXJuIFdhcm5pbmdMaWdodFN0YXR1cy5fTUFQLldMU19GTEFTSDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBXTFNfTk9UX1VTRUQgKCkge1xuICAgICAgICByZXR1cm4gV2FybmluZ0xpZ2h0U3RhdHVzLl9NQVAuV0xTX05PVF9VU0VEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFdhcm5pbmdMaWdodFN0YXR1cy5fdmFsdWVGb3JLZXkoa2V5LCBXYXJuaW5nTGlnaHRTdGF0dXMuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBXYXJuaW5nTGlnaHRTdGF0dXMuX2tleUZvclZhbHVlKHZhbHVlLCBXYXJuaW5nTGlnaHRTdGF0dXMuX01BUCk7XG4gICAgfVxufVxuXG5XYXJuaW5nTGlnaHRTdGF0dXMuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdXTFNfT0ZGJzogJ09GRicsXG4gICAgJ1dMU19PTic6ICdPTicsXG4gICAgJ1dMU19GTEFTSCc6ICdGTEFTSCcsXG4gICAgJ1dMU19OT1RfVVNFRCc6ICdOT1RfVVNFRCcsXG59KTtcblxuZXhwb3J0IHsgV2FybmluZ0xpZ2h0U3RhdHVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IFNpbmdsZVRpcmVTdGF0dXMgfSBmcm9tICcuL1NpbmdsZVRpcmVTdGF0dXMuanMnO1xuaW1wb3J0IHsgV2FybmluZ0xpZ2h0U3RhdHVzIH0gZnJvbSAnLi4vZW51bXMvV2FybmluZ0xpZ2h0U3RhdHVzLmpzJztcblxuLyoqXG4gKiBUaGUgc3RhdHVzIGFuZCBwcmVzc3VyZSBvZiB0aGUgdGlyZXMuXG4gKi9cbmNsYXNzIFRpcmVTdGF0dXMgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7V2FybmluZ0xpZ2h0U3RhdHVzfSB0ZWxsdGFsZSAtIFN0YXR1cyBvZiB0aGUgVGlyZSBQcmVzc3VyZSBUZWxsdGFsZS4gU2VlIFdhcm5pbmdMaWdodFN0YXR1cy5cbiAgICAgKiBAcmV0dXJuIHtUaXJlU3RhdHVzfVxuICAgICAqL1xuICAgIHNldFByZXNzdXJlVGVsbHRhbGUgKHRlbGx0YWxlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFdhcm5pbmdMaWdodFN0YXR1cywgdGVsbHRhbGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihUaXJlU3RhdHVzLktFWV9QUkVTU1VSRV9URUxMVEFMRSwgdGVsbHRhbGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtXYXJuaW5nTGlnaHRTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0UHJlc3N1cmVUZWxsdGFsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChXYXJuaW5nTGlnaHRTdGF0dXMsIFRpcmVTdGF0dXMuS0VZX1BSRVNTVVJFX1RFTExUQUxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NpbmdsZVRpcmVTdGF0dXN9IGZyb250IC0gVGhlIHN0YXR1cyBvZiB0aGUgbGVmdCBmcm9udCB0aXJlLlxuICAgICAqIEByZXR1cm4ge1RpcmVTdGF0dXN9XG4gICAgICovXG4gICAgc2V0TGVmdEZyb250IChmcm9udCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTaW5nbGVUaXJlU3RhdHVzLCBmcm9udCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFRpcmVTdGF0dXMuS0VZX0xFRlRfRlJPTlQsIGZyb250KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U2luZ2xlVGlyZVN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRMZWZ0RnJvbnQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoU2luZ2xlVGlyZVN0YXR1cywgVGlyZVN0YXR1cy5LRVlfTEVGVF9GUk9OVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTaW5nbGVUaXJlU3RhdHVzfSBmcm9udCAtIFRoZSBzdGF0dXMgb2YgdGhlIHJpZ2h0IGZyb250IHRpcmUuXG4gICAgICogQHJldHVybiB7VGlyZVN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRSaWdodEZyb250IChmcm9udCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTaW5nbGVUaXJlU3RhdHVzLCBmcm9udCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFRpcmVTdGF0dXMuS0VZX1JJR0hUX0ZST05ULCBmcm9udCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NpbmdsZVRpcmVTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0UmlnaHRGcm9udCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTaW5nbGVUaXJlU3RhdHVzLCBUaXJlU3RhdHVzLktFWV9SSUdIVF9GUk9OVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTaW5nbGVUaXJlU3RhdHVzfSByZWFyIC0gVGhlIHN0YXR1cyBvZiB0aGUgbGVmdCByZWFyIHRpcmUuXG4gICAgICogQHJldHVybiB7VGlyZVN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRMZWZ0UmVhciAocmVhcikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTaW5nbGVUaXJlU3RhdHVzLCByZWFyKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVGlyZVN0YXR1cy5LRVlfTEVGVF9SRUFSLCByZWFyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U2luZ2xlVGlyZVN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRMZWZ0UmVhciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTaW5nbGVUaXJlU3RhdHVzLCBUaXJlU3RhdHVzLktFWV9MRUZUX1JFQVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2luZ2xlVGlyZVN0YXR1c30gcmVhciAtIFRoZSBzdGF0dXMgb2YgdGhlIHJpZ2h0IHJlYXIgdGlyZS5cbiAgICAgKiBAcmV0dXJuIHtUaXJlU3RhdHVzfVxuICAgICAqL1xuICAgIHNldFJpZ2h0UmVhciAocmVhcikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTaW5nbGVUaXJlU3RhdHVzLCByZWFyKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVGlyZVN0YXR1cy5LRVlfUklHSFRfUkVBUiwgcmVhcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NpbmdsZVRpcmVTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0UmlnaHRSZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFNpbmdsZVRpcmVTdGF0dXMsIFRpcmVTdGF0dXMuS0VZX1JJR0hUX1JFQVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2luZ2xlVGlyZVN0YXR1c30gcmVhciAtIFRoZSBzdGF0dXMgb2YgdGhlIGlubmVyIGxlZnQgcmVhci5cbiAgICAgKiBAcmV0dXJuIHtUaXJlU3RhdHVzfVxuICAgICAqL1xuICAgIHNldElubmVyTGVmdFJlYXIgKHJlYXIpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU2luZ2xlVGlyZVN0YXR1cywgcmVhcik7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFRpcmVTdGF0dXMuS0VZX0lOTkVSX0xFRlRfUkVBUiwgcmVhcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NpbmdsZVRpcmVTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0SW5uZXJMZWZ0UmVhciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTaW5nbGVUaXJlU3RhdHVzLCBUaXJlU3RhdHVzLktFWV9JTk5FUl9MRUZUX1JFQVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2luZ2xlVGlyZVN0YXR1c30gcmVhciAtIFRoZSBzdGF0dXMgb2YgdGhlIGlubmVyIHJpZ2h0IHJlYXIuXG4gICAgICogQHJldHVybiB7VGlyZVN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRJbm5lclJpZ2h0UmVhciAocmVhcikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTaW5nbGVUaXJlU3RhdHVzLCByZWFyKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVGlyZVN0YXR1cy5LRVlfSU5ORVJfUklHSFRfUkVBUiwgcmVhcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NpbmdsZVRpcmVTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0SW5uZXJSaWdodFJlYXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoU2luZ2xlVGlyZVN0YXR1cywgVGlyZVN0YXR1cy5LRVlfSU5ORVJfUklHSFRfUkVBUik7XG4gICAgfVxufVxuXG5UaXJlU3RhdHVzLktFWV9QUkVTU1VSRV9URUxMVEFMRSA9ICdwcmVzc3VyZVRlbGx0YWxlJztcblRpcmVTdGF0dXMuS0VZX0xFRlRfRlJPTlQgPSAnbGVmdEZyb250JztcblRpcmVTdGF0dXMuS0VZX1JJR0hUX0ZST05UID0gJ3JpZ2h0RnJvbnQnO1xuVGlyZVN0YXR1cy5LRVlfTEVGVF9SRUFSID0gJ2xlZnRSZWFyJztcblRpcmVTdGF0dXMuS0VZX1JJR0hUX1JFQVIgPSAncmlnaHRSZWFyJztcblRpcmVTdGF0dXMuS0VZX0lOTkVSX0xFRlRfUkVBUiA9ICdpbm5lckxlZnRSZWFyJztcblRpcmVTdGF0dXMuS0VZX0lOTkVSX1JJR0hUX1JFQVIgPSAnaW5uZXJSaWdodFJlYXInO1xuXG5leHBvcnQgeyBUaXJlU3RhdHVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgQWlyYmFnU3RhdHVzIH0gZnJvbSAnLi4vc3RydWN0cy9BaXJiYWdTdGF0dXMuanMnO1xuaW1wb3J0IHsgQ2x1c3Rlck1vZGVTdGF0dXMgfSBmcm9tICcuLi9zdHJ1Y3RzL0NsdXN0ZXJNb2RlU3RhdHVzLmpzJztcbmltcG9ydCB7IFZlaGljbGVEYXRhRXZlbnRTdGF0dXMgfSBmcm9tICcuLi9lbnVtcy9WZWhpY2xlRGF0YUV2ZW50U3RhdHVzLmpzJztcbmltcG9ydCB7IEVtZXJnZW5jeUV2ZW50IH0gZnJvbSAnLi4vc3RydWN0cy9FbWVyZ2VuY3lFdmVudC5qcyc7XG5pbXBvcnQgeyBUdXJuU2lnbmFsIH0gZnJvbSAnLi4vZW51bXMvVHVyblNpZ25hbC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IEhlYWRMYW1wU3RhdHVzIH0gZnJvbSAnLi4vc3RydWN0cy9IZWFkTGFtcFN0YXR1cy5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBEZXZpY2VTdGF0dXMgfSBmcm9tICcuLi9zdHJ1Y3RzL0RldmljZVN0YXR1cy5qcyc7XG5pbXBvcnQgeyBXaXBlclN0YXR1cyB9IGZyb20gJy4uL2VudW1zL1dpcGVyU3RhdHVzLmpzJztcbmltcG9ydCB7IEVsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMgfSBmcm9tICcuLi9lbnVtcy9FbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzLmpzJztcbmltcG9ydCB7IE15S2V5IH0gZnJvbSAnLi4vc3RydWN0cy9NeUtleS5qcyc7XG5pbXBvcnQgeyBHUFNEYXRhIH0gZnJvbSAnLi4vc3RydWN0cy9HUFNEYXRhLmpzJztcbmltcG9ydCB7IFBSTkRMIH0gZnJvbSAnLi4vZW51bXMvUFJOREwuanMnO1xuaW1wb3J0IHsgRnVlbFJhbmdlIH0gZnJvbSAnLi4vc3RydWN0cy9GdWVsUmFuZ2UuanMnO1xuaW1wb3J0IHsgRUNhbGxJbmZvIH0gZnJvbSAnLi4vc3RydWN0cy9FQ2FsbEluZm8uanMnO1xuaW1wb3J0IHsgQmVsdFN0YXR1cyB9IGZyb20gJy4uL3N0cnVjdHMvQmVsdFN0YXR1cy5qcyc7XG5pbXBvcnQgeyBDb21wb25lbnRWb2x1bWVTdGF0dXMgfSBmcm9tICcuLi9lbnVtcy9Db21wb25lbnRWb2x1bWVTdGF0dXMuanMnO1xuaW1wb3J0IHsgQm9keUluZm9ybWF0aW9uIH0gZnJvbSAnLi4vc3RydWN0cy9Cb2R5SW5mb3JtYXRpb24uanMnO1xuaW1wb3J0IHsgVGlyZVN0YXR1cyB9IGZyb20gJy4uL3N0cnVjdHMvVGlyZVN0YXR1cy5qcyc7XG5cbmNsYXNzIEdldFZlaGljbGVEYXRhUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5HZXRWZWhpY2xlRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtHUFNEYXRhfSBncHMgLSBTZWUgR1BTRGF0YVxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0R3BzIChncHMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoR1BTRGF0YSwgZ3BzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfR1BTLCBncHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtHUFNEYXRhfVxuICAgICAqL1xuICAgIGdldEdwcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChHUFNEYXRhLCBHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9HUFMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzcGVlZCAtIFRoZSB2ZWhpY2xlIHNwZWVkIGluIGtpbG9tZXRlcnMgcGVyIGhvdXJcbiAgICAgKiBAcmV0dXJuIHtHZXRWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFNwZWVkIChzcGVlZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9TUEVFRCwgc3BlZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0U3BlZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfU1BFRUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBycG0gLSBUaGUgbnVtYmVyIG9mIHJldm9sdXRpb25zIHBlciBtaW51dGUgb2YgdGhlIGVuZ2luZVxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0UnBtIChycG0pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfUlBNLCBycG0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0UnBtICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1JQTSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxldmVsIC0gVGhlIGZ1ZWwgbGV2ZWwgaW4gdGhlIHRhbmsgKHBlcmNlbnRhZ2UpXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRGdWVsTGV2ZWwgKGxldmVsKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0ZVRUxfTEVWRUwsIGxldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEZ1ZWxMZXZlbCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9GVUVMX0xFVkVMKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0NvbXBvbmVudFZvbHVtZVN0YXR1c30gbGV2ZWxfc3RhdGUgLSBUaGUgZnVlbCBsZXZlbCBzdGF0ZVxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0RnVlbExldmVsX1N0YXRlIChsZXZlbF9zdGF0ZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShDb21wb25lbnRWb2x1bWVTdGF0dXMsIGxldmVsX3N0YXRlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRlVFTF9MRVZFTF9TVEFURSwgbGV2ZWxfc3RhdGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtDb21wb25lbnRWb2x1bWVTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0RnVlbExldmVsX1N0YXRlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KENvbXBvbmVudFZvbHVtZVN0YXR1cywgR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRlVFTF9MRVZFTF9TVEFURSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGNvbnN1bXB0aW9uIC0gVGhlIGluc3RhbnRhbmVvdXMgZnVlbCBjb25zdW1wdGlvbiBpbiBtaWNyb2xpdHJlc1xuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0SW5zdGFudEZ1ZWxDb25zdW1wdGlvbiAoY29uc3VtcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfSU5TVEFOVF9GVUVMX0NPTlNVTVBUSU9OLCBjb25zdW1wdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRJbnN0YW50RnVlbENvbnN1bXB0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0lOU1RBTlRfRlVFTF9DT05TVU1QVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtGdWVsUmFuZ2VbXX0gcmFuZ2UgLSBUaGUgZXN0aW1hdGUgcmFuZ2UgaW4gS00gdGhlIHZlaGljbGUgY2FuIHRyYXZlbCBiYXNlZCBvbiBmdWVsIGxldmVsIGFuZCBjb25zdW1wdGlvblxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0RnVlbFJhbmdlIChyYW5nZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShGdWVsUmFuZ2UsIHJhbmdlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRlVFTF9SQU5HRSwgcmFuZ2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtGdWVsUmFuZ2VbXX1cbiAgICAgKi9cbiAgICBnZXRGdWVsUmFuZ2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoRnVlbFJhbmdlLCBHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9GVUVMX1JBTkdFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGVtcGVyYXR1cmUgLSBUaGUgZXh0ZXJuYWwgdGVtcGVyYXR1cmUgaW4gZGVncmVlcyBjZWxzaXVzXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRFeHRlcm5hbFRlbXBlcmF0dXJlICh0ZW1wZXJhdHVyZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9FWFRFUk5BTF9URU1QRVJBVFVSRSwgdGVtcGVyYXR1cmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0RXh0ZXJuYWxUZW1wZXJhdHVyZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9FWFRFUk5BTF9URU1QRVJBVFVSRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUdXJuU2lnbmFsfSBzaWduYWwgLSBTZWUgVHVyblNpZ25hbFxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0VHVyblNpZ25hbCAoc2lnbmFsKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFR1cm5TaWduYWwsIHNpZ25hbCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1RVUk5fU0lHTkFMLCBzaWduYWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUdXJuU2lnbmFsfVxuICAgICAqL1xuICAgIGdldFR1cm5TaWduYWwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVHVyblNpZ25hbCwgR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfVFVSTl9TSUdOQUwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2aW4gLSBWZWhpY2xlIGlkZW50aWZpY2F0aW9uIG51bWJlclxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0VmluICh2aW4pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfVklOLCB2aW4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0VmluICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1ZJTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtQUk5ETH0gcHJuZGwgLSBTZWUgUFJORExcbiAgICAgKiBAcmV0dXJuIHtHZXRWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFBybmRsIChwcm5kbCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShQUk5ETCwgcHJuZGwpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9QUk5ETCwgcHJuZGwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtQUk5ETH1cbiAgICAgKi9cbiAgICBnZXRQcm5kbCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChQUk5ETCwgR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfUFJOREwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VGlyZVN0YXR1c30gcHJlc3N1cmUgLSBTZWUgVGlyZVN0YXR1c1xuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0VGlyZVByZXNzdXJlIChwcmVzc3VyZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShUaXJlU3RhdHVzLCBwcmVzc3VyZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1RJUkVfUFJFU1NVUkUsIHByZXNzdXJlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VGlyZVN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRUaXJlUHJlc3N1cmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVGlyZVN0YXR1cywgR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfVElSRV9QUkVTU1VSRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9kb21ldGVyIC0gT2RvbWV0ZXIgaW4ga21cbiAgICAgKiBAcmV0dXJuIHtHZXRWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldE9kb21ldGVyIChvZG9tZXRlcikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9PRE9NRVRFUiwgb2RvbWV0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0T2RvbWV0ZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfT0RPTUVURVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QmVsdFN0YXR1c30gc3RhdHVzIC0gVGhlIHN0YXR1cyBvZiB0aGUgc2VhdCBiZWx0c1xuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0QmVsdFN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEJlbHRTdGF0dXMsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0JFTFRfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCZWx0U3RhdHVzfVxuICAgICAqL1xuICAgIGdldEJlbHRTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQmVsdFN0YXR1cywgR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQkVMVF9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9keUluZm9ybWF0aW9ufSBpbmZvcm1hdGlvbiAtIFRoZSBib2R5IGluZm9ybWF0aW9uIGluY2x1ZGluZyBwb3dlciBtb2Rlc1xuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0Qm9keUluZm9ybWF0aW9uIChpbmZvcm1hdGlvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShCb2R5SW5mb3JtYXRpb24sIGluZm9ybWF0aW9uKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQk9EWV9JTkZPUk1BVElPTiwgaW5mb3JtYXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb2R5SW5mb3JtYXRpb259XG4gICAgICovXG4gICAgZ2V0Qm9keUluZm9ybWF0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEJvZHlJbmZvcm1hdGlvbiwgR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQk9EWV9JTkZPUk1BVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtEZXZpY2VTdGF0dXN9IHN0YXR1cyAtIFRoZSBkZXZpY2Ugc3RhdHVzIGluY2x1ZGluZyBzaWduYWwgYW5kIGJhdHRlcnkgc3RyZW5ndGhcbiAgICAgKiBAcmV0dXJuIHtHZXRWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldERldmljZVN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKERldmljZVN0YXR1cywgc3RhdHVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfREVWSUNFX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7RGV2aWNlU3RhdHVzfVxuICAgICAqL1xuICAgIGdldERldmljZVN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChEZXZpY2VTdGF0dXMsIEdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0RFVklDRV9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFFdmVudFN0YXR1c30gYnJha2luZyAtIFRoZSBzdGF0dXMgb2YgdGhlIGJyYWtlIHBlZGFsXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXREcml2ZXJCcmFraW5nIChicmFraW5nKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIGJyYWtpbmcpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9EUklWRVJfQlJBS0lORywgYnJha2luZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0RHJpdmVyQnJha2luZyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9EUklWRVJfQlJBS0lORyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtXaXBlclN0YXR1c30gc3RhdHVzIC0gVGhlIHN0YXR1cyBvZiB0aGUgd2lwZXJzXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRXaXBlclN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFdpcGVyU3RhdHVzLCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9XSVBFUl9TVEFUVVMsIHN0YXR1cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1dpcGVyU3RhdHVzfVxuICAgICAqL1xuICAgIGdldFdpcGVyU3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFdpcGVyU3RhdHVzLCBHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9XSVBFUl9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SGVhZExhbXBTdGF0dXN9IHN0YXR1cyAtIFN0YXR1cyBvZiB0aGUgaGVhZCBsYW1wc1xuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0SGVhZExhbXBTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShIZWFkTGFtcFN0YXR1cywgc3RhdHVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfSEVBRF9MQU1QX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SGVhZExhbXBTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0SGVhZExhbXBTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSGVhZExhbXBTdGF0dXMsIEdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0hFQURfTEFNUF9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0b3JxdWUgLSBUb3JxdWUgdmFsdWUgZm9yIGVuZ2luZSAoaW4gTm0pIG9uIG5vbi1kaWVzZWwgdmFyaWFudHNcbiAgICAgKiBAcmV0dXJuIHtHZXRWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEVuZ2luZVRvcnF1ZSAodG9ycXVlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VOR0lORV9UT1JRVUUsIHRvcnF1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRFbmdpbmVUb3JxdWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRU5HSU5FX1RPUlFVRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uIC0gQWNjZWxlcmF0b3IgcGVkYWwgcG9zaXRpb24gKHBlcmNlbnRhZ2UgZGVwcmVzc2VkKVxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0QWNjUGVkYWxQb3NpdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQUNDX1BFREFMX1BPU0lUSU9OLCBwb3NpdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRBY2NQZWRhbFBvc2l0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0FDQ19QRURBTF9QT1NJVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGFuZ2xlIC0gQ3VycmVudCBhbmdsZSBvZiB0aGUgc3RlZXJpbmcgd2hlZWwgKGluIGRlZylcbiAgICAgKiBAcmV0dXJuIHtHZXRWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFN0ZWVyaW5nV2hlZWxBbmdsZSAoYW5nbGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfU1RFRVJJTkdfV0hFRUxfQU5HTEUsIGFuZ2xlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFN0ZWVyaW5nV2hlZWxBbmdsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9TVEVFUklOR19XSEVFTF9BTkdMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxpZmUgLSBUaGUgZXN0aW1hdGVkIHBlcmNlbnRhZ2Ugb2YgcmVtYWluaW5nIG9pbCBsaWZlIG9mIHRoZSBlbmdpbmUuXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRFbmdpbmVPaWxMaWZlIChsaWZlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VOR0lORV9PSUxfTElGRSwgbGlmZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRFbmdpbmVPaWxMaWZlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VOR0lORV9PSUxfTElGRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtFbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzfSBzdGF0dXMgLSBUaGUgc3RhdHVzIG9mIHRoZSBwYXJrIGJyYWtlIGFzIHByb3ZpZGVkIGJ5IEVsZWN0cmljIFBhcmsgQnJha2UgKEVQQilcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbS5cbiAgICAgKiBAcmV0dXJuIHtHZXRWZWhpY2xlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEVsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShFbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzLCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9FTEVDVFJPTklDX1BBUktfQlJBS0VfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtFbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzfVxuICAgICAqL1xuICAgIGdldEVsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoRWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cywgR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRUxFQ1RST05JQ19QQVJLX0JSQUtFX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGlkIC0gUGFyYW1ldGVyIHVzZWQgYnkgY2xvdWQgYXBwcyB0byBpZGVudGlmeSBhIGhlYWQgdW5pdFxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0Q2xvdWRBcHBWZWhpY2xlSUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0NMT1VEX0FQUF9WRUhJQ0xFX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRDbG91ZEFwcFZlaGljbGVJRCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9DTE9VRF9BUFBfVkVISUNMRV9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtFQ2FsbEluZm99IGluZm8gLSBFbWVyZ2VuY3kgQ2FsbCBub3RpZmljYXRpb24gYW5kIGNvbmZpcm1hdGlvbiBkYXRhXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRFQ2FsbEluZm8gKGluZm8pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoRUNhbGxJbmZvLCBpbmZvKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRV9DQUxMX0lORk8sIGluZm8pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtFQ2FsbEluZm99XG4gICAgICovXG4gICAgZ2V0RUNhbGxJbmZvICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEVDYWxsSW5mbywgR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRV9DQUxMX0lORk8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QWlyYmFnU3RhdHVzfSBzdGF0dXMgLSBUaGUgc3RhdHVzIG9mIHRoZSBhaXIgYmFnc1xuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0QWlyYmFnU3RhdHVzIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQWlyYmFnU3RhdHVzLCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9BSVJCQUdfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtBaXJiYWdTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0QWlyYmFnU3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEFpcmJhZ1N0YXR1cywgR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQUlSQkFHX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtFbWVyZ2VuY3lFdmVudH0gZXZlbnQgLSBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFuIGVtZXJnZW5jeSBldmVudCAoYW5kIGlmIGl0IG9jY3VycmVkKVxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0RW1lcmdlbmN5RXZlbnQgKGV2ZW50KSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEVtZXJnZW5jeUV2ZW50LCBldmVudCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VNRVJHRU5DWV9FVkVOVCwgZXZlbnQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtFbWVyZ2VuY3lFdmVudH1cbiAgICAgKi9cbiAgICBnZXRFbWVyZ2VuY3lFdmVudCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChFbWVyZ2VuY3lFdmVudCwgR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRU1FUkdFTkNZX0VWRU5UKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0NsdXN0ZXJNb2RlU3RhdHVzfSBzdGF0dXMgLSBUaGUgc3RhdHVzIG1vZGVzIG9mIHRoZSBjbHVzdGVyXG4gICAgICogQHJldHVybiB7R2V0VmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRDbHVzdGVyTW9kZVN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKENsdXN0ZXJNb2RlU3RhdHVzLCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9DTFVTVEVSX01PREVfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtDbHVzdGVyTW9kZVN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRDbHVzdGVyTW9kZVN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChDbHVzdGVyTW9kZVN0YXR1cywgR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQ0xVU1RFUl9NT0RFX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNeUtleX0ga2V5IC0gSW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgTXlLZXkgZmVhdHVyZVxuICAgICAqIEByZXR1cm4ge0dldFZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0TXlLZXkgKGtleSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNeUtleSwga2V5KTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfTVlfS0VZLCBrZXkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNeUtleX1cbiAgICAgKi9cbiAgICBnZXRNeUtleSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNeUtleSwgR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfTVlfS0VZKTtcbiAgICB9XG59XG5cbkdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0dQUyA9ICdncHMnO1xuR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfU1BFRUQgPSAnc3BlZWQnO1xuR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfUlBNID0gJ3JwbSc7XG5HZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9GVUVMX0xFVkVMID0gJ2Z1ZWxMZXZlbCc7XG5HZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9GVUVMX0xFVkVMX1NUQVRFID0gJ2Z1ZWxMZXZlbF9TdGF0ZSc7XG5HZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9JTlNUQU5UX0ZVRUxfQ09OU1VNUFRJT04gPSAnaW5zdGFudEZ1ZWxDb25zdW1wdGlvbic7XG5HZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9GVUVMX1JBTkdFID0gJ2Z1ZWxSYW5nZSc7XG5HZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9FWFRFUk5BTF9URU1QRVJBVFVSRSA9ICdleHRlcm5hbFRlbXBlcmF0dXJlJztcbkdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX1RVUk5fU0lHTkFMID0gJ3R1cm5TaWduYWwnO1xuR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfVklOID0gJ3Zpbic7XG5HZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9QUk5ETCA9ICdwcm5kbCc7XG5HZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9USVJFX1BSRVNTVVJFID0gJ3RpcmVQcmVzc3VyZSc7XG5HZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9PRE9NRVRFUiA9ICdvZG9tZXRlcic7XG5HZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9CRUxUX1NUQVRVUyA9ICdiZWx0U3RhdHVzJztcbkdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0JPRFlfSU5GT1JNQVRJT04gPSAnYm9keUluZm9ybWF0aW9uJztcbkdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0RFVklDRV9TVEFUVVMgPSAnZGV2aWNlU3RhdHVzJztcbkdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0RSSVZFUl9CUkFLSU5HID0gJ2RyaXZlckJyYWtpbmcnO1xuR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfV0lQRVJfU1RBVFVTID0gJ3dpcGVyU3RhdHVzJztcbkdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0hFQURfTEFNUF9TVEFUVVMgPSAnaGVhZExhbXBTdGF0dXMnO1xuR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRU5HSU5FX1RPUlFVRSA9ICdlbmdpbmVUb3JxdWUnO1xuR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQUNDX1BFREFMX1BPU0lUSU9OID0gJ2FjY1BlZGFsUG9zaXRpb24nO1xuR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfU1RFRVJJTkdfV0hFRUxfQU5HTEUgPSAnc3RlZXJpbmdXaGVlbEFuZ2xlJztcbkdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VOR0lORV9PSUxfTElGRSA9ICdlbmdpbmVPaWxMaWZlJztcbkdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0VMRUNUUk9OSUNfUEFSS19CUkFLRV9TVEFUVVMgPSAnZWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cyc7XG5HZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9DTE9VRF9BUFBfVkVISUNMRV9JRCA9ICdjbG91ZEFwcFZlaGljbGVJRCc7XG5HZXRWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9FX0NBTExfSU5GTyA9ICdlQ2FsbEluZm8nO1xuR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfQUlSQkFHX1NUQVRVUyA9ICdhaXJiYWdTdGF0dXMnO1xuR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfRU1FUkdFTkNZX0VWRU5UID0gJ2VtZXJnZW5jeUV2ZW50JztcbkdldFZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX0NMVVNURVJfTU9ERV9TVEFUVVMgPSAnY2x1c3Rlck1vZGVTdGF0dXMnO1xuR2V0VmVoaWNsZURhdGFSZXNwb25zZS5LRVlfTVlfS0VZID0gJ215S2V5JztcblxuZXhwb3J0IHsgR2V0VmVoaWNsZURhdGFSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBOb24gcGVyaW9kaWMgdmVoaWNsZSBkYXRhIHJlYWQgcmVxdWVzdFxuICovXG5jbGFzcyBSZWFkRElEIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5SZWFkRElEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbmFtZSAtIE5hbWUgb2YgRUNVLlxuICAgICAqIEByZXR1cm4ge1JlYWRESUR9XG4gICAgICovXG4gICAgc2V0RWN1TmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWFkRElELktFWV9FQ1VfTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRFY3VOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJlYWRESUQuS0VZX0VDVV9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcltdfSBsb2NhdGlvbiAtIEdldCByYXcgZGF0YSBmcm9tIHZlaGljbGUgZGF0YSBESUQgbG9jYXRpb24ocylcbiAgICAgKiBAcmV0dXJuIHtSZWFkRElEfVxuICAgICAqL1xuICAgIHNldERpZExvY2F0aW9uIChsb2NhdGlvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWFkRElELktFWV9ESURfTE9DQVRJT04sIGxvY2F0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyW119XG4gICAgICovXG4gICAgZ2V0RGlkTG9jYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmVhZERJRC5LRVlfRElEX0xPQ0FUSU9OKTtcbiAgICB9XG59XG5cblJlYWRESUQuS0VZX0VDVV9OQU1FID0gJ2VjdU5hbWUnO1xuUmVhZERJRC5LRVlfRElEX0xPQ0FUSU9OID0gJ2RpZExvY2F0aW9uJztcblxuZXhwb3J0IHsgUmVhZERJRCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBWZWhpY2xlRGF0YVJlc3VsdENvZGUgfSBmcm9tICcuLi9lbnVtcy9WZWhpY2xlRGF0YVJlc3VsdENvZGUuanMnO1xuXG4vKipcbiAqIEluZGl2aWR1YWwgcmVxdWVzdGVkIERJRCByZXN1bHQgYW5kIGRhdGFcbiAqL1xuY2xhc3MgRElEUmVzdWx0IGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZlaGljbGVEYXRhUmVzdWx0Q29kZX0gY29kZSAtIEluZGl2aWR1YWwgRElEIHJlc3VsdCBjb2RlLlxuICAgICAqIEByZXR1cm4ge0RJRFJlc3VsdH1cbiAgICAgKi9cbiAgICBzZXRSZXN1bHRDb2RlIChjb2RlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhUmVzdWx0Q29kZSwgY29kZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERJRFJlc3VsdC5LRVlfUkVTVUxUX0NPREUsIGNvZGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZWhpY2xlRGF0YVJlc3VsdENvZGV9XG4gICAgICovXG4gICAgZ2V0UmVzdWx0Q29kZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YVJlc3VsdENvZGUsIERJRFJlc3VsdC5LRVlfUkVTVUxUX0NPREUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsb2NhdGlvbiAtIExvY2F0aW9uIG9mIHJhdyBkYXRhIGZyb20gdmVoaWNsZSBkYXRhIERJRFxuICAgICAqIEByZXR1cm4ge0RJRFJlc3VsdH1cbiAgICAgKi9cbiAgICBzZXREaWRMb2NhdGlvbiAobG9jYXRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRElEUmVzdWx0LktFWV9ESURfTE9DQVRJT04sIGxvY2F0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldERpZExvY2F0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERJRFJlc3VsdC5LRVlfRElEX0xPQ0FUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGF0YSAtIFJhdyBESUQtYmFzZWQgZGF0YSByZXR1cm5lZCBmb3IgcmVxdWVzdGVkIGVsZW1lbnQuXG4gICAgICogQHJldHVybiB7RElEUmVzdWx0fVxuICAgICAqL1xuICAgIHNldERhdGEgKGRhdGEpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRElEUmVzdWx0LktFWV9EQVRBLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldERhdGEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRElEUmVzdWx0LktFWV9EQVRBKTtcbiAgICB9XG59XG5cbkRJRFJlc3VsdC5LRVlfUkVTVUxUX0NPREUgPSAncmVzdWx0Q29kZSc7XG5ESURSZXN1bHQuS0VZX0RJRF9MT0NBVElPTiA9ICdkaWRMb2NhdGlvbic7XG5ESURSZXN1bHQuS0VZX0RBVEEgPSAnZGF0YSc7XG5cbmV4cG9ydCB7IERJRFJlc3VsdCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IERJRFJlc3VsdCB9IGZyb20gJy4uL3N0cnVjdHMvRElEUmVzdWx0LmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBSZWFkRElEUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5SZWFkRElEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0RJRFJlc3VsdFtdfSByZXN1bHQgLSBBcnJheSBvZiByZXF1ZXN0ZWQgRElEIHJlc3VsdHMgKHdpdGggZGF0YSBpZiBhdmFpbGFibGUpLlxuICAgICAqIEByZXR1cm4ge1JlYWRESURSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXREaWRSZXN1bHQgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShESURSZXN1bHQsIHJlc3VsdCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlYWRESURSZXNwb25zZS5LRVlfRElEX1JFU1VMVCwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7RElEUmVzdWx0W119XG4gICAgICovXG4gICAgZ2V0RGlkUmVzdWx0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KERJRFJlc3VsdCwgUmVhZERJRFJlc3BvbnNlLktFWV9ESURfUkVTVUxUKTtcbiAgICB9XG59XG5cblJlYWRESURSZXNwb25zZS5LRVlfRElEX1JFU1VMVCA9ICdkaWRSZXN1bHQnO1xuXG5leHBvcnQgeyBSZWFkRElEUmVzcG9uc2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbi8qKlxuICogVmVoaWNsZSBtb2R1bGUgZGlhZ25vc3RpYyB0cm91YmxlIGNvZGUgcmVxdWVzdC5cbiAqL1xuY2xhc3MgR2V0RFRDcyBleHRlbmRzIFJwY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuR2V0RFRDcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG5hbWUgLSBOYW1lIG9mIEVDVS5cbiAgICAgKiBAcmV0dXJuIHtHZXREVENzfVxuICAgICAqL1xuICAgIHNldEVjdU5hbWUgKG5hbWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0RFRDcy5LRVlfRUNVX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0RWN1TmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXREVENzLktFWV9FQ1VfTkFNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1hc2sgLSBEVEMgTWFzayBCeXRlIHRvIGJlIHNlbnQgaW4gZGlhZ25vc3RpYyByZXF1ZXN0IHRvIG1vZHVsZSAuXG4gICAgICogQHJldHVybiB7R2V0RFRDc31cbiAgICAgKi9cbiAgICBzZXREdGNNYXNrIChtYXNrKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldERUQ3MuS0VZX0RUQ19NQVNLLCBtYXNrKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldER0Y01hc2sgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0RFRDcy5LRVlfRFRDX01BU0spO1xuICAgIH1cbn1cblxuR2V0RFRDcy5LRVlfRUNVX05BTUUgPSAnZWN1TmFtZSc7XG5HZXREVENzLktFWV9EVENfTUFTSyA9ICdkdGNNYXNrJztcblxuZXhwb3J0IHsgR2V0RFRDcyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBHZXREVENzUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5HZXREVENzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVhZGVyIC0gMiBieXRlIEVDVSBIZWFkZXIgZm9yIERUQyByZXNwb25zZSAoYXMgZGVmaW5lZCBpbiBWSFJfTGF5b3V0X1NwZWNpZmljYXRpb25fRFRDcy5wZGYpXG4gICAgICogQHJldHVybiB7R2V0RFRDc1Jlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEVjdUhlYWRlciAoaGVhZGVyKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldERUQ3NSZXNwb25zZS5LRVlfRUNVX0hFQURFUiwgaGVhZGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEVjdUhlYWRlciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXREVENzUmVzcG9uc2UuS0VZX0VDVV9IRUFERVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nW119IGR0YyAtIEFycmF5IG9mIGFsbCByZXBvcnRlZCBEVENzIG9uIG1vZHVsZSAoZWN1SGVhZGVyIGNvbnRhaW5zIGluZm9ybWF0aW9uIGlmIGxpc3QgaXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZWQpLiBFYWNoIERUQyBpcyByZXByZXNlbnRlZCBieSA0IGJ5dGVzICgzIGJ5dGVzIG9mIGRhdGEgYW5kIDEgYnl0ZSBzdGF0dXMgYXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGluIFZIUl9MYXlvdXRfU3BlY2lmaWNhdGlvbl9EVENzLnBkZikuXG4gICAgICogQHJldHVybiB7R2V0RFRDc1Jlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldER0YyAoZHRjKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldERUQ3NSZXNwb25zZS5LRVlfRFRDLCBkdGMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmdbXX1cbiAgICAgKi9cbiAgICBnZXREdGMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0RFRDc1Jlc3BvbnNlLktFWV9EVEMpO1xuICAgIH1cbn1cblxuR2V0RFRDc1Jlc3BvbnNlLktFWV9FQ1VfSEVBREVSID0gJ2VjdUhlYWRlcic7XG5HZXREVENzUmVzcG9uc2UuS0VZX0RUQyA9ICdkdGMnO1xuXG5leHBvcnQgeyBHZXREVENzUmVzcG9uc2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbi8qKlxuICogTm9uIHBlcmlvZGljIHZlaGljbGUgZGlhZ25vc3RpYyByZXF1ZXN0XG4gKi9cbmNsYXNzIERpYWdub3N0aWNNZXNzYWdlIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5EaWFnbm9zdGljTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIC0gTmFtZSBvZiB0YXJnZXQgRUNVLlxuICAgICAqIEByZXR1cm4ge0RpYWdub3N0aWNNZXNzYWdlfVxuICAgICAqL1xuICAgIHNldFRhcmdldElEIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEaWFnbm9zdGljTWVzc2FnZS5LRVlfVEFSR0VUX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRUYXJnZXRJRCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEaWFnbm9zdGljTWVzc2FnZS5LRVlfVEFSR0VUX0lEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoIC0gTGVuZ3RoIG9mIG1lc3NhZ2UgKGluIGJ5dGVzKS5cbiAgICAgKiBAcmV0dXJuIHtEaWFnbm9zdGljTWVzc2FnZX1cbiAgICAgKi9cbiAgICBzZXRNZXNzYWdlTGVuZ3RoIChsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGlhZ25vc3RpY01lc3NhZ2UuS0VZX01FU1NBR0VfTEVOR1RILCBsZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0TWVzc2FnZUxlbmd0aCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEaWFnbm9zdGljTWVzc2FnZS5LRVlfTUVTU0FHRV9MRU5HVEgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyW119IGRhdGEgLSBBcnJheSBvZiBieXRlcyBjb21wcmlzaW5nIENBTiBtZXNzYWdlLlxuICAgICAqIEByZXR1cm4ge0RpYWdub3N0aWNNZXNzYWdlfVxuICAgICAqL1xuICAgIHNldE1lc3NhZ2VEYXRhIChkYXRhKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERpYWdub3N0aWNNZXNzYWdlLktFWV9NRVNTQUdFX0RBVEEsIGRhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJbXX1cbiAgICAgKi9cbiAgICBnZXRNZXNzYWdlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEaWFnbm9zdGljTWVzc2FnZS5LRVlfTUVTU0FHRV9EQVRBKTtcbiAgICB9XG59XG5cbkRpYWdub3N0aWNNZXNzYWdlLktFWV9UQVJHRVRfSUQgPSAndGFyZ2V0SUQnO1xuRGlhZ25vc3RpY01lc3NhZ2UuS0VZX01FU1NBR0VfTEVOR1RIID0gJ21lc3NhZ2VMZW5ndGgnO1xuRGlhZ25vc3RpY01lc3NhZ2UuS0VZX01FU1NBR0VfREFUQSA9ICdtZXNzYWdlRGF0YSc7XG5cbmV4cG9ydCB7IERpYWdub3N0aWNNZXNzYWdlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgUnBjUmVzcG9uc2UgfSBmcm9tICcuLi9ScGNSZXNwb25zZS5qcyc7XG5cbmNsYXNzIERpYWdub3N0aWNNZXNzYWdlUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5EaWFnbm9zdGljTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJbXX0gcmVzdWx0IC0gQXJyYXkgb2YgYnl0ZXMgY29tcHJpc2luZyBDQU4gbWVzc2FnZSByZXN1bHQuXG4gICAgICogQHJldHVybiB7RGlhZ25vc3RpY01lc3NhZ2VSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRNZXNzYWdlRGF0YVJlc3VsdCAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERpYWdub3N0aWNNZXNzYWdlUmVzcG9uc2UuS0VZX01FU1NBR0VfREFUQV9SRVNVTFQsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcltdfVxuICAgICAqL1xuICAgIGdldE1lc3NhZ2VEYXRhUmVzdWx0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERpYWdub3N0aWNNZXNzYWdlUmVzcG9uc2UuS0VZX01FU1NBR0VfREFUQV9SRVNVTFQpO1xuICAgIH1cbn1cblxuRGlhZ25vc3RpY01lc3NhZ2VSZXNwb25zZS5LRVlfTUVTU0FHRV9EQVRBX1JFU1VMVCA9ICdtZXNzYWdlRGF0YVJlc3VsdCc7XG5cbmV4cG9ydCB7IERpYWdub3N0aWNNZXNzYWdlUmVzcG9uc2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBTb2Z0QnV0dG9uIH0gZnJvbSAnLi4vc3RydWN0cy9Tb2Z0QnV0dG9uLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVsbCBzY3JlZW4gb3ZlcmxheSBjb250YWluaW5nIGEgbGFyZ2UgYmxvY2sgb2YgZm9ybWF0dGVkIHRleHQgdGhhdCBjYW4gYmUgc2Nyb2xsZWQgd2l0aCB1cCB0byA4XG4gKiBTb2Z0QnV0dG9ucyBkZWZpbmVkXG4gKi9cbmNsYXNzIFNjcm9sbGFibGVNZXNzYWdlIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5TY3JvbGxhYmxlTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGJvZHkgLSBCb2R5IG9mIHRleHQgdGhhdCBjYW4gaW5jbHVkZSBuZXdsaW5lcyBhbmQgdGFicy5cbiAgICAgKiBAcmV0dXJuIHtTY3JvbGxhYmxlTWVzc2FnZX1cbiAgICAgKi9cbiAgICBzZXRTY3JvbGxhYmxlTWVzc2FnZUJvZHkgKGJvZHkpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2Nyb2xsYWJsZU1lc3NhZ2UuS0VZX1NDUk9MTEFCTEVfTUVTU0FHRV9CT0RZLCBib2R5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFNjcm9sbGFibGVNZXNzYWdlQm9keSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTY3JvbGxhYmxlTWVzc2FnZS5LRVlfU0NST0xMQUJMRV9NRVNTQUdFX0JPRFkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0aW1lb3V0IC0gQXBwIGRlZmluZWQgdGltZW91dC4gSW5kaWNhdGVzIGhvdyBsb25nIG9mIGEgdGltZW91dCBmcm9tIHRoZSBsYXN0IGFjdGlvbiAoaS5lLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsaW5nIG1lc3NhZ2UgcmVzZXRzIHRpbWVvdXQpLlxuICAgICAqIEByZXR1cm4ge1Njcm9sbGFibGVNZXNzYWdlfVxuICAgICAqL1xuICAgIHNldFRpbWVvdXQgKHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2Nyb2xsYWJsZU1lc3NhZ2UuS0VZX1RJTUVPVVQsIHRpbWVvdXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0VGltZW91dCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTY3JvbGxhYmxlTWVzc2FnZS5LRVlfVElNRU9VVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTb2Z0QnV0dG9uW119IGJ1dHRvbnMgLSBBcHAgZGVmaW5lZCBTb2Z0QnV0dG9ucy4gSWYgb21pdHRlZCBvbiBzdXBwb3J0ZWQgZGlzcGxheXMsIG9ubHkgdGhlIHN5c3RlbVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBcIkNsb3NlXCIgU29mdEJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICAgKiBAcmV0dXJuIHtTY3JvbGxhYmxlTWVzc2FnZX1cbiAgICAgKi9cbiAgICBzZXRTb2Z0QnV0dG9ucyAoYnV0dG9ucykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTb2Z0QnV0dG9uLCBidXR0b25zLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2Nyb2xsYWJsZU1lc3NhZ2UuS0VZX1NPRlRfQlVUVE9OUywgYnV0dG9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NvZnRCdXR0b25bXX1cbiAgICAgKi9cbiAgICBnZXRTb2Z0QnV0dG9ucyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTb2Z0QnV0dG9uLCBTY3JvbGxhYmxlTWVzc2FnZS5LRVlfU09GVF9CVVRUT05TKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaWQgLSBBbiBJRCBmb3IgdGhpcyBzcGVjaWZpYyBTY3JvbGxhYmxlTWVzc2FnZSB0byBhbGxvdyBjYW5jZWxsYXRpb24gdGhyb3VnaCB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBgQ2FuY2VsSW50ZXJhY3Rpb25gIFJQQy5cbiAgICAgKiBAcmV0dXJuIHtTY3JvbGxhYmxlTWVzc2FnZX1cbiAgICAgKi9cbiAgICBzZXRDYW5jZWxJRCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2Nyb2xsYWJsZU1lc3NhZ2UuS0VZX0NBTkNFTF9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0Q2FuY2VsSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2Nyb2xsYWJsZU1lc3NhZ2UuS0VZX0NBTkNFTF9JRCk7XG4gICAgfVxufVxuXG5TY3JvbGxhYmxlTWVzc2FnZS5LRVlfU0NST0xMQUJMRV9NRVNTQUdFX0JPRFkgPSAnc2Nyb2xsYWJsZU1lc3NhZ2VCb2R5JztcblNjcm9sbGFibGVNZXNzYWdlLktFWV9USU1FT1VUID0gJ3RpbWVvdXQnO1xuU2Nyb2xsYWJsZU1lc3NhZ2UuS0VZX1NPRlRfQlVUVE9OUyA9ICdzb2Z0QnV0dG9ucyc7XG5TY3JvbGxhYmxlTWVzc2FnZS5LRVlfQ0FOQ0VMX0lEID0gJ2NhbmNlbElEJztcblxuZXhwb3J0IHsgU2Nyb2xsYWJsZU1lc3NhZ2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgU2Nyb2xsYWJsZU1lc3NhZ2VSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlNjcm9sbGFibGVNZXNzYWdlKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgU2Nyb2xsYWJsZU1lc3NhZ2VSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVsbCBzY3JlZW4gb3IgcG9wLXVwIG92ZXJsYXkgKGRlcGVuZGluZyBvbiBwbGF0Zm9ybSkgd2l0aCBhIHNpbmdsZSB1c2VyIGNvbnRyb2xsZWQgc2xpZGVyLlxuICovXG5jbGFzcyBTbGlkZXIgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlNsaWRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHRpY2tzIC0gTnVtYmVyIG9mIHNlbGVjdGFibGUgaXRlbXMgb24gYSBob3Jpem9udGFsIGF4aXNcbiAgICAgKiBAcmV0dXJuIHtTbGlkZXJ9XG4gICAgICovXG4gICAgc2V0TnVtVGlja3MgKHRpY2tzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNsaWRlci5LRVlfTlVNX1RJQ0tTLCB0aWNrcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXROdW1UaWNrcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTbGlkZXIuS0VZX05VTV9USUNLUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uIC0gSW5pdGlhbCBwb3NpdGlvbiBvZiBzbGlkZXIgY29udHJvbCAoY2Fubm90IGV4Y2VlZCBudW1UaWNrcylcbiAgICAgKiBAcmV0dXJuIHtTbGlkZXJ9XG4gICAgICovXG4gICAgc2V0UG9zaXRpb24gKHBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNsaWRlci5LRVlfUE9TSVRJT04sIHBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFBvc2l0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNsaWRlci5LRVlfUE9TSVRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXIgLSBUZXh0IGhlYWRlciB0byBkaXNwbGF5XG4gICAgICogQHJldHVybiB7U2xpZGVyfVxuICAgICAqL1xuICAgIHNldFNsaWRlckhlYWRlciAoaGVhZGVyKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNsaWRlci5LRVlfU0xJREVSX0hFQURFUiwgaGVhZGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFNsaWRlckhlYWRlciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTbGlkZXIuS0VZX1NMSURFUl9IRUFERVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nW119IGZvb3RlciAtIFRleHQgZm9vdGVyIHRvIGRpc3BsYXkgKG1lYW50IHRvIGRpc3BsYXkgbWluL21heCB0aHJlc2hvbGQgZGVzY3JpcHRvcnMpLiBGb3IgYSBzdGF0aWNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0IGZvb3Rlciwgb25seSBvbmUgZm9vdGVyIHN0cmluZyBzaGFsbCBiZSBwcm92aWRlZCBpbiB0aGUgYXJyYXkuIEZvciBhIGR5bmFtaWMgdGV4dFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvb3RlciwgdGhlIG51bWJlciBvZiBmb290ZXIgdGV4dCBzdHJpbmcgaW4gdGhlIGFycmF5IG11c3QgbWF0Y2ggdGhlIG51bVRpY2tzIHZhbHVlLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBhIGR5bmFtaWMgdGV4dCBmb290ZXIsIHRleHQgYXJyYXkgc3RyaW5nIHNob3VsZCBjb3JyZWxhdGUgd2l0aCBwb3RlbnRpYWwgc2xpZGVyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gaW5kZXguIElmIG9taXR0ZWQgb24gc3VwcG9ydGVkIGRpc3BsYXlzLCBubyBmb290ZXIgdGV4dCBzaGFsbCBiZSBkaXNwbGF5ZWQuXG4gICAgICogQHJldHVybiB7U2xpZGVyfVxuICAgICAqL1xuICAgIHNldFNsaWRlckZvb3RlciAoZm9vdGVyKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNsaWRlci5LRVlfU0xJREVSX0ZPT1RFUiwgZm9vdGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0U2xpZGVyRm9vdGVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNsaWRlci5LRVlfU0xJREVSX0ZPT1RFUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHRpbWVvdXQgLSBBcHAgZGVmaW5lZCB0aW1lb3V0LiBJbmRpY2F0ZXMgaG93IGxvbmcgb2YgYSB0aW1lb3V0IGZyb20gdGhlIGxhc3QgYWN0aW9uIChpLmUuIHNsaWRpbmdcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgcmVzZXRzIHRpbWVvdXQpLiBJZiBvbWl0dGVkLCB0aGUgdmFsdWUgaXMgc2V0IHRvIDEwMDAwLlxuICAgICAqIEByZXR1cm4ge1NsaWRlcn1cbiAgICAgKi9cbiAgICBzZXRUaW1lb3V0ICh0aW1lb3V0KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNsaWRlci5LRVlfVElNRU9VVCwgdGltZW91dCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRUaW1lb3V0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNsaWRlci5LRVlfVElNRU9VVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIC0gQW4gSUQgZm9yIHRoaXMgc3BlY2lmaWMgU2xpZGVyIHRvIGFsbG93IGNhbmNlbGxhdGlvbiB0aHJvdWdoIHRoZSBgQ2FuY2VsSW50ZXJhY3Rpb25gIFJQQy5cbiAgICAgKiBAcmV0dXJuIHtTbGlkZXJ9XG4gICAgICovXG4gICAgc2V0Q2FuY2VsSUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNsaWRlci5LRVlfQ0FOQ0VMX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRDYW5jZWxJRCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTbGlkZXIuS0VZX0NBTkNFTF9JRCk7XG4gICAgfVxufVxuXG5TbGlkZXIuS0VZX05VTV9USUNLUyA9ICdudW1UaWNrcyc7XG5TbGlkZXIuS0VZX1BPU0lUSU9OID0gJ3Bvc2l0aW9uJztcblNsaWRlci5LRVlfU0xJREVSX0hFQURFUiA9ICdzbGlkZXJIZWFkZXInO1xuU2xpZGVyLktFWV9TTElERVJfRk9PVEVSID0gJ3NsaWRlckZvb3Rlcic7XG5TbGlkZXIuS0VZX1RJTUVPVVQgPSAndGltZW91dCc7XG5TbGlkZXIuS0VZX0NBTkNFTF9JRCA9ICdjYW5jZWxJRCc7XG5cbmV4cG9ydCB7IFNsaWRlciB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBTbGlkZXJSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlNsaWRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uIC0gQ3VycmVudCBzbGlkZXIgdmFsdWUgcmV0dXJuZWQgd2hlbiBzYXZlZCBvciBjYW5jZWxlZCAoYWJvcnRlZCkgVGhpcyB2YWx1ZSBpcyBvbmx5XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgZm9yIHJlc3VsdENvZGVzIFwiU0FWRURcIiBvciBcIkFCT1JURURcIlxuICAgICAqIEByZXR1cm4ge1NsaWRlclJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFNsaWRlclBvc2l0aW9uIChwb3NpdGlvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTbGlkZXJSZXNwb25zZS5LRVlfU0xJREVSX1BPU0lUSU9OLCBwb3NpdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRTbGlkZXJQb3NpdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTbGlkZXJSZXNwb25zZS5LRVlfU0xJREVSX1BPU0lUSU9OKTtcbiAgICB9XG59XG5cblNsaWRlclJlc3BvbnNlLktFWV9TTElERVJfUE9TSVRJT04gPSAnc2xpZGVyUG9zaXRpb24nO1xuXG5leHBvcnQgeyBTbGlkZXJSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IFNvZnRCdXR0b24gfSBmcm9tICcuLi9zdHJ1Y3RzL1NvZnRCdXR0b24uanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgSW1hZ2UgfSBmcm9tICcuLi9zdHJ1Y3RzL0ltYWdlLmpzJztcblxuY2xhc3MgU2hvd0NvbnN0YW50VEJUIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5TaG93Q29uc3RhbnRUQlQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0MVxuICAgICAqIEByZXR1cm4ge1Nob3dDb25zdGFudFRCVH1cbiAgICAgKi9cbiAgICBzZXROYXZpZ2F0aW9uVGV4dDEgKHRleHQxKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3dDb25zdGFudFRCVC5LRVlfTkFWSUdBVElPTl9URVhUXzEsIHRleHQxKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldE5hdmlnYXRpb25UZXh0MSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTaG93Q29uc3RhbnRUQlQuS0VZX05BVklHQVRJT05fVEVYVF8xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dDJcbiAgICAgKiBAcmV0dXJuIHtTaG93Q29uc3RhbnRUQlR9XG4gICAgICovXG4gICAgc2V0TmF2aWdhdGlvblRleHQyICh0ZXh0Mikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaG93Q29uc3RhbnRUQlQuS0VZX05BVklHQVRJT05fVEVYVF8yLCB0ZXh0Mik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXROYXZpZ2F0aW9uVGV4dDIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2hvd0NvbnN0YW50VEJULktFWV9OQVZJR0FUSU9OX1RFWFRfMik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV0YVxuICAgICAqIEByZXR1cm4ge1Nob3dDb25zdGFudFRCVH1cbiAgICAgKi9cbiAgICBzZXRFdGEgKGV0YSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaG93Q29uc3RhbnRUQlQuS0VZX0VUQSwgZXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldEV0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTaG93Q29uc3RhbnRUQlQuS0VZX0VUQSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRlc3RpbmF0aW9uXG4gICAgICogQHJldHVybiB7U2hvd0NvbnN0YW50VEJUfVxuICAgICAqL1xuICAgIHNldFRpbWVUb0Rlc3RpbmF0aW9uIChkZXN0aW5hdGlvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaG93Q29uc3RhbnRUQlQuS0VZX1RJTUVfVE9fREVTVElOQVRJT04sIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFRpbWVUb0Rlc3RpbmF0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNob3dDb25zdGFudFRCVC5LRVlfVElNRV9UT19ERVNUSU5BVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRpc3RhbmNlXG4gICAgICogQHJldHVybiB7U2hvd0NvbnN0YW50VEJUfVxuICAgICAqL1xuICAgIHNldFRvdGFsRGlzdGFuY2UgKGRpc3RhbmNlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3dDb25zdGFudFRCVC5LRVlfVE9UQUxfRElTVEFOQ0UsIGRpc3RhbmNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFRvdGFsRGlzdGFuY2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2hvd0NvbnN0YW50VEJULktFWV9UT1RBTF9ESVNUQU5DRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtJbWFnZX0gaWNvblxuICAgICAqIEByZXR1cm4ge1Nob3dDb25zdGFudFRCVH1cbiAgICAgKi9cbiAgICBzZXRUdXJuSWNvbiAoaWNvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShJbWFnZSwgaWNvbik7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3dDb25zdGFudFRCVC5LRVlfVFVSTl9JQ09OLCBpY29uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SW1hZ2V9XG4gICAgICovXG4gICAgZ2V0VHVybkljb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSW1hZ2UsIFNob3dDb25zdGFudFRCVC5LRVlfVFVSTl9JQ09OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0ltYWdlfSBpY29uXG4gICAgICogQHJldHVybiB7U2hvd0NvbnN0YW50VEJUfVxuICAgICAqL1xuICAgIHNldE5leHRUdXJuSWNvbiAoaWNvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShJbWFnZSwgaWNvbik7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNob3dDb25zdGFudFRCVC5LRVlfTkVYVF9UVVJOX0lDT04sIGljb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtJbWFnZX1cbiAgICAgKi9cbiAgICBnZXROZXh0VHVybkljb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSW1hZ2UsIFNob3dDb25zdGFudFRCVC5LRVlfTkVYVF9UVVJOX0lDT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtYW5ldXZlciAtIEZyYWN0aW9uIG9mIGRpc3RhbmNlIHRpbGwgbmV4dCBtYW5ldXZlciAoc3RhcnRpbmcgZnJvbSB3aGVuIEFsZXJ0TWFuZXV2ZXIgaXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQpLiBVc2VkIHRvIGNhbGN1bGF0ZSBwcm9ncmVzcyBiYXIuXG4gICAgICogQHJldHVybiB7U2hvd0NvbnN0YW50VEJUfVxuICAgICAqL1xuICAgIHNldERpc3RhbmNlVG9NYW5ldXZlciAobWFuZXV2ZXIpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2hvd0NvbnN0YW50VEJULktFWV9ESVNUQU5DRV9UT19NQU5FVVZFUiwgbWFuZXV2ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0RGlzdGFuY2VUb01hbmV1dmVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNob3dDb25zdGFudFRCVC5LRVlfRElTVEFOQ0VfVE9fTUFORVVWRVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSAtIERpc3RhbmNlIHRpbGwgbmV4dCBtYW5ldXZlciAoc3RhcnRpbmcgZnJvbSkgZnJvbSBwcmV2aW91cyBtYW5ldXZlci4gVXNlZCB0byBjYWxjdWxhdGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyBiYXIuXG4gICAgICogQHJldHVybiB7U2hvd0NvbnN0YW50VEJUfVxuICAgICAqL1xuICAgIHNldERpc3RhbmNlVG9NYW5ldXZlclNjYWxlIChzY2FsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaG93Q29uc3RhbnRUQlQuS0VZX0RJU1RBTkNFX1RPX01BTkVVVkVSX1NDQUxFLCBzY2FsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXREaXN0YW5jZVRvTWFuZXV2ZXJTY2FsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTaG93Q29uc3RhbnRUQlQuS0VZX0RJU1RBTkNFX1RPX01BTkVVVkVSX1NDQUxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvbXBsZXRlIC0gSWYgYW5kIHdoZW4gYSBtYW5ldXZlciBoYXMgY29tcGxldGVkIHdoaWxlIGFuIEFsZXJ0TWFuZXV2ZXIgaXMgYWN0aXZlLCB0aGUgYXBwIG11c3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZCB0aGlzIHZhbHVlIHNldCB0byBUUlVFIGluIG9yZGVyIHRvIGNsZWFyIHRoZSBBbGVydE1hbmV1dmVyIG92ZXJsYXkuIElmIG9taXR0ZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIHdpbGwgYmUgYXNzdW1lZCBhcyBGQUxTRS5cbiAgICAgKiBAcmV0dXJuIHtTaG93Q29uc3RhbnRUQlR9XG4gICAgICovXG4gICAgc2V0TWFuZXV2ZXJDb21wbGV0ZSAoY29tcGxldGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2hvd0NvbnN0YW50VEJULktFWV9NQU5FVVZFUl9DT01QTEVURSwgY29tcGxldGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldE1hbmV1dmVyQ29tcGxldGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2hvd0NvbnN0YW50VEJULktFWV9NQU5FVVZFUl9DT01QTEVURSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTb2Z0QnV0dG9uW119IGJ1dHRvbnMgLSBUaHJlZSBkeW5hbWljIFNvZnRCdXR0b25zIGF2YWlsYWJsZSAoZmlyc3QgU29mdEJ1dHRvbiBpcyBmaXhlZCB0byBcIlR1cm5zXCIpLiBJZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21pdHRlZCBvbiBzdXBwb3J0ZWQgZGlzcGxheXMsIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIFNvZnRCdXR0b24gdmFsdWVzIHdpbGwgbm90XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UuXG4gICAgICogQHJldHVybiB7U2hvd0NvbnN0YW50VEJUfVxuICAgICAqL1xuICAgIHNldFNvZnRCdXR0b25zIChidXR0b25zKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFNvZnRCdXR0b24sIGJ1dHRvbnMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaG93Q29uc3RhbnRUQlQuS0VZX1NPRlRfQlVUVE9OUywgYnV0dG9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NvZnRCdXR0b25bXX1cbiAgICAgKi9cbiAgICBnZXRTb2Z0QnV0dG9ucyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTb2Z0QnV0dG9uLCBTaG93Q29uc3RhbnRUQlQuS0VZX1NPRlRfQlVUVE9OUyk7XG4gICAgfVxufVxuXG5TaG93Q29uc3RhbnRUQlQuS0VZX05BVklHQVRJT05fVEVYVF8xID0gJ25hdmlnYXRpb25UZXh0MSc7XG5TaG93Q29uc3RhbnRUQlQuS0VZX05BVklHQVRJT05fVEVYVF8yID0gJ25hdmlnYXRpb25UZXh0Mic7XG5TaG93Q29uc3RhbnRUQlQuS0VZX0VUQSA9ICdldGEnO1xuU2hvd0NvbnN0YW50VEJULktFWV9USU1FX1RPX0RFU1RJTkFUSU9OID0gJ3RpbWVUb0Rlc3RpbmF0aW9uJztcblNob3dDb25zdGFudFRCVC5LRVlfVE9UQUxfRElTVEFOQ0UgPSAndG90YWxEaXN0YW5jZSc7XG5TaG93Q29uc3RhbnRUQlQuS0VZX1RVUk5fSUNPTiA9ICd0dXJuSWNvbic7XG5TaG93Q29uc3RhbnRUQlQuS0VZX05FWFRfVFVSTl9JQ09OID0gJ25leHRUdXJuSWNvbic7XG5TaG93Q29uc3RhbnRUQlQuS0VZX0RJU1RBTkNFX1RPX01BTkVVVkVSID0gJ2Rpc3RhbmNlVG9NYW5ldXZlcic7XG5TaG93Q29uc3RhbnRUQlQuS0VZX0RJU1RBTkNFX1RPX01BTkVVVkVSX1NDQUxFID0gJ2Rpc3RhbmNlVG9NYW5ldXZlclNjYWxlJztcblNob3dDb25zdGFudFRCVC5LRVlfTUFORVVWRVJfQ09NUExFVEUgPSAnbWFuZXV2ZXJDb21wbGV0ZSc7XG5TaG93Q29uc3RhbnRUQlQuS0VZX1NPRlRfQlVUVE9OUyA9ICdzb2Z0QnV0dG9ucyc7XG5cbmV4cG9ydCB7IFNob3dDb25zdGFudFRCVCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBTaG93Q29uc3RhbnRUQlRSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlNob3dDb25zdGFudFRCVCk7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB7IFNob3dDb25zdGFudFRCVFJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgVFRTQ2h1bmsgfSBmcm9tICcuLi9zdHJ1Y3RzL1RUU0NodW5rLmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFNvZnRCdXR0b24gfSBmcm9tICcuLi9zdHJ1Y3RzL1NvZnRCdXR0b24uanMnO1xuXG5jbGFzcyBBbGVydE1hbmV1dmVyIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5BbGVydE1hbmV1dmVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RUU0NodW5rW119IGNodW5rcyAtIEFuIGFycmF5IG9mIHRleHQgY2h1bmtzIG9mIHR5cGUgVFRTQ2h1bmsuIFNlZSBUVFNDaHVua1xuICAgICAqIEByZXR1cm4ge0FsZXJ0TWFuZXV2ZXJ9XG4gICAgICovXG4gICAgc2V0VHRzQ2h1bmtzIChjaHVua3MpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVFRTQ2h1bmssIGNodW5rcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFsZXJ0TWFuZXV2ZXIuS0VZX1RUU19DSFVOS1MsIGNodW5rcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RUU0NodW5rW119XG4gICAgICovXG4gICAgZ2V0VHRzQ2h1bmtzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRUU0NodW5rLCBBbGVydE1hbmV1dmVyLktFWV9UVFNfQ0hVTktTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NvZnRCdXR0b25bXX0gYnV0dG9ucyAtIElmIG9taXR0ZWQgb24gc3VwcG9ydGVkIGRpc3BsYXlzLCBvbmx5IHRoZSBzeXN0ZW0gZGVmaW5lZCBcIkNsb3NlXCIgU29mdEJ1dHRvblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhbGwgYmUgZGlzcGxheWVkLlxuICAgICAqIEByZXR1cm4ge0FsZXJ0TWFuZXV2ZXJ9XG4gICAgICovXG4gICAgc2V0U29mdEJ1dHRvbnMgKGJ1dHRvbnMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU29mdEJ1dHRvbiwgYnV0dG9ucywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFsZXJ0TWFuZXV2ZXIuS0VZX1NPRlRfQlVUVE9OUywgYnV0dG9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NvZnRCdXR0b25bXX1cbiAgICAgKi9cbiAgICBnZXRTb2Z0QnV0dG9ucyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTb2Z0QnV0dG9uLCBBbGVydE1hbmV1dmVyLktFWV9TT0ZUX0JVVFRPTlMpO1xuICAgIH1cbn1cblxuQWxlcnRNYW5ldXZlci5LRVlfVFRTX0NIVU5LUyA9ICd0dHNDaHVua3MnO1xuQWxlcnRNYW5ldXZlci5LRVlfU09GVF9CVVRUT05TID0gJ3NvZnRCdXR0b25zJztcblxuZXhwb3J0IHsgQWxlcnRNYW5ldXZlciB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBBbGVydE1hbmV1dmVyUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5BbGVydE1hbmV1dmVyKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgQWxlcnRNYW5ldXZlclJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnLi9JbWFnZS5qcyc7XG5cbmNsYXNzIFR1cm4gZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IC0gSW5kaXZpZHVhbCB0dXJuIHRleHQuIE11c3QgcHJvdmlkZSBhdCBsZWFzdCB0ZXh0IG9yIGljb24gZm9yIGEgZ2l2ZW4gdHVybi5cbiAgICAgKiBAcmV0dXJuIHtUdXJufVxuICAgICAqL1xuICAgIHNldE5hdmlnYXRpb25UZXh0ICh0ZXh0KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFR1cm4uS0VZX05BVklHQVRJT05fVEVYVCwgdGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXROYXZpZ2F0aW9uVGV4dCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihUdXJuLktFWV9OQVZJR0FUSU9OX1RFWFQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW1hZ2V9IGljb24gLSBJbmRpdmlkdWFsIHR1cm4gaWNvbi4gTXVzdCBwcm92aWRlIGF0IGxlYXN0IHRleHQgb3IgaWNvbiBmb3IgYSBnaXZlbiB0dXJuLlxuICAgICAqIEByZXR1cm4ge1R1cm59XG4gICAgICovXG4gICAgc2V0VHVybkljb24gKGljb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSW1hZ2UsIGljb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihUdXJuLktFWV9UVVJOX0lDT04sIGljb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtJbWFnZX1cbiAgICAgKi9cbiAgICBnZXRUdXJuSWNvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChJbWFnZSwgVHVybi5LRVlfVFVSTl9JQ09OKTtcbiAgICB9XG59XG5cblR1cm4uS0VZX05BVklHQVRJT05fVEVYVCA9ICduYXZpZ2F0aW9uVGV4dCc7XG5UdXJuLktFWV9UVVJOX0lDT04gPSAndHVybkljb24nO1xuXG5leHBvcnQgeyBUdXJuIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgVHVybiB9IGZyb20gJy4uL3N0cnVjdHMvVHVybi5qcyc7XG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBTb2Z0QnV0dG9uIH0gZnJvbSAnLi4vc3RydWN0cy9Tb2Z0QnV0dG9uLmpzJztcblxuY2xhc3MgVXBkYXRlVHVybkxpc3QgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlVwZGF0ZVR1cm5MaXN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1R1cm5bXX0gbGlzdFxuICAgICAqIEByZXR1cm4ge1VwZGF0ZVR1cm5MaXN0fVxuICAgICAqL1xuICAgIHNldFR1cm5MaXN0IChsaXN0KSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFR1cm4sIGxpc3QsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVcGRhdGVUdXJuTGlzdC5LRVlfVFVSTl9MSVNULCBsaXN0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VHVybltdfVxuICAgICAqL1xuICAgIGdldFR1cm5MaXN0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFR1cm4sIFVwZGF0ZVR1cm5MaXN0LktFWV9UVVJOX0xJU1QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U29mdEJ1dHRvbltdfSBidXR0b25zIC0gSWYgb21pdHRlZCBvbiBzdXBwb3J0ZWQgZGlzcGxheXMsIGFwcC1kZWZpbmVkIFNvZnRCdXR0b24gd2lsbCBiZSBsZWZ0IGJsYW5rLlxuICAgICAqIEByZXR1cm4ge1VwZGF0ZVR1cm5MaXN0fVxuICAgICAqL1xuICAgIHNldFNvZnRCdXR0b25zIChidXR0b25zKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFNvZnRCdXR0b24sIGJ1dHRvbnMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVcGRhdGVUdXJuTGlzdC5LRVlfU09GVF9CVVRUT05TLCBidXR0b25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U29mdEJ1dHRvbltdfVxuICAgICAqL1xuICAgIGdldFNvZnRCdXR0b25zICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFNvZnRCdXR0b24sIFVwZGF0ZVR1cm5MaXN0LktFWV9TT0ZUX0JVVFRPTlMpO1xuICAgIH1cbn1cblxuVXBkYXRlVHVybkxpc3QuS0VZX1RVUk5fTElTVCA9ICd0dXJuTGlzdCc7XG5VcGRhdGVUdXJuTGlzdC5LRVlfU09GVF9CVVRUT05TID0gJ3NvZnRCdXR0b25zJztcblxuZXhwb3J0IHsgVXBkYXRlVHVybkxpc3QgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgVXBkYXRlVHVybkxpc3RSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlVwZGF0ZVR1cm5MaXN0KTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgVXBkYXRlVHVybkxpc3RSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IFRUU0NodW5rIH0gZnJvbSAnLi4vc3RydWN0cy9UVFNDaHVuay5qcyc7XG5pbXBvcnQgeyBMYW5ndWFnZSB9IGZyb20gJy4uL2VudW1zL0xhbmd1YWdlLmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuY2xhc3MgQ2hhbmdlUmVnaXN0cmF0aW9uIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5DaGFuZ2VSZWdpc3RyYXRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TGFuZ3VhZ2V9IGxhbmd1YWdlIC0gUmVxdWVzdGVkIHZvaWNlIGVuZ2luZSAoVlIrVFRTKSBsYW5ndWFnZSByZWdpc3RyYXRpb25cbiAgICAgKiBAcmV0dXJuIHtDaGFuZ2VSZWdpc3RyYXRpb259XG4gICAgICovXG4gICAgc2V0TGFuZ3VhZ2UgKGxhbmd1YWdlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKExhbmd1YWdlLCBsYW5ndWFnZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENoYW5nZVJlZ2lzdHJhdGlvbi5LRVlfTEFOR1VBR0UsIGxhbmd1YWdlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TGFuZ3VhZ2V9XG4gICAgICovXG4gICAgZ2V0TGFuZ3VhZ2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTGFuZ3VhZ2UsIENoYW5nZVJlZ2lzdHJhdGlvbi5LRVlfTEFOR1VBR0UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TGFuZ3VhZ2V9IGxhbmd1YWdlIC0gUmVxdWVzdCBkaXNwbGF5IGxhbmd1YWdlIHJlZ2lzdHJhdGlvblxuICAgICAqIEByZXR1cm4ge0NoYW5nZVJlZ2lzdHJhdGlvbn1cbiAgICAgKi9cbiAgICBzZXRIbWlEaXNwbGF5TGFuZ3VhZ2UgKGxhbmd1YWdlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKExhbmd1YWdlLCBsYW5ndWFnZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENoYW5nZVJlZ2lzdHJhdGlvbi5LRVlfSE1JX0RJU1BMQVlfTEFOR1VBR0UsIGxhbmd1YWdlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TGFuZ3VhZ2V9XG4gICAgICovXG4gICAgZ2V0SG1pRGlzcGxheUxhbmd1YWdlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KExhbmd1YWdlLCBDaGFuZ2VSZWdpc3RyYXRpb24uS0VZX0hNSV9ESVNQTEFZX0xBTkdVQUdFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFJlcXVlc3QgbmV3IGFwcCBuYW1lIHJlZ2lzdHJhdGlvblxuICAgICAqIEByZXR1cm4ge0NoYW5nZVJlZ2lzdHJhdGlvbn1cbiAgICAgKi9cbiAgICBzZXRBcHBOYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENoYW5nZVJlZ2lzdHJhdGlvbi5LRVlfQVBQX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0QXBwTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDaGFuZ2VSZWdpc3RyYXRpb24uS0VZX0FQUF9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RUU0NodW5rW119IG5hbWUgLSBSZXF1ZXN0IG5ldyB0dHNOYW1lIHJlZ2lzdHJhdGlvblxuICAgICAqIEByZXR1cm4ge0NoYW5nZVJlZ2lzdHJhdGlvbn1cbiAgICAgKi9cbiAgICBzZXRUdHNOYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRUU0NodW5rLCBuYW1lLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2hhbmdlUmVnaXN0cmF0aW9uLktFWV9UVFNfTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RUU0NodW5rW119XG4gICAgICovXG4gICAgZ2V0VHRzTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUVFNDaHVuaywgQ2hhbmdlUmVnaXN0cmF0aW9uLktFWV9UVFNfTkFNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBSZXF1ZXN0IG5ldyBhcHAgc2hvcnQgbmFtZSByZWdpc3RyYXRpb25cbiAgICAgKiBAcmV0dXJuIHtDaGFuZ2VSZWdpc3RyYXRpb259XG4gICAgICovXG4gICAgc2V0TmduTWVkaWFTY3JlZW5BcHBOYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENoYW5nZVJlZ2lzdHJhdGlvbi5LRVlfTkdOX01FRElBX1NDUkVFTl9BUFBfTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXROZ25NZWRpYVNjcmVlbkFwcE5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ2hhbmdlUmVnaXN0cmF0aW9uLktFWV9OR05fTUVESUFfU0NSRUVOX0FQUF9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ1tdfSBzeW5vbnltcyAtIFJlcXVlc3QgbmV3IFZSIHN5bm9ueW1zIHJlZ2lzdHJhdGlvblxuICAgICAqIEByZXR1cm4ge0NoYW5nZVJlZ2lzdHJhdGlvbn1cbiAgICAgKi9cbiAgICBzZXRWclN5bm9ueW1zIChzeW5vbnltcykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDaGFuZ2VSZWdpc3RyYXRpb24uS0VZX1ZSX1NZTk9OWU1TLCBzeW5vbnltcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ1tdfVxuICAgICAqL1xuICAgIGdldFZyU3lub255bXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ2hhbmdlUmVnaXN0cmF0aW9uLktFWV9WUl9TWU5PTllNUyk7XG4gICAgfVxufVxuXG5DaGFuZ2VSZWdpc3RyYXRpb24uS0VZX0xBTkdVQUdFID0gJ2xhbmd1YWdlJztcbkNoYW5nZVJlZ2lzdHJhdGlvbi5LRVlfSE1JX0RJU1BMQVlfTEFOR1VBR0UgPSAnaG1pRGlzcGxheUxhbmd1YWdlJztcbkNoYW5nZVJlZ2lzdHJhdGlvbi5LRVlfQVBQX05BTUUgPSAnYXBwTmFtZSc7XG5DaGFuZ2VSZWdpc3RyYXRpb24uS0VZX1RUU19OQU1FID0gJ3R0c05hbWUnO1xuQ2hhbmdlUmVnaXN0cmF0aW9uLktFWV9OR05fTUVESUFfU0NSRUVOX0FQUF9OQU1FID0gJ25nbk1lZGlhU2NyZWVuQXBwTmFtZSc7XG5DaGFuZ2VSZWdpc3RyYXRpb24uS0VZX1ZSX1NZTk9OWU1TID0gJ3ZyU3lub255bXMnO1xuXG5leHBvcnQgeyBDaGFuZ2VSZWdpc3RyYXRpb24gfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgQ2hhbmdlUmVnaXN0cmF0aW9uUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5DaGFuZ2VSZWdpc3RyYXRpb24pO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBDaGFuZ2VSZWdpc3RyYXRpb25SZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG4vKipcbiAqIEdlbmVyaWMgUmVzcG9uc2UgaXMgc2VudCwgd2hlbiB0aGUgbmFtZSBvZiBhIHJlY2VpdmVkIG1zZyBjYW5ub3QgYmUgcmV0cmlldmVkLiBPbmx5IHVzZWQgaW4gY2FzZSBvZiBhbiBlcnJvci5cbiAqIEN1cnJlbnRseSwgb25seSByZXN1bHRDb2RlIElOVkFMSURfREFUQSBpcyB1c2VkLlxuICovXG5jbGFzcyBHZW5lcmljUmVzcG9uc2VSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkdlbmVyaWNSZXNwb25zZSk7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB7IEdlbmVyaWNSZXNwb25zZVJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgRmlsZVR5cGUgfSBmcm9tICcuLi9lbnVtcy9GaWxlVHlwZS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbi8qKlxuICogVXNlZCB0byBwdXNoIGEgYmluYXJ5IGRhdGEgb250byB0aGUgbW9kdWxlIGZyb20gYSBtb2JpbGUgZGV2aWNlLCBzdWNoIGFzIGljb25zIGFuZCBhbGJ1bSBhcnQgTm90IHN1cHBvcnRlZCBvbiBmaXJzdFxuICogZ2VuZXJhdGlvbiBvZiBTREwgZW5hYmxlZCBtb2R1bGVzLiBCaW5hcnkgZGF0YSBpcyBpbiBiaW5hcnkgcGFydCBvZiBoeWJyaWQgbXNnLlxuICovXG5jbGFzcyBQdXRGaWxlIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5QdXRGaWxlKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0gTm90IHBhcnQgb2YgdGhlIFJQQyBzcGVjIGl0c2VsZiAtLS0tLVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtVaW50OEFycmF5fSBmaWxlRGF0YVxuICAgICAqIEByZXR1cm4ge1B1dEZpbGV9XG4gICAgICovXG4gICAgc2V0RmlsZURhdGEgKGZpbGVEYXRhKSB7XG4gICAgICAgIHRoaXMuc2V0QnVsa0RhdGEoZmlsZURhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VWludDhBcnJheX1cbiAgICAgKi9cbiAgICBnZXRGaWxlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ1bGtEYXRhKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0gRU5EIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIEZpbGUgcmVmZXJlbmNlIG5hbWUuXG4gICAgICogQHJldHVybiB7UHV0RmlsZX1cbiAgICAgKi9cbiAgICBzZXRGaWxlTmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQdXRGaWxlLktFWV9GSUxFX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0RmlsZU5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUHV0RmlsZS5LRVlfRklMRV9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0ZpbGVUeXBlfSB0eXBlIC0gU2VsZWN0ZWQgZmlsZSB0eXBlLlxuICAgICAqIEByZXR1cm4ge1B1dEZpbGV9XG4gICAgICovXG4gICAgc2V0RmlsZVR5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoRmlsZVR5cGUsIHR5cGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQdXRGaWxlLktFWV9GSUxFX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtGaWxlVHlwZX1cbiAgICAgKi9cbiAgICBnZXRGaWxlVHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChGaWxlVHlwZSwgUHV0RmlsZS5LRVlfRklMRV9UWVBFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbGUgLSBJbmRpY2F0ZXMgaWYgdGhlIGZpbGUgaXMgbWVhbnQgdG8gcGVyc2lzdCBiZXR3ZWVuIHNlc3Npb25zIC8gaWduaXRpb24gY3ljbGVzLiBJZiBzZXQgdG9cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCB0aGVuIHRoZSBzeXN0ZW0gd2lsbCBhaW0gdG8gcGVyc2lzdCB0aGlzIGZpbGUgdGhyb3VnaCBzZXNzaW9uIC8gY3ljbGVzLiBXaGlsZSBmaWxlc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhpcyBkZXNpZ25hdGlvbiB3aWxsIGhhdmUgcHJpb3JpdHkgb3ZlciBvdGhlcnMsIHRoZXkgYXJlIHN1YmplY3QgdG8gZGVsZXRpb24gYnkgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtIGF0IGFueSB0aW1lLiBJbiB0aGUgZXZlbnQgb2YgYXV0b21hdGljIGRlbGV0aW9uIGJ5IHRoZSBzeXN0ZW0sIHRoZSBhcHAgd2lsbFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUgYSByZWplY3Rpb24gYW5kIGhhdmUgdG8gcmVzZW5kIHRoZSBmaWxlLiBJZiBvbWl0dGVkLCB0aGUgdmFsdWUgd2lsbCBiZSBzZXQgdG9cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZS5cbiAgICAgKiBAcmV0dXJuIHtQdXRGaWxlfVxuICAgICAqL1xuICAgIHNldFBlcnNpc3RlbnRGaWxlIChmaWxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFB1dEZpbGUuS0VZX1BFUlNJU1RFTlRfRklMRSwgZmlsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0UGVyc2lzdGVudEZpbGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUHV0RmlsZS5LRVlfUEVSU0lTVEVOVF9GSUxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbGUgLSBJbmRpY2F0ZXMgaWYgdGhlIGZpbGUgaXMgbWVhbnQgdG8gYmUgcGFzc2VkIHRocnUgY29yZSB0byBlbHNld2hlcmUgb24gdGhlIHN5c3RlbS4gSWYgc2V0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgdG8gVFJVRSwgdGhlbiB0aGUgc3lzdGVtIHdpbGwgaW5zdGVhZCBwYXNzIHRoZSBkYXRhIHRocnUgYXMgaXQgYXJyaXZlcyB0byBhIHByZWRldGVybWluZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhIG91dHNpZGUgb2YgY29yZS4gSWYgb21pdHRlZCwgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvIGZhbHNlLlxuICAgICAqIEByZXR1cm4ge1B1dEZpbGV9XG4gICAgICovXG4gICAgc2V0U3lzdGVtRmlsZSAoZmlsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQdXRGaWxlLktFWV9TWVNURU1fRklMRSwgZmlsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0U3lzdGVtRmlsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihQdXRGaWxlLktFWV9TWVNURU1fRklMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCAtIE9wdGlvbmFsIG9mZnNldCBpbiBieXRlcyBmb3IgcmVzdW1pbmcgcGFydGlhbCBkYXRhIGNodW5rc1xuICAgICAqIEByZXR1cm4ge1B1dEZpbGV9XG4gICAgICovXG4gICAgc2V0T2Zmc2V0IChvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUHV0RmlsZS5LRVlfT0ZGU0VULCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0T2Zmc2V0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFB1dEZpbGUuS0VZX09GRlNFVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCAtIE9wdGlvbmFsIGxlbmd0aCBpbiBieXRlcyBmb3IgcmVzdW1pbmcgcGFydGlhbCBkYXRhIGNodW5rcyBJZiBvZmZzZXQgaXMgc2V0IHRvIDAsIHRoZW5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIGlzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGZpbGUgdG8gYmUgZG93bmxvYWRlZFxuICAgICAqIEByZXR1cm4ge1B1dEZpbGV9XG4gICAgICovXG4gICAgc2V0TGVuZ3RoIChsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUHV0RmlsZS5LRVlfTEVOR1RILCBsZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0TGVuZ3RoICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFB1dEZpbGUuS0VZX0xFTkdUSCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGNyYyAtIEFkZGl0aW9uYWwgQ1JDMzIgY2hlY2tzdW0gdG8gcHJvdGVjdCBkYXRhIGludGVncml0eSB1cCB0byA1MTIgTWJpdHNcbiAgICAgKiBAcmV0dXJuIHtQdXRGaWxlfVxuICAgICAqL1xuICAgIHNldENyYyAoY3JjKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFB1dEZpbGUuS0VZX0NSQywgY3JjKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldENyYyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihQdXRGaWxlLktFWV9DUkMpO1xuICAgIH1cbn1cblxuUHV0RmlsZS5LRVlfRklMRV9OQU1FID0gJ3N5bmNGaWxlTmFtZSc7XG5QdXRGaWxlLktFWV9GSUxFX1RZUEUgPSAnZmlsZVR5cGUnO1xuUHV0RmlsZS5LRVlfUEVSU0lTVEVOVF9GSUxFID0gJ3BlcnNpc3RlbnRGaWxlJztcblB1dEZpbGUuS0VZX1NZU1RFTV9GSUxFID0gJ3N5c3RlbUZpbGUnO1xuUHV0RmlsZS5LRVlfT0ZGU0VUID0gJ29mZnNldCc7XG5QdXRGaWxlLktFWV9MRU5HVEggPSAnbGVuZ3RoJztcblB1dEZpbGUuS0VZX0NSQyA9ICdjcmMnO1xuXG5leHBvcnQgeyBQdXRGaWxlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgUnBjUmVzcG9uc2UgfSBmcm9tICcuLi9ScGNSZXNwb25zZS5qcyc7XG5cbi8qKlxuICogUmVzcG9uc2UgaXMgc2VudCwgd2hlbiB0aGUgZmlsZSBkYXRhIHdhcyBjb3BpZWQgKHN1Y2Nlc3MgY2FzZSkuIE9yIHdoZW4gYW4gZXJyb3Igb2NjdXJyZWQuIE5vdCBzdXBwb3J0ZWQgb24gZmlyc3RcbiAqIGdlbmVyYXRpb24gU0RMIGVuYWJsZWQgdmVoaWNsZXMuXG4gKi9cbmNsYXNzIFB1dEZpbGVSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlB1dEZpbGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBhdmFpbGFibGUgLSBQcm92aWRlcyB0aGUgdG90YWwgbG9jYWwgc3BhY2UgYXZhaWxhYmxlIGluIFNETCBDb3JlIGZvciB0aGUgcmVnaXN0ZXJlZCBhcHAuIElmIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlciBoYXMgc3lzdGVtRmlsZSBlbmFibGVkLCB0aGVuIHRoZSB2YWx1ZSB3aWxsIGJlIHNldCB0byAwIGF1dG9tYXRpY2FsbHkuXG4gICAgICogQHJldHVybiB7UHV0RmlsZVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFNwYWNlQXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUHV0RmlsZVJlc3BvbnNlLktFWV9TUEFDRV9BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRTcGFjZUF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihQdXRGaWxlUmVzcG9uc2UuS0VZX1NQQUNFX0FWQUlMQUJMRSk7XG4gICAgfVxufVxuXG5QdXRGaWxlUmVzcG9uc2UuS0VZX1NQQUNFX0FWQUlMQUJMRSA9ICdzcGFjZUF2YWlsYWJsZSc7XG5cbmV4cG9ydCB7IFB1dEZpbGVSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEZpbGVUeXBlIH0gZnJvbSAnLi4vZW51bXMvRmlsZVR5cGUuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG4vKipcbiAqIFRoaXMgcmVxdWVzdCBpcyBzZW50IHRvIHRoZSBtb2R1bGUgdG8gcmV0cmlldmUgYSBmaWxlXG4gKi9cbmNsYXNzIEdldEZpbGUgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkdldEZpbGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gRmlsZSBuYW1lIHRoYXQgc2hvdWxkIGJlIHJldHJpZXZlZFxuICAgICAqIEByZXR1cm4ge0dldEZpbGV9XG4gICAgICovXG4gICAgc2V0RmlsZU5hbWUgKG5hbWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0RmlsZS5LRVlfRklMRV9OQU1FLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldEZpbGVOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldEZpbGUuS0VZX0ZJTEVfTkFNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGlkIC0gSUQgb2YgdGhlIHNlcnZpY2UgdGhhdCBzaG91bGQgaGF2ZSB1cGxvYWRlZCB0aGUgcmVxdWVzdGVkIGZpbGUuXG4gICAgICogQHJldHVybiB7R2V0RmlsZX1cbiAgICAgKi9cbiAgICBzZXRBcHBTZXJ2aWNlSWQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldEZpbGUuS0VZX0FQUF9TRVJWSUNFX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRBcHBTZXJ2aWNlSWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0RmlsZS5LRVlfQVBQX1NFUlZJQ0VfSUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RmlsZVR5cGV9IHR5cGUgLSBTZWxlY3RlZCBmaWxlIHR5cGUuXG4gICAgICogQHJldHVybiB7R2V0RmlsZX1cbiAgICAgKi9cbiAgICBzZXRGaWxlVHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShGaWxlVHlwZSwgdHlwZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldEZpbGUuS0VZX0ZJTEVfVFlQRSwgdHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0ZpbGVUeXBlfVxuICAgICAqL1xuICAgIGdldEZpbGVUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEZpbGVUeXBlLCBHZXRGaWxlLktFWV9GSUxFX1RZUEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgLSBPcHRpb25hbCBvZmZzZXQgaW4gYnl0ZXMgZm9yIHJlc3VtaW5nIHBhcnRpYWwgZGF0YSBjaHVua3NcbiAgICAgKiBAcmV0dXJuIHtHZXRGaWxlfVxuICAgICAqL1xuICAgIHNldE9mZnNldCAob2Zmc2V0KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldEZpbGUuS0VZX09GRlNFVCwgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldE9mZnNldCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRGaWxlLktFWV9PRkZTRVQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZW5ndGggLSBPcHRpb25hbCBsZW5ndGggaW4gYnl0ZXMgZm9yIHJlc3VtaW5nIHBhcnRpYWwgZGF0YSBjaHVua3MgSWYgb2Zmc2V0IGlzIHNldCB0byAwLCB0aGVuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBmaWxlIHRvIGJlIHJldHJpZXZlZFxuICAgICAqIEByZXR1cm4ge0dldEZpbGV9XG4gICAgICovXG4gICAgc2V0TGVuZ3RoIChsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0RmlsZS5LRVlfTEVOR1RILCBsZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0TGVuZ3RoICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldEZpbGUuS0VZX0xFTkdUSCk7XG4gICAgfVxufVxuXG5HZXRGaWxlLktFWV9GSUxFX05BTUUgPSAnZmlsZU5hbWUnO1xuR2V0RmlsZS5LRVlfQVBQX1NFUlZJQ0VfSUQgPSAnYXBwU2VydmljZUlkJztcbkdldEZpbGUuS0VZX0ZJTEVfVFlQRSA9ICdmaWxlVHlwZSc7XG5HZXRGaWxlLktFWV9PRkZTRVQgPSAnb2Zmc2V0JztcbkdldEZpbGUuS0VZX0xFTkdUSCA9ICdsZW5ndGgnO1xuXG5leHBvcnQgeyBHZXRGaWxlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgUnBjUmVzcG9uc2UgfSBmcm9tICcuLi9ScGNSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBGaWxlVHlwZSB9IGZyb20gJy4uL2VudW1zL0ZpbGVUeXBlLmpzJztcblxuLyoqXG4gKiBUaGlzIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBkYXRhIHRoYXQgaXMgcmVxdWVzdGVkIGZyb20gdGhlIHNwZWNpZmljIHNlcnZpY2VcbiAqL1xuY2xhc3MgR2V0RmlsZVJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuR2V0RmlsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCAtIE9wdGlvbmFsIG9mZnNldCBpbiBieXRlcyBmb3IgcmVzdW1pbmcgcGFydGlhbCBkYXRhIGNodW5rc1xuICAgICAqIEByZXR1cm4ge0dldEZpbGVSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRPZmZzZXQgKG9mZnNldCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRGaWxlUmVzcG9uc2UuS0VZX09GRlNFVCwgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldE9mZnNldCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRGaWxlUmVzcG9uc2UuS0VZX09GRlNFVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCAtIE9wdGlvbmFsIGxlbmd0aCBpbiBieXRlcyBmb3IgcmVzdW1pbmcgcGFydGlhbCBkYXRhIGNodW5rcyBpZiBvZmZzZXQgaXMgc2V0IHRvIDAsIHRoZW5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIGlzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGZpbGUgdG8gYmUgZG93bmxvYWRlZFxuICAgICAqIEByZXR1cm4ge0dldEZpbGVSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRMZW5ndGggKGxlbmd0aCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRGaWxlUmVzcG9uc2UuS0VZX0xFTkdUSCwgbGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldExlbmd0aCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRGaWxlUmVzcG9uc2UuS0VZX0xFTkdUSCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtGaWxlVHlwZX0gdHlwZSAtIEZpbGUgdHlwZSB0aGF0IGlzIGJlaW5nIHNlbnQgaW4gcmVzcG9uc2UuXG4gICAgICogQHJldHVybiB7R2V0RmlsZVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEZpbGVUeXBlICh0eXBlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEZpbGVUeXBlLCB0eXBlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0RmlsZVJlc3BvbnNlLktFWV9GSUxFX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtGaWxlVHlwZX1cbiAgICAgKi9cbiAgICBnZXRGaWxlVHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChGaWxlVHlwZSwgR2V0RmlsZVJlc3BvbnNlLktFWV9GSUxFX1RZUEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjcmMgLSBBZGRpdGlvbmFsIENSQzMyIGNoZWNrc3VtIHRvIHByb3RlY3QgZGF0YSBpbnRlZ3JpdHkgdXAgdG8gNTEyIE1iaXRzXG4gICAgICogQHJldHVybiB7R2V0RmlsZVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldENyYyAoY3JjKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldEZpbGVSZXNwb25zZS5LRVlfQ1JDLCBjcmMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0Q3JjICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldEZpbGVSZXNwb25zZS5LRVlfQ1JDKTtcbiAgICB9XG59XG5cbkdldEZpbGVSZXNwb25zZS5LRVlfT0ZGU0VUID0gJ29mZnNldCc7XG5HZXRGaWxlUmVzcG9uc2UuS0VZX0xFTkdUSCA9ICdsZW5ndGgnO1xuR2V0RmlsZVJlc3BvbnNlLktFWV9GSUxFX1RZUEUgPSAnZmlsZVR5cGUnO1xuR2V0RmlsZVJlc3BvbnNlLktFWV9DUkMgPSAnY3JjJztcblxuZXhwb3J0IHsgR2V0RmlsZVJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG4vKipcbiAqIFVzZWQgdG8gZGVsZXRlIGEgZmlsZSByZXNpZGVudCBvbiB0aGUgbW9kdWxlIGluIHRoZSBhcHAncyBsb2NhbCBjYWNoZS4gTm90IHN1cHBvcnRlZCBvbiBmaXJzdCBnZW5lcmF0aW9uIFNETCBlbmFibGVkXG4gKiB2ZWhpY2xlcy5cbiAqL1xuY2xhc3MgRGVsZXRlRmlsZSBleHRlbmRzIFJwY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuRGVsZXRlRmlsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBGaWxlIHJlZmVyZW5jZSBuYW1lLlxuICAgICAqIEByZXR1cm4ge0RlbGV0ZUZpbGV9XG4gICAgICovXG4gICAgc2V0U2RsRmlsZU5hbWUgKG5hbWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGVsZXRlRmlsZS5LRVlfU0RMX0ZJTEVfTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRTZGxGaWxlTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEZWxldGVGaWxlLktFWV9TRExfRklMRV9OQU1FKTtcbiAgICB9XG59XG5cbkRlbGV0ZUZpbGUuS0VZX1NETF9GSUxFX05BTUUgPSAnc3luY0ZpbGVOYW1lJztcblxuZXhwb3J0IHsgRGVsZXRlRmlsZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG4vKipcbiAqIFJlc3BvbnNlIGlzIHNlbnQsIHdoZW4gdGhlIGZpbGUgZGF0YSB3YXMgZGVsZXRlZCAoc3VjY2VzcyBjYXNlKS4gT3Igd2hlbiBhbiBlcnJvciBvY2N1cnJlZC4gTm90IHN1cHBvcnRlZCBvbiBGaXJzdFxuICogZ2VuZXJhdGlvbiBTREwgZW5hYmxlZCB2ZWhpY2xlcy5cbiAqL1xuY2xhc3MgRGVsZXRlRmlsZVJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuRGVsZXRlRmlsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGF2YWlsYWJsZSAtIFByb3ZpZGVzIHRoZSB0b3RhbCBsb2NhbCBzcGFjZSBhdmFpbGFibGUgb24gdGhlIG1vZHVsZSBmb3IgdGhlIHJlZ2lzdGVyZWQgYXBwLlxuICAgICAqIEByZXR1cm4ge0RlbGV0ZUZpbGVSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRTcGFjZUF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERlbGV0ZUZpbGVSZXNwb25zZS5LRVlfU1BBQ0VfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0U3BhY2VBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGVsZXRlRmlsZVJlc3BvbnNlLktFWV9TUEFDRV9BVkFJTEFCTEUpO1xuICAgIH1cbn1cblxuRGVsZXRlRmlsZVJlc3BvbnNlLktFWV9TUEFDRV9BVkFJTEFCTEUgPSAnc3BhY2VBdmFpbGFibGUnO1xuXG5leHBvcnQgeyBEZWxldGVGaWxlUmVzcG9uc2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbi8qKlxuICogUmVxdWVzdHMgdGhlIGN1cnJlbnQgbGlzdCBvZiByZXNpZGVudCBmaWxlbmFtZXMgZm9yIHRoZSByZWdpc3RlcmVkIGFwcC4gTm90IHN1cHBvcnRlZCBvbiBmaXJzdCBnZW5lcmF0aW9uIFNETFxuICogZW5hYmxlZCB2ZWhpY2xlcy5cbiAqL1xuY2xhc3MgTGlzdEZpbGVzIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5MaXN0RmlsZXMpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBMaXN0RmlsZXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxpc3Qgb2YgcmVzaWRlbnQgZmlsZW5hbWVzIGZvciB0aGUgcmVnaXN0ZXJlZCBhcHAgYWxvbmcgd2l0aCB0aGUgY3VycmVudCBzcGFjZSBhdmFpbGFibGUgTm90XG4gKiBzdXBwb3J0ZWQgb24gRmlyc3QgZ2VuZXJhdGlvbiBTREwgZW5hYmxlZCB2ZWhpY2xlcy5cbiAqL1xuY2xhc3MgTGlzdEZpbGVzUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5MaXN0RmlsZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nW119IGZpbGVuYW1lcyAtIEFuIGFycmF5IG9mIGFsbCBmaWxlbmFtZXMgcmVzaWRlbnQgb24gdGhlIG1vZHVsZSBmb3IgdGhlIGdpdmVuIHJlZ2lzdGVyZWQgYXBwLiBJZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQsIHRoZW4gbm8gZmlsZXMgY3VycmVudGx5IHJlc2lkZSBvbiB0aGUgc3lzdGVtLlxuICAgICAqIEByZXR1cm4ge0xpc3RGaWxlc1Jlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEZpbGVuYW1lcyAoZmlsZW5hbWVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKExpc3RGaWxlc1Jlc3BvbnNlLktFWV9GSUxFTkFNRVMsIGZpbGVuYW1lcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ1tdfVxuICAgICAqL1xuICAgIGdldEZpbGVuYW1lcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihMaXN0RmlsZXNSZXNwb25zZS5LRVlfRklMRU5BTUVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYXZhaWxhYmxlIC0gUHJvdmlkZXMgdGhlIHRvdGFsIGxvY2FsIHNwYWNlIGF2YWlsYWJsZSBvbiB0aGUgbW9kdWxlIGZvciB0aGUgcmVnaXN0ZXJlZCBhcHAuXG4gICAgICogQHJldHVybiB7TGlzdEZpbGVzUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0U3BhY2VBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihMaXN0RmlsZXNSZXNwb25zZS5LRVlfU1BBQ0VfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0U3BhY2VBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoTGlzdEZpbGVzUmVzcG9uc2UuS0VZX1NQQUNFX0FWQUlMQUJMRSk7XG4gICAgfVxufVxuXG5MaXN0RmlsZXNSZXNwb25zZS5LRVlfRklMRU5BTUVTID0gJ2ZpbGVuYW1lcyc7XG5MaXN0RmlsZXNSZXNwb25zZS5LRVlfU1BBQ0VfQVZBSUxBQkxFID0gJ3NwYWNlQXZhaWxhYmxlJztcblxuZXhwb3J0IHsgTGlzdEZpbGVzUmVzcG9uc2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbi8qKlxuICogVXNlZCB0byBzZXQgZXhpc3RpbmcgbG9jYWwgZmlsZSBvbiB0aGUgbW9kdWxlIGFzIHRoZSBhcHAncyBpY29uIE5vdCBzdXBwb3J0ZWQgb24gZmlyc3QgZ2VuZXJhdGlvbiBTREwgZW5hYmxlZFxuICogdmVoaWNsZXMuXG4gKi9cbmNsYXNzIFNldEFwcEljb24gZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlNldEFwcEljb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gRmlsZSByZWZlcmVuY2UgbmFtZS5cbiAgICAgKiBAcmV0dXJuIHtTZXRBcHBJY29ufVxuICAgICAqL1xuICAgIHNldEZpbGVOYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNldEFwcEljb24uS0VZX0ZJTEVfTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRGaWxlTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZXRBcHBJY29uLktFWV9GSUxFX05BTUUpO1xuICAgIH1cbn1cblxuU2V0QXBwSWNvbi5LRVlfRklMRV9OQU1FID0gJ3N5bmNGaWxlTmFtZSc7XG5cbmV4cG9ydCB7IFNldEFwcEljb24gfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuLyoqXG4gKiBSZXNwb25zZSBpcyBzZW50LCB3aGVuIHRoZSBmaWxlIGRhdGEgd2FzIGNvcGllZCAoc3VjY2VzcyBjYXNlKS4gT3Igd2hlbiBhbiBlcnJvciBvY2N1cnJlZC4gTm90IHN1cHBvcnRlZCBvbiBGaXJzdFxuICogZ2VuZXJhdGlvbiBTREwgZW5hYmxlZCB2ZWhpY2xlcy5cbiAqL1xuY2xhc3MgU2V0QXBwSWNvblJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuU2V0QXBwSWNvbik7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB7IFNldEFwcEljb25SZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IFRlbXBsYXRlQ29sb3JTY2hlbWUgfSBmcm9tICcuLi9zdHJ1Y3RzL1RlbXBsYXRlQ29sb3JTY2hlbWUuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG4vKipcbiAqIFRoaXMgUlBDIGlzIGRlcHJlY2F0ZWQuIFVzZSBTaG93IFJQQyB0byBjaGFuZ2UgbGF5b3V0LlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuY2xhc3MgU2V0RGlzcGxheUxheW91dCBleHRlbmRzIFJwY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5TZXREaXNwbGF5TGF5b3V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsYXlvdXQgLSBQcmVkZWZpbmVkIG9yIGR5bmFtaWNhbGx5IGNyZWF0ZWQgc2NyZWVuIGxheW91dC4gQ3VycmVudGx5IG9ubHkgcHJlZGVmaW5lZCBzY3JlZW5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0cyBhcmUgZGVmaW5lZC5cbiAgICAgKiBAcmV0dXJuIHtTZXREaXNwbGF5TGF5b3V0fVxuICAgICAqL1xuICAgIHNldERpc3BsYXlMYXlvdXQgKGxheW91dCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZXREaXNwbGF5TGF5b3V0LktFWV9ESVNQTEFZX0xBWU9VVCwgbGF5b3V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0RGlzcGxheUxheW91dCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZXREaXNwbGF5TGF5b3V0LktFWV9ESVNQTEFZX0xBWU9VVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcGFyYW0ge1RlbXBsYXRlQ29sb3JTY2hlbWV9IHNjaGVtZSAtIEEgY29sb3Igc2NoZW1lIGZvciBhbGwgZGlzcGxheSBsYXlvdXQgdGVtcGxhdGVzLlxuICAgICAqIEByZXR1cm4ge1NldERpc3BsYXlMYXlvdXR9XG4gICAgICovXG4gICAgc2V0RGF5Q29sb3JTY2hlbWUgKHNjaGVtZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShUZW1wbGF0ZUNvbG9yU2NoZW1lLCBzY2hlbWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZXREaXNwbGF5TGF5b3V0LktFWV9EQVlfQ09MT1JfU0NIRU1FLCBzY2hlbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEByZXR1cm4ge1RlbXBsYXRlQ29sb3JTY2hlbWV9XG4gICAgICovXG4gICAgZ2V0RGF5Q29sb3JTY2hlbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVGVtcGxhdGVDb2xvclNjaGVtZSwgU2V0RGlzcGxheUxheW91dC5LRVlfREFZX0NPTE9SX1NDSEVNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcGFyYW0ge1RlbXBsYXRlQ29sb3JTY2hlbWV9IHNjaGVtZSAtIEEgY29sb3Igc2NoZW1lIGZvciBhbGwgZGlzcGxheSBsYXlvdXQgdGVtcGxhdGVzLlxuICAgICAqIEByZXR1cm4ge1NldERpc3BsYXlMYXlvdXR9XG4gICAgICovXG4gICAgc2V0TmlnaHRDb2xvclNjaGVtZSAoc2NoZW1lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRlbXBsYXRlQ29sb3JTY2hlbWUsIHNjaGVtZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNldERpc3BsYXlMYXlvdXQuS0VZX05JR0hUX0NPTE9SX1NDSEVNRSwgc2NoZW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUNvbG9yU2NoZW1lfVxuICAgICAqL1xuICAgIGdldE5pZ2h0Q29sb3JTY2hlbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVGVtcGxhdGVDb2xvclNjaGVtZSwgU2V0RGlzcGxheUxheW91dC5LRVlfTklHSFRfQ09MT1JfU0NIRU1FKTtcbiAgICB9XG59XG5cblNldERpc3BsYXlMYXlvdXQuS0VZX0RJU1BMQVlfTEFZT1VUID0gJ2Rpc3BsYXlMYXlvdXQnO1xuU2V0RGlzcGxheUxheW91dC5LRVlfREFZX0NPTE9SX1NDSEVNRSA9ICdkYXlDb2xvclNjaGVtZSc7XG5TZXREaXNwbGF5TGF5b3V0LktFWV9OSUdIVF9DT0xPUl9TQ0hFTUUgPSAnbmlnaHRDb2xvclNjaGVtZSc7XG5cbmV4cG9ydCB7IFNldERpc3BsYXlMYXlvdXQgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IFNvZnRCdXR0b25DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9zdHJ1Y3RzL1NvZnRCdXR0b25DYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgUHJlc2V0QmFua0NhcGFiaWxpdGllcyB9IGZyb20gJy4uL3N0cnVjdHMvUHJlc2V0QmFua0NhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBEaXNwbGF5Q2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vc3RydWN0cy9EaXNwbGF5Q2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IEJ1dHRvbkNhcGFiaWxpdGllcyB9IGZyb20gJy4uL3N0cnVjdHMvQnV0dG9uQ2FwYWJpbGl0aWVzLmpzJztcblxuLyoqXG4gKiBUaGlzIFJQQyBpcyBkZXByZWNhdGVkLiBVc2UgU2hvdyBSUEMgdG8gY2hhbmdlIGxheW91dC5cbiAqIEBkZXByZWNhdGVkXG4gKi9cbmNsYXNzIFNldERpc3BsYXlMYXlvdXRSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuU2V0RGlzcGxheUxheW91dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcGFyYW0ge0Rpc3BsYXlDYXBhYmlsaXRpZXN9IGNhcGFiaWxpdGllcyAtIFNlZSBEaXNwbGF5Q2FwYWJpbGl0aWVzXG4gICAgICogQHJldHVybiB7U2V0RGlzcGxheUxheW91dFJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldERpc3BsYXlDYXBhYmlsaXRpZXMgKGNhcGFiaWxpdGllcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShEaXNwbGF5Q2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZXREaXNwbGF5TGF5b3V0UmVzcG9uc2UuS0VZX0RJU1BMQVlfQ0FQQUJJTElUSUVTLCBjYXBhYmlsaXRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEByZXR1cm4ge0Rpc3BsYXlDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgZ2V0RGlzcGxheUNhcGFiaWxpdGllcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChEaXNwbGF5Q2FwYWJpbGl0aWVzLCBTZXREaXNwbGF5TGF5b3V0UmVzcG9uc2UuS0VZX0RJU1BMQVlfQ0FQQUJJTElUSUVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEBwYXJhbSB7QnV0dG9uQ2FwYWJpbGl0aWVzW119IGNhcGFiaWxpdGllcyAtIFNlZSBCdXR0b25DYXBhYmlsaXRpZXNcbiAgICAgKiBAcmV0dXJuIHtTZXREaXNwbGF5TGF5b3V0UmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0QnV0dG9uQ2FwYWJpbGl0aWVzIChjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQnV0dG9uQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZXREaXNwbGF5TGF5b3V0UmVzcG9uc2UuS0VZX0JVVFRPTl9DQVBBQklMSVRJRVMsIGNhcGFiaWxpdGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQHJldHVybiB7QnV0dG9uQ2FwYWJpbGl0aWVzW119XG4gICAgICovXG4gICAgZ2V0QnV0dG9uQ2FwYWJpbGl0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEJ1dHRvbkNhcGFiaWxpdGllcywgU2V0RGlzcGxheUxheW91dFJlc3BvbnNlLktFWV9CVVRUT05fQ0FQQUJJTElUSUVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEBwYXJhbSB7U29mdEJ1dHRvbkNhcGFiaWxpdGllc1tdfSBjYXBhYmlsaXRpZXMgLSBJZiByZXR1cm5lZCwgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIG9uLXNjcmVlbiBTb2Z0QnV0dG9uczsgc2VlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvZnRCdXR0b25DYXBhYmlsaXRpZXMuXG4gICAgICogQHJldHVybiB7U2V0RGlzcGxheUxheW91dFJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFNvZnRCdXR0b25DYXBhYmlsaXRpZXMgKGNhcGFiaWxpdGllcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZXREaXNwbGF5TGF5b3V0UmVzcG9uc2UuS0VZX1NPRlRfQlVUVE9OX0NBUEFCSUxJVElFUywgY2FwYWJpbGl0aWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcmV0dXJuIHtTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzW119XG4gICAgICovXG4gICAgZ2V0U29mdEJ1dHRvbkNhcGFiaWxpdGllcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLCBTZXREaXNwbGF5TGF5b3V0UmVzcG9uc2UuS0VZX1NPRlRfQlVUVE9OX0NBUEFCSUxJVElFUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcGFyYW0ge1ByZXNldEJhbmtDYXBhYmlsaXRpZXN9IGNhcGFiaWxpdGllcyAtIElmIHJldHVybmVkLCB0aGUgcGxhdGZvcm0gc3VwcG9ydHMgY3VzdG9tIG9uLXNjcmVlbiBQcmVzZXRzOyBzZWVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXNldEJhbmtDYXBhYmlsaXRpZXMuXG4gICAgICogQHJldHVybiB7U2V0RGlzcGxheUxheW91dFJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFByZXNldEJhbmtDYXBhYmlsaXRpZXMgKGNhcGFiaWxpdGllcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZXREaXNwbGF5TGF5b3V0UmVzcG9uc2UuS0VZX1BSRVNFVF9CQU5LX0NBUEFCSUxJVElFUywgY2FwYWJpbGl0aWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBAcmV0dXJuIHtQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIGdldFByZXNldEJhbmtDYXBhYmlsaXRpZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoUHJlc2V0QmFua0NhcGFiaWxpdGllcywgU2V0RGlzcGxheUxheW91dFJlc3BvbnNlLktFWV9QUkVTRVRfQkFOS19DQVBBQklMSVRJRVMpO1xuICAgIH1cbn1cblxuU2V0RGlzcGxheUxheW91dFJlc3BvbnNlLktFWV9ESVNQTEFZX0NBUEFCSUxJVElFUyA9ICdkaXNwbGF5Q2FwYWJpbGl0aWVzJztcblNldERpc3BsYXlMYXlvdXRSZXNwb25zZS5LRVlfQlVUVE9OX0NBUEFCSUxJVElFUyA9ICdidXR0b25DYXBhYmlsaXRpZXMnO1xuU2V0RGlzcGxheUxheW91dFJlc3BvbnNlLktFWV9TT0ZUX0JVVFRPTl9DQVBBQklMSVRJRVMgPSAnc29mdEJ1dHRvbkNhcGFiaWxpdGllcyc7XG5TZXREaXNwbGF5TGF5b3V0UmVzcG9uc2UuS0VZX1BSRVNFVF9CQU5LX0NBUEFCSUxJVElFUyA9ICdwcmVzZXRCYW5rQ2FwYWJpbGl0aWVzJztcblxuZXhwb3J0IHsgU2V0RGlzcGxheUxheW91dFJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogRW51bWVyYXRpb24gbGlzdGluZyBwb3NzaWJsZSBhc3luY2hyb25vdXMgcmVxdWVzdHMuXG4gKiBAdHlwZWRlZiB7RW51bX0gUmVxdWVzdFR5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFJlcXVlc3RUeXBlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEhUVFAgKCkge1xuICAgICAgICByZXR1cm4gUmVxdWVzdFR5cGUuX01BUC5IVFRQO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZJTEVfUkVTVU1FICgpIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3RUeXBlLl9NQVAuRklMRV9SRVNVTUU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQVVUSF9SRVFVRVNUICgpIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3RUeXBlLl9NQVAuQVVUSF9SRVFVRVNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEFVVEhfQ0hBTExFTkdFICgpIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3RUeXBlLl9NQVAuQVVUSF9DSEFMTEVOR0U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQVVUSF9BQ0sgKCkge1xuICAgICAgICByZXR1cm4gUmVxdWVzdFR5cGUuX01BUC5BVVRIX0FDSztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQUk9QUklFVEFSWSAoKSB7XG4gICAgICAgIHJldHVybiBSZXF1ZXN0VHlwZS5fTUFQLlBST1BSSUVUQVJZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFFVRVJZX0FQUFMgKCkge1xuICAgICAgICByZXR1cm4gUmVxdWVzdFR5cGUuX01BUC5RVUVSWV9BUFBTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IExBVU5DSF9BUFAgKCkge1xuICAgICAgICByZXR1cm4gUmVxdWVzdFR5cGUuX01BUC5MQVVOQ0hfQVBQO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IExPQ0tfU0NSRUVOX0lDT05fVVJMICgpIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3RUeXBlLl9NQVAuTE9DS19TQ1JFRU5fSUNPTl9VUkw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVFJBRkZJQ19NRVNTQUdFX0NIQU5ORUwgKCkge1xuICAgICAgICByZXR1cm4gUmVxdWVzdFR5cGUuX01BUC5UUkFGRklDX01FU1NBR0VfQ0hBTk5FTDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBEUklWRVJfUFJPRklMRSAoKSB7XG4gICAgICAgIHJldHVybiBSZXF1ZXN0VHlwZS5fTUFQLkRSSVZFUl9QUk9GSUxFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZPSUNFX1NFQVJDSCAoKSB7XG4gICAgICAgIHJldHVybiBSZXF1ZXN0VHlwZS5fTUFQLlZPSUNFX1NFQVJDSDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOQVZJR0FUSU9OICgpIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3RUeXBlLl9NQVAuTkFWSUdBVElPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQSE9ORSAoKSB7XG4gICAgICAgIHJldHVybiBSZXF1ZXN0VHlwZS5fTUFQLlBIT05FO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENMSU1BVEUgKCkge1xuICAgICAgICByZXR1cm4gUmVxdWVzdFR5cGUuX01BUC5DTElNQVRFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNFVFRJTkdTICgpIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3RUeXBlLl9NQVAuU0VUVElOR1M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVkVISUNMRV9ESUFHTk9TVElDUyAoKSB7XG4gICAgICAgIHJldHVybiBSZXF1ZXN0VHlwZS5fTUFQLlZFSElDTEVfRElBR05PU1RJQ1M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRU1FUkdFTkNZICgpIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3RUeXBlLl9NQVAuRU1FUkdFTkNZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE1FRElBICgpIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3RUeXBlLl9NQVAuTUVESUE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRk9UQSAoKSB7XG4gICAgICAgIHJldHVybiBSZXF1ZXN0VHlwZS5fTUFQLkZPVEE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgT0VNX1NQRUNJRklDICgpIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3RUeXBlLl9NQVAuT0VNX1NQRUNJRklDO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IElDT05fVVJMICgpIHtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3RUeXBlLl9NQVAuSUNPTl9VUkw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gUmVxdWVzdFR5cGUuX3ZhbHVlRm9yS2V5KGtleSwgUmVxdWVzdFR5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBSZXF1ZXN0VHlwZS5fa2V5Rm9yVmFsdWUodmFsdWUsIFJlcXVlc3RUeXBlLl9NQVApO1xuICAgIH1cbn1cblxuUmVxdWVzdFR5cGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdIVFRQJzogJ0hUVFAnLFxuICAgICdGSUxFX1JFU1VNRSc6ICdGSUxFX1JFU1VNRScsXG4gICAgJ0FVVEhfUkVRVUVTVCc6ICdBVVRIX1JFUVVFU1QnLFxuICAgICdBVVRIX0NIQUxMRU5HRSc6ICdBVVRIX0NIQUxMRU5HRScsXG4gICAgJ0FVVEhfQUNLJzogJ0FVVEhfQUNLJyxcbiAgICAnUFJPUFJJRVRBUlknOiAnUFJPUFJJRVRBUlknLFxuICAgICdRVUVSWV9BUFBTJzogJ1FVRVJZX0FQUFMnLFxuICAgICdMQVVOQ0hfQVBQJzogJ0xBVU5DSF9BUFAnLFxuICAgICdMT0NLX1NDUkVFTl9JQ09OX1VSTCc6ICdMT0NLX1NDUkVFTl9JQ09OX1VSTCcsXG4gICAgJ1RSQUZGSUNfTUVTU0FHRV9DSEFOTkVMJzogJ1RSQUZGSUNfTUVTU0FHRV9DSEFOTkVMJyxcbiAgICAnRFJJVkVSX1BST0ZJTEUnOiAnRFJJVkVSX1BST0ZJTEUnLFxuICAgICdWT0lDRV9TRUFSQ0gnOiAnVk9JQ0VfU0VBUkNIJyxcbiAgICAnTkFWSUdBVElPTic6ICdOQVZJR0FUSU9OJyxcbiAgICAnUEhPTkUnOiAnUEhPTkUnLFxuICAgICdDTElNQVRFJzogJ0NMSU1BVEUnLFxuICAgICdTRVRUSU5HUyc6ICdTRVRUSU5HUycsXG4gICAgJ1ZFSElDTEVfRElBR05PU1RJQ1MnOiAnVkVISUNMRV9ESUFHTk9TVElDUycsXG4gICAgJ0VNRVJHRU5DWSc6ICdFTUVSR0VOQ1knLFxuICAgICdNRURJQSc6ICdNRURJQScsXG4gICAgJ0ZPVEEnOiAnRk9UQScsXG4gICAgJ09FTV9TUEVDSUZJQyc6ICdPRU1fU1BFQ0lGSUMnLFxuICAgICdJQ09OX1VSTCc6ICdJQ09OX1VSTCcsXG59KTtcblxuZXhwb3J0IHsgUmVxdWVzdFR5cGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBSZXF1ZXN0VHlwZSB9IGZyb20gJy4uL2VudW1zL1JlcXVlc3RUeXBlLmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBBbiBhc3luY2hyb25vdXMgcmVxdWVzdCBmcm9tIHRoZSBkZXZpY2U7IGJpbmFyeSBkYXRhIGNhbiBiZSBpbmNsdWRlZCBpbiBoeWJyaWQgcGFydCBvZiBtZXNzYWdlIGZvciBzb21lIHJlcXVlc3RzXG4gKiAoc3VjaCBhcyBIVFRQLCBQcm9wcmlldGFyeSwgb3IgQXV0aGVudGljYXRpb24gcmVxdWVzdHMpXG4gKi9cbmNsYXNzIFN5c3RlbVJlcXVlc3QgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlN5c3RlbVJlcXVlc3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7UmVxdWVzdFR5cGV9IHR5cGUgLSBUaGUgdHlwZSBvZiBzeXN0ZW0gcmVxdWVzdC4gTm90ZSB0aGF0IFByb3ByaWV0YXJ5IHJlcXVlc3RzIHNob3VsZCBmb3J3YXJkIHRoZSBiaW5hcnlcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSB0byB0aGUga25vd24gcHJvcHJpZXRhcnkgbW9kdWxlIG9uIHRoZSBzeXN0ZW0uXG4gICAgICogQHJldHVybiB7U3lzdGVtUmVxdWVzdH1cbiAgICAgKi9cbiAgICBzZXRSZXF1ZXN0VHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShSZXF1ZXN0VHlwZSwgdHlwZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN5c3RlbVJlcXVlc3QuS0VZX1JFUVVFU1RfVFlQRSwgdHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1JlcXVlc3RUeXBlfVxuICAgICAqL1xuICAgIGdldFJlcXVlc3RUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFJlcXVlc3RUeXBlLCBTeXN0ZW1SZXF1ZXN0LktFWV9SRVFVRVNUX1RZUEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gVGhpcyBwYXJhbWV0ZXIgaXMgZmlsbGVkIGZvciBzdXBwb3J0aW5nIE9FTSBwcm9wcmlldGFyeSBkYXRhIGV4Y2hhbmdlcy5cbiAgICAgKiBAcmV0dXJuIHtTeXN0ZW1SZXF1ZXN0fVxuICAgICAqL1xuICAgIHNldFJlcXVlc3RTdWJUeXBlICh0eXBlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN5c3RlbVJlcXVlc3QuS0VZX1JFUVVFU1RfU1VCX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0UmVxdWVzdFN1YlR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU3lzdGVtUmVxdWVzdC5LRVlfUkVRVUVTVF9TVUJfVFlQRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBGaWxlbmFtZSBvZiBIVFRQIGRhdGEgdG8gc3RvcmUgaW4gcHJlZGVmaW5lZCBzeXN0ZW0gc3RhZ2luZyBhcmVhLiBNYW5kYXRvcnkgaWYgcmVxdWVzdFR5cGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGlzIEhUVFAuIFBST1BSSUVUQVJZIHJlcXVlc3RUeXBlIHNob3VsZCBpZ25vcmUgdGhpcyBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybiB7U3lzdGVtUmVxdWVzdH1cbiAgICAgKi9cbiAgICBzZXRGaWxlTmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTeXN0ZW1SZXF1ZXN0LktFWV9GSUxFX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0RmlsZU5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU3lzdGVtUmVxdWVzdC5LRVlfRklMRV9OQU1FKTtcbiAgICB9XG59XG5cblN5c3RlbVJlcXVlc3QuS0VZX1JFUVVFU1RfVFlQRSA9ICdyZXF1ZXN0VHlwZSc7XG5TeXN0ZW1SZXF1ZXN0LktFWV9SRVFVRVNUX1NVQl9UWVBFID0gJ3JlcXVlc3RTdWJUeXBlJztcblN5c3RlbVJlcXVlc3QuS0VZX0ZJTEVfTkFNRSA9ICdmaWxlTmFtZSc7XG5cbmV4cG9ydCB7IFN5c3RlbVJlcXVlc3QgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgU3lzdGVtUmVxdWVzdFJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuU3lzdGVtUmVxdWVzdCk7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB7IFN5c3RlbVJlcXVlc3RSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIFRoZSBtb2RlIGluIHdoaWNoIHRoZSBTZW5kTG9jYXRpb24gcmVxdWVzdCBpcyBzZW50XG4gKiBAdHlwZWRlZiB7RW51bX0gRGVsaXZlcnlNb2RlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBEZWxpdmVyeU1vZGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUFJPTVBUICgpIHtcbiAgICAgICAgcmV0dXJuIERlbGl2ZXJ5TW9kZS5fTUFQLlBST01QVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBERVNUSU5BVElPTiAoKSB7XG4gICAgICAgIHJldHVybiBEZWxpdmVyeU1vZGUuX01BUC5ERVNUSU5BVElPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBRVUVVRSAoKSB7XG4gICAgICAgIHJldHVybiBEZWxpdmVyeU1vZGUuX01BUC5RVUVVRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBEZWxpdmVyeU1vZGUuX3ZhbHVlRm9yS2V5KGtleSwgRGVsaXZlcnlNb2RlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gRGVsaXZlcnlNb2RlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgRGVsaXZlcnlNb2RlLl9NQVApO1xuICAgIH1cbn1cblxuRGVsaXZlcnlNb2RlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnUFJPTVBUJzogJ1BST01QVCcsXG4gICAgJ0RFU1RJTkFUSU9OJzogJ0RFU1RJTkFUSU9OJyxcbiAgICAnUVVFVUUnOiAnUVVFVUUnLFxufSk7XG5cbmV4cG9ydCB7IERlbGl2ZXJ5TW9kZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbmNsYXNzIERhdGVUaW1lIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbWlsbGlzZWNvbmQgLSBNaWxsaXNlY29uZHNcbiAgICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICAgKi9cbiAgICBzZXRNaWxsaXNlY29uZCAobWlsbGlzZWNvbmQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGF0ZVRpbWUuS0VZX01JTExJU0VDT05ELCBtaWxsaXNlY29uZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRNaWxsaXNlY29uZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEYXRlVGltZS5LRVlfTUlMTElTRUNPTkQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZWNvbmQgLSBTZWNvbmRzIHBhcnQgb2YgdGltZVxuICAgICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgICAqL1xuICAgIHNldFNlY29uZCAoc2Vjb25kKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERhdGVUaW1lLktFWV9TRUNPTkQsIHNlY29uZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRTZWNvbmQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGF0ZVRpbWUuS0VZX1NFQ09ORCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1pbnV0ZSAtIE1pbnV0ZXMgcGFydCBvZiB0aW1lXG4gICAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAgICovXG4gICAgc2V0TWludXRlIChtaW51dGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGF0ZVRpbWUuS0VZX01JTlVURSwgbWludXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldE1pbnV0ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEYXRlVGltZS5LRVlfTUlOVVRFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaG91ciAtIEhvdXJzIHBhcnQgb2YgdGltZS4gTm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlIGFjY2VwdHMgdGltZSBvbmx5IGluIDI0IEhyIGZvcm1hdFxuICAgICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgICAqL1xuICAgIHNldEhvdXIgKGhvdXIpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoRGF0ZVRpbWUuS0VZX0hPVVIsIGhvdXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0SG91ciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihEYXRlVGltZS5LRVlfSE9VUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGRheSAtIERheSBvZiB0aGUgbW9udGhcbiAgICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICAgKi9cbiAgICBzZXREYXkgKGRheSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEYXRlVGltZS5LRVlfREFZLCBkYXkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0RGF5ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERhdGVUaW1lLktFWV9EQVkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtb250aCAtIE1vbnRoIG9mIHRoZSB5ZWFyXG4gICAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAgICovXG4gICAgc2V0TW9udGggKG1vbnRoKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERhdGVUaW1lLktFWV9NT05USCwgbW9udGgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0TW9udGggKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGF0ZVRpbWUuS0VZX01PTlRIKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0geWVhciAtIFRoZSB5ZWFyIGluIFlZWVkgZm9ybWF0XG4gICAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAgICovXG4gICAgc2V0WWVhciAoeWVhcikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEYXRlVGltZS5LRVlfWUVBUiwgeWVhcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERhdGVUaW1lLktFWV9ZRUFSKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdHpfaG91ciAtIFRpbWUgem9uZSBvZmZzZXQgaW4gSG91cnMgd3J0IFVUQy5cbiAgICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICAgKi9cbiAgICBzZXRUel9ob3VyICh0el9ob3VyKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERhdGVUaW1lLktFWV9UWl9IT1VSLCB0el9ob3VyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFR6X2hvdXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGF0ZVRpbWUuS0VZX1RaX0hPVVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0el9taW51dGUgLSBUaW1lIHpvbmUgb2Zmc2V0IGluIE1pbiB3cnQgVVRDLlxuICAgICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgICAqL1xuICAgIHNldFR6X21pbnV0ZSAodHpfbWludXRlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERhdGVUaW1lLktFWV9UWl9NSU5VVEUsIHR6X21pbnV0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRUel9taW51dGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGF0ZVRpbWUuS0VZX1RaX01JTlVURSk7XG4gICAgfVxufVxuXG5EYXRlVGltZS5LRVlfTUlMTElTRUNPTkQgPSAnbWlsbGlzZWNvbmQnO1xuRGF0ZVRpbWUuS0VZX1NFQ09ORCA9ICdzZWNvbmQnO1xuRGF0ZVRpbWUuS0VZX01JTlVURSA9ICdtaW51dGUnO1xuRGF0ZVRpbWUuS0VZX0hPVVIgPSAnaG91cic7XG5EYXRlVGltZS5LRVlfREFZID0gJ2RheSc7XG5EYXRlVGltZS5LRVlfTU9OVEggPSAnbW9udGgnO1xuRGF0ZVRpbWUuS0VZX1lFQVIgPSAneWVhcic7XG5EYXRlVGltZS5LRVlfVFpfSE9VUiA9ICd0el9ob3VyJztcbkRhdGVUaW1lLktFWV9UWl9NSU5VVEUgPSAndHpfbWludXRlJztcblxuZXhwb3J0IHsgRGF0ZVRpbWUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG5jbGFzcyBPQVNJU0FkZHJlc3MgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gTmFtZSBvZiB0aGUgY291bnRyeSAobG9jYWxpemVkKVxuICAgICAqIEByZXR1cm4ge09BU0lTQWRkcmVzc31cbiAgICAgKi9cbiAgICBzZXRDb3VudHJ5TmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPQVNJU0FkZHJlc3MuS0VZX0NPVU5UUllfTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRDb3VudHJ5TmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihPQVNJU0FkZHJlc3MuS0VZX0NPVU5UUllfTkFNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvZGUgLSBOYW1lIG9mIGNvdW50cnkgKElTTyAzMTY2LTIpXG4gICAgICogQHJldHVybiB7T0FTSVNBZGRyZXNzfVxuICAgICAqL1xuICAgIHNldENvdW50cnlDb2RlIChjb2RlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9BU0lTQWRkcmVzcy5LRVlfQ09VTlRSWV9DT0RFLCBjb2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldENvdW50cnlDb2RlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE9BU0lTQWRkcmVzcy5LRVlfQ09VTlRSWV9DT0RFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29kZSAtIChQTFosIFpJUCwgUElOLCBDQVAgZXRjLilcbiAgICAgKiBAcmV0dXJuIHtPQVNJU0FkZHJlc3N9XG4gICAgICovXG4gICAgc2V0UG9zdGFsQ29kZSAoY29kZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPQVNJU0FkZHJlc3MuS0VZX1BPU1RBTF9DT0RFLCBjb2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFBvc3RhbENvZGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoT0FTSVNBZGRyZXNzLktFWV9QT1NUQUxfQ09ERSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGFyZWEgLSBQb3J0aW9uIG9mIGNvdW50cnkgKGUuZy4gc3RhdGUpXG4gICAgICogQHJldHVybiB7T0FTSVNBZGRyZXNzfVxuICAgICAqL1xuICAgIHNldEFkbWluaXN0cmF0aXZlQXJlYSAoYXJlYSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPQVNJU0FkZHJlc3MuS0VZX0FETUlOSVNUUkFUSVZFX0FSRUEsIGFyZWEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0QWRtaW5pc3RyYXRpdmVBcmVhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE9BU0lTQWRkcmVzcy5LRVlfQURNSU5JU1RSQVRJVkVfQVJFQSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGFyZWEgLSBQb3J0aW9uIG9mIGUuZy4gc3RhdGUgKGUuZy4gY291bnR5KVxuICAgICAqIEByZXR1cm4ge09BU0lTQWRkcmVzc31cbiAgICAgKi9cbiAgICBzZXRTdWJBZG1pbmlzdHJhdGl2ZUFyZWEgKGFyZWEpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT0FTSVNBZGRyZXNzLktFWV9TVUJfQURNSU5JU1RSQVRJVkVfQVJFQSwgYXJlYSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRTdWJBZG1pbmlzdHJhdGl2ZUFyZWEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoT0FTSVNBZGRyZXNzLktFWV9TVUJfQURNSU5JU1RSQVRJVkVfQVJFQSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsaXR5IC0gSHlwZXJueW0gZm9yIGUuZy4gY2l0eS92aWxsYWdlXG4gICAgICogQHJldHVybiB7T0FTSVNBZGRyZXNzfVxuICAgICAqL1xuICAgIHNldExvY2FsaXR5IChsb2NhbGl0eSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPQVNJU0FkZHJlc3MuS0VZX0xPQ0FMSVRZLCBsb2NhbGl0eSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRMb2NhbGl0eSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihPQVNJU0FkZHJlc3MuS0VZX0xPQ0FMSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbG9jYWxpdHkgLSBIeXBlcm55bSBmb3IgZS5nLiBkaXN0cmljdFxuICAgICAqIEByZXR1cm4ge09BU0lTQWRkcmVzc31cbiAgICAgKi9cbiAgICBzZXRTdWJMb2NhbGl0eSAobG9jYWxpdHkpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT0FTSVNBZGRyZXNzLktFWV9TVUJfTE9DQUxJVFksIGxvY2FsaXR5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFN1YkxvY2FsaXR5ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE9BU0lTQWRkcmVzcy5LRVlfU1VCX0xPQ0FMSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhvcm91Z2hmYXJlIC0gSHlwZXJueW0gZm9yIHN0cmVldCwgcm9hZCBldGMuXG4gICAgICogQHJldHVybiB7T0FTSVNBZGRyZXNzfVxuICAgICAqL1xuICAgIHNldFRob3JvdWdoZmFyZSAodGhvcm91Z2hmYXJlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9BU0lTQWRkcmVzcy5LRVlfVEhPUk9VR0hGQVJFLCB0aG9yb3VnaGZhcmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0VGhvcm91Z2hmYXJlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE9BU0lTQWRkcmVzcy5LRVlfVEhPUk9VR0hGQVJFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGhvcm91Z2hmYXJlIC0gUG9ydGlvbiBvZiB0aG9yb3VnaGZhcmUgZS5nLiBob3VzZSBudW1iZXJcbiAgICAgKiBAcmV0dXJuIHtPQVNJU0FkZHJlc3N9XG4gICAgICovXG4gICAgc2V0U3ViVGhvcm91Z2hmYXJlICh0aG9yb3VnaGZhcmUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT0FTSVNBZGRyZXNzLktFWV9TVUJfVEhPUk9VR0hGQVJFLCB0aG9yb3VnaGZhcmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0U3ViVGhvcm91Z2hmYXJlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE9BU0lTQWRkcmVzcy5LRVlfU1VCX1RIT1JPVUdIRkFSRSk7XG4gICAgfVxufVxuXG5PQVNJU0FkZHJlc3MuS0VZX0NPVU5UUllfTkFNRSA9ICdjb3VudHJ5TmFtZSc7XG5PQVNJU0FkZHJlc3MuS0VZX0NPVU5UUllfQ09ERSA9ICdjb3VudHJ5Q29kZSc7XG5PQVNJU0FkZHJlc3MuS0VZX1BPU1RBTF9DT0RFID0gJ3Bvc3RhbENvZGUnO1xuT0FTSVNBZGRyZXNzLktFWV9BRE1JTklTVFJBVElWRV9BUkVBID0gJ2FkbWluaXN0cmF0aXZlQXJlYSc7XG5PQVNJU0FkZHJlc3MuS0VZX1NVQl9BRE1JTklTVFJBVElWRV9BUkVBID0gJ3N1YkFkbWluaXN0cmF0aXZlQXJlYSc7XG5PQVNJU0FkZHJlc3MuS0VZX0xPQ0FMSVRZID0gJ2xvY2FsaXR5Jztcbk9BU0lTQWRkcmVzcy5LRVlfU1VCX0xPQ0FMSVRZID0gJ3N1YkxvY2FsaXR5Jztcbk9BU0lTQWRkcmVzcy5LRVlfVEhPUk9VR0hGQVJFID0gJ3Rob3JvdWdoZmFyZSc7XG5PQVNJU0FkZHJlc3MuS0VZX1NVQl9USE9ST1VHSEZBUkUgPSAnc3ViVGhvcm91Z2hmYXJlJztcblxuZXhwb3J0IHsgT0FTSVNBZGRyZXNzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgRGVsaXZlcnlNb2RlIH0gZnJvbSAnLi4vZW51bXMvRGVsaXZlcnlNb2RlLmpzJztcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnLi4vc3RydWN0cy9EYXRlVGltZS5qcyc7XG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBPQVNJU0FkZHJlc3MgfSBmcm9tICcuLi9zdHJ1Y3RzL09BU0lTQWRkcmVzcy5qcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJy4uL3N0cnVjdHMvSW1hZ2UuanMnO1xuXG5jbGFzcyBTZW5kTG9jYXRpb24gZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlNlbmRMb2NhdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGRlZ3JlZXNcbiAgICAgKiBAcmV0dXJuIHtTZW5kTG9jYXRpb259XG4gICAgICovXG4gICAgc2V0TG9uZ2l0dWRlRGVncmVlcyAoZGVncmVlcykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZW5kTG9jYXRpb24uS0VZX0xPTkdJVFVERV9ERUdSRUVTLCBkZWdyZWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldExvbmdpdHVkZURlZ3JlZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2VuZExvY2F0aW9uLktFWV9MT05HSVRVREVfREVHUkVFUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGRlZ3JlZXNcbiAgICAgKiBAcmV0dXJuIHtTZW5kTG9jYXRpb259XG4gICAgICovXG4gICAgc2V0TGF0aXR1ZGVEZWdyZWVzIChkZWdyZWVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlbmRMb2NhdGlvbi5LRVlfTEFUSVRVREVfREVHUkVFUywgZGVncmVlcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRMYXRpdHVkZURlZ3JlZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2VuZExvY2F0aW9uLktFWV9MQVRJVFVERV9ERUdSRUVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIE5hbWUgLyB0aXRsZSBvZiBpbnRlbmRlZCBsb2NhdGlvblxuICAgICAqIEByZXR1cm4ge1NlbmRMb2NhdGlvbn1cbiAgICAgKi9cbiAgICBzZXRMb2NhdGlvbk5hbWUgKG5hbWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VuZExvY2F0aW9uLktFWV9MT0NBVElPTl9OQU1FLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldExvY2F0aW9uTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZW5kTG9jYXRpb24uS0VZX0xPQ0FUSU9OX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkZXNjcmlwdGlvbiAtIERlc2NyaXB0aW9uIGludGVuZGVkIGxvY2F0aW9uIC8gZXN0YWJsaXNobWVudCAoaWYgYXBwbGljYWJsZSlcbiAgICAgKiBAcmV0dXJuIHtTZW5kTG9jYXRpb259XG4gICAgICovXG4gICAgc2V0TG9jYXRpb25EZXNjcmlwdGlvbiAoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VuZExvY2F0aW9uLktFWV9MT0NBVElPTl9ERVNDUklQVElPTiwgZGVzY3JpcHRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0TG9jYXRpb25EZXNjcmlwdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZW5kTG9jYXRpb24uS0VZX0xPQ0FUSU9OX0RFU0NSSVBUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ1tdfSBsaW5lcyAtIExvY2F0aW9uIGFkZHJlc3MgKGlmIGFwcGxpY2FibGUpXG4gICAgICogQHJldHVybiB7U2VuZExvY2F0aW9ufVxuICAgICAqL1xuICAgIHNldEFkZHJlc3NMaW5lcyAobGluZXMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VuZExvY2F0aW9uLktFWV9BRERSRVNTX0xJTkVTLCBsaW5lcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ1tdfVxuICAgICAqL1xuICAgIGdldEFkZHJlc3NMaW5lcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZW5kTG9jYXRpb24uS0VZX0FERFJFU1NfTElORVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBudW1iZXIgLSBQaG9uZSBudW1iZXIgb2YgaW50ZW5kZWQgbG9jYXRpb24gLyBlc3RhYmxpc2htZW50IChpZiBhcHBsaWNhYmxlKVxuICAgICAqIEByZXR1cm4ge1NlbmRMb2NhdGlvbn1cbiAgICAgKi9cbiAgICBzZXRQaG9uZU51bWJlciAobnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlbmRMb2NhdGlvbi5LRVlfUEhPTkVfTlVNQkVSLCBudW1iZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0UGhvbmVOdW1iZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2VuZExvY2F0aW9uLktFWV9QSE9ORV9OVU1CRVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW1hZ2V9IGltYWdlIC0gSW1hZ2UgLyBpY29uIG9mIGludGVuZGVkIGxvY2F0aW9uIChpZiBhcHBsaWNhYmxlIGFuZCBzdXBwb3J0ZWQpXG4gICAgICogQHJldHVybiB7U2VuZExvY2F0aW9ufVxuICAgICAqL1xuICAgIHNldExvY2F0aW9uSW1hZ2UgKGltYWdlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEltYWdlLCBpbWFnZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlbmRMb2NhdGlvbi5LRVlfTE9DQVRJT05fSU1BR0UsIGltYWdlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SW1hZ2V9XG4gICAgICovXG4gICAgZ2V0TG9jYXRpb25JbWFnZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChJbWFnZSwgU2VuZExvY2F0aW9uLktFWV9MT0NBVElPTl9JTUFHRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtEYXRlVGltZX0gc3RhbXAgLSB0aW1lc3RhbXAgaW4gSVNPIDg2MDEgZm9ybWF0XG4gICAgICogQHJldHVybiB7U2VuZExvY2F0aW9ufVxuICAgICAqL1xuICAgIHNldFRpbWVTdGFtcCAoc3RhbXApIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoRGF0ZVRpbWUsIHN0YW1wKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VuZExvY2F0aW9uLktFWV9USU1FX1NUQU1QLCBzdGFtcCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgICAqL1xuICAgIGdldFRpbWVTdGFtcCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChEYXRlVGltZSwgU2VuZExvY2F0aW9uLktFWV9USU1FX1NUQU1QKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09BU0lTQWRkcmVzc30gYWRkcmVzcyAtIEFkZHJlc3MgdG8gYmUgdXNlZCBmb3Igc2V0dGluZyBkZXN0aW5hdGlvblxuICAgICAqIEByZXR1cm4ge1NlbmRMb2NhdGlvbn1cbiAgICAgKi9cbiAgICBzZXRBZGRyZXNzIChhZGRyZXNzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKE9BU0lTQWRkcmVzcywgYWRkcmVzcyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlbmRMb2NhdGlvbi5LRVlfQUREUkVTUywgYWRkcmVzcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge09BU0lTQWRkcmVzc31cbiAgICAgKi9cbiAgICBnZXRBZGRyZXNzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KE9BU0lTQWRkcmVzcywgU2VuZExvY2F0aW9uLktFWV9BRERSRVNTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0RlbGl2ZXJ5TW9kZX0gbW9kZSAtIERlZmluZXMgdGhlIG1vZGUgb2YgcHJvbXB0IGZvciB1c2VyXG4gICAgICogQHJldHVybiB7U2VuZExvY2F0aW9ufVxuICAgICAqL1xuICAgIHNldERlbGl2ZXJ5TW9kZSAobW9kZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShEZWxpdmVyeU1vZGUsIG1vZGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZW5kTG9jYXRpb24uS0VZX0RFTElWRVJZX01PREUsIG1vZGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtEZWxpdmVyeU1vZGV9XG4gICAgICovXG4gICAgZ2V0RGVsaXZlcnlNb2RlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KERlbGl2ZXJ5TW9kZSwgU2VuZExvY2F0aW9uLktFWV9ERUxJVkVSWV9NT0RFKTtcbiAgICB9XG59XG5cblNlbmRMb2NhdGlvbi5LRVlfTE9OR0lUVURFX0RFR1JFRVMgPSAnbG9uZ2l0dWRlRGVncmVlcyc7XG5TZW5kTG9jYXRpb24uS0VZX0xBVElUVURFX0RFR1JFRVMgPSAnbGF0aXR1ZGVEZWdyZWVzJztcblNlbmRMb2NhdGlvbi5LRVlfTE9DQVRJT05fTkFNRSA9ICdsb2NhdGlvbk5hbWUnO1xuU2VuZExvY2F0aW9uLktFWV9MT0NBVElPTl9ERVNDUklQVElPTiA9ICdsb2NhdGlvbkRlc2NyaXB0aW9uJztcblNlbmRMb2NhdGlvbi5LRVlfQUREUkVTU19MSU5FUyA9ICdhZGRyZXNzTGluZXMnO1xuU2VuZExvY2F0aW9uLktFWV9QSE9ORV9OVU1CRVIgPSAncGhvbmVOdW1iZXInO1xuU2VuZExvY2F0aW9uLktFWV9MT0NBVElPTl9JTUFHRSA9ICdsb2NhdGlvbkltYWdlJztcblNlbmRMb2NhdGlvbi5LRVlfVElNRV9TVEFNUCA9ICd0aW1lU3RhbXAnO1xuU2VuZExvY2F0aW9uLktFWV9BRERSRVNTID0gJ2FkZHJlc3MnO1xuU2VuZExvY2F0aW9uLktFWV9ERUxJVkVSWV9NT0RFID0gJ2RlbGl2ZXJ5TW9kZSc7XG5cbmV4cG9ydCB7IFNlbmRMb2NhdGlvbiB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBTZW5kTG9jYXRpb25SZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlNlbmRMb2NhdGlvbik7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB7IFNlbmRMb2NhdGlvblJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG4vKipcbiAqIERpYWxzIGEgcGhvbmUgbnVtYmVyIGFuZCBzd2l0Y2hlcyB0byBwaG9uZSBhcHBsaWNhdGlvbi5cbiAqL1xuY2xhc3MgRGlhbE51bWJlciBleHRlbmRzIFJwY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuRGlhbE51bWJlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG51bWJlciAtIFBob25lIG51bWJlciBpcyBhIHN0cmluZywgd2hpY2ggY2FuIGJlIHVwIHRvIDQwIGNoYXJzLiBBbGwgY2hhcmFjdGVycyBzaGFsbCBiZSBzdHJpcHBlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHN0cmluZyBleGNlcHQgZGlnaXRzIDAtOSBhbmQgKiAjICwgOyArXG4gICAgICogQHJldHVybiB7RGlhbE51bWJlcn1cbiAgICAgKi9cbiAgICBzZXROdW1iZXIgKG51bWJlcikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEaWFsTnVtYmVyLktFWV9OVU1CRVIsIG51bWJlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXROdW1iZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRGlhbE51bWJlci5LRVlfTlVNQkVSKTtcbiAgICB9XG59XG5cbkRpYWxOdW1iZXIuS0VZX05VTUJFUiA9ICdudW1iZXInO1xuXG5leHBvcnQgeyBEaWFsTnVtYmVyIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgUnBjUmVzcG9uc2UgfSBmcm9tICcuLi9ScGNSZXNwb25zZS5qcyc7XG5cbmNsYXNzIERpYWxOdW1iZXJSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkRpYWxOdW1iZXIpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBEaWFsTnVtYmVyUmVzcG9uc2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gQnV0dG9uUHJlc3NNb2RlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBCdXR0b25QcmVzc01vZGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBidXR0b24gd2FzIHJlbGVhc2VkLCBhZnRlciBpdCB3YXMgcHJlc3NlZCBmb3IgYSBsb25nIHRpbWUgQWN0dWFsIHRpbWluZyBpcyBkZWZpbmVkIGJ5IHRoZSBoZWFkdW5pdCBhbmQgbWF5XG4gICAgICogdmFyeVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IExPTkcgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uUHJlc3NNb2RlLl9NQVAuTE9ORztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGJ1dHRvbiB3YXMgcmVsZWFzZWQsIGFmdGVyIGl0IHdhcyBwcmVzc2VkIGZvciBhIHNob3J0IHRpbWUgQWN0dWFsIHRpbWluZyBpcyBkZWZpbmVkIGJ5IHRoZSBoZWFkdW5pdCBhbmQgbWF5XG4gICAgICogdmFyeVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNIT1JUICgpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvblByZXNzTW9kZS5fTUFQLlNIT1JUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvblByZXNzTW9kZS5fdmFsdWVGb3JLZXkoa2V5LCBCdXR0b25QcmVzc01vZGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25QcmVzc01vZGUuX2tleUZvclZhbHVlKHZhbHVlLCBCdXR0b25QcmVzc01vZGUuX01BUCk7XG4gICAgfVxufVxuXG5CdXR0b25QcmVzc01vZGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdMT05HJzogJ0xPTkcnLFxuICAgICdTSE9SVCc6ICdTSE9SVCcsXG59KTtcblxuZXhwb3J0IHsgQnV0dG9uUHJlc3NNb2RlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IE1vZHVsZVR5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIE1vZHVsZVR5cGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ0xJTUFURSAoKSB7XG4gICAgICAgIHJldHVybiBNb2R1bGVUeXBlLl9NQVAuQ0xJTUFURTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSQURJTyAoKSB7XG4gICAgICAgIHJldHVybiBNb2R1bGVUeXBlLl9NQVAuUkFESU87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU0VBVCAoKSB7XG4gICAgICAgIHJldHVybiBNb2R1bGVUeXBlLl9NQVAuU0VBVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBVURJTyAoKSB7XG4gICAgICAgIHJldHVybiBNb2R1bGVUeXBlLl9NQVAuQVVESU87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTElHSFQgKCkge1xuICAgICAgICByZXR1cm4gTW9kdWxlVHlwZS5fTUFQLkxJR0hUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEhNSV9TRVRUSU5HUyAoKSB7XG4gICAgICAgIHJldHVybiBNb2R1bGVUeXBlLl9NQVAuSE1JX1NFVFRJTkdTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIE1vZHVsZVR5cGUuX3ZhbHVlRm9yS2V5KGtleSwgTW9kdWxlVHlwZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIE1vZHVsZVR5cGUuX2tleUZvclZhbHVlKHZhbHVlLCBNb2R1bGVUeXBlLl9NQVApO1xuICAgIH1cbn1cblxuTW9kdWxlVHlwZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0NMSU1BVEUnOiAnQ0xJTUFURScsXG4gICAgJ1JBRElPJzogJ1JBRElPJyxcbiAgICAnU0VBVCc6ICdTRUFUJyxcbiAgICAnQVVESU8nOiAnQVVESU8nLFxuICAgICdMSUdIVCc6ICdMSUdIVCcsXG4gICAgJ0hNSV9TRVRUSU5HUyc6ICdITUlfU0VUVElOR1MnLFxufSk7XG5cbmV4cG9ydCB7IE1vZHVsZVR5cGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBCdXR0b25OYW1lIH0gZnJvbSAnLi4vZW51bXMvQnV0dG9uTmFtZS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBCdXR0b25QcmVzc01vZGUgfSBmcm9tICcuLi9lbnVtcy9CdXR0b25QcmVzc01vZGUuanMnO1xuaW1wb3J0IHsgTW9kdWxlVHlwZSB9IGZyb20gJy4uL2VudW1zL01vZHVsZVR5cGUuanMnO1xuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuXG5jbGFzcyBCdXR0b25QcmVzcyBleHRlbmRzIFJwY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuQnV0dG9uUHJlc3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TW9kdWxlVHlwZX0gdHlwZSAtIFRoZSBtb2R1bGUgd2hlcmUgdGhlIGJ1dHRvbiBzaG91bGQgYmUgcHJlc3NlZFxuICAgICAqIEByZXR1cm4ge0J1dHRvblByZXNzfVxuICAgICAqL1xuICAgIHNldE1vZHVsZVR5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTW9kdWxlVHlwZSwgdHlwZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEJ1dHRvblByZXNzLktFWV9NT0RVTEVfVFlQRSwgdHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge01vZHVsZVR5cGV9XG4gICAgICovXG4gICAgZ2V0TW9kdWxlVHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNb2R1bGVUeXBlLCBCdXR0b25QcmVzcy5LRVlfTU9EVUxFX1RZUEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIElkIG9mIGEgbW9kdWxlLCBwdWJsaXNoZWQgYnkgU3lzdGVtIENhcGFiaWxpdHkuXG4gICAgICogQHJldHVybiB7QnV0dG9uUHJlc3N9XG4gICAgICovXG4gICAgc2V0TW9kdWxlSWQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEJ1dHRvblByZXNzLktFWV9NT0RVTEVfSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldE1vZHVsZUlkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEJ1dHRvblByZXNzLktFWV9NT0RVTEVfSUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QnV0dG9uTmFtZX0gbmFtZSAtIFRoZSBuYW1lIG9mIHN1cHBvcnRlZCBSQyBjbGltYXRlIG9yIHJhZGlvIGJ1dHRvbi5cbiAgICAgKiBAcmV0dXJuIHtCdXR0b25QcmVzc31cbiAgICAgKi9cbiAgICBzZXRCdXR0b25OYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEJ1dHRvbk5hbWUsIG5hbWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihCdXR0b25QcmVzcy5LRVlfQlVUVE9OX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCdXR0b25OYW1lfVxuICAgICAqL1xuICAgIGdldEJ1dHRvbk5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQnV0dG9uTmFtZSwgQnV0dG9uUHJlc3MuS0VZX0JVVFRPTl9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0J1dHRvblByZXNzTW9kZX0gbW9kZSAtIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBMT05HIG9yIFNIT1JUIGJ1dHRvbiBwcmVzcyBldmVudC5cbiAgICAgKiBAcmV0dXJuIHtCdXR0b25QcmVzc31cbiAgICAgKi9cbiAgICBzZXRCdXR0b25QcmVzc01vZGUgKG1vZGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQnV0dG9uUHJlc3NNb2RlLCBtb2RlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQnV0dG9uUHJlc3MuS0VZX0JVVFRPTl9QUkVTU19NT0RFLCBtb2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QnV0dG9uUHJlc3NNb2RlfVxuICAgICAqL1xuICAgIGdldEJ1dHRvblByZXNzTW9kZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChCdXR0b25QcmVzc01vZGUsIEJ1dHRvblByZXNzLktFWV9CVVRUT05fUFJFU1NfTU9ERSk7XG4gICAgfVxufVxuXG5CdXR0b25QcmVzcy5LRVlfTU9EVUxFX1RZUEUgPSAnbW9kdWxlVHlwZSc7XG5CdXR0b25QcmVzcy5LRVlfTU9EVUxFX0lEID0gJ21vZHVsZUlkJztcbkJ1dHRvblByZXNzLktFWV9CVVRUT05fTkFNRSA9ICdidXR0b25OYW1lJztcbkJ1dHRvblByZXNzLktFWV9CVVRUT05fUFJFU1NfTU9ERSA9ICdidXR0b25QcmVzc01vZGUnO1xuXG5leHBvcnQgeyBCdXR0b25QcmVzcyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBCdXR0b25QcmVzc1Jlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuQnV0dG9uUHJlc3MpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBCdXR0b25QcmVzc1Jlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgTW9kdWxlVHlwZSB9IGZyb20gJy4uL2VudW1zL01vZHVsZVR5cGUuanMnO1xuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG5jbGFzcyBHZXRJbnRlcmlvclZlaGljbGVEYXRhIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5HZXRJbnRlcmlvclZlaGljbGVEYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01vZHVsZVR5cGV9IHR5cGUgLSBUaGUgdHlwZSBvZiBhIFJDIG1vZHVsZSB0byByZXRyaWV2ZSBtb2R1bGUgZGF0YSBmcm9tIHRoZSB2ZWhpY2xlLiBJbiB0aGUgZnV0dXJlLCB0aGlzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHRoZSBJZGVudGlmaWNhdGlvbiBvZiBhIG1vZHVsZS5cbiAgICAgKiBAcmV0dXJuIHtHZXRJbnRlcmlvclZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldE1vZHVsZVR5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTW9kdWxlVHlwZSwgdHlwZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldEludGVyaW9yVmVoaWNsZURhdGEuS0VZX01PRFVMRV9UWVBFLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TW9kdWxlVHlwZX1cbiAgICAgKi9cbiAgICBnZXRNb2R1bGVUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KE1vZHVsZVR5cGUsIEdldEludGVyaW9yVmVoaWNsZURhdGEuS0VZX01PRFVMRV9UWVBFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBJZCBvZiBhIG1vZHVsZSwgcHVibGlzaGVkIGJ5IFN5c3RlbSBDYXBhYmlsaXR5LlxuICAgICAqIEByZXR1cm4ge0dldEludGVyaW9yVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0TW9kdWxlSWQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldEludGVyaW9yVmVoaWNsZURhdGEuS0VZX01PRFVMRV9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0TW9kdWxlSWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0SW50ZXJpb3JWZWhpY2xlRGF0YS5LRVlfTU9EVUxFX0lEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHN1YnNjcmliZSAtIElmIHN1YnNjcmliZSBpcyB0cnVlLCB0aGUgaGVhZCB1bml0IHdpbGwgcmVnaXN0ZXIgT25JbnRlcmlvclZlaGljbGVEYXRhXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25zIGZvciB0aGUgcmVxdWVzdGVkIG1vZHVsZSAobW9kdWxlSWQgYW5kIG1vZHVsZVR5cGUpLiBJZiBzdWJzY3JpYmUgaXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0aGUgaGVhZCB1bml0IHdpbGwgdW5yZWdpc3RlciBPbkludGVyaW9yVmVoaWNsZURhdGEgbm90aWZpY2F0aW9ucyBmb3IgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgbW9kdWxlIChtb2R1bGVJZCBhbmQgbW9kdWxlVHlwZSkuIElmIHN1YnNjcmliZSBpcyBub3QgaW5jbHVkZWQsIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uIHN0YXR1cyBvZiB0aGUgYXBwIGZvciB0aGUgcmVxdWVzdGVkIG1vZHVsZSAobW9kdWxlSWQgYW5kIG1vZHVsZVR5cGUpXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHJlbWFpbiB1bmNoYW5nZWQuXG4gICAgICogQHJldHVybiB7R2V0SW50ZXJpb3JWZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRTdWJzY3JpYmUgKHN1YnNjcmliZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRJbnRlcmlvclZlaGljbGVEYXRhLktFWV9TVUJTQ1JJQkUsIHN1YnNjcmliZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0U3Vic2NyaWJlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldEludGVyaW9yVmVoaWNsZURhdGEuS0VZX1NVQlNDUklCRSk7XG4gICAgfVxufVxuXG5HZXRJbnRlcmlvclZlaGljbGVEYXRhLktFWV9NT0RVTEVfVFlQRSA9ICdtb2R1bGVUeXBlJztcbkdldEludGVyaW9yVmVoaWNsZURhdGEuS0VZX01PRFVMRV9JRCA9ICdtb2R1bGVJZCc7XG5HZXRJbnRlcmlvclZlaGljbGVEYXRhLktFWV9TVUJTQ1JJQkUgPSAnc3Vic2NyaWJlJztcblxuZXhwb3J0IHsgR2V0SW50ZXJpb3JWZWhpY2xlRGF0YSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBEaXNwbGF5TW9kZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgRGlzcGxheU1vZGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgREFZICgpIHtcbiAgICAgICAgcmV0dXJuIERpc3BsYXlNb2RlLl9NQVAuREFZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5JR0hUICgpIHtcbiAgICAgICAgcmV0dXJuIERpc3BsYXlNb2RlLl9NQVAuTklHSFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQVVUTyAoKSB7XG4gICAgICAgIHJldHVybiBEaXNwbGF5TW9kZS5fTUFQLkFVVE87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gRGlzcGxheU1vZGUuX3ZhbHVlRm9yS2V5KGtleSwgRGlzcGxheU1vZGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBEaXNwbGF5TW9kZS5fa2V5Rm9yVmFsdWUodmFsdWUsIERpc3BsYXlNb2RlLl9NQVApO1xuICAgIH1cbn1cblxuRGlzcGxheU1vZGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdEQVknOiAnREFZJyxcbiAgICAnTklHSFQnOiAnTklHSFQnLFxuICAgICdBVVRPJzogJ0FVVE8nLFxufSk7XG5cbmV4cG9ydCB7IERpc3BsYXlNb2RlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IERpc3RhbmNlVW5pdFxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgRGlzdGFuY2VVbml0IGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE1JTEVTICgpIHtcbiAgICAgICAgcmV0dXJuIERpc3RhbmNlVW5pdC5fTUFQLk1JTEVTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEtJTE9NRVRFUlMgKCkge1xuICAgICAgICByZXR1cm4gRGlzdGFuY2VVbml0Ll9NQVAuS0lMT01FVEVSUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBEaXN0YW5jZVVuaXQuX3ZhbHVlRm9yS2V5KGtleSwgRGlzdGFuY2VVbml0Ll9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gRGlzdGFuY2VVbml0Ll9rZXlGb3JWYWx1ZSh2YWx1ZSwgRGlzdGFuY2VVbml0Ll9NQVApO1xuICAgIH1cbn1cblxuRGlzdGFuY2VVbml0Ll9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnTUlMRVMnOiAnTUlMRVMnLFxuICAgICdLSUxPTUVURVJTJzogJ0tJTE9NRVRFUlMnLFxufSk7XG5cbmV4cG9ydCB7IERpc3RhbmNlVW5pdCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBUZW1wZXJhdHVyZVVuaXRcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFRlbXBlcmF0dXJlVW5pdCBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGQUhSRU5IRUlUICgpIHtcbiAgICAgICAgcmV0dXJuIFRlbXBlcmF0dXJlVW5pdC5fTUFQLkZBSFJFTkhFSVQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQ0VMU0lVUyAoKSB7XG4gICAgICAgIHJldHVybiBUZW1wZXJhdHVyZVVuaXQuX01BUC5DRUxTSVVTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFRlbXBlcmF0dXJlVW5pdC5fdmFsdWVGb3JLZXkoa2V5LCBUZW1wZXJhdHVyZVVuaXQuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBUZW1wZXJhdHVyZVVuaXQuX2tleUZvclZhbHVlKHZhbHVlLCBUZW1wZXJhdHVyZVVuaXQuX01BUCk7XG4gICAgfVxufVxuXG5UZW1wZXJhdHVyZVVuaXQuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdGQUhSRU5IRUlUJzogJ0ZBSFJFTkhFSVQnLFxuICAgICdDRUxTSVVTJzogJ0NFTFNJVVMnLFxufSk7XG5cbmV4cG9ydCB7IFRlbXBlcmF0dXJlVW5pdCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IERpc3BsYXlNb2RlIH0gZnJvbSAnLi4vZW51bXMvRGlzcGxheU1vZGUuanMnO1xuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IERpc3RhbmNlVW5pdCB9IGZyb20gJy4uL2VudW1zL0Rpc3RhbmNlVW5pdC5qcyc7XG5pbXBvcnQgeyBUZW1wZXJhdHVyZVVuaXQgfSBmcm9tICcuLi9lbnVtcy9UZW1wZXJhdHVyZVVuaXQuanMnO1xuXG4vKipcbiAqIENvcnJlc3BvbmRzIHRvIFwiSE1JX1NFVFRJTkdTXCIgTW9kdWxlVHlwZVxuICovXG5jbGFzcyBITUlTZXR0aW5nc0NvbnRyb2xEYXRhIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Rpc3BsYXlNb2RlfSBtb2RlXG4gICAgICogQHJldHVybiB7SE1JU2V0dGluZ3NDb250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXREaXNwbGF5TW9kZSAobW9kZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShEaXNwbGF5TW9kZSwgbW9kZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEhNSVNldHRpbmdzQ29udHJvbERhdGEuS0VZX0RJU1BMQVlfTU9ERSwgbW9kZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Rpc3BsYXlNb2RlfVxuICAgICAqL1xuICAgIGdldERpc3BsYXlNb2RlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KERpc3BsYXlNb2RlLCBITUlTZXR0aW5nc0NvbnRyb2xEYXRhLktFWV9ESVNQTEFZX01PREUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VGVtcGVyYXR1cmVVbml0fSB1bml0XG4gICAgICogQHJldHVybiB7SE1JU2V0dGluZ3NDb250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXRUZW1wZXJhdHVyZVVuaXQgKHVuaXQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVGVtcGVyYXR1cmVVbml0LCB1bml0KTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSE1JU2V0dGluZ3NDb250cm9sRGF0YS5LRVlfVEVNUEVSQVRVUkVfVU5JVCwgdW5pdCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RlbXBlcmF0dXJlVW5pdH1cbiAgICAgKi9cbiAgICBnZXRUZW1wZXJhdHVyZVVuaXQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVGVtcGVyYXR1cmVVbml0LCBITUlTZXR0aW5nc0NvbnRyb2xEYXRhLktFWV9URU1QRVJBVFVSRV9VTklUKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Rpc3RhbmNlVW5pdH0gdW5pdFxuICAgICAqIEByZXR1cm4ge0hNSVNldHRpbmdzQ29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0RGlzdGFuY2VVbml0ICh1bml0KSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKERpc3RhbmNlVW5pdCwgdW5pdCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEhNSVNldHRpbmdzQ29udHJvbERhdGEuS0VZX0RJU1RBTkNFX1VOSVQsIHVuaXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtEaXN0YW5jZVVuaXR9XG4gICAgICovXG4gICAgZ2V0RGlzdGFuY2VVbml0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KERpc3RhbmNlVW5pdCwgSE1JU2V0dGluZ3NDb250cm9sRGF0YS5LRVlfRElTVEFOQ0VfVU5JVCk7XG4gICAgfVxufVxuXG5ITUlTZXR0aW5nc0NvbnRyb2xEYXRhLktFWV9ESVNQTEFZX01PREUgPSAnZGlzcGxheU1vZGUnO1xuSE1JU2V0dGluZ3NDb250cm9sRGF0YS5LRVlfVEVNUEVSQVRVUkVfVU5JVCA9ICd0ZW1wZXJhdHVyZVVuaXQnO1xuSE1JU2V0dGluZ3NDb250cm9sRGF0YS5LRVlfRElTVEFOQ0VfVU5JVCA9ICdkaXN0YW5jZVVuaXQnO1xuXG5leHBvcnQgeyBITUlTZXR0aW5nc0NvbnRyb2xEYXRhIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IFJhZGlvQmFuZFxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgUmFkaW9CYW5kIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEFNICgpIHtcbiAgICAgICAgcmV0dXJuIFJhZGlvQmFuZC5fTUFQLkFNO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZNICgpIHtcbiAgICAgICAgcmV0dXJuIFJhZGlvQmFuZC5fTUFQLkZNO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFhNICgpIHtcbiAgICAgICAgcmV0dXJuIFJhZGlvQmFuZC5fTUFQLlhNO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFJhZGlvQmFuZC5fdmFsdWVGb3JLZXkoa2V5LCBSYWRpb0JhbmQuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBSYWRpb0JhbmQuX2tleUZvclZhbHVlKHZhbHVlLCBSYWRpb0JhbmQuX01BUCk7XG4gICAgfVxufVxuXG5SYWRpb0JhbmQuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdBTSc6ICdBTScsXG4gICAgJ0ZNJzogJ0ZNJyxcbiAgICAnWE0nOiAnWE0nLFxufSk7XG5cbmV4cG9ydCB7IFJhZGlvQmFuZCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbmNsYXNzIFJkc0RhdGEgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcyAtIFByb2dyYW0gU2VydmljZSBOYW1lXG4gICAgICogQHJldHVybiB7UmRzRGF0YX1cbiAgICAgKi9cbiAgICBzZXRQUyAocHMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmRzRGF0YS5LRVlfUFMsIHBzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFBTICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJkc0RhdGEuS0VZX1BTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcnQgLSBSYWRpbyBUZXh0XG4gICAgICogQHJldHVybiB7UmRzRGF0YX1cbiAgICAgKi9cbiAgICBzZXRSVCAocnQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmRzRGF0YS5LRVlfUlQsIHJ0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFJUICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJkc0RhdGEuS0VZX1JUKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY3QgLSBUaGUgY2xvY2sgdGV4dCBpbiBVVEMgZm9ybWF0IGFzIFlZWVktTU0tRERUaGg6bW06c3Muc1RaRFxuICAgICAqIEByZXR1cm4ge1Jkc0RhdGF9XG4gICAgICovXG4gICAgc2V0Q1QgKGN0KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJkc0RhdGEuS0VZX0NULCBjdCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRDVCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihSZHNEYXRhLktFWV9DVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBpIC0gUHJvZ3JhbSBJZGVudGlmaWNhdGlvbiAtIHRoZSBjYWxsIHNpZ24gZm9yIHRoZSByYWRpbyBzdGF0aW9uXG4gICAgICogQHJldHVybiB7UmRzRGF0YX1cbiAgICAgKi9cbiAgICBzZXRQSSAocGkpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmRzRGF0YS5LRVlfUEksIHBpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFBJICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJkc0RhdGEuS0VZX1BJKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gcHR5IC0gVGhlIHByb2dyYW0gdHlwZSAtIFRoZSByZWdpb24gc2hvdWxkIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIEVVIGFuZCBOb3J0aCBBbWVyaWNhXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gdHlwZXNcbiAgICAgKiBAcmV0dXJuIHtSZHNEYXRhfVxuICAgICAqL1xuICAgIHNldFBUWSAocHR5KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJkc0RhdGEuS0VZX1BUWSwgcHR5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFBUWSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihSZHNEYXRhLktFWV9QVFkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gdHAgLSBUcmFmZmljIFByb2dyYW0gSWRlbnRpZmljYXRpb24gLSBJZGVudGlmaWVzIGEgc3RhdGlvbiB0aGF0IG9mZmVycyB0cmFmZmljXG4gICAgICogQHJldHVybiB7UmRzRGF0YX1cbiAgICAgKi9cbiAgICBzZXRUUCAodHApIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmRzRGF0YS5LRVlfVFAsIHRwKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRUUCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihSZHNEYXRhLktFWV9UUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSB0YSAtIFRyYWZmaWMgQW5ub3VuY2VtZW50IElkZW50aWZpY2F0aW9uIC0gSW5kaWNhdGVzIGFuIG9uZ29pbmcgdHJhZmZpYyBhbm5vdW5jZW1lbnRcbiAgICAgKiBAcmV0dXJuIHtSZHNEYXRhfVxuICAgICAqL1xuICAgIHNldFRBICh0YSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZHNEYXRhLktFWV9UQSwgdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFRBICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJkc0RhdGEuS0VZX1RBKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVnIC0gUmVnaW9uXG4gICAgICogQHJldHVybiB7UmRzRGF0YX1cbiAgICAgKi9cbiAgICBzZXRSRUcgKHJlZykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZHNEYXRhLktFWV9SRUcsIHJlZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRSRUcgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmRzRGF0YS5LRVlfUkVHKTtcbiAgICB9XG59XG5cblJkc0RhdGEuS0VZX1BTID0gJ1BTJztcblJkc0RhdGEuS0VZX1JUID0gJ1JUJztcblJkc0RhdGEuS0VZX0NUID0gJ0NUJztcblJkc0RhdGEuS0VZX1BJID0gJ1BJJztcblJkc0RhdGEuS0VZX1BUWSA9ICdQVFknO1xuUmRzRGF0YS5LRVlfVFAgPSAnVFAnO1xuUmRzRGF0YS5LRVlfVEEgPSAnVEEnO1xuUmRzRGF0YS5LRVlfUkVHID0gJ1JFRyc7XG5cbmV4cG9ydCB7IFJkc0RhdGEgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gUmFkaW9TdGF0ZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgUmFkaW9TdGF0ZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBQ1FVSVJJTkcgKCkge1xuICAgICAgICByZXR1cm4gUmFkaW9TdGF0ZS5fTUFQLkFDUVVJUklORztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBQ1FVSVJFRCAoKSB7XG4gICAgICAgIHJldHVybiBSYWRpb1N0YXRlLl9NQVAuQUNRVUlSRUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTVVMVElDQVNUICgpIHtcbiAgICAgICAgcmV0dXJuIFJhZGlvU3RhdGUuX01BUC5NVUxUSUNBU1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTk9UX0ZPVU5EICgpIHtcbiAgICAgICAgcmV0dXJuIFJhZGlvU3RhdGUuX01BUC5OT1RfRk9VTkQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gUmFkaW9TdGF0ZS5fdmFsdWVGb3JLZXkoa2V5LCBSYWRpb1N0YXRlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gUmFkaW9TdGF0ZS5fa2V5Rm9yVmFsdWUodmFsdWUsIFJhZGlvU3RhdGUuX01BUCk7XG4gICAgfVxufVxuXG5SYWRpb1N0YXRlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnQUNRVUlSSU5HJzogJ0FDUVVJUklORycsXG4gICAgJ0FDUVVJUkVEJzogJ0FDUVVJUkVEJyxcbiAgICAnTVVMVElDQVNUJzogJ01VTFRJQ0FTVCcsXG4gICAgJ05PVF9GT1VORCc6ICdOT1RfRk9VTkQnLFxufSk7XG5cbmV4cG9ydCB7IFJhZGlvU3RhdGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG5jbGFzcyBTdGF0aW9uSUROdW1iZXIgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlIC0gQmluYXJ5IFJlcHJlc2VudGF0aW9uIG9mIElUVSBDb3VudHJ5IENvZGUuIFVTQSBDb2RlIGlzIDAwMS5cbiAgICAgKiBAcmV0dXJuIHtTdGF0aW9uSUROdW1iZXJ9XG4gICAgICovXG4gICAgc2V0Q291bnRyeUNvZGUgKGNvZGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3RhdGlvbklETnVtYmVyLktFWV9DT1VOVFJZX0NPREUsIGNvZGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0Q291bnRyeUNvZGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU3RhdGlvbklETnVtYmVyLktFWV9DT1VOVFJZX0NPREUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpZCAtIEJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB1bmlxdWUgZmFjaWxpdHkgSUQgYXNzaWduZWQgYnkgdGhlIEZDQzsgRkNDIGNvbnRyb2xsZWQgZm9yIFUuUy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0ZXJyaXRvcnlcbiAgICAgKiBAcmV0dXJuIHtTdGF0aW9uSUROdW1iZXJ9XG4gICAgICovXG4gICAgc2V0RmNjRmFjaWxpdHlJZCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3RhdGlvbklETnVtYmVyLktFWV9GQ0NfRkFDSUxJVFlfSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEZjY0ZhY2lsaXR5SWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU3RhdGlvbklETnVtYmVyLktFWV9GQ0NfRkFDSUxJVFlfSUQpO1xuICAgIH1cbn1cblxuU3RhdGlvbklETnVtYmVyLktFWV9DT1VOVFJZX0NPREUgPSAnY291bnRyeUNvZGUnO1xuU3RhdGlvbklETnVtYmVyLktFWV9GQ0NfRkFDSUxJVFlfSUQgPSAnZmNjRmFjaWxpdHlJZCc7XG5cbmV4cG9ydCB7IFN0YXRpb25JRE51bWJlciB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEdQU0RhdGEgfSBmcm9tICcuL0dQU0RhdGEuanMnO1xuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IFN0YXRpb25JRE51bWJlciB9IGZyb20gJy4vU3RhdGlvbklETnVtYmVyLmpzJztcblxuY2xhc3MgU2lzRGF0YSBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBJZGVudGlmaWVzIHRoZSA0LWFscGhhLWNoYXJhY3RlciBzdGF0aW9uIGNhbGwgc2lnbiBwbHVzIGFuIG9wdGlvbmFsICgtRk0pIGV4dGVuc2lvblxuICAgICAqIEByZXR1cm4ge1Npc0RhdGF9XG4gICAgICovXG4gICAgc2V0U3RhdGlvblNob3J0TmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaXNEYXRhLktFWV9TVEFUSU9OX1NIT1JUX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0U3RhdGlvblNob3J0TmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTaXNEYXRhLktFWV9TVEFUSU9OX1NIT1JUX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RhdGlvbklETnVtYmVyfSBudW1iZXIgLSBVc2VkIGZvciBuZXR3b3JrIEFwcGxpY2F0aW9uLiBDb25zaXN0cyBvZiBDb3VudHJ5IENvZGUgYW5kIEZDQyBGYWNpbGl0eSBJRC5cbiAgICAgKiBAcmV0dXJuIHtTaXNEYXRhfVxuICAgICAqL1xuICAgIHNldFN0YXRpb25JRE51bWJlciAobnVtYmVyKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFN0YXRpb25JRE51bWJlciwgbnVtYmVyKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2lzRGF0YS5LRVlfU1RBVElPTl9JRE5VTUJFUiwgbnVtYmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RhdGlvbklETnVtYmVyfVxuICAgICAqL1xuICAgIGdldFN0YXRpb25JRE51bWJlciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTdGF0aW9uSUROdW1iZXIsIFNpc0RhdGEuS0VZX1NUQVRJT05fSUROVU1CRVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gSWRlbnRpZmllcyB0aGUgc3RhdGlvbiBjYWxsIHNpZ24gb3Igb3RoZXIgaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gaW4gdGhlIGxvbmcgZm9ybWF0LlxuICAgICAqIEByZXR1cm4ge1Npc0RhdGF9XG4gICAgICovXG4gICAgc2V0U3RhdGlvbkxvbmdOYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNpc0RhdGEuS0VZX1NUQVRJT05fTE9OR19OQU1FLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFN0YXRpb25Mb25nTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTaXNEYXRhLktFWV9TVEFUSU9OX0xPTkdfTkFNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtHUFNEYXRhfSBsb2NhdGlvbiAtIFByb3ZpZGVzIHRoZSAzLWRpbWVuc2lvbmFsIGdlb2dyYXBoaWMgc3RhdGlvbiBsb2NhdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtTaXNEYXRhfVxuICAgICAqL1xuICAgIHNldFN0YXRpb25Mb2NhdGlvbiAobG9jYXRpb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoR1BTRGF0YSwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaXNEYXRhLktFWV9TVEFUSU9OX0xPQ0FUSU9OLCBsb2NhdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0dQU0RhdGF9XG4gICAgICovXG4gICAgZ2V0U3RhdGlvbkxvY2F0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEdQU0RhdGEsIFNpc0RhdGEuS0VZX1NUQVRJT05fTE9DQVRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIC0gTWF5IGJlIHVzZWQgdG8gY29udmV5IHRleHR1YWwgaW5mb3JtYXRpb24gb2YgZ2VuZXJhbCBpbnRlcmVzdCB0byB0aGUgY29uc3VtZXIgc3VjaCBhc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VhdGhlciBmb3JlY2FzdHMgb3IgcHVibGljIHNlcnZpY2UgYW5ub3VuY2VtZW50cy4gSW5jbHVkZXMgYSBoaWdoIHByaW9yaXR5IGRlbGl2ZXJ5XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlIHRvIGNvbnZleSBlbWVyZ2VuY2llcyB0aGF0IG1heSBiZSBpbiB0aGUgbGlzdGVuaW5nIGFyZWEuXG4gICAgICogQHJldHVybiB7U2lzRGF0YX1cbiAgICAgKi9cbiAgICBzZXRTdGF0aW9uTWVzc2FnZSAobWVzc2FnZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTaXNEYXRhLktFWV9TVEFUSU9OX01FU1NBR0UsIG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0U3RhdGlvbk1lc3NhZ2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2lzRGF0YS5LRVlfU1RBVElPTl9NRVNTQUdFKTtcbiAgICB9XG59XG5cblNpc0RhdGEuS0VZX1NUQVRJT05fU0hPUlRfTkFNRSA9ICdzdGF0aW9uU2hvcnROYW1lJztcblNpc0RhdGEuS0VZX1NUQVRJT05fSUROVU1CRVIgPSAnc3RhdGlvbklETnVtYmVyJztcblNpc0RhdGEuS0VZX1NUQVRJT05fTE9OR19OQU1FID0gJ3N0YXRpb25Mb25nTmFtZSc7XG5TaXNEYXRhLktFWV9TVEFUSU9OX0xPQ0FUSU9OID0gJ3N0YXRpb25Mb2NhdGlvbic7XG5TaXNEYXRhLktFWV9TVEFUSU9OX01FU1NBR0UgPSAnc3RhdGlvbk1lc3NhZ2UnO1xuXG5leHBvcnQgeyBTaXNEYXRhIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUmFkaW9CYW5kIH0gZnJvbSAnLi4vZW51bXMvUmFkaW9CYW5kLmpzJztcbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBSZHNEYXRhIH0gZnJvbSAnLi9SZHNEYXRhLmpzJztcbmltcG9ydCB7IFJhZGlvU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9SYWRpb1N0YXRlLmpzJztcbmltcG9ydCB7IFNpc0RhdGEgfSBmcm9tICcuL1Npc0RhdGEuanMnO1xuXG5jbGFzcyBSYWRpb0NvbnRyb2xEYXRhIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaW50ZWdlciAtIFRoZSBpbnRlZ2VyIHBhcnQgb2YgdGhlIGZyZXF1ZW5jeSBpZSBmb3IgMTAxLjcgdGhpcyB2YWx1ZSBzaG91bGQgYmUgMTAxXG4gICAgICogQHJldHVybiB7UmFkaW9Db250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXRGcmVxdWVuY3lJbnRlZ2VyIChpbnRlZ2VyKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbERhdGEuS0VZX0ZSRVFVRU5DWV9JTlRFR0VSLCBpbnRlZ2VyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEZyZXF1ZW5jeUludGVnZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sRGF0YS5LRVlfRlJFUVVFTkNZX0lOVEVHRVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBmcmFjdGlvbiAtIFRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgdGhlIGZyZXF1ZW5jeSBmb3IgMTAxLjcgaXMgN1xuICAgICAqIEByZXR1cm4ge1JhZGlvQ29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0RnJlcXVlbmN5RnJhY3Rpb24gKGZyYWN0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbERhdGEuS0VZX0ZSRVFVRU5DWV9GUkFDVElPTiwgZnJhY3Rpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0RnJlcXVlbmN5RnJhY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sRGF0YS5LRVlfRlJFUVVFTkNZX0ZSQUNUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1JhZGlvQmFuZH0gYmFuZFxuICAgICAqIEByZXR1cm4ge1JhZGlvQ29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0QmFuZCAoYmFuZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShSYWRpb0JhbmQsIGJhbmQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSYWRpb0NvbnRyb2xEYXRhLktFWV9CQU5ELCBiYW5kKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7UmFkaW9CYW5kfVxuICAgICAqL1xuICAgIGdldEJhbmQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoUmFkaW9CYW5kLCBSYWRpb0NvbnRyb2xEYXRhLktFWV9CQU5EKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1Jkc0RhdGF9IGRhdGFcbiAgICAgKiBAcmV0dXJuIHtSYWRpb0NvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldFJkc0RhdGEgKGRhdGEpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoUmRzRGF0YSwgZGF0YSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbERhdGEuS0VZX1JEU19EQVRBLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7UmRzRGF0YX1cbiAgICAgKi9cbiAgICBnZXRSZHNEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFJkc0RhdGEsIFJhZGlvQ29udHJvbERhdGEuS0VZX1JEU19EQVRBKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZSAtIFRydWUgaWYgdGhlIGhkIHJhZGlvIGlzIG9uLCBmYWxzZSBpZiB0aGUgcmFkaW8gaXMgb2ZmXG4gICAgICogQHJldHVybiB7UmFkaW9Db250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXRIZFJhZGlvRW5hYmxlIChlbmFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sRGF0YS5LRVlfSERfUkFESU9fRU5BQkxFLCBlbmFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEhkUmFkaW9FbmFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sRGF0YS5LRVlfSERfUkFESU9fRU5BQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZHMgLSBOdW1iZXIgb2YgSEQgc3ViLWNoYW5uZWxzIGlmIGF2YWlsYWJsZVxuICAgICAqIEByZXR1cm4ge1JhZGlvQ29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0QXZhaWxhYmxlSERzIChkcykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSYWRpb0NvbnRyb2xEYXRhLktFWV9BVkFJTEFCTEVfSERTLCBkcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRBdmFpbGFibGVIRHMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sRGF0YS5LRVlfQVZBSUxBQkxFX0hEUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJbXX0gY2hhbm5lbHMgLSBUaGUgbGlzdCBvZiBhdmFpbGFibGUgSEQgc3ViLWNoYW5uZWwgaW5kZXhlcy4gRW1wdHkgbGlzdCBtZWFucyBubyBIZCBjaGFubmVsIGlzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUuIFJlYWQtb25seS5cbiAgICAgKiBAcmV0dXJuIHtSYWRpb0NvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldEF2YWlsYWJsZUhkQ2hhbm5lbHMgKGNoYW5uZWxzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbERhdGEuS0VZX0FWQUlMQUJMRV9IRF9DSEFOTkVMUywgY2hhbm5lbHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJbXX1cbiAgICAgKi9cbiAgICBnZXRBdmFpbGFibGVIZENoYW5uZWxzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbERhdGEuS0VZX0FWQUlMQUJMRV9IRF9DSEFOTkVMUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5uZWwgLSBDdXJyZW50IEhEIHN1Yi1jaGFubmVsIGlmIGF2YWlsYWJsZVxuICAgICAqIEByZXR1cm4ge1JhZGlvQ29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0SGRDaGFubmVsIChjaGFubmVsKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbERhdGEuS0VZX0hEX0NIQU5ORUwsIGNoYW5uZWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0SGRDaGFubmVsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbERhdGEuS0VZX0hEX0NIQU5ORUwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzdHJlbmd0aFxuICAgICAqIEByZXR1cm4ge1JhZGlvQ29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0U2lnbmFsU3RyZW5ndGggKHN0cmVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbERhdGEuS0VZX1NJR05BTF9TVFJFTkdUSCwgc3RyZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0U2lnbmFsU3RyZW5ndGggKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sRGF0YS5LRVlfU0lHTkFMX1NUUkVOR1RIKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGhyZXNob2xkIC0gSWYgdGhlIHNpZ25hbCBzdHJlbmd0aCBmYWxscyBiZWxvdyB0aGUgc2V0IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciwgdGhlIHJhZGlvIHdpbGxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVuZSB0byBhbiBhbHRlcm5hdGl2ZSBmcmVxdWVuY3lcbiAgICAgKiBAcmV0dXJuIHtSYWRpb0NvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldFNpZ25hbENoYW5nZVRocmVzaG9sZCAodGhyZXNob2xkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbERhdGEuS0VZX1NJR05BTF9DSEFOR0VfVEhSRVNIT0xELCB0aHJlc2hvbGQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0U2lnbmFsQ2hhbmdlVGhyZXNob2xkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbERhdGEuS0VZX1NJR05BTF9DSEFOR0VfVEhSRVNIT0xEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZSAtIFRydWUgaWYgdGhlIHJhZGlvIGlzIG9uLCBmYWxzZSBpZiB0aGUgcmFkaW8gaXMgb2ZmLiBJZiBzZXQgdG8gZmFsc2UsIG5vIG90aGVyIGRhdGEgd2lsbFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgaW5jbHVkZWQuXG4gICAgICogQHJldHVybiB7UmFkaW9Db250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXRSYWRpb0VuYWJsZSAoZW5hYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbERhdGEuS0VZX1JBRElPX0VOQUJMRSwgZW5hYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRSYWRpb0VuYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihSYWRpb0NvbnRyb2xEYXRhLktFWV9SQURJT19FTkFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7UmFkaW9TdGF0ZX0gc3RhdGVcbiAgICAgKiBAcmV0dXJuIHtSYWRpb0NvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldFN0YXRlIChzdGF0ZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShSYWRpb1N0YXRlLCBzdGF0ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbERhdGEuS0VZX1NUQVRFLCBzdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1JhZGlvU3RhdGV9XG4gICAgICovXG4gICAgZ2V0U3RhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoUmFkaW9TdGF0ZSwgUmFkaW9Db250cm9sRGF0YS5LRVlfU1RBVEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2lzRGF0YX0gZGF0YSAtIFJlYWQtb25seSBTdGF0aW9uIEluZm9ybWF0aW9uIFNlcnZpY2UgKFNJUykgZGF0YSBwcm92aWRlcyBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aW9uIHN1Y2ggYXMgY2FsbCBzaWduLCBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIG5vdCBkaXNwbGF5YWJsZSB0byB0aGUgY29uc3VtZXIgc3VjaCBhc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdGF0aW9uIGlkZW50aWZpY2F0aW9uIG51bWJlclxuICAgICAqIEByZXR1cm4ge1JhZGlvQ29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0U2lzRGF0YSAoZGF0YSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTaXNEYXRhLCBkYXRhKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sRGF0YS5LRVlfU0lTX0RBVEEsIGRhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTaXNEYXRhfVxuICAgICAqL1xuICAgIGdldFNpc0RhdGEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoU2lzRGF0YSwgUmFkaW9Db250cm9sRGF0YS5LRVlfU0lTX0RBVEEpO1xuICAgIH1cbn1cblxuUmFkaW9Db250cm9sRGF0YS5LRVlfRlJFUVVFTkNZX0lOVEVHRVIgPSAnZnJlcXVlbmN5SW50ZWdlcic7XG5SYWRpb0NvbnRyb2xEYXRhLktFWV9GUkVRVUVOQ1lfRlJBQ1RJT04gPSAnZnJlcXVlbmN5RnJhY3Rpb24nO1xuUmFkaW9Db250cm9sRGF0YS5LRVlfQkFORCA9ICdiYW5kJztcblJhZGlvQ29udHJvbERhdGEuS0VZX1JEU19EQVRBID0gJ3Jkc0RhdGEnO1xuUmFkaW9Db250cm9sRGF0YS5LRVlfSERfUkFESU9fRU5BQkxFID0gJ2hkUmFkaW9FbmFibGUnO1xuUmFkaW9Db250cm9sRGF0YS5LRVlfQVZBSUxBQkxFX0hEUyA9ICdhdmFpbGFibGVIRHMnO1xuUmFkaW9Db250cm9sRGF0YS5LRVlfQVZBSUxBQkxFX0hEX0NIQU5ORUxTID0gJ2F2YWlsYWJsZUhkQ2hhbm5lbHMnO1xuUmFkaW9Db250cm9sRGF0YS5LRVlfSERfQ0hBTk5FTCA9ICdoZENoYW5uZWwnO1xuUmFkaW9Db250cm9sRGF0YS5LRVlfU0lHTkFMX1NUUkVOR1RIID0gJ3NpZ25hbFN0cmVuZ3RoJztcblJhZGlvQ29udHJvbERhdGEuS0VZX1NJR05BTF9DSEFOR0VfVEhSRVNIT0xEID0gJ3NpZ25hbENoYW5nZVRocmVzaG9sZCc7XG5SYWRpb0NvbnRyb2xEYXRhLktFWV9SQURJT19FTkFCTEUgPSAncmFkaW9FbmFibGUnO1xuUmFkaW9Db250cm9sRGF0YS5LRVlfU1RBVEUgPSAnc3RhdGUnO1xuUmFkaW9Db250cm9sRGF0YS5LRVlfU0lTX0RBVEEgPSAnc2lzRGF0YSc7XG5cbmV4cG9ydCB7IFJhZGlvQ29udHJvbERhdGEgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgVGVtcGVyYXR1cmVVbml0IH0gZnJvbSAnLi4vZW51bXMvVGVtcGVyYXR1cmVVbml0LmpzJztcblxuY2xhc3MgVGVtcGVyYXR1cmUgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VGVtcGVyYXR1cmVVbml0fSB1bml0IC0gVGVtcGVyYXR1cmUgVW5pdFxuICAgICAqIEByZXR1cm4ge1RlbXBlcmF0dXJlfVxuICAgICAqL1xuICAgIHNldFVuaXQgKHVuaXQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVGVtcGVyYXR1cmVVbml0LCB1bml0KTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVGVtcGVyYXR1cmUuS0VZX1VOSVQsIHVuaXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUZW1wZXJhdHVyZVVuaXR9XG4gICAgICovXG4gICAgZ2V0VW5pdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUZW1wZXJhdHVyZVVuaXQsIFRlbXBlcmF0dXJlLktFWV9VTklUKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdmFsdWUgLSBUZW1wZXJhdHVyZSBWYWx1ZSBpbiBUZW1wZXJhdHVyZVVuaXQgc3BlY2lmaWVkIHVuaXQuIFJhbmdlIGRlcGVuZHMgb24gT0VNIGFuZCBpcyBub3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkIGJ5IFNETC5cbiAgICAgKiBAcmV0dXJuIHtUZW1wZXJhdHVyZX1cbiAgICAgKi9cbiAgICBzZXRWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVGVtcGVyYXR1cmUuS0VZX1ZBTFVFLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRWYWx1ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihUZW1wZXJhdHVyZS5LRVlfVkFMVUUpO1xuICAgIH1cbn1cblxuVGVtcGVyYXR1cmUuS0VZX1VOSVQgPSAndW5pdCc7XG5UZW1wZXJhdHVyZS5LRVlfVkFMVUUgPSAndmFsdWUnO1xuXG5leHBvcnQgeyBUZW1wZXJhdHVyZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBWZW50aWxhdGlvbk1vZGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFZlbnRpbGF0aW9uTW9kZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBVUFBFUiAoKSB7XG4gICAgICAgIHJldHVybiBWZW50aWxhdGlvbk1vZGUuX01BUC5VUFBFUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBMT1dFUiAoKSB7XG4gICAgICAgIHJldHVybiBWZW50aWxhdGlvbk1vZGUuX01BUC5MT1dFUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBCT1RIICgpIHtcbiAgICAgICAgcmV0dXJuIFZlbnRpbGF0aW9uTW9kZS5fTUFQLkJPVEg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTk9ORSAoKSB7XG4gICAgICAgIHJldHVybiBWZW50aWxhdGlvbk1vZGUuX01BUC5OT05FO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFZlbnRpbGF0aW9uTW9kZS5fdmFsdWVGb3JLZXkoa2V5LCBWZW50aWxhdGlvbk1vZGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBWZW50aWxhdGlvbk1vZGUuX2tleUZvclZhbHVlKHZhbHVlLCBWZW50aWxhdGlvbk1vZGUuX01BUCk7XG4gICAgfVxufVxuXG5WZW50aWxhdGlvbk1vZGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdVUFBFUic6ICdVUFBFUicsXG4gICAgJ0xPV0VSJzogJ0xPV0VSJyxcbiAgICAnQk9USCc6ICdCT1RIJyxcbiAgICAnTk9ORSc6ICdOT05FJyxcbn0pO1xuXG5leHBvcnQgeyBWZW50aWxhdGlvbk1vZGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gRGVmcm9zdFpvbmVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIERlZnJvc3Rab25lIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZST05UICgpIHtcbiAgICAgICAgcmV0dXJuIERlZnJvc3Rab25lLl9NQVAuRlJPTlQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUkVBUiAoKSB7XG4gICAgICAgIHJldHVybiBEZWZyb3N0Wm9uZS5fTUFQLlJFQVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQUxMICgpIHtcbiAgICAgICAgcmV0dXJuIERlZnJvc3Rab25lLl9NQVAuQUxMO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5PTkUgKCkge1xuICAgICAgICByZXR1cm4gRGVmcm9zdFpvbmUuX01BUC5OT05FO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIERlZnJvc3Rab25lLl92YWx1ZUZvcktleShrZXksIERlZnJvc3Rab25lLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gRGVmcm9zdFpvbmUuX2tleUZvclZhbHVlKHZhbHVlLCBEZWZyb3N0Wm9uZS5fTUFQKTtcbiAgICB9XG59XG5cbkRlZnJvc3Rab25lLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnRlJPTlQnOiAnRlJPTlQnLFxuICAgICdSRUFSJzogJ1JFQVInLFxuICAgICdBTEwnOiAnQUxMJyxcbiAgICAnTk9ORSc6ICdOT05FJyxcbn0pO1xuXG5leHBvcnQgeyBEZWZyb3N0Wm9uZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFRlbXBlcmF0dXJlIH0gZnJvbSAnLi9UZW1wZXJhdHVyZS5qcyc7XG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgVmVudGlsYXRpb25Nb2RlIH0gZnJvbSAnLi4vZW51bXMvVmVudGlsYXRpb25Nb2RlLmpzJztcbmltcG9ydCB7IERlZnJvc3Rab25lIH0gZnJvbSAnLi4vZW51bXMvRGVmcm9zdFpvbmUuanMnO1xuXG5jbGFzcyBDbGltYXRlQ29udHJvbERhdGEgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzcGVlZFxuICAgICAqIEByZXR1cm4ge0NsaW1hdGVDb250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXRGYW5TcGVlZCAoc3BlZWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xEYXRhLktFWV9GQU5fU1BFRUQsIHNwZWVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEZhblNwZWVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sRGF0YS5LRVlfRkFOX1NQRUVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RlbXBlcmF0dXJlfSB0ZW1wZXJhdHVyZVxuICAgICAqIEByZXR1cm4ge0NsaW1hdGVDb250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXRDdXJyZW50VGVtcGVyYXR1cmUgKHRlbXBlcmF0dXJlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRlbXBlcmF0dXJlLCB0ZW1wZXJhdHVyZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sRGF0YS5LRVlfQ1VSUkVOVF9URU1QRVJBVFVSRSwgdGVtcGVyYXR1cmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUZW1wZXJhdHVyZX1cbiAgICAgKi9cbiAgICBnZXRDdXJyZW50VGVtcGVyYXR1cmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVGVtcGVyYXR1cmUsIENsaW1hdGVDb250cm9sRGF0YS5LRVlfQ1VSUkVOVF9URU1QRVJBVFVSRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUZW1wZXJhdHVyZX0gdGVtcGVyYXR1cmVcbiAgICAgKiBAcmV0dXJuIHtDbGltYXRlQ29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0RGVzaXJlZFRlbXBlcmF0dXJlICh0ZW1wZXJhdHVyZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShUZW1wZXJhdHVyZSwgdGVtcGVyYXR1cmUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbERhdGEuS0VZX0RFU0lSRURfVEVNUEVSQVRVUkUsIHRlbXBlcmF0dXJlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VGVtcGVyYXR1cmV9XG4gICAgICovXG4gICAgZ2V0RGVzaXJlZFRlbXBlcmF0dXJlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRlbXBlcmF0dXJlLCBDbGltYXRlQ29udHJvbERhdGEuS0VZX0RFU0lSRURfVEVNUEVSQVRVUkUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlXG4gICAgICogQHJldHVybiB7Q2xpbWF0ZUNvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldEFjRW5hYmxlIChlbmFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xEYXRhLktFWV9BQ19FTkFCTEUsIGVuYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0QWNFbmFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xEYXRhLktFWV9BQ19FTkFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlXG4gICAgICogQHJldHVybiB7Q2xpbWF0ZUNvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldENpcmN1bGF0ZUFpckVuYWJsZSAoZW5hYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sRGF0YS5LRVlfQ0lSQ1VMQVRFX0FJUl9FTkFCTEUsIGVuYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0Q2lyY3VsYXRlQWlyRW5hYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sRGF0YS5LRVlfQ0lSQ1VMQVRFX0FJUl9FTkFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlXG4gICAgICogQHJldHVybiB7Q2xpbWF0ZUNvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldEF1dG9Nb2RlRW5hYmxlIChlbmFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xEYXRhLktFWV9BVVRPX01PREVfRU5BQkxFLCBlbmFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEF1dG9Nb2RlRW5hYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sRGF0YS5LRVlfQVVUT19NT0RFX0VOQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtEZWZyb3N0Wm9uZX0gem9uZVxuICAgICAqIEByZXR1cm4ge0NsaW1hdGVDb250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXREZWZyb3N0Wm9uZSAoem9uZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShEZWZyb3N0Wm9uZSwgem9uZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sRGF0YS5LRVlfREVGUk9TVF9aT05FLCB6b25lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7RGVmcm9zdFpvbmV9XG4gICAgICovXG4gICAgZ2V0RGVmcm9zdFpvbmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoRGVmcm9zdFpvbmUsIENsaW1hdGVDb250cm9sRGF0YS5LRVlfREVGUk9TVF9aT05FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZVxuICAgICAqIEByZXR1cm4ge0NsaW1hdGVDb250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXREdWFsTW9kZUVuYWJsZSAoZW5hYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sRGF0YS5LRVlfRFVBTF9NT0RFX0VOQUJMRSwgZW5hYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXREdWFsTW9kZUVuYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbERhdGEuS0VZX0RVQUxfTU9ERV9FTkFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlXG4gICAgICogQHJldHVybiB7Q2xpbWF0ZUNvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldEFjTWF4RW5hYmxlIChlbmFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xEYXRhLktFWV9BQ19NQVhfRU5BQkxFLCBlbmFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEFjTWF4RW5hYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sRGF0YS5LRVlfQUNfTUFYX0VOQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWZW50aWxhdGlvbk1vZGV9IG1vZGVcbiAgICAgKiBAcmV0dXJuIHtDbGltYXRlQ29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0VmVudGlsYXRpb25Nb2RlIChtb2RlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlbnRpbGF0aW9uTW9kZSwgbW9kZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sRGF0YS5LRVlfVkVOVElMQVRJT05fTU9ERSwgbW9kZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlbnRpbGF0aW9uTW9kZX1cbiAgICAgKi9cbiAgICBnZXRWZW50aWxhdGlvbk1vZGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmVudGlsYXRpb25Nb2RlLCBDbGltYXRlQ29udHJvbERhdGEuS0VZX1ZFTlRJTEFUSU9OX01PREUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlIC0gdmFsdWUgZmFsc2UgbWVhbnMgZGlzYWJsZWQvdHVybiBvZmYsIHZhbHVlIHRydWUgbWVhbnMgZW5hYmxlZC90dXJuIG9uLlxuICAgICAqIEByZXR1cm4ge0NsaW1hdGVDb250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXRIZWF0ZWRTdGVlcmluZ1doZWVsRW5hYmxlIChlbmFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xEYXRhLktFWV9IRUFURURfU1RFRVJJTkdfV0hFRUxfRU5BQkxFLCBlbmFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEhlYXRlZFN0ZWVyaW5nV2hlZWxFbmFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xEYXRhLktFWV9IRUFURURfU1RFRVJJTkdfV0hFRUxfRU5BQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZSAtIHZhbHVlIGZhbHNlIG1lYW5zIGRpc2FibGVkLCB2YWx1ZSB0cnVlIG1lYW5zIGVuYWJsZWQuXG4gICAgICogQHJldHVybiB7Q2xpbWF0ZUNvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldEhlYXRlZFdpbmRzaGllbGRFbmFibGUgKGVuYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbERhdGEuS0VZX0hFQVRFRF9XSU5EU0hJRUxEX0VOQUJMRSwgZW5hYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRIZWF0ZWRXaW5kc2hpZWxkRW5hYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sRGF0YS5LRVlfSEVBVEVEX1dJTkRTSElFTERfRU5BQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZSAtIHZhbHVlIGZhbHNlIG1lYW5zIGRpc2FibGVkLCB2YWx1ZSB0cnVlIG1lYW5zIGVuYWJsZWQuXG4gICAgICogQHJldHVybiB7Q2xpbWF0ZUNvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldEhlYXRlZFJlYXJXaW5kb3dFbmFibGUgKGVuYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbERhdGEuS0VZX0hFQVRFRF9SRUFSX1dJTkRPV19FTkFCTEUsIGVuYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0SGVhdGVkUmVhcldpbmRvd0VuYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbERhdGEuS0VZX0hFQVRFRF9SRUFSX1dJTkRPV19FTkFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlIC0gdmFsdWUgZmFsc2UgbWVhbnMgZGlzYWJsZWQsIHZhbHVlIHRydWUgbWVhbnMgZW5hYmxlZC5cbiAgICAgKiBAcmV0dXJuIHtDbGltYXRlQ29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0SGVhdGVkTWlycm9yc0VuYWJsZSAoZW5hYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sRGF0YS5LRVlfSEVBVEVEX01JUlJPUlNfRU5BQkxFLCBlbmFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEhlYXRlZE1pcnJvcnNFbmFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xEYXRhLktFWV9IRUFURURfTUlSUk9SU19FTkFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlIC0gVHJ1ZSBpZiB0aGUgY2xpbWF0ZSBtb2R1bGUgaXMgb24sIGZhbHNlIGlmIHRoZSBjbGltYXRlIG1vZHVsZSBpcyBvZmZcbiAgICAgKiBAcmV0dXJuIHtDbGltYXRlQ29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0Q2xpbWF0ZUVuYWJsZSAoZW5hYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sRGF0YS5LRVlfQ0xJTUFURV9FTkFCTEUsIGVuYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0Q2xpbWF0ZUVuYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbERhdGEuS0VZX0NMSU1BVEVfRU5BQkxFKTtcbiAgICB9XG59XG5cbkNsaW1hdGVDb250cm9sRGF0YS5LRVlfRkFOX1NQRUVEID0gJ2ZhblNwZWVkJztcbkNsaW1hdGVDb250cm9sRGF0YS5LRVlfQ1VSUkVOVF9URU1QRVJBVFVSRSA9ICdjdXJyZW50VGVtcGVyYXR1cmUnO1xuQ2xpbWF0ZUNvbnRyb2xEYXRhLktFWV9ERVNJUkVEX1RFTVBFUkFUVVJFID0gJ2Rlc2lyZWRUZW1wZXJhdHVyZSc7XG5DbGltYXRlQ29udHJvbERhdGEuS0VZX0FDX0VOQUJMRSA9ICdhY0VuYWJsZSc7XG5DbGltYXRlQ29udHJvbERhdGEuS0VZX0NJUkNVTEFURV9BSVJfRU5BQkxFID0gJ2NpcmN1bGF0ZUFpckVuYWJsZSc7XG5DbGltYXRlQ29udHJvbERhdGEuS0VZX0FVVE9fTU9ERV9FTkFCTEUgPSAnYXV0b01vZGVFbmFibGUnO1xuQ2xpbWF0ZUNvbnRyb2xEYXRhLktFWV9ERUZST1NUX1pPTkUgPSAnZGVmcm9zdFpvbmUnO1xuQ2xpbWF0ZUNvbnRyb2xEYXRhLktFWV9EVUFMX01PREVfRU5BQkxFID0gJ2R1YWxNb2RlRW5hYmxlJztcbkNsaW1hdGVDb250cm9sRGF0YS5LRVlfQUNfTUFYX0VOQUJMRSA9ICdhY01heEVuYWJsZSc7XG5DbGltYXRlQ29udHJvbERhdGEuS0VZX1ZFTlRJTEFUSU9OX01PREUgPSAndmVudGlsYXRpb25Nb2RlJztcbkNsaW1hdGVDb250cm9sRGF0YS5LRVlfSEVBVEVEX1NURUVSSU5HX1dIRUVMX0VOQUJMRSA9ICdoZWF0ZWRTdGVlcmluZ1doZWVsRW5hYmxlJztcbkNsaW1hdGVDb250cm9sRGF0YS5LRVlfSEVBVEVEX1dJTkRTSElFTERfRU5BQkxFID0gJ2hlYXRlZFdpbmRzaGllbGRFbmFibGUnO1xuQ2xpbWF0ZUNvbnRyb2xEYXRhLktFWV9IRUFURURfUkVBUl9XSU5ET1dfRU5BQkxFID0gJ2hlYXRlZFJlYXJXaW5kb3dFbmFibGUnO1xuQ2xpbWF0ZUNvbnRyb2xEYXRhLktFWV9IRUFURURfTUlSUk9SU19FTkFCTEUgPSAnaGVhdGVkTWlycm9yc0VuYWJsZSc7XG5DbGltYXRlQ29udHJvbERhdGEuS0VZX0NMSU1BVEVfRU5BQkxFID0gJ2NsaW1hdGVFbmFibGUnO1xuXG5leHBvcnQgeyBDbGltYXRlQ29udHJvbERhdGEgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG4vKipcbiAqIERlZmluZXMgdGhlIGVhY2ggRXF1YWxpemVyIGNoYW5uZWwgc2V0dGluZ3MuXG4gKi9cbmNsYXNzIEVxdWFsaXplclNldHRpbmdzIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaWRcbiAgICAgKiBAcmV0dXJuIHtFcXVhbGl6ZXJTZXR0aW5nc31cbiAgICAgKi9cbiAgICBzZXRDaGFubmVsSWQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEVxdWFsaXplclNldHRpbmdzLktFWV9DSEFOTkVMX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRDaGFubmVsSWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRXF1YWxpemVyU2V0dGluZ3MuS0VZX0NIQU5ORUxfSUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gcmVhZC1vbmx5IGNoYW5uZWwgLyBmcmVxdWVuY3kgbmFtZSAoZS5pLiBcIlRyZWJsZSwgTWlkcmFuZ2UsIEJhc3NcIiBvciBcIjEyNSBIelwiKVxuICAgICAqIEByZXR1cm4ge0VxdWFsaXplclNldHRpbmdzfVxuICAgICAqL1xuICAgIHNldENoYW5uZWxOYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEVxdWFsaXplclNldHRpbmdzLktFWV9DSEFOTkVMX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0Q2hhbm5lbE5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRXF1YWxpemVyU2V0dGluZ3MuS0VZX0NIQU5ORUxfTkFNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNldHRpbmcgLSBSZWZsZWN0cyB0aGUgc2V0dGluZywgZnJvbSAwJS0xMDAlLlxuICAgICAqIEByZXR1cm4ge0VxdWFsaXplclNldHRpbmdzfVxuICAgICAqL1xuICAgIHNldENoYW5uZWxTZXR0aW5nIChzZXR0aW5nKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEVxdWFsaXplclNldHRpbmdzLktFWV9DSEFOTkVMX1NFVFRJTkcsIHNldHRpbmcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0Q2hhbm5lbFNldHRpbmcgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoRXF1YWxpemVyU2V0dGluZ3MuS0VZX0NIQU5ORUxfU0VUVElORyk7XG4gICAgfVxufVxuXG5FcXVhbGl6ZXJTZXR0aW5ncy5LRVlfQ0hBTk5FTF9JRCA9ICdjaGFubmVsSWQnO1xuRXF1YWxpemVyU2V0dGluZ3MuS0VZX0NIQU5ORUxfTkFNRSA9ICdjaGFubmVsTmFtZSc7XG5FcXVhbGl6ZXJTZXR0aW5ncy5LRVlfQ0hBTk5FTF9TRVRUSU5HID0gJ2NoYW5uZWxTZXR0aW5nJztcblxuZXhwb3J0IHsgRXF1YWxpemVyU2V0dGluZ3MgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgUHJpbWFyeUF1ZGlvU291cmNlIH0gZnJvbSAnLi4vZW51bXMvUHJpbWFyeUF1ZGlvU291cmNlLmpzJztcbmltcG9ydCB7IEVxdWFsaXplclNldHRpbmdzIH0gZnJvbSAnLi9FcXVhbGl6ZXJTZXR0aW5ncy5qcyc7XG5cbmNsYXNzIEF1ZGlvQ29udHJvbERhdGEgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7UHJpbWFyeUF1ZGlvU291cmNlfSBzb3VyY2UgLSBJbiBhIGdldHRlciByZXNwb25zZSBvciBhIG5vdGlmaWNhdGlvbiwgaXQgaXMgdGhlIGN1cnJlbnQgcHJpbWFyeSBhdWRpb1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2Ugb2YgdGhlIHN5c3RlbS4gSW4gYSBzZXR0ZXIgcmVxdWVzdCwgaXQgaXMgdGhlIHRhcmdldCBhdWRpbyBzb3VyY2VcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgc3lzdGVtIHNoYWxsIHN3aXRjaCB0by4gSWYgdGhlIHZhbHVlIGlzIE1PQklMRV9BUFAsIHRoZSBzeXN0ZW1cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhbGwgc3dpdGNoIHRvIHRoZSBtb2JpbGUgbWVkaWEgYXBwIHRoYXQgaXNzdWVzIHRoZSBzZXR0ZXIgUlBDLlxuICAgICAqIEByZXR1cm4ge0F1ZGlvQ29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0U291cmNlIChzb3VyY2UpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoUHJpbWFyeUF1ZGlvU291cmNlLCBzb3VyY2UpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBdWRpb0NvbnRyb2xEYXRhLktFWV9TT1VSQ0UsIHNvdXJjZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ByaW1hcnlBdWRpb1NvdXJjZX1cbiAgICAgKi9cbiAgICBnZXRTb3VyY2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoUHJpbWFyeUF1ZGlvU291cmNlLCBBdWRpb0NvbnRyb2xEYXRhLktFWV9TT1VSQ0UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gY29udGV4dCAtIFRoaXMgcGFyYW1ldGVyIHNoYWxsIG5vdCBiZSBwcmVzZW50IGluIGFueSBnZXR0ZXIgcmVzcG9uc2VzIG9yIG5vdGlmaWNhdGlvbnMuIFRoaXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwgaW4gYSBzZXR0ZXIgcmVxdWVzdC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UgaWYgaXQgaXMgbm90XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQuIElmIGl0IGlzIGZhbHNlLCB0aGUgc3lzdGVtIG5vdCBvbmx5IGNoYW5nZXMgdGhlIGF1ZGlvIHNvdXJjZSBidXQgYWxzbyBicmluZ3NcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiBvciBzeXN0ZW0gVUkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdWRpbyBzb3VyY2UgdG8gZm9yZWdyb3VuZC5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBpdCBpcyB0cnVlLCB0aGUgc3lzdGVtIG9ubHkgY2hhbmdlcyB0aGUgYXVkaW8gc291cmNlLCBidXQga2VlcHMgdGhlIGN1cnJlbnRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBpbiBmb3JlZ3JvdW5kLlxuICAgICAqIEByZXR1cm4ge0F1ZGlvQ29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0S2VlcENvbnRleHQgKGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXVkaW9Db250cm9sRGF0YS5LRVlfS0VFUF9DT05URVhULCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRLZWVwQ29udGV4dCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihBdWRpb0NvbnRyb2xEYXRhLktFWV9LRUVQX0NPTlRFWFQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2b2x1bWUgLSBSZWZsZWN0cyB0aGUgdm9sdW1lIG9mIGF1ZGlvLCBmcm9tIDAlLTEwMCUuXG4gICAgICogQHJldHVybiB7QXVkaW9Db250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXRWb2x1bWUgKHZvbHVtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBdWRpb0NvbnRyb2xEYXRhLktFWV9WT0xVTUUsIHZvbHVtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRWb2x1bWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQXVkaW9Db250cm9sRGF0YS5LRVlfVk9MVU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0VxdWFsaXplclNldHRpbmdzW119IHNldHRpbmdzIC0gRGVmaW5lcyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgY2hhbm5lbHMgKGJhbmQpIGFuZCB0aGVpciBjdXJyZW50L2Rlc2lyZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mgb24gSE1JXG4gICAgICogQHJldHVybiB7QXVkaW9Db250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXRFcXVhbGl6ZXJTZXR0aW5ncyAoc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoRXF1YWxpemVyU2V0dGluZ3MsIHNldHRpbmdzLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXVkaW9Db250cm9sRGF0YS5LRVlfRVFVQUxJWkVSX1NFVFRJTkdTLCBzZXR0aW5ncyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0VxdWFsaXplclNldHRpbmdzW119XG4gICAgICovXG4gICAgZ2V0RXF1YWxpemVyU2V0dGluZ3MgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoRXF1YWxpemVyU2V0dGluZ3MsIEF1ZGlvQ29udHJvbERhdGEuS0VZX0VRVUFMSVpFUl9TRVRUSU5HUyk7XG4gICAgfVxufVxuXG5BdWRpb0NvbnRyb2xEYXRhLktFWV9TT1VSQ0UgPSAnc291cmNlJztcbkF1ZGlvQ29udHJvbERhdGEuS0VZX0tFRVBfQ09OVEVYVCA9ICdrZWVwQ29udGV4dCc7XG5BdWRpb0NvbnRyb2xEYXRhLktFWV9WT0xVTUUgPSAndm9sdW1lJztcbkF1ZGlvQ29udHJvbERhdGEuS0VZX0VRVUFMSVpFUl9TRVRUSU5HUyA9ICdlcXVhbGl6ZXJTZXR0aW5ncyc7XG5cbmV4cG9ydCB7IEF1ZGlvQ29udHJvbERhdGEgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBMaXN0IHBvc3NpYmxlIGN1c2hpb25zIG9mIGEgbXVsdGktY29udG91ciBtYXNzYWdlIHNlYXQuXG4gKiBAdHlwZWRlZiB7RW51bX0gTWFzc2FnZUN1c2hpb25cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIE1hc3NhZ2VDdXNoaW9uIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRPUF9MVU1CQVIgKCkge1xuICAgICAgICByZXR1cm4gTWFzc2FnZUN1c2hpb24uX01BUC5UT1BfTFVNQkFSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE1JRERMRV9MVU1CQVIgKCkge1xuICAgICAgICByZXR1cm4gTWFzc2FnZUN1c2hpb24uX01BUC5NSURETEVfTFVNQkFSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEJPVFRPTV9MVU1CQVIgKCkge1xuICAgICAgICByZXR1cm4gTWFzc2FnZUN1c2hpb24uX01BUC5CT1RUT01fTFVNQkFSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEJBQ0tfQk9MU1RFUlMgKCkge1xuICAgICAgICByZXR1cm4gTWFzc2FnZUN1c2hpb24uX01BUC5CQUNLX0JPTFNURVJTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNFQVRfQk9MU1RFUlMgKCkge1xuICAgICAgICByZXR1cm4gTWFzc2FnZUN1c2hpb24uX01BUC5TRUFUX0JPTFNURVJTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIE1hc3NhZ2VDdXNoaW9uLl92YWx1ZUZvcktleShrZXksIE1hc3NhZ2VDdXNoaW9uLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gTWFzc2FnZUN1c2hpb24uX2tleUZvclZhbHVlKHZhbHVlLCBNYXNzYWdlQ3VzaGlvbi5fTUFQKTtcbiAgICB9XG59XG5cbk1hc3NhZ2VDdXNoaW9uLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnVE9QX0xVTUJBUic6ICdUT1BfTFVNQkFSJyxcbiAgICAnTUlERExFX0xVTUJBUic6ICdNSURETEVfTFVNQkFSJyxcbiAgICAnQk9UVE9NX0xVTUJBUic6ICdCT1RUT01fTFVNQkFSJyxcbiAgICAnQkFDS19CT0xTVEVSUyc6ICdCQUNLX0JPTFNURVJTJyxcbiAgICAnU0VBVF9CT0xTVEVSUyc6ICdTRUFUX0JPTFNURVJTJyxcbn0pO1xuXG5leHBvcnQgeyBNYXNzYWdlQ3VzaGlvbiB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBNYXNzYWdlQ3VzaGlvbiB9IGZyb20gJy4uL2VudW1zL01hc3NhZ2VDdXNoaW9uLmpzJztcblxuLyoqXG4gKiBUaGUgaW50ZW5zaXR5IG9yIGZpcm1uZXNzIG9mIGEgY3VzaGlvbi5cbiAqL1xuY2xhc3MgTWFzc2FnZUN1c2hpb25GaXJtbmVzcyBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNYXNzYWdlQ3VzaGlvbn0gY3VzaGlvbiAtIExpc3QgcG9zc2libGUgY3VzaGlvbnMgb2YgYSBtdWx0aS1jb250b3VyIG1hc3NhZ2Ugc2VhdC5cbiAgICAgKiBAcmV0dXJuIHtNYXNzYWdlQ3VzaGlvbkZpcm1uZXNzfVxuICAgICAqL1xuICAgIHNldEN1c2hpb24gKGN1c2hpb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTWFzc2FnZUN1c2hpb24sIGN1c2hpb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihNYXNzYWdlQ3VzaGlvbkZpcm1uZXNzLktFWV9DVVNISU9OLCBjdXNoaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TWFzc2FnZUN1c2hpb259XG4gICAgICovXG4gICAgZ2V0Q3VzaGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNYXNzYWdlQ3VzaGlvbiwgTWFzc2FnZUN1c2hpb25GaXJtbmVzcy5LRVlfQ1VTSElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGZpcm1uZXNzXG4gICAgICogQHJldHVybiB7TWFzc2FnZUN1c2hpb25GaXJtbmVzc31cbiAgICAgKi9cbiAgICBzZXRGaXJtbmVzcyAoZmlybW5lc3MpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTWFzc2FnZUN1c2hpb25GaXJtbmVzcy5LRVlfRklSTU5FU1MsIGZpcm1uZXNzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEZpcm1uZXNzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE1hc3NhZ2VDdXNoaW9uRmlybW5lc3MuS0VZX0ZJUk1ORVNTKTtcbiAgICB9XG59XG5cbk1hc3NhZ2VDdXNoaW9uRmlybW5lc3MuS0VZX0NVU0hJT04gPSAnY3VzaGlvbic7XG5NYXNzYWdlQ3VzaGlvbkZpcm1uZXNzLktFWV9GSVJNTkVTUyA9ICdmaXJtbmVzcyc7XG5cbmV4cG9ydCB7IE1hc3NhZ2VDdXNoaW9uRmlybW5lc3MgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBMaXN0IHBvc3NpYmxlIHNlYXRzIHRoYXQgaXMgYSByZW1vdGUgY29udHJvbGxhYmxlIHNlYXQuXG4gKiBAZGVwcmVjYXRlZFxuICogQHR5cGVkZWYge0VudW19IFN1cHBvcnRlZFNlYXRcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFN1cHBvcnRlZFNlYXQgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERSSVZFUiAoKSB7XG4gICAgICAgIHJldHVybiBTdXBwb3J0ZWRTZWF0Ll9NQVAuRFJJVkVSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRlJPTlRfUEFTU0VOR0VSICgpIHtcbiAgICAgICAgcmV0dXJuIFN1cHBvcnRlZFNlYXQuX01BUC5GUk9OVF9QQVNTRU5HRVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gU3VwcG9ydGVkU2VhdC5fdmFsdWVGb3JLZXkoa2V5LCBTdXBwb3J0ZWRTZWF0Ll9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gU3VwcG9ydGVkU2VhdC5fa2V5Rm9yVmFsdWUodmFsdWUsIFN1cHBvcnRlZFNlYXQuX01BUCk7XG4gICAgfVxufVxuXG5TdXBwb3J0ZWRTZWF0Ll9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnRFJJVkVSJzogJ0RSSVZFUicsXG4gICAgJ0ZST05UX1BBU1NFTkdFUic6ICdGUk9OVF9QQVNTRU5HRVInLFxufSk7XG5cbmV4cG9ydCB7IFN1cHBvcnRlZFNlYXQgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gU2VhdE1lbW9yeUFjdGlvblR5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFNlYXRNZW1vcnlBY3Rpb25UeXBlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmUgY3VycmVudCBzZWF0IHBvc3Rpb25zIGFuZCBzZXR0aW5ncyB0byBzZWF0IG1lbW9yeS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTQVZFICgpIHtcbiAgICAgICAgcmV0dXJuIFNlYXRNZW1vcnlBY3Rpb25UeXBlLl9NQVAuU0FWRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlIC8gYXBwbHkgdGhlIHNlYXQgbWVtb3J5IHNldHRpbmdzIHRvIHRoZSBjdXJyZW50IHNlYXQuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUkVTVE9SRSAoKSB7XG4gICAgICAgIHJldHVybiBTZWF0TWVtb3J5QWN0aW9uVHlwZS5fTUFQLlJFU1RPUkU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm8gYWN0aW9uIHRvIGJlIHBlcmZvcm1lZC5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOT05FICgpIHtcbiAgICAgICAgcmV0dXJuIFNlYXRNZW1vcnlBY3Rpb25UeXBlLl9NQVAuTk9ORTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBTZWF0TWVtb3J5QWN0aW9uVHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBTZWF0TWVtb3J5QWN0aW9uVHlwZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFNlYXRNZW1vcnlBY3Rpb25UeXBlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgU2VhdE1lbW9yeUFjdGlvblR5cGUuX01BUCk7XG4gICAgfVxufVxuXG5TZWF0TWVtb3J5QWN0aW9uVHlwZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ1NBVkUnOiAnU0FWRScsXG4gICAgJ1JFU1RPUkUnOiAnUkVTVE9SRScsXG4gICAgJ05PTkUnOiAnTk9ORScsXG59KTtcblxuZXhwb3J0IHsgU2VhdE1lbW9yeUFjdGlvblR5cGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgU2VhdE1lbW9yeUFjdGlvblR5cGUgfSBmcm9tICcuLi9lbnVtcy9TZWF0TWVtb3J5QWN0aW9uVHlwZS5qcyc7XG5cbmNsYXNzIFNlYXRNZW1vcnlBY3Rpb24gZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpZFxuICAgICAqIEByZXR1cm4ge1NlYXRNZW1vcnlBY3Rpb259XG4gICAgICovXG4gICAgc2V0SWQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlYXRNZW1vcnlBY3Rpb24uS0VZX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRJZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZWF0TWVtb3J5QWN0aW9uLktFWV9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGxhYmVsXG4gICAgICogQHJldHVybiB7U2VhdE1lbW9yeUFjdGlvbn1cbiAgICAgKi9cbiAgICBzZXRMYWJlbCAobGFiZWwpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VhdE1lbW9yeUFjdGlvbi5LRVlfTEFCRUwsIGxhYmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldExhYmVsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNlYXRNZW1vcnlBY3Rpb24uS0VZX0xBQkVMKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlYXRNZW1vcnlBY3Rpb25UeXBlfSBhY3Rpb25cbiAgICAgKiBAcmV0dXJuIHtTZWF0TWVtb3J5QWN0aW9ufVxuICAgICAqL1xuICAgIHNldEFjdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFNlYXRNZW1vcnlBY3Rpb25UeXBlLCBhY3Rpb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0TWVtb3J5QWN0aW9uLktFWV9BQ1RJT04sIGFjdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NlYXRNZW1vcnlBY3Rpb25UeXBlfVxuICAgICAqL1xuICAgIGdldEFjdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTZWF0TWVtb3J5QWN0aW9uVHlwZSwgU2VhdE1lbW9yeUFjdGlvbi5LRVlfQUNUSU9OKTtcbiAgICB9XG59XG5cblNlYXRNZW1vcnlBY3Rpb24uS0VZX0lEID0gJ2lkJztcblNlYXRNZW1vcnlBY3Rpb24uS0VZX0xBQkVMID0gJ2xhYmVsJztcblNlYXRNZW1vcnlBY3Rpb24uS0VZX0FDVElPTiA9ICdhY3Rpb24nO1xuXG5leHBvcnQgeyBTZWF0TWVtb3J5QWN0aW9uIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogTGlzdCBwb3NzaWJsZSB6b25lcyBvZiBhIG11bHRpLWNvbnRvdXIgbWFzc2FnZSBzZWF0LlxuICogQHR5cGVkZWYge0VudW19IE1hc3NhZ2Vab25lXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBNYXNzYWdlWm9uZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFjayBvZiBhIG11bHRpLWNvbnRvdXIgbWFzc2FnZSBzZWF0LiBvciBTRUFUX0JBQ0tcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBMVU1CQVIgKCkge1xuICAgICAgICByZXR1cm4gTWFzc2FnZVpvbmUuX01BUC5MVU1CQVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJvdHRvbSBhIG11bHRpLWNvbnRvdXIgbWFzc2FnZSBzZWF0LiBvciBTRUFUX0JPVFRPTVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNFQVRfQ1VTSElPTiAoKSB7XG4gICAgICAgIHJldHVybiBNYXNzYWdlWm9uZS5fTUFQLlNFQVRfQ1VTSElPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBNYXNzYWdlWm9uZS5fdmFsdWVGb3JLZXkoa2V5LCBNYXNzYWdlWm9uZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIE1hc3NhZ2Vab25lLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgTWFzc2FnZVpvbmUuX01BUCk7XG4gICAgfVxufVxuXG5NYXNzYWdlWm9uZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0xVTUJBUic6ICdMVU1CQVInLFxuICAgICdTRUFUX0NVU0hJT04nOiAnU0VBVF9DVVNISU9OJyxcbn0pO1xuXG5leHBvcnQgeyBNYXNzYWdlWm9uZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIExpc3QgcG9zc2libGUgbW9kZXMgb2YgYSBtYXNzYWdlIHpvbmUuXG4gKiBAdHlwZWRlZiB7RW51bX0gTWFzc2FnZU1vZGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIE1hc3NhZ2VNb2RlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9GRiAoKSB7XG4gICAgICAgIHJldHVybiBNYXNzYWdlTW9kZS5fTUFQLk9GRjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBMT1cgKCkge1xuICAgICAgICByZXR1cm4gTWFzc2FnZU1vZGUuX01BUC5MT1c7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgSElHSCAoKSB7XG4gICAgICAgIHJldHVybiBNYXNzYWdlTW9kZS5fTUFQLkhJR0g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gTWFzc2FnZU1vZGUuX3ZhbHVlRm9yS2V5KGtleSwgTWFzc2FnZU1vZGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBNYXNzYWdlTW9kZS5fa2V5Rm9yVmFsdWUodmFsdWUsIE1hc3NhZ2VNb2RlLl9NQVApO1xuICAgIH1cbn1cblxuTWFzc2FnZU1vZGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdPRkYnOiAnT0ZGJyxcbiAgICAnTE9XJzogJ0xPVycsXG4gICAgJ0hJR0gnOiAnSElHSCcsXG59KTtcblxuZXhwb3J0IHsgTWFzc2FnZU1vZGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgTWFzc2FnZVpvbmUgfSBmcm9tICcuLi9lbnVtcy9NYXNzYWdlWm9uZS5qcyc7XG5pbXBvcnQgeyBNYXNzYWdlTW9kZSB9IGZyb20gJy4uL2VudW1zL01hc3NhZ2VNb2RlLmpzJztcblxuLyoqXG4gKiBTcGVjaWZ5IHRoZSBtb2RlIG9mIGEgbWFzc2FnZSB6b25lLlxuICovXG5jbGFzcyBNYXNzYWdlTW9kZURhdGEgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TWFzc2FnZVpvbmV9IHpvbmUgLSBMaXN0IHBvc3NpYmxlIHpvbmVzIG9mIGEgbXVsdGktY29udG91ciBtYXNzYWdlIHNlYXQuXG4gICAgICogQHJldHVybiB7TWFzc2FnZU1vZGVEYXRhfVxuICAgICAqL1xuICAgIHNldE1hc3NhZ2Vab25lICh6b25lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKE1hc3NhZ2Vab25lLCB6b25lKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTWFzc2FnZU1vZGVEYXRhLktFWV9NQVNTQUdFX1pPTkUsIHpvbmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNYXNzYWdlWm9uZX1cbiAgICAgKi9cbiAgICBnZXRNYXNzYWdlWm9uZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNYXNzYWdlWm9uZSwgTWFzc2FnZU1vZGVEYXRhLktFWV9NQVNTQUdFX1pPTkUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TWFzc2FnZU1vZGV9IG1vZGUgLSBMaXN0IHBvc3NpYmxlIG1vZGVzIG9mIGEgbWFzc2FnZSB6b25lLlxuICAgICAqIEByZXR1cm4ge01hc3NhZ2VNb2RlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRNYXNzYWdlTW9kZSAobW9kZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNYXNzYWdlTW9kZSwgbW9kZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE1hc3NhZ2VNb2RlRGF0YS5LRVlfTUFTU0FHRV9NT0RFLCBtb2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TWFzc2FnZU1vZGV9XG4gICAgICovXG4gICAgZ2V0TWFzc2FnZU1vZGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTWFzc2FnZU1vZGUsIE1hc3NhZ2VNb2RlRGF0YS5LRVlfTUFTU0FHRV9NT0RFKTtcbiAgICB9XG59XG5cbk1hc3NhZ2VNb2RlRGF0YS5LRVlfTUFTU0FHRV9aT05FID0gJ21hc3NhZ2Vab25lJztcbk1hc3NhZ2VNb2RlRGF0YS5LRVlfTUFTU0FHRV9NT0RFID0gJ21hc3NhZ2VNb2RlJztcblxuZXhwb3J0IHsgTWFzc2FnZU1vZGVEYXRhIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgTWFzc2FnZUN1c2hpb25GaXJtbmVzcyB9IGZyb20gJy4vTWFzc2FnZUN1c2hpb25GaXJtbmVzcy5qcyc7XG5pbXBvcnQgeyBTdXBwb3J0ZWRTZWF0IH0gZnJvbSAnLi4vZW51bXMvU3VwcG9ydGVkU2VhdC5qcyc7XG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgU2VhdE1lbW9yeUFjdGlvbiB9IGZyb20gJy4vU2VhdE1lbW9yeUFjdGlvbi5qcyc7XG5pbXBvcnQgeyBNYXNzYWdlTW9kZURhdGEgfSBmcm9tICcuL01hc3NhZ2VNb2RlRGF0YS5qcyc7XG5cbi8qKlxuICogU2VhdCBjb250cm9sIGRhdGEgY29ycmVzcG9uZHMgdG8gXCJTRUFUXCIgTW9kdWxlVHlwZS5cbiAqL1xuY2xhc3MgU2VhdENvbnRyb2xEYXRhIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N1cHBvcnRlZFNlYXR9IGlkIC0gTGlzdCBwb3NzaWJsZSBzZWF0cyB0aGF0IGlzIGEgcmVtb3RlIGNvbnRyb2xsYWJsZSBzZWF0LlxuICAgICAqIEByZXR1cm4ge1NlYXRDb250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXRJZCAoaWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU3VwcG9ydGVkU2VhdCwgaWQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0Q29udHJvbERhdGEuS0VZX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N1cHBvcnRlZFNlYXR9XG4gICAgICovXG4gICAgZ2V0SWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoU3VwcG9ydGVkU2VhdCwgU2VhdENvbnRyb2xEYXRhLktFWV9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkXG4gICAgICogQHJldHVybiB7U2VhdENvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldEhlYXRpbmdFbmFibGVkIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlYXRDb250cm9sRGF0YS5LRVlfSEVBVElOR19FTkFCTEVELCBlbmFibGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRIZWF0aW5nRW5hYmxlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZWF0Q29udHJvbERhdGEuS0VZX0hFQVRJTkdfRU5BQkxFRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkXG4gICAgICogQHJldHVybiB7U2VhdENvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldENvb2xpbmdFbmFibGVkIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlYXRDb250cm9sRGF0YS5LRVlfQ09PTElOR19FTkFCTEVELCBlbmFibGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRDb29saW5nRW5hYmxlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZWF0Q29udHJvbERhdGEuS0VZX0NPT0xJTkdfRU5BQkxFRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxldmVsXG4gICAgICogQHJldHVybiB7U2VhdENvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldEhlYXRpbmdMZXZlbCAobGV2ZWwpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xEYXRhLktFWV9IRUFUSU5HX0xFVkVMLCBsZXZlbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRIZWF0aW5nTGV2ZWwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xEYXRhLktFWV9IRUFUSU5HX0xFVkVMKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGV2ZWxcbiAgICAgKiBAcmV0dXJuIHtTZWF0Q29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0Q29vbGluZ0xldmVsIChsZXZlbCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0Q29udHJvbERhdGEuS0VZX0NPT0xJTkdfTEVWRUwsIGxldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldENvb2xpbmdMZXZlbCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZWF0Q29udHJvbERhdGEuS0VZX0NPT0xJTkdfTEVWRUwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwb3NpdGlvblxuICAgICAqIEByZXR1cm4ge1NlYXRDb250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXRIb3Jpem9udGFsUG9zaXRpb24gKHBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlYXRDb250cm9sRGF0YS5LRVlfSE9SSVpPTlRBTF9QT1NJVElPTiwgcG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0SG9yaXpvbnRhbFBvc2l0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNlYXRDb250cm9sRGF0YS5LRVlfSE9SSVpPTlRBTF9QT1NJVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uXG4gICAgICogQHJldHVybiB7U2VhdENvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldFZlcnRpY2FsUG9zaXRpb24gKHBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlYXRDb250cm9sRGF0YS5LRVlfVkVSVElDQUxfUE9TSVRJT04sIHBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFZlcnRpY2FsUG9zaXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xEYXRhLktFWV9WRVJUSUNBTF9QT1NJVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uXG4gICAgICogQHJldHVybiB7U2VhdENvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldEZyb250VmVydGljYWxQb3NpdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xEYXRhLktFWV9GUk9OVF9WRVJUSUNBTF9QT1NJVElPTiwgcG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0RnJvbnRWZXJ0aWNhbFBvc2l0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNlYXRDb250cm9sRGF0YS5LRVlfRlJPTlRfVkVSVElDQUxfUE9TSVRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwb3NpdGlvblxuICAgICAqIEByZXR1cm4ge1NlYXRDb250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXRCYWNrVmVydGljYWxQb3NpdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xEYXRhLktFWV9CQUNLX1ZFUlRJQ0FMX1BPU0lUSU9OLCBwb3NpdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRCYWNrVmVydGljYWxQb3NpdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZWF0Q29udHJvbERhdGEuS0VZX0JBQ0tfVkVSVElDQUxfUE9TSVRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBhbmdsZVxuICAgICAqIEByZXR1cm4ge1NlYXRDb250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXRCYWNrVGlsdEFuZ2xlIChhbmdsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0Q29udHJvbERhdGEuS0VZX0JBQ0tfVElMVF9BTkdMRSwgYW5nbGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0QmFja1RpbHRBbmdsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZWF0Q29udHJvbERhdGEuS0VZX0JBQ0tfVElMVF9BTkdMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uXG4gICAgICogQHJldHVybiB7U2VhdENvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIHNldEhlYWRTdXBwb3J0SG9yaXpvbnRhbFBvc2l0aW9uIChwb3NpdGlvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0Q29udHJvbERhdGEuS0VZX0hFQURfU1VQUE9SVF9IT1JJWk9OVEFMX1BPU0lUSU9OLCBwb3NpdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRIZWFkU3VwcG9ydEhvcml6b250YWxQb3NpdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZWF0Q29udHJvbERhdGEuS0VZX0hFQURfU1VQUE9SVF9IT1JJWk9OVEFMX1BPU0lUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb25cbiAgICAgKiBAcmV0dXJuIHtTZWF0Q29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0SGVhZFN1cHBvcnRWZXJ0aWNhbFBvc2l0aW9uIChwb3NpdGlvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0Q29udHJvbERhdGEuS0VZX0hFQURfU1VQUE9SVF9WRVJUSUNBTF9QT1NJVElPTiwgcG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0SGVhZFN1cHBvcnRWZXJ0aWNhbFBvc2l0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNlYXRDb250cm9sRGF0YS5LRVlfSEVBRF9TVVBQT1JUX1ZFUlRJQ0FMX1BPU0lUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAcmV0dXJuIHtTZWF0Q29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0TWFzc2FnZUVuYWJsZWQgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xEYXRhLktFWV9NQVNTQUdFX0VOQUJMRUQsIGVuYWJsZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldE1hc3NhZ2VFbmFibGVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNlYXRDb250cm9sRGF0YS5LRVlfTUFTU0FHRV9FTkFCTEVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01hc3NhZ2VNb2RlRGF0YVtdfSBtb2RlIC0gU3BlY2lmeSB0aGUgbW9kZSBvZiBhIG1hc3NhZ2Ugem9uZS5cbiAgICAgKiBAcmV0dXJuIHtTZWF0Q29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0TWFzc2FnZU1vZGUgKG1vZGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTWFzc2FnZU1vZGVEYXRhLCBtb2RlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xEYXRhLktFWV9NQVNTQUdFX01PREUsIG1vZGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNYXNzYWdlTW9kZURhdGFbXX1cbiAgICAgKi9cbiAgICBnZXRNYXNzYWdlTW9kZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNYXNzYWdlTW9kZURhdGEsIFNlYXRDb250cm9sRGF0YS5LRVlfTUFTU0FHRV9NT0RFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01hc3NhZ2VDdXNoaW9uRmlybW5lc3NbXX0gZmlybW5lc3MgLSBUaGUgaW50ZW5zaXR5IG9yIGZpcm1uZXNzIG9mIGEgY3VzaGlvbi5cbiAgICAgKiBAcmV0dXJuIHtTZWF0Q29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0TWFzc2FnZUN1c2hpb25GaXJtbmVzcyAoZmlybW5lc3MpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTWFzc2FnZUN1c2hpb25GaXJtbmVzcywgZmlybW5lc3MsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0Q29udHJvbERhdGEuS0VZX01BU1NBR0VfQ1VTSElPTl9GSVJNTkVTUywgZmlybW5lc3MpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNYXNzYWdlQ3VzaGlvbkZpcm1uZXNzW119XG4gICAgICovXG4gICAgZ2V0TWFzc2FnZUN1c2hpb25GaXJtbmVzcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNYXNzYWdlQ3VzaGlvbkZpcm1uZXNzLCBTZWF0Q29udHJvbERhdGEuS0VZX01BU1NBR0VfQ1VTSElPTl9GSVJNTkVTUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTZWF0TWVtb3J5QWN0aW9ufSBtZW1vcnlcbiAgICAgKiBAcmV0dXJuIHtTZWF0Q29udHJvbERhdGF9XG4gICAgICovXG4gICAgc2V0TWVtb3J5IChtZW1vcnkpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU2VhdE1lbW9yeUFjdGlvbiwgbWVtb3J5KTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xEYXRhLktFWV9NRU1PUlksIG1lbW9yeSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NlYXRNZW1vcnlBY3Rpb259XG4gICAgICovXG4gICAgZ2V0TWVtb3J5ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFNlYXRNZW1vcnlBY3Rpb24sIFNlYXRDb250cm9sRGF0YS5LRVlfTUVNT1JZKTtcbiAgICB9XG59XG5cblNlYXRDb250cm9sRGF0YS5LRVlfSUQgPSAnaWQnO1xuU2VhdENvbnRyb2xEYXRhLktFWV9IRUFUSU5HX0VOQUJMRUQgPSAnaGVhdGluZ0VuYWJsZWQnO1xuU2VhdENvbnRyb2xEYXRhLktFWV9DT09MSU5HX0VOQUJMRUQgPSAnY29vbGluZ0VuYWJsZWQnO1xuU2VhdENvbnRyb2xEYXRhLktFWV9IRUFUSU5HX0xFVkVMID0gJ2hlYXRpbmdMZXZlbCc7XG5TZWF0Q29udHJvbERhdGEuS0VZX0NPT0xJTkdfTEVWRUwgPSAnY29vbGluZ0xldmVsJztcblNlYXRDb250cm9sRGF0YS5LRVlfSE9SSVpPTlRBTF9QT1NJVElPTiA9ICdob3Jpem9udGFsUG9zaXRpb24nO1xuU2VhdENvbnRyb2xEYXRhLktFWV9WRVJUSUNBTF9QT1NJVElPTiA9ICd2ZXJ0aWNhbFBvc2l0aW9uJztcblNlYXRDb250cm9sRGF0YS5LRVlfRlJPTlRfVkVSVElDQUxfUE9TSVRJT04gPSAnZnJvbnRWZXJ0aWNhbFBvc2l0aW9uJztcblNlYXRDb250cm9sRGF0YS5LRVlfQkFDS19WRVJUSUNBTF9QT1NJVElPTiA9ICdiYWNrVmVydGljYWxQb3NpdGlvbic7XG5TZWF0Q29udHJvbERhdGEuS0VZX0JBQ0tfVElMVF9BTkdMRSA9ICdiYWNrVGlsdEFuZ2xlJztcblNlYXRDb250cm9sRGF0YS5LRVlfSEVBRF9TVVBQT1JUX0hPUklaT05UQUxfUE9TSVRJT04gPSAnaGVhZFN1cHBvcnRIb3Jpem9udGFsUG9zaXRpb24nO1xuU2VhdENvbnRyb2xEYXRhLktFWV9IRUFEX1NVUFBPUlRfVkVSVElDQUxfUE9TSVRJT04gPSAnaGVhZFN1cHBvcnRWZXJ0aWNhbFBvc2l0aW9uJztcblNlYXRDb250cm9sRGF0YS5LRVlfTUFTU0FHRV9FTkFCTEVEID0gJ21hc3NhZ2VFbmFibGVkJztcblNlYXRDb250cm9sRGF0YS5LRVlfTUFTU0FHRV9NT0RFID0gJ21hc3NhZ2VNb2RlJztcblNlYXRDb250cm9sRGF0YS5LRVlfTUFTU0FHRV9DVVNISU9OX0ZJUk1ORVNTID0gJ21hc3NhZ2VDdXNoaW9uRmlybW5lc3MnO1xuU2VhdENvbnRyb2xEYXRhLktFWV9NRU1PUlkgPSAnbWVtb3J5JztcblxuZXhwb3J0IHsgU2VhdENvbnRyb2xEYXRhIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IExpZ2h0U3RhdHVzXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBMaWdodFN0YXR1cyBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBPTiAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodFN0YXR1cy5fTUFQLk9OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9GRiAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodFN0YXR1cy5fTUFQLk9GRjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSQU1QX1VQICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0U3RhdHVzLl9NQVAuUkFNUF9VUDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSQU1QX0RPV04gKCkge1xuICAgICAgICByZXR1cm4gTGlnaHRTdGF0dXMuX01BUC5SQU1QX0RPV047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVU5LTk9XTiAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodFN0YXR1cy5fTUFQLlVOS05PV047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgSU5WQUxJRCAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodFN0YXR1cy5fTUFQLklOVkFMSUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gTGlnaHRTdGF0dXMuX3ZhbHVlRm9yS2V5KGtleSwgTGlnaHRTdGF0dXMuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBMaWdodFN0YXR1cy5fa2V5Rm9yVmFsdWUodmFsdWUsIExpZ2h0U3RhdHVzLl9NQVApO1xuICAgIH1cbn1cblxuTGlnaHRTdGF0dXMuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdPTic6ICdPTicsXG4gICAgJ09GRic6ICdPRkYnLFxuICAgICdSQU1QX1VQJzogJ1JBTVBfVVAnLFxuICAgICdSQU1QX0RPV04nOiAnUkFNUF9ET1dOJyxcbiAgICAnVU5LTk9XTic6ICdVTktOT1dOJyxcbiAgICAnSU5WQUxJRCc6ICdJTlZBTElEJyxcbn0pO1xuXG5leHBvcnQgeyBMaWdodFN0YXR1cyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBMaWdodE5hbWVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIExpZ2h0TmFtZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGUk9OVF9MRUZUX0hJR0hfQkVBTSAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodE5hbWUuX01BUC5GUk9OVF9MRUZUX0hJR0hfQkVBTTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGUk9OVF9SSUdIVF9ISUdIX0JFQU0gKCkge1xuICAgICAgICByZXR1cm4gTGlnaHROYW1lLl9NQVAuRlJPTlRfUklHSFRfSElHSF9CRUFNO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZST05UX0xFRlRfTE9XX0JFQU0gKCkge1xuICAgICAgICByZXR1cm4gTGlnaHROYW1lLl9NQVAuRlJPTlRfTEVGVF9MT1dfQkVBTTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGUk9OVF9SSUdIVF9MT1dfQkVBTSAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodE5hbWUuX01BUC5GUk9OVF9SSUdIVF9MT1dfQkVBTTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGUk9OVF9MRUZUX1BBUktJTkdfTElHSFQgKCkge1xuICAgICAgICByZXR1cm4gTGlnaHROYW1lLl9NQVAuRlJPTlRfTEVGVF9QQVJLSU5HX0xJR0hUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZST05UX1JJR0hUX1BBUktJTkdfTElHSFQgKCkge1xuICAgICAgICByZXR1cm4gTGlnaHROYW1lLl9NQVAuRlJPTlRfUklHSFRfUEFSS0lOR19MSUdIVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGUk9OVF9MRUZUX0ZPR19MSUdIVCAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodE5hbWUuX01BUC5GUk9OVF9MRUZUX0ZPR19MSUdIVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGUk9OVF9SSUdIVF9GT0dfTElHSFQgKCkge1xuICAgICAgICByZXR1cm4gTGlnaHROYW1lLl9NQVAuRlJPTlRfUklHSFRfRk9HX0xJR0hUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZST05UX0xFRlRfREFZVElNRV9SVU5OSU5HX0xJR0hUICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLkZST05UX0xFRlRfREFZVElNRV9SVU5OSU5HX0xJR0hUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZST05UX1JJR0hUX0RBWVRJTUVfUlVOTklOR19MSUdIVCAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodE5hbWUuX01BUC5GUk9OVF9SSUdIVF9EQVlUSU1FX1JVTk5JTkdfTElHSFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRlJPTlRfTEVGVF9UVVJOX0xJR0hUICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLkZST05UX0xFRlRfVFVSTl9MSUdIVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBGUk9OVF9SSUdIVF9UVVJOX0xJR0hUICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLkZST05UX1JJR0hUX1RVUk5fTElHSFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUkVBUl9MRUZUX0ZPR19MSUdIVCAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodE5hbWUuX01BUC5SRUFSX0xFRlRfRk9HX0xJR0hUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJFQVJfUklHSFRfRk9HX0xJR0hUICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLlJFQVJfUklHSFRfRk9HX0xJR0hUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJFQVJfTEVGVF9UQUlMX0xJR0hUICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLlJFQVJfTEVGVF9UQUlMX0xJR0hUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJFQVJfUklHSFRfVEFJTF9MSUdIVCAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodE5hbWUuX01BUC5SRUFSX1JJR0hUX1RBSUxfTElHSFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUkVBUl9MRUZUX0JSQUtFX0xJR0hUICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLlJFQVJfTEVGVF9CUkFLRV9MSUdIVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSRUFSX1JJR0hUX0JSQUtFX0xJR0hUICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLlJFQVJfUklHSFRfQlJBS0VfTElHSFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUkVBUl9MRUZUX1RVUk5fTElHSFQgKCkge1xuICAgICAgICByZXR1cm4gTGlnaHROYW1lLl9NQVAuUkVBUl9MRUZUX1RVUk5fTElHSFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUkVBUl9SSUdIVF9UVVJOX0xJR0hUICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLlJFQVJfUklHSFRfVFVSTl9MSUdIVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSRUFSX1JFR0lTVFJBVElPTl9QTEFURV9MSUdIVCAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodE5hbWUuX01BUC5SRUFSX1JFR0lTVFJBVElPTl9QTEFURV9MSUdIVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIGFsbCBoaWdoIGJlYW0gbGlnaHRzOiBmcm9udF9sZWZ0IGFuZCBmcm9udF9yaWdodC5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBISUdIX0JFQU1TICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLkhJR0hfQkVBTVM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5jbHVkZSBhbGwgbG93IGJlYW0gbGlnaHRzOiBmcm9udF9sZWZ0IGFuZCBmcm9udF9yaWdodC5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBMT1dfQkVBTVMgKCkge1xuICAgICAgICByZXR1cm4gTGlnaHROYW1lLl9NQVAuTE9XX0JFQU1TO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgYWxsIGZvZyBsaWdodHM6IGZyb250X2xlZnQsIGZyb250X3JpZ2h0LCByZWFyX2xlZnQgYW5kIHJlYXJfcmlnaHQuXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRk9HX0xJR0hUUyAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodE5hbWUuX01BUC5GT0dfTElHSFRTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgYWxsIGRheXRpbWUgcnVubmluZyBsaWdodHM6IGZyb250X2xlZnQgYW5kIGZyb250X3JpZ2h0LlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJVTk5JTkdfTElHSFRTICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLlJVTk5JTkdfTElHSFRTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgYWxsIHBhcmtpbmcgbGlnaHRzOiBmcm9udF9sZWZ0IGFuZCBmcm9udF9yaWdodC5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQQVJLSU5HX0xJR0hUUyAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodE5hbWUuX01BUC5QQVJLSU5HX0xJR0hUUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIGFsbCBicmFrZSBsaWdodHM6IHJlYXJfbGVmdCBhbmQgcmVhcl9yaWdodC5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBCUkFLRV9MSUdIVFMgKCkge1xuICAgICAgICByZXR1cm4gTGlnaHROYW1lLl9NQVAuQlJBS0VfTElHSFRTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJFQVJfUkVWRVJTSU5HX0xJR0hUUyAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodE5hbWUuX01BUC5SRUFSX1JFVkVSU0lOR19MSUdIVFM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU0lERV9NQVJLRVJfTElHSFRTICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLlNJREVfTUFSS0VSX0xJR0hUUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIGFsbCBsZWZ0IHR1cm4gc2lnbmFsIGxpZ2h0czogZnJvbnRfbGVmdCwgcmVhcl9sZWZ0LCBsZWZ0X3NpZGUgYW5kIG1pcnJvcl9tb3VudGVkLlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IExFRlRfVFVSTl9MSUdIVFMgKCkge1xuICAgICAgICByZXR1cm4gTGlnaHROYW1lLl9NQVAuTEVGVF9UVVJOX0xJR0hUUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIGFsbCByaWdodCB0dXJuIHNpZ25hbCBsaWdodHM6IGZyb250X3JpZ2h0LCByZWFyX3JpZ2h0LCByaWdodF9zaWRlIGFuZCBtaXJyb3JfbW91bnRlZC5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSSUdIVF9UVVJOX0xJR0hUUyAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodE5hbWUuX01BUC5SSUdIVF9UVVJOX0xJR0hUUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIGFsbCBoYXphcmQgbGlnaHRzOiBmcm9udF9sZWZ0LCBmcm9udF9yaWdodCwgcmVhcl9sZWZ0IGFuZCByZWFyX3JpZ2h0LlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEhBWkFSRF9MSUdIVFMgKCkge1xuICAgICAgICByZXR1cm4gTGlnaHROYW1lLl9NQVAuSEFaQVJEX0xJR0hUUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJnbyBsYW1wcyBpbGx1bWluYXRlIHRoZSBjYXJnbyBhcmVhLlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJFQVJfQ0FSR09fTElHSFRTICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLlJFQVJfQ0FSR09fTElHSFRTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRydWNrIGJlZCBsYW1wcyBsaWdodCB1cCB0aGUgYmVkIG9mIHRoZSB0cnVjay5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSRUFSX1RSVUNLX0JFRF9MSUdIVFMgKCkge1xuICAgICAgICByZXR1cm4gTGlnaHROYW1lLl9NQVAuUkVBUl9UUlVDS19CRURfTElHSFRTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYWlsZXIgbGlnaHRzIGFyZSBsYW1wcyBtb3VudGVkIG9uIGEgdHJhaWxlciBoaXRjaC5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSRUFSX1RSQUlMRVJfTElHSFRTICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLlJFQVJfVFJBSUxFUl9MSUdIVFM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXQgaXMgdGhlIHNwb3RsaWdodHMgbW91bnRlZCBvbiB0aGUgbGVmdCBzaWRlIG9mIGEgdmVoaWNsZS5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBMRUZUX1NQT1RfTElHSFRTICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLkxFRlRfU1BPVF9MSUdIVFM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXQgaXMgdGhlIHNwb3RsaWdodHMgbW91bnRlZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHZlaGljbGUuXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUklHSFRfU1BPVF9MSUdIVFMgKCkge1xuICAgICAgICByZXR1cm4gTGlnaHROYW1lLl9NQVAuUklHSFRfU1BPVF9MSUdIVFM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHVkZGxlIGxhbXBzIGlsbHVtaW5hdGUgdGhlIGdyb3VuZCBiZXNpZGUgdGhlIGRvb3IgYXMgdGhlIGN1c3RvbWVyIGlzIG9wZW5pbmcgb3IgYXBwcm9hY2hpbmcgdGhlIGRvb3IuXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTEVGVF9QVURETEVfTElHSFRTICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLkxFRlRfUFVERExFX0xJR0hUUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQdWRkbGUgbGFtcHMgaWxsdW1pbmF0ZSB0aGUgZ3JvdW5kIGJlc2lkZSB0aGUgZG9vciBhcyB0aGUgY3VzdG9tZXIgaXMgb3BlbmluZyBvciBhcHByb2FjaGluZyB0aGUgZG9vci5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSSUdIVF9QVURETEVfTElHSFRTICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLlJJR0hUX1BVRERMRV9MSUdIVFM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQU1CSUVOVF9MSUdIVFMgKCkge1xuICAgICAgICByZXR1cm4gTGlnaHROYW1lLl9NQVAuQU1CSUVOVF9MSUdIVFM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgT1ZFUkhFQURfTElHSFRTICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLk9WRVJIRUFEX0xJR0hUUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSRUFESU5HX0xJR0hUUyAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodE5hbWUuX01BUC5SRUFESU5HX0xJR0hUUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBUUlVOS19MSUdIVFMgKCkge1xuICAgICAgICByZXR1cm4gTGlnaHROYW1lLl9NQVAuVFJVTktfTElHSFRTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgZXh0ZXJpb3IgbGlnaHRzIGxvY2F0ZWQgaW4gZnJvbnQgb2YgdGhlIHZlaGljbGUuIEZvciBleGFtcGxlLCBmb2cgbGlnaHRzIGFuZCBsb3cgYmVhbXMuXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRVhURVJJT1JfRlJPTlRfTElHSFRTICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLkVYVEVSSU9SX0ZST05UX0xJR0hUUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIGV4dGVyaW9yIGxpZ2h0cyBsb2NhdGVkIGF0IHRoZSBiYWNrIG9mIHRoZSB2ZWhpY2xlLiBGb3IgZXhhbXBsZSwgbGljZW5zZSBwbGF0ZSBsaWdodHMsIHJldmVyc2UgbGlnaHRzLFxuICAgICAqIGNhcmdvIGxpZ2h0cywgYmVkIGxpZ2h0cyBhbmQgdHJhaWxlciBhc3Npc3QgbGlnaHRzLlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEVYVEVSSU9SX1JFQVJfTElHSFRTICgpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fTUFQLkVYVEVSSU9SX1JFQVJfTElHSFRTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgZXh0ZXJpb3IgbGlnaHRzIGxvY2F0ZWQgYXQgdGhlIGxlZnQgc2lkZSBvZiB0aGUgdmVoaWNsZS4gRm9yIGV4YW1wbGUsIGxlZnQgcHVkZGxlIGxpZ2h0cyBhbmQgc3BvdFxuICAgICAqIGxpZ2h0cy5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFWFRFUklPUl9MRUZUX0xJR0hUUyAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodE5hbWUuX01BUC5FWFRFUklPUl9MRUZUX0xJR0hUUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIGV4dGVyaW9yIGxpZ2h0cyBsb2NhdGVkIGF0IHRoZSByaWdodCBzaWRlIG9mIHRoZSB2ZWhpY2xlLiBGb3IgZXhhbXBsZSwgcmlnaHQgcHVkZGxlIGxpZ2h0cyBhbmQgc3BvdFxuICAgICAqIGxpZ2h0cy5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFWFRFUklPUl9SSUdIVF9MSUdIVFMgKCkge1xuICAgICAgICByZXR1cm4gTGlnaHROYW1lLl9NQVAuRVhURVJJT1JfUklHSFRfTElHSFRTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgYWxsIGV4dGVyaW9yIGxpZ2h0cyBhcm91bmQgdGhlIHZlaGljbGUuXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRVhURVJJT1JfQUxMX0xJR0hUUyAoKSB7XG4gICAgICAgIHJldHVybiBMaWdodE5hbWUuX01BUC5FWFRFUklPUl9BTExfTElHSFRTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIExpZ2h0TmFtZS5fdmFsdWVGb3JLZXkoa2V5LCBMaWdodE5hbWUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBMaWdodE5hbWUuX2tleUZvclZhbHVlKHZhbHVlLCBMaWdodE5hbWUuX01BUCk7XG4gICAgfVxufVxuXG5MaWdodE5hbWUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdGUk9OVF9MRUZUX0hJR0hfQkVBTSc6IDAsXG4gICAgJ0ZST05UX1JJR0hUX0hJR0hfQkVBTSc6IDEsXG4gICAgJ0ZST05UX0xFRlRfTE9XX0JFQU0nOiAyLFxuICAgICdGUk9OVF9SSUdIVF9MT1dfQkVBTSc6IDMsXG4gICAgJ0ZST05UX0xFRlRfUEFSS0lOR19MSUdIVCc6IDQsXG4gICAgJ0ZST05UX1JJR0hUX1BBUktJTkdfTElHSFQnOiA1LFxuICAgICdGUk9OVF9MRUZUX0ZPR19MSUdIVCc6IDYsXG4gICAgJ0ZST05UX1JJR0hUX0ZPR19MSUdIVCc6IDcsXG4gICAgJ0ZST05UX0xFRlRfREFZVElNRV9SVU5OSU5HX0xJR0hUJzogOCxcbiAgICAnRlJPTlRfUklHSFRfREFZVElNRV9SVU5OSU5HX0xJR0hUJzogOSxcbiAgICAnRlJPTlRfTEVGVF9UVVJOX0xJR0hUJzogMTAsXG4gICAgJ0ZST05UX1JJR0hUX1RVUk5fTElHSFQnOiAxMSxcbiAgICAnUkVBUl9MRUZUX0ZPR19MSUdIVCc6IDEyLFxuICAgICdSRUFSX1JJR0hUX0ZPR19MSUdIVCc6IDEzLFxuICAgICdSRUFSX0xFRlRfVEFJTF9MSUdIVCc6IDE0LFxuICAgICdSRUFSX1JJR0hUX1RBSUxfTElHSFQnOiAxNSxcbiAgICAnUkVBUl9MRUZUX0JSQUtFX0xJR0hUJzogMTYsXG4gICAgJ1JFQVJfUklHSFRfQlJBS0VfTElHSFQnOiAxNyxcbiAgICAnUkVBUl9MRUZUX1RVUk5fTElHSFQnOiAxOCxcbiAgICAnUkVBUl9SSUdIVF9UVVJOX0xJR0hUJzogMTksXG4gICAgJ1JFQVJfUkVHSVNUUkFUSU9OX1BMQVRFX0xJR0hUJzogMjAsXG4gICAgJ0hJR0hfQkVBTVMnOiA1MDEsXG4gICAgJ0xPV19CRUFNUyc6IDUwMixcbiAgICAnRk9HX0xJR0hUUyc6IDUwMyxcbiAgICAnUlVOTklOR19MSUdIVFMnOiA1MDQsXG4gICAgJ1BBUktJTkdfTElHSFRTJzogNTA1LFxuICAgICdCUkFLRV9MSUdIVFMnOiA1MDYsXG4gICAgJ1JFQVJfUkVWRVJTSU5HX0xJR0hUUyc6IDUwNyxcbiAgICAnU0lERV9NQVJLRVJfTElHSFRTJzogNTA4LFxuICAgICdMRUZUX1RVUk5fTElHSFRTJzogNTA5LFxuICAgICdSSUdIVF9UVVJOX0xJR0hUUyc6IDUxMCxcbiAgICAnSEFaQVJEX0xJR0hUUyc6IDUxMSxcbiAgICAnUkVBUl9DQVJHT19MSUdIVFMnOiA1MTIsXG4gICAgJ1JFQVJfVFJVQ0tfQkVEX0xJR0hUUyc6IDUxMyxcbiAgICAnUkVBUl9UUkFJTEVSX0xJR0hUUyc6IDUxNCxcbiAgICAnTEVGVF9TUE9UX0xJR0hUUyc6IDUxNSxcbiAgICAnUklHSFRfU1BPVF9MSUdIVFMnOiA1MTYsXG4gICAgJ0xFRlRfUFVERExFX0xJR0hUUyc6IDUxNyxcbiAgICAnUklHSFRfUFVERExFX0xJR0hUUyc6IDUxOCxcbiAgICAnQU1CSUVOVF9MSUdIVFMnOiA4MDEsXG4gICAgJ09WRVJIRUFEX0xJR0hUUyc6IDgwMixcbiAgICAnUkVBRElOR19MSUdIVFMnOiA4MDMsXG4gICAgJ1RSVU5LX0xJR0hUUyc6IDgwNCxcbiAgICAnRVhURVJJT1JfRlJPTlRfTElHSFRTJzogOTAxLFxuICAgICdFWFRFUklPUl9SRUFSX0xJR0hUUyc6IDkwMixcbiAgICAnRVhURVJJT1JfTEVGVF9MSUdIVFMnOiA5MDMsXG4gICAgJ0VYVEVSSU9SX1JJR0hUX0xJR0hUUyc6IDkwNCxcbiAgICAnRVhURVJJT1JfQUxMX0xJR0hUUyc6IDkwNSxcbn0pO1xuXG5leHBvcnQgeyBMaWdodE5hbWUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgTGlnaHRTdGF0dXMgfSBmcm9tICcuLi9lbnVtcy9MaWdodFN0YXR1cy5qcyc7XG5pbXBvcnQgeyBMaWdodE5hbWUgfSBmcm9tICcuLi9lbnVtcy9MaWdodE5hbWUuanMnO1xuaW1wb3J0IHsgUkdCQ29sb3IgfSBmcm9tICcuL1JHQkNvbG9yLmpzJztcblxuY2xhc3MgTGlnaHRTdGF0ZSBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtMaWdodE5hbWV9IGlkIC0gVGhlIG5hbWUgb2YgYSBsaWdodCBvciBhIGdyb3VwIG9mIGxpZ2h0cy5cbiAgICAgKiBAcmV0dXJuIHtMaWdodFN0YXRlfVxuICAgICAqL1xuICAgIHNldElkIChpZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShMaWdodE5hbWUsIGlkKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTGlnaHRTdGF0ZS5LRVlfSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TGlnaHROYW1lfVxuICAgICAqL1xuICAgIGdldElkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KExpZ2h0TmFtZSwgTGlnaHRTdGF0ZS5LRVlfSUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TGlnaHRTdGF0dXN9IHN0YXR1c1xuICAgICAqIEByZXR1cm4ge0xpZ2h0U3RhdGV9XG4gICAgICovXG4gICAgc2V0U3RhdHVzIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTGlnaHRTdGF0dXMsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKExpZ2h0U3RhdGUuS0VZX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TGlnaHRTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0U3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KExpZ2h0U3RhdHVzLCBMaWdodFN0YXRlLktFWV9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBkZW5zaXR5XG4gICAgICogQHJldHVybiB7TGlnaHRTdGF0ZX1cbiAgICAgKi9cbiAgICBzZXREZW5zaXR5IChkZW5zaXR5KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKExpZ2h0U3RhdGUuS0VZX0RFTlNJVFksIGRlbnNpdHkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0RGVuc2l0eSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihMaWdodFN0YXRlLktFWV9ERU5TSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1JHQkNvbG9yfSBjb2xvclxuICAgICAqIEByZXR1cm4ge0xpZ2h0U3RhdGV9XG4gICAgICovXG4gICAgc2V0Q29sb3IgKGNvbG9yKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFJHQkNvbG9yLCBjb2xvcik7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKExpZ2h0U3RhdGUuS0VZX0NPTE9SLCBjb2xvcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1JHQkNvbG9yfVxuICAgICAqL1xuICAgIGdldENvbG9yICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFJHQkNvbG9yLCBMaWdodFN0YXRlLktFWV9DT0xPUik7XG4gICAgfVxufVxuXG5MaWdodFN0YXRlLktFWV9JRCA9ICdpZCc7XG5MaWdodFN0YXRlLktFWV9TVEFUVVMgPSAnc3RhdHVzJztcbkxpZ2h0U3RhdGUuS0VZX0RFTlNJVFkgPSAnZGVuc2l0eSc7XG5MaWdodFN0YXRlLktFWV9DT0xPUiA9ICdjb2xvcic7XG5cbmV4cG9ydCB7IExpZ2h0U3RhdGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgTGlnaHRTdGF0ZSB9IGZyb20gJy4vTGlnaHRTdGF0ZS5qcyc7XG5cbmNsYXNzIExpZ2h0Q29udHJvbERhdGEgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TGlnaHRTdGF0ZVtdfSBzdGF0ZSAtIEFuIGFycmF5IG9mIExpZ2h0TmFtZXMgYW5kIHRoZWlyIGN1cnJlbnQgb3IgZGVzaXJlZCBzdGF0dXMuIE5vIGNoYW5nZSB0byB0aGUgc3RhdHVzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIExpZ2h0TmFtZXMgdGhhdCBhcmUgbm90IGxpc3RlZCBpbiB0aGUgYXJyYXkuXG4gICAgICogQHJldHVybiB7TGlnaHRDb250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBzZXRMaWdodFN0YXRlIChzdGF0ZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShMaWdodFN0YXRlLCBzdGF0ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKExpZ2h0Q29udHJvbERhdGEuS0VZX0xJR0hUX1NUQVRFLCBzdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0xpZ2h0U3RhdGVbXX1cbiAgICAgKi9cbiAgICBnZXRMaWdodFN0YXRlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KExpZ2h0U3RhdGUsIExpZ2h0Q29udHJvbERhdGEuS0VZX0xJR0hUX1NUQVRFKTtcbiAgICB9XG59XG5cbkxpZ2h0Q29udHJvbERhdGEuS0VZX0xJR0hUX1NUQVRFID0gJ2xpZ2h0U3RhdGUnO1xuXG5leHBvcnQgeyBMaWdodENvbnRyb2xEYXRhIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgSE1JU2V0dGluZ3NDb250cm9sRGF0YSB9IGZyb20gJy4vSE1JU2V0dGluZ3NDb250cm9sRGF0YS5qcyc7XG5pbXBvcnQgeyBSYWRpb0NvbnRyb2xEYXRhIH0gZnJvbSAnLi9SYWRpb0NvbnRyb2xEYXRhLmpzJztcbmltcG9ydCB7IE1vZHVsZVR5cGUgfSBmcm9tICcuLi9lbnVtcy9Nb2R1bGVUeXBlLmpzJztcbmltcG9ydCB7IENsaW1hdGVDb250cm9sRGF0YSB9IGZyb20gJy4vQ2xpbWF0ZUNvbnRyb2xEYXRhLmpzJztcbmltcG9ydCB7IEF1ZGlvQ29udHJvbERhdGEgfSBmcm9tICcuL0F1ZGlvQ29udHJvbERhdGEuanMnO1xuaW1wb3J0IHsgU2VhdENvbnRyb2xEYXRhIH0gZnJvbSAnLi9TZWF0Q29udHJvbERhdGEuanMnO1xuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IExpZ2h0Q29udHJvbERhdGEgfSBmcm9tICcuL0xpZ2h0Q29udHJvbERhdGEuanMnO1xuXG4vKipcbiAqIFRoZSBtb2R1bGVUeXBlIGluZGljYXRlcyB3aGljaCB0eXBlIG9mIGRhdGEgc2hvdWxkIGJlIGNoYW5nZWQgYW5kIGlkZW50aWZpZXMgd2hpY2ggZGF0YSBvYmplY3QgZXhpc3RzIGluIHRoaXNcbiAqIHN0cnVjdC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBtb2R1bGVUeXBlIGlzIENMSU1BVEUgdGhlbiBhIFwiY2xpbWF0ZUNvbnRyb2xEYXRhXCIgc2hvdWxkIGV4aXN0XG4gKi9cbmNsYXNzIE1vZHVsZURhdGEgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TW9kdWxlVHlwZX0gdHlwZVxuICAgICAqIEByZXR1cm4ge01vZHVsZURhdGF9XG4gICAgICovXG4gICAgc2V0TW9kdWxlVHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNb2R1bGVUeXBlLCB0eXBlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTW9kdWxlRGF0YS5LRVlfTU9EVUxFX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNb2R1bGVUeXBlfVxuICAgICAqL1xuICAgIGdldE1vZHVsZVR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTW9kdWxlVHlwZSwgTW9kdWxlRGF0YS5LRVlfTU9EVUxFX1RZUEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIElkIG9mIGEgbW9kdWxlLCBwdWJsaXNoZWQgYnkgU3lzdGVtIENhcGFiaWxpdHkuXG4gICAgICogQHJldHVybiB7TW9kdWxlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRNb2R1bGVJZCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTW9kdWxlRGF0YS5LRVlfTU9EVUxFX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRNb2R1bGVJZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihNb2R1bGVEYXRhLktFWV9NT0RVTEVfSUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7UmFkaW9Db250cm9sRGF0YX0gZGF0YVxuICAgICAqIEByZXR1cm4ge01vZHVsZURhdGF9XG4gICAgICovXG4gICAgc2V0UmFkaW9Db250cm9sRGF0YSAoZGF0YSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShSYWRpb0NvbnRyb2xEYXRhLCBkYXRhKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTW9kdWxlRGF0YS5LRVlfUkFESU9fQ09OVFJPTF9EQVRBLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7UmFkaW9Db250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBnZXRSYWRpb0NvbnRyb2xEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFJhZGlvQ29udHJvbERhdGEsIE1vZHVsZURhdGEuS0VZX1JBRElPX0NPTlRST0xfREFUQSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtDbGltYXRlQ29udHJvbERhdGF9IGRhdGFcbiAgICAgKiBAcmV0dXJuIHtNb2R1bGVEYXRhfVxuICAgICAqL1xuICAgIHNldENsaW1hdGVDb250cm9sRGF0YSAoZGF0YSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShDbGltYXRlQ29udHJvbERhdGEsIGRhdGEpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihNb2R1bGVEYXRhLktFWV9DTElNQVRFX0NPTlRST0xfREFUQSwgZGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0NsaW1hdGVDb250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBnZXRDbGltYXRlQ29udHJvbERhdGEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQ2xpbWF0ZUNvbnRyb2xEYXRhLCBNb2R1bGVEYXRhLktFWV9DTElNQVRFX0NPTlRST0xfREFUQSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTZWF0Q29udHJvbERhdGF9IGRhdGEgLSBTZWF0IGNvbnRyb2wgZGF0YSBjb3JyZXNwb25kcyB0byBcIlNFQVRcIiBNb2R1bGVUeXBlLlxuICAgICAqIEByZXR1cm4ge01vZHVsZURhdGF9XG4gICAgICovXG4gICAgc2V0U2VhdENvbnRyb2xEYXRhIChkYXRhKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFNlYXRDb250cm9sRGF0YSwgZGF0YSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE1vZHVsZURhdGEuS0VZX1NFQVRfQ09OVFJPTF9EQVRBLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U2VhdENvbnRyb2xEYXRhfVxuICAgICAqL1xuICAgIGdldFNlYXRDb250cm9sRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTZWF0Q29udHJvbERhdGEsIE1vZHVsZURhdGEuS0VZX1NFQVRfQ09OVFJPTF9EQVRBKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0F1ZGlvQ29udHJvbERhdGF9IGRhdGFcbiAgICAgKiBAcmV0dXJuIHtNb2R1bGVEYXRhfVxuICAgICAqL1xuICAgIHNldEF1ZGlvQ29udHJvbERhdGEgKGRhdGEpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQXVkaW9Db250cm9sRGF0YSwgZGF0YSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE1vZHVsZURhdGEuS0VZX0FVRElPX0NPTlRST0xfREFUQSwgZGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0F1ZGlvQ29udHJvbERhdGF9XG4gICAgICovXG4gICAgZ2V0QXVkaW9Db250cm9sRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChBdWRpb0NvbnRyb2xEYXRhLCBNb2R1bGVEYXRhLktFWV9BVURJT19DT05UUk9MX0RBVEEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TGlnaHRDb250cm9sRGF0YX0gZGF0YVxuICAgICAqIEByZXR1cm4ge01vZHVsZURhdGF9XG4gICAgICovXG4gICAgc2V0TGlnaHRDb250cm9sRGF0YSAoZGF0YSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShMaWdodENvbnRyb2xEYXRhLCBkYXRhKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTW9kdWxlRGF0YS5LRVlfTElHSFRfQ09OVFJPTF9EQVRBLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TGlnaHRDb250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBnZXRMaWdodENvbnRyb2xEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KExpZ2h0Q29udHJvbERhdGEsIE1vZHVsZURhdGEuS0VZX0xJR0hUX0NPTlRST0xfREFUQSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtITUlTZXR0aW5nc0NvbnRyb2xEYXRhfSBkYXRhIC0gQ29ycmVzcG9uZHMgdG8gXCJITUlfU0VUVElOR1NcIiBNb2R1bGVUeXBlXG4gICAgICogQHJldHVybiB7TW9kdWxlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRIbWlTZXR0aW5nc0NvbnRyb2xEYXRhIChkYXRhKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEhNSVNldHRpbmdzQ29udHJvbERhdGEsIGRhdGEpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihNb2R1bGVEYXRhLktFWV9ITUlfU0VUVElOR1NfQ09OVFJPTF9EQVRBLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SE1JU2V0dGluZ3NDb250cm9sRGF0YX1cbiAgICAgKi9cbiAgICBnZXRIbWlTZXR0aW5nc0NvbnRyb2xEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEhNSVNldHRpbmdzQ29udHJvbERhdGEsIE1vZHVsZURhdGEuS0VZX0hNSV9TRVRUSU5HU19DT05UUk9MX0RBVEEpO1xuICAgIH1cbn1cblxuTW9kdWxlRGF0YS5LRVlfTU9EVUxFX1RZUEUgPSAnbW9kdWxlVHlwZSc7XG5Nb2R1bGVEYXRhLktFWV9NT0RVTEVfSUQgPSAnbW9kdWxlSWQnO1xuTW9kdWxlRGF0YS5LRVlfUkFESU9fQ09OVFJPTF9EQVRBID0gJ3JhZGlvQ29udHJvbERhdGEnO1xuTW9kdWxlRGF0YS5LRVlfQ0xJTUFURV9DT05UUk9MX0RBVEEgPSAnY2xpbWF0ZUNvbnRyb2xEYXRhJztcbk1vZHVsZURhdGEuS0VZX1NFQVRfQ09OVFJPTF9EQVRBID0gJ3NlYXRDb250cm9sRGF0YSc7XG5Nb2R1bGVEYXRhLktFWV9BVURJT19DT05UUk9MX0RBVEEgPSAnYXVkaW9Db250cm9sRGF0YSc7XG5Nb2R1bGVEYXRhLktFWV9MSUdIVF9DT05UUk9MX0RBVEEgPSAnbGlnaHRDb250cm9sRGF0YSc7XG5Nb2R1bGVEYXRhLktFWV9ITUlfU0VUVElOR1NfQ09OVFJPTF9EQVRBID0gJ2htaVNldHRpbmdzQ29udHJvbERhdGEnO1xuXG5leHBvcnQgeyBNb2R1bGVEYXRhIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgTW9kdWxlRGF0YSB9IGZyb20gJy4uL3N0cnVjdHMvTW9kdWxlRGF0YS5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgR2V0SW50ZXJpb3JWZWhpY2xlRGF0YVJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuR2V0SW50ZXJpb3JWZWhpY2xlRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNb2R1bGVEYXRhfSBkYXRhIC0gVGhlIG1vZHVsZVR5cGUgaW5kaWNhdGVzIHdoaWNoIHR5cGUgb2YgZGF0YSBzaG91bGQgYmUgY2hhbmdlZCBhbmQgaWRlbnRpZmllcyB3aGljaFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgb2JqZWN0IGV4aXN0cyBpbiB0aGlzIHN0cnVjdC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBtb2R1bGVUeXBlIGlzIENMSU1BVEUgdGhlbiBhXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjbGltYXRlQ29udHJvbERhdGFcIiBzaG91bGQgZXhpc3RcbiAgICAgKiBAcmV0dXJuIHtHZXRJbnRlcmlvclZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0TW9kdWxlRGF0YSAoZGF0YSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNb2R1bGVEYXRhLCBkYXRhKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0SW50ZXJpb3JWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9NT0RVTEVfREFUQSwgZGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge01vZHVsZURhdGF9XG4gICAgICovXG4gICAgZ2V0TW9kdWxlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNb2R1bGVEYXRhLCBHZXRJbnRlcmlvclZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX01PRFVMRV9EQVRBKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHN1YnNjcmliZWQgLSBJdCBpcyBhIGNvbmRpdGlvbmFsLW1hbmRhdG9yeSBwYXJhbWV0ZXI6IG11c3QgYmUgcmV0dXJuZWQgaW4gY2FzZSBcInN1YnNjcmliZVwiXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHdhcyBwcmVzZW50IGluIHRoZSByZWxhdGVkIHJlcXVlc3QuIGlmIFwidHJ1ZVwiIC0gdGhlIFwibW9kdWxlVHlwZVwiIGZyb21cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWxseSBzdWJzY3JpYmVkIGFuZCB0aGUgaGVhZCB1bml0IHdpbGwgc2VuZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW50ZXJpb3JWZWhpY2xlRGF0YSBub3RpZmljYXRpb25zIGZvciB0aGUgbW9kdWxlVHlwZS4gaWYgXCJmYWxzZVwiIC0gdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJtb2R1bGVUeXBlXCIgZnJvbSByZXF1ZXN0IGlzIGVpdGhlciB1bnN1YnNjcmliZWQgb3IgZmFpbGVkIHRvIHN1YnNjcmliZS5cbiAgICAgKiBAcmV0dXJuIHtHZXRJbnRlcmlvclZlaGljbGVEYXRhUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0SXNTdWJzY3JpYmVkIChzdWJzY3JpYmVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldEludGVyaW9yVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfSVNfU1VCU0NSSUJFRCwgc3Vic2NyaWJlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0SXNTdWJzY3JpYmVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldEludGVyaW9yVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfSVNfU1VCU0NSSUJFRCk7XG4gICAgfVxufVxuXG5HZXRJbnRlcmlvclZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX01PRFVMRV9EQVRBID0gJ21vZHVsZURhdGEnO1xuR2V0SW50ZXJpb3JWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9JU19TVUJTQ1JJQkVEID0gJ2lzU3Vic2NyaWJlZCc7XG5cbmV4cG9ydCB7IEdldEludGVyaW9yVmVoaWNsZURhdGFSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IE1vZHVsZVR5cGUgfSBmcm9tICcuLi9lbnVtcy9Nb2R1bGVUeXBlLmpzJztcbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuY2xhc3MgR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnQgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkdldEludGVyaW9yVmVoaWNsZURhdGFDb25zZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01vZHVsZVR5cGV9IHR5cGUgLSBUaGUgbW9kdWxlIHR5cGUgdGhhdCB0aGUgYXBwIHJlcXVlc3RzIHRvIGNvbnRyb2wuXG4gICAgICogQHJldHVybiB7R2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnR9XG4gICAgICovXG4gICAgc2V0TW9kdWxlVHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNb2R1bGVUeXBlLCB0eXBlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnQuS0VZX01PRFVMRV9UWVBFLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TW9kdWxlVHlwZX1cbiAgICAgKi9cbiAgICBnZXRNb2R1bGVUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KE1vZHVsZVR5cGUsIEdldEludGVyaW9yVmVoaWNsZURhdGFDb25zZW50LktFWV9NT0RVTEVfVFlQRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmdbXX0gaWRzIC0gSWRzIG9mIGEgbW9kdWxlIG9mIHNhbWUgdHlwZSwgcHVibGlzaGVkIGJ5IFN5c3RlbSBDYXBhYmlsaXR5LlxuICAgICAqIEByZXR1cm4ge0dldEludGVyaW9yVmVoaWNsZURhdGFDb25zZW50fVxuICAgICAqL1xuICAgIHNldE1vZHVsZUlkcyAoaWRzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEdldEludGVyaW9yVmVoaWNsZURhdGFDb25zZW50LktFWV9NT0RVTEVfSURTLCBpZHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmdbXX1cbiAgICAgKi9cbiAgICBnZXRNb2R1bGVJZHMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnQuS0VZX01PRFVMRV9JRFMpO1xuICAgIH1cbn1cblxuR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnQuS0VZX01PRFVMRV9UWVBFID0gJ21vZHVsZVR5cGUnO1xuR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnQuS0VZX01PRFVMRV9JRFMgPSAnbW9kdWxlSWRzJztcblxuZXhwb3J0IHsgR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnQgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnRSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkdldEludGVyaW9yVmVoaWNsZURhdGFDb25zZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW5bXX0gYWxsb3dlZCAtIFRoaXMgYXJyYXkgaGFzIHRoZSBzYW1lIHNpemUgYXMgXCJtb2R1bGVJZHNcIiBpbiB0aGUgcmVxdWVzdCBhbmQgZWFjaCBlbGVtZW50XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byBvbmUgbW9kdWxlSWQgSWYgdHJ1ZSwgU0RMIGdyYW50cyB0aGUgcGVybWlzc2lvbiBmb3IgdGhlIHJlcXVlc3RlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIElmIGZhbHNlLCBTREwgZGVuaWVzIHRoZSBwZXJtaXNzaW9uIGZvciB0aGUgcmVxdWVzdGVkIG1vZHVsZS5cbiAgICAgKiBAcmV0dXJuIHtHZXRJbnRlcmlvclZlaGljbGVEYXRhQ29uc2VudFJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldEFsbG93ZWQgKGFsbG93ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnRSZXNwb25zZS5LRVlfQUxMT1dFRCwgYWxsb3dlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW5bXX1cbiAgICAgKi9cbiAgICBnZXRBbGxvd2VkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEdldEludGVyaW9yVmVoaWNsZURhdGFDb25zZW50UmVzcG9uc2UuS0VZX0FMTE9XRUQpO1xuICAgIH1cbn1cblxuR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnRSZXNwb25zZS5LRVlfQUxMT1dFRCA9ICdhbGxvd2VkJztcblxuZXhwb3J0IHsgR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnRSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IE1vZHVsZVR5cGUgfSBmcm9tICcuLi9lbnVtcy9Nb2R1bGVUeXBlLmpzJztcbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuY2xhc3MgUmVsZWFzZUludGVyaW9yVmVoaWNsZURhdGFNb2R1bGUgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlJlbGVhc2VJbnRlcmlvclZlaGljbGVEYXRhTW9kdWxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01vZHVsZVR5cGV9IHR5cGVcbiAgICAgKiBAcmV0dXJuIHtSZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZX1cbiAgICAgKi9cbiAgICBzZXRNb2R1bGVUeXBlICh0eXBlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKE1vZHVsZVR5cGUsIHR5cGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZS5LRVlfTU9EVUxFX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNb2R1bGVUeXBlfVxuICAgICAqL1xuICAgIGdldE1vZHVsZVR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTW9kdWxlVHlwZSwgUmVsZWFzZUludGVyaW9yVmVoaWNsZURhdGFNb2R1bGUuS0VZX01PRFVMRV9UWVBFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBJZCBvZiBhIG1vZHVsZSwgcHVibGlzaGVkIGJ5IFN5c3RlbSBDYXBhYmlsaXR5LlxuICAgICAqIEByZXR1cm4ge1JlbGVhc2VJbnRlcmlvclZlaGljbGVEYXRhTW9kdWxlfVxuICAgICAqL1xuICAgIHNldE1vZHVsZUlkIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZS5LRVlfTU9EVUxFX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRNb2R1bGVJZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihSZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZS5LRVlfTU9EVUxFX0lEKTtcbiAgICB9XG59XG5cblJlbGVhc2VJbnRlcmlvclZlaGljbGVEYXRhTW9kdWxlLktFWV9NT0RVTEVfVFlQRSA9ICdtb2R1bGVUeXBlJztcblJlbGVhc2VJbnRlcmlvclZlaGljbGVEYXRhTW9kdWxlLktFWV9NT0RVTEVfSUQgPSAnbW9kdWxlSWQnO1xuXG5leHBvcnQgeyBSZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBSZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZVJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuUmVsZWFzZUludGVyaW9yVmVoaWNsZURhdGFNb2R1bGUpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBSZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZVJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgTW9kdWxlRGF0YSB9IGZyb20gJy4uL3N0cnVjdHMvTW9kdWxlRGF0YS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbmNsYXNzIFNldEludGVyaW9yVmVoaWNsZURhdGEgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlNldEludGVyaW9yVmVoaWNsZURhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TW9kdWxlRGF0YX0gZGF0YSAtIFRoZSBtb2R1bGUgZGF0YSB0byBzZXQgZm9yIHRoZSByZXF1ZXN0ZWQgUkMgbW9kdWxlLlxuICAgICAqIEByZXR1cm4ge1NldEludGVyaW9yVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0TW9kdWxlRGF0YSAoZGF0YSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNb2R1bGVEYXRhLCBkYXRhKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2V0SW50ZXJpb3JWZWhpY2xlRGF0YS5LRVlfTU9EVUxFX0RBVEEsIGRhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNb2R1bGVEYXRhfVxuICAgICAqL1xuICAgIGdldE1vZHVsZURhdGEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTW9kdWxlRGF0YSwgU2V0SW50ZXJpb3JWZWhpY2xlRGF0YS5LRVlfTU9EVUxFX0RBVEEpO1xuICAgIH1cbn1cblxuU2V0SW50ZXJpb3JWZWhpY2xlRGF0YS5LRVlfTU9EVUxFX0RBVEEgPSAnbW9kdWxlRGF0YSc7XG5cbmV4cG9ydCB7IFNldEludGVyaW9yVmVoaWNsZURhdGEgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBNb2R1bGVEYXRhIH0gZnJvbSAnLi4vc3RydWN0cy9Nb2R1bGVEYXRhLmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHRoZSB2YWx1ZXMgb2Ygb25lIHJlbW90ZSBjb250cm9sIG1vZHVsZVxuICovXG5jbGFzcyBTZXRJbnRlcmlvclZlaGljbGVEYXRhUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5TZXRJbnRlcmlvclZlaGljbGVEYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01vZHVsZURhdGF9IGRhdGEgLSBUaGUgbW9kdWxlVHlwZSBpbmRpY2F0ZXMgd2hpY2ggdHlwZSBvZiBkYXRhIHNob3VsZCBiZSBjaGFuZ2VkIGFuZCBpZGVudGlmaWVzIHdoaWNoXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBvYmplY3QgZXhpc3RzIGluIHRoaXMgc3RydWN0LiBGb3IgZXhhbXBsZSwgaWYgdGhlIG1vZHVsZVR5cGUgaXMgQ0xJTUFURSB0aGVuIGFcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNsaW1hdGVDb250cm9sRGF0YVwiIHNob3VsZCBleGlzdFxuICAgICAqIEByZXR1cm4ge1NldEludGVyaW9yVmVoaWNsZURhdGFSZXNwb25zZX1cbiAgICAgKi9cbiAgICBzZXRNb2R1bGVEYXRhIChkYXRhKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKE1vZHVsZURhdGEsIGRhdGEpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZXRJbnRlcmlvclZlaGljbGVEYXRhUmVzcG9uc2UuS0VZX01PRFVMRV9EQVRBLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TW9kdWxlRGF0YX1cbiAgICAgKi9cbiAgICBnZXRNb2R1bGVEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KE1vZHVsZURhdGEsIFNldEludGVyaW9yVmVoaWNsZURhdGFSZXNwb25zZS5LRVlfTU9EVUxFX0RBVEEpO1xuICAgIH1cbn1cblxuU2V0SW50ZXJpb3JWZWhpY2xlRGF0YVJlc3BvbnNlLktFWV9NT0RVTEVfREFUQSA9ICdtb2R1bGVEYXRhJztcblxuZXhwb3J0IHsgU2V0SW50ZXJpb3JWZWhpY2xlRGF0YVJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG4vKipcbiAqIFRvIHN1YnNjcmliZSBpbiBnZXR0aW5nIGNoYW5nZXMgZm9yIFdheXBvaW50cy9kZXN0aW5hdGlvbnNcbiAqL1xuY2xhc3MgU3Vic2NyaWJlV2F5UG9pbnRzIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5TdWJzY3JpYmVXYXlQb2ludHMpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBTdWJzY3JpYmVXYXlQb2ludHMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgU3Vic2NyaWJlV2F5UG9pbnRzUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5TdWJzY3JpYmVXYXlQb2ludHMpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBTdWJzY3JpYmVXYXlQb2ludHNSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIERlc2NyaWJlcyB3aGF0IGtpbmQgb2Ygd2F5cG9pbnQgaXMgcmVxdWVzdGVkL3Byb3ZpZGVkLlxuICogQHR5cGVkZWYge0VudW19IFdheVBvaW50VHlwZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgV2F5UG9pbnRUeXBlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEFMTCAoKSB7XG4gICAgICAgIHJldHVybiBXYXlQb2ludFR5cGUuX01BUC5BTEw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgREVTVElOQVRJT04gKCkge1xuICAgICAgICByZXR1cm4gV2F5UG9pbnRUeXBlLl9NQVAuREVTVElOQVRJT047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gV2F5UG9pbnRUeXBlLl92YWx1ZUZvcktleShrZXksIFdheVBvaW50VHlwZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFdheVBvaW50VHlwZS5fa2V5Rm9yVmFsdWUodmFsdWUsIFdheVBvaW50VHlwZS5fTUFQKTtcbiAgICB9XG59XG5cbldheVBvaW50VHlwZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0FMTCc6ICdBTEwnLFxuICAgICdERVNUSU5BVElPTic6ICdERVNUSU5BVElPTicsXG59KTtcblxuZXhwb3J0IHsgV2F5UG9pbnRUeXBlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgV2F5UG9pbnRUeXBlIH0gZnJvbSAnLi4vZW51bXMvV2F5UG9pbnRUeXBlLmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBSZXF1ZXN0IGZvciBnZXR0aW5nIHdheXBvaW50L2Rlc3RpbmF0aW9uIGRhdGEuXG4gKi9cbmNsYXNzIEdldFdheVBvaW50cyBleHRlbmRzIFJwY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuR2V0V2F5UG9pbnRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1dheVBvaW50VHlwZX0gdHlwZSAtIFRvIHJlcXVlc3QgZm9yIGVpdGhlciB0aGUgZGVzdGluYXRpb24gb25seSBvciBmb3IgYWxsIHdheXBvaW50cyBpbmNsdWRpbmdcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uXG4gICAgICogQHJldHVybiB7R2V0V2F5UG9pbnRzfVxuICAgICAqL1xuICAgIHNldFdheVBvaW50VHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShXYXlQb2ludFR5cGUsIHR5cGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRXYXlQb2ludHMuS0VZX1dBWV9QT0lOVF9UWVBFLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7V2F5UG9pbnRUeXBlfVxuICAgICAqL1xuICAgIGdldFdheVBvaW50VHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChXYXlQb2ludFR5cGUsIEdldFdheVBvaW50cy5LRVlfV0FZX1BPSU5UX1RZUEUpO1xuICAgIH1cbn1cblxuR2V0V2F5UG9pbnRzLktFWV9XQVlfUE9JTlRfVFlQRSA9ICd3YXlQb2ludFR5cGUnO1xuXG5leHBvcnQgeyBHZXRXYXlQb2ludHMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG5jbGFzcyBDb29yZGluYXRlIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZGVncmVlcyAtIExhdGl0dWRlIG9mIHRoZSBsb2NhdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtDb29yZGluYXRlfVxuICAgICAqL1xuICAgIHNldExhdGl0dWRlRGVncmVlcyAoZGVncmVlcykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDb29yZGluYXRlLktFWV9MQVRJVFVERV9ERUdSRUVTLCBkZWdyZWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldExhdGl0dWRlRGVncmVlcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDb29yZGluYXRlLktFWV9MQVRJVFVERV9ERUdSRUVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZGVncmVlcyAtIExvbmdpdHVkZSBvZiB0aGUgbG9jYXRpb24uXG4gICAgICogQHJldHVybiB7Q29vcmRpbmF0ZX1cbiAgICAgKi9cbiAgICBzZXRMb25naXR1ZGVEZWdyZWVzIChkZWdyZWVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENvb3JkaW5hdGUuS0VZX0xPTkdJVFVERV9ERUdSRUVTLCBkZWdyZWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldExvbmdpdHVkZURlZ3JlZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ29vcmRpbmF0ZS5LRVlfTE9OR0lUVURFX0RFR1JFRVMpO1xuICAgIH1cbn1cblxuQ29vcmRpbmF0ZS5LRVlfTEFUSVRVREVfREVHUkVFUyA9ICdsYXRpdHVkZURlZ3JlZXMnO1xuQ29vcmRpbmF0ZS5LRVlfTE9OR0lUVURFX0RFR1JFRVMgPSAnbG9uZ2l0dWRlRGVncmVlcyc7XG5cbmV4cG9ydCB7IENvb3JkaW5hdGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBDb29yZGluYXRlIH0gZnJvbSAnLi9Db29yZGluYXRlLmpzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnLi9JbWFnZS5qcyc7XG5pbXBvcnQgeyBPQVNJU0FkZHJlc3MgfSBmcm9tICcuL09BU0lTQWRkcmVzcy5qcyc7XG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG5jbGFzcyBMb2NhdGlvbkRldGFpbHMgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q29vcmRpbmF0ZX0gY29vcmRpbmF0ZSAtIExhdGl0dWRlL0xvbmdpdHVkZSBvZiB0aGUgbG9jYXRpb24uXG4gICAgICogQHJldHVybiB7TG9jYXRpb25EZXRhaWxzfVxuICAgICAqL1xuICAgIHNldENvb3JkaW5hdGUgKGNvb3JkaW5hdGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQ29vcmRpbmF0ZSwgY29vcmRpbmF0ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKExvY2F0aW9uRGV0YWlscy5LRVlfQ09PUkRJTkFURSwgY29vcmRpbmF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Nvb3JkaW5hdGV9XG4gICAgICovXG4gICAgZ2V0Q29vcmRpbmF0ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChDb29yZGluYXRlLCBMb2NhdGlvbkRldGFpbHMuS0VZX0NPT1JESU5BVEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gTmFtZSBvZiBsb2NhdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtMb2NhdGlvbkRldGFpbHN9XG4gICAgICovXG4gICAgc2V0TG9jYXRpb25OYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKExvY2F0aW9uRGV0YWlscy5LRVlfTE9DQVRJT05fTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRMb2NhdGlvbk5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoTG9jYXRpb25EZXRhaWxzLktFWV9MT0NBVElPTl9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ1tdfSBsaW5lcyAtIExvY2F0aW9uIGFkZHJlc3MgZm9yIGRpc3BsYXkgcHVycG9zZXMgb25seVxuICAgICAqIEByZXR1cm4ge0xvY2F0aW9uRGV0YWlsc31cbiAgICAgKi9cbiAgICBzZXRBZGRyZXNzTGluZXMgKGxpbmVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKExvY2F0aW9uRGV0YWlscy5LRVlfQUREUkVTU19MSU5FUywgbGluZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmdbXX1cbiAgICAgKi9cbiAgICBnZXRBZGRyZXNzTGluZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoTG9jYXRpb25EZXRhaWxzLktFWV9BRERSRVNTX0xJTkVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvbiBpbnRlbmRlZCBsb2NhdGlvbiAvIGVzdGFibGlzaG1lbnQgKGlmIGFwcGxpY2FibGUpXG4gICAgICogQHJldHVybiB7TG9jYXRpb25EZXRhaWxzfVxuICAgICAqL1xuICAgIHNldExvY2F0aW9uRGVzY3JpcHRpb24gKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKExvY2F0aW9uRGV0YWlscy5LRVlfTE9DQVRJT05fREVTQ1JJUFRJT04sIGRlc2NyaXB0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldExvY2F0aW9uRGVzY3JpcHRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoTG9jYXRpb25EZXRhaWxzLktFWV9MT0NBVElPTl9ERVNDUklQVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG51bWJlciAtIFBob25lIG51bWJlciBvZiBsb2NhdGlvbiAvIGVzdGFibGlzaG1lbnQuXG4gICAgICogQHJldHVybiB7TG9jYXRpb25EZXRhaWxzfVxuICAgICAqL1xuICAgIHNldFBob25lTnVtYmVyIChudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTG9jYXRpb25EZXRhaWxzLktFWV9QSE9ORV9OVU1CRVIsIG51bWJlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRQaG9uZU51bWJlciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihMb2NhdGlvbkRldGFpbHMuS0VZX1BIT05FX05VTUJFUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtJbWFnZX0gaW1hZ2UgLSBJbWFnZSAvIGljb24gb2YgaW50ZW5kZWQgbG9jYXRpb24uXG4gICAgICogQHJldHVybiB7TG9jYXRpb25EZXRhaWxzfVxuICAgICAqL1xuICAgIHNldExvY2F0aW9uSW1hZ2UgKGltYWdlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEltYWdlLCBpbWFnZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKExvY2F0aW9uRGV0YWlscy5LRVlfTE9DQVRJT05fSU1BR0UsIGltYWdlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SW1hZ2V9XG4gICAgICovXG4gICAgZ2V0TG9jYXRpb25JbWFnZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChJbWFnZSwgTG9jYXRpb25EZXRhaWxzLktFWV9MT0NBVElPTl9JTUFHRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPQVNJU0FkZHJlc3N9IGFkZHJlc3MgLSBBZGRyZXNzIHRvIGJlIHVzZWQgYnkgbmF2aWdhdGlvbiBlbmdpbmVzIGZvciBzZWFyY2hcbiAgICAgKiBAcmV0dXJuIHtMb2NhdGlvbkRldGFpbHN9XG4gICAgICovXG4gICAgc2V0U2VhcmNoQWRkcmVzcyAoYWRkcmVzcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShPQVNJU0FkZHJlc3MsIGFkZHJlc3MpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihMb2NhdGlvbkRldGFpbHMuS0VZX1NFQVJDSF9BRERSRVNTLCBhZGRyZXNzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7T0FTSVNBZGRyZXNzfVxuICAgICAqL1xuICAgIGdldFNlYXJjaEFkZHJlc3MgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoT0FTSVNBZGRyZXNzLCBMb2NhdGlvbkRldGFpbHMuS0VZX1NFQVJDSF9BRERSRVNTKTtcbiAgICB9XG59XG5cbkxvY2F0aW9uRGV0YWlscy5LRVlfQ09PUkRJTkFURSA9ICdjb29yZGluYXRlJztcbkxvY2F0aW9uRGV0YWlscy5LRVlfTE9DQVRJT05fTkFNRSA9ICdsb2NhdGlvbk5hbWUnO1xuTG9jYXRpb25EZXRhaWxzLktFWV9BRERSRVNTX0xJTkVTID0gJ2FkZHJlc3NMaW5lcyc7XG5Mb2NhdGlvbkRldGFpbHMuS0VZX0xPQ0FUSU9OX0RFU0NSSVBUSU9OID0gJ2xvY2F0aW9uRGVzY3JpcHRpb24nO1xuTG9jYXRpb25EZXRhaWxzLktFWV9QSE9ORV9OVU1CRVIgPSAncGhvbmVOdW1iZXInO1xuTG9jYXRpb25EZXRhaWxzLktFWV9MT0NBVElPTl9JTUFHRSA9ICdsb2NhdGlvbkltYWdlJztcbkxvY2F0aW9uRGV0YWlscy5LRVlfU0VBUkNIX0FERFJFU1MgPSAnc2VhcmNoQWRkcmVzcyc7XG5cbmV4cG9ydCB7IExvY2F0aW9uRGV0YWlscyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IExvY2F0aW9uRGV0YWlscyB9IGZyb20gJy4uL3N0cnVjdHMvTG9jYXRpb25EZXRhaWxzLmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBHZXRXYXlQb2ludHNSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkdldFdheVBvaW50cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtMb2NhdGlvbkRldGFpbHNbXX0gcG9pbnRzIC0gU2VlIExvY2F0aW9uRGV0YWlsc1xuICAgICAqIEByZXR1cm4ge0dldFdheVBvaW50c1Jlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFdheVBvaW50cyAocG9pbnRzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKExvY2F0aW9uRGV0YWlscywgcG9pbnRzLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0V2F5UG9pbnRzUmVzcG9uc2UuS0VZX1dBWV9QT0lOVFMsIHBvaW50cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0xvY2F0aW9uRGV0YWlsc1tdfVxuICAgICAqL1xuICAgIGdldFdheVBvaW50cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChMb2NhdGlvbkRldGFpbHMsIEdldFdheVBvaW50c1Jlc3BvbnNlLktFWV9XQVlfUE9JTlRTKTtcbiAgICB9XG59XG5cbkdldFdheVBvaW50c1Jlc3BvbnNlLktFWV9XQVlfUE9JTlRTID0gJ3dheVBvaW50cyc7XG5cbmV4cG9ydCB7IEdldFdheVBvaW50c1Jlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG4vKipcbiAqIFJlcXVlc3QgdG8gdW5zdWJzY3JpYmUgZnJvbSBXYXlQb2ludHMgYW5kIERlc3RpbmF0aW9uXG4gKi9cbmNsYXNzIFVuc3Vic2NyaWJlV2F5UG9pbnRzIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5VbnN1YnNjcmliZVdheVBvaW50cyk7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB7IFVuc3Vic2NyaWJlV2F5UG9pbnRzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgTG9jYXRpb25EZXRhaWxzIH0gZnJvbSAnLi4vc3RydWN0cy9Mb2NhdGlvbkRldGFpbHMuanMnO1xuaW1wb3J0IHsgUnBjUmVzcG9uc2UgfSBmcm9tICcuLi9ScGNSZXNwb25zZS5qcyc7XG5cbmNsYXNzIFVuc3Vic2NyaWJlV2F5UG9pbnRzUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5VbnN1YnNjcmliZVdheVBvaW50cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtMb2NhdGlvbkRldGFpbHNbXX0gcG9pbnRzIC0gU2VlIExvY2F0aW9uRGV0YWlsc1xuICAgICAqIEByZXR1cm4ge1Vuc3Vic2NyaWJlV2F5UG9pbnRzUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0V2F5UG9pbnRzIChwb2ludHMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTG9jYXRpb25EZXRhaWxzLCBwb2ludHMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihVbnN1YnNjcmliZVdheVBvaW50c1Jlc3BvbnNlLktFWV9XQVlfUE9JTlRTLCBwb2ludHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtMb2NhdGlvbkRldGFpbHNbXX1cbiAgICAgKi9cbiAgICBnZXRXYXlQb2ludHMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTG9jYXRpb25EZXRhaWxzLCBVbnN1YnNjcmliZVdheVBvaW50c1Jlc3BvbnNlLktFWV9XQVlfUE9JTlRTKTtcbiAgICB9XG59XG5cblVuc3Vic2NyaWJlV2F5UG9pbnRzUmVzcG9uc2UuS0VZX1dBWV9QT0lOVFMgPSAnd2F5UG9pbnRzJztcblxuZXhwb3J0IHsgVW5zdWJzY3JpYmVXYXlQb2ludHNSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEVudW1lcmF0aW9ucyBvZiBhbGwgYXZhaWxhYmxlIHN5c3RlbSBjYXBhYmlsaXR5IHR5cGVzXG4gKiBAdHlwZWRlZiB7RW51bX0gU3lzdGVtQ2FwYWJpbGl0eVR5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFN5c3RlbUNhcGFiaWxpdHlUeXBlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5BVklHQVRJT04gKCkge1xuICAgICAgICByZXR1cm4gU3lzdGVtQ2FwYWJpbGl0eVR5cGUuX01BUC5OQVZJR0FUSU9OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBIT05FX0NBTEwgKCkge1xuICAgICAgICByZXR1cm4gU3lzdGVtQ2FwYWJpbGl0eVR5cGUuX01BUC5QSE9ORV9DQUxMO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZJREVPX1NUUkVBTUlORyAoKSB7XG4gICAgICAgIHJldHVybiBTeXN0ZW1DYXBhYmlsaXR5VHlwZS5fTUFQLlZJREVPX1NUUkVBTUlORztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBSRU1PVEVfQ09OVFJPTCAoKSB7XG4gICAgICAgIHJldHVybiBTeXN0ZW1DYXBhYmlsaXR5VHlwZS5fTUFQLlJFTU9URV9DT05UUk9MO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEFQUF9TRVJWSUNFUyAoKSB7XG4gICAgICAgIHJldHVybiBTeXN0ZW1DYXBhYmlsaXR5VHlwZS5fTUFQLkFQUF9TRVJWSUNFUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBTRUFUX0xPQ0FUSU9OICgpIHtcbiAgICAgICAgcmV0dXJuIFN5c3RlbUNhcGFiaWxpdHlUeXBlLl9NQVAuU0VBVF9MT0NBVElPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBESVNQTEFZUyAoKSB7XG4gICAgICAgIHJldHVybiBTeXN0ZW1DYXBhYmlsaXR5VHlwZS5fTUFQLkRJU1BMQVlTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFN5c3RlbUNhcGFiaWxpdHlUeXBlLl92YWx1ZUZvcktleShrZXksIFN5c3RlbUNhcGFiaWxpdHlUeXBlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gU3lzdGVtQ2FwYWJpbGl0eVR5cGUuX2tleUZvclZhbHVlKHZhbHVlLCBTeXN0ZW1DYXBhYmlsaXR5VHlwZS5fTUFQKTtcbiAgICB9XG59XG5cblN5c3RlbUNhcGFiaWxpdHlUeXBlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnTkFWSUdBVElPTic6ICdOQVZJR0FUSU9OJyxcbiAgICAnUEhPTkVfQ0FMTCc6ICdQSE9ORV9DQUxMJyxcbiAgICAnVklERU9fU1RSRUFNSU5HJzogJ1ZJREVPX1NUUkVBTUlORycsXG4gICAgJ1JFTU9URV9DT05UUk9MJzogJ1JFTU9URV9DT05UUk9MJyxcbiAgICAnQVBQX1NFUlZJQ0VTJzogJ0FQUF9TRVJWSUNFUycsXG4gICAgJ1NFQVRfTE9DQVRJT04nOiAnU0VBVF9MT0NBVElPTicsXG4gICAgJ0RJU1BMQVlTJzogJ0RJU1BMQVlTJyxcbn0pO1xuXG5leHBvcnQgeyBTeXN0ZW1DYXBhYmlsaXR5VHlwZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IFN5c3RlbUNhcGFiaWxpdHlUeXBlIH0gZnJvbSAnLi4vZW51bXMvU3lzdGVtQ2FwYWJpbGl0eVR5cGUuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG4vKipcbiAqIFJlcXVlc3QgZm9yIGV4cGFuZGVkIGluZm9ybWF0aW9uIGFib3V0IGEgc3VwcG9ydGVkIHN5c3RlbS9ITUkgY2FwYWJpbGl0eVxuICovXG5jbGFzcyBHZXRTeXN0ZW1DYXBhYmlsaXR5IGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5HZXRTeXN0ZW1DYXBhYmlsaXR5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N5c3RlbUNhcGFiaWxpdHlUeXBlfSB0eXBlIC0gVGhlIHR5cGUgb2Ygc3lzdGVtIGNhcGFiaWxpdHkgdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24gb25cbiAgICAgKiBAcmV0dXJuIHtHZXRTeXN0ZW1DYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIHNldFN5c3RlbUNhcGFiaWxpdHlUeXBlICh0eXBlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFN5c3RlbUNhcGFiaWxpdHlUeXBlLCB0eXBlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0U3lzdGVtQ2FwYWJpbGl0eS5LRVlfU1lTVEVNX0NBUEFCSUxJVFlfVFlQRSwgdHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N5c3RlbUNhcGFiaWxpdHlUeXBlfVxuICAgICAqL1xuICAgIGdldFN5c3RlbUNhcGFiaWxpdHlUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFN5c3RlbUNhcGFiaWxpdHlUeXBlLCBHZXRTeXN0ZW1DYXBhYmlsaXR5LktFWV9TWVNURU1fQ0FQQUJJTElUWV9UWVBFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHN1YnNjcmliZSAtIEZsYWcgdG8gc3Vic2NyaWJlIHRvIHVwZGF0ZXMgb2YgdGhlIHN1cHBsaWVkIHNlcnZpY2UgY2FwYWJpbGl0eSB0eXBlLiBJZiB0cnVlLCB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlciB3aWxsIGJlIHN1YnNjcmliZWQuIElmIGZhbHNlLCB0aGUgcmVxdWVzdGVyIHdpbGwgbm90IGJlIHN1YnNjcmliZWQgYW5kIGJlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkIGFzIGEgc3Vic2NyaWJlciBpZiBpdCB3YXMgcHJldmlvdXNseSBzdWJzY3JpYmVkLlxuICAgICAqIEByZXR1cm4ge0dldFN5c3RlbUNhcGFiaWxpdHl9XG4gICAgICovXG4gICAgc2V0U3Vic2NyaWJlIChzdWJzY3JpYmUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0U3lzdGVtQ2FwYWJpbGl0eS5LRVlfU1VCU0NSSUJFLCBzdWJzY3JpYmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFN1YnNjcmliZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRTeXN0ZW1DYXBhYmlsaXR5LktFWV9TVUJTQ1JJQkUpO1xuICAgIH1cbn1cblxuR2V0U3lzdGVtQ2FwYWJpbGl0eS5LRVlfU1lTVEVNX0NBUEFCSUxJVFlfVFlQRSA9ICdzeXN0ZW1DYXBhYmlsaXR5VHlwZSc7XG5HZXRTeXN0ZW1DYXBhYmlsaXR5LktFWV9TVUJTQ1JJQkUgPSAnc3Vic2NyaWJlJztcblxuZXhwb3J0IHsgR2V0U3lzdGVtQ2FwYWJpbGl0eSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEVudW0gZm9yIGVhY2ggdHlwZSBvZiB2aWRlbyBzdHJlYW1pbmcgY29kZWMuXG4gKiBAdHlwZWRlZiB7RW51bX0gVmlkZW9TdHJlYW1pbmdDb2RlY1xuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgVmlkZW9TdHJlYW1pbmdDb2RlYyBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGJsb2NrLW9yaWVudGVkIG1vdGlvbi1jb21wZW5zYXRpb24tYmFzZWQgdmlkZW8gY29tcHJlc3Npb24gc3RhbmRhcmQuIEFzIG9mIDIwMTQgaXQgaXMgb25lIG9mIHRoZSBtb3N0XG4gICAgICogY29tbW9ubHkgdXNlZCBmb3JtYXRzIGZvciB0aGUgcmVjb3JkaW5nLCBjb21wcmVzc2lvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB2aWRlbyBjb250ZW50LlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEgyNjQgKCkge1xuICAgICAgICByZXR1cm4gVmlkZW9TdHJlYW1pbmdDb2RlYy5fTUFQLkgyNjQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlnaCBFZmZpY2llbmN5IFZpZGVvIENvZGluZyAoSEVWQyksIGFsc28ga25vd24gYXMgSC4yNjUgYW5kIE1QRUctSCBQYXJ0IDIsIGlzIGEgdmlkZW8gY29tcHJlc3Npb24gc3RhbmRhcmQsXG4gICAgICogb25lIG9mIHNldmVyYWwgcG90ZW50aWFsIHN1Y2Nlc3NvcnMgdG8gdGhlIHdpZGVseSB1c2VkIEFWQyAoSC4yNjQgb3IgTVBFRy00IFBhcnQgMTApLiBJbiBjb21wYXJpc29uIHRvIEFWQyxcbiAgICAgKiBIRVZDIG9mZmVycyBhYm91dCBkb3VibGUgdGhlIGRhdGEgY29tcHJlc3Npb24gcmF0aW8gYXQgdGhlIHNhbWUgbGV2ZWwgb2YgdmlkZW8gcXVhbGl0eSwgb3Igc3Vic3RhbnRpYWxseVxuICAgICAqIGltcHJvdmVkIHZpZGVvIHF1YWxpdHkgYXQgdGhlIHNhbWUgYml0IHJhdGUuIEl0IHN1cHBvcnRzIHJlc29sdXRpb25zIHVwIHRvIDgxOTJ4NDMyMCwgaW5jbHVkaW5nIDhLIFVIRC5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBIMjY1ICgpIHtcbiAgICAgICAgcmV0dXJuIFZpZGVvU3RyZWFtaW5nQ29kZWMuX01BUC5IMjY1O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZW9yYSBpcyBkZXJpdmVkIGZyb20gdGhlIGZvcm1lcmx5IHByb3ByaWV0YXJ5IFZQMyBjb2RlYywgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbiBieSBPbjIgVGVjaG5vbG9naWVzLlxuICAgICAqIEl0IGlzIGJyb2FkbHkgY29tcGFyYWJsZSBpbiBkZXNpZ24gYW5kIGJpdHJhdGUgZWZmaWNpZW5jeSB0byBNUEVHLTQgUGFydCAyLCBlYXJseSB2ZXJzaW9ucyBvZiBXaW5kb3dzIE1lZGlhXG4gICAgICogVmlkZW8sIGFuZCBSZWFsVmlkZW8gd2hpbGUgbGFja2luZyBzb21lIG9mIHRoZSBmZWF0dXJlcyBwcmVzZW50IGluIHNvbWUgb2YgdGhlc2Ugb3RoZXIgY29kZWNzLiBJdCBpcyBjb21wYXJhYmxlXG4gICAgICogaW4gb3BlbiBzdGFuZGFyZHMgcGhpbG9zb3BoeSB0byB0aGUgQkJDJ3MgRGlyYWMgY29kZWMuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVGhlb3JhICgpIHtcbiAgICAgICAgcmV0dXJuIFZpZGVvU3RyZWFtaW5nQ29kZWMuX01BUC5UaGVvcmE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVlA4IGNhbiBiZSBtdWx0aXBsZXhlZCBpbnRvIHRoZSBNYXRyb3NrYS1iYXNlZCBjb250YWluZXIgZm9ybWF0IFdlYk0gYWxvbmcgd2l0aCBWb3JiaXMgYW5kIE9wdXMgYXVkaW8uIFRoZVxuICAgICAqIGltYWdlIGZvcm1hdCBXZWJQIGlzIGJhc2VkIG9uIFZQOCdzIGludHJhLWZyYW1lIGNvZGluZy4gVlA4J3MgZGlyZWN0IHN1Y2Nlc3NvciwgVlA5LCBhbmQgdGhlIGVtZXJnaW5nIHJveWFsdHktXG4gICAgICogZnJlZSBpbnRlcm5ldCB2aWRlbyBmb3JtYXQgQVYxIGZyb20gdGhlIEFsbGlhbmNlIGZvciBPcGVuIE1lZGlhIChBT01lZGlhKSBhcmUgYmFzZWQgb24gVlA4LlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZQOCAoKSB7XG4gICAgICAgIHJldHVybiBWaWRlb1N0cmVhbWluZ0NvZGVjLl9NQVAuVlA4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNpbWlsYXIgdG8gVlA4LCBidXQgVlA5IGlzIGN1c3RvbWl6ZWQgZm9yIHZpZGVvIHJlc29sdXRpb25zIGJleW9uZCBoaWdoLWRlZmluaXRpb24gdmlkZW8gKFVIRCkgYW5kIGFsc28gZW5hYmxlc1xuICAgICAqIGxvc3NsZXNzIGNvbXByZXNzaW9uLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZQOSAoKSB7XG4gICAgICAgIHJldHVybiBWaWRlb1N0cmVhbWluZ0NvZGVjLl9NQVAuVlA5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFZpZGVvU3RyZWFtaW5nQ29kZWMuX3ZhbHVlRm9yS2V5KGtleSwgVmlkZW9TdHJlYW1pbmdDb2RlYy5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFZpZGVvU3RyZWFtaW5nQ29kZWMuX2tleUZvclZhbHVlKHZhbHVlLCBWaWRlb1N0cmVhbWluZ0NvZGVjLl9NQVApO1xuICAgIH1cbn1cblxuVmlkZW9TdHJlYW1pbmdDb2RlYy5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0gyNjQnOiAnSDI2NCcsXG4gICAgJ0gyNjUnOiAnSDI2NScsXG4gICAgJ1RoZW9yYSc6ICdUaGVvcmEnLFxuICAgICdWUDgnOiAnVlA4JyxcbiAgICAnVlA5JzogJ1ZQOScsXG59KTtcblxuZXhwb3J0IHsgVmlkZW9TdHJlYW1pbmdDb2RlYyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEVudW0gZm9yIGVhY2ggdHlwZSBvZiB2aWRlbyBzdHJlYW1pbmcgcHJvdG9jb2wgdHlwZS5cbiAqIEB0eXBlZGVmIHtFbnVtfSBWaWRlb1N0cmVhbWluZ1Byb3RvY29sXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBWaWRlb1N0cmVhbWluZ1Byb3RvY29sIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJhdyBzdHJlYW0gYnl0ZXMgdGhhdCBjb250YWlucyBubyB0aW1lc3RhbXAgZGF0YSBhbmQgaXMgdGhlIGxvd2VzdCBzdXBwb3J0ZWQgdmlkZW8gc3RyZWFtaW5nXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUkFXICgpIHtcbiAgICAgICAgcmV0dXJuIFZpZGVvU3RyZWFtaW5nUHJvdG9jb2wuX01BUC5SQVc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUlRQIGZhY2lsaXRhdGVzIHRoZSB0cmFuc2ZlciBvZiByZWFsLXRpbWUgZGF0YS4gSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhpcyBwcm90b2NvbCBpbmNsdWRlIHRpbWVzdGFtcHMgKGZvclxuICAgICAqIHN5bmNocm9uaXphdGlvbiksIHNlcXVlbmNlIG51bWJlcnMgKGZvciBwYWNrZXQgbG9zcyBhbmQgcmVvcmRlcmluZyBkZXRlY3Rpb24pIGFuZCB0aGUgcGF5bG9hZCBmb3JtYXQgd2hpY2hcbiAgICAgKiBpbmRpY2F0ZXMgdGhlIGVuY29kZWQgZm9ybWF0IG9mIHRoZSBkYXRhLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJUUCAoKSB7XG4gICAgICAgIHJldHVybiBWaWRlb1N0cmVhbWluZ1Byb3RvY29sLl9NQVAuUlRQO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc21pc3Npb24gb2Ygc3RyZWFtaW5nIGRhdGEgaXRzZWxmIGlzIG5vdCBhIHRhc2sgb2YgUlRTUC4gTW9zdCBSVFNQIHNlcnZlcnMgdXNlIHRoZSBSZWFsLXRpbWUgVHJhbnNwb3J0XG4gICAgICogUHJvdG9jb2wgKFJUUCkgaW4gY29uanVuY3Rpb24gd2l0aCBSZWFsLXRpbWUgQ29udHJvbCBQcm90b2NvbCAoUlRDUCkgZm9yIG1lZGlhIHN0cmVhbSBkZWxpdmVyeS4gSG93ZXZlciwgc29tZVxuICAgICAqIHZlbmRvcnMgaW1wbGVtZW50IHByb3ByaWV0YXJ5IHRyYW5zcG9ydCBwcm90b2NvbHMuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUlRTUCAoKSB7XG4gICAgICAgIHJldHVybiBWaWRlb1N0cmVhbWluZ1Byb3RvY29sLl9NQVAuUlRTUDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFsLVRpbWUgTWVzc2FnaW5nIFByb3RvY29sIChSVE1QKSB3YXMgaW5pdGlhbGx5IGEgcHJvcHJpZXRhcnkgcHJvdG9jb2wgZGV2ZWxvcGVkIGJ5IE1hY3JvbWVkaWEgZm9yIHN0cmVhbWluZ1xuICAgICAqIGF1ZGlvLCB2aWRlbyBhbmQgZGF0YSBvdmVyIHRoZSBJbnRlcm5ldCwgYmV0d2VlbiBhIEZsYXNoIHBsYXllciBhbmQgYSBzZXJ2ZXIuIE1hY3JvbWVkaWEgaXMgbm93IG93bmVkIGJ5IEFkb2JlLFxuICAgICAqIHdoaWNoIGhhcyByZWxlYXNlZCBhbiBpbmNvbXBsZXRlIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIHByb3RvY29sIGZvciBwdWJsaWMgdXNlLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJUTVAgKCkge1xuICAgICAgICByZXR1cm4gVmlkZW9TdHJlYW1pbmdQcm90b2NvbC5fTUFQLlJUTVA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIFdlYk0gY29udGFpbmVyIGlzIGJhc2VkIG9uIGEgcHJvZmlsZSBvZiBNYXRyb3NrYS4gV2ViTSBpbml0aWFsbHkgc3VwcG9ydGVkIFZQOCB2aWRlbyBhbmQgVm9yYmlzIGF1ZGlvXG4gICAgICogc3RyZWFtcy4gSW4gMjAxMyBpdCB3YXMgdXBkYXRlZCB0byBhY2NvbW1vZGF0ZSBWUDkgdmlkZW8gYW5kIE9wdXMgYXVkaW8uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgV0VCTSAoKSB7XG4gICAgICAgIHJldHVybiBWaWRlb1N0cmVhbWluZ1Byb3RvY29sLl9NQVAuV0VCTTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBWaWRlb1N0cmVhbWluZ1Byb3RvY29sLl92YWx1ZUZvcktleShrZXksIFZpZGVvU3RyZWFtaW5nUHJvdG9jb2wuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBWaWRlb1N0cmVhbWluZ1Byb3RvY29sLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgVmlkZW9TdHJlYW1pbmdQcm90b2NvbC5fTUFQKTtcbiAgICB9XG59XG5cblZpZGVvU3RyZWFtaW5nUHJvdG9jb2wuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdSQVcnOiAnUkFXJyxcbiAgICAnUlRQJzogJ1JUUCcsXG4gICAgJ1JUU1AnOiAnUlRTUCcsXG4gICAgJ1JUTVAnOiAnUlRNUCcsXG4gICAgJ1dFQk0nOiAnV0VCTScsXG59KTtcblxuZXhwb3J0IHsgVmlkZW9TdHJlYW1pbmdQcm90b2NvbCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBWaWRlb1N0cmVhbWluZ0NvZGVjIH0gZnJvbSAnLi4vZW51bXMvVmlkZW9TdHJlYW1pbmdDb2RlYy5qcyc7XG5pbXBvcnQgeyBWaWRlb1N0cmVhbWluZ1Byb3RvY29sIH0gZnJvbSAnLi4vZW51bXMvVmlkZW9TdHJlYW1pbmdQcm90b2NvbC5qcyc7XG5cbi8qKlxuICogVmlkZW8gc3RyZWFtaW5nIGZvcm1hdHMgYW5kIHRoZWlyIHNwZWNpZmljYXRpb25zLlxuICovXG5jbGFzcyBWaWRlb1N0cmVhbWluZ0Zvcm1hdCBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWaWRlb1N0cmVhbWluZ1Byb3RvY29sfSBwcm90b2NvbCAtIFByb3RvY29sIHR5cGUsIHNlZSBWaWRlb1N0cmVhbWluZ1Byb3RvY29sXG4gICAgICogQHJldHVybiB7VmlkZW9TdHJlYW1pbmdGb3JtYXR9XG4gICAgICovXG4gICAgc2V0UHJvdG9jb2wgKHByb3RvY29sKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZpZGVvU3RyZWFtaW5nUHJvdG9jb2wsIHByb3RvY29sKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVmlkZW9TdHJlYW1pbmdGb3JtYXQuS0VZX1BST1RPQ09MLCBwcm90b2NvbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nUHJvdG9jb2x9XG4gICAgICovXG4gICAgZ2V0UHJvdG9jb2wgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVmlkZW9TdHJlYW1pbmdQcm90b2NvbCwgVmlkZW9TdHJlYW1pbmdGb3JtYXQuS0VZX1BST1RPQ09MKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZpZGVvU3RyZWFtaW5nQ29kZWN9IGNvZGVjIC0gQ29kZWMgdHlwZSwgc2VlIFZpZGVvU3RyZWFtaW5nQ29kZWNcbiAgICAgKiBAcmV0dXJuIHtWaWRlb1N0cmVhbWluZ0Zvcm1hdH1cbiAgICAgKi9cbiAgICBzZXRDb2RlYyAoY29kZWMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmlkZW9TdHJlYW1pbmdDb2RlYywgY29kZWMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihWaWRlb1N0cmVhbWluZ0Zvcm1hdC5LRVlfQ09ERUMsIGNvZGVjKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmlkZW9TdHJlYW1pbmdDb2RlY31cbiAgICAgKi9cbiAgICBnZXRDb2RlYyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWaWRlb1N0cmVhbWluZ0NvZGVjLCBWaWRlb1N0cmVhbWluZ0Zvcm1hdC5LRVlfQ09ERUMpO1xuICAgIH1cbn1cblxuVmlkZW9TdHJlYW1pbmdGb3JtYXQuS0VZX1BST1RPQ09MID0gJ3Byb3RvY29sJztcblZpZGVvU3RyZWFtaW5nRm9ybWF0LktFWV9DT0RFQyA9ICdjb2RlYyc7XG5cbmV4cG9ydCB7IFZpZGVvU3RyZWFtaW5nRm9ybWF0IH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IEltYWdlUmVzb2x1dGlvbiB9IGZyb20gJy4vSW1hZ2VSZXNvbHV0aW9uLmpzJztcbmltcG9ydCB7IFZpZGVvU3RyZWFtaW5nRm9ybWF0IH0gZnJvbSAnLi9WaWRlb1N0cmVhbWluZ0Zvcm1hdC5qcyc7XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzeXN0ZW0ncyB2aWRlbyBzdHJlYW1pbmcgY2FwYWJpbGl0aWVzLlxuICovXG5jbGFzcyBWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW1hZ2VSZXNvbHV0aW9ufSByZXNvbHV0aW9uIC0gVGhlIHByZWZlcnJlZCByZXNvbHV0aW9uIG9mIGEgdmlkZW8gc3RyZWFtIGZvciBkZWNvZGluZyBhbmQgcmVuZGVyaW5nIG9uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBITUkuXG4gICAgICogQHJldHVybiB7VmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIHNldFByZWZlcnJlZFJlc29sdXRpb24gKHJlc29sdXRpb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSW1hZ2VSZXNvbHV0aW9uLCByZXNvbHV0aW9uKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9QUkVGRVJSRURfUkVTT0xVVElPTiwgcmVzb2x1dGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0ltYWdlUmVzb2x1dGlvbn1cbiAgICAgKi9cbiAgICBnZXRQcmVmZXJyZWRSZXNvbHV0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEltYWdlUmVzb2x1dGlvbiwgVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9QUkVGRVJSRURfUkVTT0xVVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGJpdHJhdGUgLSBUaGUgbWF4aW11bSBiaXRyYXRlIG9mIHZpZGVvIHN0cmVhbSB0aGF0IGlzIHN1cHBvcnRlZCwgaW4ga2Jwcy5cbiAgICAgKiBAcmV0dXJuIHtWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHl9XG4gICAgICovXG4gICAgc2V0TWF4Qml0cmF0ZSAoYml0cmF0ZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuS0VZX01BWF9CSVRSQVRFLCBiaXRyYXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldE1heEJpdHJhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9NQVhfQklUUkFURSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWaWRlb1N0cmVhbWluZ0Zvcm1hdFtdfSBmb3JtYXRzIC0gRGV0YWlsZWQgaW5mb3JtYXRpb24gb24gZWFjaCBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoaXMgc3lzdGVtLCBpbiBpdHNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWQgb3JkZXIgKGkuZS4gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5IGlzIG1vc3QgcHJlZmVyYWJsZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBzeXN0ZW0pLiBFYWNoIG9iamVjdCB3aWxsIGNvbnRhaW4gYSBWaWRlb1N0cmVhbWluZ0Zvcm1hdCB0aGF0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVzIHdoYXQgY2FuIGJlIGV4cGVjdGVkLlxuICAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eX1cbiAgICAgKi9cbiAgICBzZXRTdXBwb3J0ZWRGb3JtYXRzIChmb3JtYXRzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZpZGVvU3RyZWFtaW5nRm9ybWF0LCBmb3JtYXRzLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9TVVBQT1JURURfRk9STUFUUywgZm9ybWF0cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nRm9ybWF0W119XG4gICAgICovXG4gICAgZ2V0U3VwcG9ydGVkRm9ybWF0cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWaWRlb1N0cmVhbWluZ0Zvcm1hdCwgVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9TVVBQT1JURURfRk9STUFUUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzdXBwb3J0ZWQgLSBUcnVlIGlmIHRoZSBzeXN0ZW0gY2FuIHV0aWxpemUgdGhlIGhhcHRpYyBzcGF0aWFsIGRhdGEgZnJvbSB0aGUgc291cmNlIGJlaW5nXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1lZC4gSWYgbm90IGluY2x1ZGVkLCBpdCBjYW4gYmUgYXNzdW1lZCB0aGUgbW9kdWxlIGRvZXNuJ3Qgc3VwcG9ydCBoYXB0aWNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWwgZGF0YScuXG4gICAgICogQHJldHVybiB7VmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIHNldEhhcHRpY1NwYXRpYWxEYXRhU3VwcG9ydGVkIChzdXBwb3J0ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9IQVBUSUNfU1BBVElBTF9EQVRBX1NVUFBPUlRFRCwgc3VwcG9ydGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRIYXB0aWNTcGF0aWFsRGF0YVN1cHBvcnRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuS0VZX0hBUFRJQ19TUEFUSUFMX0RBVEFfU1VQUE9SVEVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc2l6ZSAtIFRoZSBkaWFnb25hbCBzY3JlZW4gc2l6ZSBpbiBpbmNoZXMuXG4gICAgICogQHJldHVybiB7VmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIHNldERpYWdvbmFsU2NyZWVuU2l6ZSAoc2l6ZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuS0VZX0RJQUdPTkFMX1NDUkVFTl9TSVpFLCBzaXplKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldERpYWdvbmFsU2NyZWVuU2l6ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuS0VZX0RJQUdPTkFMX1NDUkVFTl9TSVpFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaW5jaCAtIFBQSSBpcyB0aGUgZGlhZ29uYWwgcmVzb2x1dGlvbiBpbiBwaXhlbHMgZGl2aWRlZCBieSB0aGUgZGlhZ29uYWwgc2NyZWVuIHNpemUgaW4gaW5jaGVzLlxuICAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eX1cbiAgICAgKi9cbiAgICBzZXRQaXhlbFBlckluY2ggKGluY2gpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9QSVhFTF9QRVJfSU5DSCwgaW5jaCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRQaXhlbFBlckluY2ggKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9QSVhFTF9QRVJfSU5DSCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIC0gVGhlIHNjYWxpbmcgZmFjdG9yIHRoZSBhcHAgc2hvdWxkIHVzZSB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIHByb2plY3Rpbmcgdmlldy5cbiAgICAgKiBAcmV0dXJuIHtWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHl9XG4gICAgICovXG4gICAgc2V0U2NhbGUgKHNjYWxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eS5LRVlfU0NBTEUsIHNjYWxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFNjYWxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eS5LRVlfU0NBTEUpO1xuICAgIH1cbn1cblxuVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9QUkVGRVJSRURfUkVTT0xVVElPTiA9ICdwcmVmZXJyZWRSZXNvbHV0aW9uJztcblZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eS5LRVlfTUFYX0JJVFJBVEUgPSAnbWF4Qml0cmF0ZSc7XG5WaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuS0VZX1NVUFBPUlRFRF9GT1JNQVRTID0gJ3N1cHBvcnRlZEZvcm1hdHMnO1xuVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LktFWV9IQVBUSUNfU1BBVElBTF9EQVRBX1NVUFBPUlRFRCA9ICdoYXB0aWNTcGF0aWFsRGF0YVN1cHBvcnRlZCc7XG5WaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuS0VZX0RJQUdPTkFMX1NDUkVFTl9TSVpFID0gJ2RpYWdvbmFsU2NyZWVuU2l6ZSc7XG5WaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuS0VZX1BJWEVMX1BFUl9JTkNIID0gJ3BpeGVsUGVySW5jaCc7XG5WaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuS0VZX1NDQUxFID0gJ3NjYWxlJztcblxuZXhwb3J0IHsgVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5IH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcblxuLyoqXG4gKiBFeHRlbmRlZCBjYXBhYmlsaXRpZXMgb2YgdGhlIG1vZHVsZSdzIHBob25lIGZlYXR1cmVcbiAqL1xuY2xhc3MgUGhvbmVDYXBhYmlsaXR5IGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBJZiB0aGUgbW9kdWxlIGhhcyB0aGUgYWJpbGl0eSB0byBwZXJmb3JtIGRpYWwgbnVtYmVyXG4gICAgICogQHJldHVybiB7UGhvbmVDYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIHNldERpYWxOdW1iZXJFbmFibGVkIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFBob25lQ2FwYWJpbGl0eS5LRVlfRElBTF9OVU1CRVJfRU5BQkxFRCwgZW5hYmxlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RGlhbE51bWJlckVuYWJsZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUGhvbmVDYXBhYmlsaXR5LktFWV9ESUFMX05VTUJFUl9FTkFCTEVEKTtcbiAgICB9XG59XG5cblBob25lQ2FwYWJpbGl0eS5LRVlfRElBTF9OVU1CRVJfRU5BQkxFRCA9ICdkaWFsTnVtYmVyRW5hYmxlZCc7XG5cbmV4cG9ydCB7IFBob25lQ2FwYWJpbGl0eSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFdpbmRvd1R5cGUgfSBmcm9tICcuLi9lbnVtcy9XaW5kb3dUeXBlLmpzJztcbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbmNsYXNzIFdpbmRvd1R5cGVDYXBhYmlsaXRpZXMgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7V2luZG93VHlwZX0gdHlwZVxuICAgICAqIEByZXR1cm4ge1dpbmRvd1R5cGVDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0VHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShXaW5kb3dUeXBlLCB0eXBlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoV2luZG93VHlwZUNhcGFiaWxpdGllcy5LRVlfVFlQRSwgdHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1dpbmRvd1R5cGV9XG4gICAgICovXG4gICAgZ2V0VHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChXaW5kb3dUeXBlLCBXaW5kb3dUeXBlQ2FwYWJpbGl0aWVzLktFWV9UWVBFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2luZG93c1xuICAgICAqIEByZXR1cm4ge1dpbmRvd1R5cGVDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0TWF4aW11bU51bWJlck9mV2luZG93cyAod2luZG93cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXaW5kb3dUeXBlQ2FwYWJpbGl0aWVzLktFWV9NQVhJTVVNX05VTUJFUl9PRl9XSU5ET1dTLCB3aW5kb3dzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldE1heGltdW1OdW1iZXJPZldpbmRvd3MgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoV2luZG93VHlwZUNhcGFiaWxpdGllcy5LRVlfTUFYSU1VTV9OVU1CRVJfT0ZfV0lORE9XUyk7XG4gICAgfVxufVxuXG5XaW5kb3dUeXBlQ2FwYWJpbGl0aWVzLktFWV9UWVBFID0gJ3R5cGUnO1xuV2luZG93VHlwZUNhcGFiaWxpdGllcy5LRVlfTUFYSU1VTV9OVU1CRVJfT0ZfV0lORE9XUyA9ICdtYXhpbXVtTnVtYmVyT2ZXaW5kb3dzJztcblxuZXhwb3J0IHsgV2luZG93VHlwZUNhcGFiaWxpdGllcyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEltYWdlRmllbGQgfSBmcm9tICcuL0ltYWdlRmllbGQuanMnO1xuaW1wb3J0IHsgVGV4dEZpZWxkIH0gZnJvbSAnLi9UZXh0RmllbGQuanMnO1xuaW1wb3J0IHsgSW1hZ2VUeXBlIH0gZnJvbSAnLi4vZW51bXMvSW1hZ2VUeXBlLmpzJztcbmltcG9ydCB7IE1lbnVMYXlvdXQgfSBmcm9tICcuLi9lbnVtcy9NZW51TGF5b3V0LmpzJztcbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBCdXR0b25DYXBhYmlsaXRpZXMgfSBmcm9tICcuL0J1dHRvbkNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9Tb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLmpzJztcblxuY2xhc3MgV2luZG93Q2FwYWJpbGl0eSBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIC0gVGhlIHNwZWNpZmllZCBJRCBvZiB0aGUgd2luZG93LiBUaGlzIElEIGlzIGVpdGhlciBvbmUgdXNlZCB3aGVuIHNlbmRpbmcgdGhlIENyZWF0ZVdpbmRvd1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsIG9yIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCB3aW5kb3cgSUQgdmFsdWVzIGZyb20gdGhlIGVudW0gUHJlZGVmaW5lZFdpbmRvd3MuIElmXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgb21taXRlZCwgdmFsdWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgbWFpbiB3aW5kb3cgb24gdGhlIG1haW4gZGlzcGxheS5cbiAgICAgKiBAcmV0dXJuIHtXaW5kb3dDYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIHNldFdpbmRvd0lEIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXaW5kb3dDYXBhYmlsaXR5LktFWV9XSU5ET1dfSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFdpbmRvd0lEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFdpbmRvd0NhcGFiaWxpdHkuS0VZX1dJTkRPV19JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUZXh0RmllbGRbXX0gZmllbGRzIC0gQSBzZXQgb2YgYWxsIGZpZWxkcyB0aGF0IHN1cHBvcnQgdGV4dCBkYXRhLiBTZWUgVGV4dEZpZWxkXG4gICAgICogQHJldHVybiB7V2luZG93Q2FwYWJpbGl0eX1cbiAgICAgKi9cbiAgICBzZXRUZXh0RmllbGRzIChmaWVsZHMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVGV4dEZpZWxkLCBmaWVsZHMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXaW5kb3dDYXBhYmlsaXR5LktFWV9URVhUX0ZJRUxEUywgZmllbGRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VGV4dEZpZWxkW119XG4gICAgICovXG4gICAgZ2V0VGV4dEZpZWxkcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUZXh0RmllbGQsIFdpbmRvd0NhcGFiaWxpdHkuS0VZX1RFWFRfRklFTERTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0ltYWdlRmllbGRbXX0gZmllbGRzIC0gQSBzZXQgb2YgYWxsIGZpZWxkcyB0aGF0IHN1cHBvcnQgaW1hZ2VzLiBTZWUgSW1hZ2VGaWVsZFxuICAgICAqIEByZXR1cm4ge1dpbmRvd0NhcGFiaWxpdHl9XG4gICAgICovXG4gICAgc2V0SW1hZ2VGaWVsZHMgKGZpZWxkcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShJbWFnZUZpZWxkLCBmaWVsZHMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXaW5kb3dDYXBhYmlsaXR5LktFWV9JTUFHRV9GSUVMRFMsIGZpZWxkcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0ltYWdlRmllbGRbXX1cbiAgICAgKi9cbiAgICBnZXRJbWFnZUZpZWxkcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChJbWFnZUZpZWxkLCBXaW5kb3dDYXBhYmlsaXR5LktFWV9JTUFHRV9GSUVMRFMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW1hZ2VUeXBlW119IHN1cHBvcnRlZCAtIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGltYWdlIHR5cGVzIHN1cHBvcnRlZCBieSB0aGUgc3lzdGVtLlxuICAgICAqIEByZXR1cm4ge1dpbmRvd0NhcGFiaWxpdHl9XG4gICAgICovXG4gICAgc2V0SW1hZ2VUeXBlU3VwcG9ydGVkIChzdXBwb3J0ZWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSW1hZ2VUeXBlLCBzdXBwb3J0ZWQsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXaW5kb3dDYXBhYmlsaXR5LktFWV9JTUFHRV9UWVBFX1NVUFBPUlRFRCwgc3VwcG9ydGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SW1hZ2VUeXBlW119XG4gICAgICovXG4gICAgZ2V0SW1hZ2VUeXBlU3VwcG9ydGVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEltYWdlVHlwZSwgV2luZG93Q2FwYWJpbGl0eS5LRVlfSU1BR0VfVFlQRV9TVVBQT1JURUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nW119IGF2YWlsYWJsZSAtIEEgc2V0IG9mIGFsbCB3aW5kb3cgdGVtcGxhdGVzIGF2YWlsYWJsZSBvbiB0aGUgaGVhZCB1bml0LlxuICAgICAqIEByZXR1cm4ge1dpbmRvd0NhcGFiaWxpdHl9XG4gICAgICovXG4gICAgc2V0VGVtcGxhdGVzQXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoV2luZG93Q2FwYWJpbGl0eS5LRVlfVEVNUExBVEVTX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0VGVtcGxhdGVzQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFdpbmRvd0NhcGFiaWxpdHkuS0VZX1RFTVBMQVRFU19BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBhdmFpbGFibGUgLSBUaGUgbnVtYmVyIG9mIG9uLXdpbmRvdyBjdXN0b20gcHJlc2V0cyBhdmFpbGFibGUgKGlmIGFueSk7IG90aGVyd2lzZSBvbWl0dGVkLlxuICAgICAqIEByZXR1cm4ge1dpbmRvd0NhcGFiaWxpdHl9XG4gICAgICovXG4gICAgc2V0TnVtQ3VzdG9tUHJlc2V0c0F2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFdpbmRvd0NhcGFiaWxpdHkuS0VZX05VTV9DVVNUT01fUFJFU0VUU19BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXROdW1DdXN0b21QcmVzZXRzQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFdpbmRvd0NhcGFiaWxpdHkuS0VZX05VTV9DVVNUT01fUFJFU0VUU19BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QnV0dG9uQ2FwYWJpbGl0aWVzW119IGNhcGFiaWxpdGllcyAtIFRoZSBudW1iZXIgb2YgYnV0dG9ucyBhbmQgdGhlIGNhcGFiaWxpdGllcyBvZiBlYWNoIG9uLXdpbmRvdyBidXR0b24uXG4gICAgICogQHJldHVybiB7V2luZG93Q2FwYWJpbGl0eX1cbiAgICAgKi9cbiAgICBzZXRCdXR0b25DYXBhYmlsaXRpZXMgKGNhcGFiaWxpdGllcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShCdXR0b25DYXBhYmlsaXRpZXMsIGNhcGFiaWxpdGllcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFdpbmRvd0NhcGFiaWxpdHkuS0VZX0JVVFRPTl9DQVBBQklMSVRJRVMsIGNhcGFiaWxpdGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0J1dHRvbkNhcGFiaWxpdGllc1tdfVxuICAgICAqL1xuICAgIGdldEJ1dHRvbkNhcGFiaWxpdGllcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChCdXR0b25DYXBhYmlsaXRpZXMsIFdpbmRvd0NhcGFiaWxpdHkuS0VZX0JVVFRPTl9DQVBBQklMSVRJRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U29mdEJ1dHRvbkNhcGFiaWxpdGllc1tdfSBjYXBhYmlsaXRpZXMgLSBUaGUgbnVtYmVyIG9mIHNvZnQgYnV0dG9ucyBhdmFpbGFibGUgb24td2luZG93IGFuZCB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzIGZvciBlYWNoIGJ1dHRvbi5cbiAgICAgKiBAcmV0dXJuIHtXaW5kb3dDYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIHNldFNvZnRCdXR0b25DYXBhYmlsaXRpZXMgKGNhcGFiaWxpdGllcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXaW5kb3dDYXBhYmlsaXR5LktFWV9TT0ZUX0JVVFRPTl9DQVBBQklMSVRJRVMsIGNhcGFiaWxpdGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NvZnRCdXR0b25DYXBhYmlsaXRpZXNbXX1cbiAgICAgKi9cbiAgICBnZXRTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFNvZnRCdXR0b25DYXBhYmlsaXRpZXMsIFdpbmRvd0NhcGFiaWxpdHkuS0VZX1NPRlRfQlVUVE9OX0NBUEFCSUxJVElFUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNZW51TGF5b3V0W119IGF2YWlsYWJsZSAtIEFuIGFycmF5IG9mIGF2YWlsYWJsZSBtZW51IGxheW91dHMuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBwcm92aWRlZCwgb25seSB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYExJU1RgIGxheW91dCBpcyBhc3N1bWVkIHRvIGJlIGF2YWlsYWJsZVxuICAgICAqIEByZXR1cm4ge1dpbmRvd0NhcGFiaWxpdHl9XG4gICAgICovXG4gICAgc2V0TWVudUxheW91dHNBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNZW51TGF5b3V0LCBhdmFpbGFibGUsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXaW5kb3dDYXBhYmlsaXR5LktFWV9NRU5VX0xBWU9VVFNfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNZW51TGF5b3V0W119XG4gICAgICovXG4gICAgZ2V0TWVudUxheW91dHNBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTWVudUxheW91dCwgV2luZG93Q2FwYWJpbGl0eS5LRVlfTUVOVV9MQVlPVVRTX0FWQUlMQUJMRSk7XG4gICAgfVxufVxuXG5XaW5kb3dDYXBhYmlsaXR5LktFWV9XSU5ET1dfSUQgPSAnd2luZG93SUQnO1xuV2luZG93Q2FwYWJpbGl0eS5LRVlfVEVYVF9GSUVMRFMgPSAndGV4dEZpZWxkcyc7XG5XaW5kb3dDYXBhYmlsaXR5LktFWV9JTUFHRV9GSUVMRFMgPSAnaW1hZ2VGaWVsZHMnO1xuV2luZG93Q2FwYWJpbGl0eS5LRVlfSU1BR0VfVFlQRV9TVVBQT1JURUQgPSAnaW1hZ2VUeXBlU3VwcG9ydGVkJztcbldpbmRvd0NhcGFiaWxpdHkuS0VZX1RFTVBMQVRFU19BVkFJTEFCTEUgPSAndGVtcGxhdGVzQXZhaWxhYmxlJztcbldpbmRvd0NhcGFiaWxpdHkuS0VZX05VTV9DVVNUT01fUFJFU0VUU19BVkFJTEFCTEUgPSAnbnVtQ3VzdG9tUHJlc2V0c0F2YWlsYWJsZSc7XG5XaW5kb3dDYXBhYmlsaXR5LktFWV9CVVRUT05fQ0FQQUJJTElUSUVTID0gJ2J1dHRvbkNhcGFiaWxpdGllcyc7XG5XaW5kb3dDYXBhYmlsaXR5LktFWV9TT0ZUX0JVVFRPTl9DQVBBQklMSVRJRVMgPSAnc29mdEJ1dHRvbkNhcGFiaWxpdGllcyc7XG5XaW5kb3dDYXBhYmlsaXR5LktFWV9NRU5VX0xBWU9VVFNfQVZBSUxBQkxFID0gJ21lbnVMYXlvdXRzQXZhaWxhYmxlJztcblxuZXhwb3J0IHsgV2luZG93Q2FwYWJpbGl0eSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFdpbmRvd1R5cGVDYXBhYmlsaXRpZXMgfSBmcm9tICcuL1dpbmRvd1R5cGVDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgV2luZG93Q2FwYWJpbGl0eSB9IGZyb20gJy4vV2luZG93Q2FwYWJpbGl0eS5qcyc7XG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG5jbGFzcyBEaXNwbGF5Q2FwYWJpbGl0eSBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJuIHtEaXNwbGF5Q2FwYWJpbGl0eX1cbiAgICAgKi9cbiAgICBzZXREaXNwbGF5TmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEaXNwbGF5Q2FwYWJpbGl0eS5LRVlfRElTUExBWV9OQU1FLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldERpc3BsYXlOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKERpc3BsYXlDYXBhYmlsaXR5LktFWV9ESVNQTEFZX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7V2luZG93VHlwZUNhcGFiaWxpdGllc1tdfSBzdXBwb3J0ZWQgLSBJbmZvcm1zIHRoZSBhcHBsaWNhdGlvbiBob3cgbWFueSB3aW5kb3dzIHRoZSBhcHAgaXMgYWxsb3dlZCB0b1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGUgcGVyIHR5cGUuXG4gICAgICogQHJldHVybiB7RGlzcGxheUNhcGFiaWxpdHl9XG4gICAgICovXG4gICAgc2V0V2luZG93VHlwZVN1cHBvcnRlZCAoc3VwcG9ydGVkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFdpbmRvd1R5cGVDYXBhYmlsaXRpZXMsIHN1cHBvcnRlZCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKERpc3BsYXlDYXBhYmlsaXR5LktFWV9XSU5ET1dfVFlQRV9TVVBQT1JURUQsIHN1cHBvcnRlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1dpbmRvd1R5cGVDYXBhYmlsaXRpZXNbXX1cbiAgICAgKi9cbiAgICBnZXRXaW5kb3dUeXBlU3VwcG9ydGVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFdpbmRvd1R5cGVDYXBhYmlsaXRpZXMsIERpc3BsYXlDYXBhYmlsaXR5LktFWV9XSU5ET1dfVFlQRV9TVVBQT1JURUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7V2luZG93Q2FwYWJpbGl0eVtdfSBjYXBhYmlsaXRpZXMgLSBDb250YWlucyBhIGxpc3Qgb2YgY2FwYWJpbGl0aWVzIG9mIGFsbCB3aW5kb3dzIHJlbGF0ZWQgdG8gdGhlIGFwcC5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25jZSB0aGUgYXBwIGhhcyByZWdpc3RlcmVkIHRoZSBjYXBhYmlsaXRpZXMgb2YgYWxsIHdpbmRvd3MgYXJlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkLiBHZXRTeXN0ZW1DYXBhYmlsaXR5IHN0aWxsIGFsbG93cyByZXF1ZXN0aW5nIHdpbmRvd1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMgb2YgYWxsIHdpbmRvd3MuIEFmdGVyIHJlZ2lzdHJhdGlvbiwgb25seSB3aW5kb3dzIHdpdGhcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzIGNoYW5nZWQgd2lsbCBiZSBpbmNsdWRlZC4gRm9sbG93aW5nIGNhc2VzIHdpbGwgY2F1c2Ugb25seVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZmZlY3RlZCB3aW5kb3dzIHRvIGJlIGluY2x1ZGVkOiAxLiBBcHAgY3JlYXRlcyBhIG5ldyB3aW5kb3cuIEFmdGVyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3aW5kb3cgaXMgY3JlYXRlZCwgYSBzeXN0ZW0gY2FwYWJpbGl0eSBub3RpZmljYXRpb24gd2lsbCBiZSBzZW50XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgb25seSB0byB0aGUgY3JlYXRlZCB3aW5kb3cuIDIuIEFwcCBzZXRzIGEgbmV3IGxheW91dCB0byB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LiBUaGUgbmV3IGxheW91dCBjaGFuZ2VzIHdpbmRvdyBjYXBhYmlsdGllcy4gVGhlIG5vdGlmaWNhdGlvblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHJlZmxlY3QgdGhvc2UgY2hhbmdlcyB0byB0aGUgc2luZ2xlIHdpbmRvdy5cbiAgICAgKiBAcmV0dXJuIHtEaXNwbGF5Q2FwYWJpbGl0eX1cbiAgICAgKi9cbiAgICBzZXRXaW5kb3dDYXBhYmlsaXRpZXMgKGNhcGFiaWxpdGllcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShXaW5kb3dDYXBhYmlsaXR5LCBjYXBhYmlsaXRpZXMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihEaXNwbGF5Q2FwYWJpbGl0eS5LRVlfV0lORE9XX0NBUEFCSUxJVElFUywgY2FwYWJpbGl0aWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7V2luZG93Q2FwYWJpbGl0eVtdfVxuICAgICAqL1xuICAgIGdldFdpbmRvd0NhcGFiaWxpdGllcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChXaW5kb3dDYXBhYmlsaXR5LCBEaXNwbGF5Q2FwYWJpbGl0eS5LRVlfV0lORE9XX0NBUEFCSUxJVElFUyk7XG4gICAgfVxufVxuXG5EaXNwbGF5Q2FwYWJpbGl0eS5LRVlfRElTUExBWV9OQU1FID0gJ2Rpc3BsYXlOYW1lJztcbkRpc3BsYXlDYXBhYmlsaXR5LktFWV9XSU5ET1dfVFlQRV9TVVBQT1JURUQgPSAnd2luZG93VHlwZVN1cHBvcnRlZCc7XG5EaXNwbGF5Q2FwYWJpbGl0eS5LRVlfV0lORE9XX0NBUEFCSUxJVElFUyA9ICd3aW5kb3dDYXBhYmlsaXRpZXMnO1xuXG5leHBvcnQgeyBEaXNwbGF5Q2FwYWJpbGl0eSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBNb2R1bGVJbmZvIH0gZnJvbSAnLi9Nb2R1bGVJbmZvLmpzJztcblxuY2xhc3MgQXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFRoZSBzaG9ydCBmcmllbmRseSBuYW1lIG9mIHRoZSBsaWdodCBjb250cm9sIG1vZHVsZS4gSXQgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGlkZW50aWZ5IGFcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBieSBtb2JpbGUgYXBwbGljYXRpb24uXG4gICAgICogQHJldHVybiB7QXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldE1vZHVsZU5hbWUgKG5hbWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9NT0RVTEVfTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRNb2R1bGVOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEF1ZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TW9kdWxlSW5mb30gaW5mbyAtIEluZm9ybWF0aW9uIGFib3V0IGEgUkMgbW9kdWxlLCBpbmNsdWRpbmcgaXRzIGlkLlxuICAgICAqIEByZXR1cm4ge0F1ZGlvQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRNb2R1bGVJbmZvIChpbmZvKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKE1vZHVsZUluZm8sIGluZm8pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBdWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX01PRFVMRV9JTkZPLCBpbmZvKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TW9kdWxlSW5mb31cbiAgICAgKi9cbiAgICBnZXRNb2R1bGVJbmZvICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KE1vZHVsZUluZm8sIEF1ZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX0lORk8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlIC0gQXZhaWxhYmlsaXR5IG9mIHRoZSBjb250cm9sIG9mIGF1ZGlvIHNvdXJjZS5cbiAgICAgKiBAcmV0dXJuIHtBdWRpb0NvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0U291cmNlQXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9TT1VSQ0VfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFNvdXJjZUF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihBdWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1NPVVJDRV9BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlIC0gQXZhaWxhYmlsaXR5IG9mIHRoZSBrZWVwQ29udGV4dCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybiB7QXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldEtlZXBDb250ZXh0QXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9LRUVQX0NPTlRFWFRfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEtlZXBDb250ZXh0QXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEF1ZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfS0VFUF9DT05URVhUX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGUgLSBBdmFpbGFiaWxpdHkgb2YgdGhlIGNvbnRyb2wgb2YgYXVkaW8gdm9sdW1lLlxuICAgICAqIEByZXR1cm4ge0F1ZGlvQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRWb2x1bWVBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBdWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1ZPTFVNRV9BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0Vm9sdW1lQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEF1ZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfVk9MVU1FX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGUgLSBBdmFpbGFiaWxpdHkgb2YgdGhlIGNvbnRyb2wgb2YgRXF1YWxpemVyIFNldHRpbmdzLlxuICAgICAqIEByZXR1cm4ge0F1ZGlvQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRFcXVhbGl6ZXJBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBdWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0VRVUFMSVpFUl9BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RXF1YWxpemVyQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEF1ZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfRVFVQUxJWkVSX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIC0gTXVzdCBiZSBpbmNsdWRlZCBpZiBlcXVhbGl6ZXJBdmFpbGFibGU9dHJ1ZSwgYW5kIGFzc3VtZSBhbGwgSURzIHN0YXJ0aW5nIGZyb20gMSB0byB0aGlzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgdmFsdWUgYXJlIHZhbGlkXG4gICAgICogQHJldHVybiB7QXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldEVxdWFsaXplck1heENoYW5uZWxJZCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9FUVVBTElaRVJfTUFYX0NIQU5ORUxfSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEVxdWFsaXplck1heENoYW5uZWxJZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihBdWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0VRVUFMSVpFUl9NQVhfQ0hBTk5FTF9JRCk7XG4gICAgfVxufVxuXG5BdWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX01PRFVMRV9OQU1FID0gJ21vZHVsZU5hbWUnO1xuQXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9NT0RVTEVfSU5GTyA9ICdtb2R1bGVJbmZvJztcbkF1ZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfU09VUkNFX0FWQUlMQUJMRSA9ICdzb3VyY2VBdmFpbGFibGUnO1xuQXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9LRUVQX0NPTlRFWFRfQVZBSUxBQkxFID0gJ2tlZXBDb250ZXh0QXZhaWxhYmxlJztcbkF1ZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfVk9MVU1FX0FWQUlMQUJMRSA9ICd2b2x1bWVBdmFpbGFibGUnO1xuQXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9FUVVBTElaRVJfQVZBSUxBQkxFID0gJ2VxdWFsaXplckF2YWlsYWJsZSc7XG5BdWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0VRVUFMSVpFUl9NQVhfQ0hBTk5FTF9JRCA9ICdlcXVhbGl6ZXJNYXhDaGFubmVsSWQnO1xuXG5leHBvcnQgeyBBdWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgTGlnaHROYW1lIH0gZnJvbSAnLi4vZW51bXMvTGlnaHROYW1lLmpzJztcblxuY2xhc3MgTGlnaHRDYXBhYmlsaXRpZXMgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TGlnaHROYW1lfSBuYW1lXG4gICAgICogQHJldHVybiB7TGlnaHRDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0TmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShMaWdodE5hbWUsIG5hbWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihMaWdodENhcGFiaWxpdGllcy5LRVlfTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0xpZ2h0TmFtZX1cbiAgICAgKi9cbiAgICBnZXROYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KExpZ2h0TmFtZSwgTGlnaHRDYXBhYmlsaXRpZXMuS0VZX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlIC0gSW5kaWNhdGVzIGlmIHRoZSBzdGF0dXMgKE9OL09GRikgY2FuIGJlIHNldCByZW1vdGVseS4gQXBwIHNoYWxsIG5vdCB1c2UgcmVhZC1vbmx5XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgKFJBTVBfVVAvUkFNUF9ET1dOL1VOS05PV04vSU5WQUxJRCkgaW4gYSBzZXRJbnRlcmlvclZlaGljbGVEYXRhIHJlcXVlc3QuXG4gICAgICogQHJldHVybiB7TGlnaHRDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0U3RhdHVzQXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTGlnaHRDYXBhYmlsaXRpZXMuS0VZX1NUQVRVU19BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0U3RhdHVzQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKExpZ2h0Q2FwYWJpbGl0aWVzLktFWV9TVEFUVVNfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIEluZGljYXRlcyBpZiB0aGUgbGlnaHQncyBkZW5zaXR5IGNhbiBiZSBzZXQgcmVtb3RlbHkgKHNpbWlsYXIgdG8gYSBkaW1tZXIpLlxuICAgICAqIEByZXR1cm4ge0xpZ2h0Q2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldERlbnNpdHlBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihMaWdodENhcGFiaWxpdGllcy5LRVlfREVOU0lUWV9BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RGVuc2l0eUF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihMaWdodENhcGFiaWxpdGllcy5LRVlfREVOU0lUWV9BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlIC0gSW5kaWNhdGVzIGlmIHRoZSBsaWdodCdzIGNvbG9yIGNhbiBiZSBzZXQgcmVtb3RlbHkgYnkgdXNpbmcgdGhlIHNSR0IgY29sb3Igc3BhY2UuXG4gICAgICogQHJldHVybiB7TGlnaHRDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0UmdiQ29sb3JTcGFjZUF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKExpZ2h0Q2FwYWJpbGl0aWVzLktFWV9SR0JfQ09MT1JfU1BBQ0VfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFJnYkNvbG9yU3BhY2VBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoTGlnaHRDYXBhYmlsaXRpZXMuS0VZX1JHQl9DT0xPUl9TUEFDRV9BVkFJTEFCTEUpO1xuICAgIH1cbn1cblxuTGlnaHRDYXBhYmlsaXRpZXMuS0VZX05BTUUgPSAnbmFtZSc7XG5MaWdodENhcGFiaWxpdGllcy5LRVlfU1RBVFVTX0FWQUlMQUJMRSA9ICdzdGF0dXNBdmFpbGFibGUnO1xuTGlnaHRDYXBhYmlsaXRpZXMuS0VZX0RFTlNJVFlfQVZBSUxBQkxFID0gJ2RlbnNpdHlBdmFpbGFibGUnO1xuTGlnaHRDYXBhYmlsaXRpZXMuS0VZX1JHQl9DT0xPUl9TUEFDRV9BVkFJTEFCTEUgPSAncmdiQ29sb3JTcGFjZUF2YWlsYWJsZSc7XG5cbmV4cG9ydCB7IExpZ2h0Q2FwYWJpbGl0aWVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IExpZ2h0Q2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9MaWdodENhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBNb2R1bGVJbmZvIH0gZnJvbSAnLi9Nb2R1bGVJbmZvLmpzJztcblxuY2xhc3MgTGlnaHRDb250cm9sQ2FwYWJpbGl0aWVzIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFRoZSBzaG9ydCBmcmllbmRseSBuYW1lIG9mIHRoZSBsaWdodCBjb250cm9sIG1vZHVsZS4gSXQgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGlkZW50aWZ5IGFcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBieSBtb2JpbGUgYXBwbGljYXRpb24uXG4gICAgICogQHJldHVybiB7TGlnaHRDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldE1vZHVsZU5hbWUgKG5hbWUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTGlnaHRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9NT0RVTEVfTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRNb2R1bGVOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKExpZ2h0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TW9kdWxlSW5mb30gaW5mbyAtIEluZm9ybWF0aW9uIGFib3V0IGEgUkMgbW9kdWxlLCBpbmNsdWRpbmcgaXRzIGlkLlxuICAgICAqIEByZXR1cm4ge0xpZ2h0Q29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRNb2R1bGVJbmZvIChpbmZvKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKE1vZHVsZUluZm8sIGluZm8pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihMaWdodENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX01PRFVMRV9JTkZPLCBpbmZvKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TW9kdWxlSW5mb31cbiAgICAgKi9cbiAgICBnZXRNb2R1bGVJbmZvICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KE1vZHVsZUluZm8sIExpZ2h0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX0lORk8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TGlnaHRDYXBhYmlsaXRpZXNbXX0gbGlnaHRzIC0gQW4gYXJyYXkgb2YgYXZhaWxhYmxlIExpZ2h0Q2FwYWJpbGl0aWVzIHRoYXQgYXJlIGNvbnRyb2xsYWJsZS5cbiAgICAgKiBAcmV0dXJuIHtMaWdodENvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0U3VwcG9ydGVkTGlnaHRzIChsaWdodHMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTGlnaHRDYXBhYmlsaXRpZXMsIGxpZ2h0cywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKExpZ2h0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfU1VQUE9SVEVEX0xJR0hUUywgbGlnaHRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TGlnaHRDYXBhYmlsaXRpZXNbXX1cbiAgICAgKi9cbiAgICBnZXRTdXBwb3J0ZWRMaWdodHMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTGlnaHRDYXBhYmlsaXRpZXMsIExpZ2h0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfU1VQUE9SVEVEX0xJR0hUUyk7XG4gICAgfVxufVxuXG5MaWdodENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX01PRFVMRV9OQU1FID0gJ21vZHVsZU5hbWUnO1xuTGlnaHRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9NT0RVTEVfSU5GTyA9ICdtb2R1bGVJbmZvJztcbkxpZ2h0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfU1VQUE9SVEVEX0xJR0hUUyA9ICdzdXBwb3J0ZWRMaWdodHMnO1xuXG5leHBvcnQgeyBMaWdodENvbnRyb2xDYXBhYmlsaXRpZXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgRGVmcm9zdFpvbmUgfSBmcm9tICcuLi9lbnVtcy9EZWZyb3N0Wm9uZS5qcyc7XG5pbXBvcnQgeyBWZW50aWxhdGlvbk1vZGUgfSBmcm9tICcuLi9lbnVtcy9WZW50aWxhdGlvbk1vZGUuanMnO1xuaW1wb3J0IHsgTW9kdWxlSW5mbyB9IGZyb20gJy4vTW9kdWxlSW5mby5qcyc7XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBjbGltYXRlIGNvbnRyb2wgbW9kdWxlJ3MgY2FwYWJpbGl0aWVzLlxuICovXG5jbGFzcyBDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcyBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBUaGUgc2hvcnQgZnJpZW5kbHkgbmFtZSBvZiB0aGUgY2xpbWF0ZSBjb250cm9sIG1vZHVsZS4gSXQgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGlkZW50aWZ5IGFcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBieSBtb2JpbGUgYXBwbGljYXRpb24uXG4gICAgICogQHJldHVybiB7Q2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0TW9kdWxlTmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0TW9kdWxlTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TW9kdWxlSW5mb30gaW5mbyAtIEluZm9ybWF0aW9uIGFib3V0IGEgUkMgbW9kdWxlLCBpbmNsdWRpbmcgaXRzIGlkLlxuICAgICAqIEByZXR1cm4ge0NsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldE1vZHVsZUluZm8gKGluZm8pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTW9kdWxlSW5mbywgaW5mbyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9NT0RVTEVfSU5GTywgaW5mbyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge01vZHVsZUluZm99XG4gICAgICovXG4gICAgZ2V0TW9kdWxlSW5mbyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNb2R1bGVJbmZvLCBDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX0lORk8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlIC0gQXZhaWxhYmlsaXR5IG9mIHRoZSByZWFkaW5nIG9mIGN1cnJlbnQgdGVtcGVyYXR1cmUuIFRydWU6IEF2YWlsYWJsZSwgRmFsc2U6IE5vdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlLCBOb3QgcHJlc2VudDogTm90IEF2YWlsYWJsZS5cbiAgICAgKiBAcmV0dXJuIHtDbGltYXRlQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRDdXJyZW50VGVtcGVyYXR1cmVBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfQ1VSUkVOVF9URU1QRVJBVFVSRV9BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0Q3VycmVudFRlbXBlcmF0dXJlQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9DVVJSRU5UX1RFTVBFUkFUVVJFX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGUgLSBBdmFpbGFiaWxpdHkgb2YgdGhlIGNvbnRyb2wgb2YgZmFuIHNwZWVkLiBUcnVlOiBBdmFpbGFibGUsIEZhbHNlOiBOb3QgQXZhaWxhYmxlLCBOb3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnQ6IE5vdCBBdmFpbGFibGUuXG4gICAgICogQHJldHVybiB7Q2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0RmFuU3BlZWRBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfRkFOX1NQRUVEX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRGYW5TcGVlZEF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfRkFOX1NQRUVEX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGUgLSBBdmFpbGFiaWxpdHkgb2YgdGhlIGNvbnRyb2wgb2YgZGVzaXJlZCB0ZW1wZXJhdHVyZS4gVHJ1ZTogQXZhaWxhYmxlLCBGYWxzZTogTm90XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmFpbGFibGUsIE5vdCBwcmVzZW50OiBOb3QgQXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm4ge0NsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldERlc2lyZWRUZW1wZXJhdHVyZUF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9ERVNJUkVEX1RFTVBFUkFUVVJFX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXREZXNpcmVkVGVtcGVyYXR1cmVBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0RFU0lSRURfVEVNUEVSQVRVUkVfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIEF2YWlsYWJpbGl0eSBvZiB0aGUgY29udHJvbCBvZiB0dXJuIG9uL29mZiBBQy4gVHJ1ZTogQXZhaWxhYmxlLCBGYWxzZTogTm90XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmFpbGFibGUsIE5vdCBwcmVzZW50OiBOb3QgQXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm4ge0NsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldEFjRW5hYmxlQXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0FDX0VOQUJMRV9BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0QWNFbmFibGVBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0FDX0VOQUJMRV9BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlIC0gQXZhaWxhYmlsaXR5IG9mIHRoZSBjb250cm9sIG9mIGVuYWJsZS9kaXNhYmxlIGFpciBjb25kaXRpb25pbmcgaXMgT04gb24gdGhlIG1heGltdW1cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLiBUcnVlOiBBdmFpbGFibGUsIEZhbHNlOiBOb3QgQXZhaWxhYmxlLCBOb3QgcHJlc2VudDogTm90IEF2YWlsYWJsZS5cbiAgICAgKiBAcmV0dXJuIHtDbGltYXRlQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRBY01heEVuYWJsZUF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9BQ19NQVhfRU5BQkxFX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRBY01heEVuYWJsZUF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfQUNfTUFYX0VOQUJMRV9BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlIC0gQXZhaWxhYmlsaXR5IG9mIHRoZSBjb250cm9sIG9mIGVuYWJsZS9kaXNhYmxlIGNpcmN1bGF0ZSBBaXIgbW9kZS4gVHJ1ZTogQXZhaWxhYmxlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2U6IE5vdCBBdmFpbGFibGUsIE5vdCBwcmVzZW50OiBOb3QgQXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm4ge0NsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldENpcmN1bGF0ZUFpckVuYWJsZUF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9DSVJDVUxBVEVfQUlSX0VOQUJMRV9BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0Q2lyY3VsYXRlQWlyRW5hYmxlQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9DSVJDVUxBVEVfQUlSX0VOQUJMRV9BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlIC0gQXZhaWxhYmlsaXR5IG9mIHRoZSBjb250cm9sIG9mIGVuYWJsZS9kaXNhYmxlIGF1dG8gbW9kZS4gVHJ1ZTogQXZhaWxhYmxlLCBGYWxzZTogTm90XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmFpbGFibGUsIE5vdCBwcmVzZW50OiBOb3QgQXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm4ge0NsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldEF1dG9Nb2RlRW5hYmxlQXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0FVVE9fTU9ERV9FTkFCTEVfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEF1dG9Nb2RlRW5hYmxlQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9BVVRPX01PREVfRU5BQkxFX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGUgLSBBdmFpbGFiaWxpdHkgb2YgdGhlIGNvbnRyb2wgb2YgZW5hYmxlL2Rpc2FibGUgZHVhbCBtb2RlLiBUcnVlOiBBdmFpbGFibGUsIEZhbHNlOiBOb3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZSwgTm90IHByZXNlbnQ6IE5vdCBBdmFpbGFibGUuXG4gICAgICogQHJldHVybiB7Q2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0RHVhbE1vZGVFbmFibGVBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfRFVBTF9NT0RFX0VOQUJMRV9BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RHVhbE1vZGVFbmFibGVBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0RVQUxfTU9ERV9FTkFCTEVfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIEF2YWlsYWJpbGl0eSBvZiB0aGUgY29udHJvbCBvZiBkZWZyb3N0IHpvbmVzLiBUcnVlOiBBdmFpbGFibGUsIEZhbHNlOiBOb3QgQXZhaWxhYmxlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHByZXNlbnQ6IE5vdCBBdmFpbGFibGUuXG4gICAgICogQHJldHVybiB7Q2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0RGVmcm9zdFpvbmVBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfREVGUk9TVF9aT05FX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXREZWZyb3N0Wm9uZUF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfREVGUk9TVF9aT05FX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtEZWZyb3N0Wm9uZVtdfSB6b25lIC0gQSBzZXQgb2YgYWxsIGRlZnJvc3Qgem9uZXMgdGhhdCBhcmUgY29udHJvbGxhYmxlLlxuICAgICAqIEByZXR1cm4ge0NsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldERlZnJvc3Rab25lICh6b25lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKERlZnJvc3Rab25lLCB6b25lLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0RFRlJPU1RfWk9ORSwgem9uZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0RlZnJvc3Rab25lW119XG4gICAgICovXG4gICAgZ2V0RGVmcm9zdFpvbmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoRGVmcm9zdFpvbmUsIENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9ERUZST1NUX1pPTkUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlIC0gQXZhaWxhYmlsaXR5IG9mIHRoZSBjb250cm9sIG9mIGFpciB2ZW50aWxhdGlvbiBtb2RlLiBUcnVlOiBBdmFpbGFibGUsIEZhbHNlOiBOb3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZSwgTm90IHByZXNlbnQ6IE5vdCBBdmFpbGFibGUuXG4gICAgICogQHJldHVybiB7Q2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0VmVudGlsYXRpb25Nb2RlQXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1ZFTlRJTEFUSU9OX01PREVfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFZlbnRpbGF0aW9uTW9kZUF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfVkVOVElMQVRJT05fTU9ERV9BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVudGlsYXRpb25Nb2RlW119IG1vZGUgLSBBIHNldCBvZiBhbGwgdmVudGlsYXRpb24gbW9kZXMgdGhhdCBhcmUgY29udHJvbGxhYmxlLlxuICAgICAqIEByZXR1cm4ge0NsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldFZlbnRpbGF0aW9uTW9kZSAobW9kZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShWZW50aWxhdGlvbk1vZGUsIG1vZGUsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfVkVOVElMQVRJT05fTU9ERSwgbW9kZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlbnRpbGF0aW9uTW9kZVtdfVxuICAgICAqL1xuICAgIGdldFZlbnRpbGF0aW9uTW9kZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZW50aWxhdGlvbk1vZGUsIENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9WRU5USUxBVElPTl9NT0RFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIEF2YWlsYWJpbGl0eSBvZiB0aGUgY29udHJvbCAoZW5hYmxlL2Rpc2FibGUpIG9mIGhlYXRlZCBTdGVlcmluZyBXaGVlbC4gVHJ1ZTpcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZSwgRmFsc2U6IE5vdCBBdmFpbGFibGUsIE5vdCBwcmVzZW50OiBOb3QgQXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm4ge0NsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldEhlYXRlZFN0ZWVyaW5nV2hlZWxBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfSEVBVEVEX1NURUVSSU5HX1dIRUVMX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRIZWF0ZWRTdGVlcmluZ1doZWVsQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9IRUFURURfU1RFRVJJTkdfV0hFRUxfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIEF2YWlsYWJpbGl0eSBvZiB0aGUgY29udHJvbCAoZW5hYmxlL2Rpc2FibGUpIG9mIGhlYXRlZCBXaW5kc2hpZWxkLiBUcnVlOiBBdmFpbGFibGUsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZTogTm90IEF2YWlsYWJsZSwgTm90IHByZXNlbnQ6IE5vdCBBdmFpbGFibGUuXG4gICAgICogQHJldHVybiB7Q2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0SGVhdGVkV2luZHNoaWVsZEF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9IRUFURURfV0lORFNISUVMRF9BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0SGVhdGVkV2luZHNoaWVsZEF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfSEVBVEVEX1dJTkRTSElFTERfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIEF2YWlsYWJpbGl0eSBvZiB0aGUgY29udHJvbCAoZW5hYmxlL2Rpc2FibGUpIG9mIGhlYXRlZCBSZWFyIFdpbmRvdy4gVHJ1ZTogQXZhaWxhYmxlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2U6IE5vdCBBdmFpbGFibGUsIE5vdCBwcmVzZW50OiBOb3QgQXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm4ge0NsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldEhlYXRlZFJlYXJXaW5kb3dBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfSEVBVEVEX1JFQVJfV0lORE9XX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRIZWF0ZWRSZWFyV2luZG93QXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9IRUFURURfUkVBUl9XSU5ET1dfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIEF2YWlsYWJpbGl0eSBvZiB0aGUgY29udHJvbCAoZW5hYmxlL2Rpc2FibGUpIG9mIGhlYXRlZCBNaXJyb3JzLiBUcnVlOiBBdmFpbGFibGUsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZTogTm90IEF2YWlsYWJsZSwgTm90IHByZXNlbnQ6IE5vdCBBdmFpbGFibGUuXG4gICAgICogQHJldHVybiB7Q2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0SGVhdGVkTWlycm9yc0F2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9IRUFURURfTUlSUk9SU19BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0SGVhdGVkTWlycm9yc0F2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfSEVBVEVEX01JUlJPUlNfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIEF2YWlsYWJpbGl0eSBvZiB0aGUgY29udHJvbCBvZiBlbmFibGUvZGlzYWJsZSBjbGltYXRlIGNvbnRyb2wuIFRydWU6IEF2YWlsYWJsZSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlOiBOb3QgQXZhaWxhYmxlLCBOb3QgcHJlc2VudDogTm90IEF2YWlsYWJsZS5cbiAgICAgKiBAcmV0dXJuIHtDbGltYXRlQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRDbGltYXRlRW5hYmxlQXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0NMSU1BVEVfRU5BQkxFX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRDbGltYXRlRW5hYmxlQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9DTElNQVRFX0VOQUJMRV9BVkFJTEFCTEUpO1xuICAgIH1cbn1cblxuQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX01PRFVMRV9OQU1FID0gJ21vZHVsZU5hbWUnO1xuQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX01PRFVMRV9JTkZPID0gJ21vZHVsZUluZm8nO1xuQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0NVUlJFTlRfVEVNUEVSQVRVUkVfQVZBSUxBQkxFID0gJ2N1cnJlbnRUZW1wZXJhdHVyZUF2YWlsYWJsZSc7XG5DbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfRkFOX1NQRUVEX0FWQUlMQUJMRSA9ICdmYW5TcGVlZEF2YWlsYWJsZSc7XG5DbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfREVTSVJFRF9URU1QRVJBVFVSRV9BVkFJTEFCTEUgPSAnZGVzaXJlZFRlbXBlcmF0dXJlQXZhaWxhYmxlJztcbkNsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9BQ19FTkFCTEVfQVZBSUxBQkxFID0gJ2FjRW5hYmxlQXZhaWxhYmxlJztcbkNsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9BQ19NQVhfRU5BQkxFX0FWQUlMQUJMRSA9ICdhY01heEVuYWJsZUF2YWlsYWJsZSc7XG5DbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfQ0lSQ1VMQVRFX0FJUl9FTkFCTEVfQVZBSUxBQkxFID0gJ2NpcmN1bGF0ZUFpckVuYWJsZUF2YWlsYWJsZSc7XG5DbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfQVVUT19NT0RFX0VOQUJMRV9BVkFJTEFCTEUgPSAnYXV0b01vZGVFbmFibGVBdmFpbGFibGUnO1xuQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0RVQUxfTU9ERV9FTkFCTEVfQVZBSUxBQkxFID0gJ2R1YWxNb2RlRW5hYmxlQXZhaWxhYmxlJztcbkNsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9ERUZST1NUX1pPTkVfQVZBSUxBQkxFID0gJ2RlZnJvc3Rab25lQXZhaWxhYmxlJztcbkNsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9ERUZST1NUX1pPTkUgPSAnZGVmcm9zdFpvbmUnO1xuQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1ZFTlRJTEFUSU9OX01PREVfQVZBSUxBQkxFID0gJ3ZlbnRpbGF0aW9uTW9kZUF2YWlsYWJsZSc7XG5DbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfVkVOVElMQVRJT05fTU9ERSA9ICd2ZW50aWxhdGlvbk1vZGUnO1xuQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0hFQVRFRF9TVEVFUklOR19XSEVFTF9BVkFJTEFCTEUgPSAnaGVhdGVkU3RlZXJpbmdXaGVlbEF2YWlsYWJsZSc7XG5DbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfSEVBVEVEX1dJTkRTSElFTERfQVZBSUxBQkxFID0gJ2hlYXRlZFdpbmRzaGllbGRBdmFpbGFibGUnO1xuQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0hFQVRFRF9SRUFSX1dJTkRPV19BVkFJTEFCTEUgPSAnaGVhdGVkUmVhcldpbmRvd0F2YWlsYWJsZSc7XG5DbGltYXRlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfSEVBVEVEX01JUlJPUlNfQVZBSUxBQkxFID0gJ2hlYXRlZE1pcnJvcnNBdmFpbGFibGUnO1xuQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0NMSU1BVEVfRU5BQkxFX0FWQUlMQUJMRSA9ICdjbGltYXRlRW5hYmxlQXZhaWxhYmxlJztcblxuZXhwb3J0IHsgQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgTW9kdWxlSW5mbyB9IGZyb20gJy4vTW9kdWxlSW5mby5qcyc7XG5cbmNsYXNzIFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFRoZSBzaG9ydCBmcmllbmRseSBuYW1lIG9mIHRoZSBsaWdodCBjb250cm9sIG1vZHVsZS4gSXQgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGlkZW50aWZ5IGFcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBieSBtb2JpbGUgYXBwbGljYXRpb24uXG4gICAgICogQHJldHVybiB7U2VhdENvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0TW9kdWxlTmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0TW9kdWxlTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TW9kdWxlSW5mb30gaW5mbyAtIEluZm9ybWF0aW9uIGFib3V0IGEgUkMgbW9kdWxlLCBpbmNsdWRpbmcgaXRzIGlkLlxuICAgICAqIEByZXR1cm4ge1NlYXRDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldE1vZHVsZUluZm8gKGluZm8pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTW9kdWxlSW5mbywgaW5mbyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9NT0RVTEVfSU5GTywgaW5mbyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge01vZHVsZUluZm99XG4gICAgICovXG4gICAgZ2V0TW9kdWxlSW5mbyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNb2R1bGVJbmZvLCBTZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX0lORk8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlXG4gICAgICogQHJldHVybiB7U2VhdENvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0SGVhdGluZ0VuYWJsZWRBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfSEVBVElOR19FTkFCTEVEX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRIZWF0aW5nRW5hYmxlZEF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfSEVBVElOR19FTkFCTEVEX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGVcbiAgICAgKiBAcmV0dXJuIHtTZWF0Q29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRDb29saW5nRW5hYmxlZEF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9DT09MSU5HX0VOQUJMRURfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldENvb2xpbmdFbmFibGVkQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9DT09MSU5HX0VOQUJMRURfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZVxuICAgICAqIEByZXR1cm4ge1NlYXRDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldEhlYXRpbmdMZXZlbEF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9IRUFUSU5HX0xFVkVMX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRIZWF0aW5nTGV2ZWxBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0hFQVRJTkdfTEVWRUxfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZVxuICAgICAqIEByZXR1cm4ge1NlYXRDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldENvb2xpbmdMZXZlbEF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9DT09MSU5HX0xFVkVMX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRDb29saW5nTGV2ZWxBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0NPT0xJTkdfTEVWRUxfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZVxuICAgICAqIEByZXR1cm4ge1NlYXRDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldEhvcml6b250YWxQb3NpdGlvbkF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9IT1JJWk9OVEFMX1BPU0lUSU9OX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRIb3Jpem9udGFsUG9zaXRpb25BdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0hPUklaT05UQUxfUE9TSVRJT05fQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZVxuICAgICAqIEByZXR1cm4ge1NlYXRDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldFZlcnRpY2FsUG9zaXRpb25BdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfVkVSVElDQUxfUE9TSVRJT05fQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFZlcnRpY2FsUG9zaXRpb25BdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1ZFUlRJQ0FMX1BPU0lUSU9OX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGVcbiAgICAgKiBAcmV0dXJuIHtTZWF0Q29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRGcm9udFZlcnRpY2FsUG9zaXRpb25BdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfRlJPTlRfVkVSVElDQUxfUE9TSVRJT05fQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEZyb250VmVydGljYWxQb3NpdGlvbkF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfRlJPTlRfVkVSVElDQUxfUE9TSVRJT05fQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZVxuICAgICAqIEByZXR1cm4ge1NlYXRDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldEJhY2tWZXJ0aWNhbFBvc2l0aW9uQXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0JBQ0tfVkVSVElDQUxfUE9TSVRJT05fQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEJhY2tWZXJ0aWNhbFBvc2l0aW9uQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9CQUNLX1ZFUlRJQ0FMX1BPU0lUSU9OX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGVcbiAgICAgKiBAcmV0dXJuIHtTZWF0Q29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRCYWNrVGlsdEFuZ2xlQXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0JBQ0tfVElMVF9BTkdMRV9BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0QmFja1RpbHRBbmdsZUF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfQkFDS19USUxUX0FOR0xFX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGVcbiAgICAgKiBAcmV0dXJuIHtTZWF0Q29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRIZWFkU3VwcG9ydEhvcml6b250YWxQb3NpdGlvbkF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9IRUFEX1NVUFBPUlRfSE9SSVpPTlRBTF9QT1NJVElPTl9BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0SGVhZFN1cHBvcnRIb3Jpem9udGFsUG9zaXRpb25BdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0hFQURfU1VQUE9SVF9IT1JJWk9OVEFMX1BPU0lUSU9OX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGVcbiAgICAgKiBAcmV0dXJuIHtTZWF0Q29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRIZWFkU3VwcG9ydFZlcnRpY2FsUG9zaXRpb25BdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfSEVBRF9TVVBQT1JUX1ZFUlRJQ0FMX1BPU0lUSU9OX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRIZWFkU3VwcG9ydFZlcnRpY2FsUG9zaXRpb25BdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0hFQURfU1VQUE9SVF9WRVJUSUNBTF9QT1NJVElPTl9BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlXG4gICAgICogQHJldHVybiB7U2VhdENvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0TWFzc2FnZUVuYWJsZWRBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfTUFTU0FHRV9FTkFCTEVEX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRNYXNzYWdlRW5hYmxlZEF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfTUFTU0FHRV9FTkFCTEVEX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGVcbiAgICAgKiBAcmV0dXJuIHtTZWF0Q29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRNYXNzYWdlTW9kZUF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9NQVNTQUdFX01PREVfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldE1hc3NhZ2VNb2RlQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9NQVNTQUdFX01PREVfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZVxuICAgICAqIEByZXR1cm4ge1NlYXRDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldE1hc3NhZ2VDdXNoaW9uRmlybW5lc3NBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfTUFTU0FHRV9DVVNISU9OX0ZJUk1ORVNTX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRNYXNzYWdlQ3VzaGlvbkZpcm1uZXNzQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9NQVNTQUdFX0NVU0hJT05fRklSTU5FU1NfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZVxuICAgICAqIEByZXR1cm4ge1NlYXRDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldE1lbW9yeUF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9NRU1PUllfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldE1lbW9yeUF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfTUVNT1JZX0FWQUlMQUJMRSk7XG4gICAgfVxufVxuXG5TZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX05BTUUgPSAnbW9kdWxlTmFtZSc7XG5TZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX0lORk8gPSAnbW9kdWxlSW5mbyc7XG5TZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfSEVBVElOR19FTkFCTEVEX0FWQUlMQUJMRSA9ICdoZWF0aW5nRW5hYmxlZEF2YWlsYWJsZSc7XG5TZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfQ09PTElOR19FTkFCTEVEX0FWQUlMQUJMRSA9ICdjb29saW5nRW5hYmxlZEF2YWlsYWJsZSc7XG5TZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfSEVBVElOR19MRVZFTF9BVkFJTEFCTEUgPSAnaGVhdGluZ0xldmVsQXZhaWxhYmxlJztcblNlYXRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9DT09MSU5HX0xFVkVMX0FWQUlMQUJMRSA9ICdjb29saW5nTGV2ZWxBdmFpbGFibGUnO1xuU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0hPUklaT05UQUxfUE9TSVRJT05fQVZBSUxBQkxFID0gJ2hvcml6b250YWxQb3NpdGlvbkF2YWlsYWJsZSc7XG5TZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfVkVSVElDQUxfUE9TSVRJT05fQVZBSUxBQkxFID0gJ3ZlcnRpY2FsUG9zaXRpb25BdmFpbGFibGUnO1xuU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0ZST05UX1ZFUlRJQ0FMX1BPU0lUSU9OX0FWQUlMQUJMRSA9ICdmcm9udFZlcnRpY2FsUG9zaXRpb25BdmFpbGFibGUnO1xuU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0JBQ0tfVkVSVElDQUxfUE9TSVRJT05fQVZBSUxBQkxFID0gJ2JhY2tWZXJ0aWNhbFBvc2l0aW9uQXZhaWxhYmxlJztcblNlYXRDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9CQUNLX1RJTFRfQU5HTEVfQVZBSUxBQkxFID0gJ2JhY2tUaWx0QW5nbGVBdmFpbGFibGUnO1xuU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0hFQURfU1VQUE9SVF9IT1JJWk9OVEFMX1BPU0lUSU9OX0FWQUlMQUJMRSA9ICdoZWFkU3VwcG9ydEhvcml6b250YWxQb3NpdGlvbkF2YWlsYWJsZSc7XG5TZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfSEVBRF9TVVBQT1JUX1ZFUlRJQ0FMX1BPU0lUSU9OX0FWQUlMQUJMRSA9ICdoZWFkU3VwcG9ydFZlcnRpY2FsUG9zaXRpb25BdmFpbGFibGUnO1xuU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX01BU1NBR0VfRU5BQkxFRF9BVkFJTEFCTEUgPSAnbWFzc2FnZUVuYWJsZWRBdmFpbGFibGUnO1xuU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX01BU1NBR0VfTU9ERV9BVkFJTEFCTEUgPSAnbWFzc2FnZU1vZGVBdmFpbGFibGUnO1xuU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX01BU1NBR0VfQ1VTSElPTl9GSVJNTkVTU19BVkFJTEFCTEUgPSAnbWFzc2FnZUN1c2hpb25GaXJtbmVzc0F2YWlsYWJsZSc7XG5TZWF0Q29udHJvbENhcGFiaWxpdGllcy5LRVlfTUVNT1JZX0FWQUlMQUJMRSA9ICdtZW1vcnlBdmFpbGFibGUnO1xuXG5leHBvcnQgeyBTZWF0Q29udHJvbENhcGFiaWxpdGllcyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBNb2R1bGVJbmZvIH0gZnJvbSAnLi9Nb2R1bGVJbmZvLmpzJztcblxuLyoqXG4gKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHJhZGlvIGNvbnRyb2wgbW9kdWxlJ3MgY2FwYWJpbGl0aWVzLlxuICovXG5jbGFzcyBSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIHNob3J0IGZyaWVuZGx5IG5hbWUgb2YgdGhlIGNsaW1hdGUgY29udHJvbCBtb2R1bGUuIEl0IHNob3VsZCBub3QgYmUgdXNlZCB0byBpZGVudGlmeSBhXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgYnkgbW9iaWxlIGFwcGxpY2F0aW9uLlxuICAgICAqIEByZXR1cm4ge1JhZGlvQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRNb2R1bGVOYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0TW9kdWxlTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX01PRFVMRV9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01vZHVsZUluZm99IGluZm8gLSBJbmZvcm1hdGlvbiBhYm91dCBhIFJDIG1vZHVsZSwgaW5jbHVkaW5nIGl0cyBpZC5cbiAgICAgKiBAcmV0dXJuIHtSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0TW9kdWxlSW5mbyAoaW5mbykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNb2R1bGVJbmZvLCBpbmZvKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9NT0RVTEVfSU5GTywgaW5mbyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge01vZHVsZUluZm99XG4gICAgICovXG4gICAgZ2V0TW9kdWxlSW5mbyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNb2R1bGVJbmZvLCBSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX01PRFVMRV9JTkZPKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIEF2YWlsYWJpbGl0eSBvZiB0aGUgY29udHJvbCBvZiBlbmFibGUvZGlzYWJsZSByYWRpby4gVHJ1ZTogQXZhaWxhYmxlLCBGYWxzZTogTm90XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmFpbGFibGUsIE5vdCBwcmVzZW50OiBOb3QgQXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm4ge1JhZGlvQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRSYWRpb0VuYWJsZUF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfUkFESU9fRU5BQkxFX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRSYWRpb0VuYWJsZUF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1JBRElPX0VOQUJMRV9BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlIC0gQXZhaWxhYmlsaXR5IG9mIHRoZSBjb250cm9sIG9mIHJhZGlvIGJhbmQuIFRydWU6IEF2YWlsYWJsZSwgRmFsc2U6IE5vdCBBdmFpbGFibGUsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgcHJlc2VudDogTm90IEF2YWlsYWJsZS5cbiAgICAgKiBAcmV0dXJuIHtSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0UmFkaW9CYW5kQXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9SQURJT19CQU5EX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRSYWRpb0JhbmRBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9SQURJT19CQU5EX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGUgLSBBdmFpbGFiaWxpdHkgb2YgdGhlIGNvbnRyb2wgb2YgcmFkaW8gZnJlcXVlbmN5LiBUcnVlOiBBdmFpbGFibGUsIEZhbHNlOiBOb3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZSwgTm90IHByZXNlbnQ6IE5vdCBBdmFpbGFibGUuXG4gICAgICogQHJldHVybiB7UmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldFJhZGlvRnJlcXVlbmN5QXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9SQURJT19GUkVRVUVOQ1lfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFJhZGlvRnJlcXVlbmN5QXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfUkFESU9fRlJFUVVFTkNZX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGUgLSBBdmFpbGFiaWxpdHkgb2YgdGhlIGNvbnRyb2wgb2YgSEQgcmFkaW8gY2hhbm5lbC4gVHJ1ZTogQXZhaWxhYmxlLCBGYWxzZTogTm90XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmFpbGFibGUsIE5vdCBwcmVzZW50OiBOb3QgQXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm4ge1JhZGlvQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRIZENoYW5uZWxBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0hEX0NIQU5ORUxfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEhkQ2hhbm5lbEF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0hEX0NIQU5ORUxfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIEF2YWlsYWJpbGl0eSBvZiB0aGUgZ2V0dGluZyBSYWRpbyBEYXRhIFN5c3RlbSAoUkRTKSBkYXRhLiBUcnVlOiBBdmFpbGFibGUsIEZhbHNlOlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IEF2YWlsYWJsZSwgTm90IHByZXNlbnQ6IE5vdCBBdmFpbGFibGUuXG4gICAgICogQHJldHVybiB7UmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldFJkc0RhdGFBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1JEU19EQVRBX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRSZHNEYXRhQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfUkRTX0RBVEFfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIEF2YWlsYWJpbGl0eSBvZiB0aGUgZ2V0dGluZyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBIRCBjaGFubmVscy4gVHJ1ZTogQXZhaWxhYmxlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2U6IE5vdCBBdmFpbGFibGUsIE5vdCBwcmVzZW50OiBOb3QgQXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm4ge1JhZGlvQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRBdmFpbGFibGVIRHNBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0FWQUlMQUJMRV9IRFNfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEF2YWlsYWJsZUhEc0F2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0FWQUlMQUJMRV9IRFNfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIEF2YWlsYWJpbGl0eSBvZiB0aGUgbGlzdCBvZiBhdmFpbGFibGUgSEQgc3ViLWNoYW5uZWwgaW5kZXhlcy4gVHJ1ZTogQXZhaWxhYmxlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2U6IE5vdCBBdmFpbGFibGUsIE5vdCBwcmVzZW50OiBOb3QgQXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm4ge1JhZGlvQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRBdmFpbGFibGVIZENoYW5uZWxzQXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9BVkFJTEFCTEVfSERfQ0hBTk5FTFNfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEF2YWlsYWJsZUhkQ2hhbm5lbHNBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9BVkFJTEFCTEVfSERfQ0hBTk5FTFNfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIEF2YWlsYWJpbGl0eSBvZiB0aGUgZ2V0dGluZyB0aGUgUmFkaW8gc3RhdGUuIFRydWU6IEF2YWlsYWJsZSwgRmFsc2U6IE5vdCBBdmFpbGFibGUsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgcHJlc2VudDogTm90IEF2YWlsYWJsZS5cbiAgICAgKiBAcmV0dXJuIHtSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0U3RhdGVBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1NUQVRFX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRTdGF0ZUF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1NUQVRFX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGUgLSBBdmFpbGFiaWxpdHkgb2YgdGhlIGdldHRpbmcgdGhlIHNpZ25hbCBzdHJlbmd0aC4gVHJ1ZTogQXZhaWxhYmxlLCBGYWxzZTogTm90XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmFpbGFibGUsIE5vdCBwcmVzZW50OiBOb3QgQXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm4ge1JhZGlvQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRTaWduYWxTdHJlbmd0aEF2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfU0lHTkFMX1NUUkVOR1RIX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRTaWduYWxTdHJlbmd0aEF2YWlsYWJsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1NJR05BTF9TVFJFTkdUSF9BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlIC0gQXZhaWxhYmlsaXR5IG9mIHRoZSBnZXR0aW5nIHRoZSBzaWduYWwgQ2hhbmdlIFRocmVzaG9sZC4gVHJ1ZTogQXZhaWxhYmxlLCBGYWxzZTogTm90XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmFpbGFibGUsIE5vdCBwcmVzZW50OiBOb3QgQXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm4ge1JhZGlvQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRTaWduYWxDaGFuZ2VUaHJlc2hvbGRBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1NJR05BTF9DSEFOR0VfVEhSRVNIT0xEX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRTaWduYWxDaGFuZ2VUaHJlc2hvbGRBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9TSUdOQUxfQ0hBTkdFX1RIUkVTSE9MRF9BVkFJTEFCTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXZhaWxhYmxlIC0gQXZhaWxhYmlsaXR5IG9mIHRoZSBnZXR0aW5nIEhEIHJhZGlvIFN0YXRpb24gSW5mb3JtYXRpb24gU2VydmljZSAoU0lTKSBkYXRhLiBUcnVlOlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlLCBGYWxzZTogTm90IEF2YWlsYWJsZSwgTm90IHByZXNlbnQ6IE5vdCBBdmFpbGFibGUuXG4gICAgICogQHJldHVybiB7UmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldFNpc0RhdGFBdmFpbGFibGUgKGF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1NJU19EQVRBX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRTaXNEYXRhQXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfU0lTX0RBVEFfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIEF2YWlsYWJpbGl0eSBvZiB0aGUgY29udHJvbCBvZiBlbmFibGUvZGlzYWJsZSBIRCByYWRpby4gVHJ1ZTogQXZhaWxhYmxlLCBGYWxzZTogTm90XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmFpbGFibGUsIE5vdCBwcmVzZW50OiBOb3QgQXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm4ge1JhZGlvQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRIZFJhZGlvRW5hYmxlQXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9IRF9SQURJT19FTkFCTEVfQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEhkUmFkaW9FbmFibGVBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9IRF9SQURJT19FTkFCTEVfQVZBSUxBQkxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF2YWlsYWJsZSAtIEF2YWlsYWJpbGl0eSBvZiBzaXJpdXMgWE0gcmFkaW8uIFRydWU6IEF2YWlsYWJsZSwgRmFsc2U6IE5vdCBBdmFpbGFibGUsIE5vdCBwcmVzZW50OlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IEF2YWlsYWJsZS5cbiAgICAgKiBAcmV0dXJuIHtSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0U2lyaXVzeG1SYWRpb0F2YWlsYWJsZSAoYXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJhZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfU0lSSVVTWE1fUkFESU9fQVZBSUxBQkxFLCBhdmFpbGFibGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFNpcml1c3htUmFkaW9BdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9TSVJJVVNYTV9SQURJT19BVkFJTEFCTEUpO1xuICAgIH1cbn1cblxuUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9NT0RVTEVfTkFNRSA9ICdtb2R1bGVOYW1lJztcblJhZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX0lORk8gPSAnbW9kdWxlSW5mbyc7XG5SYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1JBRElPX0VOQUJMRV9BVkFJTEFCTEUgPSAncmFkaW9FbmFibGVBdmFpbGFibGUnO1xuUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9SQURJT19CQU5EX0FWQUlMQUJMRSA9ICdyYWRpb0JhbmRBdmFpbGFibGUnO1xuUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9SQURJT19GUkVRVUVOQ1lfQVZBSUxBQkxFID0gJ3JhZGlvRnJlcXVlbmN5QXZhaWxhYmxlJztcblJhZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfSERfQ0hBTk5FTF9BVkFJTEFCTEUgPSAnaGRDaGFubmVsQXZhaWxhYmxlJztcblJhZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfUkRTX0RBVEFfQVZBSUxBQkxFID0gJ3Jkc0RhdGFBdmFpbGFibGUnO1xuUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9BVkFJTEFCTEVfSERTX0FWQUlMQUJMRSA9ICdhdmFpbGFibGVIRHNBdmFpbGFibGUnO1xuUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9BVkFJTEFCTEVfSERfQ0hBTk5FTFNfQVZBSUxBQkxFID0gJ2F2YWlsYWJsZUhkQ2hhbm5lbHNBdmFpbGFibGUnO1xuUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9TVEFURV9BVkFJTEFCTEUgPSAnc3RhdGVBdmFpbGFibGUnO1xuUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLktFWV9TSUdOQUxfU1RSRU5HVEhfQVZBSUxBQkxFID0gJ3NpZ25hbFN0cmVuZ3RoQXZhaWxhYmxlJztcblJhZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfU0lHTkFMX0NIQU5HRV9USFJFU0hPTERfQVZBSUxBQkxFID0gJ3NpZ25hbENoYW5nZVRocmVzaG9sZEF2YWlsYWJsZSc7XG5SYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1NJU19EQVRBX0FWQUlMQUJMRSA9ICdzaXNEYXRhQXZhaWxhYmxlJztcblJhZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfSERfUkFESU9fRU5BQkxFX0FWQUlMQUJMRSA9ICdoZFJhZGlvRW5hYmxlQXZhaWxhYmxlJztcblJhZGlvQ29udHJvbENhcGFiaWxpdGllcy5LRVlfU0lSSVVTWE1fUkFESU9fQVZBSUxBQkxFID0gJ3Npcml1c3htUmFkaW9BdmFpbGFibGUnO1xuXG5leHBvcnQgeyBSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgTW9kdWxlSW5mbyB9IGZyb20gJy4vTW9kdWxlSW5mby5qcyc7XG5cbmNsYXNzIEhNSVNldHRpbmdzQ29udHJvbENhcGFiaWxpdGllcyBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBUaGUgc2hvcnQgZnJpZW5kbHkgbmFtZSBvZiB0aGUgaG1pIHNldHRpbmcgbW9kdWxlLiBJdCBzaG91bGQgbm90IGJlIHVzZWQgdG8gaWRlbnRpZnkgYVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIGJ5IG1vYmlsZSBhcHBsaWNhdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtITUlTZXR0aW5nc0NvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0TW9kdWxlTmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihITUlTZXR0aW5nc0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX01PRFVMRV9OQU1FLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldE1vZHVsZU5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoSE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9NT0RVTEVfTkFNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNb2R1bGVJbmZvfSBpbmZvIC0gSW5mb3JtYXRpb24gYWJvdXQgYSBSQyBtb2R1bGUsIGluY2x1ZGluZyBpdHMgaWQuXG4gICAgICogQHJldHVybiB7SE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldE1vZHVsZUluZm8gKGluZm8pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTW9kdWxlSW5mbywgaW5mbyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEhNSVNldHRpbmdzQ29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX0lORk8sIGluZm8pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNb2R1bGVJbmZvfVxuICAgICAqL1xuICAgIGdldE1vZHVsZUluZm8gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTW9kdWxlSW5mbywgSE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9NT0RVTEVfSU5GTyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGUgLSBBdmFpbGFiaWxpdHkgb2YgdGhlIGNvbnRyb2wgb2YgZGlzdGFuY2UgdW5pdC5cbiAgICAgKiBAcmV0dXJuIHtITUlTZXR0aW5nc0NvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0RGlzdGFuY2VVbml0QXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9ESVNUQU5DRV9VTklUX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXREaXN0YW5jZVVuaXRBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoSE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9ESVNUQU5DRV9VTklUX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGUgLSBBdmFpbGFiaWxpdHkgb2YgdGhlIGNvbnRyb2wgb2YgdGVtcGVyYXR1cmUgdW5pdC5cbiAgICAgKiBAcmV0dXJuIHtITUlTZXR0aW5nc0NvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0VGVtcGVyYXR1cmVVbml0QXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9URU1QRVJBVFVSRV9VTklUX0FWQUlMQUJMRSwgYXZhaWxhYmxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRUZW1wZXJhdHVyZVVuaXRBdmFpbGFibGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoSE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9URU1QRVJBVFVSRV9VTklUX0FWQUlMQUJMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhdmFpbGFibGUgLSBBdmFpbGFiaWxpdHkgb2YgdGhlIGNvbnRyb2wgb2YgSE1JIGRpc3BsYXkgbW9kZS5cbiAgICAgKiBAcmV0dXJuIHtITUlTZXR0aW5nc0NvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0RGlzcGxheU1vZGVVbml0QXZhaWxhYmxlIChhdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9ESVNQTEFZX01PREVfVU5JVF9BVkFJTEFCTEUsIGF2YWlsYWJsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0RGlzcGxheU1vZGVVbml0QXZhaWxhYmxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEhNSVNldHRpbmdzQ29udHJvbENhcGFiaWxpdGllcy5LRVlfRElTUExBWV9NT0RFX1VOSVRfQVZBSUxBQkxFKTtcbiAgICB9XG59XG5cbkhNSVNldHRpbmdzQ29udHJvbENhcGFiaWxpdGllcy5LRVlfTU9EVUxFX05BTUUgPSAnbW9kdWxlTmFtZSc7XG5ITUlTZXR0aW5nc0NvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX01PRFVMRV9JTkZPID0gJ21vZHVsZUluZm8nO1xuSE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9ESVNUQU5DRV9VTklUX0FWQUlMQUJMRSA9ICdkaXN0YW5jZVVuaXRBdmFpbGFibGUnO1xuSE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9URU1QRVJBVFVSRV9VTklUX0FWQUlMQUJMRSA9ICd0ZW1wZXJhdHVyZVVuaXRBdmFpbGFibGUnO1xuSE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9ESVNQTEFZX01PREVfVU5JVF9BVkFJTEFCTEUgPSAnZGlzcGxheU1vZGVVbml0QXZhaWxhYmxlJztcblxuZXhwb3J0IHsgSE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgQXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9BdWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgTGlnaHRDb250cm9sQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9MaWdodENvbnRyb2xDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMgfSBmcm9tICcuL0NsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBCdXR0b25DYXBhYmlsaXRpZXMgfSBmcm9tICcuL0J1dHRvbkNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBTZWF0Q29udHJvbENhcGFiaWxpdGllcyB9IGZyb20gJy4vU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9SYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgSE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9ITUlTZXR0aW5nc0NvbnRyb2xDYXBhYmlsaXRpZXMuanMnO1xuXG5jbGFzcyBSZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0NsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzW119IGNhcGFiaWxpdGllcyAtIElmIGluY2x1ZGVkLCB0aGUgcGxhdGZvcm0gc3VwcG9ydHMgUkMgY2xpbWF0ZSBjb250cm9scy4gRm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJhc2VsaW5lIHZlcnNpb24sIG1heHNpemU9MS4gaS5lLiBvbmx5IG9uZSBjbGltYXRlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sIG1vZHVsZSBpcyBzdXBwb3J0ZWQuXG4gICAgICogQHJldHVybiB7UmVtb3RlQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcyAoY2FwYWJpbGl0aWVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9DTElNQVRFX0NPTlRST0xfQ0FQQUJJTElUSUVTLCBjYXBhYmlsaXRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtDbGltYXRlQ29udHJvbENhcGFiaWxpdGllc1tdfVxuICAgICAqL1xuICAgIGdldENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLCBSZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9DTElNQVRFX0NPTlRST0xfQ0FQQUJJTElUSUVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1JhZGlvQ29udHJvbENhcGFiaWxpdGllc1tdfSBjYXBhYmlsaXRpZXMgLSBJZiBpbmNsdWRlZCwgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIFJDIHJhZGlvIGNvbnRyb2xzLkZvciB0aGlzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWxpbmUgdmVyc2lvbiwgbWF4c2l6ZT0xLiBpLmUuIG9ubHkgb25lIHJhZGlvIGNvbnRyb2xcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgaXMgc3VwcG9ydGVkLlxuICAgICAqIEByZXR1cm4ge1JlbW90ZUNvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0UmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzIChjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9SQURJT19DT05UUk9MX0NBUEFCSUxJVElFUywgY2FwYWJpbGl0aWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7UmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzW119XG4gICAgICovXG4gICAgZ2V0UmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFJhZGlvQ29udHJvbENhcGFiaWxpdGllcywgUmVtb3RlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfUkFESU9fQ09OVFJPTF9DQVBBQklMSVRJRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QnV0dG9uQ2FwYWJpbGl0aWVzW119IGNhcGFiaWxpdGllcyAtIElmIGluY2x1ZGVkLCB0aGUgcGxhdGZvcm0gc3VwcG9ydHMgUkMgYnV0dG9uIGNvbnRyb2xzIHdpdGggdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgYnV0dG9uIG5hbWVzLlxuICAgICAqIEByZXR1cm4ge1JlbW90ZUNvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0QnV0dG9uQ2FwYWJpbGl0aWVzIChjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQnV0dG9uQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9CVVRUT05fQ0FQQUJJTElUSUVTLCBjYXBhYmlsaXRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCdXR0b25DYXBhYmlsaXRpZXNbXX1cbiAgICAgKi9cbiAgICBnZXRCdXR0b25DYXBhYmlsaXRpZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQnV0dG9uQ2FwYWJpbGl0aWVzLCBSZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9CVVRUT05fQ0FQQUJJTElUSUVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0F1ZGlvQ29udHJvbENhcGFiaWxpdGllc1tdfSBjYXBhYmlsaXRpZXMgLSBJZiBpbmNsdWRlZCwgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIGF1ZGlvIGNvbnRyb2xzLlxuICAgICAqIEByZXR1cm4ge1JlbW90ZUNvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0QXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzIChjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9BVURJT19DT05UUk9MX0NBUEFCSUxJVElFUywgY2FwYWJpbGl0aWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzW119XG4gICAgICovXG4gICAgZ2V0QXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEF1ZGlvQ29udHJvbENhcGFiaWxpdGllcywgUmVtb3RlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfQVVESU9fQ09OVFJPTF9DQVBBQklMSVRJRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzfSBjYXBhYmlsaXRpZXMgLSBJZiBpbmNsdWRlZCwgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIGhtaSBzZXR0aW5nIGNvbnRyb2xzLlxuICAgICAqIEByZXR1cm4ge1JlbW90ZUNvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0SG1pU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzIChjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9ITUlfU0VUVElOR1NfQ09OVFJPTF9DQVBBQklMSVRJRVMsIGNhcGFiaWxpdGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0hNSVNldHRpbmdzQ29udHJvbENhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBnZXRIbWlTZXR0aW5nc0NvbnRyb2xDYXBhYmlsaXRpZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzLCBSZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9ITUlfU0VUVElOR1NfQ09OVFJPTF9DQVBBQklMSVRJRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TGlnaHRDb250cm9sQ2FwYWJpbGl0aWVzfSBjYXBhYmlsaXRpZXMgLSBJZiBpbmNsdWRlZCwgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIGxpZ2h0IGNvbnRyb2xzLlxuICAgICAqIEByZXR1cm4ge1JlbW90ZUNvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgc2V0TGlnaHRDb250cm9sQ2FwYWJpbGl0aWVzIChjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTGlnaHRDb250cm9sQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihSZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9MSUdIVF9DT05UUk9MX0NBUEFCSUxJVElFUywgY2FwYWJpbGl0aWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TGlnaHRDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIGdldExpZ2h0Q29udHJvbENhcGFiaWxpdGllcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChMaWdodENvbnRyb2xDYXBhYmlsaXRpZXMsIFJlbW90ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0xJR0hUX0NPTlRST0xfQ0FQQUJJTElUSUVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlYXRDb250cm9sQ2FwYWJpbGl0aWVzW119IGNhcGFiaWxpdGllcyAtIElmIGluY2x1ZGVkLCB0aGUgcGxhdGZvcm0gc3VwcG9ydHMgc2VhdCBjb250cm9scy5cbiAgICAgKiBAcmV0dXJuIHtSZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIHNldFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzIChjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMsIGNhcGFiaWxpdGllcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlbW90ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1NFQVRfQ09OVFJPTF9DQVBBQklMSVRJRVMsIGNhcGFiaWxpdGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NlYXRDb250cm9sQ2FwYWJpbGl0aWVzW119XG4gICAgICovXG4gICAgZ2V0U2VhdENvbnRyb2xDYXBhYmlsaXRpZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMsIFJlbW90ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1NFQVRfQ09OVFJPTF9DQVBBQklMSVRJRVMpO1xuICAgIH1cbn1cblxuUmVtb3RlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfQ0xJTUFURV9DT05UUk9MX0NBUEFCSUxJVElFUyA9ICdjbGltYXRlQ29udHJvbENhcGFiaWxpdGllcyc7XG5SZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzLktFWV9SQURJT19DT05UUk9MX0NBUEFCSUxJVElFUyA9ICdyYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMnO1xuUmVtb3RlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfQlVUVE9OX0NBUEFCSUxJVElFUyA9ICdidXR0b25DYXBhYmlsaXRpZXMnO1xuUmVtb3RlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfQVVESU9fQ09OVFJPTF9DQVBBQklMSVRJRVMgPSAnYXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzJztcblJlbW90ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX0hNSV9TRVRUSU5HU19DT05UUk9MX0NBUEFCSUxJVElFUyA9ICdobWlTZXR0aW5nc0NvbnRyb2xDYXBhYmlsaXRpZXMnO1xuUmVtb3RlQ29udHJvbENhcGFiaWxpdGllcy5LRVlfTElHSFRfQ09OVFJPTF9DQVBBQklMSVRJRVMgPSAnbGlnaHRDb250cm9sQ2FwYWJpbGl0aWVzJztcblJlbW90ZUNvbnRyb2xDYXBhYmlsaXRpZXMuS0VZX1NFQVRfQ09OVFJPTF9DQVBBQklMSVRJRVMgPSAnc2VhdENvbnRyb2xDYXBhYmlsaXRpZXMnO1xuXG5leHBvcnQgeyBSZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IFNlYXRMb2NhdGlvbiB9IGZyb20gJy4vU2VhdExvY2F0aW9uLmpzJztcblxuLyoqXG4gKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYXRpb25zIG9mIGVhY2ggc2VhdFxuICovXG5jbGFzcyBTZWF0TG9jYXRpb25DYXBhYmlsaXR5IGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gcm93c1xuICAgICAqIEByZXR1cm4ge1NlYXRMb2NhdGlvbkNhcGFiaWxpdHl9XG4gICAgICovXG4gICAgc2V0Um93cyAocm93cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0TG9jYXRpb25DYXBhYmlsaXR5LktFWV9ST1dTLCByb3dzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFJvd3MgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoU2VhdExvY2F0aW9uQ2FwYWJpbGl0eS5LRVlfUk9XUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGNvbHVtbnNcbiAgICAgKiBAcmV0dXJuIHtTZWF0TG9jYXRpb25DYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIHNldENvbHVtbnMgKGNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VhdExvY2F0aW9uQ2FwYWJpbGl0eS5LRVlfQ09MVU1OUywgY29sdW1ucyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRDb2x1bW5zICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFNlYXRMb2NhdGlvbkNhcGFiaWxpdHkuS0VZX0NPTFVNTlMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsZXZlbHNcbiAgICAgKiBAcmV0dXJuIHtTZWF0TG9jYXRpb25DYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIHNldExldmVscyAobGV2ZWxzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFNlYXRMb2NhdGlvbkNhcGFiaWxpdHkuS0VZX0xFVkVMUywgbGV2ZWxzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldExldmVscyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihTZWF0TG9jYXRpb25DYXBhYmlsaXR5LktFWV9MRVZFTFMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2VhdExvY2F0aW9uW119IHNlYXRzIC0gQ29udGFpbnMgYSBsaXN0IG9mIFNlYXRMb2NhdGlvbiBpbiB0aGUgdmVoaWNsZVxuICAgICAqIEByZXR1cm4ge1NlYXRMb2NhdGlvbkNhcGFiaWxpdHl9XG4gICAgICovXG4gICAgc2V0U2VhdHMgKHNlYXRzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFNlYXRMb2NhdGlvbiwgc2VhdHMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTZWF0TG9jYXRpb25DYXBhYmlsaXR5LktFWV9TRUFUUywgc2VhdHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTZWF0TG9jYXRpb25bXX1cbiAgICAgKi9cbiAgICBnZXRTZWF0cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTZWF0TG9jYXRpb24sIFNlYXRMb2NhdGlvbkNhcGFiaWxpdHkuS0VZX1NFQVRTKTtcbiAgICB9XG59XG5cblNlYXRMb2NhdGlvbkNhcGFiaWxpdHkuS0VZX1JPV1MgPSAncm93cyc7XG5TZWF0TG9jYXRpb25DYXBhYmlsaXR5LktFWV9DT0xVTU5TID0gJ2NvbHVtbnMnO1xuU2VhdExvY2F0aW9uQ2FwYWJpbGl0eS5LRVlfTEVWRUxTID0gJ2xldmVscyc7XG5TZWF0TG9jYXRpb25DYXBhYmlsaXR5LktFWV9TRUFUUyA9ICdzZWF0cyc7XG5cbmV4cG9ydCB7IFNlYXRMb2NhdGlvbkNhcGFiaWxpdHkgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gU2VydmljZVVwZGF0ZVJlYXNvblxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgU2VydmljZVVwZGF0ZVJlYXNvbiBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VydmljZSBoYXMganVzdCBiZWVuIHB1Ymxpc2hlZCB3aXRoIHRoZSBtb2R1bGUgYW5kIG9uY2UgYWN0aXZhdGVkIHRvIHRoZSBwcmltYXJ5IHNlcnZpY2Ugb2YgaXRzIHR5cGUsIGl0XG4gICAgICogd2lsbCBiZSByZWFkeSBmb3IgcG9zc2libGUgY29uc3VtcHRpb24uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUFVCTElTSEVEICgpIHtcbiAgICAgICAgcmV0dXJuIFNlcnZpY2VVcGRhdGVSZWFzb24uX01BUC5QVUJMSVNIRUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNlcnZpY2UgaGFzIGp1c3QgYmVlbiB1bnB1Ymxpc2hlZCB3aXRoIHRoZSBtb2R1bGUgYW5kIGlzIG5vIGxvbmdlciBhY2Nlc3NpYmxlXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUkVNT1ZFRCAoKSB7XG4gICAgICAgIHJldHVybiBTZXJ2aWNlVXBkYXRlUmVhc29uLl9NQVAuUkVNT1ZFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VydmljZSBpcyBhY3RpdmF0ZWQgYXMgdGhlIHByaW1hcnkgc2VydmljZSBvZiB0aGlzIHR5cGUuIEFsbCByZXF1ZXN0cyBkZWFsaW5nIHdpdGggdGhpcyBzZXJ2aWNlIHR5cGUgd2lsbFxuICAgICAqIGJlIGhhbmRsZWQgYnkgdGhpcyBzZXJ2aWNlLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEFDVElWQVRFRCAoKSB7XG4gICAgICAgIHJldHVybiBTZXJ2aWNlVXBkYXRlUmVhc29uLl9NQVAuQUNUSVZBVEVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzZXJ2aWNlIGhhcyBiZWVuIGRlYWN0aXZhdGVkIGFzIHRoZSBwcmltYXJ5IHNlcnZpY2Ugb2YgaXRzIHR5cGVcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBERUFDVElWQVRFRCAoKSB7XG4gICAgICAgIHJldHVybiBTZXJ2aWNlVXBkYXRlUmVhc29uLl9NQVAuREVBQ1RJVkFURUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNlcnZpY2UgaGFzIHVwZGF0ZWQgaXRzIG1hbmlmZXN0LiBUaGlzIGNvdWxkIGltcGx5IHVwZGF0ZWQgY2FwYWJpbGl0aWVzXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTUFOSUZFU1RfVVBEQVRFICgpIHtcbiAgICAgICAgcmV0dXJuIFNlcnZpY2VVcGRhdGVSZWFzb24uX01BUC5NQU5JRkVTVF9VUERBVEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gU2VydmljZVVwZGF0ZVJlYXNvbi5fdmFsdWVGb3JLZXkoa2V5LCBTZXJ2aWNlVXBkYXRlUmVhc29uLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gU2VydmljZVVwZGF0ZVJlYXNvbi5fa2V5Rm9yVmFsdWUodmFsdWUsIFNlcnZpY2VVcGRhdGVSZWFzb24uX01BUCk7XG4gICAgfVxufVxuXG5TZXJ2aWNlVXBkYXRlUmVhc29uLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnUFVCTElTSEVEJzogJ1BVQkxJU0hFRCcsXG4gICAgJ1JFTU9WRUQnOiAnUkVNT1ZFRCcsXG4gICAgJ0FDVElWQVRFRCc6ICdBQ1RJVkFURUQnLFxuICAgICdERUFDVElWQVRFRCc6ICdERUFDVElWQVRFRCcsXG4gICAgJ01BTklGRVNUX1VQREFURSc6ICdNQU5JRkVTVF9VUERBVEUnLFxufSk7XG5cbmV4cG9ydCB7IFNlcnZpY2VVcGRhdGVSZWFzb24gfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG5jbGFzcyBOYXZpZ2F0aW9uU2VydmljZU1hbmlmZXN0IGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBvaW50cyAtIEluZm9ybXMgdGhlIHN1YnNjcmliZXIgaWYgdGhpcyBzZXJ2aWNlIGNhbiBhY3R1YWxseSBhY2NlcHQgd2F5IHBvaW50cy5cbiAgICAgKiBAcmV0dXJuIHtOYXZpZ2F0aW9uU2VydmljZU1hbmlmZXN0fVxuICAgICAqL1xuICAgIHNldEFjY2VwdHNXYXlQb2ludHMgKHBvaW50cykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihOYXZpZ2F0aW9uU2VydmljZU1hbmlmZXN0LktFWV9BQ0NFUFRTX1dBWV9QT0lOVFMsIHBvaW50cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0QWNjZXB0c1dheVBvaW50cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihOYXZpZ2F0aW9uU2VydmljZU1hbmlmZXN0LktFWV9BQ0NFUFRTX1dBWV9QT0lOVFMpO1xuICAgIH1cbn1cblxuTmF2aWdhdGlvblNlcnZpY2VNYW5pZmVzdC5LRVlfQUNDRVBUU19XQVlfUE9JTlRTID0gJ2FjY2VwdHNXYXlQb2ludHMnO1xuXG5leHBvcnQgeyBOYXZpZ2F0aW9uU2VydmljZU1hbmlmZXN0IH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcblxuY2xhc3MgV2VhdGhlclNlcnZpY2VNYW5pZmVzdCBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzdXBwb3J0ZWRcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyU2VydmljZU1hbmlmZXN0fVxuICAgICAqL1xuICAgIHNldEN1cnJlbnRGb3JlY2FzdFN1cHBvcnRlZCAoc3VwcG9ydGVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFdlYXRoZXJTZXJ2aWNlTWFuaWZlc3QuS0VZX0NVUlJFTlRfRk9SRUNBU1RfU1VQUE9SVEVELCBzdXBwb3J0ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEN1cnJlbnRGb3JlY2FzdFN1cHBvcnRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihXZWF0aGVyU2VydmljZU1hbmlmZXN0LktFWV9DVVJSRU5UX0ZPUkVDQVNUX1NVUFBPUlRFRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGFtb3VudFxuICAgICAqIEByZXR1cm4ge1dlYXRoZXJTZXJ2aWNlTWFuaWZlc3R9XG4gICAgICovXG4gICAgc2V0TWF4TXVsdGlkYXlGb3JlY2FzdEFtb3VudCAoYW1vdW50KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFdlYXRoZXJTZXJ2aWNlTWFuaWZlc3QuS0VZX01BWF9NVUxUSURBWV9GT1JFQ0FTVF9BTU9VTlQsIGFtb3VudCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRNYXhNdWx0aWRheUZvcmVjYXN0QW1vdW50ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFdlYXRoZXJTZXJ2aWNlTWFuaWZlc3QuS0VZX01BWF9NVUxUSURBWV9GT1JFQ0FTVF9BTU9VTlQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBhbW91bnRcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyU2VydmljZU1hbmlmZXN0fVxuICAgICAqL1xuICAgIHNldE1heEhvdXJseUZvcmVjYXN0QW1vdW50IChhbW91bnQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoV2VhdGhlclNlcnZpY2VNYW5pZmVzdC5LRVlfTUFYX0hPVVJMWV9GT1JFQ0FTVF9BTU9VTlQsIGFtb3VudCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRNYXhIb3VybHlGb3JlY2FzdEFtb3VudCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihXZWF0aGVyU2VydmljZU1hbmlmZXN0LktFWV9NQVhfSE9VUkxZX0ZPUkVDQVNUX0FNT1VOVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGFtb3VudFxuICAgICAqIEByZXR1cm4ge1dlYXRoZXJTZXJ2aWNlTWFuaWZlc3R9XG4gICAgICovXG4gICAgc2V0TWF4TWludXRlbHlGb3JlY2FzdEFtb3VudCAoYW1vdW50KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFdlYXRoZXJTZXJ2aWNlTWFuaWZlc3QuS0VZX01BWF9NSU5VVEVMWV9GT1JFQ0FTVF9BTU9VTlQsIGFtb3VudCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRNYXhNaW51dGVseUZvcmVjYXN0QW1vdW50ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFdlYXRoZXJTZXJ2aWNlTWFuaWZlc3QuS0VZX01BWF9NSU5VVEVMWV9GT1JFQ0FTVF9BTU9VTlQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3VwcG9ydGVkXG4gICAgICogQHJldHVybiB7V2VhdGhlclNlcnZpY2VNYW5pZmVzdH1cbiAgICAgKi9cbiAgICBzZXRXZWF0aGVyRm9yTG9jYXRpb25TdXBwb3J0ZWQgKHN1cHBvcnRlZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyU2VydmljZU1hbmlmZXN0LktFWV9XRUFUSEVSX0ZPUl9MT0NBVElPTl9TVVBQT1JURUQsIHN1cHBvcnRlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0V2VhdGhlckZvckxvY2F0aW9uU3VwcG9ydGVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFdlYXRoZXJTZXJ2aWNlTWFuaWZlc3QuS0VZX1dFQVRIRVJfRk9SX0xPQ0FUSU9OX1NVUFBPUlRFRCk7XG4gICAgfVxufVxuXG5XZWF0aGVyU2VydmljZU1hbmlmZXN0LktFWV9DVVJSRU5UX0ZPUkVDQVNUX1NVUFBPUlRFRCA9ICdjdXJyZW50Rm9yZWNhc3RTdXBwb3J0ZWQnO1xuV2VhdGhlclNlcnZpY2VNYW5pZmVzdC5LRVlfTUFYX01VTFRJREFZX0ZPUkVDQVNUX0FNT1VOVCA9ICdtYXhNdWx0aWRheUZvcmVjYXN0QW1vdW50JztcbldlYXRoZXJTZXJ2aWNlTWFuaWZlc3QuS0VZX01BWF9IT1VSTFlfRk9SRUNBU1RfQU1PVU5UID0gJ21heEhvdXJseUZvcmVjYXN0QW1vdW50JztcbldlYXRoZXJTZXJ2aWNlTWFuaWZlc3QuS0VZX01BWF9NSU5VVEVMWV9GT1JFQ0FTVF9BTU9VTlQgPSAnbWF4TWludXRlbHlGb3JlY2FzdEFtb3VudCc7XG5XZWF0aGVyU2VydmljZU1hbmlmZXN0LktFWV9XRUFUSEVSX0ZPUl9MT0NBVElPTl9TVVBQT1JURUQgPSAnd2VhdGhlckZvckxvY2F0aW9uU3VwcG9ydGVkJztcblxuZXhwb3J0IHsgV2VhdGhlclNlcnZpY2VNYW5pZmVzdCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbmNsYXNzIE1lZGlhU2VydmljZU1hbmlmZXN0IGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgTWVkaWFTZXJ2aWNlTWFuaWZlc3QgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBOYXZpZ2F0aW9uU2VydmljZU1hbmlmZXN0IH0gZnJvbSAnLi9OYXZpZ2F0aW9uU2VydmljZU1hbmlmZXN0LmpzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnLi9JbWFnZS5qcyc7XG5pbXBvcnQgeyBTZGxNc2dWZXJzaW9uIH0gZnJvbSAnLi9TZGxNc2dWZXJzaW9uLmpzJztcbmltcG9ydCB7IFdlYXRoZXJTZXJ2aWNlTWFuaWZlc3QgfSBmcm9tICcuL1dlYXRoZXJTZXJ2aWNlTWFuaWZlc3QuanMnO1xuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IE1lZGlhU2VydmljZU1hbmlmZXN0IH0gZnJvbSAnLi9NZWRpYVNlcnZpY2VNYW5pZmVzdC5qcyc7XG5cbi8qKlxuICogVGhpcyBtYW5pZmVzdCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgdGhlIHNlcnZpY2UgdG8gYmUgcHVibGlzaGVkLCBhY3RpdmF0ZWQsIGFuZCBjb25zdW1lcnMgYWJsZVxuICogdG8gaW50ZXJhY3Qgd2l0aCBpdFxuICovXG5jbGFzcyBBcHBTZXJ2aWNlTWFuaWZlc3QgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVW5pcXVlIG5hbWUgb2YgdGhpcyBzZXJ2aWNlXG4gICAgICogQHJldHVybiB7QXBwU2VydmljZU1hbmlmZXN0fVxuICAgICAqL1xuICAgIHNldFNlcnZpY2VOYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFwcFNlcnZpY2VNYW5pZmVzdC5LRVlfU0VSVklDRV9OQU1FLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFNlcnZpY2VOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEFwcFNlcnZpY2VNYW5pZmVzdC5LRVlfU0VSVklDRV9OQU1FKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIHNlcnZpY2UgdGhhdCBpcyB0byBiZSBvZmZlcmVkIGJ5IHRoaXMgYXBwLiBTZWUgQXBwU2VydmljZVR5cGUgZm9yIGtub3duIGVudW1cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGVxdWl2YWxlbnQgdHlwZXMuIFBhcmFtZXRlciBpcyBhIHN0cmluZyB0byBhbGxvdyBmb3IgbmV3IHNlcnZpY2UgdHlwZXMgdG8gYmUgdXNlZCBieSBhcHBzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBvbiBvbGRlciB2ZXJzaW9ucyBvZiBTREwgQ29yZS5cbiAgICAgKiBAcmV0dXJuIHtBcHBTZXJ2aWNlTWFuaWZlc3R9XG4gICAgICovXG4gICAgc2V0U2VydmljZVR5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXBwU2VydmljZU1hbmlmZXN0LktFWV9TRVJWSUNFX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0U2VydmljZVR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQXBwU2VydmljZU1hbmlmZXN0LktFWV9TRVJWSUNFX1RZUEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW1hZ2V9IGljb24gLSBUaGUgaWNvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2aWNlLiBNb3N0IGxpa2VseSB0aGUgc2FtZSBhcyB0aGUgYXBwSWNvbi5cbiAgICAgKiBAcmV0dXJuIHtBcHBTZXJ2aWNlTWFuaWZlc3R9XG4gICAgICovXG4gICAgc2V0U2VydmljZUljb24gKGljb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSW1hZ2UsIGljb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBcHBTZXJ2aWNlTWFuaWZlc3QuS0VZX1NFUlZJQ0VfSUNPTiwgaWNvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0ltYWdlfVxuICAgICAqL1xuICAgIGdldFNlcnZpY2VJY29uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEltYWdlLCBBcHBTZXJ2aWNlTWFuaWZlc3QuS0VZX1NFUlZJQ0VfSUNPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBjb25zdW1lcnMgLSBJZiB0cnVlLCBhcHAgc2VydmljZSBjb25zdW1lcnMgYmV5b25kIHRoZSBJVkkgc3lzdGVtIHdpbGwgYmUgYWJsZSB0byBhY2Nlc3MgdGhpc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS4gSWYgZmFsc2UsIG9ubHkgdGhlIElWSSBzeXN0ZW0gd2lsbCBiZSBhYmxlIGNvbnN1bWUgdGhlIHNlcnZpY2UuIElmIG5vdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgZmFsc2UuXG4gICAgICogQHJldHVybiB7QXBwU2VydmljZU1hbmlmZXN0fVxuICAgICAqL1xuICAgIHNldEFsbG93QXBwQ29uc3VtZXJzIChjb25zdW1lcnMpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXBwU2VydmljZU1hbmlmZXN0LktFWV9BTExPV19BUFBfQ09OU1VNRVJTLCBjb25zdW1lcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEFsbG93QXBwQ29uc3VtZXJzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEFwcFNlcnZpY2VNYW5pZmVzdC5LRVlfQUxMT1dfQVBQX0NPTlNVTUVSUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTZGxNc2dWZXJzaW9ufSB2ZXJzaW9uIC0gVGhpcyBpcyB0aGUgbWF4IFJQQyBTcGVjIHZlcnNpb24gdGhlIGFwcCBzZXJ2aWNlIHVuZGVyc3RhbmRzLiBUaGlzIGlzIGltcG9ydGFudFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyB0aGUgUlBDIHBhc3N0aHJvdWdoIGZ1bmN0aW9uYWxpdHkuIElmIG5vdCBpbmNsdWRlZCwgaXQgaXMgYXNzdW1lZCB0aGUgbWF4XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgbW9kdWxlIGlzIGFjY2VwdGFibGUuXG4gICAgICogQHJldHVybiB7QXBwU2VydmljZU1hbmlmZXN0fVxuICAgICAqL1xuICAgIHNldFJwY1NwZWNWZXJzaW9uICh2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFNkbE1zZ1ZlcnNpb24sIHZlcnNpb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBcHBTZXJ2aWNlTWFuaWZlc3QuS0VZX1JQQ19TUEVDX1ZFUlNJT04sIHZlcnNpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTZGxNc2dWZXJzaW9ufVxuICAgICAqL1xuICAgIGdldFJwY1NwZWNWZXJzaW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFNkbE1zZ1ZlcnNpb24sIEFwcFNlcnZpY2VNYW5pZmVzdC5LRVlfUlBDX1NQRUNfVkVSU0lPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJbXX0gY3MgLSBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBGdW5jdGlvbiBJRHMgZm9yIHRoZSBSUENzIHRoYXQgdGhpcyBzZXJ2aWNlIGludGVuZHMgdG8gaGFuZGxlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0bHkuIFRoaXMgbWVhbnMgdGhlIHNlcnZpY2Ugd2lsbCBwcm92aWRlIG1lYW5pbmdmdWwgcmVzcG9uc2VzLlxuICAgICAqIEByZXR1cm4ge0FwcFNlcnZpY2VNYW5pZmVzdH1cbiAgICAgKi9cbiAgICBzZXRIYW5kbGVkUlBDcyAoY3MpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXBwU2VydmljZU1hbmlmZXN0LktFWV9IQU5ETEVEX1JQQ1MsIGNzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyW119XG4gICAgICovXG4gICAgZ2V0SGFuZGxlZFJQQ3MgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQXBwU2VydmljZU1hbmlmZXN0LktFWV9IQU5ETEVEX1JQQ1MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TWVkaWFTZXJ2aWNlTWFuaWZlc3R9IG1hbmlmZXN0XG4gICAgICogQHJldHVybiB7QXBwU2VydmljZU1hbmlmZXN0fVxuICAgICAqL1xuICAgIHNldE1lZGlhU2VydmljZU1hbmlmZXN0IChtYW5pZmVzdCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNZWRpYVNlcnZpY2VNYW5pZmVzdCwgbWFuaWZlc3QpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBcHBTZXJ2aWNlTWFuaWZlc3QuS0VZX01FRElBX1NFUlZJQ0VfTUFOSUZFU1QsIG1hbmlmZXN0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TWVkaWFTZXJ2aWNlTWFuaWZlc3R9XG4gICAgICovXG4gICAgZ2V0TWVkaWFTZXJ2aWNlTWFuaWZlc3QgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTWVkaWFTZXJ2aWNlTWFuaWZlc3QsIEFwcFNlcnZpY2VNYW5pZmVzdC5LRVlfTUVESUFfU0VSVklDRV9NQU5JRkVTVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtXZWF0aGVyU2VydmljZU1hbmlmZXN0fSBtYW5pZmVzdFxuICAgICAqIEByZXR1cm4ge0FwcFNlcnZpY2VNYW5pZmVzdH1cbiAgICAgKi9cbiAgICBzZXRXZWF0aGVyU2VydmljZU1hbmlmZXN0IChtYW5pZmVzdCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShXZWF0aGVyU2VydmljZU1hbmlmZXN0LCBtYW5pZmVzdCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFwcFNlcnZpY2VNYW5pZmVzdC5LRVlfV0VBVEhFUl9TRVJWSUNFX01BTklGRVNULCBtYW5pZmVzdCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1dlYXRoZXJTZXJ2aWNlTWFuaWZlc3R9XG4gICAgICovXG4gICAgZ2V0V2VhdGhlclNlcnZpY2VNYW5pZmVzdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChXZWF0aGVyU2VydmljZU1hbmlmZXN0LCBBcHBTZXJ2aWNlTWFuaWZlc3QuS0VZX1dFQVRIRVJfU0VSVklDRV9NQU5JRkVTVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOYXZpZ2F0aW9uU2VydmljZU1hbmlmZXN0fSBtYW5pZmVzdFxuICAgICAqIEByZXR1cm4ge0FwcFNlcnZpY2VNYW5pZmVzdH1cbiAgICAgKi9cbiAgICBzZXROYXZpZ2F0aW9uU2VydmljZU1hbmlmZXN0IChtYW5pZmVzdCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShOYXZpZ2F0aW9uU2VydmljZU1hbmlmZXN0LCBtYW5pZmVzdCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFwcFNlcnZpY2VNYW5pZmVzdC5LRVlfTkFWSUdBVElPTl9TRVJWSUNFX01BTklGRVNULCBtYW5pZmVzdCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge05hdmlnYXRpb25TZXJ2aWNlTWFuaWZlc3R9XG4gICAgICovXG4gICAgZ2V0TmF2aWdhdGlvblNlcnZpY2VNYW5pZmVzdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChOYXZpZ2F0aW9uU2VydmljZU1hbmlmZXN0LCBBcHBTZXJ2aWNlTWFuaWZlc3QuS0VZX05BVklHQVRJT05fU0VSVklDRV9NQU5JRkVTVCk7XG4gICAgfVxufVxuXG5BcHBTZXJ2aWNlTWFuaWZlc3QuS0VZX1NFUlZJQ0VfTkFNRSA9ICdzZXJ2aWNlTmFtZSc7XG5BcHBTZXJ2aWNlTWFuaWZlc3QuS0VZX1NFUlZJQ0VfVFlQRSA9ICdzZXJ2aWNlVHlwZSc7XG5BcHBTZXJ2aWNlTWFuaWZlc3QuS0VZX1NFUlZJQ0VfSUNPTiA9ICdzZXJ2aWNlSWNvbic7XG5BcHBTZXJ2aWNlTWFuaWZlc3QuS0VZX0FMTE9XX0FQUF9DT05TVU1FUlMgPSAnYWxsb3dBcHBDb25zdW1lcnMnO1xuQXBwU2VydmljZU1hbmlmZXN0LktFWV9SUENfU1BFQ19WRVJTSU9OID0gJ3JwY1NwZWNWZXJzaW9uJztcbkFwcFNlcnZpY2VNYW5pZmVzdC5LRVlfSEFORExFRF9SUENTID0gJ2hhbmRsZWRSUENzJztcbkFwcFNlcnZpY2VNYW5pZmVzdC5LRVlfTUVESUFfU0VSVklDRV9NQU5JRkVTVCA9ICdtZWRpYVNlcnZpY2VNYW5pZmVzdCc7XG5BcHBTZXJ2aWNlTWFuaWZlc3QuS0VZX1dFQVRIRVJfU0VSVklDRV9NQU5JRkVTVCA9ICd3ZWF0aGVyU2VydmljZU1hbmlmZXN0JztcbkFwcFNlcnZpY2VNYW5pZmVzdC5LRVlfTkFWSUdBVElPTl9TRVJWSUNFX01BTklGRVNUID0gJ25hdmlnYXRpb25TZXJ2aWNlTWFuaWZlc3QnO1xuXG5leHBvcnQgeyBBcHBTZXJ2aWNlTWFuaWZlc3QgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgQXBwU2VydmljZU1hbmlmZXN0IH0gZnJvbSAnLi9BcHBTZXJ2aWNlTWFuaWZlc3QuanMnO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHJlY29yZCBvZiBhbiBhcHAgc2VydmljZSBwdWJsaXNoZXIgdGhhdCB0aGUgbW9kdWxlIGhhcy4gSXQgc2hvdWxkIGNvbnRhaW4gdGhlIG1vc3QgdXAgdG8gZGF0ZVxuICogaW5mb3JtYXRpb24gaW5jbHVkaW5nIHRoZSBzZXJ2aWNlJ3MgYWN0aXZlIHN0YXRlXG4gKi9cbmNsYXNzIEFwcFNlcnZpY2VSZWNvcmQgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIEEgdW5pcXVlIElEIHRpZWQgdG8gdGhpcyBzcGVjaWZpYyBzZXJ2aWNlIHJlY29yZC4gVGhlIElEIGlzIHN1cHBsaWVkIGJ5IHRoZSBtb2R1bGUgdGhhdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzIHB1Ymxpc2ggdGhlbXNlbHZlcy5cbiAgICAgKiBAcmV0dXJuIHtBcHBTZXJ2aWNlUmVjb3JkfVxuICAgICAqL1xuICAgIHNldFNlcnZpY2VJRCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXBwU2VydmljZVJlY29yZC5LRVlfU0VSVklDRV9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0U2VydmljZUlEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEFwcFNlcnZpY2VSZWNvcmQuS0VZX1NFUlZJQ0VfSUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXBwU2VydmljZU1hbmlmZXN0fSBtYW5pZmVzdCAtIE1hbmlmZXN0IGZvciB0aGUgc2VydmljZSB0aGF0IHRoaXMgcmVjb3JkIGlzIGZvci5cbiAgICAgKiBAcmV0dXJuIHtBcHBTZXJ2aWNlUmVjb3JkfVxuICAgICAqL1xuICAgIHNldFNlcnZpY2VNYW5pZmVzdCAobWFuaWZlc3QpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQXBwU2VydmljZU1hbmlmZXN0LCBtYW5pZmVzdCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFwcFNlcnZpY2VSZWNvcmQuS0VZX1NFUlZJQ0VfTUFOSUZFU1QsIG1hbmlmZXN0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QXBwU2VydmljZU1hbmlmZXN0fVxuICAgICAqL1xuICAgIGdldFNlcnZpY2VNYW5pZmVzdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChBcHBTZXJ2aWNlTWFuaWZlc3QsIEFwcFNlcnZpY2VSZWNvcmQuS0VZX1NFUlZJQ0VfTUFOSUZFU1QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcHVibGlzaGVkIC0gSWYgdHJ1ZSwgdGhlIHNlcnZpY2UgaXMgcHVibGlzaGVkIGFuZCBhdmFpbGFibGUuIElmIGZhbHNlLCB0aGUgc2VydmljZSBoYXMgbGlrZWx5XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IGJlZW4gdW5wdWJsaXNoZWQsIGFuZCBzaG91bGQgYmUgY29uc2lkZXJlZCB1bmF2YWlsYWJsZS5cbiAgICAgKiBAcmV0dXJuIHtBcHBTZXJ2aWNlUmVjb3JkfVxuICAgICAqL1xuICAgIHNldFNlcnZpY2VQdWJsaXNoZWQgKHB1Ymxpc2hlZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBcHBTZXJ2aWNlUmVjb3JkLktFWV9TRVJWSUNFX1BVQkxJU0hFRCwgcHVibGlzaGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRTZXJ2aWNlUHVibGlzaGVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEFwcFNlcnZpY2VSZWNvcmQuS0VZX1NFUlZJQ0VfUFVCTElTSEVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFjdGl2ZSAtIElmIHRydWUsIHRoZSBzZXJ2aWNlIGlzIHRoZSBhY3RpdmUgcHJpbWFyeSBzZXJ2aWNlIG9mIHRoZSBzdXBwbGllZCBzZXJ2aWNlIHR5cGUuIEl0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHJlY2VpdmUgYWxsIHBvdGVudGlhbCBSUENzIHRoYXQgYXJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoYXQgc2VydmljZSB0eXBlLiBJZiBmYWxzZSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIG5vdCB0aGUgcHJpbWFyeSBzZXJ2aWNlIG9mIHRoZSBzdXBwbGllZCB0eXBlLiBTZWUgc2VydmljZVB1Ymxpc2hlZCBmb3IgaXRzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHkuXG4gICAgICogQHJldHVybiB7QXBwU2VydmljZVJlY29yZH1cbiAgICAgKi9cbiAgICBzZXRTZXJ2aWNlQWN0aXZlIChhY3RpdmUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXBwU2VydmljZVJlY29yZC5LRVlfU0VSVklDRV9BQ1RJVkUsIGFjdGl2ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0U2VydmljZUFjdGl2ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihBcHBTZXJ2aWNlUmVjb3JkLktFWV9TRVJWSUNFX0FDVElWRSk7XG4gICAgfVxufVxuXG5BcHBTZXJ2aWNlUmVjb3JkLktFWV9TRVJWSUNFX0lEID0gJ3NlcnZpY2VJRCc7XG5BcHBTZXJ2aWNlUmVjb3JkLktFWV9TRVJWSUNFX01BTklGRVNUID0gJ3NlcnZpY2VNYW5pZmVzdCc7XG5BcHBTZXJ2aWNlUmVjb3JkLktFWV9TRVJWSUNFX1BVQkxJU0hFRCA9ICdzZXJ2aWNlUHVibGlzaGVkJztcbkFwcFNlcnZpY2VSZWNvcmQuS0VZX1NFUlZJQ0VfQUNUSVZFID0gJ3NlcnZpY2VBY3RpdmUnO1xuXG5leHBvcnQgeyBBcHBTZXJ2aWNlUmVjb3JkIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IFNlcnZpY2VVcGRhdGVSZWFzb24gfSBmcm9tICcuLi9lbnVtcy9TZXJ2aWNlVXBkYXRlUmVhc29uLmpzJztcbmltcG9ydCB7IEFwcFNlcnZpY2VSZWNvcmQgfSBmcm9tICcuL0FwcFNlcnZpY2VSZWNvcmQuanMnO1xuXG5jbGFzcyBBcHBTZXJ2aWNlQ2FwYWJpbGl0eSBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVXBkYXRlUmVhc29ufSByZWFzb24gLSBPbmx5IGluY2x1ZGVkIGluIE9uU3lzdGVtQ2FwYWJpbGl0eVVwZGF0ZWQuIFVwZGF0ZSByZWFzb24gZm9yIHNlcnZpY2VcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5cbiAgICAgKiBAcmV0dXJuIHtBcHBTZXJ2aWNlQ2FwYWJpbGl0eX1cbiAgICAgKi9cbiAgICBzZXRVcGRhdGVSZWFzb24gKHJlYXNvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTZXJ2aWNlVXBkYXRlUmVhc29uLCByZWFzb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBcHBTZXJ2aWNlQ2FwYWJpbGl0eS5LRVlfVVBEQVRFX1JFQVNPTiwgcmVhc29uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U2VydmljZVVwZGF0ZVJlYXNvbn1cbiAgICAgKi9cbiAgICBnZXRVcGRhdGVSZWFzb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoU2VydmljZVVwZGF0ZVJlYXNvbiwgQXBwU2VydmljZUNhcGFiaWxpdHkuS0VZX1VQREFURV9SRUFTT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXBwU2VydmljZVJlY29yZH0gcmVjb3JkIC0gU2VydmljZSByZWNvcmQgZm9yIGEgc3BlY2lmaWMgYXBwIHNlcnZpY2UgcHJvdmlkZXJcbiAgICAgKiBAcmV0dXJuIHtBcHBTZXJ2aWNlQ2FwYWJpbGl0eX1cbiAgICAgKi9cbiAgICBzZXRVcGRhdGVkQXBwU2VydmljZVJlY29yZCAocmVjb3JkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEFwcFNlcnZpY2VSZWNvcmQsIHJlY29yZCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFwcFNlcnZpY2VDYXBhYmlsaXR5LktFWV9VUERBVEVEX0FQUF9TRVJWSUNFX1JFQ09SRCwgcmVjb3JkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QXBwU2VydmljZVJlY29yZH1cbiAgICAgKi9cbiAgICBnZXRVcGRhdGVkQXBwU2VydmljZVJlY29yZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChBcHBTZXJ2aWNlUmVjb3JkLCBBcHBTZXJ2aWNlQ2FwYWJpbGl0eS5LRVlfVVBEQVRFRF9BUFBfU0VSVklDRV9SRUNPUkQpO1xuICAgIH1cbn1cblxuQXBwU2VydmljZUNhcGFiaWxpdHkuS0VZX1VQREFURV9SRUFTT04gPSAndXBkYXRlUmVhc29uJztcbkFwcFNlcnZpY2VDYXBhYmlsaXR5LktFWV9VUERBVEVEX0FQUF9TRVJWSUNFX1JFQ09SRCA9ICd1cGRhdGVkQXBwU2VydmljZVJlY29yZCc7XG5cbmV4cG9ydCB7IEFwcFNlcnZpY2VDYXBhYmlsaXR5IH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IEFwcFNlcnZpY2VDYXBhYmlsaXR5IH0gZnJvbSAnLi9BcHBTZXJ2aWNlQ2FwYWJpbGl0eS5qcyc7XG5cbi8qKlxuICogQ2FwYWJpbGl0aWVzIG9mIGFwcCBzZXJ2aWNlcyBpbmNsdWRpbmcgd2hhdCBzZXJ2aWNlIHR5cGVzIGFyZSBzdXBwb3J0ZWQgYW5kIHRoZSBjdXJyZW50IHN0YXRlIG9mIHNlcnZpY2VzLlxuICovXG5jbGFzcyBBcHBTZXJ2aWNlc0NhcGFiaWxpdGllcyBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcHBTZXJ2aWNlQ2FwYWJpbGl0eVtdfSBzZXJ2aWNlcyAtIEFuIGFycmF5IG9mIGN1cnJlbnRseSBhdmFpbGFibGUgc2VydmljZXMuIElmIHRoaXMgaXMgYW4gdXBkYXRlIHRvIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5IHRoZSBhZmZlY3RlZCBzZXJ2aWNlcyB3aWxsIGluY2x1ZGUgYW4gdXBkYXRlIHJlYXNvbiBpbiB0aGF0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1cbiAgICAgKiBAcmV0dXJuIHtBcHBTZXJ2aWNlc0NhcGFiaWxpdGllc31cbiAgICAgKi9cbiAgICBzZXRBcHBTZXJ2aWNlcyAoc2VydmljZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQXBwU2VydmljZUNhcGFiaWxpdHksIHNlcnZpY2VzLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXBwU2VydmljZXNDYXBhYmlsaXRpZXMuS0VZX0FQUF9TRVJWSUNFUywgc2VydmljZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtBcHBTZXJ2aWNlQ2FwYWJpbGl0eVtdfVxuICAgICAqL1xuICAgIGdldEFwcFNlcnZpY2VzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEFwcFNlcnZpY2VDYXBhYmlsaXR5LCBBcHBTZXJ2aWNlc0NhcGFiaWxpdGllcy5LRVlfQVBQX1NFUlZJQ0VTKTtcbiAgICB9XG59XG5cbkFwcFNlcnZpY2VzQ2FwYWJpbGl0aWVzLktFWV9BUFBfU0VSVklDRVMgPSAnYXBwU2VydmljZXMnO1xuXG5leHBvcnQgeyBBcHBTZXJ2aWNlc0NhcGFiaWxpdGllcyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbi8qKlxuICogRXh0ZW5kZWQgY2FwYWJpbGl0aWVzIGZvciBhbiBvbmJvYXJkIG5hdmlnYXRpb24gc3lzdGVtXG4gKi9cbmNsYXNzIE5hdmlnYXRpb25DYXBhYmlsaXR5IGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBJZiB0aGUgbW9kdWxlIGhhcyB0aGUgYWJpbGl0eSB0byBhZGQgbG9jYXRpb25zIHRvIHRoZSBvbmJvYXJkIG5hdlxuICAgICAqIEByZXR1cm4ge05hdmlnYXRpb25DYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIHNldFNlbmRMb2NhdGlvbkVuYWJsZWQgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTmF2aWdhdGlvbkNhcGFiaWxpdHkuS0VZX1NFTkRfTE9DQVRJT05fRU5BQkxFRCwgZW5hYmxlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0U2VuZExvY2F0aW9uRW5hYmxlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihOYXZpZ2F0aW9uQ2FwYWJpbGl0eS5LRVlfU0VORF9MT0NBVElPTl9FTkFCTEVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBJZiB0aGUgbW9kdWxlIGhhcyB0aGUgYWJpbGl0eSB0byByZXR1cm4gd2F5IHBvaW50cyBmcm9tIG9uYm9hcmQgbmF2XG4gICAgICogQHJldHVybiB7TmF2aWdhdGlvbkNhcGFiaWxpdHl9XG4gICAgICovXG4gICAgc2V0R2V0V2F5UG9pbnRzRW5hYmxlZCAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihOYXZpZ2F0aW9uQ2FwYWJpbGl0eS5LRVlfR0VUX1dBWV9QT0lOVFNfRU5BQkxFRCwgZW5hYmxlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0R2V0V2F5UG9pbnRzRW5hYmxlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihOYXZpZ2F0aW9uQ2FwYWJpbGl0eS5LRVlfR0VUX1dBWV9QT0lOVFNfRU5BQkxFRCk7XG4gICAgfVxufVxuXG5OYXZpZ2F0aW9uQ2FwYWJpbGl0eS5LRVlfU0VORF9MT0NBVElPTl9FTkFCTEVEID0gJ3NlbmRMb2NhdGlvbkVuYWJsZWQnO1xuTmF2aWdhdGlvbkNhcGFiaWxpdHkuS0VZX0dFVF9XQVlfUE9JTlRTX0VOQUJMRUQgPSAnZ2V0V2F5UG9pbnRzRW5hYmxlZCc7XG5cbmV4cG9ydCB7IE5hdmlnYXRpb25DYXBhYmlsaXR5IH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5IH0gZnJvbSAnLi9WaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuanMnO1xuaW1wb3J0IHsgUGhvbmVDYXBhYmlsaXR5IH0gZnJvbSAnLi9QaG9uZUNhcGFiaWxpdHkuanMnO1xuaW1wb3J0IHsgRGlzcGxheUNhcGFiaWxpdHkgfSBmcm9tICcuL0Rpc3BsYXlDYXBhYmlsaXR5LmpzJztcbmltcG9ydCB7IFJlbW90ZUNvbnRyb2xDYXBhYmlsaXRpZXMgfSBmcm9tICcuL1JlbW90ZUNvbnRyb2xDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgU2VhdExvY2F0aW9uQ2FwYWJpbGl0eSB9IGZyb20gJy4vU2VhdExvY2F0aW9uQ2FwYWJpbGl0eS5qcyc7XG5pbXBvcnQgeyBTeXN0ZW1DYXBhYmlsaXR5VHlwZSB9IGZyb20gJy4uL2VudW1zL1N5c3RlbUNhcGFiaWxpdHlUeXBlLmpzJztcbmltcG9ydCB7IEFwcFNlcnZpY2VzQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9BcHBTZXJ2aWNlc0NhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uQ2FwYWJpbGl0eSB9IGZyb20gJy4vTmF2aWdhdGlvbkNhcGFiaWxpdHkuanMnO1xuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcblxuLyoqXG4gKiBUaGUgc3lzdGVtQ2FwYWJpbGl0eVR5cGUgaWRlbnRpZmllcyB3aGljaCBkYXRhIG9iamVjdCBleGlzdHMgaW4gdGhpcyBzdHJ1Y3QuIEZvciBleGFtcGxlLCBpZiB0aGUgU3lzdGVtQ2FwYWJpbGl0eVxuICogVHlwZSBpcyBOQVZJR0FUSU9OIHRoZW4gYSBcIm5hdmlnYXRpb25DYXBhYmlsaXR5XCIgc2hvdWxkIGV4aXN0XG4gKi9cbmNsYXNzIFN5c3RlbUNhcGFiaWxpdHkgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3lzdGVtQ2FwYWJpbGl0eVR5cGV9IHR5cGUgLSBVc2VkIGFzIGEgZGVzY3JpcHRvciBvZiB3aGF0IGRhdGEgdG8gZXhwZWN0IGluIHRoaXMgc3RydWN0LiBUaGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBwYXJhbSB0byB0aGlzIGVudW0gc2hvdWxkIGJlIGluY2x1ZGVkIGFuZCB0aGUgb25seSBvdGhlciBwYXJhbVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZC5cbiAgICAgKiBAcmV0dXJuIHtTeXN0ZW1DYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIHNldFN5c3RlbUNhcGFiaWxpdHlUeXBlICh0eXBlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFN5c3RlbUNhcGFiaWxpdHlUeXBlLCB0eXBlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3lzdGVtQ2FwYWJpbGl0eS5LRVlfU1lTVEVNX0NBUEFCSUxJVFlfVFlQRSwgdHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N5c3RlbUNhcGFiaWxpdHlUeXBlfVxuICAgICAqL1xuICAgIGdldFN5c3RlbUNhcGFiaWxpdHlUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFN5c3RlbUNhcGFiaWxpdHlUeXBlLCBTeXN0ZW1DYXBhYmlsaXR5LktFWV9TWVNURU1fQ0FQQUJJTElUWV9UWVBFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge05hdmlnYXRpb25DYXBhYmlsaXR5fSBjYXBhYmlsaXR5IC0gRGVzY3JpYmVzIGV4dGVuZGVkIGNhcGFiaWxpdGllcyBmb3Igb25ib2FyZCBuYXZpZ2F0aW9uIHN5c3RlbVxuICAgICAqIEByZXR1cm4ge1N5c3RlbUNhcGFiaWxpdHl9XG4gICAgICovXG4gICAgc2V0TmF2aWdhdGlvbkNhcGFiaWxpdHkgKGNhcGFiaWxpdHkpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTmF2aWdhdGlvbkNhcGFiaWxpdHksIGNhcGFiaWxpdHkpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTeXN0ZW1DYXBhYmlsaXR5LktFWV9OQVZJR0FUSU9OX0NBUEFCSUxJVFksIGNhcGFiaWxpdHkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOYXZpZ2F0aW9uQ2FwYWJpbGl0eX1cbiAgICAgKi9cbiAgICBnZXROYXZpZ2F0aW9uQ2FwYWJpbGl0eSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChOYXZpZ2F0aW9uQ2FwYWJpbGl0eSwgU3lzdGVtQ2FwYWJpbGl0eS5LRVlfTkFWSUdBVElPTl9DQVBBQklMSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1Bob25lQ2FwYWJpbGl0eX0gY2FwYWJpbGl0eSAtIERlc2NyaWJlcyBleHRlbmRlZCBjYXBhYmlsaXRpZXMgb2YgdGhlIG1vZHVsZSdzIHBob25lIGZlYXR1cmVcbiAgICAgKiBAcmV0dXJuIHtTeXN0ZW1DYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIHNldFBob25lQ2FwYWJpbGl0eSAoY2FwYWJpbGl0eSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShQaG9uZUNhcGFiaWxpdHksIGNhcGFiaWxpdHkpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihTeXN0ZW1DYXBhYmlsaXR5LktFWV9QSE9ORV9DQVBBQklMSVRZLCBjYXBhYmlsaXR5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7UGhvbmVDYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIGdldFBob25lQ2FwYWJpbGl0eSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChQaG9uZUNhcGFiaWxpdHksIFN5c3RlbUNhcGFiaWxpdHkuS0VZX1BIT05FX0NBUEFCSUxJVFkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5fSBjYXBhYmlsaXR5IC0gRGVzY3JpYmVzIGV4dGVuZGVkIGNhcGFiaWxpdGllcyBvZiB0aGUgbW9kdWxlJ3MgcGhvbmUgZmVhdHVyZVxuICAgICAqIEByZXR1cm4ge1N5c3RlbUNhcGFiaWxpdHl9XG4gICAgICovXG4gICAgc2V0VmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5IChjYXBhYmlsaXR5KSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eSwgY2FwYWJpbGl0eSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN5c3RlbUNhcGFiaWxpdHkuS0VZX1ZJREVPX1NUUkVBTUlOR19DQVBBQklMSVRZLCBjYXBhYmlsaXR5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIGdldFZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHksIFN5c3RlbUNhcGFiaWxpdHkuS0VZX1ZJREVPX1NUUkVBTUlOR19DQVBBQklMSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1JlbW90ZUNvbnRyb2xDYXBhYmlsaXRpZXN9IGNhcGFiaWxpdHkgLSBEZXNjcmliZXMgZXh0ZW5kZWQgY2FwYWJpbGl0aWVzIG9mIHRoZSBtb2R1bGUncyBwaG9uZSBmZWF0dXJlXG4gICAgICogQHJldHVybiB7U3lzdGVtQ2FwYWJpbGl0eX1cbiAgICAgKi9cbiAgICBzZXRSZW1vdGVDb250cm9sQ2FwYWJpbGl0eSAoY2FwYWJpbGl0eSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShSZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXR5KTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3lzdGVtQ2FwYWJpbGl0eS5LRVlfUkVNT1RFX0NPTlRST0xfQ0FQQUJJTElUWSwgY2FwYWJpbGl0eSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1JlbW90ZUNvbnRyb2xDYXBhYmlsaXRpZXN9XG4gICAgICovXG4gICAgZ2V0UmVtb3RlQ29udHJvbENhcGFiaWxpdHkgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoUmVtb3RlQ29udHJvbENhcGFiaWxpdGllcywgU3lzdGVtQ2FwYWJpbGl0eS5LRVlfUkVNT1RFX0NPTlRST0xfQ0FQQUJJTElUWSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcHBTZXJ2aWNlc0NhcGFiaWxpdGllc30gY2FwYWJpbGl0aWVzIC0gQW4gYXJyYXkgb2YgY3VycmVudGx5IGF2YWlsYWJsZSBzZXJ2aWNlcy4gSWYgdGhpcyBpcyBhbiB1cGRhdGUgdG9cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2FwYWJpbGl0eSB0aGUgYWZmZWN0ZWQgc2VydmljZXMgd2lsbCBpbmNsdWRlIGFuIHVwZGF0ZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbiBpbiB0aGF0IGl0ZW1cbiAgICAgKiBAcmV0dXJuIHtTeXN0ZW1DYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIHNldEFwcFNlcnZpY2VzQ2FwYWJpbGl0aWVzIChjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQXBwU2VydmljZXNDYXBhYmlsaXRpZXMsIGNhcGFiaWxpdGllcyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFN5c3RlbUNhcGFiaWxpdHkuS0VZX0FQUF9TRVJWSUNFU19DQVBBQklMSVRJRVMsIGNhcGFiaWxpdGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0FwcFNlcnZpY2VzQ2FwYWJpbGl0aWVzfVxuICAgICAqL1xuICAgIGdldEFwcFNlcnZpY2VzQ2FwYWJpbGl0aWVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEFwcFNlcnZpY2VzQ2FwYWJpbGl0aWVzLCBTeXN0ZW1DYXBhYmlsaXR5LktFWV9BUFBfU0VSVklDRVNfQ0FQQUJJTElUSUVTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlYXRMb2NhdGlvbkNhcGFiaWxpdHl9IGNhcGFiaWxpdHkgLSBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYXRpb25zIG9mIGVhY2ggc2VhdFxuICAgICAqIEByZXR1cm4ge1N5c3RlbUNhcGFiaWxpdHl9XG4gICAgICovXG4gICAgc2V0U2VhdExvY2F0aW9uQ2FwYWJpbGl0eSAoY2FwYWJpbGl0eSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTZWF0TG9jYXRpb25DYXBhYmlsaXR5LCBjYXBhYmlsaXR5KTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3lzdGVtQ2FwYWJpbGl0eS5LRVlfU0VBVF9MT0NBVElPTl9DQVBBQklMSVRZLCBjYXBhYmlsaXR5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U2VhdExvY2F0aW9uQ2FwYWJpbGl0eX1cbiAgICAgKi9cbiAgICBnZXRTZWF0TG9jYXRpb25DYXBhYmlsaXR5ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFNlYXRMb2NhdGlvbkNhcGFiaWxpdHksIFN5c3RlbUNhcGFiaWxpdHkuS0VZX1NFQVRfTE9DQVRJT05fQ0FQQUJJTElUWSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtEaXNwbGF5Q2FwYWJpbGl0eVtdfSBjYXBhYmlsaXRpZXNcbiAgICAgKiBAcmV0dXJuIHtTeXN0ZW1DYXBhYmlsaXR5fVxuICAgICAqL1xuICAgIHNldERpc3BsYXlDYXBhYmlsaXRpZXMgKGNhcGFiaWxpdGllcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShEaXNwbGF5Q2FwYWJpbGl0eSwgY2FwYWJpbGl0aWVzLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU3lzdGVtQ2FwYWJpbGl0eS5LRVlfRElTUExBWV9DQVBBQklMSVRJRVMsIGNhcGFiaWxpdGllcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Rpc3BsYXlDYXBhYmlsaXR5W119XG4gICAgICovXG4gICAgZ2V0RGlzcGxheUNhcGFiaWxpdGllcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChEaXNwbGF5Q2FwYWJpbGl0eSwgU3lzdGVtQ2FwYWJpbGl0eS5LRVlfRElTUExBWV9DQVBBQklMSVRJRVMpO1xuICAgIH1cbn1cblxuU3lzdGVtQ2FwYWJpbGl0eS5LRVlfU1lTVEVNX0NBUEFCSUxJVFlfVFlQRSA9ICdzeXN0ZW1DYXBhYmlsaXR5VHlwZSc7XG5TeXN0ZW1DYXBhYmlsaXR5LktFWV9OQVZJR0FUSU9OX0NBUEFCSUxJVFkgPSAnbmF2aWdhdGlvbkNhcGFiaWxpdHknO1xuU3lzdGVtQ2FwYWJpbGl0eS5LRVlfUEhPTkVfQ0FQQUJJTElUWSA9ICdwaG9uZUNhcGFiaWxpdHknO1xuU3lzdGVtQ2FwYWJpbGl0eS5LRVlfVklERU9fU1RSRUFNSU5HX0NBUEFCSUxJVFkgPSAndmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5JztcblN5c3RlbUNhcGFiaWxpdHkuS0VZX1JFTU9URV9DT05UUk9MX0NBUEFCSUxJVFkgPSAncmVtb3RlQ29udHJvbENhcGFiaWxpdHknO1xuU3lzdGVtQ2FwYWJpbGl0eS5LRVlfQVBQX1NFUlZJQ0VTX0NBUEFCSUxJVElFUyA9ICdhcHBTZXJ2aWNlc0NhcGFiaWxpdGllcyc7XG5TeXN0ZW1DYXBhYmlsaXR5LktFWV9TRUFUX0xPQ0FUSU9OX0NBUEFCSUxJVFkgPSAnc2VhdExvY2F0aW9uQ2FwYWJpbGl0eSc7XG5TeXN0ZW1DYXBhYmlsaXR5LktFWV9ESVNQTEFZX0NBUEFCSUxJVElFUyA9ICdkaXNwbGF5Q2FwYWJpbGl0aWVzJztcblxuZXhwb3J0IHsgU3lzdGVtQ2FwYWJpbGl0eSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgU3lzdGVtQ2FwYWJpbGl0eSB9IGZyb20gJy4uL3N0cnVjdHMvU3lzdGVtQ2FwYWJpbGl0eS5qcyc7XG5cbmNsYXNzIEdldFN5c3RlbUNhcGFiaWxpdHlSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkdldFN5c3RlbUNhcGFiaWxpdHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3lzdGVtQ2FwYWJpbGl0eX0gY2FwYWJpbGl0eSAtIFRoZSBzeXN0ZW1DYXBhYmlsaXR5VHlwZSBpZGVudGlmaWVzIHdoaWNoIGRhdGEgb2JqZWN0IGV4aXN0cyBpbiB0aGlzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LiBGb3IgZXhhbXBsZSwgaWYgdGhlIFN5c3RlbUNhcGFiaWxpdHkgVHlwZSBpcyBOQVZJR0FUSU9OIHRoZW4gYVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmF2aWdhdGlvbkNhcGFiaWxpdHlcIiBzaG91bGQgZXhpc3RcbiAgICAgKiBAcmV0dXJuIHtHZXRTeXN0ZW1DYXBhYmlsaXR5UmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0U3lzdGVtQ2FwYWJpbGl0eSAoY2FwYWJpbGl0eSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTeXN0ZW1DYXBhYmlsaXR5LCBjYXBhYmlsaXR5KTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0U3lzdGVtQ2FwYWJpbGl0eVJlc3BvbnNlLktFWV9TWVNURU1fQ0FQQUJJTElUWSwgY2FwYWJpbGl0eSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N5c3RlbUNhcGFiaWxpdHl9XG4gICAgICovXG4gICAgZ2V0U3lzdGVtQ2FwYWJpbGl0eSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTeXN0ZW1DYXBhYmlsaXR5LCBHZXRTeXN0ZW1DYXBhYmlsaXR5UmVzcG9uc2UuS0VZX1NZU1RFTV9DQVBBQklMSVRZKTtcbiAgICB9XG59XG5cbkdldFN5c3RlbUNhcGFiaWxpdHlSZXNwb25zZS5LRVlfU1lTVEVNX0NBUEFCSUxJVFkgPSAnc3lzdGVtQ2FwYWJpbGl0eSc7XG5cbmV4cG9ydCB7IEdldFN5c3RlbUNhcGFiaWxpdHlSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5cbmNsYXNzIFJlY3RhbmdsZSBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHggLSBUaGUgdXBwZXIgbGVmdCBYLWNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZVxuICAgICAqIEByZXR1cm4ge1JlY3RhbmdsZX1cbiAgICAgKi9cbiAgICBzZXRYICh4KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlY3RhbmdsZS5LRVlfWCwgeCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRYICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJlY3RhbmdsZS5LRVlfWCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHkgLSBUaGUgdXBwZXIgbGVmdCBZLWNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZVxuICAgICAqIEByZXR1cm4ge1JlY3RhbmdsZX1cbiAgICAgKi9cbiAgICBzZXRZICh5KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlY3RhbmdsZS5LRVlfWSwgeSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRZICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJlY3RhbmdsZS5LRVlfWSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGVcbiAgICAgKiBAcmV0dXJuIHtSZWN0YW5nbGV9XG4gICAgICovXG4gICAgc2V0V2lkdGggKHdpZHRoKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFJlY3RhbmdsZS5LRVlfV0lEVEgsIHdpZHRoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFdpZHRoICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFJlY3RhbmdsZS5LRVlfV0lEVEgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGVcbiAgICAgKiBAcmV0dXJuIHtSZWN0YW5nbGV9XG4gICAgICovXG4gICAgc2V0SGVpZ2h0IChoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUmVjdGFuZ2xlLktFWV9IRUlHSFQsIGhlaWdodCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRIZWlnaHQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUmVjdGFuZ2xlLktFWV9IRUlHSFQpO1xuICAgIH1cbn1cblxuUmVjdGFuZ2xlLktFWV9YID0gJ3gnO1xuUmVjdGFuZ2xlLktFWV9ZID0gJ3knO1xuUmVjdGFuZ2xlLktFWV9XSURUSCA9ICd3aWR0aCc7XG5SZWN0YW5nbGUuS0VZX0hFSUdIVCA9ICdoZWlnaHQnO1xuXG5leHBvcnQgeyBSZWN0YW5nbGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBSZWN0YW5nbGUgfSBmcm9tICcuL1JlY3RhbmdsZS5qcyc7XG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG4vKipcbiAqIERlZmluZXMgaGFwdGljIGRhdGEgZm9yIGVhY2ggdXNlciBjb250cm9sIG9iamVjdCBmb3IgdmlkZW8gc3RyZWFtaW5nIGFwcGxpY2F0aW9uXG4gKi9cbmNsYXNzIEhhcHRpY1JlY3QgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpZCAtIEEgdXNlciBjb250cm9sIHNwYXRpYWwgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4ge0hhcHRpY1JlY3R9XG4gICAgICovXG4gICAgc2V0SWQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEhhcHRpY1JlY3QuS0VZX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRJZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihIYXB0aWNSZWN0LktFWV9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtSZWN0YW5nbGV9IHJlY3QgLSBUaGUgcG9zaXRpb24gb2YgdGhlIGhhcHRpYyByZWN0YW5nbGUgdG8gYmUgaGlnaGxpZ2h0ZWQuIFRoZSBjZW50ZXIgb2YgdGhpcyByZWN0YW5nbGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgXCJ0b3VjaGVkXCIgd2hlbiBhIHByZXNzIG9jY3Vycy5cbiAgICAgKiBAcmV0dXJuIHtIYXB0aWNSZWN0fVxuICAgICAqL1xuICAgIHNldFJlY3QgKHJlY3QpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoUmVjdGFuZ2xlLCByZWN0KTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSGFwdGljUmVjdC5LRVlfUkVDVCwgcmVjdCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1JlY3RhbmdsZX1cbiAgICAgKi9cbiAgICBnZXRSZWN0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFJlY3RhbmdsZSwgSGFwdGljUmVjdC5LRVlfUkVDVCk7XG4gICAgfVxufVxuXG5IYXB0aWNSZWN0LktFWV9JRCA9ICdpZCc7XG5IYXB0aWNSZWN0LktFWV9SRUNUID0gJ3JlY3QnO1xuXG5leHBvcnQgeyBIYXB0aWNSZWN0IH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgSGFwdGljUmVjdCB9IGZyb20gJy4uL3N0cnVjdHMvSGFwdGljUmVjdC5qcyc7XG5cbi8qKlxuICogU2VuZCB0aGUgc3BhdGlhbCBkYXRhIGdhdGhlcmVkIGZyb20gU0RMQ2FyV2luZG93IG9yIFZpcnR1YWxEaXNwbGF5RW5jb2RlciB0byB0aGUgSE1JLiBUaGlzIGRhdGEgd2lsbCBiZSB1dGlsaXplZCBieVxuICogdGhlIEhNSSB0byBkZXRlcm1pbmUgaG93IGFuZCB3aGVuIGhhcHRpYyBldmVudHMgc2hvdWxkIG9jY3VyXG4gKi9cbmNsYXNzIFNlbmRIYXB0aWNEYXRhIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5TZW5kSGFwdGljRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIYXB0aWNSZWN0W119IGRhdGEgLSBBcnJheSBvZiBzcGF0aWFsIGRhdGEgc3RydWN0dXJlcyB0aGF0IHJlcHJlc2VudCB0aGUgbG9jYXRpb25zIG9mIGFsbCB1c2VyIGNvbnRyb2xzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50IG9uIHRoZSBITUkuIFRoaXMgZGF0YSBzaG91bGQgYmUgdXBkYXRlZCBpZi93aGVuIHRoZSBhcHBsaWNhdGlvbiBwcmVzZW50cyBhXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgc2NyZWVuLiBXaGVuIGEgcmVxdWVzdCBpcyBzZW50LCBpZiBzdWNjZXNzZnVsLCBpdCB3aWxsIHJlcGxhY2UgYWxsIHNwYXRpYWwgZGF0YVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNseSBzZW50IHRocm91Z2ggUlBDLiBJZiBhbiBlbXB0eSBhcnJheSBpcyBzZW50LCB0aGUgZXhpc3Rpbmcgc3BhdGlhbCBkYXRhXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGNsZWFyZWRcbiAgICAgKiBAcmV0dXJuIHtTZW5kSGFwdGljRGF0YX1cbiAgICAgKi9cbiAgICBzZXRIYXB0aWNSZWN0RGF0YSAoZGF0YSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShIYXB0aWNSZWN0LCBkYXRhLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2VuZEhhcHRpY0RhdGEuS0VZX0hBUFRJQ19SRUNUX0RBVEEsIGRhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtIYXB0aWNSZWN0W119XG4gICAgICovXG4gICAgZ2V0SGFwdGljUmVjdERhdGEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSGFwdGljUmVjdCwgU2VuZEhhcHRpY0RhdGEuS0VZX0hBUFRJQ19SRUNUX0RBVEEpO1xuICAgIH1cbn1cblxuU2VuZEhhcHRpY0RhdGEuS0VZX0hBUFRJQ19SRUNUX0RBVEEgPSAnaGFwdGljUmVjdERhdGEnO1xuXG5leHBvcnQgeyBTZW5kSGFwdGljRGF0YSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBTZW5kSGFwdGljRGF0YVJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuU2VuZEhhcHRpY0RhdGEpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBTZW5kSGFwdGljRGF0YVJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogRW51bWVyYXRpb24gZm9yIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZSBvZiB3aGljaCBhcHAgdHlwZSB0byB1c2Ugd2hlbiBib3RoIGFyZSBhdmFpbGFibGVcbiAqIEB0eXBlZGVmIHtFbnVtfSBIeWJyaWRBcHBQcmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBIeWJyaWRBcHBQcmVmZXJlbmNlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE1PQklMRSAoKSB7XG4gICAgICAgIHJldHVybiBIeWJyaWRBcHBQcmVmZXJlbmNlLl9NQVAuTU9CSUxFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IENMT1VEICgpIHtcbiAgICAgICAgcmV0dXJuIEh5YnJpZEFwcFByZWZlcmVuY2UuX01BUC5DTE9VRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBCT1RIICgpIHtcbiAgICAgICAgcmV0dXJuIEh5YnJpZEFwcFByZWZlcmVuY2UuX01BUC5CT1RIO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEh5YnJpZEFwcFByZWZlcmVuY2UuX3ZhbHVlRm9yS2V5KGtleSwgSHlicmlkQXBwUHJlZmVyZW5jZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEh5YnJpZEFwcFByZWZlcmVuY2UuX2tleUZvclZhbHVlKHZhbHVlLCBIeWJyaWRBcHBQcmVmZXJlbmNlLl9NQVApO1xuICAgIH1cbn1cblxuSHlicmlkQXBwUHJlZmVyZW5jZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ01PQklMRSc6ICdNT0JJTEUnLFxuICAgICdDTE9VRCc6ICdDTE9VRCcsXG4gICAgJ0JPVEgnOiAnQk9USCcsXG59KTtcblxuZXhwb3J0IHsgSHlicmlkQXBwUHJlZmVyZW5jZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBIeWJyaWRBcHBQcmVmZXJlbmNlIH0gZnJvbSAnLi4vZW51bXMvSHlicmlkQXBwUHJlZmVyZW5jZS5qcyc7XG5cbmNsYXNzIENsb3VkQXBwUHJvcGVydGllcyBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmdbXX0gbmlja25hbWVzIC0gQW4gYXJyYXkgb2YgYXBwIG5hbWVzIGEgY2xvdWQgYXBwIGlzIGFsbG93ZWQgdG8gcmVnaXN0ZXIgd2l0aC4gSWYgaW5jbHVkZWQgaW4gYVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldENsb3VkQXBwUHJvcGVydGllcyByZXF1ZXN0LCB0aGlzIHZhbHVlIHdpbGwgb3ZlcndyaXRlIHRoZSBleGlzdGluZyBcIm5pY2tuYW1lc1wiXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIGFwcCBwb2xpY2llcyBzZWN0aW9uIG9mIHRoZSBwb2xpY3kgdGFibGUuXG4gICAgICogQHJldHVybiB7Q2xvdWRBcHBQcm9wZXJ0aWVzfVxuICAgICAqL1xuICAgIHNldE5pY2tuYW1lcyAobmlja25hbWVzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsb3VkQXBwUHJvcGVydGllcy5LRVlfTklDS05BTUVTLCBuaWNrbmFtZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmdbXX1cbiAgICAgKi9cbiAgICBnZXROaWNrbmFtZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ2xvdWRBcHBQcm9wZXJ0aWVzLktFWV9OSUNLTkFNRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZFxuICAgICAqIEByZXR1cm4ge0Nsb3VkQXBwUHJvcGVydGllc31cbiAgICAgKi9cbiAgICBzZXRBcHBJRCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2xvdWRBcHBQcm9wZXJ0aWVzLktFWV9BUFBfSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldEFwcElEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKENsb3VkQXBwUHJvcGVydGllcy5LRVlfQVBQX0lEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBJZiB0cnVlLCBjbG91ZCBhcHAgd2lsbCBiZSBpbmNsdWRlZCBpbiBITUkgUlBDIFVwZGF0ZUFwcExpc3RcbiAgICAgKiBAcmV0dXJuIHtDbG91ZEFwcFByb3BlcnRpZXN9XG4gICAgICovXG4gICAgc2V0RW5hYmxlZCAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDbG91ZEFwcFByb3BlcnRpZXMuS0VZX0VOQUJMRUQsIGVuYWJsZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldEVuYWJsZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ2xvdWRBcHBQcm9wZXJ0aWVzLktFWV9FTkFCTEVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdG9rZW4gLSBVc2VkIHRvIGF1dGhlbnRpY2F0ZSB3ZWJzb2NrZXQgY29ubmVjdGlvbiBvbiBhcHAgYWN0aXZhdGlvblxuICAgICAqIEByZXR1cm4ge0Nsb3VkQXBwUHJvcGVydGllc31cbiAgICAgKi9cbiAgICBzZXRBdXRoVG9rZW4gKHRva2VuKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsb3VkQXBwUHJvcGVydGllcy5LRVlfQVVUSF9UT0tFTiwgdG9rZW4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0QXV0aFRva2VuICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKENsb3VkQXBwUHJvcGVydGllcy5LRVlfQVVUSF9UT0tFTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBTcGVjaWZpZXMgdGhlIGNvbm5lY3Rpb24gdHlwZSBDb3JlIHNob3VsZCB1c2VcbiAgICAgKiBAcmV0dXJuIHtDbG91ZEFwcFByb3BlcnRpZXN9XG4gICAgICovXG4gICAgc2V0Q2xvdWRUcmFuc3BvcnRUeXBlICh0eXBlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKENsb3VkQXBwUHJvcGVydGllcy5LRVlfQ0xPVURfVFJBTlNQT1JUX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0Q2xvdWRUcmFuc3BvcnRUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKENsb3VkQXBwUHJvcGVydGllcy5LRVlfQ0xPVURfVFJBTlNQT1JUX1RZUEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SHlicmlkQXBwUHJlZmVyZW5jZX0gcHJlZmVyZW5jZSAtIFNwZWNpZmllcyB0aGUgdXNlciBwcmVmZXJlbmNlIHRvIHVzZSB0aGUgY2xvdWQgYXBwIHZlcnNpb24gb3IgbW9iaWxlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIHZlcnNpb24gd2hlbiBib3RoIGFyZSBhdmFpbGFibGVcbiAgICAgKiBAcmV0dXJuIHtDbG91ZEFwcFByb3BlcnRpZXN9XG4gICAgICovXG4gICAgc2V0SHlicmlkQXBwUHJlZmVyZW5jZSAocHJlZmVyZW5jZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShIeWJyaWRBcHBQcmVmZXJlbmNlLCBwcmVmZXJlbmNlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2xvdWRBcHBQcm9wZXJ0aWVzLktFWV9IWUJSSURfQVBQX1BSRUZFUkVOQ0UsIHByZWZlcmVuY2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtIeWJyaWRBcHBQcmVmZXJlbmNlfVxuICAgICAqL1xuICAgIGdldEh5YnJpZEFwcFByZWZlcmVuY2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSHlicmlkQXBwUHJlZmVyZW5jZSwgQ2xvdWRBcHBQcm9wZXJ0aWVzLktFWV9IWUJSSURfQVBQX1BSRUZFUkVOQ0UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBlbmRwb2ludCAtIFNwZWNpZmllcyB0aGUgZW5kcG9pbnQgd2hpY2ggQ29yZSB3aWxsIGF0dGVtcHQgdG8gY29ubmVjdCB0byB3aGVuIHRoaXMgYXBwIGlzIHNlbGVjdGVkXG4gICAgICogQHJldHVybiB7Q2xvdWRBcHBQcm9wZXJ0aWVzfVxuICAgICAqL1xuICAgIHNldEVuZHBvaW50IChlbmRwb2ludCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDbG91ZEFwcFByb3BlcnRpZXMuS0VZX0VORFBPSU5ULCBlbmRwb2ludCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRFbmRwb2ludCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihDbG91ZEFwcFByb3BlcnRpZXMuS0VZX0VORFBPSU5UKTtcbiAgICB9XG59XG5cbkNsb3VkQXBwUHJvcGVydGllcy5LRVlfTklDS05BTUVTID0gJ25pY2tuYW1lcyc7XG5DbG91ZEFwcFByb3BlcnRpZXMuS0VZX0FQUF9JRCA9ICdhcHBJRCc7XG5DbG91ZEFwcFByb3BlcnRpZXMuS0VZX0VOQUJMRUQgPSAnZW5hYmxlZCc7XG5DbG91ZEFwcFByb3BlcnRpZXMuS0VZX0FVVEhfVE9LRU4gPSAnYXV0aFRva2VuJztcbkNsb3VkQXBwUHJvcGVydGllcy5LRVlfQ0xPVURfVFJBTlNQT1JUX1RZUEUgPSAnY2xvdWRUcmFuc3BvcnRUeXBlJztcbkNsb3VkQXBwUHJvcGVydGllcy5LRVlfSFlCUklEX0FQUF9QUkVGRVJFTkNFID0gJ2h5YnJpZEFwcFByZWZlcmVuY2UnO1xuQ2xvdWRBcHBQcm9wZXJ0aWVzLktFWV9FTkRQT0lOVCA9ICdlbmRwb2ludCc7XG5cbmV4cG9ydCB7IENsb3VkQXBwUHJvcGVydGllcyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IENsb3VkQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3N0cnVjdHMvQ2xvdWRBcHBQcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBSUEMgdXNlZCB0byBlbmFibGUvZGlzYWJsZSBhIGNsb3VkIGFwcGxpY2F0aW9uIGFuZCBzZXQgaXRzIGNsb3VkLXJlbGF0ZWQgcG9saWN5IHByb3BlcnRpZXNcbiAqL1xuY2xhc3MgU2V0Q2xvdWRBcHBQcm9wZXJ0aWVzIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5TZXRDbG91ZEFwcFByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q2xvdWRBcHBQcm9wZXJ0aWVzfSBwcm9wZXJ0aWVzIC0gVGhlIG5ldyBjbG91ZCBhcHBsaWNhdGlvbiBwcm9wZXJ0aWVzXG4gICAgICogQHJldHVybiB7U2V0Q2xvdWRBcHBQcm9wZXJ0aWVzfVxuICAgICAqL1xuICAgIHNldFByb3BlcnRpZXMgKHByb3BlcnRpZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQ2xvdWRBcHBQcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoU2V0Q2xvdWRBcHBQcm9wZXJ0aWVzLktFWV9QUk9QRVJUSUVTLCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Q2xvdWRBcHBQcm9wZXJ0aWVzfVxuICAgICAqL1xuICAgIGdldFByb3BlcnRpZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQ2xvdWRBcHBQcm9wZXJ0aWVzLCBTZXRDbG91ZEFwcFByb3BlcnRpZXMuS0VZX1BST1BFUlRJRVMpO1xuICAgIH1cbn1cblxuU2V0Q2xvdWRBcHBQcm9wZXJ0aWVzLktFWV9QUk9QRVJUSUVTID0gJ3Byb3BlcnRpZXMnO1xuXG5leHBvcnQgeyBTZXRDbG91ZEFwcFByb3BlcnRpZXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuLyoqXG4gKiBUaGUgcmVzcG9uc2UgdG8gU2V0Q2xvdWRBcHBQcm9wZXJ0aWVzXG4gKi9cbmNsYXNzIFNldENsb3VkQXBwUHJvcGVydGllc1Jlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuU2V0Q2xvdWRBcHBQcm9wZXJ0aWVzKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgU2V0Q2xvdWRBcHBQcm9wZXJ0aWVzUmVzcG9uc2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbi8qKlxuICogUlBDIHVzZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHByb3BlcnRpZXMgb2YgYSBjbG91ZCBhcHBsaWNhdGlvblxuICovXG5jbGFzcyBHZXRDbG91ZEFwcFByb3BlcnRpZXMgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkdldENsb3VkQXBwUHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGlkXG4gICAgICogQHJldHVybiB7R2V0Q2xvdWRBcHBQcm9wZXJ0aWVzfVxuICAgICAqL1xuICAgIHNldEFwcElEIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihHZXRDbG91ZEFwcFByb3BlcnRpZXMuS0VZX0FQUF9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0QXBwSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0Q2xvdWRBcHBQcm9wZXJ0aWVzLktFWV9BUFBfSUQpO1xuICAgIH1cbn1cblxuR2V0Q2xvdWRBcHBQcm9wZXJ0aWVzLktFWV9BUFBfSUQgPSAnYXBwSUQnO1xuXG5leHBvcnQgeyBHZXRDbG91ZEFwcFByb3BlcnRpZXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBDbG91ZEFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi9zdHJ1Y3RzL0Nsb3VkQXBwUHJvcGVydGllcy5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuLyoqXG4gKiBUaGUgcmVzcG9uc2UgdG8gR2V0Q2xvdWRBcHBQcm9wZXJ0aWVzXG4gKi9cbmNsYXNzIEdldENsb3VkQXBwUHJvcGVydGllc1Jlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuR2V0Q2xvdWRBcHBQcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Nsb3VkQXBwUHJvcGVydGllc30gcHJvcGVydGllcyAtIFRoZSByZXF1ZXN0ZWQgY2xvdWQgYXBwbGljYXRpb24gcHJvcGVydGllc1xuICAgICAqIEByZXR1cm4ge0dldENsb3VkQXBwUHJvcGVydGllc1Jlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFByb3BlcnRpZXMgKHByb3BlcnRpZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQ2xvdWRBcHBQcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0Q2xvdWRBcHBQcm9wZXJ0aWVzUmVzcG9uc2UuS0VZX1BST1BFUlRJRVMsIHByb3BlcnRpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtDbG91ZEFwcFByb3BlcnRpZXN9XG4gICAgICovXG4gICAgZ2V0UHJvcGVydGllcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChDbG91ZEFwcFByb3BlcnRpZXMsIEdldENsb3VkQXBwUHJvcGVydGllc1Jlc3BvbnNlLktFWV9QUk9QRVJUSUVTKTtcbiAgICB9XG59XG5cbkdldENsb3VkQXBwUHJvcGVydGllc1Jlc3BvbnNlLktFWV9QUk9QRVJUSUVTID0gJ3Byb3BlcnRpZXMnO1xuXG5leHBvcnQgeyBHZXRDbG91ZEFwcFByb3BlcnRpZXNSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEFwcFNlcnZpY2VNYW5pZmVzdCB9IGZyb20gJy4uL3N0cnVjdHMvQXBwU2VydmljZU1hbmlmZXN0LmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBzZXJ2aWNlIG9mZmVyZWQgYnkgdGhpcyBhcHAgb24gdGhlIG1vZHVsZS4gU3Vic2VxdWVudCBjYWxscyB3aXRoIHRoZSBzYW1lIHNlcnZpY2UgdHlwZSB3aWxsIHVwZGF0ZSB0aGVcbiAqIG1hbmlmZXN0IGZvciB0aGF0IHNlcnZpY2UuXG4gKi9cbmNsYXNzIFB1Ymxpc2hBcHBTZXJ2aWNlIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5QdWJsaXNoQXBwU2VydmljZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcHBTZXJ2aWNlTWFuaWZlc3R9IG1hbmlmZXN0IC0gVGhlIG1hbmlmZXN0IG9mIHRoZSBzZXJ2aWNlIHRoYXQgd2lzaGVzIHRvIGJlIHB1Ymxpc2hlZC4gSWYgYWxyZWFkeVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hlZCwgdGhlIHVwZGF0ZWQgbWFuaWZlc3QgZm9yIHRoaXMgc2VydmljZS5cbiAgICAgKiBAcmV0dXJuIHtQdWJsaXNoQXBwU2VydmljZX1cbiAgICAgKi9cbiAgICBzZXRBcHBTZXJ2aWNlTWFuaWZlc3QgKG1hbmlmZXN0KSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEFwcFNlcnZpY2VNYW5pZmVzdCwgbWFuaWZlc3QpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQdWJsaXNoQXBwU2VydmljZS5LRVlfQVBQX1NFUlZJQ0VfTUFOSUZFU1QsIG1hbmlmZXN0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QXBwU2VydmljZU1hbmlmZXN0fVxuICAgICAqL1xuICAgIGdldEFwcFNlcnZpY2VNYW5pZmVzdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChBcHBTZXJ2aWNlTWFuaWZlc3QsIFB1Ymxpc2hBcHBTZXJ2aWNlLktFWV9BUFBfU0VSVklDRV9NQU5JRkVTVCk7XG4gICAgfVxufVxuXG5QdWJsaXNoQXBwU2VydmljZS5LRVlfQVBQX1NFUlZJQ0VfTUFOSUZFU1QgPSAnYXBwU2VydmljZU1hbmlmZXN0JztcblxuZXhwb3J0IHsgUHVibGlzaEFwcFNlcnZpY2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IEFwcFNlcnZpY2VSZWNvcmQgfSBmcm9tICcuLi9zdHJ1Y3RzL0FwcFNlcnZpY2VSZWNvcmQuanMnO1xuXG4vKipcbiAqIFJlc3BvbnNlIHRvIHRoZSByZXF1ZXN0IHRvIHJlZ2lzdGVyIGEgc2VydmljZSBvZmZlcmVkIGJ5IHRoaXMgYXBwIG9uIHRoZSBtb2R1bGVcbiAqL1xuY2xhc3MgUHVibGlzaEFwcFNlcnZpY2VSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlB1Ymxpc2hBcHBTZXJ2aWNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FwcFNlcnZpY2VSZWNvcmR9IHJlY29yZCAtIElmIHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgcmVjb3JkIGZvciB0aGUgcHVibGlzaGVkIHNlcnZpY2UuIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBDb3JlIHN1cHBsaWVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlIElELlxuICAgICAqIEByZXR1cm4ge1B1Ymxpc2hBcHBTZXJ2aWNlUmVzcG9uc2V9XG4gICAgICovXG4gICAgc2V0QXBwU2VydmljZVJlY29yZCAocmVjb3JkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEFwcFNlcnZpY2VSZWNvcmQsIHJlY29yZCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFB1Ymxpc2hBcHBTZXJ2aWNlUmVzcG9uc2UuS0VZX0FQUF9TRVJWSUNFX1JFQ09SRCwgcmVjb3JkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QXBwU2VydmljZVJlY29yZH1cbiAgICAgKi9cbiAgICBnZXRBcHBTZXJ2aWNlUmVjb3JkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEFwcFNlcnZpY2VSZWNvcmQsIFB1Ymxpc2hBcHBTZXJ2aWNlUmVzcG9uc2UuS0VZX0FQUF9TRVJWSUNFX1JFQ09SRCk7XG4gICAgfVxufVxuXG5QdWJsaXNoQXBwU2VydmljZVJlc3BvbnNlLktFWV9BUFBfU0VSVklDRV9SRUNPUkQgPSAnYXBwU2VydmljZVJlY29yZCc7XG5cbmV4cG9ydCB7IFB1Ymxpc2hBcHBTZXJ2aWNlUmVzcG9uc2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnLi4vUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5cbi8qKlxuICogVW5wdWJsaXNoIGFuIGV4aXN0aW5nIHNlcnZpY2UgcHVibGlzaGVkIGJ5IHRoaXMgYXBwbGljYXRpb24uXG4gKi9cbmNsYXNzIFVucHVibGlzaEFwcFNlcnZpY2UgZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELlVucHVibGlzaEFwcFNlcnZpY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIFRoZSBJRCBvZiB0aGUgc2VydmljZSB0byBiZSB1bnB1Ymxpc2hlZC5cbiAgICAgKiBAcmV0dXJuIHtVbnB1Ymxpc2hBcHBTZXJ2aWNlfVxuICAgICAqL1xuICAgIHNldFNlcnZpY2VJRCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVW5wdWJsaXNoQXBwU2VydmljZS5LRVlfU0VSVklDRV9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0U2VydmljZUlEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFVucHVibGlzaEFwcFNlcnZpY2UuS0VZX1NFUlZJQ0VfSUQpO1xuICAgIH1cbn1cblxuVW5wdWJsaXNoQXBwU2VydmljZS5LRVlfU0VSVklDRV9JRCA9ICdzZXJ2aWNlSUQnO1xuXG5leHBvcnQgeyBVbnB1Ymxpc2hBcHBTZXJ2aWNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgUnBjUmVzcG9uc2UgfSBmcm9tICcuLi9ScGNSZXNwb25zZS5qcyc7XG5cbi8qKlxuICogVGhlIHJlc3BvbnNlIHRvIFVucHVibGlzaEFwcFNlcnZpY2VcbiAqL1xuY2xhc3MgVW5wdWJsaXNoQXBwU2VydmljZVJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuVW5wdWJsaXNoQXBwU2VydmljZSk7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB7IFVucHVibGlzaEFwcFNlcnZpY2VSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBUaGlzIHJlcXVlc3QgYXNrcyB0aGUgbW9kdWxlIGZvciBjdXJyZW50IGRhdGEgcmVsYXRlZCB0byB0aGUgc3BlY2lmaWMgc2VydmljZS4gSXQgYWxzbyBpbmNsdWRlcyBhbiBvcHRpb24gdG9cbiAqIHN1YnNjcmliZSB0byB0aGF0IHNlcnZpY2UgZm9yIGZ1dHVyZSB1cGRhdGVzXG4gKi9cbmNsYXNzIEdldEFwcFNlcnZpY2VEYXRhIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5HZXRBcHBTZXJ2aWNlRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBzZXJ2aWNlIHRoYXQgaXMgdG8gYmUgb2ZmZXJlZCBieSB0aGlzIGFwcC4gU2VlIEFwcFNlcnZpY2VUeXBlIGZvciBrbm93biBlbnVtXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBlcXVpdmFsZW50IHR5cGVzLiBQYXJhbWV0ZXIgaXMgYSBzdHJpbmcgdG8gYWxsb3cgZm9yIG5ldyBzZXJ2aWNlIHR5cGVzIHRvIGJlIHVzZWQgYnkgYXBwc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb24gb2xkZXIgdmVyc2lvbnMgb2YgU0RMIENvcmUuXG4gICAgICogQHJldHVybiB7R2V0QXBwU2VydmljZURhdGF9XG4gICAgICovXG4gICAgc2V0U2VydmljZVR5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0QXBwU2VydmljZURhdGEuS0VZX1NFUlZJQ0VfVFlQRSwgdHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRTZXJ2aWNlVHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihHZXRBcHBTZXJ2aWNlRGF0YS5LRVlfU0VSVklDRV9UWVBFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHN1YnNjcmliZSAtIElmIHRydWUsIHRoZSBjb25zdW1lciBpcyByZXF1ZXN0aW5nIHRvIHN1YnNjcmliZSB0byBhbGwgZnV0dXJlIHVwZGF0ZXMgZnJvbSB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgcHVibGlzaGVyLiBJZiBmYWxzZSwgdGhlIGNvbnN1bWVyIGRvZXNuJ3Qgd2lzaCB0byBzdWJzY3JpYmUgYW5kIHNob3VsZCBiZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zdWJzY3JpYmVkIGlmIGl0IHdhcyBwcmV2aW91c2x5IHN1YnNjcmliZWQuXG4gICAgICogQHJldHVybiB7R2V0QXBwU2VydmljZURhdGF9XG4gICAgICovXG4gICAgc2V0U3Vic2NyaWJlIChzdWJzY3JpYmUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0QXBwU2VydmljZURhdGEuS0VZX1NVQlNDUklCRSwgc3Vic2NyaWJlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRTdWJzY3JpYmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoR2V0QXBwU2VydmljZURhdGEuS0VZX1NVQlNDUklCRSk7XG4gICAgfVxufVxuXG5HZXRBcHBTZXJ2aWNlRGF0YS5LRVlfU0VSVklDRV9UWVBFID0gJ3NlcnZpY2VUeXBlJztcbkdldEFwcFNlcnZpY2VEYXRhLktFWV9TVUJTQ1JJQkUgPSAnc3Vic2NyaWJlJztcblxuZXhwb3J0IHsgR2V0QXBwU2VydmljZURhdGEgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gTmF2aWdhdGlvbkp1bmN0aW9uXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBOYXZpZ2F0aW9uSnVuY3Rpb24gZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBqdW5jdGlvbiB0aGF0IHJlcHJlc2VudHMgYSBzdGFuZGFyZCBpbnRlcnNlY3Rpb24gd2l0aCBhIHNpbmdsZSByb2FkIGNyb3NzaW5nIGFub3RoZXIuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUkVHVUxBUiAoKSB7XG4gICAgICAgIHJldHVybiBOYXZpZ2F0aW9uSnVuY3Rpb24uX01BUC5SRUdVTEFSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEganVuY3Rpb24gd2hlcmUgdGhlIHJvYWQgc3BsaXRzIG9mZiBpbnRvIHR3byBwYXRoczsgYSBmb3JrIGluIHRoZSByb2FkLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEJJRlVSQ0FUSU9OICgpIHtcbiAgICAgICAgcmV0dXJuIE5hdmlnYXRpb25KdW5jdGlvbi5fTUFQLkJJRlVSQ0FUSU9OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEganVuY3Rpb24gdGhhdCBoYXMgbXVsdGlwbGUgaW50ZXJzZWN0aW9ucyBhbmQgcGF0aHMuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTVVMVElfQ0FSUklBR0VXQVkgKCkge1xuICAgICAgICByZXR1cm4gTmF2aWdhdGlvbkp1bmN0aW9uLl9NQVAuTVVMVElfQ0FSUklBR0VXQVk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBqdW5jdGlvbiB3aGVyZSB0cmFmZmljIG1vdmVzIGluIGEgc2luZ2xlIGRpcmVjdGlvbiBhcm91bmQgYSBjZW50cmFsLCBub24tdHJhdmVyc2FibGUgcG9pbnQgdG8gcmVhY2ggb25lIG9mXG4gICAgICogdGhlIGNvbm5lY3Rpbmcgcm9hZHMuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUk9VTkRBQk9VVCAoKSB7XG4gICAgICAgIHJldHVybiBOYXZpZ2F0aW9uSnVuY3Rpb24uX01BUC5ST1VOREFCT1VUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNpbWlsYXIgdG8gYSByb3VuZGFib3V0LCBob3dldmVyIHRoZSBjZW50ZXIgb2YgdGhlIHJvdW5kYWJvdXQgaXMgZnVsbHkgdHJhdmVyc2FibGUuIEFsc28ga25vd24gYXMgYSBtaW5pLVxuICAgICAqIHJvdW5kYWJvdXQuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVFJBVkVSU0FCTEVfUk9VTkRBQk9VVCAoKSB7XG4gICAgICAgIHJldHVybiBOYXZpZ2F0aW9uSnVuY3Rpb24uX01BUC5UUkFWRVJTQUJMRV9ST1VOREFCT1VUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEganVuY3Rpb24gd2hlcmUgbGVmdHMgZGl2ZXJnZSB0byB0aGUgcmlnaHQsIHRoZW4gY3VydmUgdG8gdGhlIGxlZnQsIGNvbnZlcnRpbmcgYSBsZWZ0IHR1cm4gdG8gYSBjcm9zc2luZ1xuICAgICAqIG1hbmV1dmVyLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEpVR0hBTkRMRSAoKSB7XG4gICAgICAgIHJldHVybiBOYXZpZ2F0aW9uSnVuY3Rpb24uX01BUC5KVUdIQU5ETEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbGUgd2F5IGludGVyc2VjdGlvbiB0aGF0IGFsbG93cyB0cmFmZmljIHRvIGZsb3cgYmFzZWQgb24gcHJpb3JpdHk7IG1vc3QgY29tbW9ubHkgcmlnaHQgb2Ygd2F5IGFuZCBmaXJzdFxuICAgICAqIGluLCBmaXJzdCBvdXQuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQUxMX1dBWV9ZSUVMRCAoKSB7XG4gICAgICAgIHJldHVybiBOYXZpZ2F0aW9uSnVuY3Rpb24uX01BUC5BTExfV0FZX1lJRUxEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEganVuY3Rpb24gZGVzaWduYXRlZCBmb3IgdHJhZmZpYyB0dXJuIGFyb3VuZHMuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVFVSTl9BUk9VTkQgKCkge1xuICAgICAgICByZXR1cm4gTmF2aWdhdGlvbkp1bmN0aW9uLl9NQVAuVFVSTl9BUk9VTkQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gTmF2aWdhdGlvbkp1bmN0aW9uLl92YWx1ZUZvcktleShrZXksIE5hdmlnYXRpb25KdW5jdGlvbi5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIE5hdmlnYXRpb25KdW5jdGlvbi5fa2V5Rm9yVmFsdWUodmFsdWUsIE5hdmlnYXRpb25KdW5jdGlvbi5fTUFQKTtcbiAgICB9XG59XG5cbk5hdmlnYXRpb25KdW5jdGlvbi5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ1JFR1VMQVInOiAnUkVHVUxBUicsXG4gICAgJ0JJRlVSQ0FUSU9OJzogJ0JJRlVSQ0FUSU9OJyxcbiAgICAnTVVMVElfQ0FSUklBR0VXQVknOiAnTVVMVElfQ0FSUklBR0VXQVknLFxuICAgICdST1VOREFCT1VUJzogJ1JPVU5EQUJPVVQnLFxuICAgICdUUkFWRVJTQUJMRV9ST1VOREFCT1VUJzogJ1RSQVZFUlNBQkxFX1JPVU5EQUJPVVQnLFxuICAgICdKVUdIQU5ETEUnOiAnSlVHSEFORExFJyxcbiAgICAnQUxMX1dBWV9ZSUVMRCc6ICdBTExfV0FZX1lJRUxEJyxcbiAgICAnVFVSTl9BUk9VTkQnOiAnVFVSTl9BUk9VTkQnLFxufSk7XG5cbmV4cG9ydCB7IE5hdmlnYXRpb25KdW5jdGlvbiB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBEaXJlY3Rpb25cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIERpcmVjdGlvbiBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBMRUZUICgpIHtcbiAgICAgICAgcmV0dXJuIERpcmVjdGlvbi5fTUFQLkxFRlQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUklHSFQgKCkge1xuICAgICAgICByZXR1cm4gRGlyZWN0aW9uLl9NQVAuUklHSFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gRGlyZWN0aW9uLl92YWx1ZUZvcktleShrZXksIERpcmVjdGlvbi5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIERpcmVjdGlvbi5fa2V5Rm9yVmFsdWUodmFsdWUsIERpcmVjdGlvbi5fTUFQKTtcbiAgICB9XG59XG5cbkRpcmVjdGlvbi5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0xFRlQnOiAnTEVGVCcsXG4gICAgJ1JJR0hUJzogJ1JJR0hUJyxcbn0pO1xuXG5leHBvcnQgeyBEaXJlY3Rpb24gfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7RW51bX0gTmF2aWdhdGlvbkFjdGlvblxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgTmF2aWdhdGlvbkFjdGlvbiBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2luZyB0aGlzIGFjdGlvbiBwbHVzIGEgc3VwcGxpZWQgZGlyZWN0aW9uIGNhbiBnaXZlIHRoZSB0eXBlIG9mIHR1cm4uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVFVSTiAoKSB7XG4gICAgICAgIHJldHVybiBOYXZpZ2F0aW9uQWN0aW9uLl9NQVAuVFVSTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFWElUICgpIHtcbiAgICAgICAgcmV0dXJuIE5hdmlnYXRpb25BY3Rpb24uX01BUC5FWElUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNUQVkgKCkge1xuICAgICAgICByZXR1cm4gTmF2aWdhdGlvbkFjdGlvbi5fTUFQLlNUQVk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTUVSR0UgKCkge1xuICAgICAgICByZXR1cm4gTmF2aWdhdGlvbkFjdGlvbi5fTUFQLk1FUkdFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZFUlJZICgpIHtcbiAgICAgICAgcmV0dXJuIE5hdmlnYXRpb25BY3Rpb24uX01BUC5GRVJSWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDQVJfU0hVVFRMRV9UUkFJTiAoKSB7XG4gICAgICAgIHJldHVybiBOYXZpZ2F0aW9uQWN0aW9uLl9NQVAuQ0FSX1NIVVRUTEVfVFJBSU47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgV0FZUE9JTlQgKCkge1xuICAgICAgICByZXR1cm4gTmF2aWdhdGlvbkFjdGlvbi5fTUFQLldBWVBPSU5UO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIE5hdmlnYXRpb25BY3Rpb24uX3ZhbHVlRm9yS2V5KGtleSwgTmF2aWdhdGlvbkFjdGlvbi5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIE5hdmlnYXRpb25BY3Rpb24uX2tleUZvclZhbHVlKHZhbHVlLCBOYXZpZ2F0aW9uQWN0aW9uLl9NQVApO1xuICAgIH1cbn1cblxuTmF2aWdhdGlvbkFjdGlvbi5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ1RVUk4nOiAnVFVSTicsXG4gICAgJ0VYSVQnOiAnRVhJVCcsXG4gICAgJ1NUQVknOiAnU1RBWScsXG4gICAgJ01FUkdFJzogJ01FUkdFJyxcbiAgICAnRkVSUlknOiAnRkVSUlknLFxuICAgICdDQVJfU0hVVFRMRV9UUkFJTic6ICdDQVJfU0hVVFRMRV9UUkFJTicsXG4gICAgJ1dBWVBPSU5UJzogJ1dBWVBPSU5UJyxcbn0pO1xuXG5leHBvcnQgeyBOYXZpZ2F0aW9uQWN0aW9uIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgSW1hZ2UgfSBmcm9tICcuL0ltYWdlLmpzJztcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnLi9EYXRlVGltZS5qcyc7XG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkp1bmN0aW9uIH0gZnJvbSAnLi4vZW51bXMvTmF2aWdhdGlvbkp1bmN0aW9uLmpzJztcbmltcG9ydCB7IERpcmVjdGlvbiB9IGZyb20gJy4uL2VudW1zL0RpcmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBMb2NhdGlvbkRldGFpbHMgfSBmcm9tICcuL0xvY2F0aW9uRGV0YWlscy5qcyc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uQWN0aW9uIH0gZnJvbSAnLi4vZW51bXMvTmF2aWdhdGlvbkFjdGlvbi5qcyc7XG5cbmNsYXNzIE5hdmlnYXRpb25JbnN0cnVjdGlvbiBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtMb2NhdGlvbkRldGFpbHN9IGRldGFpbHNcbiAgICAgKiBAcmV0dXJuIHtOYXZpZ2F0aW9uSW5zdHJ1Y3Rpb259XG4gICAgICovXG4gICAgc2V0TG9jYXRpb25EZXRhaWxzIChkZXRhaWxzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKExvY2F0aW9uRGV0YWlscywgZGV0YWlscyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE5hdmlnYXRpb25JbnN0cnVjdGlvbi5LRVlfTE9DQVRJT05fREVUQUlMUywgZGV0YWlscyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0xvY2F0aW9uRGV0YWlsc31cbiAgICAgKi9cbiAgICBnZXRMb2NhdGlvbkRldGFpbHMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTG9jYXRpb25EZXRhaWxzLCBOYXZpZ2F0aW9uSW5zdHJ1Y3Rpb24uS0VZX0xPQ0FUSU9OX0RFVEFJTFMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TmF2aWdhdGlvbkFjdGlvbn0gYWN0aW9uXG4gICAgICogQHJldHVybiB7TmF2aWdhdGlvbkluc3RydWN0aW9ufVxuICAgICAqL1xuICAgIHNldEFjdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKE5hdmlnYXRpb25BY3Rpb24sIGFjdGlvbik7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE5hdmlnYXRpb25JbnN0cnVjdGlvbi5LRVlfQUNUSU9OLCBhY3Rpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOYXZpZ2F0aW9uQWN0aW9ufVxuICAgICAqL1xuICAgIGdldEFjdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChOYXZpZ2F0aW9uQWN0aW9uLCBOYXZpZ2F0aW9uSW5zdHJ1Y3Rpb24uS0VZX0FDVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtEYXRlVGltZX0gZXRhXG4gICAgICogQHJldHVybiB7TmF2aWdhdGlvbkluc3RydWN0aW9ufVxuICAgICAqL1xuICAgIHNldEV0YSAoZXRhKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKERhdGVUaW1lLCBldGEpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihOYXZpZ2F0aW9uSW5zdHJ1Y3Rpb24uS0VZX0VUQSwgZXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAgICovXG4gICAgZ2V0RXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KERhdGVUaW1lLCBOYXZpZ2F0aW9uSW5zdHJ1Y3Rpb24uS0VZX0VUQSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGJlYXJpbmcgLSBUaGUgYW5nbGUgYXQgd2hpY2ggdGhpcyBpbnN0cnVjdGlvbiB0YWtlcyBwbGFjZS4gRm9yIGV4YW1wbGUsIDAgd291bGQgbWVhbiBzdHJhaWdodCxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiA0NSBpcyBiZWFyaW5nIHJpZ2h0LCBncmVhdGVyIHRoYW4gMTM1IGlzIHNoYXJwIHJpZ2h0LCBiZXR3ZWVuIDQ1IGFuZCAxMzUgaXMgYVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhciByaWdodCwgYW5kIDE4MCBpcyBhIFUtVHVybiwgZXRjLlxuICAgICAqIEByZXR1cm4ge05hdmlnYXRpb25JbnN0cnVjdGlvbn1cbiAgICAgKi9cbiAgICBzZXRCZWFyaW5nIChiZWFyaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE5hdmlnYXRpb25JbnN0cnVjdGlvbi5LRVlfQkVBUklORywgYmVhcmluZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRCZWFyaW5nICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE5hdmlnYXRpb25JbnN0cnVjdGlvbi5LRVlfQkVBUklORyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOYXZpZ2F0aW9uSnVuY3Rpb259IHR5cGVcbiAgICAgKiBAcmV0dXJuIHtOYXZpZ2F0aW9uSW5zdHJ1Y3Rpb259XG4gICAgICovXG4gICAgc2V0SnVuY3Rpb25UeXBlICh0eXBlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKE5hdmlnYXRpb25KdW5jdGlvbiwgdHlwZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE5hdmlnYXRpb25JbnN0cnVjdGlvbi5LRVlfSlVOQ1RJT05fVFlQRSwgdHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge05hdmlnYXRpb25KdW5jdGlvbn1cbiAgICAgKi9cbiAgICBnZXRKdW5jdGlvblR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTmF2aWdhdGlvbkp1bmN0aW9uLCBOYXZpZ2F0aW9uSW5zdHJ1Y3Rpb24uS0VZX0pVTkNUSU9OX1RZUEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RGlyZWN0aW9ufSBzaWRlIC0gVXNlZCB0byBpbmZlciB3aGljaCBzaWRlIG9mIHRoZSByb2FkIHRoaXMgaW5zdHJ1Y3Rpb24gdGFrZXMgcGxhY2UuIEZvciBhIFUtVHVyblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbj1UVVJOLCBiZWFyaW5nPTE4MCkgdGhpcyB3aWxsIGRldGVybWluZSB3aGljaCBkaXJlY3Rpb24gdGhlIHR1cm4gc2hvdWxkIHRha2VcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlLlxuICAgICAqIEByZXR1cm4ge05hdmlnYXRpb25JbnN0cnVjdGlvbn1cbiAgICAgKi9cbiAgICBzZXREcml2aW5nU2lkZSAoc2lkZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShEaXJlY3Rpb24sIHNpZGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihOYXZpZ2F0aW9uSW5zdHJ1Y3Rpb24uS0VZX0RSSVZJTkdfU0lERSwgc2lkZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0RpcmVjdGlvbn1cbiAgICAgKi9cbiAgICBnZXREcml2aW5nU2lkZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChEaXJlY3Rpb24sIE5hdmlnYXRpb25JbnN0cnVjdGlvbi5LRVlfRFJJVklOR19TSURFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGV0YWlscyAtIFRoaXMgaXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBpbnN0cnVjdGlvbiwgdXNlZCB0byBkaXNwbGF5IGluc3RydWN0aW9ucyB0b1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVzZXJzLiBUaGlzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWFkIGFsb3VkIHRvIHRoZSB1c2Vycywgc2VlIHRoZSBwYXJhbSBwcm9tcHQgaW5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdmlnYXRpb25TZXJ2aWNlRGF0YSBmb3IgdGhhdC5cbiAgICAgKiBAcmV0dXJuIHtOYXZpZ2F0aW9uSW5zdHJ1Y3Rpb259XG4gICAgICovXG4gICAgc2V0RGV0YWlscyAoZGV0YWlscykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihOYXZpZ2F0aW9uSW5zdHJ1Y3Rpb24uS0VZX0RFVEFJTFMsIGRldGFpbHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0RGV0YWlscyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihOYXZpZ2F0aW9uSW5zdHJ1Y3Rpb24uS0VZX0RFVEFJTFMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW1hZ2V9IGltYWdlIC0gQW4gaW1hZ2UgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBpbnN0cnVjdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtOYXZpZ2F0aW9uSW5zdHJ1Y3Rpb259XG4gICAgICovXG4gICAgc2V0SW1hZ2UgKGltYWdlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEltYWdlLCBpbWFnZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE5hdmlnYXRpb25JbnN0cnVjdGlvbi5LRVlfSU1BR0UsIGltYWdlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SW1hZ2V9XG4gICAgICovXG4gICAgZ2V0SW1hZ2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSW1hZ2UsIE5hdmlnYXRpb25JbnN0cnVjdGlvbi5LRVlfSU1BR0UpO1xuICAgIH1cbn1cblxuTmF2aWdhdGlvbkluc3RydWN0aW9uLktFWV9MT0NBVElPTl9ERVRBSUxTID0gJ2xvY2F0aW9uRGV0YWlscyc7XG5OYXZpZ2F0aW9uSW5zdHJ1Y3Rpb24uS0VZX0FDVElPTiA9ICdhY3Rpb24nO1xuTmF2aWdhdGlvbkluc3RydWN0aW9uLktFWV9FVEEgPSAnZXRhJztcbk5hdmlnYXRpb25JbnN0cnVjdGlvbi5LRVlfQkVBUklORyA9ICdiZWFyaW5nJztcbk5hdmlnYXRpb25JbnN0cnVjdGlvbi5LRVlfSlVOQ1RJT05fVFlQRSA9ICdqdW5jdGlvblR5cGUnO1xuTmF2aWdhdGlvbkluc3RydWN0aW9uLktFWV9EUklWSU5HX1NJREUgPSAnZHJpdmluZ1NpZGUnO1xuTmF2aWdhdGlvbkluc3RydWN0aW9uLktFWV9ERVRBSUxTID0gJ2RldGFpbHMnO1xuTmF2aWdhdGlvbkluc3RydWN0aW9uLktFWV9JTUFHRSA9ICdpbWFnZSc7XG5cbmV4cG9ydCB7IE5hdmlnYXRpb25JbnN0cnVjdGlvbiB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnLi9EYXRlVGltZS5qcyc7XG5pbXBvcnQgeyBMb2NhdGlvbkRldGFpbHMgfSBmcm9tICcuL0xvY2F0aW9uRGV0YWlscy5qcyc7XG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkluc3RydWN0aW9uIH0gZnJvbSAnLi9OYXZpZ2F0aW9uSW5zdHJ1Y3Rpb24uanMnO1xuXG4vKipcbiAqIFRoaXMgZGF0YSBpcyByZWxhdGVkIHRvIHdoYXQgYSBuYXZpZ2F0aW9uIHNlcnZpY2Ugd291bGQgcHJvdmlkZS5cbiAqL1xuY2xhc3MgTmF2aWdhdGlvblNlcnZpY2VEYXRhIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBzdGFtcCAtIFRoaXMgaXMgdGhlIHRpbWVzdGFtcCBvZiB3aGVuIHRoZSBkYXRhIHdhcyBnZW5lcmF0ZWQuIFRoaXMgaXMgdG8gZW5zdXJlIGFueSB0aW1lIG9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSBnaXZlbiBpbiB0aGUgZGF0YSBjYW4gYWNjdXJhdGVseSBiZSBhZGp1c3RlZCBpZiBuZWNlc3NhcnkuXG4gICAgICogQHJldHVybiB7TmF2aWdhdGlvblNlcnZpY2VEYXRhfVxuICAgICAqL1xuICAgIHNldFRpbWVTdGFtcCAoc3RhbXApIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoRGF0ZVRpbWUsIHN0YW1wKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTmF2aWdhdGlvblNlcnZpY2VEYXRhLktFWV9USU1FX1NUQU1QLCBzdGFtcCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgICAqL1xuICAgIGdldFRpbWVTdGFtcCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChEYXRlVGltZSwgTmF2aWdhdGlvblNlcnZpY2VEYXRhLktFWV9USU1FX1NUQU1QKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0xvY2F0aW9uRGV0YWlsc30gb3JpZ2luXG4gICAgICogQHJldHVybiB7TmF2aWdhdGlvblNlcnZpY2VEYXRhfVxuICAgICAqL1xuICAgIHNldE9yaWdpbiAob3JpZ2luKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKExvY2F0aW9uRGV0YWlscywgb3JpZ2luKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTmF2aWdhdGlvblNlcnZpY2VEYXRhLktFWV9PUklHSU4sIG9yaWdpbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0xvY2F0aW9uRGV0YWlsc31cbiAgICAgKi9cbiAgICBnZXRPcmlnaW4gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTG9jYXRpb25EZXRhaWxzLCBOYXZpZ2F0aW9uU2VydmljZURhdGEuS0VZX09SSUdJTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtMb2NhdGlvbkRldGFpbHN9IGRlc3RpbmF0aW9uXG4gICAgICogQHJldHVybiB7TmF2aWdhdGlvblNlcnZpY2VEYXRhfVxuICAgICAqL1xuICAgIHNldERlc3RpbmF0aW9uIChkZXN0aW5hdGlvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShMb2NhdGlvbkRldGFpbHMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTmF2aWdhdGlvblNlcnZpY2VEYXRhLktFWV9ERVNUSU5BVElPTiwgZGVzdGluYXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtMb2NhdGlvbkRldGFpbHN9XG4gICAgICovXG4gICAgZ2V0RGVzdGluYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTG9jYXRpb25EZXRhaWxzLCBOYXZpZ2F0aW9uU2VydmljZURhdGEuS0VZX0RFU1RJTkFUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBldGFcbiAgICAgKiBAcmV0dXJuIHtOYXZpZ2F0aW9uU2VydmljZURhdGF9XG4gICAgICovXG4gICAgc2V0RGVzdGluYXRpb25FVEEgKGV0YSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShEYXRlVGltZSwgZXRhKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTmF2aWdhdGlvblNlcnZpY2VEYXRhLktFWV9ERVNUSU5BVElPTl9FVEEsIGV0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgICAqL1xuICAgIGdldERlc3RpbmF0aW9uRVRBICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KERhdGVUaW1lLCBOYXZpZ2F0aW9uU2VydmljZURhdGEuS0VZX0RFU1RJTkFUSU9OX0VUQSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOYXZpZ2F0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gVGhpcyBhcnJheSBzaG91bGQgYmUgb3JkZXJlZCB3aXRoIGFsbCByZW1haW5pbmcgaW5zdHJ1Y3Rpb25zLiBUaGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCBvZiB0aGlzIGFycmF5IHNob3VsZCBhbHdheXMgY29udGFpbiB0aGUgbmV4dCBpbnN0cnVjdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtOYXZpZ2F0aW9uU2VydmljZURhdGF9XG4gICAgICovXG4gICAgc2V0SW5zdHJ1Y3Rpb25zIChpbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTmF2aWdhdGlvbkluc3RydWN0aW9uLCBpbnN0cnVjdGlvbnMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihOYXZpZ2F0aW9uU2VydmljZURhdGEuS0VZX0lOU1RSVUNUSU9OUywgaW5zdHJ1Y3Rpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TmF2aWdhdGlvbkluc3RydWN0aW9uW119XG4gICAgICovXG4gICAgZ2V0SW5zdHJ1Y3Rpb25zICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KE5hdmlnYXRpb25JbnN0cnVjdGlvbiwgTmF2aWdhdGlvblNlcnZpY2VEYXRhLktFWV9JTlNUUlVDVElPTlMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RGF0ZVRpbWV9IGV0YVxuICAgICAqIEByZXR1cm4ge05hdmlnYXRpb25TZXJ2aWNlRGF0YX1cbiAgICAgKi9cbiAgICBzZXROZXh0SW5zdHJ1Y3Rpb25FVEEgKGV0YSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShEYXRlVGltZSwgZXRhKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTmF2aWdhdGlvblNlcnZpY2VEYXRhLktFWV9ORVhUX0lOU1RSVUNUSU9OX0VUQSwgZXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAgICovXG4gICAgZ2V0TmV4dEluc3RydWN0aW9uRVRBICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KERhdGVUaW1lLCBOYXZpZ2F0aW9uU2VydmljZURhdGEuS0VZX05FWFRfSU5TVFJVQ1RJT05fRVRBKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZGlzdGFuY2UgLSBUaGUgZGlzdGFuY2UgdG8gdGhpcyBpbnN0cnVjdGlvbiBmcm9tIGN1cnJlbnQgbG9jYXRpb24uIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXBkYXRlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZXIgLjEgdW5pdCBvZiBkaXN0YW5jZS4gRm9yIG1vcmUgYWNjdXJhY3kgdGhlIGNvbnN1bWVyIGNhbiB1c2UgdGhlIEdQUyBsb2NhdGlvbiBvZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZiBhbmQgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uXG4gICAgICogQHJldHVybiB7TmF2aWdhdGlvblNlcnZpY2VEYXRhfVxuICAgICAqL1xuICAgIHNldE5leHRJbnN0cnVjdGlvbkRpc3RhbmNlIChkaXN0YW5jZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihOYXZpZ2F0aW9uU2VydmljZURhdGEuS0VZX05FWFRfSU5TVFJVQ1RJT05fRElTVEFOQ0UsIGRpc3RhbmNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldE5leHRJbnN0cnVjdGlvbkRpc3RhbmNlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE5hdmlnYXRpb25TZXJ2aWNlRGF0YS5LRVlfTkVYVF9JTlNUUlVDVElPTl9ESVNUQU5DRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIC0gRGlzdGFuY2UgdGlsbCBuZXh0IG1hbmV1dmVyIChzdGFydGluZyBmcm9tKSBmcm9tIHByZXZpb3VzIG1hbmV1dmVyLlxuICAgICAqIEByZXR1cm4ge05hdmlnYXRpb25TZXJ2aWNlRGF0YX1cbiAgICAgKi9cbiAgICBzZXROZXh0SW5zdHJ1Y3Rpb25EaXN0YW5jZVNjYWxlIChzY2FsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihOYXZpZ2F0aW9uU2VydmljZURhdGEuS0VZX05FWFRfSU5TVFJVQ1RJT05fRElTVEFOQ0VfU0NBTEUsIHNjYWxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldE5leHRJbnN0cnVjdGlvbkRpc3RhbmNlU2NhbGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoTmF2aWdhdGlvblNlcnZpY2VEYXRhLktFWV9ORVhUX0lOU1RSVUNUSU9OX0RJU1RBTkNFX1NDQUxFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvbXB0IC0gVGhpcyBpcyBhIHByb21wdCBtZXNzYWdlIHRoYXQgc2hvdWxkIGJlIGNvbnZleWVkIHRvIHRoZSB1c2VyIHRocm91Z2ggZWl0aGVyIGRpc3BsYXkgb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pY2UgKFRUUykuIFRoaXMgcGFyYW0gd2lsbCBjaGFuZ2Ugb2Z0ZW4gYXMgaXQgc2hvdWxkIHJlcHJlc2VudCB0aGUgZm9sbG93aW5nOlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcHByb2FjaGluZyBpbnN0cnVjdGlvbiwgcG9zdCBpbnN0cnVjdGlvbiwgYWxlcnRzIHRoYXQgYWZmZWN0IHRoZSBjdXJyZW50IG5hdmlnYXRpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwgZXRjLlxuICAgICAqIEByZXR1cm4ge05hdmlnYXRpb25TZXJ2aWNlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRQcm9tcHQgKHByb21wdCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihOYXZpZ2F0aW9uU2VydmljZURhdGEuS0VZX1BST01QVCwgcHJvbXB0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFByb21wdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihOYXZpZ2F0aW9uU2VydmljZURhdGEuS0VZX1BST01QVCk7XG4gICAgfVxufVxuXG5OYXZpZ2F0aW9uU2VydmljZURhdGEuS0VZX1RJTUVfU1RBTVAgPSAndGltZVN0YW1wJztcbk5hdmlnYXRpb25TZXJ2aWNlRGF0YS5LRVlfT1JJR0lOID0gJ29yaWdpbic7XG5OYXZpZ2F0aW9uU2VydmljZURhdGEuS0VZX0RFU1RJTkFUSU9OID0gJ2Rlc3RpbmF0aW9uJztcbk5hdmlnYXRpb25TZXJ2aWNlRGF0YS5LRVlfREVTVElOQVRJT05fRVRBID0gJ2Rlc3RpbmF0aW9uRVRBJztcbk5hdmlnYXRpb25TZXJ2aWNlRGF0YS5LRVlfSU5TVFJVQ1RJT05TID0gJ2luc3RydWN0aW9ucyc7XG5OYXZpZ2F0aW9uU2VydmljZURhdGEuS0VZX05FWFRfSU5TVFJVQ1RJT05fRVRBID0gJ25leHRJbnN0cnVjdGlvbkVUQSc7XG5OYXZpZ2F0aW9uU2VydmljZURhdGEuS0VZX05FWFRfSU5TVFJVQ1RJT05fRElTVEFOQ0UgPSAnbmV4dEluc3RydWN0aW9uRGlzdGFuY2UnO1xuTmF2aWdhdGlvblNlcnZpY2VEYXRhLktFWV9ORVhUX0lOU1RSVUNUSU9OX0RJU1RBTkNFX1NDQUxFID0gJ25leHRJbnN0cnVjdGlvbkRpc3RhbmNlU2NhbGUnO1xuTmF2aWdhdGlvblNlcnZpY2VEYXRhLktFWV9QUk9NUFQgPSAncHJvbXB0JztcblxuZXhwb3J0IHsgTmF2aWdhdGlvblNlcnZpY2VEYXRhIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IE1lZGlhVHlwZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgTWVkaWFUeXBlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE1VU0lDICgpIHtcbiAgICAgICAgcmV0dXJuIE1lZGlhVHlwZS5fTUFQLk1VU0lDO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBPRENBU1QgKCkge1xuICAgICAgICByZXR1cm4gTWVkaWFUeXBlLl9NQVAuUE9EQ0FTVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBVURJT0JPT0sgKCkge1xuICAgICAgICByZXR1cm4gTWVkaWFUeXBlLl9NQVAuQVVESU9CT09LO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9USEVSICgpIHtcbiAgICAgICAgcmV0dXJuIE1lZGlhVHlwZS5fTUFQLk9USEVSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIE1lZGlhVHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBNZWRpYVR5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBNZWRpYVR5cGUuX2tleUZvclZhbHVlKHZhbHVlLCBNZWRpYVR5cGUuX01BUCk7XG4gICAgfVxufVxuXG5NZWRpYVR5cGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdNVVNJQyc6ICdNVVNJQycsXG4gICAgJ1BPRENBU1QnOiAnUE9EQ0FTVCcsXG4gICAgJ0FVRElPQk9PSyc6ICdBVURJT0JPT0snLFxuICAgICdPVEhFUic6ICdPVEhFUicsXG59KTtcblxuZXhwb3J0IHsgTWVkaWFUeXBlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnLi9JbWFnZS5qcyc7XG5pbXBvcnQgeyBNZWRpYVR5cGUgfSBmcm9tICcuLi9lbnVtcy9NZWRpYVR5cGUuanMnO1xuXG4vKipcbiAqIFRoaXMgZGF0YSBpcyByZWxhdGVkIHRvIHdoYXQgYSBtZWRpYSBzZXJ2aWNlIHNob3VsZCBwcm92aWRlXG4gKi9cbmNsYXNzIE1lZGlhU2VydmljZURhdGEgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TWVkaWFUeXBlfSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGN1cnJlbnRseSBwbGF5aW5nIG9yIHBhdXNlZCB0cmFjay5cbiAgICAgKiBAcmV0dXJuIHtNZWRpYVNlcnZpY2VEYXRhfVxuICAgICAqL1xuICAgIHNldE1lZGlhVHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNZWRpYVR5cGUsIHR5cGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihNZWRpYVNlcnZpY2VEYXRhLktFWV9NRURJQV9UWVBFLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TWVkaWFUeXBlfVxuICAgICAqL1xuICAgIGdldE1lZGlhVHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNZWRpYVR5cGUsIE1lZGlhU2VydmljZURhdGEuS0VZX01FRElBX1RZUEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZSAtIE11c2ljOiBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCB0cmFjayBQb2RjYXN0OiBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBlcGlzb2RlIEF1ZGlvYm9vazpcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBjaGFwdGVyXG4gICAgICogQHJldHVybiB7TWVkaWFTZXJ2aWNlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRNZWRpYVRpdGxlICh0aXRsZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihNZWRpYVNlcnZpY2VEYXRhLktFWV9NRURJQV9USVRMRSwgdGl0bGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0TWVkaWFUaXRsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihNZWRpYVNlcnZpY2VEYXRhLktFWV9NRURJQV9USVRMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGFydGlzdCAtIE11c2ljOiBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBhbGJ1bSBhcnRpc3QgUG9kY2FzdDogVGhlIHByb3ZpZGVyIG9mIHRoZSBwb2RjYXN0IChob3N0cyxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yaywgY29tcGFueSkgQXVkaW9ib29rOiBUaGUgYm9vayBhdXRob3IncyBuYW1lXG4gICAgICogQHJldHVybiB7TWVkaWFTZXJ2aWNlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRNZWRpYUFydGlzdCAoYXJ0aXN0KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE1lZGlhU2VydmljZURhdGEuS0VZX01FRElBX0FSVElTVCwgYXJ0aXN0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldE1lZGlhQXJ0aXN0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE1lZGlhU2VydmljZURhdGEuS0VZX01FRElBX0FSVElTVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGFsYnVtIC0gTXVzaWM6IFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGFsYnVtIFBvZGNhc3Q6IFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHBvZGNhc3Qgc2hvd1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvYm9vazogVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgYm9va1xuICAgICAqIEByZXR1cm4ge01lZGlhU2VydmljZURhdGF9XG4gICAgICovXG4gICAgc2V0TWVkaWFBbGJ1bSAoYWxidW0pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTWVkaWFTZXJ2aWNlRGF0YS5LRVlfTUVESUFfQUxCVU0sIGFsYnVtKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldE1lZGlhQWxidW0gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoTWVkaWFTZXJ2aWNlRGF0YS5LRVlfTUVESUFfQUxCVU0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gTXVzaWM6IFRoZSBuYW1lIG9mIHRoZSBwbGF5bGlzdCBvciByYWRpbyBzdGF0aW9uLCBpZiB0aGUgdXNlciBpcyBwbGF5aW5nIGZyb20gYSBwbGF5bGlzdCxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgTnVsbCBQb2RjYXN0OiBUaGUgbmFtZSBvZiB0aGUgcGxheWxpc3QsIGlmIHRoZSB1c2VyIGlzIHBsYXlpbmcgZnJvbSBhIHBsYXlsaXN0LFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCBOdWxsIEF1ZGlvYm9vazogTGlrZWx5IG5vdCBhcHBsaWNhYmxlLCBwb3NzaWJseSBhIGNvbGxlY3Rpb24gb3IgXCJwbGF5bGlzdFwiIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBib29rc1xuICAgICAqIEByZXR1cm4ge01lZGlhU2VydmljZURhdGF9XG4gICAgICovXG4gICAgc2V0UGxheWxpc3ROYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE1lZGlhU2VydmljZURhdGEuS0VZX1BMQVlMSVNUX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0UGxheWxpc3ROYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE1lZGlhU2VydmljZURhdGEuS0VZX1BMQVlMSVNUX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXhwbGljaXQgLSBXaGV0aGVyIG9yIG5vdCB0aGUgY29udGVudCBjdXJyZW50bHkgcGxheWluZyAoZS5nLiB0aGUgdHJhY2ssIGVwaXNvZGUsIG9yIGJvb2spXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGV4cGxpY2l0IGNvbnRlbnRcbiAgICAgKiBAcmV0dXJuIHtNZWRpYVNlcnZpY2VEYXRhfVxuICAgICAqL1xuICAgIHNldElzRXhwbGljaXQgKGV4cGxpY2l0KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE1lZGlhU2VydmljZURhdGEuS0VZX0lTX0VYUExJQ0lULCBleHBsaWNpdCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0SXNFeHBsaWNpdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihNZWRpYVNlcnZpY2VEYXRhLktFWV9JU19FWFBMSUNJVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHByb2dyZXNzIC0gTXVzaWM6IFRoZSBjdXJyZW50IHByb2dyZXNzIG9mIHRoZSB0cmFjayBpbiBzZWNvbmRzIFBvZGNhc3Q6IFRoZSBjdXJyZW50IHByb2dyZXNzIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVwaXNvZGUgaW4gc2Vjb25kcyBBdWRpb2Jvb2s6IFRoZSBjdXJyZW50IHByb2dyZXNzIG9mIHRoZSBjdXJyZW50IHNlZ21lbnQgKGUuZy5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2hhcHRlcikgaW4gc2Vjb25kc1xuICAgICAqIEByZXR1cm4ge01lZGlhU2VydmljZURhdGF9XG4gICAgICovXG4gICAgc2V0VHJhY2tQbGF5YmFja1Byb2dyZXNzIChwcm9ncmVzcykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihNZWRpYVNlcnZpY2VEYXRhLktFWV9UUkFDS19QTEFZQkFDS19QUk9HUkVTUywgcHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0VHJhY2tQbGF5YmFja1Byb2dyZXNzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE1lZGlhU2VydmljZURhdGEuS0VZX1RSQUNLX1BMQVlCQUNLX1BST0dSRVNTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZHVyYXRpb24gLSBNdXNpYzogVGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSB0cmFjayBpbiBzZWNvbmRzIFBvZGNhc3Q6IFRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcGlzb2RlIGluIHNlY29uZHMgQXVkaW9ib29rOiBUaGUgdG90YWwgZHVyYXRpb24gb2YgdGhlIGN1cnJlbnQgc2VnbWVudCAoZS5nLiB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFwdGVyKSBpbiBzZWNvbmRzXG4gICAgICogQHJldHVybiB7TWVkaWFTZXJ2aWNlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRUcmFja1BsYXliYWNrRHVyYXRpb24gKGR1cmF0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE1lZGlhU2VydmljZURhdGEuS0VZX1RSQUNLX1BMQVlCQUNLX0RVUkFUSU9OLCBkdXJhdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRUcmFja1BsYXliYWNrRHVyYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoTWVkaWFTZXJ2aWNlRGF0YS5LRVlfVFJBQ0tfUExBWUJBQ0tfRFVSQVRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwcm9ncmVzcyAtIE11c2ljOiBUaGUgY3VycmVudCBwcm9ncmVzcyBvZiB0aGUgcGxheWJhY2sgcXVldWUgaW4gc2Vjb25kcyBQb2RjYXN0OiBUaGUgY3VycmVudFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzIG9mIHRoZSBwbGF5YmFjayBxdWV1ZSBpbiBzZWNvbmRzIEF1ZGlvYm9vazogVGhlIGN1cnJlbnQgcHJvZ3Jlc3Mgb2YgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2sgcXVldWUgKGUuZy4gdGhlIGJvb2spIGluIHNlY29uZHNcbiAgICAgKiBAcmV0dXJuIHtNZWRpYVNlcnZpY2VEYXRhfVxuICAgICAqL1xuICAgIHNldFF1ZXVlUGxheWJhY2tQcm9ncmVzcyAocHJvZ3Jlc3MpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTWVkaWFTZXJ2aWNlRGF0YS5LRVlfUVVFVUVfUExBWUJBQ0tfUFJPR1JFU1MsIHByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFF1ZXVlUGxheWJhY2tQcm9ncmVzcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihNZWRpYVNlcnZpY2VEYXRhLktFWV9RVUVVRV9QTEFZQkFDS19QUk9HUkVTUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGR1cmF0aW9uIC0gTXVzaWM6IFRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgcGxheWJhY2sgcXVldWUgaW4gc2Vjb25kcyBQb2RjYXN0OiBUaGUgdG90YWwgZHVyYXRpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcGxheWJhY2sgcXVldWUgaW4gc2Vjb25kcyBBdWRpb2Jvb2s6IFRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgcGxheWJhY2sgcXVldWVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiB0aGUgYm9vaykgaW4gc2Vjb25kc1xuICAgICAqIEByZXR1cm4ge01lZGlhU2VydmljZURhdGF9XG4gICAgICovXG4gICAgc2V0UXVldWVQbGF5YmFja0R1cmF0aW9uIChkdXJhdGlvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihNZWRpYVNlcnZpY2VEYXRhLktFWV9RVUVVRV9QTEFZQkFDS19EVVJBVElPTiwgZHVyYXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0UXVldWVQbGF5YmFja0R1cmF0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE1lZGlhU2VydmljZURhdGEuS0VZX1FVRVVFX1BMQVlCQUNLX0RVUkFUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbnVtYmVyIC0gTXVzaWM6IFRoZSBjdXJyZW50IG51bWJlciAoMSBiYXNlZCkgb2YgdGhlIHRyYWNrIGluIHRoZSBwbGF5YmFjayBxdWV1ZSBQb2RjYXN0OiBUaGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBudW1iZXIgKDEgYmFzZWQpIG9mIHRoZSBlcGlzb2RlIGluIHRoZSBwbGF5YmFjayBxdWV1ZSBBdWRpb2Jvb2s6IFRoZSBjdXJyZW50XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciAoMSBiYXNlZCkgb2YgdGhlIGVwaXNvZGUgaW4gdGhlIHBsYXliYWNrIHF1ZXVlIChlLmcuIHRoZSBjaGFwdGVyIG51bWJlciBpbiB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vaylcbiAgICAgKiBAcmV0dXJuIHtNZWRpYVNlcnZpY2VEYXRhfVxuICAgICAqL1xuICAgIHNldFF1ZXVlQ3VycmVudFRyYWNrTnVtYmVyIChudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoTWVkaWFTZXJ2aWNlRGF0YS5LRVlfUVVFVUVfQ1VSUkVOVF9UUkFDS19OVU1CRVIsIG51bWJlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRRdWV1ZUN1cnJlbnRUcmFja051bWJlciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihNZWRpYVNlcnZpY2VEYXRhLktFWV9RVUVVRV9DVVJSRU5UX1RSQUNLX05VTUJFUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IC0gTXVzaWM6IFRoZSB0b3RhbCBudW1iZXIgb2YgdHJhY2tzIGluIHRoZSBwbGF5YmFjayBxdWV1ZSBQb2RjYXN0OiBUaGUgdG90YWwgbnVtYmVyIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZXBpc29kZXMgaW4gdGhlIHBsYXliYWNrIHF1ZXVlIEF1ZGlvYm9vazogVGhlIHRvdGFsIG51bWJlciBvZiBzZWN0aW9ucyBpbiB0aGUgcGxheWJhY2tcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSAoZS5nLiB0aGUgbnVtYmVyIG9mIGNoYXB0ZXJzIGluIHRoZSBib29rKVxuICAgICAqIEByZXR1cm4ge01lZGlhU2VydmljZURhdGF9XG4gICAgICovXG4gICAgc2V0UXVldWVUb3RhbFRyYWNrQ291bnQgKGNvdW50KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE1lZGlhU2VydmljZURhdGEuS0VZX1FVRVVFX1RPVEFMX1RSQUNLX0NPVU5ULCBjb3VudCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRRdWV1ZVRvdGFsVHJhY2tDb3VudCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihNZWRpYVNlcnZpY2VEYXRhLktFWV9RVUVVRV9UT1RBTF9UUkFDS19DT1VOVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtJbWFnZX0gaW1hZ2UgLSBNdXNpYzogVGhlIGFsYnVtIGFydCBvZiB0aGUgY3VycmVudCB0cmFjayBQb2RjYXN0OiBUaGUgcG9kY2FzdCBvciBjaGFwdGVyIGFydHdvcmsgb2YgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHBvZGNhc3QgZXBpc29kZSBBdWRpb2Jvb2s6IFRoZSBib29rIG9yIGNoYXB0ZXIgYXJ0d29yayBvZiB0aGUgY3VycmVudCBhdWRpb2Jvb2tcbiAgICAgKiBAcmV0dXJuIHtNZWRpYVNlcnZpY2VEYXRhfVxuICAgICAqL1xuICAgIHNldE1lZGlhSW1hZ2UgKGltYWdlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEltYWdlLCBpbWFnZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE1lZGlhU2VydmljZURhdGEuS0VZX01FRElBX0lNQUdFLCBpbWFnZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0ltYWdlfVxuICAgICAqL1xuICAgIGdldE1lZGlhSW1hZ2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSW1hZ2UsIE1lZGlhU2VydmljZURhdGEuS0VZX01FRElBX0lNQUdFKTtcbiAgICB9XG59XG5cbk1lZGlhU2VydmljZURhdGEuS0VZX01FRElBX1RZUEUgPSAnbWVkaWFUeXBlJztcbk1lZGlhU2VydmljZURhdGEuS0VZX01FRElBX1RJVExFID0gJ21lZGlhVGl0bGUnO1xuTWVkaWFTZXJ2aWNlRGF0YS5LRVlfTUVESUFfQVJUSVNUID0gJ21lZGlhQXJ0aXN0Jztcbk1lZGlhU2VydmljZURhdGEuS0VZX01FRElBX0FMQlVNID0gJ21lZGlhQWxidW0nO1xuTWVkaWFTZXJ2aWNlRGF0YS5LRVlfUExBWUxJU1RfTkFNRSA9ICdwbGF5bGlzdE5hbWUnO1xuTWVkaWFTZXJ2aWNlRGF0YS5LRVlfSVNfRVhQTElDSVQgPSAnaXNFeHBsaWNpdCc7XG5NZWRpYVNlcnZpY2VEYXRhLktFWV9UUkFDS19QTEFZQkFDS19QUk9HUkVTUyA9ICd0cmFja1BsYXliYWNrUHJvZ3Jlc3MnO1xuTWVkaWFTZXJ2aWNlRGF0YS5LRVlfVFJBQ0tfUExBWUJBQ0tfRFVSQVRJT04gPSAndHJhY2tQbGF5YmFja0R1cmF0aW9uJztcbk1lZGlhU2VydmljZURhdGEuS0VZX1FVRVVFX1BMQVlCQUNLX1BST0dSRVNTID0gJ3F1ZXVlUGxheWJhY2tQcm9ncmVzcyc7XG5NZWRpYVNlcnZpY2VEYXRhLktFWV9RVUVVRV9QTEFZQkFDS19EVVJBVElPTiA9ICdxdWV1ZVBsYXliYWNrRHVyYXRpb24nO1xuTWVkaWFTZXJ2aWNlRGF0YS5LRVlfUVVFVUVfQ1VSUkVOVF9UUkFDS19OVU1CRVIgPSAncXVldWVDdXJyZW50VHJhY2tOdW1iZXInO1xuTWVkaWFTZXJ2aWNlRGF0YS5LRVlfUVVFVUVfVE9UQUxfVFJBQ0tfQ09VTlQgPSAncXVldWVUb3RhbFRyYWNrQ291bnQnO1xuTWVkaWFTZXJ2aWNlRGF0YS5LRVlfTUVESUFfSU1BR0UgPSAnbWVkaWFJbWFnZSc7XG5cbmV4cG9ydCB7IE1lZGlhU2VydmljZURhdGEgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBUZW1wZXJhdHVyZSB9IGZyb20gJy4vVGVtcGVyYXR1cmUuanMnO1xuaW1wb3J0IHsgSW1hZ2UgfSBmcm9tICcuL0ltYWdlLmpzJztcbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gJy4vRGF0ZVRpbWUuanMnO1xuXG5jbGFzcyBXZWF0aGVyRGF0YSBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUZW1wZXJhdHVyZX0gdGVtcGVyYXR1cmVcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyRGF0YX1cbiAgICAgKi9cbiAgICBzZXRDdXJyZW50VGVtcGVyYXR1cmUgKHRlbXBlcmF0dXJlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRlbXBlcmF0dXJlLCB0ZW1wZXJhdHVyZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFdlYXRoZXJEYXRhLktFWV9DVVJSRU5UX1RFTVBFUkFUVVJFLCB0ZW1wZXJhdHVyZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RlbXBlcmF0dXJlfVxuICAgICAqL1xuICAgIGdldEN1cnJlbnRUZW1wZXJhdHVyZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUZW1wZXJhdHVyZSwgV2VhdGhlckRhdGEuS0VZX0NVUlJFTlRfVEVNUEVSQVRVUkUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VGVtcGVyYXR1cmV9IGhpZ2hcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyRGF0YX1cbiAgICAgKi9cbiAgICBzZXRUZW1wZXJhdHVyZUhpZ2ggKGhpZ2gpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVGVtcGVyYXR1cmUsIGhpZ2gpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyRGF0YS5LRVlfVEVNUEVSQVRVUkVfSElHSCwgaGlnaCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RlbXBlcmF0dXJlfVxuICAgICAqL1xuICAgIGdldFRlbXBlcmF0dXJlSGlnaCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUZW1wZXJhdHVyZSwgV2VhdGhlckRhdGEuS0VZX1RFTVBFUkFUVVJFX0hJR0gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VGVtcGVyYXR1cmV9IGxvd1xuICAgICAqIEByZXR1cm4ge1dlYXRoZXJEYXRhfVxuICAgICAqL1xuICAgIHNldFRlbXBlcmF0dXJlTG93IChsb3cpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVGVtcGVyYXR1cmUsIGxvdyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFdlYXRoZXJEYXRhLktFWV9URU1QRVJBVFVSRV9MT1csIGxvdyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RlbXBlcmF0dXJlfVxuICAgICAqL1xuICAgIGdldFRlbXBlcmF0dXJlTG93ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRlbXBlcmF0dXJlLCBXZWF0aGVyRGF0YS5LRVlfVEVNUEVSQVRVUkVfTE9XKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RlbXBlcmF0dXJlfSB0ZW1wZXJhdHVyZVxuICAgICAqIEByZXR1cm4ge1dlYXRoZXJEYXRhfVxuICAgICAqL1xuICAgIHNldEFwcGFyZW50VGVtcGVyYXR1cmUgKHRlbXBlcmF0dXJlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRlbXBlcmF0dXJlLCB0ZW1wZXJhdHVyZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFdlYXRoZXJEYXRhLktFWV9BUFBBUkVOVF9URU1QRVJBVFVSRSwgdGVtcGVyYXR1cmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUZW1wZXJhdHVyZX1cbiAgICAgKi9cbiAgICBnZXRBcHBhcmVudFRlbXBlcmF0dXJlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRlbXBlcmF0dXJlLCBXZWF0aGVyRGF0YS5LRVlfQVBQQVJFTlRfVEVNUEVSQVRVUkUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VGVtcGVyYXR1cmV9IGhpZ2hcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyRGF0YX1cbiAgICAgKi9cbiAgICBzZXRBcHBhcmVudFRlbXBlcmF0dXJlSGlnaCAoaGlnaCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShUZW1wZXJhdHVyZSwgaGlnaCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFdlYXRoZXJEYXRhLktFWV9BUFBBUkVOVF9URU1QRVJBVFVSRV9ISUdILCBoaWdoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VGVtcGVyYXR1cmV9XG4gICAgICovXG4gICAgZ2V0QXBwYXJlbnRUZW1wZXJhdHVyZUhpZ2ggKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVGVtcGVyYXR1cmUsIFdlYXRoZXJEYXRhLktFWV9BUFBBUkVOVF9URU1QRVJBVFVSRV9ISUdIKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RlbXBlcmF0dXJlfSBsb3dcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyRGF0YX1cbiAgICAgKi9cbiAgICBzZXRBcHBhcmVudFRlbXBlcmF0dXJlTG93IChsb3cpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVGVtcGVyYXR1cmUsIGxvdyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFdlYXRoZXJEYXRhLktFWV9BUFBBUkVOVF9URU1QRVJBVFVSRV9MT1csIGxvdyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RlbXBlcmF0dXJlfVxuICAgICAqL1xuICAgIGdldEFwcGFyZW50VGVtcGVyYXR1cmVMb3cgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVGVtcGVyYXR1cmUsIFdlYXRoZXJEYXRhLktFWV9BUFBBUkVOVF9URU1QRVJBVFVSRV9MT1cpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdW1tYXJ5XG4gICAgICogQHJldHVybiB7V2VhdGhlckRhdGF9XG4gICAgICovXG4gICAgc2V0V2VhdGhlclN1bW1hcnkgKHN1bW1hcnkpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoV2VhdGhlckRhdGEuS0VZX1dFQVRIRVJfU1VNTUFSWSwgc3VtbWFyeSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRXZWF0aGVyU3VtbWFyeSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihXZWF0aGVyRGF0YS5LRVlfV0VBVEhFUl9TVU1NQVJZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB0aW1lXG4gICAgICogQHJldHVybiB7V2VhdGhlckRhdGF9XG4gICAgICovXG4gICAgc2V0VGltZSAodGltZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShEYXRlVGltZSwgdGltZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFdlYXRoZXJEYXRhLktFWV9USU1FLCB0aW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAgICovXG4gICAgZ2V0VGltZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChEYXRlVGltZSwgV2VhdGhlckRhdGEuS0VZX1RJTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBodW1pZGl0eSAtIDAgdG8gMSwgcGVyY2VudGFnZSBodW1pZGl0eVxuICAgICAqIEByZXR1cm4ge1dlYXRoZXJEYXRhfVxuICAgICAqL1xuICAgIHNldEh1bWlkaXR5IChodW1pZGl0eSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyRGF0YS5LRVlfSFVNSURJVFksIGh1bWlkaXR5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEh1bWlkaXR5ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFdlYXRoZXJEYXRhLktFWV9IVU1JRElUWSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGNvdmVyIC0gMCB0byAxLCBwZXJjZW50YWdlIGNsb3VkIGNvdmVyXG4gICAgICogQHJldHVybiB7V2VhdGhlckRhdGF9XG4gICAgICovXG4gICAgc2V0Q2xvdWRDb3ZlciAoY292ZXIpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoV2VhdGhlckRhdGEuS0VZX0NMT1VEX0NPVkVSLCBjb3Zlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRDbG91ZENvdmVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFdlYXRoZXJEYXRhLktFWV9DTE9VRF9DT1ZFUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHBoYXNlIC0gMCB0byAxLCBwZXJjZW50YWdlIG9mIHRoZSBtb29uIHNlZW4sIGUuZy4gMCA9IG5vIG1vb24sIDAuMjUgPSBxdWFydGVyIG1vb25cbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyRGF0YX1cbiAgICAgKi9cbiAgICBzZXRNb29uUGhhc2UgKHBoYXNlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFdlYXRoZXJEYXRhLktFWV9NT09OX1BIQVNFLCBwaGFzZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRNb29uUGhhc2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoV2VhdGhlckRhdGEuS0VZX01PT05fUEhBU0UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBiZWFyaW5nIC0gSW4gZGVncmVlcywgdHJ1ZSBub3J0aCBhdCAwIGRlZ3JlZXNcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyRGF0YX1cbiAgICAgKi9cbiAgICBzZXRXaW5kQmVhcmluZyAoYmVhcmluZykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyRGF0YS5LRVlfV0lORF9CRUFSSU5HLCBiZWFyaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFdpbmRCZWFyaW5nICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFdlYXRoZXJEYXRhLktFWV9XSU5EX0JFQVJJTkcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBndXN0IC0ga20vaHJcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyRGF0YX1cbiAgICAgKi9cbiAgICBzZXRXaW5kR3VzdCAoZ3VzdCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyRGF0YS5LRVlfV0lORF9HVVNULCBndXN0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFdpbmRHdXN0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFdlYXRoZXJEYXRhLktFWV9XSU5EX0dVU1QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzcGVlZCAtIGttL2hyXG4gICAgICogQHJldHVybiB7V2VhdGhlckRhdGF9XG4gICAgICovXG4gICAgc2V0V2luZFNwZWVkIChzcGVlZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyRGF0YS5LRVlfV0lORF9TUEVFRCwgc3BlZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0V2luZFNwZWVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFdlYXRoZXJEYXRhLktFWV9XSU5EX1NQRUVEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYmVhcmluZyAtIEluIGRlZ3JlZXMsIHRydWUgbm9ydGggYXQgMCBkZWdyZWVzXG4gICAgICogQHJldHVybiB7V2VhdGhlckRhdGF9XG4gICAgICovXG4gICAgc2V0TmVhcmVzdFN0b3JtQmVhcmluZyAoYmVhcmluZykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyRGF0YS5LRVlfTkVBUkVTVF9TVE9STV9CRUFSSU5HLCBiZWFyaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldE5lYXJlc3RTdG9ybUJlYXJpbmcgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoV2VhdGhlckRhdGEuS0VZX05FQVJFU1RfU1RPUk1fQkVBUklORyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGRpc3RhbmNlIC0gSW4ga21cbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyRGF0YX1cbiAgICAgKi9cbiAgICBzZXROZWFyZXN0U3Rvcm1EaXN0YW5jZSAoZGlzdGFuY2UpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoV2VhdGhlckRhdGEuS0VZX05FQVJFU1RfU1RPUk1fRElTVEFOQ0UsIGRpc3RhbmNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldE5lYXJlc3RTdG9ybURpc3RhbmNlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFdlYXRoZXJEYXRhLktFWV9ORUFSRVNUX1NUT1JNX0RJU1RBTkNFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYWNjdW11bGF0aW9uIC0gY21cbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyRGF0YX1cbiAgICAgKi9cbiAgICBzZXRQcmVjaXBBY2N1bXVsYXRpb24gKGFjY3VtdWxhdGlvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyRGF0YS5LRVlfUFJFQ0lQX0FDQ1VNVUxBVElPTiwgYWNjdW11bGF0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFByZWNpcEFjY3VtdWxhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihXZWF0aGVyRGF0YS5LRVlfUFJFQ0lQX0FDQ1VNVUxBVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGludGVuc2l0eSAtIGNtIG9mIHdhdGVyIHBlciBob3VyXG4gICAgICogQHJldHVybiB7V2VhdGhlckRhdGF9XG4gICAgICovXG4gICAgc2V0UHJlY2lwSW50ZW5zaXR5IChpbnRlbnNpdHkpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoV2VhdGhlckRhdGEuS0VZX1BSRUNJUF9JTlRFTlNJVFksIGludGVuc2l0eSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRQcmVjaXBJbnRlbnNpdHkgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoV2VhdGhlckRhdGEuS0VZX1BSRUNJUF9JTlRFTlNJVFkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwcm9iYWJpbGl0eSAtIDAgdG8gMSwgcGVyY2VudGFnZSBjaGFuY2VcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyRGF0YX1cbiAgICAgKi9cbiAgICBzZXRQcmVjaXBQcm9iYWJpbGl0eSAocHJvYmFiaWxpdHkpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoV2VhdGhlckRhdGEuS0VZX1BSRUNJUF9QUk9CQUJJTElUWSwgcHJvYmFiaWxpdHkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0UHJlY2lwUHJvYmFiaWxpdHkgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoV2VhdGhlckRhdGEuS0VZX1BSRUNJUF9QUk9CQUJJTElUWSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBlLmcuIFwicmFpblwiLCBcInNub3dcIiwgXCJzbGVldFwiLCBcImhhaWxcIlxuICAgICAqIEByZXR1cm4ge1dlYXRoZXJEYXRhfVxuICAgICAqL1xuICAgIHNldFByZWNpcFR5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoV2VhdGhlckRhdGEuS0VZX1BSRUNJUF9UWVBFLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFByZWNpcFR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoV2VhdGhlckRhdGEuS0VZX1BSRUNJUF9UWVBFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdmlzaWJpbGl0eSAtIEluIGttXG4gICAgICogQHJldHVybiB7V2VhdGhlckRhdGF9XG4gICAgICovXG4gICAgc2V0VmlzaWJpbGl0eSAodmlzaWJpbGl0eSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyRGF0YS5LRVlfVklTSUJJTElUWSwgdmlzaWJpbGl0eSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRWaXNpYmlsaXR5ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFdlYXRoZXJEYXRhLktFWV9WSVNJQklMSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0ltYWdlfSBpY29uXG4gICAgICogQHJldHVybiB7V2VhdGhlckRhdGF9XG4gICAgICovXG4gICAgc2V0V2VhdGhlckljb24gKGljb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoSW1hZ2UsIGljb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyRGF0YS5LRVlfV0VBVEhFUl9JQ09OLCBpY29uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SW1hZ2V9XG4gICAgICovXG4gICAgZ2V0V2VhdGhlckljb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSW1hZ2UsIFdlYXRoZXJEYXRhLktFWV9XRUFUSEVSX0lDT04pO1xuICAgIH1cbn1cblxuV2VhdGhlckRhdGEuS0VZX0NVUlJFTlRfVEVNUEVSQVRVUkUgPSAnY3VycmVudFRlbXBlcmF0dXJlJztcbldlYXRoZXJEYXRhLktFWV9URU1QRVJBVFVSRV9ISUdIID0gJ3RlbXBlcmF0dXJlSGlnaCc7XG5XZWF0aGVyRGF0YS5LRVlfVEVNUEVSQVRVUkVfTE9XID0gJ3RlbXBlcmF0dXJlTG93JztcbldlYXRoZXJEYXRhLktFWV9BUFBBUkVOVF9URU1QRVJBVFVSRSA9ICdhcHBhcmVudFRlbXBlcmF0dXJlJztcbldlYXRoZXJEYXRhLktFWV9BUFBBUkVOVF9URU1QRVJBVFVSRV9ISUdIID0gJ2FwcGFyZW50VGVtcGVyYXR1cmVIaWdoJztcbldlYXRoZXJEYXRhLktFWV9BUFBBUkVOVF9URU1QRVJBVFVSRV9MT1cgPSAnYXBwYXJlbnRUZW1wZXJhdHVyZUxvdyc7XG5XZWF0aGVyRGF0YS5LRVlfV0VBVEhFUl9TVU1NQVJZID0gJ3dlYXRoZXJTdW1tYXJ5JztcbldlYXRoZXJEYXRhLktFWV9USU1FID0gJ3RpbWUnO1xuV2VhdGhlckRhdGEuS0VZX0hVTUlESVRZID0gJ2h1bWlkaXR5JztcbldlYXRoZXJEYXRhLktFWV9DTE9VRF9DT1ZFUiA9ICdjbG91ZENvdmVyJztcbldlYXRoZXJEYXRhLktFWV9NT09OX1BIQVNFID0gJ21vb25QaGFzZSc7XG5XZWF0aGVyRGF0YS5LRVlfV0lORF9CRUFSSU5HID0gJ3dpbmRCZWFyaW5nJztcbldlYXRoZXJEYXRhLktFWV9XSU5EX0dVU1QgPSAnd2luZEd1c3QnO1xuV2VhdGhlckRhdGEuS0VZX1dJTkRfU1BFRUQgPSAnd2luZFNwZWVkJztcbldlYXRoZXJEYXRhLktFWV9ORUFSRVNUX1NUT1JNX0JFQVJJTkcgPSAnbmVhcmVzdFN0b3JtQmVhcmluZyc7XG5XZWF0aGVyRGF0YS5LRVlfTkVBUkVTVF9TVE9STV9ESVNUQU5DRSA9ICduZWFyZXN0U3Rvcm1EaXN0YW5jZSc7XG5XZWF0aGVyRGF0YS5LRVlfUFJFQ0lQX0FDQ1VNVUxBVElPTiA9ICdwcmVjaXBBY2N1bXVsYXRpb24nO1xuV2VhdGhlckRhdGEuS0VZX1BSRUNJUF9JTlRFTlNJVFkgPSAncHJlY2lwSW50ZW5zaXR5JztcbldlYXRoZXJEYXRhLktFWV9QUkVDSVBfUFJPQkFCSUxJVFkgPSAncHJlY2lwUHJvYmFiaWxpdHknO1xuV2VhdGhlckRhdGEuS0VZX1BSRUNJUF9UWVBFID0gJ3ByZWNpcFR5cGUnO1xuV2VhdGhlckRhdGEuS0VZX1ZJU0lCSUxJVFkgPSAndmlzaWJpbGl0eSc7XG5XZWF0aGVyRGF0YS5LRVlfV0VBVEhFUl9JQ09OID0gJ3dlYXRoZXJJY29uJztcblxuZXhwb3J0IHsgV2VhdGhlckRhdGEgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gJy4vRGF0ZVRpbWUuanMnO1xuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcblxuY2xhc3MgV2VhdGhlckFsZXJ0IGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGl0bGVcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyQWxlcnR9XG4gICAgICovXG4gICAgc2V0VGl0bGUgKHRpdGxlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFdlYXRoZXJBbGVydC5LRVlfVElUTEUsIHRpdGxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFRpdGxlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFdlYXRoZXJBbGVydC5LRVlfVElUTEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdW1tYXJ5XG4gICAgICogQHJldHVybiB7V2VhdGhlckFsZXJ0fVxuICAgICAqL1xuICAgIHNldFN1bW1hcnkgKHN1bW1hcnkpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoV2VhdGhlckFsZXJ0LktFWV9TVU1NQVJZLCBzdW1tYXJ5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFN1bW1hcnkgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoV2VhdGhlckFsZXJ0LktFWV9TVU1NQVJZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBleHBpcmVzXG4gICAgICogQHJldHVybiB7V2VhdGhlckFsZXJ0fVxuICAgICAqL1xuICAgIHNldEV4cGlyZXMgKGV4cGlyZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoRGF0ZVRpbWUsIGV4cGlyZXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyQWxlcnQuS0VZX0VYUElSRVMsIGV4cGlyZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICAgKi9cbiAgICBnZXRFeHBpcmVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KERhdGVUaW1lLCBXZWF0aGVyQWxlcnQuS0VZX0VYUElSRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nW119IHJlZ2lvbnNcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyQWxlcnR9XG4gICAgICovXG4gICAgc2V0UmVnaW9ucyAocmVnaW9ucykge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyQWxlcnQuS0VZX1JFR0lPTlMsIHJlZ2lvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmdbXX1cbiAgICAgKi9cbiAgICBnZXRSZWdpb25zICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFdlYXRoZXJBbGVydC5LRVlfUkVHSU9OUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHNldmVyaXR5XG4gICAgICogQHJldHVybiB7V2VhdGhlckFsZXJ0fVxuICAgICAqL1xuICAgIHNldFNldmVyaXR5IChzZXZlcml0eSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyQWxlcnQuS0VZX1NFVkVSSVRZLCBzZXZlcml0eSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRTZXZlcml0eSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihXZWF0aGVyQWxlcnQuS0VZX1NFVkVSSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBpc3N1ZWRcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyQWxlcnR9XG4gICAgICovXG4gICAgc2V0VGltZUlzc3VlZCAoaXNzdWVkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKERhdGVUaW1lLCBpc3N1ZWQpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyQWxlcnQuS0VZX1RJTUVfSVNTVUVELCBpc3N1ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICAgKi9cbiAgICBnZXRUaW1lSXNzdWVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KERhdGVUaW1lLCBXZWF0aGVyQWxlcnQuS0VZX1RJTUVfSVNTVUVEKTtcbiAgICB9XG59XG5cbldlYXRoZXJBbGVydC5LRVlfVElUTEUgPSAndGl0bGUnO1xuV2VhdGhlckFsZXJ0LktFWV9TVU1NQVJZID0gJ3N1bW1hcnknO1xuV2VhdGhlckFsZXJ0LktFWV9FWFBJUkVTID0gJ2V4cGlyZXMnO1xuV2VhdGhlckFsZXJ0LktFWV9SRUdJT05TID0gJ3JlZ2lvbnMnO1xuV2VhdGhlckFsZXJ0LktFWV9TRVZFUklUWSA9ICdzZXZlcml0eSc7XG5XZWF0aGVyQWxlcnQuS0VZX1RJTUVfSVNTVUVEID0gJ3RpbWVJc3N1ZWQnO1xuXG5leHBvcnQgeyBXZWF0aGVyQWxlcnQgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBXZWF0aGVyRGF0YSB9IGZyb20gJy4vV2VhdGhlckRhdGEuanMnO1xuaW1wb3J0IHsgTG9jYXRpb25EZXRhaWxzIH0gZnJvbSAnLi9Mb2NhdGlvbkRldGFpbHMuanMnO1xuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcbmltcG9ydCB7IFdlYXRoZXJBbGVydCB9IGZyb20gJy4vV2VhdGhlckFsZXJ0LmpzJztcblxuLyoqXG4gKiBUaGlzIGRhdGEgaXMgcmVsYXRlZCB0byB3aGF0IGEgd2VhdGhlciBzZXJ2aWNlIHdvdWxkIHByb3ZpZGVcbiAqL1xuY2xhc3MgV2VhdGhlclNlcnZpY2VEYXRhIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0xvY2F0aW9uRGV0YWlsc30gbG9jYXRpb25cbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyU2VydmljZURhdGF9XG4gICAgICovXG4gICAgc2V0TG9jYXRpb24gKGxvY2F0aW9uKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKExvY2F0aW9uRGV0YWlscywgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyU2VydmljZURhdGEuS0VZX0xPQ0FUSU9OLCBsb2NhdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0xvY2F0aW9uRGV0YWlsc31cbiAgICAgKi9cbiAgICBnZXRMb2NhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChMb2NhdGlvbkRldGFpbHMsIFdlYXRoZXJTZXJ2aWNlRGF0YS5LRVlfTE9DQVRJT04pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7V2VhdGhlckRhdGF9IGZvcmVjYXN0XG4gICAgICogQHJldHVybiB7V2VhdGhlclNlcnZpY2VEYXRhfVxuICAgICAqL1xuICAgIHNldEN1cnJlbnRGb3JlY2FzdCAoZm9yZWNhc3QpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoV2VhdGhlckRhdGEsIGZvcmVjYXN0KTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoV2VhdGhlclNlcnZpY2VEYXRhLktFWV9DVVJSRU5UX0ZPUkVDQVNULCBmb3JlY2FzdCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1dlYXRoZXJEYXRhfVxuICAgICAqL1xuICAgIGdldEN1cnJlbnRGb3JlY2FzdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChXZWF0aGVyRGF0YSwgV2VhdGhlclNlcnZpY2VEYXRhLktFWV9DVVJSRU5UX0ZPUkVDQVNUKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1dlYXRoZXJEYXRhW119IGZvcmVjYXN0XG4gICAgICogQHJldHVybiB7V2VhdGhlclNlcnZpY2VEYXRhfVxuICAgICAqL1xuICAgIHNldE1pbnV0ZUZvcmVjYXN0IChmb3JlY2FzdCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShXZWF0aGVyRGF0YSwgZm9yZWNhc3QsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihXZWF0aGVyU2VydmljZURhdGEuS0VZX01JTlVURV9GT1JFQ0FTVCwgZm9yZWNhc3QpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyRGF0YVtdfVxuICAgICAqL1xuICAgIGdldE1pbnV0ZUZvcmVjYXN0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFdlYXRoZXJEYXRhLCBXZWF0aGVyU2VydmljZURhdGEuS0VZX01JTlVURV9GT1JFQ0FTVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtXZWF0aGVyRGF0YVtdfSBmb3JlY2FzdFxuICAgICAqIEByZXR1cm4ge1dlYXRoZXJTZXJ2aWNlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRIb3VybHlGb3JlY2FzdCAoZm9yZWNhc3QpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoV2VhdGhlckRhdGEsIGZvcmVjYXN0LCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoV2VhdGhlclNlcnZpY2VEYXRhLktFWV9IT1VSTFlfRk9SRUNBU1QsIGZvcmVjYXN0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7V2VhdGhlckRhdGFbXX1cbiAgICAgKi9cbiAgICBnZXRIb3VybHlGb3JlY2FzdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChXZWF0aGVyRGF0YSwgV2VhdGhlclNlcnZpY2VEYXRhLktFWV9IT1VSTFlfRk9SRUNBU1QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7V2VhdGhlckRhdGFbXX0gZm9yZWNhc3RcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyU2VydmljZURhdGF9XG4gICAgICovXG4gICAgc2V0TXVsdGlkYXlGb3JlY2FzdCAoZm9yZWNhc3QpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoV2VhdGhlckRhdGEsIGZvcmVjYXN0LCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoV2VhdGhlclNlcnZpY2VEYXRhLktFWV9NVUxUSURBWV9GT1JFQ0FTVCwgZm9yZWNhc3QpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyRGF0YVtdfVxuICAgICAqL1xuICAgIGdldE11bHRpZGF5Rm9yZWNhc3QgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoV2VhdGhlckRhdGEsIFdlYXRoZXJTZXJ2aWNlRGF0YS5LRVlfTVVMVElEQVlfRk9SRUNBU1QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7V2VhdGhlckFsZXJ0W119IGFsZXJ0cyAtIFRoaXMgYXJyYXkgc2hvdWxkIGJlIG9yZGVyZWQgd2l0aCB0aGUgZmlyc3Qgb2JqZWN0IGJlaW5nIHRoZSBjdXJyZW50IGRheVxuICAgICAqIEByZXR1cm4ge1dlYXRoZXJTZXJ2aWNlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRBbGVydHMgKGFsZXJ0cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShXZWF0aGVyQWxlcnQsIGFsZXJ0cywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFdlYXRoZXJTZXJ2aWNlRGF0YS5LRVlfQUxFUlRTLCBhbGVydHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtXZWF0aGVyQWxlcnRbXX1cbiAgICAgKi9cbiAgICBnZXRBbGVydHMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoV2VhdGhlckFsZXJ0LCBXZWF0aGVyU2VydmljZURhdGEuS0VZX0FMRVJUUyk7XG4gICAgfVxufVxuXG5XZWF0aGVyU2VydmljZURhdGEuS0VZX0xPQ0FUSU9OID0gJ2xvY2F0aW9uJztcbldlYXRoZXJTZXJ2aWNlRGF0YS5LRVlfQ1VSUkVOVF9GT1JFQ0FTVCA9ICdjdXJyZW50Rm9yZWNhc3QnO1xuV2VhdGhlclNlcnZpY2VEYXRhLktFWV9NSU5VVEVfRk9SRUNBU1QgPSAnbWludXRlRm9yZWNhc3QnO1xuV2VhdGhlclNlcnZpY2VEYXRhLktFWV9IT1VSTFlfRk9SRUNBU1QgPSAnaG91cmx5Rm9yZWNhc3QnO1xuV2VhdGhlclNlcnZpY2VEYXRhLktFWV9NVUxUSURBWV9GT1JFQ0FTVCA9ICdtdWx0aWRheUZvcmVjYXN0JztcbldlYXRoZXJTZXJ2aWNlRGF0YS5LRVlfQUxFUlRTID0gJ2FsZXJ0cyc7XG5cbmV4cG9ydCB7IFdlYXRoZXJTZXJ2aWNlRGF0YSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4uL1JwY1N0cnVjdC5qcyc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uU2VydmljZURhdGEgfSBmcm9tICcuL05hdmlnYXRpb25TZXJ2aWNlRGF0YS5qcyc7XG5pbXBvcnQgeyBNZWRpYVNlcnZpY2VEYXRhIH0gZnJvbSAnLi9NZWRpYVNlcnZpY2VEYXRhLmpzJztcbmltcG9ydCB7IFdlYXRoZXJTZXJ2aWNlRGF0YSB9IGZyb20gJy4vV2VhdGhlclNlcnZpY2VEYXRhLmpzJztcblxuLyoqXG4gKiBDb250YWlucyBhbGwgdGhlIGN1cnJlbnQgZGF0YSBvZiB0aGUgYXBwIHNlcnZpY2UuIFRoZSBzZXJ2aWNlVHlwZSB3aWxsIGxpbmsgdG8gd2hpY2ggb2YgdGhlIHNlcnZpY2UgZGF0YSBvYmplY3RzIGFyZVxuICogaW5jbHVkZWQgaW4gdGhpcyBvYmplY3QgKGUuZy4gaWYgdGhlIHNlcnZpY2UgdHlwZSBpcyBNRURJQSwgdGhlIG1lZGlhU2VydmljZURhdGEgcGFyYW0gc2hvdWxkIGJlIGluY2x1ZGVkKS5cbiAqL1xuY2xhc3MgQXBwU2VydmljZURhdGEgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2Ygc2VydmljZSB0aGF0IGlzIHRvIGJlIG9mZmVyZWQgYnkgdGhpcyBhcHAuIFNlZSBBcHBTZXJ2aWNlVHlwZSBmb3Iga25vd24gZW51bVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgZXF1aXZhbGVudCB0eXBlcy4gUGFyYW1ldGVyIGlzIGEgc3RyaW5nIHRvIGFsbG93IGZvciBuZXcgc2VydmljZSB0eXBlcyB0byBiZSB1c2VkIGJ5IGFwcHNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9uIG9sZGVyIHZlcnNpb25zIG9mIFNETCBDb3JlLlxuICAgICAqIEByZXR1cm4ge0FwcFNlcnZpY2VEYXRhfVxuICAgICAqL1xuICAgIHNldFNlcnZpY2VUeXBlICh0eXBlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFwcFNlcnZpY2VEYXRhLktFWV9TRVJWSUNFX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0U2VydmljZVR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQXBwU2VydmljZURhdGEuS0VZX1NFUlZJQ0VfVFlQRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGlkXG4gICAgICogQHJldHVybiB7QXBwU2VydmljZURhdGF9XG4gICAgICovXG4gICAgc2V0U2VydmljZUlEIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihBcHBTZXJ2aWNlRGF0YS5LRVlfU0VSVklDRV9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0U2VydmljZUlEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKEFwcFNlcnZpY2VEYXRhLktFWV9TRVJWSUNFX0lEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01lZGlhU2VydmljZURhdGF9IGRhdGEgLSBUaGlzIGRhdGEgaXMgcmVsYXRlZCB0byB3aGF0IGEgbWVkaWEgc2VydmljZSBzaG91bGQgcHJvdmlkZVxuICAgICAqIEByZXR1cm4ge0FwcFNlcnZpY2VEYXRhfVxuICAgICAqL1xuICAgIHNldE1lZGlhU2VydmljZURhdGEgKGRhdGEpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTWVkaWFTZXJ2aWNlRGF0YSwgZGF0YSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFwcFNlcnZpY2VEYXRhLktFWV9NRURJQV9TRVJWSUNFX0RBVEEsIGRhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNZWRpYVNlcnZpY2VEYXRhfVxuICAgICAqL1xuICAgIGdldE1lZGlhU2VydmljZURhdGEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTWVkaWFTZXJ2aWNlRGF0YSwgQXBwU2VydmljZURhdGEuS0VZX01FRElBX1NFUlZJQ0VfREFUQSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtXZWF0aGVyU2VydmljZURhdGF9IGRhdGEgLSBUaGlzIGRhdGEgaXMgcmVsYXRlZCB0byB3aGF0IGEgd2VhdGhlciBzZXJ2aWNlIHdvdWxkIHByb3ZpZGVcbiAgICAgKiBAcmV0dXJuIHtBcHBTZXJ2aWNlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRXZWF0aGVyU2VydmljZURhdGEgKGRhdGEpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoV2VhdGhlclNlcnZpY2VEYXRhLCBkYXRhKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQXBwU2VydmljZURhdGEuS0VZX1dFQVRIRVJfU0VSVklDRV9EQVRBLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7V2VhdGhlclNlcnZpY2VEYXRhfVxuICAgICAqL1xuICAgIGdldFdlYXRoZXJTZXJ2aWNlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChXZWF0aGVyU2VydmljZURhdGEsIEFwcFNlcnZpY2VEYXRhLktFWV9XRUFUSEVSX1NFUlZJQ0VfREFUQSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOYXZpZ2F0aW9uU2VydmljZURhdGF9IGRhdGEgLSBUaGlzIGRhdGEgaXMgcmVsYXRlZCB0byB3aGF0IGEgbmF2aWdhdGlvbiBzZXJ2aWNlIHdvdWxkIHByb3ZpZGUuXG4gICAgICogQHJldHVybiB7QXBwU2VydmljZURhdGF9XG4gICAgICovXG4gICAgc2V0TmF2aWdhdGlvblNlcnZpY2VEYXRhIChkYXRhKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKE5hdmlnYXRpb25TZXJ2aWNlRGF0YSwgZGF0YSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEFwcFNlcnZpY2VEYXRhLktFWV9OQVZJR0FUSU9OX1NFUlZJQ0VfREFUQSwgZGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge05hdmlnYXRpb25TZXJ2aWNlRGF0YX1cbiAgICAgKi9cbiAgICBnZXROYXZpZ2F0aW9uU2VydmljZURhdGEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTmF2aWdhdGlvblNlcnZpY2VEYXRhLCBBcHBTZXJ2aWNlRGF0YS5LRVlfTkFWSUdBVElPTl9TRVJWSUNFX0RBVEEpO1xuICAgIH1cbn1cblxuQXBwU2VydmljZURhdGEuS0VZX1NFUlZJQ0VfVFlQRSA9ICdzZXJ2aWNlVHlwZSc7XG5BcHBTZXJ2aWNlRGF0YS5LRVlfU0VSVklDRV9JRCA9ICdzZXJ2aWNlSUQnO1xuQXBwU2VydmljZURhdGEuS0VZX01FRElBX1NFUlZJQ0VfREFUQSA9ICdtZWRpYVNlcnZpY2VEYXRhJztcbkFwcFNlcnZpY2VEYXRhLktFWV9XRUFUSEVSX1NFUlZJQ0VfREFUQSA9ICd3ZWF0aGVyU2VydmljZURhdGEnO1xuQXBwU2VydmljZURhdGEuS0VZX05BVklHQVRJT05fU0VSVklDRV9EQVRBID0gJ25hdmlnYXRpb25TZXJ2aWNlRGF0YSc7XG5cbmV4cG9ydCB7IEFwcFNlcnZpY2VEYXRhIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgQXBwU2VydmljZURhdGEgfSBmcm9tICcuLi9zdHJ1Y3RzL0FwcFNlcnZpY2VEYXRhLmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG4vKipcbiAqIFRoaXMgcmVzcG9uc2UgaW5jbHVkZXMgdGhlIGRhdGEgdGhhdCB3YXMgcmVxdWVzdGVkIGZyb20gdGhlIHNwZWNpZmljIHNlcnZpY2VcbiAqL1xuY2xhc3MgR2V0QXBwU2VydmljZURhdGFSZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkdldEFwcFNlcnZpY2VEYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FwcFNlcnZpY2VEYXRhfSBkYXRhIC0gQ29udGFpbnMgYWxsIHRoZSBjdXJyZW50IGRhdGEgb2YgdGhlIGFwcCBzZXJ2aWNlLiBUaGUgc2VydmljZVR5cGUgd2lsbCBsaW5rIHRvXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIG9mIHRoZSBzZXJ2aWNlIGRhdGEgb2JqZWN0cyBhcmUgaW5jbHVkZWQgaW4gdGhpcyBvYmplY3QgKGUuZy4gaWYgdGhlIHNlcnZpY2VcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBpcyBNRURJQSwgdGhlIG1lZGlhU2VydmljZURhdGEgcGFyYW0gc2hvdWxkIGJlIGluY2x1ZGVkKS5cbiAgICAgKiBAcmV0dXJuIHtHZXRBcHBTZXJ2aWNlRGF0YVJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFNlcnZpY2VEYXRhIChkYXRhKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEFwcFNlcnZpY2VEYXRhLCBkYXRhKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoR2V0QXBwU2VydmljZURhdGFSZXNwb25zZS5LRVlfU0VSVklDRV9EQVRBLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QXBwU2VydmljZURhdGF9XG4gICAgICovXG4gICAgZ2V0U2VydmljZURhdGEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQXBwU2VydmljZURhdGEsIEdldEFwcFNlcnZpY2VEYXRhUmVzcG9uc2UuS0VZX1NFUlZJQ0VfREFUQSk7XG4gICAgfVxufVxuXG5HZXRBcHBTZXJ2aWNlRGF0YVJlc3BvbnNlLktFWV9TRVJWSUNFX0RBVEEgPSAnc2VydmljZURhdGEnO1xuXG5leHBvcnQgeyBHZXRBcHBTZXJ2aWNlRGF0YVJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4uL1JwY1JlcXVlc3QuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuXG5jbGFzcyBQZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9uIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5QZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJpIC0gRnVsbHkgcXVhbGlmaWVkIFVSSSBiYXNlZCBvbiBhIHByZWRldGVybWluZWQgc2NoZW1lIHByb3ZpZGVkIGJ5IHRoZSBhcHAgc2VydmljZS4gU0RMIG1ha2VzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgVVJJIGlzIGNvcnJlY3QuXG4gICAgICogQHJldHVybiB7UGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvbn1cbiAgICAgKi9cbiAgICBzZXRTZXJ2aWNlVXJpICh1cmkpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvbi5LRVlfU0VSVklDRV9VUkksIHVyaSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRTZXJ2aWNlVXJpICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFBlcmZvcm1BcHBTZXJ2aWNlSW50ZXJhY3Rpb24uS0VZX1NFUlZJQ0VfVVJJKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBUaGUgc2VydmljZSBJRCB0aGF0IHRoZSBhcHAgY29uc3VtZXIgd2lzaGVzIHRvIHNlbmQgdGhpcyBVUkkuXG4gICAgICogQHJldHVybiB7UGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvbn1cbiAgICAgKi9cbiAgICBzZXRTZXJ2aWNlSUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFBlcmZvcm1BcHBTZXJ2aWNlSW50ZXJhY3Rpb24uS0VZX1NFUlZJQ0VfSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFNlcnZpY2VJRCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihQZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9uLktFWV9TRVJWSUNFX0lEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYXBwIC0gVGhpcyBzdHJpbmcgaXMgdGhlIGFwcElEIG9mIHRoZSBhcHAgcmVxdWVzdGluZyB0aGUgYXBwIHNlcnZpY2UgcHJvdmlkZXIgdGFrZSB0aGUgc3BlY2lmaWNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLlxuICAgICAqIEByZXR1cm4ge1BlcmZvcm1BcHBTZXJ2aWNlSW50ZXJhY3Rpb259XG4gICAgICovXG4gICAgc2V0T3JpZ2luQXBwIChhcHApIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvbi5LRVlfT1JJR0lOX0FQUCwgYXBwKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldE9yaWdpbkFwcCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihQZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9uLktFWV9PUklHSU5fQVBQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFjdGl2ZSAtIFRoaXMgZmxhZyBzaWduYWxzIHRoZSByZXF1ZXN0aW5nIGNvbnN1bWVyIHdvdWxkIGxpa2UgdGhpcyBzZXJ2aWNlIHRvIGJlY29tZSB0aGUgYWN0aXZlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5IHNlcnZpY2Ugb2YgdGhlIGRlc3RpbmF0aW9uJ3MgdHlwZS5cbiAgICAgKiBAcmV0dXJuIHtQZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9ufVxuICAgICAqL1xuICAgIHNldFJlcXVlc3RTZXJ2aWNlQWN0aXZlIChhY3RpdmUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvbi5LRVlfUkVRVUVTVF9TRVJWSUNFX0FDVElWRSwgYWN0aXZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRSZXF1ZXN0U2VydmljZUFjdGl2ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihQZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9uLktFWV9SRVFVRVNUX1NFUlZJQ0VfQUNUSVZFKTtcbiAgICB9XG59XG5cblBlcmZvcm1BcHBTZXJ2aWNlSW50ZXJhY3Rpb24uS0VZX1NFUlZJQ0VfVVJJID0gJ3NlcnZpY2VVcmknO1xuUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvbi5LRVlfU0VSVklDRV9JRCA9ICdzZXJ2aWNlSUQnO1xuUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvbi5LRVlfT1JJR0lOX0FQUCA9ICdvcmlnaW5BcHAnO1xuUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvbi5LRVlfUkVRVUVTVF9TRVJWSUNFX0FDVElWRSA9ICdyZXF1ZXN0U2VydmljZUFjdGl2ZSc7XG5cbmV4cG9ydCB7IFBlcmZvcm1BcHBTZXJ2aWNlSW50ZXJhY3Rpb24gfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvblJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHJlc3VsdCAtIFRoZSBzZXJ2aWNlIGNhbiBwcm92aWRlIHNwZWNpZmljIHJlc3VsdCBzdHJpbmdzIHRvIHRoZSBjb25zdW1lciB0aHJvdWdoIHRoaXMgcGFyYW0uXG4gICAgICogQHJldHVybiB7UGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvblJlc3BvbnNlfVxuICAgICAqL1xuICAgIHNldFNlcnZpY2VTcGVjaWZpY1Jlc3VsdCAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFBlcmZvcm1BcHBTZXJ2aWNlSW50ZXJhY3Rpb25SZXNwb25zZS5LRVlfU0VSVklDRV9TUEVDSUZJQ19SRVNVTFQsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRTZXJ2aWNlU3BlY2lmaWNSZXN1bHQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvblJlc3BvbnNlLktFWV9TRVJWSUNFX1NQRUNJRklDX1JFU1VMVCk7XG4gICAgfVxufVxuXG5QZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9uUmVzcG9uc2UuS0VZX1NFUlZJQ0VfU1BFQ0lGSUNfUkVTVUxUID0gJ3NlcnZpY2VTcGVjaWZpY1Jlc3VsdCc7XG5cbmV4cG9ydCB7IFBlcmZvcm1BcHBTZXJ2aWNlSW50ZXJhY3Rpb25SZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBDbG9zZSBhbiBhY3RpdmUgaW50ZXJhY3Rpb24gb24gdGhlIEhNSS5cbiAqL1xuY2xhc3MgQ2FuY2VsSW50ZXJhY3Rpb24gZXh0ZW5kcyBScGNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkNhbmNlbEludGVyYWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIHNwZWNpZmljIGludGVyYWN0aW9uIHlvdSB3YW50IHRvIGRpc21pc3MuIElmIG5vdCBzZXQsIHRoZSBtb3N0IHJlY2VudCBvZiB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBSUEMgdHlwZSBzZXQgaW4gZnVuY3Rpb25JRCB3aWxsIGJlIGRpc21pc3NlZC5cbiAgICAgKiBAcmV0dXJuIHtDYW5jZWxJbnRlcmFjdGlvbn1cbiAgICAgKi9cbiAgICBzZXRDYW5jZWxJRCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoQ2FuY2VsSW50ZXJhY3Rpb24uS0VZX0NBTkNFTF9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0Q2FuY2VsSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ2FuY2VsSW50ZXJhY3Rpb24uS0VZX0NBTkNFTF9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSB0eXBlIG9mIGludGVyYWN0aW9uIHRoZSBkZXZlbG9wZXIgd2FudHMgdG8gZGlzbWlzcy4gT25seSB2YWx1ZXMgMTAsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgKFBlcmZvcm1JbnRlcmFjdGlvbklEKSwgMTIgKEFsZXJ0SUQpLCAyNSAoU2Nyb2xsYWJsZU1lc3NhZ2VJRCksIGFuZCAyNiAoU2xpZGVySUQpIGFyZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBlcm1pdHRlZC5cbiAgICAgKiBAcmV0dXJuIHtDYW5jZWxJbnRlcmFjdGlvbn1cbiAgICAgKi9cbiAgICBzZXRGdW5jdGlvbklEIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihDYW5jZWxJbnRlcmFjdGlvbi5LRVlfRlVOQ1RJT05fSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEZ1bmN0aW9uSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoQ2FuY2VsSW50ZXJhY3Rpb24uS0VZX0ZVTkNUSU9OX0lEKTtcbiAgICB9XG59XG5cbkNhbmNlbEludGVyYWN0aW9uLktFWV9DQU5DRUxfSUQgPSAnY2FuY2VsSUQnO1xuQ2FuY2VsSW50ZXJhY3Rpb24uS0VZX0ZVTkNUSU9OX0lEID0gJ2Z1bmN0aW9uSUQnO1xuXG5leHBvcnQgeyBDYW5jZWxJbnRlcmFjdGlvbiB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG4vKipcbiAqIElmIG5vIGFwcGxpY2FibGUgcmVxdWVzdCBjYW4gYmUgZGlzbWlzc2VkLCB0aGUgcmVzdWx0IHdpbGwgYmUgSUdOT1JFRC5cbiAqL1xuY2xhc3MgQ2FuY2VsSW50ZXJhY3Rpb25SZXNwb25zZSBleHRlbmRzIFJwY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELkNhbmNlbEludGVyYWN0aW9uKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgQ2FuY2VsSW50ZXJhY3Rpb25SZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBSZXF1ZXN0IGZyb20gdGhlIGFwcGxpY2F0aW9uIHRvIGV4aXQgdGhlIGZvcmVncm91bmQgYW5kIGVudGVyIEhNSV9OT05FLlxuICovXG5jbGFzcyBDbG9zZUFwcGxpY2F0aW9uIGV4dGVuZHMgUnBjUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5DbG9zZUFwcGxpY2F0aW9uKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgQ2xvc2VBcHBsaWNhdGlvbiB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi4vUnBjUmVzcG9uc2UuanMnO1xuXG5jbGFzcyBDbG9zZUFwcGxpY2F0aW9uUmVzcG9uc2UgZXh0ZW5kcyBScGNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5DbG9zZUFwcGxpY2F0aW9uKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHsgQ2xvc2VBcHBsaWNhdGlvblJlc3BvbnNlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogRW51bWVyYXRpb24gdGhhdCBkZXNjcmliZXMgcG9zc2libGUgY29udGV4dHMgYW4gYXBwJ3MgSE1JIG1pZ2h0IGJlIGluLiBDb21tdW5pY2F0ZWQgdG8gd2hpY2hldmVyIGFwcCBpcyBpbiBITUkgRlVMTCxcbiAqIGV4Y2VwdCBBbGVydC5cbiAqIEB0eXBlZGVmIHtFbnVtfSBTeXN0ZW1Db250ZXh0XG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBTeXN0ZW1Db250ZXh0IGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBhcHAncyBwZXJzaXN0ZW50IGRpc3BsYXkgKHdoZXRoZXIgbWVkaWEvbm9uLW1lZGlhL25hdmlnYXRpb24pIGlzIGZ1bGx5IHZpc2libGUgb25zY3JlZW4uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU1lTQ1RYVF9NQUlOICgpIHtcbiAgICAgICAgcmV0dXJuIFN5c3RlbUNvbnRleHQuX01BUC5TWVNDVFhUX01BSU47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHN5c3RlbSBpcyBjdXJyZW50bHkgaW4gYSBWUiBzZXNzaW9uICh3aXRoIHdoYXRldmVyIGRlZGljYXRlZCBWUiBzY3JlZW4gYmVpbmcgb3ZlcmxhaWQgb25zY3JlZW4pLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNZU0NUWFRfVlJTRVNTSU9OICgpIHtcbiAgICAgICAgcmV0dXJuIFN5c3RlbUNvbnRleHQuX01BUC5TWVNDVFhUX1ZSU0VTU0lPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3lzdGVtIGlzIGN1cnJlbnRseSBkaXNwbGF5aW5nIGFuIGluLUFwcCBtZW51IG9uc2NyZWVuLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFNZU0NUWFRfTUVOVSAoKSB7XG4gICAgICAgIHJldHVybiBTeXN0ZW1Db250ZXh0Ll9NQVAuU1lTQ1RYVF9NRU5VO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBhcHAncyBkaXNwbGF5IEhNSSBpcyBjdXJyZW50bHkgYmVpbmcgb2JzY3VyZWQgYnkgZWl0aGVyIGEgc3lzdGVtIG9yIG90aGVyIGFwcCdzIG92ZXJsYXkuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU1lTQ1RYVF9ITUlfT0JTQ1VSRUQgKCkge1xuICAgICAgICByZXR1cm4gU3lzdGVtQ29udGV4dC5fTUFQLlNZU0NUWFRfSE1JX09CU0NVUkVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJyb2FkY2FzdCBvbmx5IHRvIHdoaWNoZXZlciBhcHAgaGFzIGFuIGFsZXJ0IGN1cnJlbnRseSBiZWluZyBkaXNwbGF5ZWQuXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU1lTQ1RYVF9BTEVSVCAoKSB7XG4gICAgICAgIHJldHVybiBTeXN0ZW1Db250ZXh0Ll9NQVAuU1lTQ1RYVF9BTEVSVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBTeXN0ZW1Db250ZXh0Ll92YWx1ZUZvcktleShrZXksIFN5c3RlbUNvbnRleHQuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBTeXN0ZW1Db250ZXh0Ll9rZXlGb3JWYWx1ZSh2YWx1ZSwgU3lzdGVtQ29udGV4dC5fTUFQKTtcbiAgICB9XG59XG5cblN5c3RlbUNvbnRleHQuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdTWVNDVFhUX01BSU4nOiAnTUFJTicsXG4gICAgJ1NZU0NUWFRfVlJTRVNTSU9OJzogJ1ZSU0VTU0lPTicsXG4gICAgJ1NZU0NUWFRfTUVOVSc6ICdNRU5VJyxcbiAgICAnU1lTQ1RYVF9ITUlfT0JTQ1VSRUQnOiAnSE1JX09CU0NVUkVEJyxcbiAgICAnU1lTQ1RYVF9BTEVSVCc6ICdBTEVSVCcsXG59KTtcblxuZXhwb3J0IHsgU3lzdGVtQ29udGV4dCB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNNZXNzYWdlIH0gZnJvbSAnLi9ScGNNZXNzYWdlLmpzJztcbmltcG9ydCB7IFJwY1R5cGUgfSBmcm9tICcuL2VudW1zL1JwY1R5cGUuanMnO1xuXG5jbGFzcyBScGNOb3RpZmljYXRpb24gZXh0ZW5kcyBScGNNZXNzYWdlIHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRSUENUeXBlKFJwY1R5cGUuTk9USUZJQ0FUSU9OKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFJwY05vdGlmaWNhdGlvbiB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIHRoYXQgZGVzY3JpYmVzIHBvc3NpYmxlIHN0YXRlcyBvZiBhdWRpbyBzdHJlYW1pbmcuXG4gKiBAdHlwZWRlZiB7RW51bX0gQXVkaW9TdHJlYW1pbmdTdGF0ZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgQXVkaW9TdHJlYW1pbmdTdGF0ZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBVURJQkxFICgpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtaW5nU3RhdGUuX01BUC5BVURJQkxFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEFUVEVOVUFURUQgKCkge1xuICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1pbmdTdGF0ZS5fTUFQLkFUVEVOVUFURUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTk9UX0FVRElCTEUgKCkge1xuICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1pbmdTdGF0ZS5fTUFQLk5PVF9BVURJQkxFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtaW5nU3RhdGUuX3ZhbHVlRm9yS2V5KGtleSwgQXVkaW9TdHJlYW1pbmdTdGF0ZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtaW5nU3RhdGUuX2tleUZvclZhbHVlKHZhbHVlLCBBdWRpb1N0cmVhbWluZ1N0YXRlLl9NQVApO1xuICAgIH1cbn1cblxuQXVkaW9TdHJlYW1pbmdTdGF0ZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0FVRElCTEUnOiAnQVVESUJMRScsXG4gICAgJ0FUVEVOVUFURUQnOiAnQVRURU5VQVRFRCcsXG4gICAgJ05PVF9BVURJQkxFJzogJ05PVF9BVURJQkxFJyxcbn0pO1xuXG5leHBvcnQgeyBBdWRpb1N0cmVhbWluZ1N0YXRlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogRW51bWVyYXRpb24gdGhhdCBkZXNjcmliZXMgY3VycmVudCBsZXZlbHMgb2YgSE1JLlxuICogQHR5cGVkZWYge0VudW19IEhNSUxldmVsXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBITUlMZXZlbCBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBITUlfRlVMTCAoKSB7XG4gICAgICAgIHJldHVybiBITUlMZXZlbC5fTUFQLkhNSV9GVUxMO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEhNSV9MSU1JVEVEICgpIHtcbiAgICAgICAgcmV0dXJuIEhNSUxldmVsLl9NQVAuSE1JX0xJTUlURUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgSE1JX0JBQ0tHUk9VTkQgKCkge1xuICAgICAgICByZXR1cm4gSE1JTGV2ZWwuX01BUC5ITUlfQkFDS0dST1VORDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBITUlfTk9ORSAoKSB7XG4gICAgICAgIHJldHVybiBITUlMZXZlbC5fTUFQLkhNSV9OT05FO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEhNSUxldmVsLl92YWx1ZUZvcktleShrZXksIEhNSUxldmVsLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gSE1JTGV2ZWwuX2tleUZvclZhbHVlKHZhbHVlLCBITUlMZXZlbC5fTUFQKTtcbiAgICB9XG59XG5cbkhNSUxldmVsLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnSE1JX0ZVTEwnOiAnRlVMTCcsXG4gICAgJ0hNSV9MSU1JVEVEJzogJ0xJTUlURUQnLFxuICAgICdITUlfQkFDS0dST1VORCc6ICdCQUNLR1JPVU5EJyxcbiAgICAnSE1JX05PTkUnOiAnTk9ORScsXG59KTtcblxuZXhwb3J0IHsgSE1JTGV2ZWwgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBFbnVtZXJhdGlvbiB0aGF0IGRlc2NyaWJlcyBwb3NzaWJsZSBzdGF0ZXMgb2YgdmlkZW8gc3RyZWFtaW5nLlxuICogQHR5cGVkZWYge0VudW19IFZpZGVvU3RyZWFtaW5nU3RhdGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFZpZGVvU3RyZWFtaW5nU3RhdGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgU1RSRUFNQUJMRSAoKSB7XG4gICAgICAgIHJldHVybiBWaWRlb1N0cmVhbWluZ1N0YXRlLl9NQVAuU1RSRUFNQUJMRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOT1RfU1RSRUFNQUJMRSAoKSB7XG4gICAgICAgIHJldHVybiBWaWRlb1N0cmVhbWluZ1N0YXRlLl9NQVAuTk9UX1NUUkVBTUFCTEU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gVmlkZW9TdHJlYW1pbmdTdGF0ZS5fdmFsdWVGb3JLZXkoa2V5LCBWaWRlb1N0cmVhbWluZ1N0YXRlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gVmlkZW9TdHJlYW1pbmdTdGF0ZS5fa2V5Rm9yVmFsdWUodmFsdWUsIFZpZGVvU3RyZWFtaW5nU3RhdGUuX01BUCk7XG4gICAgfVxufVxuXG5WaWRlb1N0cmVhbWluZ1N0YXRlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnU1RSRUFNQUJMRSc6ICdTVFJFQU1BQkxFJyxcbiAgICAnTk9UX1NUUkVBTUFCTEUnOiAnTk9UX1NUUkVBTUFCTEUnLFxufSk7XG5cbmV4cG9ydCB7IFZpZGVvU3RyZWFtaW5nU3RhdGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBTeXN0ZW1Db250ZXh0IH0gZnJvbSAnLi4vZW51bXMvU3lzdGVtQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNOb3RpZmljYXRpb24gfSBmcm9tICcuLi9ScGNOb3RpZmljYXRpb24uanMnO1xuaW1wb3J0IHsgQXVkaW9TdHJlYW1pbmdTdGF0ZSB9IGZyb20gJy4uL2VudW1zL0F1ZGlvU3RyZWFtaW5nU3RhdGUuanMnO1xuaW1wb3J0IHsgSE1JTGV2ZWwgfSBmcm9tICcuLi9lbnVtcy9ITUlMZXZlbC5qcyc7XG5pbXBvcnQgeyBWaWRlb1N0cmVhbWluZ1N0YXRlIH0gZnJvbSAnLi4vZW51bXMvVmlkZW9TdHJlYW1pbmdTdGF0ZS5qcyc7XG5cbmNsYXNzIE9uSE1JU3RhdHVzIGV4dGVuZHMgUnBjTm90aWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELk9uSE1JU3RhdHVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0hNSUxldmVsfSBsZXZlbCAtIFNlZSBITUlMZXZlbFxuICAgICAqIEByZXR1cm4ge09uSE1JU3RhdHVzfVxuICAgICAqL1xuICAgIHNldEhtaUxldmVsIChsZXZlbCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShITUlMZXZlbCwgbGV2ZWwpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPbkhNSVN0YXR1cy5LRVlfSE1JX0xFVkVMLCBsZXZlbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0hNSUxldmVsfVxuICAgICAqL1xuICAgIGdldEhtaUxldmVsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEhNSUxldmVsLCBPbkhNSVN0YXR1cy5LRVlfSE1JX0xFVkVMKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0F1ZGlvU3RyZWFtaW5nU3RhdGV9IHN0YXRlIC0gU2VlIEF1ZGlvU3RyZWFtaW5nU3RhdGVcbiAgICAgKiBAcmV0dXJuIHtPbkhNSVN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRBdWRpb1N0cmVhbWluZ1N0YXRlIChzdGF0ZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShBdWRpb1N0cmVhbWluZ1N0YXRlLCBzdGF0ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uSE1JU3RhdHVzLktFWV9BVURJT19TVFJFQU1JTkdfU1RBVEUsIHN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QXVkaW9TdHJlYW1pbmdTdGF0ZX1cbiAgICAgKi9cbiAgICBnZXRBdWRpb1N0cmVhbWluZ1N0YXRlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEF1ZGlvU3RyZWFtaW5nU3RhdGUsIE9uSE1JU3RhdHVzLktFWV9BVURJT19TVFJFQU1JTkdfU1RBVEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3lzdGVtQ29udGV4dH0gY29udGV4dCAtIFNlZSBTeXN0ZW1Db250ZXh0XG4gICAgICogQHJldHVybiB7T25ITUlTdGF0dXN9XG4gICAgICovXG4gICAgc2V0U3lzdGVtQ29udGV4dCAoY29udGV4dCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShTeXN0ZW1Db250ZXh0LCBjb250ZXh0KTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25ITUlTdGF0dXMuS0VZX1NZU1RFTV9DT05URVhULCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3lzdGVtQ29udGV4dH1cbiAgICAgKi9cbiAgICBnZXRTeXN0ZW1Db250ZXh0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFN5c3RlbUNvbnRleHQsIE9uSE1JU3RhdHVzLktFWV9TWVNURU1fQ09OVEVYVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtWaWRlb1N0cmVhbWluZ1N0YXRlfSBzdGF0ZSAtIFNlZSBWaWRlb1N0cmVhbWluZ1N0YXRlLiBJZiBpdCBpcyBOT1RfU1RSRUFNQUJMRSwgdGhlIGFwcCBtdXN0IHN0b3BcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtaW5nIHZpZGVvIHRvIFNETCBDb3JlKHN0b3Agc2VydmljZSkuXG4gICAgICogQHJldHVybiB7T25ITUlTdGF0dXN9XG4gICAgICovXG4gICAgc2V0VmlkZW9TdHJlYW1pbmdTdGF0ZSAoc3RhdGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVmlkZW9TdHJlYW1pbmdTdGF0ZSwgc3RhdGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPbkhNSVN0YXR1cy5LRVlfVklERU9fU1RSRUFNSU5HX1NUQVRFLCBzdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nU3RhdGV9XG4gICAgICovXG4gICAgZ2V0VmlkZW9TdHJlYW1pbmdTdGF0ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWaWRlb1N0cmVhbWluZ1N0YXRlLCBPbkhNSVN0YXR1cy5LRVlfVklERU9fU1RSRUFNSU5HX1NUQVRFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaWQgLSBUaGlzIGlzIHRoZSB1bmlxdWUgSUQgYXNzaWduZWQgdG8gdGhlIHdpbmRvdyB0aGF0IHRoaXMgUlBDIGlzIGludGVuZGVkLiBJZiB0aGlzIHBhcmFtIGlzIG5vdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkLCBpdCB3aWxsIGJlIGFzc3VtZWQgdGhhdCB0aGlzIHJlcXVlc3QgaXMgc3BlY2lmaWNhbGx5IGZvciB0aGUgbWFpbiB3aW5kb3cgb24gdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgbWFpbiBkaXNwbGF5LiBTZWUgUHJlZGVmaW5lZFdpbmRvd3MgZW51bS5cbiAgICAgKiBAcmV0dXJuIHtPbkhNSVN0YXR1c31cbiAgICAgKi9cbiAgICBzZXRXaW5kb3dJRCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25ITUlTdGF0dXMuS0VZX1dJTkRPV19JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0V2luZG93SUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoT25ITUlTdGF0dXMuS0VZX1dJTkRPV19JRCk7XG4gICAgfVxufVxuXG5PbkhNSVN0YXR1cy5LRVlfSE1JX0xFVkVMID0gJ2htaUxldmVsJztcbk9uSE1JU3RhdHVzLktFWV9BVURJT19TVFJFQU1JTkdfU1RBVEUgPSAnYXVkaW9TdHJlYW1pbmdTdGF0ZSc7XG5PbkhNSVN0YXR1cy5LRVlfU1lTVEVNX0NPTlRFWFQgPSAnc3lzdGVtQ29udGV4dCc7XG5PbkhNSVN0YXR1cy5LRVlfVklERU9fU1RSRUFNSU5HX1NUQVRFID0gJ3ZpZGVvU3RyZWFtaW5nU3RhdGUnO1xuT25ITUlTdGF0dXMuS0VZX1dJTkRPV19JRCA9ICd3aW5kb3dJRCc7XG5cbmV4cG9ydCB7IE9uSE1JU3RhdHVzIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogRXJyb3IgY29kZSwgd2hpY2ggY29tZXMgZnJvbSB0aGUgbW9kdWxlIHNpZGUuXG4gKiBAdHlwZWRlZiB7RW51bX0gQXBwSW50ZXJmYWNlVW5yZWdpc3RlcmVkUmVhc29uXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBBcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWRSZWFzb24gZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgSUdOSVRJT05fT0ZGICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEludGVyZmFjZVVucmVnaXN0ZXJlZFJlYXNvbi5fTUFQLklHTklUSU9OX09GRjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBCTFVFVE9PVEhfT0ZGICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEludGVyZmFjZVVucmVnaXN0ZXJlZFJlYXNvbi5fTUFQLkJMVUVUT09USF9PRkY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVVNCX0RJU0NPTk5FQ1RFRCAoKSB7XG4gICAgICAgIHJldHVybiBBcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWRSZWFzb24uX01BUC5VU0JfRElTQ09OTkVDVEVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJFUVVFU1RfV0hJTEVfSU5fTk9ORV9ITUlfTEVWRUwgKCkge1xuICAgICAgICByZXR1cm4gQXBwSW50ZXJmYWNlVW5yZWdpc3RlcmVkUmVhc29uLl9NQVAuUkVRVUVTVF9XSElMRV9JTl9OT05FX0hNSV9MRVZFTDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBUT09fTUFOWV9SRVFVRVNUUyAoKSB7XG4gICAgICAgIHJldHVybiBBcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWRSZWFzb24uX01BUC5UT09fTUFOWV9SRVFVRVNUUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBEUklWRVJfRElTVFJBQ1RJT05fVklPTEFUSU9OICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEludGVyZmFjZVVucmVnaXN0ZXJlZFJlYXNvbi5fTUFQLkRSSVZFUl9ESVNUUkFDVElPTl9WSU9MQVRJT047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTEFOR1VBR0VfQ0hBTkdFICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEludGVyZmFjZVVucmVnaXN0ZXJlZFJlYXNvbi5fTUFQLkxBTkdVQUdFX0NIQU5HRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBNQVNURVJfUkVTRVQgKCkge1xuICAgICAgICByZXR1cm4gQXBwSW50ZXJmYWNlVW5yZWdpc3RlcmVkUmVhc29uLl9NQVAuTUFTVEVSX1JFU0VUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEZBQ1RPUllfREVGQVVMVFMgKCkge1xuICAgICAgICByZXR1cm4gQXBwSW50ZXJmYWNlVW5yZWdpc3RlcmVkUmVhc29uLl9NQVAuRkFDVE9SWV9ERUZBVUxUUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBBUFBfVU5BVVRIT1JJWkVEICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEludGVyZmFjZVVucmVnaXN0ZXJlZFJlYXNvbi5fTUFQLkFQUF9VTkFVVEhPUklaRUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUFJPVE9DT0xfVklPTEFUSU9OICgpIHtcbiAgICAgICAgcmV0dXJuIEFwcEludGVyZmFjZVVucmVnaXN0ZXJlZFJlYXNvbi5fTUFQLlBST1RPQ09MX1ZJT0xBVElPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBVTlNVUFBPUlRFRF9ITUlfUkVTT1VSQ0UgKCkge1xuICAgICAgICByZXR1cm4gQXBwSW50ZXJmYWNlVW5yZWdpc3RlcmVkUmVhc29uLl9NQVAuVU5TVVBQT1JURURfSE1JX1JFU09VUkNFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEFwcEludGVyZmFjZVVucmVnaXN0ZXJlZFJlYXNvbi5fdmFsdWVGb3JLZXkoa2V5LCBBcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWRSZWFzb24uX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBBcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWRSZWFzb24uX2tleUZvclZhbHVlKHZhbHVlLCBBcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWRSZWFzb24uX01BUCk7XG4gICAgfVxufVxuXG5BcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWRSZWFzb24uX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdJR05JVElPTl9PRkYnOiAnSUdOSVRJT05fT0ZGJyxcbiAgICAnQkxVRVRPT1RIX09GRic6ICdCTFVFVE9PVEhfT0ZGJyxcbiAgICAnVVNCX0RJU0NPTk5FQ1RFRCc6ICdVU0JfRElTQ09OTkVDVEVEJyxcbiAgICAnUkVRVUVTVF9XSElMRV9JTl9OT05FX0hNSV9MRVZFTCc6ICdSRVFVRVNUX1dISUxFX0lOX05PTkVfSE1JX0xFVkVMJyxcbiAgICAnVE9PX01BTllfUkVRVUVTVFMnOiAnVE9PX01BTllfUkVRVUVTVFMnLFxuICAgICdEUklWRVJfRElTVFJBQ1RJT05fVklPTEFUSU9OJzogJ0RSSVZFUl9ESVNUUkFDVElPTl9WSU9MQVRJT04nLFxuICAgICdMQU5HVUFHRV9DSEFOR0UnOiAnTEFOR1VBR0VfQ0hBTkdFJyxcbiAgICAnTUFTVEVSX1JFU0VUJzogJ01BU1RFUl9SRVNFVCcsXG4gICAgJ0ZBQ1RPUllfREVGQVVMVFMnOiAnRkFDVE9SWV9ERUZBVUxUUycsXG4gICAgJ0FQUF9VTkFVVEhPUklaRUQnOiAnQVBQX1VOQVVUSE9SSVpFRCcsXG4gICAgJ1BST1RPQ09MX1ZJT0xBVElPTic6ICdQUk9UT0NPTF9WSU9MQVRJT04nLFxuICAgICdVTlNVUFBPUlRFRF9ITUlfUkVTT1VSQ0UnOiAnVU5TVVBQT1JURURfSE1JX1JFU09VUkNFJyxcbn0pO1xuXG5leHBvcnQgeyBBcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWRSZWFzb24gfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBBcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWRSZWFzb24gfSBmcm9tICcuLi9lbnVtcy9BcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWRSZWFzb24uanMnO1xuaW1wb3J0IHsgUnBjTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vUnBjTm90aWZpY2F0aW9uLmpzJztcblxuY2xhc3MgT25BcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWQgZXh0ZW5kcyBScGNOb3RpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuT25BcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXBwSW50ZXJmYWNlVW5yZWdpc3RlcmVkUmVhc29ufSByZWFzb24gLSBTZWUgQXBwSW50ZXJmYWNlVW5yZWdpc3RlcmVkUmVhc29uXG4gICAgICogQHJldHVybiB7T25BcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWR9XG4gICAgICovXG4gICAgc2V0UmVhc29uIChyZWFzb24pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQXBwSW50ZXJmYWNlVW5yZWdpc3RlcmVkUmVhc29uLCByZWFzb24pO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPbkFwcEludGVyZmFjZVVucmVnaXN0ZXJlZC5LRVlfUkVBU09OLCByZWFzb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtBcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWRSZWFzb259XG4gICAgICovXG4gICAgZ2V0UmVhc29uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEFwcEludGVyZmFjZVVucmVnaXN0ZXJlZFJlYXNvbiwgT25BcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWQuS0VZX1JFQVNPTik7XG4gICAgfVxufVxuXG5PbkFwcEludGVyZmFjZVVucmVnaXN0ZXJlZC5LRVlfUkVBU09OID0gJ3JlYXNvbic7XG5cbmV4cG9ydCB7IE9uQXBwSW50ZXJmYWNlVW5yZWdpc3RlcmVkIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IEJ1dHRvbkV2ZW50TW9kZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgQnV0dG9uRXZlbnRNb2RlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgYnV0dG9uIGhhcyBiZWVuIHJlbGVhc2VkIHVwXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQlVUVE9OVVAgKCkge1xuICAgICAgICByZXR1cm4gQnV0dG9uRXZlbnRNb2RlLl9NQVAuQlVUVE9OVVA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBidXR0b24gaGFzIGJlZW4gcHJlc3NlZCBkb3duXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgQlVUVE9ORE9XTiAoKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25FdmVudE1vZGUuX01BUC5CVVRUT05ET1dOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEJ1dHRvbkV2ZW50TW9kZS5fdmFsdWVGb3JLZXkoa2V5LCBCdXR0b25FdmVudE1vZGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBCdXR0b25FdmVudE1vZGUuX2tleUZvclZhbHVlKHZhbHVlLCBCdXR0b25FdmVudE1vZGUuX01BUCk7XG4gICAgfVxufVxuXG5CdXR0b25FdmVudE1vZGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdCVVRUT05VUCc6ICdCVVRUT05VUCcsXG4gICAgJ0JVVFRPTkRPV04nOiAnQlVUVE9ORE9XTicsXG59KTtcblxuZXhwb3J0IHsgQnV0dG9uRXZlbnRNb2RlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgQnV0dG9uTmFtZSB9IGZyb20gJy4uL2VudW1zL0J1dHRvbk5hbWUuanMnO1xuaW1wb3J0IHsgQnV0dG9uRXZlbnRNb2RlIH0gZnJvbSAnLi4vZW51bXMvQnV0dG9uRXZlbnRNb2RlLmpzJztcbmltcG9ydCB7IFJwY05vdGlmaWNhdGlvbiB9IGZyb20gJy4uL1JwY05vdGlmaWNhdGlvbi5qcyc7XG5cbi8qKlxuICogTm90aWZpZXMgYXBwbGljYXRpb24gb2YgVVAvRE9XTiBldmVudHMgZm9yIGJ1dHRvbnMgdG8gd2hpY2ggdGhlIGFwcGxpY2F0aW9uIGlzIHN1YnNjcmliZWQuXG4gKi9cbmNsYXNzIE9uQnV0dG9uRXZlbnQgZXh0ZW5kcyBScGNOb3RpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuT25CdXR0b25FdmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCdXR0b25OYW1lfSBuYW1lIC0gRGVmaW5lcyB0aGUgaGFyZCAocGh5c2ljYWwpIGFuZCBzb2Z0ICh0b3VjaHNjcmVlbikgYnV0dG9ucyBhdmFpbGFibGUgZnJvbSB0aGUgbW9kdWxlXG4gICAgICogQHJldHVybiB7T25CdXR0b25FdmVudH1cbiAgICAgKi9cbiAgICBzZXRCdXR0b25OYW1lIChuYW1lKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEJ1dHRvbk5hbWUsIG5hbWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPbkJ1dHRvbkV2ZW50LktFWV9CVVRUT05fTkFNRSwgbmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0J1dHRvbk5hbWV9XG4gICAgICovXG4gICAgZ2V0QnV0dG9uTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChCdXR0b25OYW1lLCBPbkJ1dHRvbkV2ZW50LktFWV9CVVRUT05fTkFNRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCdXR0b25FdmVudE1vZGV9IG1vZGUgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFuIFVQIG9yIERPV04gZXZlbnQuXG4gICAgICogQHJldHVybiB7T25CdXR0b25FdmVudH1cbiAgICAgKi9cbiAgICBzZXRCdXR0b25FdmVudE1vZGUgKG1vZGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQnV0dG9uRXZlbnRNb2RlLCBtb2RlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25CdXR0b25FdmVudC5LRVlfQlVUVE9OX0VWRU5UX01PREUsIG1vZGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCdXR0b25FdmVudE1vZGV9XG4gICAgICovXG4gICAgZ2V0QnV0dG9uRXZlbnRNb2RlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEJ1dHRvbkV2ZW50TW9kZSwgT25CdXR0b25FdmVudC5LRVlfQlVUVE9OX0VWRU5UX01PREUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpZCAtIElmIEJ1dHRvbk5hbWUgaXMgXCJDVVNUT01fQlVUVE9OXCIsIHRoaXMgcmVmZXJlbmNlcyB0aGUgaW50ZWdlciBJRCBwYXNzZWQgYnkgYSBjdXN0b20gYnV0dG9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHNvZnRCdXR0b24gSUQpXG4gICAgICogQHJldHVybiB7T25CdXR0b25FdmVudH1cbiAgICAgKi9cbiAgICBzZXRDdXN0b21CdXR0b25JRCAoaWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25CdXR0b25FdmVudC5LRVlfQ1VTVE9NX0JVVFRPTl9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0Q3VzdG9tQnV0dG9uSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoT25CdXR0b25FdmVudC5LRVlfQ1VTVE9NX0JVVFRPTl9JRCk7XG4gICAgfVxufVxuXG5PbkJ1dHRvbkV2ZW50LktFWV9CVVRUT05fTkFNRSA9ICdidXR0b25OYW1lJztcbk9uQnV0dG9uRXZlbnQuS0VZX0JVVFRPTl9FVkVOVF9NT0RFID0gJ2J1dHRvbkV2ZW50TW9kZSc7XG5PbkJ1dHRvbkV2ZW50LktFWV9DVVNUT01fQlVUVE9OX0lEID0gJ2N1c3RvbUJ1dHRvbklEJztcblxuZXhwb3J0IHsgT25CdXR0b25FdmVudCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEJ1dHRvblByZXNzTW9kZSB9IGZyb20gJy4uL2VudW1zL0J1dHRvblByZXNzTW9kZS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBCdXR0b25OYW1lIH0gZnJvbSAnLi4vZW51bXMvQnV0dG9uTmFtZS5qcyc7XG5pbXBvcnQgeyBScGNOb3RpZmljYXRpb24gfSBmcm9tICcuLi9ScGNOb3RpZmljYXRpb24uanMnO1xuXG4vKipcbiAqIE5vdGlmaWVzIGFwcGxpY2F0aW9uIG9mIExPTkcvU0hPUlQgcHJlc3MgZXZlbnRzIGZvciBidXR0b25zIHRvIHdoaWNoIHRoZSBhcHBsaWNhdGlvbiBpcyBzdWJzY3JpYmVkLlxuICovXG5jbGFzcyBPbkJ1dHRvblByZXNzIGV4dGVuZHMgUnBjTm90aWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELk9uQnV0dG9uUHJlc3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QnV0dG9uTmFtZX0gbmFtZSAtIERlZmluZXMgdGhlIGhhcmQgKHBoeXNpY2FsKSBhbmQgc29mdCAodG91Y2hzY3JlZW4pIGJ1dHRvbnMgYXZhaWxhYmxlIGZyb20gdGhlIG1vZHVsZVxuICAgICAqIEByZXR1cm4ge09uQnV0dG9uUHJlc3N9XG4gICAgICovXG4gICAgc2V0QnV0dG9uTmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShCdXR0b25OYW1lLCBuYW1lKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25CdXR0b25QcmVzcy5LRVlfQlVUVE9OX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCdXR0b25OYW1lfVxuICAgICAqL1xuICAgIGdldEJ1dHRvbk5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQnV0dG9uTmFtZSwgT25CdXR0b25QcmVzcy5LRVlfQlVUVE9OX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QnV0dG9uUHJlc3NNb2RlfSBtb2RlIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIExPTkcgb3IgU0hPUlQgYnV0dG9uIHByZXNzIGV2ZW50LlxuICAgICAqIEByZXR1cm4ge09uQnV0dG9uUHJlc3N9XG4gICAgICovXG4gICAgc2V0QnV0dG9uUHJlc3NNb2RlIChtb2RlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEJ1dHRvblByZXNzTW9kZSwgbW9kZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uQnV0dG9uUHJlc3MuS0VZX0JVVFRPTl9QUkVTU19NT0RFLCBtb2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QnV0dG9uUHJlc3NNb2RlfVxuICAgICAqL1xuICAgIGdldEJ1dHRvblByZXNzTW9kZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChCdXR0b25QcmVzc01vZGUsIE9uQnV0dG9uUHJlc3MuS0VZX0JVVFRPTl9QUkVTU19NT0RFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaWQgLSBJZiBCdXR0b25OYW1lIGlzIFwiQ1VTVE9NX0JVVFRPTlwiLCB0aGlzIHJlZmVyZW5jZXMgdGhlIGludGVnZXIgSUQgcGFzc2VkIGJ5IGEgY3VzdG9tIGJ1dHRvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAoZS5nLiBzb2Z0QnV0dG9uIElEKVxuICAgICAqIEByZXR1cm4ge09uQnV0dG9uUHJlc3N9XG4gICAgICovXG4gICAgc2V0Q3VzdG9tQnV0dG9uSUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uQnV0dG9uUHJlc3MuS0VZX0NVU1RPTV9CVVRUT05fSUQsIGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEN1c3RvbUJ1dHRvbklEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE9uQnV0dG9uUHJlc3MuS0VZX0NVU1RPTV9CVVRUT05fSUQpO1xuICAgIH1cbn1cblxuT25CdXR0b25QcmVzcy5LRVlfQlVUVE9OX05BTUUgPSAnYnV0dG9uTmFtZSc7XG5PbkJ1dHRvblByZXNzLktFWV9CVVRUT05fUFJFU1NfTU9ERSA9ICdidXR0b25QcmVzc01vZGUnO1xuT25CdXR0b25QcmVzcy5LRVlfQ1VTVE9NX0JVVFRPTl9JRCA9ICdjdXN0b21CdXR0b25JRCc7XG5cbmV4cG9ydCB7IE9uQnV0dG9uUHJlc3MgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBBaXJiYWdTdGF0dXMgfSBmcm9tICcuLi9zdHJ1Y3RzL0FpcmJhZ1N0YXR1cy5qcyc7XG5pbXBvcnQgeyBDbHVzdGVyTW9kZVN0YXR1cyB9IGZyb20gJy4uL3N0cnVjdHMvQ2x1c3Rlck1vZGVTdGF0dXMuanMnO1xuaW1wb3J0IHsgVmVoaWNsZURhdGFFdmVudFN0YXR1cyB9IGZyb20gJy4uL2VudW1zL1ZlaGljbGVEYXRhRXZlbnRTdGF0dXMuanMnO1xuaW1wb3J0IHsgRW1lcmdlbmN5RXZlbnQgfSBmcm9tICcuLi9zdHJ1Y3RzL0VtZXJnZW5jeUV2ZW50LmpzJztcbmltcG9ydCB7IFR1cm5TaWduYWwgfSBmcm9tICcuLi9lbnVtcy9UdXJuU2lnbmFsLmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IEhlYWRMYW1wU3RhdHVzIH0gZnJvbSAnLi4vc3RydWN0cy9IZWFkTGFtcFN0YXR1cy5qcyc7XG5pbXBvcnQgeyBEZXZpY2VTdGF0dXMgfSBmcm9tICcuLi9zdHJ1Y3RzL0RldmljZVN0YXR1cy5qcyc7XG5pbXBvcnQgeyBXaXBlclN0YXR1cyB9IGZyb20gJy4uL2VudW1zL1dpcGVyU3RhdHVzLmpzJztcbmltcG9ydCB7IFJwY05vdGlmaWNhdGlvbiB9IGZyb20gJy4uL1JwY05vdGlmaWNhdGlvbi5qcyc7XG5pbXBvcnQgeyBFbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzIH0gZnJvbSAnLi4vZW51bXMvRWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cy5qcyc7XG5pbXBvcnQgeyBNeUtleSB9IGZyb20gJy4uL3N0cnVjdHMvTXlLZXkuanMnO1xuaW1wb3J0IHsgR1BTRGF0YSB9IGZyb20gJy4uL3N0cnVjdHMvR1BTRGF0YS5qcyc7XG5pbXBvcnQgeyBQUk5ETCB9IGZyb20gJy4uL2VudW1zL1BSTkRMLmpzJztcbmltcG9ydCB7IEZ1ZWxSYW5nZSB9IGZyb20gJy4uL3N0cnVjdHMvRnVlbFJhbmdlLmpzJztcbmltcG9ydCB7IEVDYWxsSW5mbyB9IGZyb20gJy4uL3N0cnVjdHMvRUNhbGxJbmZvLmpzJztcbmltcG9ydCB7IEJlbHRTdGF0dXMgfSBmcm9tICcuLi9zdHJ1Y3RzL0JlbHRTdGF0dXMuanMnO1xuaW1wb3J0IHsgQ29tcG9uZW50Vm9sdW1lU3RhdHVzIH0gZnJvbSAnLi4vZW51bXMvQ29tcG9uZW50Vm9sdW1lU3RhdHVzLmpzJztcbmltcG9ydCB7IEJvZHlJbmZvcm1hdGlvbiB9IGZyb20gJy4uL3N0cnVjdHMvQm9keUluZm9ybWF0aW9uLmpzJztcbmltcG9ydCB7IFRpcmVTdGF0dXMgfSBmcm9tICcuLi9zdHJ1Y3RzL1RpcmVTdGF0dXMuanMnO1xuXG4vKipcbiAqIENhbGxiYWNrIGZvciB0aGUgcGVyaW9kaWMgYW5kIG5vbiBwZXJpb2RpYyB2ZWhpY2xlIGRhdGEgcmVhZCBmdW5jdGlvbi5cbiAqL1xuY2xhc3MgT25WZWhpY2xlRGF0YSBleHRlbmRzIFJwY05vdGlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5PblZlaGljbGVEYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0dQU0RhdGF9IGdwcyAtIFNlZSBHUFNEYXRhXG4gICAgICogQHJldHVybiB7T25WZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRHcHMgKGdwcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShHUFNEYXRhLCBncHMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblZlaGljbGVEYXRhLktFWV9HUFMsIGdwcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0dQU0RhdGF9XG4gICAgICovXG4gICAgZ2V0R3BzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEdQU0RhdGEsIE9uVmVoaWNsZURhdGEuS0VZX0dQUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNwZWVkIC0gVGhlIHZlaGljbGUgc3BlZWQgaW4ga2lsb21ldGVycyBwZXIgaG91clxuICAgICAqIEByZXR1cm4ge09uVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0U3BlZWQgKHNwZWVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uVmVoaWNsZURhdGEuS0VZX1NQRUVELCBzcGVlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRTcGVlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihPblZlaGljbGVEYXRhLktFWV9TUEVFRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJwbSAtIFRoZSBudW1iZXIgb2YgcmV2b2x1dGlvbnMgcGVyIG1pbnV0ZSBvZiB0aGUgZW5naW5lXG4gICAgICogQHJldHVybiB7T25WZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRScG0gKHJwbSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblZlaGljbGVEYXRhLktFWV9SUE0sIHJwbSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRScG0gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoT25WZWhpY2xlRGF0YS5LRVlfUlBNKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGV2ZWwgLSBUaGUgZnVlbCBsZXZlbCBpbiB0aGUgdGFuayAocGVyY2VudGFnZSlcbiAgICAgKiBAcmV0dXJuIHtPblZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEZ1ZWxMZXZlbCAobGV2ZWwpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25WZWhpY2xlRGF0YS5LRVlfRlVFTF9MRVZFTCwgbGV2ZWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0RnVlbExldmVsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE9uVmVoaWNsZURhdGEuS0VZX0ZVRUxfTEVWRUwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q29tcG9uZW50Vm9sdW1lU3RhdHVzfSBsZXZlbF9zdGF0ZSAtIFRoZSBmdWVsIGxldmVsIHN0YXRlXG4gICAgICogQHJldHVybiB7T25WZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRGdWVsTGV2ZWxfU3RhdGUgKGxldmVsX3N0YXRlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKENvbXBvbmVudFZvbHVtZVN0YXR1cywgbGV2ZWxfc3RhdGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblZlaGljbGVEYXRhLktFWV9GVUVMX0xFVkVMX1NUQVRFLCBsZXZlbF9zdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0NvbXBvbmVudFZvbHVtZVN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRGdWVsTGV2ZWxfU3RhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQ29tcG9uZW50Vm9sdW1lU3RhdHVzLCBPblZlaGljbGVEYXRhLktFWV9GVUVMX0xFVkVMX1NUQVRFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gY29uc3VtcHRpb24gLSBUaGUgaW5zdGFudGFuZW91cyBmdWVsIGNvbnN1bXB0aW9uIGluIG1pY3JvbGl0cmVzXG4gICAgICogQHJldHVybiB7T25WZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRJbnN0YW50RnVlbENvbnN1bXB0aW9uIChjb25zdW1wdGlvbikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblZlaGljbGVEYXRhLktFWV9JTlNUQU5UX0ZVRUxfQ09OU1VNUFRJT04sIGNvbnN1bXB0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEluc3RhbnRGdWVsQ29uc3VtcHRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoT25WZWhpY2xlRGF0YS5LRVlfSU5TVEFOVF9GVUVMX0NPTlNVTVBUSU9OKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Z1ZWxSYW5nZVtdfSByYW5nZSAtIFRoZSBlc3RpbWF0ZSByYW5nZSBpbiBLTSB0aGUgdmVoaWNsZSBjYW4gdHJhdmVsIGJhc2VkIG9uIGZ1ZWwgbGV2ZWwgYW5kIGNvbnN1bXB0aW9uXG4gICAgICogQHJldHVybiB7T25WZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRGdWVsUmFuZ2UgKHJhbmdlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEZ1ZWxSYW5nZSwgcmFuZ2UsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblZlaGljbGVEYXRhLktFWV9GVUVMX1JBTkdFLCByYW5nZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Z1ZWxSYW5nZVtdfVxuICAgICAqL1xuICAgIGdldEZ1ZWxSYW5nZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChGdWVsUmFuZ2UsIE9uVmVoaWNsZURhdGEuS0VZX0ZVRUxfUkFOR0UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0ZW1wZXJhdHVyZSAtIFRoZSBleHRlcm5hbCB0ZW1wZXJhdHVyZSBpbiBkZWdyZWVzIGNlbHNpdXNcbiAgICAgKiBAcmV0dXJuIHtPblZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEV4dGVybmFsVGVtcGVyYXR1cmUgKHRlbXBlcmF0dXJlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uVmVoaWNsZURhdGEuS0VZX0VYVEVSTkFMX1RFTVBFUkFUVVJFLCB0ZW1wZXJhdHVyZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRFeHRlcm5hbFRlbXBlcmF0dXJlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE9uVmVoaWNsZURhdGEuS0VZX0VYVEVSTkFMX1RFTVBFUkFUVVJFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1R1cm5TaWduYWx9IHNpZ25hbCAtIFNlZSBUdXJuU2lnbmFsXG4gICAgICogQHJldHVybiB7T25WZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRUdXJuU2lnbmFsIChzaWduYWwpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVHVyblNpZ25hbCwgc2lnbmFsKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25WZWhpY2xlRGF0YS5LRVlfVFVSTl9TSUdOQUwsIHNpZ25hbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1R1cm5TaWduYWx9XG4gICAgICovXG4gICAgZ2V0VHVyblNpZ25hbCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUdXJuU2lnbmFsLCBPblZlaGljbGVEYXRhLktFWV9UVVJOX1NJR05BTCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHZpbiAtIFZlaGljbGUgaWRlbnRpZmljYXRpb24gbnVtYmVyLlxuICAgICAqIEByZXR1cm4ge09uVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0VmluICh2aW4pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25WZWhpY2xlRGF0YS5LRVlfVklOLCB2aW4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0VmluICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE9uVmVoaWNsZURhdGEuS0VZX1ZJTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtQUk5ETH0gcHJuZGwgLSBTZWUgUFJORExcbiAgICAgKiBAcmV0dXJuIHtPblZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldFBybmRsIChwcm5kbCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShQUk5ETCwgcHJuZGwpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblZlaGljbGVEYXRhLktFWV9QUk5ETCwgcHJuZGwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtQUk5ETH1cbiAgICAgKi9cbiAgICBnZXRQcm5kbCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChQUk5ETCwgT25WZWhpY2xlRGF0YS5LRVlfUFJOREwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VGlyZVN0YXR1c30gcHJlc3N1cmUgLSBTZWUgVGlyZVN0YXR1c1xuICAgICAqIEByZXR1cm4ge09uVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0VGlyZVByZXNzdXJlIChwcmVzc3VyZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShUaXJlU3RhdHVzLCBwcmVzc3VyZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uVmVoaWNsZURhdGEuS0VZX1RJUkVfUFJFU1NVUkUsIHByZXNzdXJlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VGlyZVN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRUaXJlUHJlc3N1cmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVGlyZVN0YXR1cywgT25WZWhpY2xlRGF0YS5LRVlfVElSRV9QUkVTU1VSRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9kb21ldGVyIC0gT2RvbWV0ZXIgaW4ga21cbiAgICAgKiBAcmV0dXJuIHtPblZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldE9kb21ldGVyIChvZG9tZXRlcikge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblZlaGljbGVEYXRhLktFWV9PRE9NRVRFUiwgb2RvbWV0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0T2RvbWV0ZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoT25WZWhpY2xlRGF0YS5LRVlfT0RPTUVURVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QmVsdFN0YXR1c30gc3RhdHVzIC0gVGhlIHN0YXR1cyBvZiB0aGUgc2VhdCBiZWx0c1xuICAgICAqIEByZXR1cm4ge09uVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0QmVsdFN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEJlbHRTdGF0dXMsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uVmVoaWNsZURhdGEuS0VZX0JFTFRfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCZWx0U3RhdHVzfVxuICAgICAqL1xuICAgIGdldEJlbHRTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoQmVsdFN0YXR1cywgT25WZWhpY2xlRGF0YS5LRVlfQkVMVF9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9keUluZm9ybWF0aW9ufSBpbmZvcm1hdGlvbiAtIFRoZSBib2R5IGluZm9ybWF0aW9uIGluY2x1ZGluZyBwb3dlciBtb2Rlc1xuICAgICAqIEByZXR1cm4ge09uVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0Qm9keUluZm9ybWF0aW9uIChpbmZvcm1hdGlvbikge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShCb2R5SW5mb3JtYXRpb24sIGluZm9ybWF0aW9uKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25WZWhpY2xlRGF0YS5LRVlfQk9EWV9JTkZPUk1BVElPTiwgaW5mb3JtYXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb2R5SW5mb3JtYXRpb259XG4gICAgICovXG4gICAgZ2V0Qm9keUluZm9ybWF0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEJvZHlJbmZvcm1hdGlvbiwgT25WZWhpY2xlRGF0YS5LRVlfQk9EWV9JTkZPUk1BVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtEZXZpY2VTdGF0dXN9IHN0YXR1cyAtIFRoZSBkZXZpY2Ugc3RhdHVzIGluY2x1ZGluZyBzaWduYWwgYW5kIGJhdHRlcnkgc3RyZW5ndGhcbiAgICAgKiBAcmV0dXJuIHtPblZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldERldmljZVN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKERldmljZVN0YXR1cywgc3RhdHVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25WZWhpY2xlRGF0YS5LRVlfREVWSUNFX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7RGV2aWNlU3RhdHVzfVxuICAgICAqL1xuICAgIGdldERldmljZVN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChEZXZpY2VTdGF0dXMsIE9uVmVoaWNsZURhdGEuS0VZX0RFVklDRV9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmVoaWNsZURhdGFFdmVudFN0YXR1c30gYnJha2luZyAtIFRoZSBzdGF0dXMgb2YgdGhlIGJyYWtlIHBlZGFsXG4gICAgICogQHJldHVybiB7T25WZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXREcml2ZXJCcmFraW5nIChicmFraW5nKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFZlaGljbGVEYXRhRXZlbnRTdGF0dXMsIGJyYWtpbmcpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblZlaGljbGVEYXRhLktFWV9EUklWRVJfQlJBS0lORywgYnJha2luZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZlaGljbGVEYXRhRXZlbnRTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0RHJpdmVyQnJha2luZyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChWZWhpY2xlRGF0YUV2ZW50U3RhdHVzLCBPblZlaGljbGVEYXRhLktFWV9EUklWRVJfQlJBS0lORyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtXaXBlclN0YXR1c30gc3RhdHVzIC0gVGhlIHN0YXR1cyBvZiB0aGUgd2lwZXJzXG4gICAgICogQHJldHVybiB7T25WZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRXaXBlclN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFdpcGVyU3RhdHVzLCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblZlaGljbGVEYXRhLktFWV9XSVBFUl9TVEFUVVMsIHN0YXR1cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1dpcGVyU3RhdHVzfVxuICAgICAqL1xuICAgIGdldFdpcGVyU3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFdpcGVyU3RhdHVzLCBPblZlaGljbGVEYXRhLktFWV9XSVBFUl9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SGVhZExhbXBTdGF0dXN9IHN0YXR1cyAtIFN0YXR1cyBvZiB0aGUgaGVhZCBsYW1wc1xuICAgICAqIEByZXR1cm4ge09uVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0SGVhZExhbXBTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShIZWFkTGFtcFN0YXR1cywgc3RhdHVzKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25WZWhpY2xlRGF0YS5LRVlfSEVBRF9MQU1QX1NUQVRVUywgc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SGVhZExhbXBTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0SGVhZExhbXBTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSGVhZExhbXBTdGF0dXMsIE9uVmVoaWNsZURhdGEuS0VZX0hFQURfTEFNUF9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB0b3JxdWUgLSBUb3JxdWUgdmFsdWUgZm9yIGVuZ2luZSAoaW4gTm0pIG9uIG5vbi1kaWVzZWwgdmFyaWFudHNcbiAgICAgKiBAcmV0dXJuIHtPblZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEVuZ2luZVRvcnF1ZSAodG9ycXVlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uVmVoaWNsZURhdGEuS0VZX0VOR0lORV9UT1JRVUUsIHRvcnF1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRFbmdpbmVUb3JxdWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoT25WZWhpY2xlRGF0YS5LRVlfRU5HSU5FX1RPUlFVRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uIC0gQWNjZWxlcmF0b3IgcGVkYWwgcG9zaXRpb24gKHBlcmNlbnRhZ2UgZGVwcmVzc2VkKVxuICAgICAqIEByZXR1cm4ge09uVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0QWNjUGVkYWxQb3NpdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25WZWhpY2xlRGF0YS5LRVlfQUNDX1BFREFMX1BPU0lUSU9OLCBwb3NpdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRBY2NQZWRhbFBvc2l0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE9uVmVoaWNsZURhdGEuS0VZX0FDQ19QRURBTF9QT1NJVElPTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGFuZ2xlIC0gQ3VycmVudCBhbmdsZSBvZiB0aGUgc3RlZXJpbmcgd2hlZWwgKGluIGRlZylcbiAgICAgKiBAcmV0dXJuIHtPblZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldFN0ZWVyaW5nV2hlZWxBbmdsZSAoYW5nbGUpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25WZWhpY2xlRGF0YS5LRVlfU1RFRVJJTkdfV0hFRUxfQU5HTEUsIGFuZ2xlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFN0ZWVyaW5nV2hlZWxBbmdsZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihPblZlaGljbGVEYXRhLktFWV9TVEVFUklOR19XSEVFTF9BTkdMRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxpZmUgLSBUaGUgZXN0aW1hdGVkIHBlcmNlbnRhZ2Ugb2YgcmVtYWluaW5nIG9pbCBsaWZlIG9mIHRoZSBlbmdpbmUuXG4gICAgICogQHJldHVybiB7T25WZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRFbmdpbmVPaWxMaWZlIChsaWZlKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uVmVoaWNsZURhdGEuS0VZX0VOR0lORV9PSUxfTElGRSwgbGlmZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRFbmdpbmVPaWxMaWZlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE9uVmVoaWNsZURhdGEuS0VZX0VOR0lORV9PSUxfTElGRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtFbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzfSBzdGF0dXMgLSBUaGUgc3RhdHVzIG9mIHRoZSBwYXJrIGJyYWtlIGFzIHByb3ZpZGVkIGJ5IEVsZWN0cmljIFBhcmsgQnJha2UgKEVQQilcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbS5cbiAgICAgKiBAcmV0dXJuIHtPblZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldEVsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMgKHN0YXR1cykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShFbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzLCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblZlaGljbGVEYXRhLktFWV9FTEVDVFJPTklDX1BBUktfQlJBS0VfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtFbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzfVxuICAgICAqL1xuICAgIGdldEVsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoRWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cywgT25WZWhpY2xlRGF0YS5LRVlfRUxFQ1RST05JQ19QQVJLX0JSQUtFX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGlkIC0gUGFyYW1ldGVyIHVzZWQgYnkgY2xvdWQgYXBwcyB0byBpZGVudGlmeSBhIGhlYWQgdW5pdFxuICAgICAqIEByZXR1cm4ge09uVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0Q2xvdWRBcHBWZWhpY2xlSUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uVmVoaWNsZURhdGEuS0VZX0NMT1VEX0FQUF9WRUhJQ0xFX0lELCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRDbG91ZEFwcFZlaGljbGVJRCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihPblZlaGljbGVEYXRhLktFWV9DTE9VRF9BUFBfVkVISUNMRV9JRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtFQ2FsbEluZm99IGluZm8gLSBFbWVyZ2VuY3kgQ2FsbCBub3RpZmljYXRpb24gYW5kIGNvbmZpcm1hdGlvbiBkYXRhXG4gICAgICogQHJldHVybiB7T25WZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRFQ2FsbEluZm8gKGluZm8pIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoRUNhbGxJbmZvLCBpbmZvKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25WZWhpY2xlRGF0YS5LRVlfRV9DQUxMX0lORk8sIGluZm8pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtFQ2FsbEluZm99XG4gICAgICovXG4gICAgZ2V0RUNhbGxJbmZvICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEVDYWxsSW5mbywgT25WZWhpY2xlRGF0YS5LRVlfRV9DQUxMX0lORk8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QWlyYmFnU3RhdHVzfSBzdGF0dXMgLSBUaGUgc3RhdHVzIG9mIHRoZSBhaXIgYmFnc1xuICAgICAqIEByZXR1cm4ge09uVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0QWlyYmFnU3RhdHVzIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQWlyYmFnU3RhdHVzLCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblZlaGljbGVEYXRhLktFWV9BSVJCQUdfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtBaXJiYWdTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0QWlyYmFnU3RhdHVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEFpcmJhZ1N0YXR1cywgT25WZWhpY2xlRGF0YS5LRVlfQUlSQkFHX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtFbWVyZ2VuY3lFdmVudH0gZXZlbnQgLSBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFuIGVtZXJnZW5jeSBldmVudCAoYW5kIGlmIGl0IG9jY3VycmVkKVxuICAgICAqIEByZXR1cm4ge09uVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0RW1lcmdlbmN5RXZlbnQgKGV2ZW50KSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEVtZXJnZW5jeUV2ZW50LCBldmVudCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uVmVoaWNsZURhdGEuS0VZX0VNRVJHRU5DWV9FVkVOVCwgZXZlbnQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtFbWVyZ2VuY3lFdmVudH1cbiAgICAgKi9cbiAgICBnZXRFbWVyZ2VuY3lFdmVudCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChFbWVyZ2VuY3lFdmVudCwgT25WZWhpY2xlRGF0YS5LRVlfRU1FUkdFTkNZX0VWRU5UKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0NsdXN0ZXJNb2RlU3RhdHVzfSBzdGF0dXMgLSBUaGUgc3RhdHVzIG1vZGVzIG9mIHRoZSBjbHVzdGVyXG4gICAgICogQHJldHVybiB7T25WZWhpY2xlRGF0YX1cbiAgICAgKi9cbiAgICBzZXRDbHVzdGVyTW9kZVN0YXR1cyAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKENsdXN0ZXJNb2RlU3RhdHVzLCBzdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblZlaGljbGVEYXRhLktFWV9DTFVTVEVSX01PREVfU1RBVFVTLCBzdGF0dXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtDbHVzdGVyTW9kZVN0YXR1c31cbiAgICAgKi9cbiAgICBnZXRDbHVzdGVyTW9kZVN0YXR1cyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChDbHVzdGVyTW9kZVN0YXR1cywgT25WZWhpY2xlRGF0YS5LRVlfQ0xVU1RFUl9NT0RFX1NUQVRVUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtNeUtleX0ga2V5IC0gSW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgTXlLZXkgZmVhdHVyZVxuICAgICAqIEByZXR1cm4ge09uVmVoaWNsZURhdGF9XG4gICAgICovXG4gICAgc2V0TXlLZXkgKGtleSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShNeUtleSwga2V5KTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25WZWhpY2xlRGF0YS5LRVlfTVlfS0VZLCBrZXkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNeUtleX1cbiAgICAgKi9cbiAgICBnZXRNeUtleSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChNeUtleSwgT25WZWhpY2xlRGF0YS5LRVlfTVlfS0VZKTtcbiAgICB9XG59XG5cbk9uVmVoaWNsZURhdGEuS0VZX0dQUyA9ICdncHMnO1xuT25WZWhpY2xlRGF0YS5LRVlfU1BFRUQgPSAnc3BlZWQnO1xuT25WZWhpY2xlRGF0YS5LRVlfUlBNID0gJ3JwbSc7XG5PblZlaGljbGVEYXRhLktFWV9GVUVMX0xFVkVMID0gJ2Z1ZWxMZXZlbCc7XG5PblZlaGljbGVEYXRhLktFWV9GVUVMX0xFVkVMX1NUQVRFID0gJ2Z1ZWxMZXZlbF9TdGF0ZSc7XG5PblZlaGljbGVEYXRhLktFWV9JTlNUQU5UX0ZVRUxfQ09OU1VNUFRJT04gPSAnaW5zdGFudEZ1ZWxDb25zdW1wdGlvbic7XG5PblZlaGljbGVEYXRhLktFWV9GVUVMX1JBTkdFID0gJ2Z1ZWxSYW5nZSc7XG5PblZlaGljbGVEYXRhLktFWV9FWFRFUk5BTF9URU1QRVJBVFVSRSA9ICdleHRlcm5hbFRlbXBlcmF0dXJlJztcbk9uVmVoaWNsZURhdGEuS0VZX1RVUk5fU0lHTkFMID0gJ3R1cm5TaWduYWwnO1xuT25WZWhpY2xlRGF0YS5LRVlfVklOID0gJ3Zpbic7XG5PblZlaGljbGVEYXRhLktFWV9QUk5ETCA9ICdwcm5kbCc7XG5PblZlaGljbGVEYXRhLktFWV9USVJFX1BSRVNTVVJFID0gJ3RpcmVQcmVzc3VyZSc7XG5PblZlaGljbGVEYXRhLktFWV9PRE9NRVRFUiA9ICdvZG9tZXRlcic7XG5PblZlaGljbGVEYXRhLktFWV9CRUxUX1NUQVRVUyA9ICdiZWx0U3RhdHVzJztcbk9uVmVoaWNsZURhdGEuS0VZX0JPRFlfSU5GT1JNQVRJT04gPSAnYm9keUluZm9ybWF0aW9uJztcbk9uVmVoaWNsZURhdGEuS0VZX0RFVklDRV9TVEFUVVMgPSAnZGV2aWNlU3RhdHVzJztcbk9uVmVoaWNsZURhdGEuS0VZX0RSSVZFUl9CUkFLSU5HID0gJ2RyaXZlckJyYWtpbmcnO1xuT25WZWhpY2xlRGF0YS5LRVlfV0lQRVJfU1RBVFVTID0gJ3dpcGVyU3RhdHVzJztcbk9uVmVoaWNsZURhdGEuS0VZX0hFQURfTEFNUF9TVEFUVVMgPSAnaGVhZExhbXBTdGF0dXMnO1xuT25WZWhpY2xlRGF0YS5LRVlfRU5HSU5FX1RPUlFVRSA9ICdlbmdpbmVUb3JxdWUnO1xuT25WZWhpY2xlRGF0YS5LRVlfQUNDX1BFREFMX1BPU0lUSU9OID0gJ2FjY1BlZGFsUG9zaXRpb24nO1xuT25WZWhpY2xlRGF0YS5LRVlfU1RFRVJJTkdfV0hFRUxfQU5HTEUgPSAnc3RlZXJpbmdXaGVlbEFuZ2xlJztcbk9uVmVoaWNsZURhdGEuS0VZX0VOR0lORV9PSUxfTElGRSA9ICdlbmdpbmVPaWxMaWZlJztcbk9uVmVoaWNsZURhdGEuS0VZX0VMRUNUUk9OSUNfUEFSS19CUkFLRV9TVEFUVVMgPSAnZWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cyc7XG5PblZlaGljbGVEYXRhLktFWV9DTE9VRF9BUFBfVkVISUNMRV9JRCA9ICdjbG91ZEFwcFZlaGljbGVJRCc7XG5PblZlaGljbGVEYXRhLktFWV9FX0NBTExfSU5GTyA9ICdlQ2FsbEluZm8nO1xuT25WZWhpY2xlRGF0YS5LRVlfQUlSQkFHX1NUQVRVUyA9ICdhaXJiYWdTdGF0dXMnO1xuT25WZWhpY2xlRGF0YS5LRVlfRU1FUkdFTkNZX0VWRU5UID0gJ2VtZXJnZW5jeUV2ZW50Jztcbk9uVmVoaWNsZURhdGEuS0VZX0NMVVNURVJfTU9ERV9TVEFUVVMgPSAnY2x1c3Rlck1vZGVTdGF0dXMnO1xuT25WZWhpY2xlRGF0YS5LRVlfTVlfS0VZID0gJ215S2V5JztcblxuZXhwb3J0IHsgT25WZWhpY2xlRGF0YSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFRyaWdnZXJTb3VyY2UgfSBmcm9tICcuLi9lbnVtcy9UcmlnZ2VyU291cmNlLmpzJztcbmltcG9ydCB7IFJwY05vdGlmaWNhdGlvbiB9IGZyb20gJy4uL1JwY05vdGlmaWNhdGlvbi5qcyc7XG5cbmNsYXNzIE9uQ29tbWFuZCBleHRlbmRzIFJwY05vdGlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5PbkNvbW1hbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpZCAtIENvbW1hbmQgSUQsIHdoaWNoIGlzIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBtZW51IGVudHJ5XG4gICAgICogQHJldHVybiB7T25Db21tYW5kfVxuICAgICAqL1xuICAgIHNldENtZElEIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPbkNvbW1hbmQuS0VZX0NNRF9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0Q21kSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoT25Db21tYW5kLktFWV9DTURfSUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VHJpZ2dlclNvdXJjZX0gc291cmNlIC0gU2VlIFRyaWdnZXJTb3VyY2VcbiAgICAgKiBAcmV0dXJuIHtPbkNvbW1hbmR9XG4gICAgICovXG4gICAgc2V0VHJpZ2dlclNvdXJjZSAoc291cmNlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRyaWdnZXJTb3VyY2UsIHNvdXJjZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uQ29tbWFuZC5LRVlfVFJJR0dFUl9TT1VSQ0UsIHNvdXJjZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RyaWdnZXJTb3VyY2V9XG4gICAgICovXG4gICAgZ2V0VHJpZ2dlclNvdXJjZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUcmlnZ2VyU291cmNlLCBPbkNvbW1hbmQuS0VZX1RSSUdHRVJfU09VUkNFKTtcbiAgICB9XG59XG5cbk9uQ29tbWFuZC5LRVlfQ01EX0lEID0gJ2NtZElEJztcbk9uQ29tbWFuZC5LRVlfVFJJR0dFUl9TT1VSQ0UgPSAndHJpZ2dlclNvdXJjZSc7XG5cbmV4cG9ydCB7IE9uQ29tbWFuZCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIHRoYXQgZGVzY3JpYmVzIHBvc3NpYmxlIHN0YXRlcyBvZiB0dXJuLWJ5LXR1cm4gY2xpZW50IG9yIFNtYXJ0RGV2aWNlTGluayBhcHAuXG4gKiBAdHlwZWRlZiB7RW51bX0gVEJUU3RhdGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFRCVFN0YXRlIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJPVVRFX1VQREFURV9SRVFVRVNUICgpIHtcbiAgICAgICAgcmV0dXJuIFRCVFN0YXRlLl9NQVAuUk9VVEVfVVBEQVRFX1JFUVVFU1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUk9VVEVfQUNDRVBURUQgKCkge1xuICAgICAgICByZXR1cm4gVEJUU3RhdGUuX01BUC5ST1VURV9BQ0NFUFRFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBST1VURV9SRUZVU0VEICgpIHtcbiAgICAgICAgcmV0dXJuIFRCVFN0YXRlLl9NQVAuUk9VVEVfUkVGVVNFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBST1VURV9DQU5DRUxMRUQgKCkge1xuICAgICAgICByZXR1cm4gVEJUU3RhdGUuX01BUC5ST1VURV9DQU5DRUxMRUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRVRBX1JFUVVFU1QgKCkge1xuICAgICAgICByZXR1cm4gVEJUU3RhdGUuX01BUC5FVEFfUkVRVUVTVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBORVhUX1RVUk5fUkVRVUVTVCAoKSB7XG4gICAgICAgIHJldHVybiBUQlRTdGF0ZS5fTUFQLk5FWFRfVFVSTl9SRVFVRVNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJPVVRFX1NUQVRVU19SRVFVRVNUICgpIHtcbiAgICAgICAgcmV0dXJuIFRCVFN0YXRlLl9NQVAuUk9VVEVfU1RBVFVTX1JFUVVFU1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUk9VVEVfU1VNTUFSWV9SRVFVRVNUICgpIHtcbiAgICAgICAgcmV0dXJuIFRCVFN0YXRlLl9NQVAuUk9VVEVfU1VNTUFSWV9SRVFVRVNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRSSVBfU1RBVFVTX1JFUVVFU1QgKCkge1xuICAgICAgICByZXR1cm4gVEJUU3RhdGUuX01BUC5UUklQX1NUQVRVU19SRVFVRVNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFJPVVRFX1VQREFURV9SRVFVRVNUX1RJTUVPVVQgKCkge1xuICAgICAgICByZXR1cm4gVEJUU3RhdGUuX01BUC5ST1VURV9VUERBVEVfUkVRVUVTVF9USU1FT1VUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFRCVFN0YXRlLl92YWx1ZUZvcktleShrZXksIFRCVFN0YXRlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gVEJUU3RhdGUuX2tleUZvclZhbHVlKHZhbHVlLCBUQlRTdGF0ZS5fTUFQKTtcbiAgICB9XG59XG5cblRCVFN0YXRlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnUk9VVEVfVVBEQVRFX1JFUVVFU1QnOiAnUk9VVEVfVVBEQVRFX1JFUVVFU1QnLFxuICAgICdST1VURV9BQ0NFUFRFRCc6ICdST1VURV9BQ0NFUFRFRCcsXG4gICAgJ1JPVVRFX1JFRlVTRUQnOiAnUk9VVEVfUkVGVVNFRCcsXG4gICAgJ1JPVVRFX0NBTkNFTExFRCc6ICdST1VURV9DQU5DRUxMRUQnLFxuICAgICdFVEFfUkVRVUVTVCc6ICdFVEFfUkVRVUVTVCcsXG4gICAgJ05FWFRfVFVSTl9SRVFVRVNUJzogJ05FWFRfVFVSTl9SRVFVRVNUJyxcbiAgICAnUk9VVEVfU1RBVFVTX1JFUVVFU1QnOiAnUk9VVEVfU1RBVFVTX1JFUVVFU1QnLFxuICAgICdST1VURV9TVU1NQVJZX1JFUVVFU1QnOiAnUk9VVEVfU1VNTUFSWV9SRVFVRVNUJyxcbiAgICAnVFJJUF9TVEFUVVNfUkVRVUVTVCc6ICdUUklQX1NUQVRVU19SRVFVRVNUJyxcbiAgICAnUk9VVEVfVVBEQVRFX1JFUVVFU1RfVElNRU9VVCc6ICdST1VURV9VUERBVEVfUkVRVUVTVF9USU1FT1VUJyxcbn0pO1xuXG5leHBvcnQgeyBUQlRTdGF0ZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFRCVFN0YXRlIH0gZnJvbSAnLi4vZW51bXMvVEJUU3RhdGUuanMnO1xuaW1wb3J0IHsgUnBjTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vUnBjTm90aWZpY2F0aW9uLmpzJztcblxuLyoqXG4gKiBQcm92aWRlcyBhcHBsaWNhdGlvbnMgd2l0aCBub3RpZmljYXRpb25zIHNwZWNpZmljIHRvIHRoZSBjdXJyZW50IFRCVCBjbGllbnQgc3RhdHVzIG9uIHRoZSBtb2R1bGVcbiAqL1xuY2xhc3MgT25UQlRDbGllbnRTdGF0ZSBleHRlbmRzIFJwY05vdGlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5PblRCVENsaWVudFN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RCVFN0YXRlfSBzdGF0ZSAtIEN1cnJlbnQgU3RhdGUgb2YgVEJUIGNsaWVudFxuICAgICAqIEByZXR1cm4ge09uVEJUQ2xpZW50U3RhdGV9XG4gICAgICovXG4gICAgc2V0U3RhdGUgKHN0YXRlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFRCVFN0YXRlLCBzdGF0ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uVEJUQ2xpZW50U3RhdGUuS0VZX1NUQVRFLCBzdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RCVFN0YXRlfVxuICAgICAqL1xuICAgIGdldFN0YXRlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRCVFN0YXRlLCBPblRCVENsaWVudFN0YXRlLktFWV9TVEFURSk7XG4gICAgfVxufVxuXG5PblRCVENsaWVudFN0YXRlLktFWV9TVEFURSA9ICdzdGF0ZSc7XG5cbmV4cG9ydCB7IE9uVEJUQ2xpZW50U3RhdGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBFbnVtZXJhdGlvbiB0aGF0IGRlc2NyaWJlcyBwb3NzaWJsZSBzdGF0ZXMgb2YgZHJpdmVyIGRpc3RyYWN0aW9uLlxuICogQHR5cGVkZWYge0VudW19IERyaXZlckRpc3RyYWN0aW9uU3RhdGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIERyaXZlckRpc3RyYWN0aW9uU3RhdGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRERfT04gKCkge1xuICAgICAgICByZXR1cm4gRHJpdmVyRGlzdHJhY3Rpb25TdGF0ZS5fTUFQLkREX09OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEREX09GRiAoKSB7XG4gICAgICAgIHJldHVybiBEcml2ZXJEaXN0cmFjdGlvblN0YXRlLl9NQVAuRERfT0ZGO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIERyaXZlckRpc3RyYWN0aW9uU3RhdGUuX3ZhbHVlRm9yS2V5KGtleSwgRHJpdmVyRGlzdHJhY3Rpb25TdGF0ZS5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIERyaXZlckRpc3RyYWN0aW9uU3RhdGUuX2tleUZvclZhbHVlKHZhbHVlLCBEcml2ZXJEaXN0cmFjdGlvblN0YXRlLl9NQVApO1xuICAgIH1cbn1cblxuRHJpdmVyRGlzdHJhY3Rpb25TdGF0ZS5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0REX09OJzogJ0REX09OJyxcbiAgICAnRERfT0ZGJzogJ0REX09GRicsXG59KTtcblxuZXhwb3J0IHsgRHJpdmVyRGlzdHJhY3Rpb25TdGF0ZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IERyaXZlckRpc3RyYWN0aW9uU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9Ecml2ZXJEaXN0cmFjdGlvblN0YXRlLmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY05vdGlmaWNhdGlvbiB9IGZyb20gJy4uL1JwY05vdGlmaWNhdGlvbi5qcyc7XG5cbi8qKlxuICogUHJvdmlkZXMgZHJpdmVyIGRpc3RyYWN0aW9uIHN0YXRlIHRvIG1vYmlsZSBhcHBsaWNhdGlvbnNcbiAqL1xuY2xhc3MgT25Ecml2ZXJEaXN0cmFjdGlvbiBleHRlbmRzIFJwY05vdGlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5PbkRyaXZlckRpc3RyYWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0RyaXZlckRpc3RyYWN0aW9uU3RhdGV9IHN0YXRlIC0gQ3VycmVudCBTdGF0ZSBvZiBEcml2ZXIgRGlzdHJhY3Rpb25cbiAgICAgKiBAcmV0dXJuIHtPbkRyaXZlckRpc3RyYWN0aW9ufVxuICAgICAqL1xuICAgIHNldFN0YXRlIChzdGF0ZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShEcml2ZXJEaXN0cmFjdGlvblN0YXRlLCBzdGF0ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uRHJpdmVyRGlzdHJhY3Rpb24uS0VZX1NUQVRFLCBzdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0RyaXZlckRpc3RyYWN0aW9uU3RhdGV9XG4gICAgICovXG4gICAgZ2V0U3RhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoRHJpdmVyRGlzdHJhY3Rpb25TdGF0ZSwgT25Ecml2ZXJEaXN0cmFjdGlvbi5LRVlfU1RBVEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIElmIGVuYWJsZWQsIHRoZSBsb2NrIHNjcmVlbiB3aWxsIGJlIGFibGUgdG8gYmUgZGlzbWlzc2VkIHdoaWxlIGNvbm5lY3RlZCB0byBTREwsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dpbmcgdXNlcnMgdGhlIGFiaWxpdHkgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgYXBwLiBEaXNtaXNzYWxzIHNob3VsZCBpbmNsdWRlIGFcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nIHRvIHRoZSB1c2VyIGFuZCBlbnN1cmUgdGhhdCB0aGV5IGFyZSBub3QgdGhlIGRyaXZlci5cbiAgICAgKiBAcmV0dXJuIHtPbkRyaXZlckRpc3RyYWN0aW9ufVxuICAgICAqL1xuICAgIHNldExvY2tTY3JlZW5EaXNtaXNzYWxFbmFibGVkIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uRHJpdmVyRGlzdHJhY3Rpb24uS0VZX0xPQ0tfU0NSRUVOX0RJU01JU1NBTF9FTkFCTEVELCBlbmFibGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRMb2NrU2NyZWVuRGlzbWlzc2FsRW5hYmxlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihPbkRyaXZlckRpc3RyYWN0aW9uLktFWV9MT0NLX1NDUkVFTl9ESVNNSVNTQUxfRU5BQkxFRCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHdhcm5pbmcgLSBXYXJuaW5nIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIG9uIHRoZSBsb2NrIHNjcmVlbiB3aGVuIGRpc21pc3NhbCBpcyBlbmFibGVkLiBUaGlzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nIHNob3VsZCBiZSB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSB1c2VyIGlzIG5vdCB0aGUgZHJpdmVyIG9mIHRoZSB2ZWhpY2xlLCBleC5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTd2lwZSBkb3duIHRvIGRpc21pc3MsIGFja25vd2xlZGdpbmcgdGhhdCB5b3UgYXJlIG5vdCB0aGUgZHJpdmVyLmAuIFRoaXMgcGFyYW1ldGVyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHByZXNlbnQgaWYgXCJsb2NrU2NyZWVuRGlzbWlzc2FsRW5hYmxlZFwiIGlzIHNldCB0byB0cnVlLlxuICAgICAqIEByZXR1cm4ge09uRHJpdmVyRGlzdHJhY3Rpb259XG4gICAgICovXG4gICAgc2V0TG9ja1NjcmVlbkRpc21pc3NhbFdhcm5pbmcgKHdhcm5pbmcpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25Ecml2ZXJEaXN0cmFjdGlvbi5LRVlfTE9DS19TQ1JFRU5fRElTTUlTU0FMX1dBUk5JTkcsIHdhcm5pbmcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0TG9ja1NjcmVlbkRpc21pc3NhbFdhcm5pbmcgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoT25Ecml2ZXJEaXN0cmFjdGlvbi5LRVlfTE9DS19TQ1JFRU5fRElTTUlTU0FMX1dBUk5JTkcpO1xuICAgIH1cbn1cblxuT25Ecml2ZXJEaXN0cmFjdGlvbi5LRVlfU1RBVEUgPSAnc3RhdGUnO1xuT25Ecml2ZXJEaXN0cmFjdGlvbi5LRVlfTE9DS19TQ1JFRU5fRElTTUlTU0FMX0VOQUJMRUQgPSAnbG9ja1NjcmVlbkRpc21pc3NhbEVuYWJsZWQnO1xuT25Ecml2ZXJEaXN0cmFjdGlvbi5LRVlfTE9DS19TQ1JFRU5fRElTTUlTU0FMX1dBUk5JTkcgPSAnbG9ja1NjcmVlbkRpc21pc3NhbFdhcm5pbmcnO1xuXG5leHBvcnQgeyBPbkRyaXZlckRpc3RyYWN0aW9uIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgSE1JTGV2ZWwgfSBmcm9tICcuLi9lbnVtcy9ITUlMZXZlbC5qcyc7XG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG5jbGFzcyBITUlQZXJtaXNzaW9ucyBleHRlbmRzIFJwY1N0cnVjdCB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtITUlMZXZlbFtdfSBhbGxvd2VkIC0gQSBzZXQgb2YgYWxsIEhNSSBsZXZlbHMgdGhhdCBhcmUgcGVybWl0dGVkIGZvciB0aGlzIGdpdmVuIFJQQy5cbiAgICAgKiBAcmV0dXJuIHtITUlQZXJtaXNzaW9uc31cbiAgICAgKi9cbiAgICBzZXRBbGxvd2VkIChhbGxvd2VkKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEhNSUxldmVsLCBhbGxvd2VkLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoSE1JUGVybWlzc2lvbnMuS0VZX0FMTE9XRUQsIGFsbG93ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtITUlMZXZlbFtdfVxuICAgICAqL1xuICAgIGdldEFsbG93ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSE1JTGV2ZWwsIEhNSVBlcm1pc3Npb25zLktFWV9BTExPV0VEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0hNSUxldmVsW119IGRpc2FsbG93ZWQgLSBBIHNldCBvZiBhbGwgSE1JIGxldmVscyB0aGF0IGFyZSBwcm9oaWJpdGVkIGZvciB0aGlzIGdpdmVuIFJQQy5cbiAgICAgKiBAcmV0dXJuIHtITUlQZXJtaXNzaW9uc31cbiAgICAgKi9cbiAgICBzZXRVc2VyRGlzYWxsb3dlZCAoZGlzYWxsb3dlZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShITUlMZXZlbCwgZGlzYWxsb3dlZCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKEhNSVBlcm1pc3Npb25zLktFWV9VU0VSX0RJU0FMTE9XRUQsIGRpc2FsbG93ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtITUlMZXZlbFtdfVxuICAgICAqL1xuICAgIGdldFVzZXJEaXNhbGxvd2VkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEhNSUxldmVsLCBITUlQZXJtaXNzaW9ucy5LRVlfVVNFUl9ESVNBTExPV0VEKTtcbiAgICB9XG59XG5cbkhNSVBlcm1pc3Npb25zLktFWV9BTExPV0VEID0gJ2FsbG93ZWQnO1xuSE1JUGVybWlzc2lvbnMuS0VZX1VTRVJfRElTQUxMT1dFRCA9ICd1c2VyRGlzYWxsb3dlZCc7XG5cbmV4cG9ydCB7IEhNSVBlcm1pc3Npb25zIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgUnBjU3RydWN0IH0gZnJvbSAnLi4vUnBjU3RydWN0LmpzJztcblxuY2xhc3MgUGFyYW1ldGVyUGVybWlzc2lvbnMgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nW119IGFsbG93ZWQgLSBBIHNldCBvZiBhbGwgcGFyYW1ldGVycyB0aGF0IGFyZSBwZXJtaXR0ZWQgZm9yIHRoaXMgZ2l2ZW4gUlBDLlxuICAgICAqIEByZXR1cm4ge1BhcmFtZXRlclBlcm1pc3Npb25zfVxuICAgICAqL1xuICAgIHNldEFsbG93ZWQgKGFsbG93ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUGFyYW1ldGVyUGVybWlzc2lvbnMuS0VZX0FMTE9XRUQsIGFsbG93ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmdbXX1cbiAgICAgKi9cbiAgICBnZXRBbGxvd2VkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFBhcmFtZXRlclBlcm1pc3Npb25zLktFWV9BTExPV0VEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ1tdfSBkaXNhbGxvd2VkIC0gQSBzZXQgb2YgYWxsIHBhcmFtZXRlcnMgdGhhdCBhcmUgcHJvaGliaXRlZCBmb3IgdGhpcyBnaXZlbiBSUEMuXG4gICAgICogQHJldHVybiB7UGFyYW1ldGVyUGVybWlzc2lvbnN9XG4gICAgICovXG4gICAgc2V0VXNlckRpc2FsbG93ZWQgKGRpc2FsbG93ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoUGFyYW1ldGVyUGVybWlzc2lvbnMuS0VZX1VTRVJfRElTQUxMT1dFRCwgZGlzYWxsb3dlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ1tdfVxuICAgICAqL1xuICAgIGdldFVzZXJEaXNhbGxvd2VkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFBhcmFtZXRlclBlcm1pc3Npb25zLktFWV9VU0VSX0RJU0FMTE9XRUQpO1xuICAgIH1cbn1cblxuUGFyYW1ldGVyUGVybWlzc2lvbnMuS0VZX0FMTE9XRUQgPSAnYWxsb3dlZCc7XG5QYXJhbWV0ZXJQZXJtaXNzaW9ucy5LRVlfVVNFUl9ESVNBTExPV0VEID0gJ3VzZXJEaXNhbGxvd2VkJztcblxuZXhwb3J0IHsgUGFyYW1ldGVyUGVybWlzc2lvbnMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgSE1JUGVybWlzc2lvbnMgfSBmcm9tICcuL0hNSVBlcm1pc3Npb25zLmpzJztcbmltcG9ydCB7IFBhcmFtZXRlclBlcm1pc3Npb25zIH0gZnJvbSAnLi9QYXJhbWV0ZXJQZXJtaXNzaW9ucy5qcyc7XG5cbmNsYXNzIFBlcm1pc3Npb25JdGVtIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIE5hbWUgb2YgdGhlIGluZGl2aWR1YWwgUlBDIGluIHRoZSBwb2xpY3kgdGFibGUuXG4gICAgICogQHJldHVybiB7UGVybWlzc2lvbkl0ZW19XG4gICAgICovXG4gICAgc2V0UnBjTmFtZSAobmFtZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihQZXJtaXNzaW9uSXRlbS5LRVlfUlBDX05BTUUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0UnBjTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihQZXJtaXNzaW9uSXRlbS5LRVlfUlBDX05BTUUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SE1JUGVybWlzc2lvbnN9IHBlcm1pc3Npb25zXG4gICAgICogQHJldHVybiB7UGVybWlzc2lvbkl0ZW19XG4gICAgICovXG4gICAgc2V0SG1pUGVybWlzc2lvbnMgKHBlcm1pc3Npb25zKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKEhNSVBlcm1pc3Npb25zLCBwZXJtaXNzaW9ucyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFBlcm1pc3Npb25JdGVtLktFWV9ITUlfUEVSTUlTU0lPTlMsIHBlcm1pc3Npb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SE1JUGVybWlzc2lvbnN9XG4gICAgICovXG4gICAgZ2V0SG1pUGVybWlzc2lvbnMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoSE1JUGVybWlzc2lvbnMsIFBlcm1pc3Npb25JdGVtLktFWV9ITUlfUEVSTUlTU0lPTlMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7UGFyYW1ldGVyUGVybWlzc2lvbnN9IHBlcm1pc3Npb25zXG4gICAgICogQHJldHVybiB7UGVybWlzc2lvbkl0ZW19XG4gICAgICovXG4gICAgc2V0UGFyYW1ldGVyUGVybWlzc2lvbnMgKHBlcm1pc3Npb25zKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFBhcmFtZXRlclBlcm1pc3Npb25zLCBwZXJtaXNzaW9ucyk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFBlcm1pc3Npb25JdGVtLktFWV9QQVJBTUVURVJfUEVSTUlTU0lPTlMsIHBlcm1pc3Npb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7UGFyYW1ldGVyUGVybWlzc2lvbnN9XG4gICAgICovXG4gICAgZ2V0UGFyYW1ldGVyUGVybWlzc2lvbnMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoUGFyYW1ldGVyUGVybWlzc2lvbnMsIFBlcm1pc3Npb25JdGVtLktFWV9QQVJBTUVURVJfUEVSTUlTU0lPTlMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5jcnlwdGlvblxuICAgICAqIEByZXR1cm4ge1Blcm1pc3Npb25JdGVtfVxuICAgICAqL1xuICAgIHNldFJlcXVpcmVFbmNyeXB0aW9uIChlbmNyeXB0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFBlcm1pc3Npb25JdGVtLktFWV9SRVFVSVJFX0VOQ1JZUFRJT04sIGVuY3J5cHRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGdldFJlcXVpcmVFbmNyeXB0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFBlcm1pc3Npb25JdGVtLktFWV9SRVFVSVJFX0VOQ1JZUFRJT04pO1xuICAgIH1cbn1cblxuUGVybWlzc2lvbkl0ZW0uS0VZX1JQQ19OQU1FID0gJ3JwY05hbWUnO1xuUGVybWlzc2lvbkl0ZW0uS0VZX0hNSV9QRVJNSVNTSU9OUyA9ICdobWlQZXJtaXNzaW9ucyc7XG5QZXJtaXNzaW9uSXRlbS5LRVlfUEFSQU1FVEVSX1BFUk1JU1NJT05TID0gJ3BhcmFtZXRlclBlcm1pc3Npb25zJztcblBlcm1pc3Npb25JdGVtLktFWV9SRVFVSVJFX0VOQ1JZUFRJT04gPSAncmVxdWlyZUVuY3J5cHRpb24nO1xuXG5leHBvcnQgeyBQZXJtaXNzaW9uSXRlbSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFBlcm1pc3Npb25JdGVtIH0gZnJvbSAnLi4vc3RydWN0cy9QZXJtaXNzaW9uSXRlbS5qcyc7XG5pbXBvcnQgeyBScGNOb3RpZmljYXRpb24gfSBmcm9tICcuLi9ScGNOb3RpZmljYXRpb24uanMnO1xuXG4vKipcbiAqIFByb3ZpZGVzIHVwZGF0ZSB0byBhcHAgb2Ygd2hpY2ggcG9saWN5LXRhYmxlLWVuYWJsZWQgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGVcbiAqL1xuY2xhc3MgT25QZXJtaXNzaW9uc0NoYW5nZSBleHRlbmRzIFJwY05vdGlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5PblBlcm1pc3Npb25zQ2hhbmdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1Blcm1pc3Npb25JdGVtW119IGl0ZW0gLSBDaGFuZ2UgaW4gcGVybWlzc2lvbnMgZm9yIGEgZ2l2ZW4gc2V0IG9mIFJQQ3NcbiAgICAgKiBAcmV0dXJuIHtPblBlcm1pc3Npb25zQ2hhbmdlfVxuICAgICAqL1xuICAgIHNldFBlcm1pc3Npb25JdGVtIChpdGVtKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFBlcm1pc3Npb25JdGVtLCBpdGVtLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25QZXJtaXNzaW9uc0NoYW5nZS5LRVlfUEVSTUlTU0lPTl9JVEVNLCBpdGVtKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7UGVybWlzc2lvbkl0ZW1bXX1cbiAgICAgKi9cbiAgICBnZXRQZXJtaXNzaW9uSXRlbSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChQZXJtaXNzaW9uSXRlbSwgT25QZXJtaXNzaW9uc0NoYW5nZS5LRVlfUEVSTUlTU0lPTl9JVEVNKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuY3J5cHRpb25cbiAgICAgKiBAcmV0dXJuIHtPblBlcm1pc3Npb25zQ2hhbmdlfVxuICAgICAqL1xuICAgIHNldFJlcXVpcmVFbmNyeXB0aW9uIChlbmNyeXB0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uUGVybWlzc2lvbnNDaGFuZ2UuS0VZX1JFUVVJUkVfRU5DUllQVElPTiwgZW5jcnlwdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0UmVxdWlyZUVuY3J5cHRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoT25QZXJtaXNzaW9uc0NoYW5nZS5LRVlfUkVRVUlSRV9FTkNSWVBUSU9OKTtcbiAgICB9XG59XG5cbk9uUGVybWlzc2lvbnNDaGFuZ2UuS0VZX1BFUk1JU1NJT05fSVRFTSA9ICdwZXJtaXNzaW9uSXRlbSc7XG5PblBlcm1pc3Npb25zQ2hhbmdlLktFWV9SRVFVSVJFX0VOQ1JZUFRJT04gPSAncmVxdWlyZUVuY3J5cHRpb24nO1xuXG5leHBvcnQgeyBPblBlcm1pc3Npb25zQ2hhbmdlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgUnBjTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vUnBjTm90aWZpY2F0aW9uLmpzJztcblxuLyoqXG4gKiBCaW5hcnkgZGF0YSBpcyBpbiBiaW5hcnkgcGFydCBvZiBoeWJyaWQgbXNnXG4gKi9cbmNsYXNzIE9uQXVkaW9QYXNzVGhydSBleHRlbmRzIFJwY05vdGlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5PbkF1ZGlvUGFzc1RocnUpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgeyBPbkF1ZGlvUGFzc1RocnUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBMYW5ndWFnZSB9IGZyb20gJy4uL2VudW1zL0xhbmd1YWdlLmpzJztcbmltcG9ydCB7IFJwY05vdGlmaWNhdGlvbiB9IGZyb20gJy4uL1JwY05vdGlmaWNhdGlvbi5qcyc7XG5cbmNsYXNzIE9uTGFuZ3VhZ2VDaGFuZ2UgZXh0ZW5kcyBScGNOb3RpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuT25MYW5ndWFnZUNoYW5nZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBDdXJyZW50IFNETCB2b2ljZSBlbmdpbmUgKFZSK1RUUykgbGFuZ3VhZ2VcbiAgICAgKiBAcmV0dXJuIHtPbkxhbmd1YWdlQ2hhbmdlfVxuICAgICAqL1xuICAgIHNldExhbmd1YWdlIChsYW5ndWFnZSkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShMYW5ndWFnZSwgbGFuZ3VhZ2UpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPbkxhbmd1YWdlQ2hhbmdlLktFWV9MQU5HVUFHRSwgbGFuZ3VhZ2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtMYW5ndWFnZX1cbiAgICAgKi9cbiAgICBnZXRMYW5ndWFnZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChMYW5ndWFnZSwgT25MYW5ndWFnZUNoYW5nZS5LRVlfTEFOR1VBR0UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TGFuZ3VhZ2V9IGxhbmd1YWdlIC0gQ3VycmVudCBkaXNwbGF5IGxhbmd1YWdlXG4gICAgICogQHJldHVybiB7T25MYW5ndWFnZUNoYW5nZX1cbiAgICAgKi9cbiAgICBzZXRIbWlEaXNwbGF5TGFuZ3VhZ2UgKGxhbmd1YWdlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKExhbmd1YWdlLCBsYW5ndWFnZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uTGFuZ3VhZ2VDaGFuZ2UuS0VZX0hNSV9ESVNQTEFZX0xBTkdVQUdFLCBsYW5ndWFnZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0xhbmd1YWdlfVxuICAgICAqL1xuICAgIGdldEhtaURpc3BsYXlMYW5ndWFnZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChMYW5ndWFnZSwgT25MYW5ndWFnZUNoYW5nZS5LRVlfSE1JX0RJU1BMQVlfTEFOR1VBR0UpO1xuICAgIH1cbn1cblxuT25MYW5ndWFnZUNoYW5nZS5LRVlfTEFOR1VBR0UgPSAnbGFuZ3VhZ2UnO1xuT25MYW5ndWFnZUNoYW5nZS5LRVlfSE1JX0RJU1BMQVlfTEFOR1VBR0UgPSAnaG1pRGlzcGxheUxhbmd1YWdlJztcblxuZXhwb3J0IHsgT25MYW5ndWFnZUNoYW5nZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIGxpc3RpbmcgcG9zc2libGUga2V5Ym9hcmQgZXZlbnRzLlxuICogQHR5cGVkZWYge0VudW19IEtleWJvYXJkRXZlbnRcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIEtleWJvYXJkRXZlbnQgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgS0VZUFJFU1MgKCkge1xuICAgICAgICByZXR1cm4gS2V5Ym9hcmRFdmVudC5fTUFQLktFWVBSRVNTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEVOVFJZX1NVQk1JVFRFRCAoKSB7XG4gICAgICAgIHJldHVybiBLZXlib2FyZEV2ZW50Ll9NQVAuRU5UUllfU1VCTUlUVEVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEVOVFJZX1ZPSUNFICgpIHtcbiAgICAgICAgcmV0dXJuIEtleWJvYXJkRXZlbnQuX01BUC5FTlRSWV9WT0lDRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFTlRSWV9DQU5DRUxMRUQgKCkge1xuICAgICAgICByZXR1cm4gS2V5Ym9hcmRFdmVudC5fTUFQLkVOVFJZX0NBTkNFTExFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBFTlRSWV9BQk9SVEVEICgpIHtcbiAgICAgICAgcmV0dXJuIEtleWJvYXJkRXZlbnQuX01BUC5FTlRSWV9BQk9SVEVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEtleWJvYXJkRXZlbnQuX3ZhbHVlRm9yS2V5KGtleSwgS2V5Ym9hcmRFdmVudC5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEtleWJvYXJkRXZlbnQuX2tleUZvclZhbHVlKHZhbHVlLCBLZXlib2FyZEV2ZW50Ll9NQVApO1xuICAgIH1cbn1cblxuS2V5Ym9hcmRFdmVudC5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ0tFWVBSRVNTJzogJ0tFWVBSRVNTJyxcbiAgICAnRU5UUllfU1VCTUlUVEVEJzogJ0VOVFJZX1NVQk1JVFRFRCcsXG4gICAgJ0VOVFJZX1ZPSUNFJzogJ0VOVFJZX1ZPSUNFJyxcbiAgICAnRU5UUllfQ0FOQ0VMTEVEJzogJ0VOVFJZX0NBTkNFTExFRCcsXG4gICAgJ0VOVFJZX0FCT1JURUQnOiAnRU5UUllfQUJPUlRFRCcsXG59KTtcblxuZXhwb3J0IHsgS2V5Ym9hcmRFdmVudCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IEtleWJvYXJkRXZlbnQgfSBmcm9tICcuLi9lbnVtcy9LZXlib2FyZEV2ZW50LmpzJztcbmltcG9ydCB7IFJwY05vdGlmaWNhdGlvbiB9IGZyb20gJy4uL1JwY05vdGlmaWNhdGlvbi5qcyc7XG5cbi8qKlxuICogT24tc2NyZWVuIGtleWJvYXJkIGV2ZW50LiBDYW4gYmUgZnVsbCBzdHJpbmcgb3IgaW5kaXZpZHVhbCBrZXlwcmVzc2VzIGRlcGVuZGluZyBvbiBrZXlib2FyZCBtb2RlLlxuICovXG5jbGFzcyBPbktleWJvYXJkSW5wdXQgZXh0ZW5kcyBScGNOb3RpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuT25LZXlib2FyZElucHV0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IC0gT24tc2NyZWVuIGtleWJvYXJkIGlucHV0IGRhdGEuXG4gICAgICogQHJldHVybiB7T25LZXlib2FyZElucHV0fVxuICAgICAqL1xuICAgIHNldEV2ZW50IChldmVudCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShLZXlib2FyZEV2ZW50LCBldmVudCk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uS2V5Ym9hcmRJbnB1dC5LRVlfRVZFTlQsIGV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7S2V5Ym9hcmRFdmVudH1cbiAgICAgKi9cbiAgICBnZXRFdmVudCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChLZXlib2FyZEV2ZW50LCBPbktleWJvYXJkSW5wdXQuS0VZX0VWRU5UKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGF0YSAtIE9uLXNjcmVlbiBrZXlib2FyZCBpbnB1dCBkYXRhLiBGb3IgZHluYW1pYyBrZXlwcmVzcyBldmVudHMsIHRoaXMgd2lsbCBiZSB0aGUgY3VycmVudFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgY29tcG91bmRlZCBzdHJpbmcgb2YgZW50cnkgdGV4dC4gRm9yIGVudHJ5IHN1Ym1pc3Npb24gZXZlbnRzLCB0aGlzIHdpbGwgYmUgdGhlIGZ1bGwgdGV4dFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgKHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHJlZ2FyZGxlc3Mgb2YgdGhlIG1vZGUpLiBGb3IgZW50cnkgY2FuY2VsbGVkIGFuZCBlbnRyeVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRlZCBldmVudHMsIHRoaXMgZGF0YSBwYXJhbSB3aWxsIGJlIG9taXR0ZWQuXG4gICAgICogQHJldHVybiB7T25LZXlib2FyZElucHV0fVxuICAgICAqL1xuICAgIHNldERhdGEgKGRhdGEpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25LZXlib2FyZElucHV0LktFWV9EQVRBLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldERhdGEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoT25LZXlib2FyZElucHV0LktFWV9EQVRBKTtcbiAgICB9XG59XG5cbk9uS2V5Ym9hcmRJbnB1dC5LRVlfRVZFTlQgPSAnZXZlbnQnO1xuT25LZXlib2FyZElucHV0LktFWV9EQVRBID0gJ2RhdGEnO1xuXG5leHBvcnQgeyBPbktleWJvYXJkSW5wdXQgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuXG5jbGFzcyBUb3VjaENvb3JkIGV4dGVuZHMgUnBjU3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAocGFyYW1ldGVycykge1xuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRvdWNoLlxuICAgICAqIEByZXR1cm4ge1RvdWNoQ29vcmR9XG4gICAgICovXG4gICAgc2V0WCAoeCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihUb3VjaENvb3JkLktFWV9YLCB4KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFggKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVG91Y2hDb29yZC5LRVlfWCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSB0b3VjaC5cbiAgICAgKiBAcmV0dXJuIHtUb3VjaENvb3JkfVxuICAgICAqL1xuICAgIHNldFkgKHkpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVG91Y2hDb29yZC5LRVlfWSwgeSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRZICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFRvdWNoQ29vcmQuS0VZX1kpO1xuICAgIH1cbn1cblxuVG91Y2hDb29yZC5LRVlfWCA9ICd4JztcblRvdWNoQ29vcmQuS0VZX1kgPSAneSc7XG5cbmV4cG9ydCB7IFRvdWNoQ29vcmQgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBScGNTdHJ1Y3QgfSBmcm9tICcuLi9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgVG91Y2hDb29yZCB9IGZyb20gJy4vVG91Y2hDb29yZC5qcyc7XG5cbmNsYXNzIFRvdWNoRXZlbnQgZXh0ZW5kcyBScGNTdHJ1Y3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpZCAtIEEgdG91Y2gncyB1bmlxdWUgaWRlbnRpZmllci4gVGhlIGFwcGxpY2F0aW9uIGNhbiB0cmFjayB0aGUgY3VycmVudCB0b3VjaCBldmVudHMgYnkgaWQuIElmIGFcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0b3VjaCBldmVudCBoYXMgdHlwZSBiZWdpbiwgdGhlIGlkIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgc2V0IG9mIHRvdWNoZXMuIElmIGEgdG91Y2ggZXZlbnRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBoYXMgdHlwZSBlbmQsIHRoZSBpZCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXQgb2YgdG91Y2hlcy5cbiAgICAgKiBAcmV0dXJuIHtUb3VjaEV2ZW50fVxuICAgICAqL1xuICAgIHNldElkIChpZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihUb3VjaEV2ZW50LktFWV9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0SWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoVG91Y2hFdmVudC5LRVlfSUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyW119IHRzIC0gVGhlIHRpbWUgdGhhdCB0aGUgdG91Y2ggd2FzIHJlY29yZGVkLiBUaGlzIG51bWJlciBjYW4gdGhlIHRpbWUgc2luY2UgdGhlIGJlZ2lubmluZyBvZiB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gb3Igc29tZXRoaW5nIGVsc2UgYXMgbG9uZyBhcyB0aGUgdW5pdHMgYXJlIGluIG1pbGxpc2Vjb25kcy4gVGhlIHRpbWVzdGFtcCBpcyB1c2VkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICB0byBkZXRlcm1pbmVkIHRoZSByYXRlIG9mIGNoYW5nZSBvZiBwb3NpdGlvbiBvZiBhIHRvdWNoLiBUaGUgYXBwbGljYXRpb24gYWxzbyB1c2VzIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdGltZSB0byB2ZXJpZnkgd2hldGhlciB0d28gdG91Y2hlcywgd2l0aCBkaWZmZXJlbnQgaWRzLCBhcmUgcGFydCBvZiBhIHNpbmdsZSBhY3Rpb24gYnkgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICB1c2VyLiBJZiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHRpbWVzdGFtcCBpbiB0aGlzIGFycmF5LCBpdCBpcyB0aGUgc2FtZSBmb3IgZXZlcnlcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGUgaW4gdGhlIGNvb3JkaW5hdGVzIGFycmF5LlxuICAgICAqIEByZXR1cm4ge1RvdWNoRXZlbnR9XG4gICAgICovXG4gICAgc2V0VHMgKHRzKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKFRvdWNoRXZlbnQuS0VZX1RTLCB0cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcltdfVxuICAgICAqL1xuICAgIGdldFRzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKFRvdWNoRXZlbnQuS0VZX1RTKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RvdWNoQ29vcmRbXX0gY1xuICAgICAqIEByZXR1cm4ge1RvdWNoRXZlbnR9XG4gICAgICovXG4gICAgc2V0QyAoYykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZShUb3VjaENvb3JkLCBjLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoVG91Y2hFdmVudC5LRVlfQywgYyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RvdWNoQ29vcmRbXX1cbiAgICAgKi9cbiAgICBnZXRDICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFRvdWNoQ29vcmQsIFRvdWNoRXZlbnQuS0VZX0MpO1xuICAgIH1cbn1cblxuVG91Y2hFdmVudC5LRVlfSUQgPSAnaWQnO1xuVG91Y2hFdmVudC5LRVlfVFMgPSAndHMnO1xuVG91Y2hFdmVudC5LRVlfQyA9ICdjJztcblxuZXhwb3J0IHsgVG91Y2hFdmVudCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBUb3VjaFR5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFRvdWNoVHlwZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBCRUdJTiAoKSB7XG4gICAgICAgIHJldHVybiBUb3VjaFR5cGUuX01BUC5CRUdJTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBNT1ZFICgpIHtcbiAgICAgICAgcmV0dXJuIFRvdWNoVHlwZS5fTUFQLk1PVkU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRU5EICgpIHtcbiAgICAgICAgcmV0dXJuIFRvdWNoVHlwZS5fTUFQLkVORDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBDQU5DRUwgKCkge1xuICAgICAgICByZXR1cm4gVG91Y2hUeXBlLl9NQVAuQ0FOQ0VMO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFRvdWNoVHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBUb3VjaFR5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBUb3VjaFR5cGUuX2tleUZvclZhbHVlKHZhbHVlLCBUb3VjaFR5cGUuX01BUCk7XG4gICAgfVxufVxuXG5Ub3VjaFR5cGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdCRUdJTic6ICdCRUdJTicsXG4gICAgJ01PVkUnOiAnTU9WRScsXG4gICAgJ0VORCc6ICdFTkQnLFxuICAgICdDQU5DRUwnOiAnQ0FOQ0VMJyxcbn0pO1xuXG5leHBvcnQgeyBUb3VjaFR5cGUgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBUb3VjaEV2ZW50IH0gZnJvbSAnLi4vc3RydWN0cy9Ub3VjaEV2ZW50LmpzJztcbmltcG9ydCB7IFRvdWNoVHlwZSB9IGZyb20gJy4uL2VudW1zL1RvdWNoVHlwZS5qcyc7XG5pbXBvcnQgeyBScGNOb3RpZmljYXRpb24gfSBmcm9tICcuLi9ScGNOb3RpZmljYXRpb24uanMnO1xuXG4vKipcbiAqIE5vdGlmaWVzIGFib3V0IHRvdWNoIGV2ZW50cyBvbiB0aGUgc2NyZWVuJ3MgcHJlc2NyaWJlZCBhcmVhXG4gKi9cbmNsYXNzIE9uVG91Y2hFdmVudCBleHRlbmRzIFJwY05vdGlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5PblRvdWNoRXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VG91Y2hUeXBlfSB0eXBlIC0gVGhlIHR5cGUgb2YgdG91Y2ggZXZlbnQuXG4gICAgICogQHJldHVybiB7T25Ub3VjaEV2ZW50fVxuICAgICAqL1xuICAgIHNldFR5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVG91Y2hUeXBlLCB0eXBlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25Ub3VjaEV2ZW50LktFWV9UWVBFLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7VG91Y2hUeXBlfVxuICAgICAqL1xuICAgIGdldFR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoVG91Y2hUeXBlLCBPblRvdWNoRXZlbnQuS0VZX1RZUEUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudFtdfSBldmVudCAtIExpc3Qgb2YgYWxsIGluZGl2aWR1YWwgdG91Y2hlcyBpbnZvbHZlZCBpbiB0aGlzIGV2ZW50LlxuICAgICAqIEByZXR1cm4ge09uVG91Y2hFdmVudH1cbiAgICAgKi9cbiAgICBzZXRFdmVudCAoZXZlbnQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoVG91Y2hFdmVudCwgZXZlbnQsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblRvdWNoRXZlbnQuS0VZX0VWRU5ULCBldmVudCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1RvdWNoRXZlbnRbXX1cbiAgICAgKi9cbiAgICBnZXRFdmVudCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChUb3VjaEV2ZW50LCBPblRvdWNoRXZlbnQuS0VZX0VWRU5UKTtcbiAgICB9XG59XG5cbk9uVG91Y2hFdmVudC5LRVlfVFlQRSA9ICd0eXBlJztcbk9uVG91Y2hFdmVudC5LRVlfRVZFTlQgPSAnZXZlbnQnO1xuXG5leHBvcnQgeyBPblRvdWNoRXZlbnQgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBSZXF1ZXN0VHlwZSB9IGZyb20gJy4uL2VudW1zL1JlcXVlc3RUeXBlLmpzJztcbmltcG9ydCB7IEZpbGVUeXBlIH0gZnJvbSAnLi4vZW51bXMvRmlsZVR5cGUuanMnO1xuaW1wb3J0IHsgUnBjTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vUnBjTm90aWZpY2F0aW9uLmpzJztcblxuLyoqXG4gKiBBbiBhc3luY2hyb25vdXMgcmVxdWVzdCBmcm9tIHRoZSBzeXN0ZW0gZm9yIHNwZWNpZmljIGRhdGEgZnJvbSB0aGUgZGV2aWNlIG9yIHRoZSBjbG91ZCBvciByZXNwb25zZSB0byBhIHJlcXVlc3QgZnJvbVxuICogdGhlIGRldmljZSBvciBjbG91ZCBCaW5hcnkgZGF0YSBjYW4gYmUgaW5jbHVkZWQgaW4gaHlicmlkIHBhcnQgb2YgbWVzc2FnZSBmb3Igc29tZSByZXF1ZXN0cyAoc3VjaCBhcyBBdXRoZW50aWNhdGlvblxuICogcmVxdWVzdCByZXNwb25zZXMpXG4gKi9cbmNsYXNzIE9uU3lzdGVtUmVxdWVzdCBleHRlbmRzIFJwY05vdGlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5PblN5c3RlbVJlcXVlc3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7UmVxdWVzdFR5cGV9IHR5cGUgLSBUaGUgdHlwZSBvZiBzeXN0ZW0gcmVxdWVzdC5cbiAgICAgKiBAcmV0dXJuIHtPblN5c3RlbVJlcXVlc3R9XG4gICAgICovXG4gICAgc2V0UmVxdWVzdFR5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoUmVxdWVzdFR5cGUsIHR5cGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblN5c3RlbVJlcXVlc3QuS0VZX1JFUVVFU1RfVFlQRSwgdHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1JlcXVlc3RUeXBlfVxuICAgICAqL1xuICAgIGdldFJlcXVlc3RUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KFJlcXVlc3RUeXBlLCBPblN5c3RlbVJlcXVlc3QuS0VZX1JFUVVFU1RfVFlQRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGlzIHBhcmFtZXRlciBpcyBmaWxsZWQgZm9yIHN1cHBvcnRpbmcgT0VNIHByb3ByaWV0YXJ5IGRhdGEgZXhjaGFuZ2VzLlxuICAgICAqIEByZXR1cm4ge09uU3lzdGVtUmVxdWVzdH1cbiAgICAgKi9cbiAgICBzZXRSZXF1ZXN0U3ViVHlwZSAodHlwZSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblN5c3RlbVJlcXVlc3QuS0VZX1JFUVVFU1RfU1VCX1RZUEUsIHR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0UmVxdWVzdFN1YlR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoT25TeXN0ZW1SZXF1ZXN0LktFWV9SRVFVRVNUX1NVQl9UWVBFKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gT3B0aW9uYWwgVVJMIGZvciBIVFRQIHJlcXVlc3RzLiBJZiBibGFuaywgdGhlIGJpbmFyeSBkYXRhIHNoYWxsIGJlIGZvcndhcmRlZCB0byB0aGUgYXBwLiBJZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICBub3QgYmxhbmssIHRoZSBiaW5hcnkgZGF0YSBzaGFsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHVybCB3aXRoIGEgcHJvdmlkZWQgdGltZW91dCBpblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzLlxuICAgICAqIEByZXR1cm4ge09uU3lzdGVtUmVxdWVzdH1cbiAgICAgKi9cbiAgICBzZXRVcmwgKHVybCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblN5c3RlbVJlcXVlc3QuS0VZX1VSTCwgdXJsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFVybCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihPblN5c3RlbVJlcXVlc3QuS0VZX1VSTCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHRpbWVvdXQgLSBPcHRpb25hbCB0aW1lb3V0IGZvciBIVFRQIHJlcXVlc3RzIFJlcXVpcmVkIGlmIGEgVVJMIGlzIHByb3ZpZGVkXG4gICAgICogQHJldHVybiB7T25TeXN0ZW1SZXF1ZXN0fVxuICAgICAqL1xuICAgIHNldFRpbWVvdXQgKHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25TeXN0ZW1SZXF1ZXN0LktFWV9USU1FT1VULCB0aW1lb3V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFRpbWVvdXQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXIoT25TeXN0ZW1SZXF1ZXN0LktFWV9USU1FT1VUKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0ZpbGVUeXBlfSB0eXBlIC0gT3B0aW9uYWwgZmlsZSB0eXBlIChtZWFudCBmb3IgSFRUUCBmaWxlIHJlcXVlc3RzKS5cbiAgICAgKiBAcmV0dXJuIHtPblN5c3RlbVJlcXVlc3R9XG4gICAgICovXG4gICAgc2V0RmlsZVR5cGUgKHR5cGUpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoRmlsZVR5cGUsIHR5cGUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblN5c3RlbVJlcXVlc3QuS0VZX0ZJTEVfVFlQRSwgdHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0ZpbGVUeXBlfVxuICAgICAqL1xuICAgIGdldEZpbGVUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KEZpbGVUeXBlLCBPblN5c3RlbVJlcXVlc3QuS0VZX0ZJTEVfVFlQRSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCAtIE9wdGlvbmFsIG9mZnNldCBpbiBieXRlcyBmb3IgcmVzdW1pbmcgcGFydGlhbCBkYXRhIGNodW5rc1xuICAgICAqIEByZXR1cm4ge09uU3lzdGVtUmVxdWVzdH1cbiAgICAgKi9cbiAgICBzZXRPZmZzZXQgKG9mZnNldCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblN5c3RlbVJlcXVlc3QuS0VZX09GRlNFVCwgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldE9mZnNldCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihPblN5c3RlbVJlcXVlc3QuS0VZX09GRlNFVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCAtIE9wdGlvbmFsIGxlbmd0aCBpbiBieXRlcyBmb3IgcmVzdW1pbmcgcGFydGlhbCBkYXRhIGNodW5rc1xuICAgICAqIEByZXR1cm4ge09uU3lzdGVtUmVxdWVzdH1cbiAgICAgKi9cbiAgICBzZXRMZW5ndGggKGxlbmd0aCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblN5c3RlbVJlcXVlc3QuS0VZX0xFTkdUSCwgbGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldExlbmd0aCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihPblN5c3RlbVJlcXVlc3QuS0VZX0xFTkdUSCk7XG4gICAgfVxufVxuXG5PblN5c3RlbVJlcXVlc3QuS0VZX1JFUVVFU1RfVFlQRSA9ICdyZXF1ZXN0VHlwZSc7XG5PblN5c3RlbVJlcXVlc3QuS0VZX1JFUVVFU1RfU1VCX1RZUEUgPSAncmVxdWVzdFN1YlR5cGUnO1xuT25TeXN0ZW1SZXF1ZXN0LktFWV9VUkwgPSAndXJsJztcbk9uU3lzdGVtUmVxdWVzdC5LRVlfVElNRU9VVCA9ICd0aW1lb3V0Jztcbk9uU3lzdGVtUmVxdWVzdC5LRVlfRklMRV9UWVBFID0gJ2ZpbGVUeXBlJztcbk9uU3lzdGVtUmVxdWVzdC5LRVlfT0ZGU0VUID0gJ29mZnNldCc7XG5PblN5c3RlbVJlcXVlc3QuS0VZX0xFTkdUSCA9ICdsZW5ndGgnO1xuXG5leHBvcnQgeyBPblN5c3RlbVJlcXVlc3QgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNOb3RpZmljYXRpb24gfSBmcm9tICcuLi9ScGNOb3RpZmljYXRpb24uanMnO1xuXG4vKipcbiAqIE5vdGlmaWNhdGlvbiBjb250YWluaW5nIGFuIHVwZGF0ZWQgaGFzaElEIHdoaWNoIGNhbiBiZSB1c2VkIG92ZXIgY29ubmVjdGlvbiBjeWNsZXMgKGkuZS4gbG9zcyBvZiBjb25uZWN0aW9uLFxuICogaWduaXRpb24gY3ljbGVzLCBldGMuKS4gU2VudCBhZnRlciBpbml0aWFsIHJlZ2lzdHJhdGlvbiBhbmQgc3Vic2VxdWVudGx5IGFmdGVyIGFueSBjaGFuZ2UgaW4gdGhlIGNhbGN1bGF0ZWQgaGFzaCBvZlxuICogYWxsIHBlcnNpc3RlZCBhcHAgZGF0YS5cbiAqL1xuY2xhc3MgT25IYXNoQ2hhbmdlIGV4dGVuZHMgUnBjTm90aWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELk9uSGFzaENoYW5nZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGlkIC0gQ2FsY3VsYXRlZCBoYXNoIElEIHRvIGJlIHJlZmVyZW5jZWQgZHVyaW5nIFJlZ2lzdGVyQXBwSW50ZXJmYWNlLlxuICAgICAqIEByZXR1cm4ge09uSGFzaENoYW5nZX1cbiAgICAgKi9cbiAgICBzZXRIYXNoSUQgKGlkKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uSGFzaENoYW5nZS5LRVlfSEFTSF9JRCwgaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0SGFzaElEICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE9uSGFzaENoYW5nZS5LRVlfSEFTSF9JRCk7XG4gICAgfVxufVxuXG5Pbkhhc2hDaGFuZ2UuS0VZX0hBU0hfSUQgPSAnaGFzaElEJztcblxuZXhwb3J0IHsgT25IYXNoQ2hhbmdlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4uL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgTG9jYXRpb25EZXRhaWxzIH0gZnJvbSAnLi4vc3RydWN0cy9Mb2NhdGlvbkRldGFpbHMuanMnO1xuaW1wb3J0IHsgUnBjTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vUnBjTm90aWZpY2F0aW9uLmpzJztcblxuLyoqXG4gKiBOb3RpZmljYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhlIGVudGlyZSBMb2NhdGlvbkRldGFpbHMgd2hlbiB0aGVyZSBpcyBhIGNoYW5nZSB0byBhbnkgd2F5cG9pbnRzIG9yIGRlc3RpbmF0aW9uLlxuICovXG5jbGFzcyBPbldheVBvaW50Q2hhbmdlIGV4dGVuZHMgUnBjTm90aWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELk9uV2F5UG9pbnRDaGFuZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TG9jYXRpb25EZXRhaWxzW119IHBvaW50cyAtIFNlZSBMb2NhdGlvbkRldGFpbHNcbiAgICAgKiBAcmV0dXJuIHtPbldheVBvaW50Q2hhbmdlfVxuICAgICAqL1xuICAgIHNldFdheVBvaW50cyAocG9pbnRzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKExvY2F0aW9uRGV0YWlscywgcG9pbnRzLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25XYXlQb2ludENoYW5nZS5LRVlfV0FZX1BPSU5UUywgcG9pbnRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TG9jYXRpb25EZXRhaWxzW119XG4gICAgICovXG4gICAgZ2V0V2F5UG9pbnRzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KExvY2F0aW9uRGV0YWlscywgT25XYXlQb2ludENoYW5nZS5LRVlfV0FZX1BPSU5UUyk7XG4gICAgfVxufVxuXG5PbldheVBvaW50Q2hhbmdlLktFWV9XQVlfUE9JTlRTID0gJ3dheVBvaW50cyc7XG5cbmV4cG9ydCB7IE9uV2F5UG9pbnRDaGFuZ2UgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBNb2R1bGVEYXRhIH0gZnJvbSAnLi4vc3RydWN0cy9Nb2R1bGVEYXRhLmpzJztcbmltcG9ydCB7IFJwY05vdGlmaWNhdGlvbiB9IGZyb20gJy4uL1JwY05vdGlmaWNhdGlvbi5qcyc7XG5cbmNsYXNzIE9uSW50ZXJpb3JWZWhpY2xlRGF0YSBleHRlbmRzIFJwY05vdGlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5PbkludGVyaW9yVmVoaWNsZURhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TW9kdWxlRGF0YX0gZGF0YSAtIFRoZSBtb2R1bGVUeXBlIGluZGljYXRlcyB3aGljaCB0eXBlIG9mIGRhdGEgc2hvdWxkIGJlIGNoYW5nZWQgYW5kIGlkZW50aWZpZXMgd2hpY2hcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIG9iamVjdCBleGlzdHMgaW4gdGhpcyBzdHJ1Y3QuIEZvciBleGFtcGxlLCBpZiB0aGUgbW9kdWxlVHlwZSBpcyBDTElNQVRFIHRoZW4gYVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY2xpbWF0ZUNvbnRyb2xEYXRhXCIgc2hvdWxkIGV4aXN0XG4gICAgICogQHJldHVybiB7T25JbnRlcmlvclZlaGljbGVEYXRhfVxuICAgICAqL1xuICAgIHNldE1vZHVsZURhdGEgKGRhdGEpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTW9kdWxlRGF0YSwgZGF0YSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uSW50ZXJpb3JWZWhpY2xlRGF0YS5LRVlfTU9EVUxFX0RBVEEsIGRhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNb2R1bGVEYXRhfVxuICAgICAqL1xuICAgIGdldE1vZHVsZURhdGEgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTW9kdWxlRGF0YSwgT25JbnRlcmlvclZlaGljbGVEYXRhLktFWV9NT0RVTEVfREFUQSk7XG4gICAgfVxufVxuXG5PbkludGVyaW9yVmVoaWNsZURhdGEuS0VZX01PRFVMRV9EQVRBID0gJ21vZHVsZURhdGEnO1xuXG5leHBvcnQgeyBPbkludGVyaW9yVmVoaWNsZURhdGEgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBNb2R1bGVEYXRhIH0gZnJvbSAnLi4vc3RydWN0cy9Nb2R1bGVEYXRhLmpzJztcbmltcG9ydCB7IFJwY05vdGlmaWNhdGlvbiB9IGZyb20gJy4uL1JwY05vdGlmaWNhdGlvbi5qcyc7XG5cbi8qKlxuICogSXNzdWVkIGJ5IFNETCB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uIGFib3V0IHJlbW90ZSBjb250cm9sIHN0YXR1cyBjaGFuZ2Ugb24gU0RMXG4gKi9cbmNsYXNzIE9uUkNTdGF0dXMgZXh0ZW5kcyBScGNOb3RpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuT25SQ1N0YXR1cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhbGxvd2VkIC0gSWYgXCJ0cnVlXCIgLSBSQyBpcyBhbGxvd2VkOyBpZiBcImZhbHNlXCIgLSBSQyBpcyBkaXNhbGxvd2VkLlxuICAgICAqIEByZXR1cm4ge09uUkNTdGF0dXN9XG4gICAgICovXG4gICAgc2V0QWxsb3dlZCAoYWxsb3dlZCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblJDU3RhdHVzLktFWV9BTExPV0VELCBhbGxvd2VkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXRBbGxvd2VkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE9uUkNTdGF0dXMuS0VZX0FMTE9XRUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TW9kdWxlRGF0YVtdfSBtb2R1bGVzIC0gQ29udGFpbnMgYSBsaXN0ICh6ZXJvIG9yIG1vcmUpIG9mIG1vZHVsZSB0eXBlcyB0aGF0IGFyZSBhbGxvY2F0ZWQgdG8gdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtPblJDU3RhdHVzfVxuICAgICAqL1xuICAgIHNldEFsbG9jYXRlZE1vZHVsZXMgKG1vZHVsZXMpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoTW9kdWxlRGF0YSwgbW9kdWxlcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uUkNTdGF0dXMuS0VZX0FMTE9DQVRFRF9NT0RVTEVTLCBtb2R1bGVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TW9kdWxlRGF0YVtdfVxuICAgICAqL1xuICAgIGdldEFsbG9jYXRlZE1vZHVsZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTW9kdWxlRGF0YSwgT25SQ1N0YXR1cy5LRVlfQUxMT0NBVEVEX01PRFVMRVMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TW9kdWxlRGF0YVtdfSBtb2R1bGVzIC0gQ29udGFpbnMgYSBsaXN0ICh6ZXJvIG9yIG1vcmUpIG9mIG1vZHVsZSB0eXBlcyB0aGF0IGFyZSBmcmVlIHRvIGFjY2VzcyBmb3IgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtPblJDU3RhdHVzfVxuICAgICAqL1xuICAgIHNldEZyZWVNb2R1bGVzIChtb2R1bGVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKE1vZHVsZURhdGEsIG1vZHVsZXMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblJDU3RhdHVzLktFWV9GUkVFX01PRFVMRVMsIG1vZHVsZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNb2R1bGVEYXRhW119XG4gICAgICovXG4gICAgZ2V0RnJlZU1vZHVsZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoTW9kdWxlRGF0YSwgT25SQ1N0YXR1cy5LRVlfRlJFRV9NT0RVTEVTKTtcbiAgICB9XG59XG5cbk9uUkNTdGF0dXMuS0VZX0FMTE9XRUQgPSAnYWxsb3dlZCc7XG5PblJDU3RhdHVzLktFWV9BTExPQ0FURURfTU9EVUxFUyA9ICdhbGxvY2F0ZWRNb2R1bGVzJztcbk9uUkNTdGF0dXMuS0VZX0ZSRUVfTU9EVUxFUyA9ICdmcmVlTW9kdWxlcyc7XG5cbmV4cG9ydCB7IE9uUkNTdGF0dXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBBcHBTZXJ2aWNlRGF0YSB9IGZyb20gJy4uL3N0cnVjdHMvQXBwU2VydmljZURhdGEuanMnO1xuaW1wb3J0IHsgUnBjTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vUnBjTm90aWZpY2F0aW9uLmpzJztcblxuLyoqXG4gKiBUaGlzIG5vdGlmaWNhdGlvbiBpbmNsdWRlcyB0aGUgZGF0YSB0aGF0IGlzIHVwZGF0ZWQgZnJvbSB0aGUgc3BlY2lmaWMgc2VydmljZVxuICovXG5jbGFzcyBPbkFwcFNlcnZpY2VEYXRhIGV4dGVuZHMgUnBjTm90aWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoc3RvcmUpIHtcbiAgICAgICAgc3VwZXIoc3RvcmUpO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTmFtZShGdW5jdGlvbklELk9uQXBwU2VydmljZURhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXBwU2VydmljZURhdGF9IGRhdGEgLSBDb250YWlucyBhbGwgdGhlIGN1cnJlbnQgZGF0YSBvZiB0aGUgYXBwIHNlcnZpY2UuIFRoZSBzZXJ2aWNlVHlwZSB3aWxsIGxpbmsgdG9cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggb2YgdGhlIHNlcnZpY2UgZGF0YSBvYmplY3RzIGFyZSBpbmNsdWRlZCBpbiB0aGlzIG9iamVjdCAoZS5nLiBpZiB0aGUgc2VydmljZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIE1FRElBLCB0aGUgbWVkaWFTZXJ2aWNlRGF0YSBwYXJhbSBzaG91bGQgYmUgaW5jbHVkZWQpLlxuICAgICAqIEByZXR1cm4ge09uQXBwU2VydmljZURhdGF9XG4gICAgICovXG4gICAgc2V0U2VydmljZURhdGEgKGRhdGEpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUoQXBwU2VydmljZURhdGEsIGRhdGEpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPbkFwcFNlcnZpY2VEYXRhLktFWV9TRVJWSUNFX0RBVEEsIGRhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtBcHBTZXJ2aWNlRGF0YX1cbiAgICAgKi9cbiAgICBnZXRTZXJ2aWNlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChBcHBTZXJ2aWNlRGF0YSwgT25BcHBTZXJ2aWNlRGF0YS5LRVlfU0VSVklDRV9EQVRBKTtcbiAgICB9XG59XG5cbk9uQXBwU2VydmljZURhdGEuS0VZX1NFUlZJQ0VfREFUQSA9ICdzZXJ2aWNlRGF0YSc7XG5cbmV4cG9ydCB7IE9uQXBwU2VydmljZURhdGEgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBTeXN0ZW1DYXBhYmlsaXR5IH0gZnJvbSAnLi4vc3RydWN0cy9TeXN0ZW1DYXBhYmlsaXR5LmpzJztcbmltcG9ydCB7IFJwY05vdGlmaWNhdGlvbiB9IGZyb20gJy4uL1JwY05vdGlmaWNhdGlvbi5qcyc7XG5cbi8qKlxuICogQSBub3RpZmljYXRpb24gdG8gaW5mb3JtIHRoZSBjb25uZWN0ZWQgZGV2aWNlIHRoYXQgYSBzcGVjaWZpYyBzeXN0ZW0gY2FwYWJpbGl0eSBoYXMgY2hhbmdlZC5cbiAqL1xuY2xhc3MgT25TeXN0ZW1DYXBhYmlsaXR5VXBkYXRlZCBleHRlbmRzIFJwY05vdGlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHN0b3JlKSB7XG4gICAgICAgIHN1cGVyKHN0b3JlKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoRnVuY3Rpb25JRC5PblN5c3RlbUNhcGFiaWxpdHlVcGRhdGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N5c3RlbUNhcGFiaWxpdHl9IGNhcGFiaWxpdHkgLSBUaGUgc3lzdGVtIGNhcGFiaWxpdHkgdGhhdCBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICogQHJldHVybiB7T25TeXN0ZW1DYXBhYmlsaXR5VXBkYXRlZH1cbiAgICAgKi9cbiAgICBzZXRTeXN0ZW1DYXBhYmlsaXR5IChjYXBhYmlsaXR5KSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlKFN5c3RlbUNhcGFiaWxpdHksIGNhcGFiaWxpdHkpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPblN5c3RlbUNhcGFiaWxpdHlVcGRhdGVkLktFWV9TWVNURU1fQ0FQQUJJTElUWSwgY2FwYWJpbGl0eSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N5c3RlbUNhcGFiaWxpdHl9XG4gICAgICovXG4gICAgZ2V0U3lzdGVtQ2FwYWJpbGl0eSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChTeXN0ZW1DYXBhYmlsaXR5LCBPblN5c3RlbUNhcGFiaWxpdHlVcGRhdGVkLktFWV9TWVNURU1fQ0FQQUJJTElUWSk7XG4gICAgfVxufVxuXG5PblN5c3RlbUNhcGFiaWxpdHlVcGRhdGVkLktFWV9TWVNURU1fQ0FQQUJJTElUWSA9ICdzeXN0ZW1DYXBhYmlsaXR5JztcblxuZXhwb3J0IHsgT25TeXN0ZW1DYXBhYmlsaXR5VXBkYXRlZCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcblxuLyoqXG4gKiBBbGxvd3MgZW5jb2RlZCBkYXRhIGluIHRoZSBmb3JtIG9mIFN5bmNQIHBhY2tldHMgdG8gYmUgc2VudCB0byB0aGUgU1lOQyBtb2R1bGUuIExlZ2FjeSAvIHYxIFByb3RvY29sIGltcGxlbWVudGF0aW9uO1xuICogdXNlIFN5bmNQRGF0YSBpbnN0ZWFkLiAqKiogREVQUkVDQVRFRCAqKipcbiAqL1xuY2xhc3MgRW5jb2RlZFN5bmNQRGF0YSBleHRlbmRzIFJwY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuRW5jb2RlZFN5bmNQRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmdbXX0gZGF0YSAtIENvbnRhaW5zIGJhc2U2NCBlbmNvZGVkIHN0cmluZyBvZiBTeW5jUCBwYWNrZXRzLlxuICAgICAqIEByZXR1cm4ge0VuY29kZWRTeW5jUERhdGF9XG4gICAgICovXG4gICAgc2V0RGF0YSAoZGF0YSkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihFbmNvZGVkU3luY1BEYXRhLktFWV9EQVRBLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0RGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihFbmNvZGVkU3luY1BEYXRhLktFWV9EQVRBKTtcbiAgICB9XG59XG5cbkVuY29kZWRTeW5jUERhdGEuS0VZX0RBVEEgPSAnZGF0YSc7XG5cbmV4cG9ydCB7IEVuY29kZWRTeW5jUERhdGEgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vZW51bXMvRnVuY3Rpb25JRC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uL1JwY1Jlc3BvbnNlLmpzJztcblxuY2xhc3MgRW5jb2RlZFN5bmNQRGF0YVJlc3BvbnNlIGV4dGVuZHMgUnBjUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuRW5jb2RlZFN5bmNQRGF0YSk7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB7IEVuY29kZWRTeW5jUERhdGFSZXNwb25zZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEZ1bmN0aW9uSUQgfSBmcm9tICcuLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IFJwY05vdGlmaWNhdGlvbiB9IGZyb20gJy4uL1JwY05vdGlmaWNhdGlvbi5qcyc7XG5cbi8qKlxuICogQ2FsbGJhY2sgaW5jbHVkaW5nIGVuY29kZWQgZGF0YSBvZiBhbnkgU3luY1AgcGFja2V0cyB0aGF0IFNZTkMgbmVlZHMgdG8gc2VuZCBiYWNrIHRvIHRoZSBtb2JpbGUgZGV2aWNlLiBMZWdhY3kgLyB2MVxuICogUHJvdG9jb2wgaW1wbGVtZW50YXRpb247IHJlc3BvbmRzIHRvIEVuY29kZWRTeW5jUERhdGEuICoqKiBERVBSRUNBVEVEICoqKlxuICovXG5jbGFzcyBPbkVuY29kZWRTeW5jUERhdGEgZXh0ZW5kcyBScGNOb3RpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChzdG9yZSkge1xuICAgICAgICBzdXBlcihzdG9yZSk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25OYW1lKEZ1bmN0aW9uSUQuT25FbmNvZGVkU3luY1BEYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ1tdfSBkYXRhIC0gQ29udGFpbnMgYmFzZTY0IGVuY29kZWQgc3RyaW5nIG9mIFN5bmNQIHBhY2tldHMuXG4gICAgICogQHJldHVybiB7T25FbmNvZGVkU3luY1BEYXRhfVxuICAgICAqL1xuICAgIHNldERhdGEgKGRhdGEpIHtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoT25FbmNvZGVkU3luY1BEYXRhLktFWV9EQVRBLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0RGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihPbkVuY29kZWRTeW5jUERhdGEuS0VZX0RBVEEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBJZiBibGFuaywgdGhlIFN5bmNQIGRhdGEgc2hhbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSBhcHAuIElmIG5vdCBibGFuaywgdGhlIFN5bmNQIGRhdGEgc2hhbGxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgYmUgZm9yd2FyZGVkIHRvIHRoZSBwcm92aWRlZCBVUkwuXG4gICAgICogQHJldHVybiB7T25FbmNvZGVkU3luY1BEYXRhfVxuICAgICAqL1xuICAgIHNldFVSTCAodXJsKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKE9uRW5jb2RlZFN5bmNQRGF0YS5LRVlfVVJMLCB1cmwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0VVJMICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyKE9uRW5jb2RlZFN5bmNQRGF0YS5LRVlfVVJMKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZW91dCAtIElmIGJsYW5rLCB0aGUgU3luY1AgZGF0YSBzaGFsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIGFwcC4gSWYgbm90IGJsYW5rLCB0aGUgU3luY1AgZGF0YVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhbGwgYmUgZm9yd2FyZGVkIHdpdGggdGhlIHByb3ZpZGVkIHRpbWVvdXQgaW4gc2Vjb25kcy5cbiAgICAgKiBAcmV0dXJuIHtPbkVuY29kZWRTeW5jUERhdGF9XG4gICAgICovXG4gICAgc2V0VGltZW91dCAodGltZW91dCkge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihPbkVuY29kZWRTeW5jUERhdGEuS0VZX1RJTUVPVVQsIHRpbWVvdXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0VGltZW91dCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcihPbkVuY29kZWRTeW5jUERhdGEuS0VZX1RJTUVPVVQpO1xuICAgIH1cbn1cblxuT25FbmNvZGVkU3luY1BEYXRhLktFWV9EQVRBID0gJ2RhdGEnO1xuT25FbmNvZGVkU3luY1BEYXRhLktFWV9VUkwgPSAnVVJMJztcbk9uRW5jb2RlZFN5bmNQRGF0YS5LRVlfVElNRU9VVCA9ICdUaW1lb3V0JztcblxuZXhwb3J0IHsgT25FbmNvZGVkU3luY1BEYXRhIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuLy8gbWVzc2FnZXNcbmltcG9ydCB7IFJlZ2lzdGVyQXBwSW50ZXJmYWNlIH0gZnJvbSAnLi9tZXNzYWdlcy9SZWdpc3RlckFwcEludGVyZmFjZS5qcyc7XG5pbXBvcnQgeyBSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLmpzJztcbmltcG9ydCB7IFVucmVnaXN0ZXJBcHBJbnRlcmZhY2UgfSBmcm9tICcuL21lc3NhZ2VzL1VucmVnaXN0ZXJBcHBJbnRlcmZhY2UuanMnO1xuaW1wb3J0IHsgVW5yZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9VbnJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgQ3JlYXRlV2luZG93IH0gZnJvbSAnLi9tZXNzYWdlcy9DcmVhdGVXaW5kb3cuanMnO1xuaW1wb3J0IHsgQ3JlYXRlV2luZG93UmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL0NyZWF0ZVdpbmRvd1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IERlbGV0ZVdpbmRvdyB9IGZyb20gJy4vbWVzc2FnZXMvRGVsZXRlV2luZG93LmpzJztcbmltcG9ydCB7IERlbGV0ZVdpbmRvd1Jlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9EZWxldGVXaW5kb3dSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTZXRHbG9iYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9tZXNzYWdlcy9TZXRHbG9iYWxQcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7IFNldEdsb2JhbFByb3BlcnRpZXNSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvU2V0R2xvYmFsUHJvcGVydGllc1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IFJlc2V0R2xvYmFsUHJvcGVydGllcyB9IGZyb20gJy4vbWVzc2FnZXMvUmVzZXRHbG9iYWxQcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7IFJlc2V0R2xvYmFsUHJvcGVydGllc1Jlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9SZXNldEdsb2JhbFByb3BlcnRpZXNSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBBZGRDb21tYW5kIH0gZnJvbSAnLi9tZXNzYWdlcy9BZGRDb21tYW5kLmpzJztcbmltcG9ydCB7IEFkZENvbW1hbmRSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvQWRkQ29tbWFuZFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IERlbGV0ZUNvbW1hbmQgfSBmcm9tICcuL21lc3NhZ2VzL0RlbGV0ZUNvbW1hbmQuanMnO1xuaW1wb3J0IHsgRGVsZXRlQ29tbWFuZFJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9EZWxldGVDb21tYW5kUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgQWRkU3ViTWVudSB9IGZyb20gJy4vbWVzc2FnZXMvQWRkU3ViTWVudS5qcyc7XG5pbXBvcnQgeyBBZGRTdWJNZW51UmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL0FkZFN1Yk1lbnVSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBEZWxldGVTdWJNZW51IH0gZnJvbSAnLi9tZXNzYWdlcy9EZWxldGVTdWJNZW51LmpzJztcbmltcG9ydCB7IERlbGV0ZVN1Yk1lbnVSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvRGVsZXRlU3ViTWVudVJlc3BvbnNlLmpzJztcbmltcG9ydCB7IFNob3dBcHBNZW51IH0gZnJvbSAnLi9tZXNzYWdlcy9TaG93QXBwTWVudS5qcyc7XG5pbXBvcnQgeyBTaG93QXBwTWVudVJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9TaG93QXBwTWVudVJlc3BvbnNlLmpzJztcbmltcG9ydCB7IENyZWF0ZUludGVyYWN0aW9uQ2hvaWNlU2V0IH0gZnJvbSAnLi9tZXNzYWdlcy9DcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldC5qcyc7XG5pbXBvcnQgeyBDcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldFJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9DcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IFBlcmZvcm1JbnRlcmFjdGlvbiB9IGZyb20gJy4vbWVzc2FnZXMvUGVyZm9ybUludGVyYWN0aW9uLmpzJztcbmltcG9ydCB7IFBlcmZvcm1JbnRlcmFjdGlvblJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9QZXJmb3JtSW50ZXJhY3Rpb25SZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBEZWxldGVJbnRlcmFjdGlvbkNob2ljZVNldCB9IGZyb20gJy4vbWVzc2FnZXMvRGVsZXRlSW50ZXJhY3Rpb25DaG9pY2VTZXQuanMnO1xuaW1wb3J0IHsgRGVsZXRlSW50ZXJhY3Rpb25DaG9pY2VTZXRSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvRGVsZXRlSW50ZXJhY3Rpb25DaG9pY2VTZXRSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBBbGVydCB9IGZyb20gJy4vbWVzc2FnZXMvQWxlcnQuanMnO1xuaW1wb3J0IHsgQWxlcnRSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvQWxlcnRSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTaG93IH0gZnJvbSAnLi9tZXNzYWdlcy9TaG93LmpzJztcbmltcG9ydCB7IFNob3dSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvU2hvd1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IFNwZWFrIH0gZnJvbSAnLi9tZXNzYWdlcy9TcGVhay5qcyc7XG5pbXBvcnQgeyBTcGVha1Jlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9TcGVha1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IFNldE1lZGlhQ2xvY2tUaW1lciB9IGZyb20gJy4vbWVzc2FnZXMvU2V0TWVkaWFDbG9ja1RpbWVyLmpzJztcbmltcG9ydCB7IFNldE1lZGlhQ2xvY2tUaW1lclJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9TZXRNZWRpYUNsb2NrVGltZXJSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBQZXJmb3JtQXVkaW9QYXNzVGhydSB9IGZyb20gJy4vbWVzc2FnZXMvUGVyZm9ybUF1ZGlvUGFzc1RocnUuanMnO1xuaW1wb3J0IHsgUGVyZm9ybUF1ZGlvUGFzc1RocnVSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvUGVyZm9ybUF1ZGlvUGFzc1RocnVSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBFbmRBdWRpb1Bhc3NUaHJ1IH0gZnJvbSAnLi9tZXNzYWdlcy9FbmRBdWRpb1Bhc3NUaHJ1LmpzJztcbmltcG9ydCB7IEVuZEF1ZGlvUGFzc1RocnVSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvRW5kQXVkaW9QYXNzVGhydVJlc3BvbnNlLmpzJztcbmltcG9ydCB7IFN1YnNjcmliZUJ1dHRvbiB9IGZyb20gJy4vbWVzc2FnZXMvU3Vic2NyaWJlQnV0dG9uLmpzJztcbmltcG9ydCB7IFN1YnNjcmliZUJ1dHRvblJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9TdWJzY3JpYmVCdXR0b25SZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBVbnN1YnNjcmliZUJ1dHRvbiB9IGZyb20gJy4vbWVzc2FnZXMvVW5zdWJzY3JpYmVCdXR0b24uanMnO1xuaW1wb3J0IHsgVW5zdWJzY3JpYmVCdXR0b25SZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvVW5zdWJzY3JpYmVCdXR0b25SZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTdWJzY3JpYmVWZWhpY2xlRGF0YSB9IGZyb20gJy4vbWVzc2FnZXMvU3Vic2NyaWJlVmVoaWNsZURhdGEuanMnO1xuaW1wb3J0IHsgU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBVbnN1YnNjcmliZVZlaGljbGVEYXRhIH0gZnJvbSAnLi9tZXNzYWdlcy9VbnN1YnNjcmliZVZlaGljbGVEYXRhLmpzJztcbmltcG9ydCB7IFVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvVW5zdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlLmpzJztcbmltcG9ydCB7IEdldFZlaGljbGVEYXRhIH0gZnJvbSAnLi9tZXNzYWdlcy9HZXRWZWhpY2xlRGF0YS5qcyc7XG5pbXBvcnQgeyBHZXRWZWhpY2xlRGF0YVJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9HZXRWZWhpY2xlRGF0YVJlc3BvbnNlLmpzJztcbmltcG9ydCB7IFJlYWRESUQgfSBmcm9tICcuL21lc3NhZ2VzL1JlYWRESUQuanMnO1xuaW1wb3J0IHsgUmVhZERJRFJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9SZWFkRElEUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgR2V0RFRDcyB9IGZyb20gJy4vbWVzc2FnZXMvR2V0RFRDcy5qcyc7XG5pbXBvcnQgeyBHZXREVENzUmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL0dldERUQ3NSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBEaWFnbm9zdGljTWVzc2FnZSB9IGZyb20gJy4vbWVzc2FnZXMvRGlhZ25vc3RpY01lc3NhZ2UuanMnO1xuaW1wb3J0IHsgRGlhZ25vc3RpY01lc3NhZ2VSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvRGlhZ25vc3RpY01lc3NhZ2VSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTY3JvbGxhYmxlTWVzc2FnZSB9IGZyb20gJy4vbWVzc2FnZXMvU2Nyb2xsYWJsZU1lc3NhZ2UuanMnO1xuaW1wb3J0IHsgU2Nyb2xsYWJsZU1lc3NhZ2VSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvU2Nyb2xsYWJsZU1lc3NhZ2VSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTbGlkZXIgfSBmcm9tICcuL21lc3NhZ2VzL1NsaWRlci5qcyc7XG5pbXBvcnQgeyBTbGlkZXJSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvU2xpZGVyUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgU2hvd0NvbnN0YW50VEJUIH0gZnJvbSAnLi9tZXNzYWdlcy9TaG93Q29uc3RhbnRUQlQuanMnO1xuaW1wb3J0IHsgU2hvd0NvbnN0YW50VEJUUmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL1Nob3dDb25zdGFudFRCVFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IEFsZXJ0TWFuZXV2ZXIgfSBmcm9tICcuL21lc3NhZ2VzL0FsZXJ0TWFuZXV2ZXIuanMnO1xuaW1wb3J0IHsgQWxlcnRNYW5ldXZlclJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9BbGVydE1hbmV1dmVyUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgVXBkYXRlVHVybkxpc3QgfSBmcm9tICcuL21lc3NhZ2VzL1VwZGF0ZVR1cm5MaXN0LmpzJztcbmltcG9ydCB7IFVwZGF0ZVR1cm5MaXN0UmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL1VwZGF0ZVR1cm5MaXN0UmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgQ2hhbmdlUmVnaXN0cmF0aW9uIH0gZnJvbSAnLi9tZXNzYWdlcy9DaGFuZ2VSZWdpc3RyYXRpb24uanMnO1xuaW1wb3J0IHsgQ2hhbmdlUmVnaXN0cmF0aW9uUmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL0NoYW5nZVJlZ2lzdHJhdGlvblJlc3BvbnNlLmpzJztcbmltcG9ydCB7IEdlbmVyaWNSZXNwb25zZVJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9HZW5lcmljUmVzcG9uc2VSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBQdXRGaWxlIH0gZnJvbSAnLi9tZXNzYWdlcy9QdXRGaWxlLmpzJztcbmltcG9ydCB7IFB1dEZpbGVSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvUHV0RmlsZVJlc3BvbnNlLmpzJztcbmltcG9ydCB7IEdldEZpbGUgfSBmcm9tICcuL21lc3NhZ2VzL0dldEZpbGUuanMnO1xuaW1wb3J0IHsgR2V0RmlsZVJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9HZXRGaWxlUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgRGVsZXRlRmlsZSB9IGZyb20gJy4vbWVzc2FnZXMvRGVsZXRlRmlsZS5qcyc7XG5pbXBvcnQgeyBEZWxldGVGaWxlUmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL0RlbGV0ZUZpbGVSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBMaXN0RmlsZXMgfSBmcm9tICcuL21lc3NhZ2VzL0xpc3RGaWxlcy5qcyc7XG5pbXBvcnQgeyBMaXN0RmlsZXNSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvTGlzdEZpbGVzUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgU2V0QXBwSWNvbiB9IGZyb20gJy4vbWVzc2FnZXMvU2V0QXBwSWNvbi5qcyc7XG5pbXBvcnQgeyBTZXRBcHBJY29uUmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL1NldEFwcEljb25SZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTZXREaXNwbGF5TGF5b3V0IH0gZnJvbSAnLi9tZXNzYWdlcy9TZXREaXNwbGF5TGF5b3V0LmpzJztcbmltcG9ydCB7IFNldERpc3BsYXlMYXlvdXRSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvU2V0RGlzcGxheUxheW91dFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IFN5c3RlbVJlcXVlc3QgfSBmcm9tICcuL21lc3NhZ2VzL1N5c3RlbVJlcXVlc3QuanMnO1xuaW1wb3J0IHsgU3lzdGVtUmVxdWVzdFJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9TeXN0ZW1SZXF1ZXN0UmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgU2VuZExvY2F0aW9uIH0gZnJvbSAnLi9tZXNzYWdlcy9TZW5kTG9jYXRpb24uanMnO1xuaW1wb3J0IHsgU2VuZExvY2F0aW9uUmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL1NlbmRMb2NhdGlvblJlc3BvbnNlLmpzJztcbmltcG9ydCB7IERpYWxOdW1iZXIgfSBmcm9tICcuL21lc3NhZ2VzL0RpYWxOdW1iZXIuanMnO1xuaW1wb3J0IHsgRGlhbE51bWJlclJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9EaWFsTnVtYmVyUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgQnV0dG9uUHJlc3MgfSBmcm9tICcuL21lc3NhZ2VzL0J1dHRvblByZXNzLmpzJztcbmltcG9ydCB7IEJ1dHRvblByZXNzUmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL0J1dHRvblByZXNzUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgR2V0SW50ZXJpb3JWZWhpY2xlRGF0YSB9IGZyb20gJy4vbWVzc2FnZXMvR2V0SW50ZXJpb3JWZWhpY2xlRGF0YS5qcyc7XG5pbXBvcnQgeyBHZXRJbnRlcmlvclZlaGljbGVEYXRhUmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL0dldEludGVyaW9yVmVoaWNsZURhdGFSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBHZXRJbnRlcmlvclZlaGljbGVEYXRhQ29uc2VudCB9IGZyb20gJy4vbWVzc2FnZXMvR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnQuanMnO1xuaW1wb3J0IHsgR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnRSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnRSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBSZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZSB9IGZyb20gJy4vbWVzc2FnZXMvUmVsZWFzZUludGVyaW9yVmVoaWNsZURhdGFNb2R1bGUuanMnO1xuaW1wb3J0IHsgUmVsZWFzZUludGVyaW9yVmVoaWNsZURhdGFNb2R1bGVSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvUmVsZWFzZUludGVyaW9yVmVoaWNsZURhdGFNb2R1bGVSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTZXRJbnRlcmlvclZlaGljbGVEYXRhIH0gZnJvbSAnLi9tZXNzYWdlcy9TZXRJbnRlcmlvclZlaGljbGVEYXRhLmpzJztcbmltcG9ydCB7IFNldEludGVyaW9yVmVoaWNsZURhdGFSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvU2V0SW50ZXJpb3JWZWhpY2xlRGF0YVJlc3BvbnNlLmpzJztcbmltcG9ydCB7IFN1YnNjcmliZVdheVBvaW50cyB9IGZyb20gJy4vbWVzc2FnZXMvU3Vic2NyaWJlV2F5UG9pbnRzLmpzJztcbmltcG9ydCB7IFN1YnNjcmliZVdheVBvaW50c1Jlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9TdWJzY3JpYmVXYXlQb2ludHNSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBHZXRXYXlQb2ludHMgfSBmcm9tICcuL21lc3NhZ2VzL0dldFdheVBvaW50cy5qcyc7XG5pbXBvcnQgeyBHZXRXYXlQb2ludHNSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvR2V0V2F5UG9pbnRzUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgVW5zdWJzY3JpYmVXYXlQb2ludHMgfSBmcm9tICcuL21lc3NhZ2VzL1Vuc3Vic2NyaWJlV2F5UG9pbnRzLmpzJztcbmltcG9ydCB7IFVuc3Vic2NyaWJlV2F5UG9pbnRzUmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL1Vuc3Vic2NyaWJlV2F5UG9pbnRzUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgR2V0U3lzdGVtQ2FwYWJpbGl0eSB9IGZyb20gJy4vbWVzc2FnZXMvR2V0U3lzdGVtQ2FwYWJpbGl0eS5qcyc7XG5pbXBvcnQgeyBHZXRTeXN0ZW1DYXBhYmlsaXR5UmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL0dldFN5c3RlbUNhcGFiaWxpdHlSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTZW5kSGFwdGljRGF0YSB9IGZyb20gJy4vbWVzc2FnZXMvU2VuZEhhcHRpY0RhdGEuanMnO1xuaW1wb3J0IHsgU2VuZEhhcHRpY0RhdGFSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvU2VuZEhhcHRpY0RhdGFSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTZXRDbG91ZEFwcFByb3BlcnRpZXMgfSBmcm9tICcuL21lc3NhZ2VzL1NldENsb3VkQXBwUHJvcGVydGllcy5qcyc7XG5pbXBvcnQgeyBTZXRDbG91ZEFwcFByb3BlcnRpZXNSZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvU2V0Q2xvdWRBcHBQcm9wZXJ0aWVzUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgR2V0Q2xvdWRBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi9tZXNzYWdlcy9HZXRDbG91ZEFwcFByb3BlcnRpZXMuanMnO1xuaW1wb3J0IHsgR2V0Q2xvdWRBcHBQcm9wZXJ0aWVzUmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL0dldENsb3VkQXBwUHJvcGVydGllc1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IFB1Ymxpc2hBcHBTZXJ2aWNlIH0gZnJvbSAnLi9tZXNzYWdlcy9QdWJsaXNoQXBwU2VydmljZS5qcyc7XG5pbXBvcnQgeyBQdWJsaXNoQXBwU2VydmljZVJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9QdWJsaXNoQXBwU2VydmljZVJlc3BvbnNlLmpzJztcbmltcG9ydCB7IFVucHVibGlzaEFwcFNlcnZpY2UgfSBmcm9tICcuL21lc3NhZ2VzL1VucHVibGlzaEFwcFNlcnZpY2UuanMnO1xuaW1wb3J0IHsgVW5wdWJsaXNoQXBwU2VydmljZVJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9VbnB1Ymxpc2hBcHBTZXJ2aWNlUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgR2V0QXBwU2VydmljZURhdGEgfSBmcm9tICcuL21lc3NhZ2VzL0dldEFwcFNlcnZpY2VEYXRhLmpzJztcbmltcG9ydCB7IEdldEFwcFNlcnZpY2VEYXRhUmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL0dldEFwcFNlcnZpY2VEYXRhUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvbiB9IGZyb20gJy4vbWVzc2FnZXMvUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvbi5qcyc7XG5pbXBvcnQgeyBQZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9uUmVzcG9uc2UgfSBmcm9tICcuL21lc3NhZ2VzL1BlcmZvcm1BcHBTZXJ2aWNlSW50ZXJhY3Rpb25SZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBDYW5jZWxJbnRlcmFjdGlvbiB9IGZyb20gJy4vbWVzc2FnZXMvQ2FuY2VsSW50ZXJhY3Rpb24uanMnO1xuaW1wb3J0IHsgQ2FuY2VsSW50ZXJhY3Rpb25SZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvQ2FuY2VsSW50ZXJhY3Rpb25SZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBDbG9zZUFwcGxpY2F0aW9uIH0gZnJvbSAnLi9tZXNzYWdlcy9DbG9zZUFwcGxpY2F0aW9uLmpzJztcbmltcG9ydCB7IENsb3NlQXBwbGljYXRpb25SZXNwb25zZSB9IGZyb20gJy4vbWVzc2FnZXMvQ2xvc2VBcHBsaWNhdGlvblJlc3BvbnNlLmpzJztcbmltcG9ydCB7IE9uSE1JU3RhdHVzIH0gZnJvbSAnLi9tZXNzYWdlcy9PbkhNSVN0YXR1cy5qcyc7XG5pbXBvcnQgeyBPbkFwcEludGVyZmFjZVVucmVnaXN0ZXJlZCB9IGZyb20gJy4vbWVzc2FnZXMvT25BcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWQuanMnO1xuaW1wb3J0IHsgT25CdXR0b25FdmVudCB9IGZyb20gJy4vbWVzc2FnZXMvT25CdXR0b25FdmVudC5qcyc7XG5pbXBvcnQgeyBPbkJ1dHRvblByZXNzIH0gZnJvbSAnLi9tZXNzYWdlcy9PbkJ1dHRvblByZXNzLmpzJztcbmltcG9ydCB7IE9uVmVoaWNsZURhdGEgfSBmcm9tICcuL21lc3NhZ2VzL09uVmVoaWNsZURhdGEuanMnO1xuaW1wb3J0IHsgT25Db21tYW5kIH0gZnJvbSAnLi9tZXNzYWdlcy9PbkNvbW1hbmQuanMnO1xuaW1wb3J0IHsgT25UQlRDbGllbnRTdGF0ZSB9IGZyb20gJy4vbWVzc2FnZXMvT25UQlRDbGllbnRTdGF0ZS5qcyc7XG5pbXBvcnQgeyBPbkRyaXZlckRpc3RyYWN0aW9uIH0gZnJvbSAnLi9tZXNzYWdlcy9PbkRyaXZlckRpc3RyYWN0aW9uLmpzJztcbmltcG9ydCB7IE9uUGVybWlzc2lvbnNDaGFuZ2UgfSBmcm9tICcuL21lc3NhZ2VzL09uUGVybWlzc2lvbnNDaGFuZ2UuanMnO1xuaW1wb3J0IHsgT25BdWRpb1Bhc3NUaHJ1IH0gZnJvbSAnLi9tZXNzYWdlcy9PbkF1ZGlvUGFzc1RocnUuanMnO1xuaW1wb3J0IHsgT25MYW5ndWFnZUNoYW5nZSB9IGZyb20gJy4vbWVzc2FnZXMvT25MYW5ndWFnZUNoYW5nZS5qcyc7XG5pbXBvcnQgeyBPbktleWJvYXJkSW5wdXQgfSBmcm9tICcuL21lc3NhZ2VzL09uS2V5Ym9hcmRJbnB1dC5qcyc7XG5pbXBvcnQgeyBPblRvdWNoRXZlbnQgfSBmcm9tICcuL21lc3NhZ2VzL09uVG91Y2hFdmVudC5qcyc7XG5pbXBvcnQgeyBPblN5c3RlbVJlcXVlc3QgfSBmcm9tICcuL21lc3NhZ2VzL09uU3lzdGVtUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBPbkhhc2hDaGFuZ2UgfSBmcm9tICcuL21lc3NhZ2VzL09uSGFzaENoYW5nZS5qcyc7XG5pbXBvcnQgeyBPbldheVBvaW50Q2hhbmdlIH0gZnJvbSAnLi9tZXNzYWdlcy9PbldheVBvaW50Q2hhbmdlLmpzJztcbmltcG9ydCB7IE9uSW50ZXJpb3JWZWhpY2xlRGF0YSB9IGZyb20gJy4vbWVzc2FnZXMvT25JbnRlcmlvclZlaGljbGVEYXRhLmpzJztcbmltcG9ydCB7IE9uUkNTdGF0dXMgfSBmcm9tICcuL21lc3NhZ2VzL09uUkNTdGF0dXMuanMnO1xuaW1wb3J0IHsgT25BcHBTZXJ2aWNlRGF0YSB9IGZyb20gJy4vbWVzc2FnZXMvT25BcHBTZXJ2aWNlRGF0YS5qcyc7XG5pbXBvcnQgeyBPblN5c3RlbUNhcGFiaWxpdHlVcGRhdGVkIH0gZnJvbSAnLi9tZXNzYWdlcy9PblN5c3RlbUNhcGFiaWxpdHlVcGRhdGVkLmpzJztcbmltcG9ydCB7IEVuY29kZWRTeW5jUERhdGEgfSBmcm9tICcuL21lc3NhZ2VzL0VuY29kZWRTeW5jUERhdGEuanMnO1xuaW1wb3J0IHsgRW5jb2RlZFN5bmNQRGF0YVJlc3BvbnNlIH0gZnJvbSAnLi9tZXNzYWdlcy9FbmNvZGVkU3luY1BEYXRhUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgT25FbmNvZGVkU3luY1BEYXRhIH0gZnJvbSAnLi9tZXNzYWdlcy9PbkVuY29kZWRTeW5jUERhdGEuanMnO1xuXG4vLyBvdGhlclxuaW1wb3J0IHsgUnBjVHlwZSB9IGZyb20gJy4vZW51bXMvUnBjVHlwZS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IEpzb25ScGNNYXJzaGFsbGVyIH0gZnJvbSAnLi8uLi91dGlsL0pzb25ScGNNYXJzaGFsbGVyLmpzJztcbmltcG9ydCB7IEJpbmFyeUZyYW1lSGVhZGVyIH0gZnJvbSAnLi8uLi9wcm90b2NvbC9CaW5hcnlGcmFtZUhlYWRlci5qcyc7XG5cbmNsYXNzIFJwY0NyZWF0b3Ige1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIFNkbFBhY2tldCB0byBhbiBScGNNZXNzYWdlXG4gICAgICogQHBhcmFtIHtTZGxQYWNrZXR9IHNkbFBhY2tldFxuICAgICAqIEByZXR1cm4ge1JwY01lc3NhZ2V9XG4gICAgICovXG4gICAgc3RhdGljIGNvbnN0cnVjdCAoc2RsUGFja2V0KSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBzZGxQYWNrZXQuZ2V0UGF5bG9hZCgpO1xuICAgICAgICBjb25zdCBiaW5hcnlGcmFtZUhlYWRlciA9IEJpbmFyeUZyYW1lSGVhZGVyLmZyb21CaW5hcnlIZWFkZXIocGF5bG9hZCk7XG5cbiAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgIGNvbnN0IHJwY1R5cGUgPSBiaW5hcnlGcmFtZUhlYWRlci5nZXRScGNUeXBlKCk7XG4gICAgICAgIGNvbnN0IHJwY05hbWUgPSBScGNUeXBlLmtleUZvclZhbHVlKHJwY1R5cGUpO1xuICAgICAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gYmluYXJ5RnJhbWVIZWFkZXIuZ2V0Q29ycmVsYXRpb25JZCgpO1xuICAgICAgICBjb25zdCBmdW5jdGlvbklkID0gYmluYXJ5RnJhbWVIZWFkZXIuZ2V0RnVuY3Rpb25JZCgpO1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBGdW5jdGlvbklELmtleUZvclZhbHVlKGZ1bmN0aW9uSWQpO1xuICAgICAgICBjb25zdCBidWxrRGF0YSA9IGJpbmFyeUZyYW1lSGVhZGVyLmdldEJ1bGtEYXRhKCk7XG4gICAgICAgIGNvbnN0IGpzb25EYXRhID0gYmluYXJ5RnJhbWVIZWFkZXIuZ2V0SnNvbkRhdGEoKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgcGFyYW1ldGVyczogSnNvblJwY01hcnNoYWxsZXIudW5tYXJzaGFsbChqc29uRGF0YSksXG4gICAgICAgIH07XG5cbiAgICAgICAgc3dpdGNoIChmdW5jdGlvbklkKSB7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuUmVnaXN0ZXJBcHBJbnRlcmZhY2U6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFJlZ2lzdGVyQXBwSW50ZXJmYWNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5VbnJlZ2lzdGVyQXBwSW50ZXJmYWNlOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBVbnJlZ2lzdGVyQXBwSW50ZXJmYWNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgVW5yZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELkNyZWF0ZVdpbmRvdzpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgQ3JlYXRlV2luZG93KHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgQ3JlYXRlV2luZG93UmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuRGVsZXRlV2luZG93OlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBEZWxldGVXaW5kb3cocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBEZWxldGVXaW5kb3dSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5TZXRHbG9iYWxQcm9wZXJ0aWVzOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTZXRHbG9iYWxQcm9wZXJ0aWVzKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2V0R2xvYmFsUHJvcGVydGllc1Jlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlJlc2V0R2xvYmFsUHJvcGVydGllczpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgUmVzZXRHbG9iYWxQcm9wZXJ0aWVzKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgUmVzZXRHbG9iYWxQcm9wZXJ0aWVzUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuQWRkQ29tbWFuZDpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgQWRkQ29tbWFuZChwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IEFkZENvbW1hbmRSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5EZWxldGVDb21tYW5kOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBEZWxldGVDb21tYW5kKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgRGVsZXRlQ29tbWFuZFJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELkFkZFN1Yk1lbnU6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IEFkZFN1Yk1lbnUocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBBZGRTdWJNZW51UmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuRGVsZXRlU3ViTWVudTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgRGVsZXRlU3ViTWVudShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IERlbGV0ZVN1Yk1lbnVSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5TaG93QXBwTWVudTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2hvd0FwcE1lbnUocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTaG93QXBwTWVudVJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELkNyZWF0ZUludGVyYWN0aW9uQ2hvaWNlU2V0OlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBDcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldChwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IENyZWF0ZUludGVyYWN0aW9uQ2hvaWNlU2V0UmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuUGVyZm9ybUludGVyYWN0aW9uOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBQZXJmb3JtSW50ZXJhY3Rpb24ocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBQZXJmb3JtSW50ZXJhY3Rpb25SZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5EZWxldGVJbnRlcmFjdGlvbkNob2ljZVNldDpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgRGVsZXRlSW50ZXJhY3Rpb25DaG9pY2VTZXQocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBEZWxldGVJbnRlcmFjdGlvbkNob2ljZVNldFJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELkFsZXJ0OlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBBbGVydChwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IEFsZXJ0UmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuU2hvdzpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2hvdyhwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFNob3dSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5TcGVhazpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU3BlYWsocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTcGVha1Jlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlNldE1lZGlhQ2xvY2tUaW1lcjpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2V0TWVkaWFDbG9ja1RpbWVyKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2V0TWVkaWFDbG9ja1RpbWVyUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuUGVyZm9ybUF1ZGlvUGFzc1RocnU6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFBlcmZvcm1BdWRpb1Bhc3NUaHJ1KHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgUGVyZm9ybUF1ZGlvUGFzc1RocnVSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5FbmRBdWRpb1Bhc3NUaHJ1OlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBFbmRBdWRpb1Bhc3NUaHJ1KHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgRW5kQXVkaW9QYXNzVGhydVJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlN1YnNjcmliZUJ1dHRvbjpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU3Vic2NyaWJlQnV0dG9uKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU3Vic2NyaWJlQnV0dG9uUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuVW5zdWJzY3JpYmVCdXR0b246XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFVuc3Vic2NyaWJlQnV0dG9uKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgVW5zdWJzY3JpYmVCdXR0b25SZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5TdWJzY3JpYmVWZWhpY2xlRGF0YTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU3Vic2NyaWJlVmVoaWNsZURhdGEocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlVuc3Vic2NyaWJlVmVoaWNsZURhdGE6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFVuc3Vic2NyaWJlVmVoaWNsZURhdGEocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuR2V0VmVoaWNsZURhdGE6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IEdldFZlaGljbGVEYXRhKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgR2V0VmVoaWNsZURhdGFSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5SZWFkRElEOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBSZWFkRElEKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgUmVhZERJRFJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELkdldERUQ3M6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IEdldERUQ3MocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBHZXREVENzUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuRGlhZ25vc3RpY01lc3NhZ2U6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IERpYWdub3N0aWNNZXNzYWdlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgRGlhZ25vc3RpY01lc3NhZ2VSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5TY3JvbGxhYmxlTWVzc2FnZTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2Nyb2xsYWJsZU1lc3NhZ2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTY3JvbGxhYmxlTWVzc2FnZVJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlNsaWRlcjpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2xpZGVyKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2xpZGVyUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuU2hvd0NvbnN0YW50VEJUOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTaG93Q29uc3RhbnRUQlQocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTaG93Q29uc3RhbnRUQlRSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5BbGVydE1hbmV1dmVyOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBBbGVydE1hbmV1dmVyKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgQWxlcnRNYW5ldXZlclJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlVwZGF0ZVR1cm5MaXN0OlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBVcGRhdGVUdXJuTGlzdChwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFVwZGF0ZVR1cm5MaXN0UmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuQ2hhbmdlUmVnaXN0cmF0aW9uOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBDaGFuZ2VSZWdpc3RyYXRpb24ocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBDaGFuZ2VSZWdpc3RyYXRpb25SZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5HZW5lcmljUmVzcG9uc2U6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBHZW5lcmljUmVzcG9uc2VSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5QdXRGaWxlOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBQdXRGaWxlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgUHV0RmlsZVJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELkdldEZpbGU6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IEdldEZpbGUocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBHZXRGaWxlUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuRGVsZXRlRmlsZTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgRGVsZXRlRmlsZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IERlbGV0ZUZpbGVSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5MaXN0RmlsZXM6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IExpc3RGaWxlcyhwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IExpc3RGaWxlc1Jlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlNldEFwcEljb246XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFNldEFwcEljb24ocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTZXRBcHBJY29uUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuU2V0RGlzcGxheUxheW91dDpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2V0RGlzcGxheUxheW91dChwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFNldERpc3BsYXlMYXlvdXRSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5TeXN0ZW1SZXF1ZXN0OlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTeXN0ZW1SZXF1ZXN0KHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU3lzdGVtUmVxdWVzdFJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlNlbmRMb2NhdGlvbjpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2VuZExvY2F0aW9uKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2VuZExvY2F0aW9uUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuRGlhbE51bWJlcjpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgRGlhbE51bWJlcihwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IERpYWxOdW1iZXJSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5CdXR0b25QcmVzczpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgQnV0dG9uUHJlc3MocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBCdXR0b25QcmVzc1Jlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELkdldEludGVyaW9yVmVoaWNsZURhdGE6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IEdldEludGVyaW9yVmVoaWNsZURhdGEocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBHZXRJbnRlcmlvclZlaGljbGVEYXRhUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnQ6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IEdldEludGVyaW9yVmVoaWNsZURhdGFDb25zZW50KHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnRSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5SZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgUmVsZWFzZUludGVyaW9yVmVoaWNsZURhdGFNb2R1bGUocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBSZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZVJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlNldEludGVyaW9yVmVoaWNsZURhdGE6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFNldEludGVyaW9yVmVoaWNsZURhdGEocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTZXRJbnRlcmlvclZlaGljbGVEYXRhUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuU3Vic2NyaWJlV2F5UG9pbnRzOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTdWJzY3JpYmVXYXlQb2ludHMocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTdWJzY3JpYmVXYXlQb2ludHNSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5HZXRXYXlQb2ludHM6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IEdldFdheVBvaW50cyhwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IEdldFdheVBvaW50c1Jlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlVuc3Vic2NyaWJlV2F5UG9pbnRzOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBVbnN1YnNjcmliZVdheVBvaW50cyhwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFVuc3Vic2NyaWJlV2F5UG9pbnRzUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuR2V0U3lzdGVtQ2FwYWJpbGl0eTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgR2V0U3lzdGVtQ2FwYWJpbGl0eShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IEdldFN5c3RlbUNhcGFiaWxpdHlSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5TZW5kSGFwdGljRGF0YTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2VuZEhhcHRpY0RhdGEocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTZW5kSGFwdGljRGF0YVJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlNldENsb3VkQXBwUHJvcGVydGllczpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2V0Q2xvdWRBcHBQcm9wZXJ0aWVzKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2V0Q2xvdWRBcHBQcm9wZXJ0aWVzUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuR2V0Q2xvdWRBcHBQcm9wZXJ0aWVzOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBHZXRDbG91ZEFwcFByb3BlcnRpZXMocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBHZXRDbG91ZEFwcFByb3BlcnRpZXNSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5QdWJsaXNoQXBwU2VydmljZTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgUHVibGlzaEFwcFNlcnZpY2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBQdWJsaXNoQXBwU2VydmljZVJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlVucHVibGlzaEFwcFNlcnZpY2U6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IFVucHVibGlzaEFwcFNlcnZpY2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBVbnB1Ymxpc2hBcHBTZXJ2aWNlUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuR2V0QXBwU2VydmljZURhdGE6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IEdldEFwcFNlcnZpY2VEYXRhKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgR2V0QXBwU2VydmljZURhdGFSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5QZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9uOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBQZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9uKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFU1BPTlNFKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvblJlc3BvbnNlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELkNhbmNlbEludGVyYWN0aW9uOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLlJFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBDYW5jZWxJbnRlcmFjdGlvbihwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IENhbmNlbEludGVyYWN0aW9uUmVzcG9uc2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuQ2xvc2VBcHBsaWNhdGlvbjpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgQ2xvc2VBcHBsaWNhdGlvbihwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IENsb3NlQXBwbGljYXRpb25SZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5PbkhNSVN0YXR1czpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5OT1RJRklDQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBPbkhNSVN0YXR1cyhwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5PbkFwcEludGVyZmFjZVVucmVnaXN0ZXJlZDpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5OT1RJRklDQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBPbkFwcEludGVyZmFjZVVucmVnaXN0ZXJlZChwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5PbkJ1dHRvbkV2ZW50OlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLk5PVElGSUNBVElPTikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IE9uQnV0dG9uRXZlbnQocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuT25CdXR0b25QcmVzczpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5OT1RJRklDQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBPbkJ1dHRvblByZXNzKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELk9uVmVoaWNsZURhdGE6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuTk9USUZJQ0FUSU9OKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgT25WZWhpY2xlRGF0YShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5PbkNvbW1hbmQ6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuTk9USUZJQ0FUSU9OKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgT25Db21tYW5kKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELk9uVEJUQ2xpZW50U3RhdGU6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuTk9USUZJQ0FUSU9OKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgT25UQlRDbGllbnRTdGF0ZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5PbkRyaXZlckRpc3RyYWN0aW9uOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLk5PVElGSUNBVElPTikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IE9uRHJpdmVyRGlzdHJhY3Rpb24ocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuT25QZXJtaXNzaW9uc0NoYW5nZTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5OT1RJRklDQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBPblBlcm1pc3Npb25zQ2hhbmdlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELk9uQXVkaW9QYXNzVGhydTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5OT1RJRklDQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBPbkF1ZGlvUGFzc1RocnUocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuT25MYW5ndWFnZUNoYW5nZTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5OT1RJRklDQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBPbkxhbmd1YWdlQ2hhbmdlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELk9uS2V5Ym9hcmRJbnB1dDpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5OT1RJRklDQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBPbktleWJvYXJkSW5wdXQocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuT25Ub3VjaEV2ZW50OlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLk5PVElGSUNBVElPTikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IE9uVG91Y2hFdmVudChwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5PblN5c3RlbVJlcXVlc3Q6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuTk9USUZJQ0FUSU9OKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgT25TeXN0ZW1SZXF1ZXN0KHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELk9uSGFzaENoYW5nZTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5OT1RJRklDQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBPbkhhc2hDaGFuZ2UocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuT25XYXlQb2ludENoYW5nZTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5OT1RJRklDQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBPbldheVBvaW50Q2hhbmdlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELk9uSW50ZXJpb3JWZWhpY2xlRGF0YTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5OT1RJRklDQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBPbkludGVyaW9yVmVoaWNsZURhdGEocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuT25SQ1N0YXR1czpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5OT1RJRklDQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBPblJDU3RhdHVzKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELk9uQXBwU2VydmljZURhdGE6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuTk9USUZJQ0FUSU9OKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgT25BcHBTZXJ2aWNlRGF0YShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5PblN5c3RlbUNhcGFiaWxpdHlVcGRhdGVkOlxuICAgICAgICAgICAgICAgIGlmIChycGNUeXBlID09PSBScGNUeXBlLk5PVElGSUNBVElPTikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IE9uU3lzdGVtQ2FwYWJpbGl0eVVwZGF0ZWQocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZ1bmN0aW9uSUQuRW5jb2RlZFN5bmNQRGF0YTpcbiAgICAgICAgICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgRW5jb2RlZFN5bmNQRGF0YShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVNQT05TRSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbmV3IEVuY29kZWRTeW5jUERhdGFSZXNwb25zZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5PbkVuY29kZWRTeW5jUERhdGE6XG4gICAgICAgICAgICAgICAgaWYgKHJwY1R5cGUgPT09IFJwY1R5cGUuTk9USUZJQ0FUSU9OKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgT25FbmNvZGVkU3luY1BEYXRhKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHVuZGVmaW5lZCkgeyAvLyBpbmZvcm1zIG9mIG1pc3NpbmcgY2xhc3Nlc1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBScGNDcmVhdG9yIGNvdWxkbid0IGNvbnN0cnVjdCBhbiBSUEMgZm9yIHRoZSAke2Z1bmN0aW9uTmFtZX0gJHtycGNOYW1lfWApO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocnBjVHlwZSA9PT0gUnBjVHlwZS5SRVFVRVNUIHx8IHJwY1R5cGUgPT09IFJwY1R5cGUuUkVTUE9OU0UpIHtcbiAgICAgICAgICAgIG1lc3NhZ2Uuc2V0Q29ycmVsYXRpb25JZChjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnVsa0RhdGEpIHtcbiAgICAgICAgICAgIG1lc3NhZ2Uuc2V0QnVsa0RhdGEoYnVsa0RhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB7IFJwY0NyZWF0b3IgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgTWVzc2FnZUZyYW1lRGlzYXNzZW1ibGVyIH0gZnJvbSAnLi9NZXNzYWdlRnJhbWVEaXNhc3NlbWJsZXIuanMnO1xuaW1wb3J0IHsgVHJhbnNwb3J0TGlzdGVuZXIgfSBmcm9tICcuLi90cmFuc3BvcnQvVHJhbnNwb3J0TGlzdGVuZXIuanMnO1xuaW1wb3J0IHsgVmVyc2lvbiB9IGZyb20gJy4uL3V0aWwvVmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlVHlwZSB9IGZyb20gJy4vZW51bXMvU2VydmljZVR5cGUuanMnO1xuaW1wb3J0IHsgRnJhbWVUeXBlIH0gZnJvbSAnLi9lbnVtcy9GcmFtZVR5cGUuanMnO1xuaW1wb3J0IHsgTWVzc2FnZUZyYW1lQXNzZW1ibGVyIH0gZnJvbSAnLi9NZXNzYWdlRnJhbWVBc3NlbWJsZXIuanMnO1xuaW1wb3J0IHsgU2RsUGFja2V0IH0gZnJvbSAnLi9TZGxQYWNrZXQuanMnO1xuaW1wb3J0IHsgQ29udHJvbEZyYW1lVGFncyB9IGZyb20gJy4vZW51bXMvQ29udHJvbEZyYW1lVGFncy5qcyc7XG5pbXBvcnQgeyBCaXRDb252ZXJ0ZXIgfSBmcm9tICcuLy4uL3V0aWwvQml0Q29udmVydGVyLmpzJztcblxuaW1wb3J0IHsgU2RsUGFja2V0RmFjdG9yeSB9IGZyb20gJy4vU2RsUGFja2V0RmFjdG9yeS5qcyc7XG5pbXBvcnQgeyBScGNDcmVhdG9yIH0gZnJvbSAnLi8uLi9ycGMvUnBjQ3JlYXRvci5qcyc7XG5pbXBvcnQgeyBJbWFnZVJlc29sdXRpb24gfSBmcm9tICcuLi9ycGMvc3RydWN0cy9JbWFnZVJlc29sdXRpb24uanMnO1xuaW1wb3J0IHsgVmlkZW9TdHJlYW1pbmdGb3JtYXQgfSBmcm9tICcuLi9ycGMvc3RydWN0cy9WaWRlb1N0cmVhbWluZ0Zvcm1hdC5qcyc7XG5cbi8qKlxuICogQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBzZGwgcHJvdG9jb2wuXG4gKiBTaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgYmFzaWMgY29udHJvbCBmcmFtZXMgYW5kIGJlIGFibGUgdG9cbiAqIHNlbmQgYW5kIHJlY2VpdmUgcGFja2V0cyBmcm9tIHRoZSB0cmFuc3BvcnQgbWFuYWdlci5cbiAqIEFsc28gc2VuZHMga2V5IGV2ZW50cyB0byB0aGUgc2RsUHJvdG9jb2xMaXN0ZW5lci5cbiAqL1xuY2xhc3MgU2RsUHJvdG9jb2xCYXNlIHtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7IFRyYW5zcG9ydENvbmZpZ0Jhc2UgfSBiYXNlVHJhbnNwb3J0Q29uZmlnXG4gICAgICogQHBhcmFtIHsgU2RsUHJvdG9jb2xMaXN0ZW5lciB9IHNkbFByb3RvY29sTGlzdGVuZXJcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoYmFzZVRyYW5zcG9ydENvbmZpZywgc2RsUHJvdG9jb2xMaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9iYXNlVHJhbnNwb3J0Q29uZmlnID0gYmFzZVRyYW5zcG9ydENvbmZpZztcbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0Q29uZmlnID0gYmFzZVRyYW5zcG9ydENvbmZpZztcbiAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2xMaXN0ZW5lciA9IHNkbFByb3RvY29sTGlzdGVuZXI7XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydE1hbmFnZXIgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgICAgIHRoaXMuX2NyZWF0ZVRyYW5zcG9ydExpc3RlbmVyKCk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHNkbCBwcm90b2NvbCB0byBpdHMgZGVmYXVsdCBzdGF0ZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9yZXNldCAoKSB7XG4gICAgICAgIHRoaXMuX3Byb3RvY29sVmVyc2lvbiA9IG5ldyBWZXJzaW9uKDEsIDAsIDApO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRDb25maWcgPSB0aGlzLl9iYXNlVHJhbnNwb3J0Q29uZmlnO1xuICAgICAgICB0aGlzLl9oZWFkZXJTaXplID0gU2RsUHJvdG9jb2xCYXNlLlYxX0hFQURFUl9TSVpFO1xuICAgICAgICB0aGlzLl9zZXJ2aWNlU3RhdHVzID0ge307XG4gICAgICAgIHRoaXMuX3NlcnZpY2VTdGF0dXNbU2VydmljZVR5cGUuQ09OVFJPTF0gPSB0cnVlO1xuICAgICAgICB0aGlzLl9tdHVzID0ge307XG4gICAgICAgIHRoaXMuX210dXNbU2VydmljZVR5cGUuUlBDXSA9IFNkbFByb3RvY29sQmFzZS5WMV9WMl9NVFVfU0laRSAtIHRoaXMuX2hlYWRlclNpemU7XG4gICAgICAgIHRoaXMuX2hhc2hJRCA9IDA7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VGcmFtZUFzc2VtYmxlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUlEID0gMTtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbklEID0gMDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFNldHMgYSB0cmFuc3BvcnQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0geyBUcmFuc3BvcnRNYW5hZ2VyQmFzZSB9IG1hbmFnZXJcbiAgICAgKi9cbiAgICBzZXRUcmFuc3BvcnRNYW5hZ2VyIChtYW5hZ2VyKSB7XG4gICAgICAgIGlmICghdGhpcy5fc2VydmljZVN0YXR1c1tTZXJ2aWNlVHlwZS5SUENdKSB7XG4gICAgICAgICAgICAvLyBSUEMgc2VydmljZSBoYXNuJ3QgYmVlbiBzdGFydGVkLCBsZXRzIHN0YXJ0IGl0XG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2VydmljZShTZXJ2aWNlVHlwZS5SUEMsIDAsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90cmFuc3BvcnRNYW5hZ2VyID0gbWFuYWdlcjtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIHRyYW5zcG9ydCBsaXN0ZW5lci4gVGhpcyB3aWxsIHJlY2lldmUgaW5jb21pbmcgcmVxdWVzdHNcbiAgICAgKiBmcm9tIHRoZSB0cmFuc3BvcnQgbWFuYWdlci5cbiAgICAgKi9cbiAgICBfY3JlYXRlVHJhbnNwb3J0TGlzdGVuZXIgKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0TGlzdGVuZXIgPSBuZXcgVHJhbnNwb3J0TGlzdGVuZXIoKTtcbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0TGlzdGVuZXIuc2V0T25UcmFuc3BvcnRDb25uZWN0ZWQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5faGFuZGxlVHJhbnNwb3J0Q29ubmVjdGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRMaXN0ZW5lci5zZXRPblRyYW5zcG9ydERpc2Nvbm5lY3RlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRMaXN0ZW5lci5zZXRPblBhY2tldFJlY2VpdmVkKGZ1bmN0aW9uIChzZGxQYWNrZXQpIHtcbiAgICAgICAgICAgIHNlbGYuX2hhbmRsZVBhY2tldFJlY2VpdmVkKHNkbFBhY2tldCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRMaXN0ZW5lci5zZXRPbkVycm9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2hhbmRsZVRyYW5zcG9ydENvbm5lY3RlZCAoKSB7XG4gICAgICAgIHRoaXMuX3NkbFByb3RvY29sTGlzdGVuZXIub25UcmFuc3BvcnRDb25uZWN0ZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdGFydHMgdXAgdGhlIFNETCBwcm90b2NvbCBjbGFzcy4gSXQgd2lsbCBraWNrIG9mZiB0aGUgdHJhbnNwb3J0IG1hbmFnZXIgYW5kIHVuZGVybHlpbmcgdHJhbnNwb3J0LlxuICAgICAqL1xuICAgIHN0YXJ0ICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90cmFuc3BvcnRNYW5hZ2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgdHJhbnNwb3J0IG1hbmFnZXIgbXVzdCBiZSBkZWZpbmVkLCB1bmFibGUgdG8gc3RhcnQgU0RMIFByb3RvY29sJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0TWFuYWdlci5zdGFydCgpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgdGhlIHNlcnZpY2UuIFRoaXMgaXMgdGhlIGZpcnN0IHN0ZXAgaW4gY29tbXVuaWNhdGluZyB3aXRoIHNkbCBjb3JlLlxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNlc3Npb25JRFxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNFbmNyeXB0ZWRcbiAgICAgKi9cbiAgICBzdGFydFNlcnZpY2UgKHNlcnZpY2VUeXBlLCBzZXNzaW9uSUQsIGlzRW5jcnlwdGVkKSB7XG4gICAgICAgIGNvbnN0IHByb3RvY29sVmVyc2lvbiA9IHRoaXMuY29uc3RydWN0b3IuTUFYX1BST1RPQ09MX1ZFUlNJT047XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJRCA9IDA7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IG5ldyBTZGxQYWNrZXQocHJvdG9jb2xWZXJzaW9uLmdldE1ham9yKCksIGlzRW5jcnlwdGVkLCBGcmFtZVR5cGUuQ09OVFJPTCxcbiAgICAgICAgICAgIHNlcnZpY2VUeXBlLCBTZGxQYWNrZXQuRlJBTUVfSU5GT19TVEFSVF9TRVJWSUNFLCBzZXNzaW9uSUQsXG4gICAgICAgICAgICAwLCBtZXNzYWdlSUQsIG51bGwpO1xuICAgICAgICBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLkFVRElPKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kUGFja2V0KGhlYWRlcik7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLlJQQykge1xuICAgICAgICAgICAgaGVhZGVyLnB1dFRhZyhDb250cm9sRnJhbWVUYWdzLlJQQy5TdGFydFNlcnZpY2UuUFJPVE9DT0xfVkVSU0lPTiwgcHJvdG9jb2xWZXJzaW9uLnRvU3RyaW5nKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2VUeXBlID09PSBTZXJ2aWNlVHlwZS5WSURFTykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NkbFByb3RvY29sTGlzdGVuZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWRlb1N0cmVhbWluZ1BhcmFtZXRlcnMgPSB0aGlzLl9zZGxQcm90b2NvbExpc3RlbmVyLmdldERlc2lyZWRWaWRlb1BhcmFtcygpO1xuICAgICAgICAgICAgICAgIGlmICh2aWRlb1N0cmVhbWluZ1BhcmFtZXRlcnMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzaXJlZFJlc29sdXRpb24gPSB2aWRlb1N0cmVhbWluZ1BhcmFtZXRlcnMuZ2V0UmVzb2x1dGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNpcmVkRm9ybWF0ID0gdmlkZW9TdHJlYW1pbmdQYXJhbWV0ZXJzLmdldEZvcm1hdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzaXJlZFJlc29sdXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5wdXRUYWcoQ29udHJvbEZyYW1lVGFncy5WaWRlby5TdGFydFNlcnZpY2UuV0lEVEgsIGRlc2lyZWRSZXNvbHV0aW9uLmdldFJlc29sdXRpb25XaWR0aCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci5wdXRUYWcoQ29udHJvbEZyYW1lVGFncy5WaWRlby5TdGFydFNlcnZpY2UuSEVJR0hULCBkZXNpcmVkUmVzb2x1dGlvbi5nZXRSZXNvbHV0aW9uSGVpZ2h0KCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNpcmVkRm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIucHV0VGFnKENvbnRyb2xGcmFtZVRhZ3MuVmlkZW8uU3RhcnRTZXJ2aWNlLlZJREVPX0NPREVDLCBkZXNpcmVkRm9ybWF0LmdldENvZGVjKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnB1dFRhZyhDb250cm9sRnJhbWVUYWdzLlZpZGVvLlN0YXJ0U2VydmljZS5WSURFT19QUk9UT0NPTCwgZGVzaXJlZEZvcm1hdC5nZXRQcm90b2NvbCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRQYWNrZXQoaGVhZGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2VydmljZSB0eXBlIG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VuZFBhY2tldChoZWFkZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBHZXQgdGhlIG1heCB0cmFuc3BvcnQgdW5pdCBvZiBhIHNwZWNpZmljIHNlcnZpY2UgdHlwZS5cbiAgICAgKiBAcGFyYW0geyBTZXJ2aWNlVHlwZSB9IHNlcnZpY2VUeXBlXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBtYXggdHJhbnNwb3J0IHVuaXQgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlIHR5cGVcbiAgICAgKi9cbiAgICBnZXRNdHUgKHNlcnZpY2VUeXBlKSB7XG4gICAgICAgIGNvbnN0IHJldFZhbCA9IHRoaXMuX210dXNbc2VydmljZVR5cGVdO1xuICAgICAgICBpZiAocmV0VmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTZGxQcm90b2NvbEJhc2UuVjFfVjJfTVRVX1NJWkU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRyYW5zcG9ydCBtYW5hZ2VyIGlzIGNvbm5lY3RlZC5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBpc0Nvbm5lY3RlZFxuICAgICAqL1xuICAgIGlzQ29ubmVjdGVkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydE1hbmFnZXIgJiYgdGhpcy5fdHJhbnNwb3J0TWFuYWdlci5pc0Nvbm5lY3RlZChudWxsLCBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcHJvdG9jb2wgdmVyc2lvbiBpbiB1c2UuXG4gICAgICogQHJldHVybnMge1ZlcnNpb259IHByb3RvY29sIHZlcnNpb25cbiAgICAgKi9cbiAgICBnZXRQcm90b2NvbFZlcnNpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvdG9jb2xWZXJzaW9uO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlIG1ham9yIHByb3RvY29sIHZlcnNpb24gdGhhdCB3ZSBzaG91bGQgdXNlLlxuICAgICAqIEl0IHdpbGwgYWxzbyBzZXQgdGhlIGRlZmF1bHQgTVRVIGJhc2VkIG9uIHZlcnNpb24uXG4gICAgICogQHBhcmFtIHsgbnVtYmVyIH0gdmVyc2lvbiBtYWpvciB2ZXJzaW9uIHRvIHVzZVxuICAgICAqL1xuICAgIF9zZXRWZXJzaW9uICh2ZXJzaW9uKSB7XG4gICAgICAgIGlmICh2ZXJzaW9uID4gNSkge1xuICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2xWZXJzaW9uID0gbmV3IFZlcnNpb24oJzUuMS4wJyk7IC8vIHByb3RlY3QgZm9yIGZ1dHVyZSwgcHJveHkgb25seSBzdXBwb3J0cyB2NSBvciBsb3dlclxuICAgICAgICAgICAgdGhpcy5oZWFkZXJTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5WMl9IRUFERVJfU0laRTtcbiAgICAgICAgICAgIHRoaXMuX210dXNbU2VydmljZVR5cGUuUlBDXSA9IHRoaXMuY29uc3RydWN0b3IuVjNfVjRfTVRVX1NJWkU7XG4gICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PT0gNSkge1xuICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2xWZXJzaW9uID0gbmV3IFZlcnNpb24oJzUuMC4wJyk7XG4gICAgICAgICAgICB0aGlzLmhlYWRlclNpemUgPSB0aGlzLmNvbnN0cnVjdG9yLlYyX0hFQURFUl9TSVpFO1xuICAgICAgICAgICAgdGhpcy5fbXR1c1tTZXJ2aWNlVHlwZS5SUENdID0gdGhpcy5jb25zdHJ1Y3Rvci5WM19WNF9NVFVfU0laRTtcbiAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09PSA0KSB7XG4gICAgICAgICAgICB0aGlzLl9wcm90b2NvbFZlcnNpb24gPSBuZXcgVmVyc2lvbignNC4wLjAnKTtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyU2l6ZSA9IHRoaXMuY29uc3RydWN0b3IuVjJfSEVBREVSX1NJWkU7XG4gICAgICAgICAgICB0aGlzLl9tdHVzW1NlcnZpY2VUeXBlLlJQQ10gPSB0aGlzLmNvbnN0cnVjdG9yLlYzX1Y0X01UVV9TSVpFOyAvLyB2ZXJzaW9ucyA0IHN1cHBvcnRzIDEyOGsgTVRVXG4gICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PT0gMykge1xuICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2xWZXJzaW9uID0gbmV3IFZlcnNpb24oJzMuMC4wJyk7XG4gICAgICAgICAgICB0aGlzLmhlYWRlclNpemUgPSB0aGlzLmNvbnN0cnVjdG9yLlYyX0hFQURFUl9TSVpFO1xuICAgICAgICAgICAgdGhpcy5fbXR1c1tTZXJ2aWNlVHlwZS5SUENdID0gdGhpcy5jb25zdHJ1Y3Rvci5WM19WNF9NVFVfU0laRTsgLy8gdmVyc2lvbnMgMyBzdXBwb3J0cyAxMjhrIE1UVVxuICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT09IDIpIHtcbiAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sVmVyc2lvbiA9IG5ldyBWZXJzaW9uKCcyLjAuMCcpO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5WMl9IRUFERVJfU0laRTtcbiAgICAgICAgICAgIHRoaXMuX210dXNbU2VydmljZVR5cGUuUlBDXSA9IHRoaXMuY29uc3RydWN0b3IuVjFfVjJfTVRVX1NJWkUgLSB0aGlzLmhlYWRlclNpemU7XG4gICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2xWZXJzaW9uID0gbmV3IFZlcnNpb24oJzEuMC4wJyk7XG4gICAgICAgICAgICB0aGlzLmhlYWRlclNpemUgPSB0aGlzLmNvbnN0cnVjdG9yLlYxX0hFQURFUl9TSVpFO1xuICAgICAgICAgICAgdGhpcy5fbXR1c1tTZXJ2aWNlVHlwZS5SUENdID0gdGhpcy5jb25zdHJ1Y3Rvci5WMV9WMl9NVFVfU0laRSAtIHRoaXMuaGVhZGVyU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIHNkbFBhY2tldC5cbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgc2VuZFBhY2tldCAoc2RsUGFja2V0KSB7XG4gICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnRNYW5hZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRNYW5hZ2VyLnNlbmRQYWNrZXQoc2RsUGFja2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNlc3Npb25JZCBpbiB1c2UuXG4gICAgICogQHJldHVybnMge051bWJlcn1cbiAgICAgKi9cbiAgICBfZ2V0U2Vzc2lvbklkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NkbFByb3RvY29sTGlzdGVuZXIuZ2V0U2Vzc2lvbklkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmV4dCBhdmFpbGFibGUgbWVzc2FnZUlEIGZvciBzZW5kaW5nIHJlcXVlc3RzLlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gICAgX2dldE5leHRNZXNzYWdlSUQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUlEKys7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGFrZXMgYW4gcnBjIG1lc3NhZ2UgYW5kIHNlbmRzIGEgc2luZ2xlIG9yIG11bHRpIGZyYW1lIHBhY2tldHMuXG4gICAgICogQHBhcmFtIHtScGNSZXF1ZXN0fSBycGNNZXNzYWdlXG4gICAgICovXG4gICAgc2VuZFJwYyAocnBjUmVxdWVzdCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5fZ2V0U2Vzc2lvbklkKCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJRCA9IHRoaXMuX2dldE5leHRNZXNzYWdlSUQoKTtcbiAgICAgICAgY29uc3QgbXR1ID0gc2VsZi5fbXR1c1tTZXJ2aWNlVHlwZS5SUENdO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gc2VsZi5fcHJvdG9jb2xWZXJzaW9uLmdldE1ham9yKCk7XG4gICAgICAgIGNvbnN0IGlzRW5jcnlwdGVkID0gcnBjUmVxdWVzdC5nZXRJc0VuY3J5cHRlZCgpO1xuXG4gICAgICAgIE1lc3NhZ2VGcmFtZURpc2Fzc2VtYmxlci5idWlsZFJQQyhycGNSZXF1ZXN0LCBzZXNzaW9uSWQsIG1lc3NhZ2VJRCwgbXR1LCB2ZXJzaW9uLCBpc0VuY3J5cHRlZCwgZnVuY3Rpb24gKHNkbFBhY2tldCkge1xuICAgICAgICAgICAgc2VsZi5zZW5kUGFja2V0KHNkbFBhY2tldCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgaW5jb21pbmcgcGFja2V0cy5cbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgX2hhbmRsZVBhY2tldFJlY2VpdmVkIChzZGxQYWNrZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Byb3RvY29sVmVyc2lvbiA9PT0gbnVsbCB8fCB0aGlzLl9wcm90b2NvbFZlcnNpb24uZ2V0TWFqb3IoKSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0VmVyc2lvbihzZGxQYWNrZXQuZ2V0VmVyc2lvbigpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcmFtZVR5cGUgPSBzZGxQYWNrZXQuZ2V0RnJhbWVUeXBlKCk7XG4gICAgICAgIGlmIChmcmFtZVR5cGUgPT09IEZyYW1lVHlwZS5DT05UUk9MKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlQ29udHJvbFBhY2tldChzZGxQYWNrZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZUZyYW1lQXNzZW1ibGVyID0gdGhpcy5fZ2V0TWVzc2FnZUZyYW1lQXNzZW1ibGVyKHNkbFBhY2tldCk7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZUZyYW1lQXNzZW1ibGVyLmhhbmRsZUZyYW1lKHNkbFBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIG5vbi1jb250cm9sIHBhY2tldHMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gYXNzZW1ibGVkLlxuICAgICAqIEBwYXJhbSB7U2RsUGFja2V0fSBzZGxQYWNrZXRcbiAgICAgKi9cbiAgICBfaGFuZGxlT25NZXNzYWdlQXNzZW1ibGVkIChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZVR5cGUgPSBzZGxQYWNrZXQuZ2V0U2VydmljZVR5cGUoKTtcblxuICAgICAgICBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLlJQQyB8fCBzZXJ2aWNlVHlwZSA9PT0gU2VydmljZVR5cGUuSFlCUklEKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlUlBDUGFja2V0KHNkbFBhY2tldCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLkhZQlJJRCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZVJQQ1BhY2tldChzZGxQYWNrZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdVbmhhbmRsZWQgc2VydmljZSB0eXBlICcsIHNkbFBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1lc3NhZ2UgZnJhbWUgYXNzZW1ibGVyIGZvciB0aGUgcGFja2V0LlxuICAgICAqIEBwYXJhbSB7U2RsUGFja2V0fSBzZGxQYWNrZXRcbiAgICAgKi9cbiAgICBfZ2V0TWVzc2FnZUZyYW1lQXNzZW1ibGVyIChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGxldCBtZXNzYWdlRnJhbWVBc3NlbWJsZXIgPSBzZWxmLl9tZXNzYWdlRnJhbWVBc3NlbWJsZXJzW3NkbFBhY2tldC5nZXRNZXNzYWdlSUQoKV07XG4gICAgICAgIGlmICghbWVzc2FnZUZyYW1lQXNzZW1ibGVyKSB7XG4gICAgICAgICAgICBtZXNzYWdlRnJhbWVBc3NlbWJsZXIgPSBuZXcgTWVzc2FnZUZyYW1lQXNzZW1ibGVyKGZ1bmN0aW9uIChlcnIsIHNkbFBhY2tldCkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNlbGYuX21lc3NhZ2VGcmFtZUFzc2VtYmxlcnNbc2RsUGFja2V0LmdldE1lc3NhZ2VJRCgpXSA9IG51bGw7IC8vIFJlbW92ZSB0aGUgbWFwcGluZ1xuICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZU9uTWVzc2FnZUFzc2VtYmxlZChzZGxQYWNrZXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxmLl9tZXNzYWdlRnJhbWVBc3NlbWJsZXJzW3NkbFBhY2tldC5nZXRNZXNzYWdlSUQoKV0gPSBtZXNzYWdlRnJhbWVBc3NlbWJsZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVzc2FnZUZyYW1lQXNzZW1ibGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgaW5jb21pbmcgY29udHJvbCBwYWNrZXRzLlxuICAgICAqIEBwYXJhbSB7IFNkbFBhY2tldCB9IHNkbFBhY2tldFxuICAgICAqL1xuICAgIF9oYW5kbGVDb250cm9sUGFja2V0IChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc3QgZnJhbWVJbmZvID0gc2RsUGFja2V0LmdldEZyYW1lSW5mbygpO1xuXG4gICAgICAgIGlmIChmcmFtZUluZm8gPT09IFNkbFBhY2tldC5GUkFNRV9JTkZPX0hFQVJUX0JFQVQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVQcm90b2NvbEhlYXJ0YmVhdChzZGxQYWNrZXQpO1xuICAgICAgICB9IGVsc2UgaWYgKGZyYW1lSW5mbyA9PT0gU2RsUGFja2V0LkZSQU1FX0lORk9fSEVBUlRfQkVBVF9BQ0spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVQcm90b2NvbEhlYXJ0YmVhdEFDSyhzZGxQYWNrZXQpO1xuICAgICAgICB9IGVsc2UgaWYgKGZyYW1lSW5mbyA9PT0gU2RsUGFja2V0LkZSQU1FX0lORk9fU1RBUlRfU0VSVklDRV9BQ0spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVTdGFydFNlcnZpY2VBQ0soc2RsUGFja2V0KTtcbiAgICAgICAgfSBlbHNlIGlmIChmcmFtZUluZm8gPT09IFNkbFBhY2tldC5GUkFNRV9JTkZPX1NUQVJUX1NFUlZJQ0VfTkFLKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlU3RhcnRTZXJ2aWNlTkFLKHNkbFBhY2tldCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZnJhbWVJbmZvID09PSBTZGxQYWNrZXQuRlJBTUVfSU5GT19FTkRfU0VSVklDRV9BQ0spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVFbmRTZXJ2aWNlQUNLKHNkbFBhY2tldCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZnJhbWVJbmZvID09PSBTZGxQYWNrZXQuRlJBTUVfSU5GT19FTkRfU0VSVklDRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUVuZFNlcnZpY2Uoc2RsUGFja2V0KTtcbiAgICAgICAgfSBlbHNlIGlmIChmcmFtZUluZm8gPT09IFNkbFBhY2tldC5GUkFNRV9JTkZPX0VORF9TRVJWSUNFX05BSykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUVuZFNlcnZpY2VOQUsoc2RsUGFja2V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVW5oYW5kbGVkIGNvbnRyb2wgcGFja2V0JywgeyBmcmFtZUluZm8gfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBoZWFydGJlYXQgKE9ubHkgYXZhaWxhYmxlIGluIHByb3RvY29sIHZlcnNpb24gMylcbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgX2hhbmRsZVByb3RvY29sSGVhcnRiZWF0IChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc3QgaGVhcnRiZWF0ID0gU2RsUGFja2V0RmFjdG9yeS5jcmVhdGVIZWFydGJlYXRBQ0soXG4gICAgICAgICAgICBTZXJ2aWNlVHlwZS5DT05UUk9MLFxuICAgICAgICAgICAgdGhpcy5fZ2V0U2Vzc2lvbklkKCksXG4gICAgICAgICAgICB0aGlzLl9wcm90b2NvbFZlcnNpb24uZ2V0TWFqb3IoKSk7XG4gICAgICAgIHRoaXMuc2VuZFBhY2tldChoZWFydGJlYXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgaGVhcnRiZWF0IEFDSy5cbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgX2hhbmRsZVByb3RvY29sSGVhcnRiZWF0QUNLIChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlY2VpdmVkIEhlYXJ0YmVhdEFDSyAtICR7c2RsUGFja2V0LnRvU3RyaW5nKCl9YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBzdGFydCBzZXJ2aWNlIEFDSy4gU2V0cyB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbiwgTVRVLCBhbmQgb3RoZXJcbiAgICAgKiBzZXJ2aWNlIHJlbGF0ZWQgaW5mby5cbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgX2hhbmRsZVN0YXJ0U2VydmljZUFDSyAoc2RsUGFja2V0KSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSBzZGxQYWNrZXQuZ2V0VmVyc2lvbigpO1xuICAgICAgICBjb25zdCBzZXJ2aWNlVHlwZSA9IHNkbFBhY2tldC5nZXRTZXJ2aWNlVHlwZSgpO1xuICAgICAgICBpZiAodmVyc2lvbiA+PSA1KSB7XG4gICAgICAgICAgICBsZXQgbXR1VGFnID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChzZXJ2aWNlVHlwZSA9PT0gU2VydmljZVR5cGUuUlBDKSB7XG4gICAgICAgICAgICAgICAgbXR1VGFnID0gQ29udHJvbEZyYW1lVGFncy5SUEMuU3RhcnRTZXJ2aWNlQUNLLk1UVTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZVR5cGUgPT09IChTZXJ2aWNlVHlwZS5QQ00pKSB7XG4gICAgICAgICAgICAgICAgbXR1VGFnID0gQ29udHJvbEZyYW1lVGFncy5BdWRpby5TdGFydFNlcnZpY2VBQ0suTVRVO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlVHlwZSA9PT0gKFNlcnZpY2VUeXBlLk5BVikpIHtcbiAgICAgICAgICAgICAgICBtdHVUYWcgPSBDb250cm9sRnJhbWVUYWdzLlZpZGVvLlN0YXJ0U2VydmljZUFDSy5NVFU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtdHUgPSBzZGxQYWNrZXQuZ2V0VGFnKG10dVRhZyk7XG5cbiAgICAgICAgICAgIGlmIChtdHUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tdHVzW3NlcnZpY2VUeXBlXSA9IG10dTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZXJ2aWNlVHlwZSA9PT0gU2VydmljZVR5cGUuUlBDKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbklEID0gc2RsUGFja2V0LmdldFNlc3Npb25JRCgpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gaGFuZGxlIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBwcm90b2NvbCB3aGVyZSB0aGlzIHdhcyBqdXN0IHRoZWlyIHBheWxvYWQsIG5vIEJTT05cbiAgICAgICAgICAgICAgICB0aGlzLl9oYXNoSUQgPSBzZGxQYWNrZXQuZ2V0VGFnKENvbnRyb2xGcmFtZVRhZ3MuUlBDLlN0YXJ0U2VydmljZUFDSy5IQVNIX0lEKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gc2RsUGFja2V0LmdldFRhZyhDb250cm9sRnJhbWVUYWdzLlJQQy5TdGFydFNlcnZpY2VBQ0suUFJPVE9DT0xfVkVSU0lPTik7XG4gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGNvbmZpcm1lZCB0aGUgbmVnb3RpYXRlZCB2ZXJzaW9uIGJldHdlZW4gdGhlIG1vZHVsZSBhbmQgdGhlIHByb3h5XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sVmVyc2lvbiA9IChuZXcgVmVyc2lvbigpKS5mcm9tU3RyaW5nKHZlcnNpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sVmVyc2lvbiA9IG5ldyBWZXJzaW9uKDUsIDAsIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLlZJREVPKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NkbFByb3RvY29sTGlzdGVuZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRSZXNvbHV0aW9uID0gbmV3IEltYWdlUmVzb2x1dGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2NlcHRlZEZvcm1hdCA9IG5ldyBWaWRlb1N0cmVhbWluZ0Zvcm1hdCgpO1xuICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZFJlc29sdXRpb24uc2V0UmVzb2x1dGlvbkhlaWdodChNYXRoLmZsb29yKHNkbFBhY2tldC5nZXRUYWcoQ29udHJvbEZyYW1lVGFncy5WaWRlby5TdGFydFNlcnZpY2VBQ0suSEVJR0hUKSkpO1xuICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZFJlc29sdXRpb24uc2V0UmVzb2x1dGlvbldpZHRoKE1hdGguZmxvb3Ioc2RsUGFja2V0LmdldFRhZyhDb250cm9sRnJhbWVUYWdzLlZpZGVvLlN0YXJ0U2VydmljZUFDSy5XSURUSCkpKTtcblxuICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZEZvcm1hdC5zZXRDb2RlYyhzZGxQYWNrZXQuZ2V0VGFnKENvbnRyb2xGcmFtZVRhZ3MuVmlkZW8uU3RhcnRTZXJ2aWNlQUNLLlZJREVPX0NPREVDKSk7XG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkRm9ybWF0LnNldFByb3RvY29sKHNkbFBhY2tldC5nZXRUYWcoQ29udHJvbEZyYW1lVGFncy5WaWRlby5TdGFydFNlcnZpY2VBQ0suVklERU9fUFJPVE9DT0wpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWdyZWVkVmlkZW9QYXJhbXMgPSB0aGlzLl9zZGxQcm90b2NvbExpc3RlbmVyLmdldERlc2lyZWRWaWRlb1BhcmFtcygpO1xuICAgICAgICAgICAgICAgICAgICBhZ3JlZWRWaWRlb1BhcmFtcy5zZXRSZXNvbHV0aW9uKGFjY2VwdGVkUmVzb2x1dGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGFncmVlZFZpZGVvUGFyYW1zLnNldEZvcm1hdChhY2NlcHRlZEZvcm1hdCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2xMaXN0ZW5lci5zZXRBY2NlcHRlZFZpZGVvUGFyYW1zKGFncmVlZFZpZGVvUGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcHJvdG9jb2xWZXJzaW9uLmdldE1ham9yKCkgPiAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHNkbFBhY2tldC5nZXRQYXlsb2FkKCk7XG4gICAgICAgICAgICAgICAgaWYgKHBheWxvYWQgIT09IG51bGwgJiYgcGF5bG9hZC5sZW5ndGggPT09IDQpIHsgLy8gaGFzaGlkIHdpbGwgYmUgNCBieXRlcyBpbiBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFzaElEID0gQml0Q29udmVydGVyLmFycmF5QnVmZmVyVG9JbnQzMihwYXlsb2FkLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2xMaXN0ZW5lci5vblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQoc2VydmljZVR5cGUsXG4gICAgICAgICAgICBzZGxQYWNrZXQuZ2V0U2Vzc2lvbklEKCksIHRoaXMuX3Byb3RvY29sVmVyc2lvbi5nZXRNYWpvcigpLCAnJywgdGhpcy5faGFzaElELCBzZGxQYWNrZXQuZ2V0RW5jcnlwdGlvbigpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHN0YXJ0IHNlcnZpY2UgcmVqZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7U2RsUGFja2V0fSBzZGxQYWNrZXRcbiAgICAgKi9cbiAgICBfaGFuZGxlU3RhcnRTZXJ2aWNlTkFLIChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBgR290IFN0YXJ0U2Vzc2lvbk5BQ0sgZm9yIHByb3RvY29sIHNlc3Npb25JRCAke3NkbFBhY2tldC5nZXRTZXNzaW9uSUQoKX1gO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBzZXJ2aWNlIGVuZGVkIGJ5IGFwcCBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7U2RsUGFja2V0fSBzZGxQYWNrZXRcbiAgICAgKi9cbiAgICBfaGFuZGxlRW5kU2VydmljZUFDSyAoc2RsUGFja2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVTZXJ2aWNlRW5kZWQoc2RsUGFja2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJ2aWNlIGVuZGVkIGJ5IG5vbiBhcHAgcHJvY2VzcyBvciBmb3Igc29tZSB1bmV4cGVjdGVkIHJlYXNvbi5cbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgX2hhbmRsZUVuZFNlcnZpY2UgKHNkbFBhY2tldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlU2VydmljZUVuZGVkKHNkbFBhY2tldCk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHNlcml2Y2UgZW5kaW5nLlxuICAgICAqIEBwYXJhbSB7Kn0gc2RsUGFja2V0XG4gICAgICovXG4gICAgX2hhbmRsZVNlcnZpY2VFbmRlZCAoc2RsUGFja2V0KSB7XG4gICAgICAgIHRoaXMuX3NkbFByb3RvY29sTGlzdGVuZXIub25Qcm90b2NvbFNlc3Npb25FbmRlZChzZGxQYWNrZXQuZ2V0U2VydmljZVR5cGUoKSwgc2RsUGFja2V0LmdldFNlc3Npb25JRCgpLCAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBzZXJ2aWNlIGVuZCByZWplY3Rpb24uXG4gICAgICogQHBhcmFtIHtTZGxQYWNrZXR9IHNkbFBhY2tldFxuICAgICAqL1xuICAgIF9oYW5kbGVFbmRTZXJ2aWNlTkFLIChzZGxQYWNrZXQpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZVR5cGUgPSBzZGxQYWNrZXQuZ2V0U2VydmljZVR5cGUoKTtcbiAgICAgICAgY29uc3QgcHJvdG9jb2xWZXJzaW9uID0gc2RsUGFja2V0LmdldFZlcnNpb24oKTtcbiAgICAgICAgaWYgKHByb3RvY29sVmVyc2lvbiA+PSA1KSB7XG4gICAgICAgICAgICBsZXQgcmVqZWN0ZWRUYWcgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHNlcnZpY2VUeXBlID09PSBTZXJ2aWNlVHlwZS5BVURJTykge1xuICAgICAgICAgICAgICAgIHJlamVjdGVkVGFnID0gQ29udHJvbEZyYW1lVGFncy5BdWRpby5FbmRTZXJ2aWNlTkFLLlJFSkVDVEVEX1BBUkFNUztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLlZJREVPKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0ZWRUYWcgPSBDb250cm9sRnJhbWVUYWdzLlZpZGVvLkVuZFNlcnZpY2VOQUsuUkVKRUNURURfUEFSQU1TO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVqZWN0ZWRQYXJhbXMgPSBzZGxQYWNrZXQuZ2V0VGFnKHJlamVjdGVkVGFnKTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlamVjdGVkUGFyYW1zKSAmJiByZWplY3RlZFBhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignR290IEVuZFNlc3Npb25OQUsgd2l0aCByZWplY3RlZCBwYXJhbXMnLCByZWplY3RlZFBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2xMaXN0ZW5lci5vblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkKHNlcnZpY2VUeXBlLCBzZGxQYWNrZXQuZ2V0U2Vzc2lvbklEKCksICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGluY29taW5nIGFzc2VtYmxlZCBycGMgcGFja2V0LlxuICAgICAqIE5vdGlmaWVzIHNkbFByb3RvY29sTGlzdGVuZXIgb2YgdGhlIGV2ZW50IGFmdGVyIGFzc2VtYmxlaW5nIGFuIFJwY01lc3NhZ2VcbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgX2hhbmRsZVJQQ1BhY2tldCAoc2RsUGFja2V0KSB7XG4gICAgICAgIGNvbnN0IHJwY01lc3NhZ2UgPSBScGNDcmVhdG9yLmNvbnN0cnVjdChzZGxQYWNrZXQpO1xuICAgICAgICBpZiAocnBjTWVzc2FnZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2xMaXN0ZW5lci5vblJwY01lc3NhZ2VSZWNlaXZlZChycGNNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuZHMgdGhlIGRlZmF1bHQgc2Vzc2lvbi5cbiAgICAgKi9cbiAgICBlbmRTZXNzaW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5fZ2V0U2Vzc2lvbklkKCk7XG4gICAgICAgIGNvbnN0IGhhc2hJRCA9IHRoaXMuX2hhc2hJRDtcbiAgICAgICAgY29uc3Qgc2VydmljZVR5cGUgPSBTZXJ2aWNlVHlwZS5SUEM7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJRCA9IHRoaXMuX2dldE5leHRNZXNzYWdlSUQoKTtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuX3Byb3RvY29sVmVyc2lvbi5nZXRNYWpvcigpO1xuICAgICAgICBjb25zdCBzZGxQYWNrZXQgPSBTZGxQYWNrZXRGYWN0b3J5LmNyZWF0ZUVuZFNlc3Npb24oc2VydmljZVR5cGUsIHNlc3Npb25JZCwgbWVzc2FnZUlELCB2ZXJzaW9uLCBoYXNoSUQpO1xuICAgICAgICB0aGlzLnNlbmRQYWNrZXQoc2RsUGFja2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmRzIGEgc3BlY2lmaWMgc2VydmljZVxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlIC0gU2VydmljZSB0eXBlIGJlaW5nIGVuZGVkLiBXaGVuIHRoZSBSUEMgc2VydmljZSBpcyBlbmRlZCB0aGUgZW50aXJlIHNlc3Npb24gZW5kcy5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc2Vzc2lvbklkIC0gcmVwcmVzZW50cyBhIGJ5dGVcbiAgICAgKi9cbiAgICBlbmRTZXJ2aWNlIChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklkKSB7XG4gICAgICAgIGlmIChzZXJ2aWNlVHlwZSA9PT0gU2VydmljZVR5cGUuUlBDKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbmRTZXNzaW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBoYXNoSUQgPSB0aGlzLl9oYXNoSUQ7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlSUQgPSB0aGlzLl9nZXROZXh0TWVzc2FnZUlEKCk7XG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5fcHJvdG9jb2xWZXJzaW9uLmdldE1ham9yKCk7XG4gICAgICAgICAgICBjb25zdCBzZGxQYWNrZXQgPSBTZGxQYWNrZXRGYWN0b3J5LmNyZWF0ZUVuZFNlc3Npb24oc2VydmljZVR5cGUsIHNlc3Npb25JZCwgbWVzc2FnZUlELCB2ZXJzaW9uLCBoYXNoSUQpO1xuICAgICAgICAgICAgdGhpcy5zZW5kUGFja2V0KHNkbFBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogT3JpZ2luYWwgaGVhZGVyIHNpemUgYmFzZWQgb24gdmVyc2lvbiAxLjAuMCBvbmx5XG4gKi9cblNkbFByb3RvY29sQmFzZS5WMV9IRUFERVJfU0laRSA9IDg7XG4vKipcbiAqIExhcmdlciBoZWFkZXIgc2l6ZSB0aGF0IGlzIHVzZWQgYnkgdmVyc2lvbnMgMi4wLjAgYW5kIHVwXG4gKi9cblNkbFByb3RvY29sQmFzZS5WMl9IRUFERVJfU0laRSA9IDEyO1xuXG5TZGxQcm90b2NvbEJhc2UuVjFfVjJfTVRVX1NJWkUgPSAxNTAwO1xuU2RsUHJvdG9jb2xCYXNlLlYzX1Y0X01UVV9TSVpFID0gMTMxMDcyO1xuXG4vKipcbiAqIE1heCBzdXBwb3J0ZWQgcHJvdG9jb2wgdmVyc2lvbiBpbiB0aGlzIHJlbGVhc2Ugb2YgdGhlIGxpYnJhcnlcbiovXG5TZGxQcm90b2NvbEJhc2UuTUFYX1BST1RPQ09MX1ZFUlNJT04gPSBuZXcgVmVyc2lvbig1LCAyLCAwKTtcblxuZXhwb3J0IHsgU2RsUHJvdG9jb2xCYXNlIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IFRyYW5zcG9ydFR5cGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFRyYW5zcG9ydFR5cGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtTdHJpbmd9XG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0IFdFQlNPQ0tFVF9DTElFTlQgKCkge1xuICAgICAgICByZXR1cm4gVHJhbnNwb3J0VHlwZS5fTUFQLldFQlNPQ0tFVF9DTElFTlQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge1N0cmluZ31cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQgV0VCU09DS0VUX1NFUlZFUiAoKSB7XG4gICAgICAgIHJldHVybiBUcmFuc3BvcnRUeXBlLl9NQVAuV0VCU09DS0VUX1NFUlZFUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSB7U3RyaW5nfVxuICAgICovXG4gICAgc3RhdGljIGdldCBDVVNUT00gKCkge1xuICAgICAgICByZXR1cm4gVHJhbnNwb3J0VHlwZS5fTUFQLkNVU1RPTTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICogQHBhcmFtIHZhbHVlIC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gVHJhbnNwb3J0VHlwZS5fdmFsdWVGb3JLZXkoa2V5LCBUcmFuc3BvcnRUeXBlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBUcmFuc3BvcnRUeXBlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgVHJhbnNwb3J0VHlwZS5fTUFQKTtcbiAgICB9XG59XG5cblRyYW5zcG9ydFR5cGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdXRUJTT0NLRVRfQ0xJRU5UJzogJ1dFQlNPQ0tFVF9DTElFTlQnLFxuICAgICdXRUJTT0NLRVRfU0VSVkVSJzogJ1dFQlNPQ0tFVF9TRVJWRVInLFxuICAgICdDVVNUT00nOiAnQ1VTVE9NJyxcbn0pO1xuXG5leHBvcnQgeyBUcmFuc3BvcnRUeXBlIH07IiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4gKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiAqIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuICogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4gKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbmltcG9ydCB7IEZyYW1lVHlwZSB9IGZyb20gJy4uL3Byb3RvY29sL2VudW1zL0ZyYW1lVHlwZS5qcyc7XG5pbXBvcnQgeyBTZGxQYWNrZXQgfSBmcm9tICcuLi9wcm90b2NvbC9TZGxQYWNrZXQuanMnO1xuaW1wb3J0IHsgU2RsUHJvdG9jb2xCYXNlIH0gZnJvbSAnLi4vcHJvdG9jb2wvU2RsUHJvdG9jb2xCYXNlLmpzJztcblxuLyoqXG4gKiBQYXJzZXMgaW5jb21pbmcgYnl0ZXMgYWNjb3JkaW5nIHRvIHRoZSBwcm90b2NvbCBzcGVjLlxuICovXG5jbGFzcyBTZGxQc20ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYWxsIGludGVybmFsIG1lbWJlcnMgdG8gZGVmYXVsdFxuICAgICAqL1xuICAgIHJlc2V0ICgpIHtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBTZGxQc20uU1RBUlRfU1RBVEU7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSAwO1xuICAgICAgICB0aGlzLl9lbmNyeXB0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2ZyYW1lVHlwZSA9IEZyYW1lVHlwZS5TSU5HTEU7XG4gICAgICAgIHRoaXMuX3NlcnZpY2VUeXBlID0gMDtcbiAgICAgICAgdGhpcy5fY29udHJvbEZyYW1lSW5mbyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3Nlc3Npb25JRCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2R1bXBTaXplID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZGF0YUxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VJRCA9IDA7XG4gICAgICAgIHRoaXMuX3BheWxvYWQgPSBudWxsO1xuICAgIH1cblxuXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IC0gU3RhdGUgcmVwcmVzZW50ZWQgYnkgYSBOdW1iZXJcbiAgICAgKi9cbiAgICBnZXRTdGF0ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTZGxQYWNrZXR9IC0gUmV0dXJucyBudWxsIGlmIG5vdCBjb21wbGV0ZVxuICAgICAqL1xuXG4gICAgZ2V0Rm9ybWVkUGFja2V0ICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBTZGxQc20uRklOSVNIRURfU1RBVEUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2RsUGFja2V0KHRoaXMuX3ZlcnNpb24sIHRoaXMuX2VuY3J5cHRpb24sIHRoaXMuX2ZyYW1lVHlwZSwgdGhpcy5fc2VydmljZVR5cGUsIHRoaXMuX2NvbnRyb2xGcmFtZUluZm8sIHRoaXMuX3Nlc3Npb25JRCwgdGhpcy5fZGF0YUxlbmd0aCwgdGhpcy5fbWVzc2FnZUlELCB0aGlzLl9wYXlsb2FkLCAwLCB0aGlzLl9kYXRhTGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB0aGUgbmV4dCBieXRlIGluIHRoZSBzdHJlYW0gb2YgZGF0YS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZGF0YSAtIFJlcHJlc2VudHMgYSBieXRlXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gLSBUcnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIGhhbmRsZUJ5dGUgKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSB0aGlzLl90cmFuc2l0aW9uT25JbnB1dChkYXRhLCB0aGlzLl9zdGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gU2RsUHNtLkVSUk9SX1NUQVRFKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJhd0J5dGUgLSBSZXByZXNlbnRzIGEgYnl0ZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzdGF0ZVxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdHJhbnNpdGlvbk9uSW5wdXQgKHJhd0J5dGUsIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gU2RsUHNtLlNUQVJUX1NUQVRFKSB7IC8vIGJ5dGUgMVxuICAgICAgICAgICAgdGhpcy5fdmVyc2lvbiA9IChyYXdCeXRlICYgU2RsUHNtLlZFUlNJT05fTUFTSykgPj4gNDtcbiAgICAgICAgICAgIGlmICh0aGlzLl92ZXJzaW9uID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5FUlJPUl9TVEFURTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZW5jcnlwdGlvbiA9ICgxID09PSAoKHJhd0J5dGUgJiBTZGxQc20uRU5DUllQVElPTl9NQVNLKSA+PiAzKSk7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZVR5cGUgPSByYXdCeXRlICYgU2RsUHNtLkZSQU1FX1RZUEVfTUFTSztcblxuICAgICAgICAgICAgaWYgKCh0aGlzLl92ZXJzaW9uIDwgMSB8fCB0aGlzLl92ZXJzaW9uID4gNSkgJiYgdGhpcy5fZnJhbWVUeXBlICE9PSBGcmFtZVR5cGUuQ09OVFJPTCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTZGxQc20uRVJST1JfU1RBVEU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9mcmFtZVR5cGUgPCBGcmFtZVR5cGUuQ09OVFJPTCB8fCB0aGlzLl9mcmFtZVR5cGUgPiBGcmFtZVR5cGUuQ09OU0VDVVRJVkUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkVSUk9SX1NUQVRFO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5TRVJWSUNFX1RZUEVfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNkbFBzbS5TRVJWSUNFX1RZUEVfU1RBVEUpIHsgLy8gYnl0ZSAyXG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlVHlwZSA9IChyYXdCeXRlICYgMHhGRik7XG5cbiAgICAgICAgICAgIHJldHVybiBTZGxQc20uQ09OVFJPTF9GUkFNRV9JTkZPX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBTZGxQc20uQ09OVFJPTF9GUkFNRV9JTkZPX1NUQVRFKSB7IC8vIGJ5dGUgM1xuICAgICAgICAgICAgdGhpcy5fY29udHJvbEZyYW1lSW5mbyA9IHJhd0J5dGUgJiAweEZGO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX2ZyYW1lVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgRnJhbWVUeXBlLkNPTlRST0w6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRnJhbWVUeXBlLlNJTkdMRTogLy8gRmFsbCB0aHJvdWdoIHNpbmNlIHRoZXkgYXJlIGJvdGggdGhlIHNhbWVcbiAgICAgICAgICAgICAgICBjYXNlIEZyYW1lVHlwZS5GSVJTVDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2xGcmFtZUluZm8gIT09IDB4MDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTZGxQc20uRVJST1JfU1RBVEU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBGcmFtZVR5cGUuQ09OU0VDVVRJVkU6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5FUlJPUl9TVEFURTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBTZGxQc20uU0VTU0lPTl9JRF9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU2RsUHNtLlNFU1NJT05fSURfU1RBVEUpIHsgLy8gYnl0ZSA0XG4gICAgICAgICAgICB0aGlzLl9zZXNzaW9uSUQgPSAocmF3Qnl0ZSAmIDB4RkYpO1xuICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5EQVRBX1NJWkVfMV9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU2RsUHNtLkRBVEFfU0laRV8xX1NUQVRFKSB7IC8vIGJ5dGUgNVxuICAgICAgICAgICAgdGhpcy5fZGF0YUxlbmd0aCArPSAocmF3Qnl0ZSAmIDB4RkYpIDw8IDI0O1xuICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5EQVRBX1NJWkVfMl9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU2RsUHNtLkRBVEFfU0laRV8yX1NUQVRFKSB7IC8vIGJ5dGUgNlxuICAgICAgICAgICAgdGhpcy5fZGF0YUxlbmd0aCArPSAocmF3Qnl0ZSAmIDB4RkYpIDw8IDE2OyAvLyAjIDIgYnl0ZXMgeCA4IGJpdHNcbiAgICAgICAgICAgIHJldHVybiBTZGxQc20uREFUQV9TSVpFXzNfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNkbFBzbS5EQVRBX1NJWkVfM19TVEFURSkgeyAvLyBieXRlIDdcbiAgICAgICAgICAgIHRoaXMuX2RhdGFMZW5ndGggKz0gKHJhd0J5dGUgJiAweEZGKSA8PCA4OyAvLyAjICAxIGJ5dGUgeCA4IGJpdHNcbiAgICAgICAgICAgIHJldHVybiBTZGxQc20uREFUQV9TSVpFXzRfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNkbFBzbS5EQVRBX1NJWkVfNF9TVEFURSkgeyAvLyBieXRlIDhcbiAgICAgICAgICAgIHRoaXMuX2RhdGFMZW5ndGggKz0gKHJhd0J5dGUgJiAweEZGKTsgLy8gIyAyIGJ5dGVzIHggOCBiaXRzXG5cbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fZnJhbWVUeXBlKSB7IC8vIElmIGFsbCBpcyBjb3JyZWN0IHdlIHNob3VsZCBicmVhayBvdXQgb2YgdGhpcyBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgICAgICAgICAgY2FzZSBGcmFtZVR5cGUuU0lOR0xFOlxuICAgICAgICAgICAgICAgIGNhc2UgRnJhbWVUeXBlLkNPTlNFQ1VUSVZFOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEZyYW1lVHlwZS5DT05UUk9MOlxuICAgICAgICAgICAgICAgIC8vIE9rLCB3ZWxsIGhlcmUncyBzb21lIGludGVyZXN0aW5nIGJpdCBvZiBrbm93bGVkZ2UuIEJlY2F1c2UgdGhlIHN0YXJ0IHNlc3Npb24gcmVxdWVzdCBpcyBmcm9tIHRoZSBwaG9uZSB3aXRoIG5vIGtub3dsZWRnZSBvZiB2ZXJzaW9uIGl0IHNlbmRzIG91dFxuICAgICAgICAgICAgICAgIC8vIGEgdjEgcGFja2V0LiBUSEVSRUZPUkUgdGhlcmUgaXMgbm8gbWVzc2FnZSBpZCBmaWVsZC4gKioqKiBOb3cgeW91IGtub3cgYW5kIGtub3dpbmcgaXMgaGFsZiB0aGUgYmF0dGxlICoqKipcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZlcnNpb24gPT09IDEgJiYgdGhpcy5fY29udHJvbEZyYW1lSW5mbyA9PT0gU2RsUGFja2V0LkZSQU1FX0lORk9fU1RBUlRfU0VSVklDRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkZJTklTSEVEX1NUQVRFOyAvLyBXZSBhcmUgZG9uZSBpZiB3ZSBkb24ndCBoYXZlIGFueSBwYXlsb2FkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZGF0YUxlbmd0aCA8PSBTZGxQcm90b2NvbEJhc2UuVjFfVjJfTVRVX1NJWkUgLSBTZGxQcm90b2NvbEJhc2UuVjFfSEVBREVSX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXlsb2FkID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fZGF0YUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTZGxQc20uRVJST1JfU1RBVEU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kdW1wU2l6ZSA9IHRoaXMuX2RhdGFMZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkRBVEFfUFVNUF9TVEFURTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgRnJhbWVUeXBlLkZJUlNUOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZGF0YUxlbmd0aCAhPT0gU2RsUHNtLkZJUlNUX0ZSQU1FX0RBVEFfU0laRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5FUlJPUl9TVEFURTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkVSUk9SX1NUQVRFO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fdmVyc2lvbiA9PT0gMSkgeyAvLyBWZXJzaW9uIDEgcGFja2V0cyB3aWxsIG5vdCBoYXZlIG1lc3NhZ2UgaWQnc1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTZGxQc20uRklOSVNIRURfU1RBVEU7IC8vIFdlIGFyZSBkb25lIGlmIHdlIGRvbid0IGhhdmUgYW55IHBheWxvYWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGFMZW5ndGggPD0gU2RsUHJvdG9jb2xCYXNlLlYxX1YyX01UVV9TSVpFIC0gU2RsUHJvdG9jb2xCYXNlLlYxX0hFQURFUl9TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BheWxvYWQgPSBuZXcgVWludDhBcnJheSh0aGlzLl9kYXRhTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkVSUk9SX1NUQVRFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9kdW1wU2l6ZSA9IHRoaXMuX2RhdGFMZW5ndGg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5EQVRBX1BVTVBfU1RBVEU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBTZGxQc20uTUVTU0FHRV8xX1NUQVRFO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBTZGxQc20uTUVTU0FHRV8xX1NUQVRFKSB7IC8vIGJ5dGUgOSwgYnl0ZXMgOS0xMiBhdmFpbGFibGUgaW4gdmVyc2lvbiAyKy5cbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VJRCArPSAocmF3Qnl0ZSAmIDB4RkYpIDw8IDI0O1xuICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5NRVNTQUdFXzJfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNkbFBzbS5NRVNTQUdFXzJfU1RBVEUpIHsgLy8gYnl0ZSAxMFxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUlEICs9IChyYXdCeXRlICYgMHhGRikgPDwgMTY7XG4gICAgICAgICAgICByZXR1cm4gU2RsUHNtLk1FU1NBR0VfM19TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU2RsUHNtLk1FU1NBR0VfM19TVEFURSkgeyAvLyBieXRlIDExXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlSUQgKz0gKHJhd0J5dGUgJiAweEZGKSA8PCA4O1xuICAgICAgICAgICAgcmV0dXJuIFNkbFBzbS5NRVNTQUdFXzRfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNkbFBzbS5NRVNTQUdFXzRfU1RBVEUpIHsgLy8gYnl0ZSAxMlxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUlEICs9IChyYXdCeXRlICYgMHhGRik7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGF0YUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTZGxQc20uRklOSVNIRURfU1RBVEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kdW1wU2l6ZSA9IHRoaXMuX2RhdGFMZW5ndGg7XG4gICAgICAgICAgICB0aGlzLl9wYXlsb2FkID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fZGF0YUxlbmd0aCk7XG4gICAgICAgICAgICByZXR1cm4gU2RsUHNtLkRBVEFfUFVNUF9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU2RsUHNtLkRBVEFfUFVNUF9TVEFURSkgeyAvLyBieXRlIDEzXG4gICAgICAgICAgICB0aGlzLl9wYXlsb2FkW3RoaXMuX2RhdGFMZW5ndGggLSB0aGlzLl9kdW1wU2l6ZV0gPSByYXdCeXRlO1xuICAgICAgICAgICAgdGhpcy5fZHVtcFNpemUgLT0gMTtcbiAgICAgICAgICAgIC8vIERvIHdlIGhhdmUgYW55IG1vcmUgYnl0ZXMgdG8gcmVhZCBpbj9cbiAgICAgICAgICAgIGlmICh0aGlzLl9kdW1wU2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkRBVEFfUFVNUF9TVEFURTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZHVtcFNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkZJTklTSEVEX1NUQVRFO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2RsUHNtLkVSUk9SX1NUQVRFO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5TZGxQc20uU1RBUlRfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDtcblNkbFBzbS5TRVJWSUNFX1RZUEVfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjtcblNkbFBzbS5DT05UUk9MX0ZSQU1FX0lORk9fU1RBVEUgICAgICAgICAgICAgICAgID0gMHgwMztcblNkbFBzbS5TRVNTSU9OX0lEX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDtcblNkbFBzbS5EQVRBX1NJWkVfMV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTtcblNkbFBzbS5EQVRBX1NJWkVfMl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNjtcblNkbFBzbS5EQVRBX1NJWkVfM19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNztcblNkbFBzbS5EQVRBX1NJWkVfNF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODtcblNkbFBzbS5NRVNTQUdFXzFfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwOTtcblNkbFBzbS5NRVNTQUdFXzJfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQTtcblNkbFBzbS5NRVNTQUdFXzNfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjtcblNkbFBzbS5NRVNTQUdFXzRfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQztcblNkbFBzbS5EQVRBX1BVTVBfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDtcblNkbFBzbS5GSU5JU0hFRF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhGRjtcblNkbFBzbS5FUlJPUl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTE7XG5cblNkbFBzbS5GSVJTVF9GUkFNRV9EQVRBX1NJWkUgICAgICAgICAgICAgICAgICAgID0gMHgwODtcblNkbFBzbS5WRVJTSU9OX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhGMDsgLy8gNCBoaWdoZXN0IGJpdHNcblNkbFBzbS5FTkNSWVBUSU9OX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODsgLy8gNHRoIGxvd2VzdCBiaXRcblNkbFBzbS5GUkFNRV9UWVBFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNzsgLy8gMyBsb3dlc3QgYml0c1xuXG5leHBvcnQgeyBTZGxQc20gfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgU2RsUHNtIH0gZnJvbSAnLi9TZGxQc20uanMnO1xuXG5jbGFzcyBUcmFuc3BvcnRCYXNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0Jhc2VUcmFuc3BvcnRDb25maWd9IHRyYW5zcG9ydENvbmZpZ1xuICAgICAqIEBwYXJhbSB7VHJhbnNwb3J0Q2FsbGJhY2t9IHRyYW5zcG9ydENhbGxiYWNrXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKHRyYW5zcG9ydENvbmZpZywgdHJhbnNwb3J0Q2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fc2RsUHNtID0gbmV3IFNkbFBzbSgpO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRDb25maWcgPSB0cmFuc3BvcnRDb25maWc7XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrID0gdHJhbnNwb3J0Q2FsbGJhY2s7XG4gICAgfVxuXG4gICAgc3RhcnQgKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YXJ0IG1ldGhvZCBtdXN0IGJlIG92ZXJyaWRkZW4nKTtcbiAgICB9XG5cbiAgICBzdG9wICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdG9wIG1ldGhvZCBtdXN0IGJlIG92ZXJyaWRkZW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgc2VuZFBhY2tldCAoc2RsUGFja2V0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc2VuZFBhY2tldCBtZXRob2QgbXVzdCBiZSBvdmVycmlkZGVuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUcmFuc3BvcnRDYWxsYmFja30gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBzZXRUcmFuc3BvcnRDYWxsYmFjayAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUcmFuc3BvcnRDYWxsYmFjayBtZXRob2QgbXVzdCBiZSBvdmVycmlkZGVuJyk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBUcmFuc3BvcnRCYXNlIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgVHJhbnNwb3J0QmFzZSB9IGZyb20gJy4vVHJhbnNwb3J0QmFzZS5qcyc7XG5pbXBvcnQgeyBTZGxQc20gfSBmcm9tICcuL1NkbFBzbS5qcyc7XG5cbmNsYXNzIFdlYlNvY2tldENsaWVudCBleHRlbmRzIFRyYW5zcG9ydEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjb25maWcsIHRyYW5zcG9ydENhbGxiYWNrKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZywgdHJhbnNwb3J0Q2FsbGJhY2spO1xuICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fd3NVcmwgPSBgJHtjb25maWcuZ2V0SG9zdCgpfToke2NvbmZpZy5nZXRQb3J0KCl9YDtcbiAgICAgICAgdGhpcy5fd3MgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VHJhbnNwb3J0Q2FsbGJhY2t9IGNhbGxiYWNrXG4gICAgICovXG4gICAgc2V0VHJhbnNwb3J0Q2FsbGJhY2sgKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uXG4gICAgICovXG4gICAgc3RhcnQgKCkge1xuICAgICAgICB0aGlzLl9pbml0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhdGVzIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIHVybCBwYXNzZWQgaW4gYW5kIGxpc3RlbnMgZm9yIG1lc3NhZ2VzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaW5pdCAoKSB7XG4gICAgICAgIHRoaXMuX3dzICA9IG5ldyBXZWJTb2NrZXQodGhpcy5fd3NVcmwpO1xuXG4gICAgICAgIHRoaXMuX3dzLm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrLm9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fd3Mub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNvbm5lY3QnLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjay5vbkVycm9yKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fd3Mub25tZXNzYWdlID0gKG1zZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlSW5jb21pbmcobXNnKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl93cy5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2sub25Db25uZWN0aW9uVGVybWluYXRlZCgpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb25cbiAgICAgKi9cbiAgICBzdG9wICgpIHtcbiAgICAgICAgdGhpcy5fd3MuY2xvc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudHMgaW4gdGhlIHBhY2tldCBzaG91bGQgYmUgc2VudCBvdXQgdGhyb3VnaCB0aGUgdHJhbnNwb3J0XG4gICAgICogQHBhcmFtIHtTZGxQYWNrZXR9IHBhY2tldFxuICAgICAqL1xuICAgIHNlbmRQYWNrZXQgKHBhY2tldCkge1xuICAgICAgICBjb25zdCBieXRlcyA9IHBhY2tldC50b1BhY2tldCgpO1xuICAgICAgICB0aGlzLl93cy5zZW5kKGJ5dGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciBhIG5ldyBtZXNzYWdlIGNvbWVzIGluXG4gICAgICogQHBhcmFtIHtNZXNzYWdlRXZlbnR9IG1zZ1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2hhbmRsZUluY29taW5nIChtc2cpIHtcbiAgICAgICAgdGhpcy5fcXVldWUucHVzaChtc2cuZGF0YSk7XG4gICAgICAgIHRoaXMuX211bHRpQnl0ZUhhbmRsZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgcmVjZWl2ZWQgZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBxdWV1ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX211bHRpQnl0ZUhhbmRsZXIgKCkge1xuICAgICAgICBpZiAodGhpcy5faXNSdW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gdHJ1ZTtcblxuICAgICAgICB3aGlsZSAodGhpcy5fcXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbXNnRGF0YSA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBuZXcgUmVzcG9uc2UobXNnRGF0YSkuYXJyYXlCdWZmZXIoKS50aGVuKChhcnJheUJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYnl0ZSBvZiB1aW50OCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVCeXRlKGJ5dGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmVlZHMgYSBieXRlIHRocm91Z2ggdGhlIGludGVybmFsIFBTTVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBieXRlIC0gdW5zaWduZWQgOC1iaXQgaW50ZWdlclxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2hhbmRsZUJ5dGUgKGJ5dGUpIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuX3NkbFBzbS5oYW5kbGVCeXRlKGJ5dGUpO1xuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZhaWxlZCcsIHRoaXMuX3NkbFBzbSk7XG4gICAgICAgICAgICB0aGlzLl9zZGxQc20ucmVzZXQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0ZpbmlzaGVkID0gdGhpcy5fc2RsUHNtLmdldFN0YXRlKCkgPT09IFNkbFBzbS5GSU5JU0hFRF9TVEFURTtcblxuICAgICAgICBpZiAoaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gdGhpcy5fc2RsUHNtLmdldEZvcm1lZFBhY2tldCgpO1xuICAgICAgICAgICAgdGhpcy5fc2RsUHNtLnJlc2V0KCk7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjay5vblBhY2tldFJlY2VpdmVkKHBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuZXhwb3J0IHsgV2ViU29ja2V0Q2xpZW50IH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmNsYXNzIFRyYW5zcG9ydENhbGxiYWNrIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuX29uQ29ubmVjdGlvbkVzdGFibGlzaGVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25FcnJvciA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uQ29ubmVjdGlvblRlcm1pbmF0ZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblBhY2tldFJlY2VpdmVkID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHNldE9uQ29ubmVjdGlvbkVzdGFibGlzaGVkIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25FcnJvciAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25FcnJvciA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25Db25uZWN0aW9uVGVybWluYXRlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25Db25uZWN0aW9uVGVybWluYXRlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25QYWNrZXRSZWNlaXZlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25QYWNrZXRSZWNlaXZlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXIgZm9yIHdoZW4gYSBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxcbiAgICAgKi9cbiAgICBvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCAoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25Db25uZWN0aW9uRXN0YWJsaXNoZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ29ubmVjdGlvbkVzdGFibGlzaGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVyIGZvciB3aGVuIGEgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgb25FcnJvciAoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlciBmb3Igd2hlbiBhIGNvbm5lY3Rpb24gaXMgZHJvcHBlZFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWFzb25cbiAgICAgKi9cbiAgICBvbkNvbm5lY3Rpb25UZXJtaW5hdGVkIChyZWFzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vbkNvbm5lY3Rpb25UZXJtaW5hdGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNvbm5lY3Rpb25UZXJtaW5hdGVkKHJlYXNvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVyIGZvciB3aGVuIGEgcGFja2V0IGlzIHJlY2VpdmVkXG4gICAgICogQHBhcmFtIHtTZGxQYWNrZXR9IHBhY2tldFxuICAgICAqL1xuICAgIG9uUGFja2V0UmVjZWl2ZWQgKHBhY2tldCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uUGFja2V0UmVjZWl2ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uUGFja2V0UmVjZWl2ZWQocGFja2V0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5leHBvcnQgeyBUcmFuc3BvcnRDYWxsYmFjayB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBUcmFuc3BvcnRUeXBlIH0gZnJvbSAnLi9lbnVtcy9UcmFuc3BvcnRUeXBlLmpzJztcbmltcG9ydCB7IFdlYlNvY2tldENsaWVudCB9IGZyb20gJy4vV2ViU29ja2V0Q2xpZW50LmpzJztcbmltcG9ydCB7IFRyYW5zcG9ydENhbGxiYWNrIH0gZnJvbSAnLi9UcmFuc3BvcnRDYWxsYmFjay5qcyc7XG5cbmNsYXNzIFRyYW5zcG9ydE1hbmFnZXJCYXNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0Jhc2VUcmFuc3BvcnRDb25maWd9IGJhc2VUcmFuc3BvcnRDb25maWdcbiAgICAgKiBAcGFyYW0ge1RyYW5zcG9ydExpc3RlbmVyfSB0cmFuc3BvcnRMaXN0ZW5lclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChiYXNlVHJhbnNwb3J0Q29uZmlnLCB0cmFuc3BvcnRMaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRDb25maWcgPSBiYXNlVHJhbnNwb3J0Q29uZmlnO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRMaXN0ZW5lciA9IHRyYW5zcG9ydExpc3RlbmVyO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjayA9IG5ldyBUcmFuc3BvcnRDYWxsYmFjaygpO1xuXG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrLnNldE9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyYW5zcG9ydExpc3RlbmVyLm9uVHJhbnNwb3J0Q29ubmVjdGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjay5zZXRPbkNvbm5lY3Rpb25UZXJtaW5hdGVkKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjay5zZXRPblBhY2tldFJlY2VpdmVkKHRoaXMub25QYWNrZXRSZWNlaXZlZC5iaW5kKHRoaXMpKTtcblxuICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0Q29uZmlnLmdldFRyYW5zcG9ydFR5cGUoKSA9PT0gVHJhbnNwb3J0VHlwZS5XRUJTT0NLRVRfQ0xJRU5UKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBuZXcgV2ViU29ja2V0Q2xpZW50KHRoaXMuX3RyYW5zcG9ydENvbmZpZywgdGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2spO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3RyYW5zcG9ydENvbmZpZy5nZXRUcmFuc3BvcnRUeXBlKCkgPT09IFRyYW5zcG9ydFR5cGUuQ1VTVE9NKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSB0aGlzLl90cmFuc3BvcnRDb25maWcuZ2V0VHJhbnNwb3J0KCk7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQuc2V0VHJhbnNwb3J0Q2FsbGJhY2sodGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25UcmFuc3BvcnRDb25uZWN0ZWQgKCkge1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRMaXN0ZW5lci5vblRyYW5zcG9ydENvbm5lY3RlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICAgKi9cbiAgICBvblRyYW5zcG9ydERpc2Nvbm5lY3RlZCAoZnVuYykge1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRMaXN0ZW5lci5vblRyYW5zcG9ydERpc2Nvbm5lY3RlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICAgKi9cbiAgICBvbkVycm9yIChmdW5jKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydExpc3RlbmVyLm9uRXJyb3IoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgb25QYWNrZXRSZWNlaXZlZCAoc2RsUGFja2V0KSB7XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydExpc3RlbmVyLm9uUGFja2V0UmVjZWl2ZWQoc2RsUGFja2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb25cbiAgICAgKi9cbiAgICBzdGFydCAoKSB7XG4gICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuX3RyYW5zcG9ydC5zdGFydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNwb3J0LnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uXG4gICAgICovXG4gICAgc3RvcCAoKSB7XG4gICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuX3RyYW5zcG9ydC5zdG9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRlbnRzIGluIHRoZSBwYWNrZXQgc2hvdWxkIGJlIHNlbnQgb3V0IHRocm91Z2ggdGhlIHRyYW5zcG9ydFxuICAgICAqIEBwYXJhbSB7U2RsUGFja2V0fSBwYWNrZXRcbiAgICAgKi9cbiAgICBzZW5kUGFja2V0IChwYWNrZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5fdHJhbnNwb3J0LnNlbmRQYWNrZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydC5zZW5kUGFja2V0KHBhY2tldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RyYW5zcG9ydFR5cGV9IHRyYW5zcG9ydFR5cGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYWRkcmVzc1xuICAgICAqL1xuICAgIGlzQ29ubmVjdGVkICh0cmFuc3BvcnRUeXBlLCBhZGRyZXNzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0Nvbm5lY3RlZDtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFRyYW5zcG9ydE1hbmFnZXJCYXNlIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmNvbnN0IHsgVHJhbnNwb3J0QmFzZSB9ID0gcmVxdWlyZSgnLi9UcmFuc3BvcnRCYXNlLmpzJyk7XG5jb25zdCB7IFNkbFBzbSB9ID0gcmVxdWlyZSgnLi9TZGxQc20uanMnKTtcbmNvbnN0IFdlYlNvY2tldCA9IHJlcXVpcmUoJ3dzJyk7XG5cbmNsYXNzIFdlYlNvY2tldFNlcnZlciBleHRlbmRzIFRyYW5zcG9ydEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yICh0cmFuc3BvcnRDb25maWcsIHRyYW5zcG9ydENhbGxiYWNrID0gbnVsbCkge1xuICAgICAgICBzdXBlcih0cmFuc3BvcnRDb25maWcsIHRyYW5zcG9ydENhbGxiYWNrKTtcbiAgICAgICAgdGhpcy5fY29ubmVjdGlvbkxvc3RJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtUcmFuc3BvcnRDYWxsYmFja30gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBzZXRUcmFuc3BvcnRDYWxsYmFjayAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgbGlzdGVuaW5nIGZvciBldmVudHMgZnJvbSB0aGUgY2xpZW50XG4gICAgICogQHJldHVybiB7V2ViU29ja2V0U2VydmVyfVxuICAgICAqL1xuICAgIHN0YXJ0ICgpIHtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5fdHJhbnNwb3J0Q29uZmlnLmdldENsaWVudCgpO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uTG9zdFRpbWVvdXQgPSB0aGlzLl90cmFuc3BvcnRDb25maWcuZ2V0Q29ubmVjdGlvbkxvc3RUaW1lb3V0KCk7XG5cbiAgICAgICAgLy8gRXZlbnQgbGlzdGVuZXIgZm9yIGFuIGluY29taW5nIG1lc3NhZ2VcbiAgICAgICAgY2xpZW50Lm9uKCdtZXNzYWdlJywgKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV2ZW50IGxpc3RlbmVyIGZvciBhIGNsb3NlZCBjb25uZWN0aW9uXG4gICAgICAgIGNsaWVudC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnc2VydmVyIHJlY2VpdmVkIGNsb3NlIGV2ZW50Jyk7XG4gICAgICAgICAgICB0aGlzLl9zdG9wQ29ubmVjdGlvbkxvc3RJbnRlcnZhbCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2sub25Db25uZWN0aW9uVGVybWluYXRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFdmVudCBsaXN0ZW5lciBmb3IgZXJyb3JzXG4gICAgICAgIGNsaWVudC5vbignZXJyb3InLCAoZXJyb3JFdmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlcnZlciByZWNlaXZlZCBlcnJvciBldmVudCcpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2sub25FcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQb25nIGhlYXJ0YmVhdCBsaXN0ZW5lclxuICAgICAgICBjbGllbnQub24oJ3BvbmcnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnc2VydmVyIHJlY2VpdmVkIHBvbmcgZXZlbnQnKTtcbiAgICAgICAgICAgIGNsaWVudC5pc0FsaXZlID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBldmVudCBmb3IgY29ubmVjdGlvbiBlc3RhYmxpc2hlZFxuICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrLm9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlY3QgYnJva2VuIGNvbm5lY3Rpb25zXG4gICAgICAgIGlmIChjb25uZWN0aW9uTG9zdFRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0aW9uTG9zdEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjbGllbnQuaXNBbGl2ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlcnZlciBkZWVtZWQgY2xpZW50IGRlYWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudC50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhlIGNsaWVudCBpcyBkZWFkIGFuZCBhc2sgaXQgaWYgaXQncyBhbGl2ZVxuICAgICAgICAgICAgICAgIGNsaWVudC5pc0FsaXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlcnZlciBzZW5kaW5nIHBpbmcgdG8gY2xpZW50Jyk7XG4gICAgICAgICAgICAgICAgY2xpZW50LnBpbmcoZnVuY3Rpb24gKCkge30pO1xuICAgICAgICAgICAgfSwgY29ubmVjdGlvbkxvc3RUaW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsaWVudC5pc0FsaXZlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9wcyB0aGUgV2ViU29ja2V0IFNlcnZlciBmcm9tIGxpc3RlbmluZyBhbmQgY2xvc2VzIGV4aXN0aW5nIGNvbm5lY3Rpb25zXG4gICAgICogQHJldHVybiB7V2ViU29ja2V0U2VydmVyfVxuICAgICAqL1xuICAgIHN0b3AgKCkge1xuICAgICAgICBjb25zdCBjbGllbnQgPSB0aGlzLl90cmFuc3BvcnRDb25maWcuZ2V0Q2xpZW50KCk7XG5cbiAgICAgICAgY2xpZW50LnRlcm1pbmF0ZSgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgcGFja2V0IHRvIHRoZSBjb25uZWN0ZWQgV2ViU29ja2V0IFNlcnZlciBjbGllbnRcbiAgICAgKiBAcmV0dXJuIHtXZWJTb2NrZXRTZXJ2ZXJ9XG4gICAgICovXG4gICAgc2VuZFBhY2tldCAoc2RsUGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuX3RyYW5zcG9ydENvbmZpZy5nZXRDbGllbnQoKTtcbiAgICAgICAgaWYgKGNsaWVudC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgICAgICAgY2xpZW50LnNlbmQoc2RsUGFja2V0LnRvUGFja2V0KCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcCB0aGUgY29ubmVjdGlvbiBsb3N0IGludGVydmFsIGlmIG9uZSBpcyBkZWZpbmVkXG4gICAgICogQHJldHVybiB7V2ViU29ja2V0U2VydmVyfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3N0b3BDb25uZWN0aW9uTG9zdEludGVydmFsICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3Rpb25Mb3N0SW50ZXJ2YWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5fY29ubmVjdGlvbkxvc3RJbnRlcnZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciBhIG5ldyBtZXNzYWdlIGNvbWVzIGluXG4gICAgICogQHBhcmFtIHtNZXNzYWdlRXZlbnR9IG1lc3NhZ2VcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9oYW5kbGVNZXNzYWdlIChtZXNzYWdlKSB7XG4gICAgICAgIC8vIFJlcXVpcmUgbWVzc2FnZXMgdG8gYmUgYmluYXJ5IG9iamVjdHNcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlICE9PSAnb2JqZWN0JyB8fCBtZXNzYWdlLmNvbnN0cnVjdG9yLm5hbWUgIT09ICdCdWZmZXInKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSB0aGUgbWVzc2FnZVxuICAgICAgICBsZXQgc3RhdGVQcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBtZXNzYWdlSW5kZXggPSAwOyBtZXNzYWdlSW5kZXggPCBtZXNzYWdlLmxlbmd0aDsgbWVzc2FnZUluZGV4KyspIHtcbiAgICAgICAgICAgIHN0YXRlUHJvZ3Jlc3MgPSB0aGlzLl9zZGxQc20uaGFuZGxlQnl0ZShtZXNzYWdlW21lc3NhZ2VJbmRleF0pO1xuXG4gICAgICAgICAgICBpZiAoIXN0YXRlUHJvZ3Jlc3MpIHsgLy8gV2UgYXJlIHRyeWluZyB0byB3ZWVkIHRocm91Z2ggdGhlIGJhZCBwYWNrZXQgaW5mbyB1bnRpbCB3ZSBnZXQgc29tZXRoaW5nXG4gICAgICAgICAgICAgICAgdGhpcy5fc2RsUHNtLnJlc2V0KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3NkbFBzbS5nZXRTdGF0ZSgpID09PSBTZGxQc20uRklOSVNIRURfU1RBVEUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWNrZXQgPSB0aGlzLl9zZGxQc20uZ2V0Rm9ybWVkUGFja2V0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrICE9PSBudWxsICYmIHBhY2tldCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjay5vblBhY2tldFJlY2VpdmVkKHBhY2tldCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fc2RsUHNtLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIFdlYlNvY2tldFNlcnZlcixcbn07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmNvbnN0IHsgVHJhbnNwb3J0TWFuYWdlckJhc2UgfSA9IHJlcXVpcmUoJy4vVHJhbnNwb3J0TWFuYWdlckJhc2UuanMnKTtcbmNvbnN0IHsgVHJhbnNwb3J0VHlwZSB9ID0gcmVxdWlyZSgnLi9lbnVtcy9UcmFuc3BvcnRUeXBlLmpzJyk7XG5jb25zdCB7IFdlYlNvY2tldFNlcnZlciB9ID0gcmVxdWlyZSgnLi9XZWJTb2NrZXRTZXJ2ZXIuanMnKTtcblxuY2xhc3MgVHJhbnNwb3J0TWFuYWdlciBleHRlbmRzIFRyYW5zcG9ydE1hbmFnZXJCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAodHJhbnNwb3J0Q29uZmlnLCB0cmFuc3BvcnRMaXN0ZW5lcikge1xuICAgICAgICBzdXBlcih0cmFuc3BvcnRDb25maWcsIHRyYW5zcG9ydExpc3RlbmVyKTtcblxuICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0Q29uZmlnLmdldFRyYW5zcG9ydFR5cGUoKSA9PT0gVHJhbnNwb3J0VHlwZS5XRUJTT0NLRVRfU0VSVkVSKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBuZXcgV2ViU29ja2V0U2VydmVyKHRoaXMuX3RyYW5zcG9ydENvbmZpZywgdGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2spO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3RyYW5zcG9ydCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB0cmFuc3BvcnQgdHlwZScpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIFRyYW5zcG9ydE1hbmFnZXIsXG59OyIsIlxuaW1wb3J0IHsgU2RsUHJvdG9jb2xCYXNlIH0gZnJvbSAnLi9TZGxQcm90b2NvbEJhc2UuanMnO1xuaW1wb3J0IHsgVHJhbnNwb3J0TWFuYWdlciB9IGZyb20gJy4vLi4vdHJhbnNwb3J0L1RyYW5zcG9ydE1hbmFnZXIuanMnO1xuXG5cbmNsYXNzIFNkbFByb3RvY29sIGV4dGVuZHMgU2RsUHJvdG9jb2xCYXNlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RyYW5zcG9ydENvbmZpZ0Jhc2V9IGJhc2VUcmFuc3BvcnRDb25maWdcbiAgICAgKiBAcGFyYW0ge1NkbFByb3RvY29sTGlzdGVuZXJ9IHNkbFByb3RvY29sTGlzdGVuZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoYmFzZVRyYW5zcG9ydENvbmZpZywgc2RsUHJvdG9jb2xMaXN0ZW5lcikge1xuICAgICAgICBzdXBlcihiYXNlVHJhbnNwb3J0Q29uZmlnLCBzZGxQcm90b2NvbExpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc3BvcnRNYW5hZ2VyKG5ldyBUcmFuc3BvcnRNYW5hZ2VyKHRoaXMuX3RyYW5zcG9ydENvbmZpZywgdGhpcy5fdHJhbnNwb3J0TGlzdGVuZXIpKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFNkbFByb3RvY29sIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFNlcnZpY2VUeXBlIH0gZnJvbSAnLi4vcHJvdG9jb2wvZW51bXMvU2VydmljZVR5cGUuanMnO1xuXG5jbGFzcyBTZXJ2aWNlTGlzdGVuZXJNYXAge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuXG4gICAgICAgIC8vIGluaXRpYWxpemUgYW4gYXJyYXkgb2YgbGlzdGVuZXJzIGZvciBlYWNoIHNlcnZpY2UgdHlwZVxuICAgICAgICB0aGlzLl9saXN0ZW5lcnNbU2VydmljZVR5cGUuQ09OVFJPTF0gPSBbXTtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzW1NlcnZpY2VUeXBlLlJQQ10gPSBbXTtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzW1NlcnZpY2VUeXBlLkFVRElPXSA9IFtdO1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnNbU2VydmljZVR5cGUuVklERU9dID0gW107XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyc1tTZXJ2aWNlVHlwZS5IWUJSSURdID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKiBAcGFyYW0ge1NkbFNlcnZpY2VMaXN0ZW5lcn0gc2VydmljZUxpc3RlbmVyXG4gICAgICovXG4gICAgYWRkTGlzdGVuZXIgKHNlcnZpY2VUeXBlLCBzZXJ2aWNlTGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKCFzZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyc1tzZXJ2aWNlVHlwZV0ucHVzaChzZXJ2aWNlTGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICogQHBhcmFtIHtTZGxTZXJ2aWNlTGlzdGVuZXJ9IHNlcnZpY2VMaXN0ZW5lclxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IC0gd2hldGhlciB0aGUgc2VydmljZSBnb3QgcmVtb3ZlZFxuICAgICAqL1xuICAgIHJlbW92ZUxpc3RlbmVyIChzZXJ2aWNlVHlwZSwgc2VydmljZUxpc3RlbmVyKSB7XG4gICAgICAgIGlmICghc2VydmljZVR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsaXN0ZW5lckFycmF5ID0gdGhpcy5fbGlzdGVuZXJzW3NlcnZpY2VUeXBlXTtcbiAgICAgICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gcmVtb3ZlIG1hdGNoaW5nIHJlZmVyZW5jZXMgdG8gdGhlIHBhc3NlZCBpbiBzZXJ2aWNlIGxpc3RlbmVyXG4gICAgICAgIHRoaXMuX2xpc3RlbmVyc1tzZXJ2aWNlVHlwZV0gPSBsaXN0ZW5lckFycmF5LmZpbHRlcihsaXN0ZW5lciA9PiB7XG4gICAgICAgICAgICByZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lciAhPT0gc2VydmljZUxpc3RlbmVyO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlbW92ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgdGhpcyBldmVudCB0byBhbGwgbGlzdGVuZXJzIGJlbG9uZ2luZyB0byBhIHNwZWNpZmljIHNlcnZpY2UgdHlwZVxuICAgICAqIEBwYXJhbSB7U2RsU2Vzc2lvbn0gc2Vzc2lvblxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBpc0VuY3J5cHRlZFxuICAgICAqL1xuICAgIHNlbmRFdmVudFNlcnZpY2VTdGFydGVkIChzZXNzaW9uLCBzZXJ2aWNlVHlwZSwgaXNFbmNyeXB0ZWQpIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJBcnJheSA9IHRoaXMuX2xpc3RlbmVyc1tzZXJ2aWNlVHlwZV07XG4gICAgICAgIGZvciAoY29uc3QgaW5kZXggaW4gbGlzdGVuZXJBcnJheSkge1xuICAgICAgICAgICAgbGlzdGVuZXJBcnJheVtpbmRleF0ub25TZXJ2aWNlU3RhcnRlZChzZXNzaW9uLCBzZXJ2aWNlVHlwZSwgaXNFbmNyeXB0ZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgdGhpcyBldmVudCB0byBhbGwgbGlzdGVuZXJzIGJlbG9uZ2luZyB0byBhIHNwZWNpZmljIHNlcnZpY2UgdHlwZVxuICAgICAqIEBwYXJhbSB7U2RsU2Vzc2lvbn0gc2Vzc2lvblxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICovXG4gICAgc2VuZEV2ZW50U2VydmljZUVuZGVkIChzZXNzaW9uLCBzZXJ2aWNlVHlwZSkge1xuICAgICAgICBjb25zdCBsaXN0ZW5lckFycmF5ID0gdGhpcy5fbGlzdGVuZXJzW3NlcnZpY2VUeXBlXTtcbiAgICAgICAgZm9yIChjb25zdCBpbmRleCBpbiBsaXN0ZW5lckFycmF5KSB7XG4gICAgICAgICAgICBsaXN0ZW5lckFycmF5W2luZGV4XS5vblNlcnZpY2VFbmRlZChzZXNzaW9uLCBzZXJ2aWNlVHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kcyB0aGlzIGV2ZW50IHRvIGFsbCBsaXN0ZW5lcnMgYmVsb25naW5nIHRvIGEgc3BlY2lmaWMgc2VydmljZSB0eXBlXG4gICAgICogQHBhcmFtIHtTZGxTZXNzaW9ufSBzZXNzaW9uXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVhc29uXG4gICAgICovXG4gICAgc2VuZEV2ZW50U2VydmljZUVycm9yIChzZXNzaW9uLCBzZXJ2aWNlVHlwZSwgcmVhc29uKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyQXJyYXkgPSB0aGlzLl9saXN0ZW5lcnNbc2VydmljZVR5cGVdO1xuICAgICAgICBmb3IgKGNvbnN0IGluZGV4IGluIGxpc3RlbmVyQXJyYXkpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyQXJyYXlbaW5kZXhdLm9uU2VydmljZUVycm9yKHNlc3Npb24sIHNlcnZpY2VUeXBlLCByZWFzb24pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBTZXJ2aWNlTGlzdGVuZXJNYXAgfTtcbiIsImltcG9ydCB7IFZpZGVvU3RyZWFtaW5nRm9ybWF0IH0gZnJvbSAnLi4vLi4vcnBjL3N0cnVjdHMvVmlkZW9TdHJlYW1pbmdGb3JtYXQnO1xuaW1wb3J0IHsgVmlkZW9TdHJlYW1pbmdDb2RlYyB9IGZyb20gJy4uLy4uL3JwYy9lbnVtcy9WaWRlb1N0cmVhbWluZ0NvZGVjJztcbmltcG9ydCB7IFZpZGVvU3RyZWFtaW5nUHJvdG9jb2wgfSBmcm9tICcuLi8uLi9ycGMvZW51bXMvVmlkZW9TdHJlYW1pbmdQcm90b2NvbCc7XG5pbXBvcnQgeyBJbWFnZVJlc29sdXRpb24gfSBmcm9tICcuLi8uLi9ycGMvc3RydWN0cy9JbWFnZVJlc29sdXRpb24nO1xuXG4vKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IExpdmlvLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuICogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4gKiBkaXN0cmlidXRpb24uXG4gKlxuICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiAqIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuICogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5jb25zdCBERUZBVUxUX1BST1RPQ09MID0gVmlkZW9TdHJlYW1pbmdQcm90b2NvbC5SQVc7XG5jb25zdCBERUZBVUxUX0NPREVDID0gVmlkZW9TdHJlYW1pbmdDb2RlYy5IMjY0O1xuY29uc3QgREVGQVVMVF9XSURUSCA9IDEwMjQ7XG5jb25zdCBERUZBVUxUX0hFSUdIVCA9IDU3NjtcbmNvbnN0IERFRkFVTFRfREVOU0lUWSA9IDI0MDtcbmNvbnN0IERFRkFVTFRfRlJBTUVSQVRFID0gMzA7XG5jb25zdCBERUZBVUxUX0JJVFJBVEUgPSA1MTIwMDA7XG5jb25zdCBERUZBVUxUX0lOVEVSVkFMID0gNTtcbmNvbnN0IERFRkFVTFRfU0NBTEUgPSAxLjA7XG5cbmNsYXNzIFZpZGVvU3RyZWFtaW5nUGFyYW1ldGVycyB7XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGlzcGxheURlbnNpdHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJhbWVSYXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdHJhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW50ZXJ2YWxcbiAgICAgKiBAcGFyYW0ge0ltYWdlUmVzb2x1dGlvbn0gcmVzb2x1dGlvblxuICAgICAqIEBwYXJhbSB7VmlkZW9TdHJlYW1pbmdGb3JtYXR9IGZvcm1hdFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChkaXNwbGF5RGVuc2l0eSA9IG51bGwsIGZyYW1lUmF0ZSA9IG51bGwsIGJpdHJhdGUgPSBudWxsLCBpbnRlcnZhbCA9IG51bGwsIHJlc29sdXRpb24gPSBudWxsLCBmb3JtYXQgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlEZW5zaXR5ID0gZGlzcGxheURlbnNpdHkgfHwgREVGQVVMVF9ERU5TSVRZO1xuICAgICAgICB0aGlzLl9mcmFtZVJhdGUgPSBmcmFtZVJhdGUgfHwgREVGQVVMVF9GUkFNRVJBVEU7XG4gICAgICAgIHRoaXMuX2JpdHJhdGUgPSBiaXRyYXRlIHx8IERFRkFVTFRfQklUUkFURTtcbiAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBpbnRlcnZhbCB8fCBERUZBVUxUX0lOVEVSVkFMO1xuXG4gICAgICAgIGlmICghKHJlc29sdXRpb24gaW5zdGFuY2VvZiBJbWFnZVJlc29sdXRpb24pKSB7XG4gICAgICAgICAgICByZXNvbHV0aW9uID0gbmV3IEltYWdlUmVzb2x1dGlvbigpO1xuICAgICAgICAgICAgcmVzb2x1dGlvbi5zZXRSZXNvbHV0aW9uV2lkdGgoREVGQVVMVF9XSURUSCk7XG4gICAgICAgICAgICByZXNvbHV0aW9uLnNldFJlc29sdXRpb25IZWlnaHQoREVGQVVMVF9IRUlHSFQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Jlc29sdXRpb24gPSByZXNvbHV0aW9uO1xuXG4gICAgICAgIGlmICghKGZvcm1hdCBpbnN0YW5jZW9mIFZpZGVvU3RyZWFtaW5nRm9ybWF0KSkge1xuICAgICAgICAgICAgZm9ybWF0ID0gbmV3IFZpZGVvU3RyZWFtaW5nRm9ybWF0KCk7XG4gICAgICAgICAgICBmb3JtYXQuc2V0UHJvdG9jb2woREVGQVVMVF9QUk9UT0NPTCk7XG4gICAgICAgICAgICBmb3JtYXQuc2V0Q29kZWMoREVGQVVMVF9DT0RFQyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9mb3JtYXQgPSBmb3JtYXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBjYXBhYmlsaXR5IHRoYXQgc2hvdWxkIGhhdmUgYmVlbiByZXR1cm5lZCB0aHJvdWdoIHRoZSBTeXN0ZW1DYXBhYmlsaXR5TWFuYWdlci5cbiAgICAgKiBUaGlzIHVwZGF0ZSB3aWxsIHVzZSB0aGUgbW9zdCBwcmVmZXJyZWQgc3RyZWFtaW5nIGZvcm1hdCBmcm9tIHRoZSBtb2R1bGUuXG4gICAgICogQHBhcmFtIHtWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHl9IGNhcGFiaWxpdHkgdGhlIHZpZGVvIHN0cmVhbWluZyBjYXBhYmlsaXR5IHJldHVybmVkIGZyb20gdGhlIFN5c3RlbUNhcGFiaWxpdHlNYW5hZ2VyXG4gICAgICovXG4gICAgdXBkYXRlIChjYXBhYmlsaXR5KSB7XG4gICAgICAgIGlmIChjYXBhYmlsaXR5LmdldE1heEJpdHJhdGUoKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fYml0cmF0ZSA9IGNhcGFiaWxpdHkuZ2V0TWF4Qml0cmF0ZSgpICogMTAwMDsgLy8gTk9URTogdGhlIHVuaXQgb2YgbWF4Qml0cmF0ZSBpbiBnZXRTeXN0ZW1DYXBhYmlsaXR5IGlzIGticHMuXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNjYWxlID0gREVGQVVMVF9TQ0FMRTtcbiAgICAgICAgaWYgKGNhcGFiaWxpdHkuZ2V0U2NhbGUoKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2NhbGUgPSBjYXBhYmlsaXR5LmdldFNjYWxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IGNhcGFiaWxpdHkuZ2V0UHJlZmVycmVkUmVzb2x1dGlvbigpO1xuICAgICAgICBpZiAocmVzb2x1dGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHJlc29sdXRpb24uZ2V0UmVzb2x1dGlvbkhlaWdodCgpICE9PSBudWxsICYmIHJlc29sdXRpb24uZ2V0UmVzb2x1dGlvbkhlaWdodCgpID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc29sdXRpb24uc2V0UmVzb2x1dGlvbkhlaWdodChNYXRoLmZsb29yKChyZXNvbHV0aW9uLmdldFJlc29sdXRpb25IZWlnaHQoKSAvIHNjYWxlKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc29sdXRpb24uZ2V0UmVzb2x1dGlvbldpZHRoKCkgIT09IG51bGwgJiYgcmVzb2x1dGlvbi5nZXRSZXNvbHV0aW9uV2lkdGgoKSA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNvbHV0aW9uLnNldFJlc29sdXRpb25XaWR0aChNYXRoLmZsb29yKChyZXNvbHV0aW9uLmdldFJlc29sdXRpb25XaWR0aCgpIC8gc2NhbGUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9ybWF0cyA9IGNhcGFiaWxpdHkuZ2V0U3VwcG9ydGVkRm9ybWF0cygpO1xuICAgICAgICBpZiAoZm9ybWF0cyAhPT0gbnVsbCAmJiBmb3JtYXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1hdCA9IGZvcm1hdHNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXNwbGF5RGVuc2l0eVxuICAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVyc31cbiAgICAgKi9cbiAgICBzZXREaXNwbGF5RGVuc2l0eSAoZGlzcGxheURlbnNpdHkpIHtcbiAgICAgICAgdGhpcy5fZGlzcGxheURlbnNpdHkgPSBkaXNwbGF5RGVuc2l0eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldERpc3BsYXlEZW5zaXR5ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlEZW5zaXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmcmFtZVJhdGVcbiAgICAgKiBAcmV0dXJuIHtWaWRlb1N0cmVhbWluZ1BhcmFtZXRlcnN9XG4gICAgICovXG4gICAgc2V0RnJhbWVSYXRlIChmcmFtZVJhdGUpIHtcbiAgICAgICAgdGhpcy5fZnJhbWVSYXRlID0gZnJhbWVSYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXRGcmFtZVJhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnJhbWVSYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRyYXRlXG4gICAgICogQHJldHVybiB7VmlkZW9TdHJlYW1pbmdQYXJhbWV0ZXJzfVxuICAgICAqL1xuICAgIHNldEJpdHJhdGUgKGJpdHJhdGUpIHtcbiAgICAgICAgdGhpcy5fYml0cmF0ZSA9IGJpdHJhdGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0Qml0cmF0ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaXRyYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnZhbFxuICAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVyc31cbiAgICAgKi9cbiAgICBzZXRJbnRlcnZhbCAoaW50ZXJ2YWwpIHtcbiAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBpbnRlcnZhbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldEludGVydmFsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludGVydmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VmlkZW9TdHJlYW1pbmdGb3JtYXR9IGZvcm1hdFxuICAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVyc31cbiAgICAgKi9cbiAgICBzZXRGb3JtYXQgKGZvcm1hdCkge1xuICAgICAgICB0aGlzLl9mb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nRm9ybWF0fVxuICAgICAqL1xuICAgIGdldEZvcm1hdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3JtYXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKiBAcmV0dXJuIHtWaWRlb1N0cmVhbWluZ1BhcmFtZXRlcnN9XG4gICAgICovXG4gICAgc2V0UmVzb2x1dGlvbiAocmVzb2x1dGlvbikge1xuICAgICAgICB0aGlzLl9yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldFJlc29sdXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb2x1dGlvbjtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFZpZGVvU3RyZWFtaW5nUGFyYW1ldGVycyB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBTZGxQcm90b2NvbExpc3RlbmVyIH0gZnJvbSAnLi4vcHJvdG9jb2wvU2RsUHJvdG9jb2xMaXN0ZW5lci5qcyc7XG5pbXBvcnQgeyBTZGxQcm90b2NvbCB9IGZyb20gJy4uL3Byb3RvY29sL1NkbFByb3RvY29sLmpzJztcbmltcG9ydCB7IFNlcnZpY2VUeXBlIH0gZnJvbSAnLi4vcHJvdG9jb2wvZW51bXMvU2VydmljZVR5cGUuanMnO1xuaW1wb3J0IHsgU2VydmljZUxpc3RlbmVyTWFwIH0gZnJvbSAnLi9TZXJ2aWNlTGlzdGVuZXJNYXAuanMnO1xuaW1wb3J0IHsgVmlkZW9TdHJlYW1pbmdQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vc3RyZWFtaW5nL3ZpZGVvL1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVycy5qcyc7XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTZGxTZXNzaW9uXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBzdGFydFxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZ2V0U2Vzc2lvbklkXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBvblByb3RvY29sU2Vzc2lvblN0YXJ0ZWRcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IG9uUHJvdG9jb2xTZXNzaW9uRW5kZWRcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IG9uUHJvdG9jb2xTZXNzaW9uRW5kZWROQUNLZWRcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IG9uUnBjTWVzc2FnZVJlY2VpdmVkXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBzZW5kUnBjXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRNdHVcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGNsb3NlXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBzdGFydFNlcnZpY2VcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGVuZFNlcnZpY2VcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldEN1cnJlbnRUcmFuc3BvcnRUeXBlXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRJc0Nvbm5lY3RlZFxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZ2V0UHJvdG9jb2xWZXJzaW9uXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRUcmFuc3BvcnRDb25maWdcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldFNlc3Npb25IYXNoSWRcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGFkZFNlcnZpY2VMaXN0ZW5lclxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gcmVtb3ZlU2VydmljZUxpc3RlbmVyXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRTZXJ2aWNlTGlzdGVuZXJzXG4gKi9cbmNsYXNzIFNkbFNlc3Npb24ge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VHJhbnNwb3J0Q29uZmlnQmFzZX0gYmFzZVRyYW5zcG9ydENvbmZpZ1xuICAgICAqIEBwYXJhbSB7U2RsU2Vzc2lvbkxpc3RlbmVyfSBzZGxTZXNzaW9uTGlzdGVuZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoYmFzZVRyYW5zcG9ydENvbmZpZywgc2RsU2Vzc2lvbkxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2Jhc2VUcmFuc3BvcnRDb25maWcgPSBiYXNlVHJhbnNwb3J0Q29uZmlnO1xuICAgICAgICB0aGlzLl9zZXNzaW9uSWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9zZXNzaW9uSGFzaElkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2RsU2Vzc2lvbkxpc3RlbmVyID0gc2RsU2Vzc2lvbkxpc3RlbmVyO1xuICAgICAgICB0aGlzLl9iYXNlVHJhbnNwb3J0Q29uZmlnID0gYmFzZVRyYW5zcG9ydENvbmZpZztcblxuICAgICAgICAvLyBhIGhhc2ggd2hlcmUgZWFjaCBrZXkgaXMgYSBzZXJ2aWNlIHR5cGUsIGFuZCBoYXMgYW4gYXJyYXkgb2YgbGlzdGVuZXJzIGF0dGFjaGVkXG4gICAgICAgIHRoaXMuX3NlcnZpY2VMaXN0ZW5lcnMgPSBuZXcgU2VydmljZUxpc3RlbmVyTWFwKCk7XG5cbiAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2xMaXN0ZW5lciA9IHRoaXMuX3NldHVwU2RsUHJvdG9jb2xMaXN0ZW5lcigpO1xuXG4gICAgICAgIHRoaXMuX3NkbFByb3RvY29sID0gbmV3IFNkbFByb3RvY29sKGJhc2VUcmFuc3BvcnRDb25maWcsIHRoaXMuX3NkbFByb3RvY29sTGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NkbFByb3RvY29sTGlzdGVuZXJ9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfc2V0dXBTZGxQcm90b2NvbExpc3RlbmVyICgpIHtcbiAgICAgICAgY29uc3Qgc2RsUHJvdG9jb2xMaXN0ZW5lciA9IG5ldyBTZGxQcm90b2NvbExpc3RlbmVyKCk7XG4gICAgICAgIHNkbFByb3RvY29sTGlzdGVuZXIuc2V0R2V0U2Vzc2lvbklkKHRoaXMuZ2V0U2Vzc2lvbklkLmJpbmQodGhpcykpO1xuICAgICAgICBzZGxQcm90b2NvbExpc3RlbmVyLnNldE9uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZCh0aGlzLm9uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgc2RsUHJvdG9jb2xMaXN0ZW5lci5zZXRPblByb3RvY29sU2Vzc2lvbkVuZGVkKHRoaXMub25Qcm90b2NvbFNlc3Npb25FbmRlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgc2RsUHJvdG9jb2xMaXN0ZW5lci5zZXRPblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkKHRoaXMub25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgc2RsUHJvdG9jb2xMaXN0ZW5lci5zZXRPblJwY01lc3NhZ2VSZWNlaXZlZCh0aGlzLm9uUnBjTWVzc2FnZVJlY2VpdmVkLmJpbmQodGhpcykpO1xuICAgICAgICBzZGxQcm90b2NvbExpc3RlbmVyLnNldE9uVHJhbnNwb3J0Q29ubmVjdGVkKHRoaXMub25UcmFuc3BvcnRDb25uZWN0ZWQuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgc2RsUHJvdG9jb2xMaXN0ZW5lci5zZXRHZXREZXNpcmVkVmlkZW9QYXJhbXModGhpcy5nZXREZXNpcmVkVmlkZW9QYXJhbXMuYmluZCh0aGlzKSk7XG4gICAgICAgIHNkbFByb3RvY29sTGlzdGVuZXIuc2V0U2V0QWNjZXB0ZWRWaWRlb1BhcmFtcyh0aGlzLnNldEFjY2VwdGVkVmlkZW9QYXJhbXMuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgcmV0dXJuIHNkbFByb3RvY29sTGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnRzIHVwIHRoZSBTREwgcHJvdG9jb2wgY2xhc3MuIEl0IHdpbGwga2ljayBvZmYgdGhlIHRyYW5zcG9ydCBtYW5hZ2VyIGFuZCB1bmRlcmx5aW5nIHRyYW5zcG9ydC5cbiAgICAgKi9cbiAgICBzdGFydCAoKSB7XG4gICAgICAgIHRoaXMuX3NkbFByb3RvY29sLnN0YXJ0KCk7XG4gICAgfVxuXG4gICAgLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTjogICAgU2RsUHJvdG9jb2xMaXN0ZW5lciBpbXBsZW1lbnRlZCBtZXRob2RzXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn0gIC0gcmVwcmVzZW50cyBhIGJ5dGVcbiAgICAgKi9cbiAgICBnZXRTZXNzaW9uSWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbklkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGZpcmVkIHdoZW4gdHJhbnNwb3J0IChlZyB0Y3AsIHdzLCBibHVldG9vdGgpIGhhcyBjb25uZWN0ZWQuXG4gICAgICovXG4gICAgb25UcmFuc3BvcnRDb25uZWN0ZWQgKCkge1xuICAgICAgICB0aGlzLl9zZGxTZXNzaW9uTGlzdGVuZXIub25UcmFuc3BvcnRDb25uZWN0ZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSWQgLSByZXByZXNlbnRzIGEgYnl0ZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2ZXJzaW9uIC0gcmVwcmVzZW50cyBhIGJ5dGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29ycmVsYXRpb25JZFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoYXNoSWRcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRW5jcnlwdGVkXG4gICAgICovXG4gICAgb25Qcm90b2NvbFNlc3Npb25TdGFydGVkIChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklkLCB2ZXJzaW9uLCBjb3JyZWxhdGlvbklkLCBoYXNoSWQsIGlzRW5jcnlwdGVkKSB7XG4gICAgICAgIHRoaXMuX3Nlc3Npb25JZCA9IHNlc3Npb25JZDtcblxuICAgICAgICBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLlJQQykge1xuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbkhhc2hJZCA9IGhhc2hJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NkbFNlc3Npb25MaXN0ZW5lci5vblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQoc2VydmljZVR5cGUsIHNlc3Npb25JZCwgdmVyc2lvbiwgY29ycmVsYXRpb25JZCwgaGFzaElkLCBpc0VuY3J5cHRlZCk7XG4gICAgICAgIHRoaXMuX3NlcnZpY2VMaXN0ZW5lcnMuc2VuZEV2ZW50U2VydmljZVN0YXJ0ZWQodGhpcywgc2VydmljZVR5cGUsIGlzRW5jcnlwdGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSWQgLSByZXByZXNlbnRzIGEgYnl0ZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb3JyZWxhdGlvbklkXG4gICAgICovXG4gICAgb25Qcm90b2NvbFNlc3Npb25FbmRlZCAoc2VydmljZVR5cGUsIHNlc3Npb25JZCwgY29ycmVsYXRpb25JZCkge1xuICAgICAgICB0aGlzLl9zZGxTZXNzaW9uTGlzdGVuZXIub25Qcm90b2NvbFNlc3Npb25FbmRlZChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklkLCBjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgdGhpcy5fc2VydmljZUxpc3RlbmVycy5zZW5kRXZlbnRTZXJ2aWNlRW5kZWQodGhpcywgc2VydmljZVR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNlc3Npb25JZCAtIHJlcHJlc2VudHMgYSBieXRlXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvcnJlbGF0aW9uSWRcbiAgICAgKi9cbiAgICBvblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkIChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklkLCBjb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIHRoaXMuX3NkbFNlc3Npb25MaXN0ZW5lci5vblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkKHNlcnZpY2VUeXBlLCBzZXNzaW9uSWQsIGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB0aGlzLl9zZXJ2aWNlTGlzdGVuZXJzLnNlbmRFdmVudFNlcnZpY2VFcnJvcih0aGlzLCBzZXJ2aWNlVHlwZSwgYEVuZCAke3NlcnZpY2VUeXBlLnRvU3RyaW5nKCl9IFNlcnZpY2UgTkFDSydlZGApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7UnBjTWVzc2FnZX0gcnBjTWVzc2FnZVxuICAgICAqL1xuICAgIG9uUnBjTWVzc2FnZVJlY2VpdmVkIChycGNNZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuX3NkbFNlc3Npb25MaXN0ZW5lci5vblJwY01lc3NhZ2VSZWNlaXZlZChycGNNZXNzYWdlKTtcbiAgICB9XG5cblxuICAgIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOiAgICBTZGxQcm90b2NvbExpc3RlbmVyIGltcGxlbWVudGVkIG1ldGhvZHNcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtScGNNZXNzYWdlfSBycGNNZXNzYWdlXG4gICAgICovXG4gICAgc2VuZFJwYyAocnBjTWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9zZGxQcm90b2NvbC5zZW5kUnBjKHJwY01lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIHNkbFBhY2tldC5cbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gc2RsUGFja2V0XG4gICAgICovXG4gICAgc2VuZFBhY2tldCAoc2RsUGFja2V0KSB7XG4gICAgICAgIHRoaXMuX3NkbFByb3RvY29sLnNlbmRQYWNrZXQoc2RsUGFja2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEByZXR1cm4ge051bWJlcn0gbWF4IHRyYW5zcG9ydCB1bml0IGZvciB0aGUgZ2l2ZW4gc2VydmljZSB0eXBlXG4gICAgICovXG4gICAgZ2V0TXR1IChzZXJ2aWNlVHlwZSkge1xuICAgICAgICB0aGlzLl9zZGxQcm90b2NvbC5nZXRNdHUoc2VydmljZVR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuZHMgdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqL1xuICAgIGNsb3NlICgpIHtcbiAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2wuZW5kU2Vzc2lvbih0aGlzLl9zZXNzaW9uSWQsIHRoaXMuX3Nlc3Npb25IYXNoSWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U2VydmljZVR5cGV9IHNlcnZpY2VUeXBlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNlc3Npb25JZCAtIHJlcHJlc2VudHMgYSBieXRlXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBpc0VuY3J5cHRlZFxuICAgICAqL1xuICAgIHN0YXJ0U2VydmljZSAoc2VydmljZVR5cGUsIHNlc3Npb25JZCwgaXNFbmNyeXB0ZWQpIHtcbiAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2wuc3RhcnRTZXJ2aWNlKHNlcnZpY2VUeXBlLCBzZXNzaW9uSWQsIGlzRW5jcnlwdGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSWQgLSByZXByZXNlbnRzIGEgYnl0ZVxuICAgICAqL1xuICAgIGVuZFNlcnZpY2UgKHNlcnZpY2VUeXBlLCBzZXNzaW9uSWQpIHtcbiAgICAgICAgdGhpcy5fc2RsUHJvdG9jb2wuZW5kU2VydmljZShzZXJ2aWNlVHlwZSwgc2Vzc2lvbklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUcmFuc3BvcnRUeXBlfVxuICAgICAqL1xuICAgIGdldEN1cnJlbnRUcmFuc3BvcnRUeXBlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2VUcmFuc3BvcnRDb25maWcuZ2V0VHJhbnNwb3J0VHlwZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IGlzQ29ubmVjdGVkXG4gICAgICovXG4gICAgZ2V0SXNDb25uZWN0ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2RsUHJvdG9jb2wuaXNDb25uZWN0ZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWZXJzaW9ufVxuICAgICAqL1xuICAgIGdldFByb3RvY29sVmVyc2lvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZGxQcm90b2NvbC5nZXRQcm90b2NvbFZlcnNpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUcmFuc3BvcnRDb25maWdCYXNlfVxuICAgICAqL1xuICAgIGdldFRyYW5zcG9ydENvbmZpZyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYXNlVHJhbnNwb3J0Q29uZmlnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRTZXNzaW9uSGFzaElkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25IYXNoSWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKiBAcGFyYW0ge1NkbFNlcnZpY2VMaXN0ZW5lcn0gc2RsU2VydmljZUxpc3RlbmVyXG4gICAgICovXG4gICAgYWRkU2VydmljZUxpc3RlbmVyIChzZXJ2aWNlVHlwZSwgc2RsU2VydmljZUxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX3NlcnZpY2VMaXN0ZW5lcnMuYWRkTGlzdGVuZXIoc2VydmljZVR5cGUsIHNkbFNlcnZpY2VMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKiBAcGFyYW0ge1NkbFNlcnZpY2VMaXN0ZW5lcn0gc2RsU2VydmljZUxpc3RlbmVyXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gLSB3aGV0aGVyIHRoZSByZW1vdmFsIHdhcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgcmVtb3ZlU2VydmljZUxpc3RlbmVyIChzZXJ2aWNlVHlwZSwgc2RsU2VydmljZUxpc3RlbmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlTGlzdGVuZXJzLnJlbW92ZUxpc3RlbmVyKHNlcnZpY2VUeXBlLCBzZGxTZXJ2aWNlTGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1NlcnZpY2VMaXN0ZW5lck1hcH1cbiAgICAgKi9cbiAgICBnZXRTZXJ2aWNlTGlzdGVuZXJzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VMaXN0ZW5lcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVyc30gcGFyYW1zXG4gICAgICovXG4gICAgc2V0RGVzaXJlZFZpZGVvUGFyYW1zIChwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5fZGVzaXJlZFZpZGVvUGFyYW1zID0gcGFyYW1zO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2V0IGRlc2lyZWQgdmlkZW8gc3RyZWFtaW5nIHBhcmFtZXRlcnMuIElmIHRoZXJlIGhhdmVuJ3QgYmVlbiBhbnkgc2V0LFxuICAgICAqIHRoZSBkZWZhdWx0IG9wdGlvbnMgd2lsbCBiZSByZXR1cm5lZCBhbmQgc2V0IGZvciB0aGlzIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4ge1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVyc30gdGhlIGRlc2lyZWQgdmlkZW8gc3RyZWFtaW5nIHBhcmFtZXRlcnNcbiAgICAgKi9cbiAgICBnZXREZXNpcmVkVmlkZW9QYXJhbXMgKCkge1xuICAgICAgICBpZiAoISh0aGlzLl9kZXNpcmVkVmlkZW9QYXJhbXMgaW5zdGFuY2VvZiBWaWRlb1N0cmVhbWluZ1BhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgICB0aGlzLl9kZXNpcmVkVmlkZW9QYXJhbXMgPSBuZXcgVmlkZW9TdHJlYW1pbmdQYXJhbWV0ZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rlc2lyZWRWaWRlb1BhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1ZpZGVvU3RyZWFtaW5nUGFyYW1ldGVyc30gcGFyYW1zXG4gICAgICovXG4gICAgc2V0QWNjZXB0ZWRWaWRlb1BhcmFtcyAocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuX2Rlc2lyZWRWaWRlb1BhcmFtcyA9IHBhcmFtcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgeyBTZGxTZXNzaW9uIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2RsU2Vzc2lvbkxpc3RlbmVyXG4gKi9cbmNsYXNzIFNkbFNlc3Npb25MaXN0ZW5lciB7XG4gICAgLyoqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uRW5kZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblByb3RvY29sU2Vzc2lvbkVuZGVkTkFDS2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25ScGNNZXNzYWdlUmVjZWl2ZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblRyYW5zcG9ydENvbm5lY3RlZCA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBzZXRPblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25Qcm90b2NvbFNlc3Npb25FbmRlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25FbmRlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25ScGNNZXNzYWdlUmVjZWl2ZWQgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX29uUnBjTWVzc2FnZVJlY2VpdmVkID0gbGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBzZXRPblRyYW5zcG9ydENvbm5lY3RlZCAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fb25UcmFuc3BvcnRDb25uZWN0ZWQgPSBsaXN0ZW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSUQgLSByZXByZXNlbnRzIGEgYnl0ZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2ZXJzaW9uIC0gcmVwcmVzZW50cyBhIGJ5dGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29ycmVsYXRpb25JRFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoYXNoSURcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRW5jcnlwdGVkXG4gICAgICovXG4gICAgb25Qcm90b2NvbFNlc3Npb25TdGFydGVkIChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklELCB2ZXJzaW9uLCBjb3JyZWxhdGlvbklELCBoYXNoSUQsIGlzRW5jcnlwdGVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25TdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQoc2VydmljZVR5cGUsIHNlc3Npb25JRCwgdmVyc2lvbiwgY29ycmVsYXRpb25JRCwgaGFzaElELCBpc0VuY3J5cHRlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSUQgLSByZXByZXNlbnRzIGEgYnl0ZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb3JyZWxhdGlvbklEXG4gICAgICovXG4gICAgb25Qcm90b2NvbFNlc3Npb25FbmRlZCAoc2VydmljZVR5cGUsIHNlc3Npb25JRCwgY29ycmVsYXRpb25JRCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uRW5kZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uUHJvdG9jb2xTZXNzaW9uRW5kZWQoc2VydmljZVR5cGUsIHNlc3Npb25JRCwgY29ycmVsYXRpb25JRCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NlcnZpY2VUeXBlfSBzZXJ2aWNlVHlwZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzZXNzaW9uSUQgLSByZXByZXNlbnRzIGEgYnl0ZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb3JyZWxhdGlvbklEXG4gICAgICovXG4gICAgb25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZCAoc2VydmljZVR5cGUsIHNlc3Npb25JRCwgY29ycmVsYXRpb25JKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZChzZXJ2aWNlVHlwZSwgc2Vzc2lvbklELCBjb3JyZWxhdGlvbkkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtScGNNZXNzYWdlfSBycGNNZXNzYWdlXG4gICAgICovXG4gICAgb25ScGNNZXNzYWdlUmVjZWl2ZWQgKHJwY01lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vblJwY01lc3NhZ2VSZWNlaXZlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25ScGNNZXNzYWdlUmVjZWl2ZWQocnBjTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGFwcCBhbmQgY29yZSBjb25uZWN0XG4gICAgICovXG4gICAgb25UcmFuc3BvcnRDb25uZWN0ZWQgKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29uVHJhbnNwb3J0Q29ubmVjdGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9vblRyYW5zcG9ydENvbm5lY3RlZCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBTZGxTZXNzaW9uTGlzdGVuZXIgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBBcnJheVRvb2xzXG4gKi9cbmNsYXNzIEFycmF5VG9vbHMge1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGl0ZW0gZnJvbSB0aGUgYXJyYXkuXG4gICAgICogVGhpcyBkb2VzIG5vdCBtdXRhdGUgdGhlIHBhc3NlZCBpbiBhcnJheS5cbiAgICAgKiBPbmx5IHRoZSByZXR1cm5lZCBhcnJheSBoYXMgdGhlIHZhbHVlIHJlbW92ZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICAgKi9cbiAgICBzdGF0aWMgYXJyYXlSZW1vdmUgKGFycmF5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYXJyYXkuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGUgIT09IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgeyBBcnJheVRvb2xzIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IFJlZ2lzdGVyQXBwSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vcnBjL21lc3NhZ2VzL1JlZ2lzdGVyQXBwSW50ZXJmYWNlLmpzJztcbmltcG9ydCB7IFJwY1JlcXVlc3QgfSBmcm9tICcuLi8uLi9ycGMvUnBjUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJy4uLy4uL3JwYy9ScGNSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBScGNMaXN0ZW5lciB9IGZyb20gJy4uLy4uL3JwYy9ScGNMaXN0ZW5lci5qcyc7XG5pbXBvcnQgeyBTZGxTZXNzaW9uIH0gZnJvbSAnLi4vLi4vc2Vzc2lvbi9TZGxTZXNzaW9uLmpzJztcbmltcG9ydCB7IFNkbFNlc3Npb25MaXN0ZW5lciB9IGZyb20gJy4uLy4uL3Nlc3Npb24vU2RsU2Vzc2lvbkxpc3RlbmVyLmpzJztcbmltcG9ydCB7IFZlcnNpb24gfSBmcm9tICcuLi8uLi91dGlsL1ZlcnNpb24uanMnO1xuaW1wb3J0IHsgQXJyYXlUb29scyB9IGZyb20gJy4uLy4uL3V0aWwvQXJyYXlUb29scy5qcyc7XG5pbXBvcnQgeyBTZGxNc2dWZXJzaW9uIH0gZnJvbSAnLi4vLi4vcnBjL3N0cnVjdHMvU2RsTXNnVmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbklEIH0gZnJvbSAnLi4vLi4vcnBjL2VudW1zL0Z1bmN0aW9uSUQuanMnO1xuaW1wb3J0IHsgU2VydmljZVR5cGUgfSBmcm9tICcuLi8uLi9wcm90b2NvbC9lbnVtcy9TZXJ2aWNlVHlwZS5qcyc7XG5cbi8qKlxuICogTk9URTogVGhpcyBjb3VsZCBhbGwgY2hhbmdlIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZXN0aW5nLlxuICogVGhpcyBjbGFzcyBzaG91bGQgYWxzbyBiZSBtYXJrZWQgcHJpdmF0ZSBhbmQgYmVoaW5kIHRoZSBTZGxNYW5hZ2VyIEFQSVxuICpcbiAqIHVzYWdlIHNob3VsZCBiZTpcbiAqIHZhciBsY20gPSBuZXcgTGlmZWN5Y2xlTWFuYWdlcihhcHBDb25maWcsIGxpZmVjeWNsZUxpc3RlbmVyKTtcbiAqIGxjbS5zZXRScGNMaXN0ZW5lciggLi4uICk7XG4gKiBsY20uc3RhcnQoKTtcbiAqIC4uLi5cbiAqXG4gKiBsaWZlY3ljbGVMaXN0ZW5lci5PblByb3h5Q29ubmVjdGVkKCl7XG4gKiAgLy9Qb3NzaWJsZSB0byBzdGFydCBzZW5kaW5nIFJQQ3MsIEhNSSBsZXZlbCBzaG91bGQgYmUgTk9ORSB0byBzdGFydFxuICpcbiAqIH1cbiAqXG4gKi9cbmNsYXNzIExpZmVjeWNsZU1hbmFnZXIge1xuICAgIC8qKlxuICAgICogQHBhcmFtIHtBcHBDb25maWd9IHNkbENvbmZpZ1xuICAgICogQHBhcmFtIHtMaWZlY3ljbGVMaXN0ZW5lcn0gbGlmZWN5Y2xlTGlzdGVuZXJcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgY29uc3RydWN0b3IgKGFwcENvbmZpZywgbGlmZWN5Y2xlTGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKGFwcENvbmZpZyA9PT0gbnVsbCB8fCBsaWZlY3ljbGVMaXN0ZW5lciA9PT0gbnVsbFxuICAgICAgICAgICAgfHwgYXBwQ29uZmlnID09PSB1bmRlZmluZWQgfHwgbGlmZWN5Y2xlTGlzdGVuZXIgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1zIG11c3Qgbm90IGJlIG51bGwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FwcENvbmZpZyA9IGFwcENvbmZpZztcbiAgICAgICAgdGhpcy5fbGlmZWN5Y2xlTGlzdGVuZXIgPSBsaWZlY3ljbGVMaXN0ZW5lcjtcbiAgICAgICAgdGhpcy5fc2RsU2Vzc2lvbiA9IG5ldyBTZGxTZXNzaW9uKHRoaXMuX2FwcENvbmZpZy5nZXRUcmFuc3BvcnRDb25maWcoKSwgdGhpcy5fY3JlYXRlU2Vzc2lvbkxpc3RlbmVyKCkpO1xuXG4gICAgICAgIC8vIFRoaXMgaXMgYnkgZGVmYXVsdCB1bnRpbCB3ZSByZWNlaXZlIHRoZSBSQUkgUmVzcG9uc2VcbiAgICAgICAgdGhpcy5fcnBjU3BlY1ZlcnNpb24gPSBuZXcgVmVyc2lvbigxLCAwLCAwKTtcblxuICAgICAgICB0aGlzLl9jdXJyZW50SE1JU3RhdHVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZmlyc3RUaW1lRnVsbCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlTGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9tYXhDb3JyZWxhdGlvbklkID0gMDsgLy8gVE9ETyByZW1vdmUgd2hlbiBjb3JyZWxhdGlvbiBnZW4gaXMgaW1wbGVtZW50ZWRcbiAgICAgICAgdGhpcy5fcnBjTGlzdGVuZXJzID0gbmV3IE1hcCgpOyAvLyA8TnVtYmVyLCBBcnJheTxScGNMaXN0ZW5lcj4+XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U2RsU2Vzc2lvbkxpc3RlbmVyfVxuICAgICAqL1xuICAgIF9jcmVhdGVTZXNzaW9uTGlzdGVuZXIgKCkge1xuICAgICAgICBjb25zdCBzZXNzaW9uTGlzdGVuZXIgPSBuZXcgU2RsU2Vzc2lvbkxpc3RlbmVyKCk7XG4gICAgICAgIHNlc3Npb25MaXN0ZW5lci5zZXRPblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQoKHNlcnZpY2VUeXBlLCBzZXNzaW9uSUQsIHZlcnNpb24sIGNvcnJlbGF0aW9uSUQsIGhhc2hJRCwgaXNFbmNyeXB0ZWQpID0+IHtcbiAgICAgICAgICAgIC8vIFNlc3Npb24gaGFzIGJlZW4gc3RhcnRlZFxuICAgICAgICAgICAgLy8gVE9ETyBjaGVjayBtaW4gcHJvdG9jb2wgc3BlYyB2ZXJzaW9uXG4gICAgICAgICAgICBpZiAoc2VydmljZVR5cGUgPT09IFNlcnZpY2VUeXBlLlJQQykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hcHBDb25maWcgIT09IG51bGwgJiYgdGhpcy5fYXBwQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBjYWxsIHByZXBhcmUgb24gY29uZmlnIHRvIG1ha2Ugc3VyZSBpdCBpcyBzYXRpc2ZhY3RvcnlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kUnBjTWVzc2FnZSh0aGlzLl9jcmVhdGVSZWdpc3RlckFwcEludGVyZmFjZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uTGlzdGVuZXIuc2V0T25Qcm90b2NvbFNlc3Npb25FbmRlZCgoc2VydmljZVR5cGUsIHNlc3Npb25JRCwgY29ycmVsYXRpb25JRCkgPT4ge1xuICAgICAgICAgICAgLy8gU2Vzc2lvbiBoYXMgYmVlbiBlbmRlZFxuICAgICAgICB9KTtcbiAgICAgICAgc2Vzc2lvbkxpc3RlbmVyLnNldE9uUHJvdG9jb2xTZXNzaW9uRW5kZWROQUNLZWQoKHNlcnZpY2VUeXBlLCBzZXNzaW9uSUQsIGNvcnJlbGF0aW9uSUQpID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE8gaW0gbm90IHN1cmUgd2h5IHdlIGhhdmUgdGhpc1xuICAgICAgICB9KTtcbiAgICAgICAgc2Vzc2lvbkxpc3RlbmVyLnNldE9uUnBjTWVzc2FnZVJlY2VpdmVkKChycGNNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAvLyBNZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkXG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVScGMocnBjTWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uTGlzdGVuZXIuc2V0T25UcmFuc3BvcnRDb25uZWN0ZWQoKCkgPT4ge1xuICAgICAgICAgICAgLy8gdHJhbnNwb3J0IGhhcyBiZWVuIGNvbm5lY3RlZFxuICAgICAgICAgICAgdGhpcy5fc2RsU2Vzc2lvbi5zdGFydFNlcnZpY2UoU2VydmljZVR5cGUuUlBDLCAwLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZXNzaW9uTGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHsgUnBjTWVzc2FnZSB9IHJwY01lc3NhZ2VcbiAgICAgKi9cbiAgICBfaGFuZGxlUnBjIChycGNNZXNzYWdlKSB7XG4gICAgICAgIGlmIChycGNNZXNzYWdlID09PSBudWxsIHx8IHJwY01lc3NhZ2UgPT09IHVuZGVmaW5lZCB8fCBycGNNZXNzYWdlLmdldEZ1bmN0aW9uTmFtZSgpID09PSBudWxsIHx8IHJwY01lc3NhZ2UuZ2V0RnVuY3Rpb25OYW1lKCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnVuY3Rpb25JRCA9IEZ1bmN0aW9uSUQudmFsdWVGb3JLZXkocnBjTWVzc2FnZS5nZXRGdW5jdGlvbk5hbWUoKSk7IC8vIHRoaXMgaXMgdGhlIG51bWJlciB2YWx1ZVxuICAgICAgICBjb25zdCBsaXN0ZW5lckFycmF5ID0gdGhpcy5fcnBjTGlzdGVuZXJzLmdldChmdW5jdGlvbklEKTtcbiAgICAgICAgaWYgKGxpc3RlbmVyQXJyYXkgIT09IG51bGwgJiYgbGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsaXN0ZW5lckFycmF5LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBpdGVtLm9uUnBjTWVzc2FnZShycGNNZXNzYWdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGluZGl2aWR1YWwgUlBDIGxpc3RlbmVycyBmb3IgcmVxdWVzdC9yZXNwb25zZSBwYWlyc1xuICAgICAgICBpZiAocnBjTWVzc2FnZSBpbnN0YW5jZW9mIFJwY1Jlc3BvbnNlKSB7XG4gICAgICAgICAgICAvLyBudWxsIGNoZWNrIG5vdCBuZWVkZWQuIGl0cyBhbHdheXMgZGVmaW5lZCBpbiB0aGUgY29uc3RydWN0b3JcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXNwb25zZUxpc3RlbmVycy5oYXMocnBjTWVzc2FnZS5nZXRDb3JyZWxhdGlvbklkKCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VMaXN0ZW5lcnMuZ2V0KHJwY01lc3NhZ2UuZ2V0Q29ycmVsYXRpb25JZCgpKS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEByZXR1cm4ge0xpZmVjeWNsZU1hbmFnZXJ9XG4gICAgKi9cbiAgICBzdGFydCAoKSB7XG4gICAgICAgIHRoaXMuX3NldHVwSW50ZXJuYWxScGNMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5fc2RsU2Vzc2lvbi5zdGFydCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzdG9wICgpIHtcbiAgICAgICAgdGhpcy5fc2RsU2Vzc2lvbi5jbG9zZSgpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uSUR9IGZ1bmN0aW9uSURcbiAgICAgKiBAcGFyYW0ge1JwY0xpc3RlbmVyfSBycGNMaXN0ZW5lclxuICAgICAqL1xuICAgIGFkZFJwY0xpc3RlbmVyIChmdW5jdGlvbklELCBycGNMaXN0ZW5lcikge1xuICAgICAgICBsZXQgbGlzdGVuZXJBcnJheSA9IHRoaXMuX3JwY0xpc3RlbmVycy5nZXQoZnVuY3Rpb25JRCk7XG4gICAgICAgIC8vIElmIG5vIGFycmF5IGV4aXN0cyB5ZXQgZm9yIHRoaXMgZnVuY3Rpb24gaWQsIGNyZWF0ZSBvbmVcbiAgICAgICAgaWYgKGxpc3RlbmVyQXJyYXkgPT09IG51bGwgfHwgbGlzdGVuZXJBcnJheSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9ycGNMaXN0ZW5lcnMuc2V0KGZ1bmN0aW9uSUQsIFtdKTtcbiAgICAgICAgICAgIGxpc3RlbmVyQXJyYXkgPSB0aGlzLl9ycGNMaXN0ZW5lcnMuZ2V0KGZ1bmN0aW9uSUQpO1xuICAgICAgICB9XG4gICAgICAgIGxpc3RlbmVyQXJyYXkucHVzaChycGNMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uSUR9IGZ1bmN0aW9uSURcbiAgICAgKiBAcGFyYW0ge1JwY0xpc3RlbmVyfSBycGNMaXN0ZW5lclxuICAgICAqL1xuICAgIHJlbW92ZVJwY0xpc3RlbmVyIChmdW5jdGlvbklELCBycGNMaXN0ZW5lcikge1xuICAgICAgICBpZiAocnBjTGlzdGVuZXIgIT09IG51bGwgJiYgcnBjTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJBcnJheSA9IHRoaXMuX3JwY0xpc3RlbmVycy5nZXQoZnVuY3Rpb25JRCk7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJBcnJheSAhPT0gbnVsbCAmJiBsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ycGNMaXN0ZW5lcnMuc2V0KGZ1bmN0aW9uSUQsIEFycmF5VG9vbHMuYXJyYXlSZW1vdmUobGlzdGVuZXJBcnJheSwgcnBjTGlzdGVuZXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtScGNNZXNzYWdlfSBycGNNZXNzYWdlXG4gICAgICovXG4gICAgc2VuZFJwY01lc3NhZ2UgKHJwY01lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHJwY01lc3NhZ2UgIT09IG51bGwgJiYgcnBjTWVzc2FnZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX3NkbFNlc3Npb24uZ2V0SXNDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgLy8gVE9ETyB3ZSBzdGlsbCBuZWVkIHRvIG1ha2UgcHJvcGVyIGNoYW5nZXMgdG8gaGFuZGxlIHNwZWNpZmljIGNhc2VzIGZvciBSUENzIGllIFBMQVlfUEFVU0UgLyBPS1xuXG4gICAgICAgICAgICAvLyBUT0RPIGNyZWF0ZSBhIGNvcnJlbGF0aW9uIGlkIGdlbmVyYXRvciBhbmQgaGFuZGxlIHRoaXMgaW4gdGhlIFJQQyBjbGFzc2VzXG4gICAgICAgICAgICBpZiAocnBjTWVzc2FnZSBpbnN0YW5jZW9mIFJwY1JlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAocnBjTWVzc2FnZS5nZXRGdW5jdGlvbk5hbWUgIT09IEZ1bmN0aW9uSUQuUmVnaXN0ZXJBcHBJbnRlcmZhY2UpIHsgLy8gUkFJIGhhcyBhIGEgcHJvdGVjdGVkIGlkXG4gICAgICAgICAgICAgICAgICAgIHJwY01lc3NhZ2Uuc2V0Q29ycmVsYXRpb25JZCgrK3RoaXMuX21heENvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFRPRE86IGNhbid0IHV0aWxpemUgdGhlIGFiaWxpdHkgb2YgcHJvbWlzZXMgbGlrZSB0aGlzXG4gICAgICAgICAgICAgICAgaWYgKHJwY01lc3NhZ2UuZ2V0T25SUENSZXNwb25zZVByb21pc2UoKSAhPT0gbnVsbCAmJiBycGNNZXNzYWdlLmdldE9uUlBDUmVzcG9uc2VQcm9taXNlKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGluZGl2aWR1YWwgcmVzcG9uc2UgbGlzdGVuZXIgZm9yIHRoaXMgUlBDIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VMaXN0ZW5lcnMuc2V0KHJwY01lc3NhZ2UuZ2V0Q29ycmVsYXRpb25JZCgpLCBycGNNZXNzYWdlLmdldE9uUlBDUmVzcG9uc2VQcm9taXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NkbFNlc3Npb24uc2VuZFJwYyhycGNNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlfVxuICAgICAqL1xuICAgIGdldFJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZTtcbiAgICB9XG5cblxuXG4gICAgLyoqXG4gICAgKiBAcmV0dXJuIHtSZWdpc3RlckFwcEludGVyZmFjZX1cbiAgICAqL1xuICAgIF9jcmVhdGVSZWdpc3RlckFwcEludGVyZmFjZSAoKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyQXBwSW50ZXJmYWNlID0gbmV3IFJlZ2lzdGVyQXBwSW50ZXJmYWNlKCk7XG4gICAgICAgIHJlZ2lzdGVyQXBwSW50ZXJmYWNlLnNldFNkbE1zZ1ZlcnNpb24obmV3IFNkbE1zZ1ZlcnNpb24oKS5zZXRNYWpvclZlcnNpb24oTGlmZWN5Y2xlTWFuYWdlci5NQVhfUlBDX1ZFUlNJT04uZ2V0TWFqb3IoKSkuc2V0TWlub3JWZXJzaW9uKExpZmVjeWNsZU1hbmFnZXIuTUFYX1JQQ19WRVJTSU9OLmdldE1pbm9yKCkpLnNldFBhdGNoVmVyc2lvbihMaWZlY3ljbGVNYW5hZ2VyLk1BWF9SUENfVkVSU0lPTi5nZXRQYXRjaCgpKSlcbiAgICAgICAgICAgIC5zZXRBcHBOYW1lKHRoaXMuX2FwcENvbmZpZy5nZXRBcHBOYW1lKCkpXG4gICAgICAgICAgICAuc2V0RnVsbEFwcElkKHRoaXMuX2FwcENvbmZpZy5nZXRBcHBJZCgpKVxuICAgICAgICAgICAgLnNldE5nbk1lZGlhU2NyZWVuQXBwTmFtZSh0aGlzLl9hcHBDb25maWcuZ2V0U2hvcnRBcHBOYW1lKCkpXG4gICAgICAgICAgICAuc2V0QXBwSE1JVHlwZSh0aGlzLl9hcHBDb25maWcuZ2V0QXBwVHlwZXMoKSlcbiAgICAgICAgICAgIC5zZXRMYW5ndWFnZURlc2lyZWQodGhpcy5fYXBwQ29uZmlnLmdldExhbmd1YWdlRGVzaXJlZCgpKVxuICAgICAgICAgICAgLnNldEhtaURpc3BsYXlMYW5ndWFnZURlc2lyZWQodGhpcy5fYXBwQ29uZmlnLmdldEhtaURpc3BsYXlMYW5ndWFnZURlc2lyZWQoKSlcbiAgICAgICAgICAgIC5zZXRJc01lZGlhQXBwbGljYXRpb24odGhpcy5fYXBwQ29uZmlnLmlzTWVkaWFBcHAoKSlcbiAgICAgICAgICAgIC5zZXREYXlDb2xvclNjaGVtZSh0aGlzLl9hcHBDb25maWcuZ2V0RGF5Q29sb3JTY2hlbWUoKSlcbiAgICAgICAgICAgIC5zZXROaWdodENvbG9yU2NoZW1lKHRoaXMuX2FwcENvbmZpZy5nZXROaWdodENvbG9yU2NoZW1lKCkpXG4gICAgICAgICAgICAuc2V0Q29ycmVsYXRpb25JZChMaWZlY3ljbGVNYW5hZ2VyLlJFR0lTVEVSX0FQUF9JTlRFUkZBQ0VfQ09SUkVMQVRJT05fSUQpO1xuXG4gICAgICAgIC8vIFRPRE8gQWRkIGFsbCBwb3NzaWJsZSBpdGVtc1xuXG4gICAgICAgIHJldHVybiByZWdpc3RlckFwcEludGVyZmFjZTtcbiAgICB9XG5cblxuICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlRFUk5BTCAtIFJQQyBMSVNURU5FUlMgISEgU1RBUlQgISEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIF9zZXR1cEludGVybmFsUnBjTGlzdGVuZXJzICgpIHtcbiAgICAgICAgdGhpcy5fcnBjTGlzdGVuZXIgPSBuZXcgUnBjTGlzdGVuZXIoKS5zZXRPblJwY01lc3NhZ2UocnBjTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmdW5jdGlvbklEID0gRnVuY3Rpb25JRC52YWx1ZUZvcktleShycGNNZXNzYWdlLmdldEZ1bmN0aW9uTmFtZSgpKTsgLy8gdGhpcyBpcyB0aGUgbnVtYmVyIHZhbHVlXG5cblxuICAgICAgICAgICAgc3dpdGNoIChmdW5jdGlvbklEKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBGdW5jdGlvbklELlJlZ2lzdGVyQXBwSW50ZXJmYWNlOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzUmFpUmVzcG9uc2UocnBjTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRnVuY3Rpb25JRC5PbkhNSVN0YXR1czoge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGEgc2luZ2xlIG9uUHJveHlDb25uZWN0ZWQsIHdoZW4gd2UgZ28gZnJvbSBhIG51bGwgSE1JIGxldmVsIHRvIGEgZGVmaW5lZCBITUkgbGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkSW5pdCA9IHJwY01lc3NhZ2UuZ2V0SG1pTGV2ZWwoKSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgcnBjTWVzc2FnZS5nZXRIbWlMZXZlbCgpICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX2N1cnJlbnRITUlTdGF0dXMgPT09IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudEhNSVN0YXR1cyA9IHJwY01lc3NhZ2UuZ2V0SG1pTGV2ZWwoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGlmZWN5Y2xlTGlzdGVuZXIgIT09IG51bGwgJiYgdGhpcy5fbGlmZWN5Y2xlTGlzdGVuZXIgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRJbml0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9saWZlY3ljbGVMaXN0ZW5lci5vblByb3h5Q29ubmVjdGVkKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIFJQQyBub3QgaGFuZGxlZCB5ZXQgaW4gTENNXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkUnBjTGlzdGVuZXIoRnVuY3Rpb25JRC5SZWdpc3RlckFwcEludGVyZmFjZSwgdGhpcy5fcnBjTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLmFkZFJwY0xpc3RlbmVyKEZ1bmN0aW9uSUQuT25ITUlTdGF0dXMsIHRoaXMuX3JwY0xpc3RlbmVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZX0gcmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZVxuICAgICAqL1xuICAgIF9wcm9jZXNzUmFpUmVzcG9uc2UgKHJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UpIHtcbiAgICAgICAgLy8gQ2FjaGUgdGhpcyBSQUkgUmVzcG9uc2UgYXMgaXQgY2FuIGJlIHVzZWQgbGF0ZXJcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZSA9IHJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2U7XG5cbiAgICAgICAgLy8gIFRPRE8gS0VZX1NETF9NU0dfVkVSU0lPTiB2cyBLRVlfU1lOQ19NU0dfVkVSU0lPTiBzZGxWZXJzaW9uOiAne0dJVF9DT01NSVR9JywgSSB0aGluayB0aGUga2V5IG5hbWUgY2hhbmdlXG4gICAgICAgIC8vIGlzIG1lYW50IHRvIG1ha2UgdGhpbmdzIGNsZWFyZXIgYWJvdXQgdGhpcyBiZWluZyBhbiBzZGwgdmVyc2lvbiB3aGljaCBpcyBub3Qgc3BlY2lmaWMgdG8gZm9yZCdzIHN5bmMuXG4gICAgICAgIC8vIFRoZXJlIGlzIGEga2V5IGNhbGxlZCBzZGxWZXJzaW9uIHRoYXQgaXMgcmVzcG9uZGluZyB3aXRoIHtHSVRfQ09NTUlUfSB0aGF0IEknbSB1bnN1cmUgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby5cbiAgICAgICAgY29uc3QgbXNnVmVyc2lvbiA9IHJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UuZ2V0U2RsTXNnVmVyc2lvbigpO1xuXG4gICAgICAgIGlmIChtc2dWZXJzaW9uICE9PSBudWxsICYmIG1zZ1ZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fcnBjU3BlY1ZlcnNpb24gPSBuZXcgVmVyc2lvbihtc2dWZXJzaW9uLmdldE1ham9yVmVyc2lvbigpLCBtc2dWZXJzaW9uLmdldE1ham9yVmVyc2lvbigpLCBtc2dWZXJzaW9uLmdldFBhdGNoVmVyc2lvbigpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3JwY1NwZWNWZXJzaW9uID0gTGlmZWN5Y2xlTWFuYWdlci5NQVhfUlBDX1ZFUlNJT047XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIFRPRE8gY2hlY2sgYWdhaW5zdCBtaW4gUlBDIHNwZWMgdmVyc2lvbiBjb25maWdcblxuICAgICAgICAvLyBUT0RPIHBhcnNlIFJBSSBmb3Igc3lzdGVtIGNhcGFiaWxpdGllc1xuICAgIH1cbn1cblxuTGlmZWN5Y2xlTWFuYWdlci5NQVhfUlBDX1ZFUlNJT04gPSBuZXcgVmVyc2lvbig2LCAwLCAwKTtcbkxpZmVjeWNsZU1hbmFnZXIuUkVHSVNURVJfQVBQX0lOVEVSRkFDRV9DT1JSRUxBVElPTl9JRCA9IDY1NTI5O1xuTGlmZWN5Y2xlTWFuYWdlci5VTlJFR0lTVEVSX0FQUF9JTlRFUkZBQ0VfQ09SUkVMQVRJT05fSUQgPSA2NTUzMDtcblxuXG5leHBvcnQgeyBMaWZlY3ljbGVNYW5hZ2VyIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IEFwcFNlcnZpY2VUeXBlXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBBcHBTZXJ2aWNlVHlwZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBNRURJQSAoKSB7XG4gICAgICAgIHJldHVybiBBcHBTZXJ2aWNlVHlwZS5fTUFQLk1FRElBO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFdFQVRIRVIgKCkge1xuICAgICAgICByZXR1cm4gQXBwU2VydmljZVR5cGUuX01BUC5XRUFUSEVSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5BVklHQVRJT04gKCkge1xuICAgICAgICByZXR1cm4gQXBwU2VydmljZVR5cGUuX01BUC5OQVZJR0FUSU9OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIEFwcFNlcnZpY2VUeXBlLl92YWx1ZUZvcktleShrZXksIEFwcFNlcnZpY2VUeXBlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gQXBwU2VydmljZVR5cGUuX2tleUZvclZhbHVlKHZhbHVlLCBBcHBTZXJ2aWNlVHlwZS5fTUFQKTtcbiAgICB9XG59XG5cbkFwcFNlcnZpY2VUeXBlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnTUVESUEnOiAnTUVESUEnLFxuICAgICdXRUFUSEVSJzogJ1dFQVRIRVInLFxuICAgICdOQVZJR0FUSU9OJzogJ05BVklHQVRJT04nLFxufSk7XG5cbmV4cG9ydCB7IEFwcFNlcnZpY2VUeXBlIH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogUmVmbGVjdHMgdGhlIHN0YXR1cyBvZiBhIHZlaGljbGUgbWFpbnRlbmFuY2UgbW9kZS5cbiAqIEB0eXBlZGVmIHtFbnVtfSBNYWludGVuYW5jZU1vZGVTdGF0dXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIE1haW50ZW5hbmNlTW9kZVN0YXR1cyBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBNTVNfTk9STUFMICgpIHtcbiAgICAgICAgcmV0dXJuIE1haW50ZW5hbmNlTW9kZVN0YXR1cy5fTUFQLk1NU19OT1JNQUw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTU1TX05FQVIgKCkge1xuICAgICAgICByZXR1cm4gTWFpbnRlbmFuY2VNb2RlU3RhdHVzLl9NQVAuTU1TX05FQVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTU1TX0FDVElWRSAoKSB7XG4gICAgICAgIHJldHVybiBNYWludGVuYW5jZU1vZGVTdGF0dXMuX01BUC5NTVNfQUNUSVZFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE1NU19GRUFUVVJFX05PVF9QUkVTRU5UICgpIHtcbiAgICAgICAgcmV0dXJuIE1haW50ZW5hbmNlTW9kZVN0YXR1cy5fTUFQLk1NU19GRUFUVVJFX05PVF9QUkVTRU5UO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbnVtIGtleVxuICAgICAqIEBwYXJhbSBrZXkgLSBBIGtleSB0byBmaW5kIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEgdmFsdWUgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHZhbHVlRm9yS2V5IChrZXkpIHtcbiAgICAgICAgcmV0dXJuIE1haW50ZW5hbmNlTW9kZVN0YXR1cy5fdmFsdWVGb3JLZXkoa2V5LCBNYWludGVuYW5jZU1vZGVTdGF0dXMuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBNYWludGVuYW5jZU1vZGVTdGF0dXMuX2tleUZvclZhbHVlKHZhbHVlLCBNYWludGVuYW5jZU1vZGVTdGF0dXMuX01BUCk7XG4gICAgfVxufVxuXG5NYWludGVuYW5jZU1vZGVTdGF0dXMuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdNTVNfTk9STUFMJzogJ05PUk1BTCcsXG4gICAgJ01NU19ORUFSJzogJ05FQVInLFxuICAgICdNTVNfQUNUSVZFJzogJ0FDVElWRScsXG4gICAgJ01NU19GRUFUVVJFX05PVF9QUkVTRU5UJzogJ0ZFQVRVUkVfTk9UX1BSRVNFTlQnLFxufSk7XG5cbmV4cG9ydCB7IE1haW50ZW5hbmNlTW9kZVN0YXR1cyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIHRoYXQgZGVzY3JpYmVzIHBvc3NpYmxlIHBlcm1pc3Npb24gc3RhdGVzIG9mIGEgcG9saWN5IHRhYmxlIGVudHJ5LlxuICogQHR5cGVkZWYge0VudW19IFBlcm1pc3Npb25TdGF0dXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFBlcm1pc3Npb25TdGF0dXMgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgUFNfQUxMT1dFRCAoKSB7XG4gICAgICAgIHJldHVybiBQZXJtaXNzaW9uU3RhdHVzLl9NQVAuUFNfQUxMT1dFRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBQU19ESVNBTExPV0VEICgpIHtcbiAgICAgICAgcmV0dXJuIFBlcm1pc3Npb25TdGF0dXMuX01BUC5QU19ESVNBTExPV0VEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBTX1VTRVJfRElTQUxMT1dFRCAoKSB7XG4gICAgICAgIHJldHVybiBQZXJtaXNzaW9uU3RhdHVzLl9NQVAuUFNfVVNFUl9ESVNBTExPV0VEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBTX1VTRVJfQ09OU0VOVF9QRU5ESU5HICgpIHtcbiAgICAgICAgcmV0dXJuIFBlcm1pc3Npb25TdGF0dXMuX01BUC5QU19VU0VSX0NPTlNFTlRfUEVORElORztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBQZXJtaXNzaW9uU3RhdHVzLl92YWx1ZUZvcktleShrZXksIFBlcm1pc3Npb25TdGF0dXMuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBQZXJtaXNzaW9uU3RhdHVzLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgUGVybWlzc2lvblN0YXR1cy5fTUFQKTtcbiAgICB9XG59XG5cblBlcm1pc3Npb25TdGF0dXMuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdQU19BTExPV0VEJzogJ0FMTE9XRUQnLFxuICAgICdQU19ESVNBTExPV0VEJzogJ0RJU0FMTE9XRUQnLFxuICAgICdQU19VU0VSX0RJU0FMTE9XRUQnOiAnVVNFUl9ESVNBTExPV0VEJyxcbiAgICAnUFNfVVNFUl9DT05TRU5UX1BFTkRJTkcnOiAnVVNFUl9DT05TRU5UX1BFTkRJTkcnLFxufSk7XG5cbmV4cG9ydCB7IFBlcm1pc3Npb25TdGF0dXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBQcmVkZWZpbmVkIHNjcmVlbiBsYXlvdXQuXG4gKiBAdHlwZWRlZiB7RW51bX0gUHJlZGVmaW5lZExheW91dFxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgUHJlZGVmaW5lZExheW91dCBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IG1lZGlhIC8gbm9uLW1lZGlhIHNjcmVlbi4gQ2FuIGJlIHNldCBhcyBhIHJvb3Qgc2NyZWVuLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERFRkFVTFQgKCkge1xuICAgICAgICByZXR1cm4gUHJlZGVmaW5lZExheW91dC5fTUFQLkRFRkFVTFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBNZWRpYSBzY3JlZW4uIENhbiBiZSBzZXQgYXMgYSByb290IHNjcmVlbi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBNRURJQSAoKSB7XG4gICAgICAgIHJldHVybiBQcmVkZWZpbmVkTGF5b3V0Ll9NQVAuTUVESUE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBOb24tbWVkaWEgc2NyZWVuLiBDYW4gYmUgc2V0IGFzIGEgcm9vdCBzY3JlZW4uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTk9OX01FRElBICgpIHtcbiAgICAgICAgcmV0dXJuIFByZWRlZmluZWRMYXlvdXQuX01BUC5OT05fTUVESUE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIHJvb3QgbWVkaWEgc2NyZWVuIGNvbnRhaW5pbmcgYXBwLWRlZmluZWQgb25zY3JlZW4gcHJlc2V0cy4gQ2FuIGJlIHNldCBhcyBhIHJvb3Qgc2NyZWVuLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE9OU0NSRUVOX1BSRVNFVFMgKCkge1xuICAgICAgICByZXR1cm4gUHJlZGVmaW5lZExheW91dC5fTUFQLk9OU0NSRUVOX1BSRVNFVFM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIHJvb3QgdGVtcGxhdGUgc2NyZWVuIGNvbnRhaW5pbmcgZnVsbCBzY3JlZW4gbWFwIHdpdGggbmF2aWdhdGlvbiBjb250cm9scy4gQ2FuIGJlIHNldCBhcyBhIHJvb3Qgc2NyZWVuLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5BVl9GVUxMU0NSRUVOX01BUCAoKSB7XG4gICAgICAgIHJldHVybiBQcmVkZWZpbmVkTGF5b3V0Ll9NQVAuTkFWX0ZVTExTQ1JFRU5fTUFQO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1c3RvbSByb290IHRlbXBsYXRlIHNjcmVlbiBjb250YWluaW5nIHZpZGVvIHJlcHJlc2VudGVkIGxpc3QuIENhbiBiZSBzZXQgYXMgYSByb290IHNjcmVlbi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOQVZfTElTVCAoKSB7XG4gICAgICAgIHJldHVybiBQcmVkZWZpbmVkTGF5b3V0Ll9NQVAuTkFWX0xJU1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIHJvb3QgdGVtcGxhdGUgc2NyZWVuIGNvbnRhaW5pbmcgdmlkZW8gcmVwcmVzZW50ZWQga2V5Ym9hcmQuIENhbiBiZSBzZXQgYXMgYSByb290IHNjcmVlbi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBOQVZfS0VZQk9BUkQgKCkge1xuICAgICAgICByZXR1cm4gUHJlZGVmaW5lZExheW91dC5fTUFQLk5BVl9LRVlCT0FSRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gcm9vdCB0ZW1wbGF0ZSBzY3JlZW4gY29udGFpbmluZyBoYWxmLXNjcmVlbiBncmFwaGljIHdpdGggbGluZXMgb2YgdGV4dC4gQ2FuIGJlIHNldCBhcyBhIHJvb3Qgc2NyZWVuLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEdSQVBISUNfV0lUSF9URVhUICgpIHtcbiAgICAgICAgcmV0dXJuIFByZWRlZmluZWRMYXlvdXQuX01BUC5HUkFQSElDX1dJVEhfVEVYVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gcm9vdCB0ZW1wbGF0ZSBzY3JlZW4gY29udGFpbmluZyBsaW5lcyBvZiB0ZXh0IHdpdGggaGFsZi1zY3JlZW4gZ3JhcGhpYy4gQ2FuIGJlIHNldCBhcyBhIHJvb3Qgc2NyZWVuLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRFWFRfV0lUSF9HUkFQSElDICgpIHtcbiAgICAgICAgcmV0dXJuIFByZWRlZmluZWRMYXlvdXQuX01BUC5URVhUX1dJVEhfR1JBUEhJQztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gcm9vdCB0ZW1wbGF0ZSBzY3JlZW4gY29udGFpbmluZyBvbmx5IHRpbGVkIFNvZnRCdXR0b25zLiBDYW4gYmUgc2V0IGFzIGEgcm9vdCBzY3JlZW4uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgVElMRVNfT05MWSAoKSB7XG4gICAgICAgIHJldHVybiBQcmVkZWZpbmVkTGF5b3V0Ll9NQVAuVElMRVNfT05MWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gcm9vdCB0ZW1wbGF0ZSBzY3JlZW4gY29udGFpbmluZyBvbmx5IHRleHQgU29mdEJ1dHRvbnMuIENhbiBiZSBzZXQgYXMgYSByb290IHNjcmVlbi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBURVhUQlVUVE9OU19PTkxZICgpIHtcbiAgICAgICAgcmV0dXJuIFByZWRlZmluZWRMYXlvdXQuX01BUC5URVhUQlVUVE9OU19PTkxZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1c3RvbSByb290IHRlbXBsYXRlIHNjcmVlbiBjb250YWluaW5nIGhhbGYtc2NyZWVuIGdyYXBoaWMgd2l0aCB0aWxlZCBTb2Z0QnV0dG9ucy4gQ2FuIGJlIHNldCBhcyBhIHJvb3Qgc2NyZWVuLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IEdSQVBISUNfV0lUSF9USUxFUyAoKSB7XG4gICAgICAgIHJldHVybiBQcmVkZWZpbmVkTGF5b3V0Ll9NQVAuR1JBUEhJQ19XSVRIX1RJTEVTO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1c3RvbSByb290IHRlbXBsYXRlIHNjcmVlbiBjb250YWluaW5nIHRpbGVkIFNvZnRCdXR0b25zIHdpdGggaGFsZi1zY3JlZW4gZ3JhcGhpYy4gQ2FuIGJlIHNldCBhcyBhIHJvb3Qgc2NyZWVuLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFRJTEVTX1dJVEhfR1JBUEhJQyAoKSB7XG4gICAgICAgIHJldHVybiBQcmVkZWZpbmVkTGF5b3V0Ll9NQVAuVElMRVNfV0lUSF9HUkFQSElDO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1c3RvbSByb290IHRlbXBsYXRlIHNjcmVlbiBjb250YWluaW5nIGhhbGYtc2NyZWVuIGdyYXBoaWMgd2l0aCB0ZXh0IGFuZCBTb2Z0QnV0dG9ucy4gQ2FuIGJlIHNldCBhcyBhIHJvb3RcbiAgICAgKiBzY3JlZW4uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgR1JBUEhJQ19XSVRIX1RFWFRfQU5EX1NPRlRCVVRUT05TICgpIHtcbiAgICAgICAgcmV0dXJuIFByZWRlZmluZWRMYXlvdXQuX01BUC5HUkFQSElDX1dJVEhfVEVYVF9BTkRfU09GVEJVVFRPTlM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIHJvb3QgdGVtcGxhdGUgc2NyZWVuIGNvbnRhaW5pbmcgdGV4dCBhbmQgU29mdEJ1dHRvbnMgd2l0aCBoYWxmLXNjcmVlbiBncmFwaGljLiBDYW4gYmUgc2V0IGFzIGEgcm9vdFxuICAgICAqIHNjcmVlbi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBURVhUX0FORF9TT0ZUQlVUVE9OU19XSVRIX0dSQVBISUMgKCkge1xuICAgICAgICByZXR1cm4gUHJlZGVmaW5lZExheW91dC5fTUFQLlRFWFRfQU5EX1NPRlRCVVRUT05TX1dJVEhfR1JBUEhJQztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gcm9vdCB0ZW1wbGF0ZSBzY3JlZW4gY29udGFpbmluZyBoYWxmLXNjcmVlbiBncmFwaGljIHdpdGggdGV4dCBvbmx5IFNvZnRCdXR0b25zLiBDYW4gYmUgc2V0IGFzIGEgcm9vdFxuICAgICAqIHNjcmVlbi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBHUkFQSElDX1dJVEhfVEVYVEJVVFRPTlMgKCkge1xuICAgICAgICByZXR1cm4gUHJlZGVmaW5lZExheW91dC5fTUFQLkdSQVBISUNfV0lUSF9URVhUQlVUVE9OUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gcm9vdCB0ZW1wbGF0ZSBzY3JlZW4gY29udGFpbmluZyB0ZXh0IG9ubHkgU29mdEJ1dHRvbnMgd2l0aCBoYWxmLXNjcmVlbiBncmFwaGljLiBDYW4gYmUgc2V0IGFzIGEgcm9vdFxuICAgICAqIHNjcmVlbi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBURVhUQlVUVE9OU19XSVRIX0dSQVBISUMgKCkge1xuICAgICAgICByZXR1cm4gUHJlZGVmaW5lZExheW91dC5fTUFQLlRFWFRCVVRUT05TX1dJVEhfR1JBUEhJQztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gcm9vdCB0ZW1wbGF0ZSBzY3JlZW4gY29udGFpbmluZyBhIGxhcmdlIGdyYXBoaWMgYW5kIFNvZnRCdXR0b25zLiBDYW4gYmUgc2V0IGFzIGEgcm9vdCBzY3JlZW4uXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgTEFSR0VfR1JBUEhJQ19XSVRIX1NPRlRCVVRUT05TICgpIHtcbiAgICAgICAgcmV0dXJuIFByZWRlZmluZWRMYXlvdXQuX01BUC5MQVJHRV9HUkFQSElDX1dJVEhfU09GVEJVVFRPTlM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIHJvb3QgdGVtcGxhdGUgc2NyZWVuIGNvbnRhaW5pbmcgdHdvIGdyYXBoaWNzIGFuZCBTb2Z0QnV0dG9ucy4gQ2FuIGJlIHNldCBhcyBhIHJvb3Qgc2NyZWVuLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IERPVUJMRV9HUkFQSElDX1dJVEhfU09GVEJVVFRPTlMgKCkge1xuICAgICAgICByZXR1cm4gUHJlZGVmaW5lZExheW91dC5fTUFQLkRPVUJMRV9HUkFQSElDX1dJVEhfU09GVEJVVFRPTlM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIHJvb3QgdGVtcGxhdGUgc2NyZWVuIGNvbnRhaW5pbmcgb25seSBhIGxhcmdlIGdyYXBoaWMuIENhbiBiZSBzZXQgYXMgYSByb290IHNjcmVlbi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBMQVJHRV9HUkFQSElDX09OTFkgKCkge1xuICAgICAgICByZXR1cm4gUHJlZGVmaW5lZExheW91dC5fTUFQLkxBUkdFX0dSQVBISUNfT05MWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBQcmVkZWZpbmVkTGF5b3V0Ll92YWx1ZUZvcktleShrZXksIFByZWRlZmluZWRMYXlvdXQuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBQcmVkZWZpbmVkTGF5b3V0Ll9rZXlGb3JWYWx1ZSh2YWx1ZSwgUHJlZGVmaW5lZExheW91dC5fTUFQKTtcbiAgICB9XG59XG5cblByZWRlZmluZWRMYXlvdXQuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdERUZBVUxUJzogJ0RFRkFVTFQnLFxuICAgICdNRURJQSc6ICdNRURJQScsXG4gICAgJ05PTl9NRURJQSc6ICdOT04tTUVESUEnLFxuICAgICdPTlNDUkVFTl9QUkVTRVRTJzogJ09OU0NSRUVOX1BSRVNFVFMnLFxuICAgICdOQVZfRlVMTFNDUkVFTl9NQVAnOiAnTkFWX0ZVTExTQ1JFRU5fTUFQJyxcbiAgICAnTkFWX0xJU1QnOiAnTkFWX0xJU1QnLFxuICAgICdOQVZfS0VZQk9BUkQnOiAnTkFWX0tFWUJPQVJEJyxcbiAgICAnR1JBUEhJQ19XSVRIX1RFWFQnOiAnR1JBUEhJQ19XSVRIX1RFWFQnLFxuICAgICdURVhUX1dJVEhfR1JBUEhJQyc6ICdURVhUX1dJVEhfR1JBUEhJQycsXG4gICAgJ1RJTEVTX09OTFknOiAnVElMRVNfT05MWScsXG4gICAgJ1RFWFRCVVRUT05TX09OTFknOiAnVEVYVEJVVFRPTlNfT05MWScsXG4gICAgJ0dSQVBISUNfV0lUSF9USUxFUyc6ICdHUkFQSElDX1dJVEhfVElMRVMnLFxuICAgICdUSUxFU19XSVRIX0dSQVBISUMnOiAnVElMRVNfV0lUSF9HUkFQSElDJyxcbiAgICAnR1JBUEhJQ19XSVRIX1RFWFRfQU5EX1NPRlRCVVRUT05TJzogJ0dSQVBISUNfV0lUSF9URVhUX0FORF9TT0ZUQlVUVE9OUycsXG4gICAgJ1RFWFRfQU5EX1NPRlRCVVRUT05TX1dJVEhfR1JBUEhJQyc6ICdURVhUX0FORF9TT0ZUQlVUVE9OU19XSVRIX0dSQVBISUMnLFxuICAgICdHUkFQSElDX1dJVEhfVEVYVEJVVFRPTlMnOiAnR1JBUEhJQ19XSVRIX1RFWFRCVVRUT05TJyxcbiAgICAnVEVYVEJVVFRPTlNfV0lUSF9HUkFQSElDJzogJ1RFWFRCVVRUT05TX1dJVEhfR1JBUEhJQycsXG4gICAgJ0xBUkdFX0dSQVBISUNfV0lUSF9TT0ZUQlVUVE9OUyc6ICdMQVJHRV9HUkFQSElDX1dJVEhfU09GVEJVVFRPTlMnLFxuICAgICdET1VCTEVfR1JBUEhJQ19XSVRIX1NPRlRCVVRUT05TJzogJ0RPVUJMRV9HUkFQSElDX1dJVEhfU09GVEJVVFRPTlMnLFxuICAgICdMQVJHRV9HUkFQSElDX09OTFknOiAnTEFSR0VfR1JBUEhJQ19PTkxZJyxcbn0pO1xuXG5leHBvcnQgeyBQcmVkZWZpbmVkTGF5b3V0IH07IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vKlxuKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNtYXJ0RGV2aWNlTGluayBDb25zb3J0aXVtIEluYy4gbm9yIHRoZSBuYW1lcyBvZlxuKiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4qIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgRW51bSB9IGZyb20gJy4uLy4uL3V0aWwvRW51bS5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYge0VudW19IFByZWRlZmluZWRXaW5kb3dzXG4gKiBAcHJvcGVydHkge09iamVjdH0gX01BUFxuICovXG5jbGFzcyBQcmVkZWZpbmVkV2luZG93cyBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCB3aW5kb3cgaXMgYSBtYWluIHdpbmRvdyBwcmUtY3JlYXRlZCBvbiBiZWhhbGYgb2YgdGhlIGFwcC5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBERUZBVUxUX1dJTkRPVyAoKSB7XG4gICAgICAgIHJldHVybiBQcmVkZWZpbmVkV2luZG93cy5fTUFQLkRFRkFVTFRfV0lORE9XO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHdpZGdldCBvZiB0aGUgYXBwLlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFBSSU1BUllfV0lER0VUICgpIHtcbiAgICAgICAgcmV0dXJuIFByZWRlZmluZWRXaW5kb3dzLl9NQVAuUFJJTUFSWV9XSURHRVQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gUHJlZGVmaW5lZFdpbmRvd3MuX3ZhbHVlRm9yS2V5KGtleSwgUHJlZGVmaW5lZFdpbmRvd3MuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBQcmVkZWZpbmVkV2luZG93cy5fa2V5Rm9yVmFsdWUodmFsdWUsIFByZWRlZmluZWRXaW5kb3dzLl9NQVApO1xuICAgIH1cbn1cblxuUHJlZGVmaW5lZFdpbmRvd3MuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdERUZBVUxUX1dJTkRPVyc6IDAsXG4gICAgJ1BSSU1BUllfV0lER0VUJzogMSxcbn0pO1xuXG5leHBvcnQgeyBQcmVkZWZpbmVkV2luZG93cyB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFbnVtfSBUaW1lck1vZGVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFRpbWVyTW9kZSBleHRlbmRzIEVudW0ge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXVzZXMgdGhlIG1lZGlhIGNsb2NrIHRpbWVyIHRvIHVwZGF0ZSBmcm9tIDA6MDAgdG8gYSBzcGVjaWZpZWQgdGltZVxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFVQICgpIHtcbiAgICAgICAgcmV0dXJuIFRpbWVyTW9kZS5fTUFQLlVQO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhdXNlcyB0aGUgbWVkaWEgY2xvY2sgdGltZXIgdG8gdXBkYXRlIGZyb20gYSBzcGVjaWZpZWQgdGltZSB0byAwOjAwXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgRE9XTiAoKSB7XG4gICAgICAgIHJldHVybiBUaW1lck1vZGUuX01BUC5ET1dOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0byBub3QgdXNlIHRoZSBtZWRpYSBjbG9jayB0aW1lclxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IE5PTkUgKCkge1xuICAgICAgICByZXR1cm4gVGltZXJNb2RlLl9NQVAuTk9ORTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBUaW1lck1vZGUuX3ZhbHVlRm9yS2V5KGtleSwgVGltZXJNb2RlLl9NQVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUga2V5IGZvciB0aGUgZ2l2ZW4gZW51bSB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIEEgcHJpbWl0aXZlIHZhbHVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIGtleSBmb3IgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSBrZXkgaWYgZm91bmQsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGtleUZvclZhbHVlICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gVGltZXJNb2RlLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgVGltZXJNb2RlLl9NQVApO1xuICAgIH1cbn1cblxuVGltZXJNb2RlLl9NQVAgPSBPYmplY3QuZnJlZXplKHtcbiAgICAnVVAnOiAnVVAnLFxuICAgICdET1dOJzogJ0RPV04nLFxuICAgICdOT05FJzogJ05PTkUnLFxufSk7XG5cbmV4cG9ydCB7IFRpbWVyTW9kZSB9OyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLypcbiogQ29weXJpZ2h0IChjKSAyMDIwLCBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSwgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBTbWFydERldmljZUxpbmsgQ29uc29ydGl1bSBJbmMuIG5vciB0aGUgbmFtZXMgb2ZcbiogaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEVudW0gfSBmcm9tICcuLi8uLi91dGlsL0VudW0uanMnO1xuXG4vKipcbiAqIFJlZmxlY3RzIHRoZSBzdGF0dXMgb2YgZ2l2ZW4gdmVoaWNsZSBjb21wb25lbnQuXG4gKiBAdHlwZWRlZiB7RW51bX0gVmVoaWNsZURhdGFBY3RpdmVTdGF0dXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBfTUFQXG4gKi9cbmNsYXNzIFZlaGljbGVEYXRhQWN0aXZlU3RhdHVzIGV4dGVuZHMgRW51bSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZEQVNfSU5BQ1RJVkVfTk9UX0NPTkZJUk1FRCAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YUFjdGl2ZVN0YXR1cy5fTUFQLlZEQVNfSU5BQ1RJVkVfTk9UX0NPTkZJUk1FRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWREFTX0lOQUNUSVZFX0NPTkZJUk1FRCAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YUFjdGl2ZVN0YXR1cy5fTUFQLlZEQVNfSU5BQ1RJVkVfQ09ORklSTUVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZEQVNfQUNUSVZFX05PVF9DT05GSVJNRUQgKCkge1xuICAgICAgICByZXR1cm4gVmVoaWNsZURhdGFBY3RpdmVTdGF0dXMuX01BUC5WREFTX0FDVElWRV9OT1RfQ09ORklSTUVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IFZEQVNfQUNUSVZFX0NPTkZJUk1FRCAoKSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YUFjdGl2ZVN0YXR1cy5fTUFQLlZEQVNfQUNUSVZFX0NPTkZJUk1FRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBWREFTX0ZBVUxUICgpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhQWN0aXZlU3RhdHVzLl9NQVAuVkRBU19GQVVMVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZW51bSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IC0gQSBrZXkgdG8gZmluZCBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIHZhbHVlIGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyB2YWx1ZUZvcktleSAoa2V5KSB7XG4gICAgICAgIHJldHVybiBWZWhpY2xlRGF0YUFjdGl2ZVN0YXR1cy5fdmFsdWVGb3JLZXkoa2V5LCBWZWhpY2xlRGF0YUFjdGl2ZVN0YXR1cy5fTUFQKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGtleSBmb3IgdGhlIGdpdmVuIGVudW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBBIHByaW1pdGl2ZSB2YWx1ZSB0byBmaW5kIHRoZSBtYXRjaGluZyBrZXkgZm9yIGluIHRoZSBtYXAgb2YgdGhlIHN1YmNsYXNzXG4gICAgICogQHJldHVybiB7Kn0gLSBSZXR1cm5zIGEga2V5IGlmIGZvdW5kLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlGb3JWYWx1ZSAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFZlaGljbGVEYXRhQWN0aXZlU3RhdHVzLl9rZXlGb3JWYWx1ZSh2YWx1ZSwgVmVoaWNsZURhdGFBY3RpdmVTdGF0dXMuX01BUCk7XG4gICAgfVxufVxuXG5WZWhpY2xlRGF0YUFjdGl2ZVN0YXR1cy5fTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgJ1ZEQVNfSU5BQ1RJVkVfTk9UX0NPTkZJUk1FRCc6ICdJTkFDVElWRV9OT1RfQ09ORklSTUVEJyxcbiAgICAnVkRBU19JTkFDVElWRV9DT05GSVJNRUQnOiAnSU5BQ1RJVkVfQ09ORklSTUVEJyxcbiAgICAnVkRBU19BQ1RJVkVfTk9UX0NPTkZJUk1FRCc6ICdBQ1RJVkVfTk9UX0NPTkZJUk1FRCcsXG4gICAgJ1ZEQVNfQUNUSVZFX0NPTkZJUk1FRCc6ICdBQ1RJVkVfQ09ORklSTUVEJyxcbiAgICAnVkRBU19GQVVMVCc6ICdGQVVMVCcsXG59KTtcblxuZXhwb3J0IHsgVmVoaWNsZURhdGFBY3RpdmVTdGF0dXMgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qXG4qIENvcHlyaWdodCAoYykgMjAyMCwgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU21hcnREZXZpY2VMaW5rIENvbnNvcnRpdW0gSW5jLiBub3IgdGhlIG5hbWVzIG9mXG4qIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbC9FbnVtLmpzJztcblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBsaW5raW5nIG1lc3NhZ2UgdHlwZXMgd2l0aCBmdW5jdGlvbiB0eXBlcyBpbiBXaVBybyBwcm90b2NvbC4gQXNzdW1lcyBlbnVtZXJhdGlvbiBzdGFydHMgYXQgdmFsdWUgMC5cbiAqIEB0eXBlZGVmIHtFbnVtfSBtZXNzYWdlVHlwZVxuICogQHByb3BlcnR5IHtPYmplY3R9IF9NQVBcbiAqL1xuY2xhc3MgbWVzc2FnZVR5cGUgZXh0ZW5kcyBFbnVtIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgcmVxdWVzdCAoKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlVHlwZS5fTUFQLnJlcXVlc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgcmVzcG9uc2UgKCkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZVR5cGUuX01BUC5yZXNwb25zZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIGdldCBub3RpZmljYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZVR5cGUuX01BUC5ub3RpZmljYXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVudW0ga2V5XG4gICAgICogQHBhcmFtIGtleSAtIEEga2V5IHRvIGZpbmQgaW4gdGhlIG1hcCBvZiB0aGUgc3ViY2xhc3NcbiAgICAgKiBAcmV0dXJuIHsqfSAtIFJldHVybnMgYSB2YWx1ZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsdWVGb3JLZXkgKGtleSkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZVR5cGUuX3ZhbHVlRm9yS2V5KGtleSwgbWVzc2FnZVR5cGUuX01BUCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBrZXkgZm9yIHRoZSBnaXZlbiBlbnVtIHZhbHVlXG4gICAgICogQHBhcmFtIHZhbHVlIC0gQSBwcmltaXRpdmUgdmFsdWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcga2V5IGZvciBpbiB0aGUgbWFwIG9mIHRoZSBzdWJjbGFzc1xuICAgICAqIEByZXR1cm4geyp9IC0gUmV0dXJucyBhIGtleSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5Rm9yVmFsdWUgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlVHlwZS5fa2V5Rm9yVmFsdWUodmFsdWUsIG1lc3NhZ2VUeXBlLl9NQVApO1xuICAgIH1cbn1cblxubWVzc2FnZVR5cGUuX01BUCA9IE9iamVjdC5mcmVlemUoe1xuICAgICdyZXF1ZXN0JzogMCxcbiAgICAncmVzcG9uc2UnOiAxLFxuICAgICdub3RpZmljYXRpb24nOiAyLFxufSk7XG5cbmV4cG9ydCB7IG1lc3NhZ2VUeXBlIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2RsU2VydmljZUxpc3RlbmVyXG4gKi9cbmNsYXNzIFNkbFNlcnZpY2VMaXN0ZW5lciB7XG4gICAgLyoqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuX29uU2VydmljZVN0YXJ0ZWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblNlcnZpY2VFbmRlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uU2VydmljZUVycm9yID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHNldE9uU2VydmljZVN0YXJ0ZWQgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX29uU2VydmljZVN0YXJ0ZWQgPSBsaXN0ZW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHNldE9uU2VydmljZUVuZGVkIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9vblNlcnZpY2VFbmRlZCA9IGxpc3RlbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICovXG4gICAgc2V0T25TZXJ2aWNlRXJyb3IgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX29uU2VydmljZUVycm9yID0gbGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTZGxTZXNzaW9ufSBzZXNzaW9uXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRW5jcnlwdGVkXG4gICAgICovXG4gICAgb25TZXJ2aWNlU3RhcnRlZCAoc2Vzc2lvbiwgc2VydmljZVR5cGUsIGlzRW5jcnlwdGVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb25TZXJ2aWNlU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25TZXJ2aWNlU3RhcnRlZChzZXNzaW9uLCBzZXJ2aWNlVHlwZSwgaXNFbmNyeXB0ZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTZGxTZXNzaW9ufSBzZXNzaW9uXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKi9cbiAgICBvblNlcnZpY2VFbmRlZCAoc2Vzc2lvbiwgc2VydmljZVR5cGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vblNlcnZpY2VFbmRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25TZXJ2aWNlRW5kZWQoc2Vzc2lvbiwgc2VydmljZVR5cGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTZGxTZXNzaW9ufSBzZXNzaW9uXG4gICAgICogQHBhcmFtIHtTZXJ2aWNlVHlwZX0gc2VydmljZVR5cGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVhc29uXG4gICAgICovXG4gICAgb25TZXJ2aWNlRXJyb3IgKHNlc3Npb24sIHNlcnZpY2VUeXBlLCByZWFzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vblNlcnZpY2VFcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fb25TZXJ2aWNlRXJyb3Ioc2Vzc2lvbiwgc2VydmljZVR5cGUsIHJlYXNvbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7IFNkbFNlcnZpY2VMaXN0ZW5lciB9OyIsIi8qXG4qIENvcHlyaWdodCAoYykgMjAxOSwgTGl2aW8sIEluYy5cbiogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbipcbiogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiogZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4qIGRpc3RyaWJ1dGlvbi5cbipcbiogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTGl2aW8gSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4qIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuKlxuKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5pbXBvcnQgeyBUcmFuc3BvcnRCYXNlIH0gZnJvbSAnLi9UcmFuc3BvcnRCYXNlLmpzJztcbmltcG9ydCB7IFNkbFBzbSB9IGZyb20gJy4vU2RsUHNtLmpzJztcblxuY2xhc3MgQ3VzdG9tVHJhbnNwb3J0IGV4dGVuZHMgVHJhbnNwb3J0QmFzZSB7XG4gICAgY29uc3RydWN0b3IgKHRyYW5zcG9ydENvbmZpZywgdHJhbnNwb3J0Q2FsbGJhY2sgPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKHRyYW5zcG9ydENvbmZpZywgdHJhbnNwb3J0Q2FsbGJhY2spO1xuICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1RyYW5zcG9ydENhbGxiYWNrfSBjYWxsYmFja1xuICAgICAqL1xuICAgIHNldFRyYW5zcG9ydENhbGxiYWNrIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyB0aGUgdHJhbnNwb3J0IGNhbGxiYWNrIGZvciBjb25uZWN0aW9uIGVzdGFibGlzaGVkXG4gICAgICovXG4gICAgc3RhcnQgKCkge1xuICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrLm9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyB0aGUgdHJhbnNwb3J0IGNhbGxiYWNrIGZvciBjb25uZWN0aW9uIHRlcm1pbmF0ZWRcbiAgICAgKi9cbiAgICBzdG9wICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRDYWxsYmFjay5vbkNvbm5lY3Rpb25UZXJtaW5hdGVkKCdUcmFuc3BvcnQgdG9sZCB0byBzdG9wJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyB0aGUgdHJhbnNwb3J0IGNhbGxiYWNrIGZvciBhbiBlcnJvclxuICAgICAqL1xuICAgIG9uRXJyb3IgKCkge1xuICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0Q2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrLm9uRXJyb3IoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjb250ZW50cyBpbiB0aGUgcGFja2V0IHNob3VsZCBiZSBzZW50IG91dCB0aHJvdWdoIHRoZSB0cmFuc3BvcnRcbiAgICAgKiBAcGFyYW0ge1NkbFBhY2tldH0gcGFja2V0XG4gICAgICovXG4gICAgc2VuZFBhY2tldCAocGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gcGFja2V0LnRvUGFja2V0KCk7XG4gICAgICAgIHRoaXMub25TZW5kUGFja2V0KGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBhcHAgaW5zdGFudGlhdGluZyB0aGlzIGNsYXNzIG5lZWRzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZCEgc2VuZFBhY2tldCBjYWxscyB0aGlzIG1ldGhvZFxuICAgICAqIEBwYXJhbSB7VUludDhBcnJheX0gYnl0ZXNcbiAgICAgKi9cbiAgICBvblNlbmRQYWNrZXQgKGJ5dGVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb25TZW5kUGFja2V0IG1ldGhvZCBtdXN0IGJlIG92ZXJyaWRkZW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGJ5dGUgYnVmZmVyIHdhcyBwYXNzZWQgaGVyZSBmb3IgcHJvY2Vzc2luZ1xuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gbWVzc2FnZVxuICAgICAqL1xuICAgIG9uQnl0ZUJ1ZmZlclJlY2VpdmVkIChtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuX3F1ZXVlLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuX211bHRpQnl0ZUhhbmRsZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgcmVjZWl2ZWQgZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBxdWV1ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX211bHRpQnl0ZUhhbmRsZXIgKCkge1xuICAgICAgICBpZiAodGhpcy5faXNSdW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gdHJ1ZTtcblxuICAgICAgICB3aGlsZSAodGhpcy5fcXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdWludDggPSB0aGlzLl9xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBieXRlIG9mIHVpbnQ4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlQnl0ZShieXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZlZWRzIGEgYnl0ZSB0aHJvdWdoIHRoZSBpbnRlcm5hbCBQU01cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYnl0ZSAtIHVuc2lnbmVkIDgtYml0IGludGVnZXJcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9oYW5kbGVCeXRlIChieXRlKSB7XG4gICAgICAgIGNvbnN0IHNkbFBzbSA9IHRoaXMuX3NkbFBzbTtcblxuICAgICAgICBjb25zdCBzdWNjZXNzID0gc2RsUHNtLmhhbmRsZUJ5dGUoYnl0ZSk7XG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignZmFpbGVkJywgc2RsUHNtKTtcbiAgICAgICAgICAgIHNkbFBzbS5yZXNldCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzRmluaXNoZWQgPSBzZGxQc20uZ2V0U3RhdGUoKSA9PT0gU2RsUHNtLkZJTklTSEVEX1NUQVRFO1xuXG4gICAgICAgIGlmIChpc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICBjb25zdCBwYWNrZXQgPSBzZGxQc20uZ2V0Rm9ybWVkUGFja2V0KCk7XG4gICAgICAgICAgICBzZGxQc20ucmVzZXQoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnRDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydENhbGxiYWNrLm9uUGFja2V0UmVjZWl2ZWQocGFja2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5leHBvcnQgeyBDdXN0b21UcmFuc3BvcnQgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUcmFuc3BvcnRDb25maWdCYXNlXG4gKiBAcHJvcGVydHkge1RyYW5zcG9ydFR5cGV9IF90cmFuc3BvcnRUeXBlXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRUcmFuc3BvcnRUeXBlXG4gKi9cbmNsYXNzIFRyYW5zcG9ydENvbmZpZ0Jhc2Uge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7VHJhbnNwb3J0VHlwZX0gdHJhbnNwb3J0VHlwZSAtIGVudW1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciAodHJhbnNwb3J0VHlwZSkge1xuICAgICAgICB0aGlzLl90cmFuc3BvcnRUeXBlID0gdHJhbnNwb3J0VHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtUcmFuc3BvcnRUeXBlfVxuICAgICAqL1xuICAgIGdldFRyYW5zcG9ydFR5cGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0VHlwZTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFRyYW5zcG9ydENvbmZpZ0Jhc2UgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgVHJhbnNwb3J0Q29uZmlnQmFzZSB9IGZyb20gJy4vVHJhbnNwb3J0Q29uZmlnQmFzZS5qcyc7XG5pbXBvcnQgeyBUcmFuc3BvcnRUeXBlIH0gZnJvbSAnLi9lbnVtcy9UcmFuc3BvcnRUeXBlLmpzJztcblxuY2xhc3MgQ3VzdG9tVHJhbnNwb3J0Q29uZmlnIGV4dGVuZHMgVHJhbnNwb3J0Q29uZmlnQmFzZSB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqIEBwYXJhbSB7Q3VzdG9tVHJhbnNwb3J0fSBjdXN0b21UcmFuc3BvcnQgLSBBbiBpbnN0YW5jZSBvZiBhIGN1c3RvbSB0cmFuc3BvcnRcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChjdXN0b21UcmFuc3BvcnQpIHtcbiAgICAgICAgc3VwZXIoVHJhbnNwb3J0VHlwZS5DVVNUT00pO1xuICAgICAgICB0aGlzLl9jdXN0b21UcmFuc3BvcnQgPSBjdXN0b21UcmFuc3BvcnQ7XG4gICAgfVxuXG4gICAgZ2V0VHJhbnNwb3J0VHlwZSAoKSB7XG4gICAgICAgIHJldHVybiBUcmFuc3BvcnRUeXBlLkNVU1RPTTtcbiAgICB9XG5cbiAgICBnZXRUcmFuc3BvcnQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VzdG9tVHJhbnNwb3J0O1xuICAgIH1cbn1cblxuZXhwb3J0IHsgQ3VzdG9tVHJhbnNwb3J0Q29uZmlnIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmNsYXNzIFNzbENvbmZpZyB7XG4gICAgY29uc3RydWN0b3IgKHBlbUNlcnRpZmljYXRlID0gbnVsbCwgcHJpdmF0ZUtleSA9IG51bGwsIHBhc3N3b3JkID0gbnVsbCkge1xuICAgICAgICB0aGlzLl9wZW1DZXJ0aWZpY2F0ZSA9IHBlbUNlcnRpZmljYXRlO1xuICAgICAgICB0aGlzLl9wcml2YXRlS2V5ID0gcHJpdmF0ZUtleTtcbiAgICAgICAgdGhpcy5fcGFzc3dvcmQgPSBwYXNzd29yZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIFBFTSBDZXJ0aWZpY2F0ZVxuICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICovXG4gICAgZ2V0UGVtQ2VydGlmaWNhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGVtQ2VydGlmaWNhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBQcml2YXRlIEtleVxuICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICovXG4gICAgZ2V0UHJpdmF0ZUtleSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlS2V5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgcGFzc3dvcmRcbiAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAqL1xuICAgIGdldFBhc3N3b3JkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bhc3N3b3JkO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgU3NsQ29uZmlnIH07XG4iLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuaW1wb3J0IHsgVHJhbnNwb3J0VHlwZSB9IGZyb20gJy4vZW51bXMvVHJhbnNwb3J0VHlwZS5qcyc7XG5pbXBvcnQgeyBUcmFuc3BvcnRDb25maWdCYXNlIH0gZnJvbSAnLi9UcmFuc3BvcnRDb25maWdCYXNlLmpzJztcblxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRyYW5zcG9ydENvbmZpZ0Jhc2VcbiAqIEBwcm9wZXJ0eSB7VHJhbnNwb3J0VHlwZX0gX3RyYW5zcG9ydFR5cGVcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldFRyYW5zcG9ydFR5cGVcbiAqL1xuY2xhc3MgV2ViU29ja2V0Q2xpZW50Q29uZmlnIGV4dGVuZHMgVHJhbnNwb3J0Q29uZmlnQmFzZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtUcmFuc3BvcnRUeXBlfSB0cmFuc3BvcnRUeXBlIC0gZW51bVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChob3N0LCBwb3J0KSB7XG4gICAgICAgIHN1cGVyKFRyYW5zcG9ydFR5cGUuV0VCU09DS0VUX0NMSUVOVCk7XG5cbiAgICAgICAgdGhpcy5faG9zdCA9IGhvc3Q7XG4gICAgICAgIHRoaXMuX3BvcnQgPSBwb3J0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4gU3RyaW5nXG4gICAgICovXG4gICAgZ2V0SG9zdCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ob3N0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4gTnVtYmVyXG4gICAgICovXG4gICAgZ2V0UG9ydCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3J0O1xuICAgIH1cbn1cblxuZXhwb3J0IHsgV2ViU29ja2V0Q2xpZW50Q29uZmlnIH07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmNsYXNzIFRyYW5zcG9ydFJlY29yZCB7XG4gICAgLyoqXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAqIEBwYXJhbSB7VHJhbnNwb3J0VHlwZX0gdHJhbnNwb3J0VHlwZSAtIFRoZSB0eXBlIG9mIHRoZSB0cmFuc3BvcnRcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBhZGRyZXNzXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvciAodHJhbnNwb3J0VHlwZSwgYWRkcmVzcykge1xuICAgICAgICB0aGlzLl90eXBlID0gdHJhbnNwb3J0VHlwZTtcbiAgICAgICAgdGhpcy5fYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgfVxuXG4gICAgZ2V0VHlwZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xuICAgIH1cblxuICAgIGdldEFkZHJlc3MgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkcmVzcztcbiAgICB9XG5cbiAgICBlcXVhbHMgKG9iaikge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgb2JqIGluc3RhbmNlb2YgVHJhbnNwb3J0UmVjb3JkXG4gICAgICAgICAgICAmJiBvYmouZ2V0VHlwZSAhPT0gbnVsbFxuICAgICAgICAgICAgJiYgb2JqLmdldFR5cGUoKSA9PT0gdGhpcy5nZXRUeXBlKClcbiAgICAgICAgICAgICYmIG9iai5nZXRBZGRyZXNzKCkgPT09IHRoaXMuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcgKCkge1xuICAgICAgICByZXR1cm4gYFRyYW5zcG9ydCBUeXBlOiAke3RoaXMuX3R5cGUubmFtZSgpfSBcXG4gQWRkcmVzczogJHt0aGlzLl9hZGRyZXNzfWA7XG4gICAgfVxufVxuXG5leHBvcnQgeyBUcmFuc3BvcnRSZWNvcmQgfTsiLCIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTksIExpdmlvLCBJbmMuXG4qIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qXG4qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbipcbiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4qIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4qIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4qIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuKiBkaXN0cmlidXRpb24uXG4qXG4qIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIExpdmlvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4qIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZVxuKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbipcbiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4qIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4qIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4qIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuY29uc3QgeyBUcmFuc3BvcnRDb25maWdCYXNlIH0gPSByZXF1aXJlKCcuL1RyYW5zcG9ydENvbmZpZ0Jhc2UuanMnKTtcbmNvbnN0IHsgVHJhbnNwb3J0VHlwZSB9ID0gcmVxdWlyZSgnLi9lbnVtcy9UcmFuc3BvcnRUeXBlLmpzJyk7XG5cbmNsYXNzIFdlYlNvY2tldFNlcnZlckNvbmZpZyBleHRlbmRzIFRyYW5zcG9ydENvbmZpZ0Jhc2Uge1xuICAgIC8qKlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKiBAcGFyYW0ge1dlYlNvY2tldC5jbGllbnR9IGNsaWVudCAtIEEgY2xpZW50IGNvbm5lY3Rpb24gcmVmZXJlbmNlIG1hZGUgZnJvbSBhIFdlYlNvY2tldCBzZXJ2ZXJcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChjbGllbnQgPSBudWxsLCBjb25uZWN0aW9uTG9zdFRpbWVvdXQgPSA2MDAwMCkge1xuICAgICAgICBzdXBlcihUcmFuc3BvcnRUeXBlLldFQlNPQ0tFVF9TRVJWRVIpO1xuICAgICAgICB0aGlzLl9jbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25Mb3N0VGltZW91dCA9IGNvbm5lY3Rpb25Mb3N0VGltZW91dDtcblxuICAgICAgICBpZiAoY2xpZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignY2xpZW50IG11c3QgYmUgYSBXZWJTb2NrZXQgY2xpZW50Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIHdlYnNvY2tldCBjbGllbnRcbiAgICAqIEByZXR1cm4ge1dlYlNvY2tldC5jbGllbnR9XG4gICAgKi9cbiAgICBnZXRDbGllbnQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgd2Vic29ja2V0IGNvbm5lY3Rpb24gbG9zdCB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kc1xuICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICovXG4gICAgZ2V0Q29ubmVjdGlvbkxvc3RUaW1lb3V0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25Mb3N0VGltZW91dDtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIFdlYlNvY2tldFNlcnZlckNvbmZpZyxcbn07IiwiLypcbiogQ29weXJpZ2h0IChjKSAyMDE5LCBMaXZpbywgSW5jLlxuKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKlxuKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4qXG4qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbipcbiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiogZGlzdHJpYnV0aW9uLlxuKlxuKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBMaXZpbyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmVcbiogd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4qXG4qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbmltcG9ydCB7IEFwcENvbmZpZyB9IGZyb20gJy4vdG1wL21hbmFnZXIvQXBwQ29uZmlnLmpzJztcbmltcG9ydCB7IExpZmVjeWNsZUxpc3RlbmVyIH0gZnJvbSAnLi90bXAvbWFuYWdlci9saWZlY3ljbGUvTGlmZWN5Y2xlTGlzdGVuZXIuanMnO1xuaW1wb3J0IHsgTGlmZWN5Y2xlTWFuYWdlciB9IGZyb20gJy4vdG1wL21hbmFnZXIvbGlmZWN5Y2xlL0xpZmVjeWNsZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQmluYXJ5RnJhbWVIZWFkZXIgfSBmcm9tICcuL3RtcC9wcm90b2NvbC9CaW5hcnlGcmFtZUhlYWRlci5qcyc7XG5pbXBvcnQgeyBNZXNzYWdlRnJhbWVBc3NlbWJsZXIgfSBmcm9tICcuL3RtcC9wcm90b2NvbC9NZXNzYWdlRnJhbWVBc3NlbWJsZXIuanMnO1xuaW1wb3J0IHsgTWVzc2FnZUZyYW1lRGlzYXNzZW1ibGVyIH0gZnJvbSAnLi90bXAvcHJvdG9jb2wvTWVzc2FnZUZyYW1lRGlzYXNzZW1ibGVyLmpzJztcbmltcG9ydCB7IFNkbFBhY2tldCB9IGZyb20gJy4vdG1wL3Byb3RvY29sL1NkbFBhY2tldC5qcyc7XG5pbXBvcnQgeyBTZGxQYWNrZXRGYWN0b3J5IH0gZnJvbSAnLi90bXAvcHJvdG9jb2wvU2RsUGFja2V0RmFjdG9yeS5qcyc7XG5pbXBvcnQgeyBTZGxQcm90b2NvbCB9IGZyb20gJy4vdG1wL3Byb3RvY29sL1NkbFByb3RvY29sLmpzJztcbmltcG9ydCB7IFNkbFByb3RvY29sQmFzZSB9IGZyb20gJy4vdG1wL3Byb3RvY29sL1NkbFByb3RvY29sQmFzZS5qcyc7XG5pbXBvcnQgeyBTZGxQcm90b2NvbExpc3RlbmVyIH0gZnJvbSAnLi90bXAvcHJvdG9jb2wvU2RsUHJvdG9jb2xMaXN0ZW5lci5qcyc7XG5pbXBvcnQgeyBDb250cm9sRnJhbWVUYWdzIH0gZnJvbSAnLi90bXAvcHJvdG9jb2wvZW51bXMvQ29udHJvbEZyYW1lVGFncy5qcyc7XG5pbXBvcnQgeyBGcmFtZVR5cGUgfSBmcm9tICcuL3RtcC9wcm90b2NvbC9lbnVtcy9GcmFtZVR5cGUuanMnO1xuaW1wb3J0IHsgU2VydmljZVR5cGUgfSBmcm9tICcuL3RtcC9wcm90b2NvbC9lbnVtcy9TZXJ2aWNlVHlwZS5qcyc7XG5pbXBvcnQgeyBScGNDcmVhdG9yIH0gZnJvbSAnLi90bXAvcnBjL1JwY0NyZWF0b3IuanMnO1xuaW1wb3J0IHsgUnBjTGlzdGVuZXIgfSBmcm9tICcuL3RtcC9ycGMvUnBjTGlzdGVuZXIuanMnO1xuaW1wb3J0IHsgUnBjTWVzc2FnZSB9IGZyb20gJy4vdG1wL3JwYy9ScGNNZXNzYWdlLmpzJztcbmltcG9ydCB7IFJwY05vdGlmaWNhdGlvbiB9IGZyb20gJy4vdG1wL3JwYy9ScGNOb3RpZmljYXRpb24uanMnO1xuaW1wb3J0IHsgUnBjUmVxdWVzdCB9IGZyb20gJy4vdG1wL3JwYy9ScGNSZXF1ZXN0LmpzJztcbmltcG9ydCB7IFJwY1Jlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL1JwY1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IFJwY1N0cnVjdCB9IGZyb20gJy4vdG1wL3JwYy9ScGNTdHJ1Y3QuanMnO1xuaW1wb3J0IHsgQW1iaWVudExpZ2h0U3RhdHVzIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0FtYmllbnRMaWdodFN0YXR1cy5qcyc7XG5pbXBvcnQgeyBBcHBITUlUeXBlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0FwcEhNSVR5cGUuanMnO1xuaW1wb3J0IHsgQXBwSW50ZXJmYWNlVW5yZWdpc3RlcmVkUmVhc29uIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0FwcEludGVyZmFjZVVucmVnaXN0ZXJlZFJlYXNvbi5qcyc7XG5pbXBvcnQgeyBBcHBTZXJ2aWNlVHlwZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9BcHBTZXJ2aWNlVHlwZS5qcyc7XG5pbXBvcnQgeyBBdWRpb1N0cmVhbWluZ0luZGljYXRvciB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9BdWRpb1N0cmVhbWluZ0luZGljYXRvci5qcyc7XG5pbXBvcnQgeyBBdWRpb1N0cmVhbWluZ1N0YXRlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0F1ZGlvU3RyZWFtaW5nU3RhdGUuanMnO1xuaW1wb3J0IHsgQXVkaW9UeXBlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0F1ZGlvVHlwZS5qcyc7XG5pbXBvcnQgeyBCaXRzUGVyU2FtcGxlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0JpdHNQZXJTYW1wbGUuanMnO1xuaW1wb3J0IHsgQnV0dG9uRXZlbnRNb2RlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0J1dHRvbkV2ZW50TW9kZS5qcyc7XG5pbXBvcnQgeyBCdXR0b25OYW1lIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0J1dHRvbk5hbWUuanMnO1xuaW1wb3J0IHsgQnV0dG9uUHJlc3NNb2RlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0J1dHRvblByZXNzTW9kZS5qcyc7XG5pbXBvcnQgeyBDYXJNb2RlU3RhdHVzIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0Nhck1vZGVTdGF0dXMuanMnO1xuaW1wb3J0IHsgQ2hhcmFjdGVyU2V0IH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0NoYXJhY3RlclNldC5qcyc7XG5pbXBvcnQgeyBDb21wYXNzRGlyZWN0aW9uIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0NvbXBhc3NEaXJlY3Rpb24uanMnO1xuaW1wb3J0IHsgQ29tcG9uZW50Vm9sdW1lU3RhdHVzIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0NvbXBvbmVudFZvbHVtZVN0YXR1cy5qcyc7XG5pbXBvcnQgeyBEZWZyb3N0Wm9uZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9EZWZyb3N0Wm9uZS5qcyc7XG5pbXBvcnQgeyBEZWxpdmVyeU1vZGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvRGVsaXZlcnlNb2RlLmpzJztcbmltcG9ydCB7IERldmljZUxldmVsU3RhdHVzIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0RldmljZUxldmVsU3RhdHVzLmpzJztcbmltcG9ydCB7IERpbWVuc2lvbiB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9EaW1lbnNpb24uanMnO1xuaW1wb3J0IHsgRGlyZWN0aW9uIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0RpcmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBEaXNwbGF5TW9kZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9EaXNwbGF5TW9kZS5qcyc7XG5pbXBvcnQgeyBEaXNwbGF5VHlwZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9EaXNwbGF5VHlwZS5qcyc7XG5pbXBvcnQgeyBEaXN0YW5jZVVuaXQgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvRGlzdGFuY2VVbml0LmpzJztcbmltcG9ydCB7IERyaXZlckRpc3RyYWN0aW9uU3RhdGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvRHJpdmVyRGlzdHJhY3Rpb25TdGF0ZS5qcyc7XG5pbXBvcnQgeyBFQ2FsbENvbmZpcm1hdGlvblN0YXR1cyB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9FQ2FsbENvbmZpcm1hdGlvblN0YXR1cy5qcyc7XG5pbXBvcnQgeyBFbGVjdHJvbmljUGFya0JyYWtlU3RhdHVzIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0VsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMuanMnO1xuaW1wb3J0IHsgRW1lcmdlbmN5RXZlbnRUeXBlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0VtZXJnZW5jeUV2ZW50VHlwZS5qcyc7XG5pbXBvcnQgeyBGaWxlVHlwZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9GaWxlVHlwZS5qcyc7XG5pbXBvcnQgeyBGdWVsQ3V0b2ZmU3RhdHVzIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0Z1ZWxDdXRvZmZTdGF0dXMuanMnO1xuaW1wb3J0IHsgRnVlbFR5cGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvRnVlbFR5cGUuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25JRCB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9GdW5jdGlvbklELmpzJztcbmltcG9ydCB7IEdsb2JhbFByb3BlcnR5IH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0dsb2JhbFByb3BlcnR5LmpzJztcbmltcG9ydCB7IEhNSUxldmVsIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0hNSUxldmVsLmpzJztcbmltcG9ydCB7IEhtaVpvbmVDYXBhYmlsaXRpZXMgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvSG1pWm9uZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBIeWJyaWRBcHBQcmVmZXJlbmNlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0h5YnJpZEFwcFByZWZlcmVuY2UuanMnO1xuaW1wb3J0IHsgSWduaXRpb25TdGFibGVTdGF0dXMgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvSWduaXRpb25TdGFibGVTdGF0dXMuanMnO1xuaW1wb3J0IHsgSWduaXRpb25TdGF0dXMgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvSWduaXRpb25TdGF0dXMuanMnO1xuaW1wb3J0IHsgSW1hZ2VGaWVsZE5hbWUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvSW1hZ2VGaWVsZE5hbWUuanMnO1xuaW1wb3J0IHsgSW1hZ2VUeXBlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0ltYWdlVHlwZS5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbk1vZGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvSW50ZXJhY3Rpb25Nb2RlLmpzJztcbmltcG9ydCB7IEtleWJvYXJkRXZlbnQgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvS2V5Ym9hcmRFdmVudC5qcyc7XG5pbXBvcnQgeyBLZXlib2FyZExheW91dCB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9LZXlib2FyZExheW91dC5qcyc7XG5pbXBvcnQgeyBLZXlwcmVzc01vZGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvS2V5cHJlc3NNb2RlLmpzJztcbmltcG9ydCB7IExhbmd1YWdlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0xhbmd1YWdlLmpzJztcbmltcG9ydCB7IExheW91dE1vZGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvTGF5b3V0TW9kZS5qcyc7XG5pbXBvcnQgeyBMaWdodE5hbWUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvTGlnaHROYW1lLmpzJztcbmltcG9ydCB7IExpZ2h0U3RhdHVzIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL0xpZ2h0U3RhdHVzLmpzJztcbmltcG9ydCB7IE1haW50ZW5hbmNlTW9kZVN0YXR1cyB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9NYWludGVuYW5jZU1vZGVTdGF0dXMuanMnO1xuaW1wb3J0IHsgTWFzc2FnZUN1c2hpb24gfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvTWFzc2FnZUN1c2hpb24uanMnO1xuaW1wb3J0IHsgTWFzc2FnZU1vZGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvTWFzc2FnZU1vZGUuanMnO1xuaW1wb3J0IHsgTWFzc2FnZVpvbmUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvTWFzc2FnZVpvbmUuanMnO1xuaW1wb3J0IHsgTWVkaWFDbG9ja0Zvcm1hdCB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9NZWRpYUNsb2NrRm9ybWF0LmpzJztcbmltcG9ydCB7IE1lZGlhVHlwZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9NZWRpYVR5cGUuanMnO1xuaW1wb3J0IHsgTWVudUxheW91dCB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9NZW51TGF5b3V0LmpzJztcbmltcG9ydCB7IE1ldGFkYXRhVHlwZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9NZXRhZGF0YVR5cGUuanMnO1xuaW1wb3J0IHsgTW9kdWxlVHlwZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9Nb2R1bGVUeXBlLmpzJztcbmltcG9ydCB7IE5hdmlnYXRpb25BY3Rpb24gfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvTmF2aWdhdGlvbkFjdGlvbi5qcyc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uSnVuY3Rpb24gfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvTmF2aWdhdGlvbkp1bmN0aW9uLmpzJztcbmltcG9ydCB7IFBSTkRMIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1BSTkRMLmpzJztcbmltcG9ydCB7IFBlcm1pc3Npb25TdGF0dXMgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvUGVybWlzc2lvblN0YXR1cy5qcyc7XG5pbXBvcnQgeyBQb3dlck1vZGVRdWFsaWZpY2F0aW9uU3RhdHVzIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1Bvd2VyTW9kZVF1YWxpZmljYXRpb25TdGF0dXMuanMnO1xuaW1wb3J0IHsgUG93ZXJNb2RlU3RhdHVzIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1Bvd2VyTW9kZVN0YXR1cy5qcyc7XG5pbXBvcnQgeyBQcmVkZWZpbmVkTGF5b3V0IH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1ByZWRlZmluZWRMYXlvdXQuanMnO1xuaW1wb3J0IHsgUHJlZGVmaW5lZFdpbmRvd3MgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvUHJlZGVmaW5lZFdpbmRvd3MuanMnO1xuaW1wb3J0IHsgUHJlcmVjb3JkZWRTcGVlY2ggfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvUHJlcmVjb3JkZWRTcGVlY2guanMnO1xuaW1wb3J0IHsgUHJpbWFyeUF1ZGlvU291cmNlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1ByaW1hcnlBdWRpb1NvdXJjZS5qcyc7XG5pbXBvcnQgeyBSYWRpb0JhbmQgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvUmFkaW9CYW5kLmpzJztcbmltcG9ydCB7IFJhZGlvU3RhdGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvUmFkaW9TdGF0ZS5qcyc7XG5pbXBvcnQgeyBSZXF1ZXN0VHlwZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9SZXF1ZXN0VHlwZS5qcyc7XG5pbXBvcnQgeyBSZXN1bHQgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvUmVzdWx0LmpzJztcbmltcG9ydCB7IFJwY1R5cGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvUnBjVHlwZS5qcyc7XG5pbXBvcnQgeyBTYW1wbGluZ1JhdGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvU2FtcGxpbmdSYXRlLmpzJztcbmltcG9ydCB7IFNlYXRNZW1vcnlBY3Rpb25UeXBlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1NlYXRNZW1vcnlBY3Rpb25UeXBlLmpzJztcbmltcG9ydCB7IFNlcnZpY2VVcGRhdGVSZWFzb24gfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvU2VydmljZVVwZGF0ZVJlYXNvbi5qcyc7XG5pbXBvcnQgeyBTb2Z0QnV0dG9uVHlwZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9Tb2Z0QnV0dG9uVHlwZS5qcyc7XG5pbXBvcnQgeyBTcGVlY2hDYXBhYmlsaXRpZXMgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvU3BlZWNoQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IFN1cHBvcnRlZFNlYXQgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvU3VwcG9ydGVkU2VhdC5qcyc7XG5pbXBvcnQgeyBTeXN0ZW1BY3Rpb24gfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvU3lzdGVtQWN0aW9uLmpzJztcbmltcG9ydCB7IFN5c3RlbUNhcGFiaWxpdHlUeXBlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1N5c3RlbUNhcGFiaWxpdHlUeXBlLmpzJztcbmltcG9ydCB7IFN5c3RlbUNvbnRleHQgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvU3lzdGVtQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBUQlRTdGF0ZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9UQlRTdGF0ZS5qcyc7XG5pbXBvcnQgeyBUUE1TIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1RQTVMuanMnO1xuaW1wb3J0IHsgVGVtcGVyYXR1cmVVbml0IH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1RlbXBlcmF0dXJlVW5pdC5qcyc7XG5pbXBvcnQgeyBUZXh0QWxpZ25tZW50IH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1RleHRBbGlnbm1lbnQuanMnO1xuaW1wb3J0IHsgVGV4dEZpZWxkTmFtZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9UZXh0RmllbGROYW1lLmpzJztcbmltcG9ydCB7IFRpbWVyTW9kZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9UaW1lck1vZGUuanMnO1xuaW1wb3J0IHsgVG91Y2hUeXBlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1RvdWNoVHlwZS5qcyc7XG5pbXBvcnQgeyBUcmlnZ2VyU291cmNlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1RyaWdnZXJTb3VyY2UuanMnO1xuaW1wb3J0IHsgVHVyblNpZ25hbCB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9UdXJuU2lnbmFsLmpzJztcbmltcG9ydCB7IFVwZGF0ZU1vZGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvVXBkYXRlTW9kZS5qcyc7XG5pbXBvcnQgeyBWZWhpY2xlRGF0YUFjdGl2ZVN0YXR1cyB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9WZWhpY2xlRGF0YUFjdGl2ZVN0YXR1cy5qcyc7XG5pbXBvcnQgeyBWZWhpY2xlRGF0YUV2ZW50U3RhdHVzIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1ZlaGljbGVEYXRhRXZlbnRTdGF0dXMuanMnO1xuaW1wb3J0IHsgVmVoaWNsZURhdGFOb3RpZmljYXRpb25TdGF0dXMgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvVmVoaWNsZURhdGFOb3RpZmljYXRpb25TdGF0dXMuanMnO1xuaW1wb3J0IHsgVmVoaWNsZURhdGFSZXN1bHRDb2RlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1ZlaGljbGVEYXRhUmVzdWx0Q29kZS5qcyc7XG5pbXBvcnQgeyBWZWhpY2xlRGF0YVN0YXR1cyB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9WZWhpY2xlRGF0YVN0YXR1cy5qcyc7XG5pbXBvcnQgeyBWZWhpY2xlRGF0YVR5cGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvVmVoaWNsZURhdGFUeXBlLmpzJztcbmltcG9ydCB7IFZlbnRpbGF0aW9uTW9kZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9WZW50aWxhdGlvbk1vZGUuanMnO1xuaW1wb3J0IHsgVmlkZW9TdHJlYW1pbmdDb2RlYyB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9WaWRlb1N0cmVhbWluZ0NvZGVjLmpzJztcbmltcG9ydCB7IFZpZGVvU3RyZWFtaW5nUHJvdG9jb2wgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvVmlkZW9TdHJlYW1pbmdQcm90b2NvbC5qcyc7XG5pbXBvcnQgeyBWaWRlb1N0cmVhbWluZ1N0YXRlIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1ZpZGVvU3RyZWFtaW5nU3RhdGUuanMnO1xuaW1wb3J0IHsgVnJDYXBhYmlsaXRpZXMgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvVnJDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgV2FybmluZ0xpZ2h0U3RhdHVzIH0gZnJvbSAnLi90bXAvcnBjL2VudW1zL1dhcm5pbmdMaWdodFN0YXR1cy5qcyc7XG5pbXBvcnQgeyBXYXlQb2ludFR5cGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvV2F5UG9pbnRUeXBlLmpzJztcbmltcG9ydCB7IFdpbmRvd1R5cGUgfSBmcm9tICcuL3RtcC9ycGMvZW51bXMvV2luZG93VHlwZS5qcyc7XG5pbXBvcnQgeyBXaXBlclN0YXR1cyB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9XaXBlclN0YXR1cy5qcyc7XG5pbXBvcnQgeyBtZXNzYWdlVHlwZSB9IGZyb20gJy4vdG1wL3JwYy9lbnVtcy9tZXNzYWdlVHlwZS5qcyc7XG5pbXBvcnQgeyBBZGRDb21tYW5kIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0FkZENvbW1hbmQuanMnO1xuaW1wb3J0IHsgQWRkQ29tbWFuZFJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0FkZENvbW1hbmRSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBBZGRTdWJNZW51IH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0FkZFN1Yk1lbnUuanMnO1xuaW1wb3J0IHsgQWRkU3ViTWVudVJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0FkZFN1Yk1lbnVSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBBbGVydCB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9BbGVydC5qcyc7XG5pbXBvcnQgeyBBbGVydE1hbmV1dmVyIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0FsZXJ0TWFuZXV2ZXIuanMnO1xuaW1wb3J0IHsgQWxlcnRNYW5ldXZlclJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0FsZXJ0TWFuZXV2ZXJSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBBbGVydFJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0FsZXJ0UmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgQnV0dG9uUHJlc3MgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvQnV0dG9uUHJlc3MuanMnO1xuaW1wb3J0IHsgQnV0dG9uUHJlc3NSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9CdXR0b25QcmVzc1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IENhbmNlbEludGVyYWN0aW9uIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0NhbmNlbEludGVyYWN0aW9uLmpzJztcbmltcG9ydCB7IENhbmNlbEludGVyYWN0aW9uUmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvQ2FuY2VsSW50ZXJhY3Rpb25SZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBDaGFuZ2VSZWdpc3RyYXRpb24gfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvQ2hhbmdlUmVnaXN0cmF0aW9uLmpzJztcbmltcG9ydCB7IENoYW5nZVJlZ2lzdHJhdGlvblJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0NoYW5nZVJlZ2lzdHJhdGlvblJlc3BvbnNlLmpzJztcbmltcG9ydCB7IENsb3NlQXBwbGljYXRpb24gfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvQ2xvc2VBcHBsaWNhdGlvbi5qcyc7XG5pbXBvcnQgeyBDbG9zZUFwcGxpY2F0aW9uUmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvQ2xvc2VBcHBsaWNhdGlvblJlc3BvbnNlLmpzJztcbmltcG9ydCB7IENyZWF0ZUludGVyYWN0aW9uQ2hvaWNlU2V0IH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0NyZWF0ZUludGVyYWN0aW9uQ2hvaWNlU2V0LmpzJztcbmltcG9ydCB7IENyZWF0ZUludGVyYWN0aW9uQ2hvaWNlU2V0UmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvQ3JlYXRlSW50ZXJhY3Rpb25DaG9pY2VTZXRSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBDcmVhdGVXaW5kb3cgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvQ3JlYXRlV2luZG93LmpzJztcbmltcG9ydCB7IENyZWF0ZVdpbmRvd1Jlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0NyZWF0ZVdpbmRvd1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IERlbGV0ZUNvbW1hbmQgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvRGVsZXRlQ29tbWFuZC5qcyc7XG5pbXBvcnQgeyBEZWxldGVDb21tYW5kUmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvRGVsZXRlQ29tbWFuZFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IERlbGV0ZUZpbGUgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvRGVsZXRlRmlsZS5qcyc7XG5pbXBvcnQgeyBEZWxldGVGaWxlUmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvRGVsZXRlRmlsZVJlc3BvbnNlLmpzJztcbmltcG9ydCB7IERlbGV0ZUludGVyYWN0aW9uQ2hvaWNlU2V0IH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0RlbGV0ZUludGVyYWN0aW9uQ2hvaWNlU2V0LmpzJztcbmltcG9ydCB7IERlbGV0ZUludGVyYWN0aW9uQ2hvaWNlU2V0UmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvRGVsZXRlSW50ZXJhY3Rpb25DaG9pY2VTZXRSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBEZWxldGVTdWJNZW51IH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0RlbGV0ZVN1Yk1lbnUuanMnO1xuaW1wb3J0IHsgRGVsZXRlU3ViTWVudVJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0RlbGV0ZVN1Yk1lbnVSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBEZWxldGVXaW5kb3cgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvRGVsZXRlV2luZG93LmpzJztcbmltcG9ydCB7IERlbGV0ZVdpbmRvd1Jlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0RlbGV0ZVdpbmRvd1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IERpYWdub3N0aWNNZXNzYWdlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0RpYWdub3N0aWNNZXNzYWdlLmpzJztcbmltcG9ydCB7IERpYWdub3N0aWNNZXNzYWdlUmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvRGlhZ25vc3RpY01lc3NhZ2VSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBEaWFsTnVtYmVyIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0RpYWxOdW1iZXIuanMnO1xuaW1wb3J0IHsgRGlhbE51bWJlclJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0RpYWxOdW1iZXJSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBFbmNvZGVkU3luY1BEYXRhIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0VuY29kZWRTeW5jUERhdGEuanMnO1xuaW1wb3J0IHsgRW5jb2RlZFN5bmNQRGF0YVJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0VuY29kZWRTeW5jUERhdGFSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBFbmRBdWRpb1Bhc3NUaHJ1IH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0VuZEF1ZGlvUGFzc1RocnUuanMnO1xuaW1wb3J0IHsgRW5kQXVkaW9QYXNzVGhydVJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0VuZEF1ZGlvUGFzc1RocnVSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBHZW5lcmljUmVzcG9uc2VSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9HZW5lcmljUmVzcG9uc2VSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBHZXRBcHBTZXJ2aWNlRGF0YSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9HZXRBcHBTZXJ2aWNlRGF0YS5qcyc7XG5pbXBvcnQgeyBHZXRBcHBTZXJ2aWNlRGF0YVJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0dldEFwcFNlcnZpY2VEYXRhUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgR2V0Q2xvdWRBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0dldENsb3VkQXBwUHJvcGVydGllcy5qcyc7XG5pbXBvcnQgeyBHZXRDbG91ZEFwcFByb3BlcnRpZXNSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9HZXRDbG91ZEFwcFByb3BlcnRpZXNSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBHZXREVENzIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0dldERUQ3MuanMnO1xuaW1wb3J0IHsgR2V0RFRDc1Jlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0dldERUQ3NSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBHZXRGaWxlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0dldEZpbGUuanMnO1xuaW1wb3J0IHsgR2V0RmlsZVJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0dldEZpbGVSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBHZXRJbnRlcmlvclZlaGljbGVEYXRhIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0dldEludGVyaW9yVmVoaWNsZURhdGEuanMnO1xuaW1wb3J0IHsgR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnQgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnQuanMnO1xuaW1wb3J0IHsgR2V0SW50ZXJpb3JWZWhpY2xlRGF0YUNvbnNlbnRSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9HZXRJbnRlcmlvclZlaGljbGVEYXRhQ29uc2VudFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IEdldEludGVyaW9yVmVoaWNsZURhdGFSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9HZXRJbnRlcmlvclZlaGljbGVEYXRhUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgR2V0U3lzdGVtQ2FwYWJpbGl0eSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9HZXRTeXN0ZW1DYXBhYmlsaXR5LmpzJztcbmltcG9ydCB7IEdldFN5c3RlbUNhcGFiaWxpdHlSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9HZXRTeXN0ZW1DYXBhYmlsaXR5UmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgR2V0VmVoaWNsZURhdGEgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvR2V0VmVoaWNsZURhdGEuanMnO1xuaW1wb3J0IHsgR2V0VmVoaWNsZURhdGFSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9HZXRWZWhpY2xlRGF0YVJlc3BvbnNlLmpzJztcbmltcG9ydCB7IEdldFdheVBvaW50cyB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9HZXRXYXlQb2ludHMuanMnO1xuaW1wb3J0IHsgR2V0V2F5UG9pbnRzUmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvR2V0V2F5UG9pbnRzUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgTGlzdEZpbGVzIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL0xpc3RGaWxlcy5qcyc7XG5pbXBvcnQgeyBMaXN0RmlsZXNSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9MaXN0RmlsZXNSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBPbkFwcEludGVyZmFjZVVucmVnaXN0ZXJlZCB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9PbkFwcEludGVyZmFjZVVucmVnaXN0ZXJlZC5qcyc7XG5pbXBvcnQgeyBPbkFwcFNlcnZpY2VEYXRhIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL09uQXBwU2VydmljZURhdGEuanMnO1xuaW1wb3J0IHsgT25BdWRpb1Bhc3NUaHJ1IH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL09uQXVkaW9QYXNzVGhydS5qcyc7XG5pbXBvcnQgeyBPbkJ1dHRvbkV2ZW50IH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL09uQnV0dG9uRXZlbnQuanMnO1xuaW1wb3J0IHsgT25CdXR0b25QcmVzcyB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9PbkJ1dHRvblByZXNzLmpzJztcbmltcG9ydCB7IE9uQ29tbWFuZCB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9PbkNvbW1hbmQuanMnO1xuaW1wb3J0IHsgT25Ecml2ZXJEaXN0cmFjdGlvbiB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9PbkRyaXZlckRpc3RyYWN0aW9uLmpzJztcbmltcG9ydCB7IE9uRW5jb2RlZFN5bmNQRGF0YSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9PbkVuY29kZWRTeW5jUERhdGEuanMnO1xuaW1wb3J0IHsgT25ITUlTdGF0dXMgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvT25ITUlTdGF0dXMuanMnO1xuaW1wb3J0IHsgT25IYXNoQ2hhbmdlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL09uSGFzaENoYW5nZS5qcyc7XG5pbXBvcnQgeyBPbkludGVyaW9yVmVoaWNsZURhdGEgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvT25JbnRlcmlvclZlaGljbGVEYXRhLmpzJztcbmltcG9ydCB7IE9uS2V5Ym9hcmRJbnB1dCB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9PbktleWJvYXJkSW5wdXQuanMnO1xuaW1wb3J0IHsgT25MYW5ndWFnZUNoYW5nZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9Pbkxhbmd1YWdlQ2hhbmdlLmpzJztcbmltcG9ydCB7IE9uUGVybWlzc2lvbnNDaGFuZ2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvT25QZXJtaXNzaW9uc0NoYW5nZS5qcyc7XG5pbXBvcnQgeyBPblJDU3RhdHVzIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL09uUkNTdGF0dXMuanMnO1xuaW1wb3J0IHsgT25TeXN0ZW1DYXBhYmlsaXR5VXBkYXRlZCB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9PblN5c3RlbUNhcGFiaWxpdHlVcGRhdGVkLmpzJztcbmltcG9ydCB7IE9uU3lzdGVtUmVxdWVzdCB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9PblN5c3RlbVJlcXVlc3QuanMnO1xuaW1wb3J0IHsgT25UQlRDbGllbnRTdGF0ZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9PblRCVENsaWVudFN0YXRlLmpzJztcbmltcG9ydCB7IE9uVG91Y2hFdmVudCB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9PblRvdWNoRXZlbnQuanMnO1xuaW1wb3J0IHsgT25WZWhpY2xlRGF0YSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9PblZlaGljbGVEYXRhLmpzJztcbmltcG9ydCB7IE9uV2F5UG9pbnRDaGFuZ2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvT25XYXlQb2ludENoYW5nZS5qcyc7XG5pbXBvcnQgeyBQZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9uIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1BlcmZvcm1BcHBTZXJ2aWNlSW50ZXJhY3Rpb24uanMnO1xuaW1wb3J0IHsgUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvblJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1BlcmZvcm1BcHBTZXJ2aWNlSW50ZXJhY3Rpb25SZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBQZXJmb3JtQXVkaW9QYXNzVGhydSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9QZXJmb3JtQXVkaW9QYXNzVGhydS5qcyc7XG5pbXBvcnQgeyBQZXJmb3JtQXVkaW9QYXNzVGhydVJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1BlcmZvcm1BdWRpb1Bhc3NUaHJ1UmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgUGVyZm9ybUludGVyYWN0aW9uIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1BlcmZvcm1JbnRlcmFjdGlvbi5qcyc7XG5pbXBvcnQgeyBQZXJmb3JtSW50ZXJhY3Rpb25SZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9QZXJmb3JtSW50ZXJhY3Rpb25SZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBQdWJsaXNoQXBwU2VydmljZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9QdWJsaXNoQXBwU2VydmljZS5qcyc7XG5pbXBvcnQgeyBQdWJsaXNoQXBwU2VydmljZVJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1B1Ymxpc2hBcHBTZXJ2aWNlUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgUHV0RmlsZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9QdXRGaWxlLmpzJztcbmltcG9ydCB7IFB1dEZpbGVSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9QdXRGaWxlUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgUmVhZERJRCB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9SZWFkRElELmpzJztcbmltcG9ydCB7IFJlYWRESURSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9SZWFkRElEUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgUmVnaXN0ZXJBcHBJbnRlcmZhY2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvUmVnaXN0ZXJBcHBJbnRlcmZhY2UuanMnO1xuaW1wb3J0IHsgUmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9SZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLmpzJztcbmltcG9ydCB7IFJlbGVhc2VJbnRlcmlvclZlaGljbGVEYXRhTW9kdWxlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1JlbGVhc2VJbnRlcmlvclZlaGljbGVEYXRhTW9kdWxlLmpzJztcbmltcG9ydCB7IFJlbGVhc2VJbnRlcmlvclZlaGljbGVEYXRhTW9kdWxlUmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvUmVsZWFzZUludGVyaW9yVmVoaWNsZURhdGFNb2R1bGVSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBSZXNldEdsb2JhbFByb3BlcnRpZXMgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvUmVzZXRHbG9iYWxQcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7IFJlc2V0R2xvYmFsUHJvcGVydGllc1Jlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1Jlc2V0R2xvYmFsUHJvcGVydGllc1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IFNjcm9sbGFibGVNZXNzYWdlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1Njcm9sbGFibGVNZXNzYWdlLmpzJztcbmltcG9ydCB7IFNjcm9sbGFibGVNZXNzYWdlUmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvU2Nyb2xsYWJsZU1lc3NhZ2VSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTZW5kSGFwdGljRGF0YSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9TZW5kSGFwdGljRGF0YS5qcyc7XG5pbXBvcnQgeyBTZW5kSGFwdGljRGF0YVJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1NlbmRIYXB0aWNEYXRhUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgU2VuZExvY2F0aW9uIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1NlbmRMb2NhdGlvbi5qcyc7XG5pbXBvcnQgeyBTZW5kTG9jYXRpb25SZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9TZW5kTG9jYXRpb25SZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTZXRBcHBJY29uIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1NldEFwcEljb24uanMnO1xuaW1wb3J0IHsgU2V0QXBwSWNvblJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1NldEFwcEljb25SZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTZXRDbG91ZEFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvU2V0Q2xvdWRBcHBQcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7IFNldENsb3VkQXBwUHJvcGVydGllc1Jlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1NldENsb3VkQXBwUHJvcGVydGllc1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IFNldERpc3BsYXlMYXlvdXQgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvU2V0RGlzcGxheUxheW91dC5qcyc7XG5pbXBvcnQgeyBTZXREaXNwbGF5TGF5b3V0UmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvU2V0RGlzcGxheUxheW91dFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IFNldEdsb2JhbFByb3BlcnRpZXMgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvU2V0R2xvYmFsUHJvcGVydGllcy5qcyc7XG5pbXBvcnQgeyBTZXRHbG9iYWxQcm9wZXJ0aWVzUmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvU2V0R2xvYmFsUHJvcGVydGllc1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IFNldEludGVyaW9yVmVoaWNsZURhdGEgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvU2V0SW50ZXJpb3JWZWhpY2xlRGF0YS5qcyc7XG5pbXBvcnQgeyBTZXRJbnRlcmlvclZlaGljbGVEYXRhUmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvU2V0SW50ZXJpb3JWZWhpY2xlRGF0YVJlc3BvbnNlLmpzJztcbmltcG9ydCB7IFNldE1lZGlhQ2xvY2tUaW1lciB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9TZXRNZWRpYUNsb2NrVGltZXIuanMnO1xuaW1wb3J0IHsgU2V0TWVkaWFDbG9ja1RpbWVyUmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvU2V0TWVkaWFDbG9ja1RpbWVyUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgU2hvdyB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9TaG93LmpzJztcbmltcG9ydCB7IFNob3dBcHBNZW51IH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1Nob3dBcHBNZW51LmpzJztcbmltcG9ydCB7IFNob3dBcHBNZW51UmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvU2hvd0FwcE1lbnVSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTaG93Q29uc3RhbnRUQlQgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvU2hvd0NvbnN0YW50VEJULmpzJztcbmltcG9ydCB7IFNob3dDb25zdGFudFRCVFJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1Nob3dDb25zdGFudFRCVFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IFNob3dSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9TaG93UmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgU2xpZGVyIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1NsaWRlci5qcyc7XG5pbXBvcnQgeyBTbGlkZXJSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9TbGlkZXJSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTcGVhayB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9TcGVhay5qcyc7XG5pbXBvcnQgeyBTcGVha1Jlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1NwZWFrUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgU3Vic2NyaWJlQnV0dG9uIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1N1YnNjcmliZUJ1dHRvbi5qcyc7XG5pbXBvcnQgeyBTdWJzY3JpYmVCdXR0b25SZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9TdWJzY3JpYmVCdXR0b25SZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTdWJzY3JpYmVWZWhpY2xlRGF0YSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9TdWJzY3JpYmVWZWhpY2xlRGF0YS5qcyc7XG5pbXBvcnQgeyBTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1N1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgU3Vic2NyaWJlV2F5UG9pbnRzIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1N1YnNjcmliZVdheVBvaW50cy5qcyc7XG5pbXBvcnQgeyBTdWJzY3JpYmVXYXlQb2ludHNSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9TdWJzY3JpYmVXYXlQb2ludHNSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBTeXN0ZW1SZXF1ZXN0IH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1N5c3RlbVJlcXVlc3QuanMnO1xuaW1wb3J0IHsgU3lzdGVtUmVxdWVzdFJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1N5c3RlbVJlcXVlc3RSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBVbnB1Ymxpc2hBcHBTZXJ2aWNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1VucHVibGlzaEFwcFNlcnZpY2UuanMnO1xuaW1wb3J0IHsgVW5wdWJsaXNoQXBwU2VydmljZVJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1VucHVibGlzaEFwcFNlcnZpY2VSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBVbnJlZ2lzdGVyQXBwSW50ZXJmYWNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1VucmVnaXN0ZXJBcHBJbnRlcmZhY2UuanMnO1xuaW1wb3J0IHsgVW5yZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1VucmVnaXN0ZXJBcHBJbnRlcmZhY2VSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBVbnN1YnNjcmliZUJ1dHRvbiB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9VbnN1YnNjcmliZUJ1dHRvbi5qcyc7XG5pbXBvcnQgeyBVbnN1YnNjcmliZUJ1dHRvblJlc3BvbnNlIH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1Vuc3Vic2NyaWJlQnV0dG9uUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgVW5zdWJzY3JpYmVWZWhpY2xlRGF0YSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9VbnN1YnNjcmliZVZlaGljbGVEYXRhLmpzJztcbmltcG9ydCB7IFVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9VbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgVW5zdWJzY3JpYmVXYXlQb2ludHMgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvVW5zdWJzY3JpYmVXYXlQb2ludHMuanMnO1xuaW1wb3J0IHsgVW5zdWJzY3JpYmVXYXlQb2ludHNSZXNwb25zZSB9IGZyb20gJy4vdG1wL3JwYy9tZXNzYWdlcy9VbnN1YnNjcmliZVdheVBvaW50c1Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IFVwZGF0ZVR1cm5MaXN0IH0gZnJvbSAnLi90bXAvcnBjL21lc3NhZ2VzL1VwZGF0ZVR1cm5MaXN0LmpzJztcbmltcG9ydCB7IFVwZGF0ZVR1cm5MaXN0UmVzcG9uc2UgfSBmcm9tICcuL3RtcC9ycGMvbWVzc2FnZXMvVXBkYXRlVHVybkxpc3RSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBBaXJiYWdTdGF0dXMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9BaXJiYWdTdGF0dXMuanMnO1xuaW1wb3J0IHsgQXBwSW5mbyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0FwcEluZm8uanMnO1xuaW1wb3J0IHsgQXBwU2VydmljZUNhcGFiaWxpdHkgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9BcHBTZXJ2aWNlQ2FwYWJpbGl0eS5qcyc7XG5pbXBvcnQgeyBBcHBTZXJ2aWNlRGF0YSB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0FwcFNlcnZpY2VEYXRhLmpzJztcbmltcG9ydCB7IEFwcFNlcnZpY2VNYW5pZmVzdCB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0FwcFNlcnZpY2VNYW5pZmVzdC5qcyc7XG5pbXBvcnQgeyBBcHBTZXJ2aWNlUmVjb3JkIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvQXBwU2VydmljZVJlY29yZC5qcyc7XG5pbXBvcnQgeyBBcHBTZXJ2aWNlc0NhcGFiaWxpdGllcyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0FwcFNlcnZpY2VzQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IEF1ZGlvQ29udHJvbENhcGFiaWxpdGllcyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0F1ZGlvQ29udHJvbENhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBBdWRpb0NvbnRyb2xEYXRhIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvQXVkaW9Db250cm9sRGF0YS5qcyc7XG5pbXBvcnQgeyBBdWRpb1Bhc3NUaHJ1Q2FwYWJpbGl0aWVzIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBCZWx0U3RhdHVzIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvQmVsdFN0YXR1cy5qcyc7XG5pbXBvcnQgeyBCb2R5SW5mb3JtYXRpb24gfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9Cb2R5SW5mb3JtYXRpb24uanMnO1xuaW1wb3J0IHsgQnV0dG9uQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvQnV0dG9uQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IENob2ljZSB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0Nob2ljZS5qcyc7XG5pbXBvcnQgeyBDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0NsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IENsaW1hdGVDb250cm9sRGF0YSB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0NsaW1hdGVDb250cm9sRGF0YS5qcyc7XG5pbXBvcnQgeyBDbG91ZEFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9DbG91ZEFwcFByb3BlcnRpZXMuanMnO1xuaW1wb3J0IHsgQ2x1c3Rlck1vZGVTdGF0dXMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9DbHVzdGVyTW9kZVN0YXR1cy5qcyc7XG5pbXBvcnQgeyBDb29yZGluYXRlIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvQ29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQgeyBESURSZXN1bHQgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9ESURSZXN1bHQuanMnO1xuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9EYXRlVGltZS5qcyc7XG5pbXBvcnQgeyBEZXZpY2VJbmZvIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvRGV2aWNlSW5mby5qcyc7XG5pbXBvcnQgeyBEZXZpY2VTdGF0dXMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9EZXZpY2VTdGF0dXMuanMnO1xuaW1wb3J0IHsgRGlzcGxheUNhcGFiaWxpdGllcyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0Rpc3BsYXlDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgRGlzcGxheUNhcGFiaWxpdHkgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9EaXNwbGF5Q2FwYWJpbGl0eS5qcyc7XG5pbXBvcnQgeyBFQ2FsbEluZm8gfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9FQ2FsbEluZm8uanMnO1xuaW1wb3J0IHsgRW1lcmdlbmN5RXZlbnQgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9FbWVyZ2VuY3lFdmVudC5qcyc7XG5pbXBvcnQgeyBFcXVhbGl6ZXJTZXR0aW5ncyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0VxdWFsaXplclNldHRpbmdzLmpzJztcbmltcG9ydCB7IEZ1ZWxSYW5nZSB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0Z1ZWxSYW5nZS5qcyc7XG5pbXBvcnQgeyBHUFNEYXRhIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvR1BTRGF0YS5qcyc7XG5pbXBvcnQgeyBHcmlkIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvR3JpZC5qcyc7XG5pbXBvcnQgeyBITUlDYXBhYmlsaXRpZXMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9ITUlDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgSE1JUGVybWlzc2lvbnMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9ITUlQZXJtaXNzaW9ucy5qcyc7XG5pbXBvcnQgeyBITUlTZXR0aW5nc0NvbnRyb2xDYXBhYmlsaXRpZXMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9ITUlTZXR0aW5nc0NvbnRyb2xDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgSE1JU2V0dGluZ3NDb250cm9sRGF0YSB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0hNSVNldHRpbmdzQ29udHJvbERhdGEuanMnO1xuaW1wb3J0IHsgSGFwdGljUmVjdCB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0hhcHRpY1JlY3QuanMnO1xuaW1wb3J0IHsgSGVhZExhbXBTdGF0dXMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9IZWFkTGFtcFN0YXR1cy5qcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0ltYWdlLmpzJztcbmltcG9ydCB7IEltYWdlRmllbGQgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9JbWFnZUZpZWxkLmpzJztcbmltcG9ydCB7IEltYWdlUmVzb2x1dGlvbiB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0ltYWdlUmVzb2x1dGlvbi5qcyc7XG5pbXBvcnQgeyBLZXlib2FyZFByb3BlcnRpZXMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9LZXlib2FyZFByb3BlcnRpZXMuanMnO1xuaW1wb3J0IHsgTGlnaHRDYXBhYmlsaXRpZXMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9MaWdodENhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBMaWdodENvbnRyb2xDYXBhYmlsaXRpZXMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9MaWdodENvbnRyb2xDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgTGlnaHRDb250cm9sRGF0YSB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0xpZ2h0Q29udHJvbERhdGEuanMnO1xuaW1wb3J0IHsgTGlnaHRTdGF0ZSB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL0xpZ2h0U3RhdGUuanMnO1xuaW1wb3J0IHsgTG9jYXRpb25EZXRhaWxzIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvTG9jYXRpb25EZXRhaWxzLmpzJztcbmltcG9ydCB7IE1hc3NhZ2VDdXNoaW9uRmlybW5lc3MgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9NYXNzYWdlQ3VzaGlvbkZpcm1uZXNzLmpzJztcbmltcG9ydCB7IE1hc3NhZ2VNb2RlRGF0YSB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL01hc3NhZ2VNb2RlRGF0YS5qcyc7XG5pbXBvcnQgeyBNZWRpYVNlcnZpY2VEYXRhIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvTWVkaWFTZXJ2aWNlRGF0YS5qcyc7XG5pbXBvcnQgeyBNZWRpYVNlcnZpY2VNYW5pZmVzdCB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL01lZGlhU2VydmljZU1hbmlmZXN0LmpzJztcbmltcG9ydCB7IE1lbnVQYXJhbXMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9NZW51UGFyYW1zLmpzJztcbmltcG9ydCB7IE1ldGFkYXRhVGFncyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL01ldGFkYXRhVGFncy5qcyc7XG5pbXBvcnQgeyBNb2R1bGVEYXRhIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvTW9kdWxlRGF0YS5qcyc7XG5pbXBvcnQgeyBNb2R1bGVJbmZvIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvTW9kdWxlSW5mby5qcyc7XG5pbXBvcnQgeyBNeUtleSB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL015S2V5LmpzJztcbmltcG9ydCB7IE5hdmlnYXRpb25DYXBhYmlsaXR5IH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvTmF2aWdhdGlvbkNhcGFiaWxpdHkuanMnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkluc3RydWN0aW9uIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvTmF2aWdhdGlvbkluc3RydWN0aW9uLmpzJztcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlRGF0YSB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL05hdmlnYXRpb25TZXJ2aWNlRGF0YS5qcyc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uU2VydmljZU1hbmlmZXN0IH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvTmF2aWdhdGlvblNlcnZpY2VNYW5pZmVzdC5qcyc7XG5pbXBvcnQgeyBPQVNJU0FkZHJlc3MgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9PQVNJU0FkZHJlc3MuanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyUGVybWlzc2lvbnMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9QYXJhbWV0ZXJQZXJtaXNzaW9ucy5qcyc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uSXRlbSB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL1Blcm1pc3Npb25JdGVtLmpzJztcbmltcG9ydCB7IFBob25lQ2FwYWJpbGl0eSB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL1Bob25lQ2FwYWJpbGl0eS5qcyc7XG5pbXBvcnQgeyBQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvUHJlc2V0QmFua0NhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBSR0JDb2xvciB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL1JHQkNvbG9yLmpzJztcbmltcG9ydCB7IFJhZGlvQ29udHJvbENhcGFiaWxpdGllcyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL1JhZGlvQ29udHJvbENhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBSYWRpb0NvbnRyb2xEYXRhIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvUmFkaW9Db250cm9sRGF0YS5qcyc7XG5pbXBvcnQgeyBSZHNEYXRhIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvUmRzRGF0YS5qcyc7XG5pbXBvcnQgeyBSZWN0YW5nbGUgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9SZWN0YW5nbGUuanMnO1xuaW1wb3J0IHsgUmVtb3RlQ29udHJvbENhcGFiaWxpdGllcyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL1JlbW90ZUNvbnRyb2xDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgU2NyZWVuUGFyYW1zIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvU2NyZWVuUGFyYW1zLmpzJztcbmltcG9ydCB7IFNkbE1zZ1ZlcnNpb24gfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9TZGxNc2dWZXJzaW9uLmpzJztcbmltcG9ydCB7IFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvU2VhdENvbnRyb2xDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgU2VhdENvbnRyb2xEYXRhIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvU2VhdENvbnRyb2xEYXRhLmpzJztcbmltcG9ydCB7IFNlYXRMb2NhdGlvbiB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL1NlYXRMb2NhdGlvbi5qcyc7XG5pbXBvcnQgeyBTZWF0TG9jYXRpb25DYXBhYmlsaXR5IH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvU2VhdExvY2F0aW9uQ2FwYWJpbGl0eS5qcyc7XG5pbXBvcnQgeyBTZWF0TWVtb3J5QWN0aW9uIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvU2VhdE1lbW9yeUFjdGlvbi5qcyc7XG5pbXBvcnQgeyBTaW5nbGVUaXJlU3RhdHVzIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvU2luZ2xlVGlyZVN0YXR1cy5qcyc7XG5pbXBvcnQgeyBTaXNEYXRhIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvU2lzRGF0YS5qcyc7XG5pbXBvcnQgeyBTb2Z0QnV0dG9uIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvU29mdEJ1dHRvbi5qcyc7XG5pbXBvcnQgeyBTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvU29mdEJ1dHRvbkNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBTdGFydFRpbWUgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9TdGFydFRpbWUuanMnO1xuaW1wb3J0IHsgU3RhdGlvbklETnVtYmVyIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvU3RhdGlvbklETnVtYmVyLmpzJztcbmltcG9ydCB7IFN5c3RlbUNhcGFiaWxpdHkgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9TeXN0ZW1DYXBhYmlsaXR5LmpzJztcbmltcG9ydCB7IFRUU0NodW5rIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvVFRTQ2h1bmsuanMnO1xuaW1wb3J0IHsgVGVtcGVyYXR1cmUgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9UZW1wZXJhdHVyZS5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZUNvbG9yU2NoZW1lIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvVGVtcGxhdGVDb2xvclNjaGVtZS5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9UZW1wbGF0ZUNvbmZpZ3VyYXRpb24uanMnO1xuaW1wb3J0IHsgVGV4dEZpZWxkIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvVGV4dEZpZWxkLmpzJztcbmltcG9ydCB7IFRpcmVTdGF0dXMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9UaXJlU3RhdHVzLmpzJztcbmltcG9ydCB7IFRvdWNoQ29vcmQgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9Ub3VjaENvb3JkLmpzJztcbmltcG9ydCB7IFRvdWNoRXZlbnQgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9Ub3VjaEV2ZW50LmpzJztcbmltcG9ydCB7IFRvdWNoRXZlbnRDYXBhYmlsaXRpZXMgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9Ub3VjaEV2ZW50Q2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IFR1cm4gfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9UdXJuLmpzJztcbmltcG9ydCB7IFZlaGljbGVEYXRhUmVzdWx0IH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvVmVoaWNsZURhdGFSZXN1bHQuanMnO1xuaW1wb3J0IHsgVmVoaWNsZVR5cGUgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9WZWhpY2xlVHlwZS5qcyc7XG5pbXBvcnQgeyBWaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9WaWRlb1N0cmVhbWluZ0NhcGFiaWxpdHkuanMnO1xuaW1wb3J0IHsgVmlkZW9TdHJlYW1pbmdGb3JtYXQgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9WaWRlb1N0cmVhbWluZ0Zvcm1hdC5qcyc7XG5pbXBvcnQgeyBWckhlbHBJdGVtIH0gZnJvbSAnLi90bXAvcnBjL3N0cnVjdHMvVnJIZWxwSXRlbS5qcyc7XG5pbXBvcnQgeyBXZWF0aGVyQWxlcnQgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9XZWF0aGVyQWxlcnQuanMnO1xuaW1wb3J0IHsgV2VhdGhlckRhdGEgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9XZWF0aGVyRGF0YS5qcyc7XG5pbXBvcnQgeyBXZWF0aGVyU2VydmljZURhdGEgfSBmcm9tICcuL3RtcC9ycGMvc3RydWN0cy9XZWF0aGVyU2VydmljZURhdGEuanMnO1xuaW1wb3J0IHsgV2VhdGhlclNlcnZpY2VNYW5pZmVzdCB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL1dlYXRoZXJTZXJ2aWNlTWFuaWZlc3QuanMnO1xuaW1wb3J0IHsgV2luZG93Q2FwYWJpbGl0eSB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL1dpbmRvd0NhcGFiaWxpdHkuanMnO1xuaW1wb3J0IHsgV2luZG93VHlwZUNhcGFiaWxpdGllcyB9IGZyb20gJy4vdG1wL3JwYy9zdHJ1Y3RzL1dpbmRvd1R5cGVDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgU2RsU2VydmljZUxpc3RlbmVyIH0gZnJvbSAnLi90bXAvc2Vzc2lvbi9TZGxTZXJ2aWNlTGlzdGVuZXIuanMnO1xuaW1wb3J0IHsgU2RsU2Vzc2lvbiB9IGZyb20gJy4vdG1wL3Nlc3Npb24vU2RsU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBTZGxTZXNzaW9uTGlzdGVuZXIgfSBmcm9tICcuL3RtcC9zZXNzaW9uL1NkbFNlc3Npb25MaXN0ZW5lci5qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlTGlzdGVuZXJNYXAgfSBmcm9tICcuL3RtcC9zZXNzaW9uL1NlcnZpY2VMaXN0ZW5lck1hcC5qcyc7XG5pbXBvcnQgeyBWaWRlb1N0cmVhbWluZ1BhcmFtZXRlcnMgfSBmcm9tICcuL3RtcC9zdHJlYW1pbmcvdmlkZW8vVmlkZW9TdHJlYW1pbmdQYXJhbWV0ZXJzLmpzJztcbmltcG9ydCB7IEN1c3RvbVRyYW5zcG9ydCB9IGZyb20gJy4vdG1wL3RyYW5zcG9ydC9DdXN0b21UcmFuc3BvcnQuanMnO1xuaW1wb3J0IHsgQ3VzdG9tVHJhbnNwb3J0Q29uZmlnIH0gZnJvbSAnLi90bXAvdHJhbnNwb3J0L0N1c3RvbVRyYW5zcG9ydENvbmZpZy5qcyc7XG5pbXBvcnQgeyBTZGxQc20gfSBmcm9tICcuL3RtcC90cmFuc3BvcnQvU2RsUHNtLmpzJztcbmltcG9ydCB7IFNzbENvbmZpZyB9IGZyb20gJy4vdG1wL3RyYW5zcG9ydC9Tc2xDb25maWcuanMnO1xuaW1wb3J0IHsgVHJhbnNwb3J0QmFzZSB9IGZyb20gJy4vdG1wL3RyYW5zcG9ydC9UcmFuc3BvcnRCYXNlLmpzJztcbmltcG9ydCB7IFRyYW5zcG9ydENhbGxiYWNrIH0gZnJvbSAnLi90bXAvdHJhbnNwb3J0L1RyYW5zcG9ydENhbGxiYWNrLmpzJztcbmltcG9ydCB7IFRyYW5zcG9ydENvbmZpZ0Jhc2UgfSBmcm9tICcuL3RtcC90cmFuc3BvcnQvVHJhbnNwb3J0Q29uZmlnQmFzZS5qcyc7XG5pbXBvcnQgeyBUcmFuc3BvcnRMaXN0ZW5lciB9IGZyb20gJy4vdG1wL3RyYW5zcG9ydC9UcmFuc3BvcnRMaXN0ZW5lci5qcyc7XG5pbXBvcnQgeyBUcmFuc3BvcnRNYW5hZ2VyIH0gZnJvbSAnLi90bXAvdHJhbnNwb3J0L1RyYW5zcG9ydE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgVHJhbnNwb3J0TWFuYWdlckJhc2UgfSBmcm9tICcuL3RtcC90cmFuc3BvcnQvVHJhbnNwb3J0TWFuYWdlckJhc2UuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0Q2xpZW50IH0gZnJvbSAnLi90bXAvdHJhbnNwb3J0L1dlYlNvY2tldENsaWVudC5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRDbGllbnRDb25maWcgfSBmcm9tICcuL3RtcC90cmFuc3BvcnQvV2ViU29ja2V0Q2xpZW50Q29uZmlnLmpzJztcbmltcG9ydCB7IFRyYW5zcG9ydFR5cGUgfSBmcm9tICcuL3RtcC90cmFuc3BvcnQvZW51bXMvVHJhbnNwb3J0VHlwZS5qcyc7XG5pbXBvcnQgeyBUcmFuc3BvcnRSZWNvcmQgfSBmcm9tICcuL3RtcC90cmFuc3BvcnQvdXRpbC9UcmFuc3BvcnRSZWNvcmQuanMnO1xuaW1wb3J0IHsgQXJyYXlUb29scyB9IGZyb20gJy4vdG1wL3V0aWwvQXJyYXlUb29scy5qcyc7XG5pbXBvcnQgeyBCaXRDb252ZXJ0ZXIgfSBmcm9tICcuL3RtcC91dGlsL0JpdENvbnZlcnRlci5qcyc7XG5pbXBvcnQgeyBCc29uIH0gZnJvbSAnLi90bXAvdXRpbC9Cc29uLmpzJztcbmltcG9ydCB7IEVudW0gfSBmcm9tICcuL3RtcC91dGlsL0VudW0uanMnO1xuaW1wb3J0IHsgSnNvblJwY01hcnNoYWxsZXIgfSBmcm9tICcuL3RtcC91dGlsL0pzb25ScGNNYXJzaGFsbGVyLmpzJztcbmltcG9ydCB7IFRleHRFbmNvZGVyIH0gZnJvbSAnLi90bXAvdXRpbC9UZXh0RW5jb2Rlci5qcyc7XG5pbXBvcnQgeyBWZXJzaW9uIH0gZnJvbSAnLi90bXAvdXRpbC9WZXJzaW9uLmpzJztcbmltcG9ydCB7IFdlYlNvY2tldFNlcnZlciB9IGZyb20gJy4vdG1wL3RyYW5zcG9ydC9XZWJTb2NrZXRTZXJ2ZXIuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0U2VydmVyQ29uZmlnIH0gZnJvbSAnLi90bXAvdHJhbnNwb3J0L1dlYlNvY2tldFNlcnZlckNvbmZpZy5qcyc7XG5cbmNvbnN0IFNETCA9IHtcbiAgICBtYW5hZ2VyOiB7XG4gICAgICAgIEFwcENvbmZpZyxcbiAgICAgICAgbGlmZWN5Y2xlOiB7XG4gICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lcixcbiAgICAgICAgICAgIExpZmVjeWNsZU1hbmFnZXIsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBwcm90b2NvbDoge1xuICAgICAgICBCaW5hcnlGcmFtZUhlYWRlcixcbiAgICAgICAgTWVzc2FnZUZyYW1lQXNzZW1ibGVyLFxuICAgICAgICBNZXNzYWdlRnJhbWVEaXNhc3NlbWJsZXIsXG4gICAgICAgIFNkbFBhY2tldCxcbiAgICAgICAgU2RsUGFja2V0RmFjdG9yeSxcbiAgICAgICAgU2RsUHJvdG9jb2wsXG4gICAgICAgIFNkbFByb3RvY29sQmFzZSxcbiAgICAgICAgU2RsUHJvdG9jb2xMaXN0ZW5lcixcbiAgICAgICAgZW51bXM6IHtcbiAgICAgICAgICAgIENvbnRyb2xGcmFtZVRhZ3MsXG4gICAgICAgICAgICBGcmFtZVR5cGUsXG4gICAgICAgICAgICBTZXJ2aWNlVHlwZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHJwYzoge1xuICAgICAgICBScGNDcmVhdG9yLFxuICAgICAgICBScGNMaXN0ZW5lcixcbiAgICAgICAgUnBjTWVzc2FnZSxcbiAgICAgICAgUnBjTm90aWZpY2F0aW9uLFxuICAgICAgICBScGNSZXF1ZXN0LFxuICAgICAgICBScGNSZXNwb25zZSxcbiAgICAgICAgUnBjU3RydWN0LFxuICAgICAgICBlbnVtczoge1xuICAgICAgICAgICAgQW1iaWVudExpZ2h0U3RhdHVzLFxuICAgICAgICAgICAgQXBwSE1JVHlwZSxcbiAgICAgICAgICAgIEFwcEludGVyZmFjZVVucmVnaXN0ZXJlZFJlYXNvbixcbiAgICAgICAgICAgIEFwcFNlcnZpY2VUeXBlLFxuICAgICAgICAgICAgQXVkaW9TdHJlYW1pbmdJbmRpY2F0b3IsXG4gICAgICAgICAgICBBdWRpb1N0cmVhbWluZ1N0YXRlLFxuICAgICAgICAgICAgQXVkaW9UeXBlLFxuICAgICAgICAgICAgQml0c1BlclNhbXBsZSxcbiAgICAgICAgICAgIEJ1dHRvbkV2ZW50TW9kZSxcbiAgICAgICAgICAgIEJ1dHRvbk5hbWUsXG4gICAgICAgICAgICBCdXR0b25QcmVzc01vZGUsXG4gICAgICAgICAgICBDYXJNb2RlU3RhdHVzLFxuICAgICAgICAgICAgQ2hhcmFjdGVyU2V0LFxuICAgICAgICAgICAgQ29tcGFzc0RpcmVjdGlvbixcbiAgICAgICAgICAgIENvbXBvbmVudFZvbHVtZVN0YXR1cyxcbiAgICAgICAgICAgIERlZnJvc3Rab25lLFxuICAgICAgICAgICAgRGVsaXZlcnlNb2RlLFxuICAgICAgICAgICAgRGV2aWNlTGV2ZWxTdGF0dXMsXG4gICAgICAgICAgICBEaW1lbnNpb24sXG4gICAgICAgICAgICBEaXJlY3Rpb24sXG4gICAgICAgICAgICBEaXNwbGF5TW9kZSxcbiAgICAgICAgICAgIERpc3BsYXlUeXBlLFxuICAgICAgICAgICAgRGlzdGFuY2VVbml0LFxuICAgICAgICAgICAgRHJpdmVyRGlzdHJhY3Rpb25TdGF0ZSxcbiAgICAgICAgICAgIEVDYWxsQ29uZmlybWF0aW9uU3RhdHVzLFxuICAgICAgICAgICAgRWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cyxcbiAgICAgICAgICAgIEVtZXJnZW5jeUV2ZW50VHlwZSxcbiAgICAgICAgICAgIEZpbGVUeXBlLFxuICAgICAgICAgICAgRnVlbEN1dG9mZlN0YXR1cyxcbiAgICAgICAgICAgIEZ1ZWxUeXBlLFxuICAgICAgICAgICAgRnVuY3Rpb25JRCxcbiAgICAgICAgICAgIEdsb2JhbFByb3BlcnR5LFxuICAgICAgICAgICAgSE1JTGV2ZWwsXG4gICAgICAgICAgICBIbWlab25lQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgSHlicmlkQXBwUHJlZmVyZW5jZSxcbiAgICAgICAgICAgIElnbml0aW9uU3RhYmxlU3RhdHVzLFxuICAgICAgICAgICAgSWduaXRpb25TdGF0dXMsXG4gICAgICAgICAgICBJbWFnZUZpZWxkTmFtZSxcbiAgICAgICAgICAgIEltYWdlVHlwZSxcbiAgICAgICAgICAgIEludGVyYWN0aW9uTW9kZSxcbiAgICAgICAgICAgIEtleWJvYXJkRXZlbnQsXG4gICAgICAgICAgICBLZXlib2FyZExheW91dCxcbiAgICAgICAgICAgIEtleXByZXNzTW9kZSxcbiAgICAgICAgICAgIExhbmd1YWdlLFxuICAgICAgICAgICAgTGF5b3V0TW9kZSxcbiAgICAgICAgICAgIExpZ2h0TmFtZSxcbiAgICAgICAgICAgIExpZ2h0U3RhdHVzLFxuICAgICAgICAgICAgTWFpbnRlbmFuY2VNb2RlU3RhdHVzLFxuICAgICAgICAgICAgTWFzc2FnZUN1c2hpb24sXG4gICAgICAgICAgICBNYXNzYWdlTW9kZSxcbiAgICAgICAgICAgIE1hc3NhZ2Vab25lLFxuICAgICAgICAgICAgTWVkaWFDbG9ja0Zvcm1hdCxcbiAgICAgICAgICAgIE1lZGlhVHlwZSxcbiAgICAgICAgICAgIE1lbnVMYXlvdXQsXG4gICAgICAgICAgICBNZXRhZGF0YVR5cGUsXG4gICAgICAgICAgICBNb2R1bGVUeXBlLFxuICAgICAgICAgICAgTmF2aWdhdGlvbkFjdGlvbixcbiAgICAgICAgICAgIE5hdmlnYXRpb25KdW5jdGlvbixcbiAgICAgICAgICAgIFBSTkRMLFxuICAgICAgICAgICAgUGVybWlzc2lvblN0YXR1cyxcbiAgICAgICAgICAgIFBvd2VyTW9kZVF1YWxpZmljYXRpb25TdGF0dXMsXG4gICAgICAgICAgICBQb3dlck1vZGVTdGF0dXMsXG4gICAgICAgICAgICBQcmVkZWZpbmVkTGF5b3V0LFxuICAgICAgICAgICAgUHJlZGVmaW5lZFdpbmRvd3MsXG4gICAgICAgICAgICBQcmVyZWNvcmRlZFNwZWVjaCxcbiAgICAgICAgICAgIFByaW1hcnlBdWRpb1NvdXJjZSxcbiAgICAgICAgICAgIFJhZGlvQmFuZCxcbiAgICAgICAgICAgIFJhZGlvU3RhdGUsXG4gICAgICAgICAgICBSZXF1ZXN0VHlwZSxcbiAgICAgICAgICAgIFJlc3VsdCxcbiAgICAgICAgICAgIFJwY1R5cGUsXG4gICAgICAgICAgICBTYW1wbGluZ1JhdGUsXG4gICAgICAgICAgICBTZWF0TWVtb3J5QWN0aW9uVHlwZSxcbiAgICAgICAgICAgIFNlcnZpY2VVcGRhdGVSZWFzb24sXG4gICAgICAgICAgICBTb2Z0QnV0dG9uVHlwZSxcbiAgICAgICAgICAgIFNwZWVjaENhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIFN1cHBvcnRlZFNlYXQsXG4gICAgICAgICAgICBTeXN0ZW1BY3Rpb24sXG4gICAgICAgICAgICBTeXN0ZW1DYXBhYmlsaXR5VHlwZSxcbiAgICAgICAgICAgIFN5c3RlbUNvbnRleHQsXG4gICAgICAgICAgICBUQlRTdGF0ZSxcbiAgICAgICAgICAgIFRQTVMsXG4gICAgICAgICAgICBUZW1wZXJhdHVyZVVuaXQsXG4gICAgICAgICAgICBUZXh0QWxpZ25tZW50LFxuICAgICAgICAgICAgVGV4dEZpZWxkTmFtZSxcbiAgICAgICAgICAgIFRpbWVyTW9kZSxcbiAgICAgICAgICAgIFRvdWNoVHlwZSxcbiAgICAgICAgICAgIFRyaWdnZXJTb3VyY2UsXG4gICAgICAgICAgICBUdXJuU2lnbmFsLFxuICAgICAgICAgICAgVXBkYXRlTW9kZSxcbiAgICAgICAgICAgIFZlaGljbGVEYXRhQWN0aXZlU3RhdHVzLFxuICAgICAgICAgICAgVmVoaWNsZURhdGFFdmVudFN0YXR1cyxcbiAgICAgICAgICAgIFZlaGljbGVEYXRhTm90aWZpY2F0aW9uU3RhdHVzLFxuICAgICAgICAgICAgVmVoaWNsZURhdGFSZXN1bHRDb2RlLFxuICAgICAgICAgICAgVmVoaWNsZURhdGFTdGF0dXMsXG4gICAgICAgICAgICBWZWhpY2xlRGF0YVR5cGUsXG4gICAgICAgICAgICBWZW50aWxhdGlvbk1vZGUsXG4gICAgICAgICAgICBWaWRlb1N0cmVhbWluZ0NvZGVjLFxuICAgICAgICAgICAgVmlkZW9TdHJlYW1pbmdQcm90b2NvbCxcbiAgICAgICAgICAgIFZpZGVvU3RyZWFtaW5nU3RhdGUsXG4gICAgICAgICAgICBWckNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIFdhcm5pbmdMaWdodFN0YXR1cyxcbiAgICAgICAgICAgIFdheVBvaW50VHlwZSxcbiAgICAgICAgICAgIFdpbmRvd1R5cGUsXG4gICAgICAgICAgICBXaXBlclN0YXR1cyxcbiAgICAgICAgICAgIG1lc3NhZ2VUeXBlLFxuICAgICAgICB9LFxuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgQWRkQ29tbWFuZCxcbiAgICAgICAgICAgIEFkZENvbW1hbmRSZXNwb25zZSxcbiAgICAgICAgICAgIEFkZFN1Yk1lbnUsXG4gICAgICAgICAgICBBZGRTdWJNZW51UmVzcG9uc2UsXG4gICAgICAgICAgICBBbGVydCxcbiAgICAgICAgICAgIEFsZXJ0TWFuZXV2ZXIsXG4gICAgICAgICAgICBBbGVydE1hbmV1dmVyUmVzcG9uc2UsXG4gICAgICAgICAgICBBbGVydFJlc3BvbnNlLFxuICAgICAgICAgICAgQnV0dG9uUHJlc3MsXG4gICAgICAgICAgICBCdXR0b25QcmVzc1Jlc3BvbnNlLFxuICAgICAgICAgICAgQ2FuY2VsSW50ZXJhY3Rpb24sXG4gICAgICAgICAgICBDYW5jZWxJbnRlcmFjdGlvblJlc3BvbnNlLFxuICAgICAgICAgICAgQ2hhbmdlUmVnaXN0cmF0aW9uLFxuICAgICAgICAgICAgQ2hhbmdlUmVnaXN0cmF0aW9uUmVzcG9uc2UsXG4gICAgICAgICAgICBDbG9zZUFwcGxpY2F0aW9uLFxuICAgICAgICAgICAgQ2xvc2VBcHBsaWNhdGlvblJlc3BvbnNlLFxuICAgICAgICAgICAgQ3JlYXRlSW50ZXJhY3Rpb25DaG9pY2VTZXQsXG4gICAgICAgICAgICBDcmVhdGVJbnRlcmFjdGlvbkNob2ljZVNldFJlc3BvbnNlLFxuICAgICAgICAgICAgQ3JlYXRlV2luZG93LFxuICAgICAgICAgICAgQ3JlYXRlV2luZG93UmVzcG9uc2UsXG4gICAgICAgICAgICBEZWxldGVDb21tYW5kLFxuICAgICAgICAgICAgRGVsZXRlQ29tbWFuZFJlc3BvbnNlLFxuICAgICAgICAgICAgRGVsZXRlRmlsZSxcbiAgICAgICAgICAgIERlbGV0ZUZpbGVSZXNwb25zZSxcbiAgICAgICAgICAgIERlbGV0ZUludGVyYWN0aW9uQ2hvaWNlU2V0LFxuICAgICAgICAgICAgRGVsZXRlSW50ZXJhY3Rpb25DaG9pY2VTZXRSZXNwb25zZSxcbiAgICAgICAgICAgIERlbGV0ZVN1Yk1lbnUsXG4gICAgICAgICAgICBEZWxldGVTdWJNZW51UmVzcG9uc2UsXG4gICAgICAgICAgICBEZWxldGVXaW5kb3csXG4gICAgICAgICAgICBEZWxldGVXaW5kb3dSZXNwb25zZSxcbiAgICAgICAgICAgIERpYWdub3N0aWNNZXNzYWdlLFxuICAgICAgICAgICAgRGlhZ25vc3RpY01lc3NhZ2VSZXNwb25zZSxcbiAgICAgICAgICAgIERpYWxOdW1iZXIsXG4gICAgICAgICAgICBEaWFsTnVtYmVyUmVzcG9uc2UsXG4gICAgICAgICAgICBFbmNvZGVkU3luY1BEYXRhLFxuICAgICAgICAgICAgRW5jb2RlZFN5bmNQRGF0YVJlc3BvbnNlLFxuICAgICAgICAgICAgRW5kQXVkaW9QYXNzVGhydSxcbiAgICAgICAgICAgIEVuZEF1ZGlvUGFzc1RocnVSZXNwb25zZSxcbiAgICAgICAgICAgIEdlbmVyaWNSZXNwb25zZVJlc3BvbnNlLFxuICAgICAgICAgICAgR2V0QXBwU2VydmljZURhdGEsXG4gICAgICAgICAgICBHZXRBcHBTZXJ2aWNlRGF0YVJlc3BvbnNlLFxuICAgICAgICAgICAgR2V0Q2xvdWRBcHBQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgR2V0Q2xvdWRBcHBQcm9wZXJ0aWVzUmVzcG9uc2UsXG4gICAgICAgICAgICBHZXREVENzLFxuICAgICAgICAgICAgR2V0RFRDc1Jlc3BvbnNlLFxuICAgICAgICAgICAgR2V0RmlsZSxcbiAgICAgICAgICAgIEdldEZpbGVSZXNwb25zZSxcbiAgICAgICAgICAgIEdldEludGVyaW9yVmVoaWNsZURhdGEsXG4gICAgICAgICAgICBHZXRJbnRlcmlvclZlaGljbGVEYXRhQ29uc2VudCxcbiAgICAgICAgICAgIEdldEludGVyaW9yVmVoaWNsZURhdGFDb25zZW50UmVzcG9uc2UsXG4gICAgICAgICAgICBHZXRJbnRlcmlvclZlaGljbGVEYXRhUmVzcG9uc2UsXG4gICAgICAgICAgICBHZXRTeXN0ZW1DYXBhYmlsaXR5LFxuICAgICAgICAgICAgR2V0U3lzdGVtQ2FwYWJpbGl0eVJlc3BvbnNlLFxuICAgICAgICAgICAgR2V0VmVoaWNsZURhdGEsXG4gICAgICAgICAgICBHZXRWZWhpY2xlRGF0YVJlc3BvbnNlLFxuICAgICAgICAgICAgR2V0V2F5UG9pbnRzLFxuICAgICAgICAgICAgR2V0V2F5UG9pbnRzUmVzcG9uc2UsXG4gICAgICAgICAgICBMaXN0RmlsZXMsXG4gICAgICAgICAgICBMaXN0RmlsZXNSZXNwb25zZSxcbiAgICAgICAgICAgIE9uQXBwSW50ZXJmYWNlVW5yZWdpc3RlcmVkLFxuICAgICAgICAgICAgT25BcHBTZXJ2aWNlRGF0YSxcbiAgICAgICAgICAgIE9uQXVkaW9QYXNzVGhydSxcbiAgICAgICAgICAgIE9uQnV0dG9uRXZlbnQsXG4gICAgICAgICAgICBPbkJ1dHRvblByZXNzLFxuICAgICAgICAgICAgT25Db21tYW5kLFxuICAgICAgICAgICAgT25Ecml2ZXJEaXN0cmFjdGlvbixcbiAgICAgICAgICAgIE9uRW5jb2RlZFN5bmNQRGF0YSxcbiAgICAgICAgICAgIE9uSE1JU3RhdHVzLFxuICAgICAgICAgICAgT25IYXNoQ2hhbmdlLFxuICAgICAgICAgICAgT25JbnRlcmlvclZlaGljbGVEYXRhLFxuICAgICAgICAgICAgT25LZXlib2FyZElucHV0LFxuICAgICAgICAgICAgT25MYW5ndWFnZUNoYW5nZSxcbiAgICAgICAgICAgIE9uUGVybWlzc2lvbnNDaGFuZ2UsXG4gICAgICAgICAgICBPblJDU3RhdHVzLFxuICAgICAgICAgICAgT25TeXN0ZW1DYXBhYmlsaXR5VXBkYXRlZCxcbiAgICAgICAgICAgIE9uU3lzdGVtUmVxdWVzdCxcbiAgICAgICAgICAgIE9uVEJUQ2xpZW50U3RhdGUsXG4gICAgICAgICAgICBPblRvdWNoRXZlbnQsXG4gICAgICAgICAgICBPblZlaGljbGVEYXRhLFxuICAgICAgICAgICAgT25XYXlQb2ludENoYW5nZSxcbiAgICAgICAgICAgIFBlcmZvcm1BcHBTZXJ2aWNlSW50ZXJhY3Rpb24sXG4gICAgICAgICAgICBQZXJmb3JtQXBwU2VydmljZUludGVyYWN0aW9uUmVzcG9uc2UsXG4gICAgICAgICAgICBQZXJmb3JtQXVkaW9QYXNzVGhydSxcbiAgICAgICAgICAgIFBlcmZvcm1BdWRpb1Bhc3NUaHJ1UmVzcG9uc2UsXG4gICAgICAgICAgICBQZXJmb3JtSW50ZXJhY3Rpb24sXG4gICAgICAgICAgICBQZXJmb3JtSW50ZXJhY3Rpb25SZXNwb25zZSxcbiAgICAgICAgICAgIFB1Ymxpc2hBcHBTZXJ2aWNlLFxuICAgICAgICAgICAgUHVibGlzaEFwcFNlcnZpY2VSZXNwb25zZSxcbiAgICAgICAgICAgIFB1dEZpbGUsXG4gICAgICAgICAgICBQdXRGaWxlUmVzcG9uc2UsXG4gICAgICAgICAgICBSZWFkRElELFxuICAgICAgICAgICAgUmVhZERJRFJlc3BvbnNlLFxuICAgICAgICAgICAgUmVnaXN0ZXJBcHBJbnRlcmZhY2UsXG4gICAgICAgICAgICBSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLFxuICAgICAgICAgICAgUmVsZWFzZUludGVyaW9yVmVoaWNsZURhdGFNb2R1bGUsXG4gICAgICAgICAgICBSZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZVJlc3BvbnNlLFxuICAgICAgICAgICAgUmVzZXRHbG9iYWxQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgUmVzZXRHbG9iYWxQcm9wZXJ0aWVzUmVzcG9uc2UsXG4gICAgICAgICAgICBTY3JvbGxhYmxlTWVzc2FnZSxcbiAgICAgICAgICAgIFNjcm9sbGFibGVNZXNzYWdlUmVzcG9uc2UsXG4gICAgICAgICAgICBTZW5kSGFwdGljRGF0YSxcbiAgICAgICAgICAgIFNlbmRIYXB0aWNEYXRhUmVzcG9uc2UsXG4gICAgICAgICAgICBTZW5kTG9jYXRpb24sXG4gICAgICAgICAgICBTZW5kTG9jYXRpb25SZXNwb25zZSxcbiAgICAgICAgICAgIFNldEFwcEljb24sXG4gICAgICAgICAgICBTZXRBcHBJY29uUmVzcG9uc2UsXG4gICAgICAgICAgICBTZXRDbG91ZEFwcFByb3BlcnRpZXMsXG4gICAgICAgICAgICBTZXRDbG91ZEFwcFByb3BlcnRpZXNSZXNwb25zZSxcbiAgICAgICAgICAgIFNldERpc3BsYXlMYXlvdXQsXG4gICAgICAgICAgICBTZXREaXNwbGF5TGF5b3V0UmVzcG9uc2UsXG4gICAgICAgICAgICBTZXRHbG9iYWxQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgU2V0R2xvYmFsUHJvcGVydGllc1Jlc3BvbnNlLFxuICAgICAgICAgICAgU2V0SW50ZXJpb3JWZWhpY2xlRGF0YSxcbiAgICAgICAgICAgIFNldEludGVyaW9yVmVoaWNsZURhdGFSZXNwb25zZSxcbiAgICAgICAgICAgIFNldE1lZGlhQ2xvY2tUaW1lcixcbiAgICAgICAgICAgIFNldE1lZGlhQ2xvY2tUaW1lclJlc3BvbnNlLFxuICAgICAgICAgICAgU2hvdyxcbiAgICAgICAgICAgIFNob3dBcHBNZW51LFxuICAgICAgICAgICAgU2hvd0FwcE1lbnVSZXNwb25zZSxcbiAgICAgICAgICAgIFNob3dDb25zdGFudFRCVCxcbiAgICAgICAgICAgIFNob3dDb25zdGFudFRCVFJlc3BvbnNlLFxuICAgICAgICAgICAgU2hvd1Jlc3BvbnNlLFxuICAgICAgICAgICAgU2xpZGVyLFxuICAgICAgICAgICAgU2xpZGVyUmVzcG9uc2UsXG4gICAgICAgICAgICBTcGVhayxcbiAgICAgICAgICAgIFNwZWFrUmVzcG9uc2UsXG4gICAgICAgICAgICBTdWJzY3JpYmVCdXR0b24sXG4gICAgICAgICAgICBTdWJzY3JpYmVCdXR0b25SZXNwb25zZSxcbiAgICAgICAgICAgIFN1YnNjcmliZVZlaGljbGVEYXRhLFxuICAgICAgICAgICAgU3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZSxcbiAgICAgICAgICAgIFN1YnNjcmliZVdheVBvaW50cyxcbiAgICAgICAgICAgIFN1YnNjcmliZVdheVBvaW50c1Jlc3BvbnNlLFxuICAgICAgICAgICAgU3lzdGVtUmVxdWVzdCxcbiAgICAgICAgICAgIFN5c3RlbVJlcXVlc3RSZXNwb25zZSxcbiAgICAgICAgICAgIFVucHVibGlzaEFwcFNlcnZpY2UsXG4gICAgICAgICAgICBVbnB1Ymxpc2hBcHBTZXJ2aWNlUmVzcG9uc2UsXG4gICAgICAgICAgICBVbnJlZ2lzdGVyQXBwSW50ZXJmYWNlLFxuICAgICAgICAgICAgVW5yZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlLFxuICAgICAgICAgICAgVW5zdWJzY3JpYmVCdXR0b24sXG4gICAgICAgICAgICBVbnN1YnNjcmliZUJ1dHRvblJlc3BvbnNlLFxuICAgICAgICAgICAgVW5zdWJzY3JpYmVWZWhpY2xlRGF0YSxcbiAgICAgICAgICAgIFVuc3Vic2NyaWJlVmVoaWNsZURhdGFSZXNwb25zZSxcbiAgICAgICAgICAgIFVuc3Vic2NyaWJlV2F5UG9pbnRzLFxuICAgICAgICAgICAgVW5zdWJzY3JpYmVXYXlQb2ludHNSZXNwb25zZSxcbiAgICAgICAgICAgIFVwZGF0ZVR1cm5MaXN0LFxuICAgICAgICAgICAgVXBkYXRlVHVybkxpc3RSZXNwb25zZSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RydWN0czoge1xuICAgICAgICAgICAgQWlyYmFnU3RhdHVzLFxuICAgICAgICAgICAgQXBwSW5mbyxcbiAgICAgICAgICAgIEFwcFNlcnZpY2VDYXBhYmlsaXR5LFxuICAgICAgICAgICAgQXBwU2VydmljZURhdGEsXG4gICAgICAgICAgICBBcHBTZXJ2aWNlTWFuaWZlc3QsXG4gICAgICAgICAgICBBcHBTZXJ2aWNlUmVjb3JkLFxuICAgICAgICAgICAgQXBwU2VydmljZXNDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICBBdWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICBBdWRpb0NvbnRyb2xEYXRhLFxuICAgICAgICAgICAgQXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIEJlbHRTdGF0dXMsXG4gICAgICAgICAgICBCb2R5SW5mb3JtYXRpb24sXG4gICAgICAgICAgICBCdXR0b25DYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICBDaG9pY2UsXG4gICAgICAgICAgICBDbGltYXRlQ29udHJvbENhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIENsaW1hdGVDb250cm9sRGF0YSxcbiAgICAgICAgICAgIENsb3VkQXBwUHJvcGVydGllcyxcbiAgICAgICAgICAgIENsdXN0ZXJNb2RlU3RhdHVzLFxuICAgICAgICAgICAgQ29vcmRpbmF0ZSxcbiAgICAgICAgICAgIERJRFJlc3VsdCxcbiAgICAgICAgICAgIERhdGVUaW1lLFxuICAgICAgICAgICAgRGV2aWNlSW5mbyxcbiAgICAgICAgICAgIERldmljZVN0YXR1cyxcbiAgICAgICAgICAgIERpc3BsYXlDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICBEaXNwbGF5Q2FwYWJpbGl0eSxcbiAgICAgICAgICAgIEVDYWxsSW5mbyxcbiAgICAgICAgICAgIEVtZXJnZW5jeUV2ZW50LFxuICAgICAgICAgICAgRXF1YWxpemVyU2V0dGluZ3MsXG4gICAgICAgICAgICBGdWVsUmFuZ2UsXG4gICAgICAgICAgICBHUFNEYXRhLFxuICAgICAgICAgICAgR3JpZCxcbiAgICAgICAgICAgIEhNSUNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIEhNSVBlcm1pc3Npb25zLFxuICAgICAgICAgICAgSE1JU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgSE1JU2V0dGluZ3NDb250cm9sRGF0YSxcbiAgICAgICAgICAgIEhhcHRpY1JlY3QsXG4gICAgICAgICAgICBIZWFkTGFtcFN0YXR1cyxcbiAgICAgICAgICAgIEltYWdlLFxuICAgICAgICAgICAgSW1hZ2VGaWVsZCxcbiAgICAgICAgICAgIEltYWdlUmVzb2x1dGlvbixcbiAgICAgICAgICAgIEtleWJvYXJkUHJvcGVydGllcyxcbiAgICAgICAgICAgIExpZ2h0Q2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgTGlnaHRDb250cm9sQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgTGlnaHRDb250cm9sRGF0YSxcbiAgICAgICAgICAgIExpZ2h0U3RhdGUsXG4gICAgICAgICAgICBMb2NhdGlvbkRldGFpbHMsXG4gICAgICAgICAgICBNYXNzYWdlQ3VzaGlvbkZpcm1uZXNzLFxuICAgICAgICAgICAgTWFzc2FnZU1vZGVEYXRhLFxuICAgICAgICAgICAgTWVkaWFTZXJ2aWNlRGF0YSxcbiAgICAgICAgICAgIE1lZGlhU2VydmljZU1hbmlmZXN0LFxuICAgICAgICAgICAgTWVudVBhcmFtcyxcbiAgICAgICAgICAgIE1ldGFkYXRhVGFncyxcbiAgICAgICAgICAgIE1vZHVsZURhdGEsXG4gICAgICAgICAgICBNb2R1bGVJbmZvLFxuICAgICAgICAgICAgTXlLZXksXG4gICAgICAgICAgICBOYXZpZ2F0aW9uQ2FwYWJpbGl0eSxcbiAgICAgICAgICAgIE5hdmlnYXRpb25JbnN0cnVjdGlvbixcbiAgICAgICAgICAgIE5hdmlnYXRpb25TZXJ2aWNlRGF0YSxcbiAgICAgICAgICAgIE5hdmlnYXRpb25TZXJ2aWNlTWFuaWZlc3QsXG4gICAgICAgICAgICBPQVNJU0FkZHJlc3MsXG4gICAgICAgICAgICBQYXJhbWV0ZXJQZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIFBlcm1pc3Npb25JdGVtLFxuICAgICAgICAgICAgUGhvbmVDYXBhYmlsaXR5LFxuICAgICAgICAgICAgUHJlc2V0QmFua0NhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIFJHQkNvbG9yLFxuICAgICAgICAgICAgUmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgUmFkaW9Db250cm9sRGF0YSxcbiAgICAgICAgICAgIFJkc0RhdGEsXG4gICAgICAgICAgICBSZWN0YW5nbGUsXG4gICAgICAgICAgICBSZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgU2NyZWVuUGFyYW1zLFxuICAgICAgICAgICAgU2RsTXNnVmVyc2lvbixcbiAgICAgICAgICAgIFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgU2VhdENvbnRyb2xEYXRhLFxuICAgICAgICAgICAgU2VhdExvY2F0aW9uLFxuICAgICAgICAgICAgU2VhdExvY2F0aW9uQ2FwYWJpbGl0eSxcbiAgICAgICAgICAgIFNlYXRNZW1vcnlBY3Rpb24sXG4gICAgICAgICAgICBTaW5nbGVUaXJlU3RhdHVzLFxuICAgICAgICAgICAgU2lzRGF0YSxcbiAgICAgICAgICAgIFNvZnRCdXR0b24sXG4gICAgICAgICAgICBTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgU3RhcnRUaW1lLFxuICAgICAgICAgICAgU3RhdGlvbklETnVtYmVyLFxuICAgICAgICAgICAgU3lzdGVtQ2FwYWJpbGl0eSxcbiAgICAgICAgICAgIFRUU0NodW5rLFxuICAgICAgICAgICAgVGVtcGVyYXR1cmUsXG4gICAgICAgICAgICBUZW1wbGF0ZUNvbG9yU2NoZW1lLFxuICAgICAgICAgICAgVGVtcGxhdGVDb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgVGV4dEZpZWxkLFxuICAgICAgICAgICAgVGlyZVN0YXR1cyxcbiAgICAgICAgICAgIFRvdWNoQ29vcmQsXG4gICAgICAgICAgICBUb3VjaEV2ZW50LFxuICAgICAgICAgICAgVG91Y2hFdmVudENhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIFR1cm4sXG4gICAgICAgICAgICBWZWhpY2xlRGF0YVJlc3VsdCxcbiAgICAgICAgICAgIFZlaGljbGVUeXBlLFxuICAgICAgICAgICAgVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5LFxuICAgICAgICAgICAgVmlkZW9TdHJlYW1pbmdGb3JtYXQsXG4gICAgICAgICAgICBWckhlbHBJdGVtLFxuICAgICAgICAgICAgV2VhdGhlckFsZXJ0LFxuICAgICAgICAgICAgV2VhdGhlckRhdGEsXG4gICAgICAgICAgICBXZWF0aGVyU2VydmljZURhdGEsXG4gICAgICAgICAgICBXZWF0aGVyU2VydmljZU1hbmlmZXN0LFxuICAgICAgICAgICAgV2luZG93Q2FwYWJpbGl0eSxcbiAgICAgICAgICAgIFdpbmRvd1R5cGVDYXBhYmlsaXRpZXMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBzZXNzaW9uOiB7XG4gICAgICAgIFNkbFNlcnZpY2VMaXN0ZW5lcixcbiAgICAgICAgU2RsU2Vzc2lvbixcbiAgICAgICAgU2RsU2Vzc2lvbkxpc3RlbmVyLFxuICAgICAgICBTZXJ2aWNlTGlzdGVuZXJNYXAsXG4gICAgfSxcbiAgICBzdHJlYW1pbmc6IHtcbiAgICAgICAgdmlkZW86IHtcbiAgICAgICAgICAgIFZpZGVvU3RyZWFtaW5nUGFyYW1ldGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHRyYW5zcG9ydDoge1xuICAgICAgICBDdXN0b21UcmFuc3BvcnQsXG4gICAgICAgIEN1c3RvbVRyYW5zcG9ydENvbmZpZyxcbiAgICAgICAgU2RsUHNtLFxuICAgICAgICBTc2xDb25maWcsXG4gICAgICAgIFRyYW5zcG9ydEJhc2UsXG4gICAgICAgIFRyYW5zcG9ydENhbGxiYWNrLFxuICAgICAgICBUcmFuc3BvcnRDb25maWdCYXNlLFxuICAgICAgICBUcmFuc3BvcnRMaXN0ZW5lcixcbiAgICAgICAgVHJhbnNwb3J0TWFuYWdlcixcbiAgICAgICAgVHJhbnNwb3J0TWFuYWdlckJhc2UsXG4gICAgICAgIFdlYlNvY2tldENsaWVudCxcbiAgICAgICAgV2ViU29ja2V0Q2xpZW50Q29uZmlnLFxuICAgICAgICBlbnVtczoge1xuICAgICAgICAgICAgVHJhbnNwb3J0VHlwZSxcbiAgICAgICAgfSxcbiAgICAgICAgdXRpbDoge1xuICAgICAgICAgICAgVHJhbnNwb3J0UmVjb3JkLFxuICAgICAgICB9LFxuICAgICAgICBXZWJTb2NrZXRTZXJ2ZXIsXG4gICAgICAgIFdlYlNvY2tldFNlcnZlckNvbmZpZyxcbiAgICB9LFxuICAgIHV0aWw6IHtcbiAgICAgICAgQXJyYXlUb29scyxcbiAgICAgICAgQml0Q29udmVydGVyLFxuICAgICAgICBCc29uLFxuICAgICAgICBFbnVtLFxuICAgICAgICBKc29uUnBjTWFyc2hhbGxlcixcbiAgICAgICAgVGV4dEVuY29kZXIsXG4gICAgICAgIFZlcnNpb24sXG4gICAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNETDsiXSwibmFtZXMiOlsiQXBwQ29uZmlnIiwiY29uc3RydWN0b3IiLCJfdHJhbnNwb3J0Q29uZmlnIiwiX2FwcElkIiwiX2FwcE5hbWUiLCJfaWNvbk5hbWUiLCJfaWNvbkZpbGUiLCJfc2hvcnRBcHBOYW1lIiwiX3R0c05hbWUiLCJfdnJTeW5vbnltcyIsIl9pc01lZGlhQXBwIiwiX2xhbmd1YWdlRGVzaXJlZCIsIl9obWlEaXNwbGF5TGFuZ3VhZ2VEZXNpcmVkIiwiX2FwcFR5cGVzIiwiX2RheUNvbG9yU2NoZW1lIiwiX25pZ2h0Q29sb3JTY2hlbWUiLCJfbWluaW11bVJQQ1ZlcnNpb24iLCJfbWluaW11bVByb3RvY29sVmVyc2lvbiIsInNldFRyYW5zcG9ydENvbmZpZyIsInRyYW5zcG9ydENvbmZpZyIsImdldFRyYW5zcG9ydENvbmZpZyIsInNldEFwcElkIiwiYXBwSWQiLCJnZXRBcHBJZCIsInNldEFwcE5hbWUiLCJhcHBOYW1lIiwiZ2V0QXBwTmFtZSIsInNldEFwcEljb24iLCJpY29uTmFtZSIsImZpbGVEYXRhIiwiZ2V0QXBwSWNvbk5hbWUiLCJnZXRBcHBJY29uRmlsZURhdGEiLCJzZXRTaG9ydEFwcE5hbWUiLCJzaG9ydEFwcE5hbWUiLCJnZXRTaG9ydEFwcE5hbWUiLCJzZXRUdHNOYW1lIiwidHRzTmFtZSIsImdldFR0c05hbWUiLCJzZXRWclN5bm9ueW1zIiwidnJTeW5vbnltcyIsImdldFZyU3lub255bXMiLCJzZXRJc01lZGlhQXBwIiwiaXNNZWRpYUFwcCIsInNldExhbmd1YWdlRGVzaXJlZCIsImxhbmd1YWdlRGVzaXJlZCIsImdldExhbmd1YWdlRGVzaXJlZCIsInNldEhtaURpc3BsYXlMYW5ndWFnZURlc2lyZWQiLCJobWlEaXNwbGF5TGFuZ3VhZ2VEZXNpcmVkIiwiZ2V0SG1pRGlzcGxheUxhbmd1YWdlRGVzaXJlZCIsInNldEFwcFR5cGVzIiwiYXBwVHlwZXMiLCJnZXRBcHBUeXBlcyIsInNldERheUNvbG9yU2NoZW1lIiwiZGF5Q29sb3JTY2hlbWUiLCJnZXREYXlDb2xvclNjaGVtZSIsInNldE5pZ2h0Q29sb3JTY2hlbWUiLCJuaWdodENvbG9yU2NoZW1lIiwiZ2V0TmlnaHRDb2xvclNjaGVtZSIsInNldE1pbmltdW1SUENWZXJzaW9uIiwibWluaW11bVJQQ1ZlcnNpb24iLCJnZXRNaW5pbXVtUlBDVmVyc2lvbiIsInNldE1pbmltdW1Qcm90b2NvbFZlcnNpb24iLCJtaW5pbXVtUHJvdG9jb2xWZXJzaW9uIiwiZ2V0TWluaW11bVByb3RvY29sVmVyc2lvbiIsIkxpZmVjeWNsZUxpc3RlbmVyIiwiX29uUHJveHlDb25uZWN0ZWQiLCJfb25Qcm94eUNsb3NlZCIsIl9vblNlcnZpY2VTdGFydGVkIiwiX29uU2VydmljZUVuZGVkIiwiX29uRXJyb3IiLCJzZXRPblByb3h5Q29ubmVjdGVkIiwibGlzdGVuZXIiLCJzZXRPblByb3h5Q2xvc2VkIiwic2V0T25TZXJ2aWNlU3RhcnRlZCIsInNldE9uU2VydmljZUVuZGVkIiwic2V0T25FcnJvciIsIm9uUHJveHlDb25uZWN0ZWQiLCJsaWZlY3ljbGVNYW5hZ2VyIiwib25Qcm94eUNsb3NlZCIsImluZm8iLCJyZWFzb24iLCJvblNlcnZpY2VTdGFydGVkIiwic2VydmljZVR5cGUiLCJzZXNzaW9uSUQiLCJjb3JyZWxhdGlvbklEIiwiX29uUHJvdG9jb2xTZXNzaW9uRW5kZWROQUNLZWQiLCJvblNlcnZpY2VFbmRlZCIsIm9uRXJyb3IiLCJFbnVtIiwiX2tleUZvclZhbHVlIiwidmFsdWUiLCJtYXAiLCJrZXkiLCJrZXlGb3JWYWx1ZSIsIkVycm9yIiwiX3ZhbHVlRm9yS2V5IiwidmFsdWVGb3JLZXkiLCJScGNTdHJ1Y3QiLCJwYXJhbWV0ZXJzIiwiX2lzRm9ybWF0UmVxdWVzdGVkIiwiX3JwY1NwZWNWZXJzaW9uIiwiX3BhcmFtZXRlcnMiLCJnZXRQYXJhbWV0ZXJzIiwiZ2V0UGFyYW1ldGVyIiwic2V0UGFyYW1ldGVyIiwiZ2V0T2JqZWN0IiwidENsYXNzIiwiX2Zvcm1hdE9iamVjdCIsIm9iaiIsInVuZGVmaW5lZCIsIlN0cmluZyIsIk9iamVjdCIsInByb3RvdHlwZSIsIkFycmF5IiwibGVuZ3RoIiwib3V0QXJyYXkiLCJpdGVtIiwicHVzaCIsInZhbGlkYXRlVHlwZSIsImlzQXJyYXkiLCJuYW1lIiwiQXBwSW5mbyIsInNldEFwcERpc3BsYXlOYW1lIiwiS0VZX0FQUF9ESVNQTEFZX05BTUUiLCJnZXRBcHBEaXNwbGF5TmFtZSIsInNldEFwcEJ1bmRsZUlEIiwiaWQiLCJLRVlfQVBQX0JVTkRMRV9JRCIsImdldEFwcEJ1bmRsZUlEIiwic2V0QXBwVmVyc2lvbiIsInZlcnNpb24iLCJLRVlfQVBQX1ZFUlNJT04iLCJnZXRBcHBWZXJzaW9uIiwiaWNvbiIsIktFWV9BUFBfSUNPTiIsImdldEFwcEljb24iLCJSR0JDb2xvciIsInNldFJlZCIsInJlZCIsIktFWV9SRUQiLCJnZXRSZWQiLCJzZXRHcmVlbiIsImdyZWVuIiwiS0VZX0dSRUVOIiwiZ2V0R3JlZW4iLCJzZXRCbHVlIiwiYmx1ZSIsIktFWV9CTFVFIiwiZ2V0Qmx1ZSIsIlRlbXBsYXRlQ29sb3JTY2hlbWUiLCJzZXRQcmltYXJ5Q29sb3IiLCJjb2xvciIsIktFWV9QUklNQVJZX0NPTE9SIiwiZ2V0UHJpbWFyeUNvbG9yIiwic2V0U2Vjb25kYXJ5Q29sb3IiLCJLRVlfU0VDT05EQVJZX0NPTE9SIiwiZ2V0U2Vjb25kYXJ5Q29sb3IiLCJzZXRCYWNrZ3JvdW5kQ29sb3IiLCJLRVlfQkFDS0dST1VORF9DT0xPUiIsImdldEJhY2tncm91bmRDb2xvciIsIkZ1bmN0aW9uSUQiLCJSRVNFUlZFRCIsIl9NQVAiLCJSZWdpc3RlckFwcEludGVyZmFjZSIsIlVucmVnaXN0ZXJBcHBJbnRlcmZhY2UiLCJTZXRHbG9iYWxQcm9wZXJ0aWVzIiwiUmVzZXRHbG9iYWxQcm9wZXJ0aWVzIiwiQWRkQ29tbWFuZCIsIkRlbGV0ZUNvbW1hbmQiLCJBZGRTdWJNZW51IiwiRGVsZXRlU3ViTWVudSIsIkNyZWF0ZUludGVyYWN0aW9uQ2hvaWNlU2V0IiwiUGVyZm9ybUludGVyYWN0aW9uIiwiRGVsZXRlSW50ZXJhY3Rpb25DaG9pY2VTZXQiLCJBbGVydCIsIlNob3ciLCJTcGVhayIsIlNldE1lZGlhQ2xvY2tUaW1lciIsIlBlcmZvcm1BdWRpb1Bhc3NUaHJ1IiwiRW5kQXVkaW9QYXNzVGhydSIsIlN1YnNjcmliZUJ1dHRvbiIsIlVuc3Vic2NyaWJlQnV0dG9uIiwiU3Vic2NyaWJlVmVoaWNsZURhdGEiLCJVbnN1YnNjcmliZVZlaGljbGVEYXRhIiwiR2V0VmVoaWNsZURhdGEiLCJSZWFkRElEIiwiR2V0RFRDcyIsIlNjcm9sbGFibGVNZXNzYWdlIiwiU2xpZGVyIiwiU2hvd0NvbnN0YW50VEJUIiwiQWxlcnRNYW5ldXZlciIsIlVwZGF0ZVR1cm5MaXN0IiwiQ2hhbmdlUmVnaXN0cmF0aW9uIiwiR2VuZXJpY1Jlc3BvbnNlIiwiUHV0RmlsZSIsIkRlbGV0ZUZpbGUiLCJMaXN0RmlsZXMiLCJTZXRBcHBJY29uIiwiU2V0RGlzcGxheUxheW91dCIsIkRpYWdub3N0aWNNZXNzYWdlIiwiU3lzdGVtUmVxdWVzdCIsIlNlbmRMb2NhdGlvbiIsIkRpYWxOdW1iZXIiLCJCdXR0b25QcmVzcyIsIkdldEludGVyaW9yVmVoaWNsZURhdGEiLCJTZXRJbnRlcmlvclZlaGljbGVEYXRhIiwiR2V0V2F5UG9pbnRzIiwiU3Vic2NyaWJlV2F5UG9pbnRzIiwiVW5zdWJzY3JpYmVXYXlQb2ludHMiLCJHZXRTeXN0ZW1DYXBhYmlsaXR5IiwiU2VuZEhhcHRpY0RhdGEiLCJTZXRDbG91ZEFwcFByb3BlcnRpZXMiLCJHZXRDbG91ZEFwcFByb3BlcnRpZXMiLCJQdWJsaXNoQXBwU2VydmljZSIsIkdldEFwcFNlcnZpY2VEYXRhIiwiR2V0RmlsZSIsIlBlcmZvcm1BcHBTZXJ2aWNlSW50ZXJhY3Rpb24iLCJVbnB1Ymxpc2hBcHBTZXJ2aWNlIiwiQ2FuY2VsSW50ZXJhY3Rpb24iLCJDbG9zZUFwcGxpY2F0aW9uIiwiU2hvd0FwcE1lbnUiLCJDcmVhdGVXaW5kb3ciLCJEZWxldGVXaW5kb3ciLCJHZXRJbnRlcmlvclZlaGljbGVEYXRhQ29uc2VudCIsIlJlbGVhc2VJbnRlcmlvclZlaGljbGVEYXRhTW9kdWxlIiwiT25ITUlTdGF0dXMiLCJPbkFwcEludGVyZmFjZVVucmVnaXN0ZXJlZCIsIk9uQnV0dG9uRXZlbnQiLCJPbkJ1dHRvblByZXNzIiwiT25WZWhpY2xlRGF0YSIsIk9uQ29tbWFuZCIsIk9uVEJUQ2xpZW50U3RhdGUiLCJPbkRyaXZlckRpc3RyYWN0aW9uIiwiT25QZXJtaXNzaW9uc0NoYW5nZSIsIk9uQXVkaW9QYXNzVGhydSIsIk9uTGFuZ3VhZ2VDaGFuZ2UiLCJPbktleWJvYXJkSW5wdXQiLCJPblRvdWNoRXZlbnQiLCJPblN5c3RlbVJlcXVlc3QiLCJPbkhhc2hDaGFuZ2UiLCJPbkludGVyaW9yVmVoaWNsZURhdGEiLCJPbldheVBvaW50Q2hhbmdlIiwiT25SQ1N0YXR1cyIsIk9uQXBwU2VydmljZURhdGEiLCJPblN5c3RlbUNhcGFiaWxpdHlVcGRhdGVkIiwiRW5jb2RlZFN5bmNQRGF0YSIsIlNkbFBEYXRhIiwiT25FbmNvZGVkU3luY1BEYXRhIiwiT25TeW5jUERhdGEiLCJmcmVlemUiLCJTcGVlY2hDYXBhYmlsaXRpZXMiLCJTQ19URVhUIiwiU0FQSV9QSE9ORU1FUyIsIkxIUExVU19QSE9ORU1FUyIsIlBSRV9SRUNPUkRFRCIsIlNJTEVOQ0UiLCJGSUxFIiwiVFRTQ2h1bmsiLCJzZXRUZXh0IiwidGV4dCIsIktFWV9URVhUIiwiZ2V0VGV4dCIsInNldFR5cGUiLCJ0eXBlIiwiS0VZX1RZUEUiLCJnZXRUeXBlIiwiU2RsTXNnVmVyc2lvbiIsInNldE1ham9yVmVyc2lvbiIsIktFWV9NQUpPUl9WRVJTSU9OIiwiZ2V0TWFqb3JWZXJzaW9uIiwic2V0TWlub3JWZXJzaW9uIiwiS0VZX01JTk9SX1ZFUlNJT04iLCJnZXRNaW5vclZlcnNpb24iLCJzZXRQYXRjaFZlcnNpb24iLCJLRVlfUEFUQ0hfVkVSU0lPTiIsImdldFBhdGNoVmVyc2lvbiIsIkFwcEhNSVR5cGUiLCJERUZBVUxUIiwiQ09NTVVOSUNBVElPTiIsIk1FRElBIiwiTUVTU0FHSU5HIiwiTkFWSUdBVElPTiIsIklORk9STUFUSU9OIiwiU09DSUFMIiwiQkFDS0dST1VORF9QUk9DRVNTIiwiVEVTVElORyIsIlNZU1RFTSIsIlBST0pFQ1RJT04iLCJSRU1PVEVfQ09OVFJPTCIsIkxhbmd1YWdlIiwiRU5fVVMiLCJFU19NWCIsIkZSX0NBIiwiREVfREUiLCJFU19FUyIsIkVOX0dCIiwiUlVfUlUiLCJUUl9UUiIsIlBMX1BMIiwiRlJfRlIiLCJJVF9JVCIsIlNWX1NFIiwiUFRfUFQiLCJOTF9OTCIsIkVOX0FVIiwiWkhfQ04iLCJaSF9UVyIsIkpBX0pQIiwiQVJfU0EiLCJLT19LUiIsIlBUX0JSIiwiQ1NfQ1oiLCJEQV9ESyIsIk5PX05PIiwiTkxfQkUiLCJFTF9HUiIsIkhVX0hVIiwiRklfRkkiLCJTS19TSyIsIkVOX0lOIiwiVEhfVEgiLCJFTl9TQSIsIkhFX0lMIiwiUk9fUk8iLCJVS19VQSIsIklEX0lEIiwiVklfVk4iLCJNU19NWSIsIkhJX0lOIiwiUnBjTWVzc2FnZSIsInN0b3JlIiwiX2lzRW5jcnlwdGVkIiwiX3JwY1R5cGUiLCJycGNUeXBlIiwiX2Z1bmN0aW9uTmFtZSIsImZ1bmN0aW9uTmFtZSIsIl9jb3JyZWxhdGlvbklEIiwic2V0QnVsa0RhdGEiLCJidWxrRGF0YSIsImdldFJQQ1R5cGUiLCJzZXRSUENUeXBlIiwiZ2V0RnVuY3Rpb25OYW1lIiwic2V0RnVuY3Rpb25OYW1lIiwiZ2V0Q29ycmVsYXRpb25JZCIsInNldENvcnJlbGF0aW9uSWQiLCJnZXRCdWxrRGF0YSIsIl9idWxrRGF0YSIsImRhdGEiLCJzbGljZSIsImdldElzRW5jcnlwdGVkIiwic2V0SXNFbmNyeXB0ZWQiLCJib29sIiwiUnBjVHlwZSIsIk5PVElGSUNBVElPTiIsIlJFU1BPTlNFIiwiUkVRVUVTVCIsIlJwY1JlcXVlc3QiLCJfcHJvbWlzZSIsImdldE9uUlBDUmVzcG9uc2VQcm9taXNlIiwic2V0T25SUENSZXNwb25zZVByb21pc2UiLCJwcm9taXNlIiwiUHJvbWlzZSIsIkRldmljZUluZm8iLCJzZXRIYXJkd2FyZSIsImhhcmR3YXJlIiwiS0VZX0hBUkRXQVJFIiwiZ2V0SGFyZHdhcmUiLCJzZXRGaXJtd2FyZVJldiIsInJldiIsIktFWV9GSVJNV0FSRV9SRVYiLCJnZXRGaXJtd2FyZVJldiIsInNldE9zIiwib3MiLCJLRVlfT1MiLCJnZXRPcyIsInNldE9zVmVyc2lvbiIsIktFWV9PU19WRVJTSU9OIiwiZ2V0T3NWZXJzaW9uIiwic2V0Q2FycmllciIsImNhcnJpZXIiLCJLRVlfQ0FSUklFUiIsImdldENhcnJpZXIiLCJzZXRNYXhOdW1iZXJSRkNPTU1Qb3J0cyIsInBvcnRzIiwiS0VZX01BWF9OVU1CRVJfUkZDT01NX1BPUlRTIiwiZ2V0TWF4TnVtYmVyUkZDT01NUG9ydHMiLCJzZXRGdWxsQXBwSWQiLCJmdWxsQXBwSWQiLCJ0b0xvd2VyQ2FzZSIsIktFWV9GVUxMX0FQUF9JRCIsImFwcElEIiwiQVBQX0lEX01BWF9MRU5HVEgiLCJyZXBsYWNlIiwic3Vic3RyaW5nIiwiX3NldEFwcElkIiwiZ2V0RnVsbEFwcElkIiwiS0VZX0FQUF9JRCIsInNldFNkbE1zZ1ZlcnNpb24iLCJLRVlfU0RMX01TR19WRVJTSU9OIiwiZ2V0U2RsTXNnVmVyc2lvbiIsIktFWV9BUFBfTkFNRSIsIktFWV9UVFNfTkFNRSIsInNldE5nbk1lZGlhU2NyZWVuQXBwTmFtZSIsIktFWV9OR05fTUVESUFfU0NSRUVOX0FQUF9OQU1FIiwiZ2V0TmduTWVkaWFTY3JlZW5BcHBOYW1lIiwic3lub255bXMiLCJLRVlfVlJfU1lOT05ZTVMiLCJzZXRJc01lZGlhQXBwbGljYXRpb24iLCJhcHBsaWNhdGlvbiIsIktFWV9JU19NRURJQV9BUFBMSUNBVElPTiIsImdldElzTWVkaWFBcHBsaWNhdGlvbiIsImRlc2lyZWQiLCJLRVlfTEFOR1VBR0VfREVTSVJFRCIsIktFWV9ITUlfRElTUExBWV9MQU5HVUFHRV9ERVNJUkVEIiwic2V0QXBwSE1JVHlwZSIsIktFWV9BUFBfSE1JX1RZUEUiLCJnZXRBcHBITUlUeXBlIiwic2V0SGFzaElEIiwiS0VZX0hBU0hfSUQiLCJnZXRIYXNoSUQiLCJzZXREZXZpY2VJbmZvIiwiS0VZX0RFVklDRV9JTkZPIiwiZ2V0RGV2aWNlSW5mbyIsInNldEZ1bGxBcHBJRCIsImdldEZ1bGxBcHBJRCIsInNldEFwcEluZm8iLCJLRVlfQVBQX0lORk8iLCJnZXRBcHBJbmZvIiwic2NoZW1lIiwiS0VZX0RBWV9DT0xPUl9TQ0hFTUUiLCJLRVlfTklHSFRfQ09MT1JfU0NIRU1FIiwiUmVzdWx0IiwiU1VDQ0VTUyIsIlVOU1VQUE9SVEVEX1JFUVVFU1QiLCJVTlNVUFBPUlRFRF9SRVNPVVJDRSIsIkRJU0FMTE9XRUQiLCJSRUpFQ1RFRCIsIkFCT1JURUQiLCJJR05PUkVEIiwiUkVUUlkiLCJJTl9VU0UiLCJWRUhJQ0xFX0RBVEFfTk9UX0FWQUlMQUJMRSIsIlRJTUVEX09VVCIsIklOVkFMSURfREFUQSIsIkNIQVJfTElNSVRfRVhDRUVERUQiLCJJTlZBTElEX0lEIiwiRFVQTElDQVRFX05BTUUiLCJBUFBMSUNBVElPTl9OT1RfUkVHSVNURVJFRCIsIldST05HX0xBTkdVQUdFIiwiT1VUX09GX01FTU9SWSIsIlRPT19NQU5ZX1BFTkRJTkdfUkVRVUVTVFMiLCJUT09fTUFOWV9BUFBMSUNBVElPTlMiLCJBUFBMSUNBVElPTl9SRUdJU1RFUkVEX0FMUkVBRFkiLCJXQVJOSU5HUyIsIkdFTkVSSUNfRVJST1IiLCJVU0VSX0RJU0FMTE9XRUQiLCJUUlVOQ0FURURfREFUQSIsIlVOU1VQUE9SVEVEX1ZFUlNJT04iLCJWRUhJQ0xFX0RBVEFfTk9UX0FMTE9XRUQiLCJGSUxFX05PVF9GT1VORCIsIkNBTkNFTF9ST1VURSIsIlNBVkVEIiwiSU5WQUxJRF9DRVJUIiwiRVhQSVJFRF9DRVJUIiwiUkVTVU1FX0ZBSUxFRCIsIkRBVEFfTk9UX0FWQUlMQUJMRSIsIlJFQURfT05MWSIsIkNPUlJVUFRFRF9EQVRBIiwiRU5DUllQVElPTl9ORUVERUQiLCJScGNSZXNwb25zZSIsImdldFN1Y2Nlc3MiLCJLRVlfU1VDQ0VTUyIsInNldFN1Y2Nlc3MiLCJzdWNjZXNzIiwiZ2V0SW5mbyIsIktFWV9JTkZPIiwic2V0SW5mbyIsImdldFJlc3VsdENvZGUiLCJLRVlfUkVTVUxUX0NPREUiLCJzZXRSZXN1bHRDb2RlIiwicmVzdWx0Q29kZSIsIlJwY0xpc3RlbmVyIiwiX29uUnBjTWVzc2FnZSIsInNldE9uUnBjTWVzc2FnZSIsImZ1bmMiLCJvblJwY01lc3NhZ2UiLCJycGNNZXNzYWdlIiwiU2RsUHJvdG9jb2xMaXN0ZW5lciIsIl9vblJwY01lc3NhZ2VSZWNlaXZlZCIsIl9vblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQiLCJfb25Qcm90b2NvbFNlc3Npb25FbmRlZCIsIl9nZXRTZXNzaW9uSWQiLCJfb25UcmFuc3BvcnRDb25uZWN0ZWQiLCJzZXRPblRyYW5zcG9ydENvbm5lY3RlZCIsInNldE9uUnBjTWVzc2FnZVJlY2VpdmVkIiwib25ScGNNZXNzYWdlUmVjZWl2ZWQiLCJzZXRPblByb3RvY29sU2Vzc2lvblN0YXJ0ZWQiLCJvblRyYW5zcG9ydENvbm5lY3RlZCIsIm9uUHJvdG9jb2xTZXNzaW9uU3RhcnRlZCIsInNlc3Npb25JZCIsImNvcnJlbGF0aW9uSWQiLCJoYXNoSWQiLCJpc0VuY3J5cHRlZCIsInNldE9uUHJvdG9jb2xTZXNzaW9uRW5kZWQiLCJvblByb3RvY29sU2Vzc2lvbkVuZGVkIiwic2V0T25Qcm90b2NvbFNlc3Npb25FbmRlZE5BQ0tlZCIsIm9uUHJvdG9jb2xTZXNzaW9uRW5kZWROQUNLZWQiLCJzZXRHZXRTZXNzaW9uSWQiLCJnZXR0ZXIiLCJnZXRTZXNzaW9uSWQiLCJzZXRHZXREZXNpcmVkVmlkZW9QYXJhbXMiLCJfZ2V0RGVzaXJlZFZpZGVvUGFyYW1zIiwiZ2V0RGVzaXJlZFZpZGVvUGFyYW1zIiwic2V0U2V0QWNjZXB0ZWRWaWRlb1BhcmFtcyIsInNldHRlciIsIl9zZXRBY2NlcHRlZFZpZGVvUGFyYW1zIiwic2V0QWNjZXB0ZWRWaWRlb1BhcmFtcyIsInBhcmFtcyIsIkZyYW1lVHlwZSIsIkNPTlRST0wiLCJGSVJTVCIsIkNPTlNFQ1VUSVZFIiwiU0lOR0xFIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwibW9kdWxlIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJkIiwibyIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwiZ2V0RGVmYXVsdCIsImdldE1vZHVsZUV4cG9ydHMiLCJvYmplY3QiLCJwcm9wZXJ0eSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJnIiwiRnVuY3Rpb24iLCJldmFsIiwiZSIsIndpbmRvdyIsImdsb2JhbCIsImJhc2U2NCIsImllZWU3NTQiLCJCdWZmZXIiLCJTbG93QnVmZmVyIiwiSU5TUEVDVF9NQVhfQllURVMiLCJUWVBFRF9BUlJBWV9TVVBQT1JUIiwidHlwZWRBcnJheVN1cHBvcnQiLCJrTWF4TGVuZ3RoIiwiYXJyIiwiVWludDhBcnJheSIsIl9fcHJvdG9fXyIsImZvbyIsInN1YmFycmF5IiwiYnl0ZUxlbmd0aCIsImNyZWF0ZUJ1ZmZlciIsInRoYXQiLCJSYW5nZUVycm9yIiwiYXJnIiwiZW5jb2RpbmdPck9mZnNldCIsImFsbG9jVW5zYWZlIiwiZnJvbSIsInBvb2xTaXplIiwiX2F1Z21lbnQiLCJUeXBlRXJyb3IiLCJBcnJheUJ1ZmZlciIsImZyb21BcnJheUJ1ZmZlciIsImZyb21TdHJpbmciLCJmcm9tT2JqZWN0IiwiU3ltYm9sIiwic3BlY2llcyIsImFzc2VydFNpemUiLCJzaXplIiwiYWxsb2MiLCJmaWxsIiwiZW5jb2RpbmciLCJjaGVja2VkIiwiYWxsb2NVbnNhZmVTbG93Iiwic3RyaW5nIiwiaXNFbmNvZGluZyIsImFjdHVhbCIsIndyaXRlIiwiZnJvbUFycmF5TGlrZSIsImFycmF5IiwiYnl0ZU9mZnNldCIsImlzQnVmZmVyIiwibGVuIiwiY29weSIsImJ1ZmZlciIsImlzbmFuIiwidG9TdHJpbmciLCJiIiwiX2lzQnVmZmVyIiwiY29tcGFyZSIsImEiLCJ4IiwieSIsIk1hdGgiLCJtaW4iLCJjb25jYXQiLCJsaXN0IiwicG9zIiwiYnVmIiwiaXNWaWV3IiwibG93ZXJlZENhc2UiLCJ1dGY4VG9CeXRlcyIsImJhc2U2NFRvQnl0ZXMiLCJzbG93VG9TdHJpbmciLCJzdGFydCIsImVuZCIsImhleFNsaWNlIiwidXRmOFNsaWNlIiwiYXNjaWlTbGljZSIsImxhdGluMVNsaWNlIiwiYmFzZTY0U2xpY2UiLCJ1dGYxNmxlU2xpY2UiLCJzd2FwIiwic3dhcDE2Iiwic3dhcDMyIiwic3dhcDY0IiwiYXJndW1lbnRzIiwiYXBwbHkiLCJlcXVhbHMiLCJpbnNwZWN0Iiwic3RyIiwibWF4IiwibWF0Y2giLCJqb2luIiwidGFyZ2V0IiwidGhpc1N0YXJ0IiwidGhpc0VuZCIsInRoaXNDb3B5IiwidGFyZ2V0Q29weSIsImJpZGlyZWN0aW9uYWxJbmRleE9mIiwidmFsIiwiZGlyIiwiaXNOYU4iLCJhcnJheUluZGV4T2YiLCJpbmRleE9mIiwibGFzdEluZGV4T2YiLCJpbmRleFNpemUiLCJhcnJMZW5ndGgiLCJ2YWxMZW5ndGgiLCJyZWFkIiwicmVhZFVJbnQxNkJFIiwiZm91bmRJbmRleCIsImZvdW5kIiwiaiIsImluY2x1ZGVzIiwiaGV4V3JpdGUiLCJvZmZzZXQiLCJOdW1iZXIiLCJyZW1haW5pbmciLCJzdHJMZW4iLCJwYXJzZWQiLCJwYXJzZUludCIsInN1YnN0ciIsInV0ZjhXcml0ZSIsImJsaXRCdWZmZXIiLCJhc2NpaVdyaXRlIiwiYXNjaWlUb0J5dGVzIiwibGF0aW4xV3JpdGUiLCJiYXNlNjRXcml0ZSIsInVjczJXcml0ZSIsInV0ZjE2bGVUb0J5dGVzIiwiaXNGaW5pdGUiLCJ0b0pTT04iLCJfYXJyIiwiZnJvbUJ5dGVBcnJheSIsInJlcyIsImZpcnN0Qnl0ZSIsImNvZGVQb2ludCIsImJ5dGVzUGVyU2VxdWVuY2UiLCJzZWNvbmRCeXRlIiwidGhpcmRCeXRlIiwiZm91cnRoQnl0ZSIsInRlbXBDb2RlUG9pbnQiLCJkZWNvZGVDb2RlUG9pbnRzQXJyYXkiLCJNQVhfQVJHVU1FTlRTX0xFTkdUSCIsImNvZGVQb2ludHMiLCJmcm9tQ2hhckNvZGUiLCJyZXQiLCJvdXQiLCJ0b0hleCIsImJ5dGVzIiwibmV3QnVmIiwic2xpY2VMZW4iLCJjaGVja09mZnNldCIsImV4dCIsInJlYWRVSW50TEUiLCJub0Fzc2VydCIsIm11bCIsInJlYWRVSW50QkUiLCJyZWFkVUludDgiLCJyZWFkVUludDE2TEUiLCJyZWFkVUludDMyTEUiLCJyZWFkVUludDMyQkUiLCJyZWFkSW50TEUiLCJwb3ciLCJyZWFkSW50QkUiLCJyZWFkSW50OCIsInJlYWRJbnQxNkxFIiwicmVhZEludDE2QkUiLCJyZWFkSW50MzJMRSIsInJlYWRJbnQzMkJFIiwicmVhZEZsb2F0TEUiLCJyZWFkRmxvYXRCRSIsInJlYWREb3VibGVMRSIsInJlYWREb3VibGVCRSIsImNoZWNrSW50Iiwid3JpdGVVSW50TEUiLCJtYXhCeXRlcyIsIndyaXRlVUludEJFIiwid3JpdGVVSW50OCIsImZsb29yIiwib2JqZWN0V3JpdGVVSW50MTYiLCJsaXR0bGVFbmRpYW4iLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVVSW50MTZCRSIsIm9iamVjdFdyaXRlVUludDMyIiwid3JpdGVVSW50MzJMRSIsIndyaXRlVUludDMyQkUiLCJ3cml0ZUludExFIiwibGltaXQiLCJzdWIiLCJ3cml0ZUludEJFIiwid3JpdGVJbnQ4Iiwid3JpdGVJbnQxNkxFIiwid3JpdGVJbnQxNkJFIiwid3JpdGVJbnQzMkxFIiwid3JpdGVJbnQzMkJFIiwiY2hlY2tJRUVFNzU0Iiwid3JpdGVGbG9hdCIsIndyaXRlRmxvYXRMRSIsIndyaXRlRmxvYXRCRSIsIndyaXRlRG91YmxlIiwid3JpdGVEb3VibGVMRSIsIndyaXRlRG91YmxlQkUiLCJ0YXJnZXRTdGFydCIsInNldCIsImNvZGUiLCJjaGFyQ29kZUF0IiwiSU5WQUxJRF9CQVNFNjRfUkUiLCJiYXNlNjRjbGVhbiIsInN0cmluZ3RyaW0iLCJ0cmltIiwidW5pdHMiLCJJbmZpbml0eSIsImxlYWRTdXJyb2dhdGUiLCJieXRlQXJyYXkiLCJoaSIsImxvIiwidG9CeXRlQXJyYXkiLCJzcmMiLCJkc3QiLCJmYWN0b3J5IiwibG9uZyIsImNvbW1vbmpzR2xvYmFsIiwic2VsZiIsImNyZWF0ZUNvbW1vbmpzTW9kdWxlIiwiZm4iLCJnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlIiwiTWFwIiwiX2tleXMiLCJfdmFsdWVzIiwiZW50cnkiLCJ2IiwiY2xlYXIiLCJzcGxpY2UiLCJlbnRyaWVzIiwiaW5kZXgiLCJuZXh0IiwiZG9uZSIsImZvckVhY2giLCJjYWxsYmFjayIsImhhcyIsImtleXMiLCJ2YWx1ZXMiLCJtYXBfMSIsInRvRXh0ZW5kZWRKU09OIiwib3B0aW9ucyIsInJlbGF4ZWQiLCJ0b051bWJlciIsIiRudW1iZXJMb25nIiwiZnJvbUV4dGVuZGVkSlNPTiIsImRvYyIsInJlc3VsdCIsImxvbmdfMSIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJfZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsIndyaXRhYmxlIiwiX2NyZWF0ZUNsYXNzIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiRG91YmxlIiwidmFsdWVPZiIsIiRudW1iZXJEb3VibGUiLCJwYXJzZUZsb2F0IiwiZG91YmxlXzEiLCJfdHlwZW9mIiwiX3R5cGVvZjIiLCJpdGVyYXRvciIsIl9jbGFzc0NhbGxDaGVjayQxIiwiX2RlZmluZVByb3BlcnRpZXMkMSIsIl9jcmVhdGVDbGFzcyQxIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJfYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwiUmVmZXJlbmNlRXJyb3IiLCJfZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsImdldFByb3RvdHlwZU9mIiwiX2luaGVyaXRzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwiX3NldFByb3RvdHlwZU9mIiwiVGltZXN0YW1wIiwiX0xvbmciLCJsb3ciLCJoaWdoIiwiX3RoaXMiLCJpc0xvbmciLCIkdGltZXN0YW1wIiwidCIsImZyb21JbnQiLCJmcm9tTnVtYmVyIiwiZnJvbUJpdHMiLCJsb3dCaXRzIiwiaGlnaEJpdHMiLCJvcHRfcmFkaXgiLCJ0aW1lc3RhbXAiLCJlbXB0eSIsImVtcHR5JDEiLCJyZXF1aXJlJCQwIiwibm9ybWFsaXplZEZ1bmN0aW9uU3RyaW5nIiwiaW5zZWN1cmVSYW5kb21CeXRlcyIsInJhbmRvbSIsInJhbmRvbUJ5dGVzIiwiY3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwidXRpbHMiLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwicGVyZm9ybWFuY2UiLCJwZXJmb3JtYW5jZU5vdyIsIm5vdyIsIm1vek5vdyIsIm1zTm93Iiwib05vdyIsIndlYmtpdE5vdyIsIkRhdGUiLCJnZXRUaW1lIiwiaW5oZXJpdHMiLCJjdG9yIiwic3VwZXJDdG9yIiwic3VwZXJfIiwiVGVtcEN0b3IiLCJpbmhlcml0cyQxIiwiX3R5cGVvZiQxIiwiZm9ybWF0UmVnRXhwIiwiZm9ybWF0IiwiZiIsImlzU3RyaW5nIiwib2JqZWN0cyIsImFyZ3MiLCJKU09OIiwic3RyaW5naWZ5IiwiXyIsImlzTnVsbCIsImlzT2JqZWN0IiwiZGVwcmVjYXRlIiwibXNnIiwiaXNVbmRlZmluZWQiLCJwcm9jZXNzIiwid2FybmVkIiwiZGVwcmVjYXRlZCIsImNvbnNvbGUiLCJlcnJvciIsImRlYnVncyIsImRlYnVnRW52aXJvbiIsImRlYnVnbG9nIiwidG9VcHBlckNhc2UiLCJSZWdFeHAiLCJ0ZXN0IiwicGlkIiwib3B0cyIsImN0eCIsInNlZW4iLCJzdHlsaXplIiwic3R5bGl6ZU5vQ29sb3IiLCJkZXB0aCIsImNvbG9ycyIsImlzQm9vbGVhbiIsInNob3dIaWRkZW4iLCJfZXh0ZW5kIiwiY3VzdG9tSW5zcGVjdCIsInN0eWxpemVXaXRoQ29sb3IiLCJmb3JtYXRWYWx1ZSIsInN0eWxlcyIsInN0eWxlVHlwZSIsInN0eWxlIiwiYXJyYXlUb0hhc2giLCJoYXNoIiwiaWR4IiwicmVjdXJzZVRpbWVzIiwiaXNGdW5jdGlvbiIsInByaW1pdGl2ZSIsImZvcm1hdFByaW1pdGl2ZSIsInZpc2libGVLZXlzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImlzRXJyb3IiLCJmb3JtYXRFcnJvciIsImlzUmVnRXhwIiwiaXNEYXRlIiwiYmFzZSIsImJyYWNlcyIsInRvVVRDU3RyaW5nIiwib3V0cHV0IiwiZm9ybWF0QXJyYXkiLCJmb3JtYXRQcm9wZXJ0eSIsInBvcCIsInJlZHVjZVRvU2luZ2xlU3RyaW5nIiwic2ltcGxlIiwiaXNOdW1iZXIiLCJkZXNjIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwic3BsaXQiLCJsaW5lIiwicmVkdWNlIiwicHJldiIsImN1ciIsImFyIiwiaXNOdWxsT3JVbmRlZmluZWQiLCJpc1N5bWJvbCIsInJlIiwib2JqZWN0VG9TdHJpbmciLCJpc1ByaW1pdGl2ZSIsIm1heWJlQnVmIiwicGFkIiwibW9udGhzIiwidGltZXN0YW1wJDEiLCJ0aW1lIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImdldERhdGUiLCJnZXRNb250aCIsImxvZyIsIm9yaWdpbiIsImFkZCIsInByb3AiLCJ1dGlsIiwidXRpbCQxIiwidXRpbCQyIiwiX2NsYXNzQ2FsbENoZWNrJDIiLCJfZGVmaW5lUHJvcGVydGllcyQyIiwiX2NyZWF0ZUNsYXNzJDIiLCJCdWZmZXIkMSIsInJhbmRvbUJ5dGVzJDEiLCJkZXByZWNhdGUkMSIsIlBST0NFU1NfVU5JUVVFIiwiY2hlY2tGb3JIZXhSZWdFeHAiLCJoYXNCdWZmZXJUeXBlIiwiZXJyIiwiaGV4VGFibGUiLCJfaSIsImRlY29kZUxvb2t1cCIsIl9CdWZmZXIiLCJjb252ZXJ0VG9IZXgiLCJtYWtlT2JqZWN0SWRFcnJvciIsImludmFsaWRTdHJpbmciLCJpbnZhbGlkQ2hhcmFjdGVyIiwiT2JqZWN0SWQiLCJnZW5lcmF0ZSIsImNhY2hlSGV4U3RyaW5nIiwiX19pZCIsInZhbGlkIiwiaXNWYWxpZCIsImNyZWF0ZUZyb21IZXhTdHJpbmciLCJ0b0hleFN0cmluZyIsImhleFN0cmluZyIsIl9pMiIsImhleENoYXIiLCJvdGhlcklkIiwiZ2V0VGltZXN0YW1wIiwic2V0VGltZSIsIiRvaWQiLCJnZXRJbmMiLCJpbmMiLCJidWZmZXIkJDEiLCJjcmVhdGVQayIsImNyZWF0ZUZyb21UaW1lIiwiZ2V0X2luYyIsImN1c3RvbSIsIm9iamVjdGlkIiwiX2NsYXNzQ2FsbENoZWNrJDMiLCJfZGVmaW5lUHJvcGVydGllcyQzIiwiX2NyZWF0ZUNsYXNzJDMiLCJhbHBoYWJldGl6ZSIsInNvcnQiLCJCU09OUmVnRXhwIiwicGF0dGVybiIsIiRyZWd1bGFyRXhwcmVzc2lvbiIsInJlZ2V4cCIsIl9jbGFzc0NhbGxDaGVjayQ0IiwiX2RlZmluZVByb3BlcnRpZXMkNCIsIl9jcmVhdGVDbGFzcyQ0IiwiQlNPTlN5bWJvbCIsIiRzeW1ib2wiLCJzeW1ib2wiLCJfY2xhc3NDYWxsQ2hlY2skNSIsIl9kZWZpbmVQcm9wZXJ0aWVzJDUiLCJfY3JlYXRlQ2xhc3MkNSIsIkludDMyIiwiJG51bWJlckludCIsImludF8zMiIsIl9jbGFzc0NhbGxDaGVjayQ2IiwiX2RlZmluZVByb3BlcnRpZXMkNiIsIl9jcmVhdGVDbGFzcyQ2IiwiQ29kZSIsInNjb3BlIiwiJGNvZGUiLCIkc2NvcGUiLCJCdWZmZXIkMiIsIlBBUlNFX1NUUklOR19SRUdFWFAiLCJQQVJTRV9JTkZfUkVHRVhQIiwiUEFSU0VfTkFOX1JFR0VYUCIsIkVYUE9ORU5UX01BWCIsIkVYUE9ORU5UX01JTiIsIkVYUE9ORU5UX0JJQVMiLCJNQVhfRElHSVRTIiwiTkFOX0JVRkZFUiIsInJldmVyc2UiLCJJTkZfTkVHQVRJVkVfQlVGRkVSIiwiSU5GX1BPU0lUSVZFX0JVRkZFUiIsIkVYUE9ORU5UX1JFR0VYIiwiaXNEaWdpdCIsImRpdmlkZXUxMjgiLCJESVZJU09SIiwiX3JlbSIsInBhcnRzIiwicXVvdGllbnQiLCJyZW0iLCJzaGlmdExlZnQiLCJkaXYiLCJtb2R1bG8iLCJtdWx0aXBseTY0eDIiLCJsZWZ0IiwicmlnaHQiLCJsZWZ0SGlnaCIsInNoaWZ0UmlnaHRVbnNpZ25lZCIsImxlZnRMb3ciLCJnZXRMb3dCaXRzIiwicmlnaHRIaWdoIiwicmlnaHRMb3ciLCJwcm9kdWN0SGlnaCIsIm11bHRpcGx5IiwicHJvZHVjdE1pZCIsInByb2R1Y3RNaWQyIiwicHJvZHVjdExvdyIsImxlc3NUaGFuIiwidWhsZWZ0IiwidWhyaWdodCIsInVsbGVmdCIsInVscmlnaHQiLCJpbnZhbGlkRXJyIiwibWVzc2FnZSIsIkRlY2ltYWwxMjgiLCJpc05lZ2F0aXZlIiwic2F3UmFkaXgiLCJmb3VuZE5vblplcm8iLCJzaWduaWZpY2FudERpZ2l0cyIsIm5EaWdpdHNSZWFkIiwibkRpZ2l0cyIsInJhZGl4UG9zaXRpb24iLCJmaXJzdE5vblplcm8iLCJkaWdpdHMiLCJuRGlnaXRzU3RvcmVkIiwiZGlnaXRzSW5zZXJ0IiwiZmlyc3REaWdpdCIsImxhc3REaWdpdCIsImV4cG9uZW50Iiwic2lnbmlmaWNhbmRIaWdoIiwic2lnbmlmaWNhbmRMb3ciLCJiaWFzZWRFeHBvbmVudCIsInN0cmluZ01hdGNoIiwiaW5mTWF0Y2giLCJuYW5NYXRjaCIsInVuc2lnbmVkTnVtYmVyIiwiZXhwU2lnbiIsImV4cE51bWJlciIsImRpZ2l0c1N0cmluZyIsIl9kaWdpdHNTdHJpbmciLCJlbmRPZlN0cmluZyIsInJvdW5kRGlnaXQiLCJyb3VuZEJpdCIsImRJZHgiLCJfZElkeCIsIl9kSWR4MiIsInNpZ25pZmljYW5kIiwiZGVjIiwiYW5kIiwib3IiLCJDT01CSU5BVElPTl9NQVNLIiwiRVhQT05FTlRfTUFTSyIsIkNPTUJJTkFUSU9OX0lORklOSVRZIiwiQ09NQklOQVRJT05fTkFOIiwibWlkaCIsIm1pZGwiLCJjb21iaW5hdGlvbiIsImJpYXNlZF9leHBvbmVudCIsInNpZ25pZmljYW5kX2RpZ2l0cyIsInNjaWVudGlmaWNfZXhwb25lbnQiLCJpc196ZXJvIiwic2lnbmlmaWNhbmRfbXNiIiwic2lnbmlmaWNhbmQxMjgiLCJrIiwiWkVSTyIsImxlYXN0X2RpZ2l0cyIsInJhZGl4X3Bvc2l0aW9uIiwiX2kzIiwiX2k0IiwiJG51bWJlckRlY2ltYWwiLCJkZWNpbWFsMTI4IiwiX2NsYXNzQ2FsbENoZWNrJDciLCJfZGVmaW5lUHJvcGVydGllcyQ3IiwiX2NyZWF0ZUNsYXNzJDciLCJNaW5LZXkiLCIkbWluS2V5IiwibWluX2tleSIsIl9jbGFzc0NhbGxDaGVjayQ4IiwiX2RlZmluZVByb3BlcnRpZXMkOCIsIl9jcmVhdGVDbGFzcyQ4IiwiTWF4S2V5IiwiJG1heEtleSIsIm1heF9rZXkiLCJfY2xhc3NDYWxsQ2hlY2skOSIsIl9kZWZpbmVQcm9wZXJ0aWVzJDkiLCJfY3JlYXRlQ2xhc3MkOSIsIkRCUmVmIiwiY29sbGVjdGlvbiIsIm9pZCIsImRiIiwiZmllbGRzIiwic2hpZnQiLCJhc3NpZ24iLCIkcmVmIiwiJGlkIiwiJGRiIiwiZGJfcmVmIiwiX2NsYXNzQ2FsbENoZWNrJGEiLCJfZGVmaW5lUHJvcGVydGllcyRhIiwiX2NyZWF0ZUNsYXNzJGEiLCJCdWZmZXIkMyIsIkJpbmFyeSIsInN1YlR5cGUiLCJzdWJfdHlwZSIsIkJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVCIsInBvc2l0aW9uIiwid3JpdGVTdHJpbmdUb0FycmF5IiwiQlVGRkVSX1NJWkUiLCJwdXQiLCJieXRlX3ZhbHVlIiwiZGVjb2RlZF9ieXRlIiwiX2J1ZmZlciIsImlzVWludDhBcnJheSIsImFzUmF3IiwibmV3QnVmZmVyIiwiY29udmVydEFycmF5dG9VdGY4QmluYXJ5U3RyaW5nIiwiYmFzZTY0U3RyaW5nIiwiJGJpbmFyeSIsInN0YXJ0SW5kZXgiLCJlbmRJbmRleCIsIlNVQlRZUEVfREVGQVVMVCIsIlNVQlRZUEVfRlVOQ1RJT04iLCJTVUJUWVBFX0JZVEVfQVJSQVkiLCJTVUJUWVBFX1VVSURfT0xEIiwiU1VCVFlQRV9VVUlEIiwiU1VCVFlQRV9NRDUiLCJTVUJUWVBFX1VTRVJfREVGSU5FRCIsImJpbmFyeSIsImNvbnN0YW50cyIsIkJTT05fSU5UMzJfTUFYIiwiQlNPTl9JTlQzMl9NSU4iLCJCU09OX0lOVDY0X01BWCIsIkJTT05fSU5UNjRfTUlOIiwiSlNfSU5UX01BWCIsIkpTX0lOVF9NSU4iLCJCU09OX0RBVEFfTlVNQkVSIiwiQlNPTl9EQVRBX1NUUklORyIsIkJTT05fREFUQV9PQkpFQ1QiLCJCU09OX0RBVEFfQVJSQVkiLCJCU09OX0RBVEFfQklOQVJZIiwiQlNPTl9EQVRBX1VOREVGSU5FRCIsIkJTT05fREFUQV9PSUQiLCJCU09OX0RBVEFfQk9PTEVBTiIsIkJTT05fREFUQV9EQVRFIiwiQlNPTl9EQVRBX05VTEwiLCJCU09OX0RBVEFfUkVHRVhQIiwiQlNPTl9EQVRBX0RCUE9JTlRFUiIsIkJTT05fREFUQV9DT0RFIiwiQlNPTl9EQVRBX1NZTUJPTCIsIkJTT05fREFUQV9DT0RFX1dfU0NPUEUiLCJCU09OX0RBVEFfSU5UIiwiQlNPTl9EQVRBX1RJTUVTVEFNUCIsIkJTT05fREFUQV9MT05HIiwiQlNPTl9EQVRBX0RFQ0lNQUwxMjgiLCJCU09OX0RBVEFfTUlOX0tFWSIsIkJTT05fREFUQV9NQVhfS0VZIiwiQlNPTl9CSU5BUllfU1VCVFlQRV9GVU5DVElPTiIsIkJTT05fQklOQVJZX1NVQlRZUEVfQllURV9BUlJBWSIsIkJTT05fQklOQVJZX1NVQlRZUEVfVVVJRCIsIkJTT05fQklOQVJZX1NVQlRZUEVfTUQ1IiwiQlNPTl9CSU5BUllfU1VCVFlQRV9VU0VSX0RFRklORUQiLCJfdHlwZW9mJDIiLCJrZXlzVG9Db2RlY3MiLCJkZXNlcmlhbGl6ZVZhbHVlIiwiJHVuZGVmaW5lZCIsImZpbHRlciIsInN0YXJ0c1dpdGgiLCIkZGF0ZSIsImRhdGUiLCJwYXJzZSIsIiRkYlBvaW50ZXIiLCJkb2xsYXJLZXlzIiwic3RyaWN0IiwicmVwbGFjZXIiLCJzcGFjZSIsInNlcmlhbGl6ZUFycmF5Iiwic2VyaWFsaXplRG9jdW1lbnQiLCJzZXJpYWxpemUiLCJic29uIiwiZGVzZXJpYWxpemUiLCJlanNvbiIsInNlcmlhbGl6ZVZhbHVlIiwiZ2V0SVNPU3RyaW5nIiwiaXNvU3RyIiwidG9JU09TdHJpbmciLCJnZXRVVENNaWxsaXNlY29uZHMiLCJkYXRlTnVtIiwiaW5SYW5nZSIsImludDMyUmFuZ2UiLCJpbnQ2NFJhbmdlIiwiZmxhZ3MiLCJyeCIsInNvdXJjZSIsIkJTT05fVFlQRV9NQVBQSU5HUyIsInN1YnR5cGUiLCJuYW1lc3BhY2UiLCJMb25nIiwibG93XyIsImhpZ2hfIiwidW5zaWduZWQiLCJ1bnNpZ25lZF8iLCJPYmplY3RJRCIsImJzb250eXBlIiwiX2Jzb250eXBlIiwiX2RvYyIsIl9kb2MyIiwibWFwcGVyIiwiZXh0ZW5kZWRfanNvbiIsIkZJUlNUX0JJVCIsIkZJUlNUX1RXT19CSVRTIiwiRklSU1RfVEhSRUVfQklUUyIsIkZJUlNUX0ZPVVJfQklUUyIsIkZJUlNUX0ZJVkVfQklUUyIsIlRXT19CSVRfQ0hBUiIsIlRIUkVFX0JJVF9DSEFSIiwiRk9VUl9CSVRfQ0hBUiIsIkNPTlRJTlVJTkdfQ0hBUiIsInZhbGlkYXRlVXRmOCIsImNvbnRpbnVhdGlvbiIsImJ5dGUiLCJ2YWxpZGF0ZVV0ZjhfMSIsInZhbGlkYXRlX3V0ZjgiLCJCdWZmZXIkNCIsInZhbGlkYXRlVXRmOCQxIiwiSlNfSU5UX01BWF9MT05HIiwiSlNfSU5UX01JTl9MT05HIiwiZnVuY3Rpb25DYWNoZSIsImRlc2VyaWFsaXplJDEiLCJhbGxvd09iamVjdFNtYWxsZXJUaGFuQnVmZmVyU2l6ZSIsImRlc2VyaWFsaXplT2JqZWN0IiwiZXZhbEZ1bmN0aW9ucyIsImNhY2hlRnVuY3Rpb25zIiwiY2FjaGVGdW5jdGlvbnNDcmMzMiIsImNyYzMyIiwiZmllbGRzQXNSYXciLCJyYXciLCJic29uUmVnRXhwIiwicHJvbW90ZUJ1ZmZlcnMiLCJwcm9tb3RlTG9uZ3MiLCJwcm9tb3RlVmFsdWVzIiwiYXJyYXlJbmRleCIsImVsZW1lbnRUeXBlIiwic3RyaW5nU2l6ZSIsIl9pbmRleCIsIm9iamVjdFNpemUiLCJfaW5kZXgyIiwiX29iamVjdFNpemUiLCJhcnJheU9wdGlvbnMiLCJzdG9wSW5kZXgiLCJfbG93Qml0cyIsIl9oaWdoQml0cyIsImxvbmckJDEiLCJsZXNzVGhhbk9yRXF1YWwiLCJncmVhdGVyVGhhbk9yRXF1YWwiLCJkZWNpbWFsMTI4JCQxIiwidG9PYmplY3QiLCJiaW5hcnlTaXplIiwidG90YWxCaW5hcnlTaXplIiwicmVnRXhwT3B0aW9ucyIsIm9wdGlvbnNBcnJheSIsIl9zb3VyY2UiLCJfcmVnRXhwT3B0aW9ucyIsIl9zdHJpbmdTaXplIiwiX2xvd0JpdHMyIiwiX2hpZ2hCaXRzMiIsIl9zdHJpbmdTaXplMiIsImZ1bmN0aW9uU3RyaW5nIiwiaXNvbGF0ZUV2YWxXaXRoSGFzaCIsImlzb2xhdGVFdmFsIiwidG90YWxTaXplIiwiX3N0cmluZ1NpemUzIiwiX2Z1bmN0aW9uU3RyaW5nIiwiX2luZGV4MyIsIl9vYmplY3RTaXplMiIsInNjb3BlT2JqZWN0IiwiX2hhc2giLCJfc3RyaW5nU2l6ZTQiLCJvaWRCdWZmZXIiLCJfb2lkIiwiYmluZCIsImRlc2VyaWFsaXplciIsInJlYWRJRUVFNzU0IiwiZW5kaWFuIiwibUxlbiIsIm5CeXRlcyIsImJCRSIsImVMZW4iLCJlTWF4IiwiZUJpYXMiLCJuQml0cyIsIk5hTiIsIndyaXRlSUVFRTc1NCIsInJ0IiwiYWJzIiwiTE4yIiwiZmxvYXRfcGFyc2VyIiwiX3R5cGVvZiQzIiwiQnVmZmVyJDUiLCJ3cml0ZUlFRUU3NTQkMSIsIm5vcm1hbGl6ZWRGdW5jdGlvblN0cmluZyQxIiwicmVnZXhwJDEiLCJpZ25vcmVLZXlzIiwiU2V0IiwiaXNEYXRlJDEiLCJpc1JlZ0V4cCQxIiwic2VyaWFsaXplU3RyaW5nIiwibnVtYmVyT2ZXcml0dGVuQnl0ZXMiLCJzZXJpYWxpemVOdW1iZXIiLCJfbnVtYmVyT2ZXcml0dGVuQnl0ZXMiLCJfbnVtYmVyT2ZXcml0dGVuQnl0ZXMyIiwibG9uZ1ZhbCIsImdldEhpZ2hCaXRzIiwiX251bWJlck9mV3JpdHRlbkJ5dGVzMyIsInNlcmlhbGl6ZU51bGwiLCJzZXJpYWxpemVCb29sZWFuIiwic2VyaWFsaXplRGF0ZSIsImRhdGVJbk1pbGlzIiwic2VyaWFsaXplUmVnRXhwIiwiaWdub3JlQ2FzZSIsIm11bHRpbGluZSIsInNlcmlhbGl6ZUJTT05SZWdFeHAiLCJzZXJpYWxpemVNaW5NYXgiLCJzZXJpYWxpemVPYmplY3RJZCIsInNlcmlhbGl6ZUJ1ZmZlciIsInNlcmlhbGl6ZU9iamVjdCIsImNoZWNrS2V5cyIsInNlcmlhbGl6ZUZ1bmN0aW9ucyIsImlnbm9yZVVuZGVmaW5lZCIsInBhdGgiLCJzZXJpYWxpemVJbnRvIiwic2VyaWFsaXplRGVjaW1hbDEyOCIsInNlcmlhbGl6ZUxvbmciLCJzZXJpYWxpemVJbnQzMiIsInNlcmlhbGl6ZURvdWJsZSIsInNlcmlhbGl6ZUZ1bmN0aW9uIiwic2VyaWFsaXplQ29kZSIsImNvZGVTaXplIiwiX251bWJlck9mV3JpdHRlbkJ5dGVzNCIsInNlcmlhbGl6ZUJpbmFyeSIsInNlcmlhbGl6ZVN5bWJvbCIsInNlcmlhbGl6ZURCUmVmIiwic3RhcnRpbmdJbmRleCIsInRvQlNPTiIsIl9rZXkiLCJfdmFsdWUiLCJfdHlwZSIsIl9rZXkyIiwiX3ZhbHVlMiIsIl90eXBlMiIsInNlcmlhbGl6ZXIiLCJfdHlwZW9mJDQiLCJCdWZmZXIkNiIsIm5vcm1hbGl6ZWRGdW5jdGlvblN0cmluZyQyIiwiaXNEYXRlJDIiLCJjYWxjdWxhdGVPYmplY3RTaXplIiwidG90YWxMZW5ndGgiLCJjYWxjdWxhdGVFbGVtZW50Iiwib3JkZXJlZF92YWx1ZXMiLCJjYWxjdWxhdGVfc2l6ZSIsIkJ1ZmZlciQ3IiwiZW5zdXJlX2J1ZmZlciIsImVuc3VyZUJ1ZmZlciIsInBvdGVudGlhbEJ1ZmZlciIsIkJ1ZmZlciQ4IiwiTUFYU0laRSIsImJ1ZmZlciQxIiwic2V0SW50ZXJuYWxCdWZmZXJTaXplIiwic2VyaWFsaXplJDEiLCJtaW5JbnRlcm5hbEJ1ZmZlclNpemUiLCJzZXJpYWxpemF0aW9uSW5kZXgiLCJmaW5pc2hlZEJ1ZmZlciIsInNlcmlhbGl6ZVdpdGhCdWZmZXJBbmRJbmRleCIsImZpbmFsQnVmZmVyIiwiZGVzZXJpYWxpemUkMiIsImNhbGN1bGF0ZU9iamVjdFNpemUkMSIsImRlc2VyaWFsaXplU3RyZWFtIiwibnVtYmVyT2ZEb2N1bWVudHMiLCJkb2N1bWVudHMiLCJkb2NTdGFydEluZGV4IiwiRUpTT04iLCJic29uXzEiLCJic29uXzIiLCJic29uXzMiLCJic29uXzQiLCJic29uXzUiLCJic29uXzYiLCJic29uXzciLCJic29uXzgiLCJic29uXzkiLCJic29uXzEwIiwiYnNvbl8xMSIsImJzb25fMTIiLCJic29uXzEzIiwiYnNvbl8xNCIsImJzb25fMTUiLCJic29uXzE2IiwiYnNvbl8xNyIsImJzb25fMTgiLCJic29uXzE5IiwiYnNvbl8yMCIsImJzb25fMjEiLCJic29uXzIyIiwiYnNvbl8yMyIsImJzb25fMjQiLCJic29uXzI1IiwiYnNvbl8yNiIsImJzb25fMjciLCJic29uXzI4IiwiYnNvbl8yOSIsImJzb25fMzAiLCJic29uXzMxIiwiYnNvbl8zMiIsImJzb25fMzMiLCJic29uXzM0IiwiYnNvbl8zNSIsImJzb25fMzYiLCJic29uXzM3IiwiYnNvbl8zOCIsImJzb25fMzkiLCJic29uXzQwIiwiYnNvbl80MSIsImJzb25fNDIiLCJic29uXzQzIiwiYnNvbl80NCIsImJzb25fNDUiLCJic29uXzQ2IiwiYnNvbl80NyIsImJzb25fNDgiLCJic29uXzQ5IiwiYnNvbl81MCIsImJzb25fNTEiLCJic29uXzUyIiwiYnNvbl81MyIsImJzb25fNTQiLCJsb29rdXAiLCJyZXZMb29rdXAiLCJBcnIiLCJnZXRMZW5zIiwiYjY0IiwidmFsaWRMZW4iLCJwbGFjZUhvbGRlcnNMZW4iLCJsZW5zIiwiX2J5dGVMZW5ndGgiLCJ0bXAiLCJjdXJCeXRlIiwidHJpcGxldFRvQmFzZTY0IiwibnVtIiwiZW5jb2RlQ2h1bmsiLCJ1aW50OCIsImV4dHJhQnl0ZXMiLCJtYXhDaHVua0xlbmd0aCIsImxlbjIiLCJpc0xFIiwid2FzbSIsIldlYkFzc2VtYmx5IiwiSW5zdGFuY2UiLCJNb2R1bGUiLCJfX2lzTG9uZ19fIiwiSU5UX0NBQ0hFIiwiVUlOVF9DQUNIRSIsImNhY2hlZE9iaiIsImNhY2hlIiwiVVpFUk8iLCJUV09fUFdSXzY0X0RCTCIsIk1BWF9VTlNJR05FRF9WQUxVRSIsIlRXT19QV1JfNjNfREJMIiwiTUlOX1ZBTFVFIiwiTUFYX1ZBTFVFIiwibmVnIiwiVFdPX1BXUl8zMl9EQkwiLCJwb3dfZGJsIiwicmFkaXgiLCJyYWRpeFRvUG93ZXIiLCJwb3dlciIsImZyb21WYWx1ZSIsIlRXT19QV1JfMTZfREJMIiwiVFdPX1BXUl8yNF9EQkwiLCJUV09fUFdSXzI0IiwiT05FIiwiVU9ORSIsIk5FR19PTkUiLCJMb25nUHJvdG90eXBlIiwidG9JbnQiLCJpc1plcm8iLCJlcSIsInJhZGl4TG9uZyIsInJlbTEiLCJyZW1EaXYiLCJpbnR2YWwiLCJnZXRIaWdoQml0c1Vuc2lnbmVkIiwiZ2V0TG93Qml0c1Vuc2lnbmVkIiwiZ2V0TnVtQml0c0FicyIsImJpdCIsImVxeiIsImlzUG9zaXRpdmUiLCJpc09kZCIsImlzRXZlbiIsIm90aGVyIiwibm90RXF1YWxzIiwibmVxIiwibmUiLCJjb21wIiwibHQiLCJsdGUiLCJsZSIsImdyZWF0ZXJUaGFuIiwiZ3QiLCJndGUiLCJnZSIsInRoaXNOZWciLCJvdGhlck5lZyIsIm5lZ2F0ZSIsIm5vdCIsImFkZGVuZCIsImE0OCIsImEzMiIsImExNiIsImEwMCIsImI0OCIsImIzMiIsImIxNiIsImIwMCIsImM0OCIsImMzMiIsImMxNiIsImMwMCIsInN1YnRyYWN0Iiwic3VidHJhaGVuZCIsIm11bHRpcGxpZXIiLCJnZXRfaGlnaCIsImRpdmlkZSIsImRpdmlzb3IiLCJkaXZfdSIsImRpdl9zIiwiYXBwcm94IiwiaGFsZlRoaXMiLCJzaHIiLCJzaGwiLCJ0b1Vuc2lnbmVkIiwic2hydSIsImxvZzIiLCJjZWlsIiwiZGVsdGEiLCJhcHByb3hSZXMiLCJhcHByb3hSZW0iLCJyZW1fdSIsInJlbV9zIiwibW9kIiwieG9yIiwibnVtQml0cyIsInNoaWZ0UmlnaHQiLCJzaHJfdSIsInRvU2lnbmVkIiwidG9CeXRlcyIsInRvQnl0ZXNMRSIsInRvQnl0ZXNCRSIsImZyb21CeXRlcyIsImZyb21CeXRlc0xFIiwiZnJvbUJ5dGVzQkUiLCJCU09OIiwiQnNvbiIsIlNkbFBhY2tldCIsImVuY3J5cHRpb24iLCJmcmFtZVR5cGUiLCJmcmFtZUluZm8iLCJkYXRhU2l6ZSIsIm1lc3NhZ2VJRCIsInBheWxvYWQiLCJieXRlc1RvV3JpdGUiLCJfdmVyc2lvbiIsIl9lbmNyeXB0aW9uIiwiX2ZyYW1lVHlwZSIsIl9zZXJ2aWNlVHlwZSIsIl9mcmFtZUluZm8iLCJfc2Vzc2lvbklEIiwiX2RhdGFTaXplIiwiX21lc3NhZ2VJRCIsIl9wYXlsb2FkIiwiX29mZnNldCIsIl9ieXRlc1RvV3JpdGUiLCJfYnNvblBheWxvYWQiLCJnZXRWZXJzaW9uIiwiZ2V0RW5jcnlwdGlvbiIsImdldFNlcnZpY2VUeXBlIiwiZ2V0RnJhbWVJbmZvIiwiZ2V0U2Vzc2lvbklEIiwiZ2V0TWVzc2FnZUlEIiwiZ2V0RGF0YVNpemUiLCJzZXRQYXlsb2FkIiwiZ2V0UGF5bG9hZCIsImdldEVuY3J5cHRpb25CaXQiLCJfRU5DUllQVElPTl9NQVNLIiwiZ2V0RnJhbWVUeXBlIiwiX2NvbnN0cnVjdFBhY2tldCIsImNvbnRyb2xGcmFtZUluZm8iLCJkYXRhVmlldyIsImRhdGFWaWV3SW5kZXgiLCJfSEVBREVSX1NJWkUiLCJfSEVBREVSX1NJWkVfVjEiLCJ0b1BhY2tldCIsInB1dFRhZyIsInRhZyIsImdldFRhZyIsIl9FWFRSQV9QQVJDRUxfREFUQV9MRU5HVEgiLCJTRVJWSUNFX1RZUEVfQ09OVFJPTCIsIlNFUlZJQ0VfVFlQRV9SUEMiLCJTRVJWSUNFX1RZUEVfUENNIiwiU0VSVklDRV9UWVBFX1ZJREVPIiwiU0VSVklDRV9UWVBFX0JVTEtfREFUQSIsIkZSQU1FX0lORk9fSEVBUlRfQkVBVCIsIkZSQU1FX0lORk9fU1RBUlRfU0VSVklDRSIsIkZSQU1FX0lORk9fU1RBUlRfU0VSVklDRV9BQ0siLCJGUkFNRV9JTkZPX1NUQVJUX1NFUlZJQ0VfTkFLIiwiRlJBTUVfSU5GT19FTkRfU0VSVklDRSIsIkZSQU1FX0lORk9fRU5EX1NFUlZJQ0VfQUNLIiwiRlJBTUVfSU5GT19FTkRfU0VSVklDRV9OQUsiLCJGUkFNRV9JTkZPX1JFR0lTVEVSX1NFQ09OREFSWV9UUkFOU1BPUlQiLCJGUkFNRV9JTkZPX1JFR0lTVEVSX1NFQ09OREFSWV9UUkFOU1BPUlRfQUNLIiwiRlJBTUVfSU5GT19SRUdJU1RFUl9TRUNPTkRBUllfVFJBTlNQT1JUX05BSyIsIkZSQU1FX0lORk9fVFJBTlNQT1JUX0VWRU5UX1VQREFURSIsIkZSQU1FX0lORk9fU0VSVklDRV9EQVRBX0FDSyIsIkZSQU1FX0lORk9fSEVBUlRfQkVBVF9BQ0siLCJGUkFNRV9JTkZPX0ZJTkFMX0NPTk5FU0NVVElWRV9GUkFNRSIsIkZSQU1FX0lORk9fUkVTRVJWRUQiLCJiYXNlNjQuZnJvbUJ5dGVBcnJheSIsImllZWU3NTQucmVhZCIsImllZWU3NTQud3JpdGUiLCJiYXNlNjQudG9CeXRlQXJyYXkiLCJUZXh0RW5jb2RlciIsImVuY29kZSIsIkxlbiIsInJlc1BvcyIsInJlc0FyciIsInBvaW50IiwibmV4dGNvZGUiLCJKc29uUnBjTWFyc2hhbGxlciIsIm1hcnNoYWxsIiwicnBjU3RydWN0IiwianNvbkJ5dGVzIiwicGFyYW1pZnkiLCJqc29uT2JqZWN0Iiwic3RyaW5nVmVyc2lvbiIsIl9lbmNvZGUiLCJ1bm1hcnNoYWxsIiwianNvblN0cmluZyIsIl9kZWNvZGUiLCJCaW5hcnlGcmFtZUhlYWRlciIsImZ1bmN0aW9uSWQiLCJqc29uU2l6ZSIsIl9mdW5jdGlvbklkIiwiX2NvcnJlbGF0aW9uSWQiLCJfanNvblNpemUiLCJfanNvbkRhdGEiLCJmcm9tQmluYXJ5SGVhZGVyIiwiYmluYXJ5RnJhbWVIZWFkZXJEYXRhIiwiYmluYXJ5RnJhbWVIZWFkZXIiLCJqc29uRGF0YVN0YXJ0IiwiSEVBREVSX1NJWkUiLCJqc29uRGF0YUVuZCIsInNldEpzb25EYXRhIiwiYXNzZW1ibGVIZWFkZXJCeXRlcyIsInNldFJwY1R5cGUiLCJnZXRScGNUeXBlIiwic2V0RnVuY3Rpb25JZCIsImdldEZ1bmN0aW9uSWQiLCJzZXRKc29uU2l6ZSIsImdldEpzb25TaXplIiwiZ2V0SnNvbkRhdGEiLCJNZXNzYWdlRnJhbWVEaXNhc3NlbWJsZXIiLCJycGNSZXF1ZXN0IiwibWVzc2FnZUlkIiwibXR1IiwicGFja2V0Q2FsbGJhY2siLCJfcnBjUmVxdWVzdCIsIl9zZXNzaW9uSWQiLCJfbWVzc2FnZUlkIiwiX210dSIsIl9wYWNrZXRDYWxsYmFjayIsImJ1aWxkUlBDIiwiY2IiLCJfZG9SZXF1ZXN0IiwiX2J1aWxkUlBDTWFpbkJ1ZmZlciIsInJwY0J1bGtEYXRhIiwianNvbkJ1ZmZlciIsImJmaCIsImhlYWRlclNpemUiLCJidWxrRGF0YVNpemUiLCJ0b3RhbE1lc3NhZ2VTaXplIiwibWFpbkJ1ZmZlciIsImZyYW1lQ291bnQiLCJmdWxsUGFja2V0IiwidmlldyIsIkRhdGFWaWV3Iiwic2V0VWludDMyIiwiZmlyc3RIZWFkZXIiLCJfYnVpbGRDb25zZWN1dGl2ZUZyYW1lcyIsInNkbFBhY2tldCIsImZyYW1lU2VxdWVuY2VOdW1iZXIiLCJjb3VudCIsImhlYWRlciIsIlRyYW5zcG9ydExpc3RlbmVyIiwiX29uVHJhbnNwb3J0RGlzY29ubmVjdGVkIiwiX29uUGFja2V0UmVjZWl2ZWQiLCJzZXRPblRyYW5zcG9ydERpc2Nvbm5lY3RlZCIsInNldE9uUGFja2V0UmVjZWl2ZWQiLCJvblRyYW5zcG9ydERpc2Nvbm5lY3RlZCIsIm9uUGFja2V0UmVjZWl2ZWQiLCJWZXJzaW9uIiwibWFqb3IiLCJtaW5vciIsInBhdGNoIiwic2V0TWFqb3IiLCJzZXRNaW5vciIsInNldFBhdGNoIiwiX21ham9yIiwiZ2V0TWFqb3IiLCJfbWlub3IiLCJnZXRNaW5vciIsIl9wYXRjaCIsImdldFBhdGNoIiwidmVyc2lvbnMiLCJpc05ld2VyVGhhbiIsIlNlcnZpY2VUeXBlIiwiUlBDIiwiQVVESU8iLCJWSURFTyIsIkhZQlJJRCIsIk1lc3NhZ2VGcmFtZUFzc2VtYmxlciIsIl9jYWxsYmFjayIsIl9hY2N1bXVsYXRvciIsIl90b3RhbENvbnNlY3V0aXZlRnJhbWVzIiwiX2NvbnNlY3V0aXZlRnJhbWVzSGFuZGxlZENvdW50IiwiX2NvbnNlY3V0aXZlRnJhbWVzRGF0YUxlbmd0aCIsImhhbmRsZUZyYW1lIiwiX2hhbmRsZU11bHRpRnJhbWVNZXNzYWdlIiwiX2hhbmRsZUZpcnN0RGF0YUZyYW1lIiwiZGF0YUxlbmd0aCIsIl9oYW5kbGVDb25zZWN1dGl2ZUZyYW1lIiwiZnJhbWVTZXF1ZW5jZSIsIndhcm4iLCJmaW5pc2hlZFNkbFBhY2tldCIsIkNvbnRyb2xGcmFtZVRhZ3MiLCJTdGFydFNlcnZpY2VBQ0tCYXNlIiwiTVRVIiwiTkFLQmFzZSIsIlJFSkVDVEVEX1BBUkFNUyIsIlN0YXJ0U2VydmljZVByb3RvY29sVmVyc2lvbiIsIlBST1RPQ09MX1ZFUlNJT04iLCJTdGFydFNlcnZpY2VIYXNoSWQiLCJIQVNIX0lEIiwiU3RhcnRTZXJ2aWNlRGltZW5zaW9ucyIsIkhFSUdIVCIsIldJRFRIIiwiU3RhcnRTZXJ2aWNlIiwiU3RhcnRTZXJ2aWNlQUNLIiwiU0VDT05EQVJZX1RSQU5TUE9SVFMiLCJBVURJT19TRVJWSUNFX1RSQU5TUE9SVFMiLCJWSURFT19TRVJWSUNFX1RSQU5TUE9SVFMiLCJBVVRIX1RPS0VOIiwiU3RhcnRTZXJ2aWNlTkFLIiwiRW5kU2VydmljZSIsIkVuZFNlcnZpY2VBQ0siLCJFbmRTZXJ2aWNlTkFLIiwiVHJhbnNwb3J0RXZlbnRVcGRhdGUiLCJUQ1BfSVBfQUREUkVTUyIsIlRDUF9QT1JUIiwiUmVnaXN0ZXJTZWNvbmRhcnlUcmFuc3BvcnQiLCJSZWdpc3RlclNlY29uZGFyeVRyYW5zcG9ydEFDSyIsIlJlZ2lzdGVyU2Vjb25kYXJ5VHJhbnNwb3J0TkFLIiwiUkVBU09OIiwiQXVkaW8iLCJWaWRlbyIsIlZJREVPX1BST1RPQ09MIiwiVklERU9fQ09ERUMiLCJCaXRDb252ZXJ0ZXIiLCJhcnJheUJ1ZmZlclRvSW50MzIiLCJnZXRVaW50MzIiLCJpbnQzMlRvQXJyYXlCdWZmZXIiLCJTZGxQYWNrZXRGYWN0b3J5IiwiY3JlYXRlSGVhcnRiZWF0QUNLIiwiY3JlYXRlRW5kU2Vzc2lvbiIsImhhc2hJRCIsImVuZFNlc3Npb24iLCJTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzIiwic2V0U2hvcnRQcmVzc0F2YWlsYWJsZSIsImF2YWlsYWJsZSIsIktFWV9TSE9SVF9QUkVTU19BVkFJTEFCTEUiLCJnZXRTaG9ydFByZXNzQXZhaWxhYmxlIiwic2V0TG9uZ1ByZXNzQXZhaWxhYmxlIiwiS0VZX0xPTkdfUFJFU1NfQVZBSUxBQkxFIiwiZ2V0TG9uZ1ByZXNzQXZhaWxhYmxlIiwic2V0VXBEb3duQXZhaWxhYmxlIiwiS0VZX1VQX0RPV05fQVZBSUxBQkxFIiwiZ2V0VXBEb3duQXZhaWxhYmxlIiwic2V0SW1hZ2VTdXBwb3J0ZWQiLCJzdXBwb3J0ZWQiLCJLRVlfSU1BR0VfU1VQUE9SVEVEIiwiZ2V0SW1hZ2VTdXBwb3J0ZWQiLCJzZXRUZXh0U3VwcG9ydGVkIiwiS0VZX1RFWFRfU1VQUE9SVEVEIiwiZ2V0VGV4dFN1cHBvcnRlZCIsIlByZXJlY29yZGVkU3BlZWNoIiwiSEVMUF9KSU5HTEUiLCJJTklUSUFMX0pJTkdMRSIsIkxJU1RFTl9KSU5HTEUiLCJQT1NJVElWRV9KSU5HTEUiLCJORUdBVElWRV9KSU5HTEUiLCJQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzIiwic2V0T25TY3JlZW5QcmVzZXRzQXZhaWxhYmxlIiwiS0VZX09OX1NDUkVFTl9QUkVTRVRTX0FWQUlMQUJMRSIsImdldE9uU2NyZWVuUHJlc2V0c0F2YWlsYWJsZSIsIlZlaGljbGVUeXBlIiwic2V0TWFrZSIsIm1ha2UiLCJLRVlfTUFLRSIsImdldE1ha2UiLCJzZXRNb2RlbCIsIm1vZGVsIiwiS0VZX01PREVMIiwiZ2V0TW9kZWwiLCJzZXRNb2RlbFllYXIiLCJ5ZWFyIiwiS0VZX01PREVMX1lFQVIiLCJnZXRNb2RlbFllYXIiLCJzZXRUcmltIiwiS0VZX1RSSU0iLCJnZXRUcmltIiwiSG1pWm9uZUNhcGFiaWxpdGllcyIsIkZST05UIiwiQkFDSyIsIk1lZGlhQ2xvY2tGb3JtYXQiLCJDTE9DSzEiLCJDTE9DSzIiLCJDTE9DSzMiLCJDTE9DS1RFWFQxIiwiQ0xPQ0tURVhUMiIsIkNMT0NLVEVYVDMiLCJDTE9DS1RFWFQ0IiwiSW1hZ2VSZXNvbHV0aW9uIiwic2V0UmVzb2x1dGlvbldpZHRoIiwid2lkdGgiLCJLRVlfUkVTT0xVVElPTl9XSURUSCIsImdldFJlc29sdXRpb25XaWR0aCIsInNldFJlc29sdXRpb25IZWlnaHQiLCJoZWlnaHQiLCJLRVlfUkVTT0xVVElPTl9IRUlHSFQiLCJnZXRSZXNvbHV0aW9uSGVpZ2h0IiwiVG91Y2hFdmVudENhcGFiaWxpdGllcyIsInNldFByZXNzQXZhaWxhYmxlIiwiS0VZX1BSRVNTX0FWQUlMQUJMRSIsImdldFByZXNzQXZhaWxhYmxlIiwic2V0TXVsdGlUb3VjaEF2YWlsYWJsZSIsIktFWV9NVUxUSV9UT1VDSF9BVkFJTEFCTEUiLCJnZXRNdWx0aVRvdWNoQXZhaWxhYmxlIiwic2V0RG91YmxlUHJlc3NBdmFpbGFibGUiLCJLRVlfRE9VQkxFX1BSRVNTX0FWQUlMQUJMRSIsImdldERvdWJsZVByZXNzQXZhaWxhYmxlIiwiU2NyZWVuUGFyYW1zIiwic2V0UmVzb2x1dGlvbiIsInJlc29sdXRpb24iLCJLRVlfUkVTT0xVVElPTiIsImdldFJlc29sdXRpb24iLCJzZXRUb3VjaEV2ZW50QXZhaWxhYmxlIiwiS0VZX1RPVUNIX0VWRU5UX0FWQUlMQUJMRSIsImdldFRvdWNoRXZlbnRBdmFpbGFibGUiLCJJbWFnZUZpZWxkTmFtZSIsInNvZnRCdXR0b25JbWFnZSIsImNob2ljZUltYWdlIiwiY2hvaWNlU2Vjb25kYXJ5SW1hZ2UiLCJ2ckhlbHBJdGVtIiwidHVybkljb24iLCJtZW51SWNvbiIsImNtZEljb24iLCJhcHBJY29uIiwiZ3JhcGhpYyIsInNlY29uZGFyeUdyYXBoaWMiLCJzaG93Q29uc3RhbnRUQlRJY29uIiwic2hvd0NvbnN0YW50VEJUTmV4dFR1cm5JY29uIiwibG9jYXRpb25JbWFnZSIsImFsZXJ0SWNvbiIsIkZpbGVUeXBlIiwiR1JBUEhJQ19CTVAiLCJHUkFQSElDX0pQRUciLCJHUkFQSElDX1BORyIsIkFVRElPX1dBVkUiLCJBVURJT19NUDMiLCJBVURJT19BQUMiLCJCSU5BUlkiLCJJbWFnZUZpZWxkIiwic2V0TmFtZSIsIktFWV9OQU1FIiwiZ2V0TmFtZSIsInNldEltYWdlVHlwZVN1cHBvcnRlZCIsIktFWV9JTUFHRV9UWVBFX1NVUFBPUlRFRCIsImdldEltYWdlVHlwZVN1cHBvcnRlZCIsInNldEltYWdlUmVzb2x1dGlvbiIsIktFWV9JTUFHRV9SRVNPTFVUSU9OIiwiZ2V0SW1hZ2VSZXNvbHV0aW9uIiwiRGlzcGxheVR5cGUiLCJDSUQiLCJUWVBFMiIsIlRZUEU1IiwiTkdOIiwiR0VOMl84X0RNQSIsIkdFTjJfNl9ETUEiLCJNRkQzIiwiTUZENCIsIk1GRDUiLCJHRU4zXzhfSU5DSCIsIlNETF9HRU5FUklDIiwiVGV4dEZpZWxkTmFtZSIsIm1haW5GaWVsZDEiLCJtYWluRmllbGQyIiwibWFpbkZpZWxkMyIsIm1haW5GaWVsZDQiLCJzdGF0dXNCYXIiLCJtZWRpYUNsb2NrIiwibWVkaWFUcmFjayIsInRlbXBsYXRlVGl0bGUiLCJhbGVydFRleHQxIiwiYWxlcnRUZXh0MiIsImFsZXJ0VGV4dDMiLCJzY3JvbGxhYmxlTWVzc2FnZUJvZHkiLCJpbml0aWFsSW50ZXJhY3Rpb25UZXh0IiwibmF2aWdhdGlvblRleHQxIiwibmF2aWdhdGlvblRleHQyIiwiRVRBIiwidG90YWxEaXN0YW5jZSIsImF1ZGlvUGFzc1RocnVEaXNwbGF5VGV4dDEiLCJhdWRpb1Bhc3NUaHJ1RGlzcGxheVRleHQyIiwic2xpZGVySGVhZGVyIiwic2xpZGVyRm9vdGVyIiwibWVudU5hbWUiLCJzZWNvbmRhcnlUZXh0IiwidGVydGlhcnlUZXh0IiwibWVudVRpdGxlIiwibG9jYXRpb25OYW1lIiwibG9jYXRpb25EZXNjcmlwdGlvbiIsImFkZHJlc3NMaW5lcyIsInBob25lTnVtYmVyIiwiQ2hhcmFjdGVyU2V0IiwiVFlQRTJTRVQiLCJUWVBFNVNFVCIsIkNJRDFTRVQiLCJDSUQyU0VUIiwiVGV4dEZpZWxkIiwic2V0Q2hhcmFjdGVyU2V0IiwiS0VZX0NIQVJBQ1RFUl9TRVQiLCJnZXRDaGFyYWN0ZXJTZXQiLCJzZXRXaWR0aCIsIktFWV9XSURUSCIsImdldFdpZHRoIiwic2V0Um93cyIsInJvd3MiLCJLRVlfUk9XUyIsImdldFJvd3MiLCJEaXNwbGF5Q2FwYWJpbGl0aWVzIiwic2V0RGlzcGxheVR5cGUiLCJLRVlfRElTUExBWV9UWVBFIiwiZ2V0RGlzcGxheVR5cGUiLCJzZXREaXNwbGF5TmFtZSIsIktFWV9ESVNQTEFZX05BTUUiLCJnZXREaXNwbGF5TmFtZSIsInNldFRleHRGaWVsZHMiLCJLRVlfVEVYVF9GSUVMRFMiLCJnZXRUZXh0RmllbGRzIiwic2V0SW1hZ2VGaWVsZHMiLCJLRVlfSU1BR0VfRklFTERTIiwiZ2V0SW1hZ2VGaWVsZHMiLCJzZXRNZWRpYUNsb2NrRm9ybWF0cyIsImZvcm1hdHMiLCJLRVlfTUVESUFfQ0xPQ0tfRk9STUFUUyIsImdldE1lZGlhQ2xvY2tGb3JtYXRzIiwic2V0R3JhcGhpY1N1cHBvcnRlZCIsIktFWV9HUkFQSElDX1NVUFBPUlRFRCIsImdldEdyYXBoaWNTdXBwb3J0ZWQiLCJzZXRUZW1wbGF0ZXNBdmFpbGFibGUiLCJLRVlfVEVNUExBVEVTX0FWQUlMQUJMRSIsImdldFRlbXBsYXRlc0F2YWlsYWJsZSIsInNldFNjcmVlblBhcmFtcyIsIktFWV9TQ1JFRU5fUEFSQU1TIiwiZ2V0U2NyZWVuUGFyYW1zIiwic2V0TnVtQ3VzdG9tUHJlc2V0c0F2YWlsYWJsZSIsIktFWV9OVU1fQ1VTVE9NX1BSRVNFVFNfQVZBSUxBQkxFIiwiZ2V0TnVtQ3VzdG9tUHJlc2V0c0F2YWlsYWJsZSIsIlNhbXBsaW5nUmF0ZSIsIlNhbXBsaW5nUmF0ZV84S0haIiwiU2FtcGxpbmdSYXRlXzE2S0haIiwiU2FtcGxpbmdSYXRlXzIyS0haIiwiU2FtcGxpbmdSYXRlXzQ0S0haIiwiQml0c1BlclNhbXBsZSIsIkJpdHNQZXJTYW1wbGVfOF9CSVQiLCJCaXRzUGVyU2FtcGxlXzE2X0JJVCIsIkF1ZGlvVHlwZSIsIlBDTSIsIkF1ZGlvUGFzc1RocnVDYXBhYmlsaXRpZXMiLCJzZXRTYW1wbGluZ1JhdGUiLCJyYXRlIiwiS0VZX1NBTVBMSU5HX1JBVEUiLCJnZXRTYW1wbGluZ1JhdGUiLCJzZXRCaXRzUGVyU2FtcGxlIiwic2FtcGxlIiwiS0VZX0JJVFNfUEVSX1NBTVBMRSIsImdldEJpdHNQZXJTYW1wbGUiLCJzZXRBdWRpb1R5cGUiLCJLRVlfQVVESU9fVFlQRSIsImdldEF1ZGlvVHlwZSIsIlZyQ2FwYWJpbGl0aWVzIiwiVlJfVEVYVCIsIkJ1dHRvbk5hbWUiLCJPSyIsIlBMQVlfUEFVU0UiLCJTRUVLTEVGVCIsIlNFRUtSSUdIVCIsIlRVTkVVUCIsIlRVTkVET1dOIiwiUFJFU0VUXzAiLCJQUkVTRVRfMSIsIlBSRVNFVF8yIiwiUFJFU0VUXzMiLCJQUkVTRVRfNCIsIlBSRVNFVF81IiwiUFJFU0VUXzYiLCJQUkVTRVRfNyIsIlBSRVNFVF84IiwiUFJFU0VUXzkiLCJDVVNUT01fQlVUVE9OIiwiU0VBUkNIIiwiQUNfTUFYIiwiQUMiLCJSRUNJUkNVTEFURSIsIkZBTl9VUCIsIkZBTl9ET1dOIiwiVEVNUF9VUCIsIlRFTVBfRE9XTiIsIkRFRlJPU1RfTUFYIiwiREVGUk9TVCIsIkRFRlJPU1RfUkVBUiIsIlVQUEVSX1ZFTlQiLCJMT1dFUl9WRU5UIiwiVk9MVU1FX1VQIiwiVk9MVU1FX0RPV04iLCJFSkVDVCIsIlNPVVJDRSIsIlNIVUZGTEUiLCJSRVBFQVQiLCJOQVZfQ0VOVEVSX0xPQ0FUSU9OIiwiTkFWX1pPT01fSU4iLCJOQVZfWk9PTV9PVVQiLCJOQVZfUEFOX1VQIiwiTkFWX1BBTl9VUF9SSUdIVCIsIk5BVl9QQU5fUklHSFQiLCJOQVZfUEFOX0RPV05fUklHSFQiLCJOQVZfUEFOX0RPV04iLCJOQVZfUEFOX0RPV05fTEVGVCIsIk5BVl9QQU5fTEVGVCIsIk5BVl9QQU5fVVBfTEVGVCIsIk5BVl9USUxUX1RPR0dMRSIsIk5BVl9ST1RBVEVfQ0xPQ0tXSVNFIiwiTkFWX1JPVEFURV9DT1VOVEVSQ0xPQ0tXSVNFIiwiTkFWX0hFQURJTkdfVE9HR0xFIiwiR3JpZCIsInNldENvbHVtbiIsImNvbCIsIktFWV9DT0xVTU4iLCJnZXRDb2x1bW4iLCJzZXRSb3ciLCJyb3ciLCJLRVlfUk9XIiwiZ2V0Um93Iiwic2V0TGV2ZWwiLCJsZXZlbCIsIktFWV9MRVZFTCIsImdldExldmVsIiwic2V0Q29sdW1uU3BhbiIsImNvbHNwYW4iLCJLRVlfQ09MVU1OX1NQQU4iLCJnZXRDb2x1bW5TcGFuIiwic2V0Um93U3BhbiIsInJvd3NwYW4iLCJLRVlfUk9XX1NQQU4iLCJnZXRSb3dTcGFuIiwic2V0TGV2ZWxTcGFuIiwibGV2ZWxzcGFuIiwiS0VZX0xFVkVMX1NQQU4iLCJnZXRMZXZlbFNwYW4iLCJNb2R1bGVJbmZvIiwic2V0TW9kdWxlSWQiLCJLRVlfTU9EVUxFX0lEIiwiZ2V0TW9kdWxlSWQiLCJzZXRMb2NhdGlvbiIsImxvY2F0aW9uIiwiS0VZX0xPQ0FUSU9OIiwiZ2V0TG9jYXRpb24iLCJzZXRTZXJ2aWNlQXJlYSIsImFyZWEiLCJLRVlfU0VSVklDRV9BUkVBIiwiZ2V0U2VydmljZUFyZWEiLCJzZXRBbGxvd011bHRpcGxlQWNjZXNzIiwiYWNjZXNzIiwiS0VZX0FMTE9XX01VTFRJUExFX0FDQ0VTUyIsImdldEFsbG93TXVsdGlwbGVBY2Nlc3MiLCJCdXR0b25DYXBhYmlsaXRpZXMiLCJzZXRNb2R1bGVJbmZvIiwiS0VZX01PRFVMRV9JTkZPIiwiZ2V0TW9kdWxlSW5mbyIsIkhNSUNhcGFiaWxpdGllcyIsInNldE5hdmlnYXRpb24iLCJuYXZpZ2F0aW9uIiwiS0VZX05BVklHQVRJT04iLCJnZXROYXZpZ2F0aW9uIiwic2V0UGhvbmVDYWxsIiwiS0VZX1BIT05FX0NBTEwiLCJnZXRQaG9uZUNhbGwiLCJzZXRWaWRlb1N0cmVhbWluZyIsInN0cmVhbWluZyIsIktFWV9WSURFT19TVFJFQU1JTkciLCJnZXRWaWRlb1N0cmVhbWluZyIsInNldFJlbW90ZUNvbnRyb2wiLCJjb250cm9sIiwiS0VZX1JFTU9URV9DT05UUk9MIiwiZ2V0UmVtb3RlQ29udHJvbCIsInNldEFwcFNlcnZpY2VzIiwic2VydmljZXMiLCJLRVlfQVBQX1NFUlZJQ0VTIiwiZ2V0QXBwU2VydmljZXMiLCJzZXREaXNwbGF5cyIsImRpc3BsYXlzIiwiS0VZX0RJU1BMQVlTIiwiZ2V0RGlzcGxheXMiLCJzZXRTZWF0TG9jYXRpb24iLCJLRVlfU0VBVF9MT0NBVElPTiIsImdldFNlYXRMb2NhdGlvbiIsIlJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UiLCJzZXRMYW5ndWFnZSIsImxhbmd1YWdlIiwiS0VZX0xBTkdVQUdFIiwiZ2V0TGFuZ3VhZ2UiLCJzZXRIbWlEaXNwbGF5TGFuZ3VhZ2UiLCJLRVlfSE1JX0RJU1BMQVlfTEFOR1VBR0UiLCJnZXRIbWlEaXNwbGF5TGFuZ3VhZ2UiLCJzZXREaXNwbGF5Q2FwYWJpbGl0aWVzIiwiY2FwYWJpbGl0aWVzIiwiS0VZX0RJU1BMQVlfQ0FQQUJJTElUSUVTIiwiZ2V0RGlzcGxheUNhcGFiaWxpdGllcyIsInNldEJ1dHRvbkNhcGFiaWxpdGllcyIsIktFWV9CVVRUT05fQ0FQQUJJTElUSUVTIiwiZ2V0QnV0dG9uQ2FwYWJpbGl0aWVzIiwic2V0U29mdEJ1dHRvbkNhcGFiaWxpdGllcyIsIktFWV9TT0ZUX0JVVFRPTl9DQVBBQklMSVRJRVMiLCJnZXRTb2Z0QnV0dG9uQ2FwYWJpbGl0aWVzIiwic2V0UHJlc2V0QmFua0NhcGFiaWxpdGllcyIsIktFWV9QUkVTRVRfQkFOS19DQVBBQklMSVRJRVMiLCJnZXRQcmVzZXRCYW5rQ2FwYWJpbGl0aWVzIiwic2V0SG1pWm9uZUNhcGFiaWxpdGllcyIsIktFWV9ITUlfWk9ORV9DQVBBQklMSVRJRVMiLCJnZXRIbWlab25lQ2FwYWJpbGl0aWVzIiwic2V0U3BlZWNoQ2FwYWJpbGl0aWVzIiwiS0VZX1NQRUVDSF9DQVBBQklMSVRJRVMiLCJnZXRTcGVlY2hDYXBhYmlsaXRpZXMiLCJzZXRQcmVyZWNvcmRlZFNwZWVjaCIsInNwZWVjaCIsIktFWV9QUkVSRUNPUkRFRF9TUEVFQ0giLCJnZXRQcmVyZWNvcmRlZFNwZWVjaCIsInNldFZyQ2FwYWJpbGl0aWVzIiwiS0VZX1ZSX0NBUEFCSUxJVElFUyIsImdldFZyQ2FwYWJpbGl0aWVzIiwic2V0QXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcyIsIktFWV9BVURJT19QQVNTX1RIUlVfQ0FQQUJJTElUSUVTIiwiZ2V0QXVkaW9QYXNzVGhydUNhcGFiaWxpdGllcyIsInNldFBjbVN0cmVhbUNhcGFiaWxpdGllcyIsIktFWV9QQ01fU1RSRUFNX0NBUEFCSUxJVElFUyIsImdldFBjbVN0cmVhbUNhcGFiaWxpdGllcyIsInNldFZlaGljbGVUeXBlIiwiS0VZX1ZFSElDTEVfVFlQRSIsImdldFZlaGljbGVUeXBlIiwic2V0U3VwcG9ydGVkRGlhZ01vZGVzIiwibW9kZXMiLCJLRVlfU1VQUE9SVEVEX0RJQUdfTU9ERVMiLCJnZXRTdXBwb3J0ZWREaWFnTW9kZXMiLCJzZXRIbWlDYXBhYmlsaXRpZXMiLCJLRVlfSE1JX0NBUEFCSUxJVElFUyIsImdldEhtaUNhcGFiaWxpdGllcyIsInNldFNkbFZlcnNpb24iLCJLRVlfU0RMX1ZFUlNJT04iLCJnZXRTZGxWZXJzaW9uIiwic2V0U3lzdGVtU29mdHdhcmVWZXJzaW9uIiwiS0VZX1NZU1RFTV9TT0ZUV0FSRV9WRVJTSU9OIiwiZ2V0U3lzdGVtU29mdHdhcmVWZXJzaW9uIiwic2V0SWNvblJlc3VtZWQiLCJyZXN1bWVkIiwiS0VZX0lDT05fUkVTVU1FRCIsImdldEljb25SZXN1bWVkIiwiVW5yZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlIiwiV2luZG93VHlwZSIsIk1BSU4iLCJXSURHRVQiLCJzZXRXaW5kb3dJRCIsIktFWV9XSU5ET1dfSUQiLCJnZXRXaW5kb3dJRCIsInNldFdpbmRvd05hbWUiLCJLRVlfV0lORE9XX05BTUUiLCJnZXRXaW5kb3dOYW1lIiwic2V0QXNzb2NpYXRlZFNlcnZpY2VUeXBlIiwiS0VZX0FTU09DSUFURURfU0VSVklDRV9UWVBFIiwiZ2V0QXNzb2NpYXRlZFNlcnZpY2VUeXBlIiwic2V0RHVwbGljYXRlVXBkYXRlc0Zyb21XaW5kb3dJRCIsIktFWV9EVVBMSUNBVEVfVVBEQVRFU19GUk9NX1dJTkRPV19JRCIsImdldER1cGxpY2F0ZVVwZGF0ZXNGcm9tV2luZG93SUQiLCJDcmVhdGVXaW5kb3dSZXNwb25zZSIsIkRlbGV0ZVdpbmRvd1Jlc3BvbnNlIiwiSW1hZ2VUeXBlIiwiU1RBVElDIiwiRFlOQU1JQyIsIkltYWdlIiwic2V0VmFsdWUiLCJLRVlfVkFMVUUiLCJnZXRWYWx1ZSIsInNldEltYWdlVHlwZSIsIktFWV9JTUFHRV9UWVBFIiwiZ2V0SW1hZ2VUeXBlIiwic2V0SXNUZW1wbGF0ZSIsInRlbXBsYXRlIiwiS0VZX0lTX1RFTVBMQVRFIiwiZ2V0SXNUZW1wbGF0ZSIsIlZySGVscEl0ZW0iLCJzZXRJbWFnZSIsImltYWdlIiwiS0VZX0lNQUdFIiwiZ2V0SW1hZ2UiLCJzZXRQb3NpdGlvbiIsIktFWV9QT1NJVElPTiIsImdldFBvc2l0aW9uIiwiU2VhdExvY2F0aW9uIiwic2V0R3JpZCIsImdyaWQiLCJLRVlfR1JJRCIsImdldEdyaWQiLCJNZW51TGF5b3V0IiwiTElTVCIsIlRJTEVTIiwiS2V5Ym9hcmRMYXlvdXQiLCJRV0VSVFkiLCJRV0VSVFoiLCJBWkVSVFkiLCJLZXlwcmVzc01vZGUiLCJTSU5HTEVfS0VZUFJFU1MiLCJRVUVVRV9LRVlQUkVTU0VTIiwiUkVTRU5EX0NVUlJFTlRfRU5UUlkiLCJLZXlib2FyZFByb3BlcnRpZXMiLCJzZXRLZXlib2FyZExheW91dCIsImxheW91dCIsIktFWV9LRVlCT0FSRF9MQVlPVVQiLCJnZXRLZXlib2FyZExheW91dCIsInNldEtleXByZXNzTW9kZSIsIm1vZGUiLCJLRVlfS0VZUFJFU1NfTU9ERSIsImdldEtleXByZXNzTW9kZSIsInNldExpbWl0ZWRDaGFyYWN0ZXJMaXN0IiwiS0VZX0xJTUlURURfQ0hBUkFDVEVSX0xJU1QiLCJnZXRMaW1pdGVkQ2hhcmFjdGVyTGlzdCIsInNldEF1dG9Db21wbGV0ZVRleHQiLCJLRVlfQVVUT19DT01QTEVURV9URVhUIiwiZ2V0QXV0b0NvbXBsZXRlVGV4dCIsInNldEF1dG9Db21wbGV0ZUxpc3QiLCJLRVlfQVVUT19DT01QTEVURV9MSVNUIiwiZ2V0QXV0b0NvbXBsZXRlTGlzdCIsInNldFVzZXJMb2NhdGlvbiIsIktFWV9VU0VSX0xPQ0FUSU9OIiwiZ2V0VXNlckxvY2F0aW9uIiwic2V0SGVscFByb21wdCIsInByb21wdCIsIktFWV9IRUxQX1BST01QVCIsImdldEhlbHBQcm9tcHQiLCJzZXRUaW1lb3V0UHJvbXB0IiwiS0VZX1RJTUVPVVRfUFJPTVBUIiwiZ2V0VGltZW91dFByb21wdCIsInNldFZySGVscFRpdGxlIiwidGl0bGUiLCJLRVlfVlJfSEVMUF9USVRMRSIsImdldFZySGVscFRpdGxlIiwic2V0VnJIZWxwIiwiaGVscCIsIktFWV9WUl9IRUxQIiwiZ2V0VnJIZWxwIiwic2V0TWVudVRpdGxlIiwiS0VZX01FTlVfVElUTEUiLCJnZXRNZW51VGl0bGUiLCJzZXRNZW51SWNvbiIsIktFWV9NRU5VX0lDT04iLCJnZXRNZW51SWNvbiIsInNldEtleWJvYXJkUHJvcGVydGllcyIsInByb3BlcnRpZXMiLCJLRVlfS0VZQk9BUkRfUFJPUEVSVElFUyIsImdldEtleWJvYXJkUHJvcGVydGllcyIsInNldE1lbnVMYXlvdXQiLCJLRVlfTUVOVV9MQVlPVVQiLCJnZXRNZW51TGF5b3V0IiwiU2V0R2xvYmFsUHJvcGVydGllc1Jlc3BvbnNlIiwiR2xvYmFsUHJvcGVydHkiLCJVU0VSX0xPQ0FUSU9OIiwiSEVMUFBST01QVCIsIlRJTUVPVVRQUk9NUFQiLCJWUkhFTFBUSVRMRSIsIlZSSEVMUElURU1TIiwiTUVOVU5BTUUiLCJNRU5VSUNPTiIsIktFWUJPQVJEUFJPUEVSVElFUyIsInNldFByb3BlcnRpZXMiLCJLRVlfUFJPUEVSVElFUyIsImdldFByb3BlcnRpZXMiLCJSZXNldEdsb2JhbFByb3BlcnRpZXNSZXNwb25zZSIsIk1lbnVQYXJhbXMiLCJzZXRQYXJlbnRJRCIsIktFWV9QQVJFTlRfSUQiLCJnZXRQYXJlbnRJRCIsInNldE1lbnVOYW1lIiwiS0VZX01FTlVfTkFNRSIsImdldE1lbnVOYW1lIiwic2V0Q21kSUQiLCJLRVlfQ01EX0lEIiwiZ2V0Q21kSUQiLCJzZXRNZW51UGFyYW1zIiwiS0VZX01FTlVfUEFSQU1TIiwiZ2V0TWVudVBhcmFtcyIsInNldFZyQ29tbWFuZHMiLCJjb21tYW5kcyIsIktFWV9WUl9DT01NQU5EUyIsImdldFZyQ29tbWFuZHMiLCJzZXRDbWRJY29uIiwiS0VZX0NNRF9JQ09OIiwiZ2V0Q21kSWNvbiIsIkFkZENvbW1hbmRSZXNwb25zZSIsIkRlbGV0ZUNvbW1hbmRSZXNwb25zZSIsInNldE1lbnVJRCIsIktFWV9NRU5VX0lEIiwiZ2V0TWVudUlEIiwiQWRkU3ViTWVudVJlc3BvbnNlIiwiRGVsZXRlU3ViTWVudVJlc3BvbnNlIiwiU2hvd0FwcE1lbnVSZXNwb25zZSIsIkNob2ljZSIsInNldENob2ljZUlEIiwiS0VZX0NIT0lDRV9JRCIsImdldENob2ljZUlEIiwic2V0U2Vjb25kYXJ5VGV4dCIsIktFWV9TRUNPTkRBUllfVEVYVCIsImdldFNlY29uZGFyeVRleHQiLCJzZXRUZXJ0aWFyeVRleHQiLCJLRVlfVEVSVElBUllfVEVYVCIsImdldFRlcnRpYXJ5VGV4dCIsInNldFNlY29uZGFyeUltYWdlIiwiS0VZX1NFQ09OREFSWV9JTUFHRSIsImdldFNlY29uZGFyeUltYWdlIiwic2V0SW50ZXJhY3Rpb25DaG9pY2VTZXRJRCIsIktFWV9JTlRFUkFDVElPTl9DSE9JQ0VfU0VUX0lEIiwiZ2V0SW50ZXJhY3Rpb25DaG9pY2VTZXRJRCIsInNldENob2ljZVNldCIsIktFWV9DSE9JQ0VfU0VUIiwiZ2V0Q2hvaWNlU2V0IiwiQ3JlYXRlSW50ZXJhY3Rpb25DaG9pY2VTZXRSZXNwb25zZSIsIkxheW91dE1vZGUiLCJJQ09OX09OTFkiLCJJQ09OX1dJVEhfU0VBUkNIIiwiTElTVF9PTkxZIiwiTElTVF9XSVRIX1NFQVJDSCIsIktFWUJPQVJEIiwiSW50ZXJhY3Rpb25Nb2RlIiwiTUFOVUFMX09OTFkiLCJWUl9PTkxZIiwiQk9USCIsInNldEluaXRpYWxUZXh0IiwiS0VZX0lOSVRJQUxfVEVYVCIsImdldEluaXRpYWxUZXh0Iiwic2V0SW5pdGlhbFByb21wdCIsIktFWV9JTklUSUFMX1BST01QVCIsImdldEluaXRpYWxQcm9tcHQiLCJzZXRJbnRlcmFjdGlvbk1vZGUiLCJLRVlfSU5URVJBQ1RJT05fTU9ERSIsImdldEludGVyYWN0aW9uTW9kZSIsInNldEludGVyYWN0aW9uQ2hvaWNlU2V0SURMaXN0IiwiS0VZX0lOVEVSQUNUSU9OX0NIT0lDRV9TRVRfSURMSVNUIiwiZ2V0SW50ZXJhY3Rpb25DaG9pY2VTZXRJRExpc3QiLCJ0aW1lb3V0IiwiS0VZX1RJTUVPVVQiLCJnZXRUaW1lb3V0Iiwic2V0SW50ZXJhY3Rpb25MYXlvdXQiLCJLRVlfSU5URVJBQ1RJT05fTEFZT1VUIiwiZ2V0SW50ZXJhY3Rpb25MYXlvdXQiLCJzZXRDYW5jZWxJRCIsIktFWV9DQU5DRUxfSUQiLCJnZXRDYW5jZWxJRCIsIlRyaWdnZXJTb3VyY2UiLCJUU19NRU5VIiwiVFNfVlIiLCJUU19LRVlCT0FSRCIsIlBlcmZvcm1JbnRlcmFjdGlvblJlc3BvbnNlIiwic2V0TWFudWFsVGV4dEVudHJ5IiwiS0VZX01BTlVBTF9URVhUX0VOVFJZIiwiZ2V0TWFudWFsVGV4dEVudHJ5Iiwic2V0VHJpZ2dlclNvdXJjZSIsIktFWV9UUklHR0VSX1NPVVJDRSIsImdldFRyaWdnZXJTb3VyY2UiLCJEZWxldGVJbnRlcmFjdGlvbkNob2ljZVNldFJlc3BvbnNlIiwiU29mdEJ1dHRvblR5cGUiLCJTQlRfVEVYVCIsIlNCVF9JTUFHRSIsIlNCVF9CT1RIIiwiU3lzdGVtQWN0aW9uIiwiREVGQVVMVF9BQ1RJT04iLCJTVEVBTF9GT0NVUyIsIktFRVBfQ09OVEVYVCIsIlNvZnRCdXR0b24iLCJzZXRJc0hpZ2hsaWdodGVkIiwiaGlnaGxpZ2h0ZWQiLCJLRVlfSVNfSElHSExJR0hURUQiLCJnZXRJc0hpZ2hsaWdodGVkIiwic2V0U29mdEJ1dHRvbklEIiwiS0VZX1NPRlRfQlVUVE9OX0lEIiwiZ2V0U29mdEJ1dHRvbklEIiwic2V0U3lzdGVtQWN0aW9uIiwiYWN0aW9uIiwiS0VZX1NZU1RFTV9BQ1RJT04iLCJnZXRTeXN0ZW1BY3Rpb24iLCJzZXRBbGVydFRleHQxIiwidGV4dDEiLCJLRVlfQUxFUlRfVEVYVF8xIiwiZ2V0QWxlcnRUZXh0MSIsInNldEFsZXJ0VGV4dDIiLCJ0ZXh0MiIsIktFWV9BTEVSVF9URVhUXzIiLCJnZXRBbGVydFRleHQyIiwic2V0QWxlcnRUZXh0MyIsInRleHQzIiwiS0VZX0FMRVJUX1RFWFRfMyIsImdldEFsZXJ0VGV4dDMiLCJzZXRUdHNDaHVua3MiLCJjaHVua3MiLCJLRVlfVFRTX0NIVU5LUyIsImdldFR0c0NodW5rcyIsInNldER1cmF0aW9uIiwiZHVyYXRpb24iLCJLRVlfRFVSQVRJT04iLCJnZXREdXJhdGlvbiIsInNldFBsYXlUb25lIiwidG9uZSIsIktFWV9QTEFZX1RPTkUiLCJnZXRQbGF5VG9uZSIsInNldFByb2dyZXNzSW5kaWNhdG9yIiwiaW5kaWNhdG9yIiwiS0VZX1BST0dSRVNTX0lORElDQVRPUiIsImdldFByb2dyZXNzSW5kaWNhdG9yIiwic2V0U29mdEJ1dHRvbnMiLCJidXR0b25zIiwiS0VZX1NPRlRfQlVUVE9OUyIsImdldFNvZnRCdXR0b25zIiwic2V0QWxlcnRJY29uIiwiS0VZX0FMRVJUX0lDT04iLCJnZXRBbGVydEljb24iLCJBbGVydFJlc3BvbnNlIiwic2V0VHJ5QWdhaW5UaW1lIiwiS0VZX1RSWV9BR0FJTl9USU1FIiwiZ2V0VHJ5QWdhaW5UaW1lIiwiVGV4dEFsaWdubWVudCIsIkxFRlRfQUxJR05FRCIsIlJJR0hUX0FMSUdORUQiLCJDRU5URVJFRCIsIlRlbXBsYXRlQ29uZmlndXJhdGlvbiIsInNldFRlbXBsYXRlIiwiS0VZX1RFTVBMQVRFIiwiZ2V0VGVtcGxhdGUiLCJNZXRhZGF0YVR5cGUiLCJtZWRpYVRpdGxlIiwibWVkaWFBcnRpc3QiLCJtZWRpYUFsYnVtIiwibWVkaWFZZWFyIiwibWVkaWFHZW5yZSIsIm1lZGlhU3RhdGlvbiIsInJhdGluZyIsImN1cnJlbnRUZW1wZXJhdHVyZSIsIm1heGltdW1UZW1wZXJhdHVyZSIsIm1pbmltdW1UZW1wZXJhdHVyZSIsIndlYXRoZXJUZXJtIiwiaHVtaWRpdHkiLCJNZXRhZGF0YVRhZ3MiLCJzZXRNYWluRmllbGQxIiwiZmllbGQxIiwiS0VZX01BSU5fRklFTERfMSIsImdldE1haW5GaWVsZDEiLCJzZXRNYWluRmllbGQyIiwiZmllbGQyIiwiS0VZX01BSU5fRklFTERfMiIsImdldE1haW5GaWVsZDIiLCJzZXRNYWluRmllbGQzIiwiZmllbGQzIiwiS0VZX01BSU5fRklFTERfMyIsImdldE1haW5GaWVsZDMiLCJzZXRNYWluRmllbGQ0IiwiZmllbGQ0IiwiS0VZX01BSU5fRklFTERfNCIsImdldE1haW5GaWVsZDQiLCJzZXRBbGlnbm1lbnQiLCJhbGlnbm1lbnQiLCJLRVlfQUxJR05NRU5UIiwiZ2V0QWxpZ25tZW50Iiwic2V0U3RhdHVzQmFyIiwiYmFyIiwiS0VZX1NUQVRVU19CQVIiLCJnZXRTdGF0dXNCYXIiLCJzZXRNZWRpYUNsb2NrIiwiY2xvY2siLCJLRVlfTUVESUFfQ0xPQ0siLCJnZXRNZWRpYUNsb2NrIiwic2V0TWVkaWFUcmFjayIsInRyYWNrIiwiS0VZX01FRElBX1RSQUNLIiwiZ2V0TWVkaWFUcmFjayIsInNldEdyYXBoaWMiLCJLRVlfR1JBUEhJQyIsImdldEdyYXBoaWMiLCJzZXRTZWNvbmRhcnlHcmFwaGljIiwiS0VZX1NFQ09OREFSWV9HUkFQSElDIiwiZ2V0U2Vjb25kYXJ5R3JhcGhpYyIsInNldEN1c3RvbVByZXNldHMiLCJwcmVzZXRzIiwiS0VZX0NVU1RPTV9QUkVTRVRTIiwiZ2V0Q3VzdG9tUHJlc2V0cyIsInNldE1ldGFkYXRhVGFncyIsInRhZ3MiLCJLRVlfTUVUQURBVEFfVEFHUyIsImdldE1ldGFkYXRhVGFncyIsInNldFRlbXBsYXRlVGl0bGUiLCJLRVlfVEVNUExBVEVfVElUTEUiLCJnZXRUZW1wbGF0ZVRpdGxlIiwic2V0VGVtcGxhdGVDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsIktFWV9URU1QTEFURV9DT05GSUdVUkFUSU9OIiwiZ2V0VGVtcGxhdGVDb25maWd1cmF0aW9uIiwiU2hvd1Jlc3BvbnNlIiwiU3BlYWtSZXNwb25zZSIsIlN0YXJ0VGltZSIsInNldEhvdXJzIiwiaG91cnMiLCJLRVlfSE9VUlMiLCJzZXRNaW51dGVzIiwibWludXRlcyIsIktFWV9NSU5VVEVTIiwic2V0U2Vjb25kcyIsInNlY29uZHMiLCJLRVlfU0VDT05EUyIsIlVwZGF0ZU1vZGUiLCJDT1VOVFVQIiwiQ09VTlRET1dOIiwiUEFVU0UiLCJSRVNVTUUiLCJDTEVBUiIsIkF1ZGlvU3RyZWFtaW5nSW5kaWNhdG9yIiwiUExBWSIsIlNUT1AiLCJzZXRTdGFydFRpbWUiLCJLRVlfU1RBUlRfVElNRSIsImdldFN0YXJ0VGltZSIsInNldEVuZFRpbWUiLCJLRVlfRU5EX1RJTUUiLCJnZXRFbmRUaW1lIiwic2V0VXBkYXRlTW9kZSIsIktFWV9VUERBVEVfTU9ERSIsImdldFVwZGF0ZU1vZGUiLCJzZXRBdWRpb1N0cmVhbWluZ0luZGljYXRvciIsIktFWV9BVURJT19TVFJFQU1JTkdfSU5ESUNBVE9SIiwiZ2V0QXVkaW9TdHJlYW1pbmdJbmRpY2F0b3IiLCJTZXRNZWRpYUNsb2NrVGltZXJSZXNwb25zZSIsInNldEF1ZGlvUGFzc1RocnVEaXNwbGF5VGV4dDEiLCJLRVlfQVVESU9fUEFTU19USFJVX0RJU1BMQVlfVEVYVF8xIiwiZ2V0QXVkaW9QYXNzVGhydURpc3BsYXlUZXh0MSIsInNldEF1ZGlvUGFzc1RocnVEaXNwbGF5VGV4dDIiLCJLRVlfQVVESU9fUEFTU19USFJVX0RJU1BMQVlfVEVYVF8yIiwiZ2V0QXVkaW9QYXNzVGhydURpc3BsYXlUZXh0MiIsInNldE1heER1cmF0aW9uIiwiS0VZX01BWF9EVVJBVElPTiIsImdldE1heER1cmF0aW9uIiwic2V0TXV0ZUF1ZGlvIiwiYXVkaW8iLCJLRVlfTVVURV9BVURJTyIsImdldE11dGVBdWRpbyIsIlBlcmZvcm1BdWRpb1Bhc3NUaHJ1UmVzcG9uc2UiLCJFbmRBdWRpb1Bhc3NUaHJ1UmVzcG9uc2UiLCJzZXRCdXR0b25OYW1lIiwiS0VZX0JVVFRPTl9OQU1FIiwiZ2V0QnV0dG9uTmFtZSIsIlN1YnNjcmliZUJ1dHRvblJlc3BvbnNlIiwiVW5zdWJzY3JpYmVCdXR0b25SZXNwb25zZSIsInNldEdwcyIsImdwcyIsIktFWV9HUFMiLCJnZXRHcHMiLCJzZXRTcGVlZCIsInNwZWVkIiwiS0VZX1NQRUVEIiwiZ2V0U3BlZWQiLCJzZXRScG0iLCJycG0iLCJLRVlfUlBNIiwiZ2V0UnBtIiwic2V0RnVlbExldmVsIiwiS0VZX0ZVRUxfTEVWRUwiLCJnZXRGdWVsTGV2ZWwiLCJzZXRGdWVsTGV2ZWxfU3RhdGUiLCJsZXZlbF9zdGF0ZSIsIktFWV9GVUVMX0xFVkVMX1NUQVRFIiwiZ2V0RnVlbExldmVsX1N0YXRlIiwic2V0SW5zdGFudEZ1ZWxDb25zdW1wdGlvbiIsImNvbnN1bXB0aW9uIiwiS0VZX0lOU1RBTlRfRlVFTF9DT05TVU1QVElPTiIsImdldEluc3RhbnRGdWVsQ29uc3VtcHRpb24iLCJzZXRGdWVsUmFuZ2UiLCJyYW5nZSIsIktFWV9GVUVMX1JBTkdFIiwiZ2V0RnVlbFJhbmdlIiwic2V0RXh0ZXJuYWxUZW1wZXJhdHVyZSIsInRlbXBlcmF0dXJlIiwiS0VZX0VYVEVSTkFMX1RFTVBFUkFUVVJFIiwiZ2V0RXh0ZXJuYWxUZW1wZXJhdHVyZSIsInNldFR1cm5TaWduYWwiLCJzaWduYWwiLCJLRVlfVFVSTl9TSUdOQUwiLCJnZXRUdXJuU2lnbmFsIiwic2V0UHJuZGwiLCJwcm5kbCIsIktFWV9QUk5ETCIsImdldFBybmRsIiwic2V0VGlyZVByZXNzdXJlIiwicHJlc3N1cmUiLCJLRVlfVElSRV9QUkVTU1VSRSIsImdldFRpcmVQcmVzc3VyZSIsInNldE9kb21ldGVyIiwib2RvbWV0ZXIiLCJLRVlfT0RPTUVURVIiLCJnZXRPZG9tZXRlciIsInNldEJlbHRTdGF0dXMiLCJzdGF0dXMiLCJLRVlfQkVMVF9TVEFUVVMiLCJnZXRCZWx0U3RhdHVzIiwic2V0Qm9keUluZm9ybWF0aW9uIiwiaW5mb3JtYXRpb24iLCJLRVlfQk9EWV9JTkZPUk1BVElPTiIsImdldEJvZHlJbmZvcm1hdGlvbiIsInNldERldmljZVN0YXR1cyIsIktFWV9ERVZJQ0VfU1RBVFVTIiwiZ2V0RGV2aWNlU3RhdHVzIiwic2V0RHJpdmVyQnJha2luZyIsImJyYWtpbmciLCJLRVlfRFJJVkVSX0JSQUtJTkciLCJnZXREcml2ZXJCcmFraW5nIiwic2V0V2lwZXJTdGF0dXMiLCJLRVlfV0lQRVJfU1RBVFVTIiwiZ2V0V2lwZXJTdGF0dXMiLCJzZXRIZWFkTGFtcFN0YXR1cyIsIktFWV9IRUFEX0xBTVBfU1RBVFVTIiwiZ2V0SGVhZExhbXBTdGF0dXMiLCJzZXRFbmdpbmVUb3JxdWUiLCJ0b3JxdWUiLCJLRVlfRU5HSU5FX1RPUlFVRSIsImdldEVuZ2luZVRvcnF1ZSIsInNldEFjY1BlZGFsUG9zaXRpb24iLCJLRVlfQUNDX1BFREFMX1BPU0lUSU9OIiwiZ2V0QWNjUGVkYWxQb3NpdGlvbiIsInNldFN0ZWVyaW5nV2hlZWxBbmdsZSIsImFuZ2xlIiwiS0VZX1NURUVSSU5HX1dIRUVMX0FOR0xFIiwiZ2V0U3RlZXJpbmdXaGVlbEFuZ2xlIiwic2V0RW5naW5lT2lsTGlmZSIsImxpZmUiLCJLRVlfRU5HSU5FX09JTF9MSUZFIiwiZ2V0RW5naW5lT2lsTGlmZSIsInNldEVsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMiLCJLRVlfRUxFQ1RST05JQ19QQVJLX0JSQUtFX1NUQVRVUyIsImdldEVsZWN0cm9uaWNQYXJrQnJha2VTdGF0dXMiLCJzZXRDbG91ZEFwcFZlaGljbGVJRCIsIktFWV9DTE9VRF9BUFBfVkVISUNMRV9JRCIsImdldENsb3VkQXBwVmVoaWNsZUlEIiwic2V0RUNhbGxJbmZvIiwiS0VZX0VfQ0FMTF9JTkZPIiwiZ2V0RUNhbGxJbmZvIiwic2V0QWlyYmFnU3RhdHVzIiwiS0VZX0FJUkJBR19TVEFUVVMiLCJnZXRBaXJiYWdTdGF0dXMiLCJzZXRFbWVyZ2VuY3lFdmVudCIsImV2ZW50IiwiS0VZX0VNRVJHRU5DWV9FVkVOVCIsImdldEVtZXJnZW5jeUV2ZW50Iiwic2V0Q2x1c3Rlck1vZGVTdGF0dXMiLCJLRVlfQ0xVU1RFUl9NT0RFX1NUQVRVUyIsImdldENsdXN0ZXJNb2RlU3RhdHVzIiwic2V0TXlLZXkiLCJLRVlfTVlfS0VZIiwiZ2V0TXlLZXkiLCJWZWhpY2xlRGF0YVJlc3VsdENvZGUiLCJWRFJDX1NVQ0NFU1MiLCJWRFJDX1RSVU5DQVRFRF9EQVRBIiwiVkRSQ19ESVNBTExPV0VEIiwiVkRSQ19VU0VSX0RJU0FMTE9XRUQiLCJWRFJDX0lOVkFMSURfSUQiLCJWRFJDX0RBVEFfTk9UX0FWQUlMQUJMRSIsIlZEUkNfREFUQV9BTFJFQURZX1NVQlNDUklCRUQiLCJWRFJDX0RBVEFfTk9UX1NVQlNDUklCRUQiLCJWRFJDX0lHTk9SRUQiLCJWZWhpY2xlRGF0YVR5cGUiLCJWRUhJQ0xFREFUQV9HUFMiLCJWRUhJQ0xFREFUQV9TUEVFRCIsIlZFSElDTEVEQVRBX1JQTSIsIlZFSElDTEVEQVRBX0ZVRUxMRVZFTCIsIlZFSElDTEVEQVRBX0ZVRUxMRVZFTF9TVEFURSIsIlZFSElDTEVEQVRBX0ZVRUxDT05TVU1QVElPTiIsIlZFSElDTEVEQVRBX0VYVEVSTlRFTVAiLCJWRUhJQ0xFREFUQV9WSU4iLCJWRUhJQ0xFREFUQV9QUk5ETCIsIlZFSElDTEVEQVRBX1RJUkVQUkVTU1VSRSIsIlZFSElDTEVEQVRBX09ET01FVEVSIiwiVkVISUNMRURBVEFfQkVMVFNUQVRVUyIsIlZFSElDTEVEQVRBX0JPRFlJTkZPIiwiVkVISUNMRURBVEFfREVWSUNFU1RBVFVTIiwiVkVISUNMRURBVEFfRUNBTExJTkZPIiwiVkVISUNMRURBVEFfQUlSQkFHU1RBVFVTIiwiVkVISUNMRURBVEFfRU1FUkdFTkNZRVZFTlQiLCJWRUhJQ0xFREFUQV9DTFVTVEVSTU9ERVNUQVRVUyIsIlZFSElDTEVEQVRBX01ZS0VZIiwiVkVISUNMRURBVEFfQlJBS0lORyIsIlZFSElDTEVEQVRBX1dJUEVSU1RBVFVTIiwiVkVISUNMRURBVEFfSEVBRExBTVBTVEFUVVMiLCJWRUhJQ0xFREFUQV9CQVRUVk9MVEFHRSIsIlZFSElDTEVEQVRBX0VOR0lORVRPUlFVRSIsIlZFSElDTEVEQVRBX0FDQ1BFREFMIiwiVkVISUNMRURBVEFfU1RFRVJJTkdXSEVFTCIsIlZFSElDTEVEQVRBX1RVUk5TSUdOQUwiLCJWRUhJQ0xFREFUQV9GVUVMUkFOR0UiLCJWRUhJQ0xFREFUQV9FTkdJTkVPSUxMSUZFIiwiVkVISUNMRURBVEFfRUxFQ1RST05JQ1BBUktCUkFLRVNUQVRVUyIsIlZFSElDTEVEQVRBX0NMT1VEQVBQVkVISUNMRUlEIiwiVkVISUNMRURBVEFfT0VNX0NVU1RPTV9EQVRBIiwiVmVoaWNsZURhdGFSZXN1bHQiLCJzZXREYXRhVHlwZSIsIktFWV9EQVRBX1RZUEUiLCJnZXREYXRhVHlwZSIsInNldE9lbUN1c3RvbURhdGFUeXBlIiwiS0VZX09FTV9DVVNUT01fREFUQV9UWVBFIiwiZ2V0T2VtQ3VzdG9tRGF0YVR5cGUiLCJTdWJzY3JpYmVWZWhpY2xlRGF0YVJlc3BvbnNlIiwic2V0Q2x1c3Rlck1vZGVzIiwiS0VZX0NMVVNURVJfTU9ERVMiLCJnZXRDbHVzdGVyTW9kZXMiLCJVbnN1YnNjcmliZVZlaGljbGVEYXRhUmVzcG9uc2UiLCJzZXRWaW4iLCJ2aW4iLCJLRVlfVklOIiwiZ2V0VmluIiwiVmVoaWNsZURhdGFFdmVudFN0YXR1cyIsIlZERVNfTk9fRVZFTlQiLCJWREVTX05PIiwiVkRFU19ZRVMiLCJWREVTX05PVF9TVVBQT1JURUQiLCJWREVTX0ZBVUxUIiwiQWlyYmFnU3RhdHVzIiwic2V0RHJpdmVyQWlyYmFnRGVwbG95ZWQiLCJkZXBsb3llZCIsIktFWV9EUklWRVJfQUlSQkFHX0RFUExPWUVEIiwiZ2V0RHJpdmVyQWlyYmFnRGVwbG95ZWQiLCJzZXREcml2ZXJTaWRlQWlyYmFnRGVwbG95ZWQiLCJLRVlfRFJJVkVSX1NJREVfQUlSQkFHX0RFUExPWUVEIiwiZ2V0RHJpdmVyU2lkZUFpcmJhZ0RlcGxveWVkIiwic2V0RHJpdmVyQ3VydGFpbkFpcmJhZ0RlcGxveWVkIiwiS0VZX0RSSVZFUl9DVVJUQUlOX0FJUkJBR19ERVBMT1lFRCIsImdldERyaXZlckN1cnRhaW5BaXJiYWdEZXBsb3llZCIsInNldFBhc3NlbmdlckFpcmJhZ0RlcGxveWVkIiwiS0VZX1BBU1NFTkdFUl9BSVJCQUdfREVQTE9ZRUQiLCJnZXRQYXNzZW5nZXJBaXJiYWdEZXBsb3llZCIsInNldFBhc3NlbmdlckN1cnRhaW5BaXJiYWdEZXBsb3llZCIsIktFWV9QQVNTRU5HRVJfQ1VSVEFJTl9BSVJCQUdfREVQTE9ZRUQiLCJnZXRQYXNzZW5nZXJDdXJ0YWluQWlyYmFnRGVwbG95ZWQiLCJzZXREcml2ZXJLbmVlQWlyYmFnRGVwbG95ZWQiLCJLRVlfRFJJVkVSX0tORUVfQUlSQkFHX0RFUExPWUVEIiwiZ2V0RHJpdmVyS25lZUFpcmJhZ0RlcGxveWVkIiwic2V0UGFzc2VuZ2VyU2lkZUFpcmJhZ0RlcGxveWVkIiwiS0VZX1BBU1NFTkdFUl9TSURFX0FJUkJBR19ERVBMT1lFRCIsImdldFBhc3NlbmdlclNpZGVBaXJiYWdEZXBsb3llZCIsInNldFBhc3NlbmdlcktuZWVBaXJiYWdEZXBsb3llZCIsIktFWV9QQVNTRU5HRVJfS05FRV9BSVJCQUdfREVQTE9ZRUQiLCJnZXRQYXNzZW5nZXJLbmVlQWlyYmFnRGVwbG95ZWQiLCJQb3dlck1vZGVTdGF0dXMiLCJLRVlfT1VUIiwiS0VZX1JFQ0VOVExZX09VVCIsIktFWV9BUFBST1ZFRF8wIiwiUE9TVF9BQ0NFU09SWV8wIiwiQUNDRVNPUllfMSIsIlBPU1RfSUdOSVRJT05fMSIsIklHTklUSU9OX09OXzIiLCJSVU5OSU5HXzIiLCJDUkFOS18zIiwiQ2FyTW9kZVN0YXR1cyIsIkNNU19OT1JNQUwiLCJDTVNfRkFDVE9SWSIsIkNNU19UUkFOU1BPUlQiLCJDTVNfQ1JBU0giLCJQb3dlck1vZGVRdWFsaWZpY2F0aW9uU3RhdHVzIiwiUE9XRVJfTU9ERV9VTkRFRklORUQiLCJQT1dFUl9NT0RFX0VWQUxVQVRJT05fSU5fUFJPR1JFU1MiLCJOT1RfREVGSU5FRCIsIlBPV0VSX01PREVfT0siLCJDbHVzdGVyTW9kZVN0YXR1cyIsInNldFBvd2VyTW9kZUFjdGl2ZSIsImFjdGl2ZSIsIktFWV9QT1dFUl9NT0RFX0FDVElWRSIsImdldFBvd2VyTW9kZUFjdGl2ZSIsInNldFBvd2VyTW9kZVF1YWxpZmljYXRpb25TdGF0dXMiLCJLRVlfUE9XRVJfTU9ERV9RVUFMSUZJQ0FUSU9OX1NUQVRVUyIsImdldFBvd2VyTW9kZVF1YWxpZmljYXRpb25TdGF0dXMiLCJzZXRDYXJNb2RlU3RhdHVzIiwiS0VZX0NBUl9NT0RFX1NUQVRVUyIsImdldENhck1vZGVTdGF0dXMiLCJzZXRQb3dlck1vZGVTdGF0dXMiLCJLRVlfUE9XRVJfTU9ERV9TVEFUVVMiLCJnZXRQb3dlck1vZGVTdGF0dXMiLCJGdWVsQ3V0b2ZmU3RhdHVzIiwiRkNTX1RFUk1JTkFURV9GVUVMIiwiRkNTX05PUk1BTF9PUEVSQVRJT04iLCJGQ1NfRkFVTFQiLCJFbWVyZ2VuY3lFdmVudFR5cGUiLCJFRVRfTk9fRVZFTlQiLCJFRVRfRlJPTlRBTCIsIkVFVF9TSURFIiwiRUVUX1JFQVIiLCJFRVRfUk9MTE9WRVIiLCJFRVRfTk9UX1NVUFBPUlRFRCIsIkVFVF9GQVVMVCIsIkVtZXJnZW5jeUV2ZW50Iiwic2V0RW1lcmdlbmN5RXZlbnRUeXBlIiwiS0VZX0VNRVJHRU5DWV9FVkVOVF9UWVBFIiwiZ2V0RW1lcmdlbmN5RXZlbnRUeXBlIiwic2V0RnVlbEN1dG9mZlN0YXR1cyIsIktFWV9GVUVMX0NVVE9GRl9TVEFUVVMiLCJnZXRGdWVsQ3V0b2ZmU3RhdHVzIiwic2V0Um9sbG92ZXJFdmVudCIsIktFWV9ST0xMT1ZFUl9FVkVOVCIsImdldFJvbGxvdmVyRXZlbnQiLCJzZXRNYXhpbXVtQ2hhbmdlVmVsb2NpdHkiLCJ2ZWxvY2l0eSIsIktFWV9NQVhJTVVNX0NIQU5HRV9WRUxPQ0lUWSIsImdldE1heGltdW1DaGFuZ2VWZWxvY2l0eSIsInNldE11bHRpcGxlRXZlbnRzIiwiZXZlbnRzIiwiS0VZX01VTFRJUExFX0VWRU5UUyIsImdldE11bHRpcGxlRXZlbnRzIiwiVHVyblNpZ25hbCIsIk9GRiIsIkxFRlQiLCJSSUdIVCIsIkFtYmllbnRMaWdodFN0YXR1cyIsIk5JR0hUIiwiVFdJTElHSFRfMSIsIlRXSUxJR0hUXzIiLCJUV0lMSUdIVF8zIiwiVFdJTElHSFRfNCIsIkRBWSIsIkFMU19VTktOT1dOIiwiSU5WQUxJRCIsIkhlYWRMYW1wU3RhdHVzIiwic2V0TG93QmVhbXNPbiIsIm9uIiwiS0VZX0xPV19CRUFNU19PTiIsImdldExvd0JlYW1zT24iLCJzZXRIaWdoQmVhbXNPbiIsIktFWV9ISUdIX0JFQU1TX09OIiwiZ2V0SGlnaEJlYW1zT24iLCJzZXRBbWJpZW50TGlnaHRTZW5zb3JTdGF0dXMiLCJLRVlfQU1CSUVOVF9MSUdIVF9TRU5TT1JfU1RBVFVTIiwiZ2V0QW1iaWVudExpZ2h0U2Vuc29yU3RhdHVzIiwiUHJpbWFyeUF1ZGlvU291cmNlIiwiTk9fU09VUkNFX1NFTEVDVEVEIiwiQ0QiLCJVU0IiLCJVU0IyIiwiQkxVRVRPT1RIX1NURVJFT19CVFNUIiwiTElORV9JTiIsIklQT0QiLCJNT0JJTEVfQVBQIiwiQU0iLCJGTSIsIlhNIiwiREFCIiwiRGV2aWNlTGV2ZWxTdGF0dXMiLCJaRVJPX0xFVkVMX0JBUlMiLCJPTkVfTEVWRUxfQkFSUyIsIlRXT19MRVZFTF9CQVJTIiwiVEhSRUVfTEVWRUxfQkFSUyIsIkZPVVJfTEVWRUxfQkFSUyIsIk5PVF9QUk9WSURFRCIsIkRldmljZVN0YXR1cyIsInNldFZvaWNlUmVjT24iLCJLRVlfVk9JQ0VfUkVDX09OIiwiZ2V0Vm9pY2VSZWNPbiIsInNldEJ0SWNvbk9uIiwiS0VZX0JUX0lDT05fT04iLCJnZXRCdEljb25PbiIsInNldENhbGxBY3RpdmUiLCJLRVlfQ0FMTF9BQ1RJVkUiLCJnZXRDYWxsQWN0aXZlIiwic2V0UGhvbmVSb2FtaW5nIiwicm9hbWluZyIsIktFWV9QSE9ORV9ST0FNSU5HIiwiZ2V0UGhvbmVSb2FtaW5nIiwic2V0VGV4dE1zZ0F2YWlsYWJsZSIsIktFWV9URVhUX01TR19BVkFJTEFCTEUiLCJnZXRUZXh0TXNnQXZhaWxhYmxlIiwic2V0QmF0dExldmVsU3RhdHVzIiwiS0VZX0JBVFRfTEVWRUxfU1RBVFVTIiwiZ2V0QmF0dExldmVsU3RhdHVzIiwic2V0U3RlcmVvQXVkaW9PdXRwdXRNdXRlZCIsIm11dGVkIiwiS0VZX1NURVJFT19BVURJT19PVVRQVVRfTVVURUQiLCJnZXRTdGVyZW9BdWRpb091dHB1dE11dGVkIiwic2V0TW9ub0F1ZGlvT3V0cHV0TXV0ZWQiLCJLRVlfTU9OT19BVURJT19PVVRQVVRfTVVURUQiLCJnZXRNb25vQXVkaW9PdXRwdXRNdXRlZCIsInNldFNpZ25hbExldmVsU3RhdHVzIiwiS0VZX1NJR05BTF9MRVZFTF9TVEFUVVMiLCJnZXRTaWduYWxMZXZlbFN0YXR1cyIsInNldFByaW1hcnlBdWRpb1NvdXJjZSIsIktFWV9QUklNQVJZX0FVRElPX1NPVVJDRSIsImdldFByaW1hcnlBdWRpb1NvdXJjZSIsInNldEVDYWxsRXZlbnRBY3RpdmUiLCJLRVlfRV9DQUxMX0VWRU5UX0FDVElWRSIsImdldEVDYWxsRXZlbnRBY3RpdmUiLCJXaXBlclN0YXR1cyIsIkFVVE9fT0ZGIiwiT0ZGX01PVklORyIsIk1BTl9JTlRfT0ZGIiwiTUFOX0lOVF9PTiIsIk1BTl9MT1ciLCJNQU5fSElHSCIsIk1BTl9GTElDSyIsIldBU0giLCJBVVRPX0xPVyIsIkFVVE9fSElHSCIsIkNPVVJURVNZV0lQRSIsIkFVVE9fQURKVVNUIiwiU1RBTExFRCIsIk5PX0RBVEFfRVhJU1RTIiwiRWxlY3Ryb25pY1BhcmtCcmFrZVN0YXR1cyIsIkNMT1NFRCIsIlRSQU5TSVRJT04iLCJPUEVOIiwiRFJJVkVfQUNUSVZFIiwiRkFVTFQiLCJWZWhpY2xlRGF0YVN0YXR1cyIsIlZEU19OT19EQVRBX0VYSVNUUyIsIlZEU19PRkYiLCJWRFNfT04iLCJNeUtleSIsInNldEU5MTFPdmVycmlkZSIsImU5MTFvdmVycmlkZSIsIktFWV9FOTExT1ZFUlJJREUiLCJnZXRFOTExT3ZlcnJpZGUiLCJDb21wYXNzRGlyZWN0aW9uIiwiTk9SVEgiLCJOT1JUSFdFU1QiLCJXRVNUIiwiU09VVEhXRVNUIiwiU09VVEgiLCJTT1VUSEVBU1QiLCJFQVNUIiwiTk9SVEhFQVNUIiwiRGltZW5zaW9uIiwiRGltZW5zaW9uX05PX0ZJWCIsIkRpbWVuc2lvbl8yRCIsIkRpbWVuc2lvbl8zRCIsIkdQU0RhdGEiLCJzZXRMb25naXR1ZGVEZWdyZWVzIiwiZGVncmVlcyIsIktFWV9MT05HSVRVREVfREVHUkVFUyIsImdldExvbmdpdHVkZURlZ3JlZXMiLCJzZXRMYXRpdHVkZURlZ3JlZXMiLCJLRVlfTEFUSVRVREVfREVHUkVFUyIsImdldExhdGl0dWRlRGVncmVlcyIsInNldFV0Y1llYXIiLCJLRVlfVVRDX1lFQVIiLCJnZXRVdGNZZWFyIiwic2V0VXRjTW9udGgiLCJtb250aCIsIktFWV9VVENfTU9OVEgiLCJnZXRVdGNNb250aCIsInNldFV0Y0RheSIsImRheSIsIktFWV9VVENfREFZIiwiZ2V0VXRjRGF5Iiwic2V0VXRjSG91cnMiLCJLRVlfVVRDX0hPVVJTIiwiZ2V0VXRjSG91cnMiLCJzZXRVdGNNaW51dGVzIiwiS0VZX1VUQ19NSU5VVEVTIiwiZ2V0VXRjTWludXRlcyIsInNldFV0Y1NlY29uZHMiLCJLRVlfVVRDX1NFQ09ORFMiLCJnZXRVdGNTZWNvbmRzIiwic2V0Q29tcGFzc0RpcmVjdGlvbiIsImRpcmVjdGlvbiIsIktFWV9DT01QQVNTX0RJUkVDVElPTiIsImdldENvbXBhc3NEaXJlY3Rpb24iLCJzZXRQZG9wIiwicGRvcCIsIktFWV9QRE9QIiwiZ2V0UGRvcCIsInNldEhkb3AiLCJoZG9wIiwiS0VZX0hET1AiLCJnZXRIZG9wIiwic2V0VmRvcCIsInZkb3AiLCJLRVlfVkRPUCIsImdldFZkb3AiLCJzZXRBY3R1YWwiLCJLRVlfQUNUVUFMIiwiZ2V0QWN0dWFsIiwic2V0U2F0ZWxsaXRlcyIsInNhdGVsbGl0ZXMiLCJLRVlfU0FURUxMSVRFUyIsImdldFNhdGVsbGl0ZXMiLCJzZXREaW1lbnNpb24iLCJkaW1lbnNpb24iLCJLRVlfRElNRU5TSU9OIiwiZ2V0RGltZW5zaW9uIiwic2V0QWx0aXR1ZGUiLCJhbHRpdHVkZSIsIktFWV9BTFRJVFVERSIsImdldEFsdGl0dWRlIiwic2V0SGVhZGluZyIsImhlYWRpbmciLCJLRVlfSEVBRElORyIsImdldEhlYWRpbmciLCJzZXRTaGlmdGVkIiwic2hpZnRlZCIsIktFWV9TSElGVEVEIiwiZ2V0U2hpZnRlZCIsIlBSTkRMIiwiUEFSSyIsIlJFVkVSU0UiLCJORVVUUkFMIiwiRFJJVkUiLCJTUE9SVCIsIkxPV0dFQVIiLCJTRUNPTkQiLCJUSElSRCIsIkZPVVJUSCIsIkZJRlRIIiwiU0lYVEgiLCJTRVZFTlRIIiwiRUlHSFRIIiwiVU5LTk9XTiIsIkZ1ZWxUeXBlIiwiR0FTT0xJTkUiLCJESUVTRUwiLCJDTkciLCJMUEciLCJIWURST0dFTiIsIkJBVFRFUlkiLCJGdWVsUmFuZ2UiLCJzZXRSYW5nZSIsIktFWV9SQU5HRSIsImdldFJhbmdlIiwiVmVoaWNsZURhdGFOb3RpZmljYXRpb25TdGF0dXMiLCJWRE5TX05PVF9TVVBQT1JURUQiLCJWRE5TX05PUk1BTCIsIlZETlNfQUNUSVZFIiwiVkROU19OT1RfVVNFRCIsIkVDYWxsQ29uZmlybWF0aW9uU3RhdHVzIiwiRUNDU19OT1JNQUwiLCJFQ0NTX0NBTExfSU5fUFJPR1JFU1MiLCJFQ0NTX0NBTExfQ0FOQ0VMTEVEIiwiQ0FMTF9DT01QTEVURUQiLCJFQ0NTX0NBTExfVU5TVUNDRVNTRlVMIiwiRUNDU19FQ0FMTF9DT05GSUdVUkVEX09GRiIsIkVDQ1NfQ0FMTF9DT01QTEVURV9EVE1GX1RJTUVPVVQiLCJFQ2FsbEluZm8iLCJzZXRFQ2FsbE5vdGlmaWNhdGlvblN0YXR1cyIsIktFWV9FX0NBTExfTk9USUZJQ0FUSU9OX1NUQVRVUyIsImdldEVDYWxsTm90aWZpY2F0aW9uU3RhdHVzIiwic2V0QXV4RUNhbGxOb3RpZmljYXRpb25TdGF0dXMiLCJLRVlfQVVYX0VDQUxMX05PVElGSUNBVElPTl9TVEFUVVMiLCJnZXRBdXhFQ2FsbE5vdGlmaWNhdGlvblN0YXR1cyIsInNldEVDYWxsQ29uZmlybWF0aW9uU3RhdHVzIiwiS0VZX0VfQ0FMTF9DT05GSVJNQVRJT05fU1RBVFVTIiwiZ2V0RUNhbGxDb25maXJtYXRpb25TdGF0dXMiLCJCZWx0U3RhdHVzIiwic2V0RHJpdmVyQmVsdERlcGxveWVkIiwiS0VZX0RSSVZFUl9CRUxUX0RFUExPWUVEIiwiZ2V0RHJpdmVyQmVsdERlcGxveWVkIiwic2V0UGFzc2VuZ2VyQmVsdERlcGxveWVkIiwiS0VZX1BBU1NFTkdFUl9CRUxUX0RFUExPWUVEIiwiZ2V0UGFzc2VuZ2VyQmVsdERlcGxveWVkIiwic2V0UGFzc2VuZ2VyQnVja2xlQmVsdGVkIiwiYmVsdGVkIiwiS0VZX1BBU1NFTkdFUl9CVUNLTEVfQkVMVEVEIiwiZ2V0UGFzc2VuZ2VyQnVja2xlQmVsdGVkIiwic2V0RHJpdmVyQnVja2xlQmVsdGVkIiwiS0VZX0RSSVZFUl9CVUNLTEVfQkVMVEVEIiwiZ2V0RHJpdmVyQnVja2xlQmVsdGVkIiwic2V0TGVmdFJvdzJCdWNrbGVCZWx0ZWQiLCJLRVlfTEVGVF9ST1cyQlVDS0xFX0JFTFRFRCIsImdldExlZnRSb3cyQnVja2xlQmVsdGVkIiwic2V0UGFzc2VuZ2VyQ2hpbGREZXRlY3RlZCIsImRldGVjdGVkIiwiS0VZX1BBU1NFTkdFUl9DSElMRF9ERVRFQ1RFRCIsImdldFBhc3NlbmdlckNoaWxkRGV0ZWN0ZWQiLCJzZXRSaWdodFJvdzJCdWNrbGVCZWx0ZWQiLCJLRVlfUklHSFRfUk9XMkJVQ0tMRV9CRUxURUQiLCJnZXRSaWdodFJvdzJCdWNrbGVCZWx0ZWQiLCJzZXRNaWRkbGVSb3cyQnVja2xlQmVsdGVkIiwiS0VZX01JRERMRV9ST1cyQlVDS0xFX0JFTFRFRCIsImdldE1pZGRsZVJvdzJCdWNrbGVCZWx0ZWQiLCJzZXRNaWRkbGVSb3czQnVja2xlQmVsdGVkIiwiS0VZX01JRERMRV9ST1czQlVDS0xFX0JFTFRFRCIsImdldE1pZGRsZVJvdzNCdWNrbGVCZWx0ZWQiLCJzZXRMZWZ0Um93M0J1Y2tsZUJlbHRlZCIsIktFWV9MRUZUX1JPVzNCVUNLTEVfQkVMVEVEIiwiZ2V0TGVmdFJvdzNCdWNrbGVCZWx0ZWQiLCJzZXRSaWdodFJvdzNCdWNrbGVCZWx0ZWQiLCJLRVlfUklHSFRfUk9XM0JVQ0tMRV9CRUxURUQiLCJnZXRSaWdodFJvdzNCdWNrbGVCZWx0ZWQiLCJzZXRMZWZ0UmVhckluZmxhdGFibGVCZWx0ZWQiLCJLRVlfTEVGVF9SRUFSX0lORkxBVEFCTEVfQkVMVEVEIiwiZ2V0TGVmdFJlYXJJbmZsYXRhYmxlQmVsdGVkIiwic2V0UmlnaHRSZWFySW5mbGF0YWJsZUJlbHRlZCIsIktFWV9SSUdIVF9SRUFSX0lORkxBVEFCTEVfQkVMVEVEIiwiZ2V0UmlnaHRSZWFySW5mbGF0YWJsZUJlbHRlZCIsInNldE1pZGRsZVJvdzFCZWx0RGVwbG95ZWQiLCJLRVlfTUlERExFX1JPVzFCRUxUX0RFUExPWUVEIiwiZ2V0TWlkZGxlUm93MUJlbHREZXBsb3llZCIsInNldE1pZGRsZVJvdzFCdWNrbGVCZWx0ZWQiLCJLRVlfTUlERExFX1JPVzFCVUNLTEVfQkVMVEVEIiwiZ2V0TWlkZGxlUm93MUJ1Y2tsZUJlbHRlZCIsIkNvbXBvbmVudFZvbHVtZVN0YXR1cyIsIkNWU19VTktOT1dOIiwiQ1ZTX05PUk1BTCIsIkNWU19MT1ciLCJDVlNfRkFVTFQiLCJDVlNfQUxFUlQiLCJDVlNfTk9UX1NVUFBPUlRFRCIsIklnbml0aW9uU3RhdHVzIiwiSVNfVU5LTk9XTiIsIklTX09GRiIsIklTX0FDQ0VTU09SWSIsIklTX1JVTiIsIklTX1NUQVJUIiwiSVNfSU5WQUxJRCIsIklnbml0aW9uU3RhYmxlU3RhdHVzIiwiSUdOSVRJT05fU1dJVENIX05PVF9TVEFCTEUiLCJJR05JVElPTl9TV0lUQ0hfU1RBQkxFIiwiTUlTU0lOR19GUk9NX1RSQU5TTUlUVEVSIiwiQm9keUluZm9ybWF0aW9uIiwic2V0UGFya0JyYWtlQWN0aXZlIiwiS0VZX1BBUktfQlJBS0VfQUNUSVZFIiwiZ2V0UGFya0JyYWtlQWN0aXZlIiwic2V0SWduaXRpb25TdGFibGVTdGF0dXMiLCJLRVlfSUdOSVRJT05fU1RBQkxFX1NUQVRVUyIsImdldElnbml0aW9uU3RhYmxlU3RhdHVzIiwic2V0SWduaXRpb25TdGF0dXMiLCJLRVlfSUdOSVRJT05fU1RBVFVTIiwiZ2V0SWduaXRpb25TdGF0dXMiLCJzZXREcml2ZXJEb29yQWphciIsImFqYXIiLCJLRVlfRFJJVkVSX0RPT1JfQUpBUiIsImdldERyaXZlckRvb3JBamFyIiwic2V0UGFzc2VuZ2VyRG9vckFqYXIiLCJLRVlfUEFTU0VOR0VSX0RPT1JfQUpBUiIsImdldFBhc3NlbmdlckRvb3JBamFyIiwic2V0UmVhckxlZnREb29yQWphciIsIktFWV9SRUFSX0xFRlRfRE9PUl9BSkFSIiwiZ2V0UmVhckxlZnREb29yQWphciIsInNldFJlYXJSaWdodERvb3JBamFyIiwiS0VZX1JFQVJfUklHSFRfRE9PUl9BSkFSIiwiZ2V0UmVhclJpZ2h0RG9vckFqYXIiLCJUUE1TIiwiU1lTVEVNX0ZBVUxUIiwiU0VOU09SX0ZBVUxUIiwiTE9XIiwiU1lTVEVNX0FDVElWRSIsIlRSQUlOIiwiVFJBSU5JTkdfQ09NUExFVEUiLCJOT1RfVFJBSU5FRCIsIlNpbmdsZVRpcmVTdGF0dXMiLCJzZXRTdGF0dXMiLCJLRVlfU1RBVFVTIiwiZ2V0U3RhdHVzIiwic2V0VHBtcyIsInRwbXMiLCJLRVlfVFBNUyIsImdldFRwbXMiLCJzZXRQcmVzc3VyZSIsIktFWV9QUkVTU1VSRSIsImdldFByZXNzdXJlIiwiV2FybmluZ0xpZ2h0U3RhdHVzIiwiV0xTX09GRiIsIldMU19PTiIsIldMU19GTEFTSCIsIldMU19OT1RfVVNFRCIsIlRpcmVTdGF0dXMiLCJzZXRQcmVzc3VyZVRlbGx0YWxlIiwidGVsbHRhbGUiLCJLRVlfUFJFU1NVUkVfVEVMTFRBTEUiLCJnZXRQcmVzc3VyZVRlbGx0YWxlIiwic2V0TGVmdEZyb250IiwiZnJvbnQiLCJLRVlfTEVGVF9GUk9OVCIsImdldExlZnRGcm9udCIsInNldFJpZ2h0RnJvbnQiLCJLRVlfUklHSFRfRlJPTlQiLCJnZXRSaWdodEZyb250Iiwic2V0TGVmdFJlYXIiLCJyZWFyIiwiS0VZX0xFRlRfUkVBUiIsImdldExlZnRSZWFyIiwic2V0UmlnaHRSZWFyIiwiS0VZX1JJR0hUX1JFQVIiLCJnZXRSaWdodFJlYXIiLCJzZXRJbm5lckxlZnRSZWFyIiwiS0VZX0lOTkVSX0xFRlRfUkVBUiIsImdldElubmVyTGVmdFJlYXIiLCJzZXRJbm5lclJpZ2h0UmVhciIsIktFWV9JTk5FUl9SSUdIVF9SRUFSIiwiZ2V0SW5uZXJSaWdodFJlYXIiLCJHZXRWZWhpY2xlRGF0YVJlc3BvbnNlIiwic2V0RWN1TmFtZSIsIktFWV9FQ1VfTkFNRSIsImdldEVjdU5hbWUiLCJzZXREaWRMb2NhdGlvbiIsIktFWV9ESURfTE9DQVRJT04iLCJnZXREaWRMb2NhdGlvbiIsIkRJRFJlc3VsdCIsInNldERhdGEiLCJLRVlfREFUQSIsImdldERhdGEiLCJSZWFkRElEUmVzcG9uc2UiLCJzZXREaWRSZXN1bHQiLCJLRVlfRElEX1JFU1VMVCIsImdldERpZFJlc3VsdCIsInNldER0Y01hc2siLCJtYXNrIiwiS0VZX0RUQ19NQVNLIiwiZ2V0RHRjTWFzayIsIkdldERUQ3NSZXNwb25zZSIsInNldEVjdUhlYWRlciIsIktFWV9FQ1VfSEVBREVSIiwiZ2V0RWN1SGVhZGVyIiwic2V0RHRjIiwiZHRjIiwiS0VZX0RUQyIsImdldER0YyIsInNldFRhcmdldElEIiwiS0VZX1RBUkdFVF9JRCIsImdldFRhcmdldElEIiwic2V0TWVzc2FnZUxlbmd0aCIsIktFWV9NRVNTQUdFX0xFTkdUSCIsImdldE1lc3NhZ2VMZW5ndGgiLCJzZXRNZXNzYWdlRGF0YSIsIktFWV9NRVNTQUdFX0RBVEEiLCJnZXRNZXNzYWdlRGF0YSIsIkRpYWdub3N0aWNNZXNzYWdlUmVzcG9uc2UiLCJzZXRNZXNzYWdlRGF0YVJlc3VsdCIsIktFWV9NRVNTQUdFX0RBVEFfUkVTVUxUIiwiZ2V0TWVzc2FnZURhdGFSZXN1bHQiLCJzZXRTY3JvbGxhYmxlTWVzc2FnZUJvZHkiLCJib2R5IiwiS0VZX1NDUk9MTEFCTEVfTUVTU0FHRV9CT0RZIiwiZ2V0U2Nyb2xsYWJsZU1lc3NhZ2VCb2R5IiwiU2Nyb2xsYWJsZU1lc3NhZ2VSZXNwb25zZSIsInNldE51bVRpY2tzIiwidGlja3MiLCJLRVlfTlVNX1RJQ0tTIiwiZ2V0TnVtVGlja3MiLCJzZXRTbGlkZXJIZWFkZXIiLCJLRVlfU0xJREVSX0hFQURFUiIsImdldFNsaWRlckhlYWRlciIsInNldFNsaWRlckZvb3RlciIsImZvb3RlciIsIktFWV9TTElERVJfRk9PVEVSIiwiZ2V0U2xpZGVyRm9vdGVyIiwiU2xpZGVyUmVzcG9uc2UiLCJzZXRTbGlkZXJQb3NpdGlvbiIsIktFWV9TTElERVJfUE9TSVRJT04iLCJnZXRTbGlkZXJQb3NpdGlvbiIsInNldE5hdmlnYXRpb25UZXh0MSIsIktFWV9OQVZJR0FUSU9OX1RFWFRfMSIsImdldE5hdmlnYXRpb25UZXh0MSIsInNldE5hdmlnYXRpb25UZXh0MiIsIktFWV9OQVZJR0FUSU9OX1RFWFRfMiIsImdldE5hdmlnYXRpb25UZXh0MiIsInNldEV0YSIsImV0YSIsIktFWV9FVEEiLCJnZXRFdGEiLCJzZXRUaW1lVG9EZXN0aW5hdGlvbiIsImRlc3RpbmF0aW9uIiwiS0VZX1RJTUVfVE9fREVTVElOQVRJT04iLCJnZXRUaW1lVG9EZXN0aW5hdGlvbiIsInNldFRvdGFsRGlzdGFuY2UiLCJkaXN0YW5jZSIsIktFWV9UT1RBTF9ESVNUQU5DRSIsImdldFRvdGFsRGlzdGFuY2UiLCJzZXRUdXJuSWNvbiIsIktFWV9UVVJOX0lDT04iLCJnZXRUdXJuSWNvbiIsInNldE5leHRUdXJuSWNvbiIsIktFWV9ORVhUX1RVUk5fSUNPTiIsImdldE5leHRUdXJuSWNvbiIsInNldERpc3RhbmNlVG9NYW5ldXZlciIsIm1hbmV1dmVyIiwiS0VZX0RJU1RBTkNFX1RPX01BTkVVVkVSIiwiZ2V0RGlzdGFuY2VUb01hbmV1dmVyIiwic2V0RGlzdGFuY2VUb01hbmV1dmVyU2NhbGUiLCJzY2FsZSIsIktFWV9ESVNUQU5DRV9UT19NQU5FVVZFUl9TQ0FMRSIsImdldERpc3RhbmNlVG9NYW5ldXZlclNjYWxlIiwic2V0TWFuZXV2ZXJDb21wbGV0ZSIsImNvbXBsZXRlIiwiS0VZX01BTkVVVkVSX0NPTVBMRVRFIiwiZ2V0TWFuZXV2ZXJDb21wbGV0ZSIsIlNob3dDb25zdGFudFRCVFJlc3BvbnNlIiwiQWxlcnRNYW5ldXZlclJlc3BvbnNlIiwiVHVybiIsInNldE5hdmlnYXRpb25UZXh0IiwiS0VZX05BVklHQVRJT05fVEVYVCIsImdldE5hdmlnYXRpb25UZXh0Iiwic2V0VHVybkxpc3QiLCJLRVlfVFVSTl9MSVNUIiwiZ2V0VHVybkxpc3QiLCJVcGRhdGVUdXJuTGlzdFJlc3BvbnNlIiwiQ2hhbmdlUmVnaXN0cmF0aW9uUmVzcG9uc2UiLCJHZW5lcmljUmVzcG9uc2VSZXNwb25zZSIsInNldEZpbGVEYXRhIiwiZ2V0RmlsZURhdGEiLCJzZXRGaWxlTmFtZSIsIktFWV9GSUxFX05BTUUiLCJnZXRGaWxlTmFtZSIsInNldEZpbGVUeXBlIiwiS0VZX0ZJTEVfVFlQRSIsImdldEZpbGVUeXBlIiwic2V0UGVyc2lzdGVudEZpbGUiLCJmaWxlIiwiS0VZX1BFUlNJU1RFTlRfRklMRSIsImdldFBlcnNpc3RlbnRGaWxlIiwic2V0U3lzdGVtRmlsZSIsIktFWV9TWVNURU1fRklMRSIsImdldFN5c3RlbUZpbGUiLCJzZXRPZmZzZXQiLCJLRVlfT0ZGU0VUIiwiZ2V0T2Zmc2V0Iiwic2V0TGVuZ3RoIiwiS0VZX0xFTkdUSCIsImdldExlbmd0aCIsInNldENyYyIsImNyYyIsIktFWV9DUkMiLCJnZXRDcmMiLCJQdXRGaWxlUmVzcG9uc2UiLCJzZXRTcGFjZUF2YWlsYWJsZSIsIktFWV9TUEFDRV9BVkFJTEFCTEUiLCJnZXRTcGFjZUF2YWlsYWJsZSIsInNldEFwcFNlcnZpY2VJZCIsIktFWV9BUFBfU0VSVklDRV9JRCIsImdldEFwcFNlcnZpY2VJZCIsIkdldEZpbGVSZXNwb25zZSIsInNldFNkbEZpbGVOYW1lIiwiS0VZX1NETF9GSUxFX05BTUUiLCJnZXRTZGxGaWxlTmFtZSIsIkRlbGV0ZUZpbGVSZXNwb25zZSIsIkxpc3RGaWxlc1Jlc3BvbnNlIiwic2V0RmlsZW5hbWVzIiwiZmlsZW5hbWVzIiwiS0VZX0ZJTEVOQU1FUyIsImdldEZpbGVuYW1lcyIsIlNldEFwcEljb25SZXNwb25zZSIsInNldERpc3BsYXlMYXlvdXQiLCJLRVlfRElTUExBWV9MQVlPVVQiLCJnZXREaXNwbGF5TGF5b3V0IiwiU2V0RGlzcGxheUxheW91dFJlc3BvbnNlIiwiUmVxdWVzdFR5cGUiLCJIVFRQIiwiRklMRV9SRVNVTUUiLCJBVVRIX1JFUVVFU1QiLCJBVVRIX0NIQUxMRU5HRSIsIkFVVEhfQUNLIiwiUFJPUFJJRVRBUlkiLCJRVUVSWV9BUFBTIiwiTEFVTkNIX0FQUCIsIkxPQ0tfU0NSRUVOX0lDT05fVVJMIiwiVFJBRkZJQ19NRVNTQUdFX0NIQU5ORUwiLCJEUklWRVJfUFJPRklMRSIsIlZPSUNFX1NFQVJDSCIsIlBIT05FIiwiQ0xJTUFURSIsIlNFVFRJTkdTIiwiVkVISUNMRV9ESUFHTk9TVElDUyIsIkVNRVJHRU5DWSIsIkZPVEEiLCJPRU1fU1BFQ0lGSUMiLCJJQ09OX1VSTCIsInNldFJlcXVlc3RUeXBlIiwiS0VZX1JFUVVFU1RfVFlQRSIsImdldFJlcXVlc3RUeXBlIiwic2V0UmVxdWVzdFN1YlR5cGUiLCJLRVlfUkVRVUVTVF9TVUJfVFlQRSIsImdldFJlcXVlc3RTdWJUeXBlIiwiU3lzdGVtUmVxdWVzdFJlc3BvbnNlIiwiRGVsaXZlcnlNb2RlIiwiUFJPTVBUIiwiREVTVElOQVRJT04iLCJRVUVVRSIsIkRhdGVUaW1lIiwic2V0TWlsbGlzZWNvbmQiLCJtaWxsaXNlY29uZCIsIktFWV9NSUxMSVNFQ09ORCIsImdldE1pbGxpc2Vjb25kIiwic2V0U2Vjb25kIiwic2Vjb25kIiwiS0VZX1NFQ09ORCIsImdldFNlY29uZCIsInNldE1pbnV0ZSIsIm1pbnV0ZSIsIktFWV9NSU5VVEUiLCJnZXRNaW51dGUiLCJzZXRIb3VyIiwiaG91ciIsIktFWV9IT1VSIiwiZ2V0SG91ciIsInNldERheSIsIktFWV9EQVkiLCJnZXREYXkiLCJzZXRNb250aCIsIktFWV9NT05USCIsInNldFllYXIiLCJLRVlfWUVBUiIsImdldFllYXIiLCJzZXRUel9ob3VyIiwidHpfaG91ciIsIktFWV9UWl9IT1VSIiwiZ2V0VHpfaG91ciIsInNldFR6X21pbnV0ZSIsInR6X21pbnV0ZSIsIktFWV9UWl9NSU5VVEUiLCJnZXRUel9taW51dGUiLCJPQVNJU0FkZHJlc3MiLCJzZXRDb3VudHJ5TmFtZSIsIktFWV9DT1VOVFJZX05BTUUiLCJnZXRDb3VudHJ5TmFtZSIsInNldENvdW50cnlDb2RlIiwiS0VZX0NPVU5UUllfQ09ERSIsImdldENvdW50cnlDb2RlIiwic2V0UG9zdGFsQ29kZSIsIktFWV9QT1NUQUxfQ09ERSIsImdldFBvc3RhbENvZGUiLCJzZXRBZG1pbmlzdHJhdGl2ZUFyZWEiLCJLRVlfQURNSU5JU1RSQVRJVkVfQVJFQSIsImdldEFkbWluaXN0cmF0aXZlQXJlYSIsInNldFN1YkFkbWluaXN0cmF0aXZlQXJlYSIsIktFWV9TVUJfQURNSU5JU1RSQVRJVkVfQVJFQSIsImdldFN1YkFkbWluaXN0cmF0aXZlQXJlYSIsInNldExvY2FsaXR5IiwibG9jYWxpdHkiLCJLRVlfTE9DQUxJVFkiLCJnZXRMb2NhbGl0eSIsInNldFN1YkxvY2FsaXR5IiwiS0VZX1NVQl9MT0NBTElUWSIsImdldFN1YkxvY2FsaXR5Iiwic2V0VGhvcm91Z2hmYXJlIiwidGhvcm91Z2hmYXJlIiwiS0VZX1RIT1JPVUdIRkFSRSIsImdldFRob3JvdWdoZmFyZSIsInNldFN1YlRob3JvdWdoZmFyZSIsIktFWV9TVUJfVEhPUk9VR0hGQVJFIiwiZ2V0U3ViVGhvcm91Z2hmYXJlIiwic2V0TG9jYXRpb25OYW1lIiwiS0VZX0xPQ0FUSU9OX05BTUUiLCJnZXRMb2NhdGlvbk5hbWUiLCJzZXRMb2NhdGlvbkRlc2NyaXB0aW9uIiwiZGVzY3JpcHRpb24iLCJLRVlfTE9DQVRJT05fREVTQ1JJUFRJT04iLCJnZXRMb2NhdGlvbkRlc2NyaXB0aW9uIiwic2V0QWRkcmVzc0xpbmVzIiwibGluZXMiLCJLRVlfQUREUkVTU19MSU5FUyIsImdldEFkZHJlc3NMaW5lcyIsInNldFBob25lTnVtYmVyIiwibnVtYmVyIiwiS0VZX1BIT05FX05VTUJFUiIsImdldFBob25lTnVtYmVyIiwic2V0TG9jYXRpb25JbWFnZSIsIktFWV9MT0NBVElPTl9JTUFHRSIsImdldExvY2F0aW9uSW1hZ2UiLCJzZXRUaW1lU3RhbXAiLCJzdGFtcCIsIktFWV9USU1FX1NUQU1QIiwiZ2V0VGltZVN0YW1wIiwic2V0QWRkcmVzcyIsImFkZHJlc3MiLCJLRVlfQUREUkVTUyIsImdldEFkZHJlc3MiLCJzZXREZWxpdmVyeU1vZGUiLCJLRVlfREVMSVZFUllfTU9ERSIsImdldERlbGl2ZXJ5TW9kZSIsIlNlbmRMb2NhdGlvblJlc3BvbnNlIiwic2V0TnVtYmVyIiwiS0VZX05VTUJFUiIsImdldE51bWJlciIsIkRpYWxOdW1iZXJSZXNwb25zZSIsIkJ1dHRvblByZXNzTW9kZSIsIkxPTkciLCJTSE9SVCIsIk1vZHVsZVR5cGUiLCJSQURJTyIsIlNFQVQiLCJMSUdIVCIsIkhNSV9TRVRUSU5HUyIsInNldE1vZHVsZVR5cGUiLCJLRVlfTU9EVUxFX1RZUEUiLCJnZXRNb2R1bGVUeXBlIiwic2V0QnV0dG9uUHJlc3NNb2RlIiwiS0VZX0JVVFRPTl9QUkVTU19NT0RFIiwiZ2V0QnV0dG9uUHJlc3NNb2RlIiwiQnV0dG9uUHJlc3NSZXNwb25zZSIsInNldFN1YnNjcmliZSIsInN1YnNjcmliZSIsIktFWV9TVUJTQ1JJQkUiLCJnZXRTdWJzY3JpYmUiLCJEaXNwbGF5TW9kZSIsIkFVVE8iLCJEaXN0YW5jZVVuaXQiLCJNSUxFUyIsIktJTE9NRVRFUlMiLCJUZW1wZXJhdHVyZVVuaXQiLCJGQUhSRU5IRUlUIiwiQ0VMU0lVUyIsIkhNSVNldHRpbmdzQ29udHJvbERhdGEiLCJzZXREaXNwbGF5TW9kZSIsIktFWV9ESVNQTEFZX01PREUiLCJnZXREaXNwbGF5TW9kZSIsInNldFRlbXBlcmF0dXJlVW5pdCIsInVuaXQiLCJLRVlfVEVNUEVSQVRVUkVfVU5JVCIsImdldFRlbXBlcmF0dXJlVW5pdCIsInNldERpc3RhbmNlVW5pdCIsIktFWV9ESVNUQU5DRV9VTklUIiwiZ2V0RGlzdGFuY2VVbml0IiwiUmFkaW9CYW5kIiwiUmRzRGF0YSIsInNldFBTIiwicHMiLCJLRVlfUFMiLCJnZXRQUyIsInNldFJUIiwiS0VZX1JUIiwiZ2V0UlQiLCJzZXRDVCIsImN0IiwiS0VZX0NUIiwiZ2V0Q1QiLCJzZXRQSSIsInBpIiwiS0VZX1BJIiwiZ2V0UEkiLCJzZXRQVFkiLCJwdHkiLCJLRVlfUFRZIiwiZ2V0UFRZIiwic2V0VFAiLCJ0cCIsIktFWV9UUCIsImdldFRQIiwic2V0VEEiLCJ0YSIsIktFWV9UQSIsImdldFRBIiwic2V0UkVHIiwicmVnIiwiS0VZX1JFRyIsImdldFJFRyIsIlJhZGlvU3RhdGUiLCJBQ1FVSVJJTkciLCJBQ1FVSVJFRCIsIk1VTFRJQ0FTVCIsIk5PVF9GT1VORCIsIlN0YXRpb25JRE51bWJlciIsInNldEZjY0ZhY2lsaXR5SWQiLCJLRVlfRkNDX0ZBQ0lMSVRZX0lEIiwiZ2V0RmNjRmFjaWxpdHlJZCIsIlNpc0RhdGEiLCJzZXRTdGF0aW9uU2hvcnROYW1lIiwiS0VZX1NUQVRJT05fU0hPUlRfTkFNRSIsImdldFN0YXRpb25TaG9ydE5hbWUiLCJzZXRTdGF0aW9uSUROdW1iZXIiLCJLRVlfU1RBVElPTl9JRE5VTUJFUiIsImdldFN0YXRpb25JRE51bWJlciIsInNldFN0YXRpb25Mb25nTmFtZSIsIktFWV9TVEFUSU9OX0xPTkdfTkFNRSIsImdldFN0YXRpb25Mb25nTmFtZSIsInNldFN0YXRpb25Mb2NhdGlvbiIsIktFWV9TVEFUSU9OX0xPQ0FUSU9OIiwiZ2V0U3RhdGlvbkxvY2F0aW9uIiwic2V0U3RhdGlvbk1lc3NhZ2UiLCJLRVlfU1RBVElPTl9NRVNTQUdFIiwiZ2V0U3RhdGlvbk1lc3NhZ2UiLCJSYWRpb0NvbnRyb2xEYXRhIiwic2V0RnJlcXVlbmN5SW50ZWdlciIsImludGVnZXIiLCJLRVlfRlJFUVVFTkNZX0lOVEVHRVIiLCJnZXRGcmVxdWVuY3lJbnRlZ2VyIiwic2V0RnJlcXVlbmN5RnJhY3Rpb24iLCJmcmFjdGlvbiIsIktFWV9GUkVRVUVOQ1lfRlJBQ1RJT04iLCJnZXRGcmVxdWVuY3lGcmFjdGlvbiIsInNldEJhbmQiLCJiYW5kIiwiS0VZX0JBTkQiLCJnZXRCYW5kIiwic2V0UmRzRGF0YSIsIktFWV9SRFNfREFUQSIsImdldFJkc0RhdGEiLCJzZXRIZFJhZGlvRW5hYmxlIiwiZW5hYmxlIiwiS0VZX0hEX1JBRElPX0VOQUJMRSIsImdldEhkUmFkaW9FbmFibGUiLCJzZXRBdmFpbGFibGVIRHMiLCJkcyIsIktFWV9BVkFJTEFCTEVfSERTIiwiZ2V0QXZhaWxhYmxlSERzIiwic2V0QXZhaWxhYmxlSGRDaGFubmVscyIsImNoYW5uZWxzIiwiS0VZX0FWQUlMQUJMRV9IRF9DSEFOTkVMUyIsImdldEF2YWlsYWJsZUhkQ2hhbm5lbHMiLCJzZXRIZENoYW5uZWwiLCJjaGFubmVsIiwiS0VZX0hEX0NIQU5ORUwiLCJnZXRIZENoYW5uZWwiLCJzZXRTaWduYWxTdHJlbmd0aCIsInN0cmVuZ3RoIiwiS0VZX1NJR05BTF9TVFJFTkdUSCIsImdldFNpZ25hbFN0cmVuZ3RoIiwic2V0U2lnbmFsQ2hhbmdlVGhyZXNob2xkIiwidGhyZXNob2xkIiwiS0VZX1NJR05BTF9DSEFOR0VfVEhSRVNIT0xEIiwiZ2V0U2lnbmFsQ2hhbmdlVGhyZXNob2xkIiwic2V0UmFkaW9FbmFibGUiLCJLRVlfUkFESU9fRU5BQkxFIiwiZ2V0UmFkaW9FbmFibGUiLCJzZXRTdGF0ZSIsInN0YXRlIiwiS0VZX1NUQVRFIiwiZ2V0U3RhdGUiLCJzZXRTaXNEYXRhIiwiS0VZX1NJU19EQVRBIiwiZ2V0U2lzRGF0YSIsIlRlbXBlcmF0dXJlIiwic2V0VW5pdCIsIktFWV9VTklUIiwiZ2V0VW5pdCIsIlZlbnRpbGF0aW9uTW9kZSIsIlVQUEVSIiwiTE9XRVIiLCJOT05FIiwiRGVmcm9zdFpvbmUiLCJSRUFSIiwiQUxMIiwiQ2xpbWF0ZUNvbnRyb2xEYXRhIiwic2V0RmFuU3BlZWQiLCJLRVlfRkFOX1NQRUVEIiwiZ2V0RmFuU3BlZWQiLCJzZXRDdXJyZW50VGVtcGVyYXR1cmUiLCJLRVlfQ1VSUkVOVF9URU1QRVJBVFVSRSIsImdldEN1cnJlbnRUZW1wZXJhdHVyZSIsInNldERlc2lyZWRUZW1wZXJhdHVyZSIsIktFWV9ERVNJUkVEX1RFTVBFUkFUVVJFIiwiZ2V0RGVzaXJlZFRlbXBlcmF0dXJlIiwic2V0QWNFbmFibGUiLCJLRVlfQUNfRU5BQkxFIiwiZ2V0QWNFbmFibGUiLCJzZXRDaXJjdWxhdGVBaXJFbmFibGUiLCJLRVlfQ0lSQ1VMQVRFX0FJUl9FTkFCTEUiLCJnZXRDaXJjdWxhdGVBaXJFbmFibGUiLCJzZXRBdXRvTW9kZUVuYWJsZSIsIktFWV9BVVRPX01PREVfRU5BQkxFIiwiZ2V0QXV0b01vZGVFbmFibGUiLCJzZXREZWZyb3N0Wm9uZSIsInpvbmUiLCJLRVlfREVGUk9TVF9aT05FIiwiZ2V0RGVmcm9zdFpvbmUiLCJzZXREdWFsTW9kZUVuYWJsZSIsIktFWV9EVUFMX01PREVfRU5BQkxFIiwiZ2V0RHVhbE1vZGVFbmFibGUiLCJzZXRBY01heEVuYWJsZSIsIktFWV9BQ19NQVhfRU5BQkxFIiwiZ2V0QWNNYXhFbmFibGUiLCJzZXRWZW50aWxhdGlvbk1vZGUiLCJLRVlfVkVOVElMQVRJT05fTU9ERSIsImdldFZlbnRpbGF0aW9uTW9kZSIsInNldEhlYXRlZFN0ZWVyaW5nV2hlZWxFbmFibGUiLCJLRVlfSEVBVEVEX1NURUVSSU5HX1dIRUVMX0VOQUJMRSIsImdldEhlYXRlZFN0ZWVyaW5nV2hlZWxFbmFibGUiLCJzZXRIZWF0ZWRXaW5kc2hpZWxkRW5hYmxlIiwiS0VZX0hFQVRFRF9XSU5EU0hJRUxEX0VOQUJMRSIsImdldEhlYXRlZFdpbmRzaGllbGRFbmFibGUiLCJzZXRIZWF0ZWRSZWFyV2luZG93RW5hYmxlIiwiS0VZX0hFQVRFRF9SRUFSX1dJTkRPV19FTkFCTEUiLCJnZXRIZWF0ZWRSZWFyV2luZG93RW5hYmxlIiwic2V0SGVhdGVkTWlycm9yc0VuYWJsZSIsIktFWV9IRUFURURfTUlSUk9SU19FTkFCTEUiLCJnZXRIZWF0ZWRNaXJyb3JzRW5hYmxlIiwic2V0Q2xpbWF0ZUVuYWJsZSIsIktFWV9DTElNQVRFX0VOQUJMRSIsImdldENsaW1hdGVFbmFibGUiLCJFcXVhbGl6ZXJTZXR0aW5ncyIsInNldENoYW5uZWxJZCIsIktFWV9DSEFOTkVMX0lEIiwiZ2V0Q2hhbm5lbElkIiwic2V0Q2hhbm5lbE5hbWUiLCJLRVlfQ0hBTk5FTF9OQU1FIiwiZ2V0Q2hhbm5lbE5hbWUiLCJzZXRDaGFubmVsU2V0dGluZyIsInNldHRpbmciLCJLRVlfQ0hBTk5FTF9TRVRUSU5HIiwiZ2V0Q2hhbm5lbFNldHRpbmciLCJBdWRpb0NvbnRyb2xEYXRhIiwic2V0U291cmNlIiwiS0VZX1NPVVJDRSIsImdldFNvdXJjZSIsInNldEtlZXBDb250ZXh0IiwiY29udGV4dCIsIktFWV9LRUVQX0NPTlRFWFQiLCJnZXRLZWVwQ29udGV4dCIsInNldFZvbHVtZSIsInZvbHVtZSIsIktFWV9WT0xVTUUiLCJnZXRWb2x1bWUiLCJzZXRFcXVhbGl6ZXJTZXR0aW5ncyIsInNldHRpbmdzIiwiS0VZX0VRVUFMSVpFUl9TRVRUSU5HUyIsImdldEVxdWFsaXplclNldHRpbmdzIiwiTWFzc2FnZUN1c2hpb24iLCJUT1BfTFVNQkFSIiwiTUlERExFX0xVTUJBUiIsIkJPVFRPTV9MVU1CQVIiLCJCQUNLX0JPTFNURVJTIiwiU0VBVF9CT0xTVEVSUyIsIk1hc3NhZ2VDdXNoaW9uRmlybW5lc3MiLCJzZXRDdXNoaW9uIiwiY3VzaGlvbiIsIktFWV9DVVNISU9OIiwiZ2V0Q3VzaGlvbiIsInNldEZpcm1uZXNzIiwiZmlybW5lc3MiLCJLRVlfRklSTU5FU1MiLCJnZXRGaXJtbmVzcyIsIlN1cHBvcnRlZFNlYXQiLCJEUklWRVIiLCJGUk9OVF9QQVNTRU5HRVIiLCJTZWF0TWVtb3J5QWN0aW9uVHlwZSIsIlNBVkUiLCJSRVNUT1JFIiwiU2VhdE1lbW9yeUFjdGlvbiIsInNldElkIiwiS0VZX0lEIiwiZ2V0SWQiLCJzZXRMYWJlbCIsImxhYmVsIiwiS0VZX0xBQkVMIiwiZ2V0TGFiZWwiLCJzZXRBY3Rpb24iLCJLRVlfQUNUSU9OIiwiZ2V0QWN0aW9uIiwiTWFzc2FnZVpvbmUiLCJMVU1CQVIiLCJTRUFUX0NVU0hJT04iLCJNYXNzYWdlTW9kZSIsIkhJR0giLCJNYXNzYWdlTW9kZURhdGEiLCJzZXRNYXNzYWdlWm9uZSIsIktFWV9NQVNTQUdFX1pPTkUiLCJnZXRNYXNzYWdlWm9uZSIsInNldE1hc3NhZ2VNb2RlIiwiS0VZX01BU1NBR0VfTU9ERSIsImdldE1hc3NhZ2VNb2RlIiwiU2VhdENvbnRyb2xEYXRhIiwic2V0SGVhdGluZ0VuYWJsZWQiLCJlbmFibGVkIiwiS0VZX0hFQVRJTkdfRU5BQkxFRCIsImdldEhlYXRpbmdFbmFibGVkIiwic2V0Q29vbGluZ0VuYWJsZWQiLCJLRVlfQ09PTElOR19FTkFCTEVEIiwiZ2V0Q29vbGluZ0VuYWJsZWQiLCJzZXRIZWF0aW5nTGV2ZWwiLCJLRVlfSEVBVElOR19MRVZFTCIsImdldEhlYXRpbmdMZXZlbCIsInNldENvb2xpbmdMZXZlbCIsIktFWV9DT09MSU5HX0xFVkVMIiwiZ2V0Q29vbGluZ0xldmVsIiwic2V0SG9yaXpvbnRhbFBvc2l0aW9uIiwiS0VZX0hPUklaT05UQUxfUE9TSVRJT04iLCJnZXRIb3Jpem9udGFsUG9zaXRpb24iLCJzZXRWZXJ0aWNhbFBvc2l0aW9uIiwiS0VZX1ZFUlRJQ0FMX1BPU0lUSU9OIiwiZ2V0VmVydGljYWxQb3NpdGlvbiIsInNldEZyb250VmVydGljYWxQb3NpdGlvbiIsIktFWV9GUk9OVF9WRVJUSUNBTF9QT1NJVElPTiIsImdldEZyb250VmVydGljYWxQb3NpdGlvbiIsInNldEJhY2tWZXJ0aWNhbFBvc2l0aW9uIiwiS0VZX0JBQ0tfVkVSVElDQUxfUE9TSVRJT04iLCJnZXRCYWNrVmVydGljYWxQb3NpdGlvbiIsInNldEJhY2tUaWx0QW5nbGUiLCJLRVlfQkFDS19USUxUX0FOR0xFIiwiZ2V0QmFja1RpbHRBbmdsZSIsInNldEhlYWRTdXBwb3J0SG9yaXpvbnRhbFBvc2l0aW9uIiwiS0VZX0hFQURfU1VQUE9SVF9IT1JJWk9OVEFMX1BPU0lUSU9OIiwiZ2V0SGVhZFN1cHBvcnRIb3Jpem9udGFsUG9zaXRpb24iLCJzZXRIZWFkU3VwcG9ydFZlcnRpY2FsUG9zaXRpb24iLCJLRVlfSEVBRF9TVVBQT1JUX1ZFUlRJQ0FMX1BPU0lUSU9OIiwiZ2V0SGVhZFN1cHBvcnRWZXJ0aWNhbFBvc2l0aW9uIiwic2V0TWFzc2FnZUVuYWJsZWQiLCJLRVlfTUFTU0FHRV9FTkFCTEVEIiwiZ2V0TWFzc2FnZUVuYWJsZWQiLCJzZXRNYXNzYWdlQ3VzaGlvbkZpcm1uZXNzIiwiS0VZX01BU1NBR0VfQ1VTSElPTl9GSVJNTkVTUyIsImdldE1hc3NhZ2VDdXNoaW9uRmlybW5lc3MiLCJzZXRNZW1vcnkiLCJtZW1vcnkiLCJLRVlfTUVNT1JZIiwiZ2V0TWVtb3J5IiwiTGlnaHRTdGF0dXMiLCJPTiIsIlJBTVBfVVAiLCJSQU1QX0RPV04iLCJMaWdodE5hbWUiLCJGUk9OVF9MRUZUX0hJR0hfQkVBTSIsIkZST05UX1JJR0hUX0hJR0hfQkVBTSIsIkZST05UX0xFRlRfTE9XX0JFQU0iLCJGUk9OVF9SSUdIVF9MT1dfQkVBTSIsIkZST05UX0xFRlRfUEFSS0lOR19MSUdIVCIsIkZST05UX1JJR0hUX1BBUktJTkdfTElHSFQiLCJGUk9OVF9MRUZUX0ZPR19MSUdIVCIsIkZST05UX1JJR0hUX0ZPR19MSUdIVCIsIkZST05UX0xFRlRfREFZVElNRV9SVU5OSU5HX0xJR0hUIiwiRlJPTlRfUklHSFRfREFZVElNRV9SVU5OSU5HX0xJR0hUIiwiRlJPTlRfTEVGVF9UVVJOX0xJR0hUIiwiRlJPTlRfUklHSFRfVFVSTl9MSUdIVCIsIlJFQVJfTEVGVF9GT0dfTElHSFQiLCJSRUFSX1JJR0hUX0ZPR19MSUdIVCIsIlJFQVJfTEVGVF9UQUlMX0xJR0hUIiwiUkVBUl9SSUdIVF9UQUlMX0xJR0hUIiwiUkVBUl9MRUZUX0JSQUtFX0xJR0hUIiwiUkVBUl9SSUdIVF9CUkFLRV9MSUdIVCIsIlJFQVJfTEVGVF9UVVJOX0xJR0hUIiwiUkVBUl9SSUdIVF9UVVJOX0xJR0hUIiwiUkVBUl9SRUdJU1RSQVRJT05fUExBVEVfTElHSFQiLCJISUdIX0JFQU1TIiwiTE9XX0JFQU1TIiwiRk9HX0xJR0hUUyIsIlJVTk5JTkdfTElHSFRTIiwiUEFSS0lOR19MSUdIVFMiLCJCUkFLRV9MSUdIVFMiLCJSRUFSX1JFVkVSU0lOR19MSUdIVFMiLCJTSURFX01BUktFUl9MSUdIVFMiLCJMRUZUX1RVUk5fTElHSFRTIiwiUklHSFRfVFVSTl9MSUdIVFMiLCJIQVpBUkRfTElHSFRTIiwiUkVBUl9DQVJHT19MSUdIVFMiLCJSRUFSX1RSVUNLX0JFRF9MSUdIVFMiLCJSRUFSX1RSQUlMRVJfTElHSFRTIiwiTEVGVF9TUE9UX0xJR0hUUyIsIlJJR0hUX1NQT1RfTElHSFRTIiwiTEVGVF9QVURETEVfTElHSFRTIiwiUklHSFRfUFVERExFX0xJR0hUUyIsIkFNQklFTlRfTElHSFRTIiwiT1ZFUkhFQURfTElHSFRTIiwiUkVBRElOR19MSUdIVFMiLCJUUlVOS19MSUdIVFMiLCJFWFRFUklPUl9GUk9OVF9MSUdIVFMiLCJFWFRFUklPUl9SRUFSX0xJR0hUUyIsIkVYVEVSSU9SX0xFRlRfTElHSFRTIiwiRVhURVJJT1JfUklHSFRfTElHSFRTIiwiRVhURVJJT1JfQUxMX0xJR0hUUyIsIkxpZ2h0U3RhdGUiLCJzZXREZW5zaXR5IiwiZGVuc2l0eSIsIktFWV9ERU5TSVRZIiwiZ2V0RGVuc2l0eSIsInNldENvbG9yIiwiS0VZX0NPTE9SIiwiZ2V0Q29sb3IiLCJMaWdodENvbnRyb2xEYXRhIiwic2V0TGlnaHRTdGF0ZSIsIktFWV9MSUdIVF9TVEFURSIsImdldExpZ2h0U3RhdGUiLCJNb2R1bGVEYXRhIiwic2V0UmFkaW9Db250cm9sRGF0YSIsIktFWV9SQURJT19DT05UUk9MX0RBVEEiLCJnZXRSYWRpb0NvbnRyb2xEYXRhIiwic2V0Q2xpbWF0ZUNvbnRyb2xEYXRhIiwiS0VZX0NMSU1BVEVfQ09OVFJPTF9EQVRBIiwiZ2V0Q2xpbWF0ZUNvbnRyb2xEYXRhIiwic2V0U2VhdENvbnRyb2xEYXRhIiwiS0VZX1NFQVRfQ09OVFJPTF9EQVRBIiwiZ2V0U2VhdENvbnRyb2xEYXRhIiwic2V0QXVkaW9Db250cm9sRGF0YSIsIktFWV9BVURJT19DT05UUk9MX0RBVEEiLCJnZXRBdWRpb0NvbnRyb2xEYXRhIiwic2V0TGlnaHRDb250cm9sRGF0YSIsIktFWV9MSUdIVF9DT05UUk9MX0RBVEEiLCJnZXRMaWdodENvbnRyb2xEYXRhIiwic2V0SG1pU2V0dGluZ3NDb250cm9sRGF0YSIsIktFWV9ITUlfU0VUVElOR1NfQ09OVFJPTF9EQVRBIiwiZ2V0SG1pU2V0dGluZ3NDb250cm9sRGF0YSIsIkdldEludGVyaW9yVmVoaWNsZURhdGFSZXNwb25zZSIsInNldE1vZHVsZURhdGEiLCJLRVlfTU9EVUxFX0RBVEEiLCJnZXRNb2R1bGVEYXRhIiwic2V0SXNTdWJzY3JpYmVkIiwic3Vic2NyaWJlZCIsIktFWV9JU19TVUJTQ1JJQkVEIiwiZ2V0SXNTdWJzY3JpYmVkIiwic2V0TW9kdWxlSWRzIiwiaWRzIiwiS0VZX01PRFVMRV9JRFMiLCJnZXRNb2R1bGVJZHMiLCJHZXRJbnRlcmlvclZlaGljbGVEYXRhQ29uc2VudFJlc3BvbnNlIiwic2V0QWxsb3dlZCIsImFsbG93ZWQiLCJLRVlfQUxMT1dFRCIsImdldEFsbG93ZWQiLCJSZWxlYXNlSW50ZXJpb3JWZWhpY2xlRGF0YU1vZHVsZVJlc3BvbnNlIiwiU2V0SW50ZXJpb3JWZWhpY2xlRGF0YVJlc3BvbnNlIiwiU3Vic2NyaWJlV2F5UG9pbnRzUmVzcG9uc2UiLCJXYXlQb2ludFR5cGUiLCJzZXRXYXlQb2ludFR5cGUiLCJLRVlfV0FZX1BPSU5UX1RZUEUiLCJnZXRXYXlQb2ludFR5cGUiLCJDb29yZGluYXRlIiwiTG9jYXRpb25EZXRhaWxzIiwic2V0Q29vcmRpbmF0ZSIsImNvb3JkaW5hdGUiLCJLRVlfQ09PUkRJTkFURSIsImdldENvb3JkaW5hdGUiLCJzZXRTZWFyY2hBZGRyZXNzIiwiS0VZX1NFQVJDSF9BRERSRVNTIiwiZ2V0U2VhcmNoQWRkcmVzcyIsIkdldFdheVBvaW50c1Jlc3BvbnNlIiwic2V0V2F5UG9pbnRzIiwicG9pbnRzIiwiS0VZX1dBWV9QT0lOVFMiLCJnZXRXYXlQb2ludHMiLCJVbnN1YnNjcmliZVdheVBvaW50c1Jlc3BvbnNlIiwiU3lzdGVtQ2FwYWJpbGl0eVR5cGUiLCJQSE9ORV9DQUxMIiwiVklERU9fU1RSRUFNSU5HIiwiQVBQX1NFUlZJQ0VTIiwiU0VBVF9MT0NBVElPTiIsIkRJU1BMQVlTIiwic2V0U3lzdGVtQ2FwYWJpbGl0eVR5cGUiLCJLRVlfU1lTVEVNX0NBUEFCSUxJVFlfVFlQRSIsImdldFN5c3RlbUNhcGFiaWxpdHlUeXBlIiwiVmlkZW9TdHJlYW1pbmdDb2RlYyIsIkgyNjQiLCJIMjY1IiwiVGhlb3JhIiwiVlA4IiwiVlA5IiwiVmlkZW9TdHJlYW1pbmdQcm90b2NvbCIsIlJBVyIsIlJUUCIsIlJUU1AiLCJSVE1QIiwiV0VCTSIsIlZpZGVvU3RyZWFtaW5nRm9ybWF0Iiwic2V0UHJvdG9jb2wiLCJwcm90b2NvbCIsIktFWV9QUk9UT0NPTCIsImdldFByb3RvY29sIiwic2V0Q29kZWMiLCJjb2RlYyIsIktFWV9DT0RFQyIsImdldENvZGVjIiwiVmlkZW9TdHJlYW1pbmdDYXBhYmlsaXR5Iiwic2V0UHJlZmVycmVkUmVzb2x1dGlvbiIsIktFWV9QUkVGRVJSRURfUkVTT0xVVElPTiIsImdldFByZWZlcnJlZFJlc29sdXRpb24iLCJzZXRNYXhCaXRyYXRlIiwiYml0cmF0ZSIsIktFWV9NQVhfQklUUkFURSIsImdldE1heEJpdHJhdGUiLCJzZXRTdXBwb3J0ZWRGb3JtYXRzIiwiS0VZX1NVUFBPUlRFRF9GT1JNQVRTIiwiZ2V0U3VwcG9ydGVkRm9ybWF0cyIsInNldEhhcHRpY1NwYXRpYWxEYXRhU3VwcG9ydGVkIiwiS0VZX0hBUFRJQ19TUEFUSUFMX0RBVEFfU1VQUE9SVEVEIiwiZ2V0SGFwdGljU3BhdGlhbERhdGFTdXBwb3J0ZWQiLCJzZXREaWFnb25hbFNjcmVlblNpemUiLCJLRVlfRElBR09OQUxfU0NSRUVOX1NJWkUiLCJnZXREaWFnb25hbFNjcmVlblNpemUiLCJzZXRQaXhlbFBlckluY2giLCJpbmNoIiwiS0VZX1BJWEVMX1BFUl9JTkNIIiwiZ2V0UGl4ZWxQZXJJbmNoIiwic2V0U2NhbGUiLCJLRVlfU0NBTEUiLCJnZXRTY2FsZSIsIlBob25lQ2FwYWJpbGl0eSIsInNldERpYWxOdW1iZXJFbmFibGVkIiwiS0VZX0RJQUxfTlVNQkVSX0VOQUJMRUQiLCJnZXREaWFsTnVtYmVyRW5hYmxlZCIsIldpbmRvd1R5cGVDYXBhYmlsaXRpZXMiLCJzZXRNYXhpbXVtTnVtYmVyT2ZXaW5kb3dzIiwid2luZG93cyIsIktFWV9NQVhJTVVNX05VTUJFUl9PRl9XSU5ET1dTIiwiZ2V0TWF4aW11bU51bWJlck9mV2luZG93cyIsIldpbmRvd0NhcGFiaWxpdHkiLCJzZXRNZW51TGF5b3V0c0F2YWlsYWJsZSIsIktFWV9NRU5VX0xBWU9VVFNfQVZBSUxBQkxFIiwiZ2V0TWVudUxheW91dHNBdmFpbGFibGUiLCJEaXNwbGF5Q2FwYWJpbGl0eSIsInNldFdpbmRvd1R5cGVTdXBwb3J0ZWQiLCJLRVlfV0lORE9XX1RZUEVfU1VQUE9SVEVEIiwiZ2V0V2luZG93VHlwZVN1cHBvcnRlZCIsInNldFdpbmRvd0NhcGFiaWxpdGllcyIsIktFWV9XSU5ET1dfQ0FQQUJJTElUSUVTIiwiZ2V0V2luZG93Q2FwYWJpbGl0aWVzIiwiQXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzIiwic2V0TW9kdWxlTmFtZSIsIktFWV9NT0RVTEVfTkFNRSIsImdldE1vZHVsZU5hbWUiLCJzZXRTb3VyY2VBdmFpbGFibGUiLCJLRVlfU09VUkNFX0FWQUlMQUJMRSIsImdldFNvdXJjZUF2YWlsYWJsZSIsInNldEtlZXBDb250ZXh0QXZhaWxhYmxlIiwiS0VZX0tFRVBfQ09OVEVYVF9BVkFJTEFCTEUiLCJnZXRLZWVwQ29udGV4dEF2YWlsYWJsZSIsInNldFZvbHVtZUF2YWlsYWJsZSIsIktFWV9WT0xVTUVfQVZBSUxBQkxFIiwiZ2V0Vm9sdW1lQXZhaWxhYmxlIiwic2V0RXF1YWxpemVyQXZhaWxhYmxlIiwiS0VZX0VRVUFMSVpFUl9BVkFJTEFCTEUiLCJnZXRFcXVhbGl6ZXJBdmFpbGFibGUiLCJzZXRFcXVhbGl6ZXJNYXhDaGFubmVsSWQiLCJLRVlfRVFVQUxJWkVSX01BWF9DSEFOTkVMX0lEIiwiZ2V0RXF1YWxpemVyTWF4Q2hhbm5lbElkIiwiTGlnaHRDYXBhYmlsaXRpZXMiLCJzZXRTdGF0dXNBdmFpbGFibGUiLCJLRVlfU1RBVFVTX0FWQUlMQUJMRSIsImdldFN0YXR1c0F2YWlsYWJsZSIsInNldERlbnNpdHlBdmFpbGFibGUiLCJLRVlfREVOU0lUWV9BVkFJTEFCTEUiLCJnZXREZW5zaXR5QXZhaWxhYmxlIiwic2V0UmdiQ29sb3JTcGFjZUF2YWlsYWJsZSIsIktFWV9SR0JfQ09MT1JfU1BBQ0VfQVZBSUxBQkxFIiwiZ2V0UmdiQ29sb3JTcGFjZUF2YWlsYWJsZSIsIkxpZ2h0Q29udHJvbENhcGFiaWxpdGllcyIsInNldFN1cHBvcnRlZExpZ2h0cyIsImxpZ2h0cyIsIktFWV9TVVBQT1JURURfTElHSFRTIiwiZ2V0U3VwcG9ydGVkTGlnaHRzIiwiQ2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMiLCJzZXRDdXJyZW50VGVtcGVyYXR1cmVBdmFpbGFibGUiLCJLRVlfQ1VSUkVOVF9URU1QRVJBVFVSRV9BVkFJTEFCTEUiLCJnZXRDdXJyZW50VGVtcGVyYXR1cmVBdmFpbGFibGUiLCJzZXRGYW5TcGVlZEF2YWlsYWJsZSIsIktFWV9GQU5fU1BFRURfQVZBSUxBQkxFIiwiZ2V0RmFuU3BlZWRBdmFpbGFibGUiLCJzZXREZXNpcmVkVGVtcGVyYXR1cmVBdmFpbGFibGUiLCJLRVlfREVTSVJFRF9URU1QRVJBVFVSRV9BVkFJTEFCTEUiLCJnZXREZXNpcmVkVGVtcGVyYXR1cmVBdmFpbGFibGUiLCJzZXRBY0VuYWJsZUF2YWlsYWJsZSIsIktFWV9BQ19FTkFCTEVfQVZBSUxBQkxFIiwiZ2V0QWNFbmFibGVBdmFpbGFibGUiLCJzZXRBY01heEVuYWJsZUF2YWlsYWJsZSIsIktFWV9BQ19NQVhfRU5BQkxFX0FWQUlMQUJMRSIsImdldEFjTWF4RW5hYmxlQXZhaWxhYmxlIiwic2V0Q2lyY3VsYXRlQWlyRW5hYmxlQXZhaWxhYmxlIiwiS0VZX0NJUkNVTEFURV9BSVJfRU5BQkxFX0FWQUlMQUJMRSIsImdldENpcmN1bGF0ZUFpckVuYWJsZUF2YWlsYWJsZSIsInNldEF1dG9Nb2RlRW5hYmxlQXZhaWxhYmxlIiwiS0VZX0FVVE9fTU9ERV9FTkFCTEVfQVZBSUxBQkxFIiwiZ2V0QXV0b01vZGVFbmFibGVBdmFpbGFibGUiLCJzZXREdWFsTW9kZUVuYWJsZUF2YWlsYWJsZSIsIktFWV9EVUFMX01PREVfRU5BQkxFX0FWQUlMQUJMRSIsImdldER1YWxNb2RlRW5hYmxlQXZhaWxhYmxlIiwic2V0RGVmcm9zdFpvbmVBdmFpbGFibGUiLCJLRVlfREVGUk9TVF9aT05FX0FWQUlMQUJMRSIsImdldERlZnJvc3Rab25lQXZhaWxhYmxlIiwic2V0VmVudGlsYXRpb25Nb2RlQXZhaWxhYmxlIiwiS0VZX1ZFTlRJTEFUSU9OX01PREVfQVZBSUxBQkxFIiwiZ2V0VmVudGlsYXRpb25Nb2RlQXZhaWxhYmxlIiwic2V0SGVhdGVkU3RlZXJpbmdXaGVlbEF2YWlsYWJsZSIsIktFWV9IRUFURURfU1RFRVJJTkdfV0hFRUxfQVZBSUxBQkxFIiwiZ2V0SGVhdGVkU3RlZXJpbmdXaGVlbEF2YWlsYWJsZSIsInNldEhlYXRlZFdpbmRzaGllbGRBdmFpbGFibGUiLCJLRVlfSEVBVEVEX1dJTkRTSElFTERfQVZBSUxBQkxFIiwiZ2V0SGVhdGVkV2luZHNoaWVsZEF2YWlsYWJsZSIsInNldEhlYXRlZFJlYXJXaW5kb3dBdmFpbGFibGUiLCJLRVlfSEVBVEVEX1JFQVJfV0lORE9XX0FWQUlMQUJMRSIsImdldEhlYXRlZFJlYXJXaW5kb3dBdmFpbGFibGUiLCJzZXRIZWF0ZWRNaXJyb3JzQXZhaWxhYmxlIiwiS0VZX0hFQVRFRF9NSVJST1JTX0FWQUlMQUJMRSIsImdldEhlYXRlZE1pcnJvcnNBdmFpbGFibGUiLCJzZXRDbGltYXRlRW5hYmxlQXZhaWxhYmxlIiwiS0VZX0NMSU1BVEVfRU5BQkxFX0FWQUlMQUJMRSIsImdldENsaW1hdGVFbmFibGVBdmFpbGFibGUiLCJTZWF0Q29udHJvbENhcGFiaWxpdGllcyIsInNldEhlYXRpbmdFbmFibGVkQXZhaWxhYmxlIiwiS0VZX0hFQVRJTkdfRU5BQkxFRF9BVkFJTEFCTEUiLCJnZXRIZWF0aW5nRW5hYmxlZEF2YWlsYWJsZSIsInNldENvb2xpbmdFbmFibGVkQXZhaWxhYmxlIiwiS0VZX0NPT0xJTkdfRU5BQkxFRF9BVkFJTEFCTEUiLCJnZXRDb29saW5nRW5hYmxlZEF2YWlsYWJsZSIsInNldEhlYXRpbmdMZXZlbEF2YWlsYWJsZSIsIktFWV9IRUFUSU5HX0xFVkVMX0FWQUlMQUJMRSIsImdldEhlYXRpbmdMZXZlbEF2YWlsYWJsZSIsInNldENvb2xpbmdMZXZlbEF2YWlsYWJsZSIsIktFWV9DT09MSU5HX0xFVkVMX0FWQUlMQUJMRSIsImdldENvb2xpbmdMZXZlbEF2YWlsYWJsZSIsInNldEhvcml6b250YWxQb3NpdGlvbkF2YWlsYWJsZSIsIktFWV9IT1JJWk9OVEFMX1BPU0lUSU9OX0FWQUlMQUJMRSIsImdldEhvcml6b250YWxQb3NpdGlvbkF2YWlsYWJsZSIsInNldFZlcnRpY2FsUG9zaXRpb25BdmFpbGFibGUiLCJLRVlfVkVSVElDQUxfUE9TSVRJT05fQVZBSUxBQkxFIiwiZ2V0VmVydGljYWxQb3NpdGlvbkF2YWlsYWJsZSIsInNldEZyb250VmVydGljYWxQb3NpdGlvbkF2YWlsYWJsZSIsIktFWV9GUk9OVF9WRVJUSUNBTF9QT1NJVElPTl9BVkFJTEFCTEUiLCJnZXRGcm9udFZlcnRpY2FsUG9zaXRpb25BdmFpbGFibGUiLCJzZXRCYWNrVmVydGljYWxQb3NpdGlvbkF2YWlsYWJsZSIsIktFWV9CQUNLX1ZFUlRJQ0FMX1BPU0lUSU9OX0FWQUlMQUJMRSIsImdldEJhY2tWZXJ0aWNhbFBvc2l0aW9uQXZhaWxhYmxlIiwic2V0QmFja1RpbHRBbmdsZUF2YWlsYWJsZSIsIktFWV9CQUNLX1RJTFRfQU5HTEVfQVZBSUxBQkxFIiwiZ2V0QmFja1RpbHRBbmdsZUF2YWlsYWJsZSIsInNldEhlYWRTdXBwb3J0SG9yaXpvbnRhbFBvc2l0aW9uQXZhaWxhYmxlIiwiS0VZX0hFQURfU1VQUE9SVF9IT1JJWk9OVEFMX1BPU0lUSU9OX0FWQUlMQUJMRSIsImdldEhlYWRTdXBwb3J0SG9yaXpvbnRhbFBvc2l0aW9uQXZhaWxhYmxlIiwic2V0SGVhZFN1cHBvcnRWZXJ0aWNhbFBvc2l0aW9uQXZhaWxhYmxlIiwiS0VZX0hFQURfU1VQUE9SVF9WRVJUSUNBTF9QT1NJVElPTl9BVkFJTEFCTEUiLCJnZXRIZWFkU3VwcG9ydFZlcnRpY2FsUG9zaXRpb25BdmFpbGFibGUiLCJzZXRNYXNzYWdlRW5hYmxlZEF2YWlsYWJsZSIsIktFWV9NQVNTQUdFX0VOQUJMRURfQVZBSUxBQkxFIiwiZ2V0TWFzc2FnZUVuYWJsZWRBdmFpbGFibGUiLCJzZXRNYXNzYWdlTW9kZUF2YWlsYWJsZSIsIktFWV9NQVNTQUdFX01PREVfQVZBSUxBQkxFIiwiZ2V0TWFzc2FnZU1vZGVBdmFpbGFibGUiLCJzZXRNYXNzYWdlQ3VzaGlvbkZpcm1uZXNzQXZhaWxhYmxlIiwiS0VZX01BU1NBR0VfQ1VTSElPTl9GSVJNTkVTU19BVkFJTEFCTEUiLCJnZXRNYXNzYWdlQ3VzaGlvbkZpcm1uZXNzQXZhaWxhYmxlIiwic2V0TWVtb3J5QXZhaWxhYmxlIiwiS0VZX01FTU9SWV9BVkFJTEFCTEUiLCJnZXRNZW1vcnlBdmFpbGFibGUiLCJSYWRpb0NvbnRyb2xDYXBhYmlsaXRpZXMiLCJzZXRSYWRpb0VuYWJsZUF2YWlsYWJsZSIsIktFWV9SQURJT19FTkFCTEVfQVZBSUxBQkxFIiwiZ2V0UmFkaW9FbmFibGVBdmFpbGFibGUiLCJzZXRSYWRpb0JhbmRBdmFpbGFibGUiLCJLRVlfUkFESU9fQkFORF9BVkFJTEFCTEUiLCJnZXRSYWRpb0JhbmRBdmFpbGFibGUiLCJzZXRSYWRpb0ZyZXF1ZW5jeUF2YWlsYWJsZSIsIktFWV9SQURJT19GUkVRVUVOQ1lfQVZBSUxBQkxFIiwiZ2V0UmFkaW9GcmVxdWVuY3lBdmFpbGFibGUiLCJzZXRIZENoYW5uZWxBdmFpbGFibGUiLCJLRVlfSERfQ0hBTk5FTF9BVkFJTEFCTEUiLCJnZXRIZENoYW5uZWxBdmFpbGFibGUiLCJzZXRSZHNEYXRhQXZhaWxhYmxlIiwiS0VZX1JEU19EQVRBX0FWQUlMQUJMRSIsImdldFJkc0RhdGFBdmFpbGFibGUiLCJzZXRBdmFpbGFibGVIRHNBdmFpbGFibGUiLCJLRVlfQVZBSUxBQkxFX0hEU19BVkFJTEFCTEUiLCJnZXRBdmFpbGFibGVIRHNBdmFpbGFibGUiLCJzZXRBdmFpbGFibGVIZENoYW5uZWxzQXZhaWxhYmxlIiwiS0VZX0FWQUlMQUJMRV9IRF9DSEFOTkVMU19BVkFJTEFCTEUiLCJnZXRBdmFpbGFibGVIZENoYW5uZWxzQXZhaWxhYmxlIiwic2V0U3RhdGVBdmFpbGFibGUiLCJLRVlfU1RBVEVfQVZBSUxBQkxFIiwiZ2V0U3RhdGVBdmFpbGFibGUiLCJzZXRTaWduYWxTdHJlbmd0aEF2YWlsYWJsZSIsIktFWV9TSUdOQUxfU1RSRU5HVEhfQVZBSUxBQkxFIiwiZ2V0U2lnbmFsU3RyZW5ndGhBdmFpbGFibGUiLCJzZXRTaWduYWxDaGFuZ2VUaHJlc2hvbGRBdmFpbGFibGUiLCJLRVlfU0lHTkFMX0NIQU5HRV9USFJFU0hPTERfQVZBSUxBQkxFIiwiZ2V0U2lnbmFsQ2hhbmdlVGhyZXNob2xkQXZhaWxhYmxlIiwic2V0U2lzRGF0YUF2YWlsYWJsZSIsIktFWV9TSVNfREFUQV9BVkFJTEFCTEUiLCJnZXRTaXNEYXRhQXZhaWxhYmxlIiwic2V0SGRSYWRpb0VuYWJsZUF2YWlsYWJsZSIsIktFWV9IRF9SQURJT19FTkFCTEVfQVZBSUxBQkxFIiwiZ2V0SGRSYWRpb0VuYWJsZUF2YWlsYWJsZSIsInNldFNpcml1c3htUmFkaW9BdmFpbGFibGUiLCJLRVlfU0lSSVVTWE1fUkFESU9fQVZBSUxBQkxFIiwiZ2V0U2lyaXVzeG1SYWRpb0F2YWlsYWJsZSIsIkhNSVNldHRpbmdzQ29udHJvbENhcGFiaWxpdGllcyIsInNldERpc3RhbmNlVW5pdEF2YWlsYWJsZSIsIktFWV9ESVNUQU5DRV9VTklUX0FWQUlMQUJMRSIsImdldERpc3RhbmNlVW5pdEF2YWlsYWJsZSIsInNldFRlbXBlcmF0dXJlVW5pdEF2YWlsYWJsZSIsIktFWV9URU1QRVJBVFVSRV9VTklUX0FWQUlMQUJMRSIsImdldFRlbXBlcmF0dXJlVW5pdEF2YWlsYWJsZSIsInNldERpc3BsYXlNb2RlVW5pdEF2YWlsYWJsZSIsIktFWV9ESVNQTEFZX01PREVfVU5JVF9BVkFJTEFCTEUiLCJnZXREaXNwbGF5TW9kZVVuaXRBdmFpbGFibGUiLCJSZW1vdGVDb250cm9sQ2FwYWJpbGl0aWVzIiwic2V0Q2xpbWF0ZUNvbnRyb2xDYXBhYmlsaXRpZXMiLCJLRVlfQ0xJTUFURV9DT05UUk9MX0NBUEFCSUxJVElFUyIsImdldENsaW1hdGVDb250cm9sQ2FwYWJpbGl0aWVzIiwic2V0UmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzIiwiS0VZX1JBRElPX0NPTlRST0xfQ0FQQUJJTElUSUVTIiwiZ2V0UmFkaW9Db250cm9sQ2FwYWJpbGl0aWVzIiwic2V0QXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzIiwiS0VZX0FVRElPX0NPTlRST0xfQ0FQQUJJTElUSUVTIiwiZ2V0QXVkaW9Db250cm9sQ2FwYWJpbGl0aWVzIiwic2V0SG1pU2V0dGluZ3NDb250cm9sQ2FwYWJpbGl0aWVzIiwiS0VZX0hNSV9TRVRUSU5HU19DT05UUk9MX0NBUEFCSUxJVElFUyIsImdldEhtaVNldHRpbmdzQ29udHJvbENhcGFiaWxpdGllcyIsInNldExpZ2h0Q29udHJvbENhcGFiaWxpdGllcyIsIktFWV9MSUdIVF9DT05UUk9MX0NBUEFCSUxJVElFUyIsImdldExpZ2h0Q29udHJvbENhcGFiaWxpdGllcyIsInNldFNlYXRDb250cm9sQ2FwYWJpbGl0aWVzIiwiS0VZX1NFQVRfQ09OVFJPTF9DQVBBQklMSVRJRVMiLCJnZXRTZWF0Q29udHJvbENhcGFiaWxpdGllcyIsIlNlYXRMb2NhdGlvbkNhcGFiaWxpdHkiLCJzZXRDb2x1bW5zIiwiY29sdW1ucyIsIktFWV9DT0xVTU5TIiwiZ2V0Q29sdW1ucyIsInNldExldmVscyIsImxldmVscyIsIktFWV9MRVZFTFMiLCJnZXRMZXZlbHMiLCJzZXRTZWF0cyIsInNlYXRzIiwiS0VZX1NFQVRTIiwiZ2V0U2VhdHMiLCJTZXJ2aWNlVXBkYXRlUmVhc29uIiwiUFVCTElTSEVEIiwiUkVNT1ZFRCIsIkFDVElWQVRFRCIsIkRFQUNUSVZBVEVEIiwiTUFOSUZFU1RfVVBEQVRFIiwiTmF2aWdhdGlvblNlcnZpY2VNYW5pZmVzdCIsInNldEFjY2VwdHNXYXlQb2ludHMiLCJLRVlfQUNDRVBUU19XQVlfUE9JTlRTIiwiZ2V0QWNjZXB0c1dheVBvaW50cyIsIldlYXRoZXJTZXJ2aWNlTWFuaWZlc3QiLCJzZXRDdXJyZW50Rm9yZWNhc3RTdXBwb3J0ZWQiLCJLRVlfQ1VSUkVOVF9GT1JFQ0FTVF9TVVBQT1JURUQiLCJnZXRDdXJyZW50Rm9yZWNhc3RTdXBwb3J0ZWQiLCJzZXRNYXhNdWx0aWRheUZvcmVjYXN0QW1vdW50IiwiYW1vdW50IiwiS0VZX01BWF9NVUxUSURBWV9GT1JFQ0FTVF9BTU9VTlQiLCJnZXRNYXhNdWx0aWRheUZvcmVjYXN0QW1vdW50Iiwic2V0TWF4SG91cmx5Rm9yZWNhc3RBbW91bnQiLCJLRVlfTUFYX0hPVVJMWV9GT1JFQ0FTVF9BTU9VTlQiLCJnZXRNYXhIb3VybHlGb3JlY2FzdEFtb3VudCIsInNldE1heE1pbnV0ZWx5Rm9yZWNhc3RBbW91bnQiLCJLRVlfTUFYX01JTlVURUxZX0ZPUkVDQVNUX0FNT1VOVCIsImdldE1heE1pbnV0ZWx5Rm9yZWNhc3RBbW91bnQiLCJzZXRXZWF0aGVyRm9yTG9jYXRpb25TdXBwb3J0ZWQiLCJLRVlfV0VBVEhFUl9GT1JfTE9DQVRJT05fU1VQUE9SVEVEIiwiZ2V0V2VhdGhlckZvckxvY2F0aW9uU3VwcG9ydGVkIiwiTWVkaWFTZXJ2aWNlTWFuaWZlc3QiLCJBcHBTZXJ2aWNlTWFuaWZlc3QiLCJzZXRTZXJ2aWNlTmFtZSIsIktFWV9TRVJWSUNFX05BTUUiLCJnZXRTZXJ2aWNlTmFtZSIsInNldFNlcnZpY2VUeXBlIiwiS0VZX1NFUlZJQ0VfVFlQRSIsInNldFNlcnZpY2VJY29uIiwiS0VZX1NFUlZJQ0VfSUNPTiIsImdldFNlcnZpY2VJY29uIiwic2V0QWxsb3dBcHBDb25zdW1lcnMiLCJjb25zdW1lcnMiLCJLRVlfQUxMT1dfQVBQX0NPTlNVTUVSUyIsImdldEFsbG93QXBwQ29uc3VtZXJzIiwic2V0UnBjU3BlY1ZlcnNpb24iLCJLRVlfUlBDX1NQRUNfVkVSU0lPTiIsImdldFJwY1NwZWNWZXJzaW9uIiwic2V0SGFuZGxlZFJQQ3MiLCJjcyIsIktFWV9IQU5ETEVEX1JQQ1MiLCJnZXRIYW5kbGVkUlBDcyIsInNldE1lZGlhU2VydmljZU1hbmlmZXN0IiwibWFuaWZlc3QiLCJLRVlfTUVESUFfU0VSVklDRV9NQU5JRkVTVCIsImdldE1lZGlhU2VydmljZU1hbmlmZXN0Iiwic2V0V2VhdGhlclNlcnZpY2VNYW5pZmVzdCIsIktFWV9XRUFUSEVSX1NFUlZJQ0VfTUFOSUZFU1QiLCJnZXRXZWF0aGVyU2VydmljZU1hbmlmZXN0Iiwic2V0TmF2aWdhdGlvblNlcnZpY2VNYW5pZmVzdCIsIktFWV9OQVZJR0FUSU9OX1NFUlZJQ0VfTUFOSUZFU1QiLCJnZXROYXZpZ2F0aW9uU2VydmljZU1hbmlmZXN0IiwiQXBwU2VydmljZVJlY29yZCIsInNldFNlcnZpY2VJRCIsIktFWV9TRVJWSUNFX0lEIiwiZ2V0U2VydmljZUlEIiwic2V0U2VydmljZU1hbmlmZXN0IiwiS0VZX1NFUlZJQ0VfTUFOSUZFU1QiLCJnZXRTZXJ2aWNlTWFuaWZlc3QiLCJzZXRTZXJ2aWNlUHVibGlzaGVkIiwicHVibGlzaGVkIiwiS0VZX1NFUlZJQ0VfUFVCTElTSEVEIiwiZ2V0U2VydmljZVB1Ymxpc2hlZCIsInNldFNlcnZpY2VBY3RpdmUiLCJLRVlfU0VSVklDRV9BQ1RJVkUiLCJnZXRTZXJ2aWNlQWN0aXZlIiwiQXBwU2VydmljZUNhcGFiaWxpdHkiLCJzZXRVcGRhdGVSZWFzb24iLCJLRVlfVVBEQVRFX1JFQVNPTiIsImdldFVwZGF0ZVJlYXNvbiIsInNldFVwZGF0ZWRBcHBTZXJ2aWNlUmVjb3JkIiwicmVjb3JkIiwiS0VZX1VQREFURURfQVBQX1NFUlZJQ0VfUkVDT1JEIiwiZ2V0VXBkYXRlZEFwcFNlcnZpY2VSZWNvcmQiLCJBcHBTZXJ2aWNlc0NhcGFiaWxpdGllcyIsIk5hdmlnYXRpb25DYXBhYmlsaXR5Iiwic2V0U2VuZExvY2F0aW9uRW5hYmxlZCIsIktFWV9TRU5EX0xPQ0FUSU9OX0VOQUJMRUQiLCJnZXRTZW5kTG9jYXRpb25FbmFibGVkIiwic2V0R2V0V2F5UG9pbnRzRW5hYmxlZCIsIktFWV9HRVRfV0FZX1BPSU5UU19FTkFCTEVEIiwiZ2V0R2V0V2F5UG9pbnRzRW5hYmxlZCIsIlN5c3RlbUNhcGFiaWxpdHkiLCJzZXROYXZpZ2F0aW9uQ2FwYWJpbGl0eSIsImNhcGFiaWxpdHkiLCJLRVlfTkFWSUdBVElPTl9DQVBBQklMSVRZIiwiZ2V0TmF2aWdhdGlvbkNhcGFiaWxpdHkiLCJzZXRQaG9uZUNhcGFiaWxpdHkiLCJLRVlfUEhPTkVfQ0FQQUJJTElUWSIsImdldFBob25lQ2FwYWJpbGl0eSIsInNldFZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eSIsIktFWV9WSURFT19TVFJFQU1JTkdfQ0FQQUJJTElUWSIsImdldFZpZGVvU3RyZWFtaW5nQ2FwYWJpbGl0eSIsInNldFJlbW90ZUNvbnRyb2xDYXBhYmlsaXR5IiwiS0VZX1JFTU9URV9DT05UUk9MX0NBUEFCSUxJVFkiLCJnZXRSZW1vdGVDb250cm9sQ2FwYWJpbGl0eSIsInNldEFwcFNlcnZpY2VzQ2FwYWJpbGl0aWVzIiwiS0VZX0FQUF9TRVJWSUNFU19DQVBBQklMSVRJRVMiLCJnZXRBcHBTZXJ2aWNlc0NhcGFiaWxpdGllcyIsInNldFNlYXRMb2NhdGlvbkNhcGFiaWxpdHkiLCJLRVlfU0VBVF9MT0NBVElPTl9DQVBBQklMSVRZIiwiZ2V0U2VhdExvY2F0aW9uQ2FwYWJpbGl0eSIsIkdldFN5c3RlbUNhcGFiaWxpdHlSZXNwb25zZSIsInNldFN5c3RlbUNhcGFiaWxpdHkiLCJLRVlfU1lTVEVNX0NBUEFCSUxJVFkiLCJnZXRTeXN0ZW1DYXBhYmlsaXR5IiwiUmVjdGFuZ2xlIiwic2V0WCIsIktFWV9YIiwiZ2V0WCIsInNldFkiLCJLRVlfWSIsImdldFkiLCJzZXRIZWlnaHQiLCJLRVlfSEVJR0hUIiwiZ2V0SGVpZ2h0IiwiSGFwdGljUmVjdCIsInNldFJlY3QiLCJyZWN0IiwiS0VZX1JFQ1QiLCJnZXRSZWN0Iiwic2V0SGFwdGljUmVjdERhdGEiLCJLRVlfSEFQVElDX1JFQ1RfREFUQSIsImdldEhhcHRpY1JlY3REYXRhIiwiU2VuZEhhcHRpY0RhdGFSZXNwb25zZSIsIkh5YnJpZEFwcFByZWZlcmVuY2UiLCJNT0JJTEUiLCJDTE9VRCIsIkNsb3VkQXBwUHJvcGVydGllcyIsInNldE5pY2tuYW1lcyIsIm5pY2tuYW1lcyIsIktFWV9OSUNLTkFNRVMiLCJnZXROaWNrbmFtZXMiLCJzZXRBcHBJRCIsImdldEFwcElEIiwic2V0RW5hYmxlZCIsIktFWV9FTkFCTEVEIiwiZ2V0RW5hYmxlZCIsInNldEF1dGhUb2tlbiIsInRva2VuIiwiS0VZX0FVVEhfVE9LRU4iLCJnZXRBdXRoVG9rZW4iLCJzZXRDbG91ZFRyYW5zcG9ydFR5cGUiLCJLRVlfQ0xPVURfVFJBTlNQT1JUX1RZUEUiLCJnZXRDbG91ZFRyYW5zcG9ydFR5cGUiLCJzZXRIeWJyaWRBcHBQcmVmZXJlbmNlIiwicHJlZmVyZW5jZSIsIktFWV9IWUJSSURfQVBQX1BSRUZFUkVOQ0UiLCJnZXRIeWJyaWRBcHBQcmVmZXJlbmNlIiwic2V0RW5kcG9pbnQiLCJlbmRwb2ludCIsIktFWV9FTkRQT0lOVCIsImdldEVuZHBvaW50IiwiU2V0Q2xvdWRBcHBQcm9wZXJ0aWVzUmVzcG9uc2UiLCJHZXRDbG91ZEFwcFByb3BlcnRpZXNSZXNwb25zZSIsInNldEFwcFNlcnZpY2VNYW5pZmVzdCIsIktFWV9BUFBfU0VSVklDRV9NQU5JRkVTVCIsImdldEFwcFNlcnZpY2VNYW5pZmVzdCIsIlB1Ymxpc2hBcHBTZXJ2aWNlUmVzcG9uc2UiLCJzZXRBcHBTZXJ2aWNlUmVjb3JkIiwiS0VZX0FQUF9TRVJWSUNFX1JFQ09SRCIsImdldEFwcFNlcnZpY2VSZWNvcmQiLCJVbnB1Ymxpc2hBcHBTZXJ2aWNlUmVzcG9uc2UiLCJOYXZpZ2F0aW9uSnVuY3Rpb24iLCJSRUdVTEFSIiwiQklGVVJDQVRJT04iLCJNVUxUSV9DQVJSSUFHRVdBWSIsIlJPVU5EQUJPVVQiLCJUUkFWRVJTQUJMRV9ST1VOREFCT1VUIiwiSlVHSEFORExFIiwiQUxMX1dBWV9ZSUVMRCIsIlRVUk5fQVJPVU5EIiwiRGlyZWN0aW9uIiwiTmF2aWdhdGlvbkFjdGlvbiIsIlRVUk4iLCJFWElUIiwiU1RBWSIsIk1FUkdFIiwiRkVSUlkiLCJDQVJfU0hVVFRMRV9UUkFJTiIsIldBWVBPSU5UIiwiTmF2aWdhdGlvbkluc3RydWN0aW9uIiwic2V0TG9jYXRpb25EZXRhaWxzIiwiZGV0YWlscyIsIktFWV9MT0NBVElPTl9ERVRBSUxTIiwiZ2V0TG9jYXRpb25EZXRhaWxzIiwic2V0QmVhcmluZyIsImJlYXJpbmciLCJLRVlfQkVBUklORyIsImdldEJlYXJpbmciLCJzZXRKdW5jdGlvblR5cGUiLCJLRVlfSlVOQ1RJT05fVFlQRSIsImdldEp1bmN0aW9uVHlwZSIsInNldERyaXZpbmdTaWRlIiwic2lkZSIsIktFWV9EUklWSU5HX1NJREUiLCJnZXREcml2aW5nU2lkZSIsInNldERldGFpbHMiLCJLRVlfREVUQUlMUyIsImdldERldGFpbHMiLCJOYXZpZ2F0aW9uU2VydmljZURhdGEiLCJzZXRPcmlnaW4iLCJLRVlfT1JJR0lOIiwiZ2V0T3JpZ2luIiwic2V0RGVzdGluYXRpb24iLCJLRVlfREVTVElOQVRJT04iLCJnZXREZXN0aW5hdGlvbiIsInNldERlc3RpbmF0aW9uRVRBIiwiS0VZX0RFU1RJTkFUSU9OX0VUQSIsImdldERlc3RpbmF0aW9uRVRBIiwic2V0SW5zdHJ1Y3Rpb25zIiwiaW5zdHJ1Y3Rpb25zIiwiS0VZX0lOU1RSVUNUSU9OUyIsImdldEluc3RydWN0aW9ucyIsInNldE5leHRJbnN0cnVjdGlvbkVUQSIsIktFWV9ORVhUX0lOU1RSVUNUSU9OX0VUQSIsImdldE5leHRJbnN0cnVjdGlvbkVUQSIsInNldE5leHRJbnN0cnVjdGlvbkRpc3RhbmNlIiwiS0VZX05FWFRfSU5TVFJVQ1RJT05fRElTVEFOQ0UiLCJnZXROZXh0SW5zdHJ1Y3Rpb25EaXN0YW5jZSIsInNldE5leHRJbnN0cnVjdGlvbkRpc3RhbmNlU2NhbGUiLCJLRVlfTkVYVF9JTlNUUlVDVElPTl9ESVNUQU5DRV9TQ0FMRSIsImdldE5leHRJbnN0cnVjdGlvbkRpc3RhbmNlU2NhbGUiLCJzZXRQcm9tcHQiLCJLRVlfUFJPTVBUIiwiZ2V0UHJvbXB0IiwiTWVkaWFUeXBlIiwiTVVTSUMiLCJQT0RDQVNUIiwiQVVESU9CT09LIiwiT1RIRVIiLCJNZWRpYVNlcnZpY2VEYXRhIiwic2V0TWVkaWFUeXBlIiwiS0VZX01FRElBX1RZUEUiLCJnZXRNZWRpYVR5cGUiLCJzZXRNZWRpYVRpdGxlIiwiS0VZX01FRElBX1RJVExFIiwiZ2V0TWVkaWFUaXRsZSIsInNldE1lZGlhQXJ0aXN0IiwiYXJ0aXN0IiwiS0VZX01FRElBX0FSVElTVCIsImdldE1lZGlhQXJ0aXN0Iiwic2V0TWVkaWFBbGJ1bSIsImFsYnVtIiwiS0VZX01FRElBX0FMQlVNIiwiZ2V0TWVkaWFBbGJ1bSIsInNldFBsYXlsaXN0TmFtZSIsIktFWV9QTEFZTElTVF9OQU1FIiwiZ2V0UGxheWxpc3ROYW1lIiwic2V0SXNFeHBsaWNpdCIsImV4cGxpY2l0IiwiS0VZX0lTX0VYUExJQ0lUIiwiZ2V0SXNFeHBsaWNpdCIsInNldFRyYWNrUGxheWJhY2tQcm9ncmVzcyIsInByb2dyZXNzIiwiS0VZX1RSQUNLX1BMQVlCQUNLX1BST0dSRVNTIiwiZ2V0VHJhY2tQbGF5YmFja1Byb2dyZXNzIiwic2V0VHJhY2tQbGF5YmFja0R1cmF0aW9uIiwiS0VZX1RSQUNLX1BMQVlCQUNLX0RVUkFUSU9OIiwiZ2V0VHJhY2tQbGF5YmFja0R1cmF0aW9uIiwic2V0UXVldWVQbGF5YmFja1Byb2dyZXNzIiwiS0VZX1FVRVVFX1BMQVlCQUNLX1BST0dSRVNTIiwiZ2V0UXVldWVQbGF5YmFja1Byb2dyZXNzIiwic2V0UXVldWVQbGF5YmFja0R1cmF0aW9uIiwiS0VZX1FVRVVFX1BMQVlCQUNLX0RVUkFUSU9OIiwiZ2V0UXVldWVQbGF5YmFja0R1cmF0aW9uIiwic2V0UXVldWVDdXJyZW50VHJhY2tOdW1iZXIiLCJLRVlfUVVFVUVfQ1VSUkVOVF9UUkFDS19OVU1CRVIiLCJnZXRRdWV1ZUN1cnJlbnRUcmFja051bWJlciIsInNldFF1ZXVlVG90YWxUcmFja0NvdW50IiwiS0VZX1FVRVVFX1RPVEFMX1RSQUNLX0NPVU5UIiwiZ2V0UXVldWVUb3RhbFRyYWNrQ291bnQiLCJzZXRNZWRpYUltYWdlIiwiS0VZX01FRElBX0lNQUdFIiwiZ2V0TWVkaWFJbWFnZSIsIldlYXRoZXJEYXRhIiwic2V0VGVtcGVyYXR1cmVIaWdoIiwiS0VZX1RFTVBFUkFUVVJFX0hJR0giLCJnZXRUZW1wZXJhdHVyZUhpZ2giLCJzZXRUZW1wZXJhdHVyZUxvdyIsIktFWV9URU1QRVJBVFVSRV9MT1ciLCJnZXRUZW1wZXJhdHVyZUxvdyIsInNldEFwcGFyZW50VGVtcGVyYXR1cmUiLCJLRVlfQVBQQVJFTlRfVEVNUEVSQVRVUkUiLCJnZXRBcHBhcmVudFRlbXBlcmF0dXJlIiwic2V0QXBwYXJlbnRUZW1wZXJhdHVyZUhpZ2giLCJLRVlfQVBQQVJFTlRfVEVNUEVSQVRVUkVfSElHSCIsImdldEFwcGFyZW50VGVtcGVyYXR1cmVIaWdoIiwic2V0QXBwYXJlbnRUZW1wZXJhdHVyZUxvdyIsIktFWV9BUFBBUkVOVF9URU1QRVJBVFVSRV9MT1ciLCJnZXRBcHBhcmVudFRlbXBlcmF0dXJlTG93Iiwic2V0V2VhdGhlclN1bW1hcnkiLCJzdW1tYXJ5IiwiS0VZX1dFQVRIRVJfU1VNTUFSWSIsImdldFdlYXRoZXJTdW1tYXJ5IiwiS0VZX1RJTUUiLCJzZXRIdW1pZGl0eSIsIktFWV9IVU1JRElUWSIsImdldEh1bWlkaXR5Iiwic2V0Q2xvdWRDb3ZlciIsImNvdmVyIiwiS0VZX0NMT1VEX0NPVkVSIiwiZ2V0Q2xvdWRDb3ZlciIsInNldE1vb25QaGFzZSIsInBoYXNlIiwiS0VZX01PT05fUEhBU0UiLCJnZXRNb29uUGhhc2UiLCJzZXRXaW5kQmVhcmluZyIsIktFWV9XSU5EX0JFQVJJTkciLCJnZXRXaW5kQmVhcmluZyIsInNldFdpbmRHdXN0IiwiZ3VzdCIsIktFWV9XSU5EX0dVU1QiLCJnZXRXaW5kR3VzdCIsInNldFdpbmRTcGVlZCIsIktFWV9XSU5EX1NQRUVEIiwiZ2V0V2luZFNwZWVkIiwic2V0TmVhcmVzdFN0b3JtQmVhcmluZyIsIktFWV9ORUFSRVNUX1NUT1JNX0JFQVJJTkciLCJnZXROZWFyZXN0U3Rvcm1CZWFyaW5nIiwic2V0TmVhcmVzdFN0b3JtRGlzdGFuY2UiLCJLRVlfTkVBUkVTVF9TVE9STV9ESVNUQU5DRSIsImdldE5lYXJlc3RTdG9ybURpc3RhbmNlIiwic2V0UHJlY2lwQWNjdW11bGF0aW9uIiwiYWNjdW11bGF0aW9uIiwiS0VZX1BSRUNJUF9BQ0NVTVVMQVRJT04iLCJnZXRQcmVjaXBBY2N1bXVsYXRpb24iLCJzZXRQcmVjaXBJbnRlbnNpdHkiLCJpbnRlbnNpdHkiLCJLRVlfUFJFQ0lQX0lOVEVOU0lUWSIsImdldFByZWNpcEludGVuc2l0eSIsInNldFByZWNpcFByb2JhYmlsaXR5IiwicHJvYmFiaWxpdHkiLCJLRVlfUFJFQ0lQX1BST0JBQklMSVRZIiwiZ2V0UHJlY2lwUHJvYmFiaWxpdHkiLCJzZXRQcmVjaXBUeXBlIiwiS0VZX1BSRUNJUF9UWVBFIiwiZ2V0UHJlY2lwVHlwZSIsInNldFZpc2liaWxpdHkiLCJ2aXNpYmlsaXR5IiwiS0VZX1ZJU0lCSUxJVFkiLCJnZXRWaXNpYmlsaXR5Iiwic2V0V2VhdGhlckljb24iLCJLRVlfV0VBVEhFUl9JQ09OIiwiZ2V0V2VhdGhlckljb24iLCJXZWF0aGVyQWxlcnQiLCJzZXRUaXRsZSIsIktFWV9USVRMRSIsImdldFRpdGxlIiwic2V0U3VtbWFyeSIsIktFWV9TVU1NQVJZIiwiZ2V0U3VtbWFyeSIsInNldEV4cGlyZXMiLCJleHBpcmVzIiwiS0VZX0VYUElSRVMiLCJnZXRFeHBpcmVzIiwic2V0UmVnaW9ucyIsInJlZ2lvbnMiLCJLRVlfUkVHSU9OUyIsImdldFJlZ2lvbnMiLCJzZXRTZXZlcml0eSIsInNldmVyaXR5IiwiS0VZX1NFVkVSSVRZIiwiZ2V0U2V2ZXJpdHkiLCJzZXRUaW1lSXNzdWVkIiwiaXNzdWVkIiwiS0VZX1RJTUVfSVNTVUVEIiwiZ2V0VGltZUlzc3VlZCIsIldlYXRoZXJTZXJ2aWNlRGF0YSIsInNldEN1cnJlbnRGb3JlY2FzdCIsImZvcmVjYXN0IiwiS0VZX0NVUlJFTlRfRk9SRUNBU1QiLCJnZXRDdXJyZW50Rm9yZWNhc3QiLCJzZXRNaW51dGVGb3JlY2FzdCIsIktFWV9NSU5VVEVfRk9SRUNBU1QiLCJnZXRNaW51dGVGb3JlY2FzdCIsInNldEhvdXJseUZvcmVjYXN0IiwiS0VZX0hPVVJMWV9GT1JFQ0FTVCIsImdldEhvdXJseUZvcmVjYXN0Iiwic2V0TXVsdGlkYXlGb3JlY2FzdCIsIktFWV9NVUxUSURBWV9GT1JFQ0FTVCIsImdldE11bHRpZGF5Rm9yZWNhc3QiLCJzZXRBbGVydHMiLCJhbGVydHMiLCJLRVlfQUxFUlRTIiwiZ2V0QWxlcnRzIiwiQXBwU2VydmljZURhdGEiLCJzZXRNZWRpYVNlcnZpY2VEYXRhIiwiS0VZX01FRElBX1NFUlZJQ0VfREFUQSIsImdldE1lZGlhU2VydmljZURhdGEiLCJzZXRXZWF0aGVyU2VydmljZURhdGEiLCJLRVlfV0VBVEhFUl9TRVJWSUNFX0RBVEEiLCJnZXRXZWF0aGVyU2VydmljZURhdGEiLCJzZXROYXZpZ2F0aW9uU2VydmljZURhdGEiLCJLRVlfTkFWSUdBVElPTl9TRVJWSUNFX0RBVEEiLCJnZXROYXZpZ2F0aW9uU2VydmljZURhdGEiLCJHZXRBcHBTZXJ2aWNlRGF0YVJlc3BvbnNlIiwic2V0U2VydmljZURhdGEiLCJLRVlfU0VSVklDRV9EQVRBIiwiZ2V0U2VydmljZURhdGEiLCJzZXRTZXJ2aWNlVXJpIiwidXJpIiwiS0VZX1NFUlZJQ0VfVVJJIiwiZ2V0U2VydmljZVVyaSIsInNldE9yaWdpbkFwcCIsImFwcCIsIktFWV9PUklHSU5fQVBQIiwiZ2V0T3JpZ2luQXBwIiwic2V0UmVxdWVzdFNlcnZpY2VBY3RpdmUiLCJLRVlfUkVRVUVTVF9TRVJWSUNFX0FDVElWRSIsImdldFJlcXVlc3RTZXJ2aWNlQWN0aXZlIiwiUGVyZm9ybUFwcFNlcnZpY2VJbnRlcmFjdGlvblJlc3BvbnNlIiwic2V0U2VydmljZVNwZWNpZmljUmVzdWx0IiwiS0VZX1NFUlZJQ0VfU1BFQ0lGSUNfUkVTVUxUIiwiZ2V0U2VydmljZVNwZWNpZmljUmVzdWx0Iiwic2V0RnVuY3Rpb25JRCIsIktFWV9GVU5DVElPTl9JRCIsImdldEZ1bmN0aW9uSUQiLCJDYW5jZWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiQ2xvc2VBcHBsaWNhdGlvblJlc3BvbnNlIiwiU3lzdGVtQ29udGV4dCIsIlNZU0NUWFRfTUFJTiIsIlNZU0NUWFRfVlJTRVNTSU9OIiwiU1lTQ1RYVF9NRU5VIiwiU1lTQ1RYVF9ITUlfT0JTQ1VSRUQiLCJTWVNDVFhUX0FMRVJUIiwiUnBjTm90aWZpY2F0aW9uIiwiQXVkaW9TdHJlYW1pbmdTdGF0ZSIsIkFVRElCTEUiLCJBVFRFTlVBVEVEIiwiTk9UX0FVRElCTEUiLCJITUlMZXZlbCIsIkhNSV9GVUxMIiwiSE1JX0xJTUlURUQiLCJITUlfQkFDS0dST1VORCIsIkhNSV9OT05FIiwiVmlkZW9TdHJlYW1pbmdTdGF0ZSIsIlNUUkVBTUFCTEUiLCJOT1RfU1RSRUFNQUJMRSIsInNldEhtaUxldmVsIiwiS0VZX0hNSV9MRVZFTCIsImdldEhtaUxldmVsIiwic2V0QXVkaW9TdHJlYW1pbmdTdGF0ZSIsIktFWV9BVURJT19TVFJFQU1JTkdfU1RBVEUiLCJnZXRBdWRpb1N0cmVhbWluZ1N0YXRlIiwic2V0U3lzdGVtQ29udGV4dCIsIktFWV9TWVNURU1fQ09OVEVYVCIsImdldFN5c3RlbUNvbnRleHQiLCJzZXRWaWRlb1N0cmVhbWluZ1N0YXRlIiwiS0VZX1ZJREVPX1NUUkVBTUlOR19TVEFURSIsImdldFZpZGVvU3RyZWFtaW5nU3RhdGUiLCJBcHBJbnRlcmZhY2VVbnJlZ2lzdGVyZWRSZWFzb24iLCJJR05JVElPTl9PRkYiLCJCTFVFVE9PVEhfT0ZGIiwiVVNCX0RJU0NPTk5FQ1RFRCIsIlJFUVVFU1RfV0hJTEVfSU5fTk9ORV9ITUlfTEVWRUwiLCJUT09fTUFOWV9SRVFVRVNUUyIsIkRSSVZFUl9ESVNUUkFDVElPTl9WSU9MQVRJT04iLCJMQU5HVUFHRV9DSEFOR0UiLCJNQVNURVJfUkVTRVQiLCJGQUNUT1JZX0RFRkFVTFRTIiwiQVBQX1VOQVVUSE9SSVpFRCIsIlBST1RPQ09MX1ZJT0xBVElPTiIsIlVOU1VQUE9SVEVEX0hNSV9SRVNPVVJDRSIsInNldFJlYXNvbiIsIktFWV9SRUFTT04iLCJnZXRSZWFzb24iLCJCdXR0b25FdmVudE1vZGUiLCJCVVRUT05VUCIsIkJVVFRPTkRPV04iLCJzZXRCdXR0b25FdmVudE1vZGUiLCJLRVlfQlVUVE9OX0VWRU5UX01PREUiLCJnZXRCdXR0b25FdmVudE1vZGUiLCJzZXRDdXN0b21CdXR0b25JRCIsIktFWV9DVVNUT01fQlVUVE9OX0lEIiwiZ2V0Q3VzdG9tQnV0dG9uSUQiLCJUQlRTdGF0ZSIsIlJPVVRFX1VQREFURV9SRVFVRVNUIiwiUk9VVEVfQUNDRVBURUQiLCJST1VURV9SRUZVU0VEIiwiUk9VVEVfQ0FOQ0VMTEVEIiwiRVRBX1JFUVVFU1QiLCJORVhUX1RVUk5fUkVRVUVTVCIsIlJPVVRFX1NUQVRVU19SRVFVRVNUIiwiUk9VVEVfU1VNTUFSWV9SRVFVRVNUIiwiVFJJUF9TVEFUVVNfUkVRVUVTVCIsIlJPVVRFX1VQREFURV9SRVFVRVNUX1RJTUVPVVQiLCJEcml2ZXJEaXN0cmFjdGlvblN0YXRlIiwiRERfT04iLCJERF9PRkYiLCJzZXRMb2NrU2NyZWVuRGlzbWlzc2FsRW5hYmxlZCIsIktFWV9MT0NLX1NDUkVFTl9ESVNNSVNTQUxfRU5BQkxFRCIsImdldExvY2tTY3JlZW5EaXNtaXNzYWxFbmFibGVkIiwic2V0TG9ja1NjcmVlbkRpc21pc3NhbFdhcm5pbmciLCJ3YXJuaW5nIiwiS0VZX0xPQ0tfU0NSRUVOX0RJU01JU1NBTF9XQVJOSU5HIiwiZ2V0TG9ja1NjcmVlbkRpc21pc3NhbFdhcm5pbmciLCJITUlQZXJtaXNzaW9ucyIsInNldFVzZXJEaXNhbGxvd2VkIiwiZGlzYWxsb3dlZCIsIktFWV9VU0VSX0RJU0FMTE9XRUQiLCJnZXRVc2VyRGlzYWxsb3dlZCIsIlBhcmFtZXRlclBlcm1pc3Npb25zIiwiUGVybWlzc2lvbkl0ZW0iLCJzZXRScGNOYW1lIiwiS0VZX1JQQ19OQU1FIiwiZ2V0UnBjTmFtZSIsInNldEhtaVBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJLRVlfSE1JX1BFUk1JU1NJT05TIiwiZ2V0SG1pUGVybWlzc2lvbnMiLCJzZXRQYXJhbWV0ZXJQZXJtaXNzaW9ucyIsIktFWV9QQVJBTUVURVJfUEVSTUlTU0lPTlMiLCJnZXRQYXJhbWV0ZXJQZXJtaXNzaW9ucyIsInNldFJlcXVpcmVFbmNyeXB0aW9uIiwiS0VZX1JFUVVJUkVfRU5DUllQVElPTiIsImdldFJlcXVpcmVFbmNyeXB0aW9uIiwic2V0UGVybWlzc2lvbkl0ZW0iLCJLRVlfUEVSTUlTU0lPTl9JVEVNIiwiZ2V0UGVybWlzc2lvbkl0ZW0iLCJLZXlib2FyZEV2ZW50IiwiS0VZUFJFU1MiLCJFTlRSWV9TVUJNSVRURUQiLCJFTlRSWV9WT0lDRSIsIkVOVFJZX0NBTkNFTExFRCIsIkVOVFJZX0FCT1JURUQiLCJzZXRFdmVudCIsIktFWV9FVkVOVCIsImdldEV2ZW50IiwiVG91Y2hDb29yZCIsIlRvdWNoRXZlbnQiLCJzZXRUcyIsInRzIiwiS0VZX1RTIiwiZ2V0VHMiLCJzZXRDIiwiS0VZX0MiLCJnZXRDIiwiVG91Y2hUeXBlIiwiQkVHSU4iLCJNT1ZFIiwiRU5EIiwiQ0FOQ0VMIiwic2V0VXJsIiwidXJsIiwiS0VZX1VSTCIsImdldFVybCIsInNldEFsbG9jYXRlZE1vZHVsZXMiLCJLRVlfQUxMT0NBVEVEX01PRFVMRVMiLCJnZXRBbGxvY2F0ZWRNb2R1bGVzIiwic2V0RnJlZU1vZHVsZXMiLCJLRVlfRlJFRV9NT0RVTEVTIiwiZ2V0RnJlZU1vZHVsZXMiLCJFbmNvZGVkU3luY1BEYXRhUmVzcG9uc2UiLCJzZXRVUkwiLCJnZXRVUkwiLCJScGNDcmVhdG9yIiwiY29uc3RydWN0IiwicnBjTmFtZSIsImpzb25EYXRhIiwiU2RsUHJvdG9jb2xCYXNlIiwiYmFzZVRyYW5zcG9ydENvbmZpZyIsInNkbFByb3RvY29sTGlzdGVuZXIiLCJfYmFzZVRyYW5zcG9ydENvbmZpZyIsIl9zZGxQcm90b2NvbExpc3RlbmVyIiwiX3RyYW5zcG9ydE1hbmFnZXIiLCJfcmVzZXQiLCJfY3JlYXRlVHJhbnNwb3J0TGlzdGVuZXIiLCJfcHJvdG9jb2xWZXJzaW9uIiwiX2hlYWRlclNpemUiLCJWMV9IRUFERVJfU0laRSIsIl9zZXJ2aWNlU3RhdHVzIiwiX210dXMiLCJWMV9WMl9NVFVfU0laRSIsIl9oYXNoSUQiLCJfbWVzc2FnZUZyYW1lQXNzZW1ibGVycyIsInNldFRyYW5zcG9ydE1hbmFnZXIiLCJtYW5hZ2VyIiwic3RhcnRTZXJ2aWNlIiwiX3RyYW5zcG9ydExpc3RlbmVyIiwiX2hhbmRsZVRyYW5zcG9ydENvbm5lY3RlZCIsIl9oYW5kbGVQYWNrZXRSZWNlaXZlZCIsInByb3RvY29sVmVyc2lvbiIsIk1BWF9QUk9UT0NPTF9WRVJTSU9OIiwic2VuZFBhY2tldCIsInZpZGVvU3RyZWFtaW5nUGFyYW1ldGVycyIsImRlc2lyZWRSZXNvbHV0aW9uIiwiZGVzaXJlZEZvcm1hdCIsImdldEZvcm1hdCIsImdldE10dSIsInJldFZhbCIsImlzQ29ubmVjdGVkIiwiZ2V0UHJvdG9jb2xWZXJzaW9uIiwiX3NldFZlcnNpb24iLCJWMl9IRUFERVJfU0laRSIsIlYzX1Y0X01UVV9TSVpFIiwiX2dldE5leHRNZXNzYWdlSUQiLCJzZW5kUnBjIiwiX2hhbmRsZUNvbnRyb2xQYWNrZXQiLCJtZXNzYWdlRnJhbWVBc3NlbWJsZXIiLCJfZ2V0TWVzc2FnZUZyYW1lQXNzZW1ibGVyIiwiX2hhbmRsZU9uTWVzc2FnZUFzc2VtYmxlZCIsIl9oYW5kbGVSUENQYWNrZXQiLCJfaGFuZGxlUHJvdG9jb2xIZWFydGJlYXQiLCJfaGFuZGxlUHJvdG9jb2xIZWFydGJlYXRBQ0siLCJfaGFuZGxlU3RhcnRTZXJ2aWNlQUNLIiwiX2hhbmRsZVN0YXJ0U2VydmljZU5BSyIsIl9oYW5kbGVFbmRTZXJ2aWNlQUNLIiwiX2hhbmRsZUVuZFNlcnZpY2UiLCJfaGFuZGxlRW5kU2VydmljZU5BSyIsImhlYXJ0YmVhdCIsIm10dVRhZyIsIk5BViIsImFjY2VwdGVkUmVzb2x1dGlvbiIsImFjY2VwdGVkRm9ybWF0IiwiYWdyZWVkVmlkZW9QYXJhbXMiLCJzZXRGb3JtYXQiLCJfaGFuZGxlU2VydmljZUVuZGVkIiwicmVqZWN0ZWRUYWciLCJyZWplY3RlZFBhcmFtcyIsImVuZFNlcnZpY2UiLCJUcmFuc3BvcnRUeXBlIiwiV0VCU09DS0VUX0NMSUVOVCIsIldFQlNPQ0tFVF9TRVJWRVIiLCJDVVNUT00iLCJTZGxQc20iLCJyZXNldCIsIl9zdGF0ZSIsIlNUQVJUX1NUQVRFIiwiX2NvbnRyb2xGcmFtZUluZm8iLCJfZHVtcFNpemUiLCJfZGF0YUxlbmd0aCIsImdldEZvcm1lZFBhY2tldCIsIkZJTklTSEVEX1NUQVRFIiwiaGFuZGxlQnl0ZSIsIl90cmFuc2l0aW9uT25JbnB1dCIsIkVSUk9SX1NUQVRFIiwicmF3Qnl0ZSIsIlZFUlNJT05fTUFTSyIsIkVOQ1JZUFRJT05fTUFTSyIsIkZSQU1FX1RZUEVfTUFTSyIsIlNFUlZJQ0VfVFlQRV9TVEFURSIsIkNPTlRST0xfRlJBTUVfSU5GT19TVEFURSIsIlNFU1NJT05fSURfU1RBVEUiLCJEQVRBX1NJWkVfMV9TVEFURSIsIkRBVEFfU0laRV8yX1NUQVRFIiwiREFUQV9TSVpFXzNfU1RBVEUiLCJEQVRBX1NJWkVfNF9TVEFURSIsIkRBVEFfUFVNUF9TVEFURSIsIkZJUlNUX0ZSQU1FX0RBVEFfU0laRSIsIk1FU1NBR0VfMV9TVEFURSIsIk1FU1NBR0VfMl9TVEFURSIsIk1FU1NBR0VfM19TVEFURSIsIk1FU1NBR0VfNF9TVEFURSIsIlRyYW5zcG9ydEJhc2UiLCJ0cmFuc3BvcnRDYWxsYmFjayIsIl9zZGxQc20iLCJfdHJhbnNwb3J0Q2FsbGJhY2siLCJzdG9wIiwic2V0VHJhbnNwb3J0Q2FsbGJhY2siLCJXZWJTb2NrZXRDbGllbnQiLCJjb25maWciLCJfcXVldWUiLCJfaXNSdW5uaW5nIiwiX3dzVXJsIiwiZ2V0SG9zdCIsImdldFBvcnQiLCJfd3MiLCJfaW5pdCIsIldlYlNvY2tldCIsIm9ub3BlbiIsIm9uQ29ubmVjdGlvbkVzdGFibGlzaGVkIiwib25lcnJvciIsIm9ubWVzc2FnZSIsIl9oYW5kbGVJbmNvbWluZyIsIm9uY2xvc2UiLCJvbkNvbm5lY3Rpb25UZXJtaW5hdGVkIiwiY2xvc2UiLCJwYWNrZXQiLCJzZW5kIiwiX211bHRpQnl0ZUhhbmRsZXIiLCJtc2dEYXRhIiwiUmVzcG9uc2UiLCJhcnJheUJ1ZmZlciIsInRoZW4iLCJfaGFuZGxlQnl0ZSIsImlzRmluaXNoZWQiLCJUcmFuc3BvcnRDYWxsYmFjayIsIl9vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCIsIl9vbkNvbm5lY3Rpb25UZXJtaW5hdGVkIiwic2V0T25Db25uZWN0aW9uRXN0YWJsaXNoZWQiLCJzZXRPbkNvbm5lY3Rpb25UZXJtaW5hdGVkIiwiVHJhbnNwb3J0TWFuYWdlckJhc2UiLCJ0cmFuc3BvcnRMaXN0ZW5lciIsIl90cmFuc3BvcnQiLCJfaXNDb25uZWN0ZWQiLCJnZXRUcmFuc3BvcnRUeXBlIiwiZ2V0VHJhbnNwb3J0IiwidHJhbnNwb3J0VHlwZSIsInJlcXVpcmUkJDEiLCJXZWJTb2NrZXRTZXJ2ZXIiLCJfY29ubmVjdGlvbkxvc3RJbnRlcnZhbCIsImNsaWVudCIsImdldENsaWVudCIsImNvbm5lY3Rpb25Mb3N0VGltZW91dCIsImdldENvbm5lY3Rpb25Mb3N0VGltZW91dCIsIl9oYW5kbGVNZXNzYWdlIiwiX3N0b3BDb25uZWN0aW9uTG9zdEludGVydmFsIiwiZXJyb3JFdmVudCIsImlzQWxpdmUiLCJzZXRJbnRlcnZhbCIsInRlcm1pbmF0ZSIsInBpbmciLCJyZWFkeVN0YXRlIiwiY2xlYXJJbnRlcnZhbCIsInN0YXRlUHJvZ3Jlc3MiLCJtZXNzYWdlSW5kZXgiLCJyZXF1aXJlJCQyIiwiVHJhbnNwb3J0TWFuYWdlciIsIlNkbFByb3RvY29sIiwiU2VydmljZUxpc3RlbmVyTWFwIiwiX2xpc3RlbmVycyIsImFkZExpc3RlbmVyIiwic2VydmljZUxpc3RlbmVyIiwicmVtb3ZlTGlzdGVuZXIiLCJsaXN0ZW5lckFycmF5IiwicmVtb3ZlZCIsInNlbmRFdmVudFNlcnZpY2VTdGFydGVkIiwic2Vzc2lvbiIsInNlbmRFdmVudFNlcnZpY2VFbmRlZCIsInNlbmRFdmVudFNlcnZpY2VFcnJvciIsIm9uU2VydmljZUVycm9yIiwiREVGQVVMVF9QUk9UT0NPTCIsIkRFRkFVTFRfQ09ERUMiLCJERUZBVUxUX1dJRFRIIiwiREVGQVVMVF9IRUlHSFQiLCJERUZBVUxUX0RFTlNJVFkiLCJERUZBVUxUX0ZSQU1FUkFURSIsIkRFRkFVTFRfQklUUkFURSIsIkRFRkFVTFRfSU5URVJWQUwiLCJERUZBVUxUX1NDQUxFIiwiVmlkZW9TdHJlYW1pbmdQYXJhbWV0ZXJzIiwiZGlzcGxheURlbnNpdHkiLCJmcmFtZVJhdGUiLCJpbnRlcnZhbCIsIl9kaXNwbGF5RGVuc2l0eSIsIl9mcmFtZVJhdGUiLCJfYml0cmF0ZSIsIl9pbnRlcnZhbCIsIl9yZXNvbHV0aW9uIiwiX2Zvcm1hdCIsInVwZGF0ZSIsInNldERpc3BsYXlEZW5zaXR5IiwiZ2V0RGlzcGxheURlbnNpdHkiLCJzZXRGcmFtZVJhdGUiLCJnZXRGcmFtZVJhdGUiLCJzZXRCaXRyYXRlIiwiZ2V0Qml0cmF0ZSIsImdldEludGVydmFsIiwiU2RsU2Vzc2lvbiIsInNkbFNlc3Npb25MaXN0ZW5lciIsIl9zZXNzaW9uSGFzaElkIiwiX3NkbFNlc3Npb25MaXN0ZW5lciIsIl9zZXJ2aWNlTGlzdGVuZXJzIiwiX3NldHVwU2RsUHJvdG9jb2xMaXN0ZW5lciIsIl9zZGxQcm90b2NvbCIsImdldEN1cnJlbnRUcmFuc3BvcnRUeXBlIiwiZ2V0SXNDb25uZWN0ZWQiLCJnZXRTZXNzaW9uSGFzaElkIiwiYWRkU2VydmljZUxpc3RlbmVyIiwic2RsU2VydmljZUxpc3RlbmVyIiwicmVtb3ZlU2VydmljZUxpc3RlbmVyIiwiZ2V0U2VydmljZUxpc3RlbmVycyIsInNldERlc2lyZWRWaWRlb1BhcmFtcyIsIl9kZXNpcmVkVmlkZW9QYXJhbXMiLCJTZGxTZXNzaW9uTGlzdGVuZXIiLCJjb3JyZWxhdGlvbkkiLCJBcnJheVRvb2xzIiwiYXJyYXlSZW1vdmUiLCJlbGUiLCJMaWZlY3ljbGVNYW5hZ2VyIiwiYXBwQ29uZmlnIiwibGlmZWN5Y2xlTGlzdGVuZXIiLCJfYXBwQ29uZmlnIiwiX2xpZmVjeWNsZUxpc3RlbmVyIiwiX3NkbFNlc3Npb24iLCJfY3JlYXRlU2Vzc2lvbkxpc3RlbmVyIiwiX2N1cnJlbnRITUlTdGF0dXMiLCJfZmlyc3RUaW1lRnVsbCIsIl9yZXNwb25zZUxpc3RlbmVycyIsIl9tYXhDb3JyZWxhdGlvbklkIiwiX3JwY0xpc3RlbmVycyIsInNlc3Npb25MaXN0ZW5lciIsInNlbmRScGNNZXNzYWdlIiwiX2NyZWF0ZVJlZ2lzdGVyQXBwSW50ZXJmYWNlIiwiX2hhbmRsZVJwYyIsImZ1bmN0aW9uSUQiLCJyZXNvbHZlIiwiX3NldHVwSW50ZXJuYWxScGNMaXN0ZW5lcnMiLCJhZGRScGNMaXN0ZW5lciIsInJwY0xpc3RlbmVyIiwicmVtb3ZlUnBjTGlzdGVuZXIiLCJnZXRSZWdpc3RlckFwcEludGVyZmFjZVJlc3BvbnNlIiwiX3JlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UiLCJyZWdpc3RlckFwcEludGVyZmFjZSIsIk1BWF9SUENfVkVSU0lPTiIsIlJFR0lTVEVSX0FQUF9JTlRFUkZBQ0VfQ09SUkVMQVRJT05fSUQiLCJfcnBjTGlzdGVuZXIiLCJfcHJvY2Vzc1JhaVJlc3BvbnNlIiwic2hvdWxkSW5pdCIsInJlZ2lzdGVyQXBwSW50ZXJmYWNlUmVzcG9uc2UiLCJtc2dWZXJzaW9uIiwiVU5SRUdJU1RFUl9BUFBfSU5URVJGQUNFX0NPUlJFTEFUSU9OX0lEIiwiQXBwU2VydmljZVR5cGUiLCJXRUFUSEVSIiwiTWFpbnRlbmFuY2VNb2RlU3RhdHVzIiwiTU1TX05PUk1BTCIsIk1NU19ORUFSIiwiTU1TX0FDVElWRSIsIk1NU19GRUFUVVJFX05PVF9QUkVTRU5UIiwiUGVybWlzc2lvblN0YXR1cyIsIlBTX0FMTE9XRUQiLCJQU19ESVNBTExPV0VEIiwiUFNfVVNFUl9ESVNBTExPV0VEIiwiUFNfVVNFUl9DT05TRU5UX1BFTkRJTkciLCJQcmVkZWZpbmVkTGF5b3V0IiwiTk9OX01FRElBIiwiT05TQ1JFRU5fUFJFU0VUUyIsIk5BVl9GVUxMU0NSRUVOX01BUCIsIk5BVl9MSVNUIiwiTkFWX0tFWUJPQVJEIiwiR1JBUEhJQ19XSVRIX1RFWFQiLCJURVhUX1dJVEhfR1JBUEhJQyIsIlRJTEVTX09OTFkiLCJURVhUQlVUVE9OU19PTkxZIiwiR1JBUEhJQ19XSVRIX1RJTEVTIiwiVElMRVNfV0lUSF9HUkFQSElDIiwiR1JBUEhJQ19XSVRIX1RFWFRfQU5EX1NPRlRCVVRUT05TIiwiVEVYVF9BTkRfU09GVEJVVFRPTlNfV0lUSF9HUkFQSElDIiwiR1JBUEhJQ19XSVRIX1RFWFRCVVRUT05TIiwiVEVYVEJVVFRPTlNfV0lUSF9HUkFQSElDIiwiTEFSR0VfR1JBUEhJQ19XSVRIX1NPRlRCVVRUT05TIiwiRE9VQkxFX0dSQVBISUNfV0lUSF9TT0ZUQlVUVE9OUyIsIkxBUkdFX0dSQVBISUNfT05MWSIsIlByZWRlZmluZWRXaW5kb3dzIiwiREVGQVVMVF9XSU5ET1ciLCJQUklNQVJZX1dJREdFVCIsIlRpbWVyTW9kZSIsIlVQIiwiRE9XTiIsIlZlaGljbGVEYXRhQWN0aXZlU3RhdHVzIiwiVkRBU19JTkFDVElWRV9OT1RfQ09ORklSTUVEIiwiVkRBU19JTkFDVElWRV9DT05GSVJNRUQiLCJWREFTX0FDVElWRV9OT1RfQ09ORklSTUVEIiwiVkRBU19BQ1RJVkVfQ09ORklSTUVEIiwiVkRBU19GQVVMVCIsIm1lc3NhZ2VUeXBlIiwicmVxdWVzdCIsInJlc3BvbnNlIiwibm90aWZpY2F0aW9uIiwiU2RsU2VydmljZUxpc3RlbmVyIiwiX29uU2VydmljZUVycm9yIiwic2V0T25TZXJ2aWNlRXJyb3IiLCJDdXN0b21UcmFuc3BvcnQiLCJvblNlbmRQYWNrZXQiLCJvbkJ5dGVCdWZmZXJSZWNlaXZlZCIsInNkbFBzbSIsIlRyYW5zcG9ydENvbmZpZ0Jhc2UiLCJfdHJhbnNwb3J0VHlwZSIsIkN1c3RvbVRyYW5zcG9ydENvbmZpZyIsImN1c3RvbVRyYW5zcG9ydCIsIl9jdXN0b21UcmFuc3BvcnQiLCJTc2xDb25maWciLCJwZW1DZXJ0aWZpY2F0ZSIsInByaXZhdGVLZXkiLCJwYXNzd29yZCIsIl9wZW1DZXJ0aWZpY2F0ZSIsIl9wcml2YXRlS2V5IiwiX3Bhc3N3b3JkIiwiZ2V0UGVtQ2VydGlmaWNhdGUiLCJnZXRQcml2YXRlS2V5IiwiZ2V0UGFzc3dvcmQiLCJXZWJTb2NrZXRDbGllbnRDb25maWciLCJob3N0IiwicG9ydCIsIl9ob3N0IiwiX3BvcnQiLCJUcmFuc3BvcnRSZWNvcmQiLCJfYWRkcmVzcyIsIldlYlNvY2tldFNlcnZlckNvbmZpZyIsIl9jbGllbnQiLCJfY29ubmVjdGlvbkxvc3RUaW1lb3V0IiwiU0RMIiwibGlmZWN5Y2xlIiwiZW51bXMiLCJycGMiLCJtZXNzYWdlcyIsInN0cnVjdHMiLCJ2aWRlbyIsInRyYW5zcG9ydCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7SUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQWdDQTtJQUNBO0lBRUEsTUFBTUEsU0FBTixDQUFnQjtJQUNaOzs7SUFHQUMs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RSxDQUFDLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxJQUFHO0lBQ3JDLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU07O0lBRXRCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtJQUNuQixJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUM7SUFDckUsR0FBRzs7SUFFSDtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0EsRUFBRSxZQUFZLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFDOztJQUV4RTtJQUNBLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksRUFBQzs7SUFFM0M7SUFDQSxFQUFFLENBQUMsR0FBRyxZQUFZLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBRzs7SUFFdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFDOztJQUVYLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDNUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUM7SUFDdEssSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksS0FBSTtJQUNqQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxLQUFJO0lBQ2hDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUk7SUFDekIsR0FBRzs7SUFFSCxFQUFFLElBQUksWUFBWSxLQUFLLENBQUMsRUFBRTtJQUMxQixJQUFJLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBQztJQUN2RixJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFJO0lBQ3pCLEdBQUcsTUFBTSxJQUFJLFlBQVksS0FBSyxDQUFDLEVBQUU7SUFDakMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUM7SUFDbEksSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSTtJQUNoQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFJO0lBQ3pCLEdBQUc7O0lBRUgsRUFBRSxPQUFPLEdBQUc7SUFDWixDQUFDOztJQUVELFNBQVMsZUFBZSxFQUFFLEdBQUcsRUFBRTtJQUMvQixFQUFFLE9BQU8sTUFBTSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7SUFDM0csQ0FBQzs7SUFFRCxTQUFTLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtJQUN6QyxFQUFFLElBQUksSUFBRztJQUNULEVBQUUsSUFBSSxNQUFNLEdBQUcsR0FBRTtJQUNqQixFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtJQUN2QyxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFDO0lBQ2pFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUM7SUFDckMsR0FBRztJQUNILEVBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUN4QixDQUFDOztBQUVELElBQU8sU0FBUyxhQUFhLEVBQUUsS0FBSyxFQUFFO0lBQ3RDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRTtJQUNmLElBQUksSUFBSSxFQUFFLENBQUM7SUFDWCxHQUFHO0lBQ0gsRUFBRSxJQUFJLElBQUc7SUFDVCxFQUFFLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFNO0lBQ3hCLEVBQUUsSUFBSSxVQUFVLEdBQUcsR0FBRyxHQUFHLEVBQUM7SUFDMUIsRUFBRSxJQUFJLE1BQU0sR0FBRyxHQUFFO0lBQ2pCLEVBQUUsSUFBSSxLQUFLLEdBQUcsR0FBRTtJQUNoQixFQUFFLElBQUksY0FBYyxHQUFHLE1BQUs7O0lBRTVCO0lBQ0EsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUU7SUFDMUUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLGNBQWMsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQyxFQUFDO0lBQ2hHLEdBQUc7O0lBRUg7SUFDQSxFQUFFLElBQUksVUFBVSxLQUFLLENBQUMsRUFBRTtJQUN4QixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBQztJQUN4QixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBQztJQUM5QixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksRUFBQztJQUN2QyxJQUFJLE1BQU0sSUFBSSxLQUFJO0lBQ2xCLEdBQUcsTUFBTSxJQUFJLFVBQVUsS0FBSyxDQUFDLEVBQUU7SUFDL0IsSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFDO0lBQ2xELElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFDO0lBQy9CLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFDO0lBQ3ZDLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFDO0lBQ3ZDLElBQUksTUFBTSxJQUFJLElBQUc7SUFDakIsR0FBRzs7SUFFSCxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFDOztJQUVwQixFQUFFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDdkIsQ0FBQzs7SUM1R00sU0FBUyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtJQUMxRCxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUM7SUFDVixFQUFFLElBQUksSUFBSSxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUM7SUFDbEMsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksRUFBQztJQUM1QixFQUFFLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxFQUFDO0lBQ3ZCLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFDO0lBQ2hCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBQztJQUNqQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFDO0lBQ3ZCLEVBQUUsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7O0lBRTVCLEVBQUUsQ0FBQyxJQUFJLEVBQUM7O0lBRVIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFDO0lBQy9CLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFDO0lBQ2hCLEVBQUUsS0FBSyxJQUFJLEtBQUk7SUFDZixFQUFFLE9BQU8sS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxFQUFFOztJQUU1RSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUM7SUFDL0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUM7SUFDaEIsRUFBRSxLQUFLLElBQUksS0FBSTtJQUNmLEVBQUUsT0FBTyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLEVBQUU7O0lBRTVFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO0lBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQUs7SUFDakIsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtJQUN6QixJQUFJLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDO0lBQzlDLEdBQUcsTUFBTTtJQUNULElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUM7SUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQUs7SUFDakIsR0FBRztJQUNILEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDakQsQ0FBQzs7QUFFRCxJQUFPLFNBQVMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0lBQ2xFLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUM7SUFDYixFQUFFLElBQUksSUFBSSxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUM7SUFDbEMsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksRUFBQztJQUM1QixFQUFFLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxFQUFDO0lBQ3ZCLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFDO0lBQ2xFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFDO0lBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUM7SUFDdkIsRUFBRSxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBQzs7SUFFN0QsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUM7O0lBRXpCLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRTtJQUMxQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUM7SUFDNUIsSUFBSSxDQUFDLEdBQUcsS0FBSTtJQUNaLEdBQUcsTUFBTTtJQUNULElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFDO0lBQzlDLElBQUksSUFBSSxLQUFLLElB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LE1BQU0sRUFBQztNQUNsRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7TUFDcEI7O0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsU0FBUyxZQUFZLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtNQUN2RSxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUM7TUFDbEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDOUM7O0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsU0FBUyxZQUFZLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtNQUN2RSxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUM7TUFDbEQsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7TUFDOUM7O0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsU0FBUyxZQUFZLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtNQUN2RSxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUM7O01BRWxELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7V0FDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7V0FDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7V0FDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7TUFDbkM7O0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcs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QUFDLElBQUksRUFBRSxDQUFDO01BQzNCOztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFNBQVMsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7TUFDckUsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFDOztNQUVsRCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7U0FDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztNQUNyQjs7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxTQUFTLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO01BQ3JFLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBQztNQUNsRCxPQUFPQyxJQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztNQUMvQzs7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxTQUFTLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO01BQ3JFLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBQztNQUNsRCxPQUFPQSxJQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztNQUNoRDs7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxTQUFTLFlBQVksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO01BQ3ZFLElBQUks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 diff --git a/lib/rpc_spec b/lib/rpc_spec new file mode 160000 index 00000000..8bda2918 --- /dev/null +++ b/lib/rpc_spec @@ -0,0 +1 @@ +Subproject commit 8bda29189ca7f6e81d285d6aab9768cd83b93a14 diff --git a/package-lock.json b/package-lock.json index 53d6a4eb..e56ef6d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1578,6 +1578,12 @@ "babel-helper-is-void-0": "^0.4.3" } }, + "babel-plugin-transform-async-to-promises": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-promises/-/babel-plugin-transform-async-to-promises-0.8.15.tgz", + "integrity": "sha512-fDXP68ZqcinZO2WCiimCL9zhGjGXOnn3D33zvbh+yheZ/qOrNVVDDIBtAaM3Faz8TRvQzHiRKsu3hfrBAhEncQ==", + "dev": true + }, "babel-plugin-transform-inline-consecutive-adds": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz", diff --git a/package.json b/package.json index 7ec875ad..07b98342 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "devDependencies": { "@babel/preset-env": "^7.7.1", "babel-minify-webpack-plugin": "^0.3.1", + "babel-plugin-transform-async-to-promises": "^0.8.15", "bson": "^4.0.2", "chai": "^4.2.0", "eslint": "^6.6.0", diff --git a/rollup.config.js b/rollup.config.js index 810f0e1b..48a71540 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -22,6 +22,7 @@ export default [{ // Vanilla JS source commonjs(), babel({ exclude: 'node_modules/**', // only transpile our source code + plugins: ["babel-plugin-transform-async-to-promises"] // convert async/await syntax }), uglify(), ], @@ -42,6 +43,7 @@ export default [{ // Vanilla JS source commonjs(), babel({ exclude: 'node_modules/**', // only transpile our source code + plugins: ["babel-plugin-transform-async-to-promises"] // convert async/await syntax }), ], external: ['ws', 'https']