var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __()); }; })(); import { IonicNativePlugin, cordovaPropertyGet, cordovaPropertySet, cordova, } from "@ionic-native/core"; import { Observable } from "rxjs"; export var AndroidGattTransportMode; (function (AndroidGattTransportMode) { /** * No preference of physical transport for GATT connections to remote dual-mode devices */ AndroidGattTransportMode[(AndroidGattTransportMode["TRANSPORT_AUTO"] = 0)] = "TRANSPORT_AUTO"; /** * Prefer BR/EDR transport for GATT connections to remote dual-mode devices */ AndroidGattTransportMode[(AndroidGattTransportMode["TRANSPORT_BREDR"] = 1)] = "TRANSPORT_BREDR"; /** * Prefer LE transport for GATT connections to remote dual-mode devices */ AndroidGattTransportMode[(AndroidGattTransportMode["TRANSPORT_LE"] = 2)] = "TRANSPORT_LE"; })(AndroidGattTransportMode || (AndroidGattTransportMode = {})); export var BluetoothScanMode; (function (BluetoothScanMode) { BluetoothScanMode[(BluetoothScanMode["SCAN_MODE_OPPORTUNISTIC"] = -1)] = "SCAN_MODE_OPPORTUNISTIC"; BluetoothScanMode[(BluetoothScanMode["SCAN_MODE_LOW_POWER"] = 0)] = "SCAN_MODE_LOW_POWER"; BluetoothScanMode[(BluetoothScanMode["SCAN_MODE_BALANCED"] = 1)] = "SCAN_MODE_BALANCED"; BluetoothScanMode[(BluetoothScanMode["SCAN_MODE_LOW_LATENCY"] = 2)] = "SCAN_MODE_LOW_LATENCY"; })(BluetoothScanMode || (BluetoothScanMode = {})); export var BluetoothMatchMode; (function (BluetoothMatchMode) { BluetoothMatchMode[(BluetoothMatchMode["MATCH_MODE_AGRESSIVE"] = 1)] = "MATCH_MODE_AGRESSIVE"; BluetoothMatchMode[(BluetoothMatchMode["MATCH_MODE_STICKY"] = 2)] = "MATCH_MODE_STICKY"; })(BluetoothMatchMode || (BluetoothMatchMode = {})); export var BluetoothMatchNum; (function (BluetoothMatchNum) { BluetoothMatchNum[(BluetoothMatchNum["MATCH_NUM_ONE_ADVERTISEMENT"] = 1)] = "MATCH_NUM_ONE_ADVERTISEMENT"; BluetoothMatchNum[(BluetoothMatchNum["MATCH_NUM_FEW_ADVERTISEMENT"] = 2)] = "MATCH_NUM_FEW_ADVERTISEMENT"; BluetoothMatchNum[(BluetoothMatchNum["MATCH_NUM_MAX_ADVERTISEMENT"] = 3)] = "MATCH_NUM_MAX_ADVERTISEMENT"; })(BluetoothMatchNum || (BluetoothMatchNum = {})); export var BluetoothCallbackType; (function (BluetoothCallbackType) { BluetoothCallbackType[ (BluetoothCallbackType["CALLBACK_TYPE_ALL_MATCHES"] = 1) ] = "CALLBACK_TYPE_ALL_MATCHES"; BluetoothCallbackType[ (BluetoothCallbackType["CALLBACK_TYPE_FIRST_MATCH"] = 2) ] = "CALLBACK_TYPE_FIRST_MATCH"; BluetoothCallbackType[ (BluetoothCallbackType["CALLBACK_TYPE_MATCH_LOST"] = 4) ] = "CALLBACK_TYPE_MATCH_LOST"; })(BluetoothCallbackType || (BluetoothCallbackType = {})); var BluetoothLEOriginal = /** @class */ (function (_super) { __extends(BluetoothLEOriginal, _super); function BluetoothLEOriginal() { return (_super !== null && _super.apply(this, arguments)) || this; } BluetoothLEOriginal.prototype.initialize = function (params) { return cordova( this, "initialize", { successIndex: 0, errorIndex: 2, observable: true }, arguments ); }; BluetoothLEOriginal.prototype.enable = function () { return cordova( this, "enable", { callbackOrder: "reverse", sync: true }, arguments ); }; BluetoothLEOriginal.prototype.disable = function () { return cordova( this, "disable", { callbackOrder: "reverse", sync: true }, arguments ); }; BluetoothLEOriginal.prototype.getAdapterInfo = function () { return cordova( this, "getAdapterInfo", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.startScan = function (params) { return cordova( this, "startScan", { callbackOrder: "reverse", observable: true }, arguments ); }; BluetoothLEOriginal.prototype.stopScan = function () { return cordova(this, "stopScan", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.retrieveConnected = function (params) { return cordova( this, "retrieveConnected", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.bond = function (params) { return cordova( this, "bond", { callbackOrder: "reverse", observable: true }, arguments ); }; BluetoothLEOriginal.prototype.unbond = function (params) { return cordova(this, "unbond", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.connect = function (params) { return cordova( this, "connect", { callbackOrder: "reverse", observable: true }, arguments ); }; BluetoothLEOriginal.prototype.reconnect = function (params) { return cordova( this, "reconnect", { callbackOrder: "reverse", observable: true }, arguments ); }; BluetoothLEOriginal.prototype.disconnect = function (params) { return cordova(this, "disconnect", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.close = function (params) { return cordova(this, "close", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.discover = function (params) { return cordova(this, "discover", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.services = function (params) { return cordova(this, "services", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.characteristics = function (params) { return cordova( this, "characteristics", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.descriptors = function (params) { return cordova( this, "descriptors", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.read = function (params) { return cordova(this, "read", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.subscribe = function (params) { return cordova( this, "subscribe", { callbackOrder: "reverse", observable: true }, arguments ); }; BluetoothLEOriginal.prototype.unsubscribe = function (params) { return cordova( this, "unsubscribe", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.write = function (params) { return cordova(this, "write", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.writeQ = function (params) { return cordova(this, "writeQ", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.readDescriptor = function (params) { return cordova( this, "readDescriptor", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.writeDescriptor = function (params) { return cordova( this, "writeDescriptor", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.rssi = function (params) { return cordova(this, "rssi", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.mtu = function (params) { return cordova(this, "mtu", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.requestConnectionPriority = function (params) { return cordova( this, "requestConnectionPriority", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.isInitialized = function () { return cordova( this, "isInitialized", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.isEnabled = function () { return cordova(this, "isEnabled", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.isScanning = function () { return cordova(this, "isScanning", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.isBonded = function (params) { return cordova(this, "isBonded", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.wasConnected = function (params) { return cordova( this, "wasConnected", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.isConnected = function (params) { return cordova( this, "isConnected", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.isDiscovered = function (params) { return cordova( this, "isDiscovered", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.hasPermission = function () { return cordova( this, "hasPermission", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.requestPermission = function () { return cordova( this, "requestPermission", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.isLocationEnabled = function () { return cordova( this, "isLocationEnabled", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.requestLocation = function () { return cordova( this, "requestLocation", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.initializePeripheral = function (params) { return cordova( this, "initializePeripheral", { callbackOrder: "reverse", observable: true }, arguments ); }; BluetoothLEOriginal.prototype.addService = function (params) { return cordova(this, "addService", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.removeService = function (params) { return cordova( this, "removeService", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.removeAllServices = function () { return cordova( this, "removeAllServices", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.startAdvertising = function (params) { return cordova( this, "startAdvertising", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.stopAdvertising = function () { return cordova( this, "stopAdvertising", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.isAdvertising = function () { return cordova( this, "isAdvertising", { callbackOrder: "reverse" }, arguments ); }; BluetoothLEOriginal.prototype.respond = function (params) { return cordova(this, "respond", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.notify = function (params) { return cordova(this, "notify", { callbackOrder: "reverse" }, arguments); }; BluetoothLEOriginal.prototype.encodedStringToBytes = function (value) { return cordova(this, "encodedStringToBytes", { sync: true }, arguments); }; BluetoothLEOriginal.prototype.bytesToEncodedString = function (value) { return cordova(this, "bytesToEncodedString", { sync: true }, arguments); }; BluetoothLEOriginal.prototype.stringToBytes = function (value) { return cordova(this, "stringToBytes", { sync: true }, arguments); }; BluetoothLEOriginal.prototype.bytesToString = function (value) { return cordova(this, "bytesToString", { sync: true }, arguments); }; Object.defineProperty( BluetoothLEOriginal.prototype, "SCAN_MODE_OPPORTUNISTIC", { get: function () { return cordovaPropertyGet(this, "SCAN_MODE_OPPORTUNISTIC"); }, set: function (value) { cordovaPropertySet(this, "SCAN_MODE_OPPORTUNISTIC", value); }, enumerable: false, configurable: true, } ); Object.defineProperty(BluetoothLEOriginal.prototype, "SCAN_MODE_LOW_POWER", { get: function () { return cordovaPropertyGet(this, "SCAN_MODE_LOW_POWER"); }, set: function (value) { cordovaPropertySet(this, "SCAN_MODE_LOW_POWER", value); }, enumerable: false, configurable: true, }); Object.defineProperty(BluetoothLEOriginal.prototype, "SCAN_MODE_BALANCED", { get: function () { return cordovaPropertyGet(this, "SCAN_MODE_BALANCED"); }, set: function (value) { cordovaPropertySet(this, "SCAN_MODE_BALANCED", value); }, enumerable: false, configurable: true, }); Object.defineProperty( BluetoothLEOriginal.prototype, "SCAN_MODE_LOW_LATENCY", { get: function () { return cordovaPropertyGet(this, "SCAN_MODE_LOW_LATENCY"); }, set: function (value) { cordovaPropertySet(this, "SCAN_MODE_LOW_LATENCY", value); }, enumerable: false, configurable: true, } ); Object.defineProperty( BluetoothLEOriginal.prototype, "MATCH_MODE_AGGRESSIVE", { get: function () { return cordovaPropertyGet(this, "MATCH_MODE_AGGRESSIVE"); }, set: function (value) { cordovaPropertySet(this, "MATCH_MODE_AGGRESSIVE", value); }, enumerable: false, configurable: true, } ); Object.defineProperty(BluetoothLEOriginal.prototype, "MATCH_MODE_STICKY", { get: function () { return cordovaPropertyGet(this, "MATCH_MODE_STICKY"); }, set: function (value) { cordovaPropertySet(this, "MATCH_MODE_STICKY", value); }, enumerable: false, configurable: true, }); Object.defineProperty( BluetoothLEOriginal.prototype, "MATCH_NUM_ONE_ADVERTISEMENT", { get: function () { return cordovaPropertyGet(this, "MATCH_NUM_ONE_ADVERTISEMENT"); }, set: function (value) { cordovaPropertySet(this, "MATCH_NUM_ONE_ADVERTISEMENT", value); }, enumerable: false, configurable: true, } ); Object.defineProperty( BluetoothLEOriginal.prototype, "MATCH_NUM_FEW_ADVERTISEMENT", { get: function () { return cordovaPropertyGet(this, "MATCH_NUM_FEW_ADVERTISEMENT"); }, set: function (value) { cordovaPropertySet(this, "MATCH_NUM_FEW_ADVERTISEMENT", value); }, enumerable: false, configurable: true, } ); Object.defineProperty( BluetoothLEOriginal.prototype, "MATCH_NUM_MAX_ADVERTISEMENT", { get: function () { return cordovaPropertyGet(this, "MATCH_NUM_MAX_ADVERTISEMENT"); }, set: function (value) { cordovaPropertySet(this, "MATCH_NUM_MAX_ADVERTISEMENT", value); }, enumerable: false, configurable: true, } ); Object.defineProperty( BluetoothLEOriginal.prototype, "CALLBACK_TYPE_ALL_MATCHES", { get: function () { return cordovaPropertyGet(this, "CALLBACK_TYPE_ALL_MATCHES"); }, set: function (value) { cordovaPropertySet(this, "CALLBACK_TYPE_ALL_MATCHES", value); }, enumerable: false, configurable: true, } ); Object.defineProperty( BluetoothLEOriginal.prototype, "CALLBACK_TYPE_FIRST_MATCH", { get: function () { return cordovaPropertyGet(this, "CALLBACK_TYPE_FIRST_MATCH"); }, set: function (value) { cordovaPropertySet(this, "CALLBACK_TYPE_FIRST_MATCH", value); }, enumerable: false, configurable: true, } ); Object.defineProperty( BluetoothLEOriginal.prototype, "CALLBACK_TYPE_MATCH_LOST", { get: function () { return cordovaPropertyGet(this, "CALLBACK_TYPE_MATCH_LOST"); }, set: function (value) { cordovaPropertySet(this, "CALLBACK_TYPE_MATCH_LOST", value); }, enumerable: false, configurable: true, } ); BluetoothLEOriginal.pluginName = "BluetoothLE"; BluetoothLEOriginal.plugin = "cordova-plugin-bluetoothle"; BluetoothLEOriginal.pluginRef = "bluetoothle"; BluetoothLEOriginal.repo = "https://github.com/randdusing/cordova-plugin-bluetoothle"; BluetoothLEOriginal.install = "ionic cordova plugin add cordova-plugin-bluetoothle"; BluetoothLEOriginal.installVariables = []; BluetoothLEOriginal.platforms = ["Android", "iOS"]; return BluetoothLEOriginal; })(IonicNativePlugin); var BluetoothLE = new BluetoothLEOriginal(); export { BluetoothLE }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvQGlvbmljLW5hdGl2ZS9wbHVnaW5zL2JsdWV0b290aC1sZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxzRUFBdUQsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBcUhsQyxNQUFNLENBQU4sSUFBWSx3QkFlWDtBQWZELFdBQVksd0JBQXdCO0lBQ2xDOztPQUVHO0lBQ0gsMkZBQWtCLENBQUE7SUFFbEI7O09BRUc7SUFDSCw2RkFBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILHVGQUFnQixDQUFBO0FBQ2xCLENBQUMsRUFmVyx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBZW5DO0FBMFBELE1BQU0sQ0FBTixJQUFZLGlCQUtYO0FBTEQsV0FBWSxpQkFBaUI7SUFDM0IsZ0dBQTRCLENBQUE7SUFDNUIsdUZBQXVCLENBQUE7SUFDdkIscUZBQXNCLENBQUE7SUFDdEIsMkZBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQUxXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFLNUI7QUFFRCxNQUFNLENBQU4sSUFBWSxrQkFHWDtBQUhELFdBQVksa0JBQWtCO0lBQzVCLDJGQUF3QixDQUFBO0lBQ3hCLHFGQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFIVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRzdCO0FBRUQsTUFBTSxDQUFOLElBQVksaUJBSVg7QUFKRCxXQUFZLGlCQUFpQjtJQUMzQix1R0FBK0IsQ0FBQTtJQUMvQix1R0FBK0IsQ0FBQTtJQUMvQix1R0FBK0IsQ0FBQTtBQUNqQyxDQUFDLEVBSlcsaUJBQWlCLEtBQWpCLGlCQUFpQixRQUk1QjtBQUVELE1BQU0sQ0FBTixJQUFZLHFCQUlYO0FBSkQsV0FBWSxxQkFBcUI7SUFDL0IsMkdBQTZCLENBQUE7SUFDN0IsMkdBQTZCLENBQUE7SUFDN0IseUdBQTRCLENBQUE7QUFDOUIsQ0FBQyxFQUpXLHFCQUFxQixLQUFyQixxQkFBcUIsUUFJaEM7O0lBc0RnQywrQkFBaUI7Ozs7SUFRaEQsZ0NBQVUsYUFBQyxNQUFtQjtJQVU5Qiw0QkFBTTtJQVVOLDZCQUFPO0lBYVAsb0NBQWM7SUFnQmQsK0JBQVMsYUFBQyxNQUFrQjtJQVc1Qiw4QkFBUTtJQVlSLHVDQUFpQixhQUFDLE1BQWdDO0lBa0JsRCwwQkFBSSxhQUFDLE1BQTJCO0lBYWhDLDRCQUFNLGFBQUMsTUFBMkI7SUFpQmxDLDZCQUFPLGFBQUMsTUFBd0I7SUFXaEMsK0JBQVMsYUFBQyxNQUEyQjtJQVlyQyxnQ0FBVSxhQUFDLE1BQTJCO0lBYXRDLDJCQUFLLGFBQUMsTUFBMkI7SUFtQmpDLDhCQUFRLGFBQUMsTUFBaUQ7SUFZMUQsOEJBQVEsYUFBQyxNQUFnRDtJQVl6RCxxQ0FBZSxhQUFDLE1BQTRCO0lBVzVDLGlDQUFXLGFBQUMsTUFBd0I7SUFXcEMsMEJBQUksYUFBQyxNQUF3QjtJQWE3QiwrQkFBUyxhQUFDLE1BQXdCO0lBV2xDLGlDQUFXLGFBQUMsTUFBd0I7SUFZcEMsMkJBQUssYUFBQyxNQUFpQztJQVl2Qyw0QkFBTSxhQUFDLE1BQWlDO0lBV3hDLG9DQUFjLGFBQUMsTUFBaUM7SUFZaEQscUNBQWUsYUFBQyxNQUE2QjtJQVc3QywwQkFBSSxhQUFDLE1BQTJCO0lBV2hDLHlCQUFHLGFBQUMsTUFBeUM7SUFZN0MsK0NBQXlCLGFBQUMsTUFBbUU7SUFVN0YsbUNBQWE7SUFVYiwrQkFBUztJQVVULGdDQUFVO0lBV1YsOEJBQVEsYUFBQyxNQUEyQjtJQVdwQyxrQ0FBWSxhQUFDLE1BQTJCO0lBV3hDLGlDQUFXLGFBQUMsTUFBMkI7SUFXdkMsa0NBQVksYUFBQyxNQUEyQjtJQVV4QyxtQ0FBYTtJQVdiLHVDQUFpQjtJQVVqQix1Q0FBaUI7SUFXakIscUNBQWU7SUFZZiwwQ0FBb0IsYUFBQyxNQUE2QjtJQVdsRCxnQ0FBVSxhQUFDLE1BR1Y7SUFXRCxtQ0FBYSxhQUFDLE1BQTJCO0lBVXpDLHVDQUFpQjtJQWFqQixzQ0FBZ0IsYUFBQyxNQUF5QjtJQVUxQyxxQ0FBZTtJQVVmLG1DQUFhO0lBV2IsNkJBQU8sYUFBQyxNQUFxQjtJQWE3Qiw0QkFBTSxhQUFDLE1BQW9CO0lBVzNCLDBDQUFvQixhQUFDLEtBQWE7SUFXbEMsMENBQW9CLGFBQUMsS0FBaUI7SUFXdEMsbUNBQWEsYUFBQyxLQUFhO0lBVzNCLG1DQUFhLGFBQUMsS0FBaUI7MEJBSy9CLGdEQUF1Qjs7Ozs7OzBCQUV2Qiw0Q0FBbUI7Ozs7OzswQkFFbkIsMkNBQWtCOzs7Ozs7MEJBRWxCLDhDQUFxQjs7Ozs7OzBCQUVyQiw4Q0FBcUI7Ozs7OzswQkFFckIsMENBQWlCOzs7Ozs7MEJBRWpCLG9EQUEyQjs7Ozs7OzBCQUUzQixvREFBMkI7Ozs7OzswQkFFM0Isb0RBQTJCOzs7Ozs7MEJBRTNCLGtEQUF5Qjs7Ozs7OzBCQUV6QixrREFBeUI7Ozs7OzswQkFFekIsaURBQXdCOzs7Ozs7Ozs7Ozs7O3NCQTdqQzFCO0VBNGNpQyxpQkFBaUI7U0FBckMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvcmRvdmEsIENvcmRvdmFQcm9wZXJ0eSwgSW9uaWNOYXRpdmVQbHVnaW4sIFBsdWdpbiB9IGZyb20gJ0Bpb25pYy1uYXRpdmUvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbi8qIEF2YWlsYWJsZSBzdGF0dXMgb2YgZGV2aWNlICovXG5leHBvcnQgdHlwZSBTdGF0dXMgPVxuICB8ICdzY2FuU3RhcnRlZCdcbiAgfCAnc2NhblN0b3BwZWQnXG4gIHwgJ3NjYW5SZXN1bHQnXG4gIHwgJ2Nvbm5lY3RlZCdcbiAgfCAnZGlzY29ubmVjdGVkJ1xuICB8ICdib25kaW5nJ1xuICB8ICdib25kZWQnXG4gIHwgJ3VuYm9uZGVkJ1xuICB8ICdjbG9zZWQnXG4gIHwgJ3NlcnZpY2VzJ1xuICB8ICdkaXNjb3ZlcmVkJ1xuICB8ICdjaGFyYWN0ZXJpc3RpY3MnXG4gIHwgJ2Rlc2NyaXB0b3JzJ1xuICB8ICdyZWFkJ1xuICB8ICdzdWJzY3JpYmVkJ1xuICB8ICd1bnN1YnNjcmliZWQnXG4gIHwgJ3N1YnNjcmliZWRSZXN1bHQnXG4gIHwgJ3dyaXR0ZW4nXG4gIHwgJ3JlYWREZXNjcmlwdG9yJ1xuICB8ICd3cml0ZURlc2NyaXB0b3InXG4gIHwgJ3Jzc2knXG4gIHwgJ210dSdcbiAgfCAnY29ubmVjdGlvblByaW9yaXR5UmVxdWVzdGVkJ1xuICB8ICdlbmFibGVkJ1xuICB8ICdkaXNhYmxlZCdcbiAgfCAncmVhZFJlcXVlc3RlZCdcbiAgfCAnd3JpdGVSZXF1ZXN0ZWQnXG4gIHwgJ210dUNoYW5nZWQnXG4gIHwgJ25vdGlmeVJlYWR5J1xuICB8ICdub3RpZnlTZW50J1xuICB8ICdzZXJ2aWNlQWRkZWQnXG4gIHwgJ3NlcnZpY2VSZW1vdmVkJ1xuICB8ICdhbGxTZXJ2aWNlc1JlbW92ZWQnXG4gIHwgJ2FkdmVydGlzaW5nU3RhcnRlZCdcbiAgfCAnYWR2ZXJ0aXNpbmdTdG9wcGVkJ1xuICB8ICdyZXNwb25kZWQnXG4gIHwgJ25vdGlmaWVkJ1xuICB8ICdub3RpZmljYXRpb25TZW50JztcblxuLyoqIEF2YWlsYWJsZSBjb25uZWN0aW9uIHByaW9yaXRpZXMgKi9cbmV4cG9ydCB0eXBlIENvbm5lY3Rpb25Qcmlvcml0eSA9ICdsb3cnIHwgJ2JhbGFuY2VkJyB8ICdoaWdoJztcblxuZXhwb3J0IGludGVyZmFjZSBQYXJhbXMge1xuICAvKiogVGhlIGFkZHJlc3MvaWRlbnRpZmllciBwcm92aWRlZCBieSB0aGUgc2NhbidzIHJldHVybiBvYmplY3QgKi9cbiAgYWRkcmVzczogc3RyaW5nO1xuICAvKiogVGhlIHNlcnZpY2UncyBJRCAqL1xuICBzZXJ2aWNlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdFBlcmlwaGVyYWxQYXJhbXMge1xuICAvKiogU2hvdWxkIHVzZXIgYmUgcHJvbXB0ZWQgdG8gZW5hYmxlIEJsdWV0b290aCAqL1xuICByZXF1ZXN0PzogYm9vbGVhbjtcbiAgLyogQSB1bmlxdWUgc3RyaW5nIHRvIGlkZW50aWZ5IHlvdXIgYXBwLiBCbHVldG9vdGggQ2VudHJhbCBiYWNrZ3JvdW5kIG1vZGUgaXMgcmVxdWlyZWQgdG8gdXNlIHRoaXMsIGJ1dCBiYWNrZ3JvdW5kIG1vZGUgZG9lc24ndCBzZWVtIHRvIHJlcXVpcmUgc3BlY2lmeWluZyB0aGUgcmVzdG9yZUtleSAqL1xuICByZXN0b3JlS2V5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluaXRQYXJhbXMgZXh0ZW5kcyBJbml0UGVyaXBoZXJhbFBhcmFtcyB7XG4gIC8qKiBTaG91bGQgY2hhbmdlIGluIEJsdWV0b290aCBzdGF0dXMgbm90aWZpY2F0aW9ucyBiZSBzZW50ICovXG4gIHN0YXR1c1JlY2VpdmVyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2FuUGFyYW1zIHtcbiAgLyogQW4gYXJyYXkgb2Ygc2VydmljZSBJRHMgdG8gZmlsdGVyIHRoZSBzY2FuIG9yIGVtcHR5IGFycmF5IC8gbnVsbC4gVGhpcyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzIHBsYXRmb3JtIHlldCAqL1xuICBzZXJ2aWNlcz86IHN0cmluZ1tdO1xuICAvKiBUcnVlL2ZhbHNlIHRvIGFsbG93IGR1cGxpY2F0ZSBhZHZlcnRpc2VtZW50IHBhY2tldHMsIGRlZmF1bHRzIHRvIGZhbHNlIChpT1MpKi9cbiAgYWxsb3dEdXBsaWNhdGVzPzogYm9vbGVhbjtcbiAgLyoqIERlZmF1bHRzIHRvIExvdyBQb3dlci4gQXZhaWxhYmxlIGZyb20gQVBJMjEgLyBBUEkgMjMgKEFuZHJvaWQpICovXG4gIHNjYW5Nb2RlPzogQmx1ZXRvb3RoU2Nhbk1vZGU7XG4gIC8qKiBEZWZhdWx0cyB0byBBZ2dyZXNzaXZlLiBBdmFpbGFibGUgZnJvbSBBUEkyMyAoQW5kcm9pZCkgKi9cbiAgbWF0Y2hNb2RlPzogQmx1ZXRvb3RoTWF0Y2hNb2RlO1xuICAvKiogRGVmYXVsdHMgdG8gT25lIEFkdmVydGlzZW1lbnQuIEF2YWlsYWJsZSBmcm9tIEFQSTIzIChBbmRyb2lkKSAqL1xuICBtYXRjaE51bT86IEJsdWV0b290aE1hdGNoTnVtO1xuICAvKiogRGVmYXVsdHMgdG8gQWxsIE1hdGNoZXMuIEF2YWlsYWJsZSBmcm9tIEFQSTIxIC8gQVBJIDIzLiAoQW5kcm9pZCkgKi9cbiAgY2FsbGJhY2tUeXBlPzogQmx1ZXRvb3RoQ2FsbGJhY2tUeXBlO1xuICAvKiogVHJ1ZS9mYWxzZSB0byBzaG93IG9ubHkgY29ubmVjdGFibGUgZGV2aWNlcywgcmF0aGVyIHRoYW4gYWxsIGRldmljZXMgZXZlciBzZWVuLCBkZWZhdWx0cyB0byBmYWxzZSAoV2luZG93cykgKi9cbiAgaXNDb25uZWN0YWJsZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZ5UGFyYW1zIHtcbiAgLyoqIFNlcnZpY2UncyBVVUlEICovXG4gIHNlcnZpY2U6IHN0cmluZztcbiAgLyoqIENoYXJhY3RlcmlzdGljJ3MgVVVJRCAqL1xuICBjaGFyYWN0ZXJpc3RpYzogc3RyaW5nO1xuICAvKiogQmFzZTY0IGVuY29kZWQgc3RyaW5nLCBudW1iZXIgb3Igc3RyaW5nICovXG4gIHZhbHVlOiBzdHJpbmc7XG4gIC8qKiBBbmRyb2lkIG9ubHk6IGFkZHJlc3Mgb2YgdGhlIGRldmljZSB0aGUgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBzZW50IHRvLiAqL1xuICBhZGRyZXNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbmRQYXJhbXMge1xuICAvKiogVGhpcyBpbnRlZ2VyIHZhbHVlIHdpbGwgYmUgaW5jcmVtZW50ZWQgZXZlcnkgcmVhZC93cml0ZVJlcXVlc3RlZCAqL1xuICByZXF1ZXN0SWQ6IG51bWJlcjtcbiAgLyoqIGJhc2U2NCBzdHJpbmcgKi9cbiAgdmFsdWU6IHN0cmluZztcbiAgLyoqIG5vdCBkb2N1bWVudGVkICovXG4gIG9mZnNldD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uUGFyYW1zIHtcbiAgLyoqIFRoZSBhZGRyZXNzL2lkZW50aWZpZXIgcHJvdmlkZWQgYnkgdGhlIHNjYW4ncyByZXR1cm4gb2JqZWN0ICovXG4gIGFkZHJlc3M6IHN0cmluZztcbiAgLyoqIEF1dG9tYXRpY2FsbHkgY29ubmVjdCBhcyBzb29uIGFzIHRoZSByZW1vdGUgZGV2aWNlIGJlY29tZXMgYXZhaWxhYmxlIChBbmRyb2lkKSAqL1xuICBhdXRvQ29ubmVjdD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUcmFuc3BvcnQgbW9kZS4gQXZhaWxhYmxlIGZyb20gQVBJIDIzIChBbmRyb2lkKS5cbiAgICogSWYgbm9uZSBpcyBzcGVjaWZpZWQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgVFJBTlNQT1JUX0FVVE9cbiAgICpcbiAgICogTm90ZTogT24gQW5kcm9pZCAxMCwgVFJBTlNQT1JUX0FVVE8gY2FuIGxlYWQgdG8gY29ubmVjdGlvbiBlcnJvcnMgd2l0aCBTdGF0dXMgY29kZSAxMzMuXG4gICAqIEluIHRoaXMgY2FzZSBUUkFOU1BPUlRfTEUgY2FuIGJlIHVzZWQuXG4gICAqL1xuICB0cmFuc3BvcnQ/OiBBbmRyb2lkR2F0dFRyYW5zcG9ydE1vZGU7XG59XG5cbmV4cG9ydCBlbnVtIEFuZHJvaWRHYXR0VHJhbnNwb3J0TW9kZSB7XG4gIC8qKlxuICAgKiBObyBwcmVmZXJlbmNlIG9mIHBoeXNpY2FsIHRyYW5zcG9ydCBmb3IgR0FUVCBjb25uZWN0aW9ucyB0byByZW1vdGUgZHVhbC1tb2RlIGRldmljZXNcbiAgICovXG4gIFRSQU5TUE9SVF9BVVRPID0gMCxcblxuICAvKipcbiAgICogUHJlZmVyIEJSL0VEUiB0cmFuc3BvcnQgZm9yIEdBVFQgY29ubmVjdGlvbnMgdG8gcmVtb3RlIGR1YWwtbW9kZSBkZXZpY2VzXG4gICAqL1xuICBUUkFOU1BPUlRfQlJFRFIgPSAxLFxuXG4gIC8qKlxuICAgKiBQcmVmZXIgTEUgdHJhbnNwb3J0IGZvciBHQVRUIGNvbm5lY3Rpb25zIHRvIHJlbW90ZSBkdWFsLW1vZGUgZGV2aWNlc1xuICAgKi9cbiAgVFJBTlNQT1JUX0xFID0gMixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGFyYWN0ZXJpc3RpY1BhcmFtcyBleHRlbmRzIFBhcmFtcyB7XG4gIC8qKiBBbiBhcnJheSBvZiBjaGFyYWN0ZXJpc3RpYyBJRHMgdG8gZGlzY292ZXIgb3IgZW1wdHkgYXJyYXkgLyBudWxsICovXG4gIGNoYXJhY3RlcmlzdGljcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc2NyaXB0b3JQYXJhbXMgZXh0ZW5kcyBQYXJhbXMge1xuICAvKiogVGhlIGNoYXJhY3RlcmlzdGljJ3MgSUQgKi9cbiAgY2hhcmFjdGVyaXN0aWM6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVyYXRpb25EZXNjcmlwdG9yUGFyYW1zIGV4dGVuZHMgRGVzY3JpcHRvclBhcmFtcyB7XG4gIC8qKiBUaGUgZGVzY3JpcHRvcidzIElEICovXG4gIGRlc2NyaXB0b3I6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXcml0ZUNoYXJhY3RlcmlzdGljUGFyYW1zIGV4dGVuZHMgRGVzY3JpcHRvclBhcmFtcyB7XG4gIC8qIEJhc2U2NCBlbmNvZGVkIHN0cmluZyAqL1xuICB2YWx1ZTogc3RyaW5nO1xuICAvKiBTZXQgdG8gXCJub1Jlc3BvbnNlXCIgdG8gZW5hYmxlIHdyaXRlIHdpdGhvdXQgcmVzcG9uc2UsIGFsbCBvdGhlciB2YWx1ZXMgd2lsbCB3cml0ZSBub3JtYWxseS4gKi9cbiAgdHlwZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXcml0ZURlc2NyaXB0b3JQYXJhbXMgZXh0ZW5kcyBEZXNjcmlwdG9yUGFyYW1zIHtcbiAgLyoqIFRoZSBkZXNjcmlwdG9yJ3MgSUQgKi9cbiAgZGVzY3JpcHRvcjogc3RyaW5nO1xuICAvKiogQmFzZTY0IGVuY29kZWQgc3RyaW5nLCBudW1iZXIgb3Igc3RyaW5nICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIEFkdmVydGlzaW5nUGFyYW1zID0gQWR2ZXJ0aXNpbmdQYXJhbXNBbmRyb2lkIHwgQWR2ZXJ0aXNpbmdQYXJhbXNJT1M7XG5leHBvcnQgdHlwZSBBZHZlcnRpc2VNb2RlID0gJ2JhbGFuY2VkJyB8ICdsb3dMYXRlbmN5JyB8ICdsb3dQb3dlcic7XG5leHBvcnQgdHlwZSBUeFBvd2VyTGV2ZWwgPSAnaGlnaCcgfCAnbG93JyB8ICd1bHRyYWxvdycgfCAnbWVkaXVtJztcblxuZXhwb3J0IGludGVyZmFjZSBBZHZlcnRpc2luZ1BhcmFtc0FuZHJvaWQge1xuICAvKiogU2VydmljZSBVVUlEIG9uIEFuZHJvaWQgKi9cbiAgc2VydmljZTogc3RyaW5nO1xuICAvKiogbm90IGRvY3VtZW50ZWQgKi9cbiAgbW9kZT86IEFkdmVydGlzZU1vZGU7XG4gIC8qKiBub3QgZG9jdW1lbnRlZCAqL1xuICBjb25uZWN0YWJsZT86IGJvb2xlYW47XG4gIC8qKiBub3QgZG9jdW1lbnRlZCAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogbm90IGRvY3VtZW50ZWQgKi9cbiAgdHhQb3dlckxldmVsPzogVHhQb3dlckxldmVsO1xuICAvKiogbm90IGRvY3VtZW50ZWQgKi9cbiAgbWFudWZhY3R1cmVySWQ/OiBudW1iZXI7XG4gIC8qKiBub3QgZG9jdW1lbnRlZCAqL1xuICBtYW51ZmFjdHVyZXJTcGVjaWZpY0RhdGE/OiBhbnk7XG4gIC8qKiBub3QgZG9jdW1lbnRlZCAqL1xuICBpbmNsdWRlRGV2aWNlTmFtZTogYm9vbGVhbjtcbiAgLyoqIG5vdCBkb2N1bWVudGVkICovXG4gIGluY2x1ZGVUeFBvd2VyTGV2ZWw6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWR2ZXJ0aXNpbmdQYXJhbXNJT1Mge1xuICAvKiogQXJyYXkgb2Ygc2VydmljZSBVVUlEcyBvbiBpT1MgKi9cbiAgc2VydmljZXM6IHN0cmluZ1tdO1xuICAvKiogZGV2aWNlJ3MgbmFtZSAqL1xuICBuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1vbkluZm8ge1xuICAvKiogVGhlIGRldmljZSdzIGRpc3BsYXkgbmFtZSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBUaGUgZGV2aWNlJ3MgYWRkcmVzcyAvIGlkZW50aWZpZXIgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIG9iamVjdCAqL1xuICBhZGRyZXNzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGV2aWNlSW5mbyBleHRlbmRzIENvbW1vbkluZm8ge1xuICAvKiogRGV2aWNlJ3Mgc3RhdHVzICovXG4gIHN0YXR1czogU3RhdHVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJTU0kgZXh0ZW5kcyBEZXZpY2VJbmZvIHtcbiAgLyoqIHNpZ25hbCBzdHJlbmd0aCAqL1xuICByc3NpOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTVRVIGV4dGVuZHMgRGV2aWNlSW5mbyB7XG4gIC8qIG10dSB2YWx1ZSAqL1xuICBtdHU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb25kZWRTdGF0dXMgZXh0ZW5kcyBDb21tb25JbmZvIHtcbiAgLyogQm9uZGVkIHN0YXR1cyovXG4gIGlzQm9uZGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByZXZDb25uZWN0aW9uU3RhdHVzIGV4dGVuZHMgQ29tbW9uSW5mbyB7XG4gIC8qKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGV2aWNlIHdhcyBjb25uZWN0ZWQgKi9cbiAgd2FzQ29ubmVjdGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1cnJDb25uZWN0aW9uU3RhdHVzIGV4dGVuZHMgQ29tbW9uSW5mbyB7XG4gIC8qKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGV2aWNlIGlzIGNvbm5lY3RlZCAqL1xuICBpc0Nvbm5lY3RlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaXNjb3ZlclN0YXR1cyBleHRlbmRzIENvbW1vbkluZm8ge1xuICAvKiogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRldmljZSdzIGNoYXJhY3RlcmlzdGljcyBhbmQgZGVzY3JpcHRvcnMgaGF2ZSBiZWVuIGRpc2NvdmVyZWQgKi9cbiAgaXNEaXNjb3ZlcmVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjYW5TdGF0dXMgZXh0ZW5kcyBEZXZpY2VJbmZvIHtcbiAgLyoqIHNpZ25hbCBzdHJlbmd0aCAqL1xuICByc3NpOiBudW1iZXI7XG4gIC8qKlxuICAgKiBhZHZlcnRpc2VtZW50IGRhdGEgaW4gZW5jb2RlZCBzdHJpbmcgb2YgYnl0ZXMsIHVzZSBibHVldG9vdGhsZS5lbmNvZGVkU3RyaW5nVG9CeXRlcygpIChBbmRyb2lkKVxuICAgKiBhZHZlcnRpc2VtZW50IGhhc2ggd2l0aCB0aGUga2V5cyAoaU9TKVxuICAgKiBlbXB0eSAoV2luZG93cylcbiAgICovXG4gIGFkdmVydGlzZW1lbnQ6XG4gICAgfCB7XG4gICAgICAgIC8qKiBBbiBhcnJheSBvZiBzZXJ2aWNlIFVVSURzICovXG4gICAgICAgIHNlcnZpY2VVdWlkczogc3RyaW5nW107XG4gICAgICAgIC8qKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhlIG1hbnVmYWN0dXJlciBvZiB0aGUgZGV2aWNlICovXG4gICAgICAgIG1hbnVmYWN0dXJlckRhdGE6IHN0cmluZztcbiAgICAgICAgLyoqIEEgbnVtYmVyIGNvbnRhaW5pbmcgdGhlIHRyYW5zbWl0IHBvd2VyIG9mIGEgcGVyaXBoZXJhbCAqL1xuICAgICAgICB0eFBvd2VyTGV2ZWw6IG51bWJlcjtcbiAgICAgICAgLyoqIEFuIGFycmF5IG9mIG9uZSBvciBtb3JlIENCVVVJRCBvYmplY3RzLCByZXByZXNlbnRpbmcgQ0JTZXJ2aWNlIFVVSURzIHRoYXQgd2VyZSBmb3VuZCBpbiB0aGUg4oCcb3ZlcmZsb3figJ0gYXJlYSBvZiB0aGUgYWR2ZXJ0aXNlbWVudCBkYXRhICovXG4gICAgICAgIG92ZXJmbG93U2VydmljZVV1aWRzOiBzdHJpbmdbXTtcbiAgICAgICAgLyoqIEEgYm9vbGVhbiB2YWx1ZSB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBhZHZlcnRpc2luZyBldmVudCB0eXBlIGlzIGNvbm5lY3RhYmxlICovXG4gICAgICAgIGlzQ29ubmVjdGFibGU6IGJvb2xlYW47XG4gICAgICAgIC8qKiBBbiBhcnJheSBvZiBvbmUgb3IgbW9yZSBDQlVVSUQgb2JqZWN0cywgcmVwcmVzZW50aW5nIENCU2VydmljZSBVVUlEcyAqL1xuICAgICAgICBzb2xpY2l0ZWRTZXJ2aWNlVXVpZHM6IHN0cmluZ1tdO1xuICAgICAgICAvKiBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBzZXJ2aWNlLXNwZWNpZmljIGFkdmVydGlzZW1lbnQgZGF0YSAqL1xuICAgICAgICBzZXJ2aWNlRGF0YTogYW55O1xuICAgICAgICAvKiBBIHN0cmluZyBjb250YWluaW5nIHRoZSBsb2NhbCBuYW1lIG9mIGEgcGVyaXBoZXJhbCAqL1xuICAgICAgICBsb2NhbE5hbWU6IHN0cmluZztcbiAgICAgIH1cbiAgICB8IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlIHtcbiAgLyoqIFNlcnZpY2UncyB1dWlkICovXG4gIHV1aWQ6IHN0cmluZztcbiAgLyoqIEFycmF5IG9mIGNoYXJhY3RlcmlzdGljcyAqL1xuICBjaGFyYWN0ZXJpc3RpY3M6IENoYXJhY3RlcmlzdGljW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhcmFjdGVyaXN0aWMge1xuICAvKiBBcnJheSBvZiBkZXNjcmlwdG9ycyAqL1xuICBkZXNjcmlwdG9ycz86IERlc2NyaXB0b3JbXTtcbiAgLyoqICBDaGFyYWN0ZXJpc3RpYydzIHV1aWQgKi9cbiAgdXVpZDogc3RyaW5nO1xuICAvKipcbiAgICogIENoYXJhY3RlcmlzdGljJ3MgcHJvcGVydGllc1xuICAgKiAgSWYgdGhlIHByb3BlcnR5IGlzIGRlZmluZWQgYXMgYSBrZXksIHRoZSBjaGFyYWN0ZXJpc3RpYyBoYXMgdGhhdCBwcm9wZXJ0eVxuICAgKi9cbiAgcHJvcGVydGllcz86IHtcbiAgICB3cml0ZT86IGJvb2xlYW47XG4gICAgYnJvYWRjYXN0PzogYm9vbGVhbjtcbiAgICBleHRlbmRlZFByb3BzPzogYm9vbGVhbjtcbiAgICB3cml0ZVdpdGhvdXRSZXNwb25zZT86IGJvb2xlYW47XG4gICAgd3JpdGVOb1Jlc3BvbnNlPzogYm9vbGVhbjtcbiAgICBzaWduZWRXcml0ZT86IGJvb2xlYW47XG4gICAgcmVhZD86IGJvb2xlYW47XG4gICAgbm90aWZ5PzogYm9vbGVhbjtcbiAgICBpbmRpY2F0ZT86IGJvb2xlYW47XG4gICAgYXV0aGVudGljYXRlZFNpZ25lZFdyaXRlcz86IGJvb2xlYW47XG4gICAgbm90aWZ5RW5jcnlwdGlvblJlcXVpcmVkPzogYm9vbGVhbjtcbiAgICBpbmRpY2F0ZUVuY3J5cHRpb25SZXF1aXJlZD86IGJvb2xlYW47XG4gIH07XG4gIC8qKlxuICAgKiAgSWYgdGhlIHBlcm1pc3Npb24gaXMgZGVmaW5lZCBhcyBhIGtleSwgdGhlIGNoYXJhY3RlciBoYXMgdGhhdCBwZXJtaXNzaW9uXG4gICAqL1xuICBwZXJtaXNzaW9ucz86IHtcbiAgICByZWFkPzogYm9vbGVhbjtcbiAgICByZWFkRW5jcnlwdGVkPzogYm9vbGVhbjtcbiAgICByZWFkRW5jcnlwdGVkTUlUTT86IGJvb2xlYW47XG4gICAgd3JpdGU/OiBib29sZWFuO1xuICAgIHdyaXRlU2lnbmVkPzogYm9vbGVhbjtcbiAgICB3cml0ZVNpZ25lZE1JVE0/OiBib29sZWFuO1xuICAgIHdyaXRlRW5jcnlwdGVkTUlUTT86IGJvb2xlYW47XG4gICAgcmVhZEVuY3J5cHRpb25SZXF1aXJlZD86IGJvb2xlYW47XG4gICAgd3JpdGVFbmNyeXB0aW9uUmVxdWlyZWQ/OiBib29sZWFuO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc2NyaXB0b3Ige1xuICB1dWlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGV2aWNlIGV4dGVuZHMgRGV2aWNlSW5mbyB7XG4gIC8qKiBEZXZpY2UncyBzZXJ2aWNlcyAqL1xuICBzZXJ2aWNlczogU2VydmljZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VzIGV4dGVuZHMgRGV2aWNlSW5mbyB7XG4gIC8qKiBBcnJheSBvZiBzZXJ2aWNlIFVVSURTICovXG4gIHNlcnZpY2VzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXNjcmlwdG9ycyBleHRlbmRzIERldmljZUluZm8ge1xuICAvKiogQ2hhcmFjdGVyaXN0aWMncyBVVUlEICovXG4gIGNoYXJhY3RlcmlzdGljOiBzdHJpbmc7XG4gIC8qKiBTZXJ2aWNlJ3MgVVVJRCAqL1xuICBzZXJ2aWNlOiBzdHJpbmc7XG4gIC8qIEFycmF5IG9mIGRlc2NyaXB0b3IgVVVJRHMgKi9cbiAgZGVzY3JpcHRvcnM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvblJlc3VsdCBleHRlbmRzIERldmljZUluZm8ge1xuICAvKiogQ2hhcmFjdGVyaXN0aWMgVVVJRCAqL1xuICBjaGFyYWN0ZXJpc3RpYzogc3RyaW5nO1xuICAvKiogU2VydmljZSdzIFVVSUQgKi9cbiAgc2VydmljZTogc3RyaW5nO1xuICAvKiogQmFzZTY0IGVuY29kZWQgc3RyaW5nIG9mIGJ5dGVzICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVW5zdWJzY3JpYmVSZXN1bHQgZXh0ZW5kcyBEZXZpY2VJbmZvIHtcbiAgLyoqIENoYXJhY3RlcmlzdGljIFVVSUQgKi9cbiAgY2hhcmFjdGVyaXN0aWM6IHN0cmluZztcbiAgLyoqIFNlcnZpY2UncyBVVUlEICovXG4gIHNlcnZpY2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXNjcmlwdG9yUmVzdWx0IGV4dGVuZHMgT3BlcmF0aW9uUmVzdWx0IHtcbiAgZGVzY3JpcHRvcjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXJhY3RlcmlzdGljcyBleHRlbmRzIERldmljZUluZm8ge1xuICAvKiogU2VydmljZSdzIGlkICovXG4gIHNlcnZpY2U6IHN0cmluZztcbiAgLyogQXJyYXkgb2YgY2hhcmFjdGVyaXN0aWMgb2JqZWN0cyovXG4gIGNoYXJhY3RlcmlzdGljczogQ2hhcmFjdGVyaXN0aWNbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbml0aWFsaXplUmVzdWx0IHtcbiAgLyoqIERldmljZSdzIHN0YXR1cyAqL1xuICBzdGF0dXM6IFN0YXR1cztcbiAgLyoqIFRoZSBhZGRyZXNzL2lkZW50aWZpZXIgcHJvdmlkZWQgYnkgdGhlIHNjYW4ncyByZXR1cm4gb2JqZWN0ICovXG4gIGFkZHJlc3M6IHN0cmluZztcbiAgLyoqIFNlcnZpY2UncyBVVUlEICovXG4gIHNlcnZpY2U6IHN0cmluZztcbiAgLyoqIENoYXJhY3RlcmlzdGljIFVVSUQgKi9cbiAgY2hhcmFjdGVyaXN0aWM6IHN0cmluZztcbiAgLyoqIFRoaXMgaW50ZWdlciB2YWx1ZSB3aWxsIGJlIGluY3JlbWVudGVkIGV2ZXJ5IHJlYWQvd3JpdGVSZXF1ZXN0ZWQgKi9cbiAgcmVxdWVzdElkOiBudW1iZXI7XG4gIC8qKiBPZmZzZXQgdmFsdWUgKi9cbiAgb2Zmc2V0OiBudW1iZXI7XG4gIC8qKiBtdHUgdmFsdWUgKi9cbiAgbXR1OiBudW1iZXI7XG4gIC8qKiBCYXNlNjQgZW5jb2RlZCBzdHJpbmcgb2YgYnl0ZXMgKi9cbiAgdmFsdWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gQmx1ZXRvb3RoU2Nhbk1vZGUge1xuICBTQ0FOX01PREVfT1BQT1JUVU5JU1RJQyA9IC0xLFxuICBTQ0FOX01PREVfTE9XX1BPV0VSID0gMCxcbiAgU0NBTl9NT0RFX0JBTEFOQ0VEID0gMSxcbiAgU0NBTl9NT0RFX0xPV19MQVRFTkNZID0gMixcbn1cblxuZXhwb3J0IGVudW0gQmx1ZXRvb3RoTWF0Y2hNb2RlIHtcbiAgTUFUQ0hfTU9ERV9BR1JFU1NJVkUgPSAxLFxuICBNQVRDSF9NT0RFX1NUSUNLWSA9IDIsXG59XG5cbmV4cG9ydCBlbnVtIEJsdWV0b290aE1hdGNoTnVtIHtcbiAgTUFUQ0hfTlVNX09ORV9BRFZFUlRJU0VNRU5UID0gMSxcbiAgTUFUQ0hfTlVNX0ZFV19BRFZFUlRJU0VNRU5UID0gMixcbiAgTUFUQ0hfTlVNX01BWF9BRFZFUlRJU0VNRU5UID0gMyxcbn1cblxuZXhwb3J0IGVudW0gQmx1ZXRvb3RoQ2FsbGJhY2tUeXBlIHtcbiAgQ0FMTEJBQ0tfVFlQRV9BTExfTUFUQ0hFUyA9IDEsXG4gIENBTExCQUNLX1RZUEVfRklSU1RfTUFUQ0ggPSAyLFxuICBDQUxMQkFDS19UWVBFX01BVENIX0xPU1QgPSA0LFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yIHtcbiAgY29kZTogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlckluZm8ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgaXNJbml0aWFsaXplZDogYm9vbGVhbjtcbiAgaXNFbmFibGVkOiBib29sZWFuO1xuICBpc1NjYW5uaW5nOiBib29sZWFuO1xuICBpc0Rpc2NvdmVyYWJsZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBAbmFtZSBCbHVldG9vdGhMRVxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIHBsdWdpbiBoYXMgdGhlIG1vc3QgY29tcGxldGUgaW1wbGVtZW50YXRpb24gZm9yIGludGVyYWN0aW5nIHdpdGggQmx1ZXRvb3RoIExFIGRldmljZXMgb24gQW5kcm9pZCwgaU9TIGFuZCBwYXJ0aWFsbHkgV2luZG93cy5cbiAqIEl0J3MgYSB3cmFwIGFyb3VuZCBbcmFuZGR1c2luZy9jb3Jkb3ZhLXBsdWdpbi1ibHVldG9vdGhsZV0oaHR0cHM6Ly9naXRodWIuY29tL3JhbmRkdXNpbmcvY29yZG92YS1wbHVnaW4tYmx1ZXRvb3RobGUvYmxvYi9tYXN0ZXIvcmVhZG1lLm1kKSBjb3Jkb3ZhIHBsdWdpbiBmb3IgSW9uaWMuXG4gKiBJdCBzdXBwb3J0cyBwZXJpcGhlcmFsICoqYW5kKiogY2VudHJhbCBtb2RlcyBhbmQgY292ZXJzIG1vc3Qgb2YgdGhlIEFQSSBtZXRob2RzIGF2YWlsYWJsZSBvbiBBbmRyb2lkIGFuZCBpT1MuXG4gKlxuICogQHVzYWdlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBCbHVldG9vdGhMRSB9IGZyb20gJ0Bpb25pYy1uYXRpdmUvYmx1ZXRvb3RoLWxlL25neCc7XG4gKlxuICpcbiAqIGNvbnN0cnVjdG9yKHB1YmxpYyBibHVldG9vdGhsZTogQmx1ZXRvb3RoTEUsIHB1YmxpYyBwbHQ6IFBsYXRmb3JtKSB7XG4gKlxuICogIHRoaXMucGx0LnJlYWR5KCkudGhlbigocmVhZHlTb3VyY2UpID0+IHtcbiAqXG4gKiAgICBjb25zb2xlLmxvZygnUGxhdGZvcm0gcmVhZHkgZnJvbScsIHJlYWR5U291cmNlKTtcbiAqXG4gKiAgICB0aGlzLmJsdWV0b290aGxlLmluaXRpYWxpemUoKS50aGVuKGJsZSA9PiB7XG4gKiAgICAgIGNvbnNvbGUubG9nKCdibGUnLCBibGUuc3RhdHVzKSAvLyBsb2dzICdlbmFibGVkJ1xuICogICAgfSk7XG4gKlxuICogICB9KTtcbiAqIH1cbiAqXG4gKiBgYGBcbiAqXG4gKi9cbkBQbHVnaW4oe1xuICBwbHVnaW5OYW1lOiAnQmx1ZXRvb3RoTEUnLFxuICBwbHVnaW46ICdjb3Jkb3ZhLXBsdWdpbi1ibHVldG9vdGhsZScsIC8vIG5wbSBwYWNrYWdlIG5hbWUsIGV4YW1wbGU6IGNvcmRvdmEtcGx1Z2luLWNhbWVyYVxuICBwbHVnaW5SZWY6ICdibHVldG9vdGhsZScsIC8vIHRoZSB2YXJpYWJsZSByZWZlcmVuY2UgdG8gY2FsbCB0aGUgcGx1Z2luLCBleGFtcGxlOiBuYXZpZ2F0b3IuZ2VvbG9jYXRpb25cbiAgcmVwbzogJ2h0dHBzOi8vZ2l0aHViLmNvbS9yYW5kZHVzaW5nL2NvcmRvdmEtcGx1Z2luLWJsdWV0b290aGxlJywgLy8gdGhlIGdpdGh1YiByZXBvc2l0b3J5IFVSTCBmb3IgdGhlIHBsdWdpblxuICBpbnN0YWxsOiAnaW9uaWMgY29yZG92YSBwbHVnaW4gYWRkIGNvcmRvdmEtcGx1Z2luLWJsdWV0b290aGxlJywgLy8gT1BUSU9OQUwgaW5zdGFsbCBjb21tYW5kLCBpbiBjYXNlIHRoZSBwbHVnaW4gcmVxdWlyZXMgdmFyaWFibGVzXG4gIGluc3RhbGxWYXJpYWJsZXM6IFtdLCAvLyBPUFRJT05BTCB0aGUgcGx1Z2luIHJlcXVpcmVzIHZhcmlhYmxlc1xuICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCcsICdpT1MnXSwgLy8gQXJyYXkgb2YgcGxhdGZvcm1zIHN1cHBvcnRlZCwgZXhhbXBsZTogWydBbmRyb2lkJywgJ2lPUyddXG59KVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJsdWV0b290aExFIGV4dGVuZHMgSW9uaWNOYXRpdmVQbHVnaW4ge1xuICAvKipcbiAgICogQG5hbWUgaW5pdGlhbGl6ZVxuICAgKiBJbml0aWFsaXplIEJsdWV0b290aCBvbiB0aGUgZGV2aWNlXG4gICAqIEBwYXJhbSB7SW5pdFBhcmFtc30gW3BhcmFtc11cbiAgICogQHJldHVybnMgeyhPYnNlcnZhYmxlPHsgc3RhdHVzOiAnZW5hYmxlZCcgfCAnZGlzYWJsZWQnfT4pfSBUaGUgY2FsbGJhY2sgdGhhdCBpcyBwYXNzZWQgaW5pdGlhbGl6ZSBzdGF0dXMgKGVuYWJsZWQvZGlzYWJsZWQpXG4gICAqL1xuICBAQ29yZG92YSh7IHN1Y2Nlc3NJbmRleDogMCwgZXJyb3JJbmRleDogMiwgb2JzZXJ2YWJsZTogdHJ1ZSB9KVxuICBpbml0aWFsaXplKHBhcmFtcz86IEluaXRQYXJhbXMpOiBPYnNlcnZhYmxlPHsgc3RhdHVzOiAnZW5hYmxlZCcgfCAnZGlzYWJsZWQnIH0+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgZW5hYmxlIChBbmRyb2lkKVxuICAgKiBFbmFibGUgQmx1ZXRvb3RoIG9uIHRoZSBkZXZpY2UuIEFuZHJvaWQgc3VwcG9ydCBvbmx5XG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnLCBzeW5jOiB0cnVlIH0pXG4gIGVuYWJsZSgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgZGlzYWJsZSAoQW5kcm9pZClcbiAgICogRGlzYWJsZSBCbHVldG9vdGggb24gdGhlIGRldmljZS4gQW5kcm9pZCBzdXBwb3J0IG9ubHlcbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgQENvcmRvdmEoeyBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScsIHN5bmM6IHRydWUgfSlcbiAgZGlzYWJsZSgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgZ2V0QWRhcHRlckluZm8gKEFuZHJvaWQpXG4gICAqIFJldHJpZXZlIHVzZWZ1bCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBhZGRyZXNzLCBuYW1lLCBhbmQgdmFyaW91cyBzdGF0ZXMgKGluaXRpYWxpemVkLCBlbmFibGVkLCBzY2FubmluZywgZGlzY292ZXJhYmxlKS5cbiAgICogVGhpcyBjYW4gYmUgdmVyeSB1c2VmdWwgd2hlbiB0aGUgZ2VuZXJhbCBzdGF0ZSBvZiB0aGUgYWRhcHRlciBoYXMgYmVlbiBsb3N0LCBhbmQgd2Ugd291bGQgb3RoZXJ3aXNlIG5lZWQgdG8gZ28gdGhyb3VnaCBhIHNlcmllcyBvZiBjYWxsYmFja3MgdG8gZ2V0IHRoZSBjb3JyZWN0IHN0YXRlIChmaXJzdCBpbml0aWFsaXplZCwgdGhlbiBlbmFibGVkLCB0aGVuIGlzU2Nhbm5pbmcsIGFuZCBzbyBmb3J0aCkuXG4gICAqIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgYWxsb3dzIHVzIHRvIHRha2UgYnVzaW5lc3MgbG9naWMgZGVjaXNpb25zIHdoaWxlIGF2b2lkaW5nIGEgbGFyZ2UgcGFydCBvZiB0aGUgY2FsbGJhY2sgaGVsbC5cbiAgICogQ3VycmVudGx5IHRoZSBkaXNjb3ZlcmFibGUgc3RhdGUgZG9lcyBub3QgaGF2ZSBhbnkgcmVsZXZhbmNlIGJlY2F1c2UgdGhlcmUgaXMgbm8gXCJzZXREaXNjb3ZlcmFibGVcIiBmdW5jdGlvbmFsaXR5IGluIHBsYWNlLiBUaGF0IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8QWRhcHRlckluZm8+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScgfSlcbiAgZ2V0QWRhcHRlckluZm8oKTogUHJvbWlzZTxBZGFwdGVySW5mbz4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSBzdGFydFNjYW5cbiAgICogU2NhbiBmb3IgQmx1ZXRvb3RoIExFIGRldmljZXMuXG4gICAqIFNpbmNlIHNjYW5uaW5nIGlzIGV4cGVuc2l2ZSwgc3RvcCBhcyBzb29uIGFzIHBvc3NpYmxlLiBUaGUgQ29yZG92YSBhcHAgc2hvdWxkIHVzZSBhIHRpbWVyIHRvIGxpbWl0IHRoZSBzY2FuIGludGVydmFsLlxuICAgKiBBbmRyb2lkIEFQSSA+PSAyMyByZXF1aXJlcyBBQ0NFU1NfQ09BUlNFX0xPQ0FUSU9OIHBlcm1pc3Npb25zIHRvIGZpbmQgdW5wYWlyZWQgZGV2aWNlcy5cbiAgICogUGVybWlzc2lvbnMgY2FuIGJlIHJlcXVlc3RlZCBieSB1c2luZyB0aGUgaGFzUGVybWlzc2lvbiBhbmQgcmVxdWVzdFBlcm1pc3Npb24gZnVuY3Rpb25zLlxuICAgKiBBbmRyb2lkIEFQSSA+PSAyMyBhbHNvIHJlcXVpcmVzIGxvY2F0aW9uIHNlcnZpY2VzIHRvIGJlIGVuYWJsZWQuIFVzZSBpc0xvY2F0aW9uRW5hYmxlZCB0byBkZXRlcm1pbmUgd2hldGhlciBsb2NhdGlvbiBzZXJ2aWNlcyBhcmUgZW5hYmxlZC5cbiAgICogSWYgbm90IGVuYWJsZWQsIHVzZSByZXF1ZXN0TG9jYXRpb24gdG8gcHJvbXB0IHRoZSBsb2NhdGlvbiBzZXJ2aWNlcyBzZXR0aW5ncyBwYWdlLlxuICAgKiBAcGFyYW0ge1NjYW5QYXJhbXN9IHBhcmFtcyBTY2FuIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7KE9ic2VydmFibGU8IFNjYW5TdGF0dXMgPil9XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJywgb2JzZXJ2YWJsZTogdHJ1ZSB9KVxuICBzdGFydFNjYW4ocGFyYW1zOiBTY2FuUGFyYW1zKTogT2JzZXJ2YWJsZTxTY2FuU3RhdHVzPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIHN0b3BTY2FuXG4gICAqIFN0b3Agc2NhbiBmb3IgQmx1ZXRvb3RoIExFIGRldmljZXMuIFNpbmNlIHNjYW5uaW5nIGlzIGV4cGVuc2l2ZSwgc3RvcCBhcyBzb29uIGFzIHBvc3NpYmxlXG4gICAqIFRoZSBhcHAgc2hvdWxkIHVzZSBhIHRpbWVyIHRvIGxpbWl0IHRoZSBzY2FubmluZyB0aW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7c3RhdHVzOiAnc2NhblN0b3BwZWQnfT59XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICBzdG9wU2NhbigpOiBQcm9taXNlPHsgc3RhdHVzOiAnc2NhblN0b3BwZWQnIH0+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgcmV0cmlldmVDb25uZWN0ZWRcbiAgICogUmV0cmlldmVkIHBhaXJlZCBCbHVldG9vdGggTEUgZGV2aWNlcy4gSW4gaU9TLCBkZXZpY2VzIHRoYXQgYXJlIFwicGFpcmVkXCIgdG8gd2lsbCBub3QgcmV0dXJuIGR1cmluZyBhIG5vcm1hbCBzY2FuLlxuICAgKiBDYWxsYmFjayBpcyBcImluc3RhbnRcIiBjb21wYXJlZCB0byBhIHNjYW4uXG4gICAqIEBwYXJhbSB7eyBzZXJ2aWNlczogc3RyaW5nW10gfX0gQW4gYXJyYXkgb2Ygc2VydmljZSBJRHMgdG8gZmlsdGVyIHRoZSByZXRyaWV2YWwgYnkuIElmIG5vIHNlcnZpY2UgSURzIGFyZSBzcGVjaWZpZWQsIG5vIGRldmljZXMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8eyBkZXZpY2VzOiBEZXZpY2VJbmZvW10gfT59XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICByZXRyaWV2ZUNvbm5lY3RlZChwYXJhbXM/OiB7IHNlcnZpY2VzPzogc3RyaW5nW10gfSk6IFByb21pc2U8eyBkZXZpY2VzOiBEZXZpY2VJbmZvW10gfT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSBib25kIChBbmRyb2lkKVxuICAgKiBCb25kIHdpdGggYSBkZXZpY2UuXG4gICAqIFRoZSBkZXZpY2UgZG9lc24ndCBuZWVkIHRvIGJlIGNvbm5lY3RlZCB0byBpbml0aWF0ZSBib25kaW5nLiBBbmRyb2lkIHN1cHBvcnQgb25seS5cbiAgICogQHBhcmFtIHt7IGFkZHJlc3M6IHN0cmluZyB9fSBwYXJhbXMgVGhlIGFkZHJlc3MvaWRlbnRpZmllciBwcm92aWRlZCBieSB0aGUgc2NhbidzIHJldHVybiBvYmplY3RcbiAgICogQHJldHVybnMgeyhPYnNlcnZhYmxlPHsgc3RhdHVzOiBEZXZpY2VJbmZvIH0+KX1cbiAgICogc3VjY2VzczpcbiAgICogICAgVGhlIGZpcnN0IHN1Y2Nlc3MgY2FsbGJhY2sgc2hvdWxkIGFsd2F5cyByZXR1cm4gd2l0aCBzdGF0dXMgPT0gYm9uZGluZy5cbiAgICogICAgSWYgdGhlIGJvbmQgaXMgY3JlYXRlZCwgdGhlIGNhbGxiYWNrIHdpbGwgcmV0dXJuIGFnYWluIHdpdGggc3RhdHVzID09IGJvbmRlZC5cbiAgICogICAgSWYgdGhlIGJvbmRpbmcgcG9wdXAgaXMgY2FuY2VsZWQgb3IgdGhlIHdyb25nIGNvZGUgaXMgZW50ZXJlZCwgdGhlIGNhbGxiYWNrIHdpbGwgcmV0dXJuIGFnYWluIHdpdGggc3RhdHVzID09IHVuYm9uZGVkLlxuICAgKiBlcnJvcjpcbiAgICogICAgVGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgYm9uZCBvcGVyYXRpb24gZmFpbHNcbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnLCBvYnNlcnZhYmxlOiB0cnVlIH0pXG4gIGJvbmQocGFyYW1zOiB7IGFkZHJlc3M6IHN0cmluZyB9KTogT2JzZXJ2YWJsZTx7IHN0YXR1czogRGV2aWNlSW5mbyB9PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIHVuYm9uZCAoQW5kcm9pZClcbiAgICogVW5ib25kIHdpdGggYSBkZXZpY2UuIFRoZSBkZXZpY2UgZG9lc24ndCBuZWVkIHRvIGJlIGNvbm5lY3RlZCB0byBpbml0aWF0ZSBib25kaW5nLiBBbmRyb2lkIHN1cHBvcnQgb25seS5cbiAgICogQHBhcmFtIHt7YWRkcmVzczogc3RyaW5nfX0gcGFyYW1zIFRoZSBhZGRyZXNzL2lkZW50aWZpZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8eyBzdGF0dXM6IERldmljZUluZm8gfT59XG4gICAqICAgIHN1Y2Nlc3M6IFRoZSBzdWNjZXNzIGNhbGxiYWNrIHNob3VsZCBhbHdheXMgcmV0dXJuIHdpdGggc3RhdHVzID09IHVuYm9uZGVkLCB0aGF0IGlzIHBhc3NlZCB3aXRoIGRldmljZSBvYmplY3RcbiAgICogICAgZXJyb3I6IFRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHVuYm9uZCBvcGVyYXRpb24gZmFpbHNcbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIHVuYm9uZChwYXJhbXM6IHsgYWRkcmVzczogc3RyaW5nIH0pOiBQcm9taXNlPHsgc3RhdHVzOiBEZXZpY2VJbmZvIH0+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgY29ubmVjdFxuICAgKiBDb25uZWN0IHRvIGEgQmx1ZXRvb3RoIExFIGRldmljZVxuICAgKiBAcGFyYW0gY29ubmVjdFN1Y2Nlc3MgVGhlIHN1Y2Nlc3MgY2FsbGJhY2sgdGhhdCBpcyBwYXNzZWQgd2l0aCBkZXZpY2Ugb2JqZWN0XG4gICAqIEBwYXJhbSBjb25uZWN0RXJyb3IgICBUaGUgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjb25uZWN0IG9wZXJhdGlvbiBmYWlsc1xuICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICAgVGhlIGNvbm5lY3Rpb24gcGFyYW1zXG4gICAqXG4gICAqIEBwYXJhbSB7Q29ubmVjdGlvblBhcmFtc30gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsoT2JzZXJ2YWJsZTx7IHN0YXR1czogRGV2aWNlSW5mbyB9Pil9XG4gICAqICAgIHN1Y2Nlc3M6IGRldmljZSBvYmplY3Qgd2l0aCBzdGF0dXNcbiAgICogICAgZXJyb3I6IFRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHVuYm9uZCBvcGVyYXRpb24gZmFpbHNcbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnLCBvYnNlcnZhYmxlOiB0cnVlIH0pXG4gIGNvbm5lY3QocGFyYW1zOiBDb25uZWN0aW9uUGFyYW1zKTogT2JzZXJ2YWJsZTxEZXZpY2VJbmZvPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIHJlY29ubmVjdFxuICAgKiBSZWNvbm5lY3QgdG8gYSBwcmV2aW91c2x5IGNvbm5lY3RlZCBCbHVldG9vdGggZGV2aWNlXG4gICAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZ319IHBhcmFtcyBUaGUgYWRkcmVzcy9pZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIHsoT2JzZXJ2YWJsZTxEZXZpY2VJbmZvPil9XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJywgb2JzZXJ2YWJsZTogdHJ1ZSB9KVxuICByZWNvbm5lY3QocGFyYW1zOiB7IGFkZHJlc3M6IHN0cmluZyB9KTogT2JzZXJ2YWJsZTxEZXZpY2VJbmZvPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIGRpc2Nvbm5lY3RcbiAgICogRGlzY29ubmVjdCBmcm9tIGEgQmx1ZXRvb3RoIExFIGRldmljZS5cbiAgICogICAgICAgICAgICAgIE5vdGU6IEl0J3Mgc2ltcGxlciB0byBqdXN0IGNhbGwgY2xvc2UoKS4gU3RhcnRpbmcgd2l0aCBpT1MgMTAsIGRpc2Nvbm5lY3RpbmcgYmVmb3JlIGNsb3Npbmcgc2VlbXMgcmVxdWlyZWQhXG4gICAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZ319IHBhcmFtcyBUaGUgYWRkcmVzcy9pZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPERldmljZUluZm8+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScgfSlcbiAgZGlzY29ubmVjdChwYXJhbXM6IHsgYWRkcmVzczogc3RyaW5nIH0pOiBQcm9taXNlPERldmljZUluZm8+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgY2xvc2VcbiAgICogQ2xvc2UvZGlzcG9zZSBhIEJsdWV0b290aCBMRSBkZXZpY2UuXG4gICAqIFByaW9yIHRvIDIuNy4wLCB5b3UgbmVlZGVkIHRvIGRpc2Nvbm5lY3QgdG8gdGhlIGRldmljZSBiZWZvcmUgY2xvc2luZywgYnV0IHRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLlxuICAgKiBTdGFydGluZyB3aXRoIGlPUyAxMCwgZGlzY29ubmVjdGluZyBiZWZvcmUgY2xvc2luZyBzZWVtcyByZXF1aXJlZCFcbiAgICogQHBhcmFtIHt7IGFkZHJlc3M6IHN0cmluZyB9fSBwYXJhbXMgVGhlIGFkZHJlc3MvaWRlbnRpZmllclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxEZXZpY2VJbmZvPn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIGNsb3NlKHBhcmFtczogeyBhZGRyZXNzOiBzdHJpbmcgfSk6IFByb21pc2U8RGV2aWNlSW5mbz4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSBkaXNjb3ZlclxuICAgKiBEaXNjb3ZlciBhbGwgdGhlIGRldmljZXMgc2VydmljZXMsIGNoYXJhY3RlcmlzdGljcyBhbmQgZGVzY3JpcHRvcnMuXG4gICAqIERvZXNuJ3QgbmVlZCB0byBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgZGlzY29ubmVjdGluZyBhbmQgdGhlbiByZWNvbm5lY3RpbmcuXG4gICAqIElmIHVzaW5nIGlPUywgeW91IHNob3VsZG4ndCB1c2UgZGlzY292ZXIgYW5kIHNlcnZpY2VzL2NoYXJhY3RlcmlzdGljcy9kZXNjcmlwdG9ycyBvbiB0aGUgc2FtZSBkZXZpY2UuXG4gICAqIFRoZXJlIHNlZW1zIHRvIGJlIGFuIGlzc3VlIHdpdGggY2FsbGluZyBkaXNjb3ZlciBvbiBpT1M4IGRldmljZXMsIHNvIHVzZSB3aXRoIGNhdXRpb24uXG4gICAqIE9uIHNvbWUgQW5kcm9pZCB2ZXJzaW9ucywgdGhlIGRpc2NvdmVyZWQgc2VydmljZXMgbWF5IGJlIGNhY2hlZCBmb3IgYSBkZXZpY2UuXG4gICAqIFN1YnNlcXVlbnQgZGlzY292ZXIgZXZlbnRzIHdpbGwgbWFrZSB1c2Ugb2YgdGhpcyBjYWNoZS5cbiAgICogSWYgeW91ciBkZXZpY2UncyBzZXJ2aWNlcyBjaGFuZ2UsIHNldCB0aGUgY2xlYXJDYWNoZSBwYXJhbWV0ZXIgdG8gZm9yY2UgQW5kcm9pZCB0byByZS1kaXNjb3ZlciBzZXJ2aWNlcy5cbiAgICogQHBhcmFtIHt7IGFkZHJlc3M6IHN0cmluZywgY2xlYXJDYWNoZTogYm9vbGVhbiB9fSBwYXJhbXMgVGhlIGFkZHJlc3MvaWRlbnRpZmllclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxEZXZpY2U+fVxuICAgKiAgICBzdWNjZXNzOiBkZXZpY2Ugb2JqZWN0IChjb250YWlucyBhcnJheSBvZiBzZXJ2aWNlIG9iamVjdHMpXG4gICAqICAgIGVycm9yOiBUaGUgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSB1bmJvbmQgb3BlcmF0aW9uIGZhaWxzXG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICBkaXNjb3ZlcihwYXJhbXM6IHsgYWRkcmVzczogc3RyaW5nOyBjbGVhckNhY2hlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxEZXZpY2U+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgc2VydmljZXMgKGlPUylcbiAgICogRGlzY292ZXIgdGhlIGRldmljZSdzIHNlcnZpY2VzLlxuICAgKiBOb3QgcHJvdmlkaW5nIGFuIGFycmF5IG9mIHNlcnZpY2VzIHdpbGwgcmV0dXJuIGFsbCBzZXJ2aWNlcyBhbmQgdGFrZSBsb25nZXIgdG8gZGlzY292ZXIuIGlPUyBzdXBwb3J0IG9ubHkuXG4gICAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZywgc2VydmljZXM6IHN0cmluZ1tdfX0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VzPn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIHNlcnZpY2VzKHBhcmFtczogeyBhZGRyZXNzOiBzdHJpbmc7IHNlcnZpY2VzPzogc3RyaW5nW10gfSk6IFByb21pc2U8U2VydmljZXM+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgY2hhcmFjdGVyaXN0aWNzIChpT1MpXG4gICAqIERpc2NvdmVyIHRoZSBzZXJ2aWNlJ3MgY2hhcmFjdGVyaXN0aWNzLlxuICAgKiBOb3QgcHJvdmlkaW5nIGFuIGFycmF5IG9mIGNoYXJhY3RlcmlzdGljcyB3aWxsIHJldHVybiBhbGwgY2hhcmFjdGVyaXN0aWNzIGFuZCB0YWtlIGxvbmdlciB0byBkaXNjb3Zlci4gaU9TIHN1cHBvcnQgb25seS5cbiAgICogQHBhcmFtIHtDaGFyYWN0ZXJpc3RpY1BhcmFtc30gcGFyYW1zIENoYXJhY3RlcmlzdGljIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7IGNoYXJhY3RlcmlzdGljczogQ2hhcmFjdGVyaXN0aWNzIH0+fSBUaGUgc2VydmljZSBpZCBhbmQgYW4gQXJyYXkgb2YgY2hhcmFjdGVyaXN0aWNzXG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICBjaGFyYWN0ZXJpc3RpY3MocGFyYW1zOiBDaGFyYWN0ZXJpc3RpY1BhcmFtcyk6IFByb21pc2U8eyBjaGFyYWN0ZXJpc3RpY3M6IENoYXJhY3RlcmlzdGljcyB9PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIGRlc2NyaXB0b3JzIChpT1MpXG4gICAqIERpc2NvdmVyIHRoZSBjaGFyYWN0ZXJpc3RpYydzIGRlc2NyaXB0b3JzLiBpT1Mgc3VwcG9ydCBvbmx5LlxuICAgKiBAcGFyYW0ge0Rlc2NyaXB0b3JQYXJhbXN9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7IGRlc2NyaXB0b3JzOiBEZXNjcmlwdG9ycyB9Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIGRlc2NyaXB0b3JzKHBhcmFtczogRGVzY3JpcHRvclBhcmFtcyk6IFByb21pc2U8eyBkZXNjcmlwdG9yczogRGVzY3JpcHRvcnMgfT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSByZWFkXG4gICAqIFJlYWQgYSBwYXJ0aWN1bGFyIHNlcnZpY2UncyBjaGFyYWN0ZXJpc3RpYyBvbmNlXG4gICAqIEBwYXJhbSB7RGVzY3JpcHRvclBhcmFtc30gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE9wZXJhdGlvblJlc3VsdD59XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICByZWFkKHBhcmFtczogRGVzY3JpcHRvclBhcmFtcyk6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIHN1YnNjcmliZVxuICAgKiBTdWJzY3JpYmUgdG8gYSBwYXJ0aWN1bGFyIHNlcnZpY2UncyBjaGFyYWN0ZXJpc3RpYy5cbiAgICogT25jZSBhIHN1YnNjcmlwdGlvbiBpcyBubyBsb25nZXIgbmVlZGVkLCBleGVjdXRlIHVuc3Vic2NyaWJlIGluIGEgc2ltaWxhciBmYXNoaW9uLlxuICAgKiBUaGUgQ2xpZW50IENvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgd3JpdHRlbiB0byBlbmFibGUgbm90aWZpY2F0aW9uL2luZGljYXRpb24gYmFzZWQgb24gdGhlIGNoYXJhY3RlcmlzdGljJ3MgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHtEZXNjcmlwdG9yUGFyYW1zfSBwYXJhbXNcbiAgICogQHJldHVybnMge09ic2VydmFibGU8T3BlcmF0aW9uUmVzdWx0Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnLCBvYnNlcnZhYmxlOiB0cnVlIH0pXG4gIHN1YnNjcmliZShwYXJhbXM6IERlc2NyaXB0b3JQYXJhbXMpOiBPYnNlcnZhYmxlPE9wZXJhdGlvblJlc3VsdD4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSB1bnN1YnNjcmliZVxuICAgKiBVbnN1YnNjcmliZSB0byBhIHBhcnRpY3VsYXIgc2VydmljZSdzIGNoYXJhY3RlcmlzdGljLlxuICAgKiBAcGFyYW0ge0Rlc2NyaXB0b3JQYXJhbXN9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxVbnN1YnNjcmliZVJlc3VsdD59XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICB1bnN1YnNjcmliZShwYXJhbXM6IERlc2NyaXB0b3JQYXJhbXMpOiBQcm9taXNlPFVuc3Vic2NyaWJlUmVzdWx0PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIHdyaXRlIChsaW1pdGF0aW9uIG9uIGlPUywgcmVhZCBiZWxvdylcbiAgICogV3JpdGUgYSBwYXJ0aWN1bGFyIHNlcnZpY2UncyBjaGFyYWN0ZXJpc3RpY1xuICAgKiBOb3RlOiBubyBjYWxsYmFjayB3aWxsIG9jY3VyIG9uIHdyaXRlIHdpdGhvdXQgcmVzcG9uc2Ugb24gaU9TLlxuICAgKiBAcGFyYW0ge1dyaXRlQ2hhcmFjdGVyaXN0aWNQYXJhbXN9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPcGVyYXRpb25SZXN1bHQ+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScgfSlcbiAgd3JpdGUocGFyYW1zOiBXcml0ZUNoYXJhY3RlcmlzdGljUGFyYW1zKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgd3JpdGUgKGxpbWl0YXRpb24gb24gaU9TLCByZWFkIGJlbG93KVxuICAgKiBXcml0ZSBRdWljayAvIFF1ZXVlLCB1c2UgdGhpcyBtZXRob2QgdG8gcXVpY2tseSBleGVjdXRlIHdyaXRlIHdpdGhvdXQgcmVzcG9uc2UgY29tbWFuZHMgd2hlbiB3cml0aW5nIG1vcmUgdGhhbiAyMCBieXRlcyBhdCBhIHRpbWUuXG4gICAqIE5vdGU6IG5vIGNhbGxiYWNrIHdpbGwgb2NjdXIgb24gd3JpdGUgd2l0aG91dCByZXNwb25zZSBvbiBpT1MuXG4gICAqIEBwYXJhbSB7V3JpdGVDaGFyYWN0ZXJpc3RpY1BhcmFtc30gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE9wZXJhdGlvblJlc3VsdD59XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICB3cml0ZVEocGFyYW1zOiBXcml0ZUNoYXJhY3RlcmlzdGljUGFyYW1zKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgcmVhZERlc2NyaXB0b3JcbiAgICogUmVhZCBhIHBhcnRpY3VsYXIgY2hhcmFjdGVyaXN0J3MgZGVzY3JpcHRvclxuICAgKiBAcGFyYW0ge09wZXJhdGlvbkRlc2NyaXB0b3JQYXJhbXN9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxEZXNjcmlwdG9yUmVzdWx0Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIHJlYWREZXNjcmlwdG9yKHBhcmFtczogT3BlcmF0aW9uRGVzY3JpcHRvclBhcmFtcyk6IFByb21pc2U8RGVzY3JpcHRvclJlc3VsdD4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSB3cml0ZURlc2NyaXB0b3JcbiAgICogV3JpdGUgYSBwYXJ0aWN1bGFyIGNoYXJhY3RlcmlzdGljJ3MgZGVzY3JpcHRvci4gVW5hYmxlIHRvIHdyaXRlIGNoYXJhY3RlcmlzdGljIGNvbmZpZ3VyYXRpb24gZGlyZWN0bHkgdG8ga2VlcCBpbiBsaW5lIHdpdGggaU9TIGltcGxlbWVudGF0aW9uLlxuICAgKiBJbnN0ZWFkIHVzZSBzdWJzY3JpYmUvdW5zdWJzY3JpYmUsIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSBlbmFibGUvZGlzYWJsZSBub3RpZmljYXRpb24uXG4gICAqIEBwYXJhbSB7V3JpdGVEZXNjcmlwdG9yUGFyYW1zfSBwYXJhbXNcbiAgICogQHJldHVybnMge1Byb21pc2U8RGVzY3JpcHRvclJlc3VsdD59XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICB3cml0ZURlc2NyaXB0b3IocGFyYW1zOiBXcml0ZURlc2NyaXB0b3JQYXJhbXMpOiBQcm9taXNlPERlc2NyaXB0b3JSZXN1bHQ+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgcnNzaVxuICAgKiBSZWFkIFJTU0kgb2YgYSBjb25uZWN0ZWQgZGV2aWNlLiBSU1NJIGlzIGFsc28gcmV0dXJuZWQgd2l0aCBzY2FubmluZy5cbiAgICogQHBhcmFtIHt7IGFkZHJlc3M6IHN0cmluZyB9fSBwYXJhbXNcbiAgICogQHJldHVybnMge1Byb21pc2U8IFJTU0kgPn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIHJzc2kocGFyYW1zOiB7IGFkZHJlc3M6IHN0cmluZyB9KTogUHJvbWlzZTxSU1NJPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIG10dSAoQW5kcm9pZCwgQW5kcm9pZCA1KylcbiAgICogU2V0IE1UVSBvZiBhIGNvbm5lY3RlZCBkZXZpY2UuIEFuZHJvaWQgb25seS5cbiAgICogQHBhcmFtIHt7IGFkZHJlc3M6IHN0cmluZywgbXR1OiBudW1iZXIgfX0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPCBNVFUgPn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIG10dShwYXJhbXM6IHsgYWRkcmVzczogc3RyaW5nOyBtdHU/OiBudW1iZXIgfSk6IFByb21pc2U8TVRVPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIHJlcXVlc3RDb25uZWN0aW9uUHJpb3JpdHkgKEFuZHJvaWQsIEFuZHJvaWQgNSspXG4gICAqIFJlcXVlc3QgYSBjaGFuZ2UgaW4gdGhlIGNvbm5lY3Rpb24gcHJpb3JpdHkgdG8gaW1wcm92ZSB0aHJvdWdocHV0IHdoZW4gdHJhbnNmZXIgbGFyZ2UgYW1vdW50cyBvZiBkYXRhIHZpYSBCTEUuXG4gICAqIEFuZHJvaWQgc3VwcG9ydCBvbmx5LiBpT1Mgd2lsbCByZXR1cm4gZXJyb3IuXG4gICAqIEBwYXJhbSB7eyBhZGRyZXNzOiBzdHJpbmcsIGNvbm5lY3Rpb25Qcmlvcml0eTogQ29ubmVjdGlvblByaW9yaXR5IH19IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxEZXZpY2VJbmZvPn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIHJlcXVlc3RDb25uZWN0aW9uUHJpb3JpdHkocGFyYW1zOiB7IGFkZHJlc3M6IHN0cmluZzsgY29ubmVjdGlvblByaW9yaXR5OiBDb25uZWN0aW9uUHJpb3JpdHkgfSk6IFByb21pc2U8RGV2aWNlSW5mbz4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSBpc0luaXRpYWxpemVkXG4gICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBhZGFwdGVyIGlzIGluaXRpYWxpemVkLiBObyBlcnJvciBjYWxsYmFjay4gUmV0dXJucyB0cnVlIG9yIGZhbHNlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHsgaXNJbml0aWFsaXplZDogYm9vbGVhbiB9Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIGlzSW5pdGlhbGl6ZWQoKTogUHJvbWlzZTx7IGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSBpc0VuYWJsZWRcbiAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFkYXB0ZXIgaXMgZW5hYmxlZC4gTm8gZXJyb3IgY2FsbGJhY2tcbiAgICogQHJldHVybnMge1Byb21pc2U8eyBpc0VuYWJsZWQ6IGJvb2xlYW4gfT59XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICBpc0VuYWJsZWQoKTogUHJvbWlzZTx7IGlzRW5hYmxlZDogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIGlzU2Nhbm5pbmdcbiAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFkYXB0ZXIgaXMgc2Nhbm5pbmcuIE5vIGVycm9yIGNhbGxiYWNrLiBSZXR1cm5zIHRydWUgb3IgZmFsc2VcbiAgICogQHJldHVybnMge1Byb21pc2U8eyBpc1NjYW5uaW5nOiBib29sZWFuIH0+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScgfSlcbiAgaXNTY2FubmluZygpOiBQcm9taXNlPHsgaXNTY2FubmluZzogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIGlzQm9uZGVkIChBbmRyb2lkKVxuICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGV2aWNlIGlzIGJvbmRlZCBvciBub3QsIG9yIGVycm9yIGlmIG5vdCBpbml0aWFsaXplZC4gQW5kcm9pZCBzdXBwb3J0IG9ubHkuXG4gICAqIEBwYXJhbSB7eyBhZGRyZXNzOiBzdHJpbmcgfX0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEJvbmRlZFN0YXR1cz59XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICBpc0JvbmRlZChwYXJhbXM6IHsgYWRkcmVzczogc3RyaW5nIH0pOiBQcm9taXNlPEJvbmRlZFN0YXR1cz4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSB3YXNDb25uZWN0ZWRcbiAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRldmljZSB3YXMgY29ubmVjdGVkLCBvciBlcnJvciBpZiBub3QgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSB7eyBhZGRyZXNzOiBzdHJpbmcgfX0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFByZXZDb25uZWN0aW9uU3RhdHVzPn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIHdhc0Nvbm5lY3RlZChwYXJhbXM6IHsgYWRkcmVzczogc3RyaW5nIH0pOiBQcm9taXNlPFByZXZDb25uZWN0aW9uU3RhdHVzPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIGlzQ29ubmVjdGVkXG4gICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkLCBvciBlcnJvciBpZiBub3QgaW5pdGlhbGl6ZWQgb3IgbmV2ZXIgY29ubmVjdGVkIHRvIGRldmljZVxuICAgKiBAcGFyYW0ge3sgYWRkcmVzczogc3RyaW5nIH19IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDdXJyQ29ubmVjdGlvblN0YXR1cz59XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICBpc0Nvbm5lY3RlZChwYXJhbXM6IHsgYWRkcmVzczogc3RyaW5nIH0pOiBQcm9taXNlPEN1cnJDb25uZWN0aW9uU3RhdHVzPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIGlzRGlzY292ZXJlZFxuICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGV2aWNlJ3MgY2hhcmFjdGVyaXN0aWNzIGFuZCBkZXNjcmlwdG9ycyBoYXZlIGJlZW4gZGlzY292ZXJlZCwgb3IgZXJyb3IgaWYgbm90IGluaXRpYWxpemVkIG9yIG5vdCBjb25uZWN0ZWQgdG8gZGV2aWNlLlxuICAgKiBAcGFyYW0ge3sgYWRkcmVzczogc3RyaW5nIH19IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxEaXNjb3ZlclN0YXR1cz59XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICBpc0Rpc2NvdmVyZWQocGFyYW1zOiB7IGFkZHJlc3M6IHN0cmluZyB9KTogUHJvbWlzZTxEaXNjb3ZlclN0YXR1cz4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSBoYXNQZXJtaXNzaW9uICh1c2VmdWwgb25seSBmb3IgQW5kcm9pZCA2KyAvIEFQSSAyMylcbiAgICogRGV0ZXJtaW5lIHdoZXRoZXIgY29hcnNlIGxvY2F0aW9uIHByaXZpbGVnZXMgYXJlIGdyYW50ZWQgc2luY2Ugc2Nhbm5pbmcgZm9yIHVucGFpcmVkIGRldmljZXMgcmVxdWlyZXMgaXQgaW4gQW5kcm9pZCBBUEkgMjNcbiAgICogQHJldHVybnMge1Byb21pc2U8eyBoYXNQZXJtaXNzaW9uOiBib29sZWFuIH0+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScgfSlcbiAgaGFzUGVybWlzc2lvbigpOiBQcm9taXNlPHsgaGFzUGVybWlzc2lvbjogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIHJlcXVlc3RQZXJtaXNzaW9uICh1c2VmdWwgb25seSBmb3IgQW5kcm9pZCA2KyAvIEFQSSAyMylcbiAgICogUmVxdWVzdCBjb2Fyc2UgbG9jYXRpb24gcHJpdmlsZWdlcyBzaW5jZSBzY2FubmluZyBmb3IgdW5wYWlyZWQgZGV2aWNlcyByZXF1aXJlcyBpdCBpbiBBbmRyb2lkIEFQSSAyMy5cbiAgICogV2lsbCByZXR1cm4gYW4gZXJyb3IgaWYgY2FsbGVkIG9uIGlPUyBvciBBbmRyb2lkIHZlcnNpb25zIHByaW9yIHRvIDYuMC5cbiAgICogQHJldHVybnMge1Byb21pc2U8eyByZXF1ZXN0UGVybWlzc2lvbjogYm9vbGVhbiB9Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIHJlcXVlc3RQZXJtaXNzaW9uKCk6IFByb21pc2U8eyByZXF1ZXN0UGVybWlzc2lvbjogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIGlzTG9jYXRpb25FbmFibGVkICh1c2VmdWwgb25seSBmb3IgQW5kcm9pZCA2KyAvIEFQSSAyMylcbiAgICogRGV0ZXJtaW5lIGlmIGxvY2F0aW9uIHNlcnZpY2VzIGFyZSBlbmFibGVkIG9yIG5vdC4gTG9jYXRpb24gU2VydmljZXMgYXJlIHJlcXVpcmVkIHRvIGZpbmQgZGV2aWNlcyBpbiBBbmRyb2lkIEFQSSAyM1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7IGlzTG9jYXRpb25FbmFibGVkOiBib29sZWFuIH0+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScgfSlcbiAgaXNMb2NhdGlvbkVuYWJsZWQoKTogUHJvbWlzZTx7IGlzTG9jYXRpb25FbmFibGVkOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgcmVxdWVzdExvY2F0aW9uICh1c2VmdWwgb25seSBmb3IgQW5kcm9pZCA2KyAvIEFQSSAyMylcbiAgICogUHJvbXB0IGxvY2F0aW9uIHNlcnZpY2VzIHNldHRpbmdzIHBhZ2VzLiByZXF1ZXN0TG9jYXRpb24gcHJvcGVydHkgcmV0dXJucyB3aGV0aGVyIGxvY2F0aW9uIHNlcnZpY2VzIGFyZSBlbmFibGVkIG9yIGRpc2FibGVkLlxuICAgKiBMb2NhdGlvbiBTZXJ2aWNlcyBhcmUgcmVxdWlyZWQgdG8gZmluZCBkZXZpY2VzIGluIEFuZHJvaWQgQVBJIDIzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7IHJlcXVlc3RMb2NhdGlvbjogYm9vbGVhbiB9Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIHJlcXVlc3RMb2NhdGlvbigpOiBQcm9taXNlPHsgcmVxdWVzdExvY2F0aW9uOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgaW5pdGlhbGl6ZVBlcmlwaGVyYWxcbiAgICogSW5pdGlhbGl6ZSBCbHVldG9vdGggb24gdGhlIGRldmljZS4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UuXG4gICAqIENhbGxiYWNrIHdpbGwgY29udGludW91c2x5IGJlIHVzZWQgd2hlbmV2ZXIgQmx1ZXRvb3RoIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuXG4gICAqIEBwYXJhbSB7SW5pdFBlcmlwaGVyYWxQYXJhbXN9IFtwYXJhbXNdXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPEluaXRpYWxpemVSZXN1bHQ+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScsIG9ic2VydmFibGU6IHRydWUgfSlcbiAgaW5pdGlhbGl6ZVBlcmlwaGVyYWwocGFyYW1zPzogSW5pdFBlcmlwaGVyYWxQYXJhbXMpOiBPYnNlcnZhYmxlPEluaXRpYWxpemVSZXN1bHQ+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgYWRkU2VydmljZVxuICAgKiBBZGQgYSBzZXJ2aWNlIHdpdGggY2hhcmFjdGVyaXN0aWNzIGFuZCBkZXNjcmlwdG9ycy4gSWYgbW9yZSB0aGFuIG9uZSBzZXJ2aWNlIGlzIGFkZGVkLCBhZGQgdGhlbSBzZXF1ZW50aWFsbHlcbiAgICogQHBhcmFtIHt7IHNlcnZpY2U6IHN0cmluZywgY2hhcmFjdGVyaXN0aWNzOiBDaGFyYWN0ZXJpc3RpY1tdIH19IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7IHNlcnZpY2U6IHN0cmluZywgc3RhdHVzOiBTdGF0dXMgfT59XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICBhZGRTZXJ2aWNlKHBhcmFtczoge1xuICAgIHNlcnZpY2U6IHN0cmluZztcbiAgICBjaGFyYWN0ZXJpc3RpY3M6IENoYXJhY3RlcmlzdGljW107XG4gIH0pOiBQcm9taXNlPHsgc2VydmljZTogc3RyaW5nOyBzdGF0dXM6IFN0YXR1cyB9PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIHJlbW92ZVNlcnZpY2VcbiAgICogUmVtb3ZlIGEgc2VydmljZVxuICAgKiBAcGFyYW0ge3sgc2VydmljZTogc3RyaW5nIH19IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7IHNlcnZpY2U6IHN0cmluZywgc3RhdHVzOiBTdGF0dXMgfT59XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICByZW1vdmVTZXJ2aWNlKHBhcmFtczogeyBzZXJ2aWNlOiBzdHJpbmcgfSk6IFByb21pc2U8eyBzZXJ2aWNlOiBzdHJpbmc7IHN0YXR1czogU3RhdHVzIH0+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgcmVtb3ZlQWxsU2VydmljZXNcbiAgICogUmVtb3ZlIGFsbCBzZXJ2aWNlc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7IHN0YXR1czogU3RhdHVzIH0+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScgfSlcbiAgcmVtb3ZlQWxsU2VydmljZXMoKTogUHJvbWlzZTx7IHN0YXR1czogU3RhdHVzIH0+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgc3RhcnRBZHZlcnRpc2luZyAoZGlmZmVyZW50IGJlaGF2aW9yIG9uIEFuZHJvaWQvaU9TLCByZWFkIGJlbG93KVxuICAgKiBTdGFydCBhZHZlcnRpc2luZyBhcyBhIEJMRSBkZXZpY2UuXG4gICAqIE5vdGU6IFRoaXMgbmVlZHMgdG8gYmUgaW1wcm92ZWQgc28gc2VydmljZXMgY2FuIGJlIHVzZWQgZm9yIGJvdGggQW5kcm9pZCBhbmQgaU9TLlxuICAgKiBPbiBpT1MsIHRoZSBhZHZlcnRpc2luZyBkZXZpY2VzIGxpa2VzIHRvIHJlbmFtZSBpdHNlbGYgYmFjayB0byB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlLCBpLmUuIFJhbmQnIGlQaG9uZVxuICAgKiBAcGFyYW0ge0FkdmVydGlzaW5nUGFyYW1zfSBwYXJhbXNcbiAgICogQHJldHVybnMge1Byb21pc2U8eyBzdGF0dXM6IFN0YXR1cyB9Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIHN0YXJ0QWR2ZXJ0aXNpbmcocGFyYW1zOiBBZHZlcnRpc2luZ1BhcmFtcyk6IFByb21pc2U8eyBzdGF0dXM6IFN0YXR1cyB9PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIHN0b3BBZHZlcnRpc2luZ1xuICAgKiBTdG9wIGFkdmVydGlzaW5nXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHsgc3RhdHVzOiBTdGF0dXMgfT59XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICBzdG9wQWR2ZXJ0aXNpbmcoKTogUHJvbWlzZTx7IHN0YXR1czogU3RhdHVzIH0+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgaXNBZHZlcnRpc2luZ1xuICAgKiBEZXRlcm1pbmUgaWYgYXBwIGlzIGFkdmVydGlzaW5nIG9yIG5vdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8eyBzdGF0dXM6IGJvb2xlYW4gfT59XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICBpc0FkdmVydGlzaW5nKCk6IFByb21pc2U8eyBzdGF0dXM6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSByZXNwb25kXG4gICAqIFJlc3BvbmQgdG8gYSByZWFkIG9yIHdyaXRlIHJlcXVlc3RcbiAgICogQHBhcmFtIHtSZXNwb25kUGFyYW1zfSBwYXJhbXNcbiAgICogQHJldHVybnMge1Byb21pc2U8eyBzdGF0dXM6IFN0YXR1cyB9Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIHJlc3BvbmQocGFyYW1zOiBSZXNwb25kUGFyYW1zKTogUHJvbWlzZTx7IHN0YXR1czogU3RhdHVzIH0+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgbm90aWZ5XG4gICAqIFVwZGF0ZSBhIHZhbHVlIGZvciBhIHN1YnNjcmlwdGlvbi4gQ3VycmVudGx5IGFsbCBzdWJzY3JpYmVkIGRldmljZXMgd2lsbCByZWNlaXZlIHVwZGF0ZS5cbiAgICogRGV2aWNlIHNwZWNpZmljIHVwZGF0ZXMgd2lsbCBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLlxuICAgKiBJZiBzZW50IGVxdWFscyBmYWxzZSBpbiB0aGUgcmV0dXJuIHZhbHVlLCB5b3UgbXVzdCB3YWl0IGZvciB0aGUgcGVyaXBoZXJhbE1hbmFnZXJJc1JlYWR5VG9VcGRhdGVTdWJzY3JpYmVycyBldmVudCBiZWZvcmUgc2VuZGluZyBtb3JlIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSB7Tm90aWZ5UGFyYW1zfSBwYXJhbXNcbiAgICogQHJldHVybnMge1Byb21pc2U8eyBzdGF0dXM6IFN0YXR1cywgc2VudDogYm9vbGVhbiB9Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIG5vdGlmeShwYXJhbXM6IE5vdGlmeVBhcmFtcyk6IFByb21pc2U8eyBzdGF0dXM6IFN0YXR1czsgc2VudDogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIGVuY29kZWRTdHJpbmdUb0J5dGVzXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIGZyb20gYSBjaGFyYWN0ZXJpc3RpYyBvciBkZXNjcmlwdG9yIHZhbHVlIGludG8gYSB1aW50OEFycmF5IG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICAgKi9cbiAgQENvcmRvdmEoeyBzeW5jOiB0cnVlIH0pXG4gIGVuY29kZWRTdHJpbmdUb0J5dGVzKHZhbHVlOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgYnl0ZXNUb0VuY29kZWRTdHJpbmdcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgYSB1bml0OEFycmF5IHRvIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIGZvciBhIGNoYXJhY3RlcmljIG9yIGRlc2NyaXB0b3Igd3JpdGVcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgQENvcmRvdmEoeyBzeW5jOiB0cnVlIH0pXG4gIGJ5dGVzVG9FbmNvZGVkU3RyaW5nKHZhbHVlOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQG5hbWUgc3RyaW5nVG9CeXRlc1xuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY29udmVydCBhIHN0cmluZyB0byBieXRlc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gICAqL1xuICBAQ29yZG92YSh7IHN5bmM6IHRydWUgfSlcbiAgc3RyaW5nVG9CeXRlcyh2YWx1ZTogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIGJ5dGVzVG9TdHJpbmdcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgYnl0ZXMgdG8gYSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gdmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIEBDb3Jkb3ZhKHsgc3luYzogdHJ1ZSB9KVxuICBieXRlc1RvU3RyaW5nKHZhbHVlOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBAQ29yZG92YVByb3BlcnR5KClcbiAgU0NBTl9NT0RFX09QUE9SVFVOSVNUSUM6IG51bWJlcjtcbiAgQENvcmRvdmFQcm9wZXJ0eSgpXG4gIFNDQU5fTU9ERV9MT1dfUE9XRVI6IG51bWJlcjtcbiAgQENvcmRvdmFQcm9wZXJ0eSgpXG4gIFNDQU5fTU9ERV9CQUxBTkNFRDogbnVtYmVyO1xuICBAQ29yZG92YVByb3BlcnR5KClcbiAgU0NBTl9NT0RFX0xPV19MQVRFTkNZOiBudW1iZXI7XG4gIEBDb3Jkb3ZhUHJvcGVydHkoKVxuICBNQVRDSF9NT0RFX0FHR1JFU1NJVkU6IG51bWJlcjtcbiAgQENvcmRvdmFQcm9wZXJ0eSgpXG4gIE1BVENIX01PREVfU1RJQ0tZOiBudW1iZXI7XG4gIEBDb3Jkb3ZhUHJvcGVydHkoKVxuICBNQVRDSF9OVU1fT05FX0FEVkVSVElTRU1FTlQ6IG51bWJlcjtcbiAgQENvcmRvdmFQcm9wZXJ0eSgpXG4gIE1BVENIX05VTV9GRVdfQURWRVJUSVNFTUVOVDogbnVtYmVyO1xuICBAQ29yZG92YVByb3BlcnR5KClcbiAgTUFUQ0hfTlVNX01BWF9BRFZFUlRJU0VNRU5UOiBudW1iZXI7XG4gIEBDb3Jkb3ZhUHJvcGVydHkoKVxuICBDQUxMQkFDS19UWVBFX0FMTF9NQVRDSEVTOiBudW1iZXI7XG4gIEBDb3Jkb3ZhUHJvcGVydHkoKVxuICBDQUxMQkFDS19UWVBFX0ZJUlNUX01BVENIOiBudW1iZXI7XG4gIEBDb3Jkb3ZhUHJvcGVydHkoKVxuICBDQUxMQkFDS19UWVBFX01BVENIX0xPU1Q6IG51bWJlcjtcbn1cbiJdfQ==