diff --git a/build/.eslintrc.cjs b/build/.eslintrc.cjs
deleted file mode 100644
index 4609e2e..0000000
--- a/build/.eslintrc.cjs
+++ /dev/null
@@ -1,39 +0,0 @@
-module.exports = {
- root: true,
- env: {
- es2021: true,
- node: true,
- },
- parser: "@typescript-eslint/parser",
- parserOptions: {
- project: "tsconfig.json",
- tsconfigRootDir: __dirname,
- },
- plugins: ["import", "@typescript-eslint", "simple-import-sort"],
- extends: [
- "eslint:recommended",
- "plugin:eslint-comments/recommended",
- "plugin:import/recommended",
- "plugin:import/typescript",
- "prettier",
- ],
- settings: {
- "import/resolver": {
- typescript: {
- project: "tsconfig.json",
- tsconfigRootDir: __dirname,
- },
- },
- },
- rules: {
- "simple-import-sort/imports": "error",
- "simple-import-sort/exports": "error",
- "import/no-mutable-exports": "error",
- "import/no-unused-modules": "error",
- "no-undef": "off",
- "no-prototype-builtins": "off",
- "no-dupe-class-members": "off",
- "@typescript-eslint/no-floating-promises": "error",
- "no-unused-vars": "warn"
- }
-};
diff --git a/build/LICENSE b/build/LICENSE
deleted file mode 100644
index 9a671be..0000000
--- a/build/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2023 Ahash Sritharan
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/build/dist/src/TemplateFunctions.d.ts b/build/dist/src/TemplateFunctions.d.ts
deleted file mode 100644
index 34ff55f..0000000
--- a/build/dist/src/TemplateFunctions.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-///
-///
-declare namespace Theia {
- namespace TemplateFunctions {
- function Init(executionContext: Xrm.FormContext | Xrm.Events.EventContext): Promise;
- function OnLoad(executionContext: Xrm.FormContext | Xrm.Events.EventContext): Promise;
- }
-}
diff --git a/build/dist/src/TemplateFunctions.js b/build/dist/src/TemplateFunctions.js
deleted file mode 100644
index f195082..0000000
--- a/build/dist/src/TemplateFunctions.js
+++ /dev/null
@@ -1,257 +0,0 @@
-///
-// eslint-disable-next-line no-unused-vars
-var Theia;
-(function (Theia) {
- let TemplateFunctions;
- (function (TemplateFunctions) {
- var formContext;
- class Fields {
- Firstname = new XrmEx.TextField("firstname");
- Lastname = new XrmEx.TextField("lastname");
- JobTitle = new XrmEx.TextField("jobtitle");
- PreferredContactMethod = new XrmEx.OptionsetField("preferredcontactmethodcode", {
- Any: 1,
- Email: 2,
- Phone: 3,
- Fax: 4,
- Mail: 5,
- });
- Customer = new XrmEx.LookupField("parentcustomerid");
- BusinessPhone = new XrmEx.TextField("telephone1");
- Gender = new XrmEx.OptionsetField("gendercode");
- Email = new XrmEx.TextField("emailaddress1");
- MobilePhone = new XrmEx.TextField("mobilephone");
- Owner = new XrmEx.LookupField("ownerid");
- DoNotEmail = new XrmEx.BooleanField("donotemail");
- MaritalStatus = new XrmEx.OptionsetField("familystatuscode");
- SpousePartnerName = new XrmEx.TextField("spousesname");
- Birthday = new XrmEx.DateField("birthdate");
- }
- class Tabs {
- General = new XrmEx.Tab("tab1", {
- Section1: new XrmEx.Section("section1"),
- Section2: new XrmEx.Section("section2"),
- });
- Details = new XrmEx.Tab("tab2", {
- Section1: new XrmEx.Section("section1"),
- Section2: new XrmEx.Section("section2"),
- });
- }
- class Grids {
- ContactSubgrid = new XrmEx.GridControl("Test");
- }
- var fields;
- var tabs;
- var grids;
- async function Init(executionContext) {
- if (!XrmEx) {
- let errorMessage = "XrmEx is not loaded. Please make sure you have XrmEx.js loaded in your form.";
- console.error(errorMessage);
- await Xrm.Navigation.openAlertDialog({
- title: "Error",
- text: errorMessage,
- });
- return;
- }
- XrmEx.Form.formContext = executionContext;
- fields = new Fields();
- tabs = new Tabs();
- grids = new Grids();
- }
- TemplateFunctions.Init = Init;
- async function OnLoad(executionContext) {
- await Init(executionContext); //Ensures XrmEx is only accessed after the OnLoad Event
- try {
- parent.window.XrmEx = XrmEx;
- formContext = XrmEx.Form.formContext;
- await sample();
- //Register one or more Functions to execute OnSave
- formContext.data.entity.addOnSave(sample);
- //BETTER WAY
- XrmEx.Form.addOnSaveEventHandler([sample]);
- //Register one or more Functions to execute OnChange of multiple fields and execute it immediately
- let firstname = formContext.getAttribute("firstname");
- let lastname = formContext.getAttribute("lastname");
- firstname.addOnChange(sample);
- firstname.fireOnChange();
- lastname.fireOnChange();
- //BETTER WAY
- XrmEx.Form.addOnChangeEventHandler([fields.Firstname, fields.Lastname], [sample], true);
- }
- catch (error) {
- console.error(error);
- await XrmEx.openAlertDialog("Error", `Error in Theia.TemplateFunctions.${XrmEx.getMethodName()}\n` +
- error.message);
- }
- /**
- * This Framework empowers developers to DO MORE by writing LESS CODE 👈(゚ヮ゚👈)
- */
- async function sample() {
- try {
- //Continue only on Update Form
- if (formContext.ui.getFormType() != 2)
- return;
- //BETTER WAY
- if (XrmEx.Form.IsNotUpdate)
- return;
- //If Firstname is empty, make it required and shows notification on the field
- let firstname = formContext.getAttribute("firstname");
- if (!firstname.getValue()) {
- firstname.setRequiredLevel("required");
- firstname.controls.forEach((c) => c.setNotification("This property is required", "uniqueId"));
- }
- //BETTER WAY
- if (!fields.Lastname.Value)
- fields.Firstname.setRequired(true).setNotification("This property is required", "uniqueId");
- //If Owner has Value and Lastname does not, retrieve it's lastname and set it to Lastname
- let ownerid = formContext.getAttribute("ownerid");
- let lastname = formContext.getAttribute("lastname");
- if (ownerid.getValue() && !lastname.getValue()) {
- let user = await Xrm.WebApi.retrieveRecord(ownerid.getValue()[0].entityType, ownerid.getValue()[0].id, "?$select=lastname");
- lastname.setValue(user.lastname);
- }
- //BETTER WAY
- if (fields.Owner.Value && !fields.Lastname.Value) {
- let user = await fields.Owner.retrieve("?$select=lastname");
- fields.Lastname.Value = user.lastname;
- fields.Lastname.setValue(user.lastname);
- }
- //Set Optionset PreferredContactMethod to Email
- fields.PreferredContactMethod.Value =
- fields.PreferredContactMethod.Option.Email;
- //Add Lookup Filter to Customer and remove it later
- let filterFunction = function filterFunction(executionContext) {
- let formContext = executionContext.getFormContext();
- let customer = formContext.getAttribute("parentcustomerid");
- customer.controls.forEach((c) => {
- c.addCustomFilter(`
-
- `);
- });
- };
- let customer = formContext.getAttribute("parentcustomerid");
- customer.controls.forEach((c) => c.addPreSearch(filterFunction));
- customer.controls.forEach((c) => c.removePreSearch(filterFunction));
- //BETTER WAY
- fields.Customer.addPreFilterToLookup(`
-
- `);
- fields.Customer.clearPreFilterFromLookup();
- fields.Lastname.setVisible(false)
- .setDisabled(true)
- .setRequired(false)
- .setNotification("This property is required", "uniqueId");
- //SPECIAL WAY (Go to Definition to see how to achieve this)
- //Add Advanced Lookup Filter
- await fields.Customer.addPreFilterToLookupAdvanced("contact", "contactid", `
-
-
-
-
-
- `);
- //Execute bound Action
- class TestActionContactRequest {
- Amount;
- Account;
- getMetadata() {
- return {
- boundParameter: "entity",
- operationType: 0,
- operationName: "theia_TestActionContact",
- parameterTypes: {
- Amount: {
- typeName: "Edm.Int32",
- structuralProperty: 1,
- },
- Account: {
- typeName: "mscrm.account",
- structuralProperty: 5,
- },
- entity: {
- typeName: "mscrm.contact",
- structuralProperty: 5,
- },
- },
- };
- }
- }
- let testActionContactRequest = new TestActionContactRequest();
- testActionContactRequest.Amount = 5;
- testActionContactRequest.Account = customer.getValue()[0];
- testActionContactRequest["entity"] =
- formContext.data.entity.getEntityReference();
- let response = await Xrm.WebApi.online
- .execute(testActionContactRequest)
- .then(function (response) {
- if (response.ok) {
- return response.json().catch(() => {
- return response;
- });
- }
- })
- .then((responseBody) => responseBody);
- console.log(response);
- //BETTER WAY
- let response2 = await XrmEx.executeAction("theia_TestActionContact", [
- { Name: "Amount", Type: "Integer", Value: 5 },
- {
- Name: "Account",
- Type: "EntityReference",
- Value: fields.Customer.Value[0],
- },
- ], XrmEx.Form.entityReference);
- console.log(response2);
- //Retrieve EnvironmentVariableValue
- class EnvironmentVariableRequest {
- DefinitionSchemaName;
- constructor(definitionSchemaName) {
- this.DefinitionSchemaName = definitionSchemaName;
- }
- getMetadata() {
- return {
- boundParameter: null,
- operationType: 1,
- operationName: "RetrieveEnvironmentVariableValue",
- parameterTypes: {
- DefinitionSchemaName: {
- typeName: "Edm.String",
- structuralProperty: 1,
- },
- },
- };
- }
- }
- let environmentVariableRequest = new EnvironmentVariableRequest("theia_Test");
- let value = await Xrm.WebApi.online
- .execute(environmentVariableRequest)
- .then(function (response) {
- if (response.ok) {
- return response.json().catch(() => {
- return response;
- });
- }
- })
- .then((responseBody) => responseBody);
- console.log(value);
- //BETTER WAY
- let value2 = await XrmEx.getEnvironmentVariableValue("theia_Test");
- console.log(value2);
- /**
- * How to access Propoerties described in Microsofts Documentation
- */
- /** You can access all Form Context Functions here: @see https://docs.microsoft.com/en-us/power-apps/developer/model-driven-apps/clientapi/clientapi-form-context*/
- XrmEx.Form.formContext.data.isValid();
- /** You can access all Column Functions here: @see https://docs.microsoft.com/en-us/power-apps/developer/model-driven-apps/clientapi/reference/attributes*/
- fields.Birthday.Attribute.getIsDirty();
- }
- catch (error) {
- console.error(error);
- throw new Error(`.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- }
- TemplateFunctions.OnLoad = OnLoad;
- })(TemplateFunctions = Theia.TemplateFunctions || (Theia.TemplateFunctions = {}));
-})(Theia || (Theia = {}));
-//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVtcGxhdGVGdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvVGVtcGxhdGVGdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUNBQWlDO0FBRWpDLDBDQUEwQztBQUMxQyxJQUFVLEtBQUssQ0EyU2Q7QUEzU0QsV0FBVSxLQUFLO0lBQ2IsSUFBaUIsaUJBQWlCLENBeVNqQztJQXpTRCxXQUFpQixpQkFBaUI7UUFDaEMsSUFBSSxXQUE0QixDQUFDO1FBQ2pDLE1BQU0sTUFBTTtZQUNWLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0MsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzQyxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLHNCQUFzQixHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FDL0MsNEJBQTRCLEVBQzVCO2dCQUNFLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEtBQUssRUFBRSxDQUFDO2dCQUNSLEtBQUssRUFBRSxDQUFDO2dCQUNSLEdBQUcsRUFBRSxDQUFDO2dCQUNOLElBQUksRUFBRSxDQUFDO2FBQ1IsQ0FDRixDQUFDO1lBQ0YsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3JELGFBQWEsR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbEQsTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNoRCxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzdDLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7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ZXJlbmNlIHBhdGg9XCJYcm1FeC50c1wiIC8+XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xubmFtZXNwYWNlIFRoZWlhIHtcbiAgZXhwb3J0IG5hbWVzcGFjZSBUZW1wbGF0ZUZ1bmN0aW9ucyB7XG4gICAgdmFyIGZvcm1Db250ZXh0OiBYcm0uRm9ybUNvbnRleHQ7XG4gICAgY2xhc3MgRmllbGRzIHtcbiAgICAgIEZpcnN0bmFtZSA9IG5ldyBYcm1FeC5UZXh0RmllbGQoXCJmaXJzdG5hbWVcIik7XG4gICAgICBMYXN0bmFtZSA9IG5ldyBYcm1FeC5UZXh0RmllbGQoXCJsYXN0bmFtZVwiKTtcbiAgICAgIEpvYlRpdGxlID0gbmV3IFhybUV4LlRleHRGaWVsZChcImpvYnRpdGxlXCIpO1xuICAgICAgUHJlZmVycmVkQ29udGFjdE1ldGhvZCA9IG5ldyBYcm1FeC5PcHRpb25zZXRGaWVsZChcbiAgICAgICAgXCJwcmVmZXJyZWRjb250YWN0bWV0aG9kY29kZVwiLFxuICAgICAgICB7XG4gICAgICAgICAgQW55OiAxLFxuICAgICAgICAgIEVtYWlsOiAyLFxuICAgICAgICAgIFBob25lOiAzLFxuICAgICAgICAgIEZheDogNCxcbiAgICAgICAgICBNYWlsOiA1LFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgQ3VzdG9tZXIgPSBuZXcgWHJtRXguTG9va3VwRmllbGQoXCJwYXJlbnRjdXN0b21lcmlkXCIpO1xuICAgICAgQnVzaW5lc3NQaG9uZSA9IG5ldyBYcm1FeC5UZXh0RmllbGQoXCJ0ZWxlcGhvbmUxXCIpO1xuICAgICAgR2VuZGVyID0gbmV3IFhybUV4Lk9wdGlvbnNldEZpZWxkKFwiZ2VuZGVyY29kZVwiKTtcbiAgICAgIEVtYWlsID0gbmV3IFhybUV4LlRleHRGaWVsZChcImVtYWlsYWRkcmVzczFcIik7XG4gICAgICBNb2JpbGVQaG9uZSA9IG5ldyBYcm1FeC5UZXh0RmllbGQoXCJtb2JpbGVwaG9uZVwiKTtcbiAgICAgIE93bmVyID0gbmV3IFhybUV4Lkxvb2t1cEZpZWxkKFwib3duZXJpZFwiKTtcbiAgICAgIERvTm90RW1haWwgPSBuZXcgWHJtRXguQm9vbGVhbkZpZWxkKFwiZG9ub3RlbWFpbFwiKTtcbiAgICAgIE1hcml0YWxTdGF0dXMgPSBuZXcgWHJtRXguT3B0aW9uc2V0RmllbGQoXCJmYW1pbHlzdGF0dXNjb2RlXCIpO1xuICAgICAgU3BvdXNlUGFydG5lck5hbWUgPSBuZXcgWHJtRXguVGV4dEZpZWxkKFwic3BvdXNlc25hbWVcIik7XG4gICAgICBCaXJ0aGRheSA9IG5ldyBYcm1FeC5EYXRlRmllbGQoXCJiaXJ0aGRhdGVcIik7XG4gICAgfVxuICAgIGNsYXNzIFRhYnMge1xuICAgICAgR2VuZXJhbCA9IG5ldyBYcm1FeC5UYWIoXCJ0YWIxXCIsIHtcbiAgICAgICAgU2VjdGlvbjE6IG5ldyBYcm1FeC5TZWN0aW9uKFwic2VjdGlvbjFcIiksXG4gICAgICAgIFNlY3Rpb24yOiBuZXcgWHJtRXguU2VjdGlvbihcInNlY3Rpb24yXCIpLFxuICAgICAgfSk7XG4gICAgICBEZXRhaWxzID0gbmV3IFhybUV4LlRhYihcInRhYjJcIiwge1xuICAgICAgICBTZWN0aW9uMTogbmV3IFhybUV4LlNlY3Rpb24oXCJzZWN0aW9uMVwiKSxcbiAgICAgICAgU2VjdGlvbjI6IG5ldyBYcm1FeC5TZWN0aW9uKFwic2VjdGlvbjJcIiksXG4gICAgICB9KTtcbiAgICB9XG4gICAgY2xhc3MgR3JpZHMge1xuICAgICAgQ29udGFjdFN1YmdyaWQgPSBuZXcgWHJtRXguR3JpZENvbnRyb2woXCJUZXN0XCIpO1xuICAgIH1cbiAgICB2YXIgZmllbGRzOiBGaWVsZHM7XG4gICAgdmFyIHRhYnM6IFRhYnM7XG4gICAgdmFyIGdyaWRzOiBHcmlkcztcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gSW5pdChcbiAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IFhybS5Gb3JtQ29udGV4dCB8IFhybS5FdmVudHMuRXZlbnRDb250ZXh0XG4gICAgKSB7XG4gICAgICBpZiAoIVhybUV4KSB7XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICAgIFwiWHJtRXggaXMgbm90IGxvYWRlZC4gUGxlYXNlIG1ha2Ugc3VyZSB5b3UgaGF2ZSBYcm1FeC5qcyBsb2FkZWQgaW4geW91ciBmb3JtLlwiO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgIGF3YWl0IFhybS5OYXZpZ2F0aW9uLm9wZW5BbGVydERpYWxvZyh7XG4gICAgICAgICAgdGl0bGU6IFwiRXJyb3JcIixcbiAgICAgICAgICB0ZXh0OiBlcnJvck1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBYcm1FeC5Gb3JtLmZvcm1Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICAgIGZpZWxkcyA9IG5ldyBGaWVsZHMoKTtcbiAgICAgIHRhYnMgPSBuZXcgVGFicygpO1xuICAgICAgZ3JpZHMgPSBuZXcgR3JpZHMoKTtcbiAgICB9XG5cbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gT25Mb2FkKFxuICAgICAgZXhlY3V0aW9uQ29udGV4dDogWHJtLkZvcm1Db250ZXh0IHwgWHJtLkV2ZW50cy5FdmVudENvbnRleHRcbiAgICApIHtcbiAgICAgIGF3YWl0IEluaXQoZXhlY3V0aW9uQ29udGV4dCk7IC8vRW5zdXJlcyBYcm1FeCBpcyBvbmx5IGFjY2Vzc2VkIGFmdGVyIHRoZSBPbkxvYWQgRXZlbnRcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcmVudC53aW5kb3cuWHJtRXggPSBYcm1FeDtcbiAgICAgICAgZm9ybUNvbnRleHQgPSBYcm1FeC5Gb3JtLmZvcm1Db250ZXh0O1xuXG4gICAgICAgIGF3YWl0IHNhbXBsZSgpO1xuICAgICAgICAvL1JlZ2lzdGVyIG9uZSBvciBtb3JlIEZ1bmN0aW9ucyB0byBleGVjdXRlIE9uU2F2ZVxuICAgICAgICBmb3JtQ29udGV4dC5kYXRhLmVudGl0eS5hZGRPblNhdmUoc2FtcGxlKTtcbiAgICAgICAgLy9CRVRURVIgV0FZXG4gICAgICAgIFhybUV4LkZvcm0uYWRkT25TYXZlRXZlbnRIYW5kbGVyKFtzYW1wbGVdKTtcbiAgICAgICAgLy9SZWdpc3RlciBvbmUgb3IgbW9yZSBGdW5jdGlvbnMgdG8gZXhlY3V0ZSBPbkNoYW5nZSBvZiBtdWx0aXBsZSBmaWVsZHMgYW5kIGV4ZWN1dGUgaXQgaW1tZWRpYXRlbHlcbiAgICAgICAgbGV0IGZpcnN0bmFtZSA9IGZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZShcImZpcnN0bmFtZVwiKTtcbiAgICAgICAgbGV0IGxhc3RuYW1lID0gZm9ybUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFzdG5hbWVcIik7XG4gICAgICAgIGZpcnN0bmFtZS5hZGRPbkNoYW5nZShzYW1wbGUpO1xuICAgICAgICBmaXJzdG5hbWUuZmlyZU9uQ2hhbmdlKCk7XG4gICAgICAgIGxhc3RuYW1lLmZpcmVPbkNoYW5nZSgpO1xuICAgICAgICAvL0JFVFRFUiBXQVlcbiAgICAgICAgWHJtRXguRm9ybS5hZGRPbkNoYW5nZUV2ZW50SGFuZGxlcihcbiAgICAgICAgICBbZmllbGRzLkZpcnN0bmFtZSwgZmllbGRzLkxhc3RuYW1lXSxcbiAgICAgICAgICBbc2FtcGxlXSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgYXdhaXQgWHJtRXgub3BlbkFsZXJ0RGlhbG9nKFxuICAgICAgICAgIFwiRXJyb3JcIixcbiAgICAgICAgICBgRXJyb3IgaW4gVGhlaWEuVGVtcGxhdGVGdW5jdGlvbnMuJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9XFxuYCArXG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIFRoaXMgRnJhbWV3b3JrIGVtcG93ZXJzIGRldmVsb3BlcnMgdG8gRE8gTU9SRSBieSB3cml0aW5nIExFU1MgQ09ERSDwn5GIKO++n+ODru++n/CfkYgpXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhbXBsZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvL0NvbnRpbnVlIG9ubHkgb24gVXBkYXRlIEZvcm1cbiAgICAgICAgICBpZiAoZm9ybUNvbnRleHQudWkuZ2V0Rm9ybVR5cGUoKSAhPSAyKSByZXR1cm47XG4gICAgICAgICAgLy9CRVRURVIgV0FZXG4gICAgICAgICAgaWYgKFhybUV4LkZvcm0uSXNOb3RVcGRhdGUpIHJldHVybjtcblxuICAgICAgICAgIC8vSWYgRmlyc3RuYW1lIGlzIGVtcHR5LCBtYWtlIGl0IHJlcXVpcmVkIGFuZCBzaG93cyBub3RpZmljYXRpb24gb24gdGhlIGZpZWxkXG4gICAgICAgICAgbGV0IGZpcnN0bmFtZSA9IGZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZShcImZpcnN0bmFtZVwiKTtcbiAgICAgICAgICBpZiAoIWZpcnN0bmFtZS5nZXRWYWx1ZSgpKSB7XG4gICAgICAgICAgICBmaXJzdG5hbWUuc2V0UmVxdWlyZWRMZXZlbChcInJlcXVpcmVkXCIpO1xuICAgICAgICAgICAgZmlyc3RuYW1lLmNvbnRyb2xzLmZvckVhY2goKGMpID0+XG4gICAgICAgICAgICAgIGMuc2V0Tm90aWZpY2F0aW9uKFwiVGhpcyBwcm9wZXJ0eSBpcyByZXF1aXJlZFwiLCBcInVuaXF1ZUlkXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL0JFVFRFUiBXQVlcbiAgICAgICAgICBpZiAoIWZpZWxkcy5MYXN0bmFtZS5WYWx1ZSlcbiAgICAgICAgICAgIGZpZWxkcy5GaXJzdG5hbWUuc2V0UmVxdWlyZWQodHJ1ZSkuc2V0Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgICBcIlRoaXMgcHJvcGVydHkgaXMgcmVxdWlyZWRcIixcbiAgICAgICAgICAgICAgXCJ1bmlxdWVJZFwiXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgLy9JZiBPd25lciBoYXMgVmFsdWUgYW5kIExhc3RuYW1lIGRvZXMgbm90LCByZXRyaWV2ZSBpdCdzIGxhc3RuYW1lIGFuZCBzZXQgaXQgdG8gTGFzdG5hbWVcbiAgICAgICAgICBsZXQgb3duZXJpZCA9IGZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZShcIm93bmVyaWRcIik7XG4gICAgICAgICAgbGV0IGxhc3RuYW1lID0gZm9ybUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFzdG5hbWVcIik7XG4gICAgICAgICAgaWYgKG93bmVyaWQuZ2V0VmFsdWUoKSAmJiAhbGFzdG5hbWUuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgbGV0IHVzZXIgPSBhd2FpdCBYcm0uV2ViQXBpLnJldHJpZXZlUmVjb3JkKFxuICAgICAgICAgICAgICBvd25lcmlkLmdldFZhbHVlKClbMF0uZW50aXR5VHlwZSxcbiAgICAgICAgICAgICAgb3duZXJpZC5nZXRWYWx1ZSgpWzBdLmlkLFxuICAgICAgICAgICAgICBcIj8kc2VsZWN0PWxhc3RuYW1lXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsYXN0bmFtZS5zZXRWYWx1ZSh1c2VyLmxhc3RuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9CRVRURVIgV0FZXG4gICAgICAgICAgaWYgKGZpZWxkcy5Pd25lci5WYWx1ZSAmJiAhZmllbGRzLkxhc3RuYW1lLlZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgdXNlciA9IGF3YWl0IGZpZWxkcy5Pd25lci5yZXRyaWV2ZShcIj8kc2VsZWN0PWxhc3RuYW1lXCIpO1xuICAgICAgICAgICAgZmllbGRzLkxhc3RuYW1lLlZhbHVlID0gdXNlci5sYXN0bmFtZTtcbiAgICAgICAgICAgIGZpZWxkcy5MYXN0bmFtZS5zZXRWYWx1ZSh1c2VyLmxhc3RuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9TZXQgT3B0aW9uc2V0IFByZWZlcnJlZENvbnRhY3RNZXRob2QgdG8gRW1haWxcbiAgICAgICAgICBmaWVsZHMuUHJlZmVycmVkQ29udGFjdE1ldGhvZC5WYWx1ZSA9XG4gICAgICAgICAgICBmaWVsZHMuUHJlZmVycmVkQ29udGFjdE1ldGhvZC5PcHRpb24uRW1haWw7XG5cbiAgICAgICAgICAvL0FkZCBMb29rdXAgRmlsdGVyIHRvIEN1c3RvbWVyIGFuZCByZW1vdmUgaXQgbGF0ZXJcbiAgICAgICAgICBsZXQgZmlsdGVyRnVuY3Rpb24gPSBmdW5jdGlvbiBmaWx0ZXJGdW5jdGlvbihcbiAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IFhybS5FdmVudHMuRXZlbnRDb250ZXh0XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgZm9ybUNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0LmdldEZvcm1Db250ZXh0KCk7XG4gICAgICAgICAgICBsZXQgY3VzdG9tZXI6IFhybS5BdHRyaWJ1dGVzLkxvb2t1cEF0dHJpYnV0ZSA9XG4gICAgICAgICAgICAgIGZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZShcInBhcmVudGN1c3RvbWVyaWRcIik7XG4gICAgICAgICAgICBjdXN0b21lci5jb250cm9scy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgIGMuYWRkQ3VzdG9tRmlsdGVyKFxuICAgICAgICAgICAgICAgIGA8ZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIGF0dHJpYnV0ZT1cImxhc3RuYW1lXCIgb3BlcmF0b3I9XCJsaWtlXCIgdmFsdWU9XCIlVGVzdCVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPmBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgICAgbGV0IGN1c3RvbWVyOiBYcm0uQXR0cmlidXRlcy5Mb29rdXBBdHRyaWJ1dGUgPVxuICAgICAgICAgICAgZm9ybUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicGFyZW50Y3VzdG9tZXJpZFwiKTtcbiAgICAgICAgICBjdXN0b21lci5jb250cm9scy5mb3JFYWNoKChjKSA9PiBjLmFkZFByZVNlYXJjaChmaWx0ZXJGdW5jdGlvbikpO1xuICAgICAgICAgIGN1c3RvbWVyLmNvbnRyb2xzLmZvckVhY2goKGMpID0+IGMucmVtb3ZlUHJlU2VhcmNoKGZpbHRlckZ1bmN0aW9uKSk7XG4gICAgICAgICAgLy9CRVRURVIgV0FZXG4gICAgICAgICAgZmllbGRzLkN1c3RvbWVyLmFkZFByZUZpbHRlclRvTG9va3VwKFxuICAgICAgICAgICAgYDxmaWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgIDxjb25kaXRpb24gYXR0cmlidXRlPVwibGFzdG5hbWVcIiBvcGVyYXRvcj1cImxpa2VcIiB2YWx1ZT1cIiVUZXN0JVwiIC8+XG4gICAgICAgICAgICAgICAgPC9maWx0ZXI+YFxuICAgICAgICAgICk7XG4gICAgICAgICAgZmllbGRzLkN1c3RvbWVyLmNsZWFyUHJlRmlsdGVyRnJvbUxvb2t1cCgpO1xuXG4gICAgICAgICAgZmllbGRzLkxhc3RuYW1lLnNldFZpc2libGUoZmFsc2UpXG4gICAgICAgICAgICAuc2V0RGlzYWJsZWQodHJ1ZSlcbiAgICAgICAgICAgIC5zZXRSZXF1aXJlZChmYWxzZSlcbiAgICAgICAgICAgIC5zZXROb3RpZmljYXRpb24oXCJUaGlzIHByb3BlcnR5IGlzIHJlcXVpcmVkXCIsIFwidW5pcXVlSWRcIik7XG5cbiAgICAgICAgICAvL1NQRUNJQUwgV0FZIChHbyB0byBEZWZpbml0aW9uIHRvIHNlZSBob3cgdG8gYWNoaWV2ZSB0aGlzKVxuICAgICAgICAgIC8vQWRkIEFkdmFuY2VkIExvb2t1cCBGaWx0ZXJcbiAgICAgICAgICBhd2FpdCBmaWVsZHMuQ3VzdG9tZXIuYWRkUHJlRmlsdGVyVG9Mb29rdXBBZHZhbmNlZChcbiAgICAgICAgICAgIFwiY29udGFjdFwiLFxuICAgICAgICAgICAgXCJjb250YWN0aWRcIixcbiAgICAgICAgICAgIGA8ZmV0Y2g+XG4gICAgICAgICAgICAgICAgICAgIDxlbnRpdHkgbmFtZT1cImNvbnRhY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBhdHRyaWJ1dGU9XCJsYXN0bmFtZVwiIG9wZXJhdG9yPVwibGlrZVwiIHZhbHVlPVwiJVRlc3QlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgPC9lbnRpdHk+XG4gICAgICAgICAgICAgICAgICA8L2ZldGNoPmBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy9FeGVjdXRlIGJvdW5kIEFjdGlvblxuICAgICAgICAgIGNsYXNzIFRlc3RBY3Rpb25Db250YWN0UmVxdWVzdCB7XG4gICAgICAgICAgICBBbW91bnQ6IG51bWJlcjtcbiAgICAgICAgICAgIEFjY291bnQ6IGFueTtcbiAgICAgICAgICAgIGdldE1ldGFkYXRhKCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJvdW5kUGFyYW1ldGVyOiBcImVudGl0eVwiLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6IDAsXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ0aGVpYV9UZXN0QWN0aW9uQ29udGFjdFwiLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGVzOiB7XG4gICAgICAgICAgICAgICAgICBBbW91bnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWU6IFwiRWRtLkludDMyXCIsXG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyYWxQcm9wZXJ0eTogMSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBBY2NvdW50OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lOiBcIm1zY3JtLmFjY291bnRcIixcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiA1LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGVudGl0eToge1xuICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZTogXCJtc2NybS5jb250YWN0XCIsXG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyYWxQcm9wZXJ0eTogNSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHRlc3RBY3Rpb25Db250YWN0UmVxdWVzdCA9IG5ldyBUZXN0QWN0aW9uQ29udGFjdFJlcXVlc3QoKTtcbiAgICAgICAgICB0ZXN0QWN0aW9uQ29udGFjdFJlcXVlc3QuQW1vdW50ID0gNTtcbiAgICAgICAgICB0ZXN0QWN0aW9uQ29udGFjdFJlcXVlc3QuQWNjb3VudCA9IGN1c3RvbWVyLmdldFZhbHVlKClbMF07XG4gICAgICAgICAgdGVzdEFjdGlvbkNvbnRhY3RSZXF1ZXN0W1wiZW50aXR5XCJdID1cbiAgICAgICAgICAgIGZvcm1Db250ZXh0LmRhdGEuZW50aXR5LmdldEVudGl0eVJlZmVyZW5jZSgpO1xuICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IFhybS5XZWJBcGkub25saW5lXG4gICAgICAgICAgICAuZXhlY3V0ZSh0ZXN0QWN0aW9uQ29udGFjdFJlcXVlc3QpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2VCb2R5KSA9PiByZXNwb25zZUJvZHkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcblxuICAgICAgICAgIC8vQkVUVEVSIFdBWVxuICAgICAgICAgIGxldCByZXNwb25zZTIgPSBhd2FpdCBYcm1FeC5leGVjdXRlQWN0aW9uKFxuICAgICAgICAgICAgXCJ0aGVpYV9UZXN0QWN0aW9uQ29udGFjdFwiLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICB7IE5hbWU6IFwiQW1vdW50XCIsIFR5cGU6IFwiSW50ZWdlclwiLCBWYWx1ZTogNSB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgTmFtZTogXCJBY2NvdW50XCIsXG4gICAgICAgICAgICAgICAgVHlwZTogXCJFbnRpdHlSZWZlcmVuY2VcIixcbiAgICAgICAgICAgICAgICBWYWx1ZTogZmllbGRzLkN1c3RvbWVyLlZhbHVlWzBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFhybUV4LkZvcm0uZW50aXR5UmVmZXJlbmNlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZTIpO1xuXG4gICAgICAgICAgLy9SZXRyaWV2ZSBFbnZpcm9ubWVudFZhcmlhYmxlVmFsdWVcbiAgICAgICAgICBjbGFzcyBFbnZpcm9ubWVudFZhcmlhYmxlUmVxdWVzdCB7XG4gICAgICAgICAgICBEZWZpbml0aW9uU2NoZW1hTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgY29uc3RydWN0b3IoZGVmaW5pdGlvblNjaGVtYU5hbWU6IHN0cmluZykge1xuICAgICAgICAgICAgICB0aGlzLkRlZmluaXRpb25TY2hlbWFOYW1lID0gZGVmaW5pdGlvblNjaGVtYU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnZXRNZXRhZGF0YSgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBib3VuZFBhcmFtZXRlcjogbnVsbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25UeXBlOiAxLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IFwiUmV0cmlldmVFbnZpcm9ubWVudFZhcmlhYmxlVmFsdWVcIixcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlczoge1xuICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvblNjaGVtYU5hbWU6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWU6IFwiRWRtLlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBlbnZpcm9ubWVudFZhcmlhYmxlUmVxdWVzdCA9IG5ldyBFbnZpcm9ubWVudFZhcmlhYmxlUmVxdWVzdChcbiAgICAgICAgICAgIFwidGhlaWFfVGVzdFwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsZXQgdmFsdWUgPSBhd2FpdCBYcm0uV2ViQXBpLm9ubGluZVxuICAgICAgICAgICAgLmV4ZWN1dGUoZW52aXJvbm1lbnRWYXJpYWJsZVJlcXVlc3QpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2VCb2R5KSA9PiByZXNwb25zZUJvZHkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAgICAgICAvL0JFVFRFUiBXQVlcbiAgICAgICAgICBsZXQgdmFsdWUyID0gYXdhaXQgWHJtRXguZ2V0RW52aXJvbm1lbnRWYXJpYWJsZVZhbHVlKFwidGhlaWFfVGVzdFwiKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZTIpO1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogSG93IHRvIGFjY2VzcyBQcm9wb2VydGllcyBkZXNjcmliZWQgaW4gTWljcm9zb2Z0cyBEb2N1bWVudGF0aW9uXG4gICAgICAgICAgICovXG4gICAgICAgICAgLyoqIFlvdSBjYW4gYWNjZXNzIGFsbCBGb3JtIENvbnRleHQgRnVuY3Rpb25zIGhlcmU6IEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcG93ZXItYXBwcy9kZXZlbG9wZXIvbW9kZWwtZHJpdmVuLWFwcHMvY2xpZW50YXBpL2NsaWVudGFwaS1mb3JtLWNvbnRleHQqL1xuICAgICAgICAgIFhybUV4LkZvcm0uZm9ybUNvbnRleHQuZGF0YS5pc1ZhbGlkKCk7XG5cbiAgICAgICAgICAvKiogWW91IGNhbiBhY2Nlc3MgYWxsIENvbHVtbiBGdW5jdGlvbnMgaGVyZTogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9wb3dlci1hcHBzL2RldmVsb3Blci9tb2RlbC1kcml2ZW4tYXBwcy9jbGllbnRhcGkvcmVmZXJlbmNlL2F0dHJpYnV0ZXMqL1xuICAgICAgICAgIGZpZWxkcy5CaXJ0aGRheS5BdHRyaWJ1dGUuZ2V0SXNEaXJ0eSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgLiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
\ No newline at end of file
diff --git a/build/dist/src/XrmEx.js b/build/dist/src/XrmEx.js
deleted file mode 100644
index ebceb7e..0000000
--- a/build/dist/src/XrmEx.js
+++ /dev/null
@@ -1,1327 +0,0 @@
-///
-var XrmEx;
-(function (XrmEx) {
- /**
- * Throws an error with the given error message.
- * @param {string} errorMessage - The error message to throw.
- * @throws {Error} - Always throws an error with the given error message.
- */
- function throwError(errorMessage) {
- throw new Error(errorMessage);
- }
- XrmEx.throwError = throwError;
- /**
- * Returns the name of the calling function.
- * @returns {string} - The name of the calling function.
- */
- function getMethodName() {
- try {
- const error = new Error();
- const stackTrace = error.stack?.split("\n").map((line) => line.trim());
- const callingFunctionLine = stackTrace && stackTrace.length >= 3 ? stackTrace[2] : undefined;
- const functionNameMatch = callingFunctionLine?.match(/at\s+([^\s]+)\s+\(/);
- const functionName = functionNameMatch ? functionNameMatch[1] : "";
- return functionName;
- }
- catch (error) {
- throw new Error(`XrmEx.getMethodName:\n${error.message}`);
- }
- }
- XrmEx.getMethodName = getMethodName;
- /**
- * Displays a notification for an app with the given message and level, and lets you specify whether to show a close button.
- * @param {string} message - The message to display in the notification.
- * @param {'SUCCESS' | 'ERROR' | 'WARNING' | 'INFO'} level - The level of the notification. Can be 'SUCCESS', 'ERROR', 'WARNING', or 'INFO'.
- * @param {boolean} [showCloseButton=false] - Whether to show a close button on the notification. Defaults to false.
- * @returns {Promise} - A promise that resolves with the ID of the created notification.
- */
- async function addGlobalNotification(message, level, showCloseButton = false) {
- const levelMap = {
- SUCCESS: 1,
- ERROR: 2,
- WARNING: 3,
- INFO: 4,
- };
- const messageLevel = levelMap[level] || levelMap.INFO;
- const notification = {
- type: 2,
- level: messageLevel,
- message,
- showCloseButton,
- };
- try {
- return await Xrm.App.addGlobalNotification(notification);
- }
- catch (error) {
- throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`);
- }
- }
- XrmEx.addGlobalNotification = addGlobalNotification;
- /**
- * Clears a notification in the app with the given unique ID.
- * @param {string} uniqueId - The unique ID of the notification to clear.
- * @returns {Promise} - A promise that resolves when the notification has been cleared.
- */
- async function removeGlobalNotification(uniqueId) {
- try {
- return await Xrm.App.clearGlobalNotification(uniqueId);
- }
- catch (error) {
- throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`);
- }
- }
- XrmEx.removeGlobalNotification = removeGlobalNotification;
- /**
- * Retrieves the value of an environment variable by using its schema name as key.
- * @param {string} environmentVariableSchemaName - The schema name of the environment variable to retrieve.
- * @returns {Promise} - A promise that resolves with the value of the environment variable.
- */
- async function getEnvironmentVariableValue(environmentVariableSchemaName) {
- return executeFunction("RetrieveEnvironmentVariableValue", [
- {
- Name: "DefinitionSchemaName",
- Type: "String",
- Value: environmentVariableSchemaName,
- },
- ]);
- }
- XrmEx.getEnvironmentVariableValue = getEnvironmentVariableValue;
- /**
- * A map of CRM data types to their corresponding type names, structural properties, and JavaScript types.
- * @type {Object.}
- */
- let typeMap = {
- String: { typeName: "Edm.String", structuralProperty: 1, jsType: "string" },
- Integer: { typeName: "Edm.Int32", structuralProperty: 1, jsType: "number" },
- Boolean: {
- typeName: "Edm.Boolean",
- structuralProperty: 1,
- jsType: "boolean",
- },
- DateTime: {
- typeName: "Edm.DateTimeOffset",
- structuralProperty: 1,
- jsType: "object",
- },
- EntityReference: {
- typeName: "mscrm.crmbaseentity",
- structuralProperty: 5,
- jsType: "object",
- },
- Decimal: {
- typeName: "Edm.Decimal",
- structuralProperty: 1,
- jsType: "number",
- },
- Entity: {
- typeName: "mscrm.crmbaseentity",
- structuralProperty: 5,
- jsType: "object",
- },
- EntityCollection: {
- typeName: "Collection(mscrm.crmbaseentity)",
- structuralProperty: 4,
- jsType: "object",
- },
- Float: { typeName: "Edm.Double", structuralProperty: 1, jsType: "number" },
- Money: { typeName: "Edm.Decimal", structuralProperty: 1, jsType: "number" },
- Picklist: {
- typeName: "Edm.Int32",
- structuralProperty: 1,
- jsType: "number",
- },
- };
- /**
- * Checks if the given request parameter is of a supported type and has a valid value.
- * @param {RequestParameter} requestParameter - The request parameter to check.
- * @returns {void}
- * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value.
- */
- function checkRequestParameterType(requestParameter) {
- if (!typeMap[requestParameter.Type])
- throw new Error(`The property type ${requestParameter.Type} of the property ${requestParameter.Name} is not supported.`);
- const expectedType = typeMap[requestParameter.Type].jsType;
- const actualType = typeof requestParameter.Value;
- const invalidTypeMessage = `The value ${requestParameter.Value}\nof the property ${requestParameter.Name}\nis not of the expected type ${requestParameter.Type}.`;
- if (requestParameter.Type === "EntityReference" ||
- requestParameter.Type === "Entity") {
- if (!requestParameter.Value ||
- !requestParameter.Value.hasOwnProperty("id") ||
- !requestParameter.Value.hasOwnProperty("entityType")) {
- throw new Error(invalidTypeMessage);
- }
- typeMap[requestParameter.Type].typeName = `mscrm.${requestParameter.Value.entityType}`;
- }
- else if (requestParameter.Type === "EntityCollection") {
- if (!Array.isArray(requestParameter.Value) ||
- requestParameter.Value.every((v) => typeof v !== "object" ||
- !v ||
- !v.hasOwnProperty("id") ||
- !v.hasOwnProperty("entityType"))) {
- throw new Error(invalidTypeMessage);
- }
- }
- else if (requestParameter.Type === "DateTime") {
- if (!(requestParameter.Value instanceof Date)) {
- throw new Error(invalidTypeMessage);
- }
- }
- else {
- if (actualType !== expectedType) {
- throw new Error(invalidTypeMessage);
- }
- }
- }
- XrmEx.checkRequestParameterType = checkRequestParameterType;
- /**
- * Executes an Action.
- * @param {string} actionName - The unique name of the action.
- * @param {RequestParameter[]} requestParameters - An array of objects with the parameter name, type and value.
- * @param {EntityReference} [boundEntity] - An optional EntityReference of the bound entity.
- * @returns {Promise} - A Promise with the request response.
- * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value.
- */
- async function executeAction(actionName, requestParameters, boundEntity) {
- const parameterDefinition = {};
- if (boundEntity)
- requestParameters.push({
- Name: "entity",
- Value: boundEntity,
- Type: "EntityReference",
- });
- for (const requestParameter of requestParameters) {
- checkRequestParameterType(requestParameter);
- parameterDefinition[requestParameter.Name] = {
- typeName: typeMap[requestParameter.Type].typeName,
- structuralProperty: typeMap[requestParameter.Type].structuralProperty,
- };
- }
- const req = Object.assign({
- getMetadata: () => ({
- boundParameter: boundEntity ? "entity" : null,
- operationType: 0,
- operationName: actionName,
- parameterTypes: parameterDefinition,
- }),
- }, ...requestParameters.map((p) => ({ [p.Name]: p.Value })));
- const response = await Xrm.WebApi.online.execute(req);
- if (response.ok)
- return response.json().catch(() => response);
- }
- XrmEx.executeAction = executeAction;
- /**
- * Executes a Function.
- * @param {string} functionName - The unique name of the function.
- * @param {RequestParameter[]} requestParameters - An array of objects with the parameter name, type and value.
- * @param {EntityReference} [boundEntity] - An optional EntityReference of the bound entity.
- * @returns {Promise} - A Promise with the request response.
- * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value.
- */
- async function executeFunction(functionName, requestParameters, boundEntity) {
- const parameterDefinition = {};
- if (boundEntity)
- requestParameters.push({
- Name: "entity",
- Value: boundEntity,
- Type: "EntityReference",
- });
- for (const requestParameter of requestParameters) {
- checkRequestParameterType(requestParameter);
- parameterDefinition[requestParameter.Name] = {
- typeName: typeMap[requestParameter.Type].typeName,
- structuralProperty: typeMap[requestParameter.Type].structuralProperty,
- };
- }
- const req = Object.assign({
- getMetadata: () => ({
- boundParameter: boundEntity ? "entity" : null,
- operationType: 1,
- operationName: functionName,
- parameterTypes: parameterDefinition,
- }),
- }, ...requestParameters.map((p) => ({ [p.Name]: p.Value })));
- const response = await Xrm.WebApi.online.execute(req);
- if (response.ok)
- return response.json().catch(() => response);
- }
- XrmEx.executeFunction = executeFunction;
- /**
- * Makes a GUID lowercase and removes brackets.
- * @param {string} guid - The GUID to normalize.
- * @returns {string} - The normalized GUID.
- */
- function normalizeGuid(guid) {
- if (typeof guid !== "string")
- throw new Error(`XrmEx.normalizeGuid:\n'${guid}' is not a string`);
- return guid.toLowerCase().replace(/[{}]/g, "");
- }
- XrmEx.normalizeGuid = normalizeGuid;
- /**
- * Opens a dialog with dynamic height and width based on text content.
- * @param {string} title - The title of the dialog.
- * @param {string} text - The text content of the dialog.
- * @returns {Promise} - A Promise with the dialog response.
- */
- async function openAlertDialog(title, text) {
- try {
- const rows = text.split(/\r\n|\r|\n/);
- let additionalRows = 0;
- rows.forEach((row) => {
- let width = getTextWidth(row, "1rem Segoe UI Regular, SegoeUI, Segoe UI");
- if (width > 940) {
- additionalRows += width / 940;
- }
- });
- const longestRow = rows.reduce((acc, row) => (row.length > acc.length ? row : acc), "");
- const width = Math.min(getTextWidth(longestRow, "1rem Segoe UI Regular, SegoeUI, Segoe UI"), 1000);
- const height = 109 + (rows.length + additionalRows) * 20;
- return await Xrm.Navigation.openAlertDialog({
- confirmButtonLabel: "Ok",
- text,
- title,
- }, {
- height,
- width,
- });
- }
- catch (error) {
- console.error(error.message);
- throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`);
- }
- /**
- * Uses canvas.measureText to compute and return the width of the given text of given font in pixels.
- *
- * @param {String} text The text to be rendered.
- * @param {String} font The css font descriptor that text is to be rendered with (e.g. "bold 14px verdana").
- *
- * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393
- */
- function getTextWidth(text, font) {
- const canvas = document.createElement("canvas");
- const context = canvas.getContext("2d");
- context.font = font;
- const metrics = context.measureText(text);
- return metrics.width;
- }
- }
- XrmEx.openAlertDialog = openAlertDialog;
- /**
- * Represents a form in Dynamics 365.
- */
- class Form {
- static _formContext;
- static _executionContext;
- constructor() { }
- /**Gets a reference to the current form context*/
- static get formContext() {
- return this._formContext;
- }
- /**Gets a reference to the current executio context*/
- static get executionContext() {
- return this._executionContext;
- }
- /**Gets a lookup value that references the record.*/
- static get entityReference() {
- return Form.formContext.data.entity.getEntityReference();
- }
- /**Sets a reference to the current form context*/
- static set formContext(context) {
- if ("getFormContext" in context) {
- this._executionContext = context;
- this._formContext = context.getFormContext();
- }
- else if ("data" in context)
- this._formContext = context;
- else
- throw new Error(`XrmEx.Form.setFormContext: The executionContext or formContext was not passed to the function.`);
- }
- /**Sets a reference to the current execution context*/
- static set executionContext(context) {
- if ("getFormContext" in context) {
- this._executionContext = context;
- this._formContext = context.getFormContext();
- }
- else if ("data" in context)
- this._formContext = context;
- else
- throw new Error(`XrmEx.Form.setExecutionContext: The executionContext or formContext was not passed to the function.`);
- }
- /**Returns true if form is from type create*/
- static get IsCreate() {
- return Form.formContext.ui.getFormType() == 1;
- }
- /**Returns true if form is from type update*/
- static get IsUpdate() {
- return Form.formContext.ui.getFormType() == 2;
- }
- /**Returns true if form is not from type create*/
- static get IsNotCreate() {
- return Form.formContext.ui.getFormType() != 1;
- }
- /**Returns true if form is not from type update*/
- static get IsNotUpdate() {
- return Form.formContext.ui.getFormType() != 2;
- }
- /**
- * Displays a form level notification. Any number of notifications can be displayed and will remain until removed using clearFormNotification.
- * The height of the notification area is limited so each new message will be added to the top.
- * @param message The text of the notification message.
- * @param level The level of the notification which defines how the message will be displayed, such as the icon.
- * ERROR: Notification will use the system error icon.
- * WARNING: Notification will use the system warning icon.
- * INFO: Notification will use the system info icon.
- * @param uniqueId Unique identifier for the notification which is used with clearFormNotification to remove the notification.
- * @returns true if it succeeds, otherwise false.
- */
- static addFormNotification(message, level, uniqueId) {
- try {
- return Form.formContext.ui.setFormNotification(message, level, uniqueId);
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Clears the form notification described by uniqueId.
- * @param uniqueId Unique identifier.
- * @returns True if it succeeds, otherwise false.
- */
- static removeFormNotification(uniqueId) {
- try {
- return Form.formContext.ui.clearFormNotification(uniqueId);
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Adds a handler to be called when the record is saved.
- */
- static addOnSaveEventHandler(handlers) {
- try {
- if (!Array.isArray(handlers)) {
- handlers = [handlers];
- }
- handlers.forEach((handler) => {
- if (typeof handler !== "function") {
- throw new Error(`'${handler}' is not a function`);
- }
- Form.formContext.data.entity.addOnSave(handler);
- });
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Adds a function to be called after the OnSave is complete.
- * @param handler The handler.
- * @remarks Added in 9.2
- * @see {@link https://docs.microsoft.com/en-us/powerapps/developer/model-driven-apps/clientapi/reference/events/postsave External Link: PostSave Event Documentation}
- */
- static addOnPostSaveEventHandler(handlers) {
- try {
- if (!Array.isArray(handlers)) {
- handlers = [handlers];
- }
- handlers.forEach((handler) => {
- if (typeof handler !== "function") {
- throw new Error(`'${handler}' is not a function`);
- }
- Form.formContext.data.entity.addOnPostSave(handler);
- });
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Adds a function to be called when form data is loaded.
- * @param handler The function to be executed when the form data loads. The function will be added to the bottom of the event handler pipeline.
- */
- static addOnLoadEventHandler(handlers) {
- try {
- if (!Array.isArray(handlers)) {
- handlers = [handlers];
- }
- handlers.forEach((handler) => {
- if (typeof handler !== "function") {
- throw new Error(`'${handler}' is not a function`);
- }
- Form.formContext.data.addOnLoad(handler);
- });
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Adds a handler to be called when the attribute's value is changed.
- * @param handler The function reference.
- */
- static addOnChangeEventHandler(fields, handlers, execute) {
- try {
- if (!Array.isArray(handlers)) {
- handlers = [handlers];
- }
- handlers.forEach((handler) => {
- if (typeof handler !== "function") {
- throw new Error(`'${handler}' is not a function`);
- }
- fields.forEach((field) => {
- field.addOnChange(handler);
- });
- });
- if (execute) {
- fields.forEach((field) => {
- field.Attribute.fireOnChange();
- });
- }
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- }
- XrmEx.Form = Form;
- /**
- * Used to execute methods related to a single Attribute
- */
- class Field {
- static allFields = [];
- Name;
- _attribute;
- constructor(attributeName) {
- const existingField = Field.allFields.find((f) => f.Name === attributeName);
- if (existingField) {
- return existingField;
- }
- this.Name = attributeName;
- Field.allFields.push(this);
- }
- setValue(value) {
- return this.Attribute.setValue(value);
- }
- getAttributeType() {
- return this.Attribute.getAttributeType();
- }
- getFormat() {
- return this.Attribute.getFormat();
- }
- getIsDirty() {
- return this.Attribute.getIsDirty();
- }
- getName() {
- return this.Attribute.getName();
- }
- getParent() {
- return this.Attribute.getParent();
- }
- getRequiredLevel() {
- return this.Attribute.getRequiredLevel();
- }
- getSubmitMode() {
- return this.Attribute.getSubmitMode();
- }
- getUserPrivilege() {
- return this.Attribute.getUserPrivilege();
- }
- removeOnChange(handler) {
- return this.Attribute.removeOnChange(handler);
- }
- setSubmitMode(submitMode) {
- return this.Attribute.setSubmitMode(submitMode);
- }
- getValue() {
- return this.Attribute.getValue();
- }
- setIsValid(isValid, message) {
- return this.Attribute.setIsValid(isValid, message);
- }
- get Attribute() {
- return (this._attribute ??=
- Form.formContext.getAttribute(this.Name) ??
- XrmEx.throwError(`The attribute '${this.Name}' was not found on the form.`));
- }
- get controls() {
- return this.Attribute.controls;
- }
- /**
- * Gets the value.
- * @returns The value.
- */
- get Value() {
- return this.Attribute.getValue();
- }
- set Value(value) {
- this.Attribute.setValue(value);
- }
- /**
- * Sets a control-local notification message.
- * @param message The message.
- * @param uniqueId Unique identifier.
- * @returns true if it succeeds, false if it fails.
- * @remarks When this method is used on Microsoft Dynamics CRM for tablets a red "X" icon
- * appears next to the control. Tapping on the icon will display the message.
- */
- setNotification(message, uniqueId) {
- try {
- if (!message)
- throw new Error(`no message was provided.`);
- if (!uniqueId)
- throw new Error(`no uniqueId was provided.`);
- this.controls.forEach((control) => control.setNotification(message, uniqueId));
- return this;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Sets the visibility state.
- * @param visible true to show, false to hide.
- */
- setVisible(visible) {
- try {
- this.controls.forEach((control) => control.setVisible(visible));
- return this;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Sets the state of the control to either enabled, or disabled.
- * @param disabled true to disable, false to enable.
- */
- setDisabled(disabled) {
- try {
- this.controls.forEach((control) => control.setDisabled(disabled));
- return this;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Sets the required level.
- * @param requirementLevel The requirement level, as either "none", "required", or "recommended"
- */
- setRequiredLevel(requirementLevel) {
- try {
- this.Attribute.setRequiredLevel(requirementLevel);
- return this;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Sets the required level.
- * @param required The requirement level, as either false for "none" or true for "required"
- */
- setRequired(required) {
- try {
- this.Attribute.setRequiredLevel(required ? "required" : "none");
- return this;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**Fire all "on change" event handlers. */
- fireOnChange() {
- try {
- this.Attribute.fireOnChange();
- return this;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Adds a handler or an array of handlers to be called when the attribute's value is changed.
- * @param handlers The function reference or an array of function references.
- */
- addOnChange(handlers) {
- try {
- if (Array.isArray(handlers)) {
- for (const handler of handlers) {
- if (typeof handler !== "function")
- throw new Error(`'${handler}' is not a function`);
- this.Attribute.removeOnChange(handler);
- this.Attribute.addOnChange(handler);
- }
- }
- else {
- if (typeof handlers !== "function")
- throw new Error(`'${handlers}' is not a function`);
- this.Attribute.removeOnChange(handlers);
- this.Attribute.addOnChange(handlers);
- }
- return this;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Displays an error or recommendation notification for a control, and lets you specify actions to execute based on the notification.
- */
- addNotification(message, notificationLevel, uniqueId, actions) {
- try {
- if (!uniqueId)
- throw new Error(`no uniqueId was provided.`);
- if (actions && !Array.isArray(actions))
- throw new Error(`the action parameter is not an array of ControlNotificationAction`);
- this.controls.forEach((control) => {
- control.addNotification({
- messages: [message],
- notificationLevel: notificationLevel,
- uniqueId: uniqueId,
- actions: actions,
- });
- });
- return this;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Clears the notification identified by uniqueId.
- * @param uniqueId (Optional) Unique identifier.
- * @returns true if it succeeds, false if it fails.
- * @remarks If the uniqueId parameter is not used, the current notification shown will be removed.
- */
- removeNotification(uniqueId) {
- try {
- this.controls.forEach((control) => {
- control.clearNotification(uniqueId);
- });
- return this;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- }
- XrmEx.Field = Field;
- class TextField extends Field {
- constructor(attribute) {
- super(attribute);
- }
- getMaxLength() {
- return this.Attribute.getMaxLength();
- }
- getFormat() {
- return this.Attribute.getFormat();
- }
- get Attribute() {
- return (this._attribute ??=
- Form.formContext.getAttribute(this.Name) ??
- XrmEx.throwError(`Field '${this.Name}' does not exist`));
- }
- get controls() {
- return this.Attribute.controls;
- }
- get Value() {
- return this.Attribute.getValue() ?? null;
- }
- set Value(value) {
- this.Attribute.setValue(value);
- }
- }
- XrmEx.TextField = TextField;
- class NumberField extends Field {
- constructor(attribute) {
- super(attribute);
- }
- getFormat() {
- return this.Attribute.getFormat();
- }
- getMax() {
- return this.Attribute.getMax();
- }
- getMin() {
- return this.Attribute.getMin();
- }
- getPrecision() {
- return this.Attribute.getPrecision();
- }
- setPrecision(precision) {
- return this.Attribute.setPrecision(precision);
- }
- get Attribute() {
- return (this._attribute ??=
- Form.formContext.getAttribute(this.Name) ??
- XrmEx.throwError(`Field '${this.Name}' does not exist`));
- }
- get controls() {
- return this.Attribute.controls;
- }
- get Value() {
- return this.Attribute.getValue() ?? null;
- }
- set Value(value) {
- this.Attribute.setValue(value);
- }
- }
- XrmEx.NumberField = NumberField;
- class DateField extends Field {
- constructor(attribute) {
- super(attribute);
- }
- getFormat() {
- return this.Attribute.getFormat();
- }
- get Attribute() {
- return (this._attribute ??=
- Form.formContext.getAttribute(this.Name) ??
- XrmEx.throwError(`Field '${this.Name}' does not exist`));
- }
- get controls() {
- return this.Attribute.controls;
- }
- get Value() {
- return this.Attribute.getValue() ?? null;
- }
- set Value(value) {
- this.Attribute.setValue(value);
- }
- }
- XrmEx.DateField = DateField;
- class BooleanField extends Field {
- constructor(attribute) {
- super(attribute);
- }
- getAttributeType() {
- return this.Attribute.getAttributeType();
- }
- getInitialValue() {
- return this.Attribute.getInitialValue();
- }
- get Attribute() {
- return (this._attribute ??=
- Form.formContext.getAttribute(this.Name) ??
- XrmEx.throwError(`Field '${this.Name}' does not exist`));
- }
- get controls() {
- return this.Attribute.controls;
- }
- get Value() {
- return this.Attribute.getValue() ?? null;
- }
- set Value(value) {
- this.Attribute.setValue(value);
- }
- }
- XrmEx.BooleanField = BooleanField;
- class MultiSelectOptionSetField extends Field {
- Option;
- constructor(attributeName, option) {
- super(attributeName);
- this.Option = option;
- }
- getFormat() {
- return this.Attribute.getFormat();
- }
- getOption(value) {
- if (typeof value === "number") {
- return this.Attribute.getOption(value);
- }
- else {
- return this.Attribute.getOption(value);
- }
- }
- getOptions() {
- return this.Attribute.getOptions();
- }
- getSelectedOption() {
- return this.Attribute.getSelectedOption();
- }
- getText() {
- return this.Attribute.getText();
- }
- getInitialValue() {
- return this.Attribute.getInitialValue();
- }
- get Attribute() {
- return (this._attribute ??=
- Form.formContext.getAttribute(this.Name) ??
- XrmEx.throwError(`Field '${this.Name}' does not exist`));
- }
- get controls() {
- return this.Attribute.controls;
- }
- get Value() {
- return this.Attribute.getValue();
- }
- set Value(value) {
- if (Array.isArray(value)) {
- let values = [];
- value.forEach((v) => {
- if (typeof v == "number")
- values.push(v);
- else
- values.push(this.Option[v]);
- });
- this.Attribute.setValue(values);
- }
- else
- XrmEx.throwError(`Field Value '${value}' is not an Array`);
- }
- }
- XrmEx.MultiSelectOptionSetField = MultiSelectOptionSetField;
- class LookupField extends Field {
- _customFilters = [];
- constructor(attribute) {
- super(attribute);
- }
- getIsPartyList() {
- return this.Attribute.getIsPartyList();
- }
- get Attribute() {
- return (this._attribute ??=
- Form.formContext.getAttribute(this.Name) ??
- XrmEx.throwError(`Field '${this.Name}' does not exist`));
- }
- get controls() {
- return this.Attribute.controls;
- }
- /**Gets the id of the first lookup value*/
- get Id() {
- return this.Value && this.Value.length > 0
- ? XrmEx.normalizeGuid(this.Value[0].id)
- : null;
- }
- /**Gets the entityType of the first lookup value*/
- get EntityType() {
- return this.Value && this.Value.length > 0
- ? this.Value[0].entityType
- : null;
- }
- /**Gets the formatted value of the first lookup value*/
- get FormattedValue() {
- return this.Value && this.Value.length > 0 ? this.Value[0].name : null;
- }
- get Value() {
- return this.Attribute.getValue() ?? null;
- }
- set Value(value) {
- this.Attribute.setValue(value);
- }
- /**
- * Sets the value of a lookup
- * @param id Guid of the record
- * @param entityType logicalname of the entity
- * @param name formatted value
- * @param append if true, adds value to the array instead of replacing it
- */
- setLookupValue(id, entityType, name, append = false) {
- try {
- if (!id)
- throw new Error(`no id parameter was provided.`);
- if (!entityType)
- throw new Error(`no entityType parameter was provided.`);
- id = XrmEx.normalizeGuid(id);
- const lookupValue = {
- id,
- entityType,
- name,
- };
- this.Value =
- append && this.Value ? this.Value.concat(lookupValue) : [lookupValue];
- return this;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Retrieves an entity record.
- * @param options (Optional) OData system query options, $select and $expand, to retrieve your data.
- * - Use the $select system query option to limit the properties returned by including a comma-separated
- * list of property names. This is an important performance best practice. If properties aren’t
- * specified using $select, all properties will be returned.
- * - Use the $expand system query option to control what data from related entities is returned. If you
- * just include the name of the navigation property, you’ll receive all the properties for related
- * records. You can limit the properties returned for related records using the $select system query
- * option in parentheses after the navigation property name. Use this for both single-valued and
- * collection-valued navigation properties.
- * - You can also specify multiple query options by using & to separate the query options.
- * @example options example:
- * options: $select=name&$expand=primarycontactid($select=contactid,fullname)
- * @returns On success, returns a promise containing a JSON object with the retrieved attributes and their values.
- * @see {@link https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/clientapi/reference/xrm-webapi/retrieverecord External Link: retrieveRecord (Client API reference)}
- */
- async retrieve(options) {
- try {
- if (!this.Id || !this.EntityType)
- return null;
- const record = await Xrm.WebApi.retrieveRecord(this.EntityType, this.Id, options);
- return record;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Adds an additional custom filter to the lookup, with the "AND" filter operator.
- * @param filter Specifies the filter, as a serialized FetchXML "filter" node.
- * @param entityLogicalName (Optional) The logical name of the entity.
- * @remarks If entityLogicalName is not specified, the filter will be applied to all entities
- * valid for the Lookup control.
- * @example Example filter:
- *
- *
- */
- addPreFilterToLookup(filterXml, entityLogicalName) {
- try {
- _addCustomFilter.controls = this.controls;
- this.controls.forEach((control) => {
- control.addPreSearch(_addCustomFilter);
- });
- this._customFilters.push(_addCustomFilter);
- return this;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- function _addCustomFilter() {
- _addCustomFilter.controls.forEach((control) => {
- control.addCustomFilter(filterXml, entityLogicalName);
- });
- }
- }
- /**
- * Adds an additional custom filter to the lookup, with the "AND" filter operator.
- * @param entityLogicalName (Optional) The logical name of the entity.
- * @param primaryAttributeIdName (Optional) The logical name of the primary key.
- * @param fetchXml Specifies the FetchXML used to filter.
- * @remarks If entityLogicalName is not specified, the filter will be applied to all entities
- * valid for the Lookup control.
- * @example Example fetchXml:
- *
- *
- *
- *
- *
- *
- */
- async addPreFilterToLookupAdvanced(entityLogicalName, primaryAttributeIdName, fetchXml) {
- try {
- const result = await Xrm.WebApi.online.retrieveMultipleRecords(entityLogicalName, "?fetchXml=" + fetchXml);
- const data = result.entities;
- let filteredEntities = "";
- _addCustomFilter.controls = this.controls;
- data.forEach((item) => {
- filteredEntities += `${item[primaryAttributeIdName]}`;
- });
- fetchXml = filteredEntities
- ? `${filteredEntities}`
- : ``;
- this.controls.forEach((control) => {
- control.addPreSearch(_addCustomFilter);
- });
- this._customFilters.push(_addCustomFilter);
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- function _addCustomFilter() {
- _addCustomFilter.controls.forEach((control) => {
- control.addCustomFilter(fetchXml, entityLogicalName);
- });
- }
- }
- /**
- * Removes all filters set on the current lookup attribute by using addPreFilterToLookup or addPreFilterToLookupAdvanced
- */
- clearPreFilterFromLookup() {
- try {
- this._customFilters.forEach((customFilter) => {
- this.controls.forEach((control) => {
- control.removePreSearch(customFilter);
- });
- });
- return this;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- }
- XrmEx.LookupField = LookupField;
- class OptionsetField extends Field {
- _control;
- Option;
- constructor(attributeName, option) {
- super(attributeName);
- this.Option = option;
- }
- getFormat() {
- return this.Attribute.getFormat();
- }
- getOption(value) {
- if (typeof value === "number") {
- return this.Attribute.getOption(value);
- }
- else {
- return this.Attribute.getOption(value);
- }
- }
- getOptions() {
- return this.Attribute.getOptions();
- }
- getSelectedOption() {
- return this.Attribute.getSelectedOption();
- }
- getText() {
- return this.Attribute.getText();
- }
- getInitialValue() {
- return this.Attribute.getInitialValue();
- }
- get Attribute() {
- return (this._attribute ??=
- Form.formContext.getAttribute(this.Name) ??
- XrmEx.throwError(`Field '${this.Name}' does not exist`));
- }
- get controls() {
- return this.Attribute.controls;
- }
- get control() {
- return (this._control ??=
- Form.formContext.getControl(this.Name) ??
- XrmEx.throwError(`Control '${this.Name}' does not exist`));
- }
- get Value() {
- return this.Attribute.getValue();
- }
- set Value(value) {
- if (typeof value == "number")
- this.Attribute.setValue(value);
- else
- this.Attribute.setValue(this.Option[value]);
- }
- /**
- * Adds an option.
- *
- * @param values an array with the option values to add
- * @param index (Optional) zero-based index of the option.
- *
- * @remarks This method does not check that the values within the options you add are valid.
- * If index is not provided, the new option will be added to the end of the list.
- */
- addOption(values, index) {
- try {
- if (!Array.isArray(values))
- throw new Error(`values is not an Array:\nvalues: '${values}'`);
- const optionSetValues = this.control.getAttribute().getOptions() ?? [];
- for (const element of optionSetValues) {
- if (values.includes(element.value)) {
- this.control.addOption(element, index);
- }
- }
- return this;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Removes the option matching the value.
- *
- * @param value The value.
- */
- removeOption(values) {
- try {
- if (!Array.isArray(values))
- throw new Error(`values is not an Array:\nvalues: '${values}'`);
- const optionSetValues = this.control.getAttribute().getOptions() ?? [];
- for (const element of optionSetValues) {
- if (values.includes(element.value)) {
- this.control.removeOption(element.value);
- }
- }
- return this;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- /**
- * Clears all options.
- */
- clearOptions() {
- try {
- this.control.clearOptions();
- return this;
- }
- catch (error) {
- throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- }
- XrmEx.OptionsetField = OptionsetField;
- class Section {
- Name;
- _section;
- parentTab;
- constructor(name) {
- this.Name = name;
- }
- get Section() {
- return (this._section ??=
- this.parentTab.sections.get(this.Name) ??
- XrmEx.throwError(`The section '${this.Name}' was not found on the form.`));
- }
- getName() {
- return this.Section.getName();
- }
- getParent() {
- return this.Section.getParent();
- }
- controls;
- setVisible(visible) {
- return this.Section.setVisible(visible);
- }
- getVisible() {
- return this.Section.getVisible();
- }
- getLabel() {
- return this.Section.getLabel();
- }
- setLabel(label) {
- return this.Section.setLabel(label);
- }
- }
- XrmEx.Section = Section;
- class Tab {
- Name;
- _tab;
- Section;
- constructor(name, section) {
- this.Name = name;
- this.Section = section;
- for (let key in section) {
- section[key].parentTab = this;
- }
- }
- sections;
- get Tab() {
- return (this._tab ??=
- Form.formContext.ui.tabs.get(this.Name) ??
- XrmEx.throwError(`The tab '${this.Name}' was not found on the form.`));
- }
- addTabStateChange(handler) {
- return this.Tab.addTabStateChange(handler);
- }
- getDisplayState() {
- return this.Tab.getDisplayState();
- }
- getName() {
- return this.Tab.getName();
- }
- getParent() {
- return this.Tab.getParent();
- }
- removeTabStateChange(handler) {
- return this.Tab.removeTabStateChange(handler);
- }
- setDisplayState(displayState) {
- return this.Tab.setDisplayState(displayState);
- }
- setVisible(visible) {
- return this.Tab.setVisible(visible);
- }
- getVisible() {
- return this.Tab.getVisible();
- }
- getLabel() {
- return this.Tab.getLabel();
- }
- setLabel(label) {
- return this.Tab.setLabel(label);
- }
- setFocus() {
- return this.Tab.setFocus();
- }
- }
- XrmEx.Tab = Tab;
- class GridControl {
- Name;
- _gridControl;
- constructor(name) {
- this.Name = name;
- }
- get GridControl() {
- return ((this._gridControl ??=
- Form.formContext.getControl(this.Name)) ??
- XrmEx.throwError(`The grid '${this.Name}' was not found on the form.`));
- }
- get Grid() {
- return this.GridControl.getGrid();
- }
- addOnLoad(handler) {
- return this.GridControl.addOnLoad(handler);
- }
- getContextType() {
- return this.GridControl.getContextType();
- }
- getEntityName() {
- return this.GridControl.getEntityName();
- }
- getFetchXml() {
- return this.GridControl.getFetchXml();
- }
- getGrid() {
- return this.GridControl.getGrid();
- }
- getRelationship() {
- return this.GridControl.getRelationship();
- }
- getUrl(client) {
- return this.GridControl.getUrl(client);
- }
- getViewSelector() {
- return this.GridControl.getViewSelector();
- }
- openRelatedGrid() {
- return this.GridControl.openRelatedGrid();
- }
- refresh() {
- return this.GridControl.refresh();
- }
- refreshRibbon() {
- return this.GridControl.refreshRibbon();
- }
- removeOnLoad(handler) {
- return this.GridControl.removeOnLoad(handler);
- }
- getControlType() {
- return this.GridControl.getControlType();
- }
- getName() {
- return this.GridControl.getName();
- }
- getParent() {
- return this.GridControl.getParent();
- }
- getLabel() {
- return this.GridControl.getLabel();
- }
- setLabel(label) {
- return this.GridControl.setLabel(label);
- }
- getVisible() {
- return this.GridControl.getVisible();
- }
- setVisible(visible) {
- return this.GridControl.setVisible(visible);
- }
- }
- XrmEx.GridControl = GridControl;
-})(XrmEx || (XrmEx = {}));
-//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWHJtRXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvWHJtRXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOERBQThEO0FBa0M5RCxJQUFVLEtBQUssQ0FvNUNkO0FBcDVDRCxXQUFVLEtBQUs7SUFDYjs7OztPQUlHO0lBQ0gsU0FBZ0IsVUFBVSxDQUFDLFlBQW9CO1FBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUZlLGdCQUFVLGFBRXpCLENBQUE7SUFDRDs7O09BR0c7SUFDSCxTQUFnQixhQUFhO1FBQzNCLElBQUk7WUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzFCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkUsTUFBTSxtQkFBbUIsR0FDdkIsVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRSxNQUFNLGlCQUFpQixHQUNyQixtQkFBbUIsRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNuRCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVuRSxPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUFDLE9BQU8sS0FBVSxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQzNEO0lBQ0gsQ0FBQztJQWRlLG1CQUFhLGdCQWM1QixD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RSxDQUFDO1FBQ3JDLENBQUM7UUFDRCxRQUFRLENBQUMsS0FBYTtZQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxVQUFVO1lBQ1IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxVQUFVLENBQUMsT0FBZ0I7WUFDekIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxDQUFDO0tBQ0Y7SUF6RVksaUJBQVcsY0F5RXZCLENBQUE7QUFDSCxDQUFDLEVBcDVDUyxLQUFLLEtBQUwsS0FBSyxRQW81Q2QiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vbm9kZV9tb2R1bGVzL0B0eXBlcy94cm0vaW5kZXguZC50c1wiIC8+XG4vKipcbiAqIFJlcHJlc2VudHMgYSBwYXJhbWV0ZXIgZm9yIGEgcmVxdWVzdC5cbiAqIEB0eXBlIHtPYmplY3R9IFJlcXVlc3RQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci5cbiAqIEBwcm9wZXJ0eSB7J0Jvb2xlYW4nIHwgJ0RhdGVUaW1lJyB8ICdEZWNpbWFsJyB8ICdFbnRpdHknIHwgJ0VudGl0eUNvbGxlY3Rpb24nIHwgJ0VudGl0eVJlZmVyZW5jZScgfCAnRmxvYXQnIHwgJ0ludGVnZXInIHwgJ01vbmV5JyB8ICdQaWNrbGlzdCcgfCAnU3RyaW5nJ30gVHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkgeyp9IFZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuXG4gKi9cbnR5cGUgUmVxdWVzdFBhcmFtZXRlciA9IHtcbiAgTmFtZTogc3RyaW5nO1xuICBUeXBlOlxuICAgIHwgXCJCb29sZWFuXCJcbiAgICB8IFwiRGF0ZVRpbWVcIlxuICAgIHwgXCJEZWNpbWFsXCJcbiAgICB8IFwiRW50aXR5XCJcbiAgICB8IFwiRW50aXR5Q29sbGVjdGlvblwiXG4gICAgfCBcIkVudGl0eVJlZmVyZW5jZVwiXG4gICAgfCBcIkZsb2F0XCJcbiAgICB8IFwiSW50ZWdlclwiXG4gICAgfCBcIk1vbmV5XCJcbiAgICB8IFwiUGlja2xpc3RcIlxuICAgIHwgXCJTdHJpbmdcIjtcbiAgVmFsdWU6IGFueTtcbn07XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYW4gZW50aXR5LlxuICogQHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFRoZSBJRCBvZiB0aGUgZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudGl0eVR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgZW50aXR5LlxuICovXG50eXBlIEVudGl0eVJlZmVyZW5jZSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgZW50aXR5VHlwZTogc3RyaW5nO1xufTtcbm5hbWVzcGFjZSBYcm1FeCB7XG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVycm9yTWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIHRocm93LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBBbHdheXMgdGhyb3dzIGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gdGhyb3dFcnJvcihlcnJvck1lc3NhZ2U6IHN0cmluZyk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbi5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRNZXRob2ROYW1lKCk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgICBjb25zdCBzdGFja1RyYWNlID0gZXJyb3Iuc3RhY2s/LnNwbGl0KFwiXFxuXCIpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpO1xuICAgICAgY29uc3QgY2FsbGluZ0Z1bmN0aW9uTGluZSA9XG4gICAgICAgIHN0YWNrVHJhY2UgJiYgc3RhY2tUcmFjZS5sZW5ndGggPj0gMyA/IHN0YWNrVHJhY2VbMl0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWVNYXRjaCA9XG4gICAgICAgIGNhbGxpbmdGdW5jdGlvbkxpbmU/Lm1hdGNoKC9hdFxccysoW15cXHNdKylcXHMrXFwoLyk7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWVNYXRjaCA/IGZ1bmN0aW9uTmFtZU1hdGNoWzFdIDogXCJcIjtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uTmFtZTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LmdldE1ldGhvZE5hbWU6XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpZmljYXRpb24gZm9yIGFuIGFwcCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBsZXZlbCwgYW5kIGxldHMgeW91IHNwZWNpZnkgd2hldGhlciB0byBzaG93IGEgY2xvc2UgYnV0dG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gdGhlIG5vdGlmaWNhdGlvbi5cbiAgICogQHBhcmFtIHsnU1VDQ0VTUycgfCAnRVJST1InIHwgJ1dBUk5JTkcnIHwgJ0lORk8nfSBsZXZlbCAtIFRoZSBsZXZlbCBvZiB0aGUgbm90aWZpY2F0aW9uLiBDYW4gYmUgJ1NVQ0NFU1MnLCAnRVJST1InLCAnV0FSTklORycsIG9yICdJTkZPJy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbc2hvd0Nsb3NlQnV0dG9uPWZhbHNlXSAtIFdoZXRoZXIgdG8gc2hvdyBhIGNsb3NlIGJ1dHRvbiBvbiB0aGUgbm90aWZpY2F0aW9uLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBJRCBvZiB0aGUgY3JlYXRlZCBub3RpZmljYXRpb24uXG4gICAqL1xuICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkR2xvYmFsTm90aWZpY2F0aW9uKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBsZXZlbDogXCJTVUNDRVNTXCIgfCBcIkVSUk9SXCIgfCBcIldBUk5JTkdcIiB8IFwiSU5GT1wiLFxuICAgIHNob3dDbG9zZUJ1dHRvbiA9IGZhbHNlXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbGV2ZWxNYXAgPSB7XG4gICAgICBTVUNDRVNTOiAxLFxuICAgICAgRVJST1I6IDIsXG4gICAgICBXQVJOSU5HOiAzLFxuICAgICAgSU5GTzogNCxcbiAgICB9O1xuICAgIGNvbnN0IG1lc3NhZ2VMZXZlbCA9IGxldmVsTWFwW2xldmVsXSB8fCBsZXZlbE1hcC5JTkZPO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHtcbiAgICAgIHR5cGU6IDIsXG4gICAgICBsZXZlbDogbWVzc2FnZUxldmVsLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHNob3dDbG9zZUJ1dHRvbixcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgWHJtLkFwcC5hZGRHbG9iYWxOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7Z2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDbGVhcnMgYSBub3RpZmljYXRpb24gaW4gdGhlIGFwcCB3aXRoIHRoZSBnaXZlbiB1bmlxdWUgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bmlxdWVJZCAtIFRoZSB1bmlxdWUgSUQgb2YgdGhlIG5vdGlmaWNhdGlvbiB0byBjbGVhci5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBub3RpZmljYXRpb24gaGFzIGJlZW4gY2xlYXJlZC5cbiAgICovXG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHbG9iYWxOb3RpZmljYXRpb24oXG4gICAgdW5pcXVlSWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgWHJtLkFwcC5jbGVhckdsb2JhbE5vdGlmaWNhdGlvbih1bmlxdWVJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke2dldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBieSB1c2luZyBpdHMgc2NoZW1hIG5hbWUgYXMga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW52aXJvbm1lbnRWYXJpYWJsZVNjaGVtYU5hbWUgLSBUaGUgc2NoZW1hIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFbnZpcm9ubWVudFZhcmlhYmxlVmFsdWUoXG4gICAgZW52aXJvbm1lbnRWYXJpYWJsZVNjaGVtYU5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBleGVjdXRlRnVuY3Rpb24oXCJSZXRyaWV2ZUVudmlyb25tZW50VmFyaWFibGVWYWx1ZVwiLCBbXG4gICAgICB7XG4gICAgICAgIE5hbWU6IFwiRGVmaW5pdGlvblNjaGVtYU5hbWVcIixcbiAgICAgICAgVHlwZTogXCJTdHJpbmdcIixcbiAgICAgICAgVmFsdWU6IGVudmlyb25tZW50VmFyaWFibGVTY2hlbWFOYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuICAvKipcbiAgICogQSBtYXAgb2YgQ1JNIGRhdGEgdHlwZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB0eXBlIG5hbWVzLCBzdHJ1Y3R1cmFsIHByb3BlcnRpZXMsIGFuZCBKYXZhU2NyaXB0IHR5cGVzLlxuICAgKiBAdHlwZSB7T2JqZWN0LjxzdHJpbmcsIHsgdHlwZU5hbWU6IHN0cmluZywgc3RydWN0dXJhbFByb3BlcnR5OiBudW1iZXIsIGpzVHlwZTogc3RyaW5nIH0+fVxuICAgKi9cbiAgbGV0IHR5cGVNYXAgPSB7XG4gICAgU3RyaW5nOiB7IHR5cGVOYW1lOiBcIkVkbS5TdHJpbmdcIiwgc3RydWN0dXJhbFByb3BlcnR5OiAxLCBqc1R5cGU6IFwic3RyaW5nXCIgfSxcbiAgICBJbnRlZ2VyOiB7IHR5cGVOYW1lOiBcIkVkbS5JbnQzMlwiLCBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsIGpzVHlwZTogXCJudW1iZXJcIiB9LFxuICAgIEJvb2xlYW46IHtcbiAgICAgIHR5cGVOYW1lOiBcIkVkbS5Cb29sZWFuXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsXG4gICAgICBqc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgRGF0ZVRpbWU6IHtcbiAgICAgIHR5cGVOYW1lOiBcIkVkbS5EYXRlVGltZU9mZnNldFwiLFxuICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiAxLFxuICAgICAganNUeXBlOiBcIm9iamVjdFwiLFxuICAgIH0sXG4gICAgRW50aXR5UmVmZXJlbmNlOiB7XG4gICAgICB0eXBlTmFtZTogXCJtc2NybS5jcm1iYXNlZW50aXR5XCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDUsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBEZWNpbWFsOiB7XG4gICAgICB0eXBlTmFtZTogXCJFZG0uRGVjaW1hbFwiLFxuICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiAxLFxuICAgICAganNUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgRW50aXR5OiB7XG4gICAgICB0eXBlTmFtZTogXCJtc2NybS5jcm1iYXNlZW50aXR5XCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDUsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBFbnRpdHlDb2xsZWN0aW9uOiB7XG4gICAgICB0eXBlTmFtZTogXCJDb2xsZWN0aW9uKG1zY3JtLmNybWJhc2VlbnRpdHkpXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDQsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBGbG9hdDogeyB0eXBlTmFtZTogXCJFZG0uRG91YmxlXCIsIHN0cnVjdHVyYWxQcm9wZXJ0eTogMSwganNUeXBlOiBcIm51bWJlclwiIH0sXG4gICAgTW9uZXk6IHsgdHlwZU5hbWU6IFwiRWRtLkRlY2ltYWxcIiwgc3RydWN0dXJhbFByb3BlcnR5OiAxLCBqc1R5cGU6IFwibnVtYmVyXCIgfSxcbiAgICBQaWNrbGlzdDoge1xuICAgICAgdHlwZU5hbWU6IFwiRWRtLkludDMyXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsXG4gICAgICBqc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcmVxdWVzdCBwYXJhbWV0ZXIgaXMgb2YgYSBzdXBwb3J0ZWQgdHlwZSBhbmQgaGFzIGEgdmFsaWQgdmFsdWUuXG4gICAqIEBwYXJhbSB7UmVxdWVzdFBhcmFtZXRlcn0gcmVxdWVzdFBhcmFtZXRlciAtIFRoZSByZXF1ZXN0IHBhcmFtZXRlciB0byBjaGVjay5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUgb3IgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gY2hlY2tSZXF1ZXN0UGFyYW1ldGVyVHlwZShcbiAgICByZXF1ZXN0UGFyYW1ldGVyOiBSZXF1ZXN0UGFyYW1ldGVyXG4gICk6IHZvaWQge1xuICAgIGlmICghdHlwZU1hcFtyZXF1ZXN0UGFyYW1ldGVyLlR5cGVdKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIHByb3BlcnR5IHR5cGUgJHtyZXF1ZXN0UGFyYW1ldGVyLlR5cGV9IG9mIHRoZSBwcm9wZXJ0eSAke3JlcXVlc3RQYXJhbWV0ZXIuTmFtZX0gaXMgbm90IHN1cHBvcnRlZC5gXG4gICAgICApO1xuICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IHR5cGVNYXBbcmVxdWVzdFBhcmFtZXRlci5UeXBlXS5qc1R5cGU7XG4gICAgY29uc3QgYWN0dWFsVHlwZSA9IHR5cGVvZiByZXF1ZXN0UGFyYW1ldGVyLlZhbHVlO1xuICAgIGNvbnN0IGludmFsaWRUeXBlTWVzc2FnZSA9IGBUaGUgdmFsdWUgJHtyZXF1ZXN0UGFyYW1ldGVyLlZhbHVlfVxcbm9mIHRoZSBwcm9wZXJ0eSAke3JlcXVlc3RQYXJhbWV0ZXIuTmFtZX1cXG5pcyBub3Qgb2YgdGhlIGV4cGVjdGVkIHR5cGUgJHtyZXF1ZXN0UGFyYW1ldGVyLlR5cGV9LmA7XG4gICAgaWYgKFxuICAgICAgcmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkVudGl0eVJlZmVyZW5jZVwiIHx8XG4gICAgICByZXF1ZXN0UGFyYW1ldGVyLlR5cGUgPT09IFwiRW50aXR5XCJcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUgfHxcbiAgICAgICAgIXJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUuaGFzT3duUHJvcGVydHkoXCJpZFwiKSB8fFxuICAgICAgICAhcmVxdWVzdFBhcmFtZXRlci5WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcImVudGl0eVR5cGVcIilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHR5cGVNYXBbXG4gICAgICAgIHJlcXVlc3RQYXJhbWV0ZXIuVHlwZVxuICAgICAgXS50eXBlTmFtZSA9IGBtc2NybS4ke3JlcXVlc3RQYXJhbWV0ZXIuVmFsdWUuZW50aXR5VHlwZX1gO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkVudGl0eUNvbGxlY3Rpb25cIikge1xuICAgICAgaWYgKFxuICAgICAgICAhQXJyYXkuaXNBcnJheShyZXF1ZXN0UGFyYW1ldGVyLlZhbHVlKSB8fFxuICAgICAgICByZXF1ZXN0UGFyYW1ldGVyLlZhbHVlLmV2ZXJ5KFxuICAgICAgICAgICh2KSA9PlxuICAgICAgICAgICAgdHlwZW9mIHYgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICAgICAgICF2IHx8XG4gICAgICAgICAgICAhdi5oYXNPd25Qcm9wZXJ0eShcImlkXCIpIHx8XG4gICAgICAgICAgICAhdi5oYXNPd25Qcm9wZXJ0eShcImVudGl0eVR5cGVcIilcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihpbnZhbGlkVHlwZU1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkRhdGVUaW1lXCIpIHtcbiAgICAgIGlmICghKHJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGFjdHVhbFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGFuIEFjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBUaGUgdW5pcXVlIG5hbWUgb2YgdGhlIGFjdGlvbi5cbiAgICogQHBhcmFtIHtSZXF1ZXN0UGFyYW1ldGVyW119IHJlcXVlc3RQYXJhbWV0ZXJzIC0gQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZSBwYXJhbWV0ZXIgbmFtZSwgdHlwZSBhbmQgdmFsdWUuXG4gICAqIEBwYXJhbSB7RW50aXR5UmVmZXJlbmNlfSBbYm91bmRFbnRpdHldIC0gQW4gb3B0aW9uYWwgRW50aXR5UmVmZXJlbmNlIG9mIHRoZSBib3VuZCBlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IC0gQSBQcm9taXNlIHdpdGggdGhlIHJlcXVlc3QgcmVzcG9uc2UuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUgb3IgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gICAqL1xuICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFjdGlvbihcbiAgICBhY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgcmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJbXSxcbiAgICBib3VuZEVudGl0eT86IEVudGl0eVJlZmVyZW5jZVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlckRlZmluaXRpb246IGFueSA9IHt9O1xuICAgIGlmIChib3VuZEVudGl0eSlcbiAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgICBOYW1lOiBcImVudGl0eVwiLFxuICAgICAgICBWYWx1ZTogYm91bmRFbnRpdHksXG4gICAgICAgIFR5cGU6IFwiRW50aXR5UmVmZXJlbmNlXCIsXG4gICAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RQYXJhbWV0ZXIgb2YgcmVxdWVzdFBhcmFtZXRlcnMpIHtcbiAgICAgIGNoZWNrUmVxdWVzdFBhcmFtZXRlclR5cGUocmVxdWVzdFBhcmFtZXRlcik7XG4gICAgICBwYXJhbWV0ZXJEZWZpbml0aW9uW3JlcXVlc3RQYXJhbWV0ZXIuTmFtZV0gPSB7XG4gICAgICAgIHR5cGVOYW1lOiB0eXBlTWFwW3JlcXVlc3RQYXJhbWV0ZXIuVHlwZV0udHlwZU5hbWUsXG4gICAgICAgIHN0cnVjdHVyYWxQcm9wZXJ0eTogdHlwZU1hcFtyZXF1ZXN0UGFyYW1ldGVyLlR5cGVdLnN0cnVjdHVyYWxQcm9wZXJ0eSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7XG4gICAgICAgIGdldE1ldGFkYXRhOiAoKSA9PiAoe1xuICAgICAgICAgIGJvdW5kUGFyYW1ldGVyOiBib3VuZEVudGl0eSA/IFwiZW50aXR5XCIgOiBudWxsLFxuICAgICAgICAgIG9wZXJhdGlvblR5cGU6IDAsXG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogYWN0aW9uTmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJUeXBlczogcGFyYW1ldGVyRGVmaW5pdGlvbixcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgLi4ucmVxdWVzdFBhcmFtZXRlcnMubWFwKChwKSA9PiAoeyBbcC5OYW1lXTogcC5WYWx1ZSB9KSlcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgWHJtLldlYkFwaS5vbmxpbmUuZXhlY3V0ZShyZXEpO1xuICAgIGlmIChyZXNwb25zZS5vaykgcmV0dXJuIHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiByZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBGdW5jdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZSAtIFRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7UmVxdWVzdFBhcmFtZXRlcltdfSByZXF1ZXN0UGFyYW1ldGVycyAtIEFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB0aGUgcGFyYW1ldGVyIG5hbWUsIHR5cGUgYW5kIHZhbHVlLlxuICAgKiBAcGFyYW0ge0VudGl0eVJlZmVyZW5jZX0gW2JvdW5kRW50aXR5XSAtIEFuIG9wdGlvbmFsIEVudGl0eVJlZmVyZW5jZSBvZiB0aGUgYm91bmQgZW50aXR5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSAtIEEgUHJvbWlzZSB3aXRoIHRoZSByZXF1ZXN0IHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHJlcXVlc3QgcGFyYW1ldGVyIGlzIG5vdCBvZiBhIHN1cHBvcnRlZCB0eXBlIG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlLlxuICAgKi9cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVGdW5jdGlvbihcbiAgICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICByZXF1ZXN0UGFyYW1ldGVyczogUmVxdWVzdFBhcmFtZXRlcltdLFxuICAgIGJvdW5kRW50aXR5PzogRW50aXR5UmVmZXJlbmNlXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyRGVmaW5pdGlvbjogYW55ID0ge307XG4gICAgaWYgKGJvdW5kRW50aXR5KVxuICAgICAgcmVxdWVzdFBhcmFtZXRlcnMucHVzaCh7XG4gICAgICAgIE5hbWU6IFwiZW50aXR5XCIsXG4gICAgICAgIFZhbHVlOiBib3VuZEVudGl0eSxcbiAgICAgICAgVHlwZTogXCJFbnRpdHlSZWZlcmVuY2VcIixcbiAgICAgIH0pO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdFBhcmFtZXRlciBvZiByZXF1ZXN0UGFyYW1ldGVycykge1xuICAgICAgY2hlY2tSZXF1ZXN0UGFyYW1ldGVyVHlwZShyZXF1ZXN0UGFyYW1ldGVyKTtcbiAgICAgIHBhcmFtZXRlckRlZmluaXRpb25bcmVxdWVzdFBhcmFtZXRlci5OYW1lXSA9IHtcbiAgICAgICAgdHlwZU5hbWU6IHR5cGVNYXBbcmVxdWVzdFBhcmFtZXRlci5UeXBlXS50eXBlTmFtZSxcbiAgICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiB0eXBlTWFwW3JlcXVlc3RQYXJhbWV0ZXIuVHlwZV0uc3RydWN0dXJhbFByb3BlcnR5LFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHtcbiAgICAgICAgZ2V0TWV0YWRhdGE6ICgpID0+ICh7XG4gICAgICAgICAgYm91bmRQYXJhbWV0ZXI6IGJvdW5kRW50aXR5ID8gXCJlbnRpdHlcIiA6IG51bGwsXG4gICAgICAgICAgb3BlcmF0aW9uVHlwZTogMSxcbiAgICAgICAgICBvcGVyYXRpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgcGFyYW1ldGVyVHlwZXM6IHBhcmFtZXRlckRlZmluaXRpb24sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICAgIC4uLnJlcXVlc3RQYXJhbWV0ZXJzLm1hcCgocCkgPT4gKHsgW3AuTmFtZV06IHAuVmFsdWUgfSkpXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFhybS5XZWJBcGkub25saW5lLmV4ZWN1dGUocmVxKTtcbiAgICBpZiAocmVzcG9uc2Uub2spIHJldHVybiByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gcmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgR1VJRCBsb3dlcmNhc2UgYW5kIHJlbW92ZXMgYnJhY2tldHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gVGhlIEdVSUQgdG8gbm9ybWFsaXplLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBub3JtYWxpemVkIEdVSUQuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplR3VpZChndWlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgZ3VpZCAhPT0gXCJzdHJpbmdcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXgubm9ybWFsaXplR3VpZDpcXG4nJHtndWlkfScgaXMgbm90IGEgc3RyaW5nYCk7XG4gICAgcmV0dXJuIGd1aWQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9be31dL2csIFwiXCIpO1xuICB9XG4gIC8qKlxuICAgKiBPcGVucyBhIGRpYWxvZyB3aXRoIGR5bmFtaWMgaGVpZ2h0IGFuZCB3aWR0aCBiYXNlZCBvbiB0ZXh0IGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGRpYWxvZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gLSBBIFByb21pc2Ugd2l0aCB0aGUgZGlhbG9nIHJlc3BvbnNlLlxuICAgKi9cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5BbGVydERpYWxvZyhcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHRleHQ6IHN0cmluZ1xuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gdGV4dC5zcGxpdCgvXFxyXFxufFxccnxcXG4vKTtcbiAgICAgIGxldCBhZGRpdGlvbmFsUm93cyA9IDA7XG4gICAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBsZXQgd2lkdGggPSBnZXRUZXh0V2lkdGgoXG4gICAgICAgICAgcm93LFxuICAgICAgICAgIFwiMXJlbSBTZWdvZSBVSSBSZWd1bGFyLCBTZWdvZVVJLCBTZWdvZSBVSVwiXG4gICAgICAgICk7XG4gICAgICAgIGlmICh3aWR0aCA+IDk0MCkge1xuICAgICAgICAgIGFkZGl0aW9uYWxSb3dzICs9IHdpZHRoIC8gOTQwO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxvbmdlc3RSb3cgPSByb3dzLnJlZHVjZShcbiAgICAgICAgKGFjYywgcm93KSA9PiAocm93Lmxlbmd0aCA+IGFjYy5sZW5ndGggPyByb3cgOiBhY2MpLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbihcbiAgICAgICAgZ2V0VGV4dFdpZHRoKGxvbmdlc3RSb3csIFwiMXJlbSBTZWdvZSBVSSBSZWd1bGFyLCBTZWdvZVVJLCBTZWdvZSBVSVwiKSxcbiAgICAgICAgMTAwMFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IDEwOSArIChyb3dzLmxlbmd0aCArIGFkZGl0aW9uYWxSb3dzKSAqIDIwO1xuICAgICAgcmV0dXJuIGF3YWl0IFhybS5OYXZpZ2F0aW9uLm9wZW5BbGVydERpYWxvZyhcbiAgICAgICAge1xuICAgICAgICAgIGNvbmZpcm1CdXR0b25MYWJlbDogXCJPa1wiLFxuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtnZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXNlcyBjYW52YXMubWVhc3VyZVRleHQgdG8gY29tcHV0ZSBhbmQgcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgZ2l2ZW4gdGV4dCBvZiBnaXZlbiBmb250IGluIHBpeGVscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIHJlbmRlcmVkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb250IFRoZSBjc3MgZm9udCBkZXNjcmlwdG9yIHRoYXQgdGV4dCBpcyB0byBiZSByZW5kZXJlZCB3aXRoIChlLmcuIFwiYm9sZCAxNHB4IHZlcmRhbmFcIikuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExODI0MS9jYWxjdWxhdGUtdGV4dC13aWR0aC13aXRoLWphdmFzY3JpcHQvMjEwMTUzOTMjMjEwMTUzOTNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRUZXh0V2lkdGgodGV4dDogc3RyaW5nLCBmb250OiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGNvbnRleHQuZm9udCA9IGZvbnQ7XG4gICAgICBjb25zdCBtZXRyaWNzID0gY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KTtcbiAgICAgIHJldHVybiBtZXRyaWNzLndpZHRoO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGZvcm0gaW4gRHluYW1pY3MgMzY1LlxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEZvcm0ge1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX2Zvcm1Db250ZXh0OiBYcm0uRm9ybUNvbnRleHQ7XG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfZXhlY3V0aW9uQ29udGV4dDogWHJtLkV2ZW50cy5FdmVudENvbnRleHQ7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuICAgIC8qKkdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZm9ybSBjb250ZXh0Ki9cbiAgICBzdGF0aWMgZ2V0IGZvcm1Db250ZXh0KCk6IFhybS5Gb3JtQ29udGV4dCB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybUNvbnRleHQ7XG4gICAgfVxuICAgIC8qKkdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZXhlY3V0aW8gY29udGV4dCovXG4gICAgc3RhdGljIGdldCBleGVjdXRpb25Db250ZXh0KCk6IFhybS5FdmVudHMuRXZlbnRDb250ZXh0IHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0O1xuICAgIH1cbiAgICAvKipHZXRzIGEgbG9va3VwIHZhbHVlIHRoYXQgcmVmZXJlbmNlcyB0aGUgcmVjb3JkLiovXG4gICAgc3RhdGljIGdldCBlbnRpdHlSZWZlcmVuY2UoKSB7XG4gICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC5kYXRhLmVudGl0eS5nZXRFbnRpdHlSZWZlcmVuY2UoKTtcbiAgICB9XG4gICAgLyoqU2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBmb3JtIGNvbnRleHQqL1xuICAgIHN0YXRpYyBzZXQgZm9ybUNvbnRleHQoY29udGV4dDogWHJtLkZvcm1Db250ZXh0IHwgWHJtLkV2ZW50cy5FdmVudENvbnRleHQpIHtcbiAgICAgIGlmIChcImdldEZvcm1Db250ZXh0XCIgaW4gY29udGV4dCkge1xuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5fZm9ybUNvbnRleHQgPSBjb250ZXh0LmdldEZvcm1Db250ZXh0KCk7XG4gICAgICB9IGVsc2UgaWYgKFwiZGF0YVwiIGluIGNvbnRleHQpIHRoaXMuX2Zvcm1Db250ZXh0ID0gY29udGV4dDtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBYcm1FeC5Gb3JtLnNldEZvcm1Db250ZXh0OiBUaGUgZXhlY3V0aW9uQ29udGV4dCBvciBmb3JtQ29udGV4dCB3YXMgbm90IHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uYFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipTZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0Ki9cbiAgICBzdGF0aWMgc2V0IGV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICBjb250ZXh0OiBYcm0uRm9ybUNvbnRleHQgfCBYcm0uRXZlbnRzLkV2ZW50Q29udGV4dFxuICAgICkge1xuICAgICAgaWYgKFwiZ2V0Rm9ybUNvbnRleHRcIiBpbiBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLl9mb3JtQ29udGV4dCA9IGNvbnRleHQuZ2V0Rm9ybUNvbnRleHQoKTtcbiAgICAgIH0gZWxzZSBpZiAoXCJkYXRhXCIgaW4gY29udGV4dCkgdGhpcy5fZm9ybUNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFhybUV4LkZvcm0uc2V0RXhlY3V0aW9uQ29udGV4dDogVGhlIGV4ZWN1dGlvbkNvbnRleHQgb3IgZm9ybUNvbnRleHQgd2FzIG5vdCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLmBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgZnJvbSB0eXBlIGNyZWF0ZSovXG4gICAgc3RhdGljIGdldCBJc0NyZWF0ZSgpIHtcbiAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmdldEZvcm1UeXBlKCkgPT0gMTtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgZnJvbSB0eXBlIHVwZGF0ZSovXG4gICAgc3RhdGljIGdldCBJc1VwZGF0ZSgpIHtcbiAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmdldEZvcm1UeXBlKCkgPT0gMjtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgbm90IGZyb20gdHlwZSBjcmVhdGUqL1xuICAgIHN0YXRpYyBnZXQgSXNOb3RDcmVhdGUoKSB7XG4gICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC51aS5nZXRGb3JtVHlwZSgpICE9IDE7XG4gICAgfVxuICAgIC8qKlJldHVybnMgdHJ1ZSBpZiBmb3JtIGlzIG5vdCBmcm9tIHR5cGUgdXBkYXRlKi9cbiAgICBzdGF0aWMgZ2V0IElzTm90VXBkYXRlKCkge1xuICAgICAgcmV0dXJuIEZvcm0uZm9ybUNvbnRleHQudWkuZ2V0Rm9ybVR5cGUoKSAhPSAyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyBhIGZvcm0gbGV2ZWwgbm90aWZpY2F0aW9uLiBBbnkgbnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMgY2FuIGJlIGRpc3BsYXllZCBhbmQgd2lsbCByZW1haW4gdW50aWwgcmVtb3ZlZCB1c2luZyBjbGVhckZvcm1Ob3RpZmljYXRpb24uXG4gICAgICogVGhlIGhlaWdodCBvZiB0aGUgbm90aWZpY2F0aW9uIGFyZWEgaXMgbGltaXRlZCBzbyBlYWNoIG5ldyBtZXNzYWdlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRvcC5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgdGV4dCBvZiB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIGxldmVsIFRoZSBsZXZlbCBvZiB0aGUgbm90aWZpY2F0aW9uIHdoaWNoIGRlZmluZXMgaG93IHRoZSBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkLCBzdWNoIGFzIHRoZSBpY29uLlxuICAgICAqIEVSUk9SOiBOb3RpZmljYXRpb24gd2lsbCB1c2UgdGhlIHN5c3RlbSBlcnJvciBpY29uLlxuICAgICAqIFdBUk5JTkc6IE5vdGlmaWNhdGlvbiB3aWxsIHVzZSB0aGUgc3lzdGVtIHdhcm5pbmcgaWNvbi5cbiAgICAgKiBJTkZPOiBOb3RpZmljYXRpb24gd2lsbCB1c2UgdGhlIHN5c3RlbSBpbmZvIGljb24uXG4gICAgICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbm90aWZpY2F0aW9uIHdoaWNoIGlzIHVzZWQgd2l0aCBjbGVhckZvcm1Ob3RpZmljYXRpb24gdG8gcmVtb3ZlIHRoZSBub3RpZmljYXRpb24uXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRGb3JtTm90aWZpY2F0aW9uKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgbGV2ZWw6IFhybS5Gb3JtTm90aWZpY2F0aW9uTGV2ZWwsXG4gICAgICB1bmlxdWVJZDogc3RyaW5nXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC51aS5zZXRGb3JtTm90aWZpY2F0aW9uKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgdW5pcXVlSWRcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGZvcm0gbm90aWZpY2F0aW9uIGRlc2NyaWJlZCBieSB1bmlxdWVJZC5cbiAgICAgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiBpdCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIHN0YXRpYyByZW1vdmVGb3JtTm90aWZpY2F0aW9uKHVuaXF1ZUlkOiBzdHJpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmNsZWFyRm9ybU5vdGlmaWNhdGlvbih1bmlxdWVJZCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlY29yZCBpcyBzYXZlZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkT25TYXZlRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5lbnRpdHkuYWRkT25TYXZlKGhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBPblNhdmUgaXMgY29tcGxldGUuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIuXG4gICAgICogQHJlbWFya3MgQWRkZWQgaW4gOS4yXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcG93ZXJhcHBzL2RldmVsb3Blci9tb2RlbC1kcml2ZW4tYXBwcy9jbGllbnRhcGkvcmVmZXJlbmNlL2V2ZW50cy9wb3N0c2F2ZSBFeHRlcm5hbCBMaW5rOiBQb3N0U2F2ZSBFdmVudCBEb2N1bWVudGF0aW9ufVxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRPblBvc3RTYXZlRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5lbnRpdHkuYWRkT25Qb3N0U2F2ZShoYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGZvcm0gZGF0YSBpcyBsb2FkZWQuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGZvcm0gZGF0YSBsb2Fkcy4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgZXZlbnQgaGFuZGxlciBwaXBlbGluZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkT25Mb2FkRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5hZGRPbkxvYWQoaGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBmdW5jdGlvbiByZWZlcmVuY2UuXG4gICAgICovXG4gICAgc3RhdGljIGFkZE9uQ2hhbmdlRXZlbnRIYW5kbGVyKFxuICAgICAgZmllbGRzOiBGaWVsZFtdLFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXSxcbiAgICAgIGV4ZWN1dGU/OiBib29sZWFuXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaGFuZGxlcnMpKSB7XG4gICAgICAgICAgaGFuZGxlcnMgPSBbaGFuZGxlcnNdO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtoYW5kbGVyfScgaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5hZGRPbkNoYW5nZShoYW5kbGVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChleGVjdXRlKSB7XG4gICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5BdHRyaWJ1dGUuZmlyZU9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXNlZCB0byBleGVjdXRlIG1ldGhvZHMgcmVsYXRlZCB0byBhIHNpbmdsZSBBdHRyaWJ1dGVcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBGaWVsZCBpbXBsZW1lbnRzIFhybS5BdHRyaWJ1dGVzLkF0dHJpYnV0ZSB7XG4gICAgcHVibGljIHN0YXRpYyBhbGxGaWVsZHM6IEZpZWxkW10gPSBbXTtcblxuICAgIHB1YmxpYyByZWFkb25seSBOYW1lITogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfYXR0cmlidXRlPzogWHJtLkF0dHJpYnV0ZXMuQXR0cmlidXRlO1xuXG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlTmFtZTogc3RyaW5nKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0ZpZWxkID0gRmllbGQuYWxsRmllbGRzLmZpbmQoXG4gICAgICAgIChmKSA9PiBmLk5hbWUgPT09IGF0dHJpYnV0ZU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoZXhpc3RpbmdGaWVsZCkge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdGaWVsZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XG4gICAgICBGaWVsZC5hbGxGaWVsZHMucHVzaCh0aGlzKTtcbiAgICB9XG4gICAgc2V0VmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0QXR0cmlidXRlVHlwZSgpOiBYcm0uQXR0cmlidXRlcy5BdHRyaWJ1dGVUeXBlIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVUeXBlKCk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5BdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpO1xuICAgIH1cbiAgICBnZXRJc0RpcnR5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldElzRGlydHkoKTtcbiAgICB9XG4gICAgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5FbnRpdHkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFBhcmVudCgpO1xuICAgIH1cbiAgICBnZXRSZXF1aXJlZExldmVsKCk6IFhybS5BdHRyaWJ1dGVzLlJlcXVpcmVtZW50TGV2ZWwge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFJlcXVpcmVkTGV2ZWwoKTtcbiAgICB9XG4gICAgZ2V0U3VibWl0TW9kZSgpOiBYcm0uU3VibWl0TW9kZSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0U3VibWl0TW9kZSgpO1xuICAgIH1cbiAgICBnZXRVc2VyUHJpdmlsZWdlKCk6IFhybS5Qcml2aWxlZ2Uge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFVzZXJQcml2aWxlZ2UoKTtcbiAgICB9XG4gICAgcmVtb3ZlT25DaGFuZ2UoaGFuZGxlcjogWHJtLkV2ZW50cy5BdHRyaWJ1dGUuQ2hhbmdlRXZlbnRIYW5kbGVyKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUucmVtb3ZlT25DaGFuZ2UoaGFuZGxlcik7XG4gICAgfVxuICAgIHNldFN1Ym1pdE1vZGUoc3VibWl0TW9kZTogWHJtLlN1Ym1pdE1vZGUpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRTdWJtaXRNb2RlKHN1Ym1pdE1vZGUpO1xuICAgIH1cbiAgICBnZXRWYWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBzZXRJc1ZhbGlkKGlzVmFsaWQ6IGJvb2xlYW4sIG1lc3NhZ2U/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRJc1ZhbGlkKGlzVmFsaWQsIG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgQXR0cmlidXRlKCk6IFhybS5BdHRyaWJ1dGVzLkF0dHJpYnV0ZSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKFxuICAgICAgICAgIGBUaGUgYXR0cmlidXRlICcke3RoaXMuTmFtZX0nIHdhcyBub3QgZm91bmQgb24gdGhlIGZvcm0uYFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbnRyb2xzKCk6IFhybS5Db2xsZWN0aW9uLkl0ZW1Db2xsZWN0aW9uPFhybS5Db250cm9scy5TdGFuZGFyZENvbnRyb2w+IHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5jb250cm9scztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBWYWx1ZSgpOiBhbnkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICB0aGlzLkF0dHJpYnV0ZS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGNvbnRyb2wtbG9jYWwgbm90aWZpY2F0aW9uIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgaXQgc3VjY2VlZHMsIGZhbHNlIGlmIGl0IGZhaWxzLlxuICAgICAqIEByZW1hcmtzICAgICBXaGVuIHRoaXMgbWV0aG9kIGlzIHVzZWQgb24gTWljcm9zb2Z0IER5bmFtaWNzIENSTSBmb3IgdGFibGV0cyBhIHJlZCBcIlhcIiBpY29uXG4gICAgICogICAgICAgICAgICAgIGFwcGVhcnMgbmV4dCB0byB0aGUgY29udHJvbC4gVGFwcGluZyBvbiB0aGUgaWNvbiB3aWxsIGRpc3BsYXkgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgcHVibGljIHNldE5vdGlmaWNhdGlvbihtZXNzYWdlOiBzdHJpbmcsIHVuaXF1ZUlkOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghbWVzc2FnZSkgdGhyb3cgbmV3IEVycm9yKGBubyBtZXNzYWdlIHdhcyBwcm92aWRlZC5gKTtcbiAgICAgICAgaWYgKCF1bmlxdWVJZCkgdGhyb3cgbmV3IEVycm9yKGBubyB1bmlxdWVJZCB3YXMgcHJvdmlkZWQuYCk7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT5cbiAgICAgICAgICBjb250cm9sLnNldE5vdGlmaWNhdGlvbihtZXNzYWdlLCB1bmlxdWVJZClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IHN0YXRlLlxuICAgICAqIEBwYXJhbSB2aXNpYmxlIHRydWUgdG8gc2hvdywgZmFsc2UgdG8gaGlkZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IGNvbnRyb2wuc2V0VmlzaWJsZSh2aXNpYmxlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wgdG8gZWl0aGVyIGVuYWJsZWQsIG9yIGRpc2FibGVkLlxuICAgICAqIEBwYXJhbSBkaXNhYmxlZCB0cnVlIHRvIGRpc2FibGUsIGZhbHNlIHRvIGVuYWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWQoZGlzYWJsZWQ6IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4gY29udHJvbC5zZXREaXNhYmxlZChkaXNhYmxlZCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJlcXVpcmVkIGxldmVsLlxuICAgICAqIEBwYXJhbSByZXF1aXJlbWVudExldmVsIFRoZSByZXF1aXJlbWVudCBsZXZlbCwgYXMgZWl0aGVyIFwibm9uZVwiLCBcInJlcXVpcmVkXCIsIG9yIFwicmVjb21tZW5kZWRcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXF1aXJlZExldmVsKFxuICAgICAgcmVxdWlyZW1lbnRMZXZlbDogWHJtLkF0dHJpYnV0ZXMuUmVxdWlyZW1lbnRMZXZlbFxuICAgICk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0UmVxdWlyZWRMZXZlbChyZXF1aXJlbWVudExldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByZXF1aXJlZCBsZXZlbC5cbiAgICAgKiBAcGFyYW0gcmVxdWlyZWQgVGhlIHJlcXVpcmVtZW50IGxldmVsLCBhcyBlaXRoZXIgZmFsc2UgZm9yIFwibm9uZVwiIG9yIHRydWUgZm9yIFwicmVxdWlyZWRcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXF1aXJlZChyZXF1aXJlZDogYm9vbGVhbik6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0UmVxdWlyZWRMZXZlbChyZXF1aXJlZCA/IFwicmVxdWlyZWRcIiA6IFwibm9uZVwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipGaXJlIGFsbCBcIm9uIGNoYW5nZVwiIGV2ZW50IGhhbmRsZXJzLiAqL1xuICAgIHB1YmxpYyBmaXJlT25DaGFuZ2UoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLkF0dHJpYnV0ZS5maXJlT25DaGFuZ2UoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgaGFuZGxlciBvciBhbiBhcnJheSBvZiBoYW5kbGVycyB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgaXMgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0gaGFuZGxlcnMgVGhlIGZ1bmN0aW9uIHJlZmVyZW5jZSBvciBhbiBhcnJheSBvZiBmdW5jdGlvbiByZWZlcmVuY2VzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRPbkNoYW5nZShcbiAgICAgIGhhbmRsZXJzOlxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJcbiAgICAgICAgfCBYcm0uRXZlbnRzLkNvbnRleHRTZW5zaXRpdmVIYW5kbGVyW11cbiAgICApOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgICB0aGlzLkF0dHJpYnV0ZS5yZW1vdmVPbkNoYW5nZShoYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuQXR0cmlidXRlLmFkZE9uQ2hhbmdlKGhhbmRsZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2hhbmRsZXJzfScgaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgICAgICAgICB0aGlzLkF0dHJpYnV0ZS5yZW1vdmVPbkNoYW5nZShoYW5kbGVycyk7XG4gICAgICAgICAgdGhpcy5BdHRyaWJ1dGUuYWRkT25DaGFuZ2UoaGFuZGxlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYW4gZXJyb3Igb3IgcmVjb21tZW5kYXRpb24gbm90aWZpY2F0aW9uIGZvciBhIGNvbnRyb2wsIGFuZCBsZXRzIHlvdSBzcGVjaWZ5IGFjdGlvbnMgdG8gZXhlY3V0ZSBiYXNlZCBvbiB0aGUgbm90aWZpY2F0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGROb3RpZmljYXRpb24oXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBub3RpZmljYXRpb25MZXZlbDogXCJFUlJPUlwiIHwgXCJSRUNPTU1FTkRBVElPTlwiLFxuICAgICAgdW5pcXVlSWQ6IHN0cmluZyxcbiAgICAgIGFjdGlvbnM/OiBYcm0uQ29udHJvbHMuQ29udHJvbE5vdGlmaWNhdGlvbkFjdGlvbltdXG4gICAgKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXVuaXF1ZUlkKSB0aHJvdyBuZXcgRXJyb3IoYG5vIHVuaXF1ZUlkIHdhcyBwcm92aWRlZC5gKTtcbiAgICAgICAgaWYgKGFjdGlvbnMgJiYgIUFycmF5LmlzQXJyYXkoYWN0aW9ucykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHRoZSBhY3Rpb24gcGFyYW1ldGVyIGlzIG5vdCBhbiBhcnJheSBvZiBDb250cm9sTm90aWZpY2F0aW9uQWN0aW9uYFxuICAgICAgICAgICk7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkTm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBbbWVzc2FnZV0sXG4gICAgICAgICAgICBub3RpZmljYXRpb25MZXZlbDogbm90aWZpY2F0aW9uTGV2ZWwsXG4gICAgICAgICAgICB1bmlxdWVJZDogdW5pcXVlSWQsXG4gICAgICAgICAgICBhY3Rpb25zOiBhY3Rpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBub3RpZmljYXRpb24gaWRlbnRpZmllZCBieSB1bmlxdWVJZC5cbiAgICAgKiBAcGFyYW0gdW5pcXVlSWQgKE9wdGlvbmFsKSBVbmlxdWUgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0IHN1Y2NlZWRzLCBmYWxzZSBpZiBpdCBmYWlscy5cbiAgICAgKiBAcmVtYXJrcyBJZiB0aGUgdW5pcXVlSWQgcGFyYW1ldGVyIGlzIG5vdCB1c2VkLCB0aGUgY3VycmVudCBub3RpZmljYXRpb24gc2hvd24gd2lsbCBiZSByZW1vdmVkLlxuICAgICAqL1xuICAgIHJlbW92ZU5vdGlmaWNhdGlvbih1bmlxdWVJZDogc3RyaW5nKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb250cm9sLmNsZWFyTm90aWZpY2F0aW9uKHVuaXF1ZUlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBUZXh0RmllbGRcbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZTtcbiAgICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlKTtcbiAgICB9XG4gICAgZ2V0TWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0TWF4TGVuZ3RoKCk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpIGFzIFhybS5BdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZUZvcm1hdDtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCkgPz8gbnVsbDtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIE51bWJlckZpZWxkXG4gICAgZXh0ZW5kcyBGaWVsZFxuICAgIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuTnVtYmVyQXR0cmlidXRlXG4gIHtcbiAgICBwcm90ZWN0ZWQgZGVjbGFyZSBfYXR0cmlidXRlOiBYcm0uQXR0cmlidXRlcy5OdW1iZXJBdHRyaWJ1dGU7XG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyKGF0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRm9ybWF0IHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRGb3JtYXQoKSBhcyBYcm0uQXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRNYXgoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRNYXgoKTtcbiAgICB9XG4gICAgZ2V0TWluKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0TWluKCk7XG4gICAgfVxuICAgIGdldFByZWNpc2lvbigpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFByZWNpc2lvbigpO1xuICAgIH1cbiAgICBzZXRQcmVjaXNpb24ocHJlY2lzaW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRQcmVjaXNpb24ocHJlY2lzaW9uKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCkgPz8gbnVsbDtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIERhdGVGaWVsZCBleHRlbmRzIEZpZWxkIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuRGF0ZUF0dHJpYnV0ZSB7XG4gICAgcHJvdGVjdGVkIGRlY2xhcmUgX2F0dHJpYnV0ZTogWHJtLkF0dHJpYnV0ZXMuRGF0ZUF0dHJpYnV0ZTtcbiAgICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlKTtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLkRhdGVBdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpIGFzIFhybS5BdHRyaWJ1dGVzLkRhdGVBdHRyaWJ1dGVGb3JtYXQ7XG4gICAgfVxuICAgIGdldCBBdHRyaWJ1dGUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCAnJHt0aGlzLk5hbWV9JyBkb2VzIG5vdCBleGlzdGApKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRyb2xzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmNvbnRyb2xzO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogRGF0ZSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKSA/PyBudWxsO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IERhdGUpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIEJvb2xlYW5GaWVsZFxuICAgIGV4dGVuZHMgRmllbGRcbiAgICBpbXBsZW1lbnRzIFhybS5BdHRyaWJ1dGVzLkJvb2xlYW5BdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLkJvb2xlYW5BdHRyaWJ1dGU7XG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyKGF0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGdldEF0dHJpYnV0ZVR5cGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVHlwZSgpO1xuICAgIH1cbiAgICBnZXRJbml0aWFsVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0SW5pdGlhbFZhbHVlKCk7XG4gICAgfVxuICAgIGdldCBBdHRyaWJ1dGUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCAnJHt0aGlzLk5hbWV9JyBkb2VzIG5vdCBleGlzdGApKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRyb2xzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmNvbnRyb2xzO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKSA/PyBudWxsO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0T3B0aW9uU2V0RmllbGQ8T3B0aW9ucyBleHRlbmRzIE9wdGlvblZhbHVlcz5cbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5NdWx0aVNlbGVjdE9wdGlvblNldEF0dHJpYnV0ZVxuICB7XG4gICAgcHJvdGVjdGVkIGRlY2xhcmUgX2F0dHJpYnV0ZTogWHJtLkF0dHJpYnV0ZXMuTXVsdGlTZWxlY3RPcHRpb25TZXRBdHRyaWJ1dGU7XG4gICAgT3B0aW9uOiBPcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgb3B0aW9uPzogT3B0aW9ucykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlTmFtZSk7XG4gICAgICB0aGlzLk9wdGlvbiA9IG9wdGlvbjtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLk9wdGlvblNldEF0dHJpYnV0ZUZvcm1hdCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0Rm9ybWF0KCkgYXMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRPcHRpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyk6IFhybS5PcHRpb25TZXRWYWx1ZSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRPcHRpb24odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGdldE9wdGlvbnMoKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbnMoKTtcbiAgICB9XG4gICAgZ2V0U2VsZWN0ZWRPcHRpb24oKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFNlbGVjdGVkT3B0aW9uKCk7XG4gICAgfVxuICAgIGdldFRleHQoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFRleHQoKTtcbiAgICB9XG4gICAgZ2V0SW5pdGlhbFZhbHVlKCk6IG51bWJlcltdIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJbml0aWFsVmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBudW1iZXJbXSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKTtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiAoa2V5b2YgT3B0aW9ucylbXSB8IG51bWJlcltdKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2ID09IFwibnVtYmVyXCIpIHZhbHVlcy5wdXNoKHYpO1xuICAgICAgICAgIGVsc2UgdmFsdWVzLnB1c2godGhpcy5PcHRpb25bdl0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0VmFsdWUodmFsdWVzKTtcbiAgICAgIH0gZWxzZSBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCBWYWx1ZSAnJHt2YWx1ZX0nIGlzIG5vdCBhbiBBcnJheWApO1xuICAgIH1cbiAgfVxuICBleHBvcnQgY2xhc3MgTG9va3VwRmllbGRcbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5Mb29rdXBBdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLkxvb2t1cEF0dHJpYnV0ZTtcbiAgICBwcm90ZWN0ZWQgX2N1c3RvbUZpbHRlcnM6IGFueSA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgICBzdXBlcihhdHRyaWJ1dGUpO1xuICAgIH1cbiAgICBnZXRJc1BhcnR5TGlzdCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJc1BhcnR5TGlzdCgpO1xuICAgIH1cbiAgICBnZXQgQXR0cmlidXRlKCkge1xuICAgICAgcmV0dXJuICh0aGlzLl9hdHRyaWJ1dGUgPz89XG4gICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZ2V0QXR0cmlidXRlKHRoaXMuTmFtZSkgPz9cbiAgICAgICAgWHJtRXgudGhyb3dFcnJvcihgRmllbGQgJyR7dGhpcy5OYW1lfScgZG9lcyBub3QgZXhpc3RgKSk7XG4gICAgfVxuICAgIGdldCBjb250cm9scygpIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5jb250cm9scztcbiAgICB9XG4gICAgLyoqR2V0cyB0aGUgaWQgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IElkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuVmFsdWUgJiYgdGhpcy5WYWx1ZS5sZW5ndGggPiAwXG4gICAgICAgID8gWHJtRXgubm9ybWFsaXplR3VpZCh0aGlzLlZhbHVlWzBdLmlkKVxuICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIC8qKkdldHMgdGhlIGVudGl0eVR5cGUgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IEVudGl0eVR5cGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5WYWx1ZSAmJiB0aGlzLlZhbHVlLmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLlZhbHVlWzBdLmVudGl0eVR5cGVcbiAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICAvKipHZXRzIHRoZSBmb3JtYXR0ZWQgdmFsdWUgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IEZvcm1hdHRlZFZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuVmFsdWUgJiYgdGhpcy5WYWx1ZS5sZW5ndGggPiAwID8gdGhpcy5WYWx1ZVswXS5uYW1lIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0IFZhbHVlKCk6IFhybS5Mb29rdXBWYWx1ZVtdIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpID8/IG51bGw7XG4gICAgfVxuICAgIHNldCBWYWx1ZSh2YWx1ZTogWHJtLkxvb2t1cFZhbHVlW10pIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBsb29rdXBcbiAgICAgKiBAcGFyYW0gaWQgR3VpZCBvZiB0aGUgcmVjb3JkXG4gICAgICogQHBhcmFtIGVudGl0eVR5cGUgbG9naWNhbG5hbWUgb2YgdGhlIGVudGl0eVxuICAgICAqIEBwYXJhbSBuYW1lIGZvcm1hdHRlZCB2YWx1ZVxuICAgICAqIEBwYXJhbSBhcHBlbmQgaWYgdHJ1ZSwgYWRkcyB2YWx1ZSB0byB0aGUgYXJyYXkgaW5zdGVhZCBvZiByZXBsYWNpbmcgaXRcbiAgICAgKi9cbiAgICBzZXRMb29rdXBWYWx1ZShcbiAgICAgIGlkOiBzdHJpbmcsXG4gICAgICBlbnRpdHlUeXBlOiBhbnksXG4gICAgICBuYW1lOiBhbnksXG4gICAgICBhcHBlbmQgPSBmYWxzZVxuICAgICk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKGBubyBpZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkLmApO1xuICAgICAgICBpZiAoIWVudGl0eVR5cGUpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBlbnRpdHlUeXBlIHBhcmFtZXRlciB3YXMgcHJvdmlkZWQuYCk7XG4gICAgICAgIGlkID0gWHJtRXgubm9ybWFsaXplR3VpZChpZCk7XG4gICAgICAgIGNvbnN0IGxvb2t1cFZhbHVlID0ge1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGVudGl0eVR5cGUsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5WYWx1ZSA9XG4gICAgICAgICAgYXBwZW5kICYmIHRoaXMuVmFsdWUgPyB0aGlzLlZhbHVlLmNvbmNhdChsb29rdXBWYWx1ZSkgOiBbbG9va3VwVmFsdWVdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYW4gZW50aXR5IHJlY29yZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAoT3B0aW9uYWwpIE9EYXRhIHN5c3RlbSBxdWVyeSBvcHRpb25zLCAkc2VsZWN0IGFuZCAkZXhwYW5kLCB0byByZXRyaWV2ZSB5b3VyIGRhdGEuXG4gICAgICogLSBVc2UgdGhlICRzZWxlY3Qgc3lzdGVtIHF1ZXJ5IG9wdGlvbiB0byBsaW1pdCB0aGUgcHJvcGVydGllcyByZXR1cm5lZCBieSBpbmNsdWRpbmcgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgKiAgIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMuIFRoaXMgaXMgYW4gaW1wb3J0YW50IHBlcmZvcm1hbmNlIGJlc3QgcHJhY3RpY2UuIElmIHByb3BlcnRpZXMgYXJlbuKAmXRcbiAgICAgKiAgIHNwZWNpZmllZCB1c2luZyAkc2VsZWN0LCBhbGwgcHJvcGVydGllcyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIC0gVXNlIHRoZSAkZXhwYW5kIHN5c3RlbSBxdWVyeSBvcHRpb24gdG8gY29udHJvbCB3aGF0IGRhdGEgZnJvbSByZWxhdGVkIGVudGl0aWVzIGlzIHJldHVybmVkLiBJZiB5b3VcbiAgICAgKiAgIGp1c3QgaW5jbHVkZSB0aGUgbmFtZSBvZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSwgeW914oCZbGwgcmVjZWl2ZSBhbGwgdGhlIHByb3BlcnRpZXMgZm9yIHJlbGF0ZWRcbiAgICAgKiAgIHJlY29yZHMuIFlvdSBjYW4gbGltaXQgdGhlIHByb3BlcnRpZXMgcmV0dXJuZWQgZm9yIHJlbGF0ZWQgcmVjb3JkcyB1c2luZyB0aGUgJHNlbGVjdCBzeXN0ZW0gcXVlcnlcbiAgICAgKiAgIG9wdGlvbiBpbiBwYXJlbnRoZXNlcyBhZnRlciB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lLiBVc2UgdGhpcyBmb3IgYm90aCBzaW5nbGUtdmFsdWVkIGFuZFxuICAgICAqICAgY29sbGVjdGlvbi12YWx1ZWQgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzLlxuICAgICAqIC0gWW91IGNhbiBhbHNvIHNwZWNpZnkgbXVsdGlwbGUgcXVlcnkgb3B0aW9ucyBieSB1c2luZyAmIHRvIHNlcGFyYXRlIHRoZSBxdWVyeSBvcHRpb25zLlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPm9wdGlvbnMgZXhhbXBsZTo8L2NhcHRpb24+XG4gICAgICogb3B0aW9uczogJHNlbGVjdD1uYW1lJiRleHBhbmQ9cHJpbWFyeWNvbnRhY3RpZCgkc2VsZWN0PWNvbnRhY3RpZCxmdWxsbmFtZSlcbiAgICAgKiBAcmV0dXJucyBPbiBzdWNjZXNzLCByZXR1cm5zIGEgcHJvbWlzZSBjb250YWluaW5nIGEgSlNPTiBvYmplY3Qgd2l0aCB0aGUgcmV0cmlldmVkIGF0dHJpYnV0ZXMgYW5kIHRoZWlyIHZhbHVlcy5cbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9keW5hbWljczM2NS9jdXN0b21lci1lbmdhZ2VtZW50L2RldmVsb3Blci9jbGllbnRhcGkvcmVmZXJlbmNlL3hybS13ZWJhcGkvcmV0cmlldmVyZWNvcmQgRXh0ZXJuYWwgTGluazogcmV0cmlldmVSZWNvcmQgKENsaWVudCBBUEkgcmVmZXJlbmNlKX1cbiAgICAgKi9cbiAgICBhc3luYyByZXRyaWV2ZShvcHRpb25zOiBzdHJpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghdGhpcy5JZCB8fCAhdGhpcy5FbnRpdHlUeXBlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgWHJtLldlYkFwaS5yZXRyaWV2ZVJlY29yZChcbiAgICAgICAgICB0aGlzLkVudGl0eVR5cGUsXG4gICAgICAgICAgdGhpcy5JZCxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBhZGRpdGlvbmFsIGN1c3RvbSBmaWx0ZXIgdG8gdGhlIGxvb2t1cCwgd2l0aCB0aGUgXCJBTkRcIiBmaWx0ZXIgb3BlcmF0b3IuXG4gICAgICogQHBhcmFtIGZpbHRlciBTcGVjaWZpZXMgdGhlIGZpbHRlciwgYXMgYSBzZXJpYWxpemVkIEZldGNoWE1MIFwiZmlsdGVyXCIgbm9kZS5cbiAgICAgKiBAcGFyYW0gZW50aXR5TG9naWNhbE5hbWUgKE9wdGlvbmFsKSBUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBlbnRpdHkuXG4gICAgICogQHJlbWFya3MgICAgIElmIGVudGl0eUxvZ2ljYWxOYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBlbnRpdGllc1xuICAgICAqICAgICAgICAgICAgICB2YWxpZCBmb3IgdGhlIExvb2t1cCBjb250cm9sLlxuICAgICAqIEBleGFtcGxlICAgICBFeGFtcGxlIGZpbHRlcjogPGZpbHRlciB0eXBlPVwiYW5kXCI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIGF0dHJpYnV0ZT1cImFkZHJlc3MxX2NpdHlcIiBvcGVyYXRvcj1cImVxXCIgdmFsdWU9XCJSZWRtb25kXCIgLz5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAqL1xuICAgIGFkZFByZUZpbHRlclRvTG9va3VwKGZpbHRlclhtbDogc3RyaW5nLCBlbnRpdHlMb2dpY2FsTmFtZT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgX2FkZEN1c3RvbUZpbHRlci5jb250cm9scyA9IHRoaXMuY29udHJvbHM7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkUHJlU2VhcmNoKF9hZGRDdXN0b21GaWx0ZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fY3VzdG9tRmlsdGVycy5wdXNoKF9hZGRDdXN0b21GaWx0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfYWRkQ3VzdG9tRmlsdGVyKCkge1xuICAgICAgICBfYWRkQ3VzdG9tRmlsdGVyLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb250cm9sLmFkZEN1c3RvbUZpbHRlcihmaWx0ZXJYbWwsIGVudGl0eUxvZ2ljYWxOYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gYWRkaXRpb25hbCBjdXN0b20gZmlsdGVyIHRvIHRoZSBsb29rdXAsIHdpdGggdGhlIFwiQU5EXCIgZmlsdGVyIG9wZXJhdG9yLlxuICAgICAqIEBwYXJhbSBlbnRpdHlMb2dpY2FsTmFtZSAoT3B0aW9uYWwpIFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gcHJpbWFyeUF0dHJpYnV0ZUlkTmFtZSAoT3B0aW9uYWwpIFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5LlxuICAgICAqIEBwYXJhbSBmZXRjaFhtbCBTcGVjaWZpZXMgdGhlIEZldGNoWE1MIHVzZWQgdG8gZmlsdGVyLlxuICAgICAqIEByZW1hcmtzICAgICBJZiBlbnRpdHlMb2dpY2FsTmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZmlsdGVyIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgZW50aXRpZXNcbiAgICAgKiAgICAgICAgICAgICAgdmFsaWQgZm9yIHRoZSBMb29rdXAgY29udHJvbC5cbiAgICAgKiBAZXhhbXBsZSAgICAgRXhhbXBsZSBmZXRjaFhtbDogPGZldGNoPlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudGl0eSBuYW1lPVwiY29udGFjdFwiPlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBhdHRyaWJ1dGU9XCJhZGRyZXNzMV9jaXR5XCIgb3BlcmF0b3I9XCJlcVwiIHZhbHVlPVwiUmVkbW9uZFwiIC8+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudGl0eT5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmV0Y2g+XG4gICAgICovXG4gICAgYXN5bmMgYWRkUHJlRmlsdGVyVG9Mb29rdXBBZHZhbmNlZChcbiAgICAgIGVudGl0eUxvZ2ljYWxOYW1lOiBzdHJpbmcsXG4gICAgICBwcmltYXJ5QXR0cmlidXRlSWROYW1lOiBzdHJpbmcsXG4gICAgICBmZXRjaFhtbDogc3RyaW5nXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBYcm0uV2ViQXBpLm9ubGluZS5yZXRyaWV2ZU11bHRpcGxlUmVjb3JkcyhcbiAgICAgICAgICBlbnRpdHlMb2dpY2FsTmFtZSxcbiAgICAgICAgICBcIj9mZXRjaFhtbD1cIiArIGZldGNoWG1sXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXN1bHQuZW50aXRpZXM7XG4gICAgICAgIGxldCBmaWx0ZXJlZEVudGl0aWVzID0gXCJcIjtcbiAgICAgICAgX2FkZEN1c3RvbUZpbHRlci5jb250cm9scyA9IHRoaXMuY29udHJvbHM7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGZpbHRlcmVkRW50aXRpZXMgKz0gYDx2YWx1ZT4ke2l0ZW1bcHJpbWFyeUF0dHJpYnV0ZUlkTmFtZV19PC92YWx1ZT5gO1xuICAgICAgICB9KTtcbiAgICAgICAgZmV0Y2hYbWwgPSBmaWx0ZXJlZEVudGl0aWVzXG4gICAgICAgICAgPyBgPGZpbHRlcj48Y29uZGl0aW9uIGF0dHJpYnV0ZT0nJHtwcmltYXJ5QXR0cmlidXRlSWROYW1lfScgb3BlcmF0b3I9J2luJz4ke2ZpbHRlcmVkRW50aXRpZXN9PC9jb25kaXRpb24+PC9maWx0ZXI+YFxuICAgICAgICAgIDogYDxmaWx0ZXI+PGNvbmRpdGlvbiBhdHRyaWJ1dGU9JyR7cHJpbWFyeUF0dHJpYnV0ZUlkTmFtZX0nIG9wZXJhdG9yPSdudWxsJy8+PC9maWx0ZXI+YDtcbiAgICAgICAgdGhpcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgY29udHJvbC5hZGRQcmVTZWFyY2goX2FkZEN1c3RvbUZpbHRlcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9jdXN0b21GaWx0ZXJzLnB1c2goX2FkZEN1c3RvbUZpbHRlcik7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9hZGRDdXN0b21GaWx0ZXIoKSB7XG4gICAgICAgIF9hZGRDdXN0b21GaWx0ZXIuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkQ3VzdG9tRmlsdGVyKGZldGNoWG1sLCBlbnRpdHlMb2dpY2FsTmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBmaWx0ZXJzIHNldCBvbiB0aGUgY3VycmVudCBsb29rdXAgYXR0cmlidXRlIGJ5IHVzaW5nIGFkZFByZUZpbHRlclRvTG9va3VwIG9yIGFkZFByZUZpbHRlclRvTG9va3VwQWR2YW5jZWRcbiAgICAgKi9cbiAgICBjbGVhclByZUZpbHRlckZyb21Mb29rdXAoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9jdXN0b21GaWx0ZXJzLmZvckVhY2goXG4gICAgICAgICAgKGN1c3RvbUZpbHRlcjogWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnRyb2wucmVtb3ZlUHJlU2VhcmNoKGN1c3RvbUZpbHRlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHR5cGUgT3B0aW9uVmFsdWVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IG51bWJlcjtcbiAgfTtcbiAgZXhwb3J0IGNsYXNzIE9wdGlvbnNldEZpZWxkPE9wdGlvbnMgZXh0ZW5kcyBPcHRpb25WYWx1ZXM+XG4gICAgZXh0ZW5kcyBGaWVsZFxuICAgIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlXG4gIHtcbiAgICBwcm90ZWN0ZWQgZGVjbGFyZSBfYXR0cmlidXRlOiBYcm0uQXR0cmlidXRlcy5PcHRpb25TZXRBdHRyaWJ1dGU7XG4gICAgcHJvdGVjdGVkIF9jb250cm9sITogWHJtLkNvbnRyb2xzLk9wdGlvblNldENvbnRyb2w7XG4gICAgT3B0aW9uOiBPcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgb3B0aW9uPzogT3B0aW9ucykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlTmFtZSk7XG4gICAgICB0aGlzLk9wdGlvbiA9IG9wdGlvbjtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLk9wdGlvblNldEF0dHJpYnV0ZUZvcm1hdCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0Rm9ybWF0KCkgYXMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRPcHRpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyk6IFhybS5PcHRpb25TZXRWYWx1ZSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRPcHRpb24odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGdldE9wdGlvbnMoKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbnMoKTtcbiAgICB9XG4gICAgZ2V0U2VsZWN0ZWRPcHRpb24oKTogWHJtLk9wdGlvblNldFZhbHVlIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRTZWxlY3RlZE9wdGlvbigpO1xuICAgIH1cbiAgICBnZXRUZXh0KCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VGV4dCgpO1xuICAgIH1cbiAgICBnZXRJbml0aWFsVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJbml0aWFsVmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBjb250cm9sKCkge1xuICAgICAgcmV0dXJuICh0aGlzLl9jb250cm9sID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldENvbnRyb2wodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBDb250cm9sICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IGtleW9mIE9wdGlvbnMgfCBudW1iZXIpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIikgdGhpcy5BdHRyaWJ1dGUuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgZWxzZSB0aGlzLkF0dHJpYnV0ZS5zZXRWYWx1ZSh0aGlzLk9wdGlvblt2YWx1ZV0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIG9wdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgYW4gYXJyYXkgd2l0aCB0aGUgb3B0aW9uIHZhbHVlcyB0byBhZGRcbiAgICAgKiBAcGFyYW0gaW5kZXggKE9wdGlvbmFsKSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBvcHRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayB0aGF0IHRoZSB2YWx1ZXMgd2l0aGluIHRoZSBvcHRpb25zIHlvdSBhZGQgYXJlIHZhbGlkLlxuICAgICAqICAgICAgICAgIElmIGluZGV4IGlzIG5vdCBwcm92aWRlZCwgdGhlIG5ldyBvcHRpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAqL1xuICAgIGFkZE9wdGlvbih2YWx1ZXM6IG51bWJlcltdLCBpbmRleD86IG51bWJlcik6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZXMgaXMgbm90IGFuIEFycmF5OlxcbnZhbHVlczogJyR7dmFsdWVzfSdgKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uU2V0VmFsdWVzID0gdGhpcy5jb250cm9sLmdldEF0dHJpYnV0ZSgpLmdldE9wdGlvbnMoKSA/PyBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG9wdGlvblNldFZhbHVlcykge1xuICAgICAgICAgIGlmICh2YWx1ZXMuaW5jbHVkZXMoZWxlbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5hZGRPcHRpb24oZWxlbWVudCwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBvcHRpb24gbWF0Y2hpbmcgdGhlIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZS5cbiAgICAgKi9cbiAgICByZW1vdmVPcHRpb24odmFsdWVzOiBudW1iZXJbXSk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZXMgaXMgbm90IGFuIEFycmF5OlxcbnZhbHVlczogJyR7dmFsdWVzfSdgKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uU2V0VmFsdWVzID0gdGhpcy5jb250cm9sLmdldEF0dHJpYnV0ZSgpLmdldE9wdGlvbnMoKSA/PyBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG9wdGlvblNldFZhbHVlcykge1xuICAgICAgICAgIGlmICh2YWx1ZXMuaW5jbHVkZXMoZWxlbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5yZW1vdmVPcHRpb24oZWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBjbGVhck9wdGlvbnMoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2wuY2xlYXJPcHRpb25zKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBTZWN0aW9uIGltcGxlbWVudHMgWHJtLkNvbnRyb2xzLlNlY3Rpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSBOYW1lITogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfc2VjdGlvbj86IFhybS5Db250cm9scy5TZWN0aW9uO1xuICAgIHB1YmxpYyBwYXJlbnRUYWI/OiBYcm0uQ29udHJvbHMuVGFiO1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgICAgdGhpcy5OYW1lID0gbmFtZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBTZWN0aW9uKCk6IFhybS5Db250cm9scy5TZWN0aW9uIHtcbiAgICAgIHJldHVybiAodGhpcy5fc2VjdGlvbiA/Pz1cbiAgICAgICAgdGhpcy5wYXJlbnRUYWIuc2VjdGlvbnMuZ2V0KHRoaXMuTmFtZSkgPz9cbiAgICAgICAgWHJtRXgudGhyb3dFcnJvcihcbiAgICAgICAgICBgVGhlIHNlY3Rpb24gJyR7dGhpcy5OYW1lfScgd2FzIG5vdCBmb3VuZCBvbiB0aGUgZm9ybS5gXG4gICAgICAgICkpO1xuICAgIH1cbiAgICBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5TZWN0aW9uLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5Db250cm9scy5UYWIge1xuICAgICAgcmV0dXJuIHRoaXMuU2VjdGlvbi5nZXRQYXJlbnQoKTtcbiAgICB9XG4gICAgY29udHJvbHM6IFhybS5Db2xsZWN0aW9uLkl0ZW1Db2xsZWN0aW9uPFhybS5Db250cm9scy5Db250cm9sPjtcbiAgICBzZXRWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlNlY3Rpb24uc2V0VmlzaWJsZSh2aXNpYmxlKTtcbiAgICB9XG4gICAgZ2V0VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLlNlY3Rpb24uZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuU2VjdGlvbi5nZXRMYWJlbCgpO1xuICAgIH1cbiAgICBzZXRMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5TZWN0aW9uLnNldExhYmVsKGxhYmVsKTtcbiAgICB9XG4gIH1cbiAgdHlwZSBUYWJTZWN0aW9ucyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBTZWN0aW9uO1xuICB9O1xuICBleHBvcnQgY2xhc3MgVGFiPFNlY3Rpb25zIGV4dGVuZHMgVGFiU2VjdGlvbnM+IGltcGxlbWVudHMgWHJtLkNvbnRyb2xzLlRhYiB7XG4gICAgcHVibGljIHJlYWRvbmx5IE5hbWUhOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF90YWI/OiBYcm0uQ29udHJvbHMuVGFiO1xuICAgIFNlY3Rpb246IFNlY3Rpb25zO1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2VjdGlvbj86IFNlY3Rpb25zKSB7XG4gICAgICB0aGlzLk5hbWUgPSBuYW1lO1xuICAgICAgdGhpcy5TZWN0aW9uID0gc2VjdGlvbjtcbiAgICAgIGZvciAobGV0IGtleSBpbiBzZWN0aW9uKSB7XG4gICAgICAgIHNlY3Rpb25ba2V5XS5wYXJlbnRUYWIgPSB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICBzZWN0aW9uczogWHJtLkNvbGxlY3Rpb24uSXRlbUNvbGxlY3Rpb248WHJtLkNvbnRyb2xzLlNlY3Rpb24+O1xuXG4gICAgcHVibGljIGdldCBUYWIoKTogWHJtLkNvbnRyb2xzLlRhYiB7XG4gICAgICByZXR1cm4gKHRoaXMuX3RhYiA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC51aS50YWJzLmdldCh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYFRoZSB0YWIgJyR7dGhpcy5OYW1lfScgd2FzIG5vdCBmb3VuZCBvbiB0aGUgZm9ybS5gKSk7XG4gICAgfVxuICAgIGFkZFRhYlN0YXRlQ2hhbmdlKGhhbmRsZXI6IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXIpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5hZGRUYWJTdGF0ZUNoYW5nZShoYW5kbGVyKTtcbiAgICB9XG4gICAgZ2V0RGlzcGxheVN0YXRlKCk6IFhybS5EaXNwbGF5U3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLmdldERpc3BsYXlTdGF0ZSgpO1xuICAgIH1cbiAgICBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuZ2V0TmFtZSgpO1xuICAgIH1cbiAgICBnZXRQYXJlbnQoKTogWHJtLlVpIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5nZXRQYXJlbnQoKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFiU3RhdGVDaGFuZ2UoaGFuZGxlcjogWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlcik6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnJlbW92ZVRhYlN0YXRlQ2hhbmdlKGhhbmRsZXIpO1xuICAgIH1cbiAgICBzZXREaXNwbGF5U3RhdGUoZGlzcGxheVN0YXRlOiBYcm0uRGlzcGxheVN0YXRlKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuc2V0RGlzcGxheVN0YXRlKGRpc3BsYXlTdGF0ZSk7XG4gICAgfVxuICAgIHNldFZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnNldFZpc2libGUodmlzaWJsZSk7XG4gICAgfVxuICAgIGdldFZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLmdldExhYmVsKCk7XG4gICAgfVxuICAgIHNldExhYmVsKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5zZXRMYWJlbChsYWJlbCk7XG4gICAgfVxuICAgIHNldEZvY3VzKCk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnNldEZvY3VzKCk7XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBHcmlkQ29udHJvbCBpbXBsZW1lbnRzIFhybS5Db250cm9scy5HcmlkQ29udHJvbCB7XG4gICAgcHVibGljIHJlYWRvbmx5IE5hbWUhOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9ncmlkQ29udHJvbD86IFhybS5Db250cm9scy5HcmlkQ29udHJvbDtcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuTmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgR3JpZENvbnRyb2woKTogWHJtLkNvbnRyb2xzLkdyaWRDb250cm9sIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh0aGlzLl9ncmlkQ29udHJvbCA/Pz1cbiAgICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldENvbnRyb2w8WHJtLkNvbnRyb2xzLkdyaWRDb250cm9sPih0aGlzLk5hbWUpKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBUaGUgZ3JpZCAnJHt0aGlzLk5hbWV9JyB3YXMgbm90IGZvdW5kIG9uIHRoZSBmb3JtLmApXG4gICAgICApO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IEdyaWQoKTogWHJtLkNvbnRyb2xzLkdyaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0R3JpZCgpO1xuICAgIH1cbiAgICBhZGRPbkxvYWQoaGFuZGxlcjogWHJtLkV2ZW50cy5HcmlkQ29udHJvbC5Mb2FkRXZlbnRIYW5kbGVyKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5HcmlkQ29udHJvbC5hZGRPbkxvYWQoaGFuZGxlcik7XG4gICAgfVxuICAgIGdldENvbnRleHRUeXBlKCk6IFhybUVudW0uR3JpZENvbnRyb2xDb250ZXh0IHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldENvbnRleHRUeXBlKCk7XG4gICAgfVxuICAgIGdldEVudGl0eU5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldEVudGl0eU5hbWUoKTtcbiAgICB9XG4gICAgZ2V0RmV0Y2hYbWwoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldEZldGNoWG1sKCk7XG4gICAgfVxuICAgIGdldEdyaWQoKTogWHJtLkNvbnRyb2xzLkdyaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0R3JpZCgpO1xuICAgIH1cbiAgICBnZXRSZWxhdGlvbnNoaXAoKTogWHJtLkNvbnRyb2xzLkdyaWRSZWxhdGlvbnNoaXAge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0UmVsYXRpb25zaGlwKCk7XG4gICAgfVxuICAgIGdldFVybChjbGllbnQ/OiBYcm1FbnVtLkdyaWRDbGllbnQpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0VXJsKGNsaWVudCk7XG4gICAgfVxuICAgIGdldFZpZXdTZWxlY3RvcigpOiBYcm0uQ29udHJvbHMuVmlld1NlbGVjdG9yIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldFZpZXdTZWxlY3RvcigpO1xuICAgIH1cbiAgICBvcGVuUmVsYXRlZEdyaWQoKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5HcmlkQ29udHJvbC5vcGVuUmVsYXRlZEdyaWQoKTtcbiAgICB9XG4gICAgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlZnJlc2goKTtcbiAgICB9XG4gICAgcmVmcmVzaFJpYmJvbigpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlZnJlc2hSaWJib24oKTtcbiAgICB9XG4gICAgcmVtb3ZlT25Mb2FkKGhhbmRsZXI6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlbW92ZU9uTG9hZChoYW5kbGVyKTtcbiAgICB9XG4gICAgZ2V0Q29udHJvbFR5cGUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldENvbnRyb2xUeXBlKCk7XG4gICAgfVxuICAgIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5Db250cm9scy5TZWN0aW9uIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldFBhcmVudCgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0TGFiZWwoKTtcbiAgICB9XG4gICAgc2V0TGFiZWwobGFiZWw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuc2V0TGFiZWwobGFiZWwpO1xuICAgIH1cbiAgICBnZXRWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBzZXRWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnNldFZpc2libGUodmlzaWJsZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
\ No newline at end of file
diff --git a/build/package.json b/build/package.json
index 173045d..e151fd7 100644
--- a/build/package.json
+++ b/build/package.json
@@ -33,65 +33,9 @@
"access": "public"
},
"scripts": {
- "build": "npm run clean && npm run type:dts && npm run build:main && npm run format && npm run docs && npm run copy && npm run postbuild && npm run zip",
- "build:main": "tsc --build",
- "clean": "rimraf build/dist coverage nyc_output",
- "docs": "npx typedoc --plugin typedoc-plugin-markdown --out docs src/XrmEx.ts",
- "copy": "npm run copyPackage && npm run copyReadme && npm run copyEslint",
- "copyPackage": "node -e \"require('fs').cpSync('./package.json', './build/package.json');\"",
- "copyReadme": "node -e \"require('fs').cpSync('./README.md', './build/README.md');\"",
- "copyEslint": "node -e \"require('fs').cpSync('./.eslintrc.cjs', './build/.eslintrc.cjs');\"",
- "postbuild": "rimraf build/dist/tests",
- "zip": "npm-build-zip --destination=release/ --name=xrm-ex --name_only=true",
- "type:dts": "tsc --emitDeclarationOnly --project tsconfig.build.json",
- "type:check": "tsc --noEmit",
- "format": "prettier \"src/**/*.ts\" --write",
- "format:check": "prettier \"src/**/*.ts\" --check",
- "lint": "eslint src --ext .ts --fix",
- "lint:check": "eslint src --ext .ts",
- "test": "vitest run",
- "test:watch": "vitest watch",
- "test:coverage": "vitest run --coverage",
- "spell:check": "cspell \"{README.md,CODE_OF_CONDUCT.md,CONTRIBUTING.md,.github/*.md,src/**/*.ts}\"",
- "cz": "cz",
- "semantic-release": "semantic-release"
+ "build": "tsc --build"
},
"devDependencies": {
- "@aashutoshrathi/word-wrap": "^1.2.6",
- "@playwright/test": "^1.37.0",
- "@semantic-release/changelog": "^6.0.3",
- "@semantic-release/commit-analyzer": "^10.0.1",
- "@semantic-release/github": "^9.0.3",
- "@semantic-release/npm": "^10.0.4",
- "@semantic-release/release-notes-generator": "^11.0.3",
- "@swc/cli": "^0.1.62",
- "@swc/core": "^1.3.66",
- "@types/node": "^18.16.3",
- "@types/prompts": "^2.4.4",
- "@types/xrm": "^9.0.73",
- "@typescript-eslint/eslint-plugin": "^5.60.1",
- "@typescript-eslint/parser": "^5.60.0",
- "c8": "^8.0.0",
- "cspell": "^6.31.1",
- "eslint": "^8.43.0",
- "eslint-config-prettier": "^8.8.0",
- "eslint-import-resolver-typescript": "^3.5.5",
- "eslint-plugin-eslint-comments": "^3.2.0",
- "eslint-plugin-import": "^2.27.5",
- "eslint-plugin-simple-import-sort": "^10.0.0",
- "nyc": "^15.1.0",
- "prettier": "^2.8.8",
- "rimraf": "^5.0.1",
- "semantic-release": "^21.0.5",
- "source-map-support": "^0.5.21",
- "typedoc": "^0.24.8",
- "typedoc-plugin-markdown": "^3.15.3",
- "typescript": "^5.1.3",
- "vitest": "^0.32.2",
- "npm-build-zip": "^1.0.4"
- },
- "overrides": {
- "semver": "~7.5.3",
- "word-wrap": "npm:@aashutoshrathi/word-wrap"
+ "@types/xrm": "^9.0.73"
}
}
\ No newline at end of file
diff --git a/build/dist/src/XrmEx.d.ts b/build/src/XrmEx.d.ts
similarity index 100%
rename from build/dist/src/XrmEx.d.ts
rename to build/src/XrmEx.d.ts
diff --git a/build/src/XrmEx.js b/build/src/XrmEx.js
new file mode 100644
index 0000000..1e16590
--- /dev/null
+++ b/build/src/XrmEx.js
@@ -0,0 +1,1327 @@
+///
+var XrmEx;
+(function (XrmEx) {
+ /**
+ * Throws an error with the given error message.
+ * @param {string} errorMessage - The error message to throw.
+ * @throws {Error} - Always throws an error with the given error message.
+ */
+ function throwError(errorMessage) {
+ throw new Error(errorMessage);
+ }
+ XrmEx.throwError = throwError;
+ /**
+ * Returns the name of the calling function.
+ * @returns {string} - The name of the calling function.
+ */
+ function getMethodName() {
+ try {
+ const error = new Error();
+ const stackTrace = error.stack?.split("\n").map((line) => line.trim());
+ const callingFunctionLine = stackTrace && stackTrace.length >= 3 ? stackTrace[2] : undefined;
+ const functionNameMatch = callingFunctionLine?.match(/at\s+([^\s]+)\s+\(/);
+ const functionName = functionNameMatch ? functionNameMatch[1] : "";
+ return functionName;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.getMethodName:\n${error.message}`);
+ }
+ }
+ XrmEx.getMethodName = getMethodName;
+ /**
+ * Displays a notification for an app with the given message and level, and lets you specify whether to show a close button.
+ * @param {string} message - The message to display in the notification.
+ * @param {'SUCCESS' | 'ERROR' | 'WARNING' | 'INFO'} level - The level of the notification. Can be 'SUCCESS', 'ERROR', 'WARNING', or 'INFO'.
+ * @param {boolean} [showCloseButton=false] - Whether to show a close button on the notification. Defaults to false.
+ * @returns {Promise} - A promise that resolves with the ID of the created notification.
+ */
+ async function addGlobalNotification(message, level, showCloseButton = false) {
+ const levelMap = {
+ SUCCESS: 1,
+ ERROR: 2,
+ WARNING: 3,
+ INFO: 4,
+ };
+ const messageLevel = levelMap[level] || levelMap.INFO;
+ const notification = {
+ type: 2,
+ level: messageLevel,
+ message,
+ showCloseButton,
+ };
+ try {
+ return await Xrm.App.addGlobalNotification(notification);
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`);
+ }
+ }
+ XrmEx.addGlobalNotification = addGlobalNotification;
+ /**
+ * Clears a notification in the app with the given unique ID.
+ * @param {string} uniqueId - The unique ID of the notification to clear.
+ * @returns {Promise} - A promise that resolves when the notification has been cleared.
+ */
+ async function removeGlobalNotification(uniqueId) {
+ try {
+ return await Xrm.App.clearGlobalNotification(uniqueId);
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`);
+ }
+ }
+ XrmEx.removeGlobalNotification = removeGlobalNotification;
+ /**
+ * Retrieves the value of an environment variable by using its schema name as key.
+ * @param {string} environmentVariableSchemaName - The schema name of the environment variable to retrieve.
+ * @returns {Promise} - A promise that resolves with the value of the environment variable.
+ */
+ async function getEnvironmentVariableValue(environmentVariableSchemaName) {
+ return executeFunction("RetrieveEnvironmentVariableValue", [
+ {
+ Name: "DefinitionSchemaName",
+ Type: "String",
+ Value: environmentVariableSchemaName,
+ },
+ ]);
+ }
+ XrmEx.getEnvironmentVariableValue = getEnvironmentVariableValue;
+ /**
+ * A map of CRM data types to their corresponding type names, structural properties, and JavaScript types.
+ * @type {Object.}
+ */
+ let typeMap = {
+ String: { typeName: "Edm.String", structuralProperty: 1, jsType: "string" },
+ Integer: { typeName: "Edm.Int32", structuralProperty: 1, jsType: "number" },
+ Boolean: {
+ typeName: "Edm.Boolean",
+ structuralProperty: 1,
+ jsType: "boolean",
+ },
+ DateTime: {
+ typeName: "Edm.DateTimeOffset",
+ structuralProperty: 1,
+ jsType: "object",
+ },
+ EntityReference: {
+ typeName: "mscrm.crmbaseentity",
+ structuralProperty: 5,
+ jsType: "object",
+ },
+ Decimal: {
+ typeName: "Edm.Decimal",
+ structuralProperty: 1,
+ jsType: "number",
+ },
+ Entity: {
+ typeName: "mscrm.crmbaseentity",
+ structuralProperty: 5,
+ jsType: "object",
+ },
+ EntityCollection: {
+ typeName: "Collection(mscrm.crmbaseentity)",
+ structuralProperty: 4,
+ jsType: "object",
+ },
+ Float: { typeName: "Edm.Double", structuralProperty: 1, jsType: "number" },
+ Money: { typeName: "Edm.Decimal", structuralProperty: 1, jsType: "number" },
+ Picklist: {
+ typeName: "Edm.Int32",
+ structuralProperty: 1,
+ jsType: "number",
+ },
+ };
+ /**
+ * Checks if the given request parameter is of a supported type and has a valid value.
+ * @param {RequestParameter} requestParameter - The request parameter to check.
+ * @returns {void}
+ * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value.
+ */
+ function checkRequestParameterType(requestParameter) {
+ if (!typeMap[requestParameter.Type])
+ throw new Error(`The property type ${requestParameter.Type} of the property ${requestParameter.Name} is not supported.`);
+ const expectedType = typeMap[requestParameter.Type].jsType;
+ const actualType = typeof requestParameter.Value;
+ const invalidTypeMessage = `The value ${requestParameter.Value}\nof the property ${requestParameter.Name}\nis not of the expected type ${requestParameter.Type}.`;
+ if (requestParameter.Type === "EntityReference" ||
+ requestParameter.Type === "Entity") {
+ if (!requestParameter.Value ||
+ !requestParameter.Value.hasOwnProperty("id") ||
+ !requestParameter.Value.hasOwnProperty("entityType")) {
+ throw new Error(invalidTypeMessage);
+ }
+ typeMap[requestParameter.Type].typeName = `mscrm.${requestParameter.Value.entityType}`;
+ }
+ else if (requestParameter.Type === "EntityCollection") {
+ if (!Array.isArray(requestParameter.Value) ||
+ requestParameter.Value.every((v) => typeof v !== "object" ||
+ !v ||
+ !v.hasOwnProperty("id") ||
+ !v.hasOwnProperty("entityType"))) {
+ throw new Error(invalidTypeMessage);
+ }
+ }
+ else if (requestParameter.Type === "DateTime") {
+ if (!(requestParameter.Value instanceof Date)) {
+ throw new Error(invalidTypeMessage);
+ }
+ }
+ else {
+ if (actualType !== expectedType) {
+ throw new Error(invalidTypeMessage);
+ }
+ }
+ }
+ XrmEx.checkRequestParameterType = checkRequestParameterType;
+ /**
+ * Executes an Action.
+ * @param {string} actionName - The unique name of the action.
+ * @param {RequestParameter[]} requestParameters - An array of objects with the parameter name, type and value.
+ * @param {EntityReference} [boundEntity] - An optional EntityReference of the bound entity.
+ * @returns {Promise} - A Promise with the request response.
+ * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value.
+ */
+ async function executeAction(actionName, requestParameters, boundEntity) {
+ const parameterDefinition = {};
+ if (boundEntity)
+ requestParameters.push({
+ Name: "entity",
+ Value: boundEntity,
+ Type: "EntityReference",
+ });
+ for (const requestParameter of requestParameters) {
+ checkRequestParameterType(requestParameter);
+ parameterDefinition[requestParameter.Name] = {
+ typeName: typeMap[requestParameter.Type].typeName,
+ structuralProperty: typeMap[requestParameter.Type].structuralProperty,
+ };
+ }
+ const req = Object.assign({
+ getMetadata: () => ({
+ boundParameter: boundEntity ? "entity" : null,
+ operationType: 0,
+ operationName: actionName,
+ parameterTypes: parameterDefinition,
+ }),
+ }, ...requestParameters.map((p) => ({ [p.Name]: p.Value })));
+ const response = await Xrm.WebApi.online.execute(req);
+ if (response.ok)
+ return response.json().catch(() => response);
+ }
+ XrmEx.executeAction = executeAction;
+ /**
+ * Executes a Function.
+ * @param {string} functionName - The unique name of the function.
+ * @param {RequestParameter[]} requestParameters - An array of objects with the parameter name, type and value.
+ * @param {EntityReference} [boundEntity] - An optional EntityReference of the bound entity.
+ * @returns {Promise} - A Promise with the request response.
+ * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value.
+ */
+ async function executeFunction(functionName, requestParameters, boundEntity) {
+ const parameterDefinition = {};
+ if (boundEntity)
+ requestParameters.push({
+ Name: "entity",
+ Value: boundEntity,
+ Type: "EntityReference",
+ });
+ for (const requestParameter of requestParameters) {
+ checkRequestParameterType(requestParameter);
+ parameterDefinition[requestParameter.Name] = {
+ typeName: typeMap[requestParameter.Type].typeName,
+ structuralProperty: typeMap[requestParameter.Type].structuralProperty,
+ };
+ }
+ const req = Object.assign({
+ getMetadata: () => ({
+ boundParameter: boundEntity ? "entity" : null,
+ operationType: 1,
+ operationName: functionName,
+ parameterTypes: parameterDefinition,
+ }),
+ }, ...requestParameters.map((p) => ({ [p.Name]: p.Value })));
+ const response = await Xrm.WebApi.online.execute(req);
+ if (response.ok)
+ return response.json().catch(() => response);
+ }
+ XrmEx.executeFunction = executeFunction;
+ /**
+ * Makes a GUID lowercase and removes brackets.
+ * @param {string} guid - The GUID to normalize.
+ * @returns {string} - The normalized GUID.
+ */
+ function normalizeGuid(guid) {
+ if (typeof guid !== "string")
+ throw new Error(`XrmEx.normalizeGuid:\n'${guid}' is not a string`);
+ return guid.toLowerCase().replace(/[{}]/g, "");
+ }
+ XrmEx.normalizeGuid = normalizeGuid;
+ /**
+ * Opens a dialog with dynamic height and width based on text content.
+ * @param {string} title - The title of the dialog.
+ * @param {string} text - The text content of the dialog.
+ * @returns {Promise} - A Promise with the dialog response.
+ */
+ async function openAlertDialog(title, text) {
+ try {
+ const rows = text.split(/\r\n|\r|\n/);
+ let additionalRows = 0;
+ rows.forEach((row) => {
+ let width = getTextWidth(row, "1rem Segoe UI Regular, SegoeUI, Segoe UI");
+ if (width > 940) {
+ additionalRows += width / 940;
+ }
+ });
+ const longestRow = rows.reduce((acc, row) => (row.length > acc.length ? row : acc), "");
+ const width = Math.min(getTextWidth(longestRow, "1rem Segoe UI Regular, SegoeUI, Segoe UI"), 1000);
+ const height = 109 + (rows.length + additionalRows) * 20;
+ return await Xrm.Navigation.openAlertDialog({
+ confirmButtonLabel: "Ok",
+ text,
+ title,
+ }, {
+ height,
+ width,
+ });
+ }
+ catch (error) {
+ console.error(error.message);
+ throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`);
+ }
+ /**
+ * Uses canvas.measureText to compute and return the width of the given text of given font in pixels.
+ *
+ * @param {String} text The text to be rendered.
+ * @param {String} font The css font descriptor that text is to be rendered with (e.g. "bold 14px verdana").
+ *
+ * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393
+ */
+ function getTextWidth(text, font) {
+ const canvas = document.createElement("canvas");
+ const context = canvas.getContext("2d");
+ context.font = font;
+ const metrics = context.measureText(text);
+ return metrics.width;
+ }
+ }
+ XrmEx.openAlertDialog = openAlertDialog;
+ /**
+ * Represents a form in Dynamics 365.
+ */
+ class Form {
+ static _formContext;
+ static _executionContext;
+ constructor() { }
+ /**Gets a reference to the current form context*/
+ static get formContext() {
+ return this._formContext;
+ }
+ /**Gets a reference to the current executio context*/
+ static get executionContext() {
+ return this._executionContext;
+ }
+ /**Gets a lookup value that references the record.*/
+ static get entityReference() {
+ return Form.formContext.data.entity.getEntityReference();
+ }
+ /**Sets a reference to the current form context*/
+ static set formContext(context) {
+ if ("getFormContext" in context) {
+ this._executionContext = context;
+ this._formContext = context.getFormContext();
+ }
+ else if ("data" in context)
+ this._formContext = context;
+ else
+ throw new Error(`XrmEx.Form.setFormContext: The executionContext or formContext was not passed to the function.`);
+ }
+ /**Sets a reference to the current execution context*/
+ static set executionContext(context) {
+ if ("getFormContext" in context) {
+ this._executionContext = context;
+ this._formContext = context.getFormContext();
+ }
+ else if ("data" in context)
+ this._formContext = context;
+ else
+ throw new Error(`XrmEx.Form.setExecutionContext: The executionContext or formContext was not passed to the function.`);
+ }
+ /**Returns true if form is from type create*/
+ static get IsCreate() {
+ return Form.formContext.ui.getFormType() == 1;
+ }
+ /**Returns true if form is from type update*/
+ static get IsUpdate() {
+ return Form.formContext.ui.getFormType() == 2;
+ }
+ /**Returns true if form is not from type create*/
+ static get IsNotCreate() {
+ return Form.formContext.ui.getFormType() != 1;
+ }
+ /**Returns true if form is not from type update*/
+ static get IsNotUpdate() {
+ return Form.formContext.ui.getFormType() != 2;
+ }
+ /**
+ * Displays a form level notification. Any number of notifications can be displayed and will remain until removed using clearFormNotification.
+ * The height of the notification area is limited so each new message will be added to the top.
+ * @param message The text of the notification message.
+ * @param level The level of the notification which defines how the message will be displayed, such as the icon.
+ * ERROR: Notification will use the system error icon.
+ * WARNING: Notification will use the system warning icon.
+ * INFO: Notification will use the system info icon.
+ * @param uniqueId Unique identifier for the notification which is used with clearFormNotification to remove the notification.
+ * @returns true if it succeeds, otherwise false.
+ */
+ static addFormNotification(message, level, uniqueId) {
+ try {
+ return Form.formContext.ui.setFormNotification(message, level, uniqueId);
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Clears the form notification described by uniqueId.
+ * @param uniqueId Unique identifier.
+ * @returns True if it succeeds, otherwise false.
+ */
+ static removeFormNotification(uniqueId) {
+ try {
+ return Form.formContext.ui.clearFormNotification(uniqueId);
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Adds a handler to be called when the record is saved.
+ */
+ static addOnSaveEventHandler(handlers) {
+ try {
+ if (!Array.isArray(handlers)) {
+ handlers = [handlers];
+ }
+ handlers.forEach((handler) => {
+ if (typeof handler !== "function") {
+ throw new Error(`'${handler}' is not a function`);
+ }
+ Form.formContext.data.entity.addOnSave(handler);
+ });
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Adds a function to be called after the OnSave is complete.
+ * @param handler The handler.
+ * @remarks Added in 9.2
+ * @see {@link https://docs.microsoft.com/en-us/powerapps/developer/model-driven-apps/clientapi/reference/events/postsave External Link: PostSave Event Documentation}
+ */
+ static addOnPostSaveEventHandler(handlers) {
+ try {
+ if (!Array.isArray(handlers)) {
+ handlers = [handlers];
+ }
+ handlers.forEach((handler) => {
+ if (typeof handler !== "function") {
+ throw new Error(`'${handler}' is not a function`);
+ }
+ Form.formContext.data.entity.addOnPostSave(handler);
+ });
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Adds a function to be called when form data is loaded.
+ * @param handler The function to be executed when the form data loads. The function will be added to the bottom of the event handler pipeline.
+ */
+ static addOnLoadEventHandler(handlers) {
+ try {
+ if (!Array.isArray(handlers)) {
+ handlers = [handlers];
+ }
+ handlers.forEach((handler) => {
+ if (typeof handler !== "function") {
+ throw new Error(`'${handler}' is not a function`);
+ }
+ Form.formContext.data.addOnLoad(handler);
+ });
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Adds a handler to be called when the attribute's value is changed.
+ * @param handler The function reference.
+ */
+ static addOnChangeEventHandler(fields, handlers, execute) {
+ try {
+ if (!Array.isArray(handlers)) {
+ handlers = [handlers];
+ }
+ handlers.forEach((handler) => {
+ if (typeof handler !== "function") {
+ throw new Error(`'${handler}' is not a function`);
+ }
+ fields.forEach((field) => {
+ field.addOnChange(handler);
+ });
+ });
+ if (execute) {
+ fields.forEach((field) => {
+ field.Attribute.fireOnChange();
+ });
+ }
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ }
+ XrmEx.Form = Form;
+ /**
+ * Used to execute methods related to a single Attribute
+ */
+ class Field {
+ static allFields = [];
+ Name;
+ _attribute;
+ constructor(attributeName) {
+ const existingField = Field.allFields.find((f) => f.Name === attributeName);
+ if (existingField) {
+ return existingField;
+ }
+ this.Name = attributeName;
+ Field.allFields.push(this);
+ }
+ setValue(value) {
+ return this.Attribute.setValue(value);
+ }
+ getAttributeType() {
+ return this.Attribute.getAttributeType();
+ }
+ getFormat() {
+ return this.Attribute.getFormat();
+ }
+ getIsDirty() {
+ return this.Attribute.getIsDirty();
+ }
+ getName() {
+ return this.Attribute.getName();
+ }
+ getParent() {
+ return this.Attribute.getParent();
+ }
+ getRequiredLevel() {
+ return this.Attribute.getRequiredLevel();
+ }
+ getSubmitMode() {
+ return this.Attribute.getSubmitMode();
+ }
+ getUserPrivilege() {
+ return this.Attribute.getUserPrivilege();
+ }
+ removeOnChange(handler) {
+ return this.Attribute.removeOnChange(handler);
+ }
+ setSubmitMode(submitMode) {
+ return this.Attribute.setSubmitMode(submitMode);
+ }
+ getValue() {
+ return this.Attribute.getValue();
+ }
+ setIsValid(isValid, message) {
+ return this.Attribute.setIsValid(isValid, message);
+ }
+ get Attribute() {
+ return (this._attribute ??=
+ Form.formContext.getAttribute(this.Name) ??
+ XrmEx.throwError(`The attribute '${this.Name}' was not found on the form.`));
+ }
+ get controls() {
+ return this.Attribute.controls;
+ }
+ /**
+ * Gets the value.
+ * @returns The value.
+ */
+ get Value() {
+ return this.Attribute.getValue();
+ }
+ set Value(value) {
+ this.Attribute.setValue(value);
+ }
+ /**
+ * Sets a control-local notification message.
+ * @param message The message.
+ * @param uniqueId Unique identifier.
+ * @returns true if it succeeds, false if it fails.
+ * @remarks When this method is used on Microsoft Dynamics CRM for tablets a red "X" icon
+ * appears next to the control. Tapping on the icon will display the message.
+ */
+ setNotification(message, uniqueId) {
+ try {
+ if (!message)
+ throw new Error(`no message was provided.`);
+ if (!uniqueId)
+ throw new Error(`no uniqueId was provided.`);
+ this.controls.forEach((control) => control.setNotification(message, uniqueId));
+ return this;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Sets the visibility state.
+ * @param visible true to show, false to hide.
+ */
+ setVisible(visible) {
+ try {
+ this.controls.forEach((control) => control.setVisible(visible));
+ return this;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Sets the state of the control to either enabled, or disabled.
+ * @param disabled true to disable, false to enable.
+ */
+ setDisabled(disabled) {
+ try {
+ this.controls.forEach((control) => control.setDisabled(disabled));
+ return this;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Sets the required level.
+ * @param requirementLevel The requirement level, as either "none", "required", or "recommended"
+ */
+ setRequiredLevel(requirementLevel) {
+ try {
+ this.Attribute.setRequiredLevel(requirementLevel);
+ return this;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Sets the required level.
+ * @param required The requirement level, as either false for "none" or true for "required"
+ */
+ setRequired(required) {
+ try {
+ this.Attribute.setRequiredLevel(required ? "required" : "none");
+ return this;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**Fire all "on change" event handlers. */
+ fireOnChange() {
+ try {
+ this.Attribute.fireOnChange();
+ return this;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Adds a handler or an array of handlers to be called when the attribute's value is changed.
+ * @param handlers The function reference or an array of function references.
+ */
+ addOnChange(handlers) {
+ try {
+ if (Array.isArray(handlers)) {
+ for (const handler of handlers) {
+ if (typeof handler !== "function")
+ throw new Error(`'${handler}' is not a function`);
+ this.Attribute.removeOnChange(handler);
+ this.Attribute.addOnChange(handler);
+ }
+ }
+ else {
+ if (typeof handlers !== "function")
+ throw new Error(`'${handlers}' is not a function`);
+ this.Attribute.removeOnChange(handlers);
+ this.Attribute.addOnChange(handlers);
+ }
+ return this;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Displays an error or recommendation notification for a control, and lets you specify actions to execute based on the notification.
+ */
+ addNotification(message, notificationLevel, uniqueId, actions) {
+ try {
+ if (!uniqueId)
+ throw new Error(`no uniqueId was provided.`);
+ if (actions && !Array.isArray(actions))
+ throw new Error(`the action parameter is not an array of ControlNotificationAction`);
+ this.controls.forEach((control) => {
+ control.addNotification({
+ messages: [message],
+ notificationLevel: notificationLevel,
+ uniqueId: uniqueId,
+ actions: actions,
+ });
+ });
+ return this;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Clears the notification identified by uniqueId.
+ * @param uniqueId (Optional) Unique identifier.
+ * @returns true if it succeeds, false if it fails.
+ * @remarks If the uniqueId parameter is not used, the current notification shown will be removed.
+ */
+ removeNotification(uniqueId) {
+ try {
+ this.controls.forEach((control) => {
+ control.clearNotification(uniqueId);
+ });
+ return this;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ }
+ XrmEx.Field = Field;
+ class TextField extends Field {
+ constructor(attribute) {
+ super(attribute);
+ }
+ getMaxLength() {
+ return this.Attribute.getMaxLength();
+ }
+ getFormat() {
+ return this.Attribute.getFormat();
+ }
+ get Attribute() {
+ return (this._attribute ??=
+ Form.formContext.getAttribute(this.Name) ??
+ XrmEx.throwError(`Field '${this.Name}' does not exist`));
+ }
+ get controls() {
+ return this.Attribute.controls;
+ }
+ get Value() {
+ return this.Attribute.getValue() ?? null;
+ }
+ set Value(value) {
+ this.Attribute.setValue(value);
+ }
+ }
+ XrmEx.TextField = TextField;
+ class NumberField extends Field {
+ constructor(attribute) {
+ super(attribute);
+ }
+ getFormat() {
+ return this.Attribute.getFormat();
+ }
+ getMax() {
+ return this.Attribute.getMax();
+ }
+ getMin() {
+ return this.Attribute.getMin();
+ }
+ getPrecision() {
+ return this.Attribute.getPrecision();
+ }
+ setPrecision(precision) {
+ return this.Attribute.setPrecision(precision);
+ }
+ get Attribute() {
+ return (this._attribute ??=
+ Form.formContext.getAttribute(this.Name) ??
+ XrmEx.throwError(`Field '${this.Name}' does not exist`));
+ }
+ get controls() {
+ return this.Attribute.controls;
+ }
+ get Value() {
+ return this.Attribute.getValue() ?? null;
+ }
+ set Value(value) {
+ this.Attribute.setValue(value);
+ }
+ }
+ XrmEx.NumberField = NumberField;
+ class DateField extends Field {
+ constructor(attribute) {
+ super(attribute);
+ }
+ getFormat() {
+ return this.Attribute.getFormat();
+ }
+ get Attribute() {
+ return (this._attribute ??=
+ Form.formContext.getAttribute(this.Name) ??
+ XrmEx.throwError(`Field '${this.Name}' does not exist`));
+ }
+ get controls() {
+ return this.Attribute.controls;
+ }
+ get Value() {
+ return this.Attribute.getValue() ?? null;
+ }
+ set Value(value) {
+ this.Attribute.setValue(value);
+ }
+ }
+ XrmEx.DateField = DateField;
+ class BooleanField extends Field {
+ constructor(attribute) {
+ super(attribute);
+ }
+ getAttributeType() {
+ return this.Attribute.getAttributeType();
+ }
+ getInitialValue() {
+ return this.Attribute.getInitialValue();
+ }
+ get Attribute() {
+ return (this._attribute ??=
+ Form.formContext.getAttribute(this.Name) ??
+ XrmEx.throwError(`Field '${this.Name}' does not exist`));
+ }
+ get controls() {
+ return this.Attribute.controls;
+ }
+ get Value() {
+ return this.Attribute.getValue() ?? null;
+ }
+ set Value(value) {
+ this.Attribute.setValue(value);
+ }
+ }
+ XrmEx.BooleanField = BooleanField;
+ class MultiSelectOptionSetField extends Field {
+ Option;
+ constructor(attributeName, option) {
+ super(attributeName);
+ this.Option = option;
+ }
+ getFormat() {
+ return this.Attribute.getFormat();
+ }
+ getOption(value) {
+ if (typeof value === "number") {
+ return this.Attribute.getOption(value);
+ }
+ else {
+ return this.Attribute.getOption(value);
+ }
+ }
+ getOptions() {
+ return this.Attribute.getOptions();
+ }
+ getSelectedOption() {
+ return this.Attribute.getSelectedOption();
+ }
+ getText() {
+ return this.Attribute.getText();
+ }
+ getInitialValue() {
+ return this.Attribute.getInitialValue();
+ }
+ get Attribute() {
+ return (this._attribute ??=
+ Form.formContext.getAttribute(this.Name) ??
+ XrmEx.throwError(`Field '${this.Name}' does not exist`));
+ }
+ get controls() {
+ return this.Attribute.controls;
+ }
+ get Value() {
+ return this.Attribute.getValue();
+ }
+ set Value(value) {
+ if (Array.isArray(value)) {
+ let values = [];
+ value.forEach((v) => {
+ if (typeof v == "number")
+ values.push(v);
+ else
+ values.push(this.Option[v]);
+ });
+ this.Attribute.setValue(values);
+ }
+ else
+ XrmEx.throwError(`Field Value '${value}' is not an Array`);
+ }
+ }
+ XrmEx.MultiSelectOptionSetField = MultiSelectOptionSetField;
+ class LookupField extends Field {
+ _customFilters = [];
+ constructor(attribute) {
+ super(attribute);
+ }
+ getIsPartyList() {
+ return this.Attribute.getIsPartyList();
+ }
+ get Attribute() {
+ return (this._attribute ??=
+ Form.formContext.getAttribute(this.Name) ??
+ XrmEx.throwError(`Field '${this.Name}' does not exist`));
+ }
+ get controls() {
+ return this.Attribute.controls;
+ }
+ /**Gets the id of the first lookup value*/
+ get Id() {
+ return this.Value && this.Value.length > 0
+ ? XrmEx.normalizeGuid(this.Value[0].id)
+ : null;
+ }
+ /**Gets the entityType of the first lookup value*/
+ get EntityType() {
+ return this.Value && this.Value.length > 0
+ ? this.Value[0].entityType
+ : null;
+ }
+ /**Gets the formatted value of the first lookup value*/
+ get FormattedValue() {
+ return this.Value && this.Value.length > 0 ? this.Value[0].name : null;
+ }
+ get Value() {
+ return this.Attribute.getValue() ?? null;
+ }
+ set Value(value) {
+ this.Attribute.setValue(value);
+ }
+ /**
+ * Sets the value of a lookup
+ * @param id Guid of the record
+ * @param entityType logicalname of the entity
+ * @param name formatted value
+ * @param append if true, adds value to the array instead of replacing it
+ */
+ setLookupValue(id, entityType, name, append = false) {
+ try {
+ if (!id)
+ throw new Error(`no id parameter was provided.`);
+ if (!entityType)
+ throw new Error(`no entityType parameter was provided.`);
+ id = XrmEx.normalizeGuid(id);
+ const lookupValue = {
+ id,
+ entityType,
+ name,
+ };
+ this.Value =
+ append && this.Value ? this.Value.concat(lookupValue) : [lookupValue];
+ return this;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Retrieves an entity record.
+ * @param options (Optional) OData system query options, $select and $expand, to retrieve your data.
+ * - Use the $select system query option to limit the properties returned by including a comma-separated
+ * list of property names. This is an important performance best practice. If properties aren’t
+ * specified using $select, all properties will be returned.
+ * - Use the $expand system query option to control what data from related entities is returned. If you
+ * just include the name of the navigation property, you’ll receive all the properties for related
+ * records. You can limit the properties returned for related records using the $select system query
+ * option in parentheses after the navigation property name. Use this for both single-valued and
+ * collection-valued navigation properties.
+ * - You can also specify multiple query options by using & to separate the query options.
+ * @example options example:
+ * options: $select=name&$expand=primarycontactid($select=contactid,fullname)
+ * @returns On success, returns a promise containing a JSON object with the retrieved attributes and their values.
+ * @see {@link https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/clientapi/reference/xrm-webapi/retrieverecord External Link: retrieveRecord (Client API reference)}
+ */
+ async retrieve(options) {
+ try {
+ if (!this.Id || !this.EntityType)
+ return null;
+ const record = await Xrm.WebApi.retrieveRecord(this.EntityType, this.Id, options);
+ return record;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Adds an additional custom filter to the lookup, with the "AND" filter operator.
+ * @param filter Specifies the filter, as a serialized FetchXML "filter" node.
+ * @param entityLogicalName (Optional) The logical name of the entity.
+ * @remarks If entityLogicalName is not specified, the filter will be applied to all entities
+ * valid for the Lookup control.
+ * @example Example filter:
+ *
+ *
+ */
+ addPreFilterToLookup(filterXml, entityLogicalName) {
+ try {
+ _addCustomFilter.controls = this.controls;
+ this.controls.forEach((control) => {
+ control.addPreSearch(_addCustomFilter);
+ });
+ this._customFilters.push(_addCustomFilter);
+ return this;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ function _addCustomFilter() {
+ _addCustomFilter.controls.forEach((control) => {
+ control.addCustomFilter(filterXml, entityLogicalName);
+ });
+ }
+ }
+ /**
+ * Adds an additional custom filter to the lookup, with the "AND" filter operator.
+ * @param entityLogicalName (Optional) The logical name of the entity.
+ * @param primaryAttributeIdName (Optional) The logical name of the primary key.
+ * @param fetchXml Specifies the FetchXML used to filter.
+ * @remarks If entityLogicalName is not specified, the filter will be applied to all entities
+ * valid for the Lookup control.
+ * @example Example fetchXml:
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+ async addPreFilterToLookupAdvanced(entityLogicalName, primaryAttributeIdName, fetchXml) {
+ try {
+ const result = await Xrm.WebApi.online.retrieveMultipleRecords(entityLogicalName, "?fetchXml=" + fetchXml);
+ const data = result.entities;
+ let filteredEntities = "";
+ _addCustomFilter.controls = this.controls;
+ data.forEach((item) => {
+ filteredEntities += `${item[primaryAttributeIdName]}`;
+ });
+ fetchXml = filteredEntities
+ ? `${filteredEntities}`
+ : ``;
+ this.controls.forEach((control) => {
+ control.addPreSearch(_addCustomFilter);
+ });
+ this._customFilters.push(_addCustomFilter);
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ function _addCustomFilter() {
+ _addCustomFilter.controls.forEach((control) => {
+ control.addCustomFilter(fetchXml, entityLogicalName);
+ });
+ }
+ }
+ /**
+ * Removes all filters set on the current lookup attribute by using addPreFilterToLookup or addPreFilterToLookupAdvanced
+ */
+ clearPreFilterFromLookup() {
+ try {
+ this._customFilters.forEach((customFilter) => {
+ this.controls.forEach((control) => {
+ control.removePreSearch(customFilter);
+ });
+ });
+ return this;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ }
+ XrmEx.LookupField = LookupField;
+ class OptionsetField extends Field {
+ _control;
+ Option;
+ constructor(attributeName, option) {
+ super(attributeName);
+ this.Option = option;
+ }
+ getFormat() {
+ return this.Attribute.getFormat();
+ }
+ getOption(value) {
+ if (typeof value === "number") {
+ return this.Attribute.getOption(value);
+ }
+ else {
+ return this.Attribute.getOption(value);
+ }
+ }
+ getOptions() {
+ return this.Attribute.getOptions();
+ }
+ getSelectedOption() {
+ return this.Attribute.getSelectedOption();
+ }
+ getText() {
+ return this.Attribute.getText();
+ }
+ getInitialValue() {
+ return this.Attribute.getInitialValue();
+ }
+ get Attribute() {
+ return (this._attribute ??=
+ Form.formContext.getAttribute(this.Name) ??
+ XrmEx.throwError(`Field '${this.Name}' does not exist`));
+ }
+ get controls() {
+ return this.Attribute.controls;
+ }
+ get control() {
+ return (this._control ??=
+ Form.formContext.getControl(this.Name) ??
+ XrmEx.throwError(`Control '${this.Name}' does not exist`));
+ }
+ get Value() {
+ return this.Attribute.getValue();
+ }
+ set Value(value) {
+ if (typeof value == "number")
+ this.Attribute.setValue(value);
+ else
+ this.Attribute.setValue(this.Option[value]);
+ }
+ /**
+ * Adds an option.
+ *
+ * @param values an array with the option values to add
+ * @param index (Optional) zero-based index of the option.
+ *
+ * @remarks This method does not check that the values within the options you add are valid.
+ * If index is not provided, the new option will be added to the end of the list.
+ */
+ addOption(values, index) {
+ try {
+ if (!Array.isArray(values))
+ throw new Error(`values is not an Array:\nvalues: '${values}'`);
+ const optionSetValues = this.control.getAttribute().getOptions() ?? [];
+ for (const element of optionSetValues) {
+ if (values.includes(element.value)) {
+ this.control.addOption(element, index);
+ }
+ }
+ return this;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Removes the option matching the value.
+ *
+ * @param value The value.
+ */
+ removeOption(values) {
+ try {
+ if (!Array.isArray(values))
+ throw new Error(`values is not an Array:\nvalues: '${values}'`);
+ const optionSetValues = this.control.getAttribute().getOptions() ?? [];
+ for (const element of optionSetValues) {
+ if (values.includes(element.value)) {
+ this.control.removeOption(element.value);
+ }
+ }
+ return this;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ /**
+ * Clears all options.
+ */
+ clearOptions() {
+ try {
+ this.control.clearOptions();
+ return this;
+ }
+ catch (error) {
+ throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`);
+ }
+ }
+ }
+ XrmEx.OptionsetField = OptionsetField;
+ class Section {
+ Name;
+ _section;
+ parentTab;
+ constructor(name) {
+ this.Name = name;
+ }
+ get Section() {
+ return (this._section ??=
+ this.parentTab.sections.get(this.Name) ??
+ XrmEx.throwError(`The section '${this.Name}' was not found on the form.`));
+ }
+ getName() {
+ return this.Section.getName();
+ }
+ getParent() {
+ return this.Section.getParent();
+ }
+ controls;
+ setVisible(visible) {
+ return this.Section.setVisible(visible);
+ }
+ getVisible() {
+ return this.Section.getVisible();
+ }
+ getLabel() {
+ return this.Section.getLabel();
+ }
+ setLabel(label) {
+ return this.Section.setLabel(label);
+ }
+ }
+ XrmEx.Section = Section;
+ class Tab {
+ Name;
+ _tab;
+ Section;
+ constructor(name, section) {
+ this.Name = name;
+ this.Section = section;
+ for (let key in section) {
+ section[key].parentTab = this;
+ }
+ }
+ sections;
+ get Tab() {
+ return (this._tab ??=
+ Form.formContext.ui.tabs.get(this.Name) ??
+ XrmEx.throwError(`The tab '${this.Name}' was not found on the form.`));
+ }
+ addTabStateChange(handler) {
+ return this.Tab.addTabStateChange(handler);
+ }
+ getDisplayState() {
+ return this.Tab.getDisplayState();
+ }
+ getName() {
+ return this.Tab.getName();
+ }
+ getParent() {
+ return this.Tab.getParent();
+ }
+ removeTabStateChange(handler) {
+ return this.Tab.removeTabStateChange(handler);
+ }
+ setDisplayState(displayState) {
+ return this.Tab.setDisplayState(displayState);
+ }
+ setVisible(visible) {
+ return this.Tab.setVisible(visible);
+ }
+ getVisible() {
+ return this.Tab.getVisible();
+ }
+ getLabel() {
+ return this.Tab.getLabel();
+ }
+ setLabel(label) {
+ return this.Tab.setLabel(label);
+ }
+ setFocus() {
+ return this.Tab.setFocus();
+ }
+ }
+ XrmEx.Tab = Tab;
+ class GridControl {
+ Name;
+ _gridControl;
+ constructor(name) {
+ this.Name = name;
+ }
+ get GridControl() {
+ return ((this._gridControl ??=
+ Form.formContext.getControl(this.Name)) ??
+ XrmEx.throwError(`The grid '${this.Name}' was not found on the form.`));
+ }
+ get Grid() {
+ return this.GridControl.getGrid();
+ }
+ addOnLoad(handler) {
+ return this.GridControl.addOnLoad(handler);
+ }
+ getContextType() {
+ return this.GridControl.getContextType();
+ }
+ getEntityName() {
+ return this.GridControl.getEntityName();
+ }
+ getFetchXml() {
+ return this.GridControl.getFetchXml();
+ }
+ getGrid() {
+ return this.GridControl.getGrid();
+ }
+ getRelationship() {
+ return this.GridControl.getRelationship();
+ }
+ getUrl(client) {
+ return this.GridControl.getUrl(client);
+ }
+ getViewSelector() {
+ return this.GridControl.getViewSelector();
+ }
+ openRelatedGrid() {
+ return this.GridControl.openRelatedGrid();
+ }
+ refresh() {
+ return this.GridControl.refresh();
+ }
+ refreshRibbon() {
+ return this.GridControl.refreshRibbon();
+ }
+ removeOnLoad(handler) {
+ return this.GridControl.removeOnLoad(handler);
+ }
+ getControlType() {
+ return this.GridControl.getControlType();
+ }
+ getName() {
+ return this.GridControl.getName();
+ }
+ getParent() {
+ return this.GridControl.getParent();
+ }
+ getLabel() {
+ return this.GridControl.getLabel();
+ }
+ setLabel(label) {
+ return this.GridControl.setLabel(label);
+ }
+ getVisible() {
+ return this.GridControl.getVisible();
+ }
+ setVisible(visible) {
+ return this.GridControl.setVisible(visible);
+ }
+ }
+ XrmEx.GridControl = GridControl;
+})(XrmEx || (XrmEx = {}));
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWHJtRXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvWHJtRXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOERBQThEO0FBa0M5RCxJQUFVLEtBQUssQ0FvNUNkO0FBcDVDRCxXQUFVLEtBQUs7SUFDYjs7OztPQUlHO0lBQ0gsU0FBZ0IsVUFBVSxDQUFDLFlBQW9CO1FBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUZlLGdCQUFVLGFBRXpCLENBQUE7SUFDRDs7O09BR0c7SUFDSCxTQUFnQixhQUFhO1FBQzNCLElBQUk7WUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzFCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkUsTUFBTSxtQkFBbUIsR0FDdkIsVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRSxNQUFNLGlCQUFpQixHQUNyQixtQkFBbUIsRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNuRCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVuRSxPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUFDLE9BQU8sS0FBVSxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQzNEO0lBQ0gsQ0FBQztJQWRlLG1CQUFhLGdCQWM1QixDQUFB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QUFDO1FBQ3JDLENBQUM7UUFDRCxRQUFRLENBQUMsS0FBYTtZQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxVQUFVO1lBQ1IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxVQUFVLENBQUMsT0FBZ0I7WUFDekIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxDQUFDO0tBQ0Y7SUF6RVksaUJBQVcsY0F5RXZCLENBQUE7QUFDSCxDQUFDLEVBcDVDUyxLQUFLLEtBQUwsS0FBSyxRQW81Q2QiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vbm9kZV9tb2R1bGVzL0B0eXBlcy94cm0vaW5kZXguZC50c1wiIC8+XG4vKipcbiAqIFJlcHJlc2VudHMgYSBwYXJhbWV0ZXIgZm9yIGEgcmVxdWVzdC5cbiAqIEB0eXBlIHtPYmplY3R9IFJlcXVlc3RQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci5cbiAqIEBwcm9wZXJ0eSB7J0Jvb2xlYW4nIHwgJ0RhdGVUaW1lJyB8ICdEZWNpbWFsJyB8ICdFbnRpdHknIHwgJ0VudGl0eUNvbGxlY3Rpb24nIHwgJ0VudGl0eVJlZmVyZW5jZScgfCAnRmxvYXQnIHwgJ0ludGVnZXInIHwgJ01vbmV5JyB8ICdQaWNrbGlzdCcgfCAnU3RyaW5nJ30gVHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkgeyp9IFZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuXG4gKi9cbnR5cGUgUmVxdWVzdFBhcmFtZXRlciA9IHtcbiAgTmFtZTogc3RyaW5nO1xuICBUeXBlOlxuICAgIHwgXCJCb29sZWFuXCJcbiAgICB8IFwiRGF0ZVRpbWVcIlxuICAgIHwgXCJEZWNpbWFsXCJcbiAgICB8IFwiRW50aXR5XCJcbiAgICB8IFwiRW50aXR5Q29sbGVjdGlvblwiXG4gICAgfCBcIkVudGl0eVJlZmVyZW5jZVwiXG4gICAgfCBcIkZsb2F0XCJcbiAgICB8IFwiSW50ZWdlclwiXG4gICAgfCBcIk1vbmV5XCJcbiAgICB8IFwiUGlja2xpc3RcIlxuICAgIHwgXCJTdHJpbmdcIjtcbiAgVmFsdWU6IGFueTtcbn07XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYW4gZW50aXR5LlxuICogQHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFRoZSBJRCBvZiB0aGUgZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudGl0eVR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgZW50aXR5LlxuICovXG50eXBlIEVudGl0eVJlZmVyZW5jZSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgZW50aXR5VHlwZTogc3RyaW5nO1xufTtcbm5hbWVzcGFjZSBYcm1FeCB7XG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVycm9yTWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIHRocm93LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBBbHdheXMgdGhyb3dzIGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gdGhyb3dFcnJvcihlcnJvck1lc3NhZ2U6IHN0cmluZyk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbi5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRNZXRob2ROYW1lKCk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgICBjb25zdCBzdGFja1RyYWNlID0gZXJyb3Iuc3RhY2s/LnNwbGl0KFwiXFxuXCIpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpO1xuICAgICAgY29uc3QgY2FsbGluZ0Z1bmN0aW9uTGluZSA9XG4gICAgICAgIHN0YWNrVHJhY2UgJiYgc3RhY2tUcmFjZS5sZW5ndGggPj0gMyA/IHN0YWNrVHJhY2VbMl0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWVNYXRjaCA9XG4gICAgICAgIGNhbGxpbmdGdW5jdGlvbkxpbmU/Lm1hdGNoKC9hdFxccysoW15cXHNdKylcXHMrXFwoLyk7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWVNYXRjaCA/IGZ1bmN0aW9uTmFtZU1hdGNoWzFdIDogXCJcIjtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uTmFtZTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LmdldE1ldGhvZE5hbWU6XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpZmljYXRpb24gZm9yIGFuIGFwcCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBsZXZlbCwgYW5kIGxldHMgeW91IHNwZWNpZnkgd2hldGhlciB0byBzaG93IGEgY2xvc2UgYnV0dG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gdGhlIG5vdGlmaWNhdGlvbi5cbiAgICogQHBhcmFtIHsnU1VDQ0VTUycgfCAnRVJST1InIHwgJ1dBUk5JTkcnIHwgJ0lORk8nfSBsZXZlbCAtIFRoZSBsZXZlbCBvZiB0aGUgbm90aWZpY2F0aW9uLiBDYW4gYmUgJ1NVQ0NFU1MnLCAnRVJST1InLCAnV0FSTklORycsIG9yICdJTkZPJy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbc2hvd0Nsb3NlQnV0dG9uPWZhbHNlXSAtIFdoZXRoZXIgdG8gc2hvdyBhIGNsb3NlIGJ1dHRvbiBvbiB0aGUgbm90aWZpY2F0aW9uLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBJRCBvZiB0aGUgY3JlYXRlZCBub3RpZmljYXRpb24uXG4gICAqL1xuICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkR2xvYmFsTm90aWZpY2F0aW9uKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBsZXZlbDogXCJTVUNDRVNTXCIgfCBcIkVSUk9SXCIgfCBcIldBUk5JTkdcIiB8IFwiSU5GT1wiLFxuICAgIHNob3dDbG9zZUJ1dHRvbiA9IGZhbHNlXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbGV2ZWxNYXAgPSB7XG4gICAgICBTVUNDRVNTOiAxLFxuICAgICAgRVJST1I6IDIsXG4gICAgICBXQVJOSU5HOiAzLFxuICAgICAgSU5GTzogNCxcbiAgICB9O1xuICAgIGNvbnN0IG1lc3NhZ2VMZXZlbCA9IGxldmVsTWFwW2xldmVsXSB8fCBsZXZlbE1hcC5JTkZPO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHtcbiAgICAgIHR5cGU6IDIsXG4gICAgICBsZXZlbDogbWVzc2FnZUxldmVsLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHNob3dDbG9zZUJ1dHRvbixcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgWHJtLkFwcC5hZGRHbG9iYWxOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7Z2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDbGVhcnMgYSBub3RpZmljYXRpb24gaW4gdGhlIGFwcCB3aXRoIHRoZSBnaXZlbiB1bmlxdWUgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bmlxdWVJZCAtIFRoZSB1bmlxdWUgSUQgb2YgdGhlIG5vdGlmaWNhdGlvbiB0byBjbGVhci5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBub3RpZmljYXRpb24gaGFzIGJlZW4gY2xlYXJlZC5cbiAgICovXG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHbG9iYWxOb3RpZmljYXRpb24oXG4gICAgdW5pcXVlSWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgWHJtLkFwcC5jbGVhckdsb2JhbE5vdGlmaWNhdGlvbih1bmlxdWVJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke2dldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBieSB1c2luZyBpdHMgc2NoZW1hIG5hbWUgYXMga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW52aXJvbm1lbnRWYXJpYWJsZVNjaGVtYU5hbWUgLSBUaGUgc2NoZW1hIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFbnZpcm9ubWVudFZhcmlhYmxlVmFsdWUoXG4gICAgZW52aXJvbm1lbnRWYXJpYWJsZVNjaGVtYU5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBleGVjdXRlRnVuY3Rpb24oXCJSZXRyaWV2ZUVudmlyb25tZW50VmFyaWFibGVWYWx1ZVwiLCBbXG4gICAgICB7XG4gICAgICAgIE5hbWU6IFwiRGVmaW5pdGlvblNjaGVtYU5hbWVcIixcbiAgICAgICAgVHlwZTogXCJTdHJpbmdcIixcbiAgICAgICAgVmFsdWU6IGVudmlyb25tZW50VmFyaWFibGVTY2hlbWFOYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuICAvKipcbiAgICogQSBtYXAgb2YgQ1JNIGRhdGEgdHlwZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB0eXBlIG5hbWVzLCBzdHJ1Y3R1cmFsIHByb3BlcnRpZXMsIGFuZCBKYXZhU2NyaXB0IHR5cGVzLlxuICAgKiBAdHlwZSB7T2JqZWN0LjxzdHJpbmcsIHsgdHlwZU5hbWU6IHN0cmluZywgc3RydWN0dXJhbFByb3BlcnR5OiBudW1iZXIsIGpzVHlwZTogc3RyaW5nIH0+fVxuICAgKi9cbiAgbGV0IHR5cGVNYXAgPSB7XG4gICAgU3RyaW5nOiB7IHR5cGVOYW1lOiBcIkVkbS5TdHJpbmdcIiwgc3RydWN0dXJhbFByb3BlcnR5OiAxLCBqc1R5cGU6IFwic3RyaW5nXCIgfSxcbiAgICBJbnRlZ2VyOiB7IHR5cGVOYW1lOiBcIkVkbS5JbnQzMlwiLCBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsIGpzVHlwZTogXCJudW1iZXJcIiB9LFxuICAgIEJvb2xlYW46IHtcbiAgICAgIHR5cGVOYW1lOiBcIkVkbS5Cb29sZWFuXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsXG4gICAgICBqc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgRGF0ZVRpbWU6IHtcbiAgICAgIHR5cGVOYW1lOiBcIkVkbS5EYXRlVGltZU9mZnNldFwiLFxuICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiAxLFxuICAgICAganNUeXBlOiBcIm9iamVjdFwiLFxuICAgIH0sXG4gICAgRW50aXR5UmVmZXJlbmNlOiB7XG4gICAgICB0eXBlTmFtZTogXCJtc2NybS5jcm1iYXNlZW50aXR5XCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDUsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBEZWNpbWFsOiB7XG4gICAgICB0eXBlTmFtZTogXCJFZG0uRGVjaW1hbFwiLFxuICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiAxLFxuICAgICAganNUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgRW50aXR5OiB7XG4gICAgICB0eXBlTmFtZTogXCJtc2NybS5jcm1iYXNlZW50aXR5XCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDUsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBFbnRpdHlDb2xsZWN0aW9uOiB7XG4gICAgICB0eXBlTmFtZTogXCJDb2xsZWN0aW9uKG1zY3JtLmNybWJhc2VlbnRpdHkpXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDQsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBGbG9hdDogeyB0eXBlTmFtZTogXCJFZG0uRG91YmxlXCIsIHN0cnVjdHVyYWxQcm9wZXJ0eTogMSwganNUeXBlOiBcIm51bWJlclwiIH0sXG4gICAgTW9uZXk6IHsgdHlwZU5hbWU6IFwiRWRtLkRlY2ltYWxcIiwgc3RydWN0dXJhbFByb3BlcnR5OiAxLCBqc1R5cGU6IFwibnVtYmVyXCIgfSxcbiAgICBQaWNrbGlzdDoge1xuICAgICAgdHlwZU5hbWU6IFwiRWRtLkludDMyXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsXG4gICAgICBqc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcmVxdWVzdCBwYXJhbWV0ZXIgaXMgb2YgYSBzdXBwb3J0ZWQgdHlwZSBhbmQgaGFzIGEgdmFsaWQgdmFsdWUuXG4gICAqIEBwYXJhbSB7UmVxdWVzdFBhcmFtZXRlcn0gcmVxdWVzdFBhcmFtZXRlciAtIFRoZSByZXF1ZXN0IHBhcmFtZXRlciB0byBjaGVjay5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUgb3IgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gY2hlY2tSZXF1ZXN0UGFyYW1ldGVyVHlwZShcbiAgICByZXF1ZXN0UGFyYW1ldGVyOiBSZXF1ZXN0UGFyYW1ldGVyXG4gICk6IHZvaWQge1xuICAgIGlmICghdHlwZU1hcFtyZXF1ZXN0UGFyYW1ldGVyLlR5cGVdKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIHByb3BlcnR5IHR5cGUgJHtyZXF1ZXN0UGFyYW1ldGVyLlR5cGV9IG9mIHRoZSBwcm9wZXJ0eSAke3JlcXVlc3RQYXJhbWV0ZXIuTmFtZX0gaXMgbm90IHN1cHBvcnRlZC5gXG4gICAgICApO1xuICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IHR5cGVNYXBbcmVxdWVzdFBhcmFtZXRlci5UeXBlXS5qc1R5cGU7XG4gICAgY29uc3QgYWN0dWFsVHlwZSA9IHR5cGVvZiByZXF1ZXN0UGFyYW1ldGVyLlZhbHVlO1xuICAgIGNvbnN0IGludmFsaWRUeXBlTWVzc2FnZSA9IGBUaGUgdmFsdWUgJHtyZXF1ZXN0UGFyYW1ldGVyLlZhbHVlfVxcbm9mIHRoZSBwcm9wZXJ0eSAke3JlcXVlc3RQYXJhbWV0ZXIuTmFtZX1cXG5pcyBub3Qgb2YgdGhlIGV4cGVjdGVkIHR5cGUgJHtyZXF1ZXN0UGFyYW1ldGVyLlR5cGV9LmA7XG4gICAgaWYgKFxuICAgICAgcmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkVudGl0eVJlZmVyZW5jZVwiIHx8XG4gICAgICByZXF1ZXN0UGFyYW1ldGVyLlR5cGUgPT09IFwiRW50aXR5XCJcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUgfHxcbiAgICAgICAgIXJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUuaGFzT3duUHJvcGVydHkoXCJpZFwiKSB8fFxuICAgICAgICAhcmVxdWVzdFBhcmFtZXRlci5WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcImVudGl0eVR5cGVcIilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHR5cGVNYXBbXG4gICAgICAgIHJlcXVlc3RQYXJhbWV0ZXIuVHlwZVxuICAgICAgXS50eXBlTmFtZSA9IGBtc2NybS4ke3JlcXVlc3RQYXJhbWV0ZXIuVmFsdWUuZW50aXR5VHlwZX1gO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkVudGl0eUNvbGxlY3Rpb25cIikge1xuICAgICAgaWYgKFxuICAgICAgICAhQXJyYXkuaXNBcnJheShyZXF1ZXN0UGFyYW1ldGVyLlZhbHVlKSB8fFxuICAgICAgICByZXF1ZXN0UGFyYW1ldGVyLlZhbHVlLmV2ZXJ5KFxuICAgICAgICAgICh2KSA9PlxuICAgICAgICAgICAgdHlwZW9mIHYgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICAgICAgICF2IHx8XG4gICAgICAgICAgICAhdi5oYXNPd25Qcm9wZXJ0eShcImlkXCIpIHx8XG4gICAgICAgICAgICAhdi5oYXNPd25Qcm9wZXJ0eShcImVudGl0eVR5cGVcIilcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihpbnZhbGlkVHlwZU1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkRhdGVUaW1lXCIpIHtcbiAgICAgIGlmICghKHJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGFjdHVhbFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGFuIEFjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBUaGUgdW5pcXVlIG5hbWUgb2YgdGhlIGFjdGlvbi5cbiAgICogQHBhcmFtIHtSZXF1ZXN0UGFyYW1ldGVyW119IHJlcXVlc3RQYXJhbWV0ZXJzIC0gQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZSBwYXJhbWV0ZXIgbmFtZSwgdHlwZSBhbmQgdmFsdWUuXG4gICAqIEBwYXJhbSB7RW50aXR5UmVmZXJlbmNlfSBbYm91bmRFbnRpdHldIC0gQW4gb3B0aW9uYWwgRW50aXR5UmVmZXJlbmNlIG9mIHRoZSBib3VuZCBlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IC0gQSBQcm9taXNlIHdpdGggdGhlIHJlcXVlc3QgcmVzcG9uc2UuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUgb3IgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gICAqL1xuICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFjdGlvbihcbiAgICBhY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgcmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJbXSxcbiAgICBib3VuZEVudGl0eT86IEVudGl0eVJlZmVyZW5jZVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlckRlZmluaXRpb246IGFueSA9IHt9O1xuICAgIGlmIChib3VuZEVudGl0eSlcbiAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgICBOYW1lOiBcImVudGl0eVwiLFxuICAgICAgICBWYWx1ZTogYm91bmRFbnRpdHksXG4gICAgICAgIFR5cGU6IFwiRW50aXR5UmVmZXJlbmNlXCIsXG4gICAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RQYXJhbWV0ZXIgb2YgcmVxdWVzdFBhcmFtZXRlcnMpIHtcbiAgICAgIGNoZWNrUmVxdWVzdFBhcmFtZXRlclR5cGUocmVxdWVzdFBhcmFtZXRlcik7XG4gICAgICBwYXJhbWV0ZXJEZWZpbml0aW9uW3JlcXVlc3RQYXJhbWV0ZXIuTmFtZV0gPSB7XG4gICAgICAgIHR5cGVOYW1lOiB0eXBlTWFwW3JlcXVlc3RQYXJhbWV0ZXIuVHlwZV0udHlwZU5hbWUsXG4gICAgICAgIHN0cnVjdHVyYWxQcm9wZXJ0eTogdHlwZU1hcFtyZXF1ZXN0UGFyYW1ldGVyLlR5cGVdLnN0cnVjdHVyYWxQcm9wZXJ0eSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7XG4gICAgICAgIGdldE1ldGFkYXRhOiAoKSA9PiAoe1xuICAgICAgICAgIGJvdW5kUGFyYW1ldGVyOiBib3VuZEVudGl0eSA/IFwiZW50aXR5XCIgOiBudWxsLFxuICAgICAgICAgIG9wZXJhdGlvblR5cGU6IDAsXG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogYWN0aW9uTmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJUeXBlczogcGFyYW1ldGVyRGVmaW5pdGlvbixcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgLi4ucmVxdWVzdFBhcmFtZXRlcnMubWFwKChwKSA9PiAoeyBbcC5OYW1lXTogcC5WYWx1ZSB9KSlcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgWHJtLldlYkFwaS5vbmxpbmUuZXhlY3V0ZShyZXEpO1xuICAgIGlmIChyZXNwb25zZS5vaykgcmV0dXJuIHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiByZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBGdW5jdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZSAtIFRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7UmVxdWVzdFBhcmFtZXRlcltdfSByZXF1ZXN0UGFyYW1ldGVycyAtIEFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB0aGUgcGFyYW1ldGVyIG5hbWUsIHR5cGUgYW5kIHZhbHVlLlxuICAgKiBAcGFyYW0ge0VudGl0eVJlZmVyZW5jZX0gW2JvdW5kRW50aXR5XSAtIEFuIG9wdGlvbmFsIEVudGl0eVJlZmVyZW5jZSBvZiB0aGUgYm91bmQgZW50aXR5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSAtIEEgUHJvbWlzZSB3aXRoIHRoZSByZXF1ZXN0IHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHJlcXVlc3QgcGFyYW1ldGVyIGlzIG5vdCBvZiBhIHN1cHBvcnRlZCB0eXBlIG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlLlxuICAgKi9cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVGdW5jdGlvbihcbiAgICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICByZXF1ZXN0UGFyYW1ldGVyczogUmVxdWVzdFBhcmFtZXRlcltdLFxuICAgIGJvdW5kRW50aXR5PzogRW50aXR5UmVmZXJlbmNlXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyRGVmaW5pdGlvbjogYW55ID0ge307XG4gICAgaWYgKGJvdW5kRW50aXR5KVxuICAgICAgcmVxdWVzdFBhcmFtZXRlcnMucHVzaCh7XG4gICAgICAgIE5hbWU6IFwiZW50aXR5XCIsXG4gICAgICAgIFZhbHVlOiBib3VuZEVudGl0eSxcbiAgICAgICAgVHlwZTogXCJFbnRpdHlSZWZlcmVuY2VcIixcbiAgICAgIH0pO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdFBhcmFtZXRlciBvZiByZXF1ZXN0UGFyYW1ldGVycykge1xuICAgICAgY2hlY2tSZXF1ZXN0UGFyYW1ldGVyVHlwZShyZXF1ZXN0UGFyYW1ldGVyKTtcbiAgICAgIHBhcmFtZXRlckRlZmluaXRpb25bcmVxdWVzdFBhcmFtZXRlci5OYW1lXSA9IHtcbiAgICAgICAgdHlwZU5hbWU6IHR5cGVNYXBbcmVxdWVzdFBhcmFtZXRlci5UeXBlXS50eXBlTmFtZSxcbiAgICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiB0eXBlTWFwW3JlcXVlc3RQYXJhbWV0ZXIuVHlwZV0uc3RydWN0dXJhbFByb3BlcnR5LFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHtcbiAgICAgICAgZ2V0TWV0YWRhdGE6ICgpID0+ICh7XG4gICAgICAgICAgYm91bmRQYXJhbWV0ZXI6IGJvdW5kRW50aXR5ID8gXCJlbnRpdHlcIiA6IG51bGwsXG4gICAgICAgICAgb3BlcmF0aW9uVHlwZTogMSxcbiAgICAgICAgICBvcGVyYXRpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgcGFyYW1ldGVyVHlwZXM6IHBhcmFtZXRlckRlZmluaXRpb24sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICAgIC4uLnJlcXVlc3RQYXJhbWV0ZXJzLm1hcCgocCkgPT4gKHsgW3AuTmFtZV06IHAuVmFsdWUgfSkpXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFhybS5XZWJBcGkub25saW5lLmV4ZWN1dGUocmVxKTtcbiAgICBpZiAocmVzcG9uc2Uub2spIHJldHVybiByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gcmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgR1VJRCBsb3dlcmNhc2UgYW5kIHJlbW92ZXMgYnJhY2tldHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gVGhlIEdVSUQgdG8gbm9ybWFsaXplLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBub3JtYWxpemVkIEdVSUQuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplR3VpZChndWlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgZ3VpZCAhPT0gXCJzdHJpbmdcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXgubm9ybWFsaXplR3VpZDpcXG4nJHtndWlkfScgaXMgbm90IGEgc3RyaW5nYCk7XG4gICAgcmV0dXJuIGd1aWQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9be31dL2csIFwiXCIpO1xuICB9XG4gIC8qKlxuICAgKiBPcGVucyBhIGRpYWxvZyB3aXRoIGR5bmFtaWMgaGVpZ2h0IGFuZCB3aWR0aCBiYXNlZCBvbiB0ZXh0IGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGRpYWxvZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gLSBBIFByb21pc2Ugd2l0aCB0aGUgZGlhbG9nIHJlc3BvbnNlLlxuICAgKi9cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5BbGVydERpYWxvZyhcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHRleHQ6IHN0cmluZ1xuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gdGV4dC5zcGxpdCgvXFxyXFxufFxccnxcXG4vKTtcbiAgICAgIGxldCBhZGRpdGlvbmFsUm93cyA9IDA7XG4gICAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBsZXQgd2lkdGggPSBnZXRUZXh0V2lkdGgoXG4gICAgICAgICAgcm93LFxuICAgICAgICAgIFwiMXJlbSBTZWdvZSBVSSBSZWd1bGFyLCBTZWdvZVVJLCBTZWdvZSBVSVwiXG4gICAgICAgICk7XG4gICAgICAgIGlmICh3aWR0aCA+IDk0MCkge1xuICAgICAgICAgIGFkZGl0aW9uYWxSb3dzICs9IHdpZHRoIC8gOTQwO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxvbmdlc3RSb3cgPSByb3dzLnJlZHVjZShcbiAgICAgICAgKGFjYywgcm93KSA9PiAocm93Lmxlbmd0aCA+IGFjYy5sZW5ndGggPyByb3cgOiBhY2MpLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbihcbiAgICAgICAgZ2V0VGV4dFdpZHRoKGxvbmdlc3RSb3csIFwiMXJlbSBTZWdvZSBVSSBSZWd1bGFyLCBTZWdvZVVJLCBTZWdvZSBVSVwiKSxcbiAgICAgICAgMTAwMFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IDEwOSArIChyb3dzLmxlbmd0aCArIGFkZGl0aW9uYWxSb3dzKSAqIDIwO1xuICAgICAgcmV0dXJuIGF3YWl0IFhybS5OYXZpZ2F0aW9uLm9wZW5BbGVydERpYWxvZyhcbiAgICAgICAge1xuICAgICAgICAgIGNvbmZpcm1CdXR0b25MYWJlbDogXCJPa1wiLFxuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtnZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXNlcyBjYW52YXMubWVhc3VyZVRleHQgdG8gY29tcHV0ZSBhbmQgcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgZ2l2ZW4gdGV4dCBvZiBnaXZlbiBmb250IGluIHBpeGVscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIHJlbmRlcmVkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb250IFRoZSBjc3MgZm9udCBkZXNjcmlwdG9yIHRoYXQgdGV4dCBpcyB0byBiZSByZW5kZXJlZCB3aXRoIChlLmcuIFwiYm9sZCAxNHB4IHZlcmRhbmFcIikuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExODI0MS9jYWxjdWxhdGUtdGV4dC13aWR0aC13aXRoLWphdmFzY3JpcHQvMjEwMTUzOTMjMjEwMTUzOTNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRUZXh0V2lkdGgodGV4dDogc3RyaW5nLCBmb250OiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGNvbnRleHQuZm9udCA9IGZvbnQ7XG4gICAgICBjb25zdCBtZXRyaWNzID0gY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KTtcbiAgICAgIHJldHVybiBtZXRyaWNzLndpZHRoO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGZvcm0gaW4gRHluYW1pY3MgMzY1LlxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEZvcm0ge1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX2Zvcm1Db250ZXh0OiBYcm0uRm9ybUNvbnRleHQ7XG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfZXhlY3V0aW9uQ29udGV4dDogWHJtLkV2ZW50cy5FdmVudENvbnRleHQ7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuICAgIC8qKkdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZm9ybSBjb250ZXh0Ki9cbiAgICBzdGF0aWMgZ2V0IGZvcm1Db250ZXh0KCk6IFhybS5Gb3JtQ29udGV4dCB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybUNvbnRleHQ7XG4gICAgfVxuICAgIC8qKkdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZXhlY3V0aW8gY29udGV4dCovXG4gICAgc3RhdGljIGdldCBleGVjdXRpb25Db250ZXh0KCk6IFhybS5FdmVudHMuRXZlbnRDb250ZXh0IHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0O1xuICAgIH1cbiAgICAvKipHZXRzIGEgbG9va3VwIHZhbHVlIHRoYXQgcmVmZXJlbmNlcyB0aGUgcmVjb3JkLiovXG4gICAgc3RhdGljIGdldCBlbnRpdHlSZWZlcmVuY2UoKSB7XG4gICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC5kYXRhLmVudGl0eS5nZXRFbnRpdHlSZWZlcmVuY2UoKTtcbiAgICB9XG4gICAgLyoqU2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBmb3JtIGNvbnRleHQqL1xuICAgIHN0YXRpYyBzZXQgZm9ybUNvbnRleHQoY29udGV4dDogWHJtLkZvcm1Db250ZXh0IHwgWHJtLkV2ZW50cy5FdmVudENvbnRleHQpIHtcbiAgICAgIGlmIChcImdldEZvcm1Db250ZXh0XCIgaW4gY29udGV4dCkge1xuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5fZm9ybUNvbnRleHQgPSBjb250ZXh0LmdldEZvcm1Db250ZXh0KCk7XG4gICAgICB9IGVsc2UgaWYgKFwiZGF0YVwiIGluIGNvbnRleHQpIHRoaXMuX2Zvcm1Db250ZXh0ID0gY29udGV4dDtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBYcm1FeC5Gb3JtLnNldEZvcm1Db250ZXh0OiBUaGUgZXhlY3V0aW9uQ29udGV4dCBvciBmb3JtQ29udGV4dCB3YXMgbm90IHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uYFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipTZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0Ki9cbiAgICBzdGF0aWMgc2V0IGV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICBjb250ZXh0OiBYcm0uRm9ybUNvbnRleHQgfCBYcm0uRXZlbnRzLkV2ZW50Q29udGV4dFxuICAgICkge1xuICAgICAgaWYgKFwiZ2V0Rm9ybUNvbnRleHRcIiBpbiBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLl9mb3JtQ29udGV4dCA9IGNvbnRleHQuZ2V0Rm9ybUNvbnRleHQoKTtcbiAgICAgIH0gZWxzZSBpZiAoXCJkYXRhXCIgaW4gY29udGV4dCkgdGhpcy5fZm9ybUNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFhybUV4LkZvcm0uc2V0RXhlY3V0aW9uQ29udGV4dDogVGhlIGV4ZWN1dGlvbkNvbnRleHQgb3IgZm9ybUNvbnRleHQgd2FzIG5vdCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLmBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgZnJvbSB0eXBlIGNyZWF0ZSovXG4gICAgc3RhdGljIGdldCBJc0NyZWF0ZSgpIHtcbiAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmdldEZvcm1UeXBlKCkgPT0gMTtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgZnJvbSB0eXBlIHVwZGF0ZSovXG4gICAgc3RhdGljIGdldCBJc1VwZGF0ZSgpIHtcbiAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmdldEZvcm1UeXBlKCkgPT0gMjtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgbm90IGZyb20gdHlwZSBjcmVhdGUqL1xuICAgIHN0YXRpYyBnZXQgSXNOb3RDcmVhdGUoKSB7XG4gICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC51aS5nZXRGb3JtVHlwZSgpICE9IDE7XG4gICAgfVxuICAgIC8qKlJldHVybnMgdHJ1ZSBpZiBmb3JtIGlzIG5vdCBmcm9tIHR5cGUgdXBkYXRlKi9cbiAgICBzdGF0aWMgZ2V0IElzTm90VXBkYXRlKCkge1xuICAgICAgcmV0dXJuIEZvcm0uZm9ybUNvbnRleHQudWkuZ2V0Rm9ybVR5cGUoKSAhPSAyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyBhIGZvcm0gbGV2ZWwgbm90aWZpY2F0aW9uLiBBbnkgbnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMgY2FuIGJlIGRpc3BsYXllZCBhbmQgd2lsbCByZW1haW4gdW50aWwgcmVtb3ZlZCB1c2luZyBjbGVhckZvcm1Ob3RpZmljYXRpb24uXG4gICAgICogVGhlIGhlaWdodCBvZiB0aGUgbm90aWZpY2F0aW9uIGFyZWEgaXMgbGltaXRlZCBzbyBlYWNoIG5ldyBtZXNzYWdlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRvcC5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgdGV4dCBvZiB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIGxldmVsIFRoZSBsZXZlbCBvZiB0aGUgbm90aWZpY2F0aW9uIHdoaWNoIGRlZmluZXMgaG93IHRoZSBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkLCBzdWNoIGFzIHRoZSBpY29uLlxuICAgICAqIEVSUk9SOiBOb3RpZmljYXRpb24gd2lsbCB1c2UgdGhlIHN5c3RlbSBlcnJvciBpY29uLlxuICAgICAqIFdBUk5JTkc6IE5vdGlmaWNhdGlvbiB3aWxsIHVzZSB0aGUgc3lzdGVtIHdhcm5pbmcgaWNvbi5cbiAgICAgKiBJTkZPOiBOb3RpZmljYXRpb24gd2lsbCB1c2UgdGhlIHN5c3RlbSBpbmZvIGljb24uXG4gICAgICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbm90aWZpY2F0aW9uIHdoaWNoIGlzIHVzZWQgd2l0aCBjbGVhckZvcm1Ob3RpZmljYXRpb24gdG8gcmVtb3ZlIHRoZSBub3RpZmljYXRpb24uXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRGb3JtTm90aWZpY2F0aW9uKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgbGV2ZWw6IFhybS5Gb3JtTm90aWZpY2F0aW9uTGV2ZWwsXG4gICAgICB1bmlxdWVJZDogc3RyaW5nXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC51aS5zZXRGb3JtTm90aWZpY2F0aW9uKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgdW5pcXVlSWRcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGZvcm0gbm90aWZpY2F0aW9uIGRlc2NyaWJlZCBieSB1bmlxdWVJZC5cbiAgICAgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiBpdCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIHN0YXRpYyByZW1vdmVGb3JtTm90aWZpY2F0aW9uKHVuaXF1ZUlkOiBzdHJpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmNsZWFyRm9ybU5vdGlmaWNhdGlvbih1bmlxdWVJZCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlY29yZCBpcyBzYXZlZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkT25TYXZlRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5lbnRpdHkuYWRkT25TYXZlKGhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBPblNhdmUgaXMgY29tcGxldGUuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIuXG4gICAgICogQHJlbWFya3MgQWRkZWQgaW4gOS4yXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcG93ZXJhcHBzL2RldmVsb3Blci9tb2RlbC1kcml2ZW4tYXBwcy9jbGllbnRhcGkvcmVmZXJlbmNlL2V2ZW50cy9wb3N0c2F2ZSBFeHRlcm5hbCBMaW5rOiBQb3N0U2F2ZSBFdmVudCBEb2N1bWVudGF0aW9ufVxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRPblBvc3RTYXZlRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5lbnRpdHkuYWRkT25Qb3N0U2F2ZShoYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGZvcm0gZGF0YSBpcyBsb2FkZWQuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGZvcm0gZGF0YSBsb2Fkcy4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgZXZlbnQgaGFuZGxlciBwaXBlbGluZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkT25Mb2FkRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5hZGRPbkxvYWQoaGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBmdW5jdGlvbiByZWZlcmVuY2UuXG4gICAgICovXG4gICAgc3RhdGljIGFkZE9uQ2hhbmdlRXZlbnRIYW5kbGVyKFxuICAgICAgZmllbGRzOiBGaWVsZFtdLFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXSxcbiAgICAgIGV4ZWN1dGU/OiBib29sZWFuXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaGFuZGxlcnMpKSB7XG4gICAgICAgICAgaGFuZGxlcnMgPSBbaGFuZGxlcnNdO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtoYW5kbGVyfScgaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5hZGRPbkNoYW5nZShoYW5kbGVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChleGVjdXRlKSB7XG4gICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5BdHRyaWJ1dGUuZmlyZU9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXNlZCB0byBleGVjdXRlIG1ldGhvZHMgcmVsYXRlZCB0byBhIHNpbmdsZSBBdHRyaWJ1dGVcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBGaWVsZCBpbXBsZW1lbnRzIFhybS5BdHRyaWJ1dGVzLkF0dHJpYnV0ZSB7XG4gICAgcHVibGljIHN0YXRpYyBhbGxGaWVsZHM6IEZpZWxkW10gPSBbXTtcblxuICAgIHB1YmxpYyByZWFkb25seSBOYW1lITogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfYXR0cmlidXRlPzogWHJtLkF0dHJpYnV0ZXMuQXR0cmlidXRlO1xuXG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlTmFtZTogc3RyaW5nKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0ZpZWxkID0gRmllbGQuYWxsRmllbGRzLmZpbmQoXG4gICAgICAgIChmKSA9PiBmLk5hbWUgPT09IGF0dHJpYnV0ZU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoZXhpc3RpbmdGaWVsZCkge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdGaWVsZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XG4gICAgICBGaWVsZC5hbGxGaWVsZHMucHVzaCh0aGlzKTtcbiAgICB9XG4gICAgc2V0VmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0QXR0cmlidXRlVHlwZSgpOiBYcm0uQXR0cmlidXRlcy5BdHRyaWJ1dGVUeXBlIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVUeXBlKCk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5BdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpO1xuICAgIH1cbiAgICBnZXRJc0RpcnR5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldElzRGlydHkoKTtcbiAgICB9XG4gICAgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5FbnRpdHkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFBhcmVudCgpO1xuICAgIH1cbiAgICBnZXRSZXF1aXJlZExldmVsKCk6IFhybS5BdHRyaWJ1dGVzLlJlcXVpcmVtZW50TGV2ZWwge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFJlcXVpcmVkTGV2ZWwoKTtcbiAgICB9XG4gICAgZ2V0U3VibWl0TW9kZSgpOiBYcm0uU3VibWl0TW9kZSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0U3VibWl0TW9kZSgpO1xuICAgIH1cbiAgICBnZXRVc2VyUHJpdmlsZWdlKCk6IFhybS5Qcml2aWxlZ2Uge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFVzZXJQcml2aWxlZ2UoKTtcbiAgICB9XG4gICAgcmVtb3ZlT25DaGFuZ2UoaGFuZGxlcjogWHJtLkV2ZW50cy5BdHRyaWJ1dGUuQ2hhbmdlRXZlbnRIYW5kbGVyKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUucmVtb3ZlT25DaGFuZ2UoaGFuZGxlcik7XG4gICAgfVxuICAgIHNldFN1Ym1pdE1vZGUoc3VibWl0TW9kZTogWHJtLlN1Ym1pdE1vZGUpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRTdWJtaXRNb2RlKHN1Ym1pdE1vZGUpO1xuICAgIH1cbiAgICBnZXRWYWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBzZXRJc1ZhbGlkKGlzVmFsaWQ6IGJvb2xlYW4sIG1lc3NhZ2U/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRJc1ZhbGlkKGlzVmFsaWQsIG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgQXR0cmlidXRlKCk6IFhybS5BdHRyaWJ1dGVzLkF0dHJpYnV0ZSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKFxuICAgICAgICAgIGBUaGUgYXR0cmlidXRlICcke3RoaXMuTmFtZX0nIHdhcyBub3QgZm91bmQgb24gdGhlIGZvcm0uYFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbnRyb2xzKCk6IFhybS5Db2xsZWN0aW9uLkl0ZW1Db2xsZWN0aW9uPFhybS5Db250cm9scy5TdGFuZGFyZENvbnRyb2w+IHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5jb250cm9scztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBWYWx1ZSgpOiBhbnkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICB0aGlzLkF0dHJpYnV0ZS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGNvbnRyb2wtbG9jYWwgbm90aWZpY2F0aW9uIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgaXQgc3VjY2VlZHMsIGZhbHNlIGlmIGl0IGZhaWxzLlxuICAgICAqIEByZW1hcmtzICAgICBXaGVuIHRoaXMgbWV0aG9kIGlzIHVzZWQgb24gTWljcm9zb2Z0IER5bmFtaWNzIENSTSBmb3IgdGFibGV0cyBhIHJlZCBcIlhcIiBpY29uXG4gICAgICogICAgICAgICAgICAgIGFwcGVhcnMgbmV4dCB0byB0aGUgY29udHJvbC4gVGFwcGluZyBvbiB0aGUgaWNvbiB3aWxsIGRpc3BsYXkgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgcHVibGljIHNldE5vdGlmaWNhdGlvbihtZXNzYWdlOiBzdHJpbmcsIHVuaXF1ZUlkOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghbWVzc2FnZSkgdGhyb3cgbmV3IEVycm9yKGBubyBtZXNzYWdlIHdhcyBwcm92aWRlZC5gKTtcbiAgICAgICAgaWYgKCF1bmlxdWVJZCkgdGhyb3cgbmV3IEVycm9yKGBubyB1bmlxdWVJZCB3YXMgcHJvdmlkZWQuYCk7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT5cbiAgICAgICAgICBjb250cm9sLnNldE5vdGlmaWNhdGlvbihtZXNzYWdlLCB1bmlxdWVJZClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IHN0YXRlLlxuICAgICAqIEBwYXJhbSB2aXNpYmxlIHRydWUgdG8gc2hvdywgZmFsc2UgdG8gaGlkZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IGNvbnRyb2wuc2V0VmlzaWJsZSh2aXNpYmxlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wgdG8gZWl0aGVyIGVuYWJsZWQsIG9yIGRpc2FibGVkLlxuICAgICAqIEBwYXJhbSBkaXNhYmxlZCB0cnVlIHRvIGRpc2FibGUsIGZhbHNlIHRvIGVuYWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWQoZGlzYWJsZWQ6IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4gY29udHJvbC5zZXREaXNhYmxlZChkaXNhYmxlZCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJlcXVpcmVkIGxldmVsLlxuICAgICAqIEBwYXJhbSByZXF1aXJlbWVudExldmVsIFRoZSByZXF1aXJlbWVudCBsZXZlbCwgYXMgZWl0aGVyIFwibm9uZVwiLCBcInJlcXVpcmVkXCIsIG9yIFwicmVjb21tZW5kZWRcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXF1aXJlZExldmVsKFxuICAgICAgcmVxdWlyZW1lbnRMZXZlbDogWHJtLkF0dHJpYnV0ZXMuUmVxdWlyZW1lbnRMZXZlbFxuICAgICk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0UmVxdWlyZWRMZXZlbChyZXF1aXJlbWVudExldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByZXF1aXJlZCBsZXZlbC5cbiAgICAgKiBAcGFyYW0gcmVxdWlyZWQgVGhlIHJlcXVpcmVtZW50IGxldmVsLCBhcyBlaXRoZXIgZmFsc2UgZm9yIFwibm9uZVwiIG9yIHRydWUgZm9yIFwicmVxdWlyZWRcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXF1aXJlZChyZXF1aXJlZDogYm9vbGVhbik6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0UmVxdWlyZWRMZXZlbChyZXF1aXJlZCA/IFwicmVxdWlyZWRcIiA6IFwibm9uZVwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipGaXJlIGFsbCBcIm9uIGNoYW5nZVwiIGV2ZW50IGhhbmRsZXJzLiAqL1xuICAgIHB1YmxpYyBmaXJlT25DaGFuZ2UoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLkF0dHJpYnV0ZS5maXJlT25DaGFuZ2UoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgaGFuZGxlciBvciBhbiBhcnJheSBvZiBoYW5kbGVycyB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgaXMgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0gaGFuZGxlcnMgVGhlIGZ1bmN0aW9uIHJlZmVyZW5jZSBvciBhbiBhcnJheSBvZiBmdW5jdGlvbiByZWZlcmVuY2VzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRPbkNoYW5nZShcbiAgICAgIGhhbmRsZXJzOlxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJcbiAgICAgICAgfCBYcm0uRXZlbnRzLkNvbnRleHRTZW5zaXRpdmVIYW5kbGVyW11cbiAgICApOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgICB0aGlzLkF0dHJpYnV0ZS5yZW1vdmVPbkNoYW5nZShoYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuQXR0cmlidXRlLmFkZE9uQ2hhbmdlKGhhbmRsZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2hhbmRsZXJzfScgaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgICAgICAgICB0aGlzLkF0dHJpYnV0ZS5yZW1vdmVPbkNoYW5nZShoYW5kbGVycyk7XG4gICAgICAgICAgdGhpcy5BdHRyaWJ1dGUuYWRkT25DaGFuZ2UoaGFuZGxlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYW4gZXJyb3Igb3IgcmVjb21tZW5kYXRpb24gbm90aWZpY2F0aW9uIGZvciBhIGNvbnRyb2wsIGFuZCBsZXRzIHlvdSBzcGVjaWZ5IGFjdGlvbnMgdG8gZXhlY3V0ZSBiYXNlZCBvbiB0aGUgbm90aWZpY2F0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGROb3RpZmljYXRpb24oXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBub3RpZmljYXRpb25MZXZlbDogXCJFUlJPUlwiIHwgXCJSRUNPTU1FTkRBVElPTlwiLFxuICAgICAgdW5pcXVlSWQ6IHN0cmluZyxcbiAgICAgIGFjdGlvbnM/OiBYcm0uQ29udHJvbHMuQ29udHJvbE5vdGlmaWNhdGlvbkFjdGlvbltdXG4gICAgKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXVuaXF1ZUlkKSB0aHJvdyBuZXcgRXJyb3IoYG5vIHVuaXF1ZUlkIHdhcyBwcm92aWRlZC5gKTtcbiAgICAgICAgaWYgKGFjdGlvbnMgJiYgIUFycmF5LmlzQXJyYXkoYWN0aW9ucykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHRoZSBhY3Rpb24gcGFyYW1ldGVyIGlzIG5vdCBhbiBhcnJheSBvZiBDb250cm9sTm90aWZpY2F0aW9uQWN0aW9uYFxuICAgICAgICAgICk7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkTm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBbbWVzc2FnZV0sXG4gICAgICAgICAgICBub3RpZmljYXRpb25MZXZlbDogbm90aWZpY2F0aW9uTGV2ZWwsXG4gICAgICAgICAgICB1bmlxdWVJZDogdW5pcXVlSWQsXG4gICAgICAgICAgICBhY3Rpb25zOiBhY3Rpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBub3RpZmljYXRpb24gaWRlbnRpZmllZCBieSB1bmlxdWVJZC5cbiAgICAgKiBAcGFyYW0gdW5pcXVlSWQgKE9wdGlvbmFsKSBVbmlxdWUgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0IHN1Y2NlZWRzLCBmYWxzZSBpZiBpdCBmYWlscy5cbiAgICAgKiBAcmVtYXJrcyBJZiB0aGUgdW5pcXVlSWQgcGFyYW1ldGVyIGlzIG5vdCB1c2VkLCB0aGUgY3VycmVudCBub3RpZmljYXRpb24gc2hvd24gd2lsbCBiZSByZW1vdmVkLlxuICAgICAqL1xuICAgIHJlbW92ZU5vdGlmaWNhdGlvbih1bmlxdWVJZDogc3RyaW5nKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb250cm9sLmNsZWFyTm90aWZpY2F0aW9uKHVuaXF1ZUlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBUZXh0RmllbGRcbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZTtcbiAgICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlKTtcbiAgICB9XG4gICAgZ2V0TWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0TWF4TGVuZ3RoKCk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpIGFzIFhybS5BdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZUZvcm1hdDtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCkgPz8gbnVsbDtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIE51bWJlckZpZWxkXG4gICAgZXh0ZW5kcyBGaWVsZFxuICAgIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuTnVtYmVyQXR0cmlidXRlXG4gIHtcbiAgICBwcm90ZWN0ZWQgZGVjbGFyZSBfYXR0cmlidXRlOiBYcm0uQXR0cmlidXRlcy5OdW1iZXJBdHRyaWJ1dGU7XG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyKGF0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRm9ybWF0IHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRGb3JtYXQoKSBhcyBYcm0uQXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRNYXgoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRNYXgoKTtcbiAgICB9XG4gICAgZ2V0TWluKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0TWluKCk7XG4gICAgfVxuICAgIGdldFByZWNpc2lvbigpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFByZWNpc2lvbigpO1xuICAgIH1cbiAgICBzZXRQcmVjaXNpb24ocHJlY2lzaW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRQcmVjaXNpb24ocHJlY2lzaW9uKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCkgPz8gbnVsbDtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIERhdGVGaWVsZCBleHRlbmRzIEZpZWxkIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuRGF0ZUF0dHJpYnV0ZSB7XG4gICAgcHJvdGVjdGVkIGRlY2xhcmUgX2F0dHJpYnV0ZTogWHJtLkF0dHJpYnV0ZXMuRGF0ZUF0dHJpYnV0ZTtcbiAgICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlKTtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLkRhdGVBdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpIGFzIFhybS5BdHRyaWJ1dGVzLkRhdGVBdHRyaWJ1dGVGb3JtYXQ7XG4gICAgfVxuICAgIGdldCBBdHRyaWJ1dGUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCAnJHt0aGlzLk5hbWV9JyBkb2VzIG5vdCBleGlzdGApKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRyb2xzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmNvbnRyb2xzO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogRGF0ZSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKSA/PyBudWxsO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IERhdGUpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIEJvb2xlYW5GaWVsZFxuICAgIGV4dGVuZHMgRmllbGRcbiAgICBpbXBsZW1lbnRzIFhybS5BdHRyaWJ1dGVzLkJvb2xlYW5BdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLkJvb2xlYW5BdHRyaWJ1dGU7XG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyKGF0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGdldEF0dHJpYnV0ZVR5cGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVHlwZSgpO1xuICAgIH1cbiAgICBnZXRJbml0aWFsVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0SW5pdGlhbFZhbHVlKCk7XG4gICAgfVxuICAgIGdldCBBdHRyaWJ1dGUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCAnJHt0aGlzLk5hbWV9JyBkb2VzIG5vdCBleGlzdGApKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRyb2xzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmNvbnRyb2xzO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKSA/PyBudWxsO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0T3B0aW9uU2V0RmllbGQ8T3B0aW9ucyBleHRlbmRzIE9wdGlvblZhbHVlcz5cbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5NdWx0aVNlbGVjdE9wdGlvblNldEF0dHJpYnV0ZVxuICB7XG4gICAgcHJvdGVjdGVkIGRlY2xhcmUgX2F0dHJpYnV0ZTogWHJtLkF0dHJpYnV0ZXMuTXVsdGlTZWxlY3RPcHRpb25TZXRBdHRyaWJ1dGU7XG4gICAgT3B0aW9uOiBPcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgb3B0aW9uPzogT3B0aW9ucykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlTmFtZSk7XG4gICAgICB0aGlzLk9wdGlvbiA9IG9wdGlvbjtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLk9wdGlvblNldEF0dHJpYnV0ZUZvcm1hdCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0Rm9ybWF0KCkgYXMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRPcHRpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyk6IFhybS5PcHRpb25TZXRWYWx1ZSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRPcHRpb24odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGdldE9wdGlvbnMoKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbnMoKTtcbiAgICB9XG4gICAgZ2V0U2VsZWN0ZWRPcHRpb24oKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFNlbGVjdGVkT3B0aW9uKCk7XG4gICAgfVxuICAgIGdldFRleHQoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFRleHQoKTtcbiAgICB9XG4gICAgZ2V0SW5pdGlhbFZhbHVlKCk6IG51bWJlcltdIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJbml0aWFsVmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBudW1iZXJbXSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKTtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiAoa2V5b2YgT3B0aW9ucylbXSB8IG51bWJlcltdKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2ID09IFwibnVtYmVyXCIpIHZhbHVlcy5wdXNoKHYpO1xuICAgICAgICAgIGVsc2UgdmFsdWVzLnB1c2godGhpcy5PcHRpb25bdl0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0VmFsdWUodmFsdWVzKTtcbiAgICAgIH0gZWxzZSBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCBWYWx1ZSAnJHt2YWx1ZX0nIGlzIG5vdCBhbiBBcnJheWApO1xuICAgIH1cbiAgfVxuICBleHBvcnQgY2xhc3MgTG9va3VwRmllbGRcbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5Mb29rdXBBdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLkxvb2t1cEF0dHJpYnV0ZTtcbiAgICBwcm90ZWN0ZWQgX2N1c3RvbUZpbHRlcnM6IGFueSA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgICBzdXBlcihhdHRyaWJ1dGUpO1xuICAgIH1cbiAgICBnZXRJc1BhcnR5TGlzdCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJc1BhcnR5TGlzdCgpO1xuICAgIH1cbiAgICBnZXQgQXR0cmlidXRlKCkge1xuICAgICAgcmV0dXJuICh0aGlzLl9hdHRyaWJ1dGUgPz89XG4gICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZ2V0QXR0cmlidXRlKHRoaXMuTmFtZSkgPz9cbiAgICAgICAgWHJtRXgudGhyb3dFcnJvcihgRmllbGQgJyR7dGhpcy5OYW1lfScgZG9lcyBub3QgZXhpc3RgKSk7XG4gICAgfVxuICAgIGdldCBjb250cm9scygpIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5jb250cm9scztcbiAgICB9XG4gICAgLyoqR2V0cyB0aGUgaWQgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IElkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuVmFsdWUgJiYgdGhpcy5WYWx1ZS5sZW5ndGggPiAwXG4gICAgICAgID8gWHJtRXgubm9ybWFsaXplR3VpZCh0aGlzLlZhbHVlWzBdLmlkKVxuICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIC8qKkdldHMgdGhlIGVudGl0eVR5cGUgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IEVudGl0eVR5cGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5WYWx1ZSAmJiB0aGlzLlZhbHVlLmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLlZhbHVlWzBdLmVudGl0eVR5cGVcbiAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICAvKipHZXRzIHRoZSBmb3JtYXR0ZWQgdmFsdWUgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IEZvcm1hdHRlZFZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuVmFsdWUgJiYgdGhpcy5WYWx1ZS5sZW5ndGggPiAwID8gdGhpcy5WYWx1ZVswXS5uYW1lIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0IFZhbHVlKCk6IFhybS5Mb29rdXBWYWx1ZVtdIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpID8/IG51bGw7XG4gICAgfVxuICAgIHNldCBWYWx1ZSh2YWx1ZTogWHJtLkxvb2t1cFZhbHVlW10pIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBsb29rdXBcbiAgICAgKiBAcGFyYW0gaWQgR3VpZCBvZiB0aGUgcmVjb3JkXG4gICAgICogQHBhcmFtIGVudGl0eVR5cGUgbG9naWNhbG5hbWUgb2YgdGhlIGVudGl0eVxuICAgICAqIEBwYXJhbSBuYW1lIGZvcm1hdHRlZCB2YWx1ZVxuICAgICAqIEBwYXJhbSBhcHBlbmQgaWYgdHJ1ZSwgYWRkcyB2YWx1ZSB0byB0aGUgYXJyYXkgaW5zdGVhZCBvZiByZXBsYWNpbmcgaXRcbiAgICAgKi9cbiAgICBzZXRMb29rdXBWYWx1ZShcbiAgICAgIGlkOiBzdHJpbmcsXG4gICAgICBlbnRpdHlUeXBlOiBhbnksXG4gICAgICBuYW1lOiBhbnksXG4gICAgICBhcHBlbmQgPSBmYWxzZVxuICAgICk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKGBubyBpZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkLmApO1xuICAgICAgICBpZiAoIWVudGl0eVR5cGUpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBlbnRpdHlUeXBlIHBhcmFtZXRlciB3YXMgcHJvdmlkZWQuYCk7XG4gICAgICAgIGlkID0gWHJtRXgubm9ybWFsaXplR3VpZChpZCk7XG4gICAgICAgIGNvbnN0IGxvb2t1cFZhbHVlID0ge1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGVudGl0eVR5cGUsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5WYWx1ZSA9XG4gICAgICAgICAgYXBwZW5kICYmIHRoaXMuVmFsdWUgPyB0aGlzLlZhbHVlLmNvbmNhdChsb29rdXBWYWx1ZSkgOiBbbG9va3VwVmFsdWVdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYW4gZW50aXR5IHJlY29yZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAoT3B0aW9uYWwpIE9EYXRhIHN5c3RlbSBxdWVyeSBvcHRpb25zLCAkc2VsZWN0IGFuZCAkZXhwYW5kLCB0byByZXRyaWV2ZSB5b3VyIGRhdGEuXG4gICAgICogLSBVc2UgdGhlICRzZWxlY3Qgc3lzdGVtIHF1ZXJ5IG9wdGlvbiB0byBsaW1pdCB0aGUgcHJvcGVydGllcyByZXR1cm5lZCBieSBpbmNsdWRpbmcgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgKiAgIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMuIFRoaXMgaXMgYW4gaW1wb3J0YW50IHBlcmZvcm1hbmNlIGJlc3QgcHJhY3RpY2UuIElmIHByb3BlcnRpZXMgYXJlbuKAmXRcbiAgICAgKiAgIHNwZWNpZmllZCB1c2luZyAkc2VsZWN0LCBhbGwgcHJvcGVydGllcyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIC0gVXNlIHRoZSAkZXhwYW5kIHN5c3RlbSBxdWVyeSBvcHRpb24gdG8gY29udHJvbCB3aGF0IGRhdGEgZnJvbSByZWxhdGVkIGVudGl0aWVzIGlzIHJldHVybmVkLiBJZiB5b3VcbiAgICAgKiAgIGp1c3QgaW5jbHVkZSB0aGUgbmFtZSBvZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSwgeW914oCZbGwgcmVjZWl2ZSBhbGwgdGhlIHByb3BlcnRpZXMgZm9yIHJlbGF0ZWRcbiAgICAgKiAgIHJlY29yZHMuIFlvdSBjYW4gbGltaXQgdGhlIHByb3BlcnRpZXMgcmV0dXJuZWQgZm9yIHJlbGF0ZWQgcmVjb3JkcyB1c2luZyB0aGUgJHNlbGVjdCBzeXN0ZW0gcXVlcnlcbiAgICAgKiAgIG9wdGlvbiBpbiBwYXJlbnRoZXNlcyBhZnRlciB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lLiBVc2UgdGhpcyBmb3IgYm90aCBzaW5nbGUtdmFsdWVkIGFuZFxuICAgICAqICAgY29sbGVjdGlvbi12YWx1ZWQgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzLlxuICAgICAqIC0gWW91IGNhbiBhbHNvIHNwZWNpZnkgbXVsdGlwbGUgcXVlcnkgb3B0aW9ucyBieSB1c2luZyAmIHRvIHNlcGFyYXRlIHRoZSBxdWVyeSBvcHRpb25zLlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPm9wdGlvbnMgZXhhbXBsZTo8L2NhcHRpb24+XG4gICAgICogb3B0aW9uczogJHNlbGVjdD1uYW1lJiRleHBhbmQ9cHJpbWFyeWNvbnRhY3RpZCgkc2VsZWN0PWNvbnRhY3RpZCxmdWxsbmFtZSlcbiAgICAgKiBAcmV0dXJucyBPbiBzdWNjZXNzLCByZXR1cm5zIGEgcHJvbWlzZSBjb250YWluaW5nIGEgSlNPTiBvYmplY3Qgd2l0aCB0aGUgcmV0cmlldmVkIGF0dHJpYnV0ZXMgYW5kIHRoZWlyIHZhbHVlcy5cbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9keW5hbWljczM2NS9jdXN0b21lci1lbmdhZ2VtZW50L2RldmVsb3Blci9jbGllbnRhcGkvcmVmZXJlbmNlL3hybS13ZWJhcGkvcmV0cmlldmVyZWNvcmQgRXh0ZXJuYWwgTGluazogcmV0cmlldmVSZWNvcmQgKENsaWVudCBBUEkgcmVmZXJlbmNlKX1cbiAgICAgKi9cbiAgICBhc3luYyByZXRyaWV2ZShvcHRpb25zOiBzdHJpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghdGhpcy5JZCB8fCAhdGhpcy5FbnRpdHlUeXBlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgWHJtLldlYkFwaS5yZXRyaWV2ZVJlY29yZChcbiAgICAgICAgICB0aGlzLkVudGl0eVR5cGUsXG4gICAgICAgICAgdGhpcy5JZCxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBhZGRpdGlvbmFsIGN1c3RvbSBmaWx0ZXIgdG8gdGhlIGxvb2t1cCwgd2l0aCB0aGUgXCJBTkRcIiBmaWx0ZXIgb3BlcmF0b3IuXG4gICAgICogQHBhcmFtIGZpbHRlciBTcGVjaWZpZXMgdGhlIGZpbHRlciwgYXMgYSBzZXJpYWxpemVkIEZldGNoWE1MIFwiZmlsdGVyXCIgbm9kZS5cbiAgICAgKiBAcGFyYW0gZW50aXR5TG9naWNhbE5hbWUgKE9wdGlvbmFsKSBUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBlbnRpdHkuXG4gICAgICogQHJlbWFya3MgICAgIElmIGVudGl0eUxvZ2ljYWxOYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBlbnRpdGllc1xuICAgICAqICAgICAgICAgICAgICB2YWxpZCBmb3IgdGhlIExvb2t1cCBjb250cm9sLlxuICAgICAqIEBleGFtcGxlICAgICBFeGFtcGxlIGZpbHRlcjogPGZpbHRlciB0eXBlPVwiYW5kXCI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIGF0dHJpYnV0ZT1cImFkZHJlc3MxX2NpdHlcIiBvcGVyYXRvcj1cImVxXCIgdmFsdWU9XCJSZWRtb25kXCIgLz5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAqL1xuICAgIGFkZFByZUZpbHRlclRvTG9va3VwKGZpbHRlclhtbDogc3RyaW5nLCBlbnRpdHlMb2dpY2FsTmFtZT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgX2FkZEN1c3RvbUZpbHRlci5jb250cm9scyA9IHRoaXMuY29udHJvbHM7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkUHJlU2VhcmNoKF9hZGRDdXN0b21GaWx0ZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fY3VzdG9tRmlsdGVycy5wdXNoKF9hZGRDdXN0b21GaWx0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfYWRkQ3VzdG9tRmlsdGVyKCkge1xuICAgICAgICBfYWRkQ3VzdG9tRmlsdGVyLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb250cm9sLmFkZEN1c3RvbUZpbHRlcihmaWx0ZXJYbWwsIGVudGl0eUxvZ2ljYWxOYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gYWRkaXRpb25hbCBjdXN0b20gZmlsdGVyIHRvIHRoZSBsb29rdXAsIHdpdGggdGhlIFwiQU5EXCIgZmlsdGVyIG9wZXJhdG9yLlxuICAgICAqIEBwYXJhbSBlbnRpdHlMb2dpY2FsTmFtZSAoT3B0aW9uYWwpIFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gcHJpbWFyeUF0dHJpYnV0ZUlkTmFtZSAoT3B0aW9uYWwpIFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5LlxuICAgICAqIEBwYXJhbSBmZXRjaFhtbCBTcGVjaWZpZXMgdGhlIEZldGNoWE1MIHVzZWQgdG8gZmlsdGVyLlxuICAgICAqIEByZW1hcmtzICAgICBJZiBlbnRpdHlMb2dpY2FsTmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZmlsdGVyIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgZW50aXRpZXNcbiAgICAgKiAgICAgICAgICAgICAgdmFsaWQgZm9yIHRoZSBMb29rdXAgY29udHJvbC5cbiAgICAgKiBAZXhhbXBsZSAgICAgRXhhbXBsZSBmZXRjaFhtbDogPGZldGNoPlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudGl0eSBuYW1lPVwiY29udGFjdFwiPlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBhdHRyaWJ1dGU9XCJhZGRyZXNzMV9jaXR5XCIgb3BlcmF0b3I9XCJlcVwiIHZhbHVlPVwiUmVkbW9uZFwiIC8+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudGl0eT5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmV0Y2g+XG4gICAgICovXG4gICAgYXN5bmMgYWRkUHJlRmlsdGVyVG9Mb29rdXBBZHZhbmNlZChcbiAgICAgIGVudGl0eUxvZ2ljYWxOYW1lOiBzdHJpbmcsXG4gICAgICBwcmltYXJ5QXR0cmlidXRlSWROYW1lOiBzdHJpbmcsXG4gICAgICBmZXRjaFhtbDogc3RyaW5nXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBYcm0uV2ViQXBpLm9ubGluZS5yZXRyaWV2ZU11bHRpcGxlUmVjb3JkcyhcbiAgICAgICAgICBlbnRpdHlMb2dpY2FsTmFtZSxcbiAgICAgICAgICBcIj9mZXRjaFhtbD1cIiArIGZldGNoWG1sXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXN1bHQuZW50aXRpZXM7XG4gICAgICAgIGxldCBmaWx0ZXJlZEVudGl0aWVzID0gXCJcIjtcbiAgICAgICAgX2FkZEN1c3RvbUZpbHRlci5jb250cm9scyA9IHRoaXMuY29udHJvbHM7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGZpbHRlcmVkRW50aXRpZXMgKz0gYDx2YWx1ZT4ke2l0ZW1bcHJpbWFyeUF0dHJpYnV0ZUlkTmFtZV19PC92YWx1ZT5gO1xuICAgICAgICB9KTtcbiAgICAgICAgZmV0Y2hYbWwgPSBmaWx0ZXJlZEVudGl0aWVzXG4gICAgICAgICAgPyBgPGZpbHRlcj48Y29uZGl0aW9uIGF0dHJpYnV0ZT0nJHtwcmltYXJ5QXR0cmlidXRlSWROYW1lfScgb3BlcmF0b3I9J2luJz4ke2ZpbHRlcmVkRW50aXRpZXN9PC9jb25kaXRpb24+PC9maWx0ZXI+YFxuICAgICAgICAgIDogYDxmaWx0ZXI+PGNvbmRpdGlvbiBhdHRyaWJ1dGU9JyR7cHJpbWFyeUF0dHJpYnV0ZUlkTmFtZX0nIG9wZXJhdG9yPSdudWxsJy8+PC9maWx0ZXI+YDtcbiAgICAgICAgdGhpcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgY29udHJvbC5hZGRQcmVTZWFyY2goX2FkZEN1c3RvbUZpbHRlcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9jdXN0b21GaWx0ZXJzLnB1c2goX2FkZEN1c3RvbUZpbHRlcik7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9hZGRDdXN0b21GaWx0ZXIoKSB7XG4gICAgICAgIF9hZGRDdXN0b21GaWx0ZXIuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkQ3VzdG9tRmlsdGVyKGZldGNoWG1sLCBlbnRpdHlMb2dpY2FsTmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBmaWx0ZXJzIHNldCBvbiB0aGUgY3VycmVudCBsb29rdXAgYXR0cmlidXRlIGJ5IHVzaW5nIGFkZFByZUZpbHRlclRvTG9va3VwIG9yIGFkZFByZUZpbHRlclRvTG9va3VwQWR2YW5jZWRcbiAgICAgKi9cbiAgICBjbGVhclByZUZpbHRlckZyb21Mb29rdXAoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9jdXN0b21GaWx0ZXJzLmZvckVhY2goXG4gICAgICAgICAgKGN1c3RvbUZpbHRlcjogWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnRyb2wucmVtb3ZlUHJlU2VhcmNoKGN1c3RvbUZpbHRlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHR5cGUgT3B0aW9uVmFsdWVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IG51bWJlcjtcbiAgfTtcbiAgZXhwb3J0IGNsYXNzIE9wdGlvbnNldEZpZWxkPE9wdGlvbnMgZXh0ZW5kcyBPcHRpb25WYWx1ZXM+XG4gICAgZXh0ZW5kcyBGaWVsZFxuICAgIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlXG4gIHtcbiAgICBwcm90ZWN0ZWQgZGVjbGFyZSBfYXR0cmlidXRlOiBYcm0uQXR0cmlidXRlcy5PcHRpb25TZXRBdHRyaWJ1dGU7XG4gICAgcHJvdGVjdGVkIF9jb250cm9sITogWHJtLkNvbnRyb2xzLk9wdGlvblNldENvbnRyb2w7XG4gICAgT3B0aW9uOiBPcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgb3B0aW9uPzogT3B0aW9ucykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlTmFtZSk7XG4gICAgICB0aGlzLk9wdGlvbiA9IG9wdGlvbjtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLk9wdGlvblNldEF0dHJpYnV0ZUZvcm1hdCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0Rm9ybWF0KCkgYXMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRPcHRpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyk6IFhybS5PcHRpb25TZXRWYWx1ZSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRPcHRpb24odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGdldE9wdGlvbnMoKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbnMoKTtcbiAgICB9XG4gICAgZ2V0U2VsZWN0ZWRPcHRpb24oKTogWHJtLk9wdGlvblNldFZhbHVlIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRTZWxlY3RlZE9wdGlvbigpO1xuICAgIH1cbiAgICBnZXRUZXh0KCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VGV4dCgpO1xuICAgIH1cbiAgICBnZXRJbml0aWFsVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJbml0aWFsVmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBjb250cm9sKCkge1xuICAgICAgcmV0dXJuICh0aGlzLl9jb250cm9sID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldENvbnRyb2wodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBDb250cm9sICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IGtleW9mIE9wdGlvbnMgfCBudW1iZXIpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIikgdGhpcy5BdHRyaWJ1dGUuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgZWxzZSB0aGlzLkF0dHJpYnV0ZS5zZXRWYWx1ZSh0aGlzLk9wdGlvblt2YWx1ZV0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIG9wdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgYW4gYXJyYXkgd2l0aCB0aGUgb3B0aW9uIHZhbHVlcyB0byBhZGRcbiAgICAgKiBAcGFyYW0gaW5kZXggKE9wdGlvbmFsKSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBvcHRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayB0aGF0IHRoZSB2YWx1ZXMgd2l0aGluIHRoZSBvcHRpb25zIHlvdSBhZGQgYXJlIHZhbGlkLlxuICAgICAqICAgICAgICAgIElmIGluZGV4IGlzIG5vdCBwcm92aWRlZCwgdGhlIG5ldyBvcHRpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAqL1xuICAgIGFkZE9wdGlvbih2YWx1ZXM6IG51bWJlcltdLCBpbmRleD86IG51bWJlcik6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZXMgaXMgbm90IGFuIEFycmF5OlxcbnZhbHVlczogJyR7dmFsdWVzfSdgKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uU2V0VmFsdWVzID0gdGhpcy5jb250cm9sLmdldEF0dHJpYnV0ZSgpLmdldE9wdGlvbnMoKSA/PyBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG9wdGlvblNldFZhbHVlcykge1xuICAgICAgICAgIGlmICh2YWx1ZXMuaW5jbHVkZXMoZWxlbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5hZGRPcHRpb24oZWxlbWVudCwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBvcHRpb24gbWF0Y2hpbmcgdGhlIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZS5cbiAgICAgKi9cbiAgICByZW1vdmVPcHRpb24odmFsdWVzOiBudW1iZXJbXSk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZXMgaXMgbm90IGFuIEFycmF5OlxcbnZhbHVlczogJyR7dmFsdWVzfSdgKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uU2V0VmFsdWVzID0gdGhpcy5jb250cm9sLmdldEF0dHJpYnV0ZSgpLmdldE9wdGlvbnMoKSA/PyBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG9wdGlvblNldFZhbHVlcykge1xuICAgICAgICAgIGlmICh2YWx1ZXMuaW5jbHVkZXMoZWxlbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5yZW1vdmVPcHRpb24oZWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBjbGVhck9wdGlvbnMoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2wuY2xlYXJPcHRpb25zKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBTZWN0aW9uIGltcGxlbWVudHMgWHJtLkNvbnRyb2xzLlNlY3Rpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSBOYW1lITogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfc2VjdGlvbj86IFhybS5Db250cm9scy5TZWN0aW9uO1xuICAgIHB1YmxpYyBwYXJlbnRUYWI/OiBYcm0uQ29udHJvbHMuVGFiO1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgICAgdGhpcy5OYW1lID0gbmFtZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBTZWN0aW9uKCk6IFhybS5Db250cm9scy5TZWN0aW9uIHtcbiAgICAgIHJldHVybiAodGhpcy5fc2VjdGlvbiA/Pz1cbiAgICAgICAgdGhpcy5wYXJlbnRUYWIuc2VjdGlvbnMuZ2V0KHRoaXMuTmFtZSkgPz9cbiAgICAgICAgWHJtRXgudGhyb3dFcnJvcihcbiAgICAgICAgICBgVGhlIHNlY3Rpb24gJyR7dGhpcy5OYW1lfScgd2FzIG5vdCBmb3VuZCBvbiB0aGUgZm9ybS5gXG4gICAgICAgICkpO1xuICAgIH1cbiAgICBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5TZWN0aW9uLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5Db250cm9scy5UYWIge1xuICAgICAgcmV0dXJuIHRoaXMuU2VjdGlvbi5nZXRQYXJlbnQoKTtcbiAgICB9XG4gICAgY29udHJvbHM6IFhybS5Db2xsZWN0aW9uLkl0ZW1Db2xsZWN0aW9uPFhybS5Db250cm9scy5Db250cm9sPjtcbiAgICBzZXRWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlNlY3Rpb24uc2V0VmlzaWJsZSh2aXNpYmxlKTtcbiAgICB9XG4gICAgZ2V0VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLlNlY3Rpb24uZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuU2VjdGlvbi5nZXRMYWJlbCgpO1xuICAgIH1cbiAgICBzZXRMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5TZWN0aW9uLnNldExhYmVsKGxhYmVsKTtcbiAgICB9XG4gIH1cbiAgdHlwZSBUYWJTZWN0aW9ucyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBTZWN0aW9uO1xuICB9O1xuICBleHBvcnQgY2xhc3MgVGFiPFNlY3Rpb25zIGV4dGVuZHMgVGFiU2VjdGlvbnM+IGltcGxlbWVudHMgWHJtLkNvbnRyb2xzLlRhYiB7XG4gICAgcHVibGljIHJlYWRvbmx5IE5hbWUhOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF90YWI/OiBYcm0uQ29udHJvbHMuVGFiO1xuICAgIFNlY3Rpb246IFNlY3Rpb25zO1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2VjdGlvbj86IFNlY3Rpb25zKSB7XG4gICAgICB0aGlzLk5hbWUgPSBuYW1lO1xuICAgICAgdGhpcy5TZWN0aW9uID0gc2VjdGlvbjtcbiAgICAgIGZvciAobGV0IGtleSBpbiBzZWN0aW9uKSB7XG4gICAgICAgIHNlY3Rpb25ba2V5XS5wYXJlbnRUYWIgPSB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICBzZWN0aW9uczogWHJtLkNvbGxlY3Rpb24uSXRlbUNvbGxlY3Rpb248WHJtLkNvbnRyb2xzLlNlY3Rpb24+O1xuXG4gICAgcHVibGljIGdldCBUYWIoKTogWHJtLkNvbnRyb2xzLlRhYiB7XG4gICAgICByZXR1cm4gKHRoaXMuX3RhYiA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC51aS50YWJzLmdldCh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYFRoZSB0YWIgJyR7dGhpcy5OYW1lfScgd2FzIG5vdCBmb3VuZCBvbiB0aGUgZm9ybS5gKSk7XG4gICAgfVxuICAgIGFkZFRhYlN0YXRlQ2hhbmdlKGhhbmRsZXI6IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXIpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5hZGRUYWJTdGF0ZUNoYW5nZShoYW5kbGVyKTtcbiAgICB9XG4gICAgZ2V0RGlzcGxheVN0YXRlKCk6IFhybS5EaXNwbGF5U3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLmdldERpc3BsYXlTdGF0ZSgpO1xuICAgIH1cbiAgICBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuZ2V0TmFtZSgpO1xuICAgIH1cbiAgICBnZXRQYXJlbnQoKTogWHJtLlVpIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5nZXRQYXJlbnQoKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFiU3RhdGVDaGFuZ2UoaGFuZGxlcjogWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlcik6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnJlbW92ZVRhYlN0YXRlQ2hhbmdlKGhhbmRsZXIpO1xuICAgIH1cbiAgICBzZXREaXNwbGF5U3RhdGUoZGlzcGxheVN0YXRlOiBYcm0uRGlzcGxheVN0YXRlKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuc2V0RGlzcGxheVN0YXRlKGRpc3BsYXlTdGF0ZSk7XG4gICAgfVxuICAgIHNldFZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnNldFZpc2libGUodmlzaWJsZSk7XG4gICAgfVxuICAgIGdldFZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLmdldExhYmVsKCk7XG4gICAgfVxuICAgIHNldExhYmVsKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5zZXRMYWJlbChsYWJlbCk7XG4gICAgfVxuICAgIHNldEZvY3VzKCk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnNldEZvY3VzKCk7XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBHcmlkQ29udHJvbCBpbXBsZW1lbnRzIFhybS5Db250cm9scy5HcmlkQ29udHJvbCB7XG4gICAgcHVibGljIHJlYWRvbmx5IE5hbWUhOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9ncmlkQ29udHJvbD86IFhybS5Db250cm9scy5HcmlkQ29udHJvbDtcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuTmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgR3JpZENvbnRyb2woKTogWHJtLkNvbnRyb2xzLkdyaWRDb250cm9sIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh0aGlzLl9ncmlkQ29udHJvbCA/Pz1cbiAgICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldENvbnRyb2w8WHJtLkNvbnRyb2xzLkdyaWRDb250cm9sPih0aGlzLk5hbWUpKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBUaGUgZ3JpZCAnJHt0aGlzLk5hbWV9JyB3YXMgbm90IGZvdW5kIG9uIHRoZSBmb3JtLmApXG4gICAgICApO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IEdyaWQoKTogWHJtLkNvbnRyb2xzLkdyaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0R3JpZCgpO1xuICAgIH1cbiAgICBhZGRPbkxvYWQoaGFuZGxlcjogWHJtLkV2ZW50cy5HcmlkQ29udHJvbC5Mb2FkRXZlbnRIYW5kbGVyKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5HcmlkQ29udHJvbC5hZGRPbkxvYWQoaGFuZGxlcik7XG4gICAgfVxuICAgIGdldENvbnRleHRUeXBlKCk6IFhybUVudW0uR3JpZENvbnRyb2xDb250ZXh0IHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldENvbnRleHRUeXBlKCk7XG4gICAgfVxuICAgIGdldEVudGl0eU5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldEVudGl0eU5hbWUoKTtcbiAgICB9XG4gICAgZ2V0RmV0Y2hYbWwoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldEZldGNoWG1sKCk7XG4gICAgfVxuICAgIGdldEdyaWQoKTogWHJtLkNvbnRyb2xzLkdyaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0R3JpZCgpO1xuICAgIH1cbiAgICBnZXRSZWxhdGlvbnNoaXAoKTogWHJtLkNvbnRyb2xzLkdyaWRSZWxhdGlvbnNoaXAge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0UmVsYXRpb25zaGlwKCk7XG4gICAgfVxuICAgIGdldFVybChjbGllbnQ/OiBYcm1FbnVtLkdyaWRDbGllbnQpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0VXJsKGNsaWVudCk7XG4gICAgfVxuICAgIGdldFZpZXdTZWxlY3RvcigpOiBYcm0uQ29udHJvbHMuVmlld1NlbGVjdG9yIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldFZpZXdTZWxlY3RvcigpO1xuICAgIH1cbiAgICBvcGVuUmVsYXRlZEdyaWQoKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5HcmlkQ29udHJvbC5vcGVuUmVsYXRlZEdyaWQoKTtcbiAgICB9XG4gICAgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlZnJlc2goKTtcbiAgICB9XG4gICAgcmVmcmVzaFJpYmJvbigpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlZnJlc2hSaWJib24oKTtcbiAgICB9XG4gICAgcmVtb3ZlT25Mb2FkKGhhbmRsZXI6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlbW92ZU9uTG9hZChoYW5kbGVyKTtcbiAgICB9XG4gICAgZ2V0Q29udHJvbFR5cGUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldENvbnRyb2xUeXBlKCk7XG4gICAgfVxuICAgIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5Db250cm9scy5TZWN0aW9uIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldFBhcmVudCgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0TGFiZWwoKTtcbiAgICB9XG4gICAgc2V0TGFiZWwobGFiZWw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuc2V0TGFiZWwobGFiZWwpO1xuICAgIH1cbiAgICBnZXRWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBzZXRWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnNldFZpc2libGUodmlzaWJsZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
\ No newline at end of file
diff --git a/docs/classes/XrmEx.BooleanField.md b/docs/classes/XrmEx.BooleanField.md
index 14135e2..a389e4e 100644
--- a/docs/classes/XrmEx.BooleanField.md
+++ b/docs/classes/XrmEx.BooleanField.md
@@ -78,7 +78,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:915](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L915)
+[XrmEx.ts:915](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L915)
## Properties
@@ -92,7 +92,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584)
+[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584)
___
@@ -106,7 +106,7 @@ ___
#### Defined in
-[XrmEx.ts:914](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L914)
+[XrmEx.ts:914](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L914)
___
@@ -120,7 +120,7 @@ ___
#### Defined in
-[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582)
+[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582)
## Accessors
@@ -138,7 +138,7 @@ Field.Attribute
#### Defined in
-[XrmEx.ts:924](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L924)
+[XrmEx.ts:924](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L924)
___
@@ -160,7 +160,7 @@ Field.Value
#### Defined in
-[XrmEx.ts:932](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L932)
+[XrmEx.ts:932](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L932)
• `set` **Value**(`value`): `void`
@@ -180,7 +180,7 @@ Field.Value
#### Defined in
-[XrmEx.ts:935](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L935)
+[XrmEx.ts:935](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L935)
___
@@ -202,7 +202,7 @@ Field.controls
#### Defined in
-[XrmEx.ts:929](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L929)
+[XrmEx.ts:929](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L929)
## Methods
@@ -231,7 +231,7 @@ Displays an error or recommendation notification for a control, and lets you spe
#### Defined in
-[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778)
+[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778)
___
@@ -261,7 +261,7 @@ Xrm.Attributes.BooleanAttribute.addOnChange
#### Defined in
-[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750)
+[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750)
___
@@ -285,7 +285,7 @@ Xrm.Attributes.BooleanAttribute.fireOnChange
#### Defined in
-[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737)
+[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737)
___
@@ -307,7 +307,7 @@ Xrm.Attributes.BooleanAttribute.getAttributeType
#### Defined in
-[XrmEx.ts:918](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L918)
+[XrmEx.ts:918](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L918)
___
@@ -329,7 +329,7 @@ Xrm.Attributes.BooleanAttribute.getFormat
#### Defined in
-[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L603)
+[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L603)
___
@@ -347,7 +347,7 @@ Xrm.Attributes.BooleanAttribute.getInitialValue
#### Defined in
-[XrmEx.ts:921](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L921)
+[XrmEx.ts:921](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L921)
___
@@ -369,7 +369,7 @@ Xrm.Attributes.BooleanAttribute.getIsDirty
#### Defined in
-[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606)
+[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606)
___
@@ -391,7 +391,7 @@ Xrm.Attributes.BooleanAttribute.getName
#### Defined in
-[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609)
+[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609)
___
@@ -413,7 +413,7 @@ Xrm.Attributes.BooleanAttribute.getParent
#### Defined in
-[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612)
+[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612)
___
@@ -435,7 +435,7 @@ Xrm.Attributes.BooleanAttribute.getRequiredLevel
#### Defined in
-[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615)
+[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615)
___
@@ -457,7 +457,7 @@ Xrm.Attributes.BooleanAttribute.getSubmitMode
#### Defined in
-[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618)
+[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618)
___
@@ -479,7 +479,7 @@ Xrm.Attributes.BooleanAttribute.getUserPrivilege
#### Defined in
-[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621)
+[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621)
___
@@ -501,7 +501,7 @@ Xrm.Attributes.BooleanAttribute.getValue
#### Defined in
-[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630)
+[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630)
___
@@ -533,7 +533,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809)
+[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809)
___
@@ -561,7 +561,7 @@ Xrm.Attributes.BooleanAttribute.removeOnChange
#### Defined in
-[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624)
+[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624)
___
@@ -587,7 +587,7 @@ Sets the state of the control to either enabled, or disabled.
#### Defined in
-[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699)
+[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699)
___
@@ -616,7 +616,7 @@ Xrm.Attributes.BooleanAttribute.setIsValid
#### Defined in
-[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633)
+[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633)
___
@@ -650,7 +650,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669)
+[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669)
___
@@ -676,7 +676,7 @@ Sets the required level.
#### Defined in
-[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727)
+[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727)
___
@@ -706,7 +706,7 @@ Xrm.Attributes.BooleanAttribute.setRequiredLevel
#### Defined in
-[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712)
+[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712)
___
@@ -734,7 +734,7 @@ Xrm.Attributes.BooleanAttribute.setSubmitMode
#### Defined in
-[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627)
+[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627)
___
@@ -762,7 +762,7 @@ Xrm.Attributes.BooleanAttribute.setValue
#### Defined in
-[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597)
+[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597)
___
@@ -788,4 +788,4 @@ Sets the visibility state.
#### Defined in
-[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686)
+[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686)
diff --git a/docs/classes/XrmEx.DateField.md b/docs/classes/XrmEx.DateField.md
index cf51d7c..960dce0 100644
--- a/docs/classes/XrmEx.DateField.md
+++ b/docs/classes/XrmEx.DateField.md
@@ -77,7 +77,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:889](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L889)
+[XrmEx.ts:889](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L889)
## Properties
@@ -91,7 +91,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584)
+[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584)
___
@@ -105,7 +105,7 @@ ___
#### Defined in
-[XrmEx.ts:888](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L888)
+[XrmEx.ts:888](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L888)
___
@@ -119,7 +119,7 @@ ___
#### Defined in
-[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582)
+[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582)
## Accessors
@@ -137,7 +137,7 @@ Field.Attribute
#### Defined in
-[XrmEx.ts:895](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L895)
+[XrmEx.ts:895](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L895)
___
@@ -159,7 +159,7 @@ Field.Value
#### Defined in
-[XrmEx.ts:903](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L903)
+[XrmEx.ts:903](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L903)
• `set` **Value**(`value`): `void`
@@ -179,7 +179,7 @@ Field.Value
#### Defined in
-[XrmEx.ts:906](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L906)
+[XrmEx.ts:906](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L906)
___
@@ -201,7 +201,7 @@ Field.controls
#### Defined in
-[XrmEx.ts:900](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L900)
+[XrmEx.ts:900](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L900)
## Methods
@@ -230,7 +230,7 @@ Displays an error or recommendation notification for a control, and lets you spe
#### Defined in
-[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778)
+[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778)
___
@@ -260,7 +260,7 @@ Xrm.Attributes.DateAttribute.addOnChange
#### Defined in
-[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750)
+[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750)
___
@@ -284,7 +284,7 @@ Xrm.Attributes.DateAttribute.fireOnChange
#### Defined in
-[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737)
+[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737)
___
@@ -306,7 +306,7 @@ Xrm.Attributes.DateAttribute.getAttributeType
#### Defined in
-[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600)
+[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600)
___
@@ -328,7 +328,7 @@ Xrm.Attributes.DateAttribute.getFormat
#### Defined in
-[XrmEx.ts:892](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L892)
+[XrmEx.ts:892](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L892)
___
@@ -350,7 +350,7 @@ Xrm.Attributes.DateAttribute.getIsDirty
#### Defined in
-[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606)
+[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606)
___
@@ -372,7 +372,7 @@ Xrm.Attributes.DateAttribute.getName
#### Defined in
-[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609)
+[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609)
___
@@ -394,7 +394,7 @@ Xrm.Attributes.DateAttribute.getParent
#### Defined in
-[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612)
+[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612)
___
@@ -416,7 +416,7 @@ Xrm.Attributes.DateAttribute.getRequiredLevel
#### Defined in
-[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615)
+[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615)
___
@@ -438,7 +438,7 @@ Xrm.Attributes.DateAttribute.getSubmitMode
#### Defined in
-[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618)
+[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618)
___
@@ -460,7 +460,7 @@ Xrm.Attributes.DateAttribute.getUserPrivilege
#### Defined in
-[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621)
+[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621)
___
@@ -482,7 +482,7 @@ Xrm.Attributes.DateAttribute.getValue
#### Defined in
-[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630)
+[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630)
___
@@ -514,7 +514,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809)
+[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809)
___
@@ -542,7 +542,7 @@ Xrm.Attributes.DateAttribute.removeOnChange
#### Defined in
-[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624)
+[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624)
___
@@ -568,7 +568,7 @@ Sets the state of the control to either enabled, or disabled.
#### Defined in
-[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699)
+[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699)
___
@@ -597,7 +597,7 @@ Xrm.Attributes.DateAttribute.setIsValid
#### Defined in
-[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633)
+[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633)
___
@@ -631,7 +631,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669)
+[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669)
___
@@ -657,7 +657,7 @@ Sets the required level.
#### Defined in
-[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727)
+[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727)
___
@@ -687,7 +687,7 @@ Xrm.Attributes.DateAttribute.setRequiredLevel
#### Defined in
-[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712)
+[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712)
___
@@ -715,7 +715,7 @@ Xrm.Attributes.DateAttribute.setSubmitMode
#### Defined in
-[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627)
+[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627)
___
@@ -743,7 +743,7 @@ Xrm.Attributes.DateAttribute.setValue
#### Defined in
-[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597)
+[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597)
___
@@ -769,4 +769,4 @@ Sets the visibility state.
#### Defined in
-[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686)
+[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686)
diff --git a/docs/classes/XrmEx.Field.md b/docs/classes/XrmEx.Field.md
index b89bb2d..1c9f2c5 100644
--- a/docs/classes/XrmEx.Field.md
+++ b/docs/classes/XrmEx.Field.md
@@ -85,7 +85,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:587](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L587)
+[XrmEx.ts:587](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L587)
## Properties
@@ -95,7 +95,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584)
+[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584)
___
@@ -105,7 +105,7 @@ ___
#### Defined in
-[XrmEx.ts:585](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L585)
+[XrmEx.ts:585](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L585)
___
@@ -115,7 +115,7 @@ ___
#### Defined in
-[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582)
+[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582)
## Accessors
@@ -129,7 +129,7 @@ ___
#### Defined in
-[XrmEx.ts:637](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L637)
+[XrmEx.ts:637](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L637)
___
@@ -147,7 +147,7 @@ The value.
#### Defined in
-[XrmEx.ts:653](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L653)
+[XrmEx.ts:653](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L653)
• `set` **Value**(`value`): `void`
@@ -163,7 +163,7 @@ The value.
#### Defined in
-[XrmEx.ts:657](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L657)
+[XrmEx.ts:657](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L657)
___
@@ -181,7 +181,7 @@ Xrm.Attributes.Attribute.controls
#### Defined in
-[XrmEx.ts:645](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L645)
+[XrmEx.ts:645](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L645)
## Methods
@@ -206,7 +206,7 @@ Displays an error or recommendation notification for a control, and lets you spe
#### Defined in
-[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778)
+[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778)
___
@@ -232,7 +232,7 @@ Xrm.Attributes.Attribute.addOnChange
#### Defined in
-[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750)
+[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750)
___
@@ -252,7 +252,7 @@ Xrm.Attributes.Attribute.fireOnChange
#### Defined in
-[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737)
+[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737)
___
@@ -270,7 +270,7 @@ Xrm.Attributes.Attribute.getAttributeType
#### Defined in
-[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600)
+[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600)
___
@@ -288,7 +288,7 @@ Xrm.Attributes.Attribute.getFormat
#### Defined in
-[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L603)
+[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L603)
___
@@ -306,7 +306,7 @@ Xrm.Attributes.Attribute.getIsDirty
#### Defined in
-[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606)
+[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606)
___
@@ -324,7 +324,7 @@ Xrm.Attributes.Attribute.getName
#### Defined in
-[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609)
+[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609)
___
@@ -342,7 +342,7 @@ Xrm.Attributes.Attribute.getParent
#### Defined in
-[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612)
+[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612)
___
@@ -360,7 +360,7 @@ Xrm.Attributes.Attribute.getRequiredLevel
#### Defined in
-[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615)
+[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615)
___
@@ -378,7 +378,7 @@ Xrm.Attributes.Attribute.getSubmitMode
#### Defined in
-[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618)
+[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618)
___
@@ -396,7 +396,7 @@ Xrm.Attributes.Attribute.getUserPrivilege
#### Defined in
-[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621)
+[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621)
___
@@ -414,7 +414,7 @@ Xrm.Attributes.Attribute.getValue
#### Defined in
-[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630)
+[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630)
___
@@ -442,7 +442,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809)
+[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809)
___
@@ -466,7 +466,7 @@ Xrm.Attributes.Attribute.removeOnChange
#### Defined in
-[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624)
+[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624)
___
@@ -488,7 +488,7 @@ Sets the state of the control to either enabled, or disabled.
#### Defined in
-[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699)
+[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699)
___
@@ -513,7 +513,7 @@ Xrm.Attributes.Attribute.setIsValid
#### Defined in
-[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633)
+[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633)
___
@@ -543,7 +543,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669)
+[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669)
___
@@ -565,7 +565,7 @@ Sets the required level.
#### Defined in
-[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727)
+[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727)
___
@@ -591,7 +591,7 @@ Xrm.Attributes.Attribute.setRequiredLevel
#### Defined in
-[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712)
+[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712)
___
@@ -615,7 +615,7 @@ Xrm.Attributes.Attribute.setSubmitMode
#### Defined in
-[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627)
+[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627)
___
@@ -639,7 +639,7 @@ Xrm.Attributes.Attribute.setValue
#### Defined in
-[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597)
+[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597)
___
@@ -661,4 +661,4 @@ Sets the visibility state.
#### Defined in
-[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686)
+[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686)
diff --git a/docs/classes/XrmEx.Form.md b/docs/classes/XrmEx.Form.md
index b175c18..412db2b 100644
--- a/docs/classes/XrmEx.Form.md
+++ b/docs/classes/XrmEx.Form.md
@@ -44,7 +44,7 @@ Represents a form in Dynamics 365.
#### Defined in
-[XrmEx.ts:384](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L384)
+[XrmEx.ts:384](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L384)
## Properties
@@ -54,7 +54,7 @@ Represents a form in Dynamics 365.
#### Defined in
-[XrmEx.ts:383](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L383)
+[XrmEx.ts:383](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L383)
___
@@ -64,7 +64,7 @@ ___
#### Defined in
-[XrmEx.ts:382](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L382)
+[XrmEx.ts:382](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L382)
## Accessors
@@ -80,7 +80,7 @@ Returns true if form is from type create
#### Defined in
-[XrmEx.ts:422](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L422)
+[XrmEx.ts:422](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L422)
___
@@ -96,7 +96,7 @@ Returns true if form is not from type create
#### Defined in
-[XrmEx.ts:430](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L430)
+[XrmEx.ts:430](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L430)
___
@@ -112,7 +112,7 @@ Returns true if form is not from type update
#### Defined in
-[XrmEx.ts:434](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L434)
+[XrmEx.ts:434](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L434)
___
@@ -128,7 +128,7 @@ Returns true if form is from type update
#### Defined in
-[XrmEx.ts:426](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L426)
+[XrmEx.ts:426](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L426)
___
@@ -144,7 +144,7 @@ Gets a lookup value that references the record.
#### Defined in
-[XrmEx.ts:394](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L394)
+[XrmEx.ts:394](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L394)
___
@@ -160,7 +160,7 @@ Gets a reference to the current executio context
#### Defined in
-[XrmEx.ts:390](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L390)
+[XrmEx.ts:390](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L390)
• `Static` `set` **executionContext**(`context`): `void`
@@ -178,7 +178,7 @@ Sets a reference to the current execution context
#### Defined in
-[XrmEx.ts:409](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L409)
+[XrmEx.ts:409](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L409)
___
@@ -194,7 +194,7 @@ Gets a reference to the current form context
#### Defined in
-[XrmEx.ts:386](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L386)
+[XrmEx.ts:386](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L386)
• `Static` `set` **formContext**(`context`): `void`
@@ -212,7 +212,7 @@ Sets a reference to the current form context
#### Defined in
-[XrmEx.ts:398](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L398)
+[XrmEx.ts:398](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L398)
## Methods
@@ -239,7 +239,7 @@ true if it succeeds, otherwise false.
#### Defined in
-[XrmEx.ts:448](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L448)
+[XrmEx.ts:448](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L448)
___
@@ -263,7 +263,7 @@ Adds a handler to be called when the attribute's value is changed.
#### Defined in
-[XrmEx.ts:549](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L549)
+[XrmEx.ts:549](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L549)
___
@@ -285,7 +285,7 @@ Adds a function to be called when form data is loaded.
#### Defined in
-[XrmEx.ts:526](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L526)
+[XrmEx.ts:526](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L526)
___
@@ -315,7 +315,7 @@ Added in 9.2
#### Defined in
-[XrmEx.ts:503](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L503)
+[XrmEx.ts:503](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L503)
___
@@ -337,7 +337,7 @@ Adds a handler to be called when the record is saved.
#### Defined in
-[XrmEx.ts:478](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L478)
+[XrmEx.ts:478](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L478)
___
@@ -361,4 +361,4 @@ True if it succeeds, otherwise false.
#### Defined in
-[XrmEx.ts:468](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L468)
+[XrmEx.ts:468](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L468)
diff --git a/docs/classes/XrmEx.GridControl.md b/docs/classes/XrmEx.GridControl.md
index 79a7906..950daf4 100644
--- a/docs/classes/XrmEx.GridControl.md
+++ b/docs/classes/XrmEx.GridControl.md
@@ -60,7 +60,7 @@
#### Defined in
-[XrmEx.ts:1392](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1392)
+[XrmEx.ts:1392](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1392)
## Properties
@@ -70,7 +70,7 @@
#### Defined in
-[XrmEx.ts:1390](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1390)
+[XrmEx.ts:1390](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1390)
___
@@ -80,7 +80,7 @@ ___
#### Defined in
-[XrmEx.ts:1391](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1391)
+[XrmEx.ts:1391](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1391)
## Accessors
@@ -94,7 +94,7 @@ ___
#### Defined in
-[XrmEx.ts:1402](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1402)
+[XrmEx.ts:1402](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1402)
___
@@ -108,7 +108,7 @@ ___
#### Defined in
-[XrmEx.ts:1395](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1395)
+[XrmEx.ts:1395](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1395)
## Methods
@@ -132,7 +132,7 @@ Xrm.Controls.GridControl.addOnLoad
#### Defined in
-[XrmEx.ts:1405](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1405)
+[XrmEx.ts:1405](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1405)
___
@@ -150,7 +150,7 @@ Xrm.Controls.GridControl.getContextType
#### Defined in
-[XrmEx.ts:1408](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1408)
+[XrmEx.ts:1408](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1408)
___
@@ -168,7 +168,7 @@ Xrm.Controls.GridControl.getControlType
#### Defined in
-[XrmEx.ts:1441](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1441)
+[XrmEx.ts:1441](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1441)
___
@@ -186,7 +186,7 @@ Xrm.Controls.GridControl.getEntityName
#### Defined in
-[XrmEx.ts:1411](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1411)
+[XrmEx.ts:1411](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1411)
___
@@ -204,7 +204,7 @@ Xrm.Controls.GridControl.getFetchXml
#### Defined in
-[XrmEx.ts:1414](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1414)
+[XrmEx.ts:1414](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1414)
___
@@ -222,7 +222,7 @@ Xrm.Controls.GridControl.getGrid
#### Defined in
-[XrmEx.ts:1417](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1417)
+[XrmEx.ts:1417](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1417)
___
@@ -240,7 +240,7 @@ Xrm.Controls.GridControl.getLabel
#### Defined in
-[XrmEx.ts:1450](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1450)
+[XrmEx.ts:1450](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1450)
___
@@ -258,7 +258,7 @@ Xrm.Controls.GridControl.getName
#### Defined in
-[XrmEx.ts:1444](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1444)
+[XrmEx.ts:1444](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1444)
___
@@ -276,7 +276,7 @@ Xrm.Controls.GridControl.getParent
#### Defined in
-[XrmEx.ts:1447](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1447)
+[XrmEx.ts:1447](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1447)
___
@@ -294,7 +294,7 @@ Xrm.Controls.GridControl.getRelationship
#### Defined in
-[XrmEx.ts:1420](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1420)
+[XrmEx.ts:1420](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1420)
___
@@ -318,7 +318,7 @@ Xrm.Controls.GridControl.getUrl
#### Defined in
-[XrmEx.ts:1423](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1423)
+[XrmEx.ts:1423](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1423)
___
@@ -336,7 +336,7 @@ Xrm.Controls.GridControl.getViewSelector
#### Defined in
-[XrmEx.ts:1426](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1426)
+[XrmEx.ts:1426](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1426)
___
@@ -354,7 +354,7 @@ Xrm.Controls.GridControl.getVisible
#### Defined in
-[XrmEx.ts:1456](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1456)
+[XrmEx.ts:1456](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1456)
___
@@ -372,7 +372,7 @@ Xrm.Controls.GridControl.openRelatedGrid
#### Defined in
-[XrmEx.ts:1429](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1429)
+[XrmEx.ts:1429](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1429)
___
@@ -390,7 +390,7 @@ Xrm.Controls.GridControl.refresh
#### Defined in
-[XrmEx.ts:1432](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1432)
+[XrmEx.ts:1432](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1432)
___
@@ -408,7 +408,7 @@ Xrm.Controls.GridControl.refreshRibbon
#### Defined in
-[XrmEx.ts:1435](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1435)
+[XrmEx.ts:1435](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1435)
___
@@ -432,7 +432,7 @@ Xrm.Controls.GridControl.removeOnLoad
#### Defined in
-[XrmEx.ts:1438](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1438)
+[XrmEx.ts:1438](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1438)
___
@@ -456,7 +456,7 @@ Xrm.Controls.GridControl.setLabel
#### Defined in
-[XrmEx.ts:1453](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1453)
+[XrmEx.ts:1453](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1453)
___
@@ -480,4 +480,4 @@ Xrm.Controls.GridControl.setVisible
#### Defined in
-[XrmEx.ts:1459](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1459)
+[XrmEx.ts:1459](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1459)
diff --git a/docs/classes/XrmEx.LookupField.md b/docs/classes/XrmEx.LookupField.md
index f9c773c..7ae4103 100644
--- a/docs/classes/XrmEx.LookupField.md
+++ b/docs/classes/XrmEx.LookupField.md
@@ -87,7 +87,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:999](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L999)
+[XrmEx.ts:999](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L999)
## Properties
@@ -101,7 +101,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584)
+[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584)
___
@@ -115,7 +115,7 @@ ___
#### Defined in
-[XrmEx.ts:997](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L997)
+[XrmEx.ts:997](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L997)
___
@@ -125,7 +125,7 @@ ___
#### Defined in
-[XrmEx.ts:998](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L998)
+[XrmEx.ts:998](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L998)
___
@@ -139,7 +139,7 @@ ___
#### Defined in
-[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582)
+[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582)
## Accessors
@@ -157,7 +157,7 @@ Field.Attribute
#### Defined in
-[XrmEx.ts:1005](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1005)
+[XrmEx.ts:1005](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1005)
___
@@ -173,7 +173,7 @@ Gets the entityType of the first lookup value
#### Defined in
-[XrmEx.ts:1020](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1020)
+[XrmEx.ts:1020](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1020)
___
@@ -189,7 +189,7 @@ Gets the formatted value of the first lookup value
#### Defined in
-[XrmEx.ts:1026](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1026)
+[XrmEx.ts:1026](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1026)
___
@@ -205,7 +205,7 @@ Gets the id of the first lookup value
#### Defined in
-[XrmEx.ts:1014](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1014)
+[XrmEx.ts:1014](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1014)
___
@@ -227,7 +227,7 @@ Field.Value
#### Defined in
-[XrmEx.ts:1029](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1029)
+[XrmEx.ts:1029](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1029)
• `set` **Value**(`value`): `void`
@@ -247,7 +247,7 @@ Field.Value
#### Defined in
-[XrmEx.ts:1032](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1032)
+[XrmEx.ts:1032](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1032)
___
@@ -269,7 +269,7 @@ Field.controls
#### Defined in
-[XrmEx.ts:1010](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1010)
+[XrmEx.ts:1010](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1010)
## Methods
@@ -298,7 +298,7 @@ Displays an error or recommendation notification for a control, and lets you spe
#### Defined in
-[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778)
+[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778)
___
@@ -328,7 +328,7 @@ Xrm.Attributes.LookupAttribute.addOnChange
#### Defined in
-[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750)
+[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750)
___
@@ -364,7 +364,7 @@ Example filter:
#### Defined in
-[XrmEx.ts:1105](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1105)
+[XrmEx.ts:1105](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1105)
___
@@ -405,7 +405,7 @@ Example fetchXml:
#### Defined in
-[XrmEx.ts:1138](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1138)
+[XrmEx.ts:1138](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1138)
___
@@ -421,7 +421,7 @@ Removes all filters set on the current lookup attribute by using addPreFilterToL
#### Defined in
-[XrmEx.ts:1173](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1173)
+[XrmEx.ts:1173](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1173)
___
@@ -445,7 +445,7 @@ Xrm.Attributes.LookupAttribute.fireOnChange
#### Defined in
-[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737)
+[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737)
___
@@ -467,7 +467,7 @@ Xrm.Attributes.LookupAttribute.getAttributeType
#### Defined in
-[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600)
+[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600)
___
@@ -489,7 +489,7 @@ Xrm.Attributes.LookupAttribute.getFormat
#### Defined in
-[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L603)
+[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L603)
___
@@ -511,7 +511,7 @@ Xrm.Attributes.LookupAttribute.getIsDirty
#### Defined in
-[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606)
+[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606)
___
@@ -529,7 +529,7 @@ Xrm.Attributes.LookupAttribute.getIsPartyList
#### Defined in
-[XrmEx.ts:1002](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1002)
+[XrmEx.ts:1002](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1002)
___
@@ -551,7 +551,7 @@ Xrm.Attributes.LookupAttribute.getName
#### Defined in
-[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609)
+[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609)
___
@@ -573,7 +573,7 @@ Xrm.Attributes.LookupAttribute.getParent
#### Defined in
-[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612)
+[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612)
___
@@ -595,7 +595,7 @@ Xrm.Attributes.LookupAttribute.getRequiredLevel
#### Defined in
-[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615)
+[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615)
___
@@ -617,7 +617,7 @@ Xrm.Attributes.LookupAttribute.getSubmitMode
#### Defined in
-[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618)
+[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618)
___
@@ -639,7 +639,7 @@ Xrm.Attributes.LookupAttribute.getUserPrivilege
#### Defined in
-[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621)
+[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621)
___
@@ -661,7 +661,7 @@ Xrm.Attributes.LookupAttribute.getValue
#### Defined in
-[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630)
+[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630)
___
@@ -693,7 +693,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809)
+[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809)
___
@@ -721,7 +721,7 @@ Xrm.Attributes.LookupAttribute.removeOnChange
#### Defined in
-[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624)
+[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624)
___
@@ -756,7 +756,7 @@ On success, returns a promise containing a JSON object with the retrieved attrib
#### Defined in
-[XrmEx.ts:1082](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1082)
+[XrmEx.ts:1082](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1082)
___
@@ -782,7 +782,7 @@ Sets the state of the control to either enabled, or disabled.
#### Defined in
-[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699)
+[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699)
___
@@ -811,7 +811,7 @@ Xrm.Attributes.LookupAttribute.setIsValid
#### Defined in
-[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633)
+[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633)
___
@@ -836,7 +836,7 @@ Sets the value of a lookup
#### Defined in
-[XrmEx.ts:1042](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1042)
+[XrmEx.ts:1042](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1042)
___
@@ -870,7 +870,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669)
+[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669)
___
@@ -896,7 +896,7 @@ Sets the required level.
#### Defined in
-[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727)
+[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727)
___
@@ -926,7 +926,7 @@ Xrm.Attributes.LookupAttribute.setRequiredLevel
#### Defined in
-[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712)
+[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712)
___
@@ -954,7 +954,7 @@ Xrm.Attributes.LookupAttribute.setSubmitMode
#### Defined in
-[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627)
+[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627)
___
@@ -982,7 +982,7 @@ Xrm.Attributes.LookupAttribute.setValue
#### Defined in
-[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597)
+[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597)
___
@@ -1008,4 +1008,4 @@ Sets the visibility state.
#### Defined in
-[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686)
+[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686)
diff --git a/docs/classes/XrmEx.MultiSelectOptionSetField.md b/docs/classes/XrmEx.MultiSelectOptionSetField.md
index a556be3..56c4893 100644
--- a/docs/classes/XrmEx.MultiSelectOptionSetField.md
+++ b/docs/classes/XrmEx.MultiSelectOptionSetField.md
@@ -96,7 +96,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:945](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L945)
+[XrmEx.ts:945](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L945)
## Properties
@@ -110,7 +110,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584)
+[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584)
___
@@ -120,7 +120,7 @@ ___
#### Defined in
-[XrmEx.ts:944](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L944)
+[XrmEx.ts:944](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L944)
___
@@ -134,7 +134,7 @@ ___
#### Defined in
-[XrmEx.ts:943](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L943)
+[XrmEx.ts:943](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L943)
___
@@ -148,7 +148,7 @@ ___
#### Defined in
-[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582)
+[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582)
## Accessors
@@ -166,7 +166,7 @@ Field.Attribute
#### Defined in
-[XrmEx.ts:971](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L971)
+[XrmEx.ts:971](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L971)
___
@@ -188,7 +188,7 @@ Field.Value
#### Defined in
-[XrmEx.ts:979](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L979)
+[XrmEx.ts:979](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L979)
• `set` **Value**(`value`): `void`
@@ -208,7 +208,7 @@ Field.Value
#### Defined in
-[XrmEx.ts:982](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L982)
+[XrmEx.ts:982](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L982)
___
@@ -230,7 +230,7 @@ Field.controls
#### Defined in
-[XrmEx.ts:976](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L976)
+[XrmEx.ts:976](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L976)
## Methods
@@ -259,7 +259,7 @@ Displays an error or recommendation notification for a control, and lets you spe
#### Defined in
-[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778)
+[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778)
___
@@ -289,7 +289,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.addOnChange
#### Defined in
-[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750)
+[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750)
___
@@ -313,7 +313,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.fireOnChange
#### Defined in
-[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737)
+[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737)
___
@@ -335,7 +335,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getAttributeType
#### Defined in
-[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600)
+[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600)
___
@@ -357,7 +357,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getFormat
#### Defined in
-[XrmEx.ts:949](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L949)
+[XrmEx.ts:949](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L949)
___
@@ -375,7 +375,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getInitialValue
#### Defined in
-[XrmEx.ts:968](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L968)
+[XrmEx.ts:968](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L968)
___
@@ -397,7 +397,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getIsDirty
#### Defined in
-[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606)
+[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606)
___
@@ -419,7 +419,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getName
#### Defined in
-[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609)
+[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609)
___
@@ -443,7 +443,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getOption
#### Defined in
-[XrmEx.ts:952](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L952)
+[XrmEx.ts:952](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L952)
___
@@ -461,7 +461,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getOptions
#### Defined in
-[XrmEx.ts:959](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L959)
+[XrmEx.ts:959](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L959)
___
@@ -483,7 +483,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getParent
#### Defined in
-[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612)
+[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612)
___
@@ -505,7 +505,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getRequiredLevel
#### Defined in
-[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615)
+[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615)
___
@@ -523,7 +523,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getSelectedOption
#### Defined in
-[XrmEx.ts:962](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L962)
+[XrmEx.ts:962](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L962)
___
@@ -545,7 +545,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getSubmitMode
#### Defined in
-[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618)
+[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618)
___
@@ -563,7 +563,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getText
#### Defined in
-[XrmEx.ts:965](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L965)
+[XrmEx.ts:965](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L965)
___
@@ -585,7 +585,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getUserPrivilege
#### Defined in
-[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621)
+[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621)
___
@@ -607,7 +607,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getValue
#### Defined in
-[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630)
+[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630)
___
@@ -639,7 +639,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809)
+[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809)
___
@@ -667,7 +667,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.removeOnChange
#### Defined in
-[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624)
+[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624)
___
@@ -693,7 +693,7 @@ Sets the state of the control to either enabled, or disabled.
#### Defined in
-[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699)
+[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699)
___
@@ -722,7 +722,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.setIsValid
#### Defined in
-[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633)
+[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633)
___
@@ -756,7 +756,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669)
+[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669)
___
@@ -782,7 +782,7 @@ Sets the required level.
#### Defined in
-[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727)
+[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727)
___
@@ -812,7 +812,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.setRequiredLevel
#### Defined in
-[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712)
+[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712)
___
@@ -840,7 +840,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.setSubmitMode
#### Defined in
-[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627)
+[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627)
___
@@ -868,7 +868,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.setValue
#### Defined in
-[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597)
+[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597)
___
@@ -894,4 +894,4 @@ Sets the visibility state.
#### Defined in
-[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686)
+[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686)
diff --git a/docs/classes/XrmEx.NumberField.md b/docs/classes/XrmEx.NumberField.md
index 405d029..1555897 100644
--- a/docs/classes/XrmEx.NumberField.md
+++ b/docs/classes/XrmEx.NumberField.md
@@ -81,7 +81,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:854](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L854)
+[XrmEx.ts:854](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L854)
## Properties
@@ -95,7 +95,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584)
+[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584)
___
@@ -109,7 +109,7 @@ ___
#### Defined in
-[XrmEx.ts:853](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L853)
+[XrmEx.ts:853](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L853)
___
@@ -123,7 +123,7 @@ ___
#### Defined in
-[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582)
+[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582)
## Accessors
@@ -141,7 +141,7 @@ Field.Attribute
#### Defined in
-[XrmEx.ts:872](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L872)
+[XrmEx.ts:872](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L872)
___
@@ -163,7 +163,7 @@ Field.Value
#### Defined in
-[XrmEx.ts:880](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L880)
+[XrmEx.ts:880](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L880)
• `set` **Value**(`value`): `void`
@@ -183,7 +183,7 @@ Field.Value
#### Defined in
-[XrmEx.ts:883](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L883)
+[XrmEx.ts:883](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L883)
___
@@ -205,7 +205,7 @@ Field.controls
#### Defined in
-[XrmEx.ts:877](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L877)
+[XrmEx.ts:877](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L877)
## Methods
@@ -234,7 +234,7 @@ Displays an error or recommendation notification for a control, and lets you spe
#### Defined in
-[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778)
+[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778)
___
@@ -264,7 +264,7 @@ Xrm.Attributes.NumberAttribute.addOnChange
#### Defined in
-[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750)
+[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750)
___
@@ -288,7 +288,7 @@ Xrm.Attributes.NumberAttribute.fireOnChange
#### Defined in
-[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737)
+[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737)
___
@@ -310,7 +310,7 @@ Xrm.Attributes.NumberAttribute.getAttributeType
#### Defined in
-[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600)
+[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600)
___
@@ -332,7 +332,7 @@ Xrm.Attributes.NumberAttribute.getFormat
#### Defined in
-[XrmEx.ts:857](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L857)
+[XrmEx.ts:857](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L857)
___
@@ -354,7 +354,7 @@ Xrm.Attributes.NumberAttribute.getIsDirty
#### Defined in
-[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606)
+[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606)
___
@@ -372,7 +372,7 @@ Xrm.Attributes.NumberAttribute.getMax
#### Defined in
-[XrmEx.ts:860](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L860)
+[XrmEx.ts:860](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L860)
___
@@ -390,7 +390,7 @@ Xrm.Attributes.NumberAttribute.getMin
#### Defined in
-[XrmEx.ts:863](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L863)
+[XrmEx.ts:863](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L863)
___
@@ -412,7 +412,7 @@ Xrm.Attributes.NumberAttribute.getName
#### Defined in
-[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609)
+[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609)
___
@@ -434,7 +434,7 @@ Xrm.Attributes.NumberAttribute.getParent
#### Defined in
-[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612)
+[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612)
___
@@ -452,7 +452,7 @@ Xrm.Attributes.NumberAttribute.getPrecision
#### Defined in
-[XrmEx.ts:866](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L866)
+[XrmEx.ts:866](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L866)
___
@@ -474,7 +474,7 @@ Xrm.Attributes.NumberAttribute.getRequiredLevel
#### Defined in
-[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615)
+[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615)
___
@@ -496,7 +496,7 @@ Xrm.Attributes.NumberAttribute.getSubmitMode
#### Defined in
-[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618)
+[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618)
___
@@ -518,7 +518,7 @@ Xrm.Attributes.NumberAttribute.getUserPrivilege
#### Defined in
-[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621)
+[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621)
___
@@ -540,7 +540,7 @@ Xrm.Attributes.NumberAttribute.getValue
#### Defined in
-[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630)
+[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630)
___
@@ -572,7 +572,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809)
+[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809)
___
@@ -600,7 +600,7 @@ Xrm.Attributes.NumberAttribute.removeOnChange
#### Defined in
-[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624)
+[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624)
___
@@ -626,7 +626,7 @@ Sets the state of the control to either enabled, or disabled.
#### Defined in
-[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699)
+[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699)
___
@@ -655,7 +655,7 @@ Xrm.Attributes.NumberAttribute.setIsValid
#### Defined in
-[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633)
+[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633)
___
@@ -689,7 +689,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669)
+[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669)
___
@@ -713,7 +713,7 @@ Xrm.Attributes.NumberAttribute.setPrecision
#### Defined in
-[XrmEx.ts:869](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L869)
+[XrmEx.ts:869](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L869)
___
@@ -739,7 +739,7 @@ Sets the required level.
#### Defined in
-[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727)
+[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727)
___
@@ -769,7 +769,7 @@ Xrm.Attributes.NumberAttribute.setRequiredLevel
#### Defined in
-[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712)
+[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712)
___
@@ -797,7 +797,7 @@ Xrm.Attributes.NumberAttribute.setSubmitMode
#### Defined in
-[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627)
+[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627)
___
@@ -825,7 +825,7 @@ Xrm.Attributes.NumberAttribute.setValue
#### Defined in
-[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597)
+[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597)
___
@@ -851,4 +851,4 @@ Sets the visibility state.
#### Defined in
-[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686)
+[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686)
diff --git a/docs/classes/XrmEx.OptionsetField.md b/docs/classes/XrmEx.OptionsetField.md
index 7f49a42..9f9cf0e 100644
--- a/docs/classes/XrmEx.OptionsetField.md
+++ b/docs/classes/XrmEx.OptionsetField.md
@@ -101,7 +101,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:1198](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1198)
+[XrmEx.ts:1198](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1198)
## Properties
@@ -115,7 +115,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584)
+[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584)
___
@@ -125,7 +125,7 @@ ___
#### Defined in
-[XrmEx.ts:1197](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1197)
+[XrmEx.ts:1197](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1197)
___
@@ -139,7 +139,7 @@ ___
#### Defined in
-[XrmEx.ts:1195](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1195)
+[XrmEx.ts:1195](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1195)
___
@@ -149,7 +149,7 @@ ___
#### Defined in
-[XrmEx.ts:1196](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1196)
+[XrmEx.ts:1196](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1196)
___
@@ -163,7 +163,7 @@ ___
#### Defined in
-[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582)
+[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582)
## Accessors
@@ -181,7 +181,7 @@ Field.Attribute
#### Defined in
-[XrmEx.ts:1224](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1224)
+[XrmEx.ts:1224](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1224)
___
@@ -203,7 +203,7 @@ Field.Value
#### Defined in
-[XrmEx.ts:1237](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1237)
+[XrmEx.ts:1237](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1237)
• `set` **Value**(`value`): `void`
@@ -223,7 +223,7 @@ Field.Value
#### Defined in
-[XrmEx.ts:1240](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1240)
+[XrmEx.ts:1240](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1240)
___
@@ -237,7 +237,7 @@ ___
#### Defined in
-[XrmEx.ts:1232](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1232)
+[XrmEx.ts:1232](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1232)
___
@@ -259,7 +259,7 @@ Field.controls
#### Defined in
-[XrmEx.ts:1229](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1229)
+[XrmEx.ts:1229](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1229)
## Methods
@@ -288,7 +288,7 @@ Displays an error or recommendation notification for a control, and lets you spe
#### Defined in
-[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778)
+[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778)
___
@@ -318,7 +318,7 @@ Xrm.Attributes.OptionSetAttribute.addOnChange
#### Defined in
-[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750)
+[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750)
___
@@ -346,7 +346,7 @@ This method does not check that the values within the options you add are valid.
#### Defined in
-[XrmEx.ts:1253](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1253)
+[XrmEx.ts:1253](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1253)
___
@@ -362,7 +362,7 @@ Clears all options.
#### Defined in
-[XrmEx.ts:1291](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1291)
+[XrmEx.ts:1291](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1291)
___
@@ -386,7 +386,7 @@ Xrm.Attributes.OptionSetAttribute.fireOnChange
#### Defined in
-[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737)
+[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737)
___
@@ -408,7 +408,7 @@ Xrm.Attributes.OptionSetAttribute.getAttributeType
#### Defined in
-[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600)
+[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600)
___
@@ -430,7 +430,7 @@ Xrm.Attributes.OptionSetAttribute.getFormat
#### Defined in
-[XrmEx.ts:1202](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1202)
+[XrmEx.ts:1202](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1202)
___
@@ -448,7 +448,7 @@ Xrm.Attributes.OptionSetAttribute.getInitialValue
#### Defined in
-[XrmEx.ts:1221](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1221)
+[XrmEx.ts:1221](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1221)
___
@@ -470,7 +470,7 @@ Xrm.Attributes.OptionSetAttribute.getIsDirty
#### Defined in
-[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606)
+[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606)
___
@@ -492,7 +492,7 @@ Xrm.Attributes.OptionSetAttribute.getName
#### Defined in
-[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609)
+[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609)
___
@@ -516,7 +516,7 @@ Xrm.Attributes.OptionSetAttribute.getOption
#### Defined in
-[XrmEx.ts:1205](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1205)
+[XrmEx.ts:1205](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1205)
___
@@ -534,7 +534,7 @@ Xrm.Attributes.OptionSetAttribute.getOptions
#### Defined in
-[XrmEx.ts:1212](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1212)
+[XrmEx.ts:1212](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1212)
___
@@ -556,7 +556,7 @@ Xrm.Attributes.OptionSetAttribute.getParent
#### Defined in
-[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612)
+[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612)
___
@@ -578,7 +578,7 @@ Xrm.Attributes.OptionSetAttribute.getRequiredLevel
#### Defined in
-[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615)
+[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615)
___
@@ -596,7 +596,7 @@ Xrm.Attributes.OptionSetAttribute.getSelectedOption
#### Defined in
-[XrmEx.ts:1215](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1215)
+[XrmEx.ts:1215](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1215)
___
@@ -618,7 +618,7 @@ Xrm.Attributes.OptionSetAttribute.getSubmitMode
#### Defined in
-[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618)
+[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618)
___
@@ -636,7 +636,7 @@ Xrm.Attributes.OptionSetAttribute.getText
#### Defined in
-[XrmEx.ts:1218](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1218)
+[XrmEx.ts:1218](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1218)
___
@@ -658,7 +658,7 @@ Xrm.Attributes.OptionSetAttribute.getUserPrivilege
#### Defined in
-[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621)
+[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621)
___
@@ -680,7 +680,7 @@ Xrm.Attributes.OptionSetAttribute.getValue
#### Defined in
-[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630)
+[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630)
___
@@ -712,7 +712,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809)
+[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809)
___
@@ -740,7 +740,7 @@ Xrm.Attributes.OptionSetAttribute.removeOnChange
#### Defined in
-[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624)
+[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624)
___
@@ -762,7 +762,7 @@ Removes the option matching the value.
#### Defined in
-[XrmEx.ts:1273](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1273)
+[XrmEx.ts:1273](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1273)
___
@@ -788,7 +788,7 @@ Sets the state of the control to either enabled, or disabled.
#### Defined in
-[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699)
+[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699)
___
@@ -817,7 +817,7 @@ Xrm.Attributes.OptionSetAttribute.setIsValid
#### Defined in
-[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633)
+[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633)
___
@@ -851,7 +851,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669)
+[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669)
___
@@ -877,7 +877,7 @@ Sets the required level.
#### Defined in
-[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727)
+[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727)
___
@@ -907,7 +907,7 @@ Xrm.Attributes.OptionSetAttribute.setRequiredLevel
#### Defined in
-[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712)
+[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712)
___
@@ -935,7 +935,7 @@ Xrm.Attributes.OptionSetAttribute.setSubmitMode
#### Defined in
-[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627)
+[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627)
___
@@ -963,7 +963,7 @@ Xrm.Attributes.OptionSetAttribute.setValue
#### Defined in
-[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597)
+[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597)
___
@@ -989,4 +989,4 @@ Sets the visibility state.
#### Defined in
-[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686)
+[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686)
diff --git a/docs/classes/XrmEx.Section.md b/docs/classes/XrmEx.Section.md
index 891ca76..c7c8557 100644
--- a/docs/classes/XrmEx.Section.md
+++ b/docs/classes/XrmEx.Section.md
@@ -48,7 +48,7 @@
#### Defined in
-[XrmEx.ts:1304](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1304)
+[XrmEx.ts:1304](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1304)
## Properties
@@ -58,7 +58,7 @@
#### Defined in
-[XrmEx.ts:1301](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1301)
+[XrmEx.ts:1301](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1301)
___
@@ -68,7 +68,7 @@ ___
#### Defined in
-[XrmEx.ts:1302](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1302)
+[XrmEx.ts:1302](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1302)
___
@@ -82,7 +82,7 @@ Xrm.Controls.Section.controls
#### Defined in
-[XrmEx.ts:1320](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1320)
+[XrmEx.ts:1320](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1320)
___
@@ -92,7 +92,7 @@ ___
#### Defined in
-[XrmEx.ts:1303](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1303)
+[XrmEx.ts:1303](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1303)
## Accessors
@@ -106,7 +106,7 @@ ___
#### Defined in
-[XrmEx.ts:1307](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1307)
+[XrmEx.ts:1307](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1307)
## Methods
@@ -124,7 +124,7 @@ Xrm.Controls.Section.getLabel
#### Defined in
-[XrmEx.ts:1327](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1327)
+[XrmEx.ts:1327](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1327)
___
@@ -142,7 +142,7 @@ Xrm.Controls.Section.getName
#### Defined in
-[XrmEx.ts:1314](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1314)
+[XrmEx.ts:1314](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1314)
___
@@ -160,7 +160,7 @@ Xrm.Controls.Section.getParent
#### Defined in
-[XrmEx.ts:1317](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1317)
+[XrmEx.ts:1317](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1317)
___
@@ -178,7 +178,7 @@ Xrm.Controls.Section.getVisible
#### Defined in
-[XrmEx.ts:1324](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1324)
+[XrmEx.ts:1324](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1324)
___
@@ -202,7 +202,7 @@ Xrm.Controls.Section.setLabel
#### Defined in
-[XrmEx.ts:1330](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1330)
+[XrmEx.ts:1330](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1330)
___
@@ -226,4 +226,4 @@ Xrm.Controls.Section.setVisible
#### Defined in
-[XrmEx.ts:1321](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1321)
+[XrmEx.ts:1321](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1321)
diff --git a/docs/classes/XrmEx.Tab.md b/docs/classes/XrmEx.Tab.md
index cf399a0..a95d685 100644
--- a/docs/classes/XrmEx.Tab.md
+++ b/docs/classes/XrmEx.Tab.md
@@ -66,7 +66,7 @@
#### Defined in
-[XrmEx.ts:1341](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1341)
+[XrmEx.ts:1341](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1341)
## Properties
@@ -76,7 +76,7 @@
#### Defined in
-[XrmEx.ts:1338](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1338)
+[XrmEx.ts:1338](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1338)
___
@@ -86,7 +86,7 @@ ___
#### Defined in
-[XrmEx.ts:1340](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1340)
+[XrmEx.ts:1340](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1340)
___
@@ -96,7 +96,7 @@ ___
#### Defined in
-[XrmEx.ts:1339](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1339)
+[XrmEx.ts:1339](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1339)
___
@@ -110,7 +110,7 @@ Xrm.Controls.Tab.sections
#### Defined in
-[XrmEx.ts:1348](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1348)
+[XrmEx.ts:1348](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1348)
## Accessors
@@ -124,7 +124,7 @@ Xrm.Controls.Tab.sections
#### Defined in
-[XrmEx.ts:1350](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1350)
+[XrmEx.ts:1350](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1350)
## Methods
@@ -148,7 +148,7 @@ Xrm.Controls.Tab.addTabStateChange
#### Defined in
-[XrmEx.ts:1355](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1355)
+[XrmEx.ts:1355](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1355)
___
@@ -166,7 +166,7 @@ Xrm.Controls.Tab.getDisplayState
#### Defined in
-[XrmEx.ts:1358](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1358)
+[XrmEx.ts:1358](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1358)
___
@@ -184,7 +184,7 @@ Xrm.Controls.Tab.getLabel
#### Defined in
-[XrmEx.ts:1379](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1379)
+[XrmEx.ts:1379](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1379)
___
@@ -202,7 +202,7 @@ Xrm.Controls.Tab.getName
#### Defined in
-[XrmEx.ts:1361](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1361)
+[XrmEx.ts:1361](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1361)
___
@@ -220,7 +220,7 @@ Xrm.Controls.Tab.getParent
#### Defined in
-[XrmEx.ts:1364](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1364)
+[XrmEx.ts:1364](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1364)
___
@@ -238,7 +238,7 @@ Xrm.Controls.Tab.getVisible
#### Defined in
-[XrmEx.ts:1376](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1376)
+[XrmEx.ts:1376](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1376)
___
@@ -262,7 +262,7 @@ Xrm.Controls.Tab.removeTabStateChange
#### Defined in
-[XrmEx.ts:1367](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1367)
+[XrmEx.ts:1367](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1367)
___
@@ -286,7 +286,7 @@ Xrm.Controls.Tab.setDisplayState
#### Defined in
-[XrmEx.ts:1370](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1370)
+[XrmEx.ts:1370](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1370)
___
@@ -304,7 +304,7 @@ Xrm.Controls.Tab.setFocus
#### Defined in
-[XrmEx.ts:1385](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1385)
+[XrmEx.ts:1385](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1385)
___
@@ -328,7 +328,7 @@ Xrm.Controls.Tab.setLabel
#### Defined in
-[XrmEx.ts:1382](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1382)
+[XrmEx.ts:1382](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1382)
___
@@ -352,4 +352,4 @@ Xrm.Controls.Tab.setVisible
#### Defined in
-[XrmEx.ts:1373](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1373)
+[XrmEx.ts:1373](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1373)
diff --git a/docs/classes/XrmEx.TextField.md b/docs/classes/XrmEx.TextField.md
index 19c3ae4..a8a7826 100644
--- a/docs/classes/XrmEx.TextField.md
+++ b/docs/classes/XrmEx.TextField.md
@@ -78,7 +78,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:825](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L825)
+[XrmEx.ts:825](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L825)
## Properties
@@ -92,7 +92,7 @@ Used to execute methods related to a single Attribute
#### Defined in
-[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584)
+[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584)
___
@@ -106,7 +106,7 @@ ___
#### Defined in
-[XrmEx.ts:824](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L824)
+[XrmEx.ts:824](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L824)
___
@@ -120,7 +120,7 @@ ___
#### Defined in
-[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582)
+[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582)
## Accessors
@@ -138,7 +138,7 @@ Field.Attribute
#### Defined in
-[XrmEx.ts:834](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L834)
+[XrmEx.ts:834](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L834)
___
@@ -160,7 +160,7 @@ Field.Value
#### Defined in
-[XrmEx.ts:842](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L842)
+[XrmEx.ts:842](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L842)
• `set` **Value**(`value`): `void`
@@ -180,7 +180,7 @@ Field.Value
#### Defined in
-[XrmEx.ts:845](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L845)
+[XrmEx.ts:845](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L845)
___
@@ -202,7 +202,7 @@ Field.controls
#### Defined in
-[XrmEx.ts:839](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L839)
+[XrmEx.ts:839](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L839)
## Methods
@@ -231,7 +231,7 @@ Displays an error or recommendation notification for a control, and lets you spe
#### Defined in
-[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778)
+[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778)
___
@@ -261,7 +261,7 @@ Xrm.Attributes.StringAttribute.addOnChange
#### Defined in
-[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750)
+[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750)
___
@@ -285,7 +285,7 @@ Xrm.Attributes.StringAttribute.fireOnChange
#### Defined in
-[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737)
+[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737)
___
@@ -307,7 +307,7 @@ Xrm.Attributes.StringAttribute.getAttributeType
#### Defined in
-[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600)
+[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600)
___
@@ -329,7 +329,7 @@ Xrm.Attributes.StringAttribute.getFormat
#### Defined in
-[XrmEx.ts:831](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L831)
+[XrmEx.ts:831](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L831)
___
@@ -351,7 +351,7 @@ Xrm.Attributes.StringAttribute.getIsDirty
#### Defined in
-[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606)
+[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606)
___
@@ -369,7 +369,7 @@ Xrm.Attributes.StringAttribute.getMaxLength
#### Defined in
-[XrmEx.ts:828](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L828)
+[XrmEx.ts:828](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L828)
___
@@ -391,7 +391,7 @@ Xrm.Attributes.StringAttribute.getName
#### Defined in
-[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609)
+[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609)
___
@@ -413,7 +413,7 @@ Xrm.Attributes.StringAttribute.getParent
#### Defined in
-[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612)
+[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612)
___
@@ -435,7 +435,7 @@ Xrm.Attributes.StringAttribute.getRequiredLevel
#### Defined in
-[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615)
+[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615)
___
@@ -457,7 +457,7 @@ Xrm.Attributes.StringAttribute.getSubmitMode
#### Defined in
-[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618)
+[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618)
___
@@ -479,7 +479,7 @@ Xrm.Attributes.StringAttribute.getUserPrivilege
#### Defined in
-[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621)
+[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621)
___
@@ -501,7 +501,7 @@ Xrm.Attributes.StringAttribute.getValue
#### Defined in
-[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630)
+[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630)
___
@@ -533,7 +533,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809)
+[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809)
___
@@ -561,7 +561,7 @@ Xrm.Attributes.StringAttribute.removeOnChange
#### Defined in
-[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624)
+[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624)
___
@@ -587,7 +587,7 @@ Sets the state of the control to either enabled, or disabled.
#### Defined in
-[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699)
+[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699)
___
@@ -616,7 +616,7 @@ Xrm.Attributes.StringAttribute.setIsValid
#### Defined in
-[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633)
+[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633)
___
@@ -650,7 +650,7 @@ true if it succeeds, false if it fails.
#### Defined in
-[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669)
+[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669)
___
@@ -676,7 +676,7 @@ Sets the required level.
#### Defined in
-[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727)
+[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727)
___
@@ -706,7 +706,7 @@ Xrm.Attributes.StringAttribute.setRequiredLevel
#### Defined in
-[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712)
+[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712)
___
@@ -734,7 +734,7 @@ Xrm.Attributes.StringAttribute.setSubmitMode
#### Defined in
-[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627)
+[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627)
___
@@ -762,7 +762,7 @@ Xrm.Attributes.StringAttribute.setValue
#### Defined in
-[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597)
+[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597)
___
@@ -788,4 +788,4 @@ Sets the visibility state.
#### Defined in
-[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686)
+[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686)
diff --git a/docs/modules.md b/docs/modules.md
index 8f345fc..def9aad 100644
--- a/docs/modules.md
+++ b/docs/modules.md
@@ -30,7 +30,7 @@ Represents a reference to an entity.
#### Defined in
-[XrmEx.ts:31](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L31)
+[XrmEx.ts:31](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L31)
___
@@ -50,4 +50,4 @@ Represents a parameter for a request.
#### Defined in
-[XrmEx.ts:9](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L9)
+[XrmEx.ts:9](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L9)
diff --git a/docs/modules/XrmEx.md b/docs/modules/XrmEx.md
index ae7236b..d36765b 100644
--- a/docs/modules/XrmEx.md
+++ b/docs/modules/XrmEx.md
@@ -56,7 +56,7 @@ Displays a notification for an app with the given message and level, and lets yo
#### Defined in
-[XrmEx.ts:70](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L70)
+[XrmEx.ts:70](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L70)
___
@@ -82,7 +82,7 @@ Checks if the given request parameter is of a supported type and has a valid val
#### Defined in
-[XrmEx.ts:175](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L175)
+[XrmEx.ts:175](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L175)
___
@@ -112,7 +112,7 @@ Executes an Action.
#### Defined in
-[XrmEx.ts:230](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L230)
+[XrmEx.ts:230](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L230)
___
@@ -142,7 +142,7 @@ Executes a Function.
#### Defined in
-[XrmEx.ts:272](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L272)
+[XrmEx.ts:272](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L272)
___
@@ -166,7 +166,7 @@ Retrieves the value of an environment variable by using its schema name as key.
#### Defined in
-[XrmEx.ts:113](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L113)
+[XrmEx.ts:113](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L113)
___
@@ -184,7 +184,7 @@ Returns the name of the calling function.
#### Defined in
-[XrmEx.ts:48](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L48)
+[XrmEx.ts:48](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L48)
___
@@ -208,7 +208,7 @@ Makes a GUID lowercase and removes brackets.
#### Defined in
-[XrmEx.ts:311](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L311)
+[XrmEx.ts:311](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L311)
___
@@ -233,7 +233,7 @@ Opens a dialog with dynamic height and width based on text content.
#### Defined in
-[XrmEx.ts:322](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L322)
+[XrmEx.ts:322](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L322)
___
@@ -257,7 +257,7 @@ Clears a notification in the app with the given unique ID.
#### Defined in
-[XrmEx.ts:99](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L99)
+[XrmEx.ts:99](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L99)
___
@@ -283,4 +283,4 @@ Throws an error with the given error message.
#### Defined in
-[XrmEx.ts:41](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L41)
+[XrmEx.ts:41](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L41)
diff --git a/package.json b/package.json
index 173045d..d66718c 100644
--- a/package.json
+++ b/package.json
@@ -35,13 +35,11 @@
"scripts": {
"build": "npm run clean && npm run type:dts && npm run build:main && npm run format && npm run docs && npm run copy && npm run postbuild && npm run zip",
"build:main": "tsc --build",
- "clean": "rimraf build/dist coverage nyc_output",
+ "clean": "rimraf build/src coverage nyc_output",
"docs": "npx typedoc --plugin typedoc-plugin-markdown --out docs src/XrmEx.ts",
- "copy": "npm run copyPackage && npm run copyReadme && npm run copyEslint",
- "copyPackage": "node -e \"require('fs').cpSync('./package.json', './build/package.json');\"",
+ "copy": "npm run copyReadme",
"copyReadme": "node -e \"require('fs').cpSync('./README.md', './build/README.md');\"",
- "copyEslint": "node -e \"require('fs').cpSync('./.eslintrc.cjs', './build/.eslintrc.cjs');\"",
- "postbuild": "rimraf build/dist/tests",
+ "postbuild": "rimraf build/tests",
"zip": "npm-build-zip --destination=release/ --name=xrm-ex --name_only=true",
"type:dts": "tsc --emitDeclarationOnly --project tsconfig.build.json",
"type:check": "tsc --noEmit",
diff --git a/release/xrm-ex.zip b/release/xrm-ex.zip
index 51d7d06..721068d 100644
Binary files a/release/xrm-ex.zip and b/release/xrm-ex.zip differ
diff --git a/src/TemplateFunctions.ts b/src/TemplateFunctions.ts
deleted file mode 100644
index 6ecc31d..0000000
--- a/src/TemplateFunctions.ts
+++ /dev/null
@@ -1,303 +0,0 @@
-///
-
-// eslint-disable-next-line no-unused-vars
-namespace Theia {
- export namespace TemplateFunctions {
- var formContext: Xrm.FormContext;
- class Fields {
- Firstname = new XrmEx.TextField("firstname");
- Lastname = new XrmEx.TextField("lastname");
- JobTitle = new XrmEx.TextField("jobtitle");
- PreferredContactMethod = new XrmEx.OptionsetField(
- "preferredcontactmethodcode",
- {
- Any: 1,
- Email: 2,
- Phone: 3,
- Fax: 4,
- Mail: 5,
- }
- );
- Customer = new XrmEx.LookupField("parentcustomerid");
- BusinessPhone = new XrmEx.TextField("telephone1");
- Gender = new XrmEx.OptionsetField("gendercode");
- Email = new XrmEx.TextField("emailaddress1");
- MobilePhone = new XrmEx.TextField("mobilephone");
- Owner = new XrmEx.LookupField("ownerid");
- DoNotEmail = new XrmEx.BooleanField("donotemail");
- MaritalStatus = new XrmEx.OptionsetField("familystatuscode");
- SpousePartnerName = new XrmEx.TextField("spousesname");
- Birthday = new XrmEx.DateField("birthdate");
- }
- class Tabs {
- General = new XrmEx.Tab("tab1", {
- Section1: new XrmEx.Section("section1"),
- Section2: new XrmEx.Section("section2"),
- });
- Details = new XrmEx.Tab("tab2", {
- Section1: new XrmEx.Section("section1"),
- Section2: new XrmEx.Section("section2"),
- });
- }
- class Grids {
- ContactSubgrid = new XrmEx.GridControl("Test");
- }
- var fields: Fields;
- var tabs: Tabs;
- var grids: Grids;
- export async function Init(
- executionContext: Xrm.FormContext | Xrm.Events.EventContext
- ) {
- if (!XrmEx) {
- let errorMessage =
- "XrmEx is not loaded. Please make sure you have XrmEx.js loaded in your form.";
- console.error(errorMessage);
- await Xrm.Navigation.openAlertDialog({
- title: "Error",
- text: errorMessage,
- });
- return;
- }
- XrmEx.Form.formContext = executionContext;
- fields = new Fields();
- tabs = new Tabs();
- grids = new Grids();
- }
-
- export async function OnLoad(
- executionContext: Xrm.FormContext | Xrm.Events.EventContext
- ) {
- await Init(executionContext); //Ensures XrmEx is only accessed after the OnLoad Event
- try {
- parent.window.XrmEx = XrmEx;
- formContext = XrmEx.Form.formContext;
-
- await sample();
- //Register one or more Functions to execute OnSave
- formContext.data.entity.addOnSave(sample);
- //BETTER WAY
- XrmEx.Form.addOnSaveEventHandler([sample]);
- //Register one or more Functions to execute OnChange of multiple fields and execute it immediately
- let firstname = formContext.getAttribute("firstname");
- let lastname = formContext.getAttribute("lastname");
- firstname.addOnChange(sample);
- firstname.fireOnChange();
- lastname.fireOnChange();
- //BETTER WAY
- XrmEx.Form.addOnChangeEventHandler(
- [fields.Firstname, fields.Lastname],
- [sample],
- true
- );
- } catch (error) {
- console.error(error);
- await XrmEx.openAlertDialog(
- "Error",
- `Error in Theia.TemplateFunctions.${XrmEx.getMethodName()}\n` +
- error.message
- );
- }
- /**
- * This Framework empowers developers to DO MORE by writing LESS CODE 👈(゚ヮ゚👈)
- */
- async function sample() {
- try {
- //Continue only on Update Form
- if (formContext.ui.getFormType() != 2) return;
- //BETTER WAY
- if (XrmEx.Form.IsNotUpdate) return;
-
- //If Firstname is empty, make it required and shows notification on the field
- let firstname = formContext.getAttribute("firstname");
- if (!firstname.getValue()) {
- firstname.setRequiredLevel("required");
- firstname.controls.forEach((c) =>
- c.setNotification("This property is required", "uniqueId")
- );
- }
- //BETTER WAY
- if (!fields.Lastname.Value)
- fields.Firstname.setRequired(true).setNotification(
- "This property is required",
- "uniqueId"
- );
-
- //If Owner has Value and Lastname does not, retrieve it's lastname and set it to Lastname
- let ownerid = formContext.getAttribute("ownerid");
- let lastname = formContext.getAttribute("lastname");
- if (ownerid.getValue() && !lastname.getValue()) {
- let user = await Xrm.WebApi.retrieveRecord(
- ownerid.getValue()[0].entityType,
- ownerid.getValue()[0].id,
- "?$select=lastname"
- );
- lastname.setValue(user.lastname);
- }
- //BETTER WAY
- if (fields.Owner.Value && !fields.Lastname.Value) {
- let user = await fields.Owner.retrieve("?$select=lastname");
- fields.Lastname.Value = user.lastname;
- fields.Lastname.setValue(user.lastname);
- }
- //Set Optionset PreferredContactMethod to Email
- fields.PreferredContactMethod.Value =
- fields.PreferredContactMethod.Option.Email;
-
- //Add Lookup Filter to Customer and remove it later
- let filterFunction = function filterFunction(
- executionContext: Xrm.Events.EventContext
- ) {
- let formContext = executionContext.getFormContext();
- let customer: Xrm.Attributes.LookupAttribute =
- formContext.getAttribute("parentcustomerid");
- customer.controls.forEach((c) => {
- c.addCustomFilter(
- `
-
- `
- );
- });
- };
- let customer: Xrm.Attributes.LookupAttribute =
- formContext.getAttribute("parentcustomerid");
- customer.controls.forEach((c) => c.addPreSearch(filterFunction));
- customer.controls.forEach((c) => c.removePreSearch(filterFunction));
- //BETTER WAY
- fields.Customer.addPreFilterToLookup(
- `
-
- `
- );
- fields.Customer.clearPreFilterFromLookup();
-
- fields.Lastname.setVisible(false)
- .setDisabled(true)
- .setRequired(false)
- .setNotification("This property is required", "uniqueId");
-
- //SPECIAL WAY (Go to Definition to see how to achieve this)
- //Add Advanced Lookup Filter
- await fields.Customer.addPreFilterToLookupAdvanced(
- "contact",
- "contactid",
- `
-
-
-
-
-
- `
- );
-
- //Execute bound Action
- class TestActionContactRequest {
- Amount: number;
- Account: any;
- getMetadata() {
- return {
- boundParameter: "entity",
- operationType: 0,
- operationName: "theia_TestActionContact",
- parameterTypes: {
- Amount: {
- typeName: "Edm.Int32",
- structuralProperty: 1,
- },
- Account: {
- typeName: "mscrm.account",
- structuralProperty: 5,
- },
- entity: {
- typeName: "mscrm.contact",
- structuralProperty: 5,
- },
- },
- };
- }
- }
- let testActionContactRequest = new TestActionContactRequest();
- testActionContactRequest.Amount = 5;
- testActionContactRequest.Account = customer.getValue()[0];
- testActionContactRequest["entity"] =
- formContext.data.entity.getEntityReference();
- let response = await Xrm.WebApi.online
- .execute(testActionContactRequest)
- .then(function (response) {
- if (response.ok) {
- return response.json().catch(() => {
- return response;
- });
- }
- })
- .then((responseBody) => responseBody);
- console.log(response);
-
- //BETTER WAY
- let response2 = await XrmEx.executeAction(
- "theia_TestActionContact",
- [
- { Name: "Amount", Type: "Integer", Value: 5 },
- {
- Name: "Account",
- Type: "EntityReference",
- Value: fields.Customer.Value[0],
- },
- ],
- XrmEx.Form.entityReference
- );
- console.log(response2);
-
- //Retrieve EnvironmentVariableValue
- class EnvironmentVariableRequest {
- DefinitionSchemaName: string;
- constructor(definitionSchemaName: string) {
- this.DefinitionSchemaName = definitionSchemaName;
- }
- getMetadata() {
- return {
- boundParameter: null,
- operationType: 1,
- operationName: "RetrieveEnvironmentVariableValue",
- parameterTypes: {
- DefinitionSchemaName: {
- typeName: "Edm.String",
- structuralProperty: 1,
- },
- },
- };
- }
- }
- let environmentVariableRequest = new EnvironmentVariableRequest(
- "theia_Test"
- );
- let value = await Xrm.WebApi.online
- .execute(environmentVariableRequest)
- .then(function (response) {
- if (response.ok) {
- return response.json().catch(() => {
- return response;
- });
- }
- })
- .then((responseBody) => responseBody);
- console.log(value);
- //BETTER WAY
- let value2 = await XrmEx.getEnvironmentVariableValue("theia_Test");
- console.log(value2);
-
- /**
- * How to access Propoerties described in Microsofts Documentation
- */
- /** You can access all Form Context Functions here: @see https://docs.microsoft.com/en-us/power-apps/developer/model-driven-apps/clientapi/clientapi-form-context*/
- XrmEx.Form.formContext.data.isValid();
-
- /** You can access all Column Functions here: @see https://docs.microsoft.com/en-us/power-apps/developer/model-driven-apps/clientapi/reference/attributes*/
- fields.Birthday.Attribute.getIsDirty();
- } catch (error) {
- console.error(error);
- throw new Error(`.${XrmEx.getMethodName()}:\n${error.message}`);
- }
- }
- }
- }
-}
diff --git a/tsconfig.json b/tsconfig.json
index 87a0826..14daca8 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -13,7 +13,7 @@
"target": "es2022",
"moduleResolution": "Node",
"rootDir": "./",
- "outDir": "build/dist",
+ "outDir": "build",
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,