@ionic-native/firebase-x
Version:
Ionic Native - Native plugins for ionic apps
90 lines • 50.9 kB
JavaScript
import { __extends } from "tslib";
import { Injectable } from '@angular/core';
import { IonicNativePlugin, cordova } from '@ionic-native/core';
import { Observable } from 'rxjs';
var FirebaseX = /** @class */ (function (_super) {
__extends(FirebaseX, _super);
function FirebaseX() {
return _super !== null && _super.apply(this, arguments) || this;
}
FirebaseX.prototype.getToken = function () { return cordova(this, "getToken", {}, arguments); };
FirebaseX.prototype.getId = function () { return cordova(this, "getId", {}, arguments); };
FirebaseX.prototype.getCurrentUser = function () { return cordova(this, "getCurrentUser", {}, arguments); };
FirebaseX.prototype.reloadCurrentUser = function () { return cordova(this, "reloadCurrentUser", {}, arguments); };
FirebaseX.prototype.onTokenRefresh = function () { return cordova(this, "onTokenRefresh", { "observable": true }, arguments); };
FirebaseX.prototype.getAPNSToken = function () { return cordova(this, "getAPNSToken", {}, arguments); };
FirebaseX.prototype.onApnsTokenReceived = function () { return cordova(this, "onApnsTokenReceived", { "observable": true }, arguments); };
FirebaseX.prototype.onMessageReceived = function () { return cordova(this, "onMessageReceived", { "observable": true }, arguments); };
FirebaseX.prototype.grantPermission = function () { return cordova(this, "grantPermission", { "platforms": ["iOS"] }, arguments); };
FirebaseX.prototype.hasPermission = function () { return cordova(this, "hasPermission", {}, arguments); };
FirebaseX.prototype.unregister = function () { return cordova(this, "unregister", {}, arguments); };
FirebaseX.prototype.setBadgeNumber = function (badgeNumber) { return cordova(this, "setBadgeNumber", {}, arguments); };
FirebaseX.prototype.getBadgeNumber = function () { return cordova(this, "getBadgeNumber", {}, arguments); };
FirebaseX.prototype.clearAllNotifications = function () { return cordova(this, "clearAllNotifications", { "platforms": ["Android"] }, arguments); };
FirebaseX.prototype.subscribe = function (topic) { return cordova(this, "subscribe", {}, arguments); };
FirebaseX.prototype.unsubscribe = function (topic) { return cordova(this, "unsubscribe", {}, arguments); };
FirebaseX.prototype.isAutoInitEnabled = function () { return cordova(this, "isAutoInitEnabled", {}, arguments); };
FirebaseX.prototype.setAutoInitEnabled = function (enabled) { return cordova(this, "setAutoInitEnabled", {}, arguments); };
FirebaseX.prototype.createChannel = function (channelOptions) { return cordova(this, "createChannel", {}, arguments); };
FirebaseX.prototype.setDefaultChannel = function (channelOptions) { return cordova(this, "setDefaultChannel", {}, arguments); };
FirebaseX.prototype.deleteChannel = function (channelID) { return cordova(this, "deleteChannel", {}, arguments); };
FirebaseX.prototype.listChannels = function () { return cordova(this, "listChannels", {}, arguments); };
FirebaseX.prototype.setAnalyticsCollectionEnabled = function (enabled) { return cordova(this, "setAnalyticsCollectionEnabled", {}, arguments); };
FirebaseX.prototype.setCrashlyticsCollectionEnabled = function (enabled) { return cordova(this, "setCrashlyticsCollectionEnabled", {}, arguments); };
FirebaseX.prototype.setPerformanceCollectionEnabled = function (enabled) { return cordova(this, "setPerformanceCollectionEnabled", {}, arguments); };
FirebaseX.prototype.logEvent = function (type, data) { return cordova(this, "logEvent", {}, arguments); };
FirebaseX.prototype.setScreenName = function (name) { return cordova(this, "setScreenName", {}, arguments); };
FirebaseX.prototype.setUserId = function (userId) { return cordova(this, "setUserId", {}, arguments); };
FirebaseX.prototype.setUserProperty = function (name, value) { return cordova(this, "setUserProperty", {}, arguments); };
FirebaseX.prototype.setCrashlyticsUserId = function (userId) { return cordova(this, "setCrashlyticsUserId", {}, arguments); };
FirebaseX.prototype.sendCrash = function () { return cordova(this, "sendCrash", {}, arguments); };
FirebaseX.prototype.logMessage = function (message) { return cordova(this, "logMessage", {}, arguments); };
FirebaseX.prototype.logError = function (error, stackTrace) { return cordova(this, "logError", {}, arguments); };
FirebaseX.prototype.verifyPhoneNumber = function (phoneNumber, timeOutDuration, fakeVerificationCode) { return cordova(this, "verifyPhoneNumber", { "callbackOrder": "reverse" }, arguments); };
FirebaseX.prototype.setLanguageCode = function (lang) { return cordova(this, "setLanguageCode", {}, arguments); };
FirebaseX.prototype.signInWithCredential = function (credential) { return cordova(this, "signInWithCredential", {}, arguments); };
FirebaseX.prototype.createUserWithEmailAndPassword = function (email, password) { return cordova(this, "createUserWithEmailAndPassword", {}, arguments); };
FirebaseX.prototype.signInUserWithEmailAndPassword = function (email, password) { return cordova(this, "signInUserWithEmailAndPassword", {}, arguments); };
FirebaseX.prototype.signInUserWithCustomToken = function (customToken) { return cordova(this, "signInUserWithCustomToken", {}, arguments); };
FirebaseX.prototype.signInUserAnonymously = function () { return cordova(this, "signInUserAnonymously", {}, arguments); };
FirebaseX.prototype.authenticateUserWithGoogle = function (clientId) { return cordova(this, "authenticateUserWithGoogle", {}, arguments); };
FirebaseX.prototype.authenticateUserWithApple = function (locale) { return cordova(this, "authenticateUserWithApple", { "callbackOrder": "reverse" }, arguments); };
FirebaseX.prototype.linkUserWithCredential = function (credential, success, error) { return cordova(this, "linkUserWithCredential", {}, arguments); };
FirebaseX.prototype.reauthenticateWithCredential = function (credential, success, error) { return cordova(this, "reauthenticateWithCredential", {}, arguments); };
FirebaseX.prototype.isUserSignedIn = function () { return cordova(this, "isUserSignedIn", {}, arguments); };
FirebaseX.prototype.signOutUser = function () { return cordova(this, "signOutUser", {}, arguments); };
FirebaseX.prototype.updateUserProfile = function (profile) { return cordova(this, "updateUserProfile", {}, arguments); };
FirebaseX.prototype.updateUserEmail = function (email) { return cordova(this, "updateUserEmail", {}, arguments); };
FirebaseX.prototype.sendUserEmailVerification = function () { return cordova(this, "sendUserEmailVerification", {}, arguments); };
FirebaseX.prototype.updateUserPassword = function (password) { return cordova(this, "updateUserPassword", {}, arguments); };
FirebaseX.prototype.sendUserPasswordResetEmail = function (email) { return cordova(this, "sendUserPasswordResetEmail", {}, arguments); };
FirebaseX.prototype.deleteUser = function () { return cordova(this, "deleteUser", {}, arguments); };
FirebaseX.prototype.registerAuthStateChangeListener = function (fn) { return cordova(this, "registerAuthStateChangeListener", {}, arguments); };
FirebaseX.prototype.fetch = function (cacheExpirationSeconds) { return cordova(this, "fetch", {}, arguments); };
FirebaseX.prototype.activateFetched = function () { return cordova(this, "activateFetched", {}, arguments); };
FirebaseX.prototype.getValue = function (key) { return cordova(this, "getValue", {}, arguments); };
FirebaseX.prototype.getByteArray = function (key) { return cordova(this, "getByteArray", {}, arguments); };
FirebaseX.prototype.getInfo = function () { return cordova(this, "getInfo", {}, arguments); };
FirebaseX.prototype.setConfigSettings = function (settings) { return cordova(this, "setConfigSettings", {}, arguments); };
FirebaseX.prototype.setDefaults = function (settings) { return cordova(this, "setDefaults", {}, arguments); };
FirebaseX.prototype.startTrace = function (name) { return cordova(this, "startTrace", {}, arguments); };
FirebaseX.prototype.incrementCounter = function (name) { return cordova(this, "incrementCounter", {}, arguments); };
FirebaseX.prototype.stopTrace = function (name) { return cordova(this, "stopTrace", {}, arguments); };
FirebaseX.prototype.addDocumentToFirestoreCollection = function (document, collection, success, error) { return cordova(this, "addDocumentToFirestoreCollection", {}, arguments); };
FirebaseX.prototype.setDocumentInFirestoreCollection = function (documentId, document, collection, success, error) { return cordova(this, "setDocumentInFirestoreCollection", {}, arguments); };
FirebaseX.prototype.updateDocumentInFirestoreCollection = function (documentId, document, collection, success, error) { return cordova(this, "updateDocumentInFirestoreCollection", {}, arguments); };
FirebaseX.prototype.deleteDocumentFromFirestoreCollection = function (documentId, collection, success, error) { return cordova(this, "deleteDocumentFromFirestoreCollection", {}, arguments); };
FirebaseX.prototype.fetchDocumentInFirestoreCollection = function (documentId, collection, success, error) { return cordova(this, "fetchDocumentInFirestoreCollection", {}, arguments); };
FirebaseX.prototype.fetchFirestoreCollection = function (collection, success, error) { return cordova(this, "fetchFirestoreCollection", {}, arguments); };
FirebaseX.pluginName = "FirebaseX";
FirebaseX.plugin = "cordova-plugin-firebasex";
FirebaseX.pluginRef = "FirebasePlugin";
FirebaseX.repo = "https://github.com/dpa99c/cordova-plugin-firebasex";
FirebaseX.platforms = ["Android", "iOS"];
FirebaseX.decorators = [
{ type: Injectable }
];
return FirebaseX;
}(IonicNativePlugin));
export { FirebaseX };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvQGlvbmljLW5hdGl2ZS9wbHVnaW5zL2ZpcmViYXNlLXgvbmd4L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sOEJBQXNDLE1BQU0sb0JBQW9CLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7SUF1SkgsNkJBQWlCOzs7O0lBTTlDLDRCQUFRO0lBU1IseUJBQUs7SUFTTCxrQ0FBYztJQVNkLHFDQUFpQjtJQVdqQixrQ0FBYztJQVVkLGdDQUFZO0lBYVosdUNBQW1CO0lBYW5CLHFDQUFpQjtJQVdqQixtQ0FBZTtJQVNmLGlDQUFhO0lBUWIsOEJBQVU7SUFVVixrQ0FBYyxhQUFDLFdBQW1CO0lBU2xDLGtDQUFjO0lBV2QseUNBQXFCO0lBVXJCLDZCQUFTLGFBQUMsS0FBYTtJQVV2QiwrQkFBVyxhQUFDLEtBQWE7SUFRekIscUNBQWlCO0lBU2pCLHNDQUFrQixhQUFDLE9BQWdCO0lBY25DLGlDQUFhLGFBQUMsY0FBK0I7SUFhN0MscUNBQWlCLGFBQUMsY0FBK0I7SUFXakQsaUNBQWEsYUFBQyxTQUFpQjtJQVUvQixnQ0FBWTtJQVVaLGlEQUE2QixhQUFDLE9BQWdCO0lBVTlDLG1EQUErQixhQUFDLE9BQWdCO0lBVWhELG1EQUErQixhQUFDLE9BQWdCO0lBV2hELDRCQUFRLGFBQUMsSUFBWSxFQUFFLElBQVM7SUFVaEMsaUNBQWEsYUFBQyxJQUFZO0lBVTFCLDZCQUFTLGFBQUMsTUFBYztJQVd4QixtQ0FBZSxhQUFDLElBQVksRUFBRSxLQUFhO0lBZTNDLHdDQUFvQixhQUFDLE1BQWM7SUFXbkMsNkJBQVM7SUFXVCw4QkFBVSxhQUFDLE9BQWU7SUFjMUIsNEJBQVEsYUFBQyxLQUFhLEVBQUUsVUFBbUI7SUErQjNDLHFDQUFpQixhQUFDLFdBQW1CLEVBQUUsZUFBdUIsRUFBRSxvQkFBNkI7SUFTN0YsbUNBQWUsYUFBQyxJQUFZO0lBVTVCLHdDQUFvQixhQUFDLFVBQWtCO0lBVXZDLGtEQUE4QixhQUFDLEtBQWEsRUFBRSxRQUFnQjtJQVU5RCxrREFBOEIsYUFBQyxLQUFhLEVBQUUsUUFBZ0I7SUFTOUQsNkNBQXlCLGFBQUMsV0FBbUI7SUFRN0MseUNBQXFCO0lBU3JCLDhDQUEwQixhQUFDLFFBQWdCO0lBVzNDLDZDQUF5QixhQUFDLE1BQWU7SUFZekMsMENBQXNCLGFBQUMsVUFBa0IsRUFBRSxPQUFtQixFQUFFLEtBQTRCO0lBVzVGLGdEQUE0QixhQUFDLFVBQWUsRUFBRSxPQUFtQixFQUFFLEtBQTRCO0lBUS9GLGtDQUFjO0lBUWQsK0JBQVc7SUFTWCxxQ0FBaUIsYUFBQyxPQUEyQztJQVM3RCxtQ0FBZSxhQUFDLEtBQWE7SUFTN0IsNkNBQXlCO0lBU3pCLHNDQUFrQixhQUFDLFFBQWdCO0lBVW5DLDhDQUEwQixhQUFDLEtBQWE7SUFReEMsOEJBQVU7SUFTVixtREFBK0IsYUFBQyxFQUFPO0lBVXZDLHlCQUFLLGFBQUMsc0JBQStCO0lBU3JDLG1DQUFlO0lBVWYsNEJBQVEsYUFBQyxHQUFXO0lBVXBCLGdDQUFZLGFBQUMsR0FBVztJQVN4QiwyQkFBTztJQVVQLHFDQUFpQixhQUFDLFFBQWE7SUFVL0IsK0JBQVcsYUFBQyxRQUFhO0lBVXpCLDhCQUFVLGFBQUMsSUFBWTtJQVl2QixvQ0FBZ0IsYUFBQyxJQUFZO0lBVTdCLDZCQUFTLGFBQUMsSUFBWTtJQVl0QixvREFBZ0MsYUFDOUIsUUFBZ0IsRUFDaEIsVUFBa0IsRUFDbEIsT0FBNkIsRUFDN0IsS0FBNEI7SUFjOUIsb0RBQWdDLGFBQzlCLFVBQWtCLEVBQ2xCLFFBQWdCLEVBQ2hCLFVBQWtCLEVBQ2xCLE9BQW1CLEVBQ25CLEtBQTRCO0lBZ0I5Qix1REFBbUMsYUFDakMsVUFBa0IsRUFDbEIsUUFBZ0IsRUFDaEIsVUFBa0IsRUFDbEIsT0FBbUIsRUFDbkIsS0FBNEI7SUFjOUIseURBQXFDLGFBQ25DLFVBQWtCLEVBQ2xCLFVBQWtCLEVBQ2xCLE9BQW1CLEVBQ25CLEtBQTRCO0lBYzlCLHNEQUFrQyxhQUNoQyxVQUFrQixFQUNsQixVQUFrQixFQUNsQixPQUEyQixFQUMzQixLQUE0QjtJQWE5Qiw0Q0FBd0IsYUFDdEIsVUFBa0IsRUFDbEIsT0FBNEIsRUFDNUIsS0FBNEI7Ozs7Ozs7Z0JBNXZCL0IsVUFBVTs7b0JBeEpYO0VBeUorQixpQkFBaUI7U0FBbkMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBsdWdpbiwgQ29yZG92YSwgSW9uaWNOYXRpdmVQbHVnaW4gfSBmcm9tICdAaW9uaWMtbmF0aXZlL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDaGFubmVsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDaGFubmVsIElEIC0gbXVzdCBiZSB1bmlxdWUgcGVyIGFwcCBwYWNrYWdlXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDaGFubmVsIG5hbWUuIERlZmF1bHQ6IGVtcHR5IHN0cmluZ1xuICAgKi9cbiAgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQ2hhbm5lbCBkZXNjcmlwdGlvbi4gRGVmYXVsdDogZW1wdHkgc3RyaW5nXG4gICAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdW5kIHRvIHBsYXkgb25jZSBhIHB1c2ggY29tZXMuIERlZmF1bHQgdmFsdWU6ICdkZWZhdWx0J1xuICAgKiBWYWx1ZXMgYWxsb3dlZDpcbiAgICogJ2RlZmF1bHQnIC0gcGxheXMgdGhlIGRlZmF1bHQgbm90aWZpY2F0aW9uIHNvdW5kXG4gICAqICdyaW5ndG9uZScgLSBwbGF5cyB0aGUgY3VycmVudGx5IHNldCByaW5ndG9uZVxuICAgKiAnZmFsc2UnIC0gc2lsZW50OyBkb24ndCBwbGF5IGFueSBzb3VuZFxuICAgKiBmaWxlbmFtZSAtIHRoZSBmaWxlbmFtZSBvZiB0aGUgc291bmQgZmlsZSBsb2NhdGVkIGluICcvcmVzL3Jhdycgd2l0aG91dCBmaWxlIGV4dGVuc2lvbiAobXlzb3VuZC5tcDMgLT4gbXlzb3VuZClcbiAgICovXG4gIHNvdW5kPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWaWJyYXRlIG9uIG5ldyBub3RpZmljYXRpb24uIERlZmF1bHQgdmFsdWU6IHRydWVcbiAgICogUG9zc2libGUgdmFsdWVzOlxuICAgKiBCb29sZWFuIC0gdmlicmF0ZSBvciBub3RcbiAgICogQXJyYXkgLSB2aWJyYXRpb24gcGF0dGVybiAtIGUuZy4gWzUwMCwgMjAwLCA1MDBdIC0gbWlsbGlzZWNvbmRzIHZpYnJhdGUsIG1pbGxpc2Vjb25kcyBwYXVzZSwgdmlicmF0ZSwgcGF1c2UsIGV0Yy5cbiAgICovXG4gIHZpYnJhdGlvbj86IGJvb2xlYW4gfCBudW1iZXJbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBibGluayB0aGUgTEVEXG4gICAqL1xuICBsaWdodD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIExFRCBjb2xvciBpbiBBUkdCIGZvcm1hdCAtIHRoaXMgZXhhbXBsZSBCTFVFIGNvbG9yLiBJZiBzZXQgdG8gLTEsIGxpZ2h0IGNvbG9yIHdpbGwgYmUgZGVmYXVsdC4gRGVmYXVsdCB2YWx1ZTogLTEuXG4gICAqL1xuICBsaWdodENvbG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbXBvcnRhbmNlIC0gaW50ZWdlciBmcm9tIDAgdG8gNC4gRGVmYXVsdCB2YWx1ZTogNFxuICAgKiAwIC0gbm9uZSAtIG5vIHNvdW5kLCBkb2VzIG5vdCBzaG93IGluIHRoZSBzaGFkZVxuICAgKiAxIC0gbWluIC0gbm8gc291bmQsIG9ubHkgc2hvd3MgaW4gdGhlIHNoYWRlLCBiZWxvdyB0aGUgZm9sZFxuICAgKiAyIC0gbG93IC0gbm8gc291bmQsIHNob3dzIGluIHRoZSBzaGFkZSwgYW5kIHBvdGVudGlhbGx5IGluIHRoZSBzdGF0dXMgYmFyXG4gICAqIDMgLSBkZWZhdWx0IC0gc2hvd3MgZXZlcnl3aGVyZSwgbWFrZXMgbm9pc2UsIGJ1dCBkb2VzIG5vdCB2aXN1YWxseSBpbnRydWRlXG4gICAqIDQgLSBoaWdoIC0gc2hvd3MgZXZlcnl3aGVyZSwgbWFrZXMgbm9pc2UgYW5kIHBlZWtzXG4gICAqL1xuICBpbXBvcnRhbmNlPzogMCB8IDEgfCAyIHwgMyB8IDQ7XG5cbiAgLyoqXG4gICAqIFNob3cgYmFkZ2Ugb3ZlciBhcHAgaWNvbiB3aGVuIG5vbiBoYW5kbGVkIHB1c2hlcyBhcmUgcHJlc2VudC4gRGVmYXVsdCB2YWx1ZTogdHJ1ZVxuICAgKi9cbiAgYmFkZ2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTaG93IG1lc3NhZ2Ugb24gbG9ja2VkIHNjcmVlbi4gRGVmYXVsdCB2YWx1ZTogMVxuICAgKiBQb3NzaWJsZSB2YWx1ZXMgKGRlZmF1bHQgMSk6XG4gICAqIC0xIC0gc2VjcmV0IC0gRG8gbm90IHJldmVhbCBhbnkgcGFydCBvZiB0aGUgbm90aWZpY2F0aW9uIG9uIGEgc2VjdXJlIGxvY2tzY3JlZW4uXG4gICAqIDAgLSBwcml2YXRlIC0gU2hvdyB0aGUgbm90aWZpY2F0aW9uIG9uIGFsbCBsb2Nrc2NyZWVucywgYnV0IGNvbmNlYWwgc2Vuc2l0aXZlIG9yIHByaXZhdGUgaW5mb3JtYXRpb24gb24gc2VjdXJlIGxvY2tzY3JlZW5zLlxuICAgKiAxIC0gcHVibGljIC0gU2hvdyB0aGUgbm90aWZpY2F0aW9uIGluIGl0cyBlbnRpcmV0eSBvbiBhbGwgbG9ja3NjcmVlbnMuXG4gICAqL1xuICB2aXNpYmlsaXR5PzogLTEgfCAwIHwgMTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaXJlYmFzZVVzZXIge1xuICAvKipcbiAgICogSUQgdG9rZW5cbiAgICovXG4gIGlkVG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVyIElEXG4gICAqL1xuICBwcm92aWRlcklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVSURcbiAgICovXG4gIHVpZD86IHN0cmluZztcblxuICAvKipcbiAgICogcGhvdG8gdXJsXG4gICAqL1xuICBwaG90b1VybD86IHN0cmluZztcblxuICAvKipcbiAgICogcGhvbmUgbnVtYmVyXG4gICAqL1xuICBwaG9uZU51bWJlcj86IHN0cmluZztcblxuICAvKipcbiAgICogaXMgZW1haWwgdmVyaWZpZWRcbiAgICovXG4gIGVtYWlsSXNWZXJpZmllZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGVtYWlsXG4gICAqL1xuICBlbWFpbD86IHN0cmluZztcblxuICAvKipcbiAgICogbmFtZVxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBAbmFtZSBGaXJlYmFzZSBYXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoaXMgcGx1Z2luIGJyaW5ncyBwdXNoIG5vdGlmaWNhdGlvbnMsIGFuYWx5dGljcywgZXZlbnQgdHJhY2tpbmcsIGNyYXNoIHJlcG9ydGluZyBhbmQgbW9yZSBmcm9tIEdvb2dsZSBGaXJlYmFzZSB0byB5b3VyIENvcmRvdmEgcHJvamVjdCEgQW5kcm9pZCBhbmQgaU9TIHN1cHBvcnRlZC5cbiAqIEl0IGlzIGEgbWFpbnRhaW5lZCBmb3JrIGZyb20gdW5tYWludGFpbmVkIGlvbmljLW5hdml0ZSBwbHVnaW4gY2FsbGVkIEZpcmViYXNlLlxuICpcbiAqIEB1c2FnZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRmlyZWJhc2VYIH0gZnJvbSAnQGlvbmljLW5hdGl2ZS9maXJlYmFzZS14L25neCc7XG4gKlxuICpcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgZmlyZWJhc2VYOiBGaXJlYmFzZVgpIHsgfVxuICpcbiAqIC4uLlxuICpcbiAqXG4gKiB0aGlzLmZpcmViYXNlWC5nZXRUb2tlbigpXG4gKiAgIC50aGVuKHRva2VuID0+IGNvbnNvbGUubG9nKGBUaGUgdG9rZW4gaXMgJHt0b2tlbn1gKSkgLy8gc2F2ZSB0aGUgdG9rZW4gc2VydmVyLXNpZGUgYW5kIHVzZSBpdCB0byBwdXNoIG5vdGlmaWNhdGlvbnMgdG8gdGhpcyBkZXZpY2VcbiAqICAgLmNhdGNoKGVycm9yID0+IGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGdldHRpbmcgdG9rZW4nLCBlcnJvcikpO1xuICpcbiAqIHRoaXMuZmlyZWJhc2VYLm9uTWVzc2FnZVJlY2VpdmVkKClcbiAqICAgLnN1YnNjcmliZShkYXRhID0+IGNvbnNvbGUubG9nKGBVc2VyIG9wZW5lZCBhIG5vdGlmaWNhdGlvbiAke2RhdGF9YCkpO1xuICpcbiAqIHRoaXMuZmlyZWJhc2VYLm9uVG9rZW5SZWZyZXNoKClcbiAqICAgLnN1YnNjcmliZSgodG9rZW46IHN0cmluZykgPT4gY29uc29sZS5sb2coYEdvdCBhIG5ldyB0b2tlbiAke3Rva2VufWApKTtcbiAqIGBgYFxuICogQGludGVyZmFjZXNcbiAqIElDaGFubmVsT3B0aW9uc1xuICpcbiAqL1xuQFBsdWdpbih7XG4gIHBsdWdpbk5hbWU6ICdGaXJlYmFzZVgnLFxuICBwbHVnaW46ICdjb3Jkb3ZhLXBsdWdpbi1maXJlYmFzZXgnLFxuICBwbHVnaW5SZWY6ICdGaXJlYmFzZVBsdWdpbicsXG4gIHJlcG86ICdodHRwczovL2dpdGh1Yi5jb20vZHBhOTljL2NvcmRvdmEtcGx1Z2luLWZpcmViYXNleCcsXG4gIHBsYXRmb3JtczogWydBbmRyb2lkJywgJ2lPUyddLFxufSlcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBGaXJlYmFzZVggZXh0ZW5kcyBJb25pY05hdGl2ZVBsdWdpbiB7XG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgRkNNIHRva2VuLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPG51bGwgfCBzdHJpbmc+fSBOb3RlIHRoYXQgdG9rZW4gd2lsbCBiZSBudWxsIGlmIGl0IGhhcyBub3QgYmVlbiBlc3RhYmxpc2hlZCB5ZXRcbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgZ2V0VG9rZW4oKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXBwIGluc3RhbmNlIElEIChhbiBjb25zdGFudCBJRCB3aGljaCBwZXJzaXN0cyBhcyBsb25nIGFzIHRoZSBhcHAgaXMgbm90IHVuaW5zdGFsbGVkL3JlaW5zdGFsbGVkKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPG51bGwgfCBzdHJpbmc+fSBOb3RlIHRoYXQgSUQgd2lsbCBiZSBudWxsIGlmIGl0IGhhcyBub3QgYmVlbiBlc3RhYmxpc2hlZCB5ZXRcbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgZ2V0SWQoKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBGQ00gdXNlci5cbiAgICogQHJldHVybiB7UHJvbWlzZTxGaXJlYmFzZVVzZXIgfCBzdHJpbmc+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBnZXRDdXJyZW50VXNlcigpOiBQcm9taXNlPEZpcmViYXNlVXNlciB8IHN0cmluZz4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxvYWQgdGhlIGN1cnJlbnQgRkNNIHVzZXIuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RmlyZWJhc2VVc2VyIHwgc3RyaW5nPn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgcmVsb2FkQ3VycmVudFVzZXIoKTogUHJvbWlzZTxGaXJlYmFzZVVzZXIgfCBzdHJpbmc+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IG5vdGlmaWVkIHdoZW4gYSB0b2tlbiBpcyByZWZyZXNoZWQuXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvYnNlcnZhYmxlOiB0cnVlLFxuICB9KVxuICBvblRva2VuUmVmcmVzaCgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBpT1Mgb25seS5cbiAgICogR2V0IHRoZSBBUE5TIHRva2VuIGFsbG9jYXRlZCBmb3IgdGhpcyBhcHAgaW5zdGFsbC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxudWxsIHwgc3RyaW5nPn0gTm90ZSB0aGF0IHRva2VuIHdpbGwgYmUgbnVsbCBpZiBpdCBoYXMgbm90IGJlZW4gZXN0YWJsaXNoZWQgeWV0XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGdldEFQTlNUb2tlbigpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogaU9TIG9ubHkuXG4gICAqIFJlZ2lzdGVycyBhIGhhbmRsZXIgdG8gY2FsbCB3aGVuIHRoZSBBUE5TIHRva2VuIGlzIGFsbG9jYXRlZC5cbiAgICogVGhpcyB3aWxsIGJlIGNhbGxlZCBvbmNlIHdoZW4gcmVtb3RlIG5vdGlmaWNhdGlvbnMgcGVybWlzc2lvbiBoYXMgYmVlbiBncmFudGVkIGJ5IHRoZSB1c2VyIGF0IHJ1bnRpbWUuXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvYnNlcnZhYmxlOiB0cnVlLFxuICB9KVxuICBvbkFwbnNUb2tlblJlY2VpdmVkKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGludm9rZSB3aGVuOlxuICAgKiAtIGEgbm90aWZpY2F0aW9uIG9yIGRhdGEgbWVzc2FnZSBpcyByZWNlaXZlZCBieSB0aGUgYXBwXG4gICAqIC0gYSBzeXN0ZW0gbm90aWZpY2F0aW9uIGlzIHRhcHBlZCBieSB0aGUgdXNlclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb2JzZXJ2YWJsZTogdHJ1ZSxcbiAgfSlcbiAgb25NZXNzYWdlUmVjZWl2ZWQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcGVybWlzc2lvbiB0byByZWNlaXZlIHB1c2ggbm90aWZpY2F0aW9ucyAod2lsbCB0cmlnZ2VyIHByb21wdCkgYW5kIHJldHVybiBoYXNQZXJtaXNzaW9uOiB0cnVlLiBpT1Mgb25seSAoQW5kcm9pZCB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZSkuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBwbGF0Zm9ybXM6IFsnaU9TJ10sXG4gIH0pXG4gIGdyYW50UGVybWlzc2lvbigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBwZXJtaXNzaW9uIHRvIHJlY2VpdmUgcHVzaCBub3RpZmljYXRpb25zIGFuZCByZXR1cm4gaGFzUGVybWlzc2lvbjogdHJ1ZS4gaU9TIG9ubHkgKEFuZHJvaWQgd2lsbCBhbHdheXMgcmV0dXJuIHRydWUpLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBoYXNQZXJtaXNzaW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVyIGZyb20gZmlyZWJhc2UsIHVzZWQgdG8gc3RvcCByZWNlaXZpbmcgcHVzaCBub3RpZmljYXRpb25zLiBDYWxsIHRoaXMgd2hlbiB5b3UgbG9nb3V0IHVzZXIgZnJvbSB5b3VyIGFwcC5cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgdW5yZWdpc3RlcigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBudW1iZXIgb24gdGhlIGljb24gYmFkZ2UuIFNldCAwIHRvIGNsZWFyIHRoZSBiYWRnZVxuICAgKiBAcGFyYW0ge251bWJlcn0gYmFkZ2VOdW1iZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzZXRCYWRnZU51bWJlcihiYWRnZU51bWJlcjogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IGljb24gYmFkZ2UgbnVtYmVyLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGdldEJhZGdlTnVtYmVyKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBwZW5kaW5nIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgZHJhd2VyLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSxcbiAgfSlcbiAgY2xlYXJBbGxOb3RpZmljYXRpb25zKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBhIHRvcGljLiBUb3BpYyBtZXNzYWdpbmcgYWxsb3dzIHlvdSB0byBzZW5kIGEgbWVzc2FnZSB0byBtdWx0aXBsZSBkZXZpY2VzIHRoYXQgaGF2ZSBvcHRlZCBpbiB0byBhIHBhcnRpY3VsYXIgdG9waWMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHN1YnNjcmliZSh0b3BpYzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmUgZnJvbSBhIHRvcGljLiBUaGlzIHdpbGwgc3RvcCB5b3UgcmVjZWl2aW5nIG1lc3NhZ2VzIGZvciB0aGF0IHRvcGljLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9waWNcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICB1bnN1YnNjcmliZSh0b3BpYzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYXV0b2luaXQgaXMgY3VycmVudGx5IGVuYWJsZWQuIElmIHNvLCBuZXcgRkNNIHRva2VucyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLlxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBpc0F1dG9Jbml0RW5hYmxlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRvIGF1dG9pbml0IG5ldyBGQ00gdG9rZW5zLiBCeSBkZWZhdWx0LCBhIG5ldyB0b2tlbiB3aWxsIGJlIGdlbmVyYXRlZCBhcyBzb29uIGFzIHRoZSBvbGQgb25lIGlzIHJlbW92ZWQuXG4gICAqIFRvIHByZXZlbnQgYSBuZXcgdG9rZW4gYmVpbmcgZ2VuZXJhdGVkLCBieSBzdXJlIHRvIGRpc2FibGUgYXV0b2luaXQgdXNpbmcgc2V0QXV0b0luaXRFbmFibGVkKCkgYmVmb3JlIGNhbGxpbmcgdW5yZWdpc3RlcigpLlxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzZXRBdXRvSW5pdEVuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuZHJvaWQgOCsgb25seS4gQ3JlYXRlcyBhIGN1c3RvbSBjaGFubmVsIHRvIGJlIHVzZWQgYnkgbm90aWZpY2F0aW9uIG1lc3NhZ2VzIHdoaWNoIGhhdmUgdGhlIGNoYW5uZWwgcHJvcGVydHkgc2V0IGluIHRoZSBtZXNzYWdlIHBheWxvYWQgdG8gdGhlIGlkIG9mIHRoZSBjcmVhdGVkIGNoYW5uZWw6XG4gICAqIC0gZm9yIGJhY2tncm91bmQgKHN5c3RlbSkgbm90aWZpY2F0aW9uczogYW5kcm9pZC5ub3RpZmljYXRpb24uY2hhbm5lbF9pZFxuICAgKiAtIGZvciBmb3JlZ3JvdW5kL2RhdGEgbm90aWZpY2F0aW9uczogZGF0YS5ub3RpZmljYXRpb25fYW5kcm9pZF9jaGFubmVsX2lkXG4gICAqXG4gICAqIENhbGxpbmcgb24gQW5kcm9pZCA3IG9yIGJlbG93IG9yIGFub3RoZXIgcGxhdGZvcm0gd2lsbCBoYXZlIG5vIGVmZmVjdC5cbiAgICogQHBhcmFtIHtJQ2hhbm5lbE9wdGlvbnN9IGNoYW5uZWxPcHRpb25zXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgY3JlYXRlQ2hhbm5lbChjaGFubmVsT3B0aW9uczogSUNoYW5uZWxPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQW5kcm9pZCA4KyBvbmx5LiBPdmVycmlkZXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBkZWZhdWx0IGNoYW5uZWwuXG4gICAqIFRoZSBkZWZhdWx0IGNoYW5uZWwgaXMgdXNlZCBpZiBubyBvdGhlciBjaGFubmVsIGV4aXN0cyBvciBpcyBzcGVjaWZpZWQgaW4gdGhlIG5vdGlmaWNhdGlvbi5cbiAgICogQW55IG9wdGlvbnMgbm90IHNwZWNpZmllZCB3aWxsIG5vdCBiZSBvdmVycmlkZGVuLiBTaG91bGQgYmUgY2FsbGVkIGFzIHNvb24gYXMgcG9zc2libGUgKG9uIGFwcCBzdGFydCkgc28gZGVmYXVsdCBub3RpZmljYXRpb25zIHdpbGwgd29yayBhcyBleHBlY3RlZC5cbiAgICogQ2FsbGluZyBvbiBBbmRyb2lkIDcgb3IgYmVsb3cgb3IgYW5vdGhlciBwbGF0Zm9ybSB3aWxsIGhhdmUgbm8gZWZmZWN0LlxuICAgKiBAcGFyYW0ge0lDaGFubmVsT3B0aW9uc30gY2hhbm5lbE9wdGlvbnNcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzZXREZWZhdWx0Q2hhbm5lbChjaGFubmVsT3B0aW9uczogSUNoYW5uZWxPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQW5kcm9pZCA4KyBvbmx5LiBSZW1vdmVzIGEgcHJldmlvdXNseSBkZWZpbmVkIGNoYW5uZWwuXG4gICAqIENhbGxpbmcgb24gQW5kcm9pZCA3IG9yIGJlbG93IG9yIGFub3RoZXIgcGxhdGZvcm0gd2lsbCBoYXZlIG5vIGVmZmVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWxJRFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGRlbGV0ZUNoYW5uZWwoY2hhbm5lbElEOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmRyb2lkIDgrIG9ubHkuIEdldHMgYSBsaXN0IG9mIGFsbCBjaGFubmVscy5cbiAgICogQ2FsbGluZyBvbiBBbmRyb2lkIDcgb3IgYmVsb3cgb3IgYW5vdGhlciBwbGF0Zm9ybSB3aWxsIGhhdmUgbm8gZWZmZWN0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGxpc3RDaGFubmVscygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUvZGlzYWJsZSBhbmFseXRpY3MgY29sbGVjdGlvbiAodXNlZnVsIGZvciBHRFBSL3ByaXZhY3kgc2V0dGluZ3MpLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2V0QW5hbHl0aWNzQ29sbGVjdGlvbkVuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZS9kaXNhYmxlIENyYXNobHl0aWNzIGNvbGxlY3Rpb24uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzZXRDcmFzaGx5dGljc0NvbGxlY3Rpb25FbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUvZGlzYWJsZSBwZXJmb3JtYW5jZSBjb2xsZWN0aW9uLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2V0UGVyZm9ybWFuY2VDb2xsZWN0aW9uRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogTG9nIGFuIGV2ZW50IHVzaW5nIEFuYWx5dGljc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGxvZ0V2ZW50KHR5cGU6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHNjcmVlbiBpbiBBbmFseXRpY3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgU2NyZWVuIG5hbWVcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzZXRTY3JlZW5OYW1lKG5hbWU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHVzZXIgaWQgZm9yIHVzZSBpbiBBbmFseXRpY3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHNldFVzZXJJZCh1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHVzZXIgcHJvcGVydHkgZm9yIHVzZSBpbiBBbmFseXRpY3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2V0VXNlclByb3BlcnR5KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBDcmFzaGx5dGljcyB1c2VyIGlkZW50aWZpZXIuXG4gICAqIFRvIGRpYWdub3NlIGFuIGlzc3VlLCBpdOKAmXMgb2Z0ZW4gaGVscGZ1bCB0byBrbm93IHdoaWNoIG9mIHlvdXIgdXNlcnMgZXhwZXJpZW5jZWQgYSBnaXZlbiBjcmFzaC5cbiAgICogQ3Jhc2hseXRpY3MgaW5jbHVkZXMgYSB3YXkgdG8gYW5vbnltb3VzbHkgaWRlbnRpZnkgdXNlcnMgaW4geW91ciBjcmFzaCByZXBvcnRzLlxuICAgKiBUbyBhZGQgdXNlciBJRHMgdG8geW91ciByZXBvcnRzLCBhc3NpZ24gZWFjaCB1c2VyIGEgdW5pcXVlIGlkZW50aWZpZXIgaW4gdGhlIGZvcm0gb2YgYW4gSUQgbnVtYmVyLCB0b2tlbiwgb3IgaGFzaGVkIHZhbHVlLlxuICAgKlxuICAgKiBNb3JlIGluZm8gaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvY3Jhc2hseXRpY3MvY3VzdG9taXplLWNyYXNoLXJlcG9ydHM/YXV0aHVzZXI9MCNzZXRfdXNlcl9pZHNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzZXRDcmFzaGx5dGljc1VzZXJJZCh1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXVsYXRlcyAoY2F1c2VzKSBhIGZhdGFsIG5hdGl2ZSBjcmFzaCB3aGljaCBjYXVzZXMgYSBjcmFzaCBldmVudCB0byBiZSBzZW50IHRvIENyYXNobHl0aWNzICh1c2VmdWwgZm9yIHRlc3RpbmcpLlxuICAgKiBTZWUgdGhlIEZpcmViYXNlIGRvY3VtZW50YXRpb24gcmVnYXJkaW5nIGNyYXNoIHRlc3RpbmcuXG4gICAqIENyYXNoZXMgd2lsbCBhcHBlYXIgdW5kZXIgRXZlbnQgdHlwZSA9IFwiQ3Jhc2hlc1wiIGluIHRoZSBDcmFzaGx5dGljcyBjb25zb2xlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHNlbmRDcmFzaCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNyYXNoLXJlbGF0ZWQgbG9nIG1lc3NhZ2UgdGhhdCB3aWxsIGFwcGVhciBpbiB0aGUgTG9ncyBzZWN0aW9uIG9mIHRoZSBuZXh0IG5hdGl2ZSBjcmFzaCBldmVudC5cbiAgICogTm90ZTogaWYgeW91IGRvbid0IHRoZW4gY3Jhc2gsIHRoZSBtZXNzYWdlIHdvbid0IGJlIHNlbnQhIEFsc28gbG9ncyB0aGUgbWVzc2FnZSB0byB0aGUgbmF0aXZlIGRldmljZSBjb25zb2xlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGxvZ01lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBub24tZmF0YWwgZXJyb3IgZXZlbnQgdG8gQ3Jhc2hseXRpY3MuIEluIGEgQ29yZG92YSBhcHAsIHlvdSBtYXkgdXNlIHRoaXMgdG8gbG9nIHVuaGFuZGxlZCBKYXZhc2NyaXB0IGV4Y2VwdGlvbnMsIGZvciBleGFtcGxlLlxuICAgKiBUaGUgZXZlbnQgd2lsbCBhcHBlYXIgdW5kZXIgRXZlbnQgdHlwZSA9IFwiTm9uLWZhdGFsc1wiIGluIHRoZSBDcmFzaGx5dGljcyBjb25zb2xlLlxuICAgKiBUaGUgZXJyb3IgbWVzc2FnZSB3aWxsIGFwcGVhciBpbiB0aGUgTG9ncyBzZWN0aW9uIG9mIHRoZSBub24tZmF0YWwgZXJyb3IgZXZlbnQuXG4gICAqIEFsc28gbG9ncyB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aGUgbmF0aXZlIGRldmljZSBjb25zb2xlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JcbiAgICogQHBhcmFtIHtvYmplY3R9IChvcHRpb25hbCkgYSBzdGFjayB0cmFjZSBnZW5lcmF0ZWQgYnkgc3RhY2t0cmFjZS5qc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGxvZ0Vycm9yKGVycm9yOiBzdHJpbmcsIHN0YWNrVHJhY2U/OiBvYmplY3QpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyB2ZXJpZmljYXRpb24gb2YgYSBwaG9uZSBudW1iZXIgaW4gb3JkZXIgdG8gYXV0aGVudGljYXRlIGEgdXNlciBhbmQgc2lnbiB0aGVuIGludG8gRmlyZWJhc2UgaW4geW91ciBhcHAuXG4gICAqXG4gICAqIE5PVEU6IFRoaXMgd2lsbCBvbmx5IHdvcmsgb24gcGh5c2ljYWwgZGV2aWNlcyB3aXRoIGEgU0lNIGNhcmQgKG5vdCBpT1MgU2ltdWxhdG9yIG9yIEFuZHJvaWQgRW11bGF0b3IpXG4gICAqXG4gICAqIEluIHJlc3BvbnNlIHRvIHlvdXIgcmVxdWVzdCwgeW91J2xsIHJlY2VpdmUgYSB2ZXJpZmljYXRpb24gSUQgd2hpY2ggeW91IGNhbiB1c2UgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgdmVyaWZpY2F0aW9uIGNvZGVcbiAgICogdG8gc2lnbiB0aGUgdXNlciBpbi5cbiAgICpcbiAgICogT24gaU9TIGFuZCBzb21lIEFuZHJvaWQgZGV2aWNlcywgdGhlIHVzZXIgd2lsbCByZWNlaXZlIGFuZCBTTVMgY29udGFpbmluZyB0aGUgdmVyaWZpY2F0aW9uIGNvZGUgd2hpY2ggdGhleSBtdXN0IG1hbnVhbGx5IGVudGVyXG4gICAqIGludG8geW91ciBhcHAuXG4gICAqXG4gICAqIFNvbWUgQW5kcm9pZCBkZXZpY2VzIHN1cHBvcnQgXCJpbnN0YW50IHZlcmZpY2F0aW9uXCIsIGluIHdoaWNoIGNhc2UgYW4gU01TIHdpbGwgbm90IGJlIHNlbmQgYW5kIHlvdSB3aWxsIGJlIHJldHVybmVkXG4gICAqIHRoZSB2ZXJpZmljYXRpb24gY29kZSBhbG9uZyB3aXRoIHRoZSB2ZXJpZmljYXRpb24gSUQuIEluIHRoaXMgY2FzZSwgdGhlIHVzZXIgZG9lc24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGluIG9yZGVyIGZvciB5b3VcbiAgICogdG8gc2lnbiB0aGVtIGluLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGhvbmVOdW1iZXIgLSBwaG9uZSBudW1iZXIgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZU91dER1cmF0aW9uIC0gdGltZSB0byB3YWl0IGluIHNlY29uZHMgYmVmb3JlIHRpbWluZyBvdXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZha2VWZXJpZmljYXRpb25Db2RlIC0gKG9wdGlvbmFsKSB0byB0ZXN0IGluc3RhbnQgdmVyaWZpY2F0aW9uIG9uIEFuZHJvaWQgLHNwZWNpZnkgYSBmYWtlIHZlcmlmaWNhdGlvbiBjb2RlIHRvIHJldHVybiBmb3Igd2hpdGVsaXN0ZWQgcGhvbmUgbnVtYmVycy5cbiAgICpcbiAgICogVGhlIHN1Y2Nlc3MgY2FsbGJhY2sgd2lsbCBiZSBwYXNzZWQgYSBjcmVkZW50aWFsIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICogICBpbnN0YW50VmVyaWZpY2F0aW9uIHtib29sZWFufSAtIHRydWUgaWYgdGhlIEFuZHJvaWQgZGV2aWNlIHN1cHBvcnRzIGluc3RhbnQgdmVyaWZpY2F0aW9uLCBpbiB3aGljaCBjYXNlIHRoZSB2ZXJpZmljYXRpb24gY29kZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBjcmVkZW50aWFsIG9iamVjdC4gSWYgdGhpcyBpcyBmYWxzZSwgdGhlIGRldmljZSB3aWxsIGJlIHNlbnQgYW4gU01TIGNvbnRhaW5pbmcgdGhlIHZlcmlmaWNhdGlvbiBjb2RlIGZvciB0aGUgdXNlciB0byBtYW51YWxseSBlbnRlciBpbnRvIHlvdXIgYXBwLiBBbHdheXMgZmFsc2Ugb24gaU9TLlxuICAgKiAgIHZlcmlmaWNhdGlvbklkIHtzdHJpbmd9IC0gdGhlIHZlcmlmaWNhdGlvbiBJRCB5b3UnbGwgbmVlZCB0byBwYXNzIGFsb25nIHdpdGggdGhlIHZlcmlmaWNhdGlvbiBjb2RlIHRvIHNpZ24gdGhlIHVzZXIgaW4uIEFsd2F5cyByZXR1cm5lZCBvbiBib3RoIEFuZHJvaWQgJiBpT1MuXG4gICAqICAgY29kZSB7c3RyaW5nfSAtIHZlcmlmaWNhdGlvbiBjb2RlLiBXaWxsIG9ubHkgYmUgcHJlc2VudCBpZiBpbnN0YW50VmVyaWZpY2F0aW9uIGlzIHRydWUuIEFsd2F5cyB1bmRlZmluZWQgb24gaU9TLlxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyxcbiAgfSlcbiAgdmVyaWZ5UGhvbmVOdW1iZXIocGhvbmVOdW1iZXI6IHN0cmluZywgdGltZU91dER1cmF0aW9uOiBudW1iZXIsIGZha2VWZXJpZmljYXRpb25Db2RlPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoIGN1cnJlbnQgYXV0aGVudGlmaWNhdGlvbiBzeXN0ZW0gbGFuZ3VhZ2UsIGZvciBleGFtcGxlLCB0aGUgcGhvbmUgc21zIGNvZGUuXG4gICAqIEBwYXJhbSBsYW5nIC0gbGFuZ3VhZ2UgdG8gY2hhbmdlLCBleDogJ2ZyJyBmb3IgZnJlbmNoXG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHNldExhbmd1YWdlQ29kZShsYW5nOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgdXNlciBpbnRvIEZpcmViYXNlIHdpdGggY3JlZGVudGlhbHMgb2J0YWluZWQgdXNpbmcgdmVyaWZ5UGhvbmVOdW1iZXIoKS5cbiAgICogU2VlIHRoZSBBbmRyb2lkLSBhbmQgaU9TLXNwZWNpZmljIEZpcmViYXNlIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mby5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNyZWRlbnRpYWwgLSBhIGNyZWRlbnRpYWwgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBzdWNjZXNzIGNhbGxiYWNrIG9mIGFuIGF1dGhlbnRpY2F0aW9uIG1ldGhvZFxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzaWduSW5XaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsOiBvYmplY3QpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGVtYWlsL3Bhc3N3b3JkLWJhc2VkIHVzZXIgYWNjb3VudC4gSWYgYWNjb3VudCBjcmVhdGlvbiBpcyBzdWNjZXNzZnVsLCB1c2VyIHdpbGwgYmUgYXV0b21hdGljYWxseSBzaWduZWQgaW4uXG4gICAqIEBwYXJhbSBlbWFpbFxuICAgKiBAcGFyYW0gcGFzc3dvcmRcbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgY3JlYXRlVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkKGVtYWlsOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBpbiB0byBhbiBlbWFpbC9wYXNzd29yZC1iYXNlZCB1c2VyIGFjY291bnQuXG4gICAqIEBwYXJhbSBlbWFpbFxuICAgKiBAcGFyYW0gcGFzc3dvcmRcbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2lnbkluVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkKGVtYWlsOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBpbiB1c2VyIHdpdGggY3VzdG9tIHRva2VuLlxuICAgKiBAcGFyYW0gY3VzdG9tVG9rZW5cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2lnbkluVXNlcldpdGhDdXN0b21Ub2tlbihjdXN0b21Ub2tlbjogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgaW4gdXNlciBhbm9ueW1vdXNseS5cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2lnbkluVXNlckFub255bW91c2x5KCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0ZXMgdGhlIHVzZXIgd2l0aCBhIEdvb2dsZSBhY2NvdW50IHRvIG9idGFpbiBhIGNyZWRlbnRpYWwgdGhhdCBjYW4gYmUgdXNlZCB0byBzaWduIHRoZSB1c2VyIGluL2xpbmsgdG8gYW4gZXhpc3RpbmcgdXNlciBhY2NvdW50L3JlYXV0aGVudGljYXRlIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gY2xpZW50SWRcbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgYXV0aGVudGljYXRlVXNlcldpdGhHb29nbGUoY2xpZW50SWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0ZXMgdGhlIHVzZXIgd2l0aCBhbiBBcHBsZSBhY2NvdW50IHVzaW5nIFNpZ24gSW4gd2l0aCBBcHBsZSB0byBvYnRhaW4gYSBjcmVkZW50aWFsIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2lnbiB0aGUgdXNlciBpbi9saW5rIHRvIGFuIGV4aXN0aW5nIHVzZXIgYWNjb3VudC9yZWF1dGhlbnRpY2F0ZSB0aGUgdXNlci5cbiAgICogQHBhcmFtIGxvY2FsZVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyxcbiAgfSlcbiAgYXV0aGVudGljYXRlVXNlcldpdGhBcHBsZShsb2NhbGU/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5rcyB0aGUgdXNlciBhY2NvdW50IHRvIGFuIGV4aXN0aW5nIEZpcmViYXNlIHVzZXIgYWNjb3VudCB3aXRoIGNyZWRlbnRpYWxzIG9idGFpbmVkIHVzaW5nIHZlcmlmeVBob25lTnVtYmVyKCkuXG4gICAqIFNlZSB0aGUgQW5kcm9pZC0gYW5kIGlPUy1zcGVjaWZpYyBGaXJlYmFzZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjcmVkZW50aWFsIC0gYSBjcmVkZW50aWFsIG9iamVjdCByZXR1cm5lZCBieSB0aGUgc3VjY2VzcyBjYWxsYmFjayBvZiBhbiBhdXRoZW50aWNhdGlvbiBtZXRob2RcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgb24gc3VjY2Vzc2Z1bCBzaWduLWluIHVzaW5nIGNyZWRlbnRpYWxzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGVycm9yIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBwYXNzZWQgYSB7c3RyaW5nfSBlcnJvciBtZXNzYWdlIGFzIGFuIGFyZ3VtZW50XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGxpbmtVc2VyV2l0aENyZWRlbnRpYWwoY3JlZGVudGlhbDogb2JqZWN0LCBzdWNjZXNzOiAoKSA9PiB2b2lkLCBlcnJvcjogKGVycjogc3RyaW5nKSA9PiB2b2lkKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVhdXRoZW50aWNhdGVzIHRoZSBjdXJyZW50bHkgc2lnbmVkIGluIHVzZXIgd2l0aCBjcmVkZW50aWFscyBvYnRhaW5lZCB2aWEgYW4gYXV0aGVudGljYXRpb24gbWV0aG9kIHN1Y2ggYXMgdmVyaWZ5UGhvbmVOdW1iZXIoKSBvciBhdXRoZW50aWNhdGVVc2VyV2l0aEdvb2dsZSgpLlxuICAgKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbCAtIGEgY3JlZGVudGlhbCBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIHN1Y2Nlc3MgY2FsbGJhY2sgb2YgYW4gYXV0aGVudGljYXRpb24gbWV0aG9kXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIG9uIHN1Y2Nlc3NmdWwgc2lnbi1pbiB1c2luZyBjcmVkZW50aWFsc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlcnJvciAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgcGFzc2VkIGEge3N0cmluZ30gZXJyb3IgbWVzc2FnZSBhcyBhbiBhcmd1bWVudFxuICAgKi9cbiAgQENvcmRvdmEoKVxuICByZWF1dGhlbnRpY2F0ZVdpdGhDcmVkZW50aWFsKGNyZWRlbnRpYWw6IGFueSwgc3VjY2VzczogKCkgPT4gdm9pZCwgZXJyb3I6IChlcnI6IHN0cmluZykgPT4gdm9pZCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhIGN1cnJlbnQgRmlyZWJhc2UgdXNlciBzaWduZWQgaW50byB0aGUgYXBwLlxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBpc1VzZXJTaWduZWRJbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgY3VycmVudCBGaXJlYmFzZSB1c2VyIG91dCBvZiB0aGUgYXBwLlxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzaWduT3V0VXNlcigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBkaXNwbGF5IG5hbWUgYW5kL29yIHBob3RvIFVSTCBvZiB0aGUgY3VycmVudCBGaXJlYmFzZSB1c2VyIHNpZ25lZCBpbnRvIHRoZSBhcHAuXG4gICAqIEBwYXJhbSBwcm9maWxlXG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHVwZGF0ZVVzZXJQcm9maWxlKHByb2ZpbGU6IHsgbmFtZTogc3RyaW5nOyBwaG90b1VyaTogc3RyaW5nIH0pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzL3NldHMgdGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgRmlyZWJhc2UgdXNlciBzaWduZWQgaW50byB0aGUgYXBwLlxuICAgKiBAcGFyYW0gZW1haWxcbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgdXBkYXRlVXNlckVtYWlsKGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIHZlcmlmaWNhdGlvbiBlbWFpbCB0byB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgZW1haWwgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBGaXJlYmFzZSB1c2VyIHNpZ25lZCBpbnRvIHRoZSBhcHAuXG4gICAqIFdoZW4gdGhlIHVzZXIgb3BlbnMgdGhlIGNvbnRhaW5lZCBsaW5rLCB0aGVpciBlbWFpbCBhZGRyZXNzIHdpbGwgaGF2ZSBiZWVuIHZlcmlmaWVkLlxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzZW5kVXNlckVtYWlsVmVyaWZpY2F0aW9uKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMvc2V0cyB0aGUgYWNjb3VudCBwYXNzd29yZCBmb3IgdGhlIGN1cnJlbnQgRmlyZWJhc2UgdXNlciBzaWduZWQgaW50byB0aGUgYXBwLlxuICAgKiBAcGFyYW0gcGFzc3dvcmRcbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgdXBkYXRlVXNlclBhc3N3b3JkKHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIHBhc3N3b3JkIHJlc2V0IGVtYWlsIHRvIHRoZSBzcGVjaWZpZWQgdXNlciBlbWFpbCBhZGRyZXNzLlxuICAgKiBOb3RlOiBkb2Vzbid0IHJlcXVpcmUgdGhlIEZpcmViYXNlIHVzZXIgdG8gYmUgc2lnbmVkIGluIHRvIHRoZSBhcHAuXG4gICAqIEBwYXJhbSBlbWFpbFxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzZW5kVXNlclBhc3N3b3JkUmVzZXRFbWFpbChlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgYWNjb3VudCBvZiB0aGUgY3VycmVudCBGaXJlYmFzZSB1c2VyIHNpZ25lZCBpbnRvIHRoZSBhcHAuXG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGRlbGV0ZVVzZXIoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgSmF2YXNjcmlwdCBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiBGaXJlYmFzZSBBdXRoZW50aWNhdGlvbiBzdGF0ZSBjaGFuZ2VzIGJldHdlZW4gdXNlciBzaWduZWQgaW4vc2lnbmVkIG91dC5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZm4gLSBjYWxsYmFjayBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiBhdXRoZW50aWNhdGlvbiBzdGF0ZSBjaGFuZ2VzXG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHJlZ2lzdGVyQXV0aFN0YXRlQ2hhbmdlTGlzdGVuZXIoZm46IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIFJlbW90ZSBDb25maWcgcGFyYW1ldGVyIHZhbHVlcyBmb3IgeW91ciBhcHAuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjYWNoZUV4cGlyYXRpb25TZWNvbmRzIHNwZWNpZnkgdGhlIGNhY2hlRXhwaXJhdGlvblNlY29uZHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBmZXRjaChjYWNoZUV4cGlyYXRpb25TZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgdGhlIFJlbW90ZSBDb25maWcgZmV0Y2hlZCBjb25maWcuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgYWN0aXZhdGVGZXRjaGVkKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGEgUmVtb3RlIENvbmZpZyB2YWx1ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGdldFZhbHVlKGtleTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQW5kcm9pZCBvbmx5LiBSZXRyaWV2ZSBhIFJlbW90ZSBDb25maWcgYnl0ZSBhcnJheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGdldEJ5dGVBcnJheShrZXk6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuZHJvaWQgb25seS4gR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBGaXJlYmFzZVJlbW90ZUNvbmZpZyBzaW5nbGV0b24gb2JqZWN0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGdldEluZm8oKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQW5kcm9pZCBvbmx5LiBDaGFuZ2UgdGhlIHNldHRpbmdzIGZvciB0aGUgRmlyZWJhc2VSZW1vdGVDb25maWcgb2JqZWN0J3Mgb3BlcmF0aW9ucy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHNldHRpbmdzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc2V0Q29uZmlnU2V0dGluZ3Moc2V0dGluZ3M6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuZHJvaWQgb25seS4gU2V0IGRlZmF1bHRzIGluIHRoZSBSZW1vdGUgQ29uZmlnLlxuICAgKiBAcGFyYW0ge09iamVjdH0gc2V0dGluZ3NcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzZXREZWZhdWx0cyhzZXR0aW5nczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgYSB0cmFjZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBzdGFydFRyYWNlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIGNvdW50IHRoZSBwZXJmb3JtYW5jZS1yZWxhdGVkIGV2ZW50cyB0aGF0IG9jY3VyIGluIHlvdXIgYXBwIChzdWNoIGFzIGNhY2hlIGhpdHMgb3IgcmV0cmllcyksXG4gICAqIGFkZCBhIGxpbmUgb2YgY29kZSBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgd2hlbmV2ZXIgdGhlIGV2ZW50IG9jY3VycyxcbiAgICogdXNpbmcgYSBzdHJpbmcgb3RoZXIgdGhhbiByZXRyeSB0byBuYW1lIHRoYXQgZXZlbnQgaWYgeW91IGFyZSBjb3VudGluZyBhIGRpZmZlcmVudCB0eXBlIG9mIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGluY3JlbWVudENvdW50ZXIobmFtZTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU3RvcCB0aGUgdHJhY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgc3RvcFRyYWNlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgZG9jdW1lbnQgdG8gYSBGaXJlc3RvcmUgY29sbGVjdGlvbiwgd2hpY2ggd2lsbCBiZSBhbGxvY2F0ZWQgYW4gYXV0by1nZW5lcmF0ZWQgZG9jdW1lbnQgSUQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkb2N1bWVudCAtIGRvY3VtZW50IG9iamVjdCB0byBhZGQgdG8gY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sbGVjdGlvbiAtIG5hbWUgb2YgdG9wLWxldmVsIGNvbGxlY3Rpb24gdG8gYWRkIGRvY3VtZW50IHRvLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdWNjZXNzIC0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCBvbiBzdWNjZXNzZnVsbHkgYWRkaW5nIHRoZSBkb2N1bWVudC4gV2lsbCBiZSBwYXNzZWQgYSB7c3RyaW5nfSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBhdXRvLWdlbmVyYXRlZCBkb2N1bWVudCBJRCB0aGF0IHRoZSBkb2N1bWVudCB3YXMgc3RvcmVkIGFnYWluc3QuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGVycm9yIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBwYXNzZWQgYSB7c3RyaW5nfSBlcnJvciBtZXNzYWdlIGFzIGFuIGFyZ3VtZW50LlxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBhZGREb2N1bWVudFRvRmlyZXN0b3JlQ29sbGVjdGlvbihcbiAgICBkb2N1bWVudDogb2JqZWN0LFxuICAgIGNvbGxlY3Rpb246IHN0cmluZyxcbiAgICBzdWNjZXNzOiAoaWQ6IHN0cmluZykgPT4gdm9pZCxcbiAgICBlcnJvcjogKGVycjogc3RyaW5nKSA9PiB2b2lkXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgKGFkZHMvcmVwbGFjZXMpIGEgZG9jdW1lbnQgd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gYSBGaXJlc3RvcmUgY29sbGVjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRvY3VtZW50SWQgLSBkb2N1bWVudCBJRCB0byB1c2Ugd2hlbiBzZXR0aW5nIGRvY3VtZW50IGluIHRoZSBjb2xsZWN0aW9uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gZG9jdW1lbnQgLSBkb2N1bWVudCBvYmplY3QgdG8gc2V0IGluIGNvbGxlY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uIC0gbmFtZSBvZiB0b3AtbGV2ZWwgY29sbGVjdGlvbiB0byBzZXQgZG9jdW1lbnQgaW4uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIG9uIHN1Y2Nlc3NmdWxseSBzZXR0aW5nIHRoZSBkb2N1bWVudC5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZXJyb3IgLSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHBhc3NlZCBhIHtzdHJpbmd9IGVycm9yIG1lc3NhZ2UgYXMgYW4gYXJndW1lbnQuXG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHNldERvY3VtZW50SW5GaXJlc3RvcmVDb2xsZWN0aW9uKFxuICAgIGRvY3VtZW50SWQ6IHN0cmluZyxcbiAgICBkb2N1bWVudDogb2JqZWN0LFxuICAgIGNvbGxlY3Rpb246IHN0cmluZyxcbiAgICBzdWNjZXNzOiAoKSA9PiB2b2lkLFxuICAgIGVycm9yOiAoZXJyOiBzdHJpbmcpID0+IHZvaWRcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBhbiBleGlzdGluZyBkb2N1bWVudCB3aXRoIHRoZSBnaXZlbiBJRCBpbiBhIEZpcmVzdG9yZSBjb2xsZWN0aW9uLiBUaGlzIGlzIGEgbm9uLWRlc3RydWN0aXZlIHVwZGF0ZSB0aGF0IHdpbGwgb25seVxuICAgKiBvdmVyd3JpdGUgZXhpc3Rpbmcga2V5cyBpbiB0aGUgZXhpc3RpbmcgZG9jdW1lbnQgb3IgYWRkIG5ldyBvbmVzIGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBleGlzdC4gSWYgdGhlIG5vIGRvY3VtZW50IHdpdGggdGhlXG4gICAqIHNwZWNpZmllZCBJRCBleGlzdHMgaW4gdGhlIGNvbGxlY3Rpb24sIGFuIGVycm9yIHdpbGwgYmUgcmFpc2VkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZG9jdW1lbnRJZCAtIGRvY3VtZW50IElEIG9mIHRoZSBkb2N1bWVudCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkb2N1bWVudCAtIGVudGlyZSBkb2N1bWVudCBvciBkb2N1bWVudCBmcmFnbWVudCB0byB1cGRhdGUgZXhpc3RpbmcgZG9jdW1lbnQgd2l0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbGxlY3Rpb24gLSBuYW1lIG9mIHRvcC1sZXZlbCBjb2xsZWN0aW9uIHRvIHVwZGF0ZSBkb2N1bWVudCBpbi5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gc3VjY2VzcyAtIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgb24gc3VjY2Vzc2Z1bGx5IHVwZGF0aW5nIHRoZSBkb2N1bWVudC5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZXJyb3IgLSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHBhc3NlZCBhIHtzdHJpbmd9IGVycm9yIG1lc3NhZ2UgYXMgYW4gYXJndW1lbnQuXG4gICAqL1xuICBAQ29yZG92YSgpXG4gIHVwZGF0ZURvY3VtZW50SW5GaXJlc3RvcmVDb2xsZWN0aW9uKFxuICAgIGRvY3VtZW50SWQ6IHN0cmluZyxcbiAgICBkb2N1bWVudDogb2JqZWN0LFxuICAgIGNvbGxlY3Rpb246IHN0cmluZyxcbiAgICBzdWNjZXNzOiAoKSA9PiB2b2lkLFxuICAgIGVycm9yOiAoZXJyOiBzdHJpbmcpID0+IHZvaWRcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbiBleGlzdGluZyBkb2N1bWVudCB3aXRoIHRoZSBnaXZlbiBJRCBpbiBhIEZpcmVzdG9yZSBjb2xsZWN0aW9uLlxuICAgKiAtIE5vdGU6IElmIHRoZSBubyBkb2N1bWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgZXhpc3RzIGluIHRoZSBjb2xsZWN0aW9uLCB0aGUgRmlyZWJhc2UgU0RLIHdpbGwgc3RpbGwgcmV0dXJuIGEgc3VjY2Vzc2Z1bCBvdXRjb21lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZG9jdW1lbnRJZCAtIGRvY3VtZW50IElEIG9mIHRoZSBkb2N1bWVudCB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uIC0gbmFtZSBvZiB0b3AtbGV2ZWwgY29sbGVjdGlvbiB0byBkZWxldGUgZG9jdW1lbnQgaW4uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIG9uIHN1Y2Nlc3NmdWxseSBkZWxldGluZyB0aGUgZG9jdW1lbnQuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGVycm9yIC0gIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgcGFzc2VkIGEge3N0cmluZ30gZXJyb3IgbWVzc2FnZSBhcyBhbiBhcmd1bWVudC5cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgZGVsZXRlRG9jdW1lbnRGcm9tRmlyZXN0b3JlQ29sbGVjdGlvbihcbiAgICBkb2N1bWVudElkOiBzdHJpbmcsXG4gICAgY29sbGVjdGlvbjogc3RyaW5nLFxuICAgIHN1Y2Nlc3M6ICgpID0+IHZvaWQsXG4gICAgZXJyb3I6IChlcnI6IHN0cmluZykgPT4gdm9pZFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGFuIGV4aXN0aW5nIGRvY3VtZW50IHdpdGggdGhlIGdpdmVuIElEIGZyb20gYSBGaXJlc3RvcmUgY29sbGVjdGlvbi5cbiAgICogLU5vdGU6IElmIHRoZSBubyBkb2N1bWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgZXhpc3RzIGluIHRoZSBjb2xsZWN0aW9uLCB0aGUgZXJyb3IgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZG9jdW1lbnRJZCAtIGRvY3VtZW50IElEIG9mIHRoZSBkb2N1bWVudCB0byBmZXRjaC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbGxlY3Rpb24gLSBuYW1lIG9mIHRvcC1sZXZlbCBjb2xsZWN0aW9uIHRvIGZldGNoIGRvY3VtZW50IGZyb20uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1Y2Nlc3MgLSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIG9uIHN1Y2Nlc3NmdWxseSBmZXRjaGluZyB0aGUgZG9jdW1lbnQuIFdpbGwgYmUgcGFzc2VkIGFuIHtvYmplY3R9IGNvbnRhaW4gdGhlIGRvY3VtZW50IGNvbnRlbnRzLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlcnJvciAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgcGFzc2VkIGEge3N0cmluZ30gZXJyb3IgbWVzc2FnZSBhcyBhbiBhcmd1bWVudC5cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgZmV0Y2hEb2N1bWVudEluRmlyZXN0b3JlQ29sbGVjdGlvbihcbiAgICBkb2N1bWVudElkOiBzdHJpbmcsXG4gICAgY29sbGVjdGlvbjogc3RyaW5nLFxuICAgIHN1Y2Nlc3M6IChkb2M6IGFueSkgPT4gdm9pZCxcbiAgICBlcnJvcjogKGVycjogc3RyaW5nKSA9PiB2b2lkXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYWxsIHRoZSBkb2N1bWVudHMgaW4gdGhlIHNwZWNpZmljIGNvbGxlY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBj