UNPKG

rhizo-co-terraform-provider-oci

Version:

Prebuilt oci Provider for Terraform CDK (cdktf)

1,160 lines 188 kB
"use strict";
var _a, _b, _c, _d, _e, _f, _g;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement = exports.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsOutputReference = exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsToHclTerraform = exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsToTerraform = exports.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsOutputReference = exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsToHclTerraform = exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsToTerraform = exports.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsOutputReference = exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsToHclTerraform = exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsToTerraform = exports.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringOutputReference = exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringToHclTerraform = exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringToTerraform = exports.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsOutputReference = exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsToHclTerraform = exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsToTerraform = exports.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsOutputReference = exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsToHclTerraform = exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsToTerraform = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const cdktf = require("cdktf");
function databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        connector_type: cdktf.stringToTerraform(struct.connectorType),
        database_connector_id: cdktf.stringToTerraform(struct.databaseConnectorId),
        management_agent_id: cdktf.stringToTerraform(struct.managementAgentId),
        private_end_point_id: cdktf.stringToTerraform(struct.privateEndPointId),
    };
}
exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsToTerraform = databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsToTerraform;
function databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        connector_type: {
            value: cdktf.stringToHclTerraform(struct.connectorType),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        database_connector_id: {
            value: cdktf.stringToHclTerraform(struct.databaseConnectorId),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        management_agent_id: {
            value: cdktf.stringToHclTerraform(struct.managementAgentId),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        private_end_point_id: {
            value: cdktf.stringToHclTerraform(struct.privateEndPointId),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsToHclTerraform = databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsToHclTerraform;
class DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._connectorType !== undefined) {
            hasAnyValues = true;
            internalValueResult.connectorType = this._connectorType;
        }
        if (this._databaseConnectorId !== undefined) {
            hasAnyValues = true;
            internalValueResult.databaseConnectorId = this._databaseConnectorId;
        }
        if (this._managementAgentId !== undefined) {
            hasAnyValues = true;
            internalValueResult.managementAgentId = this._managementAgentId;
        }
        if (this._privateEndPointId !== undefined) {
            hasAnyValues = true;
            internalValueResult.privateEndPointId = this._privateEndPointId;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._connectorType = undefined;
            this._databaseConnectorId = undefined;
            this._managementAgentId = undefined;
            this._privateEndPointId = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._connectorType = value.connectorType;
            this._databaseConnectorId = value.databaseConnectorId;
            this._managementAgentId = value.managementAgentId;
            this._privateEndPointId = value.privateEndPointId;
        }
    }
    get connectorType() {
        return this.getStringAttribute('connector_type');
    }
    set connectorType(value) {
        this._connectorType = value;
    }
    resetConnectorType() {
        this._connectorType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get connectorTypeInput() {
        return this._connectorType;
    }
    get databaseConnectorId() {
        return this.getStringAttribute('database_connector_id');
    }
    set databaseConnectorId(value) {
        this._databaseConnectorId = value;
    }
    resetDatabaseConnectorId() {
        this._databaseConnectorId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get databaseConnectorIdInput() {
        return this._databaseConnectorId;
    }
    get managementAgentId() {
        return this.getStringAttribute('management_agent_id');
    }
    set managementAgentId(value) {
        this._managementAgentId = value;
    }
    resetManagementAgentId() {
        this._managementAgentId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get managementAgentIdInput() {
        return this._managementAgentId;
    }
    get privateEndPointId() {
        return this.getStringAttribute('private_end_point_id');
    }
    set privateEndPointId(value) {
        this._privateEndPointId = value;
    }
    resetPrivateEndPointId() {
        this._privateEndPointId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get privateEndPointIdInput() {
        return this._privateEndPointId;
    }
}
exports.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsOutputReference = DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsOutputReference;
_a = JSII_RTTI_SYMBOL_1;
DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsOutputReference[_a] = { fqn: "rhizo-co-terraform-provider-oci.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsOutputReference", version: "1.0.0" };
function databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        credential_name: cdktf.stringToTerraform(struct.credentialName),
        credential_type: cdktf.stringToTerraform(struct.credentialType),
        named_credential_id: cdktf.stringToTerraform(struct.namedCredentialId),
        password_secret_id: cdktf.stringToTerraform(struct.passwordSecretId),
        role: cdktf.stringToTerraform(struct.role),
        ssl_secret_id: cdktf.stringToTerraform(struct.sslSecretId),
        user_name: cdktf.stringToTerraform(struct.userName),
    };
}
exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsToTerraform = databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsToTerraform;
function databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        credential_name: {
            value: cdktf.stringToHclTerraform(struct.credentialName),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        credential_type: {
            value: cdktf.stringToHclTerraform(struct.credentialType),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        named_credential_id: {
            value: cdktf.stringToHclTerraform(struct.namedCredentialId),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        password_secret_id: {
            value: cdktf.stringToHclTerraform(struct.passwordSecretId),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        role: {
            value: cdktf.stringToHclTerraform(struct.role),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        ssl_secret_id: {
            value: cdktf.stringToHclTerraform(struct.sslSecretId),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        user_name: {
            value: cdktf.stringToHclTerraform(struct.userName),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsToHclTerraform = databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsToHclTerraform;
class DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._credentialName !== undefined) {
            hasAnyValues = true;
            internalValueResult.credentialName = this._credentialName;
        }
        if (this._credentialType !== undefined) {
            hasAnyValues = true;
            internalValueResult.credentialType = this._credentialType;
        }
        if (this._namedCredentialId !== undefined) {
            hasAnyValues = true;
            internalValueResult.namedCredentialId = this._namedCredentialId;
        }
        if (this._passwordSecretId !== undefined) {
            hasAnyValues = true;
            internalValueResult.passwordSecretId = this._passwordSecretId;
        }
        if (this._role !== undefined) {
            hasAnyValues = true;
            internalValueResult.role = this._role;
        }
        if (this._sslSecretId !== undefined) {
            hasAnyValues = true;
            internalValueResult.sslSecretId = this._sslSecretId;
        }
        if (this._userName !== undefined) {
            hasAnyValues = true;
            internalValueResult.userName = this._userName;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._credentialName = undefined;
            this._credentialType = undefined;
            this._namedCredentialId = undefined;
            this._passwordSecretId = undefined;
            this._role = undefined;
            this._sslSecretId = undefined;
            this._userName = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._credentialName = value.credentialName;
            this._credentialType = value.credentialType;
            this._namedCredentialId = value.namedCredentialId;
            this._passwordSecretId = value.passwordSecretId;
            this._role = value.role;
            this._sslSecretId = value.sslSecretId;
            this._userName = value.userName;
        }
    }
    get credentialName() {
        return this.getStringAttribute('credential_name');
    }
    set credentialName(value) {
        this._credentialName = value;
    }
    resetCredentialName() {
        this._credentialName = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get credentialNameInput() {
        return this._credentialName;
    }
    get credentialType() {
        return this.getStringAttribute('credential_type');
    }
    set credentialType(value) {
        this._credentialType = value;
    }
    resetCredentialType() {
        this._credentialType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get credentialTypeInput() {
        return this._credentialType;
    }
    get namedCredentialId() {
        return this.getStringAttribute('named_credential_id');
    }
    set namedCredentialId(value) {
        this._namedCredentialId = value;
    }
    resetNamedCredentialId() {
        this._namedCredentialId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get namedCredentialIdInput() {
        return this._namedCredentialId;
    }
    get passwordSecretId() {
        return this.getStringAttribute('password_secret_id');
    }
    set passwordSecretId(value) {
        this._passwordSecretId = value;
    }
    resetPasswordSecretId() {
        this._passwordSecretId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get passwordSecretIdInput() {
        return this._passwordSecretId;
    }
    get role() {
        return this.getStringAttribute('role');
    }
    set role(value) {
        this._role = value;
    }
    resetRole() {
        this._role = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get roleInput() {
        return this._role;
    }
    get sslSecretId() {
        return this.getStringAttribute('ssl_secret_id');
    }
    set sslSecretId(value) {
        this._sslSecretId = value;
    }
    resetSslSecretId() {
        this._sslSecretId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get sslSecretIdInput() {
        return this._sslSecretId;
    }
    get userName() {
        return this.getStringAttribute('user_name');
    }
    set userName(value) {
        this._userName = value;
    }
    resetUserName() {
        this._userName = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get userNameInput() {
        return this._userName;
    }
}
exports.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsOutputReference = DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsOutputReference;
_b = JSII_RTTI_SYMBOL_1;
DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsOutputReference[_b] = { fqn: "rhizo-co-terraform-provider-oci.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsOutputReference", version: "1.0.0" };
function databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        connection_type: cdktf.stringToTerraform(struct.connectionType),
        port: cdktf.numberToTerraform(struct.port),
        protocol: cdktf.stringToTerraform(struct.protocol),
        service: cdktf.stringToTerraform(struct.service),
    };
}
exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringToTerraform = databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringToTerraform;
function databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        connection_type: {
            value: cdktf.stringToHclTerraform(struct.connectionType),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        port: {
            value: cdktf.numberToHclTerraform(struct.port),
            isBlock: false,
            type: "simple",
            storageClassType: "number",
        },
        protocol: {
            value: cdktf.stringToHclTerraform(struct.protocol),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        service: {
            value: cdktf.stringToHclTerraform(struct.service),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringToHclTerraform = databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringToHclTerraform;
class DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._connectionType !== undefined) {
            hasAnyValues = true;
            internalValueResult.connectionType = this._connectionType;
        }
        if (this._port !== undefined) {
            hasAnyValues = true;
            internalValueResult.port = this._port;
        }
        if (this._protocol !== undefined) {
            hasAnyValues = true;
            internalValueResult.protocol = this._protocol;
        }
        if (this._service !== undefined) {
            hasAnyValues = true;
            internalValueResult.service = this._service;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._connectionType = undefined;
            this._port = undefined;
            this._protocol = undefined;
            this._service = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._connectionType = value.connectionType;
            this._port = value.port;
            this._protocol = value.protocol;
            this._service = value.service;
        }
    }
    get connectionType() {
        return this.getStringAttribute('connection_type');
    }
    set connectionType(value) {
        this._connectionType = value;
    }
    resetConnectionType() {
        this._connectionType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get connectionTypeInput() {
        return this._connectionType;
    }
    get port() {
        return this.getNumberAttribute('port');
    }
    set port(value) {
        this._port = value;
    }
    resetPort() {
        this._port = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get portInput() {
        return this._port;
    }
    get protocol() {
        return this.getStringAttribute('protocol');
    }
    set protocol(value) {
        this._protocol = value;
    }
    resetProtocol() {
        this._protocol = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get protocolInput() {
        return this._protocol;
    }
    get service() {
        return this.getStringAttribute('service');
    }
    set service(value) {
        this._service = value;
    }
    resetService() {
        this._service = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get serviceInput() {
        return this._service;
    }
}
exports.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringOutputReference = DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringOutputReference;
_c = JSII_RTTI_SYMBOL_1;
DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringOutputReference[_c] = { fqn: "rhizo-co-terraform-provider-oci.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringOutputReference", version: "1.0.0" };
function databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        connection_credentials: databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsToTerraform(struct.connectionCredentials),
        connection_string: databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringToTerraform(struct.connectionString),
    };
}
exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsToTerraform = databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsToTerraform;
function databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        connection_credentials: {
            value: databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsToHclTerraform(struct.connectionCredentials),
            isBlock: true,
            type: "list",
            storageClassType: "DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsList",
        },
        connection_string: {
            value: databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringToHclTerraform(struct.connectionString),
            isBlock: true,
            type: "list",
            storageClassType: "DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringList",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsToHclTerraform = databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsToHclTerraform;
class DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
        // connection_credentials - computed: false, optional: true, required: false
        this._connectionCredentials = new DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionCredentialsOutputReference(this, "connection_credentials");
        // connection_string - computed: false, optional: true, required: false
        this._connectionString = new DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsConnectionStringOutputReference(this, "connection_string");
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._connectionCredentials?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.connectionCredentials = this._connectionCredentials?.internalValue;
        }
        if (this._connectionString?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.connectionString = this._connectionString?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._connectionCredentials.internalValue = undefined;
            this._connectionString.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._connectionCredentials.internalValue = value.connectionCredentials;
            this._connectionString.internalValue = value.connectionString;
        }
    }
    get connectionCredentials() {
        return this._connectionCredentials;
    }
    putConnectionCredentials(value) {
        this._connectionCredentials.internalValue = value;
    }
    resetConnectionCredentials() {
        this._connectionCredentials.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get connectionCredentialsInput() {
        return this._connectionCredentials.internalValue;
    }
    get connectionString() {
        return this._connectionString;
    }
    putConnectionString(value) {
        this._connectionString.internalValue = value;
    }
    resetConnectionString() {
        this._connectionString.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get connectionStringInput() {
        return this._connectionString.internalValue;
    }
}
exports.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsOutputReference = DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsOutputReference;
_d = JSII_RTTI_SYMBOL_1;
DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsOutputReference[_d] = { fqn: "rhizo-co-terraform-provider-oci.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsOutputReference", version: "1.0.0" };
function databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        feature: cdktf.stringToTerraform(struct.feature),
        is_auto_enable_pluggable_database: cdktf.booleanToTerraform(struct.isAutoEnablePluggableDatabase),
        management_type: cdktf.stringToTerraform(struct.managementType),
        connector_details: databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsToTerraform(struct.connectorDetails),
        database_connection_details: databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsToTerraform(struct.databaseConnectionDetails),
    };
}
exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsToTerraform = databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsToTerraform;
function databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        feature: {
            value: cdktf.stringToHclTerraform(struct.feature),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        is_auto_enable_pluggable_database: {
            value: cdktf.booleanToHclTerraform(struct.isAutoEnablePluggableDatabase),
            isBlock: false,
            type: "simple",
            storageClassType: "boolean",
        },
        management_type: {
            value: cdktf.stringToHclTerraform(struct.managementType),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        connector_details: {
            value: databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsToHclTerraform(struct.connectorDetails),
            isBlock: true,
            type: "list",
            storageClassType: "DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsList",
        },
        database_connection_details: {
            value: databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsToHclTerraform(struct.databaseConnectionDetails),
            isBlock: true,
            type: "list",
            storageClassType: "DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsList",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsToHclTerraform = databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsToHclTerraform;
class DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false, 0);
        this.isEmptyObject = false;
        // connector_details - computed: false, optional: true, required: false
        this._connectorDetails = new DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsConnectorDetailsOutputReference(this, "connector_details");
        // database_connection_details - computed: false, optional: true, required: false
        this._databaseConnectionDetails = new DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsDatabaseConnectionDetailsOutputReference(this, "database_connection_details");
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._feature !== undefined) {
            hasAnyValues = true;
            internalValueResult.feature = this._feature;
        }
        if (this._isAutoEnablePluggableDatabase !== undefined) {
            hasAnyValues = true;
            internalValueResult.isAutoEnablePluggableDatabase = this._isAutoEnablePluggableDatabase;
        }
        if (this._managementType !== undefined) {
            hasAnyValues = true;
            internalValueResult.managementType = this._managementType;
        }
        if (this._connectorDetails?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.connectorDetails = this._connectorDetails?.internalValue;
        }
        if (this._databaseConnectionDetails?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.databaseConnectionDetails = this._databaseConnectionDetails?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._feature = undefined;
            this._isAutoEnablePluggableDatabase = undefined;
            this._managementType = undefined;
            this._connectorDetails.internalValue = undefined;
            this._databaseConnectionDetails.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._feature = value.feature;
            this._isAutoEnablePluggableDatabase = value.isAutoEnablePluggableDatabase;
            this._managementType = value.managementType;
            this._connectorDetails.internalValue = value.connectorDetails;
            this._databaseConnectionDetails.internalValue = value.databaseConnectionDetails;
        }
    }
    get feature() {
        return this.getStringAttribute('feature');
    }
    set feature(value) {
        this._feature = value;
    }
    // Temporarily expose input value. Use with caution.
    get featureInput() {
        return this._feature;
    }
    get isAutoEnablePluggableDatabase() {
        return this.getBooleanAttribute('is_auto_enable_pluggable_database');
    }
    set isAutoEnablePluggableDatabase(value) {
        this._isAutoEnablePluggableDatabase = value;
    }
    resetIsAutoEnablePluggableDatabase() {
        this._isAutoEnablePluggableDatabase = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get isAutoEnablePluggableDatabaseInput() {
        return this._isAutoEnablePluggableDatabase;
    }
    get managementType() {
        return this.getStringAttribute('management_type');
    }
    set managementType(value) {
        this._managementType = value;
    }
    resetManagementType() {
        this._managementType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get managementTypeInput() {
        return this._managementType;
    }
    get connectorDetails() {
        return this._connectorDetails;
    }
    putConnectorDetails(value) {
        this._connectorDetails.internalValue = value;
    }
    resetConnectorDetails() {
        this._connectorDetails.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get connectorDetailsInput() {
        return this._connectorDetails.internalValue;
    }
    get databaseConnectionDetails() {
        return this._databaseConnectionDetails;
    }
    putDatabaseConnectionDetails(value) {
        this._databaseConnectionDetails.internalValue = value;
    }
    resetDatabaseConnectionDetails() {
        this._databaseConnectionDetails.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get databaseConnectionDetailsInput() {
        return this._databaseConnectionDetails.internalValue;
    }
}
exports.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsOutputReference = DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsOutputReference;
_e = JSII_RTTI_SYMBOL_1;
DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsOutputReference[_e] = { fqn: "rhizo-co-terraform-provider-oci.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsOutputReference", version: "1.0.0" };
function databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        create: cdktf.stringToTerraform(struct.create),
        delete: cdktf.stringToTerraform(struct.delete),
        update: cdktf.stringToTerraform(struct.update),
    };
}
exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsToTerraform = databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsToTerraform;
function databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsToHclTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    const attrs = {
        create: {
            value: cdktf.stringToHclTerraform(struct.create),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        delete: {
            value: cdktf.stringToHclTerraform(struct.delete),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
        update: {
            value: cdktf.stringToHclTerraform(struct.update),
            isBlock: false,
            type: "simple",
            storageClassType: "string",
        },
    };
    // remove undefined attributes
    return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
}
exports.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsToHclTerraform = databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsToHclTerraform;
class DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsOutputReference extends cdktf.ComplexObject {
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    */
    constructor(terraformResource, terraformAttribute) {
        super(terraformResource, terraformAttribute, false);
        this.isEmptyObject = false;
    }
    get internalValue() {
        if (this.resolvableValue) {
            return this.resolvableValue;
        }
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._create !== undefined) {
            hasAnyValues = true;
            internalValueResult.create = this._create;
        }
        if (this._delete !== undefined) {
            hasAnyValues = true;
            internalValueResult.delete = this._delete;
        }
        if (this._update !== undefined) {
            hasAnyValues = true;
            internalValueResult.update = this._update;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this.resolvableValue = undefined;
            this._create = undefined;
            this._delete = undefined;
            this._update = undefined;
        }
        else if (cdktf.Tokenization.isResolvable(value)) {
            this.isEmptyObject = false;
            this.resolvableValue = value;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this.resolvableValue = undefined;
            this._create = value.create;
            this._delete = value.delete;
            this._update = value.update;
        }
    }
    get create() {
        return this.getStringAttribute('create');
    }
    set create(value) {
        this._create = value;
    }
    resetCreate() {
        this._create = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get createInput() {
        return this._create;
    }
    get delete() {
        return this.getStringAttribute('delete');
    }
    set delete(value) {
        this._delete = value;
    }
    resetDelete() {
        this._delete = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get deleteInput() {
        return this._delete;
    }
    get update() {
        return this.getStringAttribute('update');
    }
    set update(value) {
        this._update = value;
    }
    resetUpdate() {
        this._update = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get updateInput() {
        return this._update;
    }
}
exports.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsOutputReference = DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsOutputReference;
_f = JSII_RTTI_SYMBOL_1;
DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsOutputReference[_f] = { fqn: "rhizo-co-terraform-provider-oci.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsOutputReference", version: "1.0.0" };
/**
* Represents a {@link https://registry.terraform.io/providers/oracle/oci/6.18.0/docs/resources/database_management_pluggabledatabase_pluggable_database_dbm_features_management oci_database_management_pluggabledatabase_pluggable_database_dbm_features_management}
*/
class DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement extends cdktf.TerraformResource {
    // ==============
    // STATIC Methods
    // ==============
    /**
    * Generates CDKTF code for importing a DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement resource upon running "cdktf plan <stack-name>"
    * @param scope The scope in which to define this construct
    * @param importToId The construct id used in the generated config for the DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement to import
    * @param importFromId The id of the existing DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement that should be imported. Refer to the {@link https://registry.terraform.io/providers/oracle/oci/6.18.0/docs/resources/database_management_pluggabledatabase_pluggable_database_dbm_features_management#import import section} in the documentation of this resource for the id to use
    * @param provider? Optional instance of the provider where the DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement to import is found
    */
    static generateConfigForImport(scope, importToId, importFromId, provider) {
        return new cdktf.ImportableResource(scope, importToId, { terraformResourceType: "oci_database_management_pluggabledatabase_pluggable_database_dbm_features_management", importId: importFromId, provider });
    }
    // ===========
    // INITIALIZER
    // ===========
    /**
    * Create a new {@link https://registry.terraform.io/providers/oracle/oci/6.18.0/docs/resources/database_management_pluggabledatabase_pluggable_database_dbm_features_management oci_database_management_pluggabledatabase_pluggable_database_dbm_features_management} Resource
    *
    * @param scope The scope in which to define this construct
    * @param id The scoped construct ID. Must be unique amongst siblings in the same scope
    * @param options DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementConfig
    */
    constructor(scope, id, config) {
        super(scope, id, {
            terraformResourceType: 'oci_database_management_pluggabledatabase_pluggable_database_dbm_features_management',
            terraformGeneratorMetadata: {
                providerName: 'oci',
                providerVersion: '6.18.0',
                providerVersionConstraint: '~> 6.18.0'
            },
            provider: config.provider,
            dependsOn: config.dependsOn,
            count: config.count,
            lifecycle: config.lifecycle,
            provisioners: config.provisioners,
            connection: config.connection,
            forEach: config.forEach
        });
        // feature_details - computed: false, optional: true, required: false
        this._featureDetails = new DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsOutputReference(this, "feature_details");
        // timeouts - computed: false, optional: true, required: false
        this._timeouts = new DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsOutputReference(this, "timeouts");
        this._enablePluggableDatabaseDbmFeature = config.enablePluggableDatabaseDbmFeature;
        this._id = config.id;
        this._modifyPluggableDatabaseDbmFeature = config.modifyPluggableDatabaseDbmFeature;
        this._pluggableDatabaseId = config.pluggableDatabaseId;
        this._featureDetails.internalValue = config.featureDetails;
        this._timeouts.internalValue = config.timeouts;
    }
    get enablePluggableDatabaseDbmFeature() {
        return this.getBooleanAttribute('enable_pluggable_database_dbm_feature');
    }
    set enablePluggableDatabaseDbmFeature(value) {
        this._enablePluggableDatabaseDbmFeature = value;
    }
    // Temporarily expose input value. Use with caution.
    get enablePluggableDatabaseDbmFeatureInput() {
        return this._enablePluggableDatabaseDbmFeature;
    }
    get id() {
        return this.getStringAttribute('id');
    }
    set id(value) {
        this._id = value;
    }
    resetId() {
        this._id = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get idInput() {
        return this._id;
    }
    get modifyPluggableDatabaseDbmFeature() {
        return this.getBooleanAttribute('modify_pluggable_database_dbm_feature');
    }
    set modifyPluggableDatabaseDbmFeature(value) {
        this._modifyPluggableDatabaseDbmFeature = value;
    }
    resetModifyPluggableDatabaseDbmFeature() {
        this._modifyPluggableDatabaseDbmFeature = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get modifyPluggableDatabaseDbmFeatureInput() {
        return this._modifyPluggableDatabaseDbmFeature;
    }
    get pluggableDatabaseId() {
        return this.getStringAttribute('pluggable_database_id');
    }
    set pluggableDatabaseId(value) {
        this._pluggableDatabaseId = value;
    }
    // Temporarily expose input value. Use with caution.
    get pluggableDatabaseIdInput() {
        return this._pluggableDatabaseId;
    }
    get featureDetails() {
        return this._featureDetails;
    }
    putFeatureDetails(value) {
        this._featureDetails.internalValue = value;
    }
    resetFeatureDetails() {
        this._featureDetails.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get featureDetailsInput() {
        return this._featureDetails.internalValue;
    }
    get timeouts() {
        return this._timeouts;
    }
    putTimeouts(value) {
        this._timeouts.internalValue = value;
    }
    resetTimeouts() {
        this._timeouts.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get timeoutsInput() {
        return this._timeouts.internalValue;
    }
    // =========
    // SYNTHESIS
    // =========
    synthesizeAttributes() {
        return {
            enable_pluggable_database_dbm_feature: cdktf.booleanToTerraform(this._enablePluggableDatabaseDbmFeature),
            id: cdktf.stringToTerraform(this._id),
            modify_pluggable_database_dbm_feature: cdktf.booleanToTerraform(this._modifyPluggableDatabaseDbmFeature),
            pluggable_database_id: cdktf.stringToTerraform(this._pluggableDatabaseId),
            feature_details: databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsToTerraform(this._featureDetails.internalValue),
            timeouts: databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsToTerraform(this._timeouts.internalValue),
        };
    }
    synthesizeHclAttributes() {
        const attrs = {
            enable_pluggable_database_dbm_feature: {
                value: cdktf.booleanToHclTerraform(this._enablePluggableDatabaseDbmFeature),
                isBlock: false,
                type: "simple",
                storageClassType: "boolean",
            },
            id: {
                value: cdktf.stringToHclTerraform(this._id),
                isBlock: false,
                type: "simple",
                storageClassType: "string",
            },
            modify_pluggable_database_dbm_feature: {
                value: cdktf.booleanToHclTerraform(this._modifyPluggableDatabaseDbmFeature),
                isBlock: false,
                type: "simple",
                storageClassType: "boolean",
            },
            pluggable_database_id: {
                value: cdktf.stringToHclTerraform(this._pluggableDatabaseId),
                isBlock: false,
                type: "simple",
                storageClassType: "string",
            },
            feature_details: {
                value: databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsToHclTerraform(this._featureDetails.internalValue),
                isBlock: true,
                type: "list",
                storageClassType: "DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementFeatureDetailsList",
            },
            timeouts: {
                value: databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeoutsToHclTerraform(this._timeouts.internalValue),
                isBlock: true,
                type: "struct",
                storageClassType: "DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagementTimeouts",
            },
        };
        // remove undefined attributes
        return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
    }
}
exports.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement = DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement;
_g = JSII_RTTI_SYMBOL_1;
DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement[_g] = { fqn: "rhizo-co-terraform-provider-oci.databaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement.DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement", version: "1.0.0" };
// =================
// STATIC PROPERTIES
// =================
DatabaseManagementPluggabledatabasePluggableDatabaseDbmFeaturesManagement.tfResourceType = "oci_database_management_pluggabledatabase_pluggable_database_dbm_features_management";
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UtbWFuYWdlbWVudC1wbHVnZ2FibGVkYXRhYmFzZS1wbHVnZ2FibGUtZGF0YWJhc2UtZGJtLWZlYXR1cmVzLW1hbmFnZW1lbnQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFJQSwrQkFBK0I7QUF3RC9CLFNBQWdCLGtIQUFrSCxDQUFDLE1BQXlPO0lBQzFXLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE9BQU87UUFDTCxjQUFjLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxhQUFhLENBQUM7UUFDOUQscUJBQXFCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxtQkFBbUIsQ0FBQztRQUMzRSxtQkFBbUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLGlCQUFpQixDQUFDO1FBQ3ZFLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsaUJBQWlCLENBQUM7S0FDekUsQ0FBQTtBQUNILENBQUM7QUFYRCxnUEFXQztBQUdELFNBQWdCLHFIQUFxSCxDQUFDLE1BQXlPO0lBQzdXLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0s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O2dCQUM1RCxPQUFPLEVBQUUsS0FBSztnQkFDZCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxnQkFBZ0IsRUFBRSxRQUFRO2FBQzNCO1lBQ0QsZUFBZSxFQUFFO2dCQUNmLEtBQUssRUFBRSxxR0FBcUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQztnQkFDaEosT0FBTyxFQUFFLElBQUk7Z0JBQ2IsSUFBSSxFQUFFLE1BQU07Z0JBQ1osZ0JBQWdCLEVBQUUsNkZBQTZGO2FBQ2hIO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLEtBQUssRUFBRSwrRkFBK0YsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQztnQkFDcEksT0FBTyxFQUFFLElBQUk7Z0JBQ2IsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsZ0JBQWdCLEVBQUUsbUZBQW1GO2FBQ3RHO1NBQ0YsQ0FBQztRQUVGLDhCQUE4QjtRQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBRSxDQUFDLENBQUE7SUFDNUgsQ0FBQzs7QUEvTUgsOEpBZ05DOzs7QUE5TUMsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDRyx3RkFBYyxHQUFHLHNGQUFzRixBQUF6RixDQUEwRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudFxuLy8gZ2VuZXJhdGVkIGZyb20gdGVycmFmb3JtIHJlc291cmNlIHNjaGVtYVxuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGNka3RmIGZyb20gJ2Nka3RmJztcblxuLy8gQ29uZmlndXJhdGlvblxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRDb25maWcgZXh0ZW5kcyBjZGt0Zi5UZXJyYWZvcm1NZXRhQXJndW1lbnRzIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvZGF0YWJhc2VfbWFuYWdlbWVudF9wbHVnZ2FibGVkYXRhYmFzZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmVzX21hbmFnZW1lbnQjZW5hYmxlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZSBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50I2VuYWJsZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmV9XG4gICovXG4gIHJlYWRvbmx5IGVuYWJsZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCNpZCBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50I2lkfVxuICAqXG4gICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgdGhlIGlkIGZpZWxkIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gYWxsIHJlc291cmNlcyBpbiBUZXJyYWZvcm0gcHJvdmlkZXJzIHVzaW5nIGEgVGVycmFmb3JtIHByb3ZpZGVyIFNESyB2ZXJzaW9uIGJlbG93IDIuXG4gICogSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgc2V0dGluZyB0aGlzIHZhbHVlIGl0IG1pZ2h0IG5vdCBiZSBzZXR0YWJsZS4gUGxlYXNlIHRha2UgYSBsb29rIGF0IHRoZSBwcm92aWRlciBkb2N1bWVudGF0aW9uIHRvIGVuc3VyZSBpdCBzaG91bGQgYmUgc2V0dGFibGUuXG4gICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCNtb2RpZnlfcGx1Z2dhYmxlX2RhdGFiYXNlX2RibV9mZWF0dXJlIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnQjbW9kaWZ5X3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZX1cbiAgKi9cbiAgcmVhZG9ubHkgbW9kaWZ5UGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCNwbHVnZ2FibGVfZGF0YWJhc2VfaWQgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudCNwbHVnZ2FibGVfZGF0YWJhc2VfaWR9XG4gICovXG4gIHJlYWRvbmx5IHBsdWdnYWJsZURhdGFiYXNlSWQ6IHN0cmluZztcbiAgLyoqXG4gICogZmVhdHVyZV9kZXRhaWxzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCNmZWF0dXJlX2RldGFpbHMgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudCNmZWF0dXJlX2RldGFpbHN9XG4gICovXG4gIHJlYWRvbmx5IGZlYXR1cmVEZXRhaWxzPzogRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzO1xuICAvKipcbiAgKiB0aW1lb3V0cyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvZGF0YWJhc2VfbWFuYWdlbWVudF9wbHVnZ2FibGVkYXRhYmFzZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmVzX21hbmFnZW1lbnQjdGltZW91dHMgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudCN0aW1lb3V0c31cbiAgKi9cbiAgcmVhZG9ubHkgdGltZW91dHM/OiBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50VGltZW91dHM7XG59XG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0Nvbm5lY3RvckRldGFpbHMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCNjb25uZWN0b3JfdHlwZSBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50I2Nvbm5lY3Rvcl90eXBlfVxuICAqL1xuICByZWFkb25seSBjb25uZWN0b3JUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCNkYXRhYmFzZV9jb25uZWN0b3JfaWQgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudCNkYXRhYmFzZV9jb25uZWN0b3JfaWR9XG4gICovXG4gIHJlYWRvbmx5IGRhdGFiYXNlQ29ubmVjdG9ySWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2RhdGFiYXNlX21hbmFnZW1lbnRfcGx1Z2dhYmxlZGF0YWJhc2VfcGx1Z2dhYmxlX2RhdGFiYXNlX2RibV9mZWF0dXJlc19tYW5hZ2VtZW50I21hbmFnZW1lbnRfYWdlbnRfaWQgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudCNtYW5hZ2VtZW50X2FnZW50X2lkfVxuICAqL1xuICByZWFkb25seSBtYW5hZ2VtZW50QWdlbnRJZD86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvZGF0YWJhc2VfbWFuYWdlbWVudF9wbHVnZ2FibGVkYXRhYmFzZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmVzX21hbmFnZW1lbnQjcHJpdmF0ZV9lbmRfcG9pbnRfaWQgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudCNwcml2YXRlX2VuZF9wb2ludF9pZH1cbiAgKi9cbiAgcmVhZG9ubHkgcHJpdmF0ZUVuZFBvaW50SWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNDb25uZWN0b3JEZXRhaWxzVG9UZXJyYWZvcm0oc3RydWN0PzogRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzQ29ubmVjdG9yRGV0YWlsc091dHB1dFJlZmVyZW5jZSB8IERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0Nvbm5lY3RvckRldGFpbHMpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgY29ubmVjdG9yX3R5cGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuY29ubmVjdG9yVHlwZSksXG4gICAgZGF0YWJhc2VfY29ubmVjdG9yX2lkOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmRhdGFiYXNlQ29ubmVjdG9ySWQpLFxuICAgIG1hbmFnZW1lbnRfYWdlbnRfaWQ6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEubWFuYWdlbWVudEFnZW50SWQpLFxuICAgIHByaXZhdGVfZW5kX3BvaW50X2lkOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnByaXZhdGVFbmRQb2ludElkKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNDb25uZWN0b3JEZXRhaWxzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzQ29ubmVjdG9yRGV0YWlsc091dHB1dFJlZmVyZW5jZSB8IERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0Nvbm5lY3RvckRldGFpbHMpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGNvbm5lY3Rvcl90eXBlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jb25uZWN0b3JUeXBlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBkYXRhYmFzZV9jb25uZWN0b3JfaWQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmRhdGFiYXNlQ29ubmVjdG9ySWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIG1hbmFnZW1lbnRfYWdlbnRfaWQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1hbmFnZW1lbnRBZ2VudElkKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBwcml2YXRlX2VuZF9wb2ludF9pZDoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucHJpdmF0ZUVuZFBvaW50SWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzQ29ubmVjdG9yRGV0YWlsc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzQ29ubmVjdG9yRGV0YWlscyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fY29ubmVjdG9yVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5jb25uZWN0b3JUeXBlID0gdGhpcy5fY29ubmVjdG9yVHlwZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RhdGFiYXNlQ29ubmVjdG9ySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZGF0YWJhc2VDb25uZWN0b3JJZCA9IHRoaXMuX2RhdGFiYXNlQ29ubmVjdG9ySWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYW5hZ2VtZW50QWdlbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tYW5hZ2VtZW50QWdlbnRJZCA9IHRoaXMuX21hbmFnZW1lbnRBZ2VudElkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcHJpdmF0ZUVuZFBvaW50SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucHJpdmF0ZUVuZFBvaW50SWQgPSB0aGlzLl9wcml2YXRlRW5kUG9pbnRJZDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0Nvbm5lY3RvckRldGFpbHMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9jb25uZWN0b3JUeXBlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZGF0YWJhc2VDb25uZWN0b3JJZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21hbmFnZW1lbnRBZ2VudElkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcHJpdmF0ZUVuZFBvaW50SWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2Nvbm5lY3RvclR5cGUgPSB2YWx1ZS5jb25uZWN0b3JUeXBlO1xuICAgICAgdGhpcy5fZGF0YWJhc2VDb25uZWN0b3JJZCA9IHZhbHVlLmRhdGFiYXNlQ29ubmVjdG9ySWQ7XG4gICAgICB0aGlzLl9tYW5hZ2VtZW50QWdlbnRJZCA9IHZhbHVlLm1hbmFnZW1lbnRBZ2VudElkO1xuICAgICAgdGhpcy5fcHJpdmF0ZUVuZFBvaW50SWQgPSB2YWx1ZS5wcml2YXRlRW5kUG9pbnRJZDtcbiAgICB9XG4gIH1cblxuICAvLyBjb25uZWN0b3JfdHlwZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jb25uZWN0b3JUeXBlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBjb25uZWN0b3JUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY29ubmVjdG9yX3R5cGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbm5lY3RvclR5cGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Nvbm5lY3RvclR5cGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDb25uZWN0b3JUeXBlKCkge1xuICAgIHRoaXMuX2Nvbm5lY3RvclR5cGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNvbm5lY3RvclR5cGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdG9yVHlwZTtcbiAgfVxuXG4gIC8vIGRhdGFiYXNlX2Nvbm5lY3Rvcl9pZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kYXRhYmFzZUNvbm5lY3RvcklkPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBkYXRhYmFzZUNvbm5lY3RvcklkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGF0YWJhc2VfY29ubmVjdG9yX2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCBkYXRhYmFzZUNvbm5lY3RvcklkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kYXRhYmFzZUNvbm5lY3RvcklkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGF0YWJhc2VDb25uZWN0b3JJZCgpIHtcbiAgICB0aGlzLl9kYXRhYmFzZUNvbm5lY3RvcklkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkYXRhYmFzZUNvbm5lY3RvcklkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFiYXNlQ29ubmVjdG9ySWQ7XG4gIH1cblxuICAvLyBtYW5hZ2VtZW50X2FnZW50X2lkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21hbmFnZW1lbnRBZ2VudElkPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBtYW5hZ2VtZW50QWdlbnRJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ21hbmFnZW1lbnRfYWdlbnRfaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1hbmFnZW1lbnRBZ2VudElkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9tYW5hZ2VtZW50QWdlbnRJZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1hbmFnZW1lbnRBZ2VudElkKCkge1xuICAgIHRoaXMuX21hbmFnZW1lbnRBZ2VudElkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtYW5hZ2VtZW50QWdlbnRJZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYW5hZ2VtZW50QWdlbnRJZDtcbiAgfVxuXG4gIC8vIHByaXZhdGVfZW5kX3BvaW50X2lkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3ByaXZhdGVFbmRQb2ludElkPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBwcml2YXRlRW5kUG9pbnRJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3ByaXZhdGVfZW5kX3BvaW50X2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCBwcml2YXRlRW5kUG9pbnRJZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcHJpdmF0ZUVuZFBvaW50SWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRQcml2YXRlRW5kUG9pbnRJZCgpIHtcbiAgICB0aGlzLl9wcml2YXRlRW5kUG9pbnRJZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcHJpdmF0ZUVuZFBvaW50SWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZUVuZFBvaW50SWQ7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc0Nvbm5lY3Rpb25DcmVkZW50aWFscyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2RhdGFiYXNlX21hbmFnZW1lbnRfcGx1Z2dhYmxlZGF0YWJhc2VfcGx1Z2dhYmxlX2RhdGFiYXNlX2RibV9mZWF0dXJlc19tYW5hZ2VtZW50I2NyZWRlbnRpYWxfbmFtZSBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50I2NyZWRlbnRpYWxfbmFtZX1cbiAgKi9cbiAgcmVhZG9ubHkgY3JlZGVudGlhbE5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2RhdGFiYXNlX21hbmFnZW1lbnRfcGx1Z2dhYmxlZGF0YWJhc2VfcGx1Z2dhYmxlX2RhdGFiYXNlX2RibV9mZWF0dXJlc19tYW5hZ2VtZW50I2NyZWRlbnRpYWxfdHlwZSBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50I2NyZWRlbnRpYWxfdHlwZX1cbiAgKi9cbiAgcmVhZG9ubHkgY3JlZGVudGlhbFR5cGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2RhdGFiYXNlX21hbmFnZW1lbnRfcGx1Z2dhYmxlZGF0YWJhc2VfcGx1Z2dhYmxlX2RhdGFiYXNlX2RibV9mZWF0dXJlc19tYW5hZ2VtZW50I25hbWVkX2NyZWRlbnRpYWxfaWQgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudCNuYW1lZF9jcmVkZW50aWFsX2lkfVxuICAqL1xuICByZWFkb25seSBuYW1lZENyZWRlbnRpYWxJZD86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvZGF0YWJhc2VfbWFuYWdlbWVudF9wbHVnZ2FibGVkYXRhYmFzZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmVzX21hbmFnZW1lbnQjcGFzc3dvcmRfc2VjcmV0X2lkIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnQjcGFzc3dvcmRfc2VjcmV0X2lkfVxuICAqL1xuICByZWFkb25seSBwYXNzd29yZFNlY3JldElkPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCNyb2xlIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnQjcm9sZX1cbiAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvZGF0YWJhc2VfbWFuYWdlbWVudF9wbHVnZ2FibGVkYXRhYmFzZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmVzX21hbmFnZW1lbnQjc3NsX3NlY3JldF9pZCBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50I3NzbF9zZWNyZXRfaWR9XG4gICovXG4gIHJlYWRvbmx5IHNzbFNlY3JldElkPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCN1c2VyX25hbWUgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudCN1c2VyX25hbWV9XG4gICovXG4gIHJlYWRvbmx5IHVzZXJOYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc0Nvbm5lY3Rpb25DcmVkZW50aWFsc1RvVGVycmFmb3JtKHN0cnVjdD86IERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0RhdGFiYXNlQ29ubmVjdGlvbkRldGFpbHNDb25uZWN0aW9uQ3JlZGVudGlhbHNPdXRwdXRSZWZlcmVuY2UgfCBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzQ29ubmVjdGlvbkNyZWRlbnRpYWxzKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNyZWRlbnRpYWxfbmFtZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5jcmVkZW50aWFsTmFtZSksXG4gICAgY3JlZGVudGlhbF90eXBlOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmNyZWRlbnRpYWxUeXBlKSxcbiAgICBuYW1lZF9jcmVkZW50aWFsX2lkOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm5hbWVkQ3JlZGVudGlhbElkKSxcbiAgICBwYXNzd29yZF9zZWNyZXRfaWQ6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEucGFzc3dvcmRTZWNyZXRJZCksXG4gICAgcm9sZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5yb2xlKSxcbiAgICBzc2xfc2VjcmV0X2lkOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnNzbFNlY3JldElkKSxcbiAgICB1c2VyX25hbWU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudXNlck5hbWUpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0RhdGFiYXNlQ29ubmVjdGlvbkRldGFpbHNDb25uZWN0aW9uQ3JlZGVudGlhbHNUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzQ29ubmVjdGlvbkNyZWRlbnRpYWxzT3V0cHV0UmVmZXJlbmNlIHwgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc0Nvbm5lY3Rpb25DcmVkZW50aWFscyk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgY3JlZGVudGlhbF9uYW1lOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jcmVkZW50aWFsTmFtZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgY3JlZGVudGlhbF90eXBlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jcmVkZW50aWFsVHlwZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgbmFtZWRfY3JlZGVudGlhbF9pZDoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEubmFtZWRDcmVkZW50aWFsSWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHBhc3N3b3JkX3NlY3JldF9pZDoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucGFzc3dvcmRTZWNyZXRJZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgcm9sZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucm9sZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgc3NsX3NlY3JldF9pZDoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuc3NsU2VjcmV0SWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHVzZXJfbmFtZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudXNlck5hbWUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc0Nvbm5lY3Rpb25DcmVkZW50aWFsc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc0Nvbm5lY3Rpb25DcmVkZW50aWFscyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fY3JlZGVudGlhbE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY3JlZGVudGlhbE5hbWUgPSB0aGlzLl9jcmVkZW50aWFsTmFtZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NyZWRlbnRpYWxUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmNyZWRlbnRpYWxUeXBlID0gdGhpcy5fY3JlZGVudGlhbFR5cGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9uYW1lZENyZWRlbnRpYWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5uYW1lZENyZWRlbnRpYWxJZCA9IHRoaXMuX25hbWVkQ3JlZGVudGlhbElkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcGFzc3dvcmRTZWNyZXRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5wYXNzd29yZFNlY3JldElkID0gdGhpcy5fcGFzc3dvcmRTZWNyZXRJZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JvbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucm9sZSA9IHRoaXMuX3JvbGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zc2xTZWNyZXRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zc2xTZWNyZXRJZCA9IHRoaXMuX3NzbFNlY3JldElkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdXNlck5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudXNlck5hbWUgPSB0aGlzLl91c2VyTmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0RhdGFiYXNlQ29ubmVjdGlvbkRldGFpbHNDb25uZWN0aW9uQ3JlZGVudGlhbHMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9jcmVkZW50aWFsTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NyZWRlbnRpYWxUeXBlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbmFtZWRDcmVkZW50aWFsSWQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9wYXNzd29yZFNlY3JldElkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcm9sZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3NzbFNlY3JldElkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdXNlck5hbWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2NyZWRlbnRpYWxOYW1lID0gdmFsdWUuY3JlZGVudGlhbE5hbWU7XG4gICAgICB0aGlzLl9jcmVkZW50aWFsVHlwZSA9IHZhbHVlLmNyZWRlbnRpYWxUeXBlO1xuICAgICAgdGhpcy5fbmFtZWRDcmVkZW50aWFsSWQgPSB2YWx1ZS5uYW1lZENyZWRlbnRpYWxJZDtcbiAgICAgIHRoaXMuX3Bhc3N3b3JkU2VjcmV0SWQgPSB2YWx1ZS5wYXNzd29yZFNlY3JldElkO1xuICAgICAgdGhpcy5fcm9sZSA9IHZhbHVlLnJvbGU7XG4gICAgICB0aGlzLl9zc2xTZWNyZXRJZCA9IHZhbHVlLnNzbFNlY3JldElkO1xuICAgICAgdGhpcy5fdXNlck5hbWUgPSB2YWx1ZS51c2VyTmFtZTtcbiAgICB9XG4gIH1cblxuICAvLyBjcmVkZW50aWFsX25hbWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY3JlZGVudGlhbE5hbWU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGNyZWRlbnRpYWxOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY3JlZGVudGlhbF9uYW1lJyk7XG4gIH1cbiAgcHVibGljIHNldCBjcmVkZW50aWFsTmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY3JlZGVudGlhbE5hbWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDcmVkZW50aWFsTmFtZSgpIHtcbiAgICB0aGlzLl9jcmVkZW50aWFsTmFtZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY3JlZGVudGlhbE5hbWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlZGVudGlhbE5hbWU7XG4gIH1cblxuICAvLyBjcmVkZW50aWFsX3R5cGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY3JlZGVudGlhbFR5cGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGNyZWRlbnRpYWxUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY3JlZGVudGlhbF90eXBlJyk7XG4gIH1cbiAgcHVibGljIHNldCBjcmVkZW50aWFsVHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY3JlZGVudGlhbFR5cGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDcmVkZW50aWFsVHlwZSgpIHtcbiAgICB0aGlzLl9jcmVkZW50aWFsVHlwZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY3JlZGVudGlhbFR5cGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlZGVudGlhbFR5cGU7XG4gIH1cblxuICAvLyBuYW1lZF9jcmVkZW50aWFsX2lkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbmFtZWRDcmVkZW50aWFsSWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IG5hbWVkQ3JlZGVudGlhbElkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbmFtZWRfY3JlZGVudGlhbF9pZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZWRDcmVkZW50aWFsSWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWVkQ3JlZGVudGlhbElkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TmFtZWRDcmVkZW50aWFsSWQoKSB7XG4gICAgdGhpcy5fbmFtZWRDcmVkZW50aWFsSWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG5hbWVkQ3JlZGVudGlhbElkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWVkQ3JlZGVudGlhbElkO1xuICB9XG5cbiAgLy8gcGFzc3dvcmRfc2VjcmV0X2lkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3Bhc3N3b3JkU2VjcmV0SWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHBhc3N3b3JkU2VjcmV0SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdwYXNzd29yZF9zZWNyZXRfaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhc3N3b3JkU2VjcmV0SWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Bhc3N3b3JkU2VjcmV0SWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRQYXNzd29yZFNlY3JldElkKCkge1xuICAgIHRoaXMuX3Bhc3N3b3JkU2VjcmV0SWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHBhc3N3b3JkU2VjcmV0SWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFzc3dvcmRTZWNyZXRJZDtcbiAgfVxuXG4gIC8vIHJvbGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcm9sZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgcm9sZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3JvbGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJvbGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3JvbGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRSb2xlKCkge1xuICAgIHRoaXMuX3JvbGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHJvbGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcm9sZTtcbiAgfVxuXG4gIC8vIHNzbF9zZWNyZXRfaWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc3NsU2VjcmV0SWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHNzbFNlY3JldElkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnc3NsX3NlY3JldF9pZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3NsU2VjcmV0SWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3NzbFNlY3JldElkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U3NsU2VjcmV0SWQoKSB7XG4gICAgdGhpcy5fc3NsU2VjcmV0SWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNzbFNlY3JldElkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NzbFNlY3JldElkO1xuICB9XG5cbiAgLy8gdXNlcl9uYW1lIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3VzZXJOYW1lPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB1c2VyTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3VzZXJfbmFtZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdXNlck5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3VzZXJOYW1lID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VXNlck5hbWUoKSB7XG4gICAgdGhpcy5fdXNlck5hbWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHVzZXJOYW1lSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJOYW1lO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0RhdGFiYXNlQ29ubmVjdGlvbkRldGFpbHNDb25uZWN0aW9uU3RyaW5nIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvZGF0YWJhc2VfbWFuYWdlbWVudF9wbHVnZ2FibGVkYXRhYmFzZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmVzX21hbmFnZW1lbnQjY29ubmVjdGlvbl90eXBlIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnQjY29ubmVjdGlvbl90eXBlfVxuICAqL1xuICByZWFkb25seSBjb25uZWN0aW9uVHlwZT86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvZGF0YWJhc2VfbWFuYWdlbWVudF9wbHVnZ2FibGVkYXRhYmFzZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmVzX21hbmFnZW1lbnQjcG9ydCBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50I3BvcnR9XG4gICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2RhdGFiYXNlX21hbmFnZW1lbnRfcGx1Z2dhYmxlZGF0YWJhc2VfcGx1Z2dhYmxlX2RhdGFiYXNlX2RibV9mZWF0dXJlc19tYW5hZ2VtZW50I3Byb3RvY29sIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnQjcHJvdG9jb2x9XG4gICovXG4gIHJlYWRvbmx5IHByb3RvY29sPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCNzZXJ2aWNlIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnQjc2VydmljZX1cbiAgKi9cbiAgcmVhZG9ubHkgc2VydmljZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0RhdGFiYXNlQ29ubmVjdGlvbkRldGFpbHNDb25uZWN0aW9uU3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0PzogRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc0Nvbm5lY3Rpb25TdHJpbmdPdXRwdXRSZWZlcmVuY2UgfCBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzQ29ubmVjdGlvblN0cmluZyk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb25uZWN0aW9uX3R5cGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuY29ubmVjdGlvblR5cGUpLFxuICAgIHBvcnQ6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEucG9ydCksXG4gICAgcHJvdG9jb2w6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEucHJvdG9jb2wpLFxuICAgIHNlcnZpY2U6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuc2VydmljZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc0Nvbm5lY3Rpb25TdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzQ29ubmVjdGlvblN0cmluZ091dHB1dFJlZmVyZW5jZSB8IERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0RhdGFiYXNlQ29ubmVjdGlvbkRldGFpbHNDb25uZWN0aW9uU3RyaW5nKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBjb25uZWN0aW9uX3R5cGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmNvbm5lY3Rpb25UeXBlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBwb3J0OiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5wb3J0KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBwcm90b2NvbDoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucHJvdG9jb2wpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHNlcnZpY2U6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnNlcnZpY2UpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc0Nvbm5lY3Rpb25TdHJpbmdPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0RhdGFiYXNlQ29ubmVjdGlvbkRldGFpbHNDb25uZWN0aW9uU3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9jb25uZWN0aW9uVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5jb25uZWN0aW9uVHlwZSA9IHRoaXMuX2Nvbm5lY3Rpb25UeXBlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5wb3J0ID0gdGhpcy5fcG9ydDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3Byb3RvY29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnByb3RvY29sID0gdGhpcy5fcHJvdG9jb2w7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zZXJ2aWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnNlcnZpY2UgPSB0aGlzLl9zZXJ2aWNlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc0Nvbm5lY3Rpb25TdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9jb25uZWN0aW9uVHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3BvcnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9wcm90b2NvbCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3NlcnZpY2UgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25UeXBlID0gdmFsdWUuY29ubmVjdGlvblR5cGU7XG4gICAgICB0aGlzLl9wb3J0ID0gdmFsdWUucG9ydDtcbiAgICAgIHRoaXMuX3Byb3RvY29sID0gdmFsdWUucHJvdG9jb2w7XG4gICAgICB0aGlzLl9zZXJ2aWNlID0gdmFsdWUuc2VydmljZTtcbiAgICB9XG4gIH1cblxuICAvLyBjb25uZWN0aW9uX3R5cGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY29ubmVjdGlvblR5cGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY29ubmVjdGlvbl90eXBlJyk7XG4gIH1cbiAgcHVibGljIHNldCBjb25uZWN0aW9uVHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29ubmVjdGlvblR5cGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDb25uZWN0aW9uVHlwZSgpIHtcbiAgICB0aGlzLl9jb25uZWN0aW9uVHlwZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvblR5cGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvblR5cGU7XG4gIH1cblxuICAvLyBwb3J0IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3BvcnQ/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHBvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdwb3J0Jyk7XG4gIH1cbiAgcHVibGljIHNldCBwb3J0KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wb3J0ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UG9ydCgpIHtcbiAgICB0aGlzLl9wb3J0ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwb3J0SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BvcnQ7XG4gIH1cblxuICAvLyBwcm90b2NvbCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wcm90b2NvbD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgcHJvdG9jb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdwcm90b2NvbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgcHJvdG9jb2wodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Byb3RvY29sID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UHJvdG9jb2woKSB7XG4gICAgdGhpcy5fcHJvdG9jb2wgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHByb3RvY29sSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sO1xuICB9XG5cbiAgLy8gc2VydmljZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zZXJ2aWNlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzZXJ2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnc2VydmljZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2VydmljZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc2VydmljZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNlcnZpY2UoKSB7XG4gICAgdGhpcy5fc2VydmljZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc2VydmljZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0RhdGFiYXNlQ29ubmVjdGlvbkRldGFpbHMge1xuICAvKipcbiAgKiBjb25uZWN0aW9uX2NyZWRlbnRpYWxzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCNjb25uZWN0aW9uX2NyZWRlbnRpYWxzIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnQjY29ubmVjdGlvbl9jcmVkZW50aWFsc31cbiAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvbkNyZWRlbnRpYWxzPzogRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc0Nvbm5lY3Rpb25DcmVkZW50aWFscztcbiAgLyoqXG4gICogY29ubmVjdGlvbl9zdHJpbmcgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2RhdGFiYXNlX21hbmFnZW1lbnRfcGx1Z2dhYmxlZGF0YWJhc2VfcGx1Z2dhYmxlX2RhdGFiYXNlX2RibV9mZWF0dXJlc19tYW5hZ2VtZW50I2Nvbm5lY3Rpb25fc3RyaW5nIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnQjY29ubmVjdGlvbl9zdHJpbmd9XG4gICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25TdHJpbmc/OiBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzQ29ubmVjdGlvblN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0RhdGFiYXNlQ29ubmVjdGlvbkRldGFpbHNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzT3V0cHV0UmVmZXJlbmNlIHwgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlscyk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb25uZWN0aW9uX2NyZWRlbnRpYWxzOiBkYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzQ29ubmVjdGlvbkNyZWRlbnRpYWxzVG9UZXJyYWZvcm0oc3RydWN0IS5jb25uZWN0aW9uQ3JlZGVudGlhbHMpLFxuICAgIGNvbm5lY3Rpb25fc3RyaW5nOiBkYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzQ29ubmVjdGlvblN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuY29ubmVjdGlvblN0cmluZyksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0RhdGFiYXNlQ29ubmVjdGlvbkRldGFpbHNPdXRwdXRSZWZlcmVuY2UgfCBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBjb25uZWN0aW9uX2NyZWRlbnRpYWxzOiB7XG4gICAgICB2YWx1ZTogZGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc0Nvbm5lY3Rpb25DcmVkZW50aWFsc1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuY29ubmVjdGlvbkNyZWRlbnRpYWxzKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc0Nvbm5lY3Rpb25DcmVkZW50aWFsc0xpc3RcIixcbiAgICB9LFxuICAgIGNvbm5lY3Rpb25fc3RyaW5nOiB7XG4gICAgICB2YWx1ZTogZGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc0Nvbm5lY3Rpb25TdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmNvbm5lY3Rpb25TdHJpbmcpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzQ29ubmVjdGlvblN0cmluZ0xpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlscyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fY29ubmVjdGlvbkNyZWRlbnRpYWxzPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmNvbm5lY3Rpb25DcmVkZW50aWFscyA9IHRoaXMuX2Nvbm5lY3Rpb25DcmVkZW50aWFscz8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2Nvbm5lY3Rpb25TdHJpbmc/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY29ubmVjdGlvblN0cmluZyA9IHRoaXMuX2Nvbm5lY3Rpb25TdHJpbmc/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fY29ubmVjdGlvbkNyZWRlbnRpYWxzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jb25uZWN0aW9uU3RyaW5nLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25DcmVkZW50aWFscy5pbnRlcm5hbFZhbHVlID0gdmFsdWUuY29ubmVjdGlvbkNyZWRlbnRpYWxzO1xuICAgICAgdGhpcy5fY29ubmVjdGlvblN0cmluZy5pbnRlcm5hbFZhbHVlID0gdmFsdWUuY29ubmVjdGlvblN0cmluZztcbiAgICB9XG4gIH1cblxuICAvLyBjb25uZWN0aW9uX2NyZWRlbnRpYWxzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2Nvbm5lY3Rpb25DcmVkZW50aWFscyA9IG5ldyBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzQ29ubmVjdGlvbkNyZWRlbnRpYWxzT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiY29ubmVjdGlvbl9jcmVkZW50aWFsc1wiKTtcbiAgcHVibGljIGdldCBjb25uZWN0aW9uQ3JlZGVudGlhbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25DcmVkZW50aWFscztcbiAgfVxuICBwdWJsaWMgcHV0Q29ubmVjdGlvbkNyZWRlbnRpYWxzKHZhbHVlOiBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzQ29ubmVjdGlvbkNyZWRlbnRpYWxzKSB7XG4gICAgdGhpcy5fY29ubmVjdGlvbkNyZWRlbnRpYWxzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDb25uZWN0aW9uQ3JlZGVudGlhbHMoKSB7XG4gICAgdGhpcy5fY29ubmVjdGlvbkNyZWRlbnRpYWxzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25DcmVkZW50aWFsc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uQ3JlZGVudGlhbHMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGNvbm5lY3Rpb25fc3RyaW5nIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2Nvbm5lY3Rpb25TdHJpbmcgPSBuZXcgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc0Nvbm5lY3Rpb25TdHJpbmdPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJjb25uZWN0aW9uX3N0cmluZ1wiKTtcbiAgcHVibGljIGdldCBjb25uZWN0aW9uU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uU3RyaW5nO1xuICB9XG4gIHB1YmxpYyBwdXRDb25uZWN0aW9uU3RyaW5nKHZhbHVlOiBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzQ29ubmVjdGlvblN0cmluZykge1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25TdHJpbmcuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENvbm5lY3Rpb25TdHJpbmcoKSB7XG4gICAgdGhpcy5fY29ubmVjdGlvblN0cmluZy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjb25uZWN0aW9uU3RyaW5nSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25TdHJpbmcuaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCNmZWF0dXJlIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnQjZmVhdHVyZX1cbiAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZTogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCNpc19hdXRvX2VuYWJsZV9wbHVnZ2FibGVfZGF0YWJhc2UgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudCNpc19hdXRvX2VuYWJsZV9wbHVnZ2FibGVfZGF0YWJhc2V9XG4gICovXG4gIHJlYWRvbmx5IGlzQXV0b0VuYWJsZVBsdWdnYWJsZURhdGFiYXNlPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCNtYW5hZ2VtZW50X3R5cGUgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudCNtYW5hZ2VtZW50X3R5cGV9XG4gICovXG4gIHJlYWRvbmx5IG1hbmFnZW1lbnRUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgKiBjb25uZWN0b3JfZGV0YWlscyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvZGF0YWJhc2VfbWFuYWdlbWVudF9wbHVnZ2FibGVkYXRhYmFzZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmVzX21hbmFnZW1lbnQjY29ubmVjdG9yX2RldGFpbHMgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudCNjb25uZWN0b3JfZGV0YWlsc31cbiAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdG9yRGV0YWlscz86IERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0Nvbm5lY3RvckRldGFpbHM7XG4gIC8qKlxuICAqIGRhdGFiYXNlX2Nvbm5lY3Rpb25fZGV0YWlscyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvZGF0YWJhc2VfbWFuYWdlbWVudF9wbHVnZ2FibGVkYXRhYmFzZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmVzX21hbmFnZW1lbnQjZGF0YWJhc2VfY29ubmVjdGlvbl9kZXRhaWxzIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnQjZGF0YWJhc2VfY29ubmVjdGlvbl9kZXRhaWxzfVxuICAqL1xuICByZWFkb25seSBkYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzPzogRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlscztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc1RvVGVycmFmb3JtKHN0cnVjdD86IERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc091dHB1dFJlZmVyZW5jZSB8IERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlscyk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBmZWF0dXJlOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmZlYXR1cmUpLFxuICAgIGlzX2F1dG9fZW5hYmxlX3BsdWdnYWJsZV9kYXRhYmFzZTogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuaXNBdXRvRW5hYmxlUGx1Z2dhYmxlRGF0YWJhc2UpLFxuICAgIG1hbmFnZW1lbnRfdHlwZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5tYW5hZ2VtZW50VHlwZSksXG4gICAgY29ubmVjdG9yX2RldGFpbHM6IGRhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0Nvbm5lY3RvckRldGFpbHNUb1RlcnJhZm9ybShzdHJ1Y3QhLmNvbm5lY3RvckRldGFpbHMpLFxuICAgIGRhdGFiYXNlX2Nvbm5lY3Rpb25fZGV0YWlsczogZGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc1RvVGVycmFmb3JtKHN0cnVjdCEuZGF0YWJhc2VDb25uZWN0aW9uRGV0YWlscyksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzT3V0cHV0UmVmZXJlbmNlIHwgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBmZWF0dXJlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5mZWF0dXJlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBpc19hdXRvX2VuYWJsZV9wbHVnZ2FibGVfZGF0YWJhc2U6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5pc0F1dG9FbmFibGVQbHVnZ2FibGVEYXRhYmFzZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIG1hbmFnZW1lbnRfdHlwZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEubWFuYWdlbWVudFR5cGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGNvbm5lY3Rvcl9kZXRhaWxzOiB7XG4gICAgICB2YWx1ZTogZGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzQ29ubmVjdG9yRGV0YWlsc1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuY29ubmVjdG9yRGV0YWlscyksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkRhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0Nvbm5lY3RvckRldGFpbHNMaXN0XCIsXG4gICAgfSxcbiAgICBkYXRhYmFzZV9jb25uZWN0aW9uX2RldGFpbHM6IHtcbiAgICAgIHZhbHVlOiBkYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc0xpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHMgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2ZlYXR1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZmVhdHVyZSA9IHRoaXMuX2ZlYXR1cmU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pc0F1dG9FbmFibGVQbHVnZ2FibGVEYXRhYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5pc0F1dG9FbmFibGVQbHVnZ2FibGVEYXRhYmFzZSA9IHRoaXMuX2lzQXV0b0VuYWJsZVBsdWdnYWJsZURhdGFiYXNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWFuYWdlbWVudFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWFuYWdlbWVudFR5cGUgPSB0aGlzLl9tYW5hZ2VtZW50VHlwZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2Nvbm5lY3RvckRldGFpbHM/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY29ubmVjdG9yRGV0YWlscyA9IHRoaXMuX2Nvbm5lY3RvckRldGFpbHM/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRhdGFiYXNlQ29ubmVjdGlvbkRldGFpbHMgPSB0aGlzLl9kYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fZmVhdHVyZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2lzQXV0b0VuYWJsZVBsdWdnYWJsZURhdGFiYXNlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWFuYWdlbWVudFR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jb25uZWN0b3JEZXRhaWxzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2ZlYXR1cmUgPSB2YWx1ZS5mZWF0dXJlO1xuICAgICAgdGhpcy5faXNBdXRvRW5hYmxlUGx1Z2dhYmxlRGF0YWJhc2UgPSB2YWx1ZS5pc0F1dG9FbmFibGVQbHVnZ2FibGVEYXRhYmFzZTtcbiAgICAgIHRoaXMuX21hbmFnZW1lbnRUeXBlID0gdmFsdWUubWFuYWdlbWVudFR5cGU7XG4gICAgICB0aGlzLl9jb25uZWN0b3JEZXRhaWxzLmludGVybmFsVmFsdWUgPSB2YWx1ZS5jb25uZWN0b3JEZXRhaWxzO1xuICAgICAgdGhpcy5fZGF0YWJhc2VDb25uZWN0aW9uRGV0YWlscy5pbnRlcm5hbFZhbHVlID0gdmFsdWUuZGF0YWJhc2VDb25uZWN0aW9uRGV0YWlscztcbiAgICB9XG4gIH1cblxuICAvLyBmZWF0dXJlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2ZlYXR1cmU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGZlYXR1cmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdmZWF0dXJlJyk7XG4gIH1cbiAgcHVibGljIHNldCBmZWF0dXJlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9mZWF0dXJlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZlYXR1cmVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmVhdHVyZTtcbiAgfVxuXG4gIC8vIGlzX2F1dG9fZW5hYmxlX3BsdWdnYWJsZV9kYXRhYmFzZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pc0F1dG9FbmFibGVQbHVnZ2FibGVEYXRhYmFzZT86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgaXNBdXRvRW5hYmxlUGx1Z2dhYmxlRGF0YWJhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnaXNfYXV0b19lbmFibGVfcGx1Z2dhYmxlX2RhdGFiYXNlJyk7XG4gIH1cbiAgcHVibGljIHNldCBpc0F1dG9FbmFibGVQbHVnZ2FibGVEYXRhYmFzZSh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5faXNBdXRvRW5hYmxlUGx1Z2dhYmxlRGF0YWJhc2UgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRJc0F1dG9FbmFibGVQbHVnZ2FibGVEYXRhYmFzZSgpIHtcbiAgICB0aGlzLl9pc0F1dG9FbmFibGVQbHVnZ2FibGVEYXRhYmFzZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaXNBdXRvRW5hYmxlUGx1Z2dhYmxlRGF0YWJhc2VJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNBdXRvRW5hYmxlUGx1Z2dhYmxlRGF0YWJhc2U7XG4gIH1cblxuICAvLyBtYW5hZ2VtZW50X3R5cGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWFuYWdlbWVudFR5cGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IG1hbmFnZW1lbnRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbWFuYWdlbWVudF90eXBlJyk7XG4gIH1cbiAgcHVibGljIHNldCBtYW5hZ2VtZW50VHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbWFuYWdlbWVudFR5cGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRNYW5hZ2VtZW50VHlwZSgpIHtcbiAgICB0aGlzLl9tYW5hZ2VtZW50VHlwZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWFuYWdlbWVudFR5cGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFuYWdlbWVudFR5cGU7XG4gIH1cblxuICAvLyBjb25uZWN0b3JfZGV0YWlscyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jb25uZWN0b3JEZXRhaWxzID0gbmV3IERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc0Nvbm5lY3RvckRldGFpbHNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJjb25uZWN0b3JfZGV0YWlsc1wiKTtcbiAgcHVibGljIGdldCBjb25uZWN0b3JEZXRhaWxzKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0b3JEZXRhaWxzO1xuICB9XG4gIHB1YmxpYyBwdXRDb25uZWN0b3JEZXRhaWxzKHZhbHVlOiBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNDb25uZWN0b3JEZXRhaWxzKSB7XG4gICAgdGhpcy5fY29ubmVjdG9yRGV0YWlscy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Q29ubmVjdG9yRGV0YWlscygpIHtcbiAgICB0aGlzLl9jb25uZWN0b3JEZXRhaWxzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNvbm5lY3RvckRldGFpbHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdG9yRGV0YWlscy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gZGF0YWJhc2VfY29ubmVjdGlvbl9kZXRhaWxzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2RhdGFiYXNlQ29ubmVjdGlvbkRldGFpbHMgPSBuZXcgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzRGF0YWJhc2VDb25uZWN0aW9uRGV0YWlsc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcImRhdGFiYXNlX2Nvbm5lY3Rpb25fZGV0YWlsc1wiKTtcbiAgcHVibGljIGdldCBkYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzO1xuICB9XG4gIHB1YmxpYyBwdXREYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzKHZhbHVlOiBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNEYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzKSB7XG4gICAgdGhpcy5fZGF0YWJhc2VDb25uZWN0aW9uRGV0YWlscy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGF0YWJhc2VDb25uZWN0aW9uRGV0YWlscygpIHtcbiAgICB0aGlzLl9kYXRhYmFzZUNvbm5lY3Rpb25EZXRhaWxzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRhdGFiYXNlQ29ubmVjdGlvbkRldGFpbHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YWJhc2VDb25uZWN0aW9uRGV0YWlscy5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRUaW1lb3V0cyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNi4xOC4wL2RvY3MvcmVzb3VyY2VzL2RhdGFiYXNlX21hbmFnZW1lbnRfcGx1Z2dhYmxlZGF0YWJhc2VfcGx1Z2dhYmxlX2RhdGFiYXNlX2RibV9mZWF0dXJlc19tYW5hZ2VtZW50I2NyZWF0ZSBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50I2NyZWF0ZX1cbiAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCNkZWxldGUgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudCNkZWxldGV9XG4gICovXG4gIHJlYWRvbmx5IGRlbGV0ZT86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvZGF0YWJhc2VfbWFuYWdlbWVudF9wbHVnZ2FibGVkYXRhYmFzZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmVzX21hbmFnZW1lbnQjdXBkYXRlIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnQjdXBkYXRlfVxuICAqL1xuICByZWFkb25seSB1cGRhdGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50VGltZW91dHNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50VGltZW91dHMgfCBjZGt0Zi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjcmVhdGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuY3JlYXRlKSxcbiAgICBkZWxldGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuZGVsZXRlKSxcbiAgICB1cGRhdGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudXBkYXRlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50VGltZW91dHNUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50VGltZW91dHMgfCBjZGt0Zi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgY3JlYXRlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jcmVhdGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGRlbGV0ZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGVsZXRlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB1cGRhdGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnVwZGF0ZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50VGltZW91dHNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb2x2YWJsZVZhbHVlPzogY2RrdGYuSVJlc29sdmFibGU7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRUaW1lb3V0cyB8IGNka3RmLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fY3JlYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmNyZWF0ZSA9IHRoaXMuX2NyZWF0ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RlbGV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5kZWxldGUgPSB0aGlzLl9kZWxldGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl91cGRhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudXBkYXRlID0gdGhpcy5fdXBkYXRlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudFRpbWVvdXRzIHwgY2RrdGYuSVJlc29sdmFibGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NyZWF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2RlbGV0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3VwZGF0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jcmVhdGUgPSB2YWx1ZS5jcmVhdGU7XG4gICAgICB0aGlzLl9kZWxldGUgPSB2YWx1ZS5kZWxldGU7XG4gICAgICB0aGlzLl91cGRhdGUgPSB2YWx1ZS51cGRhdGU7XG4gICAgfVxuICB9XG5cbiAgLy8gY3JlYXRlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2NyZWF0ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgY3JlYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY3JlYXRlJyk7XG4gIH1cbiAgcHVibGljIHNldCBjcmVhdGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NyZWF0ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENyZWF0ZSgpIHtcbiAgICB0aGlzLl9jcmVhdGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNyZWF0ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGU7XG4gIH1cblxuICAvLyBkZWxldGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGVsZXRlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBkZWxldGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdkZWxldGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlbGV0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVsZXRlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGVsZXRlKCkge1xuICAgIHRoaXMuX2RlbGV0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZGVsZXRlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlbGV0ZTtcbiAgfVxuXG4gIC8vIHVwZGF0ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF91cGRhdGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHVwZGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3VwZGF0ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdXBkYXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl91cGRhdGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRVcGRhdGUoKSB7XG4gICAgdGhpcy5fdXBkYXRlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB1cGRhdGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlO1xuICB9XG59XG5cbi8qKlxuKiBSZXByZXNlbnRzIGEge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzYuMTguMC9kb2NzL3Jlc291cmNlcy9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCBvY2lfZGF0YWJhc2VfbWFuYWdlbWVudF9wbHVnZ2FibGVkYXRhYmFzZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmVzX21hbmFnZW1lbnR9XG4qL1xuZXhwb3J0IGNsYXNzIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnQgZXh0ZW5kcyBjZGt0Zi5UZXJyYWZvcm1SZXNvdXJjZSB7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT1cbiAgLy8gU1RBVElDIFBST1BFUlRJRVNcbiAgLy8gPT09PT09PT09PT09PT09PT1cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0ZlJlc291cmNlVHlwZSA9IFwib2NpX2RhdGFiYXNlX21hbmFnZW1lbnRfcGx1Z2dhYmxlZGF0YWJhc2VfcGx1Z2dhYmxlX2RhdGFiYXNlX2RibV9mZWF0dXJlc19tYW5hZ2VtZW50XCI7XG5cbiAgLy8gPT09PT09PT09PT09PT1cbiAgLy8gU1RBVElDIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT1cbiAgLyoqXG4gICogR2VuZXJhdGVzIENES1RGIGNvZGUgZm9yIGltcG9ydGluZyBhIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnQgcmVzb3VyY2UgdXBvbiBydW5uaW5nIFwiY2RrdGYgcGxhbiA8c3RhY2stbmFtZT5cIlxuICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICogQHBhcmFtIGltcG9ydFRvSWQgVGhlIGNvbnN0cnVjdCBpZCB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgY29uZmlnIGZvciB0aGUgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudCB0byBpbXBvcnRcbiAgKiBAcGFyYW0gaW1wb3J0RnJvbUlkIFRoZSBpZCBvZiB0aGUgZXhpc3RpbmcgRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudCB0aGF0IHNob3VsZCBiZSBpbXBvcnRlZC4gUmVmZXIgdG8gdGhlIHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvZGF0YWJhc2VfbWFuYWdlbWVudF9wbHVnZ2FibGVkYXRhYmFzZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmVzX21hbmFnZW1lbnQjaW1wb3J0IGltcG9ydCBzZWN0aW9ufSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIHJlc291cmNlIGZvciB0aGUgaWQgdG8gdXNlXG4gICogQHBhcmFtIHByb3ZpZGVyPyBPcHRpb25hbCBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZXIgd2hlcmUgdGhlIERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnQgdG8gaW1wb3J0IGlzIGZvdW5kXG4gICovXG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVDb25maWdGb3JJbXBvcnQoc2NvcGU6IENvbnN0cnVjdCwgaW1wb3J0VG9JZDogc3RyaW5nLCBpbXBvcnRGcm9tSWQ6IHN0cmluZywgcHJvdmlkZXI/OiBjZGt0Zi5UZXJyYWZvcm1Qcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IGNka3RmLkltcG9ydGFibGVSZXNvdXJjZShzY29wZSwgaW1wb3J0VG9JZCwgeyB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IFwib2NpX2RhdGFiYXNlX21hbmFnZW1lbnRfcGx1Z2dhYmxlZGF0YWJhc2VfcGx1Z2dhYmxlX2RhdGFiYXNlX2RibV9mZWF0dXJlc19tYW5hZ2VtZW50XCIsIGltcG9ydElkOiBpbXBvcnRGcm9tSWQsIHByb3ZpZGVyIH0pO1xuICAgICAgfVxuXG4gIC8vID09PT09PT09PT09XG4gIC8vIElOSVRJQUxJWkVSXG4gIC8vID09PT09PT09PT09XG5cbiAgLyoqXG4gICogQ3JlYXRlIGEgbmV3IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS82LjE4LjAvZG9jcy9yZXNvdXJjZXMvZGF0YWJhc2VfbWFuYWdlbWVudF9wbHVnZ2FibGVkYXRhYmFzZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmVzX21hbmFnZW1lbnQgb2NpX2RhdGFiYXNlX21hbmFnZW1lbnRfcGx1Z2dhYmxlZGF0YWJhc2VfcGx1Z2dhYmxlX2RhdGFiYXNlX2RibV9mZWF0dXJlc19tYW5hZ2VtZW50fSBSZXNvdXJjZVxuICAqXG4gICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgKiBAcGFyYW0gaWQgVGhlIHNjb3BlZCBjb25zdHJ1Y3QgSUQuIE11c3QgYmUgdW5pcXVlIGFtb25nc3Qgc2libGluZ3MgaW4gdGhlIHNhbWUgc2NvcGVcbiAgKiBAcGFyYW0gb3B0aW9ucyBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50Q29uZmlnXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjb25maWc6IERhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRDb25maWcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHRlcnJhZm9ybVJlc291cmNlVHlwZTogJ29jaV9kYXRhYmFzZV9tYW5hZ2VtZW50X3BsdWdnYWJsZWRhdGFiYXNlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZXNfbWFuYWdlbWVudCcsXG4gICAgICB0ZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YToge1xuICAgICAgICBwcm92aWRlck5hbWU6ICdvY2knLFxuICAgICAgICBwcm92aWRlclZlcnNpb246ICc2LjE4LjAnLFxuICAgICAgICBwcm92aWRlclZlcnNpb25Db25zdHJhaW50OiAnfj4gNi4xOC4wJ1xuICAgICAgfSxcbiAgICAgIHByb3ZpZGVyOiBjb25maWcucHJvdmlkZXIsXG4gICAgICBkZXBlbmRzT246IGNvbmZpZy5kZXBlbmRzT24sXG4gICAgICBjb3VudDogY29uZmlnLmNvdW50LFxuICAgICAgbGlmZWN5Y2xlOiBjb25maWcubGlmZWN5Y2xlLFxuICAgICAgcHJvdmlzaW9uZXJzOiBjb25maWcucHJvdmlzaW9uZXJzLFxuICAgICAgY29ubmVjdGlvbjogY29uZmlnLmNvbm5lY3Rpb24sXG4gICAgICBmb3JFYWNoOiBjb25maWcuZm9yRWFjaFxuICAgIH0pO1xuICAgIHRoaXMuX2VuYWJsZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZSA9IGNvbmZpZy5lbmFibGVQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmU7XG4gICAgdGhpcy5faWQgPSBjb25maWcuaWQ7XG4gICAgdGhpcy5fbW9kaWZ5UGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlID0gY29uZmlnLm1vZGlmeVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZTtcbiAgICB0aGlzLl9wbHVnZ2FibGVEYXRhYmFzZUlkID0gY29uZmlnLnBsdWdnYWJsZURhdGFiYXNlSWQ7XG4gICAgdGhpcy5fZmVhdHVyZURldGFpbHMuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5mZWF0dXJlRGV0YWlscztcbiAgICB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLnRpbWVvdXRzO1xuICB9XG5cbiAgLy8gPT09PT09PT09PVxuICAvLyBBVFRSSUJVVEVTXG4gIC8vID09PT09PT09PT1cblxuICAvLyBlbmFibGVfcGx1Z2dhYmxlX2RhdGFiYXNlX2RibV9mZWF0dXJlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2VuYWJsZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZT86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgZW5hYmxlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2VuYWJsZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZSh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZW5hYmxlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGVuYWJsZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmU7XG4gIH1cblxuICAvLyBpZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2lkPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5faWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRJZCgpIHtcbiAgICB0aGlzLl9pZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICAvLyBtb2RpZnlfcGx1Z2dhYmxlX2RhdGFiYXNlX2RibV9mZWF0dXJlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21vZGlmeVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZT86IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgbW9kaWZ5UGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ21vZGlmeV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1vZGlmeVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZSh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fbW9kaWZ5UGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TW9kaWZ5UGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlKCkge1xuICAgIHRoaXMuX21vZGlmeVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbW9kaWZ5UGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGlmeVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZTtcbiAgfVxuXG4gIC8vIHBsdWdnYWJsZV9kYXRhYmFzZV9pZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9wbHVnZ2FibGVEYXRhYmFzZUlkPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBwbHVnZ2FibGVEYXRhYmFzZUlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgncGx1Z2dhYmxlX2RhdGFiYXNlX2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCBwbHVnZ2FibGVEYXRhYmFzZUlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wbHVnZ2FibGVEYXRhYmFzZUlkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHBsdWdnYWJsZURhdGFiYXNlSWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGx1Z2dhYmxlRGF0YWJhc2VJZDtcbiAgfVxuXG4gIC8vIGZlYXR1cmVfZGV0YWlscyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9mZWF0dXJlRGV0YWlscyA9IG5ldyBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJmZWF0dXJlX2RldGFpbHNcIik7XG4gIHB1YmxpYyBnZXQgZmVhdHVyZURldGFpbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZlYXR1cmVEZXRhaWxzO1xuICB9XG4gIHB1YmxpYyBwdXRGZWF0dXJlRGV0YWlscyh2YWx1ZTogRGF0YWJhc2VNYW5hZ2VtZW50UGx1Z2dhYmxlZGF0YWJhc2VQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmVzTWFuYWdlbWVudEZlYXR1cmVEZXRhaWxzKSB7XG4gICAgdGhpcy5fZmVhdHVyZURldGFpbHMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEZlYXR1cmVEZXRhaWxzKCkge1xuICAgIHRoaXMuX2ZlYXR1cmVEZXRhaWxzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZlYXR1cmVEZXRhaWxzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZlYXR1cmVEZXRhaWxzLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyB0aW1lb3V0cyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90aW1lb3V0cyA9IG5ldyBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50VGltZW91dHNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJ0aW1lb3V0c1wiKTtcbiAgcHVibGljIGdldCB0aW1lb3V0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZW91dHM7XG4gIH1cbiAgcHVibGljIHB1dFRpbWVvdXRzKHZhbHVlOiBEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50VGltZW91dHMpIHtcbiAgICB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGltZW91dHMoKSB7XG4gICAgdGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGltZW91dHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vID09PT09PT09PVxuICAvLyBTWU5USEVTSVNcbiAgLy8gPT09PT09PT09XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgZW5hYmxlX3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZTogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHRoaXMuX2VuYWJsZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZSksXG4gICAgICBpZDogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5faWQpLFxuICAgICAgbW9kaWZ5X3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZTogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHRoaXMuX21vZGlmeVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZSksXG4gICAgICBwbHVnZ2FibGVfZGF0YWJhc2VfaWQ6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX3BsdWdnYWJsZURhdGFiYXNlSWQpLFxuICAgICAgZmVhdHVyZV9kZXRhaWxzOiBkYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNUb1RlcnJhZm9ybSh0aGlzLl9mZWF0dXJlRGV0YWlscy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIHRpbWVvdXRzOiBkYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50VGltZW91dHNUb1RlcnJhZm9ybSh0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVIY2xBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBhdHRycyA9IHtcbiAgICAgIGVuYWJsZV9wbHVnZ2FibGVfZGF0YWJhc2VfZGJtX2ZlYXR1cmU6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl9lbmFibGVQbHVnZ2FibGVEYXRhYmFzZURibUZlYXR1cmUpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgICB9LFxuICAgICAgaWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2lkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgbW9kaWZ5X3BsdWdnYWJsZV9kYXRhYmFzZV9kYm1fZmVhdHVyZToge1xuICAgICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHRoaXMuX21vZGlmeVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZSksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICAgIH0sXG4gICAgICBwbHVnZ2FibGVfZGF0YWJhc2VfaWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX3BsdWdnYWJsZURhdGFiYXNlSWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBmZWF0dXJlX2RldGFpbHM6IHtcbiAgICAgICAgdmFsdWU6IGRhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRGZWF0dXJlRGV0YWlsc1RvSGNsVGVycmFmb3JtKHRoaXMuX2ZlYXR1cmVEZXRhaWxzLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJEYXRhYmFzZU1hbmFnZW1lbnRQbHVnZ2FibGVkYXRhYmFzZVBsdWdnYWJsZURhdGFiYXNlRGJtRmVhdHVyZXNNYW5hZ2VtZW50RmVhdHVyZURldGFpbHNMaXN0XCIsXG4gICAgICB9LFxuICAgICAgdGltZW91dHM6IHtcbiAgICAgICAgdmFsdWU6IGRhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRUaW1lb3V0c1RvSGNsVGVycmFmb3JtKHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcInN0cnVjdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkRhdGFiYXNlTWFuYWdlbWVudFBsdWdnYWJsZWRhdGFiYXNlUGx1Z2dhYmxlRGF0YWJhc2VEYm1GZWF0dXJlc01hbmFnZW1lbnRUaW1lb3V0c1wiLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQgKSlcbiAgfVxufVxuIl19